summaryrefslogtreecommitdiff
path: root/gnulib/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gnulib/lib')
m---------gnulib0
-rw-r--r--gnulib/lib/.cppi-disable41
-rw-r--r--gnulib/lib/.cvsignore20
-rw-r--r--gnulib/lib/Makefile6
-rw-r--r--gnulib/lib/README3
-rw-r--r--gnulib/lib/_Exit.c27
-rw-r--r--gnulib/lib/accept.c52
-rw-r--r--gnulib/lib/accept4.c129
-rw-r--r--gnulib/lib/acl-internal.h256
-rw-r--r--gnulib/lib/acl.h27
-rw-r--r--gnulib/lib/acl_entries.c75
-rw-r--r--gnulib/lib/acosf.c26
-rw-r--r--gnulib/lib/acosl.c238
-rw-r--r--gnulib/lib/alignof.h51
-rw-r--r--gnulib/lib/alloca.c478
-rw-r--r--gnulib/lib/alloca.in.h56
-rw-r--r--gnulib/lib/allocator.c5
-rw-r--r--gnulib/lib/allocator.h58
-rw-r--r--gnulib/lib/alphasort.c28
-rw-r--r--gnulib/lib/amemxfrm.c180
-rw-r--r--gnulib/lib/amemxfrm.h48
-rw-r--r--gnulib/lib/anytostr.c55
-rw-r--r--gnulib/lib/arcfour.c77
-rw-r--r--gnulib/lib/arcfour.h50
-rw-r--r--gnulib/lib/arctwo.c228
-rw-r--r--gnulib/lib/arctwo.h63
-rw-r--r--gnulib/lib/areadlink-with-size.c104
-rw-r--r--gnulib/lib/areadlink.c39
-rw-r--r--gnulib/lib/areadlink.h33
-rw-r--r--gnulib/lib/areadlinkat-with-size.c132
-rw-r--r--gnulib/lib/areadlinkat.c65
-rw-r--r--gnulib/lib/argmatch.c277
-rw-r--r--gnulib/lib/argmatch.h103
-rw-r--r--gnulib/lib/argp-ba.c34
-rw-r--r--gnulib/lib/argp-eexst.c30
-rw-r--r--gnulib/lib/argp-fmtstream.c435
-rw-r--r--gnulib/lib/argp-fmtstream.h354
-rw-r--r--gnulib/lib/argp-fs-xinl.c42
-rw-r--r--gnulib/lib/argp-help.c1954
-rw-r--r--gnulib/lib/argp-namefrob.h157
-rw-r--r--gnulib/lib/argp-parse.c952
-rw-r--r--gnulib/lib/argp-pin.c27
-rw-r--r--gnulib/lib/argp-pv.c34
-rw-r--r--gnulib/lib/argp-pvh.c31
-rw-r--r--gnulib/lib/argp-version-etc.c38
-rw-r--r--gnulib/lib/argp-version-etc.h40
-rw-r--r--gnulib/lib/argp-xinl.c42
-rw-r--r--gnulib/lib/argp.h645
-rw-r--r--gnulib/lib/argv-iter.c111
-rw-r--r--gnulib/lib/argv-iter.h42
-rw-r--r--gnulib/lib/argz.c407
-rw-r--r--gnulib/lib/argz.in.h160
-rw-r--r--gnulib/lib/arpa_inet.in.h141
-rw-r--r--gnulib/lib/array-mergesort.h274
-rw-r--r--gnulib/lib/asinf.c26
-rw-r--r--gnulib/lib/asinl.c232
-rw-r--r--gnulib/lib/asnprintf.c35
-rw-r--r--gnulib/lib/asprintf.c40
-rw-r--r--gnulib/lib/assert.in.h28
-rw-r--r--gnulib/lib/astrxfrm.c181
-rw-r--r--gnulib/lib/astrxfrm.h47
-rw-r--r--gnulib/lib/at-func.c131
-rw-r--r--gnulib/lib/at-func2.c282
-rw-r--r--gnulib/lib/atan2f.c26
-rw-r--r--gnulib/lib/atanf.c26
-rw-r--r--gnulib/lib/atanl.c236
-rw-r--r--gnulib/lib/atexit.c13
-rw-r--r--gnulib/lib/atoll.c34
-rw-r--r--gnulib/lib/backupfile.c355
-rw-r--r--gnulib/lib/backupfile.h59
-rw-r--r--gnulib/lib/base32.c588
-rw-r--r--gnulib/lib/base32.h61
-rw-r--r--gnulib/lib/base64.c575
-rw-r--r--gnulib/lib/base64.h61
-rw-r--r--gnulib/lib/basename-lgpl.c75
-rw-r--r--gnulib/lib/basename.c58
-rw-r--r--gnulib/lib/bcopy.c23
-rw-r--r--gnulib/lib/binary-io.h52
-rw-r--r--gnulib/lib/bind.c49
-rw-r--r--gnulib/lib/bitrotate.h126
-rw-r--r--gnulib/lib/btowc.c39
-rw-r--r--gnulib/lib/byteswap.in.h44
-rw-r--r--gnulib/lib/c-ctype.c396
-rw-r--r--gnulib/lib/c-ctype.h295
-rw-r--r--gnulib/lib/c-stack.c330
-rw-r--r--gnulib/lib/c-stack.h44
-rw-r--r--gnulib/lib/c-strcase.h57
-rw-r--r--gnulib/lib/c-strcasecmp.c57
-rw-r--r--gnulib/lib/c-strcaseeq.h184
-rw-r--r--gnulib/lib/c-strcasestr.c77
-rw-r--r--gnulib/lib/c-strcasestr.h36
-rw-r--r--gnulib/lib/c-strncasecmp.c57
-rw-r--r--gnulib/lib/c-strstr.c32
-rw-r--r--gnulib/lib/c-strstr.h44
-rw-r--r--gnulib/lib/c-strtod.c112
-rw-r--r--gnulib/lib/c-strtod.h37
-rw-r--r--gnulib/lib/c-strtold.c2
-rw-r--r--gnulib/lib/calloc.c73
-rw-r--r--gnulib/lib/canon-host.c90
-rw-r--r--gnulib/lib/canon-host.h29
-rw-r--r--gnulib/lib/canonicalize-lgpl.c378
-rw-r--r--gnulib/lib/canonicalize.c296
-rw-r--r--gnulib/lib/canonicalize.h41
-rw-r--r--gnulib/lib/careadlinkat.c175
-rw-r--r--gnulib/lib/careadlinkat.h72
-rw-r--r--gnulib/lib/ceil.c111
-rw-r--r--gnulib/lib/ceilf.c20
-rw-r--r--gnulib/lib/ceill.c37
-rw-r--r--gnulib/lib/chdir-long.c266
-rw-r--r--gnulib/lib/chdir-long.h30
-rw-r--r--gnulib/lib/chdir-safer.c82
-rw-r--r--gnulib/lib/chdir-safer.h20
-rw-r--r--gnulib/lib/check-version.c43
-rw-r--r--gnulib/lib/check-version.h26
-rw-r--r--gnulib/lib/chown.c156
-rw-r--r--gnulib/lib/classpath.c122
-rw-r--r--gnulib/lib/classpath.h33
-rw-r--r--gnulib/lib/clean-temp.c782
-rw-r--r--gnulib/lib/clean-temp.h142
-rw-r--r--gnulib/lib/cloexec.c83
-rw-r--r--gnulib/lib/cloexec.h38
-rw-r--r--gnulib/lib/close-stream.c78
-rw-r--r--gnulib/lib/close-stream.h2
-rw-r--r--gnulib/lib/close.c69
-rw-r--r--gnulib/lib/closedir.c67
-rw-r--r--gnulib/lib/closein.c112
-rw-r--r--gnulib/lib/closein.h32
-rw-r--r--gnulib/lib/closeout.c124
-rw-r--r--gnulib/lib/closeout.h36
-rw-r--r--gnulib/lib/concat-filename.c73
-rw-r--r--gnulib/lib/concat-filename.h41
-rw-r--r--gnulib/lib/config.charset683
-rw-r--r--gnulib/lib/connect.c56
-rw-r--r--gnulib/lib/copy-acl.c644
-rw-r--r--gnulib/lib/copy-file.c137
-rw-r--r--gnulib/lib/copy-file.h34
-rw-r--r--gnulib/lib/copysign.c26
-rw-r--r--gnulib/lib/copysignf.c26
-rw-r--r--gnulib/lib/copysignl.c72
-rw-r--r--gnulib/lib/cosf.c26
-rw-r--r--gnulib/lib/coshf.c26
-rw-r--r--gnulib/lib/cosl.c116
-rw-r--r--gnulib/lib/count-one-bits.h77
-rw-r--r--gnulib/lib/crc.c103
-rw-r--r--gnulib/lib/crc.h47
-rw-r--r--gnulib/lib/creat-safer.c31
-rw-r--r--gnulib/lib/csharpcomp.c573
-rw-r--r--gnulib/lib/csharpcomp.h40
-rw-r--r--gnulib/lib/csharpexec.c345
-rw-r--r--gnulib/lib/csharpexec.h43
-rw-r--r--gnulib/lib/ctype.in.h58
-rw-r--r--gnulib/lib/cycle-check.c85
-rw-r--r--gnulib/lib/cycle-check.h52
-rw-r--r--gnulib/lib/des.c668
-rw-r--r--gnulib/lib/des.h121
-rw-r--r--gnulib/lib/dev-ino.h13
-rw-r--r--gnulib/lib/di-set.c259
-rw-r--r--gnulib/lib/di-set.h19
-rw-r--r--gnulib/lib/diacrit.c161
-rw-r--r--gnulib/lib/diacrit.h27
-rw-r--r--gnulib/lib/diffseq.h523
-rw-r--r--gnulib/lib/dirchownmod.c141
-rw-r--r--gnulib/lib/dirchownmod.h2
-rw-r--r--gnulib/lib/dirent--.h23
-rw-r--r--gnulib/lib/dirent-private.h40
-rw-r--r--gnulib/lib/dirent-safer.h22
-rw-r--r--gnulib/lib/dirent.in.h249
-rw-r--r--gnulib/lib/dirfd.c32
-rw-r--r--gnulib/lib/dirname-lgpl.c86
-rw-r--r--gnulib/lib/dirname.c38
-rw-r--r--gnulib/lib/dirname.h46
-rw-r--r--gnulib/lib/dosname.h53
-rw-r--r--gnulib/lib/dprintf.c70
-rw-r--r--gnulib/lib/dtoastr.c2
-rw-r--r--gnulib/lib/dtotimespec.c69
-rw-r--r--gnulib/lib/dummy.c42
-rw-r--r--gnulib/lib/dup-safer-flag.c40
-rw-r--r--gnulib/lib/dup-safer.c34
-rw-r--r--gnulib/lib/dup.c61
-rw-r--r--gnulib/lib/dup2.c157
-rw-r--r--gnulib/lib/dup3.c102
-rw-r--r--gnulib/lib/duplocale.c102
-rw-r--r--gnulib/lib/eealloc.h79
-rw-r--r--gnulib/lib/errno.in.h233
-rw-r--r--gnulib/lib/error.c400
-rw-r--r--gnulib/lib/error.h65
-rw-r--r--gnulib/lib/euidaccess.c218
-rw-r--r--gnulib/lib/exclude.c578
-rw-r--r--gnulib/lib/exclude.h52
-rw-r--r--gnulib/lib/execute.c278
-rw-r--r--gnulib/lib/execute.h44
-rw-r--r--gnulib/lib/exitfail.c24
-rw-r--r--gnulib/lib/exitfail.h18
-rw-r--r--gnulib/lib/expf.c26
-rw-r--r--gnulib/lib/expl.c147
-rw-r--r--gnulib/lib/fabsf.c26
-rw-r--r--gnulib/lib/faccessat.c44
-rw-r--r--gnulib/lib/fatal-signal.c286
-rw-r--r--gnulib/lib/fatal-signal.h76
-rw-r--r--gnulib/lib/fbufmode.c85
-rw-r--r--gnulib/lib/fbufmode.h36
-rw-r--r--gnulib/lib/fchdir.c208
-rw-r--r--gnulib/lib/fchmodat.c53
-rw-r--r--gnulib/lib/fchown-stub.c16
-rw-r--r--gnulib/lib/fchownat.c114
-rw-r--r--gnulib/lib/fclose.c110
-rw-r--r--gnulib/lib/fcntl--.h32
-rw-r--r--gnulib/lib/fcntl-safer.h27
-rw-r--r--gnulib/lib/fcntl.c311
-rw-r--r--gnulib/lib/fcntl.in.h325
-rw-r--r--gnulib/lib/fd-hook.c116
-rw-r--r--gnulib/lib/fd-hook.h119
-rw-r--r--gnulib/lib/fd-safer-flag.c52
-rw-r--r--gnulib/lib/fd-safer.c49
-rw-r--r--gnulib/lib/fdatasync.c27
-rw-r--r--gnulib/lib/fdopen.c69
-rw-r--r--gnulib/lib/fdopendir.c204
-rw-r--r--gnulib/lib/fdutimensat.c57
-rw-r--r--gnulib/lib/fflush.c218
-rw-r--r--gnulib/lib/ffs.c56
-rw-r--r--gnulib/lib/ffsl.c4
-rw-r--r--gnulib/lib/ffsl.h67
-rw-r--r--gnulib/lib/ffsll.c4
-rw-r--r--gnulib/lib/file-has-acl.c839
-rw-r--r--gnulib/lib/file-set.c74
-rw-r--r--gnulib/lib/file-set.h15
-rw-r--r--gnulib/lib/file-type.c71
-rw-r--r--gnulib/lib/file-type.h29
-rw-r--r--gnulib/lib/fileblocks.c74
-rw-r--r--gnulib/lib/filemode.c180
-rw-r--r--gnulib/lib/filemode.h44
-rw-r--r--gnulib/lib/filename.h54
-rw-r--r--gnulib/lib/filenamecat-lgpl.c88
-rw-r--r--gnulib/lib/filenamecat.c41
-rw-r--r--gnulib/lib/filenamecat.h27
-rw-r--r--gnulib/lib/filevercmp.c181
-rw-r--r--gnulib/lib/filevercmp.h42
-rw-r--r--gnulib/lib/findprog-lgpl.c20
-rw-r--r--gnulib/lib/findprog.c138
-rw-r--r--gnulib/lib/findprog.h37
-rw-r--r--gnulib/lib/float+.h148
-rw-r--r--gnulib/lib/float.c33
-rw-r--r--gnulib/lib/float.in.h188
-rw-r--r--gnulib/lib/flock.c220
-rw-r--r--gnulib/lib/floor.c99
-rw-r--r--gnulib/lib/floorf.c20
-rw-r--r--gnulib/lib/floorl.c37
-rw-r--r--gnulib/lib/fma.c887
-rw-r--r--gnulib/lib/fmaf.c20
-rw-r--r--gnulib/lib/fmal.c37
-rw-r--r--gnulib/lib/fmodf.c26
-rw-r--r--gnulib/lib/fnmatch.c351
-rw-r--r--gnulib/lib/fnmatch.in.h68
-rw-r--r--gnulib/lib/fnmatch_loop.c1220
-rw-r--r--gnulib/lib/fopen-safer.c63
-rw-r--r--gnulib/lib/fopen.c110
-rw-r--r--gnulib/lib/forkpty.c73
-rw-r--r--gnulib/lib/fpending.c30
-rw-r--r--gnulib/lib/fpending.h34
-rw-r--r--gnulib/lib/fprintf.c77
-rw-r--r--gnulib/lib/fprintftime.c2
-rw-r--r--gnulib/lib/fprintftime.h29
-rw-r--r--gnulib/lib/fpucw.h107
-rw-r--r--gnulib/lib/fpurge.c142
-rw-r--r--gnulib/lib/freadable.c47
-rw-r--r--gnulib/lib/freadable.h42
-rw-r--r--gnulib/lib/freadahead.c89
-rw-r--r--gnulib/lib/freadahead.h38
-rw-r--r--gnulib/lib/freading.c70
-rw-r--r--gnulib/lib/freading.h53
-rw-r--r--gnulib/lib/freadptr.c111
-rw-r--r--gnulib/lib/freadptr.h39
-rw-r--r--gnulib/lib/freadseek.c139
-rw-r--r--gnulib/lib/freadseek.h42
-rw-r--r--gnulib/lib/free.c30
-rw-r--r--gnulib/lib/freopen-safer.c103
-rw-r--r--gnulib/lib/freopen.c51
-rw-r--r--gnulib/lib/frexp.c168
-rw-r--r--gnulib/lib/frexpf.c26
-rw-r--r--gnulib/lib/frexpl.c35
-rw-r--r--gnulib/lib/fseek.c30
-rw-r--r--gnulib/lib/fseeko.c143
-rw-r--r--gnulib/lib/fseterr.c76
-rw-r--r--gnulib/lib/fseterr.h37
-rw-r--r--gnulib/lib/fstat.c82
-rw-r--r--gnulib/lib/fstatat.c135
-rw-r--r--gnulib/lib/fstrcmp.c271
-rw-r--r--gnulib/lib/fstrcmp.h45
-rw-r--r--gnulib/lib/fsusage.c279
-rw-r--r--gnulib/lib/fsusage.h40
-rw-r--r--gnulib/lib/fsync.c78
-rw-r--r--gnulib/lib/ftell.c37
-rw-r--r--gnulib/lib/ftello.c77
-rw-r--r--gnulib/lib/ftoastr.c138
-rw-r--r--gnulib/lib/ftoastr.h144
-rw-r--r--gnulib/lib/ftruncate.c43
-rw-r--r--gnulib/lib/fts-cycle.c160
-rw-r--r--gnulib/lib/fts.c2095
-rw-r--r--gnulib/lib/fts_.h272
-rw-r--r--gnulib/lib/full-read.c18
-rw-r--r--gnulib/lib/full-read.h24
-rw-r--r--gnulib/lib/full-write.c79
-rw-r--r--gnulib/lib/full-write.h34
-rw-r--r--gnulib/lib/futimens.c37
-rw-r--r--gnulib/lib/fwritable.c47
-rw-r--r--gnulib/lib/fwritable.h42
-rw-r--r--gnulib/lib/fwriteerror.c181
-rw-r--r--gnulib/lib/fwriteerror.h62
-rw-r--r--gnulib/lib/fwriting.c58
-rw-r--r--gnulib/lib/fwriting.h53
-rw-r--r--gnulib/lib/gai_strerror.c93
-rw-r--r--gnulib/lib/gc-gnulib.c918
-rw-r--r--gnulib/lib/gc-libgcrypt.c729
-rw-r--r--gnulib/lib/gc-pbkdf2-sha1.c103
-rw-r--r--gnulib/lib/gc.h317
-rw-r--r--gnulib/lib/gcd.c87
-rw-r--r--gnulib/lib/gcd.h34
-rw-r--r--gnulib/lib/gen-uni-tables.c9780
-rw-r--r--gnulib/lib/get-rusage-as.c402
-rw-r--r--gnulib/lib/get-rusage-data.c436
-rw-r--r--gnulib/lib/getaddrinfo.c444
-rw-r--r--gnulib/lib/getcwd-lgpl.c125
-rw-r--r--gnulib/lib/getcwd.c442
-rw-r--r--gnulib/lib/getdate.h3
-rw-r--r--gnulib/lib/getdelim.c137
-rw-r--r--gnulib/lib/getdomainname.c83
-rw-r--r--gnulib/lib/getdtablesize.c86
-rw-r--r--gnulib/lib/getfilecon.c87
-rw-r--r--gnulib/lib/getgroups.c116
-rw-r--r--gnulib/lib/gethostname.c104
-rw-r--r--gnulib/lib/gethrxtime.c68
-rw-r--r--gnulib/lib/gethrxtime.h37
-rw-r--r--gnulib/lib/getline.c29
-rw-r--r--gnulib/lib/getloadavg.c1046
-rw-r--r--gnulib/lib/getlogin.c41
-rw-r--r--gnulib/lib/getlogin_r.c88
-rw-r--r--gnulib/lib/getndelim2.c217
-rw-r--r--gnulib/lib/getndelim2.h42
-rw-r--r--gnulib/lib/getnline.c36
-rw-r--r--gnulib/lib/getnline.h47
-rw-r--r--gnulib/lib/getopt.c1245
-rw-r--r--gnulib/lib/getopt.in.h253
-rw-r--r--gnulib/lib/getopt1.c170
-rw-r--r--gnulib/lib/getopt_int.h135
-rw-r--r--gnulib/lib/getpagesize.c39
-rw-r--r--gnulib/lib/getpass.c230
-rw-r--r--gnulib/lib/getpass.h31
-rw-r--r--gnulib/lib/getpeername.c49
-rw-r--r--gnulib/lib/getsockname.c49
-rw-r--r--gnulib/lib/getsockopt.c79
-rw-r--r--gnulib/lib/getsubopt.c82
-rw-r--r--gnulib/lib/gettext.h286
-rw-r--r--gnulib/lib/gettime.c48
-rw-r--r--gnulib/lib/gettimeofday.c144
-rw-r--r--gnulib/lib/getugroups.c125
-rw-r--r--gnulib/lib/getugroups.h19
-rw-r--r--gnulib/lib/getusershell.c173
-rw-r--r--gnulib/lib/git-merge-changelog.c1676
-rw-r--r--gnulib/lib/gl_anyavltree_list1.h70
-rw-r--r--gnulib/lib/gl_anyavltree_list2.h809
-rw-r--r--gnulib/lib/gl_anyhash_list1.h27
-rw-r--r--gnulib/lib/gl_anyhash_list2.h138
-rw-r--r--gnulib/lib/gl_anylinked_list1.h48
-rw-r--r--gnulib/lib/gl_anylinked_list2.h1195
-rw-r--r--gnulib/lib/gl_anyrbtree_list1.h76
-rw-r--r--gnulib/lib/gl_anyrbtree_list2.h1028
-rw-r--r--gnulib/lib/gl_anytree_list1.h41
-rw-r--r--gnulib/lib/gl_anytree_list2.h940
-rw-r--r--gnulib/lib/gl_anytree_oset.h297
-rw-r--r--gnulib/lib/gl_anytreehash_list1.h358
-rw-r--r--gnulib/lib/gl_anytreehash_list2.h213
-rw-r--r--gnulib/lib/gl_array_list.c680
-rw-r--r--gnulib/lib/gl_array_list.h34
-rw-r--r--gnulib/lib/gl_array_oset.c357
-rw-r--r--gnulib/lib/gl_array_oset.h34
-rw-r--r--gnulib/lib/gl_avltree_list.c101
-rw-r--r--gnulib/lib/gl_avltree_list.h34
-rw-r--r--gnulib/lib/gl_avltree_oset.c583
-rw-r--r--gnulib/lib/gl_avltree_oset.h34
-rw-r--r--gnulib/lib/gl_avltreehash_list.c127
-rw-r--r--gnulib/lib/gl_avltreehash_list.h34
-rw-r--r--gnulib/lib/gl_carray_list.c873
-rw-r--r--gnulib/lib/gl_carray_list.h34
-rw-r--r--gnulib/lib/gl_linked_list.c64
-rw-r--r--gnulib/lib/gl_linked_list.h34
-rw-r--r--gnulib/lib/gl_linkedhash_list.c124
-rw-r--r--gnulib/lib/gl_linkedhash_list.h34
-rw-r--r--gnulib/lib/gl_list.c283
-rw-r--r--gnulib/lib/gl_list.h844
-rw-r--r--gnulib/lib/gl_oset.c96
-rw-r--r--gnulib/lib/gl_oset.h289
-rw-r--r--gnulib/lib/gl_rbtree_list.c102
-rw-r--r--gnulib/lib/gl_rbtree_list.h34
-rw-r--r--gnulib/lib/gl_rbtree_oset.c814
-rw-r--r--gnulib/lib/gl_rbtree_oset.h34
-rw-r--r--gnulib/lib/gl_rbtreehash_list.c128
-rw-r--r--gnulib/lib/gl_rbtreehash_list.h34
-rw-r--r--gnulib/lib/gl_sublist.c479
-rw-r--r--gnulib/lib/gl_sublist.h49
-rw-r--r--gnulib/lib/gl_xlist.c128
-rw-r--r--gnulib/lib/gl_xlist.h179
-rw-r--r--gnulib/lib/gl_xoset.c46
-rw-r--r--gnulib/lib/gl_xoset.h67
-rw-r--r--gnulib/lib/gl_xsublist.c35
-rw-r--r--gnulib/lib/gl_xsublist.h53
-rw-r--r--gnulib/lib/glob-libc.h212
-rw-r--r--gnulib/lib/glob.c1552
-rw-r--r--gnulib/lib/glob.in.h91
-rw-r--r--gnulib/lib/glthread/cond.c464
-rw-r--r--gnulib/lib/glthread/cond.h409
-rw-r--r--gnulib/lib/glthread/lock.c1058
-rw-r--r--gnulib/lib/glthread/lock.h928
-rw-r--r--gnulib/lib/glthread/thread.c232
-rw-r--r--gnulib/lib/glthread/thread.h401
-rw-r--r--gnulib/lib/glthread/threadlib.c74
-rw-r--r--gnulib/lib/glthread/tls.c61
-rw-r--r--gnulib/lib/glthread/tls.h299
-rw-r--r--gnulib/lib/glthread/yield.h122
-rw-r--r--gnulib/lib/grantpt.c123
-rw-r--r--gnulib/lib/group-member.c124
-rw-r--r--gnulib/lib/hard-locale.c72
-rw-r--r--gnulib/lib/hard-locale.h25
-rw-r--r--gnulib/lib/hash-pjw.c40
-rw-r--r--gnulib/lib/hash-pjw.h23
-rw-r--r--gnulib/lib/hash-triple.c77
-rw-r--r--gnulib/lib/hash-triple.h24
-rw-r--r--gnulib/lib/hash.c1233
-rw-r--r--gnulib/lib/hash.h107
-rw-r--r--gnulib/lib/hmac-md5.c81
-rw-r--r--gnulib/lib/hmac-sha1.c81
-rw-r--r--gnulib/lib/hmac.h41
-rw-r--r--gnulib/lib/human.c470
-rw-r--r--gnulib/lib/human.h83
-rw-r--r--gnulib/lib/i-ring.c68
-rw-r--r--gnulib/lib/i-ring.h44
-rw-r--r--gnulib/lib/iconv.c450
-rw-r--r--gnulib/lib/iconv.in.h111
-rw-r--r--gnulib/lib/iconv_close.c47
-rw-r--r--gnulib/lib/iconv_open-aix.gperf44
-rw-r--r--gnulib/lib/iconv_open-hpux.gperf56
-rw-r--r--gnulib/lib/iconv_open-irix.gperf31
-rw-r--r--gnulib/lib/iconv_open-osf.gperf50
-rw-r--r--gnulib/lib/iconv_open-solaris.gperf30
-rw-r--r--gnulib/lib/iconv_open.c173
-rw-r--r--gnulib/lib/iconveh.h41
-rw-r--r--gnulib/lib/idcache.c227
-rw-r--r--gnulib/lib/idcache.h11
-rw-r--r--gnulib/lib/idpriv-drop.c129
-rw-r--r--gnulib/lib/idpriv-droptemp.c204
-rw-r--r--gnulib/lib/idpriv.h116
-rw-r--r--gnulib/lib/ignore-value.h62
-rw-r--r--gnulib/lib/imaxabs.c26
-rw-r--r--gnulib/lib/imaxdiv.c63
-rw-r--r--gnulib/lib/imaxtostr.c3
-rw-r--r--gnulib/lib/inet_ntop.c249
-rw-r--r--gnulib/lib/inet_pton.c268
-rw-r--r--gnulib/lib/ino-map.c164
-rw-r--r--gnulib/lib/ino-map.h19
-rw-r--r--gnulib/lib/integer_length.c141
-rw-r--r--gnulib/lib/integer_length.h49
-rw-r--r--gnulib/lib/integer_length_l.c81
-rw-r--r--gnulib/lib/integer_length_ll.c20
-rw-r--r--gnulib/lib/intprops.h319
-rw-r--r--gnulib/lib/inttostr.c3
-rw-r--r--gnulib/lib/inttostr.h46
-rw-r--r--gnulib/lib/inttypes.in.h1112
-rw-r--r--gnulib/lib/ioctl.c79
-rw-r--r--gnulib/lib/isapipe.c119
-rw-r--r--gnulib/lib/isapipe.h6
-rw-r--r--gnulib/lib/isblank.c33
-rw-r--r--gnulib/lib/isdir.c33
-rw-r--r--gnulib/lib/isdir.h1
-rw-r--r--gnulib/lib/isfinite.c52
-rw-r--r--gnulib/lib/isinf.c40
-rw-r--r--gnulib/lib/isnan.c177
-rw-r--r--gnulib/lib/isnand-nolibm.h33
-rw-r--r--gnulib/lib/isnand.c19
-rw-r--r--gnulib/lib/isnanf-nolibm.h33
-rw-r--r--gnulib/lib/isnanf.c20
-rw-r--r--gnulib/lib/isnanl-nolibm.h33
-rw-r--r--gnulib/lib/isnanl.c20
-rw-r--r--gnulib/lib/iswblank.c27
-rw-r--r--gnulib/lib/iswctype-impl.h22
-rw-r--r--gnulib/lib/iswctype.c23
-rw-r--r--gnulib/lib/itold.c28
-rw-r--r--gnulib/lib/javacomp.c2355
-rw-r--r--gnulib/lib/javacomp.h75
-rw-r--r--gnulib/lib/javaexec.c429
-rw-r--r--gnulib/lib/javaexec.h50
-rw-r--r--gnulib/lib/javaversion.c119
-rw-r--r--gnulib/lib/javaversion.classbin0 -> 510 bytes
-rw-r--r--gnulib/lib/javaversion.h39
-rw-r--r--gnulib/lib/javaversion.java31
-rw-r--r--gnulib/lib/langinfo.in.h177
-rw-r--r--gnulib/lib/lchown.c117
-rw-r--r--gnulib/lib/ldexpf.c31
-rw-r--r--gnulib/lib/ldexpl.c89
-rw-r--r--gnulib/lib/ldtoastr.c2
-rw-r--r--gnulib/lib/libunistring.valgrind9
-rw-r--r--gnulib/lib/linebuffer.c103
-rw-r--r--gnulib/lib/linebuffer.h53
-rw-r--r--gnulib/lib/link.c212
-rw-r--r--gnulib/lib/linkat.c343
-rw-r--r--gnulib/lib/listen.c49
-rw-r--r--gnulib/lib/localcharset.c547
-rw-r--r--gnulib/lib/localcharset.h41
-rw-r--r--gnulib/lib/locale.in.h96
-rw-r--r--gnulib/lib/localename.c2957
-rw-r--r--gnulib/lib/localename.h95
-rw-r--r--gnulib/lib/log10f.c26
-rw-r--r--gnulib/lib/logf.c26
-rw-r--r--gnulib/lib/login_tty.c75
-rw-r--r--gnulib/lib/logl.c273
-rw-r--r--gnulib/lib/long-options.c88
-rw-r--r--gnulib/lib/long-options.h26
-rw-r--r--gnulib/lib/lseek.c64
-rw-r--r--gnulib/lib/lstat.c97
-rw-r--r--gnulib/lib/malloc.c57
-rw-r--r--gnulib/lib/malloca.c139
-rw-r--r--gnulib/lib/malloca.h134
-rw-r--r--gnulib/lib/malloca.valgrind7
-rw-r--r--gnulib/lib/math.in.h1381
-rw-r--r--gnulib/lib/mbchar.c35
-rw-r--r--gnulib/lib/mbchar.h350
-rw-r--r--gnulib/lib/mbfile.h242
-rw-r--r--gnulib/lib/mbiter.h215
-rw-r--r--gnulib/lib/mbmemcasecmp.c96
-rw-r--r--gnulib/lib/mbmemcasecmp.h45
-rw-r--r--gnulib/lib/mbmemcasecoll.c190
-rw-r--r--gnulib/lib/mbmemcasecoll.h58
-rw-r--r--gnulib/lib/mbrlen.c32
-rw-r--r--gnulib/lib/mbrtowc.c396
-rw-r--r--gnulib/lib/mbscasecmp.c98
-rw-r--r--gnulib/lib/mbscasestr.c412
-rw-r--r--gnulib/lib/mbschr.c52
-rw-r--r--gnulib/lib/mbscspn.c68
-rw-r--r--gnulib/lib/mbsinit.c61
-rw-r--r--gnulib/lib/mbslen.c44
-rw-r--r--gnulib/lib/mbsncasecmp.c99
-rw-r--r--gnulib/lib/mbsnlen.c45
-rw-r--r--gnulib/lib/mbsnrtowcs-impl.h124
-rw-r--r--gnulib/lib/mbsnrtowcs.c33
-rw-r--r--gnulib/lib/mbspbrk.c63
-rw-r--r--gnulib/lib/mbspcasecmp.c94
-rw-r--r--gnulib/lib/mbsrchr.c49
-rw-r--r--gnulib/lib/mbsrtowcs-impl.h122
-rw-r--r--gnulib/lib/mbsrtowcs-state.c37
-rw-r--r--gnulib/lib/mbsrtowcs.c32
-rw-r--r--gnulib/lib/mbssep.c61
-rw-r--r--gnulib/lib/mbsspn.c89
-rw-r--r--gnulib/lib/mbsstr.c382
-rw-r--r--gnulib/lib/mbstok_r.c66
-rw-r--r--gnulib/lib/mbswidth.c193
-rw-r--r--gnulib/lib/mbswidth.h60
-rw-r--r--gnulib/lib/mbtowc-impl.h44
-rw-r--r--gnulib/lib/mbtowc.c26
-rw-r--r--gnulib/lib/mbuiter.h222
-rw-r--r--gnulib/lib/md2.c275
-rw-r--r--gnulib/lib/md2.h85
-rw-r--r--gnulib/lib/md4.c383
-rw-r--r--gnulib/lib/md4.h91
-rw-r--r--gnulib/lib/md5.c462
-rw-r--r--gnulib/lib/md5.h126
-rw-r--r--gnulib/lib/memcasecmp.c49
-rw-r--r--gnulib/lib/memcasecmp.h22
-rw-r--r--gnulib/lib/memchr.c172
-rw-r--r--gnulib/lib/memchr.valgrind14
-rw-r--r--gnulib/lib/memchr2.c164
-rw-r--r--gnulib/lib/memchr2.h32
-rw-r--r--gnulib/lib/memchr2.valgrind14
-rw-r--r--gnulib/lib/memcmp.c363
-rw-r--r--gnulib/lib/memcmp2.c36
-rw-r--r--gnulib/lib/memcmp2.h40
-rw-r--r--gnulib/lib/memcoll.c111
-rw-r--r--gnulib/lib/memcoll.h28
-rw-r--r--gnulib/lib/memcpy.c36
-rw-r--r--gnulib/lib/memmem.c76
-rw-r--r--gnulib/lib/memmove.c26
-rw-r--r--gnulib/lib/mempcpy.c29
-rw-r--r--gnulib/lib/memrchr.c161
-rw-r--r--gnulib/lib/memset.c30
-rw-r--r--gnulib/lib/memxor.c35
-rw-r--r--gnulib/lib/memxor.h31
-rw-r--r--gnulib/lib/mgetgroups.c195
-rw-r--r--gnulib/lib/mgetgroups.h22
-rw-r--r--gnulib/lib/minmax.h61
-rw-r--r--gnulib/lib/mkancesdirs.c153
-rw-r--r--gnulib/lib/mkancesdirs.h4
-rw-r--r--gnulib/lib/mkdir-p.c208
-rw-r--r--gnulib/lib/mkdir-p.h35
-rw-r--r--gnulib/lib/mkdir.c93
-rw-r--r--gnulib/lib/mkdirat.c34
-rw-r--r--gnulib/lib/mkdtemp.c39
-rw-r--r--gnulib/lib/mkfifo.c58
-rw-r--r--gnulib/lib/mkfifoat.c55
-rw-r--r--gnulib/lib/mknod.c74
-rw-r--r--gnulib/lib/mknodat.c57
-rw-r--r--gnulib/lib/mkostemp.c46
-rw-r--r--gnulib/lib/mkostemps.c54
-rw-r--r--gnulib/lib/mkstemp-safer.c63
-rw-r--r--gnulib/lib/mkstemp.c50
-rw-r--r--gnulib/lib/mkstemps.c54
-rw-r--r--gnulib/lib/mktime-internal.h4
-rw-r--r--gnulib/lib/mktime.c737
-rw-r--r--gnulib/lib/modechange.c385
-rw-r--r--gnulib/lib/modechange.h30
-rw-r--r--gnulib/lib/modff.c29
-rw-r--r--gnulib/lib/mountlist.c951
-rw-r--r--gnulib/lib/mountlist.h40
-rw-r--r--gnulib/lib/mpsort.c156
-rw-r--r--gnulib/lib/mpsort.h2
-rw-r--r--gnulib/lib/msvc-inval.c130
-rw-r--r--gnulib/lib/msvc-inval.h223
-rw-r--r--gnulib/lib/msvc-nothrow.c50
-rw-r--r--gnulib/lib/msvc-nothrow.h44
-rw-r--r--gnulib/lib/nanosleep.c274
-rw-r--r--gnulib/lib/netdb.in.h266
-rw-r--r--gnulib/lib/netinet_in.in.h48
-rw-r--r--gnulib/lib/nl_langinfo.c270
-rw-r--r--gnulib/lib/nonblocking.c153
-rw-r--r--gnulib/lib/nonblocking.h62
-rw-r--r--gnulib/lib/nproc.c358
-rw-r--r--gnulib/lib/nproc.h47
-rw-r--r--gnulib/lib/obstack.c420
-rw-r--r--gnulib/lib/obstack.h512
-rw-r--r--gnulib/lib/obstack_printf.c92
-rw-r--r--gnulib/lib/offtostr.c3
-rw-r--r--gnulib/lib/open-safer.c46
-rw-r--r--gnulib/lib/open.c181
-rw-r--r--gnulib/lib/openat-die.c62
-rw-r--r--gnulib/lib/openat-priv.h64
-rw-r--r--gnulib/lib/openat-proc.c110
-rw-r--r--gnulib/lib/openat-safer.c46
-rw-r--r--gnulib/lib/openat.c286
-rw-r--r--gnulib/lib/openat.h104
-rw-r--r--gnulib/lib/opendir-safer.c76
-rw-r--r--gnulib/lib/opendir.c148
-rw-r--r--gnulib/lib/openpty.c136
-rw-r--r--gnulib/lib/pagealign_alloc.c197
-rw-r--r--gnulib/lib/pagealign_alloc.h54
-rw-r--r--gnulib/lib/parse-datetime.h22
-rw-r--r--gnulib/lib/parse-datetime.y1617
-rw-r--r--gnulib/lib/parse-duration.c601
-rw-r--r--gnulib/lib/parse-duration.h90
-rw-r--r--gnulib/lib/passfd.c202
-rw-r--r--gnulib/lib/passfd.h32
-rw-r--r--gnulib/lib/pathmax.h84
-rw-r--r--gnulib/lib/pclose.c28
-rw-r--r--gnulib/lib/perror.c49
-rw-r--r--gnulib/lib/physmem.c304
-rw-r--r--gnulib/lib/physmem.h26
-rw-r--r--gnulib/lib/pipe-filter-aux.h113
-rw-r--r--gnulib/lib/pipe-filter-gi.c558
-rw-r--r--gnulib/lib/pipe-filter-ii.c467
-rw-r--r--gnulib/lib/pipe-filter.h237
-rw-r--r--gnulib/lib/pipe-safer.c56
-rw-r--r--gnulib/lib/pipe.c51
-rw-r--r--gnulib/lib/pipe.h2
-rw-r--r--gnulib/lib/pipe2-safer.c52
-rw-r--r--gnulib/lib/pipe2.c169
-rw-r--r--gnulib/lib/poll.c605
-rw-r--r--gnulib/lib/poll.in.h104
-rw-r--r--gnulib/lib/popen-safer.c93
-rw-r--r--gnulib/lib/popen.c103
-rw-r--r--gnulib/lib/posix_openpt.c108
-rw-r--r--gnulib/lib/posixtm.c235
-rw-r--r--gnulib/lib/posixtm.h36
-rw-r--r--gnulib/lib/posixver.c54
-rw-r--r--gnulib/lib/posixver.h1
-rw-r--r--gnulib/lib/powf.c26
-rw-r--r--gnulib/lib/pread.c65
-rw-r--r--gnulib/lib/printf-args.c188
-rw-r--r--gnulib/lib/printf-args.h159
-rw-r--r--gnulib/lib/printf-frexp.c190
-rw-r--r--gnulib/lib/printf-frexp.h23
-rw-r--r--gnulib/lib/printf-frexpl.c37
-rw-r--r--gnulib/lib/printf-frexpl.h23
-rw-r--r--gnulib/lib/printf-parse.c639
-rw-r--r--gnulib/lib/printf-parse.h194
-rw-r--r--gnulib/lib/printf.c40
-rw-r--r--gnulib/lib/priv-set.c142
-rw-r--r--gnulib/lib/priv-set.h50
-rw-r--r--gnulib/lib/progname.c92
-rw-r--r--gnulib/lib/progname.h62
-rw-r--r--gnulib/lib/progreloc.c377
-rw-r--r--gnulib/lib/propername.c318
-rw-r--r--gnulib/lib/propername.h106
-rw-r--r--gnulib/lib/pselect.c77
-rw-r--r--gnulib/lib/pt_chown.c162
-rw-r--r--gnulib/lib/pthread.in.h274
-rw-r--r--gnulib/lib/pthread_sigmask.c69
-rw-r--r--gnulib/lib/ptsname.c32
-rw-r--r--gnulib/lib/ptsname_r.c85
-rw-r--r--gnulib/lib/pty-private.h46
-rw-r--r--gnulib/lib/pty.in.h132
-rw-r--r--gnulib/lib/putenv.c134
-rw-r--r--gnulib/lib/pwrite.c64
-rw-r--r--gnulib/lib/quote.c40
-rw-r--r--gnulib/lib/quote.h20
-rw-r--r--gnulib/lib/quotearg.c895
-rw-r--r--gnulib/lib/quotearg.h389
-rw-r--r--gnulib/lib/raise.c79
-rw-r--r--gnulib/lib/random_r.c423
-rw-r--r--gnulib/lib/rawmemchr.c136
-rw-r--r--gnulib/lib/rawmemchr.valgrind12
-rw-r--r--gnulib/lib/read-file.c189
-rw-r--r--gnulib/lib/read-file.h34
-rw-r--r--gnulib/lib/read.c85
-rw-r--r--gnulib/lib/readdir.c98
-rw-r--r--gnulib/lib/readline.c55
-rw-r--r--gnulib/lib/readline.h34
-rw-r--r--gnulib/lib/readlink.c74
-rw-r--r--gnulib/lib/readlinkat.c47
-rw-r--r--gnulib/lib/readtokens.c203
-rw-r--r--gnulib/lib/readtokens.h43
-rw-r--r--gnulib/lib/readtokens0.c99
-rw-r--r--gnulib/lib/readtokens0.h42
-rw-r--r--gnulib/lib/readutmp.c161
-rw-r--r--gnulib/lib/readutmp.h216
-rw-r--r--gnulib/lib/realloc.c79
-rw-r--r--gnulib/lib/recv.c49
-rw-r--r--gnulib/lib/recvfrom.c58
-rw-r--r--gnulib/lib/ref-add.sin30
-rw-r--r--gnulib/lib/ref-del.sin25
-rw-r--r--gnulib/lib/regcomp.c3876
-rw-r--r--gnulib/lib/regex-quote.c216
-rw-r--r--gnulib/lib/regex-quote.h88
-rw-r--r--gnulib/lib/regex.c72
-rw-r--r--gnulib/lib/regex.h675
-rw-r--r--gnulib/lib/regex_internal.c1741
-rw-r--r--gnulib/lib/regex_internal.h866
-rw-r--r--gnulib/lib/regexec.c4417
-rw-r--r--gnulib/lib/relocatable.c496
-rw-r--r--gnulib/lib/relocatable.h81
-rw-r--r--gnulib/lib/relocwrapper.c198
-rw-r--r--gnulib/lib/remove.c43
-rw-r--r--gnulib/lib/rename.c473
-rw-r--r--gnulib/lib/renameat.c157
-rw-r--r--gnulib/lib/resource-ext.h47
-rw-r--r--gnulib/lib/rewinddir.c49
-rw-r--r--gnulib/lib/rijndael-alg-fst.c1083
-rw-r--r--gnulib/lib/rijndael-alg-fst.h67
-rw-r--r--gnulib/lib/rijndael-api-fst.c521
-rw-r--r--gnulib/lib/rijndael-api-fst.h207
-rw-r--r--gnulib/lib/rint.c112
-rw-r--r--gnulib/lib/rintf.c19
-rw-r--r--gnulib/lib/rintl.c36
-rw-r--r--gnulib/lib/rmdir.c53
-rw-r--r--gnulib/lib/round.c170
-rw-r--r--gnulib/lib/roundf.c19
-rw-r--r--gnulib/lib/roundl.c36
-rw-r--r--gnulib/lib/rpmatch.c173
-rw-r--r--gnulib/lib/safe-alloc.c121
-rw-r--r--gnulib/lib/safe-alloc.h121
-rw-r--r--gnulib/lib/safe-read.c77
-rw-r--r--gnulib/lib/safe-read.h47
-rw-r--r--gnulib/lib/safe-write.c18
-rw-r--r--gnulib/lib/safe-write.h37
-rw-r--r--gnulib/lib/same-inode.h25
-rw-r--r--gnulib/lib/same.c123
-rw-r--r--gnulib/lib/same.h25
-rw-r--r--gnulib/lib/save-cwd.c99
-rw-r--r--gnulib/lib/save-cwd.h34
-rw-r--r--gnulib/lib/savedir.c145
-rw-r--r--gnulib/lib/savedir.h29
-rw-r--r--gnulib/lib/savewd.c305
-rw-r--r--gnulib/lib/savewd.h148
-rw-r--r--gnulib/lib/scandir.c188
-rw-r--r--gnulib/lib/sched.in.h57
-rw-r--r--gnulib/lib/se-context.in.h28
-rw-r--r--gnulib/lib/se-selinux.in.h97
-rw-r--r--gnulib/lib/search.in.h207
-rw-r--r--gnulib/lib/select.c492
-rw-r--r--gnulib/lib/selinux-at.c72
-rw-r--r--gnulib/lib/selinux-at.h52
-rw-r--r--gnulib/lib/send.c49
-rw-r--r--gnulib/lib/sendto.c50
-rw-r--r--gnulib/lib/set-mode-acl.c684
-rw-r--r--gnulib/lib/setenv.c390
-rw-r--r--gnulib/lib/sethostname.c162
-rw-r--r--gnulib/lib/setlocale.c938
-rw-r--r--gnulib/lib/setsockopt.c65
-rw-r--r--gnulib/lib/settime.c59
-rw-r--r--gnulib/lib/sh-quote.c107
-rw-r--r--gnulib/lib/sh-quote.h36
-rw-r--r--gnulib/lib/sha1.c427
-rw-r--r--gnulib/lib/sha1.h92
-rw-r--r--gnulib/lib/sha256.c569
-rw-r--r--gnulib/lib/sha256.h91
-rw-r--r--gnulib/lib/sha512.c619
-rw-r--r--gnulib/lib/sha512.h95
-rw-r--r--gnulib/lib/shutdown.c49
-rw-r--r--gnulib/lib/sig-handler.h44
-rw-r--r--gnulib/lib/sig2str.c345
-rw-r--r--gnulib/lib/sig2str.h43
-rw-r--r--gnulib/lib/sigaction.c204
-rw-r--r--gnulib/lib/siglist.h132
-rw-r--r--gnulib/lib/signal.in.h447
-rw-r--r--gnulib/lib/signbitd.c64
-rw-r--r--gnulib/lib/signbitf.c64
-rw-r--r--gnulib/lib/signbitl.c64
-rw-r--r--gnulib/lib/sigpipe-die.c82
-rw-r--r--gnulib/lib/sigpipe-die.h63
-rw-r--r--gnulib/lib/sigprocmask.c349
-rw-r--r--gnulib/lib/sincosl.c907
-rw-r--r--gnulib/lib/sinf.c26
-rw-r--r--gnulib/lib/sinhf.c26
-rw-r--r--gnulib/lib/sinl.c116
-rw-r--r--gnulib/lib/size_max.h31
-rw-r--r--gnulib/lib/sleep.c76
-rw-r--r--gnulib/lib/snprintf.c72
-rw-r--r--gnulib/lib/socket.c49
-rw-r--r--gnulib/lib/sockets.c154
-rw-r--r--gnulib/lib/sockets.h62
-rw-r--r--gnulib/lib/spawn-pipe.c450
-rw-r--r--gnulib/lib/spawn-pipe.h147
-rw-r--r--gnulib/lib/spawn.c33
-rw-r--r--gnulib/lib/spawn.in.h881
-rw-r--r--gnulib/lib/spawn_faction_addclose.c59
-rw-r--r--gnulib/lib/spawn_faction_adddup2.c60
-rw-r--r--gnulib/lib/spawn_faction_addopen.c63
-rw-r--r--gnulib/lib/spawn_faction_destroy.c31
-rw-r--r--gnulib/lib/spawn_faction_init.c56
-rw-r--r--gnulib/lib/spawn_int.h62
-rw-r--r--gnulib/lib/spawnattr_destroy.c28
-rw-r--r--gnulib/lib/spawnattr_getdefault.c34
-rw-r--r--gnulib/lib/spawnattr_getflags.c32
-rw-r--r--gnulib/lib/spawnattr_getpgroup.c32
-rw-r--r--gnulib/lib/spawnattr_getschedparam.c34
-rw-r--r--gnulib/lib/spawnattr_getschedpolicy.c36
-rw-r--r--gnulib/lib/spawnattr_getsigmask.c33
-rw-r--r--gnulib/lib/spawnattr_init.c33
-rw-r--r--gnulib/lib/spawnattr_setdefault.c33
-rw-r--r--gnulib/lib/spawnattr_setflags.c45
-rw-r--r--gnulib/lib/spawnattr_setpgroup.c32
-rw-r--r--gnulib/lib/spawnattr_setschedparam.c34
-rw-r--r--gnulib/lib/spawnattr_setschedpolicy.c39
-rw-r--r--gnulib/lib/spawnattr_setsigmask.c33
-rw-r--r--gnulib/lib/spawni.c374
-rw-r--r--gnulib/lib/spawnp.c33
-rw-r--r--gnulib/lib/sprintf.c80
-rw-r--r--gnulib/lib/sqrtf.c26
-rw-r--r--gnulib/lib/sqrtl.c71
-rw-r--r--gnulib/lib/stat-macros.h3
-rw-r--r--gnulib/lib/stat-size.h111
-rw-r--r--gnulib/lib/stat-time.h189
-rw-r--r--gnulib/lib/stat.c123
-rw-r--r--gnulib/lib/stdalign.in.h89
-rw-r--r--gnulib/lib/stdarg.in.h36
-rw-r--r--gnulib/lib/stdbool.in.h122
-rw-r--r--gnulib/lib/stddef.in.h87
-rw-r--r--gnulib/lib/stdint.in.h609
-rw-r--r--gnulib/lib/stdio--.h41
-rw-r--r--gnulib/lib/stdio-impl.h110
-rw-r--r--gnulib/lib/stdio-read.c150
-rw-r--r--gnulib/lib/stdio-safer.h36
-rw-r--r--gnulib/lib/stdio-write.c198
-rw-r--r--gnulib/lib/stdio.in.h1350
-rw-r--r--gnulib/lib/stdlib--.h36
-rw-r--r--gnulib/lib/stdlib-safer.h32
-rw-r--r--gnulib/lib/stdlib.in.h804
-rw-r--r--gnulib/lib/stpcpy.c49
-rw-r--r--gnulib/lib/stpncpy.c92
-rw-r--r--gnulib/lib/str-kmp.h154
-rw-r--r--gnulib/lib/str-two-way.h453
-rw-r--r--gnulib/lib/strcasecmp.c63
-rw-r--r--gnulib/lib/strcasestr.c83
-rw-r--r--gnulib/lib/strchrnul.c142
-rw-r--r--gnulib/lib/strchrnul.valgrind12
-rw-r--r--gnulib/lib/strcspn.c41
-rw-r--r--gnulib/lib/strdup.c55
-rw-r--r--gnulib/lib/streq.h176
-rw-r--r--gnulib/lib/strerror-override.c289
-rw-r--r--gnulib/lib/strerror-override.h52
-rw-r--r--gnulib/lib/strerror.c70
-rw-r--r--gnulib/lib/strerror_r.c327
-rw-r--r--gnulib/lib/strftime.c1469
-rw-r--r--gnulib/lib/strftime.h34
-rw-r--r--gnulib/lib/striconv.c464
-rw-r--r--gnulib/lib/striconv.h76
-rw-r--r--gnulib/lib/striconveh.c1199
-rw-r--r--gnulib/lib/striconveh.h140
-rw-r--r--gnulib/lib/striconveha.c352
-rw-r--r--gnulib/lib/striconveha.h95
-rw-r--r--gnulib/lib/string.in.h1011
-rw-r--r--gnulib/lib/strings.in.h123
-rw-r--r--gnulib/lib/stripslash.c45
-rw-r--r--gnulib/lib/strncasecmp.c63
-rw-r--r--gnulib/lib/strncat.c33
-rw-r--r--gnulib/lib/strndup.c37
-rw-r--r--gnulib/lib/strnlen.c31
-rw-r--r--gnulib/lib/strnlen1.c35
-rw-r--r--gnulib/lib/strnlen1.h40
-rw-r--r--gnulib/lib/strpbrk.c42
-rw-r--r--gnulib/lib/strptime.c1145
-rw-r--r--gnulib/lib/strsep.c58
-rw-r--r--gnulib/lib/strsignal.c200
-rw-r--r--gnulib/lib/strstr.c83
-rw-r--r--gnulib/lib/strtod.c367
-rw-r--r--gnulib/lib/strtoimax.c75
-rw-r--r--gnulib/lib/strtok_r.c76
-rw-r--r--gnulib/lib/strtol.c433
-rw-r--r--gnulib/lib/strtoll.c33
-rw-r--r--gnulib/lib/strtoul.c19
-rw-r--r--gnulib/lib/strtoull.c26
-rw-r--r--gnulib/lib/strtoumax.c2
-rw-r--r--gnulib/lib/strverscmp.c132
-rw-r--r--gnulib/lib/symlink.c57
-rw-r--r--gnulib/lib/symlinkat.c76
-rw-r--r--gnulib/lib/sys_file.in.h64
-rw-r--r--gnulib/lib/sys_ioctl.in.h79
-rw-r--r--gnulib/lib/sys_select.in.h288
-rw-r--r--gnulib/lib/sys_socket.in.h683
-rw-r--r--gnulib/lib/sys_stat.in.h674
-rw-r--r--gnulib/lib/sys_time.in.h200
-rw-r--r--gnulib/lib/sys_times.in.h81
-rw-r--r--gnulib/lib/sys_types.in.h40
-rw-r--r--gnulib/lib/sys_uio.in.h64
-rw-r--r--gnulib/lib/sys_utsname.in.h109
-rw-r--r--gnulib/lib/sys_wait.in.h130
-rw-r--r--gnulib/lib/sysexits.in.h72
-rwxr-xr-xgnulib/lib/t-idcache52
-rw-r--r--gnulib/lib/tanf.c26
-rw-r--r--gnulib/lib/tanhf.c26
-rw-r--r--gnulib/lib/tanl.c235
-rw-r--r--gnulib/lib/tcgetsid.c42
-rw-r--r--gnulib/lib/tempname.c309
-rw-r--r--gnulib/lib/tempname.h50
-rw-r--r--gnulib/lib/termios.in.h76
-rw-r--r--gnulib/lib/time.in.h249
-rw-r--r--gnulib/lib/time_r.c45
-rw-r--r--gnulib/lib/timegm.c39
-rw-r--r--gnulib/lib/times.c67
-rw-r--r--gnulib/lib/timespec-add.c71
-rw-r--r--gnulib/lib/timespec-sub.c72
-rw-r--r--gnulib/lib/timespec.h82
-rw-r--r--gnulib/lib/tmpdir.c157
-rw-r--r--gnulib/lib/tmpdir.h26
-rw-r--r--gnulib/lib/tmpfile-safer.c69
-rw-r--r--gnulib/lib/tmpfile.c127
-rw-r--r--gnulib/lib/towctrans-impl.h22
-rw-r--r--gnulib/lib/towctrans.c23
-rw-r--r--gnulib/lib/trigl.c636
-rw-r--r--gnulib/lib/trigl.h35
-rw-r--r--gnulib/lib/trim.c129
-rw-r--r--gnulib/lib/trim.h33
-rw-r--r--gnulib/lib/trunc.c115
-rw-r--r--gnulib/lib/truncf.c20
-rw-r--r--gnulib/lib/truncl.c37
-rw-r--r--gnulib/lib/tsearch.c687
-rw-r--r--gnulib/lib/ttyname_r.c86
-rw-r--r--gnulib/lib/u64.h158
-rw-r--r--gnulib/lib/uinttostr.c3
-rw-r--r--gnulib/lib/umaxtostr.c3
-rw-r--r--gnulib/lib/uname.c268
-rw-r--r--gnulib/lib/unicase.in.h457
-rw-r--r--gnulib/lib/unicase/cased.c53
-rw-r--r--gnulib/lib/unicase/cased.h343
-rw-r--r--gnulib/lib/unicase/casefold.h22
-rw-r--r--gnulib/lib/unicase/caseprop.h32
-rw-r--r--gnulib/lib/unicase/context.h65
-rw-r--r--gnulib/lib/unicase/empty-prefix-context.c27
-rw-r--r--gnulib/lib/unicase/empty-suffix-context.c27
-rw-r--r--gnulib/lib/unicase/ignorable.c71
-rw-r--r--gnulib/lib/unicase/ignorable.h552
-rw-r--r--gnulib/lib/unicase/invariant.h45
-rw-r--r--gnulib/lib/unicase/locale-language.c55
-rw-r--r--gnulib/lib/unicase/locale-languages.gperf270
-rw-r--r--gnulib/lib/unicase/simple-mapping.h39
-rw-r--r--gnulib/lib/unicase/special-casing-table.gperf136
-rw-r--r--gnulib/lib/unicase/special-casing.c25
-rw-r--r--gnulib/lib/unicase/special-casing.h60
-rw-r--r--gnulib/lib/unicase/tocasefold.c27
-rw-r--r--gnulib/lib/unicase/tocasefold.h567
-rw-r--r--gnulib/lib/unicase/tolower.c27
-rw-r--r--gnulib/lib/unicase/tolower.h567
-rw-r--r--gnulib/lib/unicase/totitle.c27
-rw-r--r--gnulib/lib/unicase/totitle.h615
-rw-r--r--gnulib/lib/unicase/toupper.c27
-rw-r--r--gnulib/lib/unicase/toupper.h615
-rw-r--r--gnulib/lib/unicase/u-casecmp.h69
-rw-r--r--gnulib/lib/unicase/u-casecoll.h68
-rw-r--r--gnulib/lib/unicase/u-casefold.h28
-rw-r--r--gnulib/lib/unicase/u-casemap.h416
-rw-r--r--gnulib/lib/unicase/u-casexfrm.h88
-rw-r--r--gnulib/lib/unicase/u-ct-casefold.h107
-rw-r--r--gnulib/lib/unicase/u-ct-totitle.h501
-rw-r--r--gnulib/lib/unicase/u-is-cased.h128
-rw-r--r--gnulib/lib/unicase/u-is-invariant.h64
-rw-r--r--gnulib/lib/unicase/u-prefix-context.h92
-rw-r--r--gnulib/lib/unicase/u-suffix-context.h90
-rw-r--r--gnulib/lib/unicase/u-totitle.h28
-rw-r--r--gnulib/lib/unicase/u16-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u16-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u16-casefold.c26
-rw-r--r--gnulib/lib/unicase/u16-casemap.c40
-rw-r--r--gnulib/lib/unicase/u16-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u16-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u16-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u16-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u16-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u16-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u16-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u16-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u16-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u16-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u16-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u16-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u16-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u16-tolower.c39
-rw-r--r--gnulib/lib/unicase/u16-totitle.c27
-rw-r--r--gnulib/lib/unicase/u16-toupper.c39
-rw-r--r--gnulib/lib/unicase/u32-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u32-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u32-casefold.c26
-rw-r--r--gnulib/lib/unicase/u32-casemap.c40
-rw-r--r--gnulib/lib/unicase/u32-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u32-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u32-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u32-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u32-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u32-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u32-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u32-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u32-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u32-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u32-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u32-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u32-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u32-tolower.c39
-rw-r--r--gnulib/lib/unicase/u32-totitle.c26
-rw-r--r--gnulib/lib/unicase/u32-toupper.c39
-rw-r--r--gnulib/lib/unicase/u8-casecmp.c35
-rw-r--r--gnulib/lib/unicase/u8-casecoll.c32
-rw-r--r--gnulib/lib/unicase/u8-casefold.c107
-rw-r--r--gnulib/lib/unicase/u8-casemap.c40
-rw-r--r--gnulib/lib/unicase/u8-casexfrm.c35
-rw-r--r--gnulib/lib/unicase/u8-ct-casefold.c35
-rw-r--r--gnulib/lib/unicase/u8-ct-tolower.c40
-rw-r--r--gnulib/lib/unicase/u8-ct-totitle.c43
-rw-r--r--gnulib/lib/unicase/u8-ct-toupper.c40
-rw-r--r--gnulib/lib/unicase/u8-is-cased.c36
-rw-r--r--gnulib/lib/unicase/u8-is-casefolded.c30
-rw-r--r--gnulib/lib/unicase/u8-is-invariant.c34
-rw-r--r--gnulib/lib/unicase/u8-is-lowercase.c30
-rw-r--r--gnulib/lib/unicase/u8-is-titlecase.c30
-rw-r--r--gnulib/lib/unicase/u8-is-uppercase.c30
-rw-r--r--gnulib/lib/unicase/u8-prefix-context.c33
-rw-r--r--gnulib/lib/unicase/u8-suffix-context.c32
-rw-r--r--gnulib/lib/unicase/u8-tolower.c120
-rw-r--r--gnulib/lib/unicase/u8-totitle.c107
-rw-r--r--gnulib/lib/unicase/u8-toupper.c120
-rw-r--r--gnulib/lib/unicase/ulc-casecmp.c74
-rw-r--r--gnulib/lib/unicase/ulc-casecoll.c31
-rw-r--r--gnulib/lib/unicase/ulc-casexfrm.c64
-rw-r--r--gnulib/lib/unicase/unicasemap.h52
-rw-r--r--gnulib/lib/unicodeio.c216
-rw-r--r--gnulib/lib/unicodeio.h48
-rw-r--r--gnulib/lib/uniconv.in.h172
-rw-r--r--gnulib/lib/uniconv/u-conv-from-enc.h91
-rw-r--r--gnulib/lib/uniconv/u-conv-to-enc.h156
-rw-r--r--gnulib/lib/uniconv/u-strconv-from-enc.h40
-rw-r--r--gnulib/lib/uniconv/u-strconv-to-enc.h63
-rw-r--r--gnulib/lib/uniconv/u16-conv-from-enc.c47
-rw-r--r--gnulib/lib/uniconv/u16-conv-to-enc.c177
-rw-r--r--gnulib/lib/uniconv/u16-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u16-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u16-strconv-to-enc.c50
-rw-r--r--gnulib/lib/uniconv/u16-strconv-to-locale.c29
-rw-r--r--gnulib/lib/uniconv/u32-conv-from-enc.c46
-rw-r--r--gnulib/lib/uniconv/u32-conv-to-enc.c49
-rw-r--r--gnulib/lib/uniconv/u32-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u32-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u32-strconv-to-enc.c49
-rw-r--r--gnulib/lib/uniconv/u32-strconv-to-locale.c29
-rw-r--r--gnulib/lib/uniconv/u8-conv-from-enc.c105
-rw-r--r--gnulib/lib/uniconv/u8-conv-to-enc.c92
-rw-r--r--gnulib/lib/uniconv/u8-strconv-from-enc.c34
-rw-r--r--gnulib/lib/uniconv/u8-strconv-from-locale.c29
-rw-r--r--gnulib/lib/uniconv/u8-strconv-to-enc.c79
-rw-r--r--gnulib/lib/uniconv/u8-strconv-to-locale.c29
-rw-r--r--gnulib/lib/unictype.in.h881
-rw-r--r--gnulib/lib/unictype/3level.h327
-rw-r--r--gnulib/lib/unictype/3levelbit.h317
-rw-r--r--gnulib/lib/unictype/Makefile20
-rw-r--r--gnulib/lib/unictype/bidi_byname.c69
-rw-r--r--gnulib/lib/unictype/bidi_byname.gperf70
-rw-r--r--gnulib/lib/unictype/bidi_longname.c53
-rw-r--r--gnulib/lib/unictype/bidi_name.c41
-rw-r--r--gnulib/lib/unictype/bidi_of.c58
-rw-r--r--gnulib/lib/unictype/bidi_of.h909
-rw-r--r--gnulib/lib/unictype/bidi_test.c33
-rw-r--r--gnulib/lib/unictype/bitmap.h47
-rw-r--r--gnulib/lib/unictype/block_test.c31
-rw-r--r--gnulib/lib/unictype/blocks.c62
-rw-r--r--gnulib/lib/unictype/blocks.h990
-rw-r--r--gnulib/lib/unictype/categ_C.c27
-rw-r--r--gnulib/lib/unictype/categ_C.h926
-rw-r--r--gnulib/lib/unictype/categ_Cc.c27
-rw-r--r--gnulib/lib/unictype/categ_Cc.h156
-rw-r--r--gnulib/lib/unictype/categ_Cf.c27
-rw-r--r--gnulib/lib/unictype/categ_Cf.h456
-rw-r--r--gnulib/lib/unictype/categ_Cn.c27
-rw-r--r--gnulib/lib/unictype/categ_Cn.h1050
-rw-r--r--gnulib/lib/unictype/categ_Co.c27
-rw-r--r--gnulib/lib/unictype/categ_Co.h310
-rw-r--r--gnulib/lib/unictype/categ_Cs.c30
-rw-r--r--gnulib/lib/unictype/categ_Cs.h156
-rw-r--r--gnulib/lib/unictype/categ_L.c27
-rw-r--r--gnulib/lib/unictype/categ_L.h604
-rw-r--r--gnulib/lib/unictype/categ_LC.c27
-rw-r--r--gnulib/lib/unictype/categ_LC.h339
-rw-r--r--gnulib/lib/unictype/categ_Ll.c27
-rw-r--r--gnulib/lib/unictype/categ_Ll.h335
-rw-r--r--gnulib/lib/unictype/categ_Lm.c27
-rw-r--r--gnulib/lib/unictype/categ_Lm.h232
-rw-r--r--gnulib/lib/unictype/categ_Lo.c27
-rw-r--r--gnulib/lib/unictype/categ_Lo.h592
-rw-r--r--gnulib/lib/unictype/categ_Lt.c27
-rw-r--r--gnulib/lib/unictype/categ_Lt.h160
-rw-r--r--gnulib/lib/unictype/categ_Lu.c27
-rw-r--r--gnulib/lib/unictype/categ_Lu.h331
-rw-r--r--gnulib/lib/unictype/categ_M.c27
-rw-r--r--gnulib/lib/unictype/categ_M.h532
-rw-r--r--gnulib/lib/unictype/categ_Mc.c27
-rw-r--r--gnulib/lib/unictype/categ_Mc.h335
-rw-r--r--gnulib/lib/unictype/categ_Me.c27
-rw-r--r--gnulib/lib/unictype/categ_Me.h164
-rw-r--r--gnulib/lib/unictype/categ_Mn.c27
-rw-r--r--gnulib/lib/unictype/categ_Mn.h532
-rw-r--r--gnulib/lib/unictype/categ_N.c27
-rw-r--r--gnulib/lib/unictype/categ_N.h415
-rw-r--r--gnulib/lib/unictype/categ_Nd.c27
-rw-r--r--gnulib/lib/unictype/categ_Nd.h355
-rw-r--r--gnulib/lib/unictype/categ_Nl.c27
-rw-r--r--gnulib/lib/unictype/categ_Nl.h311
-rw-r--r--gnulib/lib/unictype/categ_No.c27
-rw-r--r--gnulib/lib/unictype/categ_No.h375
-rw-r--r--gnulib/lib/unictype/categ_P.c27
-rw-r--r--gnulib/lib/unictype/categ_P.h415
-rw-r--r--gnulib/lib/unictype/categ_Pc.c27
-rw-r--r--gnulib/lib/unictype/categ_Pc.h164
-rw-r--r--gnulib/lib/unictype/categ_Pd.c27
-rw-r--r--gnulib/lib/unictype/categ_Pd.h184
-rw-r--r--gnulib/lib/unictype/categ_Pe.c27
-rw-r--r--gnulib/lib/unictype/categ_Pe.h196
-rw-r--r--gnulib/lib/unictype/categ_Pf.c27
-rw-r--r--gnulib/lib/unictype/categ_Pf.h164
-rw-r--r--gnulib/lib/unictype/categ_Pi.c27
-rw-r--r--gnulib/lib/unictype/categ_Pi.h164
-rw-r--r--gnulib/lib/unictype/categ_Po.c27
-rw-r--r--gnulib/lib/unictype/categ_Po.h395
-rw-r--r--gnulib/lib/unictype/categ_Ps.c27
-rw-r--r--gnulib/lib/unictype/categ_Ps.h196
-rw-r--r--gnulib/lib/unictype/categ_S.c27
-rw-r--r--gnulib/lib/unictype/categ_S.h443
-rw-r--r--gnulib/lib/unictype/categ_Sc.c27
-rw-r--r--gnulib/lib/unictype/categ_Sc.h192
-rw-r--r--gnulib/lib/unictype/categ_Sk.c27
-rw-r--r--gnulib/lib/unictype/categ_Sk.h180
-rw-r--r--gnulib/lib/unictype/categ_Sm.c27
-rw-r--r--gnulib/lib/unictype/categ_Sm.h331
-rw-r--r--gnulib/lib/unictype/categ_So.c27
-rw-r--r--gnulib/lib/unictype/categ_So.h419
-rw-r--r--gnulib/lib/unictype/categ_Z.c27
-rw-r--r--gnulib/lib/unictype/categ_Z.h172
-rw-r--r--gnulib/lib/unictype/categ_Zl.c30
-rw-r--r--gnulib/lib/unictype/categ_Zl.h156
-rw-r--r--gnulib/lib/unictype/categ_Zp.c30
-rw-r--r--gnulib/lib/unictype/categ_Zp.h156
-rw-r--r--gnulib/lib/unictype/categ_Zs.c27
-rw-r--r--gnulib/lib/unictype/categ_Zs.h172
-rw-r--r--gnulib/lib/unictype/categ_and.c45
-rw-r--r--gnulib/lib/unictype/categ_and_not.c42
-rw-r--r--gnulib/lib/unictype/categ_byname.c191
-rw-r--r--gnulib/lib/unictype/categ_byname.gperf116
-rw-r--r--gnulib/lib/unictype/categ_longname.c106
-rw-r--r--gnulib/lib/unictype/categ_name.c79
-rw-r--r--gnulib/lib/unictype/categ_none.c30
-rw-r--r--gnulib/lib/unictype/categ_of.c81
-rw-r--r--gnulib/lib/unictype/categ_of.h1213
-rw-r--r--gnulib/lib/unictype/categ_or.c42
-rw-r--r--gnulib/lib/unictype/categ_test.c32
-rw-r--r--gnulib/lib/unictype/combiningclass.c47
-rw-r--r--gnulib/lib/unictype/combiningclass.h999
-rw-r--r--gnulib/lib/unictype/combiningclass_byname.c63
-rw-r--r--gnulib/lib/unictype/combiningclass_byname.gperf66
-rw-r--r--gnulib/lib/unictype/combiningclass_longname.c130
-rw-r--r--gnulib/lib/unictype/combiningclass_name.c130
-rw-r--r--gnulib/lib/unictype/ctype_alnum.c32
-rw-r--r--gnulib/lib/unictype/ctype_alnum.h616
-rw-r--r--gnulib/lib/unictype/ctype_alpha.c32
-rw-r--r--gnulib/lib/unictype/ctype_alpha.h616
-rw-r--r--gnulib/lib/unictype/ctype_blank.c32
-rw-r--r--gnulib/lib/unictype/ctype_blank.h172
-rw-r--r--gnulib/lib/unictype/ctype_cntrl.c32
-rw-r--r--gnulib/lib/unictype/ctype_cntrl.h160
-rw-r--r--gnulib/lib/unictype/ctype_digit.c32
-rw-r--r--gnulib/lib/unictype/ctype_digit.h156
-rw-r--r--gnulib/lib/unictype/ctype_graph.c32
-rw-r--r--gnulib/lib/unictype/ctype_graph.h926
-rw-r--r--gnulib/lib/unictype/ctype_lower.c32
-rw-r--r--gnulib/lib/unictype/ctype_lower.h327
-rw-r--r--gnulib/lib/unictype/ctype_print.c32
-rw-r--r--gnulib/lib/unictype/ctype_print.h926
-rw-r--r--gnulib/lib/unictype/ctype_punct.c32
-rw-r--r--gnulib/lib/unictype/ctype_punct.h758
-rw-r--r--gnulib/lib/unictype/ctype_space.c32
-rw-r--r--gnulib/lib/unictype/ctype_space.h172
-rw-r--r--gnulib/lib/unictype/ctype_upper.c32
-rw-r--r--gnulib/lib/unictype/ctype_upper.h327
-rw-r--r--gnulib/lib/unictype/ctype_xdigit.c32
-rw-r--r--gnulib/lib/unictype/ctype_xdigit.h156
-rw-r--r--gnulib/lib/unictype/decdigit.c49
-rw-r--r--gnulib/lib/unictype/decdigit.h255
-rw-r--r--gnulib/lib/unictype/digit.c49
-rw-r--r--gnulib/lib/unictype/digit.h351
-rw-r--r--gnulib/lib/unictype/identsyntaxmap.h42
-rw-r--r--gnulib/lib/unictype/joininggroup_byname.c63
-rw-r--r--gnulib/lib/unictype/joininggroup_byname.gperf85
-rw-r--r--gnulib/lib/unictype/joininggroup_name.c55
-rw-r--r--gnulib/lib/unictype/joininggroup_name.h74
-rw-r--r--gnulib/lib/unictype/joininggroup_of.c33
-rw-r--r--gnulib/lib/unictype/joininggroup_of.h183
-rw-r--r--gnulib/lib/unictype/joiningtype_byname.c63
-rw-r--r--gnulib/lib/unictype/joiningtype_byname.gperf30
-rw-r--r--gnulib/lib/unictype/joiningtype_longname.c40
-rw-r--r--gnulib/lib/unictype/joiningtype_name.c35
-rw-r--r--gnulib/lib/unictype/joiningtype_of.c54
-rw-r--r--gnulib/lib/unictype/joiningtype_of.h127
-rw-r--r--gnulib/lib/unictype/mirror.c49
-rw-r--r--gnulib/lib/unictype/mirror.h503
-rw-r--r--gnulib/lib/unictype/numeric.c55
-rw-r--r--gnulib/lib/unictype/numeric.h710
-rw-r--r--gnulib/lib/unictype/pr_alphabetic.c35
-rw-r--r--gnulib/lib/unictype/pr_alphabetic.h612
-rw-r--r--gnulib/lib/unictype/pr_ascii_hex_digit.c35
-rw-r--r--gnulib/lib/unictype/pr_ascii_hex_digit.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_digit.h291
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h172
-rw-r--r--gnulib/lib/unictype/pr_bidi_block_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_block_separator.h160
-rw-r--r--gnulib/lib/unictype/pr_bidi_boundary_neutral.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_boundary_neutral.h586
-rw-r--r--gnulib/lib/unictype/pr_bidi_common_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_common_separator.h168
-rw-r--r--gnulib/lib/unictype/pr_bidi_control.c35
-rw-r--r--gnulib/lib/unictype/pr_bidi_control.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_embedding_or_override.c49
-rw-r--r--gnulib/lib/unictype/pr_bidi_embedding_or_override.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_separator.h172
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_terminator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_eur_num_terminator.h192
-rw-r--r--gnulib/lib/unictype/pr_bidi_european_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_european_digit.h311
-rw-r--r--gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h319
-rw-r--r--gnulib/lib/unictype/pr_bidi_left_to_right.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_left_to_right.h726
-rw-r--r--gnulib/lib/unictype/pr_bidi_non_spacing_mark.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_non_spacing_mark.h532
-rw-r--r--gnulib/lib/unictype/pr_bidi_other_neutral.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_other_neutral.h435
-rw-r--r--gnulib/lib/unictype/pr_bidi_pdf.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_pdf.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_segment_separator.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_segment_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_bidi_whitespace.c47
-rw-r--r--gnulib/lib/unictype/pr_bidi_whitespace.h172
-rw-r--r--gnulib/lib/unictype/pr_byname.c339
-rw-r--r--gnulib/lib/unictype/pr_byname.gperf218
-rw-r--r--gnulib/lib/unictype/pr_case_ignorable.c35
-rw-r--r--gnulib/lib/unictype/pr_case_ignorable.h552
-rw-r--r--gnulib/lib/unictype/pr_cased.c35
-rw-r--r--gnulib/lib/unictype/pr_cased.h343
-rw-r--r--gnulib/lib/unictype/pr_changes_when_casefolded.c35
-rw-r--r--gnulib/lib/unictype/pr_changes_when_casefolded.h331
-rw-r--r--gnulib/lib/unictype/pr_changes_when_casemapped.c35
-rw-r--r--gnulib/lib/unictype/pr_changes_when_casemapped.h335
-rw-r--r--gnulib/lib/unictype/pr_changes_when_lowercased.c35
-rw-r--r--gnulib/lib/unictype/pr_changes_when_lowercased.h327
-rw-r--r--gnulib/lib/unictype/pr_changes_when_titlecased.c35
-rw-r--r--gnulib/lib/unictype/pr_changes_when_titlecased.h331
-rw-r--r--gnulib/lib/unictype/pr_changes_when_uppercased.c35
-rw-r--r--gnulib/lib/unictype/pr_changes_when_uppercased.h331
-rw-r--r--gnulib/lib/unictype/pr_combining.c35
-rw-r--r--gnulib/lib/unictype/pr_combining.h532
-rw-r--r--gnulib/lib/unictype/pr_composite.c35
-rw-r--r--gnulib/lib/unictype/pr_composite.h387
-rw-r--r--gnulib/lib/unictype/pr_currency_symbol.c47
-rw-r--r--gnulib/lib/unictype/pr_currency_symbol.h192
-rw-r--r--gnulib/lib/unictype/pr_dash.c35
-rw-r--r--gnulib/lib/unictype/pr_dash.h188
-rw-r--r--gnulib/lib/unictype/pr_decimal_digit.c47
-rw-r--r--gnulib/lib/unictype/pr_decimal_digit.h355
-rw-r--r--gnulib/lib/unictype/pr_default_ignorable_code_point.c35
-rw-r--r--gnulib/lib/unictype/pr_default_ignorable_code_point.h464
-rw-r--r--gnulib/lib/unictype/pr_deprecated.c35
-rw-r--r--gnulib/lib/unictype/pr_deprecated.h324
-rw-r--r--gnulib/lib/unictype/pr_diacritic.c35
-rw-r--r--gnulib/lib/unictype/pr_diacritic.h379
-rw-r--r--gnulib/lib/unictype/pr_extender.c35
-rw-r--r--gnulib/lib/unictype/pr_extender.h204
-rw-r--r--gnulib/lib/unictype/pr_format_control.c35
-rw-r--r--gnulib/lib/unictype/pr_format_control.h440
-rw-r--r--gnulib/lib/unictype/pr_grapheme_base.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_base.h652
-rw-r--r--gnulib/lib/unictype/pr_grapheme_extend.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_extend.h532
-rw-r--r--gnulib/lib/unictype/pr_grapheme_link.c35
-rw-r--r--gnulib/lib/unictype/pr_grapheme_link.h331
-rw-r--r--gnulib/lib/unictype/pr_hex_digit.c35
-rw-r--r--gnulib/lib/unictype/pr_hex_digit.h160
-rw-r--r--gnulib/lib/unictype/pr_hyphen.c35
-rw-r--r--gnulib/lib/unictype/pr_hyphen.h180
-rw-r--r--gnulib/lib/unictype/pr_id_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_id_continue.h756
-rw-r--r--gnulib/lib/unictype/pr_id_start.c35
-rw-r--r--gnulib/lib/unictype/pr_id_start.h604
-rw-r--r--gnulib/lib/unictype/pr_ideographic.c35
-rw-r--r--gnulib/lib/unictype/pr_ideographic.h320
-rw-r--r--gnulib/lib/unictype/pr_ids_binary_operator.c35
-rw-r--r--gnulib/lib/unictype/pr_ids_binary_operator.h156
-rw-r--r--gnulib/lib/unictype/pr_ids_trinary_operator.c35
-rw-r--r--gnulib/lib/unictype/pr_ids_trinary_operator.h156
-rw-r--r--gnulib/lib/unictype/pr_ignorable_control.c35
-rw-r--r--gnulib/lib/unictype/pr_ignorable_control.h456
-rw-r--r--gnulib/lib/unictype/pr_iso_control.c47
-rw-r--r--gnulib/lib/unictype/pr_iso_control.h156
-rw-r--r--gnulib/lib/unictype/pr_join_control.c47
-rw-r--r--gnulib/lib/unictype/pr_join_control.h156
-rw-r--r--gnulib/lib/unictype/pr_left_of_pair.c35
-rw-r--r--gnulib/lib/unictype/pr_left_of_pair.h184
-rw-r--r--gnulib/lib/unictype/pr_line_separator.c55
-rw-r--r--gnulib/lib/unictype/pr_line_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_logical_order_exception.c35
-rw-r--r--gnulib/lib/unictype/pr_logical_order_exception.h160
-rw-r--r--gnulib/lib/unictype/pr_lowercase.c35
-rw-r--r--gnulib/lib/unictype/pr_lowercase.h339
-rw-r--r--gnulib/lib/unictype/pr_math.c35
-rw-r--r--gnulib/lib/unictype/pr_math.h335
-rw-r--r--gnulib/lib/unictype/pr_non_break.c35
-rw-r--r--gnulib/lib/unictype/pr_non_break.h172
-rw-r--r--gnulib/lib/unictype/pr_not_a_character.c35
-rw-r--r--gnulib/lib/unictype/pr_not_a_character.h306
-rw-r--r--gnulib/lib/unictype/pr_numeric.c35
-rw-r--r--gnulib/lib/unictype/pr_numeric.h552
-rw-r--r--gnulib/lib/unictype/pr_other_alphabetic.c35
-rw-r--r--gnulib/lib/unictype/pr_other_alphabetic.h363
-rw-r--r--gnulib/lib/unictype/pr_other_default_ignorable_code_point.c35
-rw-r--r--gnulib/lib/unictype/pr_other_default_ignorable_code_point.h324
-rw-r--r--gnulib/lib/unictype/pr_other_grapheme_extend.c35
-rw-r--r--gnulib/lib/unictype/pr_other_grapheme_extend.h307
-rw-r--r--gnulib/lib/unictype/pr_other_id_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_other_id_continue.h168
-rw-r--r--gnulib/lib/unictype/pr_other_id_start.c35
-rw-r--r--gnulib/lib/unictype/pr_other_id_start.h160
-rw-r--r--gnulib/lib/unictype/pr_other_lowercase.c35
-rw-r--r--gnulib/lib/unictype/pr_other_lowercase.h176
-rw-r--r--gnulib/lib/unictype/pr_other_math.c35
-rw-r--r--gnulib/lib/unictype/pr_other_math.h323
-rw-r--r--gnulib/lib/unictype/pr_other_uppercase.c35
-rw-r--r--gnulib/lib/unictype/pr_other_uppercase.h160
-rw-r--r--gnulib/lib/unictype/pr_paired_punctuation.c35
-rw-r--r--gnulib/lib/unictype/pr_paired_punctuation.h184
-rw-r--r--gnulib/lib/unictype/pr_paragraph_separator.c55
-rw-r--r--gnulib/lib/unictype/pr_paragraph_separator.h156
-rw-r--r--gnulib/lib/unictype/pr_pattern_syntax.c35
-rw-r--r--gnulib/lib/unictype/pr_pattern_syntax.h188
-rw-r--r--gnulib/lib/unictype/pr_pattern_white_space.c35
-rw-r--r--gnulib/lib/unictype/pr_pattern_white_space.h160
-rw-r--r--gnulib/lib/unictype/pr_private_use.c49
-rw-r--r--gnulib/lib/unictype/pr_private_use.h310
-rw-r--r--gnulib/lib/unictype/pr_punctuation.c47
-rw-r--r--gnulib/lib/unictype/pr_punctuation.h415
-rw-r--r--gnulib/lib/unictype/pr_quotation_mark.c35
-rw-r--r--gnulib/lib/unictype/pr_quotation_mark.h168
-rw-r--r--gnulib/lib/unictype/pr_radical.c35
-rw-r--r--gnulib/lib/unictype/pr_radical.h156
-rw-r--r--gnulib/lib/unictype/pr_sentence_terminal.c35
-rw-r--r--gnulib/lib/unictype/pr_sentence_terminal.h363
-rw-r--r--gnulib/lib/unictype/pr_soft_dotted.c35
-rw-r--r--gnulib/lib/unictype/pr_soft_dotted.h319
-rw-r--r--gnulib/lib/unictype/pr_space.c47
-rw-r--r--gnulib/lib/unictype/pr_space.h172
-rw-r--r--gnulib/lib/unictype/pr_terminal_punctuation.c35
-rw-r--r--gnulib/lib/unictype/pr_terminal_punctuation.h383
-rw-r--r--gnulib/lib/unictype/pr_test.c27
-rw-r--r--gnulib/lib/unictype/pr_titlecase.c47
-rw-r--r--gnulib/lib/unictype/pr_titlecase.h160
-rw-r--r--gnulib/lib/unictype/pr_unassigned_code_value.c35
-rw-r--r--gnulib/lib/unictype/pr_unassigned_code_value.h920
-rw-r--r--gnulib/lib/unictype/pr_unified_ideograph.c35
-rw-r--r--gnulib/lib/unictype/pr_unified_ideograph.h312
-rw-r--r--gnulib/lib/unictype/pr_uppercase.c35
-rw-r--r--gnulib/lib/unictype/pr_uppercase.h335
-rw-r--r--gnulib/lib/unictype/pr_variation_selector.c35
-rw-r--r--gnulib/lib/unictype/pr_variation_selector.h308
-rw-r--r--gnulib/lib/unictype/pr_white_space.c35
-rw-r--r--gnulib/lib/unictype/pr_white_space.h172
-rw-r--r--gnulib/lib/unictype/pr_xid_continue.c35
-rw-r--r--gnulib/lib/unictype/pr_xid_continue.h756
-rw-r--r--gnulib/lib/unictype/pr_xid_start.c35
-rw-r--r--gnulib/lib/unictype/pr_xid_start.h604
-rw-r--r--gnulib/lib/unictype/pr_zero_width.c35
-rw-r--r--gnulib/lib/unictype/pr_zero_width.h456
-rw-r--r--gnulib/lib/unictype/scripts.c75
-rw-r--r--gnulib/lib/unictype/scripts.h4337
-rw-r--r--gnulib/lib/unictype/scripts_byname.gperf109
-rw-r--r--gnulib/lib/unictype/sy_c_ident.c31
-rw-r--r--gnulib/lib/unictype/sy_c_ident.h140
-rw-r--r--gnulib/lib/unictype/sy_c_whitespace.c27
-rw-r--r--gnulib/lib/unictype/sy_c_whitespace.h156
-rw-r--r--gnulib/lib/unictype/sy_java_ident.c31
-rw-r--r--gnulib/lib/unictype/sy_java_ident.h389
-rw-r--r--gnulib/lib/unictype/sy_java_whitespace.c27
-rw-r--r--gnulib/lib/unictype/sy_java_whitespace.h156
-rw-r--r--gnulib/lib/unigbrk.in.h120
-rw-r--r--gnulib/lib/unigbrk/gbrkprop.h842
-rw-r--r--gnulib/lib/unigbrk/u16-grapheme-breaks.c44
-rw-r--r--gnulib/lib/unigbrk/u16-grapheme-next.c46
-rw-r--r--gnulib/lib/unigbrk/u16-grapheme-prev.c54
-rw-r--r--gnulib/lib/unigbrk/u32-grapheme-breaks.c42
-rw-r--r--gnulib/lib/unigbrk/u32-grapheme-next.c46
-rw-r--r--gnulib/lib/unigbrk/u32-grapheme-prev.c51
-rw-r--r--gnulib/lib/unigbrk/u8-grapheme-breaks.c46
-rw-r--r--gnulib/lib/unigbrk/u8-grapheme-next.c46
-rw-r--r--gnulib/lib/unigbrk/u8-grapheme-prev.c54
-rw-r--r--gnulib/lib/unigbrk/uc-gbrk-prop.c45
-rw-r--r--gnulib/lib/unigbrk/uc-is-grapheme-break.c106
-rw-r--r--gnulib/lib/unigbrk/ulc-grapheme-breaks.c130
-rw-r--r--gnulib/lib/unilbrk.in.h110
-rw-r--r--gnulib/lib/unilbrk/lbrkprop1.h33
-rw-r--r--gnulib/lib/unilbrk/lbrkprop2.h2942
-rw-r--r--gnulib/lib/unilbrk/lbrktables.c64
-rw-r--r--gnulib/lib/unilbrk/lbrktables.h95
-rw-r--r--gnulib/lib/unilbrk/u16-possible-linebreaks.c164
-rw-r--r--gnulib/lib/unilbrk/u16-width-linebreaks.c108
-rw-r--r--gnulib/lib/unilbrk/u32-possible-linebreaks.c158
-rw-r--r--gnulib/lib/unilbrk/u32-width-linebreaks.c106
-rw-r--r--gnulib/lib/unilbrk/u8-possible-linebreaks.c261
-rw-r--r--gnulib/lib/unilbrk/u8-width-linebreaks.c204
-rw-r--r--gnulib/lib/unilbrk/ulc-common.c51
-rw-r--r--gnulib/lib/unilbrk/ulc-common.h31
-rw-r--r--gnulib/lib/unilbrk/ulc-possible-linebreaks.c212
-rw-r--r--gnulib/lib/unilbrk/ulc-width-linebreaks.c231
-rw-r--r--gnulib/lib/uniname.in.h45
-rwxr-xr-xgnulib/lib/uniname/gen-uninames.lisp301
-rw-r--r--gnulib/lib/uniname/uniname.c516
-rw-r--r--gnulib/lib/uniname/uninames.h61495
-rw-r--r--gnulib/lib/uninorm.in.h245
-rw-r--r--gnulib/lib/uninorm/canonical-decomposition.c108
-rw-r--r--gnulib/lib/uninorm/compat-decomposition.c31
-rw-r--r--gnulib/lib/uninorm/composition-table.gperf961
-rw-r--r--gnulib/lib/uninorm/composition.c87
-rw-r--r--gnulib/lib/uninorm/decompose-internal.c28
-rw-r--r--gnulib/lib/uninorm/decompose-internal.h36
-rw-r--r--gnulib/lib/uninorm/decomposing-form.c29
-rw-r--r--gnulib/lib/uninorm/decomposition-table.c23
-rw-r--r--gnulib/lib/uninorm/decomposition-table.h48
-rw-r--r--gnulib/lib/uninorm/decomposition-table1.h20
-rw-r--r--gnulib/lib/uninorm/decomposition-table2.h3261
-rw-r--r--gnulib/lib/uninorm/decomposition.c102
-rw-r--r--gnulib/lib/uninorm/nfc.c31
-rw-r--r--gnulib/lib/uninorm/nfd.c31
-rw-r--r--gnulib/lib/uninorm/nfkc.c32
-rw-r--r--gnulib/lib/uninorm/nfkd.c32
-rw-r--r--gnulib/lib/uninorm/normalize-internal.h35
-rw-r--r--gnulib/lib/uninorm/u-normalize-internal.h375
-rw-r--r--gnulib/lib/uninorm/u-normcmp.h64
-rw-r--r--gnulib/lib/uninorm/u-normcoll.h65
-rw-r--r--gnulib/lib/uninorm/u-normxfrm.h87
-rw-r--r--gnulib/lib/uninorm/u16-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u16-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u16-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u16-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/u32-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u32-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u32-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u32-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/u8-normalize.c38
-rw-r--r--gnulib/lib/uninorm/u8-normcmp.c33
-rw-r--r--gnulib/lib/uninorm/u8-normcoll.c31
-rw-r--r--gnulib/lib/uninorm/u8-normxfrm.c34
-rw-r--r--gnulib/lib/uninorm/uninorm-filter.c367
-rw-r--r--gnulib/lib/unistd--.h32
-rw-r--r--gnulib/lib/unistd-safer.h31
-rw-r--r--gnulib/lib/unistd.in.h1498
-rw-r--r--gnulib/lib/unistdio.in.h256
-rw-r--r--gnulib/lib/unistdio/u-asnprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-asprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-printf-args.c23
-rw-r--r--gnulib/lib/unistdio/u-printf-args.h28
-rw-r--r--gnulib/lib/unistdio/u-printf-parse.h28
-rw-r--r--gnulib/lib/unistdio/u-snprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-sprintf.h28
-rw-r--r--gnulib/lib/unistdio/u-vasprintf.h35
-rw-r--r--gnulib/lib/unistdio/u-vsnprintf.h52
-rw-r--r--gnulib/lib/unistdio/u-vsprintf.h58
-rw-r--r--gnulib/lib/unistdio/u16-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u16-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u16-u16-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u16-u16-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u16-u16-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u16-u16-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u16-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u16-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u16-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u16-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u32-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u32-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u32-u32-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u32-u32-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u32-u32-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u32-u32-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u32-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u32-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u32-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u32-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u8-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-printf-parse.c27
-rw-r--r--gnulib/lib/unistdio/u8-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/u8-u8-vasnprintf.c50
-rw-r--r--gnulib/lib/unistdio/u8-u8-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u8-u8-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u8-u8-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/u8-vasnprintf.c51
-rw-r--r--gnulib/lib/unistdio/u8-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/u8-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/u8-vsprintf.c33
-rw-r--r--gnulib/lib/unistdio/ulc-asnprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-asprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-fprintf.c74
-rw-r--r--gnulib/lib/unistdio/ulc-printf-parse.c28
-rw-r--r--gnulib/lib/unistdio/ulc-snprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-sprintf.c29
-rw-r--r--gnulib/lib/unistdio/ulc-vasnprintf.c47
-rw-r--r--gnulib/lib/unistdio/ulc-vasprintf.c31
-rw-r--r--gnulib/lib/unistdio/ulc-vfprintf.c71
-rw-r--r--gnulib/lib/unistdio/ulc-vsnprintf.c34
-rw-r--r--gnulib/lib/unistdio/ulc-vsprintf.c33
-rw-r--r--gnulib/lib/unistr.in.h692
-rw-r--r--gnulib/lib/unistr/u-cmp2.h32
-rw-r--r--gnulib/lib/unistr/u-cpy-alloc.h40
-rw-r--r--gnulib/lib/unistr/u-cpy.h32
-rw-r--r--gnulib/lib/unistr/u-endswith.h28
-rw-r--r--gnulib/lib/unistr/u-move.h44
-rw-r--r--gnulib/lib/unistr/u-set.h39
-rw-r--r--gnulib/lib/unistr/u-startswith.h30
-rw-r--r--gnulib/lib/unistr/u-stpcpy.h24
-rw-r--r--gnulib/lib/unistr/u-stpncpy.h34
-rw-r--r--gnulib/lib/unistr/u-strcat.h26
-rw-r--r--gnulib/lib/unistr/u-strcoll.h92
-rw-r--r--gnulib/lib/unistr/u-strcpy.h26
-rw-r--r--gnulib/lib/unistr/u-strcspn.h54
-rw-r--r--gnulib/lib/unistr/u-strdup.h41
-rw-r--r--gnulib/lib/unistr/u-strlen.h26
-rw-r--r--gnulib/lib/unistr/u-strncat.h28
-rw-r--r--gnulib/lib/unistr/u-strncpy.h32
-rw-r--r--gnulib/lib/unistr/u-strnlen.h26
-rw-r--r--gnulib/lib/unistr/u-strpbrk.h46
-rw-r--r--gnulib/lib/unistr/u-strspn.h54
-rw-r--r--gnulib/lib/unistr/u-strstr.h131
-rw-r--r--gnulib/lib/unistr/u-strtok.h52
-rw-r--r--gnulib/lib/unistr/u16-check.c51
-rw-r--r--gnulib/lib/unistr/u16-chr.c57
-rw-r--r--gnulib/lib/unistr/u16-cmp.c54
-rw-r--r--gnulib/lib/unistr/u16-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u16-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u16-cpy.c25
-rw-r--r--gnulib/lib/unistr/u16-endswith.c27
-rw-r--r--gnulib/lib/unistr/u16-mblen.c50
-rw-r--r--gnulib/lib/unistr/u16-mbsnlen.c42
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-aux.c51
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c55
-rw-r--r--gnulib/lib/unistr/u16-mbtouc-unsafe.c66
-rw-r--r--gnulib/lib/unistr/u16-mbtouc.c61
-rw-r--r--gnulib/lib/unistr/u16-mbtoucr.c54
-rw-r--r--gnulib/lib/unistr/u16-move.c25
-rw-r--r--gnulib/lib/unistr/u16-next.c37
-rw-r--r--gnulib/lib/unistr/u16-prev.c53
-rw-r--r--gnulib/lib/unistr/u16-set.c26
-rw-r--r--gnulib/lib/unistr/u16-startswith.c25
-rw-r--r--gnulib/lib/unistr/u16-stpcpy.c26
-rw-r--r--gnulib/lib/unistr/u16-stpncpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strcat.c26
-rw-r--r--gnulib/lib/unistr/u16-strchr.c64
-rw-r--r--gnulib/lib/unistr/u16-strcmp.c50
-rw-r--r--gnulib/lib/unistr/u16-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u16-strcpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strcspn.c28
-rw-r--r--gnulib/lib/unistr/u16-strdup.c26
-rw-r--r--gnulib/lib/unistr/u16-strlen.c25
-rw-r--r--gnulib/lib/unistr/u16-strmblen.c44
-rw-r--r--gnulib/lib/unistr/u16-strmbtouc.c51
-rw-r--r--gnulib/lib/unistr/u16-strncat.c26
-rw-r--r--gnulib/lib/unistr/u16-strncmp.c54
-rw-r--r--gnulib/lib/unistr/u16-strncpy.c25
-rw-r--r--gnulib/lib/unistr/u16-strnlen.c25
-rw-r--r--gnulib/lib/unistr/u16-strpbrk.c27
-rw-r--r--gnulib/lib/unistr/u16-strrchr.c65
-rw-r--r--gnulib/lib/unistr/u16-strspn.c29
-rw-r--r--gnulib/lib/unistr/u16-strstr.c37
-rw-r--r--gnulib/lib/unistr/u16-strtok.c27
-rw-r--r--gnulib/lib/unistr/u16-to-u32.c125
-rw-r--r--gnulib/lib/unistr/u16-to-u8.c136
-rw-r--r--gnulib/lib/unistr/u16-uctomb-aux.c58
-rw-r--r--gnulib/lib/unistr/u16-uctomb.c72
-rw-r--r--gnulib/lib/unistr/u32-check.c39
-rw-r--r--gnulib/lib/unistr/u32-chr.c32
-rw-r--r--gnulib/lib/unistr/u32-cmp.c40
-rw-r--r--gnulib/lib/unistr/u32-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u32-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u32-cpy.c25
-rw-r--r--gnulib/lib/unistr/u32-endswith.c27
-rw-r--r--gnulib/lib/unistr/u32-mblen.c37
-rw-r--r--gnulib/lib/unistr/u32-mbsnlen.c27
-rw-r--r--gnulib/lib/unistr/u32-mbtouc-unsafe.c48
-rw-r--r--gnulib/lib/unistr/u32-mbtouc.c43
-rw-r--r--gnulib/lib/unistr/u32-mbtoucr.c39
-rw-r--r--gnulib/lib/unistr/u32-move.c25
-rw-r--r--gnulib/lib/unistr/u32-next.c39
-rw-r--r--gnulib/lib/unistr/u32-prev.c39
-rw-r--r--gnulib/lib/unistr/u32-set.c26
-rw-r--r--gnulib/lib/unistr/u32-startswith.c25
-rw-r--r--gnulib/lib/unistr/u32-stpcpy.c25
-rw-r--r--gnulib/lib/unistr/u32-stpncpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strcat.c26
-rw-r--r--gnulib/lib/unistr/u32-strchr.c36
-rw-r--r--gnulib/lib/unistr/u32-strcmp.c36
-rw-r--r--gnulib/lib/unistr/u32-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u32-strcpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strcspn.c51
-rw-r--r--gnulib/lib/unistr/u32-strdup.c26
-rw-r--r--gnulib/lib/unistr/u32-strlen.c25
-rw-r--r--gnulib/lib/unistr/u32-strmblen.c36
-rw-r--r--gnulib/lib/unistr/u32-strmbtouc.c39
-rw-r--r--gnulib/lib/unistr/u32-strncat.c26
-rw-r--r--gnulib/lib/unistr/u32-strncmp.c40
-rw-r--r--gnulib/lib/unistr/u32-strncpy.c25
-rw-r--r--gnulib/lib/unistr/u32-strnlen.c25
-rw-r--r--gnulib/lib/unistr/u32-strpbrk.c50
-rw-r--r--gnulib/lib/unistr/u32-strrchr.c38
-rw-r--r--gnulib/lib/unistr/u32-strspn.c50
-rw-r--r--gnulib/lib/unistr/u32-strstr.c34
-rw-r--r--gnulib/lib/unistr/u32-strtok.c27
-rw-r--r--gnulib/lib/unistr/u32-to-u16.c130
-rw-r--r--gnulib/lib/unistr/u32-to-u8.c130
-rw-r--r--gnulib/lib/unistr/u32-uctomb.c47
-rw-r--r--gnulib/lib/unistr/u8-check.c105
-rw-r--r--gnulib/lib/unistr/u8-chr.c201
-rw-r--r--gnulib/lib/unistr/u8-cmp.c30
-rw-r--r--gnulib/lib/unistr/u8-cmp2.c28
-rw-r--r--gnulib/lib/unistr/u8-cpy-alloc.c25
-rw-r--r--gnulib/lib/unistr/u8-cpy.c25
-rw-r--r--gnulib/lib/unistr/u8-endswith.c27
-rw-r--r--gnulib/lib/unistr/u8-mblen.c99
-rw-r--r--gnulib/lib/unistr/u8-mbsnlen.c44
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-aux.c240
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c260
-rw-r--r--gnulib/lib/unistr/u8-mbtouc-unsafe.c271
-rw-r--r--gnulib/lib/unistr/u8-mbtouc.c250
-rw-r--r--gnulib/lib/unistr/u8-mbtoucr.c285
-rw-r--r--gnulib/lib/unistr/u8-move.c25
-rw-r--r--gnulib/lib/unistr/u8-next.c37
-rw-r--r--gnulib/lib/unistr/u8-prev.c93
-rw-r--r--gnulib/lib/unistr/u8-set.c44
-rw-r--r--gnulib/lib/unistr/u8-startswith.c25
-rw-r--r--gnulib/lib/unistr/u8-stpcpy.c44
-rw-r--r--gnulib/lib/unistr/u8-stpncpy.c44
-rw-r--r--gnulib/lib/unistr/u8-strcat.c29
-rw-r--r--gnulib/lib/unistr/u8-strchr.c240
-rw-r--r--gnulib/lib/unistr/u8-strcmp.c30
-rw-r--r--gnulib/lib/unistr/u8-strcoll.c33
-rw-r--r--gnulib/lib/unistr/u8-strcpy.c29
-rw-r--r--gnulib/lib/unistr/u8-strcspn.c28
-rw-r--r--gnulib/lib/unistr/u8-strdup.c40
-rw-r--r--gnulib/lib/unistr/u8-strlen.c29
-rw-r--r--gnulib/lib/unistr/u8-strmblen.c97
-rw-r--r--gnulib/lib/unistr/u8-strmbtouc.c130
-rw-r--r--gnulib/lib/unistr/u8-strncat.c29
-rw-r--r--gnulib/lib/unistr/u8-strncmp.c30
-rw-r--r--gnulib/lib/unistr/u8-strncpy.c29
-rw-r--r--gnulib/lib/unistr/u8-strnlen.c44
-rw-r--r--gnulib/lib/unistr/u8-strpbrk.c27
-rw-r--r--gnulib/lib/unistr/u8-strrchr.c102
-rw-r--r--gnulib/lib/unistr/u8-strspn.c29
-rw-r--r--gnulib/lib/unistr/u8-strstr.c32
-rw-r--r--gnulib/lib/unistr/u8-strtok.c27
-rw-r--r--gnulib/lib/unistr/u8-to-u16.c136
-rw-r--r--gnulib/lib/unistr/u8-to-u32.c125
-rw-r--r--gnulib/lib/unistr/u8-uctomb-aux.c69
-rw-r--r--gnulib/lib/unistr/u8-uctomb.c88
-rw-r--r--gnulib/lib/unitypes.in.h26
-rw-r--r--gnulib/lib/uniwbrk.in.h83
-rw-r--r--gnulib/lib/uniwbrk/u-wordbreaks.h127
-rw-r--r--gnulib/lib/uniwbrk/u16-wordbreaks.c31
-rw-r--r--gnulib/lib/uniwbrk/u32-wordbreaks.c31
-rw-r--r--gnulib/lib/uniwbrk/u8-wordbreaks.c124
-rw-r--r--gnulib/lib/uniwbrk/ulc-wordbreaks.c201
-rw-r--r--gnulib/lib/uniwbrk/wbrkprop.h4139
-rw-r--r--gnulib/lib/uniwbrk/wbrktable.c52
-rw-r--r--gnulib/lib/uniwbrk/wbrktable.h18
-rw-r--r--gnulib/lib/uniwbrk/wordbreak-property.c44
-rw-r--r--gnulib/lib/uniwidth.in.h69
-rw-r--r--gnulib/lib/uniwidth/cjk.h37
-rw-r--r--gnulib/lib/uniwidth/u16-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u16-width.c47
-rw-r--r--gnulib/lib/uniwidth/u32-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u32-width.c43
-rw-r--r--gnulib/lib/uniwidth/u8-strwidth.c29
-rw-r--r--gnulib/lib/uniwidth/u8-width.c47
-rw-r--r--gnulib/lib/uniwidth/width.c368
-rw-r--r--gnulib/lib/unlink.c97
-rw-r--r--gnulib/lib/unlinkat.c109
-rw-r--r--gnulib/lib/unlinkdir.c54
-rw-r--r--gnulib/lib/unlinkdir.h26
-rw-r--r--gnulib/lib/unlocked-io.h136
-rw-r--r--gnulib/lib/unlockpt.c44
-rw-r--r--gnulib/lib/unsetenv.c127
-rw-r--r--gnulib/lib/userspec.c309
-rw-r--r--gnulib/lib/userspec.h10
-rw-r--r--gnulib/lib/usleep.c58
-rw-r--r--gnulib/lib/utimecmp.c380
-rw-r--r--gnulib/lib/utimecmp.h37
-rw-r--r--gnulib/lib/utimens.c533
-rw-r--r--gnulib/lib/utimens.h19
-rw-r--r--gnulib/lib/utimensat.c154
-rw-r--r--gnulib/lib/vasnprintf.c5607
-rw-r--r--gnulib/lib/vasnprintf.h80
-rw-r--r--gnulib/lib/vasprintf.c51
-rw-r--r--gnulib/lib/vdprintf.c67
-rw-r--r--gnulib/lib/verify.h243
-rw-r--r--gnulib/lib/verror.c77
-rw-r--r--gnulib/lib/verror.h54
-rw-r--r--gnulib/lib/version-etc-fsf.c30
-rw-r--r--gnulib/lib/version-etc.c258
-rw-r--r--gnulib/lib/version-etc.h78
-rw-r--r--gnulib/lib/vfprintf.c74
-rw-r--r--gnulib/lib/vma-iter.c625
-rw-r--r--gnulib/lib/vma-iter.h63
-rw-r--r--gnulib/lib/vprintf.c33
-rw-r--r--gnulib/lib/vsnprintf.c71
-rw-r--r--gnulib/lib/vsprintf.c77
-rw-r--r--gnulib/lib/w32sock.h136
-rw-r--r--gnulib/lib/w32spawn.h215
-rw-r--r--gnulib/lib/wait-process.c361
-rw-r--r--gnulib/lib/wait-process.h74
-rw-r--r--gnulib/lib/waitpid.c31
-rw-r--r--gnulib/lib/wchar.in.h1006
-rw-r--r--gnulib/lib/wcpcpy-impl.h24
-rw-r--r--gnulib/lib/wcpcpy.c23
-rw-r--r--gnulib/lib/wcpncpy-impl.h30
-rw-r--r--gnulib/lib/wcpncpy.c23
-rw-r--r--gnulib/lib/wcrtomb.c53
-rw-r--r--gnulib/lib/wcscasecmp-impl.h32
-rw-r--r--gnulib/lib/wcscasecmp.c25
-rw-r--r--gnulib/lib/wcscat-impl.h26
-rw-r--r--gnulib/lib/wcscat.c23
-rw-r--r--gnulib/lib/wcschr-impl.h32
-rw-r--r--gnulib/lib/wcschr.c23
-rw-r--r--gnulib/lib/wcscmp-impl.h32
-rw-r--r--gnulib/lib/wcscmp.c23
-rw-r--r--gnulib/lib/wcscoll-impl.h111
-rw-r--r--gnulib/lib/wcscoll.c27
-rw-r--r--gnulib/lib/wcscpy-impl.h26
-rw-r--r--gnulib/lib/wcscpy.c23
-rw-r--r--gnulib/lib/wcscspn-impl.h47
-rw-r--r--gnulib/lib/wcscspn.c23
-rw-r--r--gnulib/lib/wcsdup-impl.h29
-rw-r--r--gnulib/lib/wcsdup.c25
-rw-r--r--gnulib/lib/wcslen-impl.h26
-rw-r--r--gnulib/lib/wcslen.c23
-rw-r--r--gnulib/lib/wcsncasecmp-impl.h36
-rw-r--r--gnulib/lib/wcsncasecmp.c25
-rw-r--r--gnulib/lib/wcsncat-impl.h28
-rw-r--r--gnulib/lib/wcsncat.c23
-rw-r--r--gnulib/lib/wcsncmp-impl.h36
-rw-r--r--gnulib/lib/wcsncmp.c23
-rw-r--r--gnulib/lib/wcsncpy-impl.h32
-rw-r--r--gnulib/lib/wcsncpy.c23
-rw-r--r--gnulib/lib/wcsnlen-impl.h26
-rw-r--r--gnulib/lib/wcsnlen.c23
-rw-r--r--gnulib/lib/wcsnrtombs-impl.h90
-rw-r--r--gnulib/lib/wcsnrtombs.c30
-rw-r--r--gnulib/lib/wcspbrk-impl.h47
-rw-r--r--gnulib/lib/wcspbrk.c23
-rw-r--r--gnulib/lib/wcsrchr-impl.h33
-rw-r--r--gnulib/lib/wcsrchr.c23
-rw-r--r--gnulib/lib/wcsrtombs-impl.h90
-rw-r--r--gnulib/lib/wcsrtombs-state.c37
-rw-r--r--gnulib/lib/wcsrtombs.c56
-rw-r--r--gnulib/lib/wcsspn-impl.h47
-rw-r--r--gnulib/lib/wcsspn.c23
-rw-r--r--gnulib/lib/wcsstr-impl.h51
-rw-r--r--gnulib/lib/wcsstr.c23
-rw-r--r--gnulib/lib/wcstok-impl.h50
-rw-r--r--gnulib/lib/wcstok.c23
-rw-r--r--gnulib/lib/wcswidth-impl.h43
-rw-r--r--gnulib/lib/wcswidth.c25
-rw-r--r--gnulib/lib/wcsxfrm-impl.h96
-rw-r--r--gnulib/lib/wcsxfrm.c27
-rw-r--r--gnulib/lib/wctob.c38
-rw-r--r--gnulib/lib/wctomb-impl.h34
-rw-r--r--gnulib/lib/wctomb.c25
-rw-r--r--gnulib/lib/wctrans-impl.h37
-rw-r--r--gnulib/lib/wctrans.c25
-rw-r--r--gnulib/lib/wctype-impl.h96
-rw-r--r--gnulib/lib/wctype.c25
-rw-r--r--gnulib/lib/wctype.in.h499
-rw-r--r--gnulib/lib/wcwidth.c50
-rw-r--r--gnulib/lib/wmemchr-impl.h27
-rw-r--r--gnulib/lib/wmemchr.c23
-rw-r--r--gnulib/lib/wmemcmp-impl.h35
-rw-r--r--gnulib/lib/wmemcmp.c23
-rw-r--r--gnulib/lib/wmemcpy-impl.h26
-rw-r--r--gnulib/lib/wmemcpy.c23
-rw-r--r--gnulib/lib/wmemmove-impl.h36
-rw-r--r--gnulib/lib/wmemmove.c23
-rw-r--r--gnulib/lib/wmemset-impl.h26
-rw-r--r--gnulib/lib/wmemset.c23
-rw-r--r--gnulib/lib/write-any-file.c50
-rw-r--r--gnulib/lib/write-any-file.h2
-rw-r--r--gnulib/lib/write.c145
-rw-r--r--gnulib/lib/xalloc-die.c41
-rw-r--r--gnulib/lib/xalloc-oversized.h38
-rw-r--r--gnulib/lib/xalloc.h271
-rw-r--r--gnulib/lib/xasprintf.c34
-rw-r--r--gnulib/lib/xconcat-filename.c41
-rw-r--r--gnulib/lib/xfreopen.c42
-rw-r--r--gnulib/lib/xfreopen.h2
-rw-r--r--gnulib/lib/xgetcwd.c41
-rw-r--r--gnulib/lib/xgetcwd.h17
-rw-r--r--gnulib/lib/xgetdomainname.c77
-rw-r--r--gnulib/lib/xgetdomainname.h30
-rw-r--r--gnulib/lib/xgetgroups.c37
-rw-r--r--gnulib/lib/xgethostname.c74
-rw-r--r--gnulib/lib/xgethostname.h1
-rw-r--r--gnulib/lib/xmalloc.c124
-rw-r--r--gnulib/lib/xmalloca.c38
-rw-r--r--gnulib/lib/xmalloca.h64
-rw-r--r--gnulib/lib/xmemcoll.c76
-rw-r--r--gnulib/lib/xmemcoll.h3
-rw-r--r--gnulib/lib/xmemdup0.c44
-rw-r--r--gnulib/lib/xmemdup0.h41
-rw-r--r--gnulib/lib/xnanosleep.c58
-rw-r--r--gnulib/lib/xnanosleep.h1
-rw-r--r--gnulib/lib/xprintf.c79
-rw-r--r--gnulib/lib/xprintf.h45
-rw-r--r--gnulib/lib/xreadlink.c44
-rw-r--r--gnulib/lib/xreadlink.h25
-rw-r--r--gnulib/lib/xreadlinkat.c46
-rw-r--r--gnulib/lib/xsetenv.c38
-rw-r--r--gnulib/lib/xsetenv.h31
-rw-r--r--gnulib/lib/xsize.h108
-rw-r--r--gnulib/lib/xstriconv.c62
-rw-r--r--gnulib/lib/xstriconv.h78
-rw-r--r--gnulib/lib/xstriconveh.c86
-rw-r--r--gnulib/lib/xstriconveh.h115
-rw-r--r--gnulib/lib/xstrndup.c36
-rw-r--r--gnulib/lib/xstrndup.h23
-rw-r--r--gnulib/lib/xstrtod.c71
-rw-r--r--gnulib/lib/xstrtod.h31
-rw-r--r--gnulib/lib/xstrtoimax.c6
-rw-r--r--gnulib/lib/xstrtol-error.c98
-rw-r--r--gnulib/lib/xstrtol.c241
-rw-r--r--gnulib/lib/xstrtol.h73
-rw-r--r--gnulib/lib/xstrtold.c2
-rw-r--r--gnulib/lib/xstrtoll.c6
-rw-r--r--gnulib/lib/xstrtoul.c6
-rw-r--r--gnulib/lib/xstrtoull.c6
-rw-r--r--gnulib/lib/xstrtoumax.c6
-rw-r--r--gnulib/lib/xtime.h86
-rw-r--r--gnulib/lib/xvasprintf.c110
-rw-r--r--gnulib/lib/xvasprintf.h55
-rw-r--r--gnulib/lib/yesno.c60
-rw-r--r--gnulib/lib/yesno.h24
1900 files changed, 366312 insertions, 0 deletions
diff --git a/gnulib b/gnulib
deleted file mode 160000
-Subproject 443bc5ffcf7429e557f4a371b0661abe98ddbc1
diff --git a/gnulib/lib/.cppi-disable b/gnulib/lib/.cppi-disable
new file mode 100644
index 0000000..29c43f9
--- /dev/null
+++ b/gnulib/lib/.cppi-disable
@@ -0,0 +1,41 @@
+alloca.in.h
+error.h
+exit.h
+fnmatch.in.h
+fts.c
+fts_.h
+getaddrinfo.h
+getdelim.h
+getline.h
+getndelim2.h
+getopt.c
+getopt.h
+getopt1.c
+getopt.in.h
+getopt_int.h
+getpagesize.h
+getpass.c
+gettext.h
+localcharset.h
+malloca.h
+mbchar.h
+mbuiter.h
+md5.h
+obstack.h
+printf-args.h
+printf-parse.h
+regcomp.c
+regex.c
+regex.h
+regex_internal.c
+regex_internal.h
+stat-time.h
+stdbool.in.h
+stdint.in.h
+strnlen1.h
+strtoul.c
+sys_socket.in.h
+time_r.h
+utimecmp.h
+vasnprintf.h
+vasprintf.h
diff --git a/gnulib/lib/.cvsignore b/gnulib/lib/.cvsignore
new file mode 100644
index 0000000..f2e6007
--- /dev/null
+++ b/gnulib/lib/.cvsignore
@@ -0,0 +1,20 @@
+.deps
+Makefile
+alloca.h
+charset.alias
+fnmatch.h
+fts.h
+getdate.c
+getdate.tab.c
+getopt.h
+lstat.c
+poll.h
+ref-add.sed
+ref-del.sed
+search.h
+stat.c
+stdbool.h
+stdint.h
+sysexit.h
+t-fpending
+unlocked-io.h
diff --git a/gnulib/lib/Makefile b/gnulib/lib/Makefile
new file mode 100644
index 0000000..2e10203
--- /dev/null
+++ b/gnulib/lib/Makefile
@@ -0,0 +1,6 @@
+# Run "make check" to ensure that the code passes some simple tests,
+# usually (always?) not involving compilation.
+all:
+
+check:
+ ./t-idcache
diff --git a/gnulib/lib/README b/gnulib/lib/README
new file mode 100644
index 0000000..100b99d
--- /dev/null
+++ b/gnulib/lib/README
@@ -0,0 +1,3 @@
+The files in this directory are used in many GNU packages,
+including coreutils, diffutils, and tar.
+The autoconf tests required for these files are in ../m4.
diff --git a/gnulib/lib/_Exit.c b/gnulib/lib/_Exit.c
new file mode 100644
index 0000000..288766c
--- /dev/null
+++ b/gnulib/lib/_Exit.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <unistd.h>
+
+void
+_Exit (int status)
+{
+ _exit (status);
+}
diff --git a/gnulib/lib/accept.c b/gnulib/lib/accept.c
new file mode 100644
index 0000000..01faf54
--- /dev/null
+++ b/gnulib/lib/accept.c
@@ -0,0 +1,52 @@
+/* accept.c --- wrappers for Windows accept function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef accept
+
+int
+rpl_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ SOCKET fh = accept (sock, addr, addrlen);
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+ }
+}
diff --git a/gnulib/lib/accept4.c b/gnulib/lib/accept4.c
new file mode 100644
index 0000000..4e1ef1a
--- /dev/null
+++ b/gnulib/lib/accept4.c
@@ -0,0 +1,129 @@
+/* Accept a connection on a socket, with specific opening flags.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/socket.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include "binary-io.h"
+#include "msvc-nothrow.h"
+
+#ifndef SOCK_CLOEXEC
+# define SOCK_CLOEXEC 0
+#endif
+
+int
+accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
+{
+ int fd;
+
+#if HAVE_ACCEPT4
+# undef accept4
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_accept4_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_accept4_really >= 0)
+ {
+ int result = accept4 (sockfd, addr, addrlen, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_accept4_really = 1;
+ return result;
+ }
+ have_accept4_really = -1;
+ }
+ }
+#endif
+
+ /* Check the supported flags. */
+ if ((flags & ~(SOCK_CLOEXEC | O_TEXT | O_BINARY)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ fd = accept (sockfd, addr, addrlen);
+ if (fd < 0)
+ return -1;
+
+#if SOCK_CLOEXEC
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+ if (flags & SOCK_CLOEXEC)
+ {
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE old_handle = (HANDLE) _get_osfhandle (fd);
+ HANDLE new_handle;
+ int nfd;
+
+ if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
+ old_handle, /* SourceHandle */
+ curr_process, /* TargetProcessHandle */
+ (PHANDLE) &new_handle, /* TargetHandle */
+ (DWORD) 0, /* DesiredAccess */
+ FALSE, /* InheritHandle */
+ DUPLICATE_SAME_ACCESS)) /* Options */
+ {
+ close (fd);
+ errno = EBADF; /* arbitrary */
+ return -1;
+ }
+
+ /* Closing fd before allocating the new fd ensures that the new fd will
+ have the minimum possible value. */
+ close (fd);
+ nfd = _open_osfhandle ((long) new_handle,
+ O_NOINHERIT | (flags & (O_TEXT | O_BINARY)));
+ if (nfd < 0)
+ {
+ CloseHandle (new_handle);
+ return -1;
+ }
+ return nfd;
+ }
+# else
+/* Unix API. */
+ if (flags & SOCK_CLOEXEC)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd, F_GETFD, 0)) < 0
+ || fcntl (fd, F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+# endif
+#endif
+
+#if O_BINARY
+ if (flags & O_BINARY)
+ setmode (fd, O_BINARY);
+ else if (flags & O_TEXT)
+ setmode (fd, O_TEXT);
+#endif
+
+ return fd;
+}
diff --git a/gnulib/lib/acl-internal.h b/gnulib/lib/acl-internal.h
new file mode 100644
index 0000000..7a105c8
--- /dev/null
+++ b/gnulib/lib/acl-internal.h
@@ -0,0 +1,256 @@
+/* Internal implementation of access control lists.
+
+ Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include "acl.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+/* All systems define the ACL related API in <sys/acl.h>. */
+#if HAVE_SYS_ACL_H
+# include <sys/acl.h>
+#endif
+#if defined HAVE_FACL && ! defined GETACLCNT && defined ACL_CNT
+# define GETACLCNT ACL_CNT
+#endif
+
+/* On Linux, additional ACL related API is available in <acl/libacl.h>. */
+#ifdef HAVE_ACL_LIBACL_H
+# include <acl/libacl.h>
+#endif
+
+/* On HP-UX >= 11.11, additional ACL API is available in <aclv.h>. */
+#if HAVE_ACLV_H
+# include <sys/types.h>
+# include <aclv.h>
+/* HP-UX 11.11 lacks these declarations. */
+extern int acl (char *, int, int, struct acl *);
+extern int aclsort (int, int, struct acl *);
+#endif
+
+#include "error.h"
+#include "quote.h"
+
+#include <errno.h>
+#ifndef ENOSYS
+# define ENOSYS (-1)
+#endif
+#ifndef ENOTSUP
+# define ENOTSUP (-1)
+#endif
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD false
+# define fchmod(fd, mode) (-1)
+#endif
+
+/* Recognize some common errors such as from an NFS mount that does
+ not support ACLs, even when local drives do. */
+#if defined __APPLE__ && defined __MACH__ /* MacOS X */
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY || (Err) == ENOENT)
+#elif defined EOPNOTSUPP /* Tru64 NFS */
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY || (Err) == EOPNOTSUPP)
+#else
+# define ACL_NOT_WELL_SUPPORTED(Err) \
+ ((Err) == ENOTSUP || (Err) == ENOSYS || (Err) == EINVAL || (Err) == EBUSY)
+#endif
+
+#if USE_ACL
+
+# if HAVE_ACL_GET_FILE
+/* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+/* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+
+# ifndef MIN_ACL_ENTRIES
+# define MIN_ACL_ENTRIES 4
+# endif
+
+/* POSIX 1003.1e (draft 17) */
+# ifdef HAVE_ACL_GET_FD
+/* Most platforms have a 1-argument acl_get_fd, only OSF/1 has a 2-argument
+ macro(!). */
+# if HAVE_ACL_FREE_TEXT /* OSF/1 */
+static inline acl_t
+rpl_acl_get_fd (int fd)
+{
+ return acl_get_fd (fd, ACL_TYPE_ACCESS);
+}
+# undef acl_get_fd
+# define acl_get_fd rpl_acl_get_fd
+# endif
+# else
+# define HAVE_ACL_GET_FD false
+# undef acl_get_fd
+# define acl_get_fd(fd) (NULL)
+# endif
+
+/* POSIX 1003.1e (draft 17) */
+# ifdef HAVE_ACL_SET_FD
+/* Most platforms have a 2-argument acl_set_fd, only OSF/1 has a 3-argument
+ macro(!). */
+# if HAVE_ACL_FREE_TEXT /* OSF/1 */
+static inline int
+rpl_acl_set_fd (int fd, acl_t acl)
+{
+ return acl_set_fd (fd, ACL_TYPE_ACCESS, acl);
+}
+# undef acl_set_fd
+# define acl_set_fd rpl_acl_set_fd
+# endif
+# else
+# define HAVE_ACL_SET_FD false
+# undef acl_set_fd
+# define acl_set_fd(fd, acl) (-1)
+# endif
+
+/* POSIX 1003.1e (draft 13) */
+# if ! HAVE_ACL_FREE_TEXT
+# define acl_free_text(buf) acl_free (buf)
+# endif
+
+/* Linux-specific */
+# ifndef HAVE_ACL_EXTENDED_FILE
+# define HAVE_ACL_EXTENDED_FILE false
+# define acl_extended_file(name) (-1)
+# endif
+
+/* Linux-specific */
+# ifndef HAVE_ACL_FROM_MODE
+# define HAVE_ACL_FROM_MODE false
+# define acl_from_mode(mode) (NULL)
+# endif
+
+/* Set to 1 if a file's mode is implicit by the ACL.
+ Set to 0 if a file's mode is stored independently from the ACL. */
+# if (HAVE_ACL_COPY_EXT_NATIVE && HAVE_ACL_CREATE_ENTRY_NP) || defined __sgi /* MacOS X, IRIX */
+# define MODE_INSIDE_ACL 0
+# else
+# define MODE_INSIDE_ACL 1
+# endif
+
+/* Return the number of entries in ACL.
+ Return -1 and set errno upon failure to determine it. */
+/* Define a replacement for acl_entries if needed. (Only Linux has it.) */
+# if !HAVE_ACL_ENTRIES
+# define acl_entries rpl_acl_entries
+extern int acl_entries (acl_t);
+# endif
+
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial. */
+extern int acl_extended_nontrivial (acl_t);
+# else
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
+ Return -1 and set errno upon failure to determine it. */
+extern int acl_access_nontrivial (acl_t);
+# endif
+
+# elif HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+/* Set to 1 if a file's mode is implicit by the ACL.
+ Set to 0 if a file's mode is stored independently from the ACL. */
+# if defined __CYGWIN__ /* Cygwin */
+# define MODE_INSIDE_ACL 0
+# else /* Solaris */
+# define MODE_INSIDE_ACL 1
+# endif
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (int count, aclent_t *entries);
+
+# ifdef ACE_GETACL /* Solaris 10 */
+
+/* Test an ACL retrieved with ACE_GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_ace_nontrivial (int count, ace_t *entries);
+
+/* Definitions for when the built executable is executed on Solaris 10
+ (newer version) or Solaris 11. */
+/* For a_type. */
+# define OLD_ALLOW 0
+# define OLD_DENY 1
+# define NEW_ACE_ACCESS_ALLOWED_ACE_TYPE 0 /* replaces ALLOW */
+# define NEW_ACE_ACCESS_DENIED_ACE_TYPE 1 /* replaces DENY */
+/* For a_flags. */
+# define OLD_ACE_OWNER 0x0100
+# define OLD_ACE_GROUP 0x0200
+# define OLD_ACE_OTHER 0x0400
+# define NEW_ACE_OWNER 0x1000
+# define NEW_ACE_GROUP 0x2000
+# define NEW_ACE_IDENTIFIER_GROUP 0x0040
+# define NEW_ACE_EVERYONE 0x4000
+/* For a_access_mask. */
+# define NEW_ACE_READ_DATA 0x001 /* corresponds to 'r' */
+# define NEW_ACE_WRITE_DATA 0x002 /* corresponds to 'w' */
+# define NEW_ACE_APPEND_DATA 0x004
+# define NEW_ACE_READ_NAMED_ATTRS 0x008
+# define NEW_ACE_WRITE_NAMED_ATTRS 0x010
+# define NEW_ACE_EXECUTE 0x020
+# define NEW_ACE_DELETE_CHILD 0x040
+# define NEW_ACE_READ_ATTRIBUTES 0x080
+# define NEW_ACE_WRITE_ATTRIBUTES 0x100
+# define NEW_ACE_DELETE 0x10000
+# define NEW_ACE_READ_ACL 0x20000
+# define NEW_ACE_WRITE_ACL 0x40000
+# define NEW_ACE_WRITE_OWNER 0x80000
+# define NEW_ACE_SYNCHRONIZE 0x100000
+
+# endif
+
+# elif HAVE_GETACL /* HP-UX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb);
+
+# if HAVE_ACLV_H /* HP-UX >= 11.11 */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int aclv_nontrivial (int count, struct acl *entries);
+
+# endif
+
+# elif HAVE_ACLX_GET && 0 /* AIX */
+
+/* TODO */
+
+# elif HAVE_STATACL /* older AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (struct acl *a);
+
+# elif HAVE_ACLSORT /* NonStop Kernel */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+extern int acl_nontrivial (int count, struct acl *entries);
+
+# endif
+
+#endif
diff --git a/gnulib/lib/acl.h b/gnulib/lib/acl.h
new file mode 100644
index 0000000..d3e3e37
--- /dev/null
+++ b/gnulib/lib/acl.h
@@ -0,0 +1,27 @@
+/* acl.c - access control lists
+
+ Copyright (C) 2002, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int file_has_acl (char const *, struct stat const *);
+int copy_acl (char const *, int, char const *, int, mode_t);
+int set_acl (char const *, int, mode_t);
+int qset_acl (char const *, int, mode_t);
+int chmod_or_fchmod (char const *, int, mode_t);
diff --git a/gnulib/lib/acl_entries.c b/gnulib/lib/acl_entries.c
new file mode 100644
index 0000000..2bf8adc
--- /dev/null
+++ b/gnulib/lib/acl_entries.c
@@ -0,0 +1,75 @@
+/* Return the number of entries in an ACL.
+
+ Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert and Andreas Gruenbacher. */
+
+#include <config.h>
+
+#include "acl-internal.h"
+
+/* This file assumes POSIX-draft like ACLs
+ (Linux, FreeBSD, MacOS X, IRIX, Tru64). */
+
+/* Return the number of entries in ACL.
+ Return -1 and set errno upon failure to determine it. */
+
+int
+acl_entries (acl_t acl)
+{
+ int count = 0;
+
+ if (acl != NULL)
+ {
+#if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, MacOS X */
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ /* acl_get_entry returns 0 when it successfully fetches an entry,
+ and -1/EINVAL at the end. */
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one >= 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ count++;
+# else /* Linux, FreeBSD */
+ /* acl_get_entry returns 1 when it successfully fetches an entry,
+ and 0 at the end. */
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one > 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ count++;
+ if (got_one < 0)
+ return -1;
+# endif
+#else /* IRIX, Tru64 */
+# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
+ /* Don't use acl_get_entry: it is undocumented. */
+ count = acl->acl_cnt;
+# endif
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* Don't use acl_get_entry: it takes only one argument and does not
+ work. */
+ count = acl->acl_num;
+# endif
+#endif
+ }
+
+ return count;
+}
diff --git a/gnulib/lib/acosf.c b/gnulib/lib/acosf.c
new file mode 100644
index 0000000..25c9262
--- /dev/null
+++ b/gnulib/lib/acosf.c
@@ -0,0 +1,26 @@
+/* Inverse cosine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+acosf (float x)
+{
+ return (float) acos ((double) x);
+}
diff --git a/gnulib/lib/acosl.c b/gnulib/lib/acosl.c
new file mode 100644
index 0000000..c864631
--- /dev/null
+++ b/gnulib/lib/acosl.c
@@ -0,0 +1,238 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+acosl (long double x)
+{
+ return acos (x);
+}
+
+#else
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* asin(x)
+ * Method :
+ * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ * we approximate asin(x) on [0,0.5] by
+ * asin(x) = x + x*x^2*R(x^2)
+ * Between .5 and .625 the approximation is
+ * asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ * For x in [0.625,1]
+ * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+
+static const long double
+ one = 1.0L,
+ huge = 1.0e+4932L,
+ pi = 3.1415926535897932384626433832795028841972L,
+ pio2_hi = 1.5707963267948966192313216916397514420986L,
+ pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
+ pio4_hi = 7.8539816339744830961566084581987569936977E-1L,
+
+ /* coefficient for R(x^2) */
+
+ /* asin(x) = x + x^3 pS(x^2) / qS(x^2)
+ 0 <= x <= 0.5
+ peak relative error 1.9e-35 */
+ pS0 = -8.358099012470680544198472400254596543711E2L,
+ pS1 = 3.674973957689619490312782828051860366493E3L,
+ pS2 = -6.730729094812979665807581609853656623219E3L,
+ pS3 = 6.643843795209060298375552684423454077633E3L,
+ pS4 = -3.817341990928606692235481812252049415993E3L,
+ pS5 = 1.284635388402653715636722822195716476156E3L,
+ pS6 = -2.410736125231549204856567737329112037867E2L,
+ pS7 = 2.219191969382402856557594215833622156220E1L,
+ pS8 = -7.249056260830627156600112195061001036533E-1L,
+ pS9 = 1.055923570937755300061509030361395604448E-3L,
+
+ qS0 = -5.014859407482408326519083440151745519205E3L,
+ qS1 = 2.430653047950480068881028451580393430537E4L,
+ qS2 = -4.997904737193653607449250593976069726962E4L,
+ qS3 = 5.675712336110456923807959930107347511086E4L,
+ qS4 = -3.881523118339661268482937768522572588022E4L,
+ qS5 = 1.634202194895541569749717032234510811216E4L,
+ qS6 = -4.151452662440709301601820849901296953752E3L,
+ qS7 = 5.956050864057192019085175976175695342168E2L,
+ qS8 = -4.175375777334867025769346564600396877176E1L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ /* asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ -0.0625 <= x <= 0.0625
+ peak relative error 3.3e-35 */
+ rS0 = -5.619049346208901520945464704848780243887E0L,
+ rS1 = 4.460504162777731472539175700169871920352E1L,
+ rS2 = -1.317669505315409261479577040530751477488E2L,
+ rS3 = 1.626532582423661989632442410808596009227E2L,
+ rS4 = -3.144806644195158614904369445440583873264E1L,
+ rS5 = -9.806674443470740708765165604769099559553E1L,
+ rS6 = 5.708468492052010816555762842394927806920E1L,
+ rS7 = 1.396540499232262112248553357962639431922E1L,
+ rS8 = -1.126243289311910363001762058295832610344E1L,
+ rS9 = -4.956179821329901954211277873774472383512E-1L,
+ rS10 = 3.313227657082367169241333738391762525780E-1L,
+
+ sS0 = -4.645814742084009935700221277307007679325E0L,
+ sS1 = 3.879074822457694323970438316317961918430E1L,
+ sS2 = -1.221986588013474694623973554726201001066E2L,
+ sS3 = 1.658821150347718105012079876756201905822E2L,
+ sS4 = -4.804379630977558197953176474426239748977E1L,
+ sS5 = -1.004296417397316948114344573811562952793E2L,
+ sS6 = 7.530281592861320234941101403870010111138E1L,
+ sS7 = 1.270735595411673647119592092304357226607E1L,
+ sS8 = -1.815144839646376500705105967064792930282E1L,
+ sS9 = -7.821597334910963922204235247786840828217E-2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ asinr5625 = 5.9740641664535021430381036628424864397707E-1L;
+
+
+long double
+acosl (long double x)
+{
+ long double t, p, q;
+
+ if (x < 0.0L)
+ {
+ t = pi - acosl (-x);
+ if (huge + x > one) /* return with inexact */
+ return t;
+ }
+
+ if (x >= 1.0L) /* |x|>= 1 */
+ {
+ if (x == 1.0L)
+ return 0.0L; /* return zero */
+
+ return (x - x) / (x - x); /* asin(|x|>1) is NaN */
+ }
+
+ else if (x < 0.5L) /* |x| < 0.5 */
+ {
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */
+ /* acos(0)=+-pi/2 with inexact */
+ return x * pio2_hi + x * pio2_lo;
+
+ t = x * x;
+ p = (((((((((pS9 * t
+ + pS8) * t
+ + pS7) * t
+ + pS6) * t
+ + pS5) * t
+ + pS4) * t
+ + pS3) * t
+ + pS2) * t
+ + pS1) * t
+ + pS0) * t;
+
+ q = (((((((( t
+ + qS8) * t
+ + qS7) * t
+ + qS6) * t
+ + qS5) * t
+ + qS4) * t
+ + qS3) * t
+ + qS2) * t
+ + qS1) * t
+ + qS0;
+
+ return pio2_hi - (x + x * (p / q) - pio2_lo);
+ }
+
+ else if (x < 0.625) /* 0.625 */
+ {
+ t = x - 0.5625;
+ p = ((((((((((rS10 * t
+ + rS9) * t
+ + rS8) * t
+ + rS7) * t
+ + rS6) * t
+ + rS5) * t
+ + rS4) * t
+ + rS3) * t
+ + rS2) * t
+ + rS1) * t
+ + rS0) * t;
+
+ q = ((((((((( t
+ + sS9) * t
+ + sS8) * t
+ + sS7) * t
+ + sS6) * t
+ + sS5) * t
+ + sS4) * t
+ + sS3) * t
+ + sS2) * t
+ + sS1) * t
+ + sS0;
+
+ return (pio2_hi - asinr5625) - (p / q - pio2_lo);
+ }
+ else
+ return 2 * asinl (sqrtl ((1 - x) / 2));
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.18Lg %.18Lg\n",
+ acosl (1.0L),
+ 1.5707963267948966192313216916397514420984L -
+ 1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (0.7071067811865475244008443621048490392848L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (0.5L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (0.3090169943749474241022934171828190588600L),
+ 1.5707963267948966192313216916397514420984L -
+ 0.3141592653589793238462643383279502884196L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (-1.0L),
+ 1.5707963267948966192313216916397514420984L -
+ -1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (-0.7071067811865475244008443621048490392848L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (-0.5L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ acosl (-0.3090169943749474241022934171828190588600L),
+ 1.5707963267948966192313216916397514420984L -
+ -0.3141592653589793238462643383279502884196L);
+}
+#endif
diff --git a/gnulib/lib/alignof.h b/gnulib/lib/alignof.h
new file mode 100644
index 0000000..bff3930
--- /dev/null
+++ b/gnulib/lib/alignof.h
@@ -0,0 +1,51 @@
+/* Determine alignment of types.
+ Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _ALIGNOF_H
+#define _ALIGNOF_H
+
+#include <stddef.h>
+
+/* alignof_slot (TYPE)
+ Determine the alignment of a structure slot (field) of a given type,
+ at compile time. Note that the result depends on the ABI.
+ This is the same as alignof (TYPE) and _Alignof (TYPE), defined in
+ <stdalign.h> if __alignof_is_defined is 1.
+ Note: The result cannot be used as a value for an 'enum' constant,
+ due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#if defined __cplusplus
+ template <class type> struct alignof_helper { char __slot1; type __slot2; };
+# define alignof_slot(type) offsetof (alignof_helper<type>, __slot2)
+#else
+# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+/* alignof_type (TYPE)
+ Determine the good alignment of an object of the given type at compile time.
+ Note that this is not necessarily the same as alignof_slot(type).
+ For example, with GNU C on x86 platforms: alignof_type(double) = 8, but
+ - when -malign-double is not specified: alignof_slot(double) = 4,
+ - when -malign-double is specified: alignof_slot(double) = 8.
+ Note: The result cannot be used as a value for an 'enum' constant,
+ due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#if defined __GNUC__
+# define alignof_type __alignof__
+#else
+# define alignof_type alignof_slot
+#endif
+
+#endif /* _ALIGNOF_H */
diff --git a/gnulib/lib/alloca.c b/gnulib/lib/alloca.c
new file mode 100644
index 0000000..c7e91ab
--- /dev/null
+++ b/gnulib/lib/alloca.c
@@ -0,0 +1,478 @@
+/* alloca.c -- allocate automatically reclaimed memory
+ (Mostly) portable public-domain implementation -- D A Gwyn
+
+ This implementation of the PWB library alloca function,
+ which is used to allocate space off the run-time stack so
+ that it is automatically reclaimed upon procedure exit,
+ was inspired by discussions with J. Q. Johnson of Cornell.
+ J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+ There are some preprocessor constants that can
+ be defined when compiling for your specific system, for
+ improved efficiency; however, the defaults should be okay.
+
+ The general concept of this implementation is to keep
+ track of all alloca-allocated blocks, and reclaim any
+ that are found to be deeper in the stack than the current
+ invocation. This heuristic does not reclaim storage as
+ soon as it becomes invalid, but it will do so eventually.
+
+ As a special case, alloca(0) reclaims storage without
+ allocating any. It is a good idea to use alloca(0) in
+ your main control loop, etc. to force garbage collection. */
+
+#include <config.h>
+
+#include <alloca.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef emacs
+# include "lisp.h"
+# include "blockinput.h"
+# ifdef EMACS_FREE
+# undef free
+# define free EMACS_FREE
+# endif
+#else
+# define memory_full() abort ()
+#endif
+
+/* If compiling with GCC 2, this file's not needed. */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+ there must be some other way alloca is supposed to work. */
+# ifndef alloca
+
+# ifdef emacs
+# ifdef static
+/* actually, only want this if static is defined as ""
+ -- this is for usg, in which emacs must undefine static
+ in order to make unexec workable
+ */
+# ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+ old and obscure compilers. */
+# endif /* STACK_DIRECTION undefined */
+# endif /* static */
+# endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+ provide an "address metric" ADDRESS_FUNCTION macro. */
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+# else
+# define ADDRESS_FUNCTION(arg) &(arg)
+# endif
+
+/* Define STACK_DIRECTION if you know the direction of stack
+ growth for your system; otherwise it will be automatically
+ deduced at run-time.
+
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+
+# ifndef STACK_DIRECTION
+# define STACK_DIRECTION 0 /* Direction unknown. */
+# endif
+
+# if STACK_DIRECTION != 0
+
+# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
+
+# else /* STACK_DIRECTION == 0; need run-time code. */
+
+static int stack_dir; /* 1 or -1 once known. */
+# define STACK_DIR stack_dir
+
+static int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+# endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+ (a) chain together all alloca'ed blocks;
+ (b) keep track of stack depth.
+
+ It is very important that sizeof(header) agree with malloc
+ alignment chunk size. The following default should work okay. */
+
+# ifndef ALIGN_SIZE
+# define ALIGN_SIZE sizeof(double)
+# endif
+
+typedef union hdr
+{
+ char align[ALIGN_SIZE]; /* To force sizeof(header). */
+ struct
+ {
+ union hdr *next; /* For chaining headers. */
+ char *deep; /* For stack depth measure. */
+ } h;
+} header;
+
+static header *last_alloca_header = NULL; /* -> last alloca header. */
+
+/* Return a pointer to at least SIZE bytes of storage,
+ which will be automatically reclaimed upon exit from
+ the procedure that called alloca. Originally, this space
+ was supposed to be taken from the current stack frame of the
+ caller, but that method cannot be made to work for some
+ implementations of C, for example under Gould's UTX/32. */
+
+void *
+alloca (size_t size)
+{
+ auto char probe; /* Probes stack depth: */
+ register char *depth = ADDRESS_FUNCTION (probe);
+
+# if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* Unknown growth direction. */
+ STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
+# endif
+
+ /* Reclaim garbage, defined as all alloca'd storage that
+ was allocated from deeper in the stack than currently. */
+
+ {
+ register header *hp; /* Traverses linked list. */
+
+# ifdef emacs
+ BLOCK_INPUT;
+# endif
+
+ for (hp = last_alloca_header; hp != NULL;)
+ if ((STACK_DIR > 0 && hp->h.deep > depth)
+ || (STACK_DIR < 0 && hp->h.deep < depth))
+ {
+ register header *np = hp->h.next;
+
+ free (hp); /* Collect garbage. */
+
+ hp = np; /* -> next header. */
+ }
+ else
+ break; /* Rest are not deeper. */
+
+ last_alloca_header = hp; /* -> last valid storage. */
+
+# ifdef emacs
+ UNBLOCK_INPUT;
+# endif
+ }
+
+ if (size == 0)
+ return NULL; /* No allocation required. */
+
+ /* Allocate combined header + user data storage. */
+
+ {
+ /* Address of header. */
+ register header *new;
+
+ size_t combined_size = sizeof (header) + size;
+ if (combined_size < sizeof (header))
+ memory_full ();
+
+ new = malloc (combined_size);
+
+ if (! new)
+ memory_full ();
+
+ new->h.next = last_alloca_header;
+ new->h.deep = depth;
+
+ last_alloca_header = new;
+
+ /* User storage begins just after header. */
+
+ return (void *) (new + 1);
+ }
+}
+
+# if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+# ifdef DEBUG_I00AFUNC
+# include <stdio.h>
+# endif
+
+# ifndef CRAY_STACK
+# define CRAY_STACK
+# ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+ {
+ long shgrow:32; /* Number of times stack has grown. */
+ long shaseg:32; /* Size of increments to stack. */
+ long shhwm:32; /* High water mark of stack. */
+ long shsize:32; /* Current size of stack (all segments). */
+ };
+
+/* The stack segment linkage control information occurs at
+ the high-address end of a stack segment. (The stack
+ grows from low addresses to high addresses.) The initial
+ part of the stack segment linkage control information is
+ 0200 (octal) words. This provides for register storage
+ for the routine which overflows the stack. */
+
+struct stack_segment_linkage
+ {
+ long ss[0200]; /* 0200 overflow words. */
+ long sssize:32; /* Number of words in this segment. */
+ long ssbase:32; /* Offset to stack base. */
+ long:32;
+ long sspseg:32; /* Offset to linkage control of previous
+ segment of stack. */
+ long:32;
+ long sstcpt:32; /* Pointer to task common address block. */
+ long sscsnm; /* Private control structure number for
+ microtasking. */
+ long ssusr1; /* Reserved for user. */
+ long ssusr2; /* Reserved for user. */
+ long sstpid; /* Process ID for pid based multi-tasking. */
+ long ssgvup; /* Pointer to multitasking thread giveup. */
+ long sscray[7]; /* Reserved for Cray Research. */
+ long ssa0;
+ long ssa1;
+ long ssa2;
+ long ssa3;
+ long ssa4;
+ long ssa5;
+ long ssa6;
+ long ssa7;
+ long sss0;
+ long sss1;
+ long sss2;
+ long sss3;
+ long sss4;
+ long sss5;
+ long sss6;
+ long sss7;
+ };
+
+# else /* CRAY2 */
+/* The following structure defines the vector of words
+ returned by the STKSTAT library routine. */
+struct stk_stat
+ {
+ long now; /* Current total stack size. */
+ long maxc; /* Amount of contiguous space which would
+ be required to satisfy the maximum
+ stack demand to date. */
+ long high_water; /* Stack high-water mark. */
+ long overflows; /* Number of stack overflow ($STKOFEN) calls. */
+ long hits; /* Number of internal buffer hits. */
+ long extends; /* Number of block extensions. */
+ long stko_mallocs; /* Block allocations by $STKOFEN. */
+ long underflows; /* Number of stack underflow calls ($STKRETN). */
+ long stko_free; /* Number of deallocations by $STKRETN. */
+ long stkm_free; /* Number of deallocations by $STKMRET. */
+ long segments; /* Current number of stack segments. */
+ long maxs; /* Maximum number of stack segments so far. */
+ long pad_size; /* Stack pad size. */
+ long current_address; /* Current stack segment address. */
+ long current_size; /* Current stack segment size. This
+ number is actually corrupted by STKSTAT to
+ include the fifteen word trailer area. */
+ long initial_address; /* Address of initial segment. */
+ long initial_size; /* Size of initial segment. */
+ };
+
+/* The following structure describes the data structure which trails
+ any stack segment. I think that the description in 'asdef' is
+ out of date. I only describe the parts that I am sure about. */
+
+struct stk_trailer
+ {
+ long this_address; /* Address of this block. */
+ long this_size; /* Size of this block (does not include
+ this trailer). */
+ long unknown2;
+ long unknown3;
+ long link; /* Address of trailer block of previous
+ segment. */
+ long unknown5;
+ long unknown6;
+ long unknown7;
+ long unknown8;
+ long unknown9;
+ long unknown10;
+ long unknown11;
+ long unknown12;
+ long unknown13;
+ long unknown14;
+ };
+
+# endif /* CRAY2 */
+# endif /* not CRAY_STACK */
+
+# ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+ I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+ struct stk_stat status;
+ struct stk_trailer *trailer;
+ long *block, size;
+ long result = 0;
+
+ /* We want to iterate through all of the segments. The first
+ step is to get the stack status structure. We could do this
+ more quickly and more directly, perhaps, by referencing the
+ $LM00 common block, but I know that this works. */
+
+ STKSTAT (&status);
+
+ /* Set up the iteration. */
+
+ trailer = (struct stk_trailer *) (status.current_address
+ + status.current_size
+ - 15);
+
+ /* There must be at least one stack segment. Therefore it is
+ a fatal error if "trailer" is null. */
+
+ if (trailer == 0)
+ abort ();
+
+ /* Discard segments that do not contain our argument address. */
+
+ while (trailer != 0)
+ {
+ block = (long *) trailer->this_address;
+ size = trailer->this_size;
+ if (block == 0 || size == 0)
+ abort ();
+ trailer = (struct stk_trailer *) trailer->link;
+ if ((block <= address) && (address < (block + size)))
+ break;
+ }
+
+ /* Set the result to the offset in this segment and add the sizes
+ of all predecessor segments. */
+
+ result = address - block;
+
+ if (trailer == 0)
+ {
+ return result;
+ }
+
+ do
+ {
+ if (trailer->this_size <= 0)
+ abort ();
+ result += trailer->this_size;
+ trailer = (struct stk_trailer *) trailer->link;
+ }
+ while (trailer != 0);
+
+ /* We are done. Note that if you present a bogus address (one
+ not in any segment), you will get a different number back, formed
+ from subtracting the address of the first block. This is probably
+ not what you want. */
+
+ return (result);
+}
+
+# else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+ Determine the number of the cell within the stack,
+ given the address of the cell. The purpose of this
+ routine is to linearize, in some sense, stack addresses
+ for alloca. */
+
+static long
+i00afunc (long address)
+{
+ long stkl = 0;
+
+ long size, pseg, this_segment, stack;
+ long result = 0;
+
+ struct stack_segment_linkage *ssptr;
+
+ /* Register B67 contains the address of the end of the
+ current stack segment. If you (as a subprogram) store
+ your registers on the stack and find that you are past
+ the contents of B67, you have overflowed the segment.
+
+ B67 also points to the stack segment linkage control
+ area, which is what we are really interested in. */
+
+ stkl = CRAY_STACKSEG_END ();
+ ssptr = (struct stack_segment_linkage *) stkl;
+
+ /* If one subtracts 'size' from the end of the segment,
+ one has the address of the first word of the segment.
+
+ If this is not the first segment, 'pseg' will be
+ nonzero. */
+
+ pseg = ssptr->sspseg;
+ size = ssptr->sssize;
+
+ this_segment = stkl - size;
+
+ /* It is possible that calling this routine itself caused
+ a stack overflow. Discard stack segments which do not
+ contain the target address. */
+
+ while (!(this_segment <= address && address <= stkl))
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+# endif
+ if (pseg == 0)
+ break;
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ this_segment = stkl - size;
+ }
+
+ result = address - this_segment;
+
+ /* If you subtract pseg from the current end of the stack,
+ you get the address of the previous stack segment's end.
+ This seems a little convoluted to me, but I'll bet you save
+ a cycle somewhere. */
+
+ while (pseg != 0)
+ {
+# ifdef DEBUG_I00AFUNC
+ fprintf (stderr, "%011o %011o\n", pseg, size);
+# endif
+ stkl = stkl - pseg;
+ ssptr = (struct stack_segment_linkage *) stkl;
+ size = ssptr->sssize;
+ pseg = ssptr->sspseg;
+ result += size;
+ }
+ return (result);
+}
+
+# endif /* not CRAY2 */
+# endif /* CRAY */
+
+# endif /* no alloca */
+#endif /* not GCC version 2 */
diff --git a/gnulib/lib/alloca.in.h b/gnulib/lib/alloca.in.h
new file mode 100644
index 0000000..74b4990
--- /dev/null
+++ b/gnulib/lib/alloca.in.h
@@ -0,0 +1,56 @@
+/* Memory allocation on the stack.
+
+ Copyright (C) 1995, 1999, 2001-2004, 2006-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+ means there is a real alloca function. */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+ allocated on the stack, which will last until the function returns.
+ Use of alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns,
+ - for huge N (say, N >= 65536) - you never know how large (or small)
+ the stack is, and when the stack cannot fulfill the memory allocation
+ request, the program just crashes.
+ */
+
+#ifndef alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# elif defined __DECC && defined __VMS
+# define alloca __ALLOCA
+# else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/gnulib/lib/allocator.c b/gnulib/lib/allocator.c
new file mode 100644
index 0000000..2c1a3da
--- /dev/null
+++ b/gnulib/lib/allocator.c
@@ -0,0 +1,5 @@
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+#include "allocator.h"
+#include <stdlib.h>
+struct allocator const stdlib_allocator = { malloc, realloc, free, NULL };
diff --git a/gnulib/lib/allocator.h b/gnulib/lib/allocator.h
new file mode 100644
index 0000000..b8de95c
--- /dev/null
+++ b/gnulib/lib/allocator.h
@@ -0,0 +1,58 @@
+/* Memory allocators such as malloc+free.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_ALLOCATOR_H
+#define _GL_ALLOCATOR_H
+
+#include <stddef.h>
+
+/* An object describing a memory allocator family. */
+
+struct allocator
+{
+ /* Do not use GCC attributes such as __attribute__ ((malloc)) with
+ the function types pointed at by these members, because these
+ attributes do not work with pointers to functions. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2011-04/msg00007.html>. */
+
+ /* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE
+ should return NULL, though not necessarily set errno. When given
+ a zero size it may return NULL even if successful. */
+ void *(*allocate) (size_t);
+
+ /* If nonnull, call REALLOCATE to reallocate memory, like 'realloc'.
+ On failure REALLOCATE should return NULL, though not necessarily set
+ errno. When given a zero size it may return NULL even if
+ successful. */
+ void *(*reallocate) (void *, size_t);
+
+ /* Call FREE to free memory, like 'free'. */
+ void (*free) (void *);
+
+ /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (...,
+ SIZE) fails. DIE should not return. SIZE should equal SIZE_MAX
+ if size_t overflow was detected while calculating sizes to be
+ passed to MALLOC or REALLOC. */
+ void (*die) (size_t);
+};
+
+/* An allocator using the stdlib functions and a null DIE function. */
+extern struct allocator const stdlib_allocator;
+
+#endif /* _GL_ALLOCATOR_H */
diff --git a/gnulib/lib/alphasort.c b/gnulib/lib/alphasort.c
new file mode 100644
index 0000000..7cbdcfb
--- /dev/null
+++ b/gnulib/lib/alphasort.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1992, 1997-1998, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <string.h>
+
+int
+alphasort (const struct dirent **a, const struct dirent **b)
+{
+ return strcoll ((*a)->d_name, (*b)->d_name);
+}
diff --git a/gnulib/lib/amemxfrm.c b/gnulib/lib/amemxfrm.c
new file mode 100644
index 0000000..0d75b60
--- /dev/null
+++ b/gnulib/lib/amemxfrm.c
@@ -0,0 +1,180 @@
+/* Locale dependent memory area transformation for comparison.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "amemxfrm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+amemxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp)
+{
+ /* Result accumulator. */
+ char *result;
+ size_t length;
+ size_t allocated;
+
+ char orig_sentinel;
+
+ /* Initial memory allocation. */
+ if (resultbuf != NULL && *lengthp > 0)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ allocated = (n > 0 ? n : 1);
+ result = (char *) malloc (allocated);
+ if (result == NULL)
+ goto out_of_memory_2;
+ }
+ length = 0;
+
+ /* Add sentinel.byte. */
+ orig_sentinel = s[n];
+ s[n] = '\0';
+
+ /* Iterate through S, transforming each NUL terminated segment.
+ Accumulate the resulting transformed segments in result, separated by
+ NULs. */
+ {
+ const char *p_end = s + n + 1;
+ const char *p;
+
+ p = s;
+ for (;;)
+ {
+ /* Search next NUL byte. */
+ size_t l = strlen (p);
+
+ for (;;)
+ {
+ size_t k;
+
+ /* A call to strxfrm costs about 20 times more than a call to
+ strdup of the result. Therefore it is worth to try to avoid
+ calling strxfrm more than once on a given string, by making
+ enough room before calling strxfrm.
+ The size of the strxfrm result, k, is likely to be between
+ l and 3 * l. */
+ if (3 * l >= allocated - length)
+ {
+ /* Grow the result buffer. */
+ size_t new_allocated;
+ char *new_result;
+
+ new_allocated = length + 3 * l + 1;
+ if (new_allocated < 2 * allocated)
+ new_allocated = 2 * allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (result == resultbuf)
+ new_result = (char *) malloc (new_allocated);
+ else
+ new_result = (char *) realloc (result, new_allocated);
+ if (new_result != NULL)
+ {
+ allocated = new_allocated;
+ result = new_result;
+ }
+ }
+
+ errno = 0;
+ k = strxfrm (result + length, p, allocated - length);
+ if (errno != 0)
+ goto fail;
+ if (k >= allocated - length)
+ {
+ /* Grow the result buffer. */
+ size_t new_allocated;
+ char *new_result;
+
+ new_allocated = length + k + 1;
+ if (new_allocated < 2 * allocated)
+ new_allocated = 2 * allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (result == resultbuf)
+ new_result = (char *) malloc (new_allocated);
+ else
+ new_result = (char *) realloc (result, new_allocated);
+ if (new_result == NULL)
+ goto out_of_memory_1;
+ allocated = new_allocated;
+ result = new_result;
+ }
+ else
+ {
+ length += k;
+ break;
+ }
+ }
+
+ p = p + l + 1;
+ if (p == p_end)
+ break;
+ result[length] = '\0';
+ length++;
+ }
+ }
+
+ /* Shrink the allocated memory if possible.
+ It is not worth calling realloc when length + 1 == allocated; it would
+ save just one byte. */
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ if ((length > 0 ? length : 1) <= *lengthp)
+ {
+ memcpy (resultbuf, result, length);
+ free (result);
+ result = resultbuf;
+ }
+ else
+ {
+ char *memory = (char *) realloc (result, length > 0 ? length : 1);
+ if (memory != NULL)
+ result = memory;
+ }
+ }
+
+ s[n] = orig_sentinel;
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (result != resultbuf)
+ free (result);
+ s[n] = orig_sentinel;
+ errno = saved_errno;
+ return NULL;
+ }
+
+ out_of_memory_1:
+ if (result != resultbuf)
+ free (result);
+ s[n] = orig_sentinel;
+ out_of_memory_2:
+ errno = ENOMEM;
+ return NULL;
+}
diff --git a/gnulib/lib/amemxfrm.h b/gnulib/lib/amemxfrm.h
new file mode 100644
index 0000000..be8e1df
--- /dev/null
+++ b/gnulib/lib/amemxfrm.h
@@ -0,0 +1,48 @@
+/* Locale dependent memory area transformation for comparison.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef AMEMXFRM_H
+#define AMEMXFRM_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Generalization of strxfrm() to strings with embedded NUL bytes. */
+
+/* Transform the memory area [S..S+N-1] to a memory area, in such a way that
+ comparing (S1,N1) and (S2,N2) with memcoll() is equivalent to comparing
+ amemxfrm(S1,N1) and amemxfrm(S2,N2) with memcmp2().
+ The byte S[N] may be temporarily overwritten by this function, but will be
+ restored before this function returns.
+ The result of this function depends on the LC_COLLATE category of the
+ current locale.
+ If successful: If resultbuf is not NULL and the result fits into *lengthp
+ bytes, it is put in resultbuf, and resultbuf is returned. Otherwise, a
+ freshly allocated string is returned. In both cases, *lengthp is set to the
+ length of the returned string.
+ Upon failure, return NULL, with errno set. */
+extern char * amemxfrm (char *s, size_t n, char *resultbuf, size_t *lengthp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AMEMXFRM_H */
diff --git a/gnulib/lib/anytostr.c b/gnulib/lib/anytostr.c
new file mode 100644
index 0000000..e23746a
--- /dev/null
+++ b/gnulib/lib/anytostr.c
@@ -0,0 +1,55 @@
+/* anytostr.c -- convert integers to printable strings
+
+ Copyright (C) 2001, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert */
+
+/* Tell gcc not to warn about the (i < 0) test, below. */
+#if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wtype-limits"
+#endif
+
+#include <config.h>
+
+#include "inttostr.h"
+
+/* Convert I to a printable string in BUF, which must be at least
+ INT_BUFSIZE_BOUND (INTTYPE) bytes long. Return the address of the
+ printable string, which need not start at BUF. */
+
+char * __attribute_warn_unused_result__
+anytostr (inttype i, char *buf)
+{
+ char *p = buf + INT_STRLEN_BOUND (inttype);
+ *p = 0;
+
+ if (i < 0)
+ {
+ do
+ *--p = '0' - i % 10;
+ while ((i /= 10) != 0);
+
+ *--p = '-';
+ }
+ else
+ {
+ do
+ *--p = '0' + i % 10;
+ while ((i /= 10) != 0);
+ }
+
+ return p;
+}
diff --git a/gnulib/lib/arcfour.c b/gnulib/lib/arcfour.c
new file mode 100644
index 0000000..7df321b
--- /dev/null
+++ b/gnulib/lib/arcfour.c
@@ -0,0 +1,77 @@
+/* arcfour.c --- The arcfour stream cipher
+ * Copyright (C) 2000-2003, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+/*
+ * For a description of the algorithm, see:
+ * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
+ * ISBN 0-471-11709-9. Pages 397 ff.
+ */
+
+#include <config.h>
+
+#include "arcfour.h"
+
+void
+arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf,
+ size_t length)
+{
+ uint8_t i = context->idx_i;
+ uint8_t j = context->idx_j;
+ char *sbox = context->sbox;
+
+ for (; length > 0; length--)
+ {
+ char t;
+
+ i++;
+ j += sbox[i];
+ t = sbox[i];
+ sbox[i] = sbox[j];
+ sbox[j] = t;
+ *outbuf++ = (*inbuf++
+ ^ sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]);
+ }
+
+ context->idx_i = i;
+ context->idx_j = j;
+}
+
+void
+arcfour_setkey (arcfour_context * context, const char *key, size_t keylen)
+{
+ size_t i, j, k;
+ char *sbox = context->sbox;
+
+ context->idx_i = context->idx_j = 0;
+ for (i = 0; i < ARCFOUR_SBOX_SIZE; i++)
+ sbox[i] = i;
+ for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++)
+ {
+ char t;
+ j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE;
+ t = sbox[i];
+ sbox[i] = sbox[j];
+ sbox[j] = t;
+ if (++k == keylen)
+ k = 0;
+ }
+}
diff --git a/gnulib/lib/arcfour.h b/gnulib/lib/arcfour.h
new file mode 100644
index 0000000..5e4cee7
--- /dev/null
+++ b/gnulib/lib/arcfour.h
@@ -0,0 +1,50 @@
+/* arcfour.h --- The arcfour stream cipher
+ * Copyright (C) 2000-2005, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+#ifndef ARCFOUR_H
+# define ARCFOUR_H
+
+# include <stddef.h>
+# include <stdint.h>
+
+#define ARCFOUR_SBOX_SIZE 256
+
+typedef struct
+{
+ char sbox[ARCFOUR_SBOX_SIZE];
+ uint8_t idx_i, idx_j;
+} arcfour_context;
+
+/* Apply ARCFOUR stream to INBUF placing the result in OUTBUF, both of
+ LENGTH size. CONTEXT must be initialized with arcfour_setkey
+ before this function is called. */
+extern void
+arcfour_stream (arcfour_context * context,
+ const char *inbuf, char *outbuf, size_t length);
+
+/* Initialize CONTEXT using encryption KEY of KEYLEN bytes. KEY
+ should be 40 bits (5 bytes) or longer. The KEY cannot be zero
+ length. */
+extern void
+arcfour_setkey (arcfour_context * context, const char *key, size_t keylen);
+
+#endif /* ARCFOUR_H */
diff --git a/gnulib/lib/arctwo.c b/gnulib/lib/arctwo.c
new file mode 100644
index 0000000..4e90895
--- /dev/null
+++ b/gnulib/lib/arctwo.c
@@ -0,0 +1,228 @@
+/* arctwo.c --- The RC2 cipher as described in RFC 2268.
+ * Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/* Code from GnuTLS/Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+/* This implementation was written by Nikos Mavroyanopoulos for GNUTLS
+ * as a Libgcrypt module (gnutls/lib/x509/rc2.c) and later adapted for
+ * direct use by Libgcrypt by Werner Koch. This implementation is
+ * only useful for pkcs#12 decryption.
+ *
+ * The implementation here is based on Peter Gutmann's RRC.2 paper.
+ */
+
+#include <config.h>
+
+#include "arctwo.h"
+
+#include "bitrotate.h"
+
+static const uint8_t arctwo_sbox[] = {
+ 217, 120, 249, 196, 25, 221, 181, 237,
+ 40, 233, 253, 121, 74, 160, 216, 157,
+ 198, 126, 55, 131, 43, 118, 83, 142,
+ 98, 76, 100, 136, 68, 139, 251, 162,
+ 23, 154, 89, 245, 135, 179, 79, 19,
+ 97, 69, 109, 141, 9, 129, 125, 50,
+ 189, 143, 64, 235, 134, 183, 123, 11,
+ 240, 149, 33, 34, 92, 107, 78, 130,
+ 84, 214, 101, 147, 206, 96, 178, 28,
+ 115, 86, 192, 20, 167, 140, 241, 220,
+ 18, 117, 202, 31, 59, 190, 228, 209,
+ 66, 61, 212, 48, 163, 60, 182, 38,
+ 111, 191, 14, 218, 70, 105, 7, 87,
+ 39, 242, 29, 155, 188, 148, 67, 3,
+ 248, 17, 199, 246, 144, 239, 62, 231,
+ 6, 195, 213, 47, 200, 102, 30, 215,
+ 8, 232, 234, 222, 128, 82, 238, 247,
+ 132, 170, 114, 172, 53, 77, 106, 42,
+ 150, 26, 210, 113, 90, 21, 73, 116,
+ 75, 159, 208, 94, 4, 24, 164, 236,
+ 194, 224, 65, 110, 15, 81, 203, 204,
+ 36, 145, 175, 80, 161, 244, 112, 57,
+ 153, 124, 58, 133, 35, 184, 180, 122,
+ 252, 2, 54, 91, 37, 85, 151, 49,
+ 45, 93, 250, 152, 227, 138, 146, 174,
+ 5, 223, 41, 16, 103, 108, 186, 201,
+ 211, 0, 230, 207, 225, 158, 168, 44,
+ 99, 22, 1, 63, 88, 226, 137, 169,
+ 13, 56, 52, 27, 171, 51, 255, 176,
+ 187, 72, 12, 95, 185, 177, 205, 46,
+ 197, 243, 219, 71, 229, 165, 156, 119,
+ 10, 166, 32, 104, 254, 127, 193, 173
+};
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+void
+arctwo_encrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length)
+{
+ for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
+ inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i, j;
+ uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;
+
+ word0 = (word0 << 8) | to_uchar (inbuf[1]);
+ word0 = (word0 << 8) | to_uchar (inbuf[0]);
+ word1 = (word1 << 8) | to_uchar (inbuf[3]);
+ word1 = (word1 << 8) | to_uchar (inbuf[2]);
+ word2 = (word2 << 8) | to_uchar (inbuf[5]);
+ word2 = (word2 << 8) | to_uchar (inbuf[4]);
+ word3 = (word3 << 8) | to_uchar (inbuf[7]);
+ word3 = (word3 << 8) | to_uchar (inbuf[6]);
+
+ for (i = 0; i < 16; i++)
+ {
+ j = i * 4;
+ /* For some reason I cannot combine those steps. */
+ word0 += (word1 & ~word3) + (word2 & word3) + context->S[j];
+ word0 = rotl16 (word0, 1);
+
+ word1 += (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
+ word1 = rotl16 (word1, 2);
+
+ word2 += (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
+ word2 = rotl16 (word2, 3);
+
+ word3 += (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
+ word3 = rotl16 (word3, 5);
+
+ if (i == 4 || i == 10)
+ {
+ word0 += context->S[word3 & 63];
+ word1 += context->S[word0 & 63];
+ word2 += context->S[word1 & 63];
+ word3 += context->S[word2 & 63];
+ }
+ }
+
+ outbuf[0] = word0 & 255;
+ outbuf[1] = word0 >> 8;
+ outbuf[2] = word1 & 255;
+ outbuf[3] = word1 >> 8;
+ outbuf[4] = word2 & 255;
+ outbuf[5] = word2 >> 8;
+ outbuf[6] = word3 & 255;
+ outbuf[7] = word3 >> 8;
+ }
+}
+
+void
+arctwo_decrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length)
+{
+ for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
+ inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i, j;
+ uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;
+
+ word0 = (word0 << 8) | to_uchar (inbuf[1]);
+ word0 = (word0 << 8) | to_uchar (inbuf[0]);
+ word1 = (word1 << 8) | to_uchar (inbuf[3]);
+ word1 = (word1 << 8) | to_uchar (inbuf[2]);
+ word2 = (word2 << 8) | to_uchar (inbuf[5]);
+ word2 = (word2 << 8) | to_uchar (inbuf[4]);
+ word3 = (word3 << 8) | to_uchar (inbuf[7]);
+ word3 = (word3 << 8) | to_uchar (inbuf[6]);
+
+ for (i = 16; i > 0; i--)
+ {
+ j = (i - 1) * 4;
+
+ word3 = rotr16 (word3, 5);
+ word3 -= (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
+
+ word2 = rotr16 (word2, 3);
+ word2 -= (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
+
+ word1 = rotr16 (word1, 2);
+ word1 -= (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
+
+ word0 = rotr16 (word0, 1);
+ word0 -= (word1 & ~word3) + (word2 & word3) + context->S[j];
+
+ if (i == 6 || i == 12)
+ {
+ word3 = word3 - context->S[word2 & 63];
+ word2 = word2 - context->S[word1 & 63];
+ word1 = word1 - context->S[word0 & 63];
+ word0 = word0 - context->S[word3 & 63];
+ }
+ }
+
+ outbuf[0] = word0 & 255;
+ outbuf[1] = word0 >> 8;
+ outbuf[2] = word1 & 255;
+ outbuf[3] = word1 >> 8;
+ outbuf[4] = word2 & 255;
+ outbuf[5] = word2 >> 8;
+ outbuf[6] = word3 & 255;
+ outbuf[7] = word3 >> 8;
+ }
+}
+
+void
+arctwo_setkey_ekb (arctwo_context *context,
+ size_t keylen, const char *key, size_t effective_keylen)
+{
+ size_t i;
+ uint8_t *S, x;
+
+ if (keylen < 40 / 8 || effective_keylen > 1024)
+ return;
+
+ S = (uint8_t *) context->S;
+
+ for (i = 0; i < keylen; i++)
+ S[i] = (uint8_t) key[i];
+
+ for (i = keylen; i < 128; i++)
+ S[i] = arctwo_sbox[(S[i - keylen] + S[i - 1]) & 255];
+
+ S[0] = arctwo_sbox[S[0]];
+
+ /* Phase 2 - reduce effective key size to "bits". This was not
+ * discussed in Gutmann's paper. I've copied that from the public
+ * domain code posted in sci.crypt. */
+ if (effective_keylen)
+ {
+ size_t len = (effective_keylen + 7) >> 3;
+ i = 128 - len;
+ x = arctwo_sbox[S[i] & (255 >> (7 & -effective_keylen))];
+ S[i] = x;
+
+ while (i--)
+ {
+ x = arctwo_sbox[x ^ S[i + len]];
+ S[i] = x;
+ }
+ }
+
+ /* Make the expanded key, endian independent. */
+ for (i = 0; i < 64; i++)
+ context->S[i] = ((uint16_t) S[i * 2] | (((uint16_t) S[i * 2 + 1]) << 8));
+}
diff --git a/gnulib/lib/arctwo.h b/gnulib/lib/arctwo.h
new file mode 100644
index 0000000..dc23aeb
--- /dev/null
+++ b/gnulib/lib/arctwo.h
@@ -0,0 +1,63 @@
+/* arctwo.h --- The arctwo block cipher
+ * Copyright (C) 2000-2003, 2005, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
+
+#ifndef ARCTWO_H
+# define ARCTWO_H
+
+# include <stddef.h>
+# include <stdint.h>
+
+typedef struct
+{
+ uint16_t S[64];
+} arctwo_context;
+
+#define ARCTWO_BLOCK_SIZE 8
+
+/* Initialize CONTEXT using KEY of KEYLEN length. If
+ EFFECTIVE_KEYLEN, truncate the key (using a special algorithm) to
+ only be of EFFECTIVE_KEYLEN bits. Normally, you use
+ EFFECTIVE_KEYLEN of 0, but see RFC 2268 for more information. */
+void
+arctwo_setkey_ekb (arctwo_context *context,
+ size_t keylen, const char *key, size_t effective_keylen);
+
+#define arctwo_setkey(context,keylen,key) \
+ arctwo_setkey_ekb (context, keylen, key, 8 * (keylen))
+
+/* Encrypt INBUF of size LENGTH into OUTBUF. LENGTH must be a
+ multiple of ARCTWO_BLOCK_SIZE. CONTEXT hold the encryption key,
+ and must have been initialized with arctwo_setkey or
+ arctwo_setkey_ekb. */
+extern void
+arctwo_encrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length);
+
+/* Decrypt INBUF of size LENGTH into OUTBUF. LENGTH must be a
+ multiple of ARCTWO_BLOCK_SIZE. CONTEXT hold the decryption key,
+ and must have been initialized with arctwo_setkey or
+ arctwo_setkey_ekb. */
+extern void
+arctwo_decrypt (arctwo_context *context, const char *inbuf,
+ char *outbuf, size_t length);
+
+#endif /* ARCTWO_H */
diff --git a/gnulib/lib/areadlink-with-size.c b/gnulib/lib/areadlink-with-size.c
new file mode 100644
index 0000000..e7e21b7
--- /dev/null
+++ b/gnulib/lib/areadlink-with-size.c
@@ -0,0 +1,104 @@
+/* readlink wrapper to return the link name in malloc'd storage.
+ Unlike xreadlink and xreadlink_with_size, don't ever call exit.
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* SYMLINK_MAX is used only for an initial memory-allocation sanity
+ check, so it's OK to guess too small on hosts where there is no
+ arbitrary limit to symbolic link length. */
+#ifndef SYMLINK_MAX
+# define SYMLINK_MAX 1024
+#endif
+
+#define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
+
+/* Call readlink to get the symbolic link value of FILE.
+ SIZE is a hint as to how long the link is expected to be;
+ typically it is taken from st_size. It need not be correct.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, malloc fails, or if the link value is longer
+ than SSIZE_MAX, return NULL (caller may use errno to diagnose). */
+
+char *
+areadlink_with_size (char const *file, size_t size)
+{
+ /* Some buggy file systems report garbage in st_size. Defend
+ against them by ignoring outlandish st_size values in the initial
+ memory allocation. */
+ size_t symlink_max = SYMLINK_MAX;
+ size_t INITIAL_LIMIT_BOUND = 8 * 1024;
+ size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
+ ? symlink_max + 1
+ : INITIAL_LIMIT_BOUND);
+
+ /* The initial buffer size for the link value. */
+ size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+
+ while (1)
+ {
+ ssize_t r;
+ size_t link_length;
+ char *buffer = malloc (buf_size);
+
+ if (buffer == NULL)
+ return NULL;
+ r = readlink (file, buffer, buf_size);
+ link_length = r;
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (r < 0 && errno != ERANGE)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (link_length < buf_size)
+ {
+ buffer[link_length] = 0;
+ return buffer;
+ }
+
+ free (buffer);
+ if (buf_size <= MAXSIZE / 2)
+ buf_size *= 2;
+ else if (buf_size < MAXSIZE)
+ buf_size = MAXSIZE;
+ else
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+}
diff --git a/gnulib/lib/areadlink.c b/gnulib/lib/areadlink.c
new file mode 100644
index 0000000..6bf9a0c
--- /dev/null
+++ b/gnulib/lib/areadlink.c
@@ -0,0 +1,39 @@
+/* areadlink.c -- readlink wrapper to return the link name in malloc'd storage
+ Unlike xreadlink and xreadlink_with_size, don't ever call exit.
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "areadlink.h"
+
+#include "careadlinkat.h"
+
+/* Call readlink to get the symbolic link value of FILENAME.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, return NULL and set errno.
+ If allocation fails, or if the link value is longer than SIZE_MAX :-),
+ return NULL and set errno to ENOMEM. */
+
+char *
+areadlink (char const *filename)
+{
+ return careadlinkat (AT_FDCWD, filename, NULL, 0, NULL, careadlinkatcwd);
+}
diff --git a/gnulib/lib/areadlink.h b/gnulib/lib/areadlink.h
new file mode 100644
index 0000000..30e3b69
--- /dev/null
+++ b/gnulib/lib/areadlink.h
@@ -0,0 +1,33 @@
+/* Read symbolic links without size limitation.
+
+ Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+#include <stddef.h>
+
+extern char *areadlink (char const *filename);
+extern char *areadlink_with_size (char const *filename, size_t size_hint);
+
+#if GNULIB_AREADLINKAT
+extern char *areadlinkat (int fd, char const *filename);
+#endif
+
+#if GNULIB_AREADLINKAT_WITH_SIZE
+extern char *areadlinkat_with_size (int fd, char const *filename,
+ size_t size_hint);
+#endif
diff --git a/gnulib/lib/areadlinkat-with-size.c b/gnulib/lib/areadlinkat-with-size.c
new file mode 100644
index 0000000..2469be8
--- /dev/null
+++ b/gnulib/lib/areadlinkat-with-size.c
@@ -0,0 +1,132 @@
+/* readlinkat wrapper to return the link name in malloc'd storage.
+ Unlike xreadlinkat, only call exit on failure to change directory.
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+#include "areadlink.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#if HAVE_READLINKAT
+
+# ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+# endif
+
+/* SYMLINK_MAX is used only for an initial memory-allocation sanity
+ check, so it's OK to guess too small on hosts where there is no
+ arbitrary limit to symbolic link length. */
+# ifndef SYMLINK_MAX
+# define SYMLINK_MAX 1024
+# endif
+
+# define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
+
+/* Call readlinkat to get the symbolic link value of FILE, relative to FD.
+ SIZE is a hint as to how long the link is expected to be;
+ typically it is taken from st_size. It need not be correct.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, malloc fails, or if the link value is longer
+ than SSIZE_MAX, return NULL (caller may use errno to diagnose).
+ However, failure to change directory during readlinkat will issue
+ a diagnostic and exit. */
+
+char *
+areadlinkat_with_size (int fd, char const *file, size_t size)
+{
+ /* Some buggy file systems report garbage in st_size. Defend
+ against them by ignoring outlandish st_size values in the initial
+ memory allocation. */
+ size_t symlink_max = SYMLINK_MAX;
+ size_t INITIAL_LIMIT_BOUND = 8 * 1024;
+ size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
+ ? symlink_max + 1
+ : INITIAL_LIMIT_BOUND);
+
+ /* The initial buffer size for the link value. */
+ size_t buf_size = size < initial_limit ? size + 1 : initial_limit;
+
+ while (1)
+ {
+ ssize_t r;
+ size_t link_length;
+ char *buffer = malloc (buf_size);
+
+ if (buffer == NULL)
+ return NULL;
+ r = readlinkat (fd, file, buffer, buf_size);
+ link_length = r;
+
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ if (r < 0 && errno != ERANGE)
+ {
+ int saved_errno = errno;
+ free (buffer);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (link_length < buf_size)
+ {
+ buffer[link_length] = 0;
+ return buffer;
+ }
+
+ free (buffer);
+ if (buf_size <= MAXSIZE / 2)
+ buf_size *= 2;
+ else if (buf_size < MAXSIZE)
+ buf_size = MAXSIZE;
+ else
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+}
+
+#else /* !HAVE_READLINKAT */
+
+
+/* It is more efficient to change directories only once and call
+ areadlink_with_size, rather than repeatedly call the replacement
+ readlinkat. */
+
+# define AT_FUNC_NAME areadlinkat_with_size
+# define AT_FUNC_F1 areadlink_with_size
+# define AT_FUNC_POST_FILE_PARAM_DECLS , size_t size
+# define AT_FUNC_POST_FILE_ARGS , size
+# define AT_FUNC_RESULT char *
+# define AT_FUNC_FAIL NULL
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+# undef AT_FUNC_RESULT
+# undef AT_FUNC_FAIL
+
+#endif /* !HAVE_READLINKAT */
diff --git a/gnulib/lib/areadlinkat.c b/gnulib/lib/areadlinkat.c
new file mode 100644
index 0000000..2c227f3
--- /dev/null
+++ b/gnulib/lib/areadlinkat.c
@@ -0,0 +1,65 @@
+/* areadlinkat.c -- readlinkat wrapper to return malloc'd link name
+ Unlike xreadlinkat, only call exit on failure to change directory.
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>,
+ and Bruno Haible <bruno@clisp.org>,
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "areadlink.h"
+
+#include "careadlinkat.h"
+
+#if HAVE_READLINKAT
+
+/* Call readlinkat to get the symbolic link value of FILENAME relative to FD.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, return NULL and set errno (although failure to
+ change directory will issue a diagnostic and exit).
+ If allocation fails, or if the link value is longer than SIZE_MAX :-),
+ return NULL and set errno to ENOMEM. */
+
+char *
+areadlinkat (int fd, char const *filename)
+{
+ return careadlinkat (fd, filename, NULL, 0, NULL, readlinkat);
+}
+
+#else /* !HAVE_READLINKAT */
+
+/* It is more efficient to change directories only once and call
+ areadlink, rather than repeatedly call the replacement
+ readlinkat. */
+
+# define AT_FUNC_NAME areadlinkat
+# define AT_FUNC_F1 areadlink
+# define AT_FUNC_POST_FILE_PARAM_DECLS /* empty */
+# define AT_FUNC_POST_FILE_ARGS /* empty */
+# define AT_FUNC_RESULT char *
+# define AT_FUNC_FAIL NULL
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+# undef AT_FUNC_RESULT
+# undef AT_FUNC_FAIL
+
+#endif /* !HAVE_READLINKAT */
diff --git a/gnulib/lib/argmatch.c b/gnulib/lib/argmatch.c
new file mode 100644
index 0000000..6adbef6
--- /dev/null
+++ b/gnulib/lib/argmatch.c
@@ -0,0 +1,277 @@
+/* argmatch.c -- find a match for a string in an array
+
+ Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#include <config.h>
+
+/* Specification. */
+#include "argmatch.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "quotearg.h"
+#include "quote.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* When reporting an invalid argument, show nonprinting characters
+ by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use
+ literal_quoting_style. */
+#ifndef ARGMATCH_QUOTING_STYLE
+# define ARGMATCH_QUOTING_STYLE locale_quoting_style
+#endif
+
+/* Non failing version of argmatch call this function after failing. */
+#ifndef ARGMATCH_DIE
+# include "exitfail.h"
+# define ARGMATCH_DIE exit (exit_failure)
+#endif
+
+#ifdef ARGMATCH_DIE_DECL
+ARGMATCH_DIE_DECL;
+#endif
+
+static void
+__argmatch_die (void)
+{
+ ARGMATCH_DIE;
+}
+
+/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h.
+ Default to __argmatch_die, but allow caller to change this at run-time. */
+argmatch_exit_fn argmatch_die = __argmatch_die;
+
+
+/* If ARG is an unambiguous match for an element of the
+ NULL-terminated array ARGLIST, return the index in ARGLIST
+ of the matched element, else -1 if it does not match any element
+ or -2 if it is ambiguous (is a prefix of more than one element).
+
+ If VALLIST is none null, use it to resolve ambiguities limited to
+ synonyms, i.e., for
+ "yes", "yop" -> 0
+ "no", "nope" -> 1
+ "y" is a valid argument, for `0', and "n" for `1'. */
+
+ptrdiff_t
+argmatch (const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i; /* Temporary index in ARGLIST. */
+ size_t arglen; /* Length of ARG. */
+ ptrdiff_t matchind = -1; /* Index of first nonexact match. */
+ bool ambiguous = false; /* If true, multiple nonexact match(es). */
+
+ arglen = strlen (arg);
+
+ /* Test all elements for either exact match or abbreviated matches. */
+ for (i = 0; arglist[i]; i++)
+ {
+ if (!strncmp (arglist[i], arg, arglen))
+ {
+ if (strlen (arglist[i]) == arglen)
+ /* Exact match found. */
+ return i;
+ else if (matchind == -1)
+ /* First nonexact match found. */
+ matchind = i;
+ else
+ {
+ /* Second nonexact match found. */
+ if (vallist == NULL
+ || memcmp (vallist + valsize * matchind,
+ vallist + valsize * i, valsize))
+ {
+ /* There is a real ambiguity, or we could not
+ disambiguate. */
+ ambiguous = true;
+ }
+ }
+ }
+ }
+ if (ambiguous)
+ return -2;
+ else
+ return matchind;
+}
+
+/* Error reporting for argmatch.
+ CONTEXT is a description of the type of entity that was being matched.
+ VALUE is the invalid value that was given.
+ PROBLEM is the return value from argmatch. */
+
+void
+argmatch_invalid (const char *context, const char *value, ptrdiff_t problem)
+{
+ char const *format = (problem == -1
+ ? _("invalid argument %s for %s")
+ : _("ambiguous argument %s for %s"));
+
+ error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
+ quote_n (1, context));
+}
+
+/* List the valid arguments for argmatch.
+ ARGLIST is the same as in argmatch.
+ VALLIST is a pointer to an array of values.
+ VALSIZE is the size of the elements of VALLIST */
+void
+argmatch_valid (const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+ const char *last_val = NULL;
+
+ /* We try to put synonyms on the same line. The assumption is that
+ synonyms follow each other */
+ fputs (_("Valid arguments are:"), stderr);
+ for (i = 0; arglist[i]; i++)
+ if ((i == 0)
+ || memcmp (last_val, vallist + valsize * i, valsize))
+ {
+ fprintf (stderr, "\n - %s", quote (arglist[i]));
+ last_val = vallist + valsize * i;
+ }
+ else
+ {
+ fprintf (stderr, ", %s", quote (arglist[i]));
+ }
+ putc ('\n', stderr);
+}
+
+/* Never failing versions of the previous functions.
+
+ CONTEXT is the context for which argmatch is called (e.g.,
+ "--version-control", or "$VERSION_CONTROL" etc.). Upon failure,
+ calls the (supposed never to return) function EXIT_FN. */
+
+ptrdiff_t
+__xargmatch_internal (const char *context,
+ const char *arg, const char *const *arglist,
+ const char *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn)
+{
+ ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
+ if (res >= 0)
+ /* Success. */
+ return res;
+
+ /* We failed. Explain why. */
+ argmatch_invalid (context, arg, res);
+ argmatch_valid (arglist, vallist, valsize);
+ (*exit_fn) ();
+
+ return -1; /* To please the compilers. */
+}
+
+/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and
+ return the first corresponding argument in ARGLIST */
+const char *
+argmatch_to_argument (const char *value,
+ const char *const *arglist,
+ const char *vallist, size_t valsize)
+{
+ size_t i;
+
+ for (i = 0; arglist[i]; i++)
+ if (!memcmp (value, vallist + valsize * i, valsize))
+ return arglist[i];
+ return NULL;
+}
+
+#ifdef TEST
+/*
+ * Based on "getversion.c" by David MacKenzie <djm@gnu.ai.mit.edu>
+ */
+char *program_name;
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+/* Two tables describing arguments (keys) and their corresponding
+ values */
+static const char *const backup_args[] =
+{
+ "no", "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ 0
+};
+
+static const enum backup_type backup_vals[] =
+{
+ no_backups, no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+int
+main (int argc, const char *const *argv)
+{
+ const char *cp;
+ enum backup_type backup_type = no_backups;
+
+ program_name = (char *) argv[0];
+
+ if (argc > 2)
+ {
+ fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name);
+ exit (1);
+ }
+
+ if ((cp = getenv ("VERSION_CONTROL")))
+ backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
+ backup_args, backup_vals);
+
+ if (argc == 2)
+ backup_type = XARGMATCH (program_name, argv[1],
+ backup_args, backup_vals);
+
+ printf ("The version control is `%s'\n",
+ ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
+
+ return 0;
+}
+#endif
diff --git a/gnulib/lib/argmatch.h b/gnulib/lib/argmatch.h
new file mode 100644
index 0000000..b1a1193
--- /dev/null
+++ b/gnulib/lib/argmatch.h
@@ -0,0 +1,103 @@
+/* argmatch.h -- definitions and prototypes for argmatch.c
+
+ Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu>
+ Modified by Akim Demaille <demaille@inf.enst.fr> */
+
+#ifndef ARGMATCH_H_
+# define ARGMATCH_H_ 1
+
+# include <stddef.h>
+
+# include "verify.h"
+
+# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+/* Assert there are as many real arguments as there are values
+ (argument list ends with a NULL guard). */
+
+# define ARGMATCH_VERIFY(Arglist, Vallist) \
+ verify (ARRAY_CARDINALITY (Arglist) == ARRAY_CARDINALITY (Vallist) + 1)
+
+/* Return the index of the element of ARGLIST (NULL terminated) that
+ matches with ARG. If VALLIST is not NULL, then use it to resolve
+ false ambiguities (i.e., different matches of ARG but corresponding
+ to the same values in VALLIST). */
+
+ptrdiff_t argmatch (char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize) _GL_ATTRIBUTE_PURE;
+
+# define ARGMATCH(Arg, Arglist, Vallist) \
+ argmatch (Arg, Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+/* xargmatch calls this function when it fails. This function should not
+ return. By default, this is a function that calls ARGMATCH_DIE which
+ in turn defaults to `exit (exit_failure)'. */
+typedef void (*argmatch_exit_fn) (void);
+extern argmatch_exit_fn argmatch_die;
+
+/* Report on stderr why argmatch failed. Report correct values. */
+
+void argmatch_invalid (char const *context, char const *value,
+ ptrdiff_t problem);
+
+/* Left for compatibility with the old name invalid_arg */
+
+# define invalid_arg(Context, Value, Problem) \
+ argmatch_invalid (Context, Value, Problem)
+
+
+
+/* Report on stderr the list of possible arguments. */
+
+void argmatch_valid (char const *const *arglist,
+ char const *vallist, size_t valsize);
+
+# define ARGMATCH_VALID(Arglist, Vallist) \
+ argmatch_valid (Arglist, (char const *) (Vallist), sizeof *(Vallist))
+
+
+
+/* Same as argmatch, but upon failure, report an explanation of the
+ failure, and exit using the function EXIT_FN. */
+
+ptrdiff_t __xargmatch_internal (char const *context,
+ char const *arg, char const *const *arglist,
+ char const *vallist, size_t valsize,
+ argmatch_exit_fn exit_fn);
+
+/* Programmer friendly interface to __xargmatch_internal. */
+
+# define XARGMATCH(Context, Arg, Arglist, Vallist) \
+ ((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \
+ (char const *) (Vallist), \
+ sizeof *(Vallist), \
+ argmatch_die)])
+
+/* Convert a value into a corresponding argument. */
+
+char const *argmatch_to_argument (char const *value,
+ char const *const *arglist,
+ char const *vallist, size_t valsize)
+ _GL_ATTRIBUTE_PURE;
+
+# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist) \
+ argmatch_to_argument (Value, Arglist, \
+ (char const *) (Vallist), sizeof *(Vallist))
+
+#endif /* ARGMATCH_H_ */
diff --git a/gnulib/lib/argp-ba.c b/gnulib/lib/argp-ba.c
new file mode 100644
index 0000000..a03b134
--- /dev/null
+++ b/gnulib/lib/argp-ba.c
@@ -0,0 +1,34 @@
+/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
+ Copyright (C) 1996-1997, 1999, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* If set by the user program, it should point to string that is the
+ bug-reporting address for the program. It will be printed by argp_help if
+ the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
+ messages), embedded in a sentence that says something like `Report bugs to
+ ADDR.'. */
+const char *argp_program_bug_address
+/* This variable should be zero-initialized. On most systems, putting it into
+ BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ = (const char *) 0
+#endif
+ ;
diff --git a/gnulib/lib/argp-eexst.c b/gnulib/lib/argp-eexst.c
new file mode 100644
index 0000000..1082a39
--- /dev/null
+++ b/gnulib/lib/argp-eexst.c
@@ -0,0 +1,30 @@
+/* Default definition for ARGP_ERR_EXIT_STATUS
+ Copyright (C) 1997, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sysexits.h>
+
+#include "argp.h"
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+error_t argp_err_exit_status = EX_USAGE;
diff --git a/gnulib/lib/argp-fmtstream.c b/gnulib/lib/argp-fmtstream.c
new file mode 100644
index 0000000..c308eb6
--- /dev/null
+++ b/gnulib/lib/argp-fmtstream.c
@@ -0,0 +1,435 @@
+/* Word-wrapping and line-truncating streams
+ Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
+
+#ifndef isblank
+#define isblank(ch) ((ch)==' ' || (ch)=='\t')
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+# include <libio/libioP.h>
+# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
+#endif
+
+#define INIT_BUF_SIZE 200
+#define PRINTF_SIZE_GUESS 150
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+argp_fmtstream_t
+__argp_make_fmtstream (FILE *stream,
+ size_t lmargin, size_t rmargin, ssize_t wmargin)
+{
+ argp_fmtstream_t fs;
+
+ fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream));
+ if (fs != NULL)
+ {
+ fs->stream = stream;
+
+ fs->lmargin = lmargin;
+ fs->rmargin = rmargin;
+ fs->wmargin = wmargin;
+ fs->point_col = 0;
+ fs->point_offs = 0;
+
+ fs->buf = (char *) malloc (INIT_BUF_SIZE);
+ if (! fs->buf)
+ {
+ free (fs);
+ fs = 0;
+ }
+ else
+ {
+ fs->p = fs->buf;
+ fs->end = fs->buf + INIT_BUF_SIZE;
+ }
+ }
+
+ return fs;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_make_fmtstream, argp_make_fmtstream)
+#endif
+#endif
+
+/* Flush FS to its stream, and free it (but don't close the stream). */
+void
+__argp_fmtstream_free (argp_fmtstream_t fs)
+{
+ __argp_fmtstream_update (fs);
+ if (fs->p > fs->buf)
+ {
+#ifdef USE_IN_LIBIO
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+#else
+ fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ }
+ free (fs->buf);
+ free (fs);
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
+#endif
+#endif
+
+/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
+ end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
+void
+__argp_fmtstream_update (argp_fmtstream_t fs)
+{
+ char *buf, *nl;
+ size_t len;
+
+ /* Scan the buffer for newlines. */
+ buf = fs->buf + fs->point_offs;
+ while (buf < fs->p)
+ {
+ size_t r;
+
+ if (fs->point_col == 0 && fs->lmargin != 0)
+ {
+ /* We are starting a new line. Print spaces to the left margin. */
+ const size_t pad = fs->lmargin;
+ if (fs->p + pad < fs->end)
+ {
+ /* We can fit in them in the buffer by moving the
+ buffer text up and filling in the beginning. */
+ memmove (buf + pad, buf, fs->p - buf);
+ fs->p += pad; /* Compensate for bigger buffer. */
+ memset (buf, ' ', pad); /* Fill in the spaces. */
+ buf += pad; /* Don't bother searching them. */
+ }
+ else
+ {
+ /* No buffer space for spaces. Must flush. */
+ size_t i;
+ for (i = 0; i < pad; i++)
+ {
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+ }
+ }
+ fs->point_col = pad;
+ }
+
+ len = fs->p - buf;
+ nl = memchr (buf, '\n', len);
+
+ if (fs->point_col < 0)
+ fs->point_col = 0;
+
+ if (!nl)
+ {
+ /* The buffer ends in a partial line. */
+
+ if (fs->point_col + len < fs->rmargin)
+ {
+ /* The remaining buffer text is a partial line and fits
+ within the maximum line width. Advance point for the
+ characters to be written and stop scanning. */
+ fs->point_col += len;
+ break;
+ }
+ else
+ /* Set the end-of-line pointer for the code below to
+ the end of the buffer. */
+ nl = fs->p;
+ }
+ else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
+ {
+ /* The buffer contains a full line that fits within the maximum
+ line width. Reset point and scan the next line. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+
+ /* This line is too long. */
+ r = fs->rmargin - 1;
+
+ if (fs->wmargin < 0)
+ {
+ /* Truncate the line by overwriting the excess with the
+ newline and anything after it in the buffer. */
+ if (nl < fs->p)
+ {
+ memmove (buf + (r - fs->point_col), nl, fs->p - nl);
+ fs->p -= buf + (r - fs->point_col) - nl;
+ /* Reset point for the next line and start scanning it. */
+ fs->point_col = 0;
+ buf += r + 1; /* Skip full line plus \n. */
+ }
+ else
+ {
+ /* The buffer ends with a partial line that is beyond the
+ maximum line width. Advance point for the characters
+ written, and discard those past the max from the buffer. */
+ fs->point_col += len;
+ fs->p -= fs->point_col - r;
+ break;
+ }
+ }
+ else
+ {
+ /* Do word wrap. Go to the column just past the maximum line
+ width and scan back for the beginning of the word there.
+ Then insert a line break. */
+
+ char *p, *nextline;
+ int i;
+
+ p = buf + (r + 1 - fs->point_col);
+ while (p >= buf && !isblank ((unsigned char) *p))
+ --p;
+ nextline = p + 1; /* This will begin the next line. */
+
+ if (nextline > buf)
+ {
+ /* Swallow separating blanks. */
+ if (p >= buf)
+ do
+ --p;
+ while (p >= buf && isblank ((unsigned char) *p));
+ nl = p + 1; /* The newline will replace the first blank. */
+ }
+ else
+ {
+ /* A single word that is greater than the maximum line width.
+ Oh well. Put it on an overlong line by itself. */
+ p = buf + (r + 1 - fs->point_col);
+ /* Find the end of the long word. */
+ if (p < nl)
+ do
+ ++p;
+ while (p < nl && !isblank ((unsigned char) *p));
+ if (p == nl)
+ {
+ /* It already ends a line. No fussing required. */
+ fs->point_col = 0;
+ buf = nl + 1;
+ continue;
+ }
+ /* We will move the newline to replace the first blank. */
+ nl = p;
+ /* Swallow separating blanks. */
+ do
+ ++p;
+ while (isblank ((unsigned char) *p));
+ /* The next line will start here. */
+ nextline = p;
+ }
+
+ /* Note: There are a bunch of tests below for
+ NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall
+ at the end of the buffer, and NEXTLINE is in fact empty (and so
+ we need not be careful to maintain its contents). */
+
+ if ((nextline == buf + len + 1
+ ? fs->end - nl < fs->wmargin + 1
+ : nextline - (nl + 1) < fs->wmargin)
+ && fs->p > nextline)
+ {
+ /* The margin needs more blanks than we removed. */
+ if (fs->end - fs->p > fs->wmargin + 1)
+ /* Make some space for them. */
+ {
+ size_t mv = fs->p - nextline;
+ memmove (nl + 1 + fs->wmargin, nextline, mv);
+ nextline = nl + 1 + fs->wmargin;
+ len = nextline + mv - buf;
+ *nl++ = '\n';
+ }
+ else
+ /* Output the first line so we can use the space. */
+ {
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s\n",
+ (int) (nl - fs->buf), fs->buf);
+#else
+ if (nl > fs->buf)
+ fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream);
+ putc_unlocked ('\n', fs->stream);
+#endif
+
+ len += buf - fs->buf;
+ nl = buf = fs->buf;
+ }
+ }
+ else
+ /* We can fit the newline and blanks in before
+ the next word. */
+ *nl++ = '\n';
+
+ if (nextline - nl >= fs->wmargin
+ || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin))
+ /* Add blanks up to the wrap margin column. */
+ for (i = 0; i < fs->wmargin; ++i)
+ *nl++ = ' ';
+ else
+ for (i = 0; i < fs->wmargin; ++i)
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (fs->stream, 0) > 0)
+ putwc_unlocked (L' ', fs->stream);
+ else
+#endif
+ putc_unlocked (' ', fs->stream);
+
+ /* Copy the tail of the original buffer into the current buffer
+ position. */
+ if (nl < nextline)
+ memmove (nl, nextline, buf + len - nextline);
+ len -= nextline - buf;
+
+ /* Continue the scan on the remaining lines in the buffer. */
+ buf = nl;
+
+ /* Restore bufp to include all the remaining text. */
+ fs->p = nl + len;
+
+ /* Reset the counter of what has been output this line. If wmargin
+ is 0, we want to avoid the lmargin getting added, so we set
+ point_col to a magic value of -1 in that case. */
+ fs->point_col = fs->wmargin ? fs->wmargin : -1;
+ }
+ }
+
+ /* Remember that we've scanned as far as the end of the buffer. */
+ fs->point_offs = fs->p - fs->buf;
+}
+
+/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by
+ growing the buffer, or by flushing it. True is returned iff we succeed. */
+int
+__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)
+{
+ if ((size_t) (fs->end - fs->p) < amount)
+ {
+ ssize_t wrote;
+
+ /* Flush FS's buffer. */
+ __argp_fmtstream_update (fs);
+
+#ifdef _LIBC
+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
+ wrote = fs->p - fs->buf;
+#else
+ wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
+#endif
+ if (wrote == fs->p - fs->buf)
+ {
+ fs->p = fs->buf;
+ fs->point_offs = 0;
+ }
+ else
+ {
+ fs->p -= wrote;
+ fs->point_offs -= wrote;
+ memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf);
+ return 0;
+ }
+
+ if ((size_t) (fs->end - fs->buf) < amount)
+ /* Gotta grow the buffer. */
+ {
+ size_t old_size = fs->end - fs->buf;
+ size_t new_size = old_size + amount;
+ char *new_buf;
+
+ if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size)))
+ {
+ __set_errno (ENOMEM);
+ return 0;
+ }
+
+ fs->buf = new_buf;
+ fs->end = new_buf + new_size;
+ fs->p = fs->buf;
+ }
+ }
+
+ return 1;
+}
+
+ssize_t
+__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
+{
+ int out;
+ size_t avail;
+ size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */
+
+ do
+ {
+ va_list args;
+
+ if (! __argp_fmtstream_ensure (fs, size_guess))
+ return -1;
+
+ va_start (args, fmt);
+ avail = fs->end - fs->p;
+ out = __vsnprintf (fs->p, avail, fmt, args);
+ va_end (args);
+ if ((size_t) out >= avail)
+ size_guess = out + 1;
+ }
+ while ((size_t) out >= avail);
+
+ fs->p += out;
+
+ return out;
+}
+#if 0
+/* Not exported. */
+#ifdef weak_alias
+weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)
+#endif
+#endif
+
+#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */
diff --git a/gnulib/lib/argp-fmtstream.h b/gnulib/lib/argp-fmtstream.h
new file mode 100644
index 0000000..f664254
--- /dev/null
+++ b/gnulib/lib/argp-fmtstream.h
@@ -0,0 +1,354 @@
+/* Word-wrapping and line-truncating streams.
+ Copyright (C) 1997, 2006-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This package emulates glibc `line_wrap_stream' semantics for systems that
+ don't have that. If the system does have it, it is just a wrapper for
+ that. This header file is only used internally while compiling argp, and
+ shouldn't be installed. */
+
+#ifndef _ARGP_FMTSTREAM_H
+#define _ARGP_FMTSTREAM_H
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
+ || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
+/* line_wrap_stream is available, so use that. */
+#define ARGP_FMTSTREAM_USE_LINEWRAP
+#endif
+
+#ifdef ARGP_FMTSTREAM_USE_LINEWRAP
+/* Just be a simple wrapper for line_wrap_stream; the semantics are
+ *slightly* different, as line_wrap_stream doesn't actually make a new
+ object, it just modifies the given stream (reversibly) to do
+ line-wrapping. Since we control who uses this code, it doesn't matter. */
+
+#include <linewrap.h>
+
+typedef FILE *argp_fmtstream_t;
+
+#define argp_make_fmtstream line_wrap_stream
+#define __argp_make_fmtstream line_wrap_stream
+#define argp_fmtstream_free line_unwrap_stream
+#define __argp_fmtstream_free line_unwrap_stream
+
+#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define argp_fmtstream_putc(fs,ch) putc(ch,fs)
+#define __argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define argp_fmtstream_puts(fs,str) fputs(str,fs)
+#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
+#define __argp_fmtstream_printf fprintf
+#define argp_fmtstream_printf fprintf
+
+#define __argp_fmtstream_lmargin line_wrap_lmargin
+#define argp_fmtstream_lmargin line_wrap_lmargin
+#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define argp_fmtstream_set_lmargin line_wrap_set_lmargin
+#define __argp_fmtstream_rmargin line_wrap_rmargin
+#define argp_fmtstream_rmargin line_wrap_rmargin
+#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define argp_fmtstream_set_rmargin line_wrap_set_rmargin
+#define __argp_fmtstream_wmargin line_wrap_wmargin
+#define argp_fmtstream_wmargin line_wrap_wmargin
+#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define argp_fmtstream_set_wmargin line_wrap_set_wmargin
+#define __argp_fmtstream_point line_wrap_point
+#define argp_fmtstream_point line_wrap_point
+
+#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */
+/* Guess we have to define our own version. */
+
+struct argp_fmtstream
+{
+ FILE *stream; /* The stream we're outputting to. */
+
+ size_t lmargin, rmargin; /* Left and right margins. */
+ ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */
+
+ /* Point in buffer to which we've processed for wrapping, but not output. */
+ size_t point_offs;
+ /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */
+ ssize_t point_col;
+
+ char *buf; /* Output buffer. */
+ char *p; /* Current end of text in BUF. */
+ char *end; /* Absolute end of BUF. */
+};
+
+typedef struct argp_fmtstream *argp_fmtstream_t;
+
+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
+ written on it with LMARGIN spaces and limits them to RMARGIN columns
+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
+ replacing the whitespace before them with a newline and WMARGIN spaces.
+ Otherwise, chars beyond RMARGIN are simply dropped until a newline.
+ Returns NULL if there was an error. */
+extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
+ size_t __lmargin,
+ size_t __rmargin,
+ ssize_t __wmargin);
+
+/* Flush __FS to its stream, and free it (but don't close the stream). */
+extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
+extern void argp_fmtstream_free (argp_fmtstream_t __fs);
+
+extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
+extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
+ const char *__fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
+
+#if _LIBC || !defined __OPTIMIZE__
+extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
+
+extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+extern int argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str);
+
+extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len);
+#endif
+
+/* Access macros for various bits of state. */
+#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
+#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
+#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+#if _LIBC || !defined __OPTIMIZE__
+/* Set __FS's left margin to LMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
+ size_t __lmargin);
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
+ size_t __rmargin);
+
+/* Set __FS's wrap margin to __WMARGIN and return the old value. */
+extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
+ size_t __wmargin);
+
+/* Return the column number of the current output point in __FS. */
+extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
+extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
+#endif
+
+/* Internal routines. */
+extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
+extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
+extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
+
+#ifdef __OPTIMIZE__
+/* Inline versions of above routines. */
+
+#if !_LIBC
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#define __argp_fmtstream_write argp_fmtstream_write
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#define __argp_fmtstream_point argp_fmtstream_point
+#define __argp_fmtstream_update _argp_fmtstream_update
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#endif
+
+#ifndef ARGP_FS_EI
+# ifdef __GNUC__
+ /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+
+ Whereas Apple GCC 4.0.1 build 5479 without -std=c99 or -std=gnu99
+ implements the GNU C inline semantics and defines the macro
+ __GNUC_GNU_INLINE__, but it does not warn and does not support
+ __attribute__ ((__gnu_inline__)).
+
+ All in all, these are the possible combinations. For every compiler,
+ we need to choose ARGP_FS_EI so that the corresponding table cell
+ contains an "ok".
+
+ \ ARGP_FS_EI inline extern extern
+ \ inline inline
+ CC \ __attribute__
+ ((gnu_inline))
+
+ gcc 4.3.0 error ok ok
+ gcc 4.3.0 -std=gnu99 -fgnu89-inline error ok ok
+ gcc 4.3.0 -std=gnu99 ok error ok
+
+ gcc 4.2.2 error ok ok
+ gcc 4.2.2 -std=gnu99 -fgnu89-inline error ok ok
+ gcc 4.2.2 -std=gnu99 error warning ok
+
+ gcc 4.1.2 error ok warning
+ gcc 4.1.2 -std=gnu99 error ok warning
+
+ Apple gcc 4.0.1 error ok warning
+ Apple gcc 4.0.1 -std=gnu99 ok error warning
+ */
+# if defined __GNUC_STDC_INLINE__
+# define ARGP_FS_EI inline
+# elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
+# define ARGP_FS_EI extern inline __attribute__ ((__gnu_inline__))
+# else
+# define ARGP_FS_EI extern inline
+# endif
+# else
+ /* With other compilers, assume the ISO C99 meaning of 'inline', if
+ the compiler supports 'inline' at all. */
+# define ARGP_FS_EI inline
+# endif
+#endif
+
+ARGP_FS_EI size_t
+__argp_fmtstream_write (argp_fmtstream_t __fs,
+ const char *__str, size_t __len)
+{
+ if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
+ {
+ memcpy (__fs->p, __str, __len);
+ __fs->p += __len;
+ return __len;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_puts (argp_fmtstream_t __fs, const char *__str)
+{
+ size_t __len = strlen (__str);
+ if (__len)
+ {
+ size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
+ return __wrote == __len ? 0 : -1;
+ }
+ else
+ return 0;
+}
+
+ARGP_FS_EI int
+__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
+{
+ if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
+ return *__fs->p++ = __ch;
+ else
+ return EOF;
+}
+
+/* Set __FS's left margin to __LMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->lmargin;
+ __fs->lmargin = __lmargin;
+ return __old;
+}
+
+/* Set __FS's right margin to __RMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->rmargin;
+ __fs->rmargin = __rmargin;
+ return __old;
+}
+
+/* Set FS's wrap margin to __WMARGIN and return the old value. */
+ARGP_FS_EI size_t
+__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
+{
+ size_t __old;
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ __old = __fs->wmargin;
+ __fs->wmargin = __wmargin;
+ return __old;
+}
+
+/* Return the column number of the current output point in __FS. */
+ARGP_FS_EI size_t
+__argp_fmtstream_point (argp_fmtstream_t __fs)
+{
+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
+ __argp_fmtstream_update (__fs);
+ return __fs->point_col >= 0 ? __fs->point_col : 0;
+}
+
+#if !_LIBC
+#undef __argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#undef __argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#undef __argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#endif
+
+#endif /* __OPTIMIZE__ */
+
+#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
+
+#endif /* argp-fmtstream.h */
diff --git a/gnulib/lib/argp-fs-xinl.c b/gnulib/lib/argp-fs-xinl.c
new file mode 100644
index 0000000..8dd679c
--- /dev/null
+++ b/gnulib/lib/argp-fs-xinl.c
@@ -0,0 +1,42 @@
+/* Real definitions for extern inline functions in argp-fmtstream.h
+ Copyright (C) 1997, 2003-2004, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define ARGP_FS_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp-fmtstream.h"
+
+#if 0
+/* Not exported. */
+/* Add weak aliases. */
+#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias)
+
+weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc)
+weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts)
+weak_alias (__argp_fmtstream_write, argp_fmtstream_write)
+weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin)
+weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin)
+weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin)
+weak_alias (__argp_fmtstream_point, argp_fmtstream_point)
+
+#endif
+#endif
diff --git a/gnulib/lib/argp-help.c b/gnulib/lib/argp-help.c
new file mode 100644
index 0000000..ec7fcda
--- /dev/null
+++ b/gnulib/lib/argp-help.c
@@ -0,0 +1,1954 @@
+/* Hierarchial argument parsing help output
+ Copyright (C) 1995-2005, 2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+
+#include "argp.h"
+#include "argp-fmtstream.h"
+#include "argp-namefrob.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* User-selectable (using an environment variable) formatting parameters.
+
+ These may be specified in an environment variable called `ARGP_HELP_FMT',
+ with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
+ Where VALn must be a positive integer. The list of variables is in the
+ UPARAM_NAMES vector, below. */
+
+/* Default parameters. */
+#define DUP_ARGS 0 /* True if option argument can be duplicated. */
+#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */
+#define SHORT_OPT_COL 2 /* column in which short options start */
+#define LONG_OPT_COL 6 /* column in which long options start */
+#define DOC_OPT_COL 2 /* column in which doc options start */
+#define OPT_DOC_COL 29 /* column in which option text starts */
+#define HEADER_COL 1 /* column in which group headers are printed */
+#define USAGE_INDENT 12 /* indentation of wrapped usage lines */
+#define RMARGIN 79 /* right margin used for wrapping */
+
+/* User-selectable (using an environment variable) formatting parameters.
+ They must all be of type `int' for the parsing code to work. */
+struct uparams
+{
+ /* If true, arguments for an option are shown with both short and long
+ options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.
+ If false, then if an option has both, the argument is only shown with
+ the long one, e.g., `-x, --longx=ARG', and a message indicating that
+ this really means both is printed below the options. */
+ int dup_args;
+
+ /* This is true if when DUP_ARGS is false, and some duplicate arguments have
+ been suppressed, an explanatory message should be printed. */
+ int dup_args_note;
+
+ /* Various output columns. */
+ int short_opt_col; /* column in which short options start */
+ int long_opt_col; /* column in which long options start */
+ int doc_opt_col; /* column in which doc options start */
+ int opt_doc_col; /* column in which option text starts */
+ int header_col; /* column in which group headers are printed */
+ int usage_indent; /* indentation of wrapped usage lines */
+ int rmargin; /* right margin used for wrapping */
+
+ int valid; /* True when the values in here are valid. */
+};
+
+/* This is a global variable, as user options are only ever read once. */
+static struct uparams uparams = {
+ DUP_ARGS, DUP_ARGS_NOTE,
+ SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,
+ USAGE_INDENT, RMARGIN,
+ 0
+};
+
+/* A particular uparam, and what the user name is. */
+struct uparam_name
+{
+ const char *name; /* User name. */
+ int is_bool; /* Whether it's `boolean'. */
+ size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
+};
+
+/* The name-field mappings we know about. */
+static const struct uparam_name uparam_names[] =
+{
+ { "dup-args", 1, offsetof (struct uparams, dup_args) },
+ { "dup-args-note", 1, offsetof (struct uparams, dup_args_note) },
+ { "short-opt-col", 0, offsetof (struct uparams, short_opt_col) },
+ { "long-opt-col", 0, offsetof (struct uparams, long_opt_col) },
+ { "doc-opt-col", 0, offsetof (struct uparams, doc_opt_col) },
+ { "opt-doc-col", 0, offsetof (struct uparams, opt_doc_col) },
+ { "header-col", 0, offsetof (struct uparams, header_col) },
+ { "usage-indent", 0, offsetof (struct uparams, usage_indent) },
+ { "rmargin", 0, offsetof (struct uparams, rmargin) },
+ { 0 }
+};
+
+static void
+validate_uparams (const struct argp_state *state, struct uparams *upptr)
+{
+ const struct uparam_name *up;
+
+ for (up = uparam_names; up->name; up++)
+ {
+ if (up->is_bool
+ || up->uparams_offs == offsetof (struct uparams, rmargin))
+ continue;
+ if (*(int *)((char *)upptr + up->uparams_offs) >= upptr->rmargin)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+ARGP_HELP_FMT: %s value is less than or equal to %s"),
+ "rmargin", up->name);
+ return;
+ }
+ }
+ uparams = *upptr;
+ uparams.valid = 1;
+}
+
+/* Read user options from the environment, and fill in UPARAMS appropiately. */
+static void
+fill_in_uparams (const struct argp_state *state)
+{
+ const char *var = getenv ("ARGP_HELP_FMT");
+ struct uparams new_params = uparams;
+
+#define SKIPWS(p) do { while (isspace ((unsigned char) *p)) p++; } while (0);
+
+ if (var)
+ {
+ /* Parse var. */
+ while (*var)
+ {
+ SKIPWS (var);
+
+ if (isalpha ((unsigned char) *var))
+ {
+ size_t var_len;
+ const struct uparam_name *un;
+ int unspec = 0, val = 0;
+ const char *arg = var;
+
+ while (isalnum ((unsigned char) *arg) || *arg == '-' || *arg == '_')
+ arg++;
+ var_len = arg - var;
+
+ SKIPWS (arg);
+
+ if (*arg == '\0' || *arg == ',')
+ unspec = 1;
+ else if (*arg == '=')
+ {
+ arg++;
+ SKIPWS (arg);
+ }
+
+ if (unspec)
+ {
+ if (var[0] == 'n' && var[1] == 'o' && var[2] == '-')
+ {
+ val = 0;
+ var += 3;
+ var_len -= 3;
+ }
+ else
+ val = 1;
+ }
+ else if (isdigit ((unsigned char) *arg))
+ {
+ val = atoi (arg);
+ while (isdigit ((unsigned char) *arg))
+ arg++;
+ SKIPWS (arg);
+ }
+
+ for (un = uparam_names; un->name; un++)
+ if (strlen (un->name) == var_len
+ && strncmp (var, un->name, var_len) == 0)
+ {
+ if (unspec && !un->is_bool)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter requires a value"),
+ (int) var_len, var);
+ else if (val < 0)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "\
+%.*s: ARGP_HELP_FMT parameter must be positive"),
+ (int) var_len, var);
+ else
+ *(int *)((char *)&new_params + un->uparams_offs) = val;
+ break;
+ }
+ if (! un->name)
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain, "\
+%.*s: Unknown ARGP_HELP_FMT parameter"),
+ (int) var_len, var);
+
+ var = arg;
+ if (*var == ',')
+ var++;
+ }
+ else if (*var)
+ {
+ __argp_failure (state, 0, 0,
+ dgettext (state->root_argp->argp_domain,
+ "Garbage in ARGP_HELP_FMT: %s"), var);
+ break;
+ }
+ }
+ validate_uparams (state, &new_params);
+ }
+}
+
+/* Returns true if OPT hasn't been marked invisible. Visibility only affects
+ whether OPT is displayed or used in sorting, not option shadowing. */
+#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN))
+
+/* Returns true if OPT is an alias for an earlier option. */
+#define oalias(opt) ((opt)->flags & OPTION_ALIAS)
+
+/* Returns true if OPT is a documentation-only entry. */
+#define odoc(opt) ((opt)->flags & OPTION_DOC)
+
+/* Returns true if OPT should not be translated */
+#define onotrans(opt) ((opt)->flags & OPTION_NO_TRANS)
+
+/* Returns true if OPT is the end-of-list marker for a list of options. */
+#define oend(opt) __option_is_end (opt)
+
+/* Returns true if OPT has a short option. */
+#define oshort(opt) __option_is_short (opt)
+
+/*
+ The help format for a particular option is like:
+
+ -xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
+
+ Where ARG will be omitted if there's no argument, for this option, or
+ will be surrounded by "[" and "]" appropiately if the argument is
+ optional. The documentation string is word-wrapped appropiately, and if
+ the list of options is long enough, it will be started on a separate line.
+ If there are no short options for a given option, the first long option is
+ indented slighly in a way that's supposed to make most long options appear
+ to be in a separate column.
+
+ For example, the following output (from ps):
+
+ -p PID, --pid=PID List the process PID
+ --pgrp=PGRP List processes in the process group PGRP
+ -P, -x, --no-parent Include processes without parents
+ -Q, --all-fields Don't elide unusable fields (normally if there's
+ some reason ps can't print a field for any
+ process, it's removed from the output entirely)
+ -r, --reverse, --gratuitously-long-reverse-option
+ Reverse the order of any sort
+ --session[=SID] Add the processes from the session SID (which
+ defaults to the sid of the current process)
+
+ Here are some more options:
+ -f ZOT, --foonly=ZOT Glork a foonly
+ -z, --zaza Snit a zar
+
+ -?, --help Give this help list
+ --usage Give a short usage message
+ -V, --version Print program version
+
+ The struct argp_option array for the above could look like:
+
+ {
+ {"pid", 'p', "PID", 0, "List the process PID"},
+ {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},
+ {"no-parent", 'P', 0, 0, "Include processes without parents"},
+ {0, 'x', 0, OPTION_ALIAS},
+ {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally"
+ " if there's some reason ps can't"
+ " print a field for any process, it's"
+ " removed from the output entirely)" },
+ {"reverse", 'r', 0, 0, "Reverse the order of any sort"},
+ {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},
+ {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL,
+ "Add the processes from the session"
+ " SID (which defaults to the sid of"
+ " the current process)" },
+
+ {0,0,0,0, "Here are some more options:"},
+ {"foonly", 'f', "ZOT", 0, "Glork a foonly"},
+ {"zaza", 'z', 0, 0, "Snit a zar"},
+
+ {0}
+ }
+
+ Note that the last three options are automatically supplied by argp_parse,
+ unless you tell it not to with ARGP_NO_HELP.
+
+*/
+
+/* Returns true if CH occurs between BEG and END. */
+static int
+find_char (char ch, char *beg, char *end)
+{
+ while (beg < end)
+ if (*beg == ch)
+ return 1;
+ else
+ beg++;
+ return 0;
+}
+
+struct hol_cluster; /* fwd decl */
+
+struct hol_entry
+{
+ /* First option. */
+ const struct argp_option *opt;
+ /* Number of options (including aliases). */
+ unsigned num;
+
+ /* A pointers into the HOL's short_options field, to the first short option
+ letter for this entry. The order of the characters following this point
+ corresponds to the order of options pointed to by OPT, and there are at
+ most NUM. A short option recorded in an option following OPT is only
+ valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
+ probably been shadowed by some other entry). */
+ char *short_options;
+
+ /* Entries are sorted by their group first, in the order:
+ 1, 2, ..., n, 0, -m, ..., -2, -1
+ and then alphabetically within each group. The default is 0. */
+ int group;
+
+ /* The cluster of options this entry belongs to, or 0 if none. */
+ struct hol_cluster *cluster;
+
+ /* The argp from which this option came. */
+ const struct argp *argp;
+
+ /* Position in the array */
+ unsigned ord;
+};
+
+/* A cluster of entries to reflect the argp tree structure. */
+struct hol_cluster
+{
+ /* A descriptive header printed before options in this cluster. */
+ const char *header;
+
+ /* Used to order clusters within the same group with the same parent,
+ according to the order in which they occurred in the parent argp's child
+ list. */
+ int index;
+
+ /* How to sort this cluster with respect to options and other clusters at the
+ same depth (clusters always follow options in the same group). */
+ int group;
+
+ /* The cluster to which this cluster belongs, or 0 if it's at the base
+ level. */
+ struct hol_cluster *parent;
+
+ /* The argp from which this cluster is (eventually) derived. */
+ const struct argp *argp;
+
+ /* The distance this cluster is from the root. */
+ int depth;
+
+ /* Clusters in a given hol are kept in a linked list, to make freeing them
+ possible. */
+ struct hol_cluster *next;
+};
+
+/* A list of options for help. */
+struct hol
+{
+ /* An array of hol_entry's. */
+ struct hol_entry *entries;
+ /* The number of entries in this hol. If this field is zero, the others
+ are undefined. */
+ unsigned num_entries;
+
+ /* A string containing all short options in this HOL. Each entry contains
+ pointers into this string, so the order can't be messed with blindly. */
+ char *short_options;
+
+ /* Clusters of entries in this hol. */
+ struct hol_cluster *clusters;
+};
+
+/* Create a struct hol from the options in ARGP. CLUSTER is the
+ hol_cluster in which these entries occur, or 0, if at the root. */
+static struct hol *
+make_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ char *so;
+ const struct argp_option *o;
+ const struct argp_option *opts = argp->options;
+ struct hol_entry *entry;
+ unsigned num_short_options = 0;
+ struct hol *hol = malloc (sizeof (struct hol));
+
+ assert (hol);
+
+ hol->num_entries = 0;
+ hol->clusters = 0;
+
+ if (opts)
+ {
+ int cur_group = 0;
+
+ /* The first option must not be an alias. */
+ assert (! oalias (opts));
+
+ /* Calculate the space needed. */
+ for (o = opts; ! oend (o); o++)
+ {
+ if (! oalias (o))
+ hol->num_entries++;
+ if (oshort (o))
+ num_short_options++; /* This is an upper bound. */
+ }
+
+ hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries);
+ hol->short_options = malloc (num_short_options + 1);
+
+ assert (hol->entries && hol->short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ /* Fill in the entries. */
+ so = hol->short_options;
+ for (o = opts, entry = hol->entries; ! oend (o); entry++)
+ {
+ entry->opt = o;
+ entry->num = 0;
+ entry->short_options = so;
+ entry->group = cur_group =
+ o->group
+ ? o->group
+ : ((!o->name && !o->key)
+ ? cur_group + 1
+ : cur_group);
+ entry->cluster = cluster;
+ entry->argp = argp;
+
+ do
+ {
+ entry->num++;
+ if (oshort (o) && ! find_char (o->key, hol->short_options, so))
+ /* O has a valid short option which hasn't already been used.*/
+ *so++ = o->key;
+ o++;
+ }
+ while (! oend (o) && oalias (o));
+ }
+ *so = '\0'; /* null terminated so we can find the length */
+ }
+
+ return hol;
+}
+
+/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the
+ associated argp child list entry), INDEX, and PARENT, and return a pointer
+ to it. ARGP is the argp that this cluster results from. */
+static struct hol_cluster *
+hol_add_cluster (struct hol *hol, int group, const char *header, int index,
+ struct hol_cluster *parent, const struct argp *argp)
+{
+ struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));
+ if (cl)
+ {
+ cl->group = group;
+ cl->header = header;
+
+ cl->index = index;
+ cl->parent = parent;
+ cl->argp = argp;
+ cl->depth = parent ? parent->depth + 1 : 0;
+
+ cl->next = hol->clusters;
+ hol->clusters = cl;
+ }
+ return cl;
+}
+
+/* Free HOL and any resources it uses. */
+static void
+hol_free (struct hol *hol)
+{
+ struct hol_cluster *cl = hol->clusters;
+
+ while (cl)
+ {
+ struct hol_cluster *next = cl->next;
+ free (cl);
+ cl = next;
+ }
+
+ if (hol->num_entries > 0)
+ {
+ free (hol->entries);
+ free (hol->short_options);
+ }
+
+ free (hol);
+}
+
+static int
+hol_entry_short_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+ char *so = entry->short_options;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (oshort (opt) && *so == opt->key)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ so++;
+ }
+
+ return val;
+}
+
+static inline int
+#if __GNUC__ >= 3
+__attribute__ ((always_inline))
+#endif
+hol_entry_long_iterate (const struct hol_entry *entry,
+ int (*func)(const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie),
+ const char *domain, void *cookie)
+{
+ unsigned nopts;
+ int val = 0;
+ const struct argp_option *opt, *real = entry->opt;
+
+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--)
+ if (opt->name)
+ {
+ if (!oalias (opt))
+ real = opt;
+ if (ovisible (opt))
+ val = (*func)(opt, real, domain, cookie);
+ }
+
+ return val;
+}
+
+/* Iterator that returns true for the first short option. */
+static int
+until_short (const struct argp_option *opt, const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ return oshort (opt) ? opt->key : 0;
+}
+
+/* Returns the first valid short option in ENTRY, or 0 if there is none. */
+static char
+hol_entry_first_short (const struct hol_entry *entry)
+{
+ return hol_entry_short_iterate (entry, until_short,
+ entry->argp->argp_domain, 0);
+}
+
+/* Returns the first valid long option in ENTRY, or 0 if there is none. */
+static const char *
+hol_entry_first_long (const struct hol_entry *entry)
+{
+ const struct argp_option *opt;
+ unsigned num;
+ for (opt = entry->opt, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ return opt->name;
+ return 0;
+}
+
+/* Returns the entry in HOL with the long option name NAME, or 0 if there is
+ none. */
+static struct hol_entry *
+hol_find_entry (struct hol *hol, const char *name)
+{
+ struct hol_entry *entry = hol->entries;
+ unsigned num_entries = hol->num_entries;
+
+ while (num_entries-- > 0)
+ {
+ const struct argp_option *opt = entry->opt;
+ unsigned num_opts = entry->num;
+
+ while (num_opts-- > 0)
+ if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0)
+ return entry;
+ else
+ opt++;
+
+ entry++;
+ }
+
+ return 0;
+}
+
+/* If an entry with the long option NAME occurs in HOL, set it's special
+ sort position to GROUP. */
+static void
+hol_set_group (struct hol *hol, const char *name, int group)
+{
+ struct hol_entry *entry = hol_find_entry (hol, name);
+ if (entry)
+ entry->group = group;
+}
+
+/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1.
+ EQ is what to return if GROUP1 and GROUP2 are the same. */
+static int
+group_cmp (int group1, int group2, int eq)
+{
+ if (group1 == group2)
+ return eq;
+ else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0))
+ return group1 - group2;
+ else
+ return group2 - group1;
+}
+
+/* Compare clusters CL1 & CL2 by the order that they should appear in
+ output. */
+static int
+hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)
+{
+ /* If one cluster is deeper than the other, use its ancestor at the same
+ level, so that finding the common ancestor is straightforward.
+
+ clN->depth > 0 means that clN->parent != NULL (see hol_add_cluster) */
+ while (cl1->depth > cl2->depth)
+ cl1 = cl1->parent;
+ while (cl2->depth > cl1->depth)
+ cl2 = cl2->parent;
+
+ /* Now reduce both clusters to their ancestors at the point where both have
+ a common parent; these can be directly compared. */
+ while (cl1->parent != cl2->parent)
+ cl1 = cl1->parent, cl2 = cl2->parent;
+
+ return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index);
+}
+
+/* Return the ancestor of CL that's just below the root (i.e., has a parent
+ of 0). */
+static struct hol_cluster *
+hol_cluster_base (struct hol_cluster *cl)
+{
+ while (cl->parent)
+ cl = cl->parent;
+ return cl;
+}
+
+/* Return true if CL1 is a child of CL2. */
+static int
+hol_cluster_is_child (const struct hol_cluster *cl1,
+ const struct hol_cluster *cl2)
+{
+ while (cl1 && cl1 != cl2)
+ cl1 = cl1->parent;
+ return cl1 == cl2;
+}
+
+/* Given the name of an OPTION_DOC option, modifies NAME to start at the tail
+ that should be used for comparisons, and returns true iff it should be
+ treated as a non-option. */
+static int
+canon_doc_option (const char **name)
+{
+ int non_opt;
+
+ if (!*name)
+ non_opt = 1;
+ else
+ {
+ /* Skip initial whitespace. */
+ while (isspace ((unsigned char) **name))
+ (*name)++;
+ /* Decide whether this looks like an option (leading `-') or not. */
+ non_opt = (**name != '-');
+ /* Skip until part of name used for sorting. */
+ while (**name && !isalnum ((unsigned char) **name))
+ (*name)++;
+ }
+ return non_opt;
+}
+
+#define HOL_ENTRY_PTRCMP(a,b) ((a)->ord < (b)->ord ? -1 : 1)
+
+/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help
+ listing. */
+static int
+hol_entry_cmp (const struct hol_entry *entry1,
+ const struct hol_entry *entry2)
+{
+ /* The group numbers by which the entries should be ordered; if either is
+ in a cluster, then this is just the group within the cluster. */
+ int group1 = entry1->group, group2 = entry2->group;
+ int rc;
+
+ if (entry1->cluster != entry2->cluster)
+ {
+ /* The entries are not within the same cluster, so we can't compare them
+ directly, we have to use the appropiate clustering level too. */
+ if (! entry1->cluster)
+ /* ENTRY1 is at the `base level', not in a cluster, so we have to
+ compare it's group number with that of the base cluster in which
+ ENTRY2 resides. Note that if they're in the same group, the
+ clustered option always comes laster. */
+ return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1);
+ else if (! entry2->cluster)
+ /* Likewise, but ENTRY2's not in a cluster. */
+ return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1);
+ else
+ /* Both entries are in clusters, we can just compare the clusters. */
+ return (rc = hol_cluster_cmp (entry1->cluster, entry2->cluster)) ?
+ rc : HOL_ENTRY_PTRCMP (entry1, entry2);
+ }
+ else if (group1 == group2)
+ /* The entries are both in the same cluster and group, so compare them
+ alphabetically. */
+ {
+ int short1 = hol_entry_first_short (entry1);
+ int short2 = hol_entry_first_short (entry2);
+ int doc1 = odoc (entry1->opt);
+ int doc2 = odoc (entry2->opt);
+ const char *long1 = hol_entry_first_long (entry1);
+ const char *long2 = hol_entry_first_long (entry2);
+
+ if (doc1)
+ doc1 = canon_doc_option (&long1);
+ if (doc2)
+ doc2 = canon_doc_option (&long2);
+
+ if (doc1 != doc2)
+ /* `documentation' options always follow normal options (or
+ documentation options that *look* like normal options). */
+ return doc1 - doc2;
+ else if (!short1 && !short2 && long1 && long2)
+ /* Only long options. */
+ return (rc = __strcasecmp (long1, long2)) ?
+ rc : HOL_ENTRY_PTRCMP (entry1, entry2);
+ else
+ /* Compare short/short, long/short, short/long, using the first
+ character of long options. Entries without *any* valid
+ options (such as options with OPTION_HIDDEN set) will be put
+ first, but as they're not displayed, it doesn't matter where
+ they are. */
+ {
+ unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0;
+ unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0;
+ /* Use tolower, not _tolower, since only the former is
+ guaranteed to work on something already lower case. */
+ int lower_cmp = tolower (first1) - tolower (first2);
+ /* Compare ignoring case, except when the options are both the
+ same letter, in which case lower-case always comes first. */
+ return lower_cmp ? lower_cmp :
+ (rc = first2 - first1) ?
+ rc : HOL_ENTRY_PTRCMP (entry1, entry2);
+ }
+ }
+ else
+ /* Within the same cluster, but not the same group, so just compare
+ groups. */
+ return group_cmp (group1, group2, HOL_ENTRY_PTRCMP (entry1, entry2));
+}
+
+/* Version of hol_entry_cmp with correct signature for qsort. */
+static int
+hol_entry_qcmp (const void *entry1_v, const void *entry2_v)
+{
+ return hol_entry_cmp (entry1_v, entry2_v);
+}
+
+/* Sort HOL by group and alphabetically by option name (with short options
+ taking precedence over long). Since the sorting is for display purposes
+ only, the shadowing of options isn't effected. */
+static void
+hol_sort (struct hol *hol)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned i;
+ struct hol_entry *e;
+ for (i = 0, e = hol->entries; i < hol->num_entries; i++, e++)
+ e->ord = i;
+ qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry),
+ hol_entry_qcmp);
+ }
+}
+
+/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow
+ any in MORE with the same name. */
+static void
+hol_append (struct hol *hol, struct hol *more)
+{
+ struct hol_cluster **cl_end = &hol->clusters;
+
+ /* Steal MORE's cluster list, and add it to the end of HOL's. */
+ while (*cl_end)
+ cl_end = &(*cl_end)->next;
+ *cl_end = more->clusters;
+ more->clusters = 0;
+
+ /* Merge entries. */
+ if (more->num_entries > 0)
+ {
+ if (hol->num_entries == 0)
+ {
+ hol->num_entries = more->num_entries;
+ hol->entries = more->entries;
+ hol->short_options = more->short_options;
+ more->num_entries = 0; /* Mark MORE's fields as invalid. */
+ }
+ else
+ /* Append the entries in MORE to those in HOL, taking care to only add
+ non-shadowed SHORT_OPTIONS values. */
+ {
+ unsigned left;
+ char *so, *more_so;
+ struct hol_entry *e;
+ unsigned num_entries = hol->num_entries + more->num_entries;
+ struct hol_entry *entries =
+ malloc (num_entries * sizeof (struct hol_entry));
+ unsigned hol_so_len = strlen (hol->short_options);
+ char *short_options =
+ malloc (hol_so_len + strlen (more->short_options) + 1);
+
+ assert (entries && short_options);
+ if (SIZE_MAX <= UINT_MAX)
+ assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry));
+
+ __mempcpy (__mempcpy (entries, hol->entries,
+ hol->num_entries * sizeof (struct hol_entry)),
+ more->entries,
+ more->num_entries * sizeof (struct hol_entry));
+
+ __mempcpy (short_options, hol->short_options, hol_so_len);
+
+ /* Fix up the short options pointers from HOL. */
+ for (e = entries, left = hol->num_entries; left > 0; e++, left--)
+ e->short_options =
+ short_options + (e->short_options - hol->short_options);
+
+ /* Now add the short options from MORE, fixing up its entries
+ too. */
+ so = short_options + hol_so_len;
+ more_so = more->short_options;
+ for (left = more->num_entries; left > 0; e++, left--)
+ {
+ int opts_left;
+ const struct argp_option *opt;
+
+ e->short_options = so;
+
+ for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--)
+ {
+ int ch = *more_so;
+ if (oshort (opt) && ch == opt->key)
+ /* The next short option in MORE_SO, CH, is from OPT. */
+ {
+ if (! find_char (ch, short_options,
+ short_options + hol_so_len))
+ /* The short option CH isn't shadowed by HOL's options,
+ so add it to the sum. */
+ *so++ = ch;
+ more_so++;
+ }
+ }
+ }
+
+ *so = '\0';
+
+ free (hol->entries);
+ free (hol->short_options);
+
+ hol->entries = entries;
+ hol->num_entries = num_entries;
+ hol->short_options = short_options;
+ }
+ }
+
+ hol_free (more);
+}
+
+/* Inserts enough spaces to make sure STREAM is at column COL. */
+static void
+indent_to (argp_fmtstream_t stream, unsigned col)
+{
+ int needed = col - __argp_fmtstream_point (stream);
+ while (needed-- > 0)
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* Output to STREAM either a space, or a newline if there isn't room for at
+ least ENSURE characters before the right margin. */
+static void
+space (argp_fmtstream_t stream, size_t ensure)
+{
+ if (__argp_fmtstream_point (stream) + ensure
+ >= __argp_fmtstream_rmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ else
+ __argp_fmtstream_putc (stream, ' ');
+}
+
+/* If the option REAL has an argument, we print it in using the printf
+ format REQ_FMT or OPT_FMT depending on whether it's a required or
+ optional argument. */
+static void
+arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,
+ const char *domain, argp_fmtstream_t stream)
+{
+ if (real->arg)
+ {
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, opt_fmt,
+ dgettext (domain, real->arg));
+ else
+ __argp_fmtstream_printf (stream, req_fmt,
+ dgettext (domain, real->arg));
+ }
+}
+
+/* Helper functions for hol_entry_help. */
+
+/* State used during the execution of hol_help. */
+struct hol_help_state
+{
+ /* PREV_ENTRY should contain the previous entry printed, or 0. */
+ struct hol_entry *prev_entry;
+
+ /* If an entry is in a different group from the previous one, and SEP_GROUPS
+ is true, then a blank line will be printed before any output. */
+ int sep_groups;
+
+ /* True if a duplicate option argument was suppressed (only ever set if
+ UPARAMS.dup_args is false). */
+ int suppressed_dup_arg;
+};
+
+/* Some state used while printing a help entry (used to communicate with
+ helper functions). See the doc for hol_entry_help for more info, as most
+ of the fields are copied from its arguments. */
+struct pentry_state
+{
+ const struct hol_entry *entry;
+ argp_fmtstream_t stream;
+ struct hol_help_state *hhstate;
+
+ /* True if nothing's been printed so far. */
+ int first;
+
+ /* If non-zero, the state that was used to print this help. */
+ const struct argp_state *state;
+};
+
+/* If a user doc filter should be applied to DOC, do so. */
+static const char *
+filter_doc (const char *doc, int key, const struct argp *argp,
+ const struct argp_state *state)
+{
+ if (argp->help_filter)
+ /* We must apply a user filter to this output. */
+ {
+ void *input = __argp_input (argp, state);
+ return (*argp->help_filter) (key, doc, input);
+ }
+ else
+ /* No filter. */
+ return doc;
+}
+
+/* Prints STR as a header line, with the margin lines set appropiately, and
+ notes the fact that groups should be separated with a blank line. ARGP is
+ the argp that should dictate any user doc filtering to take place. Note
+ that the previous wrap margin isn't restored, but the left margin is reset
+ to 0. */
+static void
+print_header (const char *str, const struct argp *argp,
+ struct pentry_state *pest)
+{
+ const char *tstr = dgettext (argp->argp_domain, str);
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state);
+
+ if (fstr)
+ {
+ if (*fstr)
+ {
+ if (pest->hhstate->prev_entry)
+ /* Precede with a blank line. */
+ __argp_fmtstream_putc (pest->stream, '\n');
+ indent_to (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col);
+ __argp_fmtstream_puts (pest->stream, fstr);
+ __argp_fmtstream_set_lmargin (pest->stream, 0);
+ __argp_fmtstream_putc (pest->stream, '\n');
+ }
+
+ pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */
+ }
+
+ if (fstr != tstr)
+ free ((char *) fstr);
+}
+
+/* Inserts a comma if this isn't the first item on the line, and then makes
+ sure we're at least to column COL. If this *is* the first item on a line,
+ prints any pending whitespace/headers that should precede this line. Also
+ clears FIRST. */
+static void
+comma (unsigned col, struct pentry_state *pest)
+{
+ if (pest->first)
+ {
+ const struct hol_entry *pe = pest->hhstate->prev_entry;
+ const struct hol_cluster *cl = pest->entry->cluster;
+
+ if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group)
+ __argp_fmtstream_putc (pest->stream, '\n');
+
+ if (cl && cl->header && *cl->header
+ && (!pe
+ || (pe->cluster != cl
+ && !hol_cluster_is_child (pe->cluster, cl))))
+ /* If we're changing clusters, then this must be the start of the
+ ENTRY's cluster unless that is an ancestor of the previous one
+ (in which case we had just popped into a sub-cluster for a bit).
+ If so, then print the cluster's header line. */
+ {
+ int old_wm = __argp_fmtstream_wmargin (pest->stream);
+ print_header (cl->header, cl->argp, pest);
+ __argp_fmtstream_set_wmargin (pest->stream, old_wm);
+ }
+
+ pest->first = 0;
+ }
+ else
+ __argp_fmtstream_puts (pest->stream, ", ");
+
+ indent_to (pest->stream, col);
+}
+
+/* Print help for ENTRY to STREAM. */
+static void
+hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
+ argp_fmtstream_t stream, struct hol_help_state *hhstate)
+{
+ unsigned num;
+ const struct argp_option *real = entry->opt, *opt;
+ char *so = entry->short_options;
+ int have_long_opt = 0; /* We have any long options. */
+ /* Saved margins. */
+ int old_lm = __argp_fmtstream_set_lmargin (stream, 0);
+ int old_wm = __argp_fmtstream_wmargin (stream);
+ /* PEST is a state block holding some of our variables that we'd like to
+ share with helper functions. */
+ struct pentry_state pest;
+
+ pest.entry = entry;
+ pest.stream = stream;
+ pest.hhstate = hhstate;
+ pest.first = 1;
+ pest.state = state;
+
+ if (! odoc (real))
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ have_long_opt = 1;
+ break;
+ }
+
+ /* First emit short options. */
+ __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (oshort (opt) && opt->key == *so)
+ /* OPT has a valid (non shadowed) short option. */
+ {
+ if (ovisible (opt))
+ {
+ comma (uparams.short_opt_col, &pest);
+ __argp_fmtstream_putc (stream, '-');
+ __argp_fmtstream_putc (stream, *so);
+ if (!have_long_opt || uparams.dup_args)
+ arg (real, " %s", "[%s]", state->root_argp->argp_domain, stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ so++;
+ }
+
+ /* Now, long options. */
+ if (odoc (real))
+ /* A `documentation' option. */
+ {
+ __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && *opt->name && ovisible (opt))
+ {
+ comma (uparams.doc_opt_col, &pest);
+ /* Calling dgettext here isn't quite right, since sorting will
+ have been done on the original; but documentation options
+ should be pretty rare anyway... */
+ __argp_fmtstream_puts (stream,
+ onotrans (opt) ?
+ opt->name :
+ dgettext (state->root_argp->argp_domain,
+ opt->name));
+ }
+ }
+ else
+ /* A real long option. */
+ {
+ int first_long_opt = 1;
+
+ __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);
+ for (opt = real, num = entry->num; num > 0; opt++, num--)
+ if (opt->name && ovisible (opt))
+ {
+ comma (uparams.long_opt_col, &pest);
+ __argp_fmtstream_printf (stream, "--%s", opt->name);
+ if (first_long_opt || uparams.dup_args)
+ arg (real, "=%s", "[=%s]", state->root_argp->argp_domain,
+ stream);
+ else if (real->arg)
+ hhstate->suppressed_dup_arg = 1;
+ }
+ }
+
+ /* Next, documentation strings. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+
+ if (pest.first)
+ {
+ /* Didn't print any switches, what's up? */
+ if (!oshort (real) && !real->name)
+ /* This is a group header, print it nicely. */
+ print_header (real->doc, entry->argp, &pest);
+ else
+ /* Just a totally shadowed option or null header; print nothing. */
+ goto cleanup; /* Just return, after cleaning up. */
+ }
+ else
+ {
+ const char *tstr = real->doc ? dgettext (state->root_argp->argp_domain,
+ real->doc) : 0;
+ const char *fstr = filter_doc (tstr, real->key, entry->argp, state);
+ if (fstr && *fstr)
+ {
+ unsigned int col = __argp_fmtstream_point (stream);
+
+ __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);
+ __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);
+
+ if (col > (unsigned int) (uparams.opt_doc_col + 3))
+ __argp_fmtstream_putc (stream, '\n');
+ else if (col >= (unsigned int) uparams.opt_doc_col)
+ __argp_fmtstream_puts (stream, " ");
+ else
+ indent_to (stream, uparams.opt_doc_col);
+
+ __argp_fmtstream_puts (stream, fstr);
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+
+ /* Reset the left margin. */
+ __argp_fmtstream_set_lmargin (stream, 0);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+
+ hhstate->prev_entry = entry;
+
+cleanup:
+ __argp_fmtstream_set_lmargin (stream, old_lm);
+ __argp_fmtstream_set_wmargin (stream, old_wm);
+}
+
+/* Output a long help message about the options in HOL to STREAM. */
+static void
+hol_help (struct hol *hol, const struct argp_state *state,
+ argp_fmtstream_t stream)
+{
+ unsigned num;
+ struct hol_entry *entry;
+ struct hol_help_state hhstate = { 0, 0, 0 };
+
+ for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--)
+ hol_entry_help (entry, state, stream, &hhstate);
+
+ if (hhstate.suppressed_dup_arg && uparams.dup_args_note)
+ {
+ const char *tstr = dgettext (state->root_argp->argp_domain, "\
+Mandatory or optional arguments to long options are also mandatory or \
+optional for any corresponding short options.");
+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,
+ state ? state->root_argp : 0, state);
+ if (fstr && *fstr)
+ {
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, fstr);
+ __argp_fmtstream_putc (stream, '\n');
+ }
+ if (fstr && fstr != tstr)
+ free ((char *) fstr);
+ }
+}
+
+/* Helper functions for hol_usage. */
+
+/* If OPT is a short option without an arg, append its key to the string
+ pointer pointer to by COOKIE, and advance the pointer. */
+static int
+add_argless_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ char **snao_end = cookie;
+ if (!(opt->arg || real->arg)
+ && !((opt->flags | real->flags) & OPTION_NO_USAGE))
+ *(*snao_end)++ = opt->key;
+ return 0;
+}
+
+/* If OPT is a short option with an arg, output a usage entry for it to the
+ stream pointed at by COOKIE. */
+static int
+usage_argful_short_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (arg && !(flags & OPTION_NO_USAGE))
+ {
+ arg = dgettext (domain, arg);
+
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg);
+ else
+ {
+ /* Manually do line wrapping so that it (probably) won't
+ get wrapped at the embedded space. */
+ space (stream, 6 + strlen (arg));
+ __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg);
+ }
+ }
+
+ return 0;
+}
+
+/* Output a usage entry for the long option opt to the stream pointed at by
+ COOKIE. */
+static int
+usage_long_opt (const struct argp_option *opt,
+ const struct argp_option *real,
+ const char *domain, void *cookie)
+{
+ argp_fmtstream_t stream = cookie;
+ const char *arg = opt->arg;
+ int flags = opt->flags | real->flags;
+
+ if (! arg)
+ arg = real->arg;
+
+ if (! (flags & OPTION_NO_USAGE) && !odoc (opt))
+ {
+ if (arg)
+ {
+ arg = dgettext (domain, arg);
+ if (flags & OPTION_ARG_OPTIONAL)
+ __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg);
+ else
+ __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg);
+ }
+ else
+ __argp_fmtstream_printf (stream, " [--%s]", opt->name);
+ }
+
+ return 0;
+}
+
+/* Print a short usage description for the arguments in HOL to STREAM. */
+static void
+hol_usage (struct hol *hol, argp_fmtstream_t stream)
+{
+ if (hol->num_entries > 0)
+ {
+ unsigned nentries;
+ struct hol_entry *entry;
+ char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1);
+ char *snao_end = short_no_arg_opts;
+
+ /* First we put a list of short options without arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, add_argless_short_opt,
+ entry->argp->argp_domain, &snao_end);
+ if (snao_end > short_no_arg_opts)
+ {
+ *snao_end++ = 0;
+ __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);
+ }
+
+ /* Now a list of short options *with* arguments. */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_short_iterate (entry, usage_argful_short_opt,
+ entry->argp->argp_domain, stream);
+
+ /* Finally, a list of long options (whew!). */
+ for (entry = hol->entries, nentries = hol->num_entries
+ ; nentries > 0
+ ; entry++, nentries--)
+ hol_entry_long_iterate (entry, usage_long_opt,
+ entry->argp->argp_domain, stream);
+ }
+}
+
+/* Make a HOL containing all levels of options in ARGP. CLUSTER is the
+ cluster in which ARGP's entries should be clustered, or 0. */
+static struct hol *
+argp_hol (const struct argp *argp, struct hol_cluster *cluster)
+{
+ const struct argp_child *child = argp->children;
+ struct hol *hol = make_hol (argp, cluster);
+ if (child)
+ while (child->argp)
+ {
+ struct hol_cluster *child_cluster =
+ ((child->group || child->header)
+ /* Put CHILD->argp within its own cluster. */
+ ? hol_add_cluster (hol, child->group, child->header,
+ child - argp->children, cluster, argp)
+ /* Just merge it into the parent's cluster. */
+ : cluster);
+ hol_append (hol, argp_hol (child->argp, child_cluster)) ;
+ child++;
+ }
+ return hol;
+}
+
+/* Calculate how many different levels with alternative args strings exist in
+ ARGP. */
+static size_t
+argp_args_levels (const struct argp *argp)
+{
+ size_t levels = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->args_doc && strchr (argp->args_doc, '\n'))
+ levels++;
+
+ if (child)
+ while (child->argp)
+ levels += argp_args_levels ((child++)->argp);
+
+ return levels;
+}
+
+/* Print all the non-option args documented in ARGP to STREAM. Any output is
+ preceded by a space. LEVELS is a pointer to a byte vector the length
+ returned by argp_args_levels; it should be initialized to zero, and
+ updated by this routine for the next call if ADVANCE is true. True is
+ returned as long as there are more patterns to output. */
+static int
+argp_args_usage (const struct argp *argp, const struct argp_state *state,
+ char **levels, int advance, argp_fmtstream_t stream)
+{
+ char *our_level = *levels;
+ int multiple = 0;
+ const struct argp_child *child = argp->children;
+ const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0;
+ const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);
+
+ if (fdoc)
+ {
+ const char *cp = fdoc;
+ nl = __strchrnul (cp, '\n');
+ if (*nl != '\0')
+ /* This is a `multi-level' args doc; advance to the correct position
+ as determined by our state in LEVELS, and update LEVELS. */
+ {
+ int i;
+ multiple = 1;
+ for (i = 0; i < *our_level; i++)
+ cp = nl + 1, nl = __strchrnul (cp, '\n');
+ (*levels)++;
+ }
+
+ /* Manually do line wrapping so that it (probably) won't get wrapped at
+ any embedded spaces. */
+ space (stream, 1 + nl - cp);
+
+ __argp_fmtstream_write (stream, cp, nl - cp);
+ }
+ if (fdoc && fdoc != tdoc)
+ free ((char *)fdoc); /* Free user's modified doc string. */
+
+ if (child)
+ while (child->argp)
+ advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream);
+
+ if (advance && multiple)
+ {
+ /* Need to increment our level. */
+ if (*nl)
+ /* There's more we can do here. */
+ {
+ (*our_level)++;
+ advance = 0; /* Our parent shouldn't advance also. */
+ }
+ else if (*our_level > 0)
+ /* We had multiple levels, but used them up; reset to zero. */
+ *our_level = 0;
+ }
+
+ return !advance;
+}
+
+/* Print the documentation for ARGP to STREAM; if POST is false, then
+ everything preceeding a `\v' character in the documentation strings (or
+ the whole string, for those with none) is printed, otherwise, everything
+ following the `\v' character (nothing for strings without). Each separate
+ bit of documentation is separated a blank line, and if PRE_BLANK is true,
+ then the first is as well. If FIRST_ONLY is true, only the first
+ occurrence is output. Returns true if anything was output. */
+static int
+argp_doc (const struct argp *argp, const struct argp_state *state,
+ int post, int pre_blank, int first_only,
+ argp_fmtstream_t stream)
+{
+ const char *text;
+ const char *inp_text;
+ size_t inp_text_len = 0;
+ const char *trans_text;
+ void *input = 0;
+ int anything = 0;
+ const struct argp_child *child = argp->children;
+
+ if (argp->doc)
+ {
+ char *vt = strchr (argp->doc, '\v');
+ if (vt)
+ {
+ if (post)
+ inp_text = vt + 1;
+ else
+ {
+ inp_text_len = vt - argp->doc;
+ inp_text = __strndup (argp->doc, inp_text_len);
+ }
+ }
+ else
+ inp_text = post ? 0 : argp->doc;
+ trans_text = inp_text ? dgettext (argp->argp_domain, inp_text) : NULL;
+ }
+ else
+ trans_text = inp_text = 0;
+
+ if (argp->help_filter)
+ /* We have to filter the doc strings. */
+ {
+ input = __argp_input (argp, state);
+ text =
+ (*argp->help_filter) (post
+ ? ARGP_KEY_HELP_POST_DOC
+ : ARGP_KEY_HELP_PRE_DOC,
+ trans_text, input);
+ }
+ else
+ text = (const char *) trans_text;
+
+ if (text)
+ {
+ if (pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+
+ __argp_fmtstream_puts (stream, text);
+
+ if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+
+ anything = 1;
+ }
+
+ if (text && text != trans_text)
+ free ((char *) text); /* Free TEXT returned from the help filter. */
+
+ if (inp_text && inp_text_len)
+ free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
+
+ if (post && argp->help_filter)
+ /* Now see if we have to output an ARGP_KEY_HELP_EXTRA text. */
+ {
+ text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
+ if (text)
+ {
+ if (anything || pre_blank)
+ __argp_fmtstream_putc (stream, '\n');
+ __argp_fmtstream_puts (stream, text);
+ free ((char *) text);
+ if (__argp_fmtstream_point (stream)
+ > __argp_fmtstream_lmargin (stream))
+ __argp_fmtstream_putc (stream, '\n');
+ anything = 1;
+ }
+ }
+
+ if (child)
+ while (child->argp && !(first_only && anything))
+ anything |=
+ argp_doc ((child++)->argp, state,
+ post, anything || pre_blank, first_only,
+ stream);
+
+ return anything;
+}
+
+/* Output a usage message for ARGP to STREAM. If called from
+ argp_state_help, STATE is the relevent parsing state. FLAGS are from the
+ set ARGP_HELP_*. NAME is what to use wherever a `program name' is
+ needed. */
+static void
+_help (const struct argp *argp, const struct argp_state *state, FILE *stream,
+ unsigned flags, char *name)
+{
+ int anything = 0; /* Whether we've output anything. */
+ struct hol *hol = 0;
+ argp_fmtstream_t fs;
+
+ if (! stream)
+ return;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ if (! uparams.valid)
+ fill_in_uparams (state);
+
+ fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);
+ if (! fs)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ return;
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))
+ {
+ hol = argp_hol (argp, 0);
+
+ /* If present, these options always come last. */
+ hol_set_group (hol, "help", -1);
+ hol_set_group (hol, "version", -1);
+
+ hol_sort (hol);
+ }
+
+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
+ /* Print a short `Usage:' message. */
+ {
+ int first_pattern = 1, more_patterns;
+ size_t num_pattern_levels = argp_args_levels (argp);
+ char *pattern_levels = alloca (num_pattern_levels);
+
+ memset (pattern_levels, 0, num_pattern_levels);
+
+ do
+ {
+ int old_lm;
+ int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);
+ char *levels = pattern_levels;
+
+ if (first_pattern)
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, "Usage:"),
+ name);
+ else
+ __argp_fmtstream_printf (fs, "%s %s",
+ dgettext (argp->argp_domain, " or: "),
+ name);
+
+ /* We set the lmargin as well as the wmargin, because hol_usage
+ manually wraps options with newline to avoid annoying breaks. */
+ old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);
+
+ if (flags & ARGP_HELP_SHORT_USAGE)
+ /* Just show where the options go. */
+ {
+ if (hol->num_entries > 0)
+ __argp_fmtstream_puts (fs, dgettext (argp->argp_domain,
+ " [OPTION...]"));
+ }
+ else
+ /* Actually print the options. */
+ {
+ hol_usage (hol, fs);
+ flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */
+ }
+
+ more_patterns = argp_args_usage (argp, state, &levels, 1, fs);
+
+ __argp_fmtstream_set_wmargin (fs, old_wm);
+ __argp_fmtstream_set_lmargin (fs, old_lm);
+
+ __argp_fmtstream_putc (fs, '\n');
+ anything = 1;
+
+ first_pattern = 0;
+ }
+ while (more_patterns);
+ }
+
+ if (flags & ARGP_HELP_PRE_DOC)
+ anything |= argp_doc (argp, state, 0, 0, 1, fs);
+
+ if (flags & ARGP_HELP_SEE)
+ {
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
+Try `%s --help' or `%s --usage' for more information.\n"),
+ name, name);
+ anything = 1;
+ }
+
+ if (flags & ARGP_HELP_LONG)
+ /* Print a long, detailed help message. */
+ {
+ /* Print info about all the options. */
+ if (hol->num_entries > 0)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ hol_help (hol, state, fs);
+ anything = 1;
+ }
+ }
+
+ if (flags & ARGP_HELP_POST_DOC)
+ /* Print any documentation strings at the end. */
+ anything |= argp_doc (argp, state, 1, anything, 0, fs);
+
+ if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address)
+ {
+ if (anything)
+ __argp_fmtstream_putc (fs, '\n');
+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain,
+ "Report bugs to %s.\n"),
+ argp_program_bug_address);
+ anything = 1;
+ }
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (hol)
+ hol_free (hol);
+
+ __argp_fmtstream_free (fs);
+}
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */
+void __argp_help (const struct argp *argp, FILE *stream,
+ unsigned flags, char *name)
+{
+ struct argp_state state;
+ memset (&state, 0, sizeof state);
+ state.root_argp = argp;
+ _help (argp, &state, stream, flags, name);
+}
+#ifdef weak_alias
+weak_alias (__argp_help, argp_help)
+#endif
+
+#if ! (defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME)
+char *
+__argp_short_program_name (void)
+{
+# if HAVE_DECL_PROGRAM_INVOCATION_NAME
+ return __argp_base_name (program_invocation_name);
+# else
+ /* FIXME: What now? Miles suggests that it is better to use NULL,
+ but currently the value is passed on directly to fputs_unlocked,
+ so that requires more changes. */
+# if __GNUC__
+# warning No reasonable value to return
+# endif /* __GNUC__ */
+ return "";
+# endif
+}
+#endif
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+void
+__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)
+{
+ if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream)
+ {
+ if (state && (state->flags & ARGP_LONG_ONLY))
+ flags |= ARGP_HELP_LONG_ONLY;
+
+ _help (state ? state->root_argp : 0, state, stream, flags,
+ state ? state->name : __argp_short_program_name ());
+
+ if (!state || ! (state->flags & ARGP_NO_EXIT))
+ {
+ if (flags & ARGP_HELP_EXIT_ERR)
+ exit (argp_err_exit_status);
+ if (flags & ARGP_HELP_EXIT_OK)
+ exit (0);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_state_help, argp_state_help)
+#endif
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+void
+__argp_error (const struct argp_state *state, const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+ va_list ap;
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+ va_start (ap, fmt);
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L"%s: %s\n",
+ state ? state->name : __argp_short_program_name (),
+ buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+
+ putc_unlocked ('\n', stream);
+ }
+
+ __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
+
+ va_end (ap);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_error, argp_error)
+#endif
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+void
+__argp_failure (const struct argp_state *state, int status, int errnum,
+ const char *fmt, ...)
+{
+ if (!state || !(state->flags & ARGP_NO_ERRS))
+ {
+ FILE *stream = state ? state->err_stream : stderr;
+
+ if (stream)
+ {
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __flockfile (stream);
+#endif
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L"%s",
+ state ? state->name : __argp_short_program_name ());
+ else
+#endif
+ fputs_unlocked (state
+ ? state->name : __argp_short_program_name (),
+ stream);
+
+ if (fmt)
+ {
+ va_list ap;
+
+ va_start (ap, fmt);
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ {
+ char *buf;
+
+ if (__asprintf (&buf, fmt, ap) < 0)
+ buf = NULL;
+
+ __fwprintf (stream, L": %s", buf);
+
+ free (buf);
+ }
+ else
+#endif
+ {
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+
+ vfprintf (stream, fmt, ap);
+ }
+
+ va_end (ap);
+ }
+
+ if (errnum)
+ {
+ char buf[200];
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ __fwprintf (stream, L": %s",
+ __strerror_r (errnum, buf, sizeof (buf)));
+ else
+#endif
+ {
+ char const *s = NULL;
+ putc_unlocked (':', stream);
+ putc_unlocked (' ', stream);
+#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P && !defined strerror_r)
+ s = __strerror_r (errnum, buf, sizeof buf);
+#elif HAVE_DECL_STRERROR_R
+ if (__strerror_r (errnum, buf, sizeof buf) == 0)
+ s = buf;
+#endif
+#if !_LIBC
+ if (! s && ! (s = strerror (errnum)))
+ s = dgettext (state->root_argp->argp_domain,
+ "Unknown system error");
+#endif
+ fputs (s, stream);
+ }
+ }
+
+#ifdef USE_IN_LIBIO
+ if (_IO_fwide (stream, 0) > 0)
+ putwc_unlocked (L'\n', stream);
+ else
+#endif
+ putc_unlocked ('\n', stream);
+
+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
+ __funlockfile (stream);
+#endif
+
+ if (status && (!state || !(state->flags & ARGP_NO_EXIT)))
+ exit (status);
+ }
+ }
+}
+#ifdef weak_alias
+weak_alias (__argp_failure, argp_failure)
+#endif
diff --git a/gnulib/lib/argp-namefrob.h b/gnulib/lib/argp-namefrob.h
new file mode 100644
index 0000000..5f6b020
--- /dev/null
+++ b/gnulib/lib/argp-namefrob.h
@@ -0,0 +1,157 @@
+/* Name frobnication for compiling argp outside of glibc
+ Copyright (C) 1997, 2003, 2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+/* This code is written for inclusion in gnu-libc, and uses names in the
+ namespace reserved for libc. If we're not compiling in libc, define those
+ names to be the normal ones instead. */
+
+/* argp-parse functions */
+#undef __argp_parse
+#define __argp_parse argp_parse
+#undef __option_is_end
+#define __option_is_end _option_is_end
+#undef __option_is_short
+#define __option_is_short _option_is_short
+#undef __argp_input
+#define __argp_input _argp_input
+
+/* argp-help functions */
+#undef __argp_help
+#define __argp_help argp_help
+#undef __argp_error
+#define __argp_error argp_error
+#undef __argp_failure
+#define __argp_failure argp_failure
+#undef __argp_state_help
+#define __argp_state_help argp_state_help
+#undef __argp_usage
+#define __argp_usage argp_usage
+
+/* argp-fmtstream functions */
+#undef __argp_make_fmtstream
+#define __argp_make_fmtstream argp_make_fmtstream
+#undef __argp_fmtstream_free
+#define __argp_fmtstream_free argp_fmtstream_free
+#undef __argp_fmtstream_putc
+#define __argp_fmtstream_putc argp_fmtstream_putc
+#undef __argp_fmtstream_puts
+#define __argp_fmtstream_puts argp_fmtstream_puts
+#undef __argp_fmtstream_write
+#define __argp_fmtstream_write argp_fmtstream_write
+#undef __argp_fmtstream_printf
+#define __argp_fmtstream_printf argp_fmtstream_printf
+#undef __argp_fmtstream_set_lmargin
+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
+#undef __argp_fmtstream_set_rmargin
+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
+#undef __argp_fmtstream_set_wmargin
+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
+#undef __argp_fmtstream_point
+#define __argp_fmtstream_point argp_fmtstream_point
+#undef __argp_fmtstream_update
+#define __argp_fmtstream_update _argp_fmtstream_update
+#undef __argp_fmtstream_ensure
+#define __argp_fmtstream_ensure _argp_fmtstream_ensure
+#undef __argp_fmtstream_lmargin
+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
+#undef __argp_fmtstream_rmargin
+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
+#undef __argp_fmtstream_wmargin
+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
+
+/* normal libc functions we call */
+#undef __flockfile
+#define __flockfile flockfile
+#undef __funlockfile
+#define __funlockfile funlockfile
+#undef __mempcpy
+#define __mempcpy mempcpy
+#undef __sleep
+#define __sleep sleep
+#undef __strcasecmp
+#define __strcasecmp strcasecmp
+#undef __strchrnul
+#define __strchrnul strchrnul
+#undef __strerror_r
+#define __strerror_r strerror_r
+#undef __strndup
+#define __strndup strndup
+#undef __vsnprintf
+#define __vsnprintf vsnprintf
+
+#if defined(HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
+# define clearerr_unlocked(x) clearerr (x)
+#endif
+#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
+# define feof_unlocked(x) feof (x)
+#endif
+#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
+# define ferror_unlocked(x) ferror (x)
+#endif
+#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
+# define fflush_unlocked(x) fflush (x)
+#endif
+#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+#endif
+#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
+# define fputc_unlocked(x,y) fputc (x,y)
+#endif
+#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
+# define fputs_unlocked(x,y) fputs (x,y)
+#endif
+#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+#endif
+#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+#endif
+#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
+# define getc_unlocked(x) getc (x)
+#endif
+#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
+# define getchar_unlocked() getchar ()
+#endif
+#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
+# define putc_unlocked(x,y) putc (x,y)
+#endif
+#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
+# define putchar_unlocked(x) putchar (x)
+#endif
+
+#endif /* !_LIBC */
+
+#ifndef __set_errno
+# define __set_errno(e) (errno = (e))
+#endif
+
+#if defined GNULIB_ARGP_DISABLE_DIRNAME
+# define __argp_base_name(arg) arg
+#elif defined GNULIB_ARGP_EXTERN_BASENAME
+extern char *__argp_base_name (const char *arg);
+#else
+# include "dirname.h"
+# define __argp_base_name last_component
+#endif
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define __argp_short_program_name() (program_invocation_short_name)
+#else
+extern char *__argp_short_program_name (void);
+#endif
diff --git a/gnulib/lib/argp-parse.c b/gnulib/lib/argp-parse.c
new file mode 100644
index 0000000..64360be
--- /dev/null
+++ b/gnulib/lib/argp-parse.c
@@ -0,0 +1,952 @@
+/* Hierarchial argument parsing, layered over getopt
+ Copyright (C) 1995-2000, 2002-2004, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <alloca.h>
+#include <stdalign.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#include <getopt.h>
+#include <getopt_int.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+# undef dgettext
+# define dgettext(domain, msgid) \
+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES)
+#else
+# include "gettext.h"
+#endif
+#define N_(msgid) msgid
+
+#include "argp.h"
+#include "argp-namefrob.h"
+
+#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
+
+/* Getopt return values. */
+#define KEY_END (-1) /* The end of the options. */
+#define KEY_ARG 1 /* A non-option argument. */
+#define KEY_ERR '?' /* An error parsing the options. */
+
+/* The meta-argument used to prevent any further arguments being interpreted
+ as options. */
+#define QUOTE "--"
+
+/* The number of bits we steal in a long-option value for our own use. */
+#define GROUP_BITS CHAR_BIT
+
+/* The number of bits available for the user value. */
+#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS)
+#define USER_MASK ((1 << USER_BITS) - 1)
+
+/* EZ alias for ARGP_ERR_UNKNOWN. */
+#define EBADKEY ARGP_ERR_UNKNOWN
+
+/* Default options. */
+
+/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep
+ for one second intervals, decrementing _ARGP_HANG until it's zero. Thus
+ you can force the program to continue by attaching a debugger and setting
+ it to 0 yourself. */
+static volatile int _argp_hang;
+
+#define OPT_PROGNAME -2
+#define OPT_USAGE -3
+#define OPT_HANG -4
+
+static const struct argp_option argp_default_options[] =
+{
+ {"help", '?', 0, 0, N_("give this help list"), -1},
+ {"usage", OPT_USAGE, 0, 0, N_("give a short usage message"), 0},
+ {"program-name",OPT_PROGNAME,N_("NAME"), OPTION_HIDDEN, N_("set the program name"), 0},
+ {"HANG", OPT_HANG, N_("SECS"), OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
+ N_("hang for SECS seconds (default 3600)"), 0},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_default_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case '?':
+ __argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP);
+ break;
+ case OPT_USAGE:
+ __argp_state_help (state, state->out_stream,
+ ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
+ break;
+
+ case OPT_PROGNAME: /* Set the program name. */
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME
+ program_invocation_name = arg;
+#endif
+ /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka
+ __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined
+ to be that, so we have to be a bit careful here.] */
+
+ /* Update what we use for messages. */
+ state->name = __argp_base_name (arg);
+
+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ program_invocation_short_name = state->name;
+#endif
+
+ if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS))
+ == ARGP_PARSE_ARGV0)
+ /* Update what getopt uses too. */
+ state->argv[0] = arg;
+
+ break;
+
+ case OPT_HANG:
+ _argp_hang = atoi (arg ? arg : "3600");
+ while (_argp_hang-- > 0)
+ __sleep (1);
+ break;
+
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_default_argp =
+ {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"};
+
+
+static const struct argp_option argp_version_options[] =
+{
+ {"version", 'V', 0, 0, N_("print program version"), -1},
+ {NULL, 0, 0, 0, NULL, 0}
+};
+
+static error_t
+argp_version_parser (int key, char *arg, struct argp_state *state)
+{
+ switch (key)
+ {
+ case 'V':
+ if (argp_program_version_hook)
+ (*argp_program_version_hook) (state->out_stream, state);
+ else if (argp_program_version)
+ fprintf (state->out_stream, "%s\n", argp_program_version);
+ else
+ __argp_error (state, dgettext (state->root_argp->argp_domain,
+ "(PROGRAM ERROR) No version known!?"));
+ if (! (state->flags & ARGP_NO_EXIT))
+ exit (0);
+ break;
+ default:
+ return EBADKEY;
+ }
+ return 0;
+}
+
+static const struct argp argp_version_argp =
+ {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"};
+
+/* Returns the offset into the getopt long options array LONG_OPTIONS of a
+ long option with called NAME, or -1 if none is found. Passing NULL as
+ NAME will return the number of options. */
+static int
+find_long_option (struct option *long_options, const char *name)
+{
+ struct option *l = long_options;
+ while (l->name != NULL)
+ if (name != NULL && strcmp (l->name, name) == 0)
+ return l - long_options;
+ else
+ l++;
+ if (name == NULL)
+ return l - long_options;
+ else
+ return -1;
+}
+
+
+/* The state of a `group' during parsing. Each group corresponds to a
+ particular argp structure from the tree of such descending from the top
+ level argp passed to argp_parse. */
+struct group
+{
+ /* This group's parsing function. */
+ argp_parser_t parser;
+
+ /* Which argp this group is from. */
+ const struct argp *argp;
+
+ /* Points to the point in SHORT_OPTS corresponding to the end of the short
+ options for this group. We use it to determine from which group a
+ particular short options is from. */
+ char *short_end;
+
+ /* The number of non-option args sucessfully handled by this parser. */
+ unsigned args_processed;
+
+ /* This group's parser's parent's group. */
+ struct group *parent;
+ unsigned parent_index; /* And the our position in the parent. */
+
+ /* These fields are swapped into and out of the state structure when
+ calling this group's parser. */
+ void *input, **child_inputs;
+ void *hook;
+};
+
+/* Call GROUP's parser with KEY and ARG, swapping any group-specific info
+ from STATE before calling, and back into state afterwards. If GROUP has
+ no parser, EBADKEY is returned. */
+static error_t
+group_parse (struct group *group, struct argp_state *state, int key, char *arg)
+{
+ if (group->parser)
+ {
+ error_t err;
+ state->hook = group->hook;
+ state->input = group->input;
+ state->child_inputs = group->child_inputs;
+ state->arg_num = group->args_processed;
+ err = (*group->parser)(key, arg, state);
+ group->hook = state->hook;
+ return err;
+ }
+ else
+ return EBADKEY;
+}
+
+struct parser
+{
+ const struct argp *argp;
+
+ /* SHORT_OPTS is the getopt short options string for the union of all the
+ groups of options. */
+ char *short_opts;
+ /* LONG_OPTS is the array of getop long option structures for the union of
+ all the groups of options. */
+ struct option *long_opts;
+ /* OPT_DATA is the getopt data used for the re-entrant getopt. */
+ struct _getopt_data opt_data;
+
+ /* States of the various parsing groups. */
+ struct group *groups;
+ /* The end of the GROUPS array. */
+ struct group *egroup;
+ /* A vector containing storage for the CHILD_INPUTS field in all groups. */
+ void **child_inputs;
+
+ /* True if we think using getopt is still useful; if false, then
+ remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is
+ cleared whenever getopt returns KEY_END, but may be set again if the user
+ moves the next argument pointer backwards. */
+ int try_getopt;
+
+ /* State block supplied to parsing routines. */
+ struct argp_state state;
+
+ /* Memory used by this parser. */
+ void *storage;
+};
+
+/* The next usable entries in the various parser tables being filled in by
+ convert_options. */
+struct parser_convert_state
+{
+ struct parser *parser;
+ char *short_end;
+ struct option *long_end;
+ void **child_inputs_end;
+};
+
+/* Converts all options in ARGP (which is put in GROUP) and ancestors
+ into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and
+ CVT->LONG_END are the points at which new options are added. Returns the
+ next unused group entry. CVT holds state used during the conversion. */
+static struct group *
+convert_options (const struct argp *argp,
+ struct group *parent, unsigned parent_index,
+ struct group *group, struct parser_convert_state *cvt)
+{
+ /* REAL is the most recent non-alias value of OPT. */
+ const struct argp_option *real = argp->options;
+ const struct argp_child *children = argp->children;
+
+ if (real || argp->parser)
+ {
+ const struct argp_option *opt;
+
+ if (real)
+ for (opt = real; !__option_is_end (opt); opt++)
+ {
+ if (! (opt->flags & OPTION_ALIAS))
+ /* OPT isn't an alias, so we can use values from it. */
+ real = opt;
+
+ if (! (real->flags & OPTION_DOC))
+ /* A real option (not just documentation). */
+ {
+ if (__option_is_short (opt))
+ /* OPT can be used as a short option. */
+ {
+ *cvt->short_end++ = opt->key;
+ if (real->arg)
+ {
+ *cvt->short_end++ = ':';
+ if (real->flags & OPTION_ARG_OPTIONAL)
+ *cvt->short_end++ = ':';
+ }
+ *cvt->short_end = '\0'; /* keep 0 terminated */
+ }
+
+ if (opt->name
+ && find_long_option (cvt->parser->long_opts, opt->name) < 0)
+ /* OPT can be used as a long option. */
+ {
+ cvt->long_end->name = opt->name;
+ cvt->long_end->has_arg =
+ (real->arg
+ ? (real->flags & OPTION_ARG_OPTIONAL
+ ? optional_argument
+ : required_argument)
+ : no_argument);
+ cvt->long_end->flag = 0;
+ /* we add a disambiguating code to all the user's
+ values (which is removed before we actually call
+ the function to parse the value); this means that
+ the user loses use of the high 8 bits in all his
+ values (the sign of the lower bits is preserved
+ however)... */
+ cvt->long_end->val =
+ ((opt->key ? opt->key : real->key) & USER_MASK)
+ + (((group - cvt->parser->groups) + 1) << USER_BITS);
+
+ /* Keep the LONG_OPTS list terminated. */
+ (++cvt->long_end)->name = NULL;
+ }
+ }
+ }
+
+ group->parser = argp->parser;
+ group->argp = argp;
+ group->short_end = cvt->short_end;
+ group->args_processed = 0;
+ group->parent = parent;
+ group->parent_index = parent_index;
+ group->input = 0;
+ group->hook = 0;
+ group->child_inputs = 0;
+
+ if (children)
+ /* Assign GROUP's CHILD_INPUTS field some space from
+ CVT->child_inputs_end.*/
+ {
+ unsigned num_children = 0;
+ while (children[num_children].argp)
+ num_children++;
+ group->child_inputs = cvt->child_inputs_end;
+ cvt->child_inputs_end += num_children;
+ }
+
+ parent = group++;
+ }
+ else
+ parent = 0;
+
+ if (children)
+ {
+ unsigned index = 0;
+ while (children->argp)
+ group =
+ convert_options (children++->argp, parent, index++, group, cvt);
+ }
+
+ return group;
+}
+
+/* Find the merged set of getopt options, with keys appropiately prefixed. */
+static void
+parser_convert (struct parser *parser, const struct argp *argp, int flags)
+{
+ struct parser_convert_state cvt;
+
+ cvt.parser = parser;
+ cvt.short_end = parser->short_opts;
+ cvt.long_end = parser->long_opts;
+ cvt.child_inputs_end = parser->child_inputs;
+
+ if (flags & ARGP_IN_ORDER)
+ *cvt.short_end++ = '-';
+ else if (flags & ARGP_NO_ARGS)
+ *cvt.short_end++ = '+';
+ *cvt.short_end = '\0';
+
+ cvt.long_end->name = NULL;
+
+ parser->argp = argp;
+
+ if (argp)
+ parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt);
+ else
+ parser->egroup = parser->groups; /* No parsers at all! */
+}
+
+/* Lengths of various parser fields which we will allocated. */
+struct parser_sizes
+{
+ size_t short_len; /* Getopt short options string. */
+ size_t long_len; /* Getopt long options vector. */
+ size_t num_groups; /* Group structures we allocate. */
+ size_t num_child_inputs; /* Child input slots. */
+};
+
+/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of
+ argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by
+ the maximum lengths of the resulting merged getopt short options string and
+ long-options array, respectively. */
+static void
+calc_sizes (const struct argp *argp, struct parser_sizes *szs)
+{
+ const struct argp_child *child = argp->children;
+ const struct argp_option *opt = argp->options;
+
+ if (opt || argp->parser)
+ {
+ szs->num_groups++;
+ if (opt)
+ {
+ int num_opts = 0;
+ while (!__option_is_end (opt++))
+ num_opts++;
+ szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */
+ szs->long_len += num_opts;
+ }
+ }
+
+ if (child)
+ while (child->argp)
+ {
+ calc_sizes ((child++)->argp, szs);
+ szs->num_child_inputs++;
+ }
+}
+
+/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */
+static error_t
+parser_init (struct parser *parser, const struct argp *argp,
+ int argc, char **argv, int flags, void *input)
+{
+ error_t err = 0;
+ struct group *group;
+ struct parser_sizes szs;
+ struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER;
+ char *storage;
+ size_t glen, gsum;
+ size_t clen, csum;
+ size_t llen, lsum;
+ size_t slen, ssum;
+
+ szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1;
+ szs.long_len = 0;
+ szs.num_groups = 0;
+ szs.num_child_inputs = 0;
+
+ if (argp)
+ calc_sizes (argp, &szs);
+
+ /* Lengths of the various bits of storage used by PARSER. */
+ glen = (szs.num_groups + 1) * sizeof (struct group);
+ clen = szs.num_child_inputs * sizeof (void *);
+ llen = (szs.long_len + 1) * sizeof (struct option);
+ slen = szs.short_len + 1;
+
+ /* Sums of previous lengths, properly aligned. There's no need to
+ align gsum, since struct group is aligned at least as strictly as
+ void * (since it contains a void * member). And there's no need
+ to align lsum, since struct option is aligned at least as
+ strictly as char. */
+ gsum = glen;
+ csum = alignto (gsum + clen, alignof (struct option));
+ lsum = csum + llen;
+ ssum = lsum + slen;
+
+ parser->storage = malloc (ssum);
+ if (! parser->storage)
+ return ENOMEM;
+
+ storage = parser->storage;
+ parser->groups = parser->storage;
+ parser->child_inputs = (void **) (storage + gsum);
+ parser->long_opts = (struct option *) (storage + csum);
+ parser->short_opts = storage + lsum;
+ parser->opt_data = opt_data;
+
+ memset (parser->child_inputs, 0, clen);
+ parser_convert (parser, argp, flags);
+
+ memset (&parser->state, 0, sizeof (struct argp_state));
+ parser->state.root_argp = parser->argp;
+ parser->state.argc = argc;
+ parser->state.argv = argv;
+ parser->state.flags = flags;
+ parser->state.err_stream = stderr;
+ parser->state.out_stream = stdout;
+ parser->state.next = 0; /* Tell getopt to initialize. */
+ parser->state.pstate = parser;
+
+ parser->try_getopt = 1;
+
+ /* Call each parser for the first time, giving it a chance to propagate
+ values to child parsers. */
+ if (parser->groups < parser->egroup)
+ parser->groups->input = input;
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err == EBADKEY);
+ group++)
+ {
+ if (group->parent)
+ /* If a child parser, get the initial input value from the parent. */
+ group->input = group->parent->child_inputs[group->parent_index];
+
+ if (!group->parser
+ && group->argp->children && group->argp->children->argp)
+ /* For the special case where no parsing function is supplied for an
+ argp, propagate its input to its first child, if any (this just
+ makes very simple wrapper argps more convenient). */
+ group->child_inputs[0] = group->input;
+
+ err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0);
+ }
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ if (err)
+ return err;
+
+ if (parser->state.flags & ARGP_NO_ERRS)
+ {
+ parser->opt_data.opterr = 0;
+ if (parser->state.flags & ARGP_PARSE_ARGV0)
+ /* getopt always skips ARGV[0], so we have to fake it out. As long
+ as OPTERR is 0, then it shouldn't actually try to access it. */
+ parser->state.argv--, parser->state.argc++;
+ }
+ else
+ parser->opt_data.opterr = 1; /* Print error messages. */
+
+ if (parser->state.argv == argv && argv[0])
+ /* There's an argv[0]; use it for messages. */
+ parser->state.name = __argp_base_name (argv[0]);
+ else
+ parser->state.name = __argp_short_program_name ();
+
+ return 0;
+}
+
+/* Free any storage consumed by PARSER (but not PARSER itself). */
+static error_t
+parser_finalize (struct parser *parser,
+ error_t err, int arg_ebadkey, int *end_index)
+{
+ struct group *group;
+
+ if (err == EBADKEY && arg_ebadkey)
+ /* Suppress errors generated by unparsed arguments. */
+ err = 0;
+
+ if (! err)
+ {
+ if (parser->state.next == parser->state.argc)
+ /* We successfully parsed all arguments! Call all the parsers again,
+ just a few more times... */
+ {
+ for (group = parser->groups;
+ group < parser->egroup && (!err || err==EBADKEY);
+ group++)
+ if (group->args_processed == 0)
+ err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0);
+ for (group = parser->egroup - 1;
+ group >= parser->groups && (!err || err==EBADKEY);
+ group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_END, 0);
+
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+
+ /* Tell the user that all arguments are parsed. */
+ if (end_index)
+ *end_index = parser->state.next;
+ }
+ else if (end_index)
+ /* Return any remaining arguments to the user. */
+ *end_index = parser->state.next;
+ else
+ /* No way to return the remaining arguments, they must be bogus. */
+ {
+ if (!(parser->state.flags & ARGP_NO_ERRS)
+ && parser->state.err_stream)
+ fprintf (parser->state.err_stream,
+ dgettext (parser->argp->argp_domain,
+ "%s: Too many arguments\n"),
+ parser->state.name);
+ err = EBADKEY;
+ }
+ }
+
+ /* Okay, we're all done, with either an error or success; call the parsers
+ to indicate which one. */
+
+ if (err)
+ {
+ /* Maybe print an error message. */
+ if (err == EBADKEY)
+ /* An appropriate message describing what the error was should have
+ been printed earlier. */
+ __argp_state_help (&parser->state, parser->state.err_stream,
+ ARGP_HELP_STD_ERR);
+
+ /* Since we didn't exit, give each parser an error indication. */
+ for (group = parser->groups; group < parser->egroup; group++)
+ group_parse (group, &parser->state, ARGP_KEY_ERROR, 0);
+ }
+ else
+ /* Notify parsers of success, and propagate back values from parsers. */
+ {
+ /* We pass over the groups in reverse order so that child groups are
+ given a chance to do there processing before passing back a value to
+ the parent. */
+ for (group = parser->egroup - 1
+ ; group >= parser->groups && (!err || err == EBADKEY)
+ ; group--)
+ err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0);
+ if (err == EBADKEY)
+ err = 0; /* Some parser didn't understand. */
+ }
+
+ /* Call parsers once more, to do any final cleanup. Errors are ignored. */
+ for (group = parser->egroup - 1; group >= parser->groups; group--)
+ group_parse (group, &parser->state, ARGP_KEY_FINI, 0);
+
+ if (err == EBADKEY)
+ err = EINVAL;
+
+ free (parser->storage);
+
+ return err;
+}
+
+/* Call the user parsers to parse the non-option argument VAL, at the current
+ position, returning any error. The state NEXT pointer is assumed to have
+ been adjusted (by getopt) to point after this argument; this function will
+ adjust it correctly to reflect however many args actually end up being
+ consumed. */
+static error_t
+parser_parse_arg (struct parser *parser, char *val)
+{
+ /* Save the starting value of NEXT, first adjusting it so that the arg
+ we're parsing is again the front of the arg vector. */
+ int index = --parser->state.next;
+ error_t err = EBADKEY;
+ struct group *group;
+ int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */
+
+ /* Try to parse the argument in each parser. */
+ for (group = parser->groups
+ ; group < parser->egroup && err == EBADKEY
+ ; group++)
+ {
+ parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */
+ key = ARGP_KEY_ARG;
+ err = group_parse (group, &parser->state, key, val);
+
+ if (err == EBADKEY)
+ /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */
+ {
+ parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */
+ key = ARGP_KEY_ARGS;
+ err = group_parse (group, &parser->state, key, 0);
+ }
+ }
+
+ if (! err)
+ {
+ if (key == ARGP_KEY_ARGS)
+ /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't
+ changed by the user, *all* arguments should be considered
+ consumed. */
+ parser->state.next = parser->state.argc;
+
+ if (parser->state.next > index)
+ /* Remember that we successfully processed a non-option
+ argument -- but only if the user hasn't gotten tricky and set
+ the clock back. */
+ (--group)->args_processed += (parser->state.next - index);
+ else
+ /* The user wants to reparse some args, give getopt another try. */
+ parser->try_getopt = 1;
+ }
+
+ return err;
+}
+
+/* Call the user parsers to parse the option OPT, with argument VAL, at the
+ current position, returning any error. */
+static error_t
+parser_parse_opt (struct parser *parser, int opt, char *val)
+{
+ /* The group key encoded in the high bits; 0 for short opts or
+ group_number + 1 for long opts. */
+ int group_key = opt >> USER_BITS;
+ error_t err = EBADKEY;
+
+ if (group_key == 0)
+ /* A short option. By comparing OPT's position in SHORT_OPTS to the
+ various starting positions in each group's SHORT_END field, we can
+ determine which group OPT came from. */
+ {
+ struct group *group;
+ char *short_index = strchr (parser->short_opts, opt);
+
+ if (short_index)
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->short_end > short_index)
+ {
+ err = group_parse (group, &parser->state, opt,
+ parser->opt_data.optarg);
+ break;
+ }
+ }
+ else
+ /* A long option. We use shifts instead of masking for extracting
+ the user value in order to preserve the sign. */
+ err =
+ group_parse (&parser->groups[group_key - 1], &parser->state,
+ (opt << GROUP_BITS) >> GROUP_BITS,
+ parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ /* At least currently, an option not recognized is an error in the
+ parser, because we pre-compute which parser is supposed to deal
+ with each option. */
+ {
+ static const char bad_key_err[] =
+ N_("(PROGRAM ERROR) Option should have been recognized!?");
+ if (group_key == 0)
+ __argp_error (&parser->state, "-%c: %s", opt,
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ else
+ {
+ struct option *long_opt = parser->long_opts;
+ while (long_opt->val != opt && long_opt->name)
+ long_opt++;
+ __argp_error (&parser->state, "--%s: %s",
+ long_opt->name ? long_opt->name : "???",
+ dgettext (parser->argp->argp_domain, bad_key_err));
+ }
+ }
+
+ return err;
+}
+
+/* Parse the next argument in PARSER (as indicated by PARSER->state.next).
+ Any error from the parsers is returned, and *ARGP_EBADKEY indicates
+ whether a value of EBADKEY is due to an unrecognized argument (which is
+ generally not fatal). */
+static error_t
+parser_parse_next (struct parser *parser, int *arg_ebadkey)
+{
+ int opt;
+ error_t err = 0;
+
+ if (parser->state.quoted && parser->state.next < parser->state.quoted)
+ /* The next argument pointer has been moved to before the quoted
+ region, so pretend we never saw the quoting `--', and give getopt
+ another chance. If the user hasn't removed it, getopt will just
+ process it again. */
+ parser->state.quoted = 0;
+
+ if (parser->try_getopt && !parser->state.quoted)
+ /* Give getopt a chance to parse this. */
+ {
+ /* Put it back in OPTIND for getopt. */
+ parser->opt_data.optind = parser->state.next;
+ /* Distinguish KEY_ERR from a real option. */
+ parser->opt_data.optopt = KEY_END;
+ if (parser->state.flags & ARGP_LONG_ONLY)
+ opt = _getopt_long_only_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ else
+ opt = _getopt_long_r (parser->state.argc, parser->state.argv,
+ parser->short_opts, parser->long_opts, 0,
+ &parser->opt_data);
+ /* And see what getopt did. */
+ parser->state.next = parser->opt_data.optind;
+
+ if (opt == KEY_END)
+ /* Getopt says there are no more options, so stop using
+ getopt; we'll continue if necessary on our own. */
+ {
+ parser->try_getopt = 0;
+ if (parser->state.next > 1
+ && strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
+ == 0)
+ /* Not only is this the end of the options, but it's a
+ `quoted' region, which may have args that *look* like
+ options, so we definitely shouldn't try to use getopt past
+ here, whatever happens. */
+ parser->state.quoted = parser->state.next;
+ }
+ else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END)
+ /* KEY_ERR can have the same value as a valid user short
+ option, but in the case of a real error, getopt sets OPTOPT
+ to the offending character, which can never be KEY_END. */
+ {
+ *arg_ebadkey = 0;
+ return EBADKEY;
+ }
+ }
+ else
+ opt = KEY_END;
+
+ if (opt == KEY_END)
+ {
+ /* We're past what getopt considers the options. */
+ if (parser->state.next >= parser->state.argc
+ || (parser->state.flags & ARGP_NO_ARGS))
+ /* Indicate that we're done. */
+ {
+ *arg_ebadkey = 1;
+ return EBADKEY;
+ }
+ else
+ /* A non-option arg; simulate what getopt might have done. */
+ {
+ opt = KEY_ARG;
+ parser->opt_data.optarg = parser->state.argv[parser->state.next++];
+ }
+ }
+
+ if (opt == KEY_ARG)
+ /* A non-option argument; try each parser in turn. */
+ err = parser_parse_arg (parser, parser->opt_data.optarg);
+ else
+ err = parser_parse_opt (parser, opt, parser->opt_data.optarg);
+
+ if (err == EBADKEY)
+ *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG);
+
+ return err;
+}
+
+/* Parse the options strings in ARGC & ARGV according to the argp in ARGP.
+ FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, EINVAL is returned; if some parser routine
+ returned a non-zero value, it is returned; otherwise 0 is returned. */
+error_t
+__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
+ int *end_index, void *input)
+{
+ error_t err;
+ struct parser parser;
+
+ /* If true, then err == EBADKEY is a result of a non-option argument failing
+ to be parsed (which in some cases isn't actually an error). */
+ int arg_ebadkey = 0;
+
+#ifndef _LIBC
+ if (!(flags & ARGP_PARSE_ARGV0))
+ {
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+ if (!program_invocation_name)
+ program_invocation_name = argv[0];
+#endif
+#ifdef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ if (!program_invocation_short_name)
+ program_invocation_short_name = __argp_base_name (argv[0]);
+#endif
+ }
+#endif
+
+ if (! (flags & ARGP_NO_HELP))
+ /* Add our own options. */
+ {
+ struct argp_child *child = alloca (4 * sizeof (struct argp_child));
+ struct argp *top_argp = alloca (sizeof (struct argp));
+
+ /* TOP_ARGP has no options, it just serves to group the user & default
+ argps. */
+ memset (top_argp, 0, sizeof (*top_argp));
+ top_argp->children = child;
+
+ memset (child, 0, 4 * sizeof (struct argp_child));
+
+ if (argp)
+ (child++)->argp = argp;
+ (child++)->argp = &argp_default_argp;
+ if (argp_program_version || argp_program_version_hook)
+ (child++)->argp = &argp_version_argp;
+ child->argp = 0;
+
+ argp = top_argp;
+ }
+
+ /* Construct a parser for these arguments. */
+ err = parser_init (&parser, argp, argc, argv, flags, input);
+
+ if (! err)
+ /* Parse! */
+ {
+ while (! err)
+ err = parser_parse_next (&parser, &arg_ebadkey);
+ err = parser_finalize (&parser, err, arg_ebadkey, end_index);
+ }
+
+ return err;
+}
+#ifdef weak_alias
+weak_alias (__argp_parse, argp_parse)
+#endif
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+void *
+__argp_input (const struct argp *argp, const struct argp_state *state)
+{
+ if (state)
+ {
+ struct group *group;
+ struct parser *parser = state->pstate;
+
+ for (group = parser->groups; group < parser->egroup; group++)
+ if (group->argp == argp)
+ return group->input;
+ }
+
+ return 0;
+}
+#ifdef weak_alias
+weak_alias (__argp_input, _argp_input)
+#endif
diff --git a/gnulib/lib/argp-pin.c b/gnulib/lib/argp-pin.c
new file mode 100644
index 0000000..c966756
--- /dev/null
+++ b/gnulib/lib/argp-pin.c
@@ -0,0 +1,27 @@
+/* Full and short program names for argp module
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
+char *program_invocation_short_name = 0;
+#endif
+#ifndef HAVE_PROGRAM_INVOCATION_NAME
+char *program_invocation_name = 0;
+#endif
+
diff --git a/gnulib/lib/argp-pv.c b/gnulib/lib/argp-pv.c
new file mode 100644
index 0000000..7a8cba7
--- /dev/null
+++ b/gnulib/lib/argp-pv.c
@@ -0,0 +1,34 @@
+/* Default definition for ARGP_PROGRAM_VERSION.
+ Copyright (C) 1996-1997, 1999, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which will
+ print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+const char *argp_program_version
+/* This variable should be zero-initialized. On most systems, putting it into
+ BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
+ <http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ = (const char *) 0
+#endif
+ ;
diff --git a/gnulib/lib/argp-pvh.c b/gnulib/lib/argp-pvh.c
new file mode 100644
index 0000000..04f6603
--- /dev/null
+++ b/gnulib/lib/argp-pvh.c
@@ -0,0 +1,31 @@
+/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
+ Copyright (C) 1996-1997, 1999, 2004, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "argp.h"
+
+/* If set by the user program to a non-zero value, then a default option
+ --version is added (unless the ARGP_NO_HELP flag is used), which calls
+ this function with a stream to print the version to and a pointer to the
+ current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = NULL;
diff --git a/gnulib/lib/argp-version-etc.c b/gnulib/lib/argp-version-etc.c
new file mode 100644
index 0000000..dca14f3
--- /dev/null
+++ b/gnulib/lib/argp-version-etc.c
@@ -0,0 +1,38 @@
+/* Version hook for Argp.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <version-etc.h>
+#include <argp.h>
+#include <argp-version-etc.h>
+
+static const char *program_canonical_name;
+static const char * const *program_authors;
+
+static void
+version_etc_hook (FILE *stream, struct argp_state *state)
+{
+ version_etc_ar (stream, program_canonical_name, PACKAGE_NAME, VERSION,
+ program_authors);
+}
+
+void
+argp_version_setup (const char *name, const char * const *authors)
+{
+ argp_program_version_hook = version_etc_hook;
+ program_canonical_name = name;
+ program_authors = authors;
+}
diff --git a/gnulib/lib/argp-version-etc.h b/gnulib/lib/argp-version-etc.h
new file mode 100644
index 0000000..53a8517
--- /dev/null
+++ b/gnulib/lib/argp-version-etc.h
@@ -0,0 +1,40 @@
+/* Version hook for Argp.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _ARGP_VERSION_ETC_H
+#define _ARGP_VERSION_ETC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Setup standard display of the version information for the `--version'
+ option. NAME is the canonical program name, and AUTHORS is a NULL-
+ terminated array of author names. At least one author name must be
+ given.
+
+ If NAME is NULL, the package name (as given by the PACKAGE macro)
+ is asumed to be the name of the program.
+
+ This function is intended to be called before argp_parse().
+*/
+extern void argp_version_setup (const char *name, const char * const *authors);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ARGP_VERSION_ETC_H */
diff --git a/gnulib/lib/argp-xinl.c b/gnulib/lib/argp-xinl.c
new file mode 100644
index 0000000..5b1f6fb
--- /dev/null
+++ b/gnulib/lib/argp-xinl.c
@@ -0,0 +1,42 @@
+/* Real definitions for extern inline functions in argp.h
+ Copyright (C) 1997-1998, 2004, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined _LIBC || defined HAVE_FEATURES_H
+# include <features.h>
+#endif
+
+#ifndef __USE_EXTERN_INLINES
+# define __USE_EXTERN_INLINES 1
+#endif
+#define ARGP_EI
+#undef __OPTIMIZE__
+#define __OPTIMIZE__ 1
+#include "argp.h"
+
+/* Add weak aliases. */
+#if _LIBC - 0 && defined (weak_alias)
+
+weak_alias (__argp_usage, argp_usage)
+weak_alias (__option_is_short, _option_is_short)
+weak_alias (__option_is_end, _option_is_end)
+
+#endif
diff --git a/gnulib/lib/argp.h b/gnulib/lib/argp.h
new file mode 100644
index 0000000..c0483ab
--- /dev/null
+++ b/gnulib/lib/argp.h
@@ -0,0 +1,645 @@
+/* Hierarchial argument parsing, layered over getopt.
+ Copyright (C) 1995-1999, 2003-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Miles Bader <miles@gnu.ai.mit.edu>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _ARGP_H
+#define _ARGP_H
+
+#include <stdio.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <limits.h>
+
+#define __need_error_t
+#include <errno.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+#ifndef __NTH
+# define __NTH(fct) fct __THROW
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words. */
+#ifndef __restrict
+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
+# if 199901L <= __STDC_VERSION__
+# define __restrict restrict
+# else
+# define __restrict
+# endif
+# endif
+#endif
+
+#ifndef __error_t_defined
+typedef int error_t;
+# define __error_t_defined
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A description of a particular option. A pointer to an array of
+ these is passed in the OPTIONS field of an argp structure. Each option
+ entry can correspond to one long option and/or one short option; more
+ names for the same option can be added by following an entry in an option
+ array with options having the OPTION_ALIAS flag set. */
+struct argp_option
+{
+ /* The long option name. For more than one name for the same option, you
+ can use following options with the OPTION_ALIAS flag set. */
+ const char *name;
+
+ /* What key is returned for this option. If > 0 and printable, then it's
+ also accepted as a short option. */
+ int key;
+
+ /* If non-NULL, this is the name of the argument associated with this
+ option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */
+ const char *arg;
+
+ /* OPTION_ flags. */
+ int flags;
+
+ /* The doc string for this option. If both NAME and KEY are 0, This string
+ will be printed outdented from the normal option column, making it
+ useful as a group header (it will be the first thing printed in its
+ group); in this usage, it's conventional to end the string with a `:'.
+
+ Write the initial value as N_("TEXT") if you want xgettext to collect
+ it into a POT file. */
+ const char *doc;
+
+ /* The group this option is in. In a long help message, options are sorted
+ alphabetically within each group, and the groups presented in the order
+ 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with
+ if this field 0 will inherit the group number of the previous entry, or
+ zero if it's the first one, unless its a group header (NAME and KEY both
+ 0), in which case, the previous entry + 1 is the default. Automagic
+ options such as --help are put into group -1. */
+ int group;
+};
+
+/* The argument associated with this option is optional. */
+#define OPTION_ARG_OPTIONAL 0x1
+
+/* This option isn't displayed in any help messages. */
+#define OPTION_HIDDEN 0x2
+
+/* This option is an alias for the closest previous non-alias option. This
+ means that it will be displayed in the same help entry, and will inherit
+ fields other than NAME and KEY from the aliased option. */
+#define OPTION_ALIAS 0x4
+
+/* This option isn't actually an option (and so should be ignored by the
+ actual option parser), but rather an arbitrary piece of documentation that
+ should be displayed in much the same manner as the options. If this flag
+ is set, then the option NAME field is displayed unmodified (e.g., no `--'
+ prefix is added) at the left-margin (where a *short* option would normally
+ be displayed), and the documentation string in the normal place. The NAME
+ field will be translated using gettext, unless OPTION_NO_TRANS is set (see
+ below). For purposes of sorting, any leading whitespace and punctuation is
+ ignored, except that if the first non-whitespace character is not `-', this
+ entry is displayed after all options (and OPTION_DOC entries with a leading
+ `-') in the same group. */
+#define OPTION_DOC 0x8
+
+/* This option shouldn't be included in `long' usage messages (but is still
+ included in help messages). This is mainly intended for options that are
+ completely documented in an argp's ARGS_DOC field, in which case including
+ the option in the generic usage list would be redundant. For instance,
+ if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to
+ distinguish these two cases, -x should probably be marked
+ OPTION_NO_USAGE. */
+#define OPTION_NO_USAGE 0x10
+
+/* Valid only in conjunction with OPTION_DOC. This option disables translation
+ of option name. */
+#define OPTION_NO_TRANS 0x20
+
+
+struct argp; /* fwd declare this type */
+struct argp_state; /* " */
+struct argp_child; /* " */
+
+/* The type of a pointer to an argp parsing function. */
+typedef error_t (*argp_parser_t) (int key, char *arg,
+ struct argp_state *state);
+
+/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such
+ returns will simply be ignored. For user keys, this error will be turned
+ into EINVAL (if the call to argp_parse is such that errors are propagated
+ back to the user instead of exiting); returning EINVAL itself would result
+ in an immediate stop to parsing in *all* cases. */
+#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */
+
+/* Special values for the KEY argument to an argument parsing function.
+ ARGP_ERR_UNKNOWN should be returned if they aren't understood.
+
+ The sequence of keys to a parsing function is either (where each
+ uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):
+
+ INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
+ or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
+ or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized
+
+ The third case is where every parser returned ARGP_KEY_UNKNOWN for an
+ argument, in which case parsing stops at that argument (returning the
+ unparsed arguments to the caller of argp_parse if requested, or stopping
+ with an error message if not).
+
+ If an error occurs (either detected by argp, or because the parsing
+ function returned an error value), then the parser is called with
+ ARGP_KEY_ERROR, and no further calls are made. */
+
+/* This is not an option at all, but rather a command line argument. If a
+ parser receiving this key returns success, the fact is recorded, and the
+ ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the
+ argument, a parser function decrements the NEXT field of the state it's
+ passed, the option won't be considered processed; this is to allow you to
+ actually modify the argument (perhaps into an option), and have it
+ processed again. */
+#define ARGP_KEY_ARG 0
+/* There are remaining arguments not parsed by any parser, which may be found
+ starting at (STATE->argv + STATE->next). If success is returned, but
+ STATE->next left untouched, it's assumed that all arguments were consume,
+ otherwise, the parser should adjust STATE->next to reflect any arguments
+ consumed. */
+#define ARGP_KEY_ARGS 0x1000006
+/* There are no more command line arguments at all. */
+#define ARGP_KEY_END 0x1000001
+/* Because it's common to want to do some special processing if there aren't
+ any non-option args, user parsers are called with this key if they didn't
+ successfully process any non-option arguments. Called just before
+ ARGP_KEY_END (where more general validity checks on previously parsed
+ arguments can take place). */
+#define ARGP_KEY_NO_ARGS 0x1000002
+/* Passed in before any parsing is done. Afterwards, the values of each
+ element of the CHILD_INPUT field, if any, in the state structure is
+ copied to each child's state to be the initial value of the INPUT field. */
+#define ARGP_KEY_INIT 0x1000003
+/* Use after all other keys, including SUCCESS & END. */
+#define ARGP_KEY_FINI 0x1000007
+/* Passed in when parsing has successfully been completed (even if there are
+ still arguments remaining). */
+#define ARGP_KEY_SUCCESS 0x1000004
+/* Passed in if an error occurs. */
+#define ARGP_KEY_ERROR 0x1000005
+
+/* An argp structure contains a set of options declarations, a function to
+ deal with parsing one, documentation string, a possible vector of child
+ argp's, and perhaps a function to filter help output. When actually
+ parsing options, getopt is called with the union of all the argp
+ structures chained together through their CHILD pointers, with conflicts
+ being resolved in favor of the first occurrence in the chain. */
+struct argp
+{
+ /* An array of argp_option structures, terminated by an entry with both
+ NAME and KEY having a value of 0. */
+ const struct argp_option *options;
+
+ /* What to do with an option from this structure. KEY is the key
+ associated with the option, and ARG is any associated argument (NULL if
+ none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be
+ returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then
+ parsing is stopped immediately, and that value is returned from
+ argp_parse(). For special (non-user-supplied) values of KEY, see the
+ ARGP_KEY_ definitions below. */
+ argp_parser_t parser;
+
+ /* A string describing what other arguments are wanted by this program. It
+ is only used by argp_usage to print the `Usage:' message. If it
+ contains newlines, the strings separated by them are considered
+ alternative usage patterns, and printed on separate lines (lines after
+ the first are prefix by ` or: ' instead of `Usage:'). */
+ const char *args_doc;
+
+ /* If non-NULL, a string containing extra text to be printed before and
+ after the options in a long help message (separated by a vertical tab
+ `\v' character).
+ Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
+ you want xgettext to collect the two pieces of text into a POT file. */
+ const char *doc;
+
+ /* A vector of argp_children structures, terminated by a member with a 0
+ argp field, pointing to child argps should be parsed with this one. Any
+ conflicts are resolved in favor of this argp, or early argps in the
+ CHILDREN list. This field is useful if you use libraries that supply
+ their own argp structure, which you want to use in conjunction with your
+ own. */
+ const struct argp_child *children;
+
+ /* If non-zero, this should be a function to filter the output of help
+ messages. KEY is either a key from an option, in which case TEXT is
+ that option's help text, or a special key from the ARGP_KEY_HELP_
+ defines, below, describing which other help text TEXT is. The function
+ should return either TEXT, if it should be used as-is, a replacement
+ string, which should be malloced, and will be freed by argp, or NULL,
+ meaning `print nothing'. The value for TEXT is *after* any translation
+ has been done, so if any of the replacement text also needs translation,
+ that should be done by the filter function. INPUT is either the input
+ supplied to argp_parse, or NULL, if argp_help was called directly. */
+ char *(*help_filter) (int __key, const char *__text, void *__input);
+
+ /* If non-zero the strings used in the argp library are translated using
+ the domain described by this string. Otherwise the currently installed
+ default domain is used. */
+ const char *argp_domain;
+};
+
+/* Possible KEY arguments to a help filter function. */
+#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */
+#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
+#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
+#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
+ TEXT is NULL for this key. */
+/* Explanatory note emitted when duplicate option arguments have been
+ suppressed. */
+#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005
+#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */
+
+/* When an argp has a non-zero CHILDREN field, it should point to a vector of
+ argp_child structures, each of which describes a subsidiary argp. */
+struct argp_child
+{
+ /* The child parser. */
+ const struct argp *argp;
+
+ /* Flags for this child. */
+ int flags;
+
+ /* If non-zero, an optional header to be printed in help output before the
+ child options. As a side-effect, a non-zero value forces the child
+ options to be grouped together; to achieve this effect without actually
+ printing a header string, use a value of "". */
+ const char *header;
+
+ /* Where to group the child options relative to the other (`consolidated')
+ options in the parent argp; the values are the same as the GROUP field
+ in argp_option structs, but all child-groupings follow parent options at
+ a particular group level. If both this field and HEADER are zero, then
+ they aren't grouped at all, but rather merged with the parent options
+ (merging the child's grouping levels with the parents). */
+ int group;
+};
+
+/* Parsing state. This is provided to parsing functions called by argp,
+ which may examine and, as noted, modify fields. */
+struct argp_state
+{
+ /* The top level ARGP being parsed. */
+ const struct argp *root_argp;
+
+ /* The argument vector being parsed. May be modified. */
+ int argc;
+ char **argv;
+
+ /* The index in ARGV of the next arg that to be parsed. May be modified. */
+ int next;
+
+ /* The flags supplied to argp_parse. May be modified. */
+ unsigned flags;
+
+ /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the
+ number of the current arg, starting at zero, and incremented after each
+ such call returns. At all other times, this is the number of such
+ arguments that have been processed. */
+ unsigned arg_num;
+
+ /* If non-zero, the index in ARGV of the first argument following a special
+ `--' argument (which prevents anything following being interpreted as an
+ option). Only set once argument parsing has proceeded past this point. */
+ int quoted;
+
+ /* An arbitrary pointer passed in from the user. */
+ void *input;
+ /* Values to pass to child parsers. This vector will be the same length as
+ the number of children for the current parser. */
+ void **child_inputs;
+
+ /* For the parser's use. Initialized to 0. */
+ void *hook;
+
+ /* The name used when printing messages. This is initialized to ARGV[0],
+ or PROGRAM_INVOCATION_NAME if that is unavailable. */
+ char *name;
+
+ /* Streams used when argp prints something. */
+ FILE *err_stream; /* For errors; initialized to stderr. */
+ FILE *out_stream; /* For information; initialized to stdout. */
+
+ void *pstate; /* Private, for use by argp. */
+};
+
+/* Flags for argp_parse (note that the defaults are those that are
+ convenient for program command line parsing): */
+
+/* Don't ignore the first element of ARGV. Normally (and always unless
+ ARGP_NO_ERRS is set) the first element of the argument vector is
+ skipped for option parsing purposes, as it corresponds to the program name
+ in a command line. */
+#define ARGP_PARSE_ARGV0 0x01
+
+/* Don't print error messages for unknown options to stderr; unless this flag
+ is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program
+ name in the error messages. This flag implies ARGP_NO_EXIT (on the
+ assumption that silent exiting upon errors is bad behaviour). */
+#define ARGP_NO_ERRS 0x02
+
+/* Don't parse any non-option args. Normally non-option args are parsed by
+ calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg
+ as the value. Since it's impossible to know which parse function wants to
+ handle it, each one is called in turn, until one returns 0 or an error
+ other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the
+ argp_parse returns prematurely (but with a return value of 0). If all
+ args have been parsed without error, all parsing functions are called one
+ last time with a key of ARGP_KEY_END. This flag needn't normally be set,
+ as the normal behavior is to stop parsing as soon as some argument can't
+ be handled. */
+#define ARGP_NO_ARGS 0x04
+
+/* Parse options and arguments in the same order they occur on the command
+ line -- normally they're rearranged so that all options come first. */
+#define ARGP_IN_ORDER 0x08
+
+/* Don't provide the standard long option --help, which causes usage and
+ option help information to be output to stdout, and exit (0) called. */
+#define ARGP_NO_HELP 0x10
+
+/* Don't exit on errors (they may still result in error messages). */
+#define ARGP_NO_EXIT 0x20
+
+/* Use the gnu getopt `long-only' rules for parsing arguments. */
+#define ARGP_LONG_ONLY 0x40
+
+/* Turns off any message-printing/exiting options. */
+#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)
+
+/* Parse the options strings in ARGC & ARGV according to the options in ARGP.
+ FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the
+ index in ARGV of the first unparsed option is returned in it. If an
+ unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser
+ routine returned a non-zero value, it is returned; otherwise 0 is
+ returned. This function may also call exit unless the ARGP_NO_HELP flag
+ is set. INPUT is a pointer to a value to be passed in to the parser. */
+extern error_t argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+extern error_t __argp_parse (const struct argp *__restrict __argp,
+ int /*argc*/, char **__restrict /*argv*/,
+ unsigned __flags, int *__restrict __arg_index,
+ void *__restrict __input);
+
+/* Global variables. */
+
+/* GNULIB makes sure both program_invocation_name and
+ program_invocation_short_name are available */
+#ifdef GNULIB_PROGRAM_INVOCATION_NAME
+extern char *program_invocation_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_NAME 1
+#endif
+
+#ifdef GNULIB_PROGRAM_INVOCATION_SHORT_NAME
+extern char *program_invocation_short_name;
+# undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+# define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 1
+#endif
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ will print this string followed by a newline and exit (unless the
+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
+extern const char *argp_program_version;
+
+/* If defined or set by the user program to a non-zero value, then a default
+ option --version is added (unless the ARGP_NO_HELP flag is used), which
+ calls this function with a stream to print the version to and a pointer to
+ the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is
+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */
+extern void (*argp_program_version_hook) (FILE *__restrict __stream,
+ struct argp_state *__restrict
+ __state);
+
+/* If defined or set by the user program, it should point to string that is
+ the bug-reporting address for the program. It will be printed by
+ argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
+ standard help messages), embedded in a sentence that says something like
+ `Report bugs to ADDR.'. */
+extern const char *argp_program_bug_address;
+
+/* The exit status that argp will use when exiting due to a parsing error.
+ If not defined or set by the user program, this defaults to EX_USAGE from
+ <sysexits.h>. */
+extern error_t argp_err_exit_status;
+
+/* Flags for argp_help. */
+#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
+#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
+#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */
+#define ARGP_HELP_LONG 0x08 /* a long help message. */
+#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
+#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
+#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)
+#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */
+#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to
+ reflect ARGP_LONG_ONLY mode. */
+
+/* These ARGP_HELP flags are only understood by argp_state_help. */
+#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */
+#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */
+
+/* The standard thing to do after a program command line parsing error, if an
+ error message has already been printed. */
+#define ARGP_HELP_STD_ERR \
+ (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do after a program command line parsing error, if no
+ more specific error message has been printed. */
+#define ARGP_HELP_STD_USAGE \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)
+/* The standard thing to do in response to a --help option. */
+#define ARGP_HELP_STD_HELP \
+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \
+ | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)
+
+/* Output a usage message for ARGP to STREAM. FLAGS are from the set
+ ARGP_HELP_*. */
+extern void argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream,
+ unsigned __flags, char *__restrict __name);
+extern void __argp_help (const struct argp *__restrict __argp,
+ FILE *__restrict __stream, unsigned __flags,
+ char *__name);
+
+/* The following routines are intended to be called from within an argp
+ parsing routine (thus taking an argp_state structure as the first
+ argument). They may or may not print an error message and exit, depending
+ on the flags in STATE -- in any case, the caller should be prepared for
+ them *not* to exit, and should return an appropiate error after calling
+ them. [argp_usage & argp_error should probably be called argp_state_...,
+ but they're used often enough that they should be short] */
+
+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are
+ from the set ARGP_HELP_*. */
+extern void argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+extern void __argp_state_help (const struct argp_state *__restrict __state,
+ FILE *__restrict __stream,
+ unsigned int __flags);
+
+#if _LIBC || !defined __USE_EXTERN_INLINES
+/* Possibly output the standard usage message for ARGP to stderr and exit. */
+extern void argp_usage (const struct argp_state *__state);
+extern void __argp_usage (const struct argp_state *__state);
+#endif
+
+/* If appropriate, print the printf string FMT and following args, preceded
+ by the program name and `:', to stderr, and followed by a `Try ... --help'
+ message, then exit (1). */
+extern void argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
+extern void __argp_error (const struct argp_state *__restrict __state,
+ const char *__restrict __fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
+
+/* Similar to the standard gnu error-reporting function error(), but will
+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
+ to STATE->err_stream. This is useful for argument parsing code that is
+ shared between program startup (when exiting is desired) and runtime
+ option parsing (when typically an error code is returned instead). The
+ difference between this function and argp_error is that the latter is for
+ *parsing errors*, and the former is for other problems that occur during
+ parsing but don't reflect a (syntactic) problem with the input. */
+extern void argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
+extern void __argp_failure (const struct argp_state *__restrict __state,
+ int __status, int __errnum,
+ const char *__restrict __fmt, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
+
+#if _LIBC || !defined __USE_EXTERN_INLINES
+/* Returns true if the option OPT is a valid short option. */
+extern int _option_is_short (const struct argp_option *__opt) __THROW;
+extern int __option_is_short (const struct argp_option *__opt) __THROW;
+
+/* Returns true if the option OPT is in fact the last (unused) entry in an
+ options array. */
+extern int _option_is_end (const struct argp_option *__opt) __THROW;
+extern int __option_is_end (const struct argp_option *__opt) __THROW;
+#endif
+
+/* Return the input field for ARGP in the parser corresponding to STATE; used
+ by the help routines. */
+extern void *_argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+extern void *__argp_input (const struct argp *__restrict __argp,
+ const struct argp_state *__restrict __state)
+ __THROW;
+
+#ifdef __USE_EXTERN_INLINES
+
+# if !_LIBC
+# define __argp_usage argp_usage
+# define __argp_state_help argp_state_help
+# define __option_is_short _option_is_short
+# define __option_is_end _option_is_end
+# endif
+
+# ifndef ARGP_EI
+# ifdef __GNUC__
+ /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. It defines a macro
+ __GNUC_STDC_INLINE__ to indicate this situation or a macro
+ __GNUC_GNU_INLINE__ to indicate the opposite situation.
+ GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+ semantics but warns, unless -fgnu89-inline is used:
+ warning: C99 inline functions are not supported; using GNU89
+ warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+ It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */
+# if defined __GNUC_STDC_INLINE__
+# define ARGP_EI __inline__
+# elif defined __GNUC_GNU_INLINE__
+# define ARGP_EI extern __inline__ __attribute__ ((__gnu_inline__))
+# else
+# define ARGP_EI extern __inline__
+# endif
+# else
+ /* With other compilers, assume the ISO C99 meaning of 'inline', if
+ the compiler supports 'inline' at all. */
+# define ARGP_EI inline
+# endif
+# endif
+
+ARGP_EI void
+__argp_usage (const struct argp_state *__state)
+{
+ __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);
+}
+
+ARGP_EI int
+__NTH (__option_is_short (const struct argp_option *__opt))
+{
+ if (__opt->flags & OPTION_DOC)
+ return 0;
+ else
+ {
+ int __key = __opt->key;
+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key);
+ }
+}
+
+ARGP_EI int
+__NTH (__option_is_end (const struct argp_option *__opt))
+{
+ return !__opt->key && !__opt->name && !__opt->doc && !__opt->group;
+}
+
+# if !_LIBC
+# undef __argp_usage
+# undef __argp_state_help
+# undef __option_is_short
+# undef __option_is_end
+# endif
+#endif /* Use extern inlines. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* argp.h */
diff --git a/gnulib/lib/argv-iter.c b/gnulib/lib/argv-iter.c
new file mode 100644
index 0000000..340e588
--- /dev/null
+++ b/gnulib/lib/argv-iter.c
@@ -0,0 +1,111 @@
+/* Iterate over arguments from argv or --files0-from=FILE
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+#include "argv-iter.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+struct argv_iterator
+{
+ /* Test FP to determine whether in read-mode or argv-mode. */
+ /* file-mode: fp records position */
+ FILE *fp;
+ size_t item_idx;
+ char *tok;
+ size_t buf_len;
+
+ /* argv-mode: record just argv and current pointer */
+ char **arg_list;
+ char **p;
+};
+
+struct argv_iterator *
+argv_iter_init_argv (char **argv)
+{
+ struct argv_iterator *ai = malloc (sizeof *ai);
+ if (!ai)
+ return NULL;
+ ai->fp = NULL;
+ ai->arg_list = argv;
+ ai->p = argv;
+ return ai;
+}
+
+/* Initialize to read from the stream, FP.
+ The input is expected to contain a list of NUL-delimited tokens. */
+struct argv_iterator *
+argv_iter_init_stream (FILE *fp)
+{
+ struct argv_iterator *ai = malloc (sizeof *ai);
+ if (!ai)
+ return NULL;
+ ai->fp = fp;
+ ai->tok = NULL;
+ ai->buf_len = 0;
+
+ ai->item_idx = 0;
+ ai->arg_list = NULL;
+ return ai;
+}
+
+char *
+argv_iter (struct argv_iterator *ai, enum argv_iter_err *err)
+{
+ if (ai->fp)
+ {
+ ssize_t len = getdelim (&ai->tok, &ai->buf_len, '\0', ai->fp);
+ if (len < 0)
+ {
+ *err = feof (ai->fp) ? AI_ERR_EOF : AI_ERR_READ;
+ return NULL;
+ }
+
+ *err = AI_ERR_OK;
+ ai->item_idx++;
+ return ai->tok;
+ }
+ else
+ {
+ if (*(ai->p) == NULL)
+ {
+ *err = AI_ERR_EOF;
+ return NULL;
+ }
+ else
+ {
+ *err = AI_ERR_OK;
+ return *(ai->p++);
+ }
+ }
+}
+
+size_t
+argv_iter_n_args (struct argv_iterator const *ai)
+{
+ return ai->fp ? ai->item_idx : ai->p - ai->arg_list;
+}
+
+void
+argv_iter_free (struct argv_iterator *ai)
+{
+ if (ai->fp)
+ free (ai->tok);
+ free (ai);
+}
diff --git a/gnulib/lib/argv-iter.h b/gnulib/lib/argv-iter.h
new file mode 100644
index 0000000..73db77d
--- /dev/null
+++ b/gnulib/lib/argv-iter.h
@@ -0,0 +1,42 @@
+/* Iterate over arguments from argv or --files0-from=FILE
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdbool.h>
+
+/* Definition of _GL_ARG_NONNULL. */
+#include "arg-nonnull.h"
+
+struct argv_iterator;
+
+enum argv_iter_err
+{
+ AI_ERR_OK = 1,
+ AI_ERR_EOF,
+ AI_ERR_MEM,
+ AI_ERR_READ
+};
+
+struct argv_iterator *argv_iter_init_argv (char **argv)
+ _GL_ARG_NONNULL ((1));
+struct argv_iterator *argv_iter_init_stream (FILE *fp)
+ _GL_ARG_NONNULL ((1));
+char *argv_iter (struct argv_iterator *, enum argv_iter_err *)
+ _GL_ARG_NONNULL ((1, 2));
+size_t argv_iter_n_args (struct argv_iterator const *)
+ _GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1));
+void argv_iter_free (struct argv_iterator *)
+ _GL_ARG_NONNULL ((1));
diff --git a/gnulib/lib/argz.c b/gnulib/lib/argz.c
new file mode 100644
index 0000000..8745c89
--- /dev/null
+++ b/gnulib/lib/argz.c
@@ -0,0 +1,407 @@
+/* Functions for dealing with '\0' separated arg vectors.
+ Copyright (C) 1995-1998, 2000-2002, 2006, 2008-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <argz.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+/* Add BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */
+error_t
+argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len)
+{
+ size_t new_argz_len = *argz_len + buf_len;
+ char *new_argz = realloc (*argz, new_argz_len);
+ if (new_argz)
+ {
+ memcpy (new_argz + *argz_len, buf, buf_len);
+ *argz = new_argz;
+ *argz_len = new_argz_len;
+ return 0;
+ }
+ else
+ return ENOMEM;
+}
+
+/* Add STR to the argz vector in ARGZ & ARGZ_LEN. This should be moved into
+ argz.c in libshouldbelibc. */
+error_t
+argz_add (char **argz, size_t *argz_len, const char *str)
+{
+ return argz_append (argz, argz_len, str, strlen (str) + 1);
+}
+
+
+
+error_t
+argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim)
+{
+ size_t nlen = strlen (string) + 1;
+
+ if (nlen > 1)
+ {
+ const char *rp;
+ char *wp;
+
+ *argz = (char *) realloc (*argz, *argz_len + nlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ wp = *argz + *argz_len;
+ rp = string;
+ do
+ if (*rp == delim)
+ {
+ if (wp > *argz && wp[-1] != '\0')
+ *wp++ = '\0';
+ else
+ --nlen;
+ }
+ else
+ *wp++ = *rp;
+ while (*rp++ != '\0');
+
+ *argz_len += nlen;
+ }
+
+ return 0;
+}
+
+
+
+error_t
+argz_create_sep (const char *string, int delim, char **argz, size_t *len)
+{
+ size_t nlen = strlen (string) + 1;
+
+ if (nlen > 1)
+ {
+ const char *rp;
+ char *wp;
+
+ *argz = (char *) malloc (nlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ rp = string;
+ wp = *argz;
+ do
+ if (*rp == delim)
+ {
+ if (wp > *argz && wp[-1] != '\0')
+ *wp++ = '\0';
+ else
+ --nlen;
+ }
+ else
+ *wp++ = *rp;
+ while (*rp++ != '\0');
+
+ if (nlen == 0)
+ {
+ free (*argz);
+ *argz = NULL;
+ *len = 0;
+ }
+
+ *len = nlen;
+ }
+ else
+ {
+ *argz = NULL;
+ *len = 0;
+ }
+
+ return 0;
+}
+
+
+/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
+ existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
+ Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
+ ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not
+ in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
+ ARGZ, ENOMEM is returned, else 0. */
+error_t
+argz_insert (char **argz, size_t *argz_len, char *before, const char *entry)
+{
+ if (! before)
+ return argz_add (argz, argz_len, entry);
+
+ if (before < *argz || before >= *argz + *argz_len)
+ return EINVAL;
+
+ if (before > *argz)
+ /* Make sure before is actually the beginning of an entry. */
+ while (before[-1])
+ before--;
+
+ {
+ size_t after_before = *argz_len - (before - *argz);
+ size_t entry_len = strlen (entry) + 1;
+ size_t new_argz_len = *argz_len + entry_len;
+ char *new_argz = realloc (*argz, new_argz_len);
+
+ if (new_argz)
+ {
+ before = new_argz + (before - *argz);
+ memmove (before + entry_len, before, after_before);
+ memmove (before, entry, entry_len);
+ *argz = new_argz;
+ *argz_len = new_argz_len;
+ return 0;
+ }
+ else
+ return ENOMEM;
+ }
+}
+
+
+char *
+argz_next (const char *argz, size_t argz_len, const char *entry)
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return (char *) argz;
+ else
+ return NULL;
+}
+
+
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+void
+argz_stringify (char *argz, size_t len, int sep)
+{
+ if (len > 0)
+ while (1)
+ {
+ size_t part_len = strnlen (argz, len);
+ argz += part_len;
+ len -= part_len;
+ if (len-- <= 1) /* includes final '\0' we want to stop at */
+ break;
+ *argz++ = sep;
+ }
+}
+
+
+/* Returns the number of strings in ARGZ. */
+size_t
+argz_count (const char *argz, size_t len)
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+
+
+/* Puts pointers to each string in ARGZ, plus a terminating 0 element, into
+ ARGV, which must be large enough to hold them all. */
+void
+argz_extract (const char *argz, size_t len, char **argv)
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ *argv++ = (char *) argz;
+ argz += part_len + 1;
+ len -= part_len + 1;
+ }
+ *argv = 0;
+}
+
+
+/* Make a '\0' separated arg vector from a unix argv vector, returning it in
+ ARGZ, and the total length in LEN. If a memory allocation error occurs,
+ ENOMEM is returned, otherwise 0. */
+error_t
+argz_create (char *const argv[], char **argz, size_t *len)
+{
+ int argc;
+ size_t tlen = 0;
+ char *const *ap;
+ char *p;
+
+ for (argc = 0; argv[argc] != NULL; ++argc)
+ tlen += strlen (argv[argc]) + 1;
+
+ if (tlen == 0)
+ *argz = NULL;
+ else
+ {
+ *argz = malloc (tlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ for (p = *argz, ap = argv; *ap; ++ap, ++p)
+ p = stpcpy (p, *ap);
+ }
+ *len = tlen;
+
+ return 0;
+}
+
+
+/* Delete ENTRY from ARGZ & ARGZ_LEN, if any. */
+void
+argz_delete (char **argz, size_t *argz_len, char *entry)
+{
+ if (entry)
+ /* Get rid of the old value for NAME. */
+ {
+ size_t entry_len = strlen (entry) + 1;
+ *argz_len -= entry_len;
+ memmove (entry, entry + entry_len, *argz_len - (entry - *argz));
+ if (*argz_len == 0)
+ {
+ free (*argz);
+ *argz = 0;
+ }
+ }
+}
+
+
+/* Append BUF, of length BUF_LEN to *TO, of length *TO_LEN, reallocating and
+ updating *TO & *TO_LEN appropriately. If an allocation error occurs,
+ *TO's old value is freed, and *TO is set to 0. */
+static void
+str_append (char **to, size_t *to_len, const char *buf, const size_t buf_len)
+{
+ size_t new_len = *to_len + buf_len;
+ char *new_to = realloc (*to, new_len + 1);
+
+ if (new_to)
+ {
+ *((char *) mempcpy (new_to + *to_len, buf, buf_len)) = '\0';
+ *to = new_to;
+ *to_len = new_len;
+ }
+ else
+ {
+ free (*to);
+ *to = 0;
+ }
+}
+
+/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
+ ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+ incremented by number of replacements performed. */
+error_t
+argz_replace (char **argz, size_t *argz_len, const char *str, const char *with,
+ unsigned *replace_count)
+{
+ error_t err = 0;
+
+ if (str && *str)
+ {
+ char *arg = 0;
+ char *src = *argz;
+ size_t src_len = *argz_len;
+ char *dst = 0;
+ size_t dst_len = 0;
+ int delayed_copy = 1; /* True while we've avoided copying anything. */
+ size_t str_len = strlen (str), with_len = strlen (with);
+
+ while (!err && (arg = argz_next (src, src_len, arg)))
+ {
+ char *match = strstr (arg, str);
+ if (match)
+ {
+ char *from = match + str_len;
+ size_t to_len = match - arg;
+ char *to = strndup (arg, to_len);
+
+ while (to && from)
+ {
+ str_append (&to, &to_len, with, with_len);
+ if (to)
+ {
+ match = strstr (from, str);
+ if (match)
+ {
+ str_append (&to, &to_len, from, match - from);
+ from = match + str_len;
+ }
+ else
+ {
+ str_append (&to, &to_len, from, strlen (from));
+ from = 0;
+ }
+ }
+ }
+
+ if (to)
+ {
+ if (delayed_copy)
+ /* We avoided copying SRC to DST until we found a match;
+ now that we've done so, copy everything from the start
+ of SRC. */
+ {
+ if (arg > src)
+ err = argz_append (&dst, &dst_len, src, (arg - src));
+ delayed_copy = 0;
+ }
+ if (! err)
+ err = argz_add (&dst, &dst_len, to);
+ free (to);
+ }
+ else
+ err = ENOMEM;
+
+ if (replace_count)
+ (*replace_count)++;
+ }
+ else if (! delayed_copy)
+ err = argz_add (&dst, &dst_len, arg);
+ }
+
+ if (! err)
+ {
+ if (! delayed_copy)
+ /* We never found any instances of str. */
+ {
+ free (src);
+ *argz = dst;
+ *argz_len = dst_len;
+ }
+ }
+ else if (dst_len > 0)
+ free (dst);
+ }
+
+ return err;
+}
diff --git a/gnulib/lib/argz.in.h b/gnulib/lib/argz.in.h
new file mode 100644
index 0000000..d769350
--- /dev/null
+++ b/gnulib/lib/argz.in.h
@@ -0,0 +1,160 @@
+/* Routines for dealing with '\0' separated arg vectors.
+ Copyright (C) 1995-2000, 2004, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _ARGZ_H
+#define _ARGZ_H 1
+
+
+#define __need_error_t
+#include <errno.h>
+#include <string.h> /* Need size_t, and strchr is called below. */
+
+#ifndef const
+# define const const
+#endif
+
+#ifndef __error_t_defined
+typedef int error_t;
+#endif
+
+
+
+/* Make a '\0' separated arg vector from a unix argv vector, returning it in
+ ARGZ, and the total length in LEN. If a memory allocation error occurs,
+ ENOMEM is returned, otherwise 0. The result can be destroyed using free. */
+
+extern error_t argz_create (char *const __argv[], char **restrict __argz,
+ size_t *restrict __len);
+
+/* Make a '\0' separated arg vector from a SEP separated list in
+ STRING, returning it in ARGZ, and the total length in LEN. If a
+ memory allocation error occurs, ENOMEM is returned, otherwise 0.
+ The result can be destroyed using free. */
+
+extern error_t argz_create_sep (const char *restrict string,
+ int __sep, char **restrict __argz,
+ size_t *restrict __len);
+
+/* Returns the number of strings in ARGZ. */
+
+extern size_t argz_count (const char *__argz, size_t __len)
+;
+
+/* Puts pointers to each string in ARGZ into ARGV, which must be large enough
+ to hold them all. */
+
+extern void argz_extract (const char *restrict __argz, size_t __len,
+ char **restrict __argv);
+
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+
+extern void argz_stringify (char *__argz, size_t __len, int __sep);
+
+/* Append BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */
+
+extern error_t argz_append (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict __buf, size_t __buf_len)
+;
+
+/* Append STR to the argz vector in ARGZ & ARGZ_LEN. */
+
+extern error_t argz_add (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict str);
+
+/* Append SEP separated list in STRING to the argz vector in ARGZ &
+ ARGZ_LEN. */
+
+extern error_t argz_add_sep (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict string, int __delim)
+;
+
+/* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */
+
+extern void argz_delete (char **restrict __argz,
+ size_t *restrict __argz_len,
+ char *restrict __entry);
+
+/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
+ existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
+ Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
+ ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not
+ in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
+ ARGZ, ENOMEM is returned, else 0. */
+
+extern error_t argz_insert (char **restrict __argz,
+ size_t *restrict __argz_len,
+ char *restrict __before,
+ const char *restrict __entry);
+
+/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
+ ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
+ incremented by number of replacements performed. */
+
+extern error_t argz_replace (char **restrict __argz,
+ size_t *restrict __argz_len,
+ const char *restrict str,
+ const char *restrict __with,
+ unsigned int *restrict __replace_count);
+
+/* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
+ are no more. If entry is NULL, then the first entry is returned. This
+ behavior allows two convenient iteration styles:
+
+ char *entry = 0;
+ while ((entry = argz_next (argz, argz_len, entry)))
+ ...;
+
+ or
+
+ char *entry;
+ for (entry = argz; entry; entry = argz_next (argz, argz_len, entry))
+ ...;
+*/
+
+extern char *argz_next (const char *restrict __argz, size_t __argz_len,
+ const char *restrict __entry);
+
+#ifdef __USE_EXTERN_INLINES
+__extern_inline char *
+__NTH (argz_next (const char *__argz, size_t __argz_len,
+ const char *__entry))
+{
+ if (__entry)
+ {
+ if (__entry < __argz + __argz_len)
+ __entry = strchr (__entry, '\0') + 1;
+
+ return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry;
+ }
+ else
+ return __argz_len > 0 ? (char *) __argz : 0;
+}
+__extern_inline char *
+__NTH (argz_next (const char *__argz, size_t __argz_len,
+ const char *__entry))
+{
+ return argz_next (__argz, __argz_len, __entry);
+}
+#endif /* Use extern inlines. */
+
+
+#endif /* argz.h */
diff --git a/gnulib/lib/arpa_inet.in.h b/gnulib/lib/arpa_inet.in.h
new file mode 100644
index 0000000..bf18316
--- /dev/null
+++ b/gnulib/lib/arpa_inet.in.h
@@ -0,0 +1,141 @@
+/* A GNU-like <arpa/inet.h>.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_ARPA_INET_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_FEATURES_H@
+# include <features.h> /* for __GLIBC__ */
+#endif
+
+/* Gnulib's sys/socket.h is responsible for defining socklen_t (used below) and
+ for pulling in winsock2.h etc. under MinGW.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <sys/socket.h>
+#endif
+
+/* On NonStop Kernel, inet_ntop and inet_pton are declared in <netdb.h>.
+ But avoid namespace pollution on glibc systems. */
+#if defined __TANDEM && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+#if @HAVE_ARPA_INET_H@
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_ARPA_INET_H
+#define _@GUARD_PREFIX@_ARPA_INET_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if @GNULIB_INET_NTOP@
+/* Converts an internet address from internal format to a printable,
+ presentable format.
+ AF is an internet address family, such as AF_INET or AF_INET6.
+ SRC points to a 'struct in_addr' (for AF_INET) or 'struct in6_addr'
+ (for AF_INET6).
+ DST points to a buffer having room for CNT bytes.
+ The printable representation of the address (in numeric form, not
+ surrounded by [...], no reverse DNS is done) is placed in DST, and
+ DST is returned. If an error occurs, the return value is NULL and
+ errno is set. If CNT bytes are not sufficient to hold the result,
+ the return value is NULL and errno is set to ENOSPC. A good value
+ for CNT is 46.
+
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/inet_ntop.html>. */
+# if @REPLACE_INET_NTOP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef inet_ntop
+# define inet_ntop rpl_inet_ntop
+# endif
+_GL_FUNCDECL_RPL (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt));
+# else
+# if !@HAVE_DECL_INET_NTOP@
+_GL_FUNCDECL_SYS (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+/* Need to cast, because on NonStop Kernel, the fourth parameter is
+ size_t cnt. */
+_GL_CXXALIAS_SYS_CAST (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt));
+# endif
+_GL_CXXALIASWARN (inet_ntop);
+#elif defined GNULIB_POSIXCHECK
+# undef inet_ntop
+# if HAVE_RAW_DECL_INET_NTOP
+_GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - "
+ "use gnulib module inet_ntop for portability");
+# endif
+#endif
+
+#if @GNULIB_INET_PTON@
+# if @REPLACE_INET_PTON@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef inet_pton
+# define inet_pton rpl_inet_pton
+# endif
+_GL_FUNCDECL_RPL (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst));
+# else
+# if !@HAVE_DECL_INET_PTON@
+_GL_FUNCDECL_SYS (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst));
+# endif
+_GL_CXXALIASWARN (inet_pton);
+#elif defined GNULIB_POSIXCHECK
+# undef inet_pton
+# if HAVE_RAW_DECL_INET_PTON
+_GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - "
+ "use gnulib module inet_pton for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
+#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
diff --git a/gnulib/lib/array-mergesort.h b/gnulib/lib/array-mergesort.h
new file mode 100644
index 0000000..b26341b
--- /dev/null
+++ b/gnulib/lib/array-mergesort.h
@@ -0,0 +1,274 @@
+/* Stable-sorting of an array using mergesort.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file implements stable sorting of an array, using the mergesort
+ algorithm.
+ Worst-case running time for an array of length N is O(N log N).
+ Unlike the mpsort module, the algorithm here attempts to minimize not
+ only the number of comparisons, but also the number of copying operations.
+
+ Before including this file, you need to define
+ ELEMENT The type of every array element.
+ COMPARE A two-argument macro that takes two 'const ELEMENT *'
+ pointers and returns a negative, zero, or positive 'int'
+ value if the element pointed to by the first argument is,
+ respectively, less, equal, or greater than the element
+ pointed to by the second argument.
+ STATIC The storage class of the functions being defined.
+ Before including this file, you also need to include:
+ #include <stddef.h>
+ */
+
+/* Merge the sorted arrays src1[0..n1-1] and src2[0..n2-1] into
+ dst[0..n1+n2-1]. In case of ambiguity, put the elements of src1
+ before the elements of src2.
+ n1 and n2 must be > 0.
+ The arrays src1 and src2 must not overlap the dst array, except that
+ src1 may be dst[n2..n1+n2-1], or src2 may be dst[n1..n1+n2-1]. */
+static void
+merge (const ELEMENT *src1, size_t n1,
+ const ELEMENT *src2, size_t n2,
+ ELEMENT *dst)
+{
+ for (;;) /* while (n1 > 0 && n2 > 0) */
+ {
+ if (COMPARE (src1, src2) <= 0)
+ {
+ *dst++ = *src1++;
+ n1--;
+ if (n1 == 0)
+ break;
+ }
+ else
+ {
+ *dst++ = *src2++;
+ n2--;
+ if (n2 == 0)
+ break;
+ }
+ }
+ /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */
+ if (n1 > 0)
+ {
+ if (dst != src1)
+ do
+ {
+ *dst++ = *src1++;
+ n1--;
+ }
+ while (n1 > 0);
+ }
+ else /* n2 > 0 */
+ {
+ if (dst != src2)
+ do
+ {
+ *dst++ = *src2++;
+ n2--;
+ }
+ while (n2 > 0);
+ }
+}
+
+/* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary
+ (scratch) storage.
+ The arrays src, dst, tmp must not overlap. */
+STATIC void
+merge_sort_fromto (const ELEMENT *src, ELEMENT *dst, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ return;
+ case 1:
+ /* Nothing to do. */
+ dst[0] = src[0];
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ }
+ else
+ {
+ dst[0] = src[1];
+ dst[1] = src[0];
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ dst[0] = src[0];
+ dst[1] = src[2];
+ dst[2] = src[1];
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ dst[0] = src[2];
+ dst[1] = src[0];
+ dst[2] = src[1];
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ dst[0] = src[1];
+ dst[1] = src[0];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ dst[0] = src[1];
+ dst[1] = src[2];
+ dst[2] = src[0];
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ dst[0] = src[2];
+ dst[1] = src[1];
+ dst[2] = src[0];
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */
+ merge_sort_fromto (src + n1, dst + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */
+ merge_sort_fromto (src, tmp, n1, dst);
+ /* Merge the two half results. */
+ merge (tmp, n1, dst + n1, n2, dst);
+ }
+ break;
+ }
+}
+
+/* Sort src[0..n-1], using tmp[0..n-1] as temporary (scratch) storage.
+ The arrays src, tmp must not overlap. */
+STATIC void
+merge_sort_inplace (ELEMENT *src, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ case 1:
+ /* Nothing to do. */
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ }
+ else
+ {
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ ELEMENT t = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = src[1];
+ src[1] = t;
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = t;
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */
+ merge_sort_inplace (src + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */
+ merge_sort_fromto (src, tmp, n1, tmp + n1);
+ /* Merge the two half results. */
+ merge (tmp, n1, src + n1, n2, src);
+ }
+ break;
+ }
+}
+
+#undef ELEMENT
+#undef COMPARE
+#undef STATIC
diff --git a/gnulib/lib/asinf.c b/gnulib/lib/asinf.c
new file mode 100644
index 0000000..82f1d34
--- /dev/null
+++ b/gnulib/lib/asinf.c
@@ -0,0 +1,26 @@
+/* Inverse sine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+asinf (float x)
+{
+ return (float) asin ((double) x);
+}
diff --git a/gnulib/lib/asinl.c b/gnulib/lib/asinl.c
new file mode 100644
index 0000000..6e4368d
--- /dev/null
+++ b/gnulib/lib/asinl.c
@@ -0,0 +1,232 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+asinl (long double x)
+{
+ return asin (x);
+}
+
+#else
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* asin(x)
+ * Method :
+ * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
+ * we approximate asin(x) on [0,0.5] by
+ * asin(x) = x + x*x^2*R(x^2)
+ * Between .5 and .625 the approximation is
+ * asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ * For x in [0.625,1]
+ * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
+ *
+ * Special cases:
+ * if x is NaN, return x itself;
+ * if |x|>1, return NaN with invalid signal.
+ *
+ */
+
+
+static const long double
+ one = 1.0L,
+ huge = 1.0e+4932L,
+ pio2_hi = 1.5707963267948966192313216916397514420986L,
+ pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
+ pio4_hi = 7.8539816339744830961566084581987569936977E-1L,
+
+ /* coefficient for R(x^2) */
+
+ /* asin(x) = x + x^3 pS(x^2) / qS(x^2)
+ 0 <= x <= 0.5
+ peak relative error 1.9e-35 */
+ pS0 = -8.358099012470680544198472400254596543711E2L,
+ pS1 = 3.674973957689619490312782828051860366493E3L,
+ pS2 = -6.730729094812979665807581609853656623219E3L,
+ pS3 = 6.643843795209060298375552684423454077633E3L,
+ pS4 = -3.817341990928606692235481812252049415993E3L,
+ pS5 = 1.284635388402653715636722822195716476156E3L,
+ pS6 = -2.410736125231549204856567737329112037867E2L,
+ pS7 = 2.219191969382402856557594215833622156220E1L,
+ pS8 = -7.249056260830627156600112195061001036533E-1L,
+ pS9 = 1.055923570937755300061509030361395604448E-3L,
+
+ qS0 = -5.014859407482408326519083440151745519205E3L,
+ qS1 = 2.430653047950480068881028451580393430537E4L,
+ qS2 = -4.997904737193653607449250593976069726962E4L,
+ qS3 = 5.675712336110456923807959930107347511086E4L,
+ qS4 = -3.881523118339661268482937768522572588022E4L,
+ qS5 = 1.634202194895541569749717032234510811216E4L,
+ qS6 = -4.151452662440709301601820849901296953752E3L,
+ qS7 = 5.956050864057192019085175976175695342168E2L,
+ qS8 = -4.175375777334867025769346564600396877176E1L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ /* asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
+ -0.0625 <= x <= 0.0625
+ peak relative error 3.3e-35 */
+ rS0 = -5.619049346208901520945464704848780243887E0L,
+ rS1 = 4.460504162777731472539175700169871920352E1L,
+ rS2 = -1.317669505315409261479577040530751477488E2L,
+ rS3 = 1.626532582423661989632442410808596009227E2L,
+ rS4 = -3.144806644195158614904369445440583873264E1L,
+ rS5 = -9.806674443470740708765165604769099559553E1L,
+ rS6 = 5.708468492052010816555762842394927806920E1L,
+ rS7 = 1.396540499232262112248553357962639431922E1L,
+ rS8 = -1.126243289311910363001762058295832610344E1L,
+ rS9 = -4.956179821329901954211277873774472383512E-1L,
+ rS10 = 3.313227657082367169241333738391762525780E-1L,
+
+ sS0 = -4.645814742084009935700221277307007679325E0L,
+ sS1 = 3.879074822457694323970438316317961918430E1L,
+ sS2 = -1.221986588013474694623973554726201001066E2L,
+ sS3 = 1.658821150347718105012079876756201905822E2L,
+ sS4 = -4.804379630977558197953176474426239748977E1L,
+ sS5 = -1.004296417397316948114344573811562952793E2L,
+ sS6 = 7.530281592861320234941101403870010111138E1L,
+ sS7 = 1.270735595411673647119592092304357226607E1L,
+ sS8 = -1.815144839646376500705105967064792930282E1L,
+ sS9 = -7.821597334910963922204235247786840828217E-2L,
+ /* 1.000000000000000000000000000000000000000E0 */
+
+ asinr5625 = 5.9740641664535021430381036628424864397707E-1L;
+
+
+long double
+asinl (long double x)
+{
+ long double y, t, p, q;
+ int sign;
+
+ sign = 1;
+ y = x;
+ if (x < 0.0L)
+ {
+ sign = -1;
+ y = -x;
+ }
+
+ if (y >= 1.0L) /* |x|>= 1 */
+ {
+ if (y == 1.0L)
+ /* asin(1)=+-pi/2 with inexact */
+ return x * pio2_hi + x * pio2_lo;
+
+ return (x - x) / (x - x); /* asin(|x|>1) is NaN */
+ }
+ else if (y < 0.5L) /* |x| < 0.5 */
+ {
+ if (y < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */
+ if (huge + y > one)
+ return y; /* return x with inexact if x!=0 */
+
+ t = x * x;
+ p = (((((((((pS9 * t
+ + pS8) * t
+ + pS7) * t
+ + pS6) * t
+ + pS5) * t
+ + pS4) * t
+ + pS3) * t
+ + pS2) * t
+ + pS1) * t
+ + pS0) * t;
+
+ q = (((((((( t
+ + qS8) * t
+ + qS7) * t
+ + qS6) * t
+ + qS5) * t
+ + qS4) * t
+ + qS3) * t
+ + qS2) * t
+ + qS1) * t
+ + qS0;
+
+ return x + x * (p / q);
+ }
+
+ else if (y < 0.625) /* 0.625 */
+ {
+ t = y - 0.5625;
+ p = ((((((((((rS10 * t
+ + rS9) * t
+ + rS8) * t
+ + rS7) * t
+ + rS6) * t
+ + rS5) * t
+ + rS4) * t
+ + rS3) * t
+ + rS2) * t
+ + rS1) * t
+ + rS0) * t;
+
+ q = ((((((((( t
+ + sS9) * t
+ + sS8) * t
+ + sS7) * t
+ + sS6) * t
+ + sS5) * t
+ + sS4) * t
+ + sS3) * t
+ + sS2) * t
+ + sS1) * t
+ + sS0;
+ t = asinr5625 + p / q;
+ }
+ else
+ t = pio2_hi + pio2_lo - 2 * asinl (sqrtl ((1 - y) / 2));
+
+ return t * sign;
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.18Lg %.18Lg\n",
+ asinl (1.0L),
+ 1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (0.7071067811865475244008443621048490392848L),
+ 0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (0.5L),
+ 0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (0.3090169943749474241022934171828190588600L),
+ 0.3141592653589793238462643383279502884196L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (-1.0L),
+ -1.5707963267948966192313216916397514420984L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (-0.7071067811865475244008443621048490392848L),
+ -0.7853981633974483096156608458198757210492L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (-0.5L),
+ -0.5235987755982988730771072305465838140328L);
+ printf ("%.18Lg %.18Lg\n",
+ asinl (-0.3090169943749474241022934171828190588600L),
+ -0.3141592653589793238462643383279502884196L);
+}
+#endif
diff --git a/gnulib/lib/asnprintf.c b/gnulib/lib/asnprintf.c
new file mode 100644
index 0000000..df54bbc
--- /dev/null
+++ b/gnulib/lib/asnprintf.c
@@ -0,0 +1,35 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+
+char *
+asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/asprintf.c b/gnulib/lib/asprintf.c
new file mode 100644
index 0000000..b0f7b1b
--- /dev/null
+++ b/gnulib/lib/asprintf.c
@@ -0,0 +1,40 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <stdarg.h>
+
+int
+asprintf (char **resultp, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = vasprintf (resultp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/assert.in.h b/gnulib/lib/assert.in.h
new file mode 100644
index 0000000..1857ceb
--- /dev/null
+++ b/gnulib/lib/assert.in.h
@@ -0,0 +1,28 @@
+/* Substitute for and wrapper around <assert.h>
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Do not guard the include, since <assert.h> is supposed to define
+ the assert macro each time it is included. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#@INCLUDE_NEXT@ @NEXT_ASSERT_H@
+
+/* The definition of static_assert is copied here. */
diff --git a/gnulib/lib/astrxfrm.c b/gnulib/lib/astrxfrm.c
new file mode 100644
index 0000000..eb48643
--- /dev/null
+++ b/gnulib/lib/astrxfrm.c
@@ -0,0 +1,181 @@
+/* Locale dependent string transformation for comparison.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "astrxfrm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *
+astrxfrm (const char *s, char *resultbuf, size_t *lengthp)
+{
+ char tmpbuf[4000];
+ char *result; /* either == resultbuf or == tmpbuf or freshly allocated
+ or NULL. */
+ size_t allocated; /* number of bytes allocated at result */
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+
+ {
+ size_t l = strlen (s);
+ size_t k;
+
+ /* A call to strxfrm costs about 20 times more than a call to strdup of
+ the result. Therefore it is worth to try to avoid calling strxfrm
+ more than once on a given string, by making enough room before calling
+ strxfrm. The size of the strxfrm result, k, is likely to be between
+ l and 3 * l. */
+ if (3 * l + 1 > allocated)
+ {
+ /* Grow the result buffer. */
+ if (3 * l + 1 <= sizeof (tmpbuf))
+ {
+ result = tmpbuf;
+ allocated = sizeof (tmpbuf);
+ }
+ else
+ {
+ size_t new_allocated;
+ char *new_result;
+
+ new_allocated = 3 * l + 1;
+ if (new_allocated < 2 * allocated)
+ new_allocated = 2 * allocated;
+ new_result = (char *) malloc (new_allocated);
+ if (new_result != NULL)
+ {
+ allocated = new_allocated;
+ result = new_result;
+ }
+ }
+ }
+
+ errno = 0;
+ k = strxfrm (result, s, allocated);
+ if (errno != 0)
+ goto fail;
+ if (k >= allocated)
+ {
+ /* Grow the result buffer. */
+ if (result != resultbuf && result != tmpbuf)
+ free (result);
+ if (k + 1 <= sizeof (tmpbuf))
+ {
+ result = tmpbuf;
+ allocated = sizeof (tmpbuf);
+ }
+ else
+ {
+ size_t new_allocated;
+ char *new_result;
+
+ new_allocated = k + 1;
+ new_result = (char *) malloc (new_allocated);
+ if (new_result == NULL)
+ goto out_of_memory;
+ allocated = new_allocated;
+ result = new_result;
+ }
+ /* Here k < allocated. */
+
+ /* Try again. */
+ errno = 0;
+ if (strxfrm (result, s, allocated) != k)
+ /* strxfrm() is not producing reproducible results. */
+ abort ();
+ if (errno != 0)
+ goto fail;
+ }
+
+ /* Verify that strxfrm() has NUL-terminated the result. */
+ if (result[k] != '\0')
+ abort ();
+ length = k + 1;
+ }
+
+ /* Here length > 0. */
+
+ if (result == tmpbuf)
+ {
+ if (resultbuf != NULL && length <= *lengthp)
+ {
+ memcpy (resultbuf, result, length);
+ result = resultbuf;
+ }
+ else
+ {
+ char *memory = (char *) malloc (length);
+
+ if (memory == NULL)
+ goto out_of_memory;
+ memcpy (memory, result, length);
+ result = memory;
+ }
+ }
+ else
+ {
+ /* Shrink the allocated memory if possible. */
+ if (result != resultbuf && length < allocated)
+ {
+ if (length <= *lengthp)
+ {
+ memcpy (resultbuf, result, length);
+ free (result);
+ result = resultbuf;
+ }
+ else
+ {
+ char *memory = (char *) realloc (result, length);
+ if (memory != NULL)
+ {
+ memcpy (memory, result, length);
+ result = memory;
+ }
+ }
+ }
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (result != resultbuf && result != tmpbuf)
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ out_of_memory:
+ errno = ENOMEM;
+ return NULL;
+}
diff --git a/gnulib/lib/astrxfrm.h b/gnulib/lib/astrxfrm.h
new file mode 100644
index 0000000..372c350
--- /dev/null
+++ b/gnulib/lib/astrxfrm.h
@@ -0,0 +1,47 @@
+/* Locale dependent string transformation for comparison.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef ASTRXFRM_H
+#define ASTRXFRM_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Variant of strxfrm() with a calling convention that reduces the number
+ of strxfrm calls. */
+
+/* Transform the string starting at S to a string, in such a way that
+ comparing S1 and S2 with strcoll() is equivalent to comparing astrxfrm(S1)
+ and astrxfrm(S2) with strcmp().
+ The result of this function depends on the LC_COLLATE category of the
+ current locale.
+ If successful: If resultbuf is not NULL and the result fits into *lengthp
+ bytes, it is put in resultbuf, and resultbuf is returned. Otherwise, a
+ freshly allocated string is returned. In both cases, *lengthp is set to the
+ length of the returned string.
+ Upon failure, return NULL, with errno set. */
+extern char * astrxfrm (const char *s, char *resultbuf, size_t *lengthp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ASTRXFRM_H */
diff --git a/gnulib/lib/at-func.c b/gnulib/lib/at-func.c
new file mode 100644
index 0000000..5d1cd14
--- /dev/null
+++ b/gnulib/lib/at-func.c
@@ -0,0 +1,131 @@
+/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "openat.h"
+#include "openat-priv.h"
+#include "save-cwd.h"
+
+#ifdef AT_FUNC_USE_F1_COND
+# define CALL_FUNC(F) \
+ (flag == AT_FUNC_USE_F1_COND \
+ ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
+ : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) \
+ if (flag & ~AT_FUNC_USE_F1_COND) \
+ { \
+ errno = EINVAL; \
+ return FUNC_FAIL; \
+ }
+#else
+# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) /* empty */
+#endif
+
+#ifdef AT_FUNC_RESULT
+# define FUNC_RESULT AT_FUNC_RESULT
+#else
+# define FUNC_RESULT int
+#endif
+
+#ifdef AT_FUNC_FAIL
+# define FUNC_FAIL AT_FUNC_FAIL
+#else
+# define FUNC_FAIL -1
+#endif
+
+/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
+ open on descriptor FD. If AT_FUNC_USE_F1_COND is defined to a value,
+ AT_FUNC_POST_FILE_PARAM_DECLS must inlude a parameter named flag;
+ call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
+ AT_FUNC_USE_F1_COND. Return int and fail with -1 unless AT_FUNC_RESULT
+ or AT_FUNC_FAIL are defined. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then AT_FUNC_F?/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+FUNC_RESULT
+AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
+{
+ /* Be careful to choose names unlikely to conflict with
+ AT_FUNC_POST_FILE_PARAM_DECLS. */
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ FUNC_RESULT err;
+
+ VALIDATE_FLAG (flag);
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return CALL_FUNC (file);
+
+ {
+ char proc_buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (proc_buf, fd, file);
+ if (proc_file)
+ {
+ FUNC_RESULT proc_result = CALL_FUNC (proc_file);
+ int proc_errno = errno;
+ if (proc_file != proc_buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (FUNC_FAIL != proc_result)
+ return proc_result;
+ if (! EXPECTED_ERRNO (proc_errno))
+ {
+ errno = proc_errno;
+ return proc_result;
+ }
+ }
+ }
+
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return FUNC_FAIL;
+ }
+
+ if (fchdir (fd) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return FUNC_FAIL;
+ }
+
+ err = CALL_FUNC (file);
+ saved_errno = (err == FUNC_FAIL ? errno : 0);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
+#undef FUNC_FAIL
diff --git a/gnulib/lib/at-func2.c b/gnulib/lib/at-func2.c
new file mode 100644
index 0000000..0983a77
--- /dev/null
+++ b/gnulib/lib/at-func2.c
@@ -0,0 +1,282 @@
+/* Define 2-FD at-style functions like linkat or renameat.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering and Eric Blake */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "filenamecat.h"
+#include "openat.h"
+#include "same-inode.h"
+#include "save-cwd.h"
+
+/* Call FUNC to operate on a pair of files, where FILE1 is relative to FD1,
+ and FILE2 is relative to FD2. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ FUNC, restore_cwd (up to two times). If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero. */
+int
+at_func2 (int fd1, char const *file1,
+ int fd2, char const *file2,
+ int (*func) (char const *file1, char const *file2))
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+ char *file1_alt;
+ char *file2_alt;
+ struct stat st1;
+ struct stat st2;
+
+ /* There are 16 possible scenarios, based on whether an fd is
+ AT_FDCWD or real, and whether a file is absolute or relative:
+
+ fd1 file1 fd2 file2 action
+ 0 cwd abs cwd abs direct call
+ 1 cwd abs cwd rel direct call
+ 2 cwd abs fd abs direct call
+ 3 cwd abs fd rel chdir to fd2
+ 4 cwd rel cwd abs direct call
+ 5 cwd rel cwd rel direct call
+ 6 cwd rel fd abs direct call
+ 7 cwd rel fd rel convert file1 to abs, then case 3
+ 8 fd abs cwd abs direct call
+ 9 fd abs cwd rel direct call
+ 10 fd abs fd abs direct call
+ 11 fd abs fd rel chdir to fd2
+ 12 fd rel cwd abs chdir to fd1
+ 13 fd rel cwd rel convert file2 to abs, then case 12
+ 14 fd rel fd abs chdir to fd1
+ 15a fd1 rel fd1 rel chdir to fd1
+ 15b fd1 rel fd2 rel chdir to fd1, then case 7
+
+ Try some optimizations to reduce fd to AT_FDCWD, or to at least
+ avoid converting an absolute name or doing a double chdir. */
+
+ if ((fd1 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file1))
+ && (fd2 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file2)))
+ return func (file1, file2); /* Case 0-2, 4-6, 8-10. */
+
+ /* If /proc/self/fd works, we don't need any stat or chdir. */
+ {
+ char proc_buf1[OPENAT_BUFFER_SIZE];
+ char *proc_file1 = ((fd1 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file1))
+ ? (char *) file1
+ : openat_proc_name (proc_buf1, fd1, file1));
+ if (proc_file1)
+ {
+ char proc_buf2[OPENAT_BUFFER_SIZE];
+ char *proc_file2 = ((fd2 == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file2))
+ ? (char *) file2
+ : openat_proc_name (proc_buf2, fd2, file2));
+ if (proc_file2)
+ {
+ int proc_result = func (proc_file1, proc_file2);
+ int proc_errno = errno;
+ if (proc_file1 != proc_buf1 && proc_file1 != file1)
+ free (proc_file1);
+ if (proc_file2 != proc_buf2 && proc_file2 != file2)
+ free (proc_file2);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (0 <= proc_result)
+ return proc_result;
+ if (! EXPECTED_ERRNO (proc_errno))
+ {
+ errno = proc_errno;
+ return proc_result;
+ }
+ }
+ else if (proc_file1 != proc_buf1 && proc_file1 != file1)
+ free (proc_file1);
+ }
+ }
+
+ /* Cases 3, 7, 11-15 remain. Time to normalize directory fds, if
+ possible. */
+ if (IS_ABSOLUTE_FILE_NAME (file1))
+ fd1 = AT_FDCWD; /* Case 11 reduced to 3. */
+ else if (IS_ABSOLUTE_FILE_NAME (file2))
+ fd2 = AT_FDCWD; /* Case 14 reduced to 12. */
+
+ /* Cases 3, 7, 12, 13, 15 remain. */
+
+ if (fd1 == AT_FDCWD) /* Cases 3, 7. */
+ {
+ if (stat (".", &st1) == -1 || fstat (fd2, &st2) == -1)
+ return -1;
+ if (!S_ISDIR (st2.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to cases 1, 5. */
+ return func (file1, file2);
+ }
+ else if (fd2 == AT_FDCWD) /* Cases 12, 13. */
+ {
+ if (stat (".", &st2) == -1 || fstat (fd1, &st1) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to cases 4, 5. */
+ return func (file1, file2);
+ }
+ else if (fd1 != fd2) /* Case 15b. */
+ {
+ if (fstat (fd1, &st1) == -1 || fstat (fd2, &st2) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode) || !S_ISDIR (st2.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (SAME_INODE (st1, st2)) /* Reduced to case 15a. */
+ {
+ fd2 = fd1;
+ if (stat (".", &st1) == 0 && SAME_INODE (st1, st2))
+ return func (file1, file2); /* Further reduced to case 5. */
+ }
+ }
+ else /* Case 15a. */
+ {
+ if (fstat (fd1, &st1) == -1)
+ return -1;
+ if (!S_ISDIR (st1.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ if (stat (".", &st2) == 0 && SAME_INODE (st1, st2))
+ return func (file1, file2); /* Reduced to case 5. */
+ }
+
+ /* Cases 3, 7, 12, 13, 15a, 15b remain. With all reductions in
+ place, it is time to start changing directories. */
+
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+
+ if (fd1 != AT_FDCWD && fd2 != AT_FDCWD && fd1 != fd2) /* Case 15b. */
+ {
+ if (fchdir (fd1) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ fd1 = AT_FDCWD; /* Reduced to case 7. */
+ }
+
+ /* Cases 3, 7, 12, 13, 15a remain. Convert one relative name to
+ absolute, if necessary. */
+
+ file1_alt = (char *) file1;
+ file2_alt = (char *) file2;
+
+ if (fd1 == AT_FDCWD && !IS_ABSOLUTE_FILE_NAME (file1)) /* Case 7. */
+ {
+ /* It would be nicer to use:
+ file1_alt = file_name_concat (xgetcwd (), file1, NULL);
+ but libraries should not call xalloc_die. */
+ char *cwd = getcwd (NULL, 0);
+ if (!cwd)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ file1_alt = mfile_name_concat (cwd, file1, NULL);
+ if (!file1_alt)
+ {
+ saved_errno = errno;
+ free (cwd);
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ free (cwd); /* Reduced to case 3. */
+ }
+ else if (fd2 == AT_FDCWD && !IS_ABSOLUTE_FILE_NAME (file2)) /* Case 13. */
+ {
+ char *cwd = getcwd (NULL, 0);
+ if (!cwd)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ file2_alt = mfile_name_concat (cwd, file2, NULL);
+ if (!file2_alt)
+ {
+ saved_errno = errno;
+ free (cwd);
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return -1;
+ }
+ free (cwd); /* Reduced to case 12. */
+ }
+
+ /* Cases 3, 12, 15a remain. Change to the correct directory. */
+ if (fchdir (fd1 == AT_FDCWD ? fd2 : fd1) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ if (file1 != file1_alt)
+ free (file1_alt);
+ else if (file2 != file2_alt)
+ free (file2_alt);
+ errno = saved_errno;
+ return -1;
+ }
+
+ /* Finally safe to perform the user's function, then clean up. */
+
+ err = func (file1_alt, file2_alt);
+ saved_errno = (err < 0 ? errno : 0);
+
+ if (file1 != file1_alt)
+ free (file1_alt);
+ else if (file2 != file2_alt)
+ free (file2_alt);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
diff --git a/gnulib/lib/atan2f.c b/gnulib/lib/atan2f.c
new file mode 100644
index 0000000..09771f6
--- /dev/null
+++ b/gnulib/lib/atan2f.c
@@ -0,0 +1,26 @@
+/* Angle of a point in the plane.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+atan2f (float y, float x)
+{
+ return (float) atan2 ((double) y, (double) x);
+}
diff --git a/gnulib/lib/atanf.c b/gnulib/lib/atanf.c
new file mode 100644
index 0000000..f8bd4f1
--- /dev/null
+++ b/gnulib/lib/atanf.c
@@ -0,0 +1,26 @@
+/* Inverse tangent function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+atanf (float x)
+{
+ return (float) atan ((double) x);
+}
diff --git a/gnulib/lib/atanl.c b/gnulib/lib/atanl.c
new file mode 100644
index 0000000..4d09c2f
--- /dev/null
+++ b/gnulib/lib/atanl.c
@@ -0,0 +1,236 @@
+/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+atanl (long double x)
+{
+ return atan (x);
+}
+
+#else
+
+/* s_atanl.c
+ *
+ * Inverse circular tangent for 128-bit long double precision
+ * (arctangent)
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, atanl();
+ *
+ * y = atanl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns radian angle between -pi/2 and +pi/2 whose tangent is x.
+ *
+ * The function uses a rational approximation of the form
+ * t + t^3 P(t^2)/Q(t^2), optimized for |t| < 0.09375.
+ *
+ * The argument is reduced using the identity
+ * arctan x - arctan u = arctan ((x-u)/(1 + ux))
+ * and an 83-entry lookup table for arctan u, with u = 0, 1/8, ..., 10.25.
+ * Use of the table improves the execution speed of the routine.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -19, 19 4e5 1.7e-34 5.4e-35
+ *
+ *
+ * WARNING:
+ *
+ * This program uses integer operations on bit fields of floating-point
+ * numbers. It does not work with data structures other than the
+ * structure assumed.
+ *
+ */
+
+/* arctan(k/8), k = 0, ..., 82 */
+static const long double atantbl[84] = {
+ 0.0000000000000000000000000000000000000000E0L,
+ 1.2435499454676143503135484916387102557317E-1L, /* arctan(0.125) */
+ 2.4497866312686415417208248121127581091414E-1L,
+ 3.5877067027057222039592006392646049977698E-1L,
+ 4.6364760900080611621425623146121440202854E-1L,
+ 5.5859931534356243597150821640166127034645E-1L,
+ 6.4350110879328438680280922871732263804151E-1L,
+ 7.1882999962162450541701415152590465395142E-1L,
+ 7.8539816339744830961566084581987572104929E-1L,
+ 8.4415398611317100251784414827164750652594E-1L,
+ 8.9605538457134395617480071802993782702458E-1L,
+ 9.4200004037946366473793717053459358607166E-1L,
+ 9.8279372324732906798571061101466601449688E-1L,
+ 1.0191413442663497346383429170230636487744E0L,
+ 1.0516502125483736674598673120862998296302E0L,
+ 1.0808390005411683108871567292171998202703E0L,
+ 1.1071487177940905030170654601785370400700E0L,
+ 1.1309537439791604464709335155363278047493E0L,
+ 1.1525719972156675180401498626127513797495E0L,
+ 1.1722738811284763866005949441337046149712E0L,
+ 1.1902899496825317329277337748293183376012E0L,
+ 1.2068173702852525303955115800565576303133E0L,
+ 1.2220253232109896370417417439225704908830E0L,
+ 1.2360594894780819419094519711090786987027E0L,
+ 1.2490457723982544258299170772810901230778E0L,
+ 1.2610933822524404193139408812473357720101E0L,
+ 1.2722973952087173412961937498224804940684E0L,
+ 1.2827408797442707473628852511364955306249E0L,
+ 1.2924966677897852679030914214070816845853E0L,
+ 1.3016288340091961438047858503666855921414E0L,
+ 1.3101939350475556342564376891719053122733E0L,
+ 1.3182420510168370498593302023271362531155E0L,
+ 1.3258176636680324650592392104284756311844E0L,
+ 1.3329603993374458675538498697331558093700E0L,
+ 1.3397056595989995393283037525895557411039E0L,
+ 1.3460851583802539310489409282517796256512E0L,
+ 1.3521273809209546571891479413898128509842E0L,
+ 1.3578579772154994751124898859640585287459E0L,
+ 1.3633001003596939542892985278250991189943E0L,
+ 1.3684746984165928776366381936948529556191E0L,
+ 1.3734007669450158608612719264449611486510E0L,
+ 1.3780955681325110444536609641291551522494E0L,
+ 1.3825748214901258580599674177685685125566E0L,
+ 1.3868528702577214543289381097042486034883E0L,
+ 1.3909428270024183486427686943836432060856E0L,
+ 1.3948567013423687823948122092044222644895E0L,
+ 1.3986055122719575950126700816114282335732E0L,
+ 1.4021993871854670105330304794336492676944E0L,
+ 1.4056476493802697809521934019958079881002E0L,
+ 1.4089588955564736949699075250792569287156E0L,
+ 1.4121410646084952153676136718584891599630E0L,
+ 1.4152014988178669079462550975833894394929E0L,
+ 1.4181469983996314594038603039700989523716E0L,
+ 1.4209838702219992566633046424614466661176E0L,
+ 1.4237179714064941189018190466107297503086E0L,
+ 1.4263547484202526397918060597281265695725E0L,
+ 1.4288992721907326964184700745371983590908E0L,
+ 1.4313562697035588982240194668401779312122E0L,
+ 1.4337301524847089866404719096698873648610E0L,
+ 1.4360250423171655234964275337155008780675E0L,
+ 1.4382447944982225979614042479354815855386E0L,
+ 1.4403930189057632173997301031392126865694E0L,
+ 1.4424730991091018200252920599377292525125E0L,
+ 1.4444882097316563655148453598508037025938E0L,
+ 1.4464413322481351841999668424758804165254E0L,
+ 1.4483352693775551917970437843145232637695E0L,
+ 1.4501726582147939000905940595923466567576E0L,
+ 1.4519559822271314199339700039142990228105E0L,
+ 1.4536875822280323362423034480994649820285E0L,
+ 1.4553696664279718992423082296859928222270E0L,
+ 1.4570043196511885530074841089245667532358E0L,
+ 1.4585935117976422128825857356750737658039E0L,
+ 1.4601391056210009726721818194296893361233E0L,
+ 1.4616428638860188872060496086383008594310E0L,
+ 1.4631064559620759326975975316301202111560E0L,
+ 1.4645314639038178118428450961503371619177E0L,
+ 1.4659193880646627234129855241049975398470E0L,
+ 1.4672716522843522691530527207287398276197E0L,
+ 1.4685896086876430842559640450619880951144E0L,
+ 1.4698745421276027686510391411132998919794E0L,
+ 1.4711276743037345918528755717617308518553E0L,
+ 1.4723501675822635384916444186631899205983E0L,
+ 1.4735431285433308455179928682541563973416E0L, /* arctan(10.25) */
+ 1.5707963267948966192313216916397514420986E0L /* pi/2 */
+};
+
+
+/* arctan t = t + t^3 p(t^2) / q(t^2)
+ |t| <= 0.09375
+ peak relative error 5.3e-37 */
+
+static const long double
+ p0 = -4.283708356338736809269381409828726405572E1L,
+ p1 = -8.636132499244548540964557273544599863825E1L,
+ p2 = -5.713554848244551350855604111031839613216E1L,
+ p3 = -1.371405711877433266573835355036413750118E1L,
+ p4 = -8.638214309119210906997318946650189640184E-1L,
+ q0 = 1.285112506901621042780814422948906537959E2L,
+ q1 = 3.361907253914337187957855834229672347089E2L,
+ q2 = 3.180448303864130128268191635189365331680E2L,
+ q3 = 1.307244136980865800160844625025280344686E2L,
+ q4 = 2.173623741810414221251136181221172551416E1L;
+ /* q5 = 1.000000000000000000000000000000000000000E0 */
+
+
+long double
+atanl (long double x)
+{
+ int k, sign;
+ long double t, u, p, q;
+
+ /* Check for zero or NaN. */
+ if (isnanl (x) || x == 0.0)
+ return x + x;
+
+ sign = x < 0.0;
+
+ if (x + x == x)
+ {
+ /* Infinity. */
+ if (sign)
+ return -atantbl[83];
+ else
+ return atantbl[83];
+ }
+
+ if (sign)
+ x = -x;
+
+ if (x >= 10.25)
+ {
+ k = 83;
+ t = -1.0/x;
+ }
+ else
+ {
+ /* Index of nearest table element.
+ Roundoff to integer is asymmetrical to avoid cancellation when t < 0
+ (cf. fdlibm). */
+ k = 8.0 * x + 0.25;
+ u = 0.125 * k;
+ /* Small arctan argument. */
+ t = (x - u) / (1.0 + x * u);
+ }
+
+ /* Arctan of small argument t. */
+ u = t * t;
+ p = ((((p4 * u) + p3) * u + p2) * u + p1) * u + p0;
+ q = ((((u + q4) * u + q3) * u + q2) * u + q1) * u + q0;
+ u = t * u * p / q + t;
+
+ /* arctan x = arctan u + arctan t */
+ u = atantbl[k] + u;
+ if (sign)
+ return (-u);
+ else
+ return u;
+}
+
+#endif
diff --git a/gnulib/lib/atexit.c b/gnulib/lib/atexit.c
new file mode 100644
index 0000000..5ef33e5
--- /dev/null
+++ b/gnulib/lib/atexit.c
@@ -0,0 +1,13 @@
+/* Wrapper to implement ANSI C's atexit using SunOS's on_exit. */
+/* This function is in the public domain. --Mike Stump. */
+
+#include <config.h>
+
+int
+atexit (void (*f) (void))
+{
+ /* If the system doesn't provide a definition for atexit, use on_exit
+ if the system provides that. */
+ on_exit (f, 0);
+ return 0;
+}
diff --git a/gnulib/lib/atoll.c b/gnulib/lib/atoll.c
new file mode 100644
index 0000000..d9467b7
--- /dev/null
+++ b/gnulib/lib/atoll.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1991, 1997-1998, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#if _LIBC
+# undef atoll
+#endif
+
+
+/* Convert a string to a long long int. */
+long long int
+atoll (const char *nptr)
+{
+ return strtoll (nptr, (char **) NULL, 10);
+}
diff --git a/gnulib/lib/backupfile.c b/gnulib/lib/backupfile.c
new file mode 100644
index 0000000..8633065
--- /dev/null
+++ b/gnulib/lib/backupfile.c
@@ -0,0 +1,355 @@
+/* backupfile.c -- make Emacs style backup file names
+
+ Copyright (C) 1990-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and David MacKenzie.
+ Some algorithms adapted from GNU Emacs. */
+
+#include <config.h>
+
+#include "backupfile.h"
+
+#include "argmatch.h"
+#include "dirname.h"
+#include "xalloc.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <limits.h>
+
+#include <unistd.h>
+
+#include "dirent--.h"
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+#if D_INO_IN_DIRENT
+# define REAL_DIR_ENTRY(dp) ((dp)->d_ino != 0)
+#else
+# define REAL_DIR_ENTRY(dp) 1
+#endif
+
+#if ! (HAVE_PATHCONF && defined _PC_NAME_MAX)
+# define pathconf(file, option) (errno = -1)
+#endif
+
+#ifndef _POSIX_NAME_MAX
+# define _POSIX_NAME_MAX 14
+#endif
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if defined _XOPEN_NAME_MAX
+# define NAME_MAX_MINIMUM _XOPEN_NAME_MAX
+#else
+# define NAME_MAX_MINIMUM _POSIX_NAME_MAX
+#endif
+
+#ifndef HAVE_DOS_FILE_NAMES
+# define HAVE_DOS_FILE_NAMES 0
+#endif
+#ifndef HAVE_LONG_FILE_NAMES
+# define HAVE_LONG_FILE_NAMES 0
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ ISDIGIT unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* The extension added to file names to produce a simple (as opposed
+ to numbered) backup file name. */
+char const *simple_backup_suffix = "~";
+
+
+/* If FILE (which was of length FILELEN before an extension was
+ appended to it) is too long, replace the extension with the single
+ char E. If the result is still too long, remove the char just
+ before E. */
+
+static void
+check_extension (char *file, size_t filelen, char e)
+{
+ char *base = last_component (file);
+ size_t baselen = base_len (base);
+ size_t baselen_max = HAVE_LONG_FILE_NAMES ? 255 : NAME_MAX_MINIMUM;
+
+ if (HAVE_DOS_FILE_NAMES || NAME_MAX_MINIMUM < baselen)
+ {
+ /* The new base name is long enough to require a pathconf check. */
+ long name_max;
+
+ /* Temporarily modify the buffer into its parent directory name,
+ invoke pathconf on the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ errno = 0;
+ name_max = pathconf (file, _PC_NAME_MAX);
+ if (0 <= name_max || errno == 0)
+ {
+ long size = baselen_max = name_max;
+ if (name_max != size)
+ baselen_max = SIZE_MAX;
+ }
+ memcpy (base, tmp, sizeof ".");
+ }
+
+ if (HAVE_DOS_FILE_NAMES && baselen_max <= 12)
+ {
+ /* Live within DOS's 8.3 limit. */
+ char *dot = strchr (base, '.');
+ if (!dot)
+ baselen_max = 8;
+ else
+ {
+ char const *second_dot = strchr (dot + 1, '.');
+ baselen_max = (second_dot
+ ? second_dot - base
+ : dot + 1 - base + 3);
+ }
+ }
+
+ if (baselen_max < baselen)
+ {
+ baselen = file + filelen - base;
+ if (baselen_max <= baselen)
+ baselen = baselen_max - 1;
+ base[baselen] = e;
+ base[baselen + 1] = '\0';
+ }
+}
+
+/* Returned values for NUMBERED_BACKUP. */
+
+enum numbered_backup_result
+ {
+ /* The new backup name is the same length as an existing backup
+ name, so it's valid for that directory. */
+ BACKUP_IS_SAME_LENGTH,
+
+ /* Some backup names already exist, but the returned name is longer
+ than any of them, and its length should be checked. */
+ BACKUP_IS_LONGER,
+
+ /* There are no existing backup names. The new name's length
+ should be checked. */
+ BACKUP_IS_NEW
+ };
+
+/* *BUFFER contains a file name. Store into *BUFFER the next backup
+ name for the named file, with a version number greater than all the
+ existing numbered backups. Reallocate *BUFFER as necessary; its
+ initial allocated size is BUFFER_SIZE, which must be at least 4
+ bytes longer than the file name to make room for the initially
+ appended ".~1". FILELEN is the length of the original file name.
+ The returned value indicates what kind of backup was found. If an
+ I/O or other read error occurs, use the highest backup number that
+ was found. */
+
+static enum numbered_backup_result
+numbered_backup (char **buffer, size_t buffer_size, size_t filelen)
+{
+ enum numbered_backup_result result = BACKUP_IS_NEW;
+ DIR *dirp;
+ struct dirent *dp;
+ char *buf = *buffer;
+ size_t versionlenmax = 1;
+ char *base = last_component (buf);
+ size_t base_offset = base - buf;
+ size_t baselen = base_len (base);
+
+ /* Temporarily modify the buffer into its parent directory name,
+ open the directory, and then restore the buffer. */
+ char tmp[sizeof "."];
+ memcpy (tmp, base, sizeof ".");
+ strcpy (base, ".");
+ dirp = opendir (buf);
+ memcpy (base, tmp, sizeof ".");
+ strcpy (base + baselen, ".~1~");
+
+ if (!dirp)
+ return result;
+
+ while ((dp = readdir (dirp)) != NULL)
+ {
+ char const *p;
+ char *q;
+ bool all_9s;
+ size_t versionlen;
+ size_t new_buflen;
+
+ if (! REAL_DIR_ENTRY (dp) || _D_EXACT_NAMLEN (dp) < baselen + 4)
+ continue;
+
+ if (memcmp (buf + base_offset, dp->d_name, baselen + 2) != 0)
+ continue;
+
+ p = dp->d_name + baselen + 2;
+
+ /* Check whether this file has a version number and if so,
+ whether it is larger. Use string operations rather than
+ integer arithmetic, to avoid problems with integer overflow. */
+
+ if (! ('1' <= *p && *p <= '9'))
+ continue;
+ all_9s = (*p == '9');
+ for (versionlen = 1; ISDIGIT (p[versionlen]); versionlen++)
+ all_9s &= (p[versionlen] == '9');
+
+ if (! (p[versionlen] == '~' && !p[versionlen + 1]
+ && (versionlenmax < versionlen
+ || (versionlenmax == versionlen
+ && memcmp (buf + filelen + 2, p, versionlen) <= 0))))
+ continue;
+
+ /* This directory has the largest version number seen so far.
+ Append this highest numbered extension to the file name,
+ prepending '0' to the number if it is all 9s. */
+
+ versionlenmax = all_9s + versionlen;
+ result = (all_9s ? BACKUP_IS_LONGER : BACKUP_IS_SAME_LENGTH);
+ new_buflen = filelen + 2 + versionlenmax + 1;
+ if (buffer_size <= new_buflen)
+ {
+ buf = xnrealloc (buf, 2, new_buflen);
+ buffer_size = new_buflen * 2;
+ }
+ q = buf + filelen;
+ *q++ = '.';
+ *q++ = '~';
+ *q = '0';
+ q += all_9s;
+ memcpy (q, p, versionlen + 2);
+
+ /* Add 1 to the version number. */
+
+ q += versionlen;
+ while (*--q == '9')
+ *q = '0';
+ ++*q;
+ }
+
+ closedir (dirp);
+ *buffer = buf;
+ return result;
+}
+
+/* Return the name of the new backup file for the existing file FILE,
+ allocated with malloc. Report an error and fail if out of memory.
+ Do not call this function if backup_type == no_backups. */
+
+char *
+find_backup_file_name (char const *file, enum backup_type backup_type)
+{
+ size_t filelen = strlen (file);
+ char *s;
+ size_t ssize;
+ bool simple = true;
+
+ /* Allow room for simple or ".~N~" backups. The guess must be at
+ least sizeof ".~1~", but otherwise will be adjusted as needed. */
+ size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1;
+ size_t backup_suffix_size_guess = simple_backup_suffix_size;
+ enum { GUESS = sizeof ".~12345~" };
+ if (backup_suffix_size_guess < GUESS)
+ backup_suffix_size_guess = GUESS;
+
+ ssize = filelen + backup_suffix_size_guess + 1;
+ s = xmalloc (ssize);
+ memcpy (s, file, filelen + 1);
+
+ if (backup_type != simple_backups)
+ switch (numbered_backup (&s, ssize, filelen))
+ {
+ case BACKUP_IS_SAME_LENGTH:
+ return s;
+
+ case BACKUP_IS_LONGER:
+ simple = false;
+ break;
+
+ case BACKUP_IS_NEW:
+ simple = (backup_type == numbered_existing_backups);
+ break;
+ }
+
+ if (simple)
+ memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size);
+ check_extension (s, filelen, '~');
+ return s;
+}
+
+static char const * const backup_args[] =
+{
+ /* In a series of synonyms, present the most meaningful first, so
+ that argmatch_valid be more readable. */
+ "none", "off",
+ "simple", "never",
+ "existing", "nil",
+ "numbered", "t",
+ NULL
+};
+
+static const enum backup_type backup_types[] =
+{
+ no_backups, no_backups,
+ simple_backups, simple_backups,
+ numbered_existing_backups, numbered_existing_backups,
+ numbered_backups, numbered_backups
+};
+
+/* Ensure that these two vectors have the same number of elements,
+ not counting the final NULL in the first one. */
+ARGMATCH_VERIFY (backup_args, backup_types);
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL or the empty string, return numbered_existing_backups.
+ If VERSION is invalid or ambiguous, fail with a diagnostic appropriate
+ for the specified CONTEXT. Unambiguous abbreviations are accepted. */
+
+enum backup_type
+get_version (char const *context, char const *version)
+{
+ if (version == 0 || *version == 0)
+ return numbered_existing_backups;
+ else
+ return XARGMATCH (context, version, backup_args, backup_types);
+}
+
+
+/* Return the type of backup specified by VERSION.
+ If VERSION is NULL, use the value of the envvar VERSION_CONTROL.
+ If the specified string is invalid or ambiguous, fail with a diagnostic
+ appropriate for the specified CONTEXT.
+ Unambiguous abbreviations are accepted. */
+
+enum backup_type
+xget_version (char const *context, char const *version)
+{
+ if (version && *version)
+ return get_version (context, version);
+ else
+ return get_version ("$VERSION_CONTROL", getenv ("VERSION_CONTROL"));
+}
diff --git a/gnulib/lib/backupfile.h b/gnulib/lib/backupfile.h
new file mode 100644
index 0000000..ca9f762
--- /dev/null
+++ b/gnulib/lib/backupfile.h
@@ -0,0 +1,59 @@
+/* backupfile.h -- declarations for making Emacs style backup file names
+
+ Copyright (C) 1990-1992, 1997-1999, 2003-2004, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef BACKUPFILE_H_
+# define BACKUPFILE_H_
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+/* When to make backup files. */
+enum backup_type
+{
+ /* Never make backups. */
+ no_backups,
+
+ /* Make simple backups of every file. */
+ simple_backups,
+
+ /* Make numbered backups of files that already have numbered backups,
+ and simple backups of the others. */
+ numbered_existing_backups,
+
+ /* Make numbered backups of every file. */
+ numbered_backups
+};
+
+# define VALID_BACKUP_TYPE(Type) \
+ ((unsigned int) (Type) <= numbered_backups)
+
+extern char const *simple_backup_suffix;
+
+char *find_backup_file_name (char const *, enum backup_type);
+enum backup_type get_version (char const *context, char const *arg);
+enum backup_type xget_version (char const *context, char const *arg);
+void addext (char *, char const *, int);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* ! BACKUPFILE_H_ */
diff --git a/gnulib/lib/base32.c b/gnulib/lib/base32.c
new file mode 100644
index 0000000..45af45c
--- /dev/null
+++ b/gnulib/lib/base32.c
@@ -0,0 +1,588 @@
+/* base32.c -- Encode binary data using printable characters.
+ Copyright (C) 1999-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
+ *
+ * See also RFC 4648 <http://www.ietf.org/rfc/rfc4648.txt>.
+ *
+ * Be careful with error checking. Here is how you would typically
+ * use these functions:
+ *
+ * bool ok = base32_decode_alloc (in, inlen, &out, &outlen);
+ * if (!ok)
+ * FAIL: input was not valid base32
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN
+ *
+ * size_t outlen = base32_encode_alloc (in, inlen, &out);
+ * if (out == NULL && outlen == 0 && inlen != 0)
+ * FAIL: input too long
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN.
+ *
+ */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "base32.h"
+
+/* Get malloc. */
+#include <stdlib.h>
+
+/* Get UCHAR_MAX. */
+#include <limits.h>
+
+#include <string.h>
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+/* Base32 encode IN array of size INLEN into OUT array of size OUTLEN.
+ If OUTLEN is less than BASE32_LENGTH(INLEN), write as many bytes as
+ possible. If OUTLEN is larger than BASE32_LENGTH(INLEN), also zero
+ terminate the output buffer. */
+void
+base32_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen)
+{
+ static const char b32str[32] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+
+ while (inlen && outlen)
+ {
+ *out++ = b32str[(to_uchar (in[0]) >> 3) & 0x1f];
+ if (!--outlen)
+ break;
+ *out++ = b32str[((to_uchar (in[0]) << 2)
+ + (--inlen ? to_uchar (in[1]) >> 6 : 0))
+ & 0x1f];
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[(to_uchar (in[1]) >> 1) & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[1]) << 4)
+ + (--inlen ? to_uchar (in[2]) >> 4 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[2]) << 1)
+ + (--inlen ? to_uchar (in[3]) >> 7 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[(to_uchar (in[3]) >> 2) & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[3]) << 3)
+ + (--inlen ? to_uchar (in[4]) >> 5 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ = inlen ? b32str[to_uchar (in[4]) & 0x1f] : '=';
+ if (!--outlen)
+ break;
+ if (inlen)
+ inlen--;
+ if (inlen)
+ in += 5;
+ }
+
+ if (outlen)
+ *out = '\0';
+}
+
+/* Allocate a buffer and store zero terminated base32 encoded data
+ from array IN of size INLEN, returning BASE32_LENGTH(INLEN), i.e.,
+ the length of the encoded data, excluding the terminating zero. On
+ return, the OUT variable will hold a pointer to newly allocated
+ memory that must be deallocated by the caller. If output string
+ length would overflow, 0 is returned and OUT is set to NULL. If
+ memory allocation failed, OUT is set to NULL, and the return value
+ indicates length of the requested memory block, i.e.,
+ BASE32_LENGTH(inlen) + 1. */
+size_t
+base32_encode_alloc (const char *in, size_t inlen, char **out)
+{
+ size_t outlen = 1 + BASE32_LENGTH (inlen);
+
+ /* Check for overflow in outlen computation.
+ *
+ * If there is no overflow, outlen >= inlen.
+ *
+ * TODO Is this a sufficient check? (See the notes in base64.c.)
+ */
+ if (inlen > outlen)
+ {
+ *out = NULL;
+ return 0;
+ }
+
+ *out = malloc (outlen);
+ if (!*out)
+ return outlen;
+
+ base32_encode (in, inlen, *out, outlen);
+
+ return outlen - 1;
+}
+
+/* With this approach this file works independent of the charset used
+ (think EBCDIC). However, it does assume that the characters in the
+ Base32 alphabet (A-Z2-7) are encoded in 0..255. POSIX
+ 1003.1-2001 require that char and unsigned char are 8-bit
+ quantities, though, taking care of that problem. But this may be a
+ potential problem on non-POSIX C99 platforms.
+
+ IBM C V6 for AIX mishandles "#define B32(x) ...'x'...", so use "_"
+ as the formal parameter rather than "x". */
+#define B32(_) \
+ ((_) == 'A' ? 0 \
+ : (_) == 'B' ? 1 \
+ : (_) == 'C' ? 2 \
+ : (_) == 'D' ? 3 \
+ : (_) == 'E' ? 4 \
+ : (_) == 'F' ? 5 \
+ : (_) == 'G' ? 6 \
+ : (_) == 'H' ? 7 \
+ : (_) == 'I' ? 8 \
+ : (_) == 'J' ? 9 \
+ : (_) == 'K' ? 10 \
+ : (_) == 'L' ? 11 \
+ : (_) == 'M' ? 12 \
+ : (_) == 'N' ? 13 \
+ : (_) == 'O' ? 14 \
+ : (_) == 'P' ? 15 \
+ : (_) == 'Q' ? 16 \
+ : (_) == 'R' ? 17 \
+ : (_) == 'S' ? 18 \
+ : (_) == 'T' ? 19 \
+ : (_) == 'U' ? 20 \
+ : (_) == 'V' ? 21 \
+ : (_) == 'W' ? 22 \
+ : (_) == 'X' ? 23 \
+ : (_) == 'Y' ? 24 \
+ : (_) == 'Z' ? 25 \
+ : (_) == '2' ? 26 \
+ : (_) == '3' ? 27 \
+ : (_) == '4' ? 28 \
+ : (_) == '5' ? 29 \
+ : (_) == '6' ? 30 \
+ : (_) == '7' ? 31 \
+ : -1)
+
+static const signed char b32[0x100] = {
+ B32 (0), B32 (1), B32 (2), B32 (3),
+ B32 (4), B32 (5), B32 (6), B32 (7),
+ B32 (8), B32 (9), B32 (10), B32 (11),
+ B32 (12), B32 (13), B32 (14), B32 (15),
+ B32 (16), B32 (17), B32 (18), B32 (19),
+ B32 (20), B32 (21), B32 (22), B32 (23),
+ B32 (24), B32 (25), B32 (26), B32 (27),
+ B32 (28), B32 (29), B32 (30), B32 (31),
+ B32 (32), B32 (33), B32 (34), B32 (35),
+ B32 (36), B32 (37), B32 (38), B32 (39),
+ B32 (40), B32 (41), B32 (42), B32 (43),
+ B32 (44), B32 (45), B32 (46), B32 (47),
+ B32 (48), B32 (49), B32 (50), B32 (51),
+ B32 (52), B32 (53), B32 (54), B32 (55),
+ B32 (56), B32 (57), B32 (58), B32 (59),
+ B32 (60), B32 (61), B32 (62), B32 (63),
+ B32 (32), B32 (65), B32 (66), B32 (67),
+ B32 (68), B32 (69), B32 (70), B32 (71),
+ B32 (72), B32 (73), B32 (74), B32 (75),
+ B32 (76), B32 (77), B32 (78), B32 (79),
+ B32 (80), B32 (81), B32 (82), B32 (83),
+ B32 (84), B32 (85), B32 (86), B32 (87),
+ B32 (88), B32 (89), B32 (90), B32 (91),
+ B32 (92), B32 (93), B32 (94), B32 (95),
+ B32 (96), B32 (97), B32 (98), B32 (99),
+ B32 (100), B32 (101), B32 (102), B32 (103),
+ B32 (104), B32 (105), B32 (106), B32 (107),
+ B32 (108), B32 (109), B32 (110), B32 (111),
+ B32 (112), B32 (113), B32 (114), B32 (115),
+ B32 (116), B32 (117), B32 (118), B32 (119),
+ B32 (120), B32 (121), B32 (122), B32 (123),
+ B32 (124), B32 (125), B32 (126), B32 (127),
+ B32 (128), B32 (129), B32 (130), B32 (131),
+ B32 (132), B32 (133), B32 (134), B32 (135),
+ B32 (136), B32 (137), B32 (138), B32 (139),
+ B32 (140), B32 (141), B32 (142), B32 (143),
+ B32 (144), B32 (145), B32 (146), B32 (147),
+ B32 (148), B32 (149), B32 (150), B32 (151),
+ B32 (152), B32 (153), B32 (154), B32 (155),
+ B32 (156), B32 (157), B32 (158), B32 (159),
+ B32 (160), B32 (161), B32 (162), B32 (163),
+ B32 (132), B32 (165), B32 (166), B32 (167),
+ B32 (168), B32 (169), B32 (170), B32 (171),
+ B32 (172), B32 (173), B32 (174), B32 (175),
+ B32 (176), B32 (177), B32 (178), B32 (179),
+ B32 (180), B32 (181), B32 (182), B32 (183),
+ B32 (184), B32 (185), B32 (186), B32 (187),
+ B32 (188), B32 (189), B32 (190), B32 (191),
+ B32 (192), B32 (193), B32 (194), B32 (195),
+ B32 (196), B32 (197), B32 (198), B32 (199),
+ B32 (200), B32 (201), B32 (202), B32 (203),
+ B32 (204), B32 (205), B32 (206), B32 (207),
+ B32 (208), B32 (209), B32 (210), B32 (211),
+ B32 (212), B32 (213), B32 (214), B32 (215),
+ B32 (216), B32 (217), B32 (218), B32 (219),
+ B32 (220), B32 (221), B32 (222), B32 (223),
+ B32 (224), B32 (225), B32 (226), B32 (227),
+ B32 (228), B32 (229), B32 (230), B32 (231),
+ B32 (232), B32 (233), B32 (234), B32 (235),
+ B32 (236), B32 (237), B32 (238), B32 (239),
+ B32 (240), B32 (241), B32 (242), B32 (243),
+ B32 (244), B32 (245), B32 (246), B32 (247),
+ B32 (248), B32 (249), B32 (250), B32 (251),
+ B32 (252), B32 (253), B32 (254), B32 (255)
+};
+
+#if UCHAR_MAX == 255
+# define uchar_in_range(c) true
+#else
+# define uchar_in_range(c) ((c) <= 255)
+#endif
+
+/* Return true if CH is a character from the Base32 alphabet, and
+ false otherwise. Note that '=' is padding and not considered to be
+ part of the alphabet. */
+bool
+isbase32 (char ch)
+{
+ return uchar_in_range (to_uchar (ch)) && 0 <= b32[to_uchar (ch)];
+}
+
+/* Initialize decode-context buffer, CTX. */
+void
+base32_decode_ctx_init (struct base32_decode_context *ctx)
+{
+ ctx->i = 0;
+}
+
+/* If CTX->i is 0 or 8, there are eight or more bytes in [*IN..IN_END), and
+ none of those eight is a newline, then return *IN. Otherwise, copy up to
+ 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
+ index CTX->i and setting CTX->i to reflect the number of bytes copied,
+ and return CTX->buf. In either case, advance *IN to point to the byte
+ after the last one processed, and set *N_NON_NEWLINE to the number of
+ verified non-newline bytes accessible through the returned pointer. */
+static inline char *
+get_8 (struct base32_decode_context *ctx,
+ char const *restrict *in, char const *restrict in_end,
+ size_t *n_non_newline)
+{
+ if (ctx->i == 8)
+ ctx->i = 0;
+
+ if (ctx->i == 0)
+ {
+ char const *t = *in;
+ if (8 <= in_end - *in && memchr (t, '\n', 8) == NULL)
+ {
+ /* This is the common case: no newline. */
+ *in += 8;
+ *n_non_newline = 8;
+ return (char *) t;
+ }
+ }
+
+ {
+ /* Copy non-newline bytes into BUF. */
+ char const *p = *in;
+ while (p < in_end)
+ {
+ char c = *p++;
+ if (c != '\n')
+ {
+ ctx->buf[ctx->i++] = c;
+ if (ctx->i == 8)
+ break;
+ }
+ }
+
+ *in = p;
+ *n_non_newline = ctx->i;
+ return ctx->buf;
+ }
+}
+
+#define return_false \
+ do \
+ { \
+ *outp = out; \
+ return false; \
+ } \
+ while (false)
+
+/* Decode eight bytes of base32-encoded data, IN, of length INLEN
+ into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
+ decoding is successful, false otherwise. If *OUTLEN is too small,
+ as many bytes as possible are written to *OUT. On return, advance
+ *OUT to point to the byte after the last one written, and decrement
+ *OUTLEN to reflect the number of bytes remaining in *OUT. */
+static inline bool
+decode_8 (char const *restrict in, size_t inlen,
+ char *restrict *outp, size_t *outleft)
+{
+ char *out = *outp;
+ if (inlen < 8)
+ return false;
+
+ if (!isbase32 (in[0]) || !isbase32 (in[1]) )
+ return false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[0])] << 3)
+ | (b32[to_uchar (in[1])] >> 2));
+ --*outleft;
+ }
+
+ if (in[2] == '=')
+ {
+ if (in[3] != '=' || in[4] != '=' || in[5] != '='
+ || in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[2]) || !isbase32 (in[3]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[1])] << 6)
+ | (b32[to_uchar (in[2])] << 1)
+ | (b32[to_uchar (in[3])] >> 4));
+ --*outleft;
+ }
+
+ if (in[4] == '=')
+ {
+ if (in[5] != '=' || in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[4]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[3])] << 4)
+ | (b32[to_uchar (in[4])] >> 1));
+ --*outleft;
+ }
+
+ if (in[5] == '=')
+ {
+ if (in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[5]) || !isbase32 (in[6]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[4])] << 7)
+ | (b32[to_uchar (in[5])] << 2)
+ | (b32[to_uchar (in[6])] >> 3));
+ --*outleft;
+ }
+
+ if (in[7] != '=')
+ {
+ if (!isbase32 (in[7]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[6])] << 5)
+ | (b32[to_uchar (in[7])]));
+ --*outleft;
+ }
+ }
+ }
+ }
+ }
+
+ *outp = out;
+ return true;
+}
+
+/* Decode base32-encoded input array IN of length INLEN to output array
+ OUT that can hold *OUTLEN bytes. The input data may be interspersed
+ with newlines. Return true if decoding was successful, i.e. if the
+ input was valid base32 data, false otherwise. If *OUTLEN is too
+ small, as many bytes as possible will be written to OUT. On return,
+ *OUTLEN holds the length of decoded bytes in OUT. Note that as soon
+ as any non-alphabet, non-newline character is encountered, decoding
+ is stopped and false is returned. If INLEN is zero, then process
+ only whatever data is stored in CTX.
+
+ Initially, CTX must have been initialized via base32_decode_ctx_init.
+ Subsequent calls to this function must reuse whatever state is recorded
+ in that buffer. It is necessary for when a octuple of base32 input
+ bytes spans two input buffers.
+
+ If CTX is NULL then newlines are treated as garbage and the input
+ buffer is processed as a unit. */
+
+bool
+base32_decode_ctx (struct base32_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen)
+{
+ size_t outleft = *outlen;
+ bool ignore_newlines = ctx != NULL;
+ bool flush_ctx = false;
+ unsigned int ctx_i = 0;
+
+ if (ignore_newlines)
+ {
+ ctx_i = ctx->i;
+ flush_ctx = inlen == 0;
+ }
+
+
+ while (true)
+ {
+ size_t outleft_save = outleft;
+ if (ctx_i == 0 && !flush_ctx)
+ {
+ while (true)
+ {
+ /* Save a copy of outleft, in case we need to re-parse this
+ block of four bytes. */
+ outleft_save = outleft;
+ if (!decode_8 (in, inlen, &out, &outleft))
+ break;
+
+ in += 8;
+ inlen -= 8;
+ }
+ }
+
+ if (inlen == 0 && !flush_ctx)
+ break;
+
+ /* Handle the common case of 72-byte wrapped lines.
+ This also handles any other multiple-of-8-byte wrapping. */
+ if (inlen && *in == '\n' && ignore_newlines)
+ {
+ ++in;
+ --inlen;
+ continue;
+ }
+
+ /* Restore OUT and OUTLEFT. */
+ out -= outleft_save - outleft;
+ outleft = outleft_save;
+
+ {
+ char const *in_end = in + inlen;
+ char const *non_nl;
+
+ if (ignore_newlines)
+ non_nl = get_8 (ctx, &in, in_end, &inlen);
+ else
+ non_nl = in; /* Might have nl in this case. */
+
+ /* If the input is empty or consists solely of newlines (0 non-newlines),
+ then we're done. Likewise if there are fewer than 8 bytes when not
+ flushing context and not treating newlines as garbage. */
+ if (inlen == 0 || (inlen < 8 && !flush_ctx && ignore_newlines))
+ {
+ inlen = 0;
+ break;
+ }
+ if (!decode_8 (non_nl, inlen, &out, &outleft))
+ break;
+
+ inlen = in_end - in;
+ }
+ }
+
+ *outlen -= outleft;
+
+ return inlen == 0;
+}
+
+/* Allocate an output buffer in *OUT, and decode the base32 encoded
+ data stored in IN of size INLEN to the *OUT buffer. On return, the
+ size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
+ if the caller is not interested in the decoded length. *OUT may be
+ NULL to indicate an out of memory error, in which case *OUTLEN
+ contains the size of the memory block needed. The function returns
+ true on successful decoding and memory allocation errors. (Use the
+ *OUT and *OUTLEN parameters to differentiate between successful
+ decoding and memory error.) The function returns false if the
+ input was invalid, in which case *OUT is NULL and *OUTLEN is
+ undefined. */
+bool
+base32_decode_alloc_ctx (struct base32_decode_context *ctx,
+ const char *in, size_t inlen, char **out,
+ size_t *outlen)
+{
+ /* This may allocate a few bytes too many, depending on input,
+ but it's not worth the extra CPU time to compute the exact size.
+ The exact size is 5 * inlen / 8, minus one or more bytes if the
+ input is padded with one or more "=".
+ Dividing before multiplying avoids the possibility of overflow. */
+ size_t needlen = 5 * (inlen / 8) + 5;
+
+ *out = malloc (needlen);
+ if (!*out)
+ return true;
+
+ if (!base32_decode_ctx (ctx, in, inlen, *out, &needlen))
+ {
+ free (*out);
+ *out = NULL;
+ return false;
+ }
+
+ if (outlen)
+ *outlen = needlen;
+
+ return true;
+}
diff --git a/gnulib/lib/base32.h b/gnulib/lib/base32.h
new file mode 100644
index 0000000..8768686
--- /dev/null
+++ b/gnulib/lib/base32.h
@@ -0,0 +1,61 @@
+/* base32.h -- Encode binary data using printable characters.
+ Copyright (C) 2004-2006, 2009-2011 Free Software Foundation, Inc.
+ Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef BASE32_H
+# define BASE32_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+/* Get bool. */
+# include <stdbool.h>
+
+/* This uses that the expression (n+(k-1))/k means the smallest
+ integer >= n/k, i.e., the ceiling of n/k. */
+# define BASE32_LENGTH(inlen) ((((inlen) + 4) / 5) * 8)
+
+struct base32_decode_context
+{
+ unsigned int i;
+ char buf[8];
+};
+
+extern bool isbase32 (char ch);
+
+extern void base32_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen);
+
+extern size_t base32_encode_alloc (const char *in, size_t inlen, char **out);
+
+extern void base32_decode_ctx_init (struct base32_decode_context *ctx);
+
+extern bool base32_decode_ctx (struct base32_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen);
+
+extern bool base32_decode_alloc_ctx (struct base32_decode_context *ctx,
+ const char *in, size_t inlen,
+ char **out, size_t *outlen);
+
+#define base32_decode(in, inlen, out, outlen) \
+ base32_decode_ctx (NULL, in, inlen, out, outlen)
+
+#define base32_decode_alloc(in, inlen, out, outlen) \
+ base32_decode_alloc_ctx (NULL, in, inlen, out, outlen)
+
+#endif /* BASE32_H */
diff --git a/gnulib/lib/base64.c b/gnulib/lib/base64.c
new file mode 100644
index 0000000..cbe9a63
--- /dev/null
+++ b/gnulib/lib/base64.c
@@ -0,0 +1,575 @@
+/* base64.c -- Encode binary data using printable characters.
+ Copyright (C) 1999-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. Partially adapted from GNU MailUtils
+ * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review
+ * from Paul Eggert, Bruno Haible, and Stepan Kasal.
+ *
+ * See also RFC 4648 <http://www.ietf.org/rfc/rfc4648.txt>.
+ *
+ * Be careful with error checking. Here is how you would typically
+ * use these functions:
+ *
+ * bool ok = base64_decode_alloc (in, inlen, &out, &outlen);
+ * if (!ok)
+ * FAIL: input was not valid base64
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN
+ *
+ * size_t outlen = base64_encode_alloc (in, inlen, &out);
+ * if (out == NULL && outlen == 0 && inlen != 0)
+ * FAIL: input too long
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN.
+ *
+ */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "base64.h"
+
+/* Get malloc. */
+#include <stdlib.h>
+
+/* Get UCHAR_MAX. */
+#include <limits.h>
+
+#include <string.h>
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
+ If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
+ possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
+ terminate the output buffer. */
+void
+base64_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen)
+{
+ static const char b64str[64] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ while (inlen && outlen)
+ {
+ *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
+ if (!--outlen)
+ break;
+ *out++ = b64str[((to_uchar (in[0]) << 4)
+ + (--inlen ? to_uchar (in[1]) >> 4 : 0))
+ & 0x3f];
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b64str[((to_uchar (in[1]) << 2)
+ + (--inlen ? to_uchar (in[2]) >> 6 : 0))
+ & 0x3f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
+ if (!--outlen)
+ break;
+ if (inlen)
+ inlen--;
+ if (inlen)
+ in += 3;
+ }
+
+ if (outlen)
+ *out = '\0';
+}
+
+/* Allocate a buffer and store zero terminated base64 encoded data
+ from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e.,
+ the length of the encoded data, excluding the terminating zero. On
+ return, the OUT variable will hold a pointer to newly allocated
+ memory that must be deallocated by the caller. If output string
+ length would overflow, 0 is returned and OUT is set to NULL. If
+ memory allocation failed, OUT is set to NULL, and the return value
+ indicates length of the requested memory block, i.e.,
+ BASE64_LENGTH(inlen) + 1. */
+size_t
+base64_encode_alloc (const char *in, size_t inlen, char **out)
+{
+ size_t outlen = 1 + BASE64_LENGTH (inlen);
+
+ /* Check for overflow in outlen computation.
+ *
+ * If there is no overflow, outlen >= inlen.
+ *
+ * If the operation (inlen + 2) overflows then it yields at most +1, so
+ * outlen is 0.
+ *
+ * If the multiplication overflows, we lose at least half of the
+ * correct value, so the result is < ((inlen + 2) / 3) * 2, which is
+ * less than (inlen + 2) * 0.66667, which is less than inlen as soon as
+ * (inlen > 4).
+ */
+ if (inlen > outlen)
+ {
+ *out = NULL;
+ return 0;
+ }
+
+ *out = malloc (outlen);
+ if (!*out)
+ return outlen;
+
+ base64_encode (in, inlen, *out, outlen);
+
+ return outlen - 1;
+}
+
+/* With this approach this file works independent of the charset used
+ (think EBCDIC). However, it does assume that the characters in the
+ Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX
+ 1003.1-2001 require that char and unsigned char are 8-bit
+ quantities, though, taking care of that problem. But this may be a
+ potential problem on non-POSIX C99 platforms.
+
+ IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_"
+ as the formal parameter rather than "x". */
+#define B64(_) \
+ ((_) == 'A' ? 0 \
+ : (_) == 'B' ? 1 \
+ : (_) == 'C' ? 2 \
+ : (_) == 'D' ? 3 \
+ : (_) == 'E' ? 4 \
+ : (_) == 'F' ? 5 \
+ : (_) == 'G' ? 6 \
+ : (_) == 'H' ? 7 \
+ : (_) == 'I' ? 8 \
+ : (_) == 'J' ? 9 \
+ : (_) == 'K' ? 10 \
+ : (_) == 'L' ? 11 \
+ : (_) == 'M' ? 12 \
+ : (_) == 'N' ? 13 \
+ : (_) == 'O' ? 14 \
+ : (_) == 'P' ? 15 \
+ : (_) == 'Q' ? 16 \
+ : (_) == 'R' ? 17 \
+ : (_) == 'S' ? 18 \
+ : (_) == 'T' ? 19 \
+ : (_) == 'U' ? 20 \
+ : (_) == 'V' ? 21 \
+ : (_) == 'W' ? 22 \
+ : (_) == 'X' ? 23 \
+ : (_) == 'Y' ? 24 \
+ : (_) == 'Z' ? 25 \
+ : (_) == 'a' ? 26 \
+ : (_) == 'b' ? 27 \
+ : (_) == 'c' ? 28 \
+ : (_) == 'd' ? 29 \
+ : (_) == 'e' ? 30 \
+ : (_) == 'f' ? 31 \
+ : (_) == 'g' ? 32 \
+ : (_) == 'h' ? 33 \
+ : (_) == 'i' ? 34 \
+ : (_) == 'j' ? 35 \
+ : (_) == 'k' ? 36 \
+ : (_) == 'l' ? 37 \
+ : (_) == 'm' ? 38 \
+ : (_) == 'n' ? 39 \
+ : (_) == 'o' ? 40 \
+ : (_) == 'p' ? 41 \
+ : (_) == 'q' ? 42 \
+ : (_) == 'r' ? 43 \
+ : (_) == 's' ? 44 \
+ : (_) == 't' ? 45 \
+ : (_) == 'u' ? 46 \
+ : (_) == 'v' ? 47 \
+ : (_) == 'w' ? 48 \
+ : (_) == 'x' ? 49 \
+ : (_) == 'y' ? 50 \
+ : (_) == 'z' ? 51 \
+ : (_) == '0' ? 52 \
+ : (_) == '1' ? 53 \
+ : (_) == '2' ? 54 \
+ : (_) == '3' ? 55 \
+ : (_) == '4' ? 56 \
+ : (_) == '5' ? 57 \
+ : (_) == '6' ? 58 \
+ : (_) == '7' ? 59 \
+ : (_) == '8' ? 60 \
+ : (_) == '9' ? 61 \
+ : (_) == '+' ? 62 \
+ : (_) == '/' ? 63 \
+ : -1)
+
+static const signed char b64[0x100] = {
+ B64 (0), B64 (1), B64 (2), B64 (3),
+ B64 (4), B64 (5), B64 (6), B64 (7),
+ B64 (8), B64 (9), B64 (10), B64 (11),
+ B64 (12), B64 (13), B64 (14), B64 (15),
+ B64 (16), B64 (17), B64 (18), B64 (19),
+ B64 (20), B64 (21), B64 (22), B64 (23),
+ B64 (24), B64 (25), B64 (26), B64 (27),
+ B64 (28), B64 (29), B64 (30), B64 (31),
+ B64 (32), B64 (33), B64 (34), B64 (35),
+ B64 (36), B64 (37), B64 (38), B64 (39),
+ B64 (40), B64 (41), B64 (42), B64 (43),
+ B64 (44), B64 (45), B64 (46), B64 (47),
+ B64 (48), B64 (49), B64 (50), B64 (51),
+ B64 (52), B64 (53), B64 (54), B64 (55),
+ B64 (56), B64 (57), B64 (58), B64 (59),
+ B64 (60), B64 (61), B64 (62), B64 (63),
+ B64 (64), B64 (65), B64 (66), B64 (67),
+ B64 (68), B64 (69), B64 (70), B64 (71),
+ B64 (72), B64 (73), B64 (74), B64 (75),
+ B64 (76), B64 (77), B64 (78), B64 (79),
+ B64 (80), B64 (81), B64 (82), B64 (83),
+ B64 (84), B64 (85), B64 (86), B64 (87),
+ B64 (88), B64 (89), B64 (90), B64 (91),
+ B64 (92), B64 (93), B64 (94), B64 (95),
+ B64 (96), B64 (97), B64 (98), B64 (99),
+ B64 (100), B64 (101), B64 (102), B64 (103),
+ B64 (104), B64 (105), B64 (106), B64 (107),
+ B64 (108), B64 (109), B64 (110), B64 (111),
+ B64 (112), B64 (113), B64 (114), B64 (115),
+ B64 (116), B64 (117), B64 (118), B64 (119),
+ B64 (120), B64 (121), B64 (122), B64 (123),
+ B64 (124), B64 (125), B64 (126), B64 (127),
+ B64 (128), B64 (129), B64 (130), B64 (131),
+ B64 (132), B64 (133), B64 (134), B64 (135),
+ B64 (136), B64 (137), B64 (138), B64 (139),
+ B64 (140), B64 (141), B64 (142), B64 (143),
+ B64 (144), B64 (145), B64 (146), B64 (147),
+ B64 (148), B64 (149), B64 (150), B64 (151),
+ B64 (152), B64 (153), B64 (154), B64 (155),
+ B64 (156), B64 (157), B64 (158), B64 (159),
+ B64 (160), B64 (161), B64 (162), B64 (163),
+ B64 (164), B64 (165), B64 (166), B64 (167),
+ B64 (168), B64 (169), B64 (170), B64 (171),
+ B64 (172), B64 (173), B64 (174), B64 (175),
+ B64 (176), B64 (177), B64 (178), B64 (179),
+ B64 (180), B64 (181), B64 (182), B64 (183),
+ B64 (184), B64 (185), B64 (186), B64 (187),
+ B64 (188), B64 (189), B64 (190), B64 (191),
+ B64 (192), B64 (193), B64 (194), B64 (195),
+ B64 (196), B64 (197), B64 (198), B64 (199),
+ B64 (200), B64 (201), B64 (202), B64 (203),
+ B64 (204), B64 (205), B64 (206), B64 (207),
+ B64 (208), B64 (209), B64 (210), B64 (211),
+ B64 (212), B64 (213), B64 (214), B64 (215),
+ B64 (216), B64 (217), B64 (218), B64 (219),
+ B64 (220), B64 (221), B64 (222), B64 (223),
+ B64 (224), B64 (225), B64 (226), B64 (227),
+ B64 (228), B64 (229), B64 (230), B64 (231),
+ B64 (232), B64 (233), B64 (234), B64 (235),
+ B64 (236), B64 (237), B64 (238), B64 (239),
+ B64 (240), B64 (241), B64 (242), B64 (243),
+ B64 (244), B64 (245), B64 (246), B64 (247),
+ B64 (248), B64 (249), B64 (250), B64 (251),
+ B64 (252), B64 (253), B64 (254), B64 (255)
+};
+
+#if UCHAR_MAX == 255
+# define uchar_in_range(c) true
+#else
+# define uchar_in_range(c) ((c) <= 255)
+#endif
+
+/* Return true if CH is a character from the Base64 alphabet, and
+ false otherwise. Note that '=' is padding and not considered to be
+ part of the alphabet. */
+bool
+isbase64 (char ch)
+{
+ return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)];
+}
+
+/* Initialize decode-context buffer, CTX. */
+void
+base64_decode_ctx_init (struct base64_decode_context *ctx)
+{
+ ctx->i = 0;
+}
+
+/* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and
+ none of those four is a newline, then return *IN. Otherwise, copy up to
+ 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
+ index CTX->i and setting CTX->i to reflect the number of bytes copied,
+ and return CTX->buf. In either case, advance *IN to point to the byte
+ after the last one processed, and set *N_NON_NEWLINE to the number of
+ verified non-newline bytes accessible through the returned pointer. */
+static inline char *
+get_4 (struct base64_decode_context *ctx,
+ char const *restrict *in, char const *restrict in_end,
+ size_t *n_non_newline)
+{
+ if (ctx->i == 4)
+ ctx->i = 0;
+
+ if (ctx->i == 0)
+ {
+ char const *t = *in;
+ if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL)
+ {
+ /* This is the common case: no newline. */
+ *in += 4;
+ *n_non_newline = 4;
+ return (char *) t;
+ }
+ }
+
+ {
+ /* Copy non-newline bytes into BUF. */
+ char const *p = *in;
+ while (p < in_end)
+ {
+ char c = *p++;
+ if (c != '\n')
+ {
+ ctx->buf[ctx->i++] = c;
+ if (ctx->i == 4)
+ break;
+ }
+ }
+
+ *in = p;
+ *n_non_newline = ctx->i;
+ return ctx->buf;
+ }
+}
+
+#define return_false \
+ do \
+ { \
+ *outp = out; \
+ return false; \
+ } \
+ while (false)
+
+/* Decode up to four bytes of base64-encoded data, IN, of length INLEN
+ into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
+ decoding is successful, false otherwise. If *OUTLEN is too small,
+ as many bytes as possible are written to *OUT. On return, advance
+ *OUT to point to the byte after the last one written, and decrement
+ *OUTLEN to reflect the number of bytes remaining in *OUT. */
+static inline bool
+decode_4 (char const *restrict in, size_t inlen,
+ char *restrict *outp, size_t *outleft)
+{
+ char *out = *outp;
+ if (inlen < 2)
+ return false;
+
+ if (!isbase64 (in[0]) || !isbase64 (in[1]))
+ return false;
+
+ if (*outleft)
+ {
+ *out++ = ((b64[to_uchar (in[0])] << 2)
+ | (b64[to_uchar (in[1])] >> 4));
+ --*outleft;
+ }
+
+ if (inlen == 2)
+ return_false;
+
+ if (in[2] == '=')
+ {
+ if (inlen != 4)
+ return_false;
+
+ if (in[3] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase64 (in[2]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0)
+ | (b64[to_uchar (in[2])] >> 2));
+ --*outleft;
+ }
+
+ if (inlen == 3)
+ return_false;
+
+ if (in[3] == '=')
+ {
+ if (inlen != 4)
+ return_false;
+ }
+ else
+ {
+ if (!isbase64 (in[3]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0)
+ | b64[to_uchar (in[3])]);
+ --*outleft;
+ }
+ }
+ }
+
+ *outp = out;
+ return true;
+}
+
+/* Decode base64-encoded input array IN of length INLEN to output array
+ OUT that can hold *OUTLEN bytes. The input data may be interspersed
+ with newlines. Return true if decoding was successful, i.e. if the
+ input was valid base64 data, false otherwise. If *OUTLEN is too
+ small, as many bytes as possible will be written to OUT. On return,
+ *OUTLEN holds the length of decoded bytes in OUT. Note that as soon
+ as any non-alphabet, non-newline character is encountered, decoding
+ is stopped and false is returned. If INLEN is zero, then process
+ only whatever data is stored in CTX.
+
+ Initially, CTX must have been initialized via base64_decode_ctx_init.
+ Subsequent calls to this function must reuse whatever state is recorded
+ in that buffer. It is necessary for when a quadruple of base64 input
+ bytes spans two input buffers.
+
+ If CTX is NULL then newlines are treated as garbage and the input
+ buffer is processed as a unit. */
+
+bool
+base64_decode_ctx (struct base64_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen)
+{
+ size_t outleft = *outlen;
+ bool ignore_newlines = ctx != NULL;
+ bool flush_ctx = false;
+ unsigned int ctx_i = 0;
+
+ if (ignore_newlines)
+ {
+ ctx_i = ctx->i;
+ flush_ctx = inlen == 0;
+ }
+
+
+ while (true)
+ {
+ size_t outleft_save = outleft;
+ if (ctx_i == 0 && !flush_ctx)
+ {
+ while (true)
+ {
+ /* Save a copy of outleft, in case we need to re-parse this
+ block of four bytes. */
+ outleft_save = outleft;
+ if (!decode_4 (in, inlen, &out, &outleft))
+ break;
+
+ in += 4;
+ inlen -= 4;
+ }
+ }
+
+ if (inlen == 0 && !flush_ctx)
+ break;
+
+ /* Handle the common case of 72-byte wrapped lines.
+ This also handles any other multiple-of-4-byte wrapping. */
+ if (inlen && *in == '\n' && ignore_newlines)
+ {
+ ++in;
+ --inlen;
+ continue;
+ }
+
+ /* Restore OUT and OUTLEFT. */
+ out -= outleft_save - outleft;
+ outleft = outleft_save;
+
+ {
+ char const *in_end = in + inlen;
+ char const *non_nl;
+
+ if (ignore_newlines)
+ non_nl = get_4 (ctx, &in, in_end, &inlen);
+ else
+ non_nl = in; /* Might have nl in this case. */
+
+ /* If the input is empty or consists solely of newlines (0 non-newlines),
+ then we're done. Likewise if there are fewer than 4 bytes when not
+ flushing context and not treating newlines as garbage. */
+ if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines))
+ {
+ inlen = 0;
+ break;
+ }
+ if (!decode_4 (non_nl, inlen, &out, &outleft))
+ break;
+
+ inlen = in_end - in;
+ }
+ }
+
+ *outlen -= outleft;
+
+ return inlen == 0;
+}
+
+/* Allocate an output buffer in *OUT, and decode the base64 encoded
+ data stored in IN of size INLEN to the *OUT buffer. On return, the
+ size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
+ if the caller is not interested in the decoded length. *OUT may be
+ NULL to indicate an out of memory error, in which case *OUTLEN
+ contains the size of the memory block needed. The function returns
+ true on successful decoding and memory allocation errors. (Use the
+ *OUT and *OUTLEN parameters to differentiate between successful
+ decoding and memory error.) The function returns false if the
+ input was invalid, in which case *OUT is NULL and *OUTLEN is
+ undefined. */
+bool
+base64_decode_alloc_ctx (struct base64_decode_context *ctx,
+ const char *in, size_t inlen, char **out,
+ size_t *outlen)
+{
+ /* This may allocate a few bytes too many, depending on input,
+ but it's not worth the extra CPU time to compute the exact size.
+ The exact size is 3 * (inlen + (ctx ? ctx->i : 0)) / 4, minus 1 if the
+ input ends with "=" and minus another 1 if the input ends with "==".
+ Dividing before multiplying avoids the possibility of overflow. */
+ size_t needlen = 3 * (inlen / 4) + 3;
+
+ *out = malloc (needlen);
+ if (!*out)
+ return true;
+
+ if (!base64_decode_ctx (ctx, in, inlen, *out, &needlen))
+ {
+ free (*out);
+ *out = NULL;
+ return false;
+ }
+
+ if (outlen)
+ *outlen = needlen;
+
+ return true;
+}
diff --git a/gnulib/lib/base64.h b/gnulib/lib/base64.h
new file mode 100644
index 0000000..1d65edc
--- /dev/null
+++ b/gnulib/lib/base64.h
@@ -0,0 +1,61 @@
+/* base64.h -- Encode binary data using printable characters.
+ Copyright (C) 2004-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef BASE64_H
+# define BASE64_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+/* Get bool. */
+# include <stdbool.h>
+
+/* This uses that the expression (n+(k-1))/k means the smallest
+ integer >= n/k, i.e., the ceiling of n/k. */
+# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4)
+
+struct base64_decode_context
+{
+ unsigned int i;
+ char buf[4];
+};
+
+extern bool isbase64 (char ch) _GL_ATTRIBUTE_CONST;
+
+extern void base64_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen);
+
+extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
+
+extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
+
+extern bool base64_decode_ctx (struct base64_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen);
+
+extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx,
+ const char *in, size_t inlen,
+ char **out, size_t *outlen);
+
+#define base64_decode(in, inlen, out, outlen) \
+ base64_decode_ctx (NULL, in, inlen, out, outlen)
+
+#define base64_decode_alloc(in, inlen, out, outlen) \
+ base64_decode_alloc_ctx (NULL, in, inlen, out, outlen)
+
+#endif /* BASE64_H */
diff --git a/gnulib/lib/basename-lgpl.c b/gnulib/lib/basename-lgpl.c
new file mode 100644
index 0000000..529bc35
--- /dev/null
+++ b/gnulib/lib/basename-lgpl.c
@@ -0,0 +1,75 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+
+/* Return the address of the last file name component of NAME. If
+ NAME has no relative file name components because it is a file
+ system root, return the empty string. */
+
+char *
+last_component (char const *name)
+{
+ char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
+ char const *p;
+ bool saw_slash = false;
+
+ while (ISSLASH (*base))
+ base++;
+
+ for (p = base; *p; p++)
+ {
+ if (ISSLASH (*p))
+ saw_slash = true;
+ else if (saw_slash)
+ {
+ base = p;
+ saw_slash = false;
+ }
+ }
+
+ return (char *) base;
+}
+
+/* Return the length of the basename NAME. Typically NAME is the
+ value returned by base_name or last_component. Act like strlen
+ (NAME), except omit all trailing slashes. */
+
+size_t
+base_len (char const *name)
+{
+ size_t len;
+ size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+ for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
+ continue;
+
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
+ && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
+ return 2;
+
+ if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
+ && len == prefix_len && ISSLASH (name[prefix_len]))
+ return prefix_len + 1;
+
+ return len;
+}
diff --git a/gnulib/lib/basename.c b/gnulib/lib/basename.c
new file mode 100644
index 0000000..90ac501
--- /dev/null
+++ b/gnulib/lib/basename.c
@@ -0,0 +1,58 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+#include "xalloc.h"
+#include "xstrndup.h"
+
+char *
+base_name (char const *name)
+{
+ char const *base = last_component (name);
+ size_t length;
+
+ /* If there is no last component, then name is a file system root or the
+ empty string. */
+ if (! *base)
+ return xstrndup (name, base_len (name));
+
+ /* Collapse a sequence of trailing slashes into one. */
+ length = base_len (base);
+ if (ISSLASH (base[length]))
+ length++;
+
+ /* On systems with drive letters, `a/b:c' must return `./b:c' rather
+ than `b:c' to avoid confusion with a drive letter. On systems
+ with pure POSIX semantics, this is not an issue. */
+ if (FILE_SYSTEM_PREFIX_LEN (base))
+ {
+ char *p = xmalloc (length + 3);
+ p[0] = '.';
+ p[1] = '/';
+ memcpy (p + 2, base, length);
+ p[length + 2] = '\0';
+ return p;
+ }
+
+ /* Finally, copy the basename. */
+ return xstrndup (base, length);
+}
diff --git a/gnulib/lib/bcopy.c b/gnulib/lib/bcopy.c
new file mode 100644
index 0000000..c3e8caa
--- /dev/null
+++ b/gnulib/lib/bcopy.c
@@ -0,0 +1,23 @@
+/* bcopy.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+void
+bcopy (void const *source0, void *dest0, size_t length)
+{
+ char const *source = source0;
+ char *dest = dest0;
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+}
diff --git a/gnulib/lib/binary-io.h b/gnulib/lib/binary-io.h
new file mode 100644
index 0000000..c09dbf5
--- /dev/null
+++ b/gnulib/lib/binary-io.h
@@ -0,0 +1,52 @@
+/* Binary mode I/O.
+ Copyright (C) 2001, 2003, 2005, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _BINARY_H
+#define _BINARY_H
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is guaranteed by the gnulib <fcntl.h>. */
+#include <fcntl.h>
+
+/* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...',
+ so we include it here first. */
+#include <stdio.h>
+
+/* SET_BINARY (fd);
+ changes the file descriptor fd to perform binary I/O. */
+#if O_BINARY
+# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
+# include <io.h> /* declares setmode() */
+# else
+# define setmode _setmode
+# undef fileno
+# define fileno _fileno
+# endif
+# ifdef __DJGPP__
+# include <unistd.h> /* declares isatty() */
+ /* Avoid putting stdin/stdout in binary mode if it is connected to
+ the console, because that would make it impossible for the user
+ to interrupt the program through Ctrl-C or Ctrl-Break. */
+# define SET_BINARY(fd) ((void) (!isatty (fd) ? (setmode (fd, O_BINARY), 0) : 0))
+# else
+# define SET_BINARY(fd) ((void) setmode (fd, O_BINARY))
+# endif
+#else
+ /* On reasonable systems, binary I/O is the default. */
+# define SET_BINARY(fd) /* do nothing */ ((void) 0)
+#endif
+
+#endif /* _BINARY_H */
diff --git a/gnulib/lib/bind.c b/gnulib/lib/bind.c
new file mode 100644
index 0000000..baaea59
--- /dev/null
+++ b/gnulib/lib/bind.c
@@ -0,0 +1,49 @@
+/* bind.c --- wrappers for Windows bind function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef bind
+
+int
+rpl_bind (int fd, const struct sockaddr *sockaddr, socklen_t len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = bind (sock, sockaddr, len);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/bitrotate.h b/gnulib/lib/bitrotate.h
new file mode 100644
index 0000000..c3a5e1a
--- /dev/null
+++ b/gnulib/lib/bitrotate.h
@@ -0,0 +1,126 @@
+/* bitrotate.h - Rotate bits in integers
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#ifndef _GL_BITROTATE_H
+#define _GL_BITROTATE_H
+
+#include <limits.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#ifdef UINT64_MAX
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 63 inclusive. */
+static inline uint64_t
+rotl64 (uint64_t x, int n)
+{
+ return ((x << n) | (x >> (64 - n))) & UINT64_MAX;
+}
+
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 63 inclusive.*/
+static inline uint64_t
+rotr64 (uint64_t x, int n)
+{
+ return ((x >> n) | (x << (64 - n))) & UINT64_MAX;
+}
+#endif
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 31 inclusive. */
+static inline uint32_t
+rotl32 (uint32_t x, int n)
+{
+ return ((x << n) | (x >> (32 - n))) & UINT32_MAX;
+}
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 31 inclusive.*/
+static inline uint32_t
+rotr32 (uint32_t x, int n)
+{
+ return ((x >> n) | (x << (32 - n))) & UINT32_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+static inline size_t
+rotl_sz (size_t x, int n)
+{
+ return ((x << n) | (x >> ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+static inline size_t
+rotr_sz (size_t x, int n)
+{
+ return ((x >> n) | (x << ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to
+ 15 inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint16_t
+rotl16 (uint16_t x, int n)
+{
+ return ((x << n) | (x >> (16 - n))) & UINT16_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 15
+ inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint16_t
+rotr16 (uint16_t x, int n)
+{
+ return ((x >> n) | (x << (16 - n))) & UINT16_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint8_t
+rotl8 (uint8_t x, int n)
+{
+ return ((x << n) | (x >> (8 - n))) & UINT8_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+static inline uint8_t
+rotr8 (uint8_t x, int n)
+{
+ return ((x >> n) | (x << (8 - n))) & UINT8_MAX;
+}
+
+#endif /* _GL_BITROTATE_H */
diff --git a/gnulib/lib/btowc.c b/gnulib/lib/btowc.c
new file mode 100644
index 0000000..9b3908d
--- /dev/null
+++ b/gnulib/lib/btowc.c
@@ -0,0 +1,39 @@
+/* Convert unibyte character to wide character.
+ Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+wint_t
+btowc (int c)
+{
+ if (c != EOF)
+ {
+ char buf[1];
+ wchar_t wc;
+
+ buf[0] = c;
+ if (mbtowc (&wc, buf, 1) >= 0)
+ return wc;
+ }
+ return WEOF;
+}
diff --git a/gnulib/lib/byteswap.in.h b/gnulib/lib/byteswap.in.h
new file mode 100644
index 0000000..6114916
--- /dev/null
+++ b/gnulib/lib/byteswap.in.h
@@ -0,0 +1,44 @@
+/* byteswap.h - Byte swapping
+ Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_BYTESWAP_H
+#define _GL_BYTESWAP_H
+
+/* Given an unsigned 16-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
+ (((x) & 0xFF00) >> 8))
+
+/* Given an unsigned 32-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
+ (((x) & 0x0000FF00) << 8) | \
+ (((x) & 0x00FF0000) >> 8) | \
+ (((x) & 0xFF000000) >> 24))
+
+/* Given an unsigned 64-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
+ (((x) & 0x000000000000FF00ULL) << 40) | \
+ (((x) & 0x0000000000FF0000ULL) << 24) | \
+ (((x) & 0x00000000FF000000ULL) << 8) | \
+ (((x) & 0x000000FF00000000ULL) >> 8) | \
+ (((x) & 0x0000FF0000000000ULL) >> 24) | \
+ (((x) & 0x00FF000000000000ULL) >> 40) | \
+ (((x) & 0xFF00000000000000ULL) >> 56))
+
+#endif /* _GL_BYTESWAP_H */
diff --git a/gnulib/lib/c-ctype.c b/gnulib/lib/c-ctype.c
new file mode 100644
index 0000000..335cde5
--- /dev/null
+++ b/gnulib/lib/c-ctype.c
@@ -0,0 +1,396 @@
+/* Character handling in C locale.
+
+ Copyright 2000-2003, 2006, 2009-2011 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#define NO_C_CTYPE_MACROS
+#include "c-ctype.h"
+
+/* The function isascii is not locale dependent. Its use in EBCDIC is
+ questionable. */
+bool
+c_isascii (int c)
+{
+ return (c >= 0x00 && c <= 0x7f);
+}
+
+bool
+c_isalnum (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'));
+#else
+ return ((c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= 'a' && c <= 'z'));
+#endif
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isalpha (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z');
+#else
+ return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
+#endif
+#else
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isblank (int c)
+{
+ return (c == ' ' || c == '\t');
+}
+
+bool
+c_iscntrl (int c)
+{
+#if C_CTYPE_ASCII
+ return ((c & ~0x1f) == 0 || c == 0x7f);
+#else
+ switch (c)
+ {
+ case ' ': case '!': case '"': case '#': case '$': case '%':
+ case '&': case '\'': case '(': case ')': case '*': case '+':
+ case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 0;
+ default:
+ return 1;
+ }
+#endif
+}
+
+bool
+c_isdigit (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS
+ return (c >= '0' && c <= '9');
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_islower (int c)
+{
+#if C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'a' && c <= 'z');
+#else
+ switch (c)
+ {
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isgraph (int c)
+{
+#if C_CTYPE_ASCII
+ return (c >= '!' && c <= '~');
+#else
+ switch (c)
+ {
+ case '!': case '"': case '#': case '$': case '%': case '&':
+ case '\'': case '(': case ')': case '*': case '+': case ',':
+ case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isprint (int c)
+{
+#if C_CTYPE_ASCII
+ return (c >= ' ' && c <= '~');
+#else
+ switch (c)
+ {
+ case ' ': case '!': case '"': case '#': case '$': case '%':
+ case '&': case '\'': case '(': case ')': case '*': case '+':
+ case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+ case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+ case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+ case 'y': case 'z':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_ispunct (int c)
+{
+#if C_CTYPE_ASCII
+ return ((c >= '!' && c <= '~')
+ && !((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')));
+#else
+ switch (c)
+ {
+ case '!': case '"': case '#': case '$': case '%': case '&':
+ case '\'': case '(': case ')': case '*': case '+': case ',':
+ case '-': case '.': case '/':
+ case ':': case ';': case '<': case '=': case '>': case '?':
+ case '@':
+ case '[': case '\\': case ']': case '^': case '_': case '`':
+ case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isspace (int c)
+{
+ return (c == ' ' || c == '\t'
+ || c == '\n' || c == '\v' || c == '\f' || c == '\r');
+}
+
+bool
+c_isupper (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE
+ return (c >= 'A' && c <= 'Z');
+#else
+ switch (c)
+ {
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+bool
+c_isxdigit (int c)
+{
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+ return ((c >= '0' && c <= '9')
+ || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F'));
+#else
+ return ((c >= '0' && c <= '9')
+ || (c >= 'A' && c <= 'F')
+ || (c >= 'a' && c <= 'f'));
+#endif
+#else
+ switch (c)
+ {
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ return 1;
+ default:
+ return 0;
+ }
+#endif
+}
+
+int
+c_tolower (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);
+#else
+ switch (c)
+ {
+ case 'A': return 'a';
+ case 'B': return 'b';
+ case 'C': return 'c';
+ case 'D': return 'd';
+ case 'E': return 'e';
+ case 'F': return 'f';
+ case 'G': return 'g';
+ case 'H': return 'h';
+ case 'I': return 'i';
+ case 'J': return 'j';
+ case 'K': return 'k';
+ case 'L': return 'l';
+ case 'M': return 'm';
+ case 'N': return 'n';
+ case 'O': return 'o';
+ case 'P': return 'p';
+ case 'Q': return 'q';
+ case 'R': return 'r';
+ case 'S': return 's';
+ case 'T': return 't';
+ case 'U': return 'u';
+ case 'V': return 'v';
+ case 'W': return 'w';
+ case 'X': return 'x';
+ case 'Y': return 'y';
+ case 'Z': return 'z';
+ default: return c;
+ }
+#endif
+}
+
+int
+c_toupper (int c)
+{
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+ return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
+#else
+ switch (c)
+ {
+ case 'a': return 'A';
+ case 'b': return 'B';
+ case 'c': return 'C';
+ case 'd': return 'D';
+ case 'e': return 'E';
+ case 'f': return 'F';
+ case 'g': return 'G';
+ case 'h': return 'H';
+ case 'i': return 'I';
+ case 'j': return 'J';
+ case 'k': return 'K';
+ case 'l': return 'L';
+ case 'm': return 'M';
+ case 'n': return 'N';
+ case 'o': return 'O';
+ case 'p': return 'P';
+ case 'q': return 'Q';
+ case 'r': return 'R';
+ case 's': return 'S';
+ case 't': return 'T';
+ case 'u': return 'U';
+ case 'v': return 'V';
+ case 'w': return 'W';
+ case 'x': return 'X';
+ case 'y': return 'Y';
+ case 'z': return 'Z';
+ default: return c;
+ }
+#endif
+}
diff --git a/gnulib/lib/c-ctype.h b/gnulib/lib/c-ctype.h
new file mode 100644
index 0000000..078bd9a
--- /dev/null
+++ b/gnulib/lib/c-ctype.h
@@ -0,0 +1,295 @@
+/* Character handling in C locale.
+
+ These functions work like the corresponding functions in <ctype.h>,
+ except that they have the C (POSIX) locale hardwired, whereas the
+ <ctype.h> functions' behaviour depends on the current locale set via
+ setlocale.
+
+ Copyright (C) 2000-2003, 2006, 2008-2011 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef C_CTYPE_H
+#define C_CTYPE_H
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. */
+
+
+/* Check whether the ASCII optimizations apply. */
+
+/* ANSI C89 (and ISO C99 5.2.1.3 too) already guarantees that
+ '0', '1', ..., '9' have consecutive integer values. */
+#define C_CTYPE_CONSECUTIVE_DIGITS 1
+
+#if ('A' <= 'Z') \
+ && ('A' + 1 == 'B') && ('B' + 1 == 'C') && ('C' + 1 == 'D') \
+ && ('D' + 1 == 'E') && ('E' + 1 == 'F') && ('F' + 1 == 'G') \
+ && ('G' + 1 == 'H') && ('H' + 1 == 'I') && ('I' + 1 == 'J') \
+ && ('J' + 1 == 'K') && ('K' + 1 == 'L') && ('L' + 1 == 'M') \
+ && ('M' + 1 == 'N') && ('N' + 1 == 'O') && ('O' + 1 == 'P') \
+ && ('P' + 1 == 'Q') && ('Q' + 1 == 'R') && ('R' + 1 == 'S') \
+ && ('S' + 1 == 'T') && ('T' + 1 == 'U') && ('U' + 1 == 'V') \
+ && ('V' + 1 == 'W') && ('W' + 1 == 'X') && ('X' + 1 == 'Y') \
+ && ('Y' + 1 == 'Z')
+#define C_CTYPE_CONSECUTIVE_UPPERCASE 1
+#endif
+
+#if ('a' <= 'z') \
+ && ('a' + 1 == 'b') && ('b' + 1 == 'c') && ('c' + 1 == 'd') \
+ && ('d' + 1 == 'e') && ('e' + 1 == 'f') && ('f' + 1 == 'g') \
+ && ('g' + 1 == 'h') && ('h' + 1 == 'i') && ('i' + 1 == 'j') \
+ && ('j' + 1 == 'k') && ('k' + 1 == 'l') && ('l' + 1 == 'm') \
+ && ('m' + 1 == 'n') && ('n' + 1 == 'o') && ('o' + 1 == 'p') \
+ && ('p' + 1 == 'q') && ('q' + 1 == 'r') && ('r' + 1 == 's') \
+ && ('s' + 1 == 't') && ('t' + 1 == 'u') && ('u' + 1 == 'v') \
+ && ('v' + 1 == 'w') && ('w' + 1 == 'x') && ('x' + 1 == 'y') \
+ && ('y' + 1 == 'z')
+#define C_CTYPE_CONSECUTIVE_LOWERCASE 1
+#endif
+
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
+ Testing the value of '\n' and '\r' is not relevant. */
+#define C_CTYPE_ASCII 1
+#endif
+
+
+/* Function declarations. */
+
+/* Unlike the functions in <ctype.h>, which require an argument in the range
+ of the 'unsigned char' type, the functions here operate on values that are
+ in the 'unsigned char' range or in the 'char' range. In other words,
+ when you have a 'char' value, you need to cast it before using it as
+ argument to a <ctype.h> function:
+
+ const char *s = ...;
+ if (isalpha ((unsigned char) *s)) ...
+
+ but you don't need to cast it for the functions defined in this file:
+
+ const char *s = ...;
+ if (c_isalpha (*s)) ...
+ */
+
+extern bool c_isascii (int c) _GL_ATTRIBUTE_CONST; /* not locale dependent */
+
+extern bool c_isalnum (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isalpha (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isblank (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_iscntrl (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isdigit (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_islower (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isgraph (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isprint (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_ispunct (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isspace (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isupper (int c) _GL_ATTRIBUTE_CONST;
+extern bool c_isxdigit (int c) _GL_ATTRIBUTE_CONST;
+
+extern int c_tolower (int c) _GL_ATTRIBUTE_CONST;
+extern int c_toupper (int c) _GL_ATTRIBUTE_CONST;
+
+
+#if defined __GNUC__ && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined NO_C_CTYPE_MACROS
+
+/* ASCII optimizations. */
+
+#undef c_isascii
+#define c_isascii(c) \
+ ({ int __c = (c); \
+ (__c >= 0x00 && __c <= 0x7f); \
+ })
+
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isalnum
+#define c_isalnum(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z')); \
+ })
+#else
+#undef c_isalnum
+#define c_isalnum(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || (__c >= 'A' && __c <= 'Z') \
+ || (__c >= 'a' && __c <= 'z')); \
+ })
+#endif
+#endif
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isalpha
+#define c_isalpha(c) \
+ ({ int __c = (c); \
+ ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z'); \
+ })
+#else
+#undef c_isalpha
+#define c_isalpha(c) \
+ ({ int __c = (c); \
+ ((__c >= 'A' && __c <= 'Z') || (__c >= 'a' && __c <= 'z')); \
+ })
+#endif
+#endif
+
+#undef c_isblank
+#define c_isblank(c) \
+ ({ int __c = (c); \
+ (__c == ' ' || __c == '\t'); \
+ })
+
+#if C_CTYPE_ASCII
+#undef c_iscntrl
+#define c_iscntrl(c) \
+ ({ int __c = (c); \
+ ((__c & ~0x1f) == 0 || __c == 0x7f); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_DIGITS
+#undef c_isdigit
+#define c_isdigit(c) \
+ ({ int __c = (c); \
+ (__c >= '0' && __c <= '9'); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_LOWERCASE
+#undef c_islower
+#define c_islower(c) \
+ ({ int __c = (c); \
+ (__c >= 'a' && __c <= 'z'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_isgraph
+#define c_isgraph(c) \
+ ({ int __c = (c); \
+ (__c >= '!' && __c <= '~'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_isprint
+#define c_isprint(c) \
+ ({ int __c = (c); \
+ (__c >= ' ' && __c <= '~'); \
+ })
+#endif
+
+#if C_CTYPE_ASCII
+#undef c_ispunct
+#define c_ispunct(c) \
+ ({ int _c = (c); \
+ (c_isgraph (_c) && ! c_isalnum (_c)); \
+ })
+#endif
+
+#undef c_isspace
+#define c_isspace(c) \
+ ({ int __c = (c); \
+ (__c == ' ' || __c == '\t' \
+ || __c == '\n' || __c == '\v' || __c == '\f' || __c == '\r'); \
+ })
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE
+#undef c_isupper
+#define c_isupper(c) \
+ ({ int __c = (c); \
+ (__c >= 'A' && __c <= 'Z'); \
+ })
+#endif
+
+#if C_CTYPE_CONSECUTIVE_DIGITS \
+ && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#if C_CTYPE_ASCII
+#undef c_isxdigit
+#define c_isxdigit(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'F')); \
+ })
+#else
+#undef c_isxdigit
+#define c_isxdigit(c) \
+ ({ int __c = (c); \
+ ((__c >= '0' && __c <= '9') \
+ || (__c >= 'A' && __c <= 'F') \
+ || (__c >= 'a' && __c <= 'f')); \
+ })
+#endif
+#endif
+
+#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+#undef c_tolower
+#define c_tolower(c) \
+ ({ int __c = (c); \
+ (__c >= 'A' && __c <= 'Z' ? __c - 'A' + 'a' : __c); \
+ })
+#undef c_toupper
+#define c_toupper(c) \
+ ({ int __c = (c); \
+ (__c >= 'a' && __c <= 'z' ? __c - 'a' + 'A' : __c); \
+ })
+#endif
+
+#endif /* optimizing for speed */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* C_CTYPE_H */
diff --git a/gnulib/lib/c-stack.c b/gnulib/lib/c-stack.c
new file mode 100644
index 0000000..2f902af
--- /dev/null
+++ b/gnulib/lib/c-stack.c
@@ -0,0 +1,330 @@
+/* Stack overflow handling.
+
+ Copyright (C) 2002, 2004, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* NOTES:
+
+ A program that uses alloca, dynamic arrays, or large local
+ variables may extend the stack by more than a page at a time. If
+ so, when the stack overflows the operating system may not detect
+ the overflow until the program uses the array, and this module may
+ incorrectly report a program error instead of a stack overflow.
+
+ To avoid this problem, allocate only small objects on the stack; a
+ program should be OK if it limits single allocations to a page or
+ less. Allocate larger arrays in static storage, or on the heap
+ (e.g., with malloc). Yes, this is a pain, but we don't know of any
+ better solution that is portable.
+
+ No attempt has been made to deal with multithreaded applications. */
+
+#include <config.h>
+
+#ifndef __attribute__
+# if __GNUC__ < 3
+# define __attribute__(x)
+# endif
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include <errno.h>
+
+#include <signal.h>
+#if ! HAVE_STACK_T && ! defined stack_t
+typedef struct sigaltstack stack_t;
+#endif
+#ifndef SIGSTKSZ
+# define SIGSTKSZ 16384
+#elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384
+/* libsigsegv 2.6 through 2.8 have a bug where some architectures use
+ more than the Linux default of an 8k alternate stack when deciding
+ if a fault was caused by stack overflow. */
+# undef SIGSTKSZ
+# define SIGSTKSZ 16384
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Posix 2001 declares ucontext_t in <ucontext.h>, Posix 200x in
+ <signal.h>. */
+#if HAVE_UCONTEXT_H
+# include <ucontext.h>
+#endif
+
+#include <unistd.h>
+
+#if HAVE_LIBSIGSEGV
+# include <sigsegv.h>
+#endif
+
+#include "c-stack.h"
+#include "exitfail.h"
+#include "ignore-value.h"
+
+#if defined SA_ONSTACK && defined SA_SIGINFO
+# define SIGINFO_WORKS 1
+#else
+# define SIGINFO_WORKS 0
+# ifndef SA_ONSTACK
+# define SA_ONSTACK 0
+# endif
+#endif
+
+extern char *program_name;
+
+/* The user-specified action to take when a SEGV-related program error
+ or stack overflow occurs. */
+static void (* volatile segv_action) (int);
+
+/* Translated messages for program errors and stack overflow. Do not
+ translate them in the signal handler, since gettext is not
+ async-signal-safe. */
+static char const * volatile program_error_message;
+static char const * volatile stack_overflow_message;
+
+/* Output an error message, then exit with status EXIT_FAILURE if it
+ appears to have been a stack overflow, or with a core dump
+ otherwise. This function is async-signal-safe. */
+
+static _Noreturn void
+die (int signo)
+{
+ char const *message;
+#if !SIGINFO_WORKS && !HAVE_LIBSIGSEGV
+ /* We can't easily determine whether it is a stack overflow; so
+ assume that the rest of our program is perfect (!) and that
+ this segmentation violation is a stack overflow. */
+ signo = 0;
+#endif /* !SIGINFO_WORKS && !HAVE_LIBSIGSEGV */
+ segv_action (signo);
+ message = signo ? program_error_message : stack_overflow_message;
+ ignore_value (write (STDERR_FILENO, program_name, strlen (program_name)));
+ ignore_value (write (STDERR_FILENO, ": ", 2));
+ ignore_value (write (STDERR_FILENO, message, strlen (message)));
+ ignore_value (write (STDERR_FILENO, "\n", 1));
+ if (! signo)
+ _exit (exit_failure);
+ raise (signo);
+ abort ();
+}
+
+#if (HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK \
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV
+
+/* Storage for the alternate signal stack. */
+static union
+{
+ char buffer[SIGSTKSZ];
+
+ /* These other members are for proper alignment. There's no
+ standard way to guarantee stack alignment, but this seems enough
+ in practice. */
+ long double ld;
+ long l;
+ void *p;
+} alternate_signal_stack;
+
+static void
+null_action (int signo __attribute__ ((unused)))
+{
+}
+
+#endif /* SIGALTSTACK || LIBSIGSEGV */
+
+/* Only use libsigsegv if we need it; platforms like Solaris can
+ detect stack overflow without the overhead of an external
+ library. */
+#if HAVE_LIBSIGSEGV && ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+
+/* Nonzero if general segv handler could not be installed. */
+static volatile int segv_handler_missing;
+
+/* Handle a segmentation violation and exit if it cannot be stack
+ overflow. This function is async-signal-safe. */
+
+static int segv_handler (void *address __attribute__ ((unused)),
+ int serious)
+{
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf, "segv_handler serious=%d\n", serious);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+
+ /* If this fault is not serious, return 0 to let the stack overflow
+ handler take a shot at it. */
+ if (!serious)
+ return 0;
+ die (SIGSEGV);
+}
+
+/* Handle a segmentation violation that is likely to be a stack
+ overflow and exit. This function is async-signal-safe. */
+
+static _Noreturn void
+overflow_handler (int emergency,
+ stackoverflow_context_t context __attribute__ ((unused)))
+{
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf, "overflow_handler emergency=%d segv_handler_missing=%d\n",
+ emergency, segv_handler_missing);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+
+ die ((!emergency || segv_handler_missing) ? 0 : SIGSEGV);
+}
+
+int
+c_stack_action (void (*action) (int))
+{
+ segv_action = action ? action : null_action;
+ program_error_message = _("program error");
+ stack_overflow_message = _("stack overflow");
+
+ /* Always install the overflow handler. */
+ if (stackoverflow_install_handler (overflow_handler,
+ alternate_signal_stack.buffer,
+ sizeof alternate_signal_stack.buffer))
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+ /* Try installing a general handler; if it fails, then treat all
+ segv as stack overflow. */
+ segv_handler_missing = sigsegv_install_handler (segv_handler);
+ return 0;
+}
+
+#elif HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK && HAVE_STACK_OVERFLOW_HANDLING
+
+# if SIGINFO_WORKS
+
+/* Handle a segmentation violation and exit. This function is
+ async-signal-safe. */
+
+static _Noreturn void
+segv_handler (int signo, siginfo_t *info,
+ void *context __attribute__ ((unused)))
+{
+ /* Clear SIGNO if it seems to have been a stack overflow. */
+# if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
+ /* We can't easily determine whether it is a stack overflow; so
+ assume that the rest of our program is perfect (!) and that
+ this segmentation violation is a stack overflow.
+
+ Note that although both Linux and Solaris provide
+ sigaltstack, SA_ONSTACK, and SA_SIGINFO, currently only
+ Solaris satisfies the XSI heueristic. This is because
+ Solaris populates uc_stack with the details of the
+ interrupted stack, while Linux populates it with the details
+ of the current stack. */
+ signo = 0;
+# else
+ if (0 < info->si_code)
+ {
+ /* If the faulting address is within the stack, or within one
+ page of the stack, assume that it is a stack overflow. */
+ ucontext_t const *user_context = context;
+ char const *stack_base = user_context->uc_stack.ss_sp;
+ size_t stack_size = user_context->uc_stack.ss_size;
+ char const *faulting_address = info->si_addr;
+ size_t page_size = sysconf (_SC_PAGESIZE);
+ size_t s = faulting_address - stack_base + page_size;
+ if (s < stack_size + 2 * page_size)
+ signo = 0;
+
+# if DEBUG
+ {
+ char buf[1024];
+ sprintf (buf,
+ "segv_handler fault=%p base=%p size=%lx page=%lx signo=%d\n",
+ faulting_address, stack_base, (unsigned long) stack_size,
+ (unsigned long) page_size, signo);
+ write (STDERR_FILENO, buf, strlen (buf));
+ }
+# endif
+ }
+# endif
+
+ die (signo);
+}
+# endif
+
+int
+c_stack_action (void (*action) (int))
+{
+ int r;
+ stack_t st;
+ struct sigaction act;
+ st.ss_flags = 0;
+# if SIGALTSTACK_SS_REVERSED
+ /* Irix mistakenly treats ss_sp as the upper bound, rather than
+ lower bound, of the alternate stack. */
+ st.ss_sp = alternate_signal_stack.buffer + SIGSTKSZ - sizeof (void *);
+ st.ss_size = sizeof alternate_signal_stack.buffer - sizeof (void *);
+# else
+ st.ss_sp = alternate_signal_stack.buffer;
+ st.ss_size = sizeof alternate_signal_stack.buffer;
+# endif
+ r = sigaltstack (&st, NULL);
+ if (r != 0)
+ return r;
+
+ segv_action = action ? action : null_action;
+ program_error_message = _("program error");
+ stack_overflow_message = _("stack overflow");
+
+ sigemptyset (&act.sa_mask);
+
+# if SIGINFO_WORKS
+ /* POSIX 1003.1-2001 says SA_RESETHAND implies SA_NODEFER, but
+ this is not true on Solaris 8 at least. It doesn't hurt to use
+ SA_NODEFER here, so leave it in. */
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
+ act.sa_sigaction = segv_handler;
+# else
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
+ act.sa_handler = die;
+# endif
+
+# if FAULT_YIELDS_SIGBUS
+ if (sigaction (SIGBUS, &act, NULL) < 0)
+ return -1;
+# endif
+ return sigaction (SIGSEGV, &act, NULL);
+}
+
+#else /* ! ((HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK
+ && HAVE_STACK_OVERFLOW_HANDLING) || HAVE_LIBSIGSEGV) */
+
+int
+c_stack_action (void (*action) (int) __attribute__ ((unused)))
+{
+ errno = ENOTSUP;
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/c-stack.h b/gnulib/lib/c-stack.h
new file mode 100644
index 0000000..5aadfb5
--- /dev/null
+++ b/gnulib/lib/c-stack.h
@@ -0,0 +1,44 @@
+/* Stack overflow handling.
+
+ Copyright (C) 2002, 2004, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* Set up ACTION so that it is invoked on C stack overflow and on other,
+ stack-unrelated, segmentation violation.
+ Return -1 (setting errno) if this cannot be done.
+
+ When a stack overflow or segmentation violation occurs:
+ 1) ACTION is called. It is passed an argument equal to
+ - 0, for a stack overflow,
+ - SIGSEGV, for a segmentation violation that does not appear related
+ to stack overflow.
+ On many platforms the two cases are hard to distinguish; when in doubt,
+ zero is passed.
+ 2) If ACTION returns, a message is written to standard error, and the
+ program is terminated: in the case of stack overflow, with exit code
+ exit_failure (see "exitfail.h"), otherwise through a signal SIGSEGV.
+
+ A null ACTION acts like an action that does nothing.
+
+ ACTION must be async-signal-safe. ACTION together with its callees
+ must not require more than SIGSTKSZ bytes of stack space. Also,
+ ACTION should not call longjmp, because this implementation does
+ not guarantee that it is safe to return to the original stack.
+
+ This function may install a handler for the SIGSEGV signal or for the SIGBUS
+ signal or exercise other system dependent exception handling APIs. */
+
+extern int c_stack_action (void (* /*action*/) (int));
diff --git a/gnulib/lib/c-strcase.h b/gnulib/lib/c-strcase.h
new file mode 100644
index 0000000..df2f070
--- /dev/null
+++ b/gnulib/lib/c-strcase.h
@@ -0,0 +1,57 @@
+/* Case-insensitive string comparison functions in C locale.
+ Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef C_STRCASE_H
+#define C_STRCASE_H
+
+#include <stddef.h>
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. More precisely, one of the string arguments must be an ASCII
+ string; the other one can also contain non-ASCII characters (but then
+ the comparison result will be nonzero). */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2. */
+extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE;
+
+/* Compare no more than N characters of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2. */
+extern int c_strncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASE_H */
diff --git a/gnulib/lib/c-strcasecmp.c b/gnulib/lib/c-strcasecmp.c
new file mode 100644
index 0000000..f5e5e48
--- /dev/null
+++ b/gnulib/lib/c-strcasecmp.c
@@ -0,0 +1,57 @@
+/* c-strcasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strcasecmp (const char *s1, const char *s2)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/c-strcaseeq.h b/gnulib/lib/c-strcaseeq.h
new file mode 100644
index 0000000..754303d
--- /dev/null
+++ b/gnulib/lib/c-strcaseeq.h
@@ -0,0 +1,184 @@
+/* Optimized case-insensitive string comparison in C locale.
+ Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include "c-strcase.h"
+#include "c-ctype.h"
+
+/* STRCASEEQ allows to optimize string comparison with a small literal string.
+ STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
+ is semantically equivalent to
+ c_strcasecmp (s, "UTF-8") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if defined (__GNUC__) && defined (__OPTIMIZE__)
+
+/* Case insensitive comparison of ASCII characters. */
+# if C_CTYPE_ASCII
+# define CASEEQ(other,upper) \
+ (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
+# elif C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
+# define CASEEQ(other,upper) \
+ (c_isupper (upper) ? (other) == (upper) || (other) == (upper) - 'A' + 'a' : (other) == (upper))
+# else
+# define CASEEQ(other,upper) \
+ (c_toupper (other) == (upper))
+# endif
+
+static inline int
+strcaseeq9 (const char *s1, const char *s2)
+{
+ return c_strcasecmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+strcaseeq8 (const char *s1, const char *s2, char s28)
+{
+ if (CASEEQ (s1[8], s28))
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return strcaseeq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (CASEEQ (s1[7], s27))
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return strcaseeq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[6], s26))
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return strcaseeq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[5], s25))
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return strcaseeq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[4], s24))
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return strcaseeq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[3], s23))
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[2], s22))
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[1], s21))
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[0], s20))
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (c_strcasecmp (s1, s2) == 0)
+
+#endif
diff --git a/gnulib/lib/c-strcasestr.c b/gnulib/lib/c-strcasestr.c
new file mode 100644
index 0000000..45fccca
--- /dev/null
+++ b/gnulib/lib/c-strcasestr.c
@@ -0,0 +1,77 @@
+/* c-strcasestr.c -- case insensitive substring search in C locale
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcasestr.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT c_tolower
+#define CMP_FUNC(p1, p2, l) \
+ c_strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison from the C locale, regardless of the current locale. */
+char *
+c_strcasestr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= (c_tolower ((unsigned char) *haystack++)
+ == c_tolower ((unsigned char) *needle++));
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/c-strcasestr.h b/gnulib/lib/c-strcasestr.h
new file mode 100644
index 0000000..396c0d4
--- /dev/null
+++ b/gnulib/lib/c-strcasestr.h
@@ -0,0 +1,36 @@
+/* Case-insensitive searching in a string in C locale.
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef C_STRCASESTR_H
+#define C_STRCASESTR_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+extern char *c_strcasestr (const char *haystack, const char *needle);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASESTR_H */
diff --git a/gnulib/lib/c-strncasecmp.c b/gnulib/lib/c-strncasecmp.c
new file mode 100644
index 0000000..0085185
--- /dev/null
+++ b/gnulib/lib/c-strncasecmp.c
@@ -0,0 +1,57 @@
+/* c-strncasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/c-strstr.c b/gnulib/lib/c-strstr.c
new file mode 100644
index 0000000..307c1f9
--- /dev/null
+++ b/gnulib/lib/c-strstr.c
@@ -0,0 +1,32 @@
+/* c-strstr.c -- substring search in C locale
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strstr.h"
+
+#include <string.h>
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+char *
+c_strstr (const char *haystack, const char *needle)
+{
+ /* POSIX says that strstr() interprets the strings as byte sequences, not
+ as character sequences in the current locale. */
+ return strstr (haystack, needle);
+}
diff --git a/gnulib/lib/c-strstr.h b/gnulib/lib/c-strstr.h
new file mode 100644
index 0000000..b4206b9
--- /dev/null
+++ b/gnulib/lib/c-strstr.h
@@ -0,0 +1,44 @@
+/* Searching in a string.
+ Copyright (C) 2001-2003, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* The functions defined in this file assume a nearly ASCII compatible
+ character set. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK.
+ This function is safe to be called, even in a multibyte locale, if NEEDLE
+ 1. consists solely of printable ASCII characters excluding '\\' and '~'
+ [this restriction is needed because of Shift_JIS and JOHAB]
+ or of the control ASCII characters '\a' '\b' '\f' '\n' '\r' '\t' '\v'
+ [this restriction is needed because of VISCII], and
+ 2. has at least length 2
+ [this restriction is needed because of BIG5, BIG5-HKSCS, GBK, GB18030,
+ Shift_JIS, JOHAB], and
+ 3. does not consist entirely of decimal digits, or has at least length 4
+ [this restricion is needed because of GB18030].
+ This function is also safe to be called, even in a multibyte locale, if
+ HAYSTACK and NEEDLE are known to both consist solely of printable ASCII
+ characters excluding '\\' and '~'. */
+extern char *c_strstr (const char *haystack, const char *needle);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/c-strtod.c b/gnulib/lib/c-strtod.c
new file mode 100644
index 0000000..5b39b9b
--- /dev/null
+++ b/gnulib/lib/c-strtod.c
@@ -0,0 +1,112 @@
+/* Convert string to double, using the C locale.
+
+ Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "c-strtod.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if LONG
+# define C_STRTOD c_strtold
+# define DOUBLE long double
+# define STRTOD_L strtold_l
+#else
+# define C_STRTOD c_strtod
+# define DOUBLE double
+# define STRTOD_L strtod_l
+#endif
+
+/* c_strtold falls back on strtod if strtold doesn't conform to C99. */
+#if LONG && HAVE_C99_STRTOLD
+# define STRTOD strtold
+#else
+# define STRTOD strtod
+#endif
+
+#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L)
+
+/* Cache for the C locale object.
+ Marked volatile so that different threads see the same value
+ (avoids locking). */
+static volatile locale_t c_locale_cache;
+
+/* Return the C locale object, or (locale_t) 0 with errno set
+ if it cannot be created. */
+static inline locale_t
+c_locale (void)
+{
+ if (!c_locale_cache)
+ c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0);
+ return c_locale_cache;
+}
+
+#endif
+
+DOUBLE
+C_STRTOD (char const *nptr, char **endptr)
+{
+ DOUBLE r;
+
+#if defined LC_ALL_MASK && (LONG ? HAVE_STRTOLD_L : HAVE_STRTOD_L)
+
+ locale_t locale = c_locale ();
+ if (!locale)
+ {
+ if (endptr)
+ *endptr = (char *) nptr;
+ return 0; /* errno is set here */
+ }
+
+ r = STRTOD_L (nptr, endptr, locale);
+
+#else
+
+ char *saved_locale = setlocale (LC_NUMERIC, NULL);
+
+ if (saved_locale)
+ {
+ saved_locale = strdup (saved_locale);
+ if (saved_locale == NULL)
+ {
+ if (endptr)
+ *endptr = (char *) nptr;
+ return 0; /* errno is set here */
+ }
+ setlocale (LC_NUMERIC, "C");
+ }
+
+ r = STRTOD (nptr, endptr);
+
+ if (saved_locale)
+ {
+ int saved_errno = errno;
+
+ setlocale (LC_NUMERIC, saved_locale);
+ free (saved_locale);
+ errno = saved_errno;
+ }
+
+#endif
+
+ return r;
+}
diff --git a/gnulib/lib/c-strtod.h b/gnulib/lib/c-strtod.h
new file mode 100644
index 0000000..3d5cb13
--- /dev/null
+++ b/gnulib/lib/c-strtod.h
@@ -0,0 +1,37 @@
+/* Convert string to double, using the C locale.
+
+ Copyright (C) 2003-2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Parse the initial portion of the string pointed to by NPTR as a floating-
+ point number (in decimal or hexadecimal notation), like in the C locale:
+ accepting only the ASCII digits '0'..'9', and only '.' as decimal point
+ character.
+ If ENDPTR is not NULL, set *ENDPTR to point to the first byte beyond the
+ parsed number or to NPTR if the string does not start with a parseable
+ number.
+ Return value:
+ - If successful, return the value as a double or 'long double',
+ respectively, and don't modify errno.
+ - In case of overflow, return ±HUGE_VAL or ±HUGE_VALL, respectively, and
+ set errno to ERANGE.
+ - In case of underflow, return a value very near to 0 and set errno to
+ ERANGE.
+ - If the string does not start with a number at all, return 0 (and recall
+ that if ENDPTR != NULL, *ENDPTR is set to NPTR), and maybe set errno to
+ EINVAL.
+ - In case of other error, return 0 and set errno, for example to ENOMEM. */
+extern double c_strtod (char const *nptr, char **endptr);
+extern long double c_strtold (char const *nptr, char **endptr);
diff --git a/gnulib/lib/c-strtold.c b/gnulib/lib/c-strtold.c
new file mode 100644
index 0000000..5510e4a
--- /dev/null
+++ b/gnulib/lib/c-strtold.c
@@ -0,0 +1,2 @@
+#define LONG 1
+#include "c-strtod.c"
diff --git a/gnulib/lib/calloc.c b/gnulib/lib/calloc.c
new file mode 100644
index 0000000..4ac06d2
--- /dev/null
+++ b/gnulib/lib/calloc.c
@@ -0,0 +1,73 @@
+/* calloc() function that is glibc compatible.
+ This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
+ Copyright (C) 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+/* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h. */
+#ifdef calloc
+# define NEED_CALLOC_GNU 1
+# undef calloc
+/* Whereas the gnulib module 'calloc-gnu' defines HAVE_CALLOC_GNU. */
+#elif GNULIB_CALLOC_GNU && !HAVE_CALLOC_GNU
+# define NEED_CALLOC_GNU 1
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Call the system's calloc below. */
+#undef calloc
+
+/* Allocate and zero-fill an NxS-byte block of memory from the heap.
+ If N or S is zero, allocate and zero-fill a 1-byte block. */
+
+void *
+rpl_calloc (size_t n, size_t s)
+{
+ void *result;
+
+#if NEED_CALLOC_GNU
+ if (n == 0 || s == 0)
+ {
+ n = 1;
+ s = 1;
+ }
+ else
+ {
+ /* Defend against buggy calloc implementations that mishandle
+ size_t overflow. */
+ size_t bytes = n * s;
+ if (bytes / s != n)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+#endif
+
+ result = calloc (n, s);
+
+#if !HAVE_CALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/canon-host.c b/gnulib/lib/canon-host.c
new file mode 100644
index 0000000..10886ab
--- /dev/null
+++ b/gnulib/lib/canon-host.c
@@ -0,0 +1,90 @@
+/* Host name canonicalization
+
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com>.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "canon-host.h"
+
+#include <string.h>
+#include <netdb.h>
+
+/* Store the last error for the single-threaded version of this function. */
+static int last_cherror;
+
+/* Single-threaded of wrapper for canon_host_r. After a NULL return, error
+ messages may be retrieved via ch_strerror(). */
+char *
+canon_host (const char *host)
+{
+ return canon_host_r (host, &last_cherror);
+}
+
+/* Return a malloc'd string containing the canonical hostname associated with
+ HOST, or NULL if a canonical name cannot be determined. On NULL return,
+ if CHERROR is not NULL, set *CHERROR to an error code as returned by
+ getaddrinfo(). Use ch_strerror_r() or gai_strerror() to convert a *CHERROR
+ value to a string suitable for error messages.
+
+ WARNINGS
+ HOST must be a string representation of a resolvable name for this host.
+ Strings containing an IP address in dotted decimal notation will be
+ returned as-is, without further resolution.
+
+ The use of the word "canonical" in this context is unfortunate but
+ entrenched. The value returned by this function will be the end result
+ of the resolution of any CNAME chains in the DNS. There may only be one
+ such value for any given hostname, though the actual IP address
+ referenced by this value and the device using that IP address may each
+ actually have any number of such "canonical" hostnames. See the POSIX
+ getaddrinfo spec <http://www.opengroup.org/susv3xsh/getaddrinfo.html">,
+ RFC 1034 <http://www.faqs.org/rfcs/rfc1034.html>, & RFC 2181
+ <http://www.faqs.org/rfcs/rfc2181.html> for more on what this confusing
+ term really refers to. */
+char *
+canon_host_r (char const *host, int *cherror)
+{
+ char *retval = NULL;
+ static struct addrinfo hints;
+ struct addrinfo *res = NULL;
+ int status;
+
+ hints.ai_flags = AI_CANONNAME;
+ status = getaddrinfo (host, NULL, &hints, &res);
+ if (!status)
+ {
+ /* http://lists.gnu.org/archive/html/bug-coreutils/2006-09/msg00300.html
+ says Darwin 7.9.0 getaddrinfo returns 0 but sets
+ res->ai_canonname to NULL. */
+ retval = strdup (res->ai_canonname ? res->ai_canonname : host);
+ if (!retval && cherror)
+ *cherror = EAI_MEMORY;
+ freeaddrinfo (res);
+ }
+ else if (cherror)
+ *cherror = status;
+
+ return retval;
+}
+
+/* Return a string describing the last error encountered by canon_host. */
+const char *
+ch_strerror (void)
+{
+ return gai_strerror (last_cherror);
+}
diff --git a/gnulib/lib/canon-host.h b/gnulib/lib/canon-host.h
new file mode 100644
index 0000000..bc852b7
--- /dev/null
+++ b/gnulib/lib/canon-host.h
@@ -0,0 +1,29 @@
+/* Host name canonicalization
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef CANON_HOST_H
+# define CANON_HOST_H 1
+
+char *canon_host (char const *host);
+char *canon_host_r (char const *host, int *cherror);
+
+const char *ch_strerror (void);
+# define ch_strerror_r(cherror) gai_strerror (cherror);
+
+#endif /* !CANON_HOST_H */
diff --git a/gnulib/lib/canonicalize-lgpl.c b/gnulib/lib/canonicalize-lgpl.c
new file mode 100644
index 0000000..2755df9
--- /dev/null
+++ b/gnulib/lib/canonicalize-lgpl.c
@@ -0,0 +1,378 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# define _GL_USE_STDLIB_ALLOC 1
+# include <config.h>
+#endif
+
+#if !HAVE_CANONICALIZE_FILE_NAME || !FUNC_REALPATH_WORKS || defined _LIBC
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <alloca.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#include <sys/stat.h>
+#include <errno.h>
+#include <stddef.h>
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+#else
+# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+# define versioned_symbol(lib, local, symbol, version) extern int dummy
+# define compat_symbol(lib, local, symbol, version)
+# define weak_alias(local, symbol)
+# define __canonicalize_file_name canonicalize_file_name
+# define __realpath realpath
+# include "pathmax.h"
+# include "malloca.h"
+# if HAVE_GETCWD
+# if IN_RELOCWRAPPER
+ /* When building the relocatable program wrapper, use the system's getcwd
+ function, not the gnulib override, otherwise we would get a link error.
+ */
+# undef getcwd
+# endif
+# ifdef VMS
+ /* We want the directory in Unix syntax, not in VMS syntax. */
+# define __getcwd(buf, max) getcwd (buf, max, 0)
+# else
+# define __getcwd getcwd
+# endif
+# else
+# define __getcwd(buf, max) getwd (buf)
+# endif
+# define __readlink readlink
+# define __set_errno(e) errno = (e)
+# ifndef MAXSYMLINKS
+# ifdef SYMLOOP_MAX
+# define MAXSYMLINKS SYMLOOP_MAX
+# else
+# define MAXSYMLINKS 20
+# endif
+# endif
+#endif
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#if !FUNC_REALPATH_WORKS || defined _LIBC
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated path
+ separators ('/') or symlinks. All path components must exist. If
+ RESOLVED is null, the result is malloc'd; otherwise, if the
+ canonical name is PATH_MAX chars or more, returns null with `errno'
+ set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
+ returns the name in RESOLVED. If the name cannot be resolved and
+ RESOLVED is non-NULL, it contains the path of the first component
+ that cannot be resolved. If the path can be resolved, RESOLVED
+ holds the same value as the value returned. */
+
+char *
+__realpath (const char *name, char *resolved)
+{
+ char *rpath, *dest, *extra_buf = NULL;
+ const char *start, *end, *rpath_limit;
+ long int path_max;
+ int num_links = 0;
+
+ if (name == NULL)
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ either parameter is a null pointer. We extend this to allow
+ the RESOLVED parameter to be NULL in case the we are expected to
+ allocate the room for the return value. */
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ the name argument points to an empty string. */
+ __set_errno (ENOENT);
+ return NULL;
+ }
+
+#ifdef PATH_MAX
+ path_max = PATH_MAX;
+#else
+ path_max = pathconf (name, _PC_PATH_MAX);
+ if (path_max <= 0)
+ path_max = 8192;
+#endif
+
+ if (resolved == NULL)
+ {
+ rpath = malloc (path_max);
+ if (rpath == NULL)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'malloc-posix' gnulib module. */
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ rpath = resolved;
+ rpath_limit = rpath + path_max;
+
+ if (name[0] != '/')
+ {
+ if (!__getcwd (rpath, path_max))
+ {
+ rpath[0] = '\0';
+ goto error;
+ }
+ dest = strchr (rpath, '\0');
+ }
+ else
+ {
+ rpath[0] = '/';
+ dest = rpath + 1;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/')
+ *dest++ = '/';
+ }
+
+ for (start = end = name; *start; start = end)
+ {
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+ int n;
+
+ /* Skip sequence of multiple path-separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of path component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
+ && *dest == '/')
+ dest++;
+ }
+ else
+ {
+ size_t new_size;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rpath_limit)
+ {
+ ptrdiff_t dest_offset = dest - rpath;
+ char *new_rpath;
+
+ if (resolved)
+ {
+ __set_errno (ENAMETOOLONG);
+ if (dest > rpath + 1)
+ dest--;
+ *dest = '\0';
+ goto error;
+ }
+ new_size = rpath_limit - rpath;
+ if (end - start + 1 > path_max)
+ new_size += end - start + 1;
+ else
+ new_size += path_max;
+ new_rpath = (char *) realloc (rpath, new_size);
+ if (new_rpath == NULL)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'realloc-posix' gnulib module. */
+ errno = ENOMEM;
+ goto error;
+ }
+ rpath = new_rpath;
+ rpath_limit = rpath + new_size;
+
+ dest = rpath + dest_offset;
+ }
+
+#ifdef _LIBC
+ dest = __mempcpy (dest, start, end - start);
+#else
+ memcpy (dest, start, end - start);
+ dest += end - start;
+#endif
+ *dest = '\0';
+
+#ifdef _LIBC
+ if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
+#else
+ if (lstat (rpath, &st) < 0)
+#endif
+ goto error;
+
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t len;
+
+ if (++num_links > MAXSYMLINKS)
+ {
+ __set_errno (ELOOP);
+ goto error;
+ }
+
+ buf = malloca (path_max);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ goto error;
+ }
+
+ n = __readlink (rpath, buf, path_max - 1);
+ if (n < 0)
+ {
+ int saved_errno = errno;
+ freea (buf);
+ errno = saved_errno;
+ goto error;
+ }
+ buf[n] = '\0';
+
+ if (!extra_buf)
+ {
+ extra_buf = malloca (path_max);
+ if (!extra_buf)
+ {
+ freea (buf);
+ errno = ENOMEM;
+ goto error;
+ }
+ }
+
+ len = strlen (end);
+ if ((long int) (n + len) >= path_max)
+ {
+ freea (buf);
+ __set_errno (ENAMETOOLONG);
+ goto error;
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ {
+ dest = rpath + 1; /* It's an absolute symlink */
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && buf[1] == '/')
+ *dest++ = '/';
+ }
+ else
+ {
+ /* Back up to previous component, ignore if at root
+ already: */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
+ && *dest == '/')
+ dest++;
+ }
+ }
+ else if (!S_ISDIR (st.st_mode) && *end != '\0')
+ {
+ __set_errno (ENOTDIR);
+ goto error;
+ }
+ }
+ }
+ if (dest > rpath + 1 && dest[-1] == '/')
+ --dest;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && *dest == '/')
+ dest++;
+ *dest = '\0';
+
+ if (extra_buf)
+ freea (extra_buf);
+
+ return rpath;
+
+error:
+ {
+ int saved_errno = errno;
+ if (extra_buf)
+ freea (extra_buf);
+ if (resolved == NULL)
+ free (rpath);
+ errno = saved_errno;
+ }
+ return NULL;
+}
+versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
+#endif /* !FUNC_REALPATH_WORKS || defined _LIBC */
+
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
+char *
+attribute_compat_text_section
+__old_realpath (const char *name, char *resolved)
+{
+ if (resolved == NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ return __realpath (name, resolved);
+}
+compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0);
+#endif
+
+
+char *
+__canonicalize_file_name (const char *name)
+{
+ return __realpath (name, NULL);
+}
+weak_alias (__canonicalize_file_name, canonicalize_file_name)
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/gnulib/lib/canonicalize.c b/gnulib/lib/canonicalize.c
new file mode 100644
index 0000000..4fe9f30
--- /dev/null
+++ b/gnulib/lib/canonicalize.c
@@ -0,0 +1,296 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "canonicalize.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "areadlink.h"
+#include "file-set.h"
+#include "hash-triple.h"
+#include "pathmax.h"
+#include "xalloc.h"
+#include "xgetcwd.h"
+
+/* In this file, we cannot handle file names longer than PATH_MAX.
+ On systems with no file name length limit, use a fallback. */
+#ifndef PATH_MAX
+# define PATH_MAX 8192
+#endif
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#if !((HAVE_CANONICALIZE_FILE_NAME && FUNC_REALPATH_WORKS) \
+ || GNULIB_CANONICALIZE_LGPL)
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated file name
+ separators ('/') or symlinks. All components must exist.
+ The result is malloc'd. */
+
+char *
+canonicalize_file_name (const char *name)
+{
+ return canonicalize_filename_mode (name, CAN_EXISTING);
+}
+#endif /* !HAVE_CANONICALIZE_FILE_NAME */
+
+/* Return true if we've already seen the triple, <FILENAME, dev, ino>.
+ If *HT is not initialized, initialize it. */
+static bool
+seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
+{
+ if (*ht == NULL)
+ {
+ size_t initial_capacity = 7;
+ *ht = hash_initialize (initial_capacity,
+ NULL,
+ triple_hash,
+ triple_compare_ino_str,
+ triple_free);
+ if (*ht == NULL)
+ xalloc_die ();
+ }
+
+ if (seen_file (*ht, filename, st))
+ return true;
+
+ record_file (*ht, filename, st);
+ return false;
+}
+
+/* Return the canonical absolute name of file NAME, while treating
+ missing elements according to CAN_MODE. A canonical name
+ does not contain any `.', `..' components nor any repeated file name
+ separators ('/') or symlinks. Whether components must exist
+ or not depends on canonicalize mode. The result is malloc'd. */
+
+char *
+canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
+{
+ char *rname, *dest, *extra_buf = NULL;
+ char const *start;
+ char const *end;
+ char const *rname_limit;
+ size_t extra_len = 0;
+ Hash_table *ht = NULL;
+ int saved_errno;
+
+ if (name == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ if (name[0] != '/')
+ {
+ rname = xgetcwd ();
+ if (!rname)
+ return NULL;
+ dest = strchr (rname, '\0');
+ if (dest - rname < PATH_MAX)
+ {
+ char *p = xrealloc (rname, PATH_MAX);
+ dest = p + (dest - rname);
+ rname = p;
+ rname_limit = rname + PATH_MAX;
+ }
+ else
+ {
+ rname_limit = dest;
+ }
+ }
+ else
+ {
+ rname = xmalloc (PATH_MAX);
+ rname_limit = rname + PATH_MAX;
+ rname[0] = '/';
+ dest = rname + 1;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && name[1] == '/')
+ *dest++ = '/';
+ }
+
+ for (start = name; *start; start = end)
+ {
+ /* Skip sequence of multiple file name separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rname + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+ && *dest == '/')
+ dest++;
+ }
+ else
+ {
+ struct stat st;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rname_limit)
+ {
+ ptrdiff_t dest_offset = dest - rname;
+ size_t new_size = rname_limit - rname;
+
+ if (end - start + 1 > PATH_MAX)
+ new_size += end - start + 1;
+ else
+ new_size += PATH_MAX;
+ rname = xrealloc (rname, new_size);
+ rname_limit = rname + new_size;
+
+ dest = rname + dest_offset;
+ }
+
+ dest = memcpy (dest, start, end - start);
+ dest += end - start;
+ *dest = '\0';
+
+ if (lstat (rname, &st) != 0)
+ {
+ saved_errno = errno;
+ if (can_mode == CAN_EXISTING)
+ goto error;
+ if (can_mode == CAN_ALL_BUT_LAST)
+ {
+ if (end[strspn (end, "/")] || saved_errno != ENOENT)
+ goto error;
+ continue;
+ }
+ st.st_mode = 0;
+ }
+
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t n, len;
+
+ /* Detect loops. We cannot use the cycle-check module here,
+ since it's actually possible to encounter the same symlink
+ more than once in a given traversal. However, encountering
+ the same symlink,NAME pair twice does indicate a loop. */
+ if (seen_triple (&ht, name, &st))
+ {
+ if (can_mode == CAN_MISSING)
+ continue;
+ saved_errno = ELOOP;
+ goto error;
+ }
+
+ buf = areadlink_with_size (rname, st.st_size);
+ if (!buf)
+ {
+ if (can_mode == CAN_MISSING && errno != ENOMEM)
+ continue;
+ saved_errno = errno;
+ goto error;
+ }
+
+ n = strlen (buf);
+ len = strlen (end);
+
+ if (!extra_len)
+ {
+ extra_len =
+ ((n + len + 1) > PATH_MAX) ? (n + len + 1) : PATH_MAX;
+ extra_buf = xmalloc (extra_len);
+ }
+ else if ((n + len + 1) > extra_len)
+ {
+ extra_len = n + len + 1;
+ extra_buf = xrealloc (extra_buf, extra_len);
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ {
+ dest = rname + 1; /* It's an absolute symlink */
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && buf[1] == '/')
+ *dest++ = '/';
+ }
+ else
+ {
+ /* Back up to previous component, ignore if at root
+ already: */
+ if (dest > rname + 1)
+ while ((--dest)[-1] != '/');
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+ && *dest == '/')
+ dest++;
+ }
+
+ free (buf);
+ }
+ else
+ {
+ if (!S_ISDIR (st.st_mode) && *end && (can_mode != CAN_MISSING))
+ {
+ saved_errno = ENOTDIR;
+ goto error;
+ }
+ }
+ }
+ }
+ if (dest > rname + 1 && dest[-1] == '/')
+ --dest;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && *dest == '/')
+ dest++;
+ *dest = '\0';
+ if (rname_limit != dest + 1)
+ rname = xrealloc (rname, dest - rname + 1);
+
+ free (extra_buf);
+ if (ht)
+ hash_free (ht);
+ return rname;
+
+error:
+ free (extra_buf);
+ free (rname);
+ if (ht)
+ hash_free (ht);
+ errno = saved_errno;
+ return NULL;
+}
diff --git a/gnulib/lib/canonicalize.h b/gnulib/lib/canonicalize.h
new file mode 100644
index 0000000..04ad79c
--- /dev/null
+++ b/gnulib/lib/canonicalize.h
@@ -0,0 +1,41 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef CANONICALIZE_H_
+# define CANONICALIZE_H_
+
+#include <stdlib.h> /* for canonicalize_file_name */
+
+enum canonicalize_mode_t
+ {
+ /* All components must exist. */
+ CAN_EXISTING = 0,
+
+ /* All components excluding last one must exist. */
+ CAN_ALL_BUT_LAST = 1,
+
+ /* No requirements on components existence. */
+ CAN_MISSING = 2
+ };
+typedef enum canonicalize_mode_t canonicalize_mode_t;
+
+/* Return a malloc'd string containing the canonical absolute name of
+ the named file. This acts like canonicalize_file_name, except that
+ whether components must exist depends on the canonicalize_mode_t
+ argument. */
+char *canonicalize_filename_mode (const char *, canonicalize_mode_t);
+
+#endif /* !CANONICALIZE_H_ */
diff --git a/gnulib/lib/careadlinkat.c b/gnulib/lib/careadlinkat.c
new file mode 100644
index 0000000..751578b
--- /dev/null
+++ b/gnulib/lib/careadlinkat.c
@@ -0,0 +1,175 @@
+/* Read symbolic links into a buffer without size limitation, relative to fd.
+
+ Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#include <config.h>
+
+#include "careadlinkat.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Define this independently so that stdint.h is not a prerequisite. */
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#include "allocator.h"
+
+/* Get the symbolic link value of FILENAME and put it into BUFFER, with
+ size BUFFER_SIZE. This function acts like readlink but has
+ readlinkat's signature. */
+ssize_t
+careadlinkatcwd (int fd, char const *filename, char *buffer,
+ size_t buffer_size)
+{
+ /* FD must be AT_FDCWD here, otherwise the caller is using this
+ function in contexts for which it was not meant for. */
+ if (fd != AT_FDCWD)
+ abort ();
+ return readlink (filename, buffer, buffer_size);
+}
+
+/* Assuming the current directory is FD, get the symbolic link value
+ of FILENAME as a null-terminated string and put it into a buffer.
+ If FD is AT_FDCWD, FILENAME is interpreted relative to the current
+ working directory, as in openat.
+
+ If the link is small enough to fit into BUFFER put it there.
+ BUFFER's size is BUFFER_SIZE, and BUFFER can be null
+ if BUFFER_SIZE is zero.
+
+ If the link is not small, put it into a dynamically allocated
+ buffer managed by ALLOC. It is the caller's responsibility to free
+ the returned value if it is nonnull and is not BUFFER. A null
+ ALLOC stands for the standard allocator.
+
+ The PREADLINKAT function specifies how to read links. It operates
+ like POSIX readlinkat()
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
+ but can assume that its first argument is the same as FD.
+
+ If successful, return the buffer address; otherwise return NULL and
+ set errno. */
+
+char *
+careadlinkat (int fd, char const *filename,
+ char *buffer, size_t buffer_size,
+ struct allocator const *alloc,
+ ssize_t (*preadlinkat) (int, char const *, char *, size_t))
+{
+ char *buf;
+ size_t buf_size;
+ size_t buf_size_max =
+ SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+ char stack_buf[1024];
+
+ if (! alloc)
+ alloc = &stdlib_allocator;
+
+ if (! buffer_size)
+ {
+ /* Allocate the initial buffer on the stack. This way, in the
+ common case of a symlink of small size, we get away with a
+ single small malloc() instead of a big malloc() followed by a
+ shrinking realloc(). */
+ buffer = stack_buf;
+ buffer_size = sizeof stack_buf;
+ }
+
+ buf = buffer;
+ buf_size = buffer_size;
+
+ do
+ {
+ /* Attempt to read the link into the current buffer. */
+ ssize_t link_length = preadlinkat (fd, filename, buf, buf_size);
+ size_t link_size;
+ if (link_length < 0)
+ {
+ /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
+ with errno == ERANGE if the buffer is too small. */
+ int readlinkat_errno = errno;
+ if (readlinkat_errno != ERANGE)
+ {
+ if (buf != buffer)
+ {
+ alloc->free (buf);
+ errno = readlinkat_errno;
+ }
+ return NULL;
+ }
+ }
+
+ link_size = link_length;
+
+ if (link_size < buf_size)
+ {
+ buf[link_size++] = '\0';
+
+ if (buf == stack_buf)
+ {
+ char *b = (char *) alloc->allocate (link_size);
+ buf_size = link_size;
+ if (! b)
+ break;
+ memcpy (b, buf, link_size);
+ buf = b;
+ }
+ else if (link_size < buf_size && buf != buffer && alloc->reallocate)
+ {
+ /* Shrink BUF before returning it. */
+ char *b = (char *) alloc->reallocate (buf, link_size);
+ if (b)
+ buf = b;
+ }
+
+ return buf;
+ }
+
+ if (buf != buffer)
+ alloc->free (buf);
+
+ if (buf_size <= buf_size_max / 2)
+ buf_size *= 2;
+ else if (buf_size < buf_size_max)
+ buf_size = buf_size_max;
+ else if (buf_size_max < SIZE_MAX)
+ {
+ errno = ENAMETOOLONG;
+ return NULL;
+ }
+ else
+ break;
+ buf = (char *) alloc->allocate (buf_size);
+ }
+ while (buf);
+
+ if (alloc->die)
+ alloc->die (buf_size);
+ errno = ENOMEM;
+ return NULL;
+}
diff --git a/gnulib/lib/careadlinkat.h b/gnulib/lib/careadlinkat.h
new file mode 100644
index 0000000..6576fb2
--- /dev/null
+++ b/gnulib/lib/careadlinkat.h
@@ -0,0 +1,72 @@
+/* Read symbolic links into a buffer without size limitation, relative to fd.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef _GL_CAREADLINKAT_H
+#define _GL_CAREADLINKAT_H
+
+#include <fcntl.h>
+#include <unistd.h>
+
+struct allocator;
+
+/* Assuming the current directory is FD, get the symbolic link value
+ of FILENAME as a null-terminated string and put it into a buffer.
+ If FD is AT_FDCWD, FILENAME is interpreted relative to the current
+ working directory, as in openat.
+
+ If the link is small enough to fit into BUFFER put it there.
+ BUFFER's size is BUFFER_SIZE, and BUFFER can be null
+ if BUFFER_SIZE is zero.
+
+ If the link is not small, put it into a dynamically allocated
+ buffer managed by ALLOC. It is the caller's responsibility to free
+ the returned value if it is nonnull and is not BUFFER.
+
+ The PREADLINKAT function specifies how to read links. It operates
+ like POSIX readlinkat()
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
+ but can assume that its first argument is the same as FD.
+
+ If successful, return the buffer address; otherwise return NULL and
+ set errno. */
+
+char *careadlinkat (int fd, char const *filename,
+ char *buffer, size_t buffer_size,
+ struct allocator const *alloc,
+ ssize_t (*preadlinkat) (int, char const *,
+ char *, size_t));
+
+/* Suitable values for careadlinkat's FD and PREADLINKAT arguments,
+ when doing a plain readlink:
+ Pass FD = AT_FDCWD and PREADLINKAT = careadlinkatcwd. */
+#if HAVE_READLINKAT
+/* AT_FDCWD is declared in <fcntl.h>. */
+#else
+/* Define AT_FDCWD independently, so that the careadlinkat module does
+ not depend on the fcntl-h module. The value does not matter, since
+ careadlinkatcwd ignores it, but we might as well use the same value
+ as fcntl-h. */
+# ifndef AT_FDCWD
+# define AT_FDCWD (-3041965)
+# endif
+#endif
+ssize_t careadlinkatcwd (int fd, char const *filename,
+ char *buffer, size_t buffer_size);
+
+#endif /* _GL_CAREADLINKAT_H */
diff --git a/gnulib/lib/ceil.c b/gnulib/lib/ceil.c
new file mode 100644
index 0000000..4e0354e
--- /dev/null
+++ b/gnulib/lib/ceil.c
@@ -0,0 +1,111 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#undef MIN
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC ceill
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define MIN LDBL_MIN
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC ceil
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define MIN DBL_MIN
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC ceilf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define MIN FLT_MIN
+# define L_(literal) literal##f
+#endif
+
+/* -0.0. See minus-zero.h. */
+#if defined __hpux || defined __sgi || defined __ICC
+# define MINUS_ZERO (-MIN * MIN)
+#else
+# define MINUS_ZERO L_(-0.0)
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* For -1 < x < 0, return -0.0 regardless of the current rounding
+ mode. */
+ if (z > L_(-1.0))
+ z = MINUS_ZERO;
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ else if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/ceilf.c b/gnulib/lib/ceilf.c
new file mode 100644
index 0000000..2dd0ce7
--- /dev/null
+++ b/gnulib/lib/ceilf.c
@@ -0,0 +1,20 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "ceil.c"
diff --git a/gnulib/lib/ceill.c b/gnulib/lib/ceill.c
new file mode 100644
index 0000000..6181c91
--- /dev/null
+++ b/gnulib/lib/ceill.c
@@ -0,0 +1,37 @@
+/* Round towards positive infinity.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+ceill (long double x)
+{
+ return ceil (x);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "ceil.c"
+
+#endif
diff --git a/gnulib/lib/chdir-long.c b/gnulib/lib/chdir-long.c
new file mode 100644
index 0000000..af41b12
--- /dev/null
+++ b/gnulib/lib/chdir-long.c
@@ -0,0 +1,266 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-long.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifndef PATH_MAX
+# error "compile this file only if your system defines PATH_MAX"
+#endif
+
+/* The results of openat() in this file are not leaked to any
+ single-threaded code that could use stdio.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use openat_safer. */
+
+struct cd_buf
+{
+ int fd;
+};
+
+static inline void
+cdb_init (struct cd_buf *cdb)
+{
+ cdb->fd = AT_FDCWD;
+}
+
+static inline int
+cdb_fchdir (struct cd_buf const *cdb)
+{
+ return fchdir (cdb->fd);
+}
+
+static inline void
+cdb_free (struct cd_buf const *cdb)
+{
+ if (0 <= cdb->fd)
+ {
+ bool close_fail = close (cdb->fd);
+ assert (! close_fail);
+ }
+}
+
+/* Given a file descriptor of an open directory (or AT_FDCWD), CDB->fd,
+ try to open the CDB->fd-relative directory, DIR. If the open succeeds,
+ update CDB->fd with the resulting descriptor, close the incoming file
+ descriptor, and return zero. Upon failure, return -1 and set errno. */
+static int
+cdb_advance_fd (struct cd_buf *cdb, char const *dir)
+{
+ int new_fd = openat (cdb->fd, dir,
+ O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+ if (new_fd < 0)
+ return -1;
+
+ cdb_free (cdb);
+ cdb->fd = new_fd;
+
+ return 0;
+}
+
+/* Return a pointer to the first non-slash in S. */
+static inline char * _GL_ATTRIBUTE_PURE
+find_non_slash (char const *s)
+{
+ size_t n_slash = strspn (s, "/");
+ return (char *) s + n_slash;
+}
+
+/* This is a function much like chdir, but without the PATH_MAX limitation
+ on the length of the directory name. A significant difference is that
+ it must be able to modify (albeit only temporarily) the directory
+ name. It handles an arbitrarily long directory name by operating
+ on manageable portions of the name. On systems without the openat
+ syscall, this means changing the working directory to more and more
+ `distant' points along the long directory name and then restoring
+ the working directory. If any of those attempts to save or restore
+ the working directory fails, this function exits nonzero.
+
+ Note that this function may still fail with errno == ENAMETOOLONG, but
+ only if the specified directory name contains a component that is long
+ enough to provoke such a failure all by itself (e.g. if the component
+ has length PATH_MAX or greater on systems that define PATH_MAX). */
+
+int
+chdir_long (char *dir)
+{
+ int e = chdir (dir);
+ if (e == 0 || errno != ENAMETOOLONG)
+ return e;
+
+ {
+ size_t len = strlen (dir);
+ char *dir_end = dir + len;
+ struct cd_buf cdb;
+ size_t n_leading_slash;
+
+ cdb_init (&cdb);
+
+ /* If DIR is the empty string, then the chdir above
+ must have failed and set errno to ENOENT. */
+ assert (0 < len);
+ assert (PATH_MAX <= len);
+
+ /* Count leading slashes. */
+ n_leading_slash = strspn (dir, "/");
+
+ /* Handle any leading slashes as well as any name that matches
+ the regular expression, m!^//hostname[/]*! . Handling this
+ prefix separately usually results in a single additional
+ cdb_advance_fd call, but it's worthwhile, since it makes the
+ code in the following loop cleaner. */
+ if (n_leading_slash == 2)
+ {
+ int err;
+ /* Find next slash.
+ We already know that dir[2] is neither a slash nor '\0'. */
+ char *slash = memchr (dir + 3, '/', dir_end - (dir + 3));
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ *slash = '\0';
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+ dir = find_non_slash (slash + 1);
+ }
+ else if (n_leading_slash)
+ {
+ if (cdb_advance_fd (&cdb, "/") != 0)
+ goto Fail;
+ dir += n_leading_slash;
+ }
+
+ assert (*dir != '/');
+ assert (dir <= dir_end);
+
+ while (PATH_MAX <= dir_end - dir)
+ {
+ int err;
+ /* Find a slash that is PATH_MAX or fewer bytes away from dir.
+ I.e. see if there is a slash that will give us a name of
+ length PATH_MAX-1 or less. */
+ char *slash = memrchr (dir, '/', PATH_MAX);
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ *slash = '\0';
+ assert (slash - dir < PATH_MAX);
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+
+ dir = find_non_slash (slash + 1);
+ }
+
+ if (dir < dir_end)
+ {
+ if (cdb_advance_fd (&cdb, dir) != 0)
+ goto Fail;
+ }
+
+ if (cdb_fchdir (&cdb) != 0)
+ goto Fail;
+
+ cdb_free (&cdb);
+ return 0;
+
+ Fail:
+ {
+ int saved_errno = errno;
+ cdb_free (&cdb);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+}
+
+#if TEST_CHDIR
+
+# include "closeout.h"
+# include "error.h"
+
+char *program_name;
+
+int
+main (int argc, char *argv[])
+{
+ char *line = NULL;
+ size_t n = 0;
+ int len;
+
+ program_name = argv[0];
+ atexit (close_stdout);
+
+ len = getline (&line, &n, stdin);
+ if (len < 0)
+ {
+ int saved_errno = errno;
+ if (feof (stdin))
+ exit (0);
+
+ error (EXIT_FAILURE, saved_errno,
+ "reading standard input");
+ }
+ else if (len == 0)
+ exit (0);
+
+ if (line[len-1] == '\n')
+ line[len-1] = '\0';
+
+ if (chdir_long (line) != 0)
+ error (EXIT_FAILURE, errno,
+ "chdir_long failed: %s", line);
+
+ if (argc <= 1)
+ {
+ /* Using `pwd' here makes sense only if it is a robust implementation,
+ like the one in coreutils after the 2004-04-19 changes. */
+ char const *cmd = "pwd";
+ execlp (cmd, (char *) NULL);
+ error (EXIT_FAILURE, errno, "%s", cmd);
+ }
+
+ fclose (stdin);
+ fclose (stderr);
+
+ exit (EXIT_SUCCESS);
+}
+#endif
+
+/*
+Local Variables:
+compile-command: "gcc -DTEST_CHDIR=1 -g -O -W -Wall chdir-long.c libcoreutils.a"
+End:
+*/
diff --git a/gnulib/lib/chdir-long.h b/gnulib/lib/chdir-long.h
new file mode 100644
index 0000000..feff175
--- /dev/null
+++ b/gnulib/lib/chdir-long.h
@@ -0,0 +1,30 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <unistd.h>
+#include <limits.h>
+
+#include "pathmax.h"
+
+/* On systems without PATH_MAX, presume that chdir accepts
+ arbitrarily long directory names. */
+#ifndef PATH_MAX
+# define chdir_long(Dir) chdir (Dir)
+#else
+int chdir_long (char *dir);
+#endif
diff --git a/gnulib/lib/chdir-safer.c b/gnulib/lib/chdir-safer.c
new file mode 100644
index 0000000..92451dc
--- /dev/null
+++ b/gnulib/lib/chdir-safer.c
@@ -0,0 +1,82 @@
+/* much like chdir(2), but safer
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-safer.h"
+
+#include <stdbool.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "same-inode.h"
+
+#ifndef HAVE_READLINK
+# define HAVE_READLINK 0
+#endif
+
+/* Like chdir, but fail if DIR is a symbolic link to a directory (or
+ similar funny business). This avoids a minor race condition
+ between when a directory is created or statted and when the process
+ chdirs into it.
+
+ On older systems lacking full support for O_SEARCH, this function
+ can also fail if DIR is not readable. */
+int
+chdir_no_follow (char const *dir)
+{
+ int result = 0;
+ int saved_errno;
+ int fd = open (dir,
+ O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd < 0)
+ return -1;
+
+ /* If open follows symlinks, lstat DIR and fstat FD to ensure that
+ they are the same file; if they are different files, set errno to
+ ELOOP (the same value that open uses for symlinks with
+ O_NOFOLLOW) so the caller can report a failure.
+ Skip this check if HAVE_READLINK == 0, which should be the case
+ on any system that lacks symlink support. */
+ if (HAVE_READLINK && ! HAVE_WORKING_O_NOFOLLOW)
+ {
+ struct stat sb1;
+ result = lstat (dir, &sb1);
+ if (result == 0)
+ {
+ struct stat sb2;
+ result = fstat (fd, &sb2);
+ if (result == 0 && ! SAME_INODE (sb1, sb2))
+ {
+ errno = ELOOP;
+ result = -1;
+ }
+ }
+ }
+
+ if (result == 0)
+ result = fchdir (fd);
+
+ saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return result;
+}
diff --git a/gnulib/lib/chdir-safer.h b/gnulib/lib/chdir-safer.h
new file mode 100644
index 0000000..c5f10a1
--- /dev/null
+++ b/gnulib/lib/chdir-safer.h
@@ -0,0 +1,20 @@
+/* much like chdir(2), but safer
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+int chdir_no_follow (char const *file);
diff --git a/gnulib/lib/check-version.c b/gnulib/lib/check-version.c
new file mode 100644
index 0000000..ad696b2
--- /dev/null
+++ b/gnulib/lib/check-version.c
@@ -0,0 +1,43 @@
+/* check-version.h --- Check version string compatibility.
+ Copyright (C) 1998-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. This interface is influenced by
+ gcry_check_version from Werner Koch's Libgcrypt. Paul Eggert
+ suggested the use of strverscmp to simplify implementation. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+/* Get specification. */
+#include "check-version.h"
+
+/* Check that the version of the library (i.e., the CPP symbol VERSION)
+ * is at minimum the requested one in REQ_VERSION (typically found in
+ * a header file) and return the version string. Return NULL if the
+ * condition is not satisfied. If a NULL is passed to this function,
+ * no check is done, but the version string is simply returned.
+ */
+const char *
+check_version (const char *req_version)
+{
+ if (!req_version || strverscmp (req_version, VERSION) <= 0)
+ return VERSION;
+
+ return NULL;
+}
diff --git a/gnulib/lib/check-version.h b/gnulib/lib/check-version.h
new file mode 100644
index 0000000..7440fa3
--- /dev/null
+++ b/gnulib/lib/check-version.h
@@ -0,0 +1,26 @@
+/* check-version.h --- Check version string compatibility.
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef CHECK_VERSION_H
+# define CHECK_VERSION_H
+
+extern const char *
+check_version (const char *req_version);
+
+#endif /* CHECK_VERSION_H */
diff --git a/gnulib/lib/chown.c b/gnulib/lib/chown.c
new file mode 100644
index 0000000..9d97e73
--- /dev/null
+++ b/gnulib/lib/chown.c
@@ -0,0 +1,156 @@
+/* provide consistent interface to chown for systems that don't interpret
+ an ID of -1 as meaning `don't change the corresponding ID'.
+
+ Copyright (C) 1997, 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_CHOWN
+
+/* Simple stub that always fails with ENOSYS, for mingw. */
+int
+chown (const char *file _GL_UNUSED, uid_t uid _GL_UNUSED,
+ gid_t gid _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_CHOWN */
+
+/* Below we refer to the system's chown(). */
+# undef chown
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+# undef open
+# undef close
+
+/* Provide a more-closely POSIX-conforming version of chown on
+ systems with one or both of the following problems:
+ - chown doesn't treat an ID of -1 as meaning
+ `don't change the corresponding ID'.
+ - chown doesn't dereference symlinks. */
+
+int
+rpl_chown (const char *file, uid_t uid, gid_t gid)
+{
+ struct stat st;
+ bool stat_valid = false;
+ int result;
+
+# if CHOWN_CHANGE_TIME_BUG
+ if (gid != (gid_t) -1 || uid != (uid_t) -1)
+ {
+ if (stat (file, &st))
+ return -1;
+ stat_valid = true;
+ }
+# endif
+
+# if CHOWN_FAILS_TO_HONOR_ID_OF_NEGATIVE_ONE
+ if (gid == (gid_t) -1 || uid == (uid_t) -1)
+ {
+ /* Stat file to get id(s) that should remain unchanged. */
+ if (!stat_valid && stat (file, &st))
+ return -1;
+ if (gid == (gid_t) -1)
+ gid = st.st_gid;
+ if (uid == (uid_t) -1)
+ uid = st.st_uid;
+ }
+# endif
+
+# if CHOWN_MODIFIES_SYMLINK
+ {
+ /* Handle the case in which the system-supplied chown function
+ does *not* follow symlinks. Instead, it changes permissions
+ on the symlink itself. To work around that, we open the
+ file (but this can fail due to lack of read or write permission) and
+ use fchown on the resulting descriptor. */
+ int open_flags = O_NONBLOCK | O_NOCTTY;
+ int fd = open (file, O_RDONLY | open_flags);
+ if (0 <= fd
+ || (errno == EACCES
+ && 0 <= (fd = open (file, O_WRONLY | open_flags))))
+ {
+ int saved_errno;
+ bool fchown_socket_failure;
+
+ result = fchown (fd, uid, gid);
+ saved_errno = errno;
+
+ /* POSIX says fchown can fail with errno == EINVAL on sockets
+ and pipes, so fall back on chown in that case. */
+ fchown_socket_failure =
+ (result != 0 && saved_errno == EINVAL
+ && fstat (fd, &st) == 0
+ && (S_ISFIFO (st.st_mode) || S_ISSOCK (st.st_mode)));
+
+ close (fd);
+
+ if (! fchown_socket_failure)
+ {
+ errno = saved_errno;
+ return result;
+ }
+ }
+ else if (errno != EACCES)
+ return -1;
+ }
+# endif
+
+# if CHOWN_TRAILING_SLASH_BUG
+ if (!stat_valid)
+ {
+ size_t len = strlen (file);
+ if (len && file[len - 1] == '/' && stat (file, &st))
+ return -1;
+ }
+# endif
+
+ result = chown (file, uid, gid);
+
+# if CHOWN_CHANGE_TIME_BUG
+ if (result == 0 && stat_valid
+ && (uid == st.st_uid || uid == (uid_t) -1)
+ && (gid == st.st_gid || gid == (gid_t) -1))
+ {
+ /* No change in ownership, but at least one argument was not -1,
+ so we are required to update ctime. Since chown succeeded,
+ we assume that chmod will do likewise. Fortunately, on all
+ known systems where a 'no-op' chown skips the ctime update, a
+ 'no-op' chmod still does the trick. */
+ result = chmod (file, st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO
+ | S_ISUID | S_ISGID | S_ISVTX));
+ }
+# endif
+
+ return result;
+}
+
+#endif /* HAVE_CHOWN */
diff --git a/gnulib/lib/classpath.c b/gnulib/lib/classpath.c
new file mode 100644
index 0000000..62620b3
--- /dev/null
+++ b/gnulib/lib/classpath.c
@@ -0,0 +1,122 @@
+/* Java CLASSPATH handling.
+ Copyright (C) 2001-2003, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "classpath.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xsetenv.h"
+#include "xalloc.h"
+
+/* Name of environment variable. */
+#ifndef CLASSPATHVAR
+# define CLASSPATHVAR "CLASSPATH"
+#endif
+
+/* Separator in PATH like lists of pathnames. */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+ /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Return the new CLASSPATH value. The given classpaths are prepended to
+ the current CLASSPATH value. If use_minimal_classpath, the current
+ CLASSPATH is ignored. */
+char *
+new_classpath (const char * const *classpaths, unsigned int classpaths_count,
+ bool use_minimal_classpath)
+{
+ const char *old_classpath;
+ unsigned int length;
+ unsigned int i;
+ char *result;
+ char *p;
+
+ old_classpath = (use_minimal_classpath ? NULL : getenv (CLASSPATHVAR));
+ if (old_classpath == NULL)
+ old_classpath = "";
+
+ length = 0;
+ for (i = 0; i < classpaths_count; i++)
+ length += strlen (classpaths[i]) + 1;
+ length += strlen (old_classpath);
+ if (classpaths_count > 0 && old_classpath[0] == '\0')
+ length--;
+
+ result = XNMALLOC (length + 1, char);
+ p = result;
+ for (i = 0; i < classpaths_count; i++)
+ {
+ memcpy (p, classpaths[i], strlen (classpaths[i]));
+ p += strlen (classpaths[i]);
+ *p++ = PATH_SEPARATOR;
+ }
+ if (old_classpath[0] != '\0')
+ {
+ memcpy (p, old_classpath, strlen (old_classpath));
+ p += strlen (old_classpath);
+ }
+ else
+ {
+ if (classpaths_count > 0)
+ p--;
+ }
+ *p = '\0';
+
+ return result;
+}
+
+/* Set CLASSPATH and returns a safe copy of its old value. */
+char *
+set_classpath (const char * const *classpaths, unsigned int classpaths_count,
+ bool use_minimal_classpath, bool verbose)
+{
+ const char *old_CLASSPATH = getenv (CLASSPATHVAR);
+ char *result = (old_CLASSPATH != NULL ? xstrdup (old_CLASSPATH) : NULL);
+ char *new_CLASSPATH =
+ new_classpath (classpaths, classpaths_count, use_minimal_classpath);
+
+ if (verbose)
+ printf (CLASSPATHVAR "=%s ", new_CLASSPATH);
+
+ xsetenv (CLASSPATHVAR, new_CLASSPATH, 1);
+
+ free (new_CLASSPATH);
+
+ return result;
+}
+
+/* Restore CLASSPATH to its previous value. */
+void
+reset_classpath (char *old_classpath)
+{
+ if (old_classpath != NULL)
+ {
+ xsetenv (CLASSPATHVAR, old_classpath, 1);
+ free (old_classpath);
+ }
+ else
+ unsetenv (CLASSPATHVAR);
+}
diff --git a/gnulib/lib/classpath.h b/gnulib/lib/classpath.h
new file mode 100644
index 0000000..7cd4f89
--- /dev/null
+++ b/gnulib/lib/classpath.h
@@ -0,0 +1,33 @@
+/* Java CLASSPATH handling.
+ Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+
+/* Return the new CLASSPATH value. The given classpaths are prepended to
+ the current CLASSPATH value. If use_minimal_classpath, the current
+ CLASSPATH is ignored. */
+extern char * new_classpath (const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath);
+
+/* Set CLASSPATH and returns a safe copy of its old value. */
+extern char * set_classpath (const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath, bool verbose);
+
+/* Restore CLASSPATH to its previous value. */
+extern void reset_classpath (char *old_classpath);
diff --git a/gnulib/lib/clean-temp.c b/gnulib/lib/clean-temp.c
new file mode 100644
index 0000000..22e766b
--- /dev/null
+++ b/gnulib/lib/clean-temp.c
@@ -0,0 +1,782 @@
+/* Temporary directories and temporary files with automatic cleanup.
+ Copyright (C) 2001, 2003, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "clean-temp.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+#endif
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "pathmax.h"
+#include "tmpdir.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "gl_xlist.h"
+#include "gl_linkedhash_list.h"
+#include "gettext.h"
+#if GNULIB_FWRITEERROR
+# include "fwriteerror.h"
+#endif
+#if GNULIB_CLOSE_STREAM
+# include "close-stream.h"
+#endif
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#endif
+#if GNULIB_FOPEN_SAFER
+# include "stdio--.h"
+#endif
+
+#define _(str) gettext (str)
+
+/* GNU Hurd doesn't have PATH_MAX. Use a fallback.
+ Temporary directory names are usually not that long. */
+#ifndef PATH_MAX
+# define PATH_MAX 1024
+#endif
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#if !GNULIB_FCNTL_SAFER
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+# undef open
+# undef close
+#endif
+
+
+/* The use of 'volatile' in the types below (and ISO C 99 section 5.1.2.3.(5))
+ ensure that while constructing or modifying the data structures, the field
+ values are written to memory in the order of the C statements. So the
+ signal handler can rely on these field values to be up to date. */
+
+
+/* Registry for a single temporary directory.
+ 'struct temp_dir' from the public header file overlaps with this. */
+struct tempdir
+{
+ /* The absolute pathname of the directory. */
+ char * volatile dirname;
+ /* Whether errors during explicit cleanup are reported to standard error. */
+ bool cleanup_verbose;
+ /* Absolute pathnames of subdirectories. */
+ gl_list_t /* <char *> */ volatile subdirs;
+ /* Absolute pathnames of files. */
+ gl_list_t /* <char *> */ volatile files;
+};
+
+/* List of all temporary directories. */
+static struct
+{
+ struct tempdir * volatile * volatile tempdir_list;
+ size_t volatile tempdir_count;
+ size_t tempdir_allocated;
+} cleanup_list /* = { NULL, 0, 0 } */;
+
+/* List of all open file descriptors to temporary files. */
+static gl_list_t /* <int> */ volatile descriptors;
+
+
+/* For the subdirs and for the files, we use a gl_list_t of type LINKEDHASH.
+ Why? We need a data structure that
+
+ 1) Can contain an arbitrary number of 'char *' values. The strings
+ are compared via strcmp, not pointer comparison.
+ 2) Has insertion and deletion operations that are fast: ideally O(1),
+ or possibly O(log n). This is important for GNU sort, which may
+ create a large number of temporary files.
+ 3) Allows iteration through all elements from within a signal handler.
+ 4) May or may not allow duplicates. It doesn't matter here, since
+ any file or subdir can only be removed once.
+
+ Criterion 1) would allow any gl_list_t or gl_oset_t implementation.
+
+ Criterion 2) leaves only GL_LINKEDHASH_LIST, GL_TREEHASH_LIST, or
+ GL_TREE_OSET.
+
+ Criterion 3) puts at disadvantage GL_TREEHASH_LIST and GL_TREE_OSET.
+ Namely, iteration through the elements of a binary tree requires access
+ to many ->left, ->right, ->parent pointers. However, the rebalancing
+ code for insertion and deletion in an AVL or red-black tree is so
+ complicated that we cannot assume that >left, ->right, ->parent pointers
+ are in a consistent state throughout these operations. Therefore, to
+ avoid a crash in the signal handler, all destructive operations to the
+ lists would have to be protected by a
+ block_fatal_signals ();
+ ...
+ unblock_fatal_signals ();
+ pair. Which causes extra system calls.
+
+ Criterion 3) would also discourage GL_ARRAY_LIST and GL_CARRAY_LIST,
+ if they were not already excluded. Namely, these implementations use
+ xrealloc(), leaving a time window in which in the list->elements pointer
+ points to already deallocated memory. To avoid a crash in the signal
+ handler at such a moment, all destructive operations would have to
+ protected by block/unblock_fatal_signals (), in this case too.
+
+ A list of type GL_LINKEDHASH_LIST without duplicates fulfills all
+ requirements:
+ 2) Insertion and deletion are O(1) on average.
+ 3) The gl_list_iterator, gl_list_iterator_next implementations do
+ not trigger memory allocations, nor other system calls, and are
+ therefore safe to be called from a signal handler.
+ Furthermore, since SIGNAL_SAFE_LIST is defined, the implementation
+ of the destructive functions ensures that the list structure is
+ safe to be traversed at any moment, even when interrupted by an
+ asynchronous signal.
+ */
+
+/* String equality and hash code functions used by the lists. */
+
+static bool
+string_equals (const void *x1, const void *x2)
+{
+ const char *s1 = (const char *) x1;
+ const char *s2 = (const char *) x2;
+ return strcmp (s1, s2) == 0;
+}
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = (const char *) x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+
+/* The signal handler. It gets called asynchronously. */
+static void
+cleanup ()
+{
+ size_t i;
+
+ /* First close all file descriptors to temporary files. */
+ {
+ gl_list_t fds = descriptors;
+
+ if (fds != NULL)
+ {
+ gl_list_iterator_t iter;
+ const void *element;
+
+ iter = gl_list_iterator (fds);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ int fd = (int) (uintptr_t) element;
+ close (fd);
+ }
+ gl_list_iterator_free (&iter);
+ }
+ }
+
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ {
+ struct tempdir *dir = cleanup_list.tempdir_list[i];
+
+ if (dir != NULL)
+ {
+ gl_list_iterator_t iter;
+ const void *element;
+
+ /* First cleanup the files in the subdirectories. */
+ iter = gl_list_iterator (dir->files);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ const char *file = (const char *) element;
+ unlink (file);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the subdirectories. */
+ iter = gl_list_iterator (dir->subdirs);
+ while (gl_list_iterator_next (&iter, &element, NULL))
+ {
+ const char *subdir = (const char *) element;
+ rmdir (subdir);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the temporary directory itself. */
+ rmdir (dir->dirname);
+ }
+ }
+}
+
+/* Create a temporary directory.
+ PREFIX is used as a prefix for the name of the temporary directory. It
+ should be short and still give an indication about the program.
+ PARENTDIR can be used to specify the parent directory; if NULL, a default
+ parent directory is used (either $TMPDIR or /tmp or similar).
+ CLEANUP_VERBOSE determines whether errors during explicit cleanup are
+ reported to standard error.
+ Return a fresh 'struct temp_dir' on success. Upon error, an error message
+ is shown and NULL is returned. */
+struct temp_dir *
+create_temp_dir (const char *prefix, const char *parentdir,
+ bool cleanup_verbose)
+{
+ struct tempdir * volatile *tmpdirp = NULL;
+ struct tempdir *tmpdir;
+ size_t i;
+ char *xtemplate;
+ char *tmpdirname;
+
+ /* See whether it can take the slot of an earlier temporary directory
+ already cleaned up. */
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ if (cleanup_list.tempdir_list[i] == NULL)
+ {
+ tmpdirp = &cleanup_list.tempdir_list[i];
+ break;
+ }
+ if (tmpdirp == NULL)
+ {
+ /* See whether the array needs to be extended. */
+ if (cleanup_list.tempdir_count == cleanup_list.tempdir_allocated)
+ {
+ /* Note that we cannot use xrealloc(), because then the cleanup()
+ function could access an already deallocated array. */
+ struct tempdir * volatile *old_array = cleanup_list.tempdir_list;
+ size_t old_allocated = cleanup_list.tempdir_allocated;
+ size_t new_allocated = 2 * cleanup_list.tempdir_allocated + 1;
+ struct tempdir * volatile *new_array =
+ XNMALLOC (new_allocated, struct tempdir * volatile);
+
+ if (old_allocated == 0)
+ /* First use of this facility. Register the cleanup handler. */
+ at_fatal_signal (&cleanup);
+ else
+ {
+ /* Don't use memcpy() here, because memcpy takes non-volatile
+ arguments and is therefore not guaranteed to complete all
+ memory stores before the next statement. */
+ size_t k;
+
+ for (k = 0; k < old_allocated; k++)
+ new_array[k] = old_array[k];
+ }
+
+ cleanup_list.tempdir_list = new_array;
+ cleanup_list.tempdir_allocated = new_allocated;
+
+ /* Now we can free the old array. */
+ if (old_array != NULL)
+ free ((struct tempdir **) old_array);
+ }
+
+ tmpdirp = &cleanup_list.tempdir_list[cleanup_list.tempdir_count];
+ /* Initialize *tmpdirp before incrementing tempdir_count, so that
+ cleanup() will skip this entry before it is fully initialized. */
+ *tmpdirp = NULL;
+ cleanup_list.tempdir_count++;
+ }
+
+ /* Initialize a 'struct tempdir'. */
+ tmpdir = XMALLOC (struct tempdir);
+ tmpdir->dirname = NULL;
+ tmpdir->cleanup_verbose = cleanup_verbose;
+ tmpdir->subdirs = gl_list_create_empty (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL,
+ false);
+ tmpdir->files = gl_list_create_empty (GL_LINKEDHASH_LIST,
+ string_equals, string_hash, NULL,
+ false);
+
+ /* Create the temporary directory. */
+ xtemplate = (char *) xmalloca (PATH_MAX);
+ if (path_search (xtemplate, PATH_MAX, parentdir, prefix, parentdir == NULL))
+ {
+ error (0, errno,
+ _("cannot find a temporary directory, try setting $TMPDIR"));
+ goto quit;
+ }
+ block_fatal_signals ();
+ tmpdirname = mkdtemp (xtemplate);
+ if (tmpdirname != NULL)
+ {
+ tmpdir->dirname = tmpdirname;
+ *tmpdirp = tmpdir;
+ }
+ unblock_fatal_signals ();
+ if (tmpdirname == NULL)
+ {
+ error (0, errno,
+ _("cannot create a temporary directory using template \"%s\""),
+ xtemplate);
+ goto quit;
+ }
+ /* Replace tmpdir->dirname with a copy that has indefinite extent.
+ We cannot do this inside the block_fatal_signals/unblock_fatal_signals
+ block because then the cleanup handler would not remove the directory
+ if xstrdup fails. */
+ tmpdir->dirname = xstrdup (tmpdirname);
+ freea (xtemplate);
+ return (struct temp_dir *) tmpdir;
+
+ quit:
+ freea (xtemplate);
+ return NULL;
+}
+
+/* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called before the file ABSOLUTE_FILE_NAME is created. */
+void
+register_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+
+ /* Add absolute_file_name to tmpdir->files, without duplicates. */
+ if (gl_list_search (tmpdir->files, absolute_file_name) == NULL)
+ gl_list_add_first (tmpdir->files, xstrdup (absolute_file_name));
+}
+
+/* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called when the file ABSOLUTE_FILE_NAME could not be created. */
+void
+unregister_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ gl_list_t list = tmpdir->files;
+ gl_list_node_t node;
+
+ node = gl_list_search (list, absolute_file_name);
+ if (node != NULL)
+ {
+ char *old_string = (char *) gl_list_node_value (list, node);
+
+ gl_list_remove_node (list, node);
+ free (old_string);
+ }
+}
+
+/* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */
+void
+register_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+
+ /* Add absolute_dir_name to tmpdir->subdirs, without duplicates. */
+ if (gl_list_search (tmpdir->subdirs, absolute_dir_name) == NULL)
+ gl_list_add_first (tmpdir->subdirs, xstrdup (absolute_dir_name));
+}
+
+/* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be
+ created. */
+void
+unregister_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ gl_list_t list = tmpdir->subdirs;
+ gl_list_node_t node;
+
+ node = gl_list_search (list, absolute_dir_name);
+ if (node != NULL)
+ {
+ char *old_string = (char *) gl_list_node_value (list, node);
+
+ gl_list_remove_node (list, node);
+ free (old_string);
+ }
+}
+
+/* Remove a file, with optional error message.
+ Return 0 upon success, or -1 if there was some problem. */
+static int
+do_unlink (struct temp_dir *dir, const char *absolute_file_name)
+{
+ if (unlink (absolute_file_name) < 0 && dir->cleanup_verbose
+ && errno != ENOENT)
+ {
+ error (0, errno, _("cannot remove temporary file %s"), absolute_file_name);
+ return -1;
+ }
+ return 0;
+}
+
+/* Remove a directory, with optional error message.
+ Return 0 upon success, or -1 if there was some problem. */
+static int
+do_rmdir (struct temp_dir *dir, const char *absolute_dir_name)
+{
+ if (rmdir (absolute_dir_name) < 0 && dir->cleanup_verbose
+ && errno != ENOENT)
+ {
+ error (0, errno,
+ _("cannot remove temporary directory %s"), absolute_dir_name);
+ return -1;
+ }
+ return 0;
+}
+
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name)
+{
+ int err;
+
+ err = do_unlink (dir, absolute_file_name);
+ unregister_temp_file (dir, absolute_file_name);
+
+ return err;
+}
+
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name)
+{
+ int err;
+
+ err = do_rmdir (dir, absolute_dir_name);
+ unregister_temp_subdir (dir, absolute_dir_name);
+
+ return err;
+}
+
+/* Remove all registered files and subdirectories inside DIR.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_dir_contents (struct temp_dir *dir)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ int err = 0;
+ gl_list_t list;
+ gl_list_iterator_t iter;
+ const void *element;
+ gl_list_node_t node;
+
+ /* First cleanup the files in the subdirectories. */
+ list = tmpdir->files;
+ iter = gl_list_iterator (list);
+ while (gl_list_iterator_next (&iter, &element, &node))
+ {
+ char *file = (char *) element;
+
+ err |= do_unlink (dir, file);
+ gl_list_remove_node (list, node);
+ /* Now only we can free file. */
+ free (file);
+ }
+ gl_list_iterator_free (&iter);
+
+ /* Then cleanup the subdirectories. */
+ list = tmpdir->subdirs;
+ iter = gl_list_iterator (list);
+ while (gl_list_iterator_next (&iter, &element, &node))
+ {
+ char *subdir = (char *) element;
+
+ err |= do_rmdir (dir, subdir);
+ gl_list_remove_node (list, node);
+ /* Now only we can free subdir. */
+ free (subdir);
+ }
+ gl_list_iterator_free (&iter);
+
+ return err;
+}
+
+/* Remove all registered files and subdirectories inside DIR and DIR itself.
+ DIR cannot be used any more after this call.
+ Return 0 upon success, or -1 if there was some problem. */
+int
+cleanup_temp_dir (struct temp_dir *dir)
+{
+ struct tempdir *tmpdir = (struct tempdir *)dir;
+ int err = 0;
+ size_t i;
+
+ err |= cleanup_temp_dir_contents (dir);
+ err |= do_rmdir (dir, tmpdir->dirname);
+
+ for (i = 0; i < cleanup_list.tempdir_count; i++)
+ if (cleanup_list.tempdir_list[i] == tmpdir)
+ {
+ /* Remove cleanup_list.tempdir_list[i]. */
+ if (i + 1 == cleanup_list.tempdir_count)
+ {
+ while (i > 0 && cleanup_list.tempdir_list[i - 1] == NULL)
+ i--;
+ cleanup_list.tempdir_count = i;
+ }
+ else
+ cleanup_list.tempdir_list[i] = NULL;
+ /* Now only we can free the tmpdir->dirname and tmpdir itself. */
+ free (tmpdir->dirname);
+ free (tmpdir);
+ return err;
+ }
+
+ /* The user passed an invalid DIR argument. */
+ abort ();
+}
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* On Windows, opening a file with _O_TEMPORARY has the effect of passing
+ the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
+ of deleting the file when it is closed - even when the program crashes.
+ But (according to the Cygwin sources) it works only on Windows NT or newer.
+ So we cache the info whether we are running on Windows NT or newer. */
+
+static bool
+supports_delete_on_close ()
+{
+ static int known; /* 1 = yes, -1 = no, 0 = unknown */
+ if (!known)
+ {
+ OSVERSIONINFO v;
+
+ if (GetVersionEx (&v))
+ known = (v.dwPlatformId == VER_PLATFORM_WIN32_NT ? 1 : -1);
+ else
+ known = -1;
+ }
+ return (known > 0);
+}
+
+#endif
+
+
+/* Register a file descriptor to be closed. */
+static void
+register_fd (int fd)
+{
+ if (descriptors == NULL)
+ descriptors = gl_list_create_empty (GL_LINKEDHASH_LIST, NULL, NULL, NULL,
+ false);
+ gl_list_add_first (descriptors, (void *) (uintptr_t) fd);
+}
+
+/* Unregister a file descriptor to be closed. */
+static void
+unregister_fd (int fd)
+{
+ gl_list_t fds = descriptors;
+ gl_list_node_t node;
+
+ if (fds == NULL)
+ /* descriptors should already contain fd. */
+ abort ();
+ node = gl_list_search (fds, (void *) (uintptr_t) fd);
+ if (node == NULL)
+ /* descriptors should already contain fd. */
+ abort ();
+ gl_list_remove_node (fds, node);
+}
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+int
+open_temp (const char *file_name, int flags, mode_t mode)
+{
+ int fd;
+ int saved_errno;
+
+ block_fatal_signals ();
+ /* Note: 'open' here is actually open() or open_safer(). */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Use _O_TEMPORARY when possible, to increase the chances that the
+ temporary file is removed when the process crashes. */
+ if (supports_delete_on_close ())
+ fd = open (file_name, flags | _O_TEMPORARY, mode);
+ else
+#endif
+ fd = open (file_name, flags, mode);
+ saved_errno = errno;
+ if (fd >= 0)
+ register_fd (fd);
+ unblock_fatal_signals ();
+ errno = saved_errno;
+ return fd;
+}
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+FILE *
+fopen_temp (const char *file_name, const char *mode)
+{
+ FILE *fp;
+ int saved_errno;
+
+ block_fatal_signals ();
+ /* Note: 'fopen' here is actually fopen() or fopen_safer(). */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Use _O_TEMPORARY when possible, to increase the chances that the
+ temporary file is removed when the process crashes. */
+ if (supports_delete_on_close ())
+ {
+ size_t mode_len = strlen (mode);
+ char *augmented_mode = (char *) xmalloca (mode_len + 2);
+ memcpy (augmented_mode, mode, mode_len);
+ memcpy (augmented_mode + mode_len, "D", 2);
+
+ fp = fopen (file_name, augmented_mode);
+ saved_errno = errno;
+
+ freea (augmented_mode);
+ }
+ else
+#endif
+ {
+ fp = fopen (file_name, mode);
+ saved_errno = errno;
+ }
+ if (fp != NULL)
+ {
+ /* It is sufficient to register fileno (fp) instead of the entire fp,
+ because at cleanup time there is no need to do an fflush (fp); a
+ close (fileno (fp)) will be enough. */
+ int fd = fileno (fp);
+ if (!(fd >= 0))
+ abort ();
+ register_fd (fd);
+ }
+ unblock_fatal_signals ();
+ errno = saved_errno;
+ return fp;
+}
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+int
+close_temp (int fd)
+{
+ if (fd >= 0)
+ {
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = close (fd);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+ }
+ else
+ return close (fd);
+}
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+int
+fclose_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = fclose (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+
+#if GNULIB_FWRITEERROR
+/* Like fwriteerror.
+ Unregisters the previously registered file descriptor. */
+int
+fwriteerror_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = fwriteerror (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+#endif
+
+#if GNULIB_CLOSE_STREAM
+/* Like close_stream.
+ Unregisters the previously registered file descriptor. */
+int
+close_stream_temp (FILE *fp)
+{
+ int fd = fileno (fp);
+ /* No blocking of signals is needed here, since a double close of a
+ file descriptor is harmless. */
+ int result = close_stream (fp);
+ int saved_errno = errno;
+
+ /* No race condition here: we assume a single-threaded program, hence
+ fd cannot be re-opened here. */
+
+ unregister_fd (fd);
+
+ errno = saved_errno;
+ return result;
+}
+#endif
diff --git a/gnulib/lib/clean-temp.h b/gnulib/lib/clean-temp.h
new file mode 100644
index 0000000..7015e21
--- /dev/null
+++ b/gnulib/lib/clean-temp.h
@@ -0,0 +1,142 @@
+/* Temporary directories and temporary files with automatic cleanup.
+ Copyright (C) 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _CLEAN_TEMP_H
+#define _CLEAN_TEMP_H
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Temporary directories and temporary files should be automatically removed
+ when the program exits either normally or through a fatal signal. We can't
+ rely on the "unlink before close" idiom, because it works only on Unix and
+ also - if no signal blocking is used - leaves a time window where a fatal
+ signal would not clean up the temporary file.
+
+ Also, open file descriptors need to be closed before the temporary files
+ and the temporary directories can be removed, because only on Unix
+ (excluding Cygwin) can one remove directories containing open files.
+
+ This module provides support for temporary directories and temporary files
+ inside these temporary directories. Temporary files without temporary
+ directories are not supported here. The temporary directories and files
+ are automatically cleaned up (at the latest) when the program exits or
+ dies from a fatal signal such as SIGINT, SIGTERM, SIGHUP, but not if it
+ dies from a fatal signal such as SIGQUIT, SIGKILL, or SIGABRT, SIGSEGV,
+ SIGBUS, SIGILL, SIGFPE.
+
+ For the cleanup in the normal case, programs that use this module need to
+ call 'cleanup_temp_dir' for each successful return of 'create_temp_dir'.
+ The cleanup in the case of a fatal signal such as SIGINT, SIGTERM, SIGHUP,
+ is done entirely automatically by the functions of this module. */
+
+struct temp_dir
+{
+ /* The absolute pathname of the directory. */
+ const char * const dir_name;
+ /* Whether errors during explicit cleanup are reported to standard error. */
+ bool cleanup_verbose;
+ /* More fields are present here, but not public. */
+};
+
+/* Create a temporary directory.
+ PREFIX is used as a prefix for the name of the temporary directory. It
+ should be short and still give an indication about the program.
+ PARENTDIR can be used to specify the parent directory; if NULL, a default
+ parent directory is used (either $TMPDIR or /tmp or similar).
+ CLEANUP_VERBOSE determines whether errors during explicit cleanup are
+ reported to standard error.
+ Return a fresh 'struct temp_dir' on success. Upon error, an error message
+ is shown and NULL is returned. */
+extern struct temp_dir * create_temp_dir (const char *prefix,
+ const char *parentdir,
+ bool cleanup_verbose);
+
+/* Register the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called before the file ABSOLUTE_FILE_NAME is created. */
+extern void register_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Unregister the given ABSOLUTE_FILE_NAME as being a file inside DIR, that
+ needs to be removed before DIR can be removed.
+ Should be called when the file ABSOLUTE_FILE_NAME could not be created. */
+extern void unregister_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Register the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called before the subdirectory ABSOLUTE_DIR_NAME is created. */
+extern void register_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Unregister the given ABSOLUTE_DIR_NAME as being a subdirectory inside DIR,
+ that needs to be removed before DIR can be removed.
+ Should be called when the subdirectory ABSOLUTE_DIR_NAME could not be
+ created. */
+extern void unregister_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Remove the given ABSOLUTE_FILE_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_file (struct temp_dir *dir,
+ const char *absolute_file_name);
+
+/* Remove the given ABSOLUTE_DIR_NAME and unregister it.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_subdir (struct temp_dir *dir,
+ const char *absolute_dir_name);
+
+/* Remove all registered files and subdirectories inside DIR.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_dir_contents (struct temp_dir *dir);
+
+/* Remove all registered files and subdirectories inside DIR and DIR itself.
+ DIR cannot be used any more after this call.
+ Return 0 upon success, or -1 if there was some problem. */
+extern int cleanup_temp_dir (struct temp_dir *dir);
+
+/* Open a temporary file in a temporary directory.
+ Registers the resulting file descriptor to be closed. */
+extern int open_temp (const char *file_name, int flags, mode_t mode);
+extern FILE * fopen_temp (const char *file_name, const char *mode);
+
+/* Close a temporary file in a temporary directory.
+ Unregisters the previously registered file descriptor. */
+extern int close_temp (int fd);
+extern int fclose_temp (FILE *fp);
+
+/* Like fwriteerror.
+ Unregisters the previously registered file descriptor. */
+extern int fwriteerror_temp (FILE *fp);
+
+/* Like close_stream.
+ Unregisters the previously registered file descriptor. */
+extern int close_stream_temp (FILE *fp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CLEAN_TEMP_H */
diff --git a/gnulib/lib/cloexec.c b/gnulib/lib/cloexec.c
new file mode 100644
index 0000000..d525202
--- /dev/null
+++ b/gnulib/lib/cloexec.c
@@ -0,0 +1,83 @@
+/* closexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 1991, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ The code is taken from glibc/manual/llio.texi */
+
+#include <config.h>
+
+#include "cloexec.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with `errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int
+set_cloexec_flag (int desc, bool value)
+{
+#ifdef F_SETFD
+
+ int flags = fcntl (desc, F_GETFD, 0);
+
+ if (0 <= flags)
+ {
+ int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
+
+ if (flags == newflags
+ || fcntl (desc, F_SETFD, newflags) != -1)
+ return 0;
+ }
+
+ return -1;
+
+#else /* !F_SETFD */
+
+ /* Use dup2 to reject invalid file descriptors; the cloexec flag
+ will be unaffected. */
+ if (desc < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (dup2 (desc, desc) < 0)
+ /* errno is EBADF here. */
+ return -1;
+
+ /* There is nothing we can do on this kind of platform. Punt. */
+ return 0;
+#endif /* !F_SETFD */
+}
+
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int
+dup_cloexec (int fd)
+{
+ return fcntl (fd, F_DUPFD_CLOEXEC, 0);
+}
diff --git a/gnulib/lib/cloexec.h b/gnulib/lib/cloexec.h
new file mode 100644
index 0000000..17c8ac0
--- /dev/null
+++ b/gnulib/lib/cloexec.h
@@ -0,0 +1,38 @@
+/* closexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include <stdbool.h>
+
+/* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with `errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int set_cloexec_flag (int desc, bool value);
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int dup_cloexec (int fd);
diff --git a/gnulib/lib/close-stream.c b/gnulib/lib/close-stream.c
new file mode 100644
index 0000000..8819b58
--- /dev/null
+++ b/gnulib/lib/close-stream.c
@@ -0,0 +1,78 @@
+/* Close a stream, with nicer error checking than fclose's.
+
+ Copyright (C) 1998-2002, 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "close-stream.h"
+
+#include <errno.h>
+#include <stdbool.h>
+
+#include "fpending.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Close STREAM. Return 0 if successful, EOF (setting errno)
+ otherwise. A failure might set errno to 0 if the error number
+ cannot be determined.
+
+ A failure with errno set to EPIPE may or may not indicate an error
+ situation worth signaling to the user. See the documentation of the
+ close_stdout_set_ignore_EPIPE function for details.
+
+ If a program writes *anything* to STREAM, that program should close
+ STREAM and make sure that it succeeds before exiting. Otherwise,
+ suppose that you go to the extreme of checking the return status
+ of every function that does an explicit write to STREAM. The last
+ printf can succeed in writing to the internal stream buffer, and yet
+ the fclose(STREAM) could still fail (due e.g., to a disk full error)
+ when it tries to write out that buffered data. Thus, you would be
+ left with an incomplete output file and the offending program would
+ exit successfully. Even calling fflush is not always sufficient,
+ since some file systems (NFS and CODA) buffer written/flushed data
+ until an actual close call.
+
+ Besides, it's wasteful to check the return value from every call
+ that writes to STREAM -- just let the internal stream state record
+ the failure. That's what the ferror test is checking below. */
+
+int
+close_stream (FILE *stream)
+{
+ const bool some_pending = (__fpending (stream) != 0);
+ const bool prev_fail = (ferror (stream) != 0);
+ const bool fclose_fail = (fclose (stream) != 0);
+
+ /* Return an error indication if there was a previous failure or if
+ fclose failed, with one exception: ignore an fclose failure if
+ there was no previous error, no data remains to be flushed, and
+ fclose failed with EBADF. That can happen when a program like cp
+ is invoked like this `cp a b >&-' (i.e., with standard output
+ closed) and doesn't generate any output (hence no previous error
+ and nothing to be flushed). */
+
+ if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
+ {
+ if (! fclose_fail)
+ errno = 0;
+ return EOF;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/close-stream.h b/gnulib/lib/close-stream.h
new file mode 100644
index 0000000..be3d419
--- /dev/null
+++ b/gnulib/lib/close-stream.h
@@ -0,0 +1,2 @@
+#include <stdio.h>
+int close_stream (FILE *stream);
diff --git a/gnulib/lib/close.c b/gnulib/lib/close.c
new file mode 100644
index 0000000..c2197fe
--- /dev/null
+++ b/gnulib/lib/close.c
@@ -0,0 +1,69 @@
+/* close replacement.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#include "fd-hook.h"
+#include "msvc-inval.h"
+
+#undef close
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+close_nothrow (int fd)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = close (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#else
+# define close_nothrow close
+#endif
+
+/* Override close() to call into other gnulib modules. */
+
+int
+rpl_close (int fd)
+{
+#if WINDOWS_SOCKETS
+ int retval = execute_all_close_hooks (close_nothrow, fd);
+#else
+ int retval = close_nothrow (fd);
+#endif
+
+#if REPLACE_FCHDIR
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+#endif
+
+ return retval;
+}
diff --git a/gnulib/lib/closedir.c b/gnulib/lib/closedir.c
new file mode 100644
index 0000000..0fdce18
--- /dev/null
+++ b/gnulib/lib/closedir.c
@@ -0,0 +1,67 @@
+/* Stop reading the entries of a directory.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+#if HAVE_CLOSEDIR
+
+/* Override closedir(), to keep track of the open file descriptors.
+ Needed because there is a function dirfd(). */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+
+#endif
+
+int
+closedir (DIR *dirp)
+{
+# if REPLACE_FCHDIR
+ int fd = dirfd (dirp);
+# endif
+ int retval;
+
+#if HAVE_CLOSEDIR
+# undef closedir
+
+ retval = closedir (dirp);
+
+#else
+
+ if (dirp->current != INVALID_HANDLE_VALUE)
+ FindClose (dirp->current);
+ free (dirp);
+
+ retval = 0;
+
+#endif
+
+#if REPLACE_FCHDIR
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+#endif
+ return retval;
+}
diff --git a/gnulib/lib/closein.c b/gnulib/lib/closein.c
new file mode 100644
index 0000000..2a652f4
--- /dev/null
+++ b/gnulib/lib/closein.c
@@ -0,0 +1,112 @@
+/* Close standard input, rewinding seekable stdin if necessary.
+
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "closein.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "close-stream.h"
+#include "closeout.h"
+#include "error.h"
+#include "exitfail.h"
+#include "freadahead.h"
+#include "quotearg.h"
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+ on stdin by close_stdin. See also close_stdout_set_file_name, if
+ an error is detected when closing stdout. */
+void
+close_stdin_set_file_name (const char *file)
+{
+ file_name = file;
+}
+
+/* Close standard input, rewinding any unused input if stdin is
+ seekable. On error, issue a diagnostic and _exit with status
+ 'exit_failure'. Then call close_stdout.
+
+ Most programs can get by with close_stdout. close_stdin is only
+ needed when a program wants to guarantee that partially read input
+ from seekable stdin is not consumed, for any subsequent clients.
+ For example, POSIX requires that these two commands behave alike:
+
+ (sed -ne 1q; cat) < file
+ tail -n +2 file
+
+ Since close_stdin is commonly registered via 'atexit', POSIX
+ and the C standard both say that it should not call 'exit',
+ because the behavior is undefined if 'exit' is called more than
+ once. So it calls '_exit' instead of 'exit'. If close_stdin
+ is registered via atexit before other functions are registered,
+ the other functions can act before this _exit is invoked.
+
+ Applications that use close_stdout should flush any streams other
+ than stdin, stdout, and stderr before exiting, since the call to
+ _exit will bypass other buffer flushing. Applications should be
+ flushing and closing other streams anyway, to check for I/O errors.
+ Also, applications should not use tmpfile, since _exit can bypass
+ the removal of these files.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
+
+void
+close_stdin (void)
+{
+ bool fail = false;
+
+ /* There is no need to flush stdin if we can determine quickly that stdin's
+ input buffer is empty; in this case we know that if stdin is seekable,
+ (fseeko (stdin, 0, SEEK_CUR), ftello (stdin))
+ == lseek (0, 0, SEEK_CUR). */
+ if (freadahead (stdin) > 0)
+ {
+ /* Only attempt flush if stdin is seekable, as fflush is entitled to
+ fail on non-seekable streams. */
+ if (fseeko (stdin, 0, SEEK_CUR) == 0 && fflush (stdin) != 0)
+ fail = true;
+ }
+ if (close_stream (stdin) != 0)
+ fail = true;
+ if (fail)
+ {
+ /* Report failure, but defer exit until after closing stdout,
+ since the failure report should still be flushed. */
+ char const *close_error = _("error closing file");
+ if (file_name)
+ error (0, errno, "%s: %s", quotearg_colon (file_name),
+ close_error);
+ else
+ error (0, errno, "%s", close_error);
+ }
+
+ close_stdout ();
+
+ if (fail)
+ _exit (exit_failure);
+}
diff --git a/gnulib/lib/closein.h b/gnulib/lib/closein.h
new file mode 100644
index 0000000..5e614d5
--- /dev/null
+++ b/gnulib/lib/closein.h
@@ -0,0 +1,32 @@
+/* Close standard input, rewinding seekable stdin if necessary.
+
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_CLOSEIN_H
+# define _GL_CLOSEIN_H 1
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdin_set_file_name (const char *file);
+void close_stdin (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/closeout.c b/gnulib/lib/closeout.c
new file mode 100644
index 0000000..f6cdd3f
--- /dev/null
+++ b/gnulib/lib/closeout.c
@@ -0,0 +1,124 @@
+/* Close standard output and standard error, exiting with a diagnostic on error.
+
+ Copyright (C) 1998-2002, 2004, 2006, 2008-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "closeout.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "close-stream.h"
+#include "error.h"
+#include "exitfail.h"
+#include "quotearg.h"
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+ by close_stdout. */
+void
+close_stdout_set_file_name (const char *file)
+{
+ file_name = file;
+}
+
+static bool ignore_EPIPE /* = false */;
+
+/* Specify the reaction to an EPIPE error during the closing of stdout:
+ - If ignore = true, it shall be ignored.
+ - If ignore = false, it shall evoke a diagnostic, along with a nonzero
+ exit status.
+ The default is ignore = false.
+
+ This setting matters only if the SIGPIPE signal is ignored (i.e. its
+ handler set to SIG_IGN) or blocked. Only particular programs need to
+ temporarily ignore SIGPIPE. If SIGPIPE is ignored or blocked because
+ it was ignored or blocked in the parent process when it created the
+ child process, it usually is a bug in the parent process: It is bad
+ practice to have SIGPIPE ignored or blocked while creating a child
+ process.
+
+ EPIPE occurs when writing to a pipe or socket that has no readers now,
+ when SIGPIPE is ignored or blocked.
+
+ The ignore = false setting is suitable for a scenario where it is normally
+ guaranteed that the pipe writer terminates before the pipe reader. In
+ this case, an EPIPE is an indication of a premature termination of the
+ pipe reader and should lead to a diagnostic and a nonzero exit status.
+
+ The ignore = true setting is suitable for a scenario where you don't know
+ ahead of time whether the pipe writer or the pipe reader will terminate
+ first. In this case, an EPIPE is an indication that the pipe writer can
+ stop doing useless write() calls; this is what close_stdout does anyway.
+ EPIPE is part of the normal pipe/socket shutdown protocol in this case,
+ and should not lead to a diagnostic message. */
+
+void
+close_stdout_set_ignore_EPIPE (bool ignore)
+{
+ ignore_EPIPE = ignore;
+}
+
+/* Close standard output. On error, issue a diagnostic and _exit
+ with status 'exit_failure'.
+
+ Also close standard error. On error, _exit with status 'exit_failure'.
+
+ Since close_stdout is commonly registered via 'atexit', POSIX
+ and the C standard both say that it should not call 'exit',
+ because the behavior is undefined if 'exit' is called more than
+ once. So it calls '_exit' instead of 'exit'. If close_stdout
+ is registered via atexit before other functions are registered,
+ the other functions can act before this _exit is invoked.
+
+ Applications that use close_stdout should flush any streams
+ other than stdout and stderr before exiting, since the call to
+ _exit will bypass other buffer flushing. Applications should
+ be flushing and closing other streams anyway, to check for I/O
+ errors. Also, applications should not use tmpfile, since _exit
+ can bypass the removal of these files.
+
+ It's important to detect such failures and exit nonzero because many
+ tools (most notably `make' and other build-management systems) depend
+ on being able to detect failure in other tools via their exit status. */
+
+void
+close_stdout (void)
+{
+ if (close_stream (stdout) != 0
+ && !(ignore_EPIPE && errno == EPIPE))
+ {
+ char const *write_error = _("write error");
+ if (file_name)
+ error (0, errno, "%s: %s", quotearg_colon (file_name),
+ write_error);
+ else
+ error (0, errno, "%s", write_error);
+
+ _exit (exit_failure);
+ }
+
+ if (close_stream (stderr) != 0)
+ _exit (exit_failure);
+}
diff --git a/gnulib/lib/closeout.h b/gnulib/lib/closeout.h
new file mode 100644
index 0000000..ec8d7a6
--- /dev/null
+++ b/gnulib/lib/closeout.h
@@ -0,0 +1,36 @@
+/* Close standard output and standard error.
+
+ Copyright (C) 1998, 2000, 2003-2004, 2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef CLOSEOUT_H
+# define CLOSEOUT_H 1
+
+# include <stdbool.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdout_set_file_name (const char *file);
+void close_stdout_set_ignore_EPIPE (bool ignore);
+void close_stdout (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/concat-filename.c b/gnulib/lib/concat-filename.c
new file mode 100644
index 0000000..732df11
--- /dev/null
+++ b/gnulib/lib/concat-filename.c
@@ -0,0 +1,73 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "concat-filename.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "filename.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. The directory may end with the directory separator. The second
+ argument may not start with the directory separator (it is relative).
+ Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+char *
+concatenated_filename (const char *directory, const char *filename,
+ const char *suffix)
+{
+ char *result;
+ char *p;
+
+ if (strcmp (directory, ".") == 0)
+ {
+ /* No need to prepend the directory. */
+ result = (char *) malloc (strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ p = result;
+ }
+ else
+ {
+ size_t directory_len = strlen (directory);
+ int need_slash =
+ (directory_len > FILE_SYSTEM_PREFIX_LEN (directory)
+ && !ISSLASH (directory[directory_len - 1]));
+ result = (char *) malloc (directory_len + need_slash
+ + strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ memcpy (result, directory, directory_len);
+ p = result + directory_len;
+ if (need_slash)
+ *p++ = '/';
+ }
+ p = stpcpy (p, filename);
+ if (suffix != NULL)
+ stpcpy (p, suffix);
+ return result;
+}
diff --git a/gnulib/lib/concat-filename.h b/gnulib/lib/concat-filename.h
new file mode 100644
index 0000000..c62880e
--- /dev/null
+++ b/gnulib/lib/concat-filename.h
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _CONCAT_FILENAME_H
+#define _CONCAT_FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+extern char *concatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. */
+extern char *xconcatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CONCAT_FILENAME_H */
diff --git a/gnulib/lib/config.charset b/gnulib/lib/config.charset
new file mode 100644
index 0000000..2eadbaa
--- /dev/null
+++ b/gnulib/lib/config.charset
@@ -0,0 +1,683 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+# Copyright (C) 2000-2004, 2006-2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# The table consists of lines of the form
+# ALIAS CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+# name MIME? used by which systems
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-3 Y glibc solaris cygwin
+# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
+# ISO-8859-6 Y glibc aix hpux solaris cygwin
+# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd darwin cygwin
+# ISO-8859-8 Y glibc aix hpux osf solaris cygwin
+# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin cygwin
+# ISO-8859-13 glibc netbsd openbsd darwin cygwin
+# ISO-8859-14 glibc cygwin
+# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin cygwin
+# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin
+# KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin
+# KOI8-T glibc
+# CP437 dos
+# CP775 dos
+# CP850 aix osf dos
+# CP852 dos
+# CP855 dos
+# CP856 aix
+# CP857 dos
+# CP861 dos
+# CP862 dos
+# CP864 dos
+# CP865 dos
+# CP866 freebsd netbsd openbsd darwin dos
+# CP869 dos
+# CP874 woe32 dos
+# CP922 aix
+# CP932 aix cygwin woe32 dos
+# CP943 aix
+# CP949 osf darwin woe32 dos
+# CP950 woe32 dos
+# CP1046 aix
+# CP1124 aix
+# CP1125 dos
+# CP1129 aix
+# CP1131 darwin
+# CP1250 woe32
+# CP1251 glibc solaris netbsd openbsd darwin cygwin woe32
+# CP1252 aix woe32
+# CP1253 woe32
+# CP1254 woe32
+# CP1255 glibc woe32
+# CP1256 woe32
+# CP1257 woe32
+# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
+# EUC-TW glibc aix hpux irix osf solaris netbsd
+# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin
+# BIG5-HKSCS glibc solaris darwin
+# GBK glibc aix osf solaris darwin cygwin woe32 dos
+# GB18030 glibc solaris netbsd darwin
+# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+# JOHAB glibc solaris woe32
+# TIS-620 glibc aix hpux osf solaris cygwin
+# VISCII Y glibc
+# TCVN5712-1 glibc
+# ARMSCII-8 glibc darwin
+# GEORGIAN-PS glibc cygwin
+# PT154 glibc
+# HP-ROMAN8 hpux
+# HP-ARABIC8 hpux
+# HP-GREEK8 hpux
+# HP-HEBREW8 hpux
+# HP-TURKISH8 hpux
+# HP-KANA8 hpux
+# DEC-KANJI osf
+# DEC-HANYU osf
+# UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+ linux-gnulibc1*)
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ echo "POSIX ASCII"
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+ sv_FI sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.iso-8859-1 ISO-8859-1"
+ echo "$l.iso-8859-15 ISO-8859-15"
+ echo "$l.iso-8859-15@euro ISO-8859-15"
+ echo "$l@euro ISO-8859-15"
+ echo "$l.cp-437 CP437"
+ echo "$l.cp-850 CP850"
+ echo "$l.cp-1252 CP1252"
+ echo "$l.cp-1252@euro CP1252"
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+ sl_SI sr sr_CS sr_YU; do
+ echo "$l ISO-8859-2"
+ echo "$l.iso-8859-2 ISO-8859-2"
+ echo "$l.cp-852 CP852"
+ echo "$l.cp-1250 CP1250"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in mk mk_MK ru ru_RU; do
+ echo "$l ISO-8859-5"
+ echo "$l.iso-8859-5 ISO-8859-5"
+ echo "$l.koi8-r KOI8-R"
+ echo "$l.cp-866 CP866"
+ echo "$l.cp-1251 CP1251"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in ar ar_SA; do
+ echo "$l ISO-8859-6"
+ echo "$l.iso-8859-6 ISO-8859-6"
+ echo "$l.cp-864 CP864"
+ #echo "$l.cp-868 CP868" # not a commonly used encoding
+ echo "$l.cp-1256 CP1256"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in el el_GR gr gr_GR; do
+ echo "$l ISO-8859-7"
+ echo "$l.iso-8859-7 ISO-8859-7"
+ echo "$l.cp-869 CP869"
+ echo "$l.cp-1253 CP1253"
+ echo "$l.cp-1253@euro CP1253"
+ echo "$l.utf-8 UTF-8"
+ echo "$l.utf-8@euro UTF-8"
+ done
+ for l in he he_IL iw iw_IL; do
+ echo "$l ISO-8859-8"
+ echo "$l.iso-8859-8 ISO-8859-8"
+ echo "$l.cp-862 CP862"
+ echo "$l.cp-1255 CP1255"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in tr tr_TR; do
+ echo "$l ISO-8859-9"
+ echo "$l.iso-8859-9 ISO-8859-9"
+ echo "$l.cp-857 CP857"
+ echo "$l.cp-1254 CP1254"
+ echo "$l.utf-8 UTF-8"
+ done
+ for l in lt lt_LT lv lv_LV; do
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+ echo "$l ISO-8859-13"
+ done
+ for l in ru_UA uk uk_UA; do
+ echo "$l KOI8-U"
+ done
+ for l in zh zh_CN; do
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+ echo "$l GB2312"
+ done
+ for l in ja ja_JP ja_JP.EUC; do
+ echo "$l EUC-JP"
+ done
+ for l in ko ko_KR; do
+ echo "$l EUC-KR"
+ done
+ for l in th th_TH; do
+ echo "$l TIS-620"
+ done
+ for l in fa fa_IR; do
+ #echo "$l ISIRI-3342" # a broken encoding
+ echo "$l.utf-8 UTF-8"
+ done
+ ;;
+ linux* | *-gnu*)
+ # With glibc-2.1 or newer, we don't need any canonicalization,
+ # because glibc has iconv and both glibc and libiconv support all
+ # GNU canonical names directly. Therefore, the Makefile does not
+ # need to install the alias file at all.
+ # The following applies only to glibc-2.0.x and older libcs.
+ echo "ISO_646.IRV:1983 ASCII"
+ ;;
+ aix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "IBM-850 CP850"
+ echo "IBM-856 CP856"
+ echo "IBM-921 ISO-8859-13"
+ echo "IBM-922 CP922"
+ echo "IBM-932 CP932"
+ echo "IBM-943 CP943"
+ echo "IBM-1046 CP1046"
+ echo "IBM-1124 CP1124"
+ echo "IBM-1129 CP1129"
+ echo "IBM-1252 CP1252"
+ echo "IBM-eucCN GB2312"
+ echo "IBM-eucJP EUC-JP"
+ echo "IBM-eucKR EUC-KR"
+ echo "IBM-eucTW EUC-TW"
+ echo "big5 BIG5"
+ echo "GBK GBK"
+ echo "TIS-620 TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ hpux*)
+ echo "iso88591 ISO-8859-1"
+ echo "iso88592 ISO-8859-2"
+ echo "iso88595 ISO-8859-5"
+ echo "iso88596 ISO-8859-6"
+ echo "iso88597 ISO-8859-7"
+ echo "iso88598 ISO-8859-8"
+ echo "iso88599 ISO-8859-9"
+ echo "iso885915 ISO-8859-15"
+ echo "roman8 HP-ROMAN8"
+ echo "arabic8 HP-ARABIC8"
+ echo "greek8 HP-GREEK8"
+ echo "hebrew8 HP-HEBREW8"
+ echo "turkish8 HP-TURKISH8"
+ echo "kana8 HP-KANA8"
+ echo "tis620 TIS-620"
+ echo "big5 BIG5"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "hp15CN GB2312"
+ #echo "ccdc ?" # what is this?
+ echo "SJIS SHIFT_JIS"
+ echo "utf8 UTF-8"
+ ;;
+ irix*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ ;;
+ osf*)
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "cp850 CP850"
+ echo "big5 BIG5"
+ echo "dechanyu DEC-HANYU"
+ echo "dechanzi GB2312"
+ echo "deckanji DEC-KANJI"
+ echo "deckorean EUC-KR"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "GBK GBK"
+ echo "KSC5601 CP949"
+ echo "sdeckanji EUC-JP"
+ echo "SJIS SHIFT_JIS"
+ echo "TACTIS TIS-620"
+ echo "UTF-8 UTF-8"
+ ;;
+ solaris*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-3 ISO-8859-3"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-6 ISO-8859-6"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-8 ISO-8859-8"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "koi8-r KOI8-R"
+ echo "ansi-1251 CP1251"
+ echo "BIG5 BIG5"
+ echo "Big5-HKSCS BIG5-HKSCS"
+ echo "gb2312 GB2312"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "cns11643 EUC-TW"
+ echo "5601 EUC-KR"
+ echo "ko_KR.johap92 JOHAB"
+ echo "eucJP EUC-JP"
+ echo "PCK SHIFT_JIS"
+ echo "TIS620.2533 TIS-620"
+ #echo "sun_eu_greek ?" # what is this?
+ echo "UTF-8 UTF-8"
+ ;;
+ freebsd* | os2*)
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+ # reuse FreeBSD's locale data for OS/2.
+ echo "C ASCII"
+ echo "US-ASCII ASCII"
+ for l in la_LN lt_LN; do
+ echo "$l.ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+ echo "$l.ISO_8859-1 ISO-8859-1"
+ echo "$l.DIS_8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+ echo "$l.ISO_8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO_8859-4 ISO-8859-4"
+ done
+ for l in ru_RU ru_SU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO_8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ja_JP.Shift_JIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ netbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "eucCN GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "eucTW EUC-TW"
+ echo "BIG5 BIG5"
+ echo "SJIS SHIFT_JIS"
+ ;;
+ openbsd*)
+ echo "646 ASCII"
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ ;;
+ darwin[56]*)
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "C ASCII"
+ for l in en_AU en_CA en_GB en_US la_LN; do
+ echo "$l.US-ASCII ASCII"
+ done
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+ nl_NL no_NO pt_PT sv_SE; do
+ echo "$l ISO-8859-1"
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in la_LN; do
+ echo "$l.ISO8859-1 ISO-8859-1"
+ echo "$l.ISO8859-15 ISO-8859-15"
+ done
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+ echo "$l.ISO8859-2 ISO-8859-2"
+ done
+ for l in la_LN lt_LT; do
+ echo "$l.ISO8859-4 ISO-8859-4"
+ done
+ for l in ru_RU; do
+ echo "$l.KOI8-R KOI8-R"
+ echo "$l.ISO8859-5 ISO-8859-5"
+ echo "$l.CP866 CP866"
+ done
+ for l in bg_BG; do
+ echo "$l.CP1251 CP1251"
+ done
+ echo "uk_UA.KOI8-U KOI8-U"
+ echo "zh_TW.BIG5 BIG5"
+ echo "zh_TW.Big5 BIG5"
+ echo "zh_CN.EUC GB2312"
+ echo "ja_JP.EUC EUC-JP"
+ echo "ja_JP.SJIS SHIFT_JIS"
+ echo "ko_KR.EUC EUC-KR"
+ ;;
+ darwin*)
+ # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
+ # useless:
+ # - It returns the empty string when LANG is set to a locale of the
+ # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ # LC_CTYPE file.
+ # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ # - The documentation says:
+ # "... all code that calls BSD system routines should ensure
+ # that the const *char parameters of these routines are in UTF-8
+ # encoding. All BSD system functions expect their string
+ # parameters to be in UTF-8 encoding and nothing else."
+ # It also says
+ # "An additional caveat is that string parameters for files,
+ # paths, and other file-system entities must be in canonical
+ # UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ # characters are decomposed ..."
+ # but this is not true: You can pass non-decomposed UTF-8 strings
+ # to file system functions, and it is the OS which will convert
+ # them to decomposed UTF-8 before accessing the file system.
+ # - The Apple Terminal application displays UTF-8 by default.
+ # - However, other applications are free to use different encodings:
+ # - xterm uses ISO-8859-1 by default.
+ # - TextEdit uses MacRoman by default.
+ # We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ # minimize the use of decomposed Unicode. Unfortunately, through the
+ # Darwin file system, decomposed UTF-8 strings are leaked into user
+ # space nevertheless.
+ # Then there are also the locales with encodings other than US-ASCII
+ # and UTF-8. These locales can be occasionally useful to users (e.g.
+ # when grepping through ISO-8859-1 encoded text files), when all their
+ # file names are in US-ASCII.
+ echo "ISO8859-1 ISO-8859-1"
+ echo "ISO8859-2 ISO-8859-2"
+ echo "ISO8859-4 ISO-8859-4"
+ echo "ISO8859-5 ISO-8859-5"
+ echo "ISO8859-7 ISO-8859-7"
+ echo "ISO8859-9 ISO-8859-9"
+ echo "ISO8859-13 ISO-8859-13"
+ echo "ISO8859-15 ISO-8859-15"
+ echo "KOI8-R KOI8-R"
+ echo "KOI8-U KOI8-U"
+ echo "CP866 CP866"
+ echo "CP949 CP949"
+ echo "CP1131 CP1131"
+ echo "CP1251 CP1251"
+ echo "eucCN GB2312"
+ echo "GB2312 GB2312"
+ echo "eucJP EUC-JP"
+ echo "eucKR EUC-KR"
+ echo "Big5 BIG5"
+ echo "Big5HKSCS BIG5-HKSCS"
+ echo "GBK GBK"
+ echo "GB18030 GB18030"
+ echo "SJIS SHIFT_JIS"
+ echo "ARMSCII-8 ARMSCII-8"
+ echo "PT154 PT154"
+ #echo "ISCII-DEV ?"
+ echo "* UTF-8"
+ ;;
+ beos* | haiku*)
+ # BeOS and Haiku have a single locale, and it has UTF-8 encoding.
+ echo "* UTF-8"
+ ;;
+ msdosdjgpp*)
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+ # localcharset.c falls back to using the full locale name
+ # from the environment variables.
+ echo "#"
+ echo "# The encodings given here may not all be correct."
+ echo "# If you find that the encoding given for your language and"
+ echo "# country is not the one your DOS machine actually uses, just"
+ echo "# correct it in this file, and send a mail to"
+ echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>"
+ echo "# and Bruno Haible <bruno@clisp.org>."
+ echo "#"
+ echo "C ASCII"
+ # ISO-8859-1 languages
+ echo "ca CP850"
+ echo "ca_ES CP850"
+ echo "da CP865" # not CP850 ??
+ echo "da_DK CP865" # not CP850 ??
+ echo "de CP850"
+ echo "de_AT CP850"
+ echo "de_CH CP850"
+ echo "de_DE CP850"
+ echo "en CP850"
+ echo "en_AU CP850" # not CP437 ??
+ echo "en_CA CP850"
+ echo "en_GB CP850"
+ echo "en_NZ CP437"
+ echo "en_US CP437"
+ echo "en_ZA CP850" # not CP437 ??
+ echo "es CP850"
+ echo "es_AR CP850"
+ echo "es_BO CP850"
+ echo "es_CL CP850"
+ echo "es_CO CP850"
+ echo "es_CR CP850"
+ echo "es_CU CP850"
+ echo "es_DO CP850"
+ echo "es_EC CP850"
+ echo "es_ES CP850"
+ echo "es_GT CP850"
+ echo "es_HN CP850"
+ echo "es_MX CP850"
+ echo "es_NI CP850"
+ echo "es_PA CP850"
+ echo "es_PY CP850"
+ echo "es_PE CP850"
+ echo "es_SV CP850"
+ echo "es_UY CP850"
+ echo "es_VE CP850"
+ echo "et CP850"
+ echo "et_EE CP850"
+ echo "eu CP850"
+ echo "eu_ES CP850"
+ echo "fi CP850"
+ echo "fi_FI CP850"
+ echo "fr CP850"
+ echo "fr_BE CP850"
+ echo "fr_CA CP850"
+ echo "fr_CH CP850"
+ echo "fr_FR CP850"
+ echo "ga CP850"
+ echo "ga_IE CP850"
+ echo "gd CP850"
+ echo "gd_GB CP850"
+ echo "gl CP850"
+ echo "gl_ES CP850"
+ echo "id CP850" # not CP437 ??
+ echo "id_ID CP850" # not CP437 ??
+ echo "is CP861" # not CP850 ??
+ echo "is_IS CP861" # not CP850 ??
+ echo "it CP850"
+ echo "it_CH CP850"
+ echo "it_IT CP850"
+ echo "lt CP775"
+ echo "lt_LT CP775"
+ echo "lv CP775"
+ echo "lv_LV CP775"
+ echo "nb CP865" # not CP850 ??
+ echo "nb_NO CP865" # not CP850 ??
+ echo "nl CP850"
+ echo "nl_BE CP850"
+ echo "nl_NL CP850"
+ echo "nn CP865" # not CP850 ??
+ echo "nn_NO CP865" # not CP850 ??
+ echo "no CP865" # not CP850 ??
+ echo "no_NO CP865" # not CP850 ??
+ echo "pt CP850"
+ echo "pt_BR CP850"
+ echo "pt_PT CP850"
+ echo "sv CP850"
+ echo "sv_SE CP850"
+ # ISO-8859-2 languages
+ echo "cs CP852"
+ echo "cs_CZ CP852"
+ echo "hr CP852"
+ echo "hr_HR CP852"
+ echo "hu CP852"
+ echo "hu_HU CP852"
+ echo "pl CP852"
+ echo "pl_PL CP852"
+ echo "ro CP852"
+ echo "ro_RO CP852"
+ echo "sk CP852"
+ echo "sk_SK CP852"
+ echo "sl CP852"
+ echo "sl_SI CP852"
+ echo "sq CP852"
+ echo "sq_AL CP852"
+ echo "sr CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+ # ISO-8859-3 languages
+ echo "mt CP850"
+ echo "mt_MT CP850"
+ # ISO-8859-5 languages
+ echo "be CP866"
+ echo "be_BE CP866"
+ echo "bg CP866" # not CP855 ??
+ echo "bg_BG CP866" # not CP855 ??
+ echo "mk CP866" # not CP855 ??
+ echo "mk_MK CP866" # not CP855 ??
+ echo "ru CP866"
+ echo "ru_RU CP866"
+ echo "uk CP1125"
+ echo "uk_UA CP1125"
+ # ISO-8859-6 languages
+ echo "ar CP864"
+ echo "ar_AE CP864"
+ echo "ar_DZ CP864"
+ echo "ar_EG CP864"
+ echo "ar_IQ CP864"
+ echo "ar_IR CP864"
+ echo "ar_JO CP864"
+ echo "ar_KW CP864"
+ echo "ar_MA CP864"
+ echo "ar_OM CP864"
+ echo "ar_QA CP864"
+ echo "ar_SA CP864"
+ echo "ar_SY CP864"
+ # ISO-8859-7 languages
+ echo "el CP869"
+ echo "el_GR CP869"
+ # ISO-8859-8 languages
+ echo "he CP862"
+ echo "he_IL CP862"
+ # ISO-8859-9 languages
+ echo "tr CP857"
+ echo "tr_TR CP857"
+ # Japanese
+ echo "ja CP932"
+ echo "ja_JP CP932"
+ # Chinese
+ echo "zh_CN GBK"
+ echo "zh_TW CP950" # not CP938 ??
+ # Korean
+ echo "kr CP949" # not CP934 ??
+ echo "kr_KR CP949" # not CP934 ??
+ # Thai
+ echo "th CP874"
+ echo "th_TH CP874"
+ # Other
+ echo "eo CP850"
+ echo "eo_EO CP850"
+ ;;
+esac
diff --git a/gnulib/lib/connect.c b/gnulib/lib/connect.c
new file mode 100644
index 0000000..afd13b9
--- /dev/null
+++ b/gnulib/lib/connect.c
@@ -0,0 +1,56 @@
+/* connect.c --- wrappers for Windows connect function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef connect
+
+int
+rpl_connect (int fd, const struct sockaddr *sockaddr, socklen_t len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = connect (sock, sockaddr, len);
+ if (r < 0)
+ {
+ /* EINPROGRESS is not returned by WinSock 2.0; for backwards
+ compatibility, connect(2) uses EWOULDBLOCK. */
+ if (WSAGetLastError () == WSAEWOULDBLOCK)
+ WSASetLastError (WSAEINPROGRESS);
+
+ set_winsock_errno ();
+ }
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/copy-acl.c b/gnulib/lib/copy-acl.c
new file mode 100644
index 0000000..1532cb8
--- /dev/null
+++ b/gnulib/lib/copy-acl.c
@@ -0,0 +1,644 @@
+/* copy-acl.c - copy access control list from one file to another file
+
+ Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+
+/* Copy access control lists from one file to another. If SOURCE_DESC is
+ a valid file descriptor, use file descriptor operations, else use
+ filename based operations on SRC_NAME. Likewise for DEST_DESC and
+ DST_NAME.
+ If access control lists are not available, fchmod the target file to
+ MODE. Also sets the non-permission bits of the destination file
+ (S_ISUID, S_ISGID, S_ISVTX) to those from MODE if any are set.
+ Return 0 if successful.
+ Return -2 and set errno for an error relating to the source file.
+ Return -1 and set errno for an error relating to the destination file. */
+
+static int
+qcopy_acl (const char *src_name, int source_desc, const char *dst_name,
+ int dest_desc, mode_t mode)
+{
+#if USE_ACL && HAVE_ACL_GET_FILE
+ /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+# if !HAVE_ACL_TYPE_EXTENDED
+ /* Linux, FreeBSD, IRIX, Tru64 */
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_GET_FD && source_desc != -1)
+ acl = acl_get_fd (source_desc);
+ else
+ acl = acl_get_file (src_name, ACL_TYPE_ACCESS);
+ if (acl == NULL)
+ {
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return qset_acl (dst_name, dest_desc, mode);
+ else
+ return -2;
+ }
+
+ if (HAVE_ACL_SET_FD && dest_desc != -1)
+ ret = acl_set_fd (dest_desc, acl);
+ else
+ ret = acl_set_file (dst_name, ACL_TYPE_ACCESS, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ if (ACL_NOT_WELL_SUPPORTED (errno) && !acl_access_nontrivial (acl))
+ {
+ acl_free (acl);
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ else
+ {
+ acl_free (acl);
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ if (!MODE_INSIDE_ACL || (mode & (S_ISUID | S_ISGID | S_ISVTX)))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ return -1;
+ }
+
+ if (S_ISDIR (mode))
+ {
+ acl = acl_get_file (src_name, ACL_TYPE_DEFAULT);
+ if (acl == NULL)
+ return -2;
+
+ if (acl_set_file (dst_name, ACL_TYPE_DEFAULT, acl))
+ {
+ int saved_errno = errno;
+
+ acl_free (acl);
+ errno = saved_errno;
+ return -1;
+ }
+ else
+ acl_free (acl);
+ }
+ return 0;
+
+# else /* HAVE_ACL_TYPE_EXTENDED */
+ /* MacOS X */
+
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. You have to use
+ acl_get_file (name, ACL_TYPE_EXTENDED)
+ or acl_get_fd (open (name, ...))
+ to retrieve an ACL.
+ On the other hand,
+ acl_set_file (name, ACL_TYPE_ACCESS, acl)
+ and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
+ have the same effect as
+ acl_set_file (name, ACL_TYPE_EXTENDED, acl):
+ Each of these calls sets the file's ACL. */
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_GET_FD && source_desc != -1)
+ acl = acl_get_fd (source_desc);
+ else
+ acl = acl_get_file (src_name, ACL_TYPE_EXTENDED);
+ if (acl == NULL)
+ {
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return qset_acl (dst_name, dest_desc, mode);
+ else
+ return -2;
+ }
+
+ if (HAVE_ACL_SET_FD && dest_desc != -1)
+ ret = acl_set_fd (dest_desc, acl);
+ else
+ ret = acl_set_file (dst_name, ACL_TYPE_EXTENDED, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ if (ACL_NOT_WELL_SUPPORTED (errno) && !acl_extended_nontrivial (acl))
+ {
+ acl_free (acl);
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ else
+ {
+ acl_free (acl);
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ /* Since !MODE_INSIDE_ACL, we have to call chmod explicitly. */
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+
+# endif
+
+#elif USE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+ /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
+ of Unixware. The acl() call returns the access and default ACL both
+ at once. */
+# ifdef ACE_GETACL
+ int ace_count;
+ ace_t *ace_entries;
+# endif
+ int count;
+ aclent_t *entries;
+ int did_chmod;
+ int saved_errno;
+ int ret;
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems).
+ There is an API
+ pathconf (name, _PC_ACL_ENABLED)
+ fpathconf (desc, _PC_ACL_ENABLED)
+ that allows to determine which of the two kinds of ACLs is supported
+ for the given file. But some file systems may implement this call
+ incorrectly, so better not use it.
+ When fetching the source ACL, we simply fetch both ACL types.
+ When setting the destination ACL, we try either ACL types, assuming
+ that the kernel will translate the ACL from one form to the other.
+ (See in <http://docs.sun.com/app/docs/doc/819-2241/6n4huc7ia?l=en&a=view>
+ the description of ENOTSUP.) */
+ for (;;)
+ {
+ ace_count = (source_desc != -1
+ ? facl (source_desc, ACE_GETACLCNT, 0, NULL)
+ : acl (src_name, ACE_GETACLCNT, 0, NULL));
+
+ if (ace_count < 0)
+ {
+ if (errno == ENOSYS || errno == EINVAL)
+ {
+ ace_count = 0;
+ ace_entries = NULL;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (ace_count == 0)
+ {
+ ace_entries = NULL;
+ break;
+ }
+
+ ace_entries = (ace_t *) malloc (ace_count * sizeof (ace_t));
+ if (ace_entries == NULL)
+ {
+ errno = ENOMEM;
+ return -2;
+ }
+
+ if ((source_desc != -1
+ ? facl (source_desc, ACE_GETACL, ace_count, ace_entries)
+ : acl (src_name, ACE_GETACL, ace_count, ace_entries))
+ == ace_count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+# endif
+
+ for (;;)
+ {
+ count = (source_desc != -1
+ ? facl (source_desc, GETACLCNT, 0, NULL)
+ : acl (src_name, GETACLCNT, 0, NULL));
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == ENOTSUP || errno == EOPNOTSUPP)
+ {
+ count = 0;
+ entries = NULL;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (count == 0)
+ {
+ entries = NULL;
+ break;
+ }
+
+ entries = (aclent_t *) malloc (count * sizeof (aclent_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -2;
+ }
+
+ if ((source_desc != -1
+ ? facl (source_desc, GETACL, count, entries)
+ : acl (src_name, GETACL, count, entries))
+ == count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+ /* Is there an ACL of either kind? */
+# ifdef ACE_GETACL
+ if (ace_count == 0)
+# endif
+ if (count == 0)
+ return qset_acl (dst_name, dest_desc, mode);
+
+ did_chmod = 0; /* set to 1 once the mode bits in 0777 have been set */
+ saved_errno = 0; /* the first non-ignorable error code */
+
+ if (!MODE_INSIDE_ACL)
+ {
+ /* On Cygwin, it is necessary to call chmod before acl, because
+ chmod can change the contents of the ACL (in ways that don't
+ change the allowed accesses, but still visible). */
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ saved_errno = errno;
+ did_chmod = 1;
+ }
+
+ /* If both ace_entries and entries are available, try SETACL before
+ ACE_SETACL, because SETACL cannot fail with ENOTSUP whereas ACE_SETACL
+ can. */
+
+ if (count > 0)
+ {
+ ret = (dest_desc != -1
+ ? facl (dest_desc, SETACL, count, entries)
+ : acl (dst_name, SETACL, count, entries));
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
+ && !acl_nontrivial (count, entries))
+ saved_errno = 0;
+ }
+ else
+ did_chmod = 1;
+ }
+ free (entries);
+
+# ifdef ACE_GETACL
+ if (ace_count > 0)
+ {
+ ret = (dest_desc != -1
+ ? facl (dest_desc, ACE_SETACL, ace_count, ace_entries)
+ : acl (dst_name, ACE_SETACL, ace_count, ace_entries));
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if ((errno == ENOSYS || errno == EINVAL || errno == ENOTSUP)
+ && !acl_ace_nontrivial (ace_count, ace_entries))
+ saved_errno = 0;
+ }
+ }
+ free (ace_entries);
+# endif
+
+ if (MODE_INSIDE_ACL
+ && did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ {
+ if (saved_errno == 0)
+ saved_errno = errno;
+ }
+ }
+
+ if (saved_errno)
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ return 0;
+
+#elif USE_ACL && HAVE_GETACL /* HP-UX */
+
+ int count;
+ struct acl_entry entries[NACLENTRIES];
+# if HAVE_ACLV_H
+ int aclv_count;
+ struct acl aclv_entries[NACLVENTRIES];
+# endif
+ int did_chmod;
+ int saved_errno;
+ int ret;
+
+ for (;;)
+ {
+ count = (source_desc != -1
+ ? fgetacl (source_desc, 0, NULL)
+ : getacl (src_name, 0, NULL));
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
+ {
+ count = 0;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (count == 0)
+ break;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */
+ abort ();
+
+ if ((source_desc != -1
+ ? fgetacl (source_desc, count, entries)
+ : getacl (src_name, count, entries))
+ == count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+# if HAVE_ACLV_H
+ for (;;)
+ {
+ aclv_count = acl ((char *) src_name, ACL_CNT, NACLVENTRIES, aclv_entries);
+
+ if (aclv_count < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
+ {
+ count = 0;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (aclv_count == 0)
+ break;
+
+ if (aclv_count > NACLVENTRIES)
+ /* If NACLVENTRIES cannot be trusted, use dynamic memory allocation. */
+ abort ();
+
+ if (acl ((char *) src_name, ACL_GET, aclv_count, aclv_entries)
+ == aclv_count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+# endif
+
+ if (count == 0)
+# if HAVE_ACLV_H
+ if (aclv_count == 0)
+# endif
+ return qset_acl (dst_name, dest_desc, mode);
+
+ did_chmod = 0; /* set to 1 once the mode bits in 0777 have been set */
+ saved_errno = 0; /* the first non-ignorable error code */
+
+ if (count > 0)
+ {
+ ret = (dest_desc != -1
+ ? fsetacl (dest_desc, count, entries)
+ : setacl (dst_name, count, entries));
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
+ {
+ struct stat source_statbuf;
+
+ if ((source_desc != -1
+ ? fstat (source_desc, &source_statbuf)
+ : stat (src_name, &source_statbuf)) == 0)
+ {
+ if (!acl_nontrivial (count, entries, &source_statbuf))
+ saved_errno = 0;
+ }
+ else
+ saved_errno = errno;
+ }
+ }
+ else
+ did_chmod = 1;
+ }
+
+# if HAVE_ACLV_H
+ if (aclv_count > 0)
+ {
+ ret = acl ((char *) dst_name, ACL_SET, aclv_count, aclv_entries);
+ if (ret < 0 && saved_errno == 0)
+ {
+ saved_errno = errno;
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
+ {
+ if (!aclv_nontrivial (aclv_count, aclv_entries))
+ saved_errno = 0;
+ }
+ }
+ else
+ did_chmod = 1;
+ }
+# endif
+
+ if (did_chmod <= ((mode & (S_ISUID | S_ISGID | S_ISVTX)) ? 1 : 0))
+ {
+ /* We did not call chmod so far, and special bits are to be set which
+ don't fit into ACLs. */
+
+ if (chmod_or_fchmod (dst_name, dest_desc, mode) != 0)
+ {
+ if (saved_errno == 0)
+ saved_errno = errno;
+ }
+ }
+
+ if (saved_errno)
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ return 0;
+
+#elif USE_ACL && HAVE_ACLX_GET && 0 /* AIX */
+
+ /* TODO */
+
+#elif USE_ACL && HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[4096]; } u;
+ int ret;
+
+ if ((source_desc != -1
+ ? fstatacl (source_desc, STX_NORMAL, &u.a, sizeof (u))
+ : statacl (src_name, STX_NORMAL, &u.a, sizeof (u)))
+ < 0)
+ return -2;
+
+ ret = (dest_desc != -1
+ ? fchacl (dest_desc, &u.a, u.a.acl_len)
+ : chacl (dst_name, &u.a, u.a.acl_len));
+ if (ret < 0)
+ {
+ int saved_errno = errno;
+
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+
+ /* No need to call chmod_or_fchmod at this point, since the mode bits
+ S_ISUID, S_ISGID, S_ISVTX are also stored in the ACL. */
+
+ return 0;
+
+#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */
+
+ int count;
+ struct acl entries[NACLENTRIES];
+ int ret;
+
+ for (;;)
+ {
+ count = acl ((char *) src_name, ACL_CNT, NACLENTRIES, NULL);
+
+ if (count < 0)
+ {
+ if (0)
+ {
+ count = 0;
+ break;
+ }
+ else
+ return -2;
+ }
+
+ if (count == 0)
+ break;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */
+ abort ();
+
+ if (acl ((char *) src_name, ACL_GET, count, entries) == count)
+ break;
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+ if (count == 0)
+ return qset_acl (dst_name, dest_desc, mode);
+
+ ret = acl ((char *) dst_name, ACL_SET, count, entries);
+ if (ret < 0)
+ {
+ int saved_errno = errno;
+
+ if (0)
+ {
+ if (!acl_nontrivial (count, entries))
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+
+ chmod_or_fchmod (dst_name, dest_desc, mode);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+
+ return chmod_or_fchmod (dst_name, dest_desc, mode);
+ }
+ return 0;
+
+#else
+
+ return qset_acl (dst_name, dest_desc, mode);
+
+#endif
+}
+
+
+/* Copy access control lists from one file to another. If SOURCE_DESC is
+ a valid file descriptor, use file descriptor operations, else use
+ filename based operations on SRC_NAME. Likewise for DEST_DESC and
+ DST_NAME.
+ If access control lists are not available, fchmod the target file to
+ MODE. Also sets the non-permission bits of the destination file
+ (S_ISUID, S_ISGID, S_ISVTX) to those from MODE if any are set.
+ Return 0 if successful, otherwise output a diagnostic and return -1. */
+
+int
+copy_acl (const char *src_name, int source_desc, const char *dst_name,
+ int dest_desc, mode_t mode)
+{
+ int ret = qcopy_acl (src_name, source_desc, dst_name, dest_desc, mode);
+ switch (ret)
+ {
+ case -2:
+ error (0, errno, "%s", quote (src_name));
+ return -1;
+
+ case -1:
+ error (0, errno, _("preserving permissions for %s"), quote (dst_name));
+ return -1;
+
+ default:
+ return 0;
+ }
+}
diff --git a/gnulib/lib/copy-file.c b/gnulib/lib/copy-file.c
new file mode 100644
index 0000000..f9cd9c0
--- /dev/null
+++ b/gnulib/lib/copy-file.c
@@ -0,0 +1,137 @@
+/* Copying of files.
+ Copyright (C) 2001-2003, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "copy-file.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#if HAVE_UTIME || HAVE_UTIMES
+# if HAVE_UTIME_H
+# include <utime.h>
+# else
+# include <sys/utime.h>
+# endif
+#endif
+
+#include "error.h"
+#include "safe-read.h"
+#include "full-write.h"
+#include "acl.h"
+#include "binary-io.h"
+#include "gettext.h"
+#include "xalloc.h"
+
+#define _(str) gettext (str)
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+enum { IO_SIZE = 32 * 1024 };
+
+void
+copy_file_preserving (const char *src_filename, const char *dest_filename)
+{
+ int src_fd;
+ struct stat statbuf;
+ int mode;
+ int dest_fd;
+ char *buf = xmalloc (IO_SIZE);
+
+ src_fd = open (src_filename, O_RDONLY | O_BINARY);
+ if (src_fd < 0 || fstat (src_fd, &statbuf) < 0)
+ error (EXIT_FAILURE, errno, _("error while opening \"%s\" for reading"),
+ src_filename);
+
+ mode = statbuf.st_mode & 07777;
+
+ dest_fd = open (dest_filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0600);
+ if (dest_fd < 0)
+ error (EXIT_FAILURE, errno, _("cannot open backup file \"%s\" for writing"),
+ dest_filename);
+
+ /* Copy the file contents. */
+ for (;;)
+ {
+ size_t n_read = safe_read (src_fd, buf, IO_SIZE);
+ if (n_read == SAFE_READ_ERROR)
+ error (EXIT_FAILURE, errno, _("error reading \"%s\""), src_filename);
+ if (n_read == 0)
+ break;
+
+ if (full_write (dest_fd, buf, n_read) < n_read)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ }
+
+ free (buf);
+
+#if !USE_ACL
+ if (close (dest_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ if (close (src_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error after reading \"%s\""), src_filename);
+#endif
+
+ /* Preserve the access and modification times. */
+#if HAVE_UTIME
+ {
+ struct utimbuf ut;
+
+ ut.actime = statbuf.st_atime;
+ ut.modtime = statbuf.st_mtime;
+ utime (dest_filename, &ut);
+ }
+#elif HAVE_UTIMES
+ {
+ struct timeval ut[2];
+
+ ut[0].tv_sec = statbuf.st_atime; ut[0].tv_usec = 0;
+ ut[1].tv_sec = statbuf.st_mtime; ut[1].tv_usec = 0;
+ utimes (dest_filename, &ut);
+ }
+#endif
+
+#if HAVE_CHOWN
+ /* Preserve the owner and group. */
+ chown (dest_filename, statbuf.st_uid, statbuf.st_gid);
+#endif
+
+ /* Preserve the access permissions. */
+#if USE_ACL
+ if (copy_acl (src_filename, src_fd, dest_filename, dest_fd, mode))
+ exit (EXIT_FAILURE);
+#else
+ chmod (dest_filename, mode);
+#endif
+
+#if USE_ACL
+ if (close (dest_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error writing \"%s\""), dest_filename);
+ if (close (src_fd) < 0)
+ error (EXIT_FAILURE, errno, _("error after reading \"%s\""), src_filename);
+#endif
+}
diff --git a/gnulib/lib/copy-file.h b/gnulib/lib/copy-file.h
new file mode 100644
index 0000000..cb8b1f7
--- /dev/null
+++ b/gnulib/lib/copy-file.h
@@ -0,0 +1,34 @@
+/* Copying of files.
+ Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Copy a regular file: from src_filename to dest_filename.
+ The destination file is assumed to be a backup file.
+ Modification times, owner, group and access permissions are preserved as
+ far as possible.
+ Exit upon failure. */
+extern void copy_file_preserving (const char *src_filename, const char *dest_filename);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/copysign.c b/gnulib/lib/copysign.c
new file mode 100644
index 0000000..5480245
--- /dev/null
+++ b/gnulib/lib/copysign.c
@@ -0,0 +1,26 @@
+/* Copy sign into another 'double' number.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+double
+copysign (double x, double y)
+{
+ return (signbit (x) != signbit (y) ? - x : x);
+}
diff --git a/gnulib/lib/copysignf.c b/gnulib/lib/copysignf.c
new file mode 100644
index 0000000..82409d4
--- /dev/null
+++ b/gnulib/lib/copysignf.c
@@ -0,0 +1,26 @@
+/* Copy sign into another 'float' number.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+copysignf (float x, float y)
+{
+ return (signbit (x) != signbit (y) ? - x : x);
+}
diff --git a/gnulib/lib/copysignl.c b/gnulib/lib/copysignl.c
new file mode 100644
index 0000000..4432577
--- /dev/null
+++ b/gnulib/lib/copysignl.c
@@ -0,0 +1,72 @@
+/* Copy sign into another 'long double' number.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+copysignl (long double x, long double y)
+{
+ return copysign (x, y);
+}
+
+#else
+
+# if defined __hpux && !defined __GNUC__
+
+# include <float.h>
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0L. */
+static long double
+compute_minus_zerol (void)
+{
+ return -LDBL_MIN * LDBL_MIN;
+}
+# define minus_zerol compute_minus_zerol ()
+
+/* HP cc on HP-UX 11 has a bug: When x is a positive zero, - x comes out
+ as a positive zero, rather than as a minus zero. Work around it. */
+static long double
+unary_minus (long double x)
+{
+ if (x == 0.0L)
+ {
+ if (signbit (x))
+ return 0.0L;
+ else
+ return minus_zerol;
+ }
+ else
+ return - x;
+}
+
+# endif
+
+long double
+copysignl (long double x, long double y)
+{
+# if defined __hpux && !defined __GNUC__
+ return (signbit (x) != signbit (y) ? unary_minus (x) : x);
+# else
+ return (signbit (x) != signbit (y) ? - x : x);
+# endif
+}
+
+#endif
diff --git a/gnulib/lib/cosf.c b/gnulib/lib/cosf.c
new file mode 100644
index 0000000..e9156a9
--- /dev/null
+++ b/gnulib/lib/cosf.c
@@ -0,0 +1,26 @@
+/* Cosine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+cosf (float x)
+{
+ return (float) cos ((double) x);
+}
diff --git a/gnulib/lib/coshf.c b/gnulib/lib/coshf.c
new file mode 100644
index 0000000..c9775d7
--- /dev/null
+++ b/gnulib/lib/coshf.c
@@ -0,0 +1,26 @@
+/* Hyperbolic cosine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+coshf (float x)
+{
+ return (float) cosh ((double) x);
+}
diff --git a/gnulib/lib/cosl.c b/gnulib/lib/cosl.c
new file mode 100644
index 0000000..a3eaf39
--- /dev/null
+++ b/gnulib/lib/cosl.c
@@ -0,0 +1,116 @@
+/* s_cosl.c -- long double version of s_sin.c.
+ * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+cosl (long double x)
+{
+ return cos (x);
+}
+
+#else
+
+/* sinl(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ * __kernel_sinl ... sine function on [-pi/4,pi/4]
+ * __kernel_cosl ... cose function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+# include "trigl.h"
+
+long double
+cosl (long double x)
+{
+ long double y[2],z=0.0L;
+ int n;
+
+ /* cosl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if (x >= -0.7853981633974483096156608458198757210492
+ && x <= 0.7853981633974483096156608458198757210492)
+ return kernel_cosl(x, z);
+
+ /* cosl(Inf) is NaN, cosl(0) is 1 */
+ else if (x + x == x && x != 0.0)
+ return x - x; /* NaN */
+
+ /* argument reduction needed */
+ else
+ {
+ n = ieee754_rem_pio2l (x, y);
+ switch (n & 3)
+ {
+ case 0:
+ return kernel_cosl (y[0], y[1]);
+ case 1:
+ return -kernel_sinl (y[0], y[1], 1);
+ case 2:
+ return -kernel_cosl (y[0], y[1]);
+ default:
+ return kernel_sinl (y[0], y[1], 1);
+ }
+ }
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *29));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *2));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *30));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *4));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *32));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *2/3));
+ printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *4/3));
+}
+#endif
diff --git a/gnulib/lib/count-one-bits.h b/gnulib/lib/count-one-bits.h
new file mode 100644
index 0000000..093165c
--- /dev/null
+++ b/gnulib/lib/count-one-bits.h
@@ -0,0 +1,77 @@
+/* count-one-bits.h -- counts the number of 1-bits in a word.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Ben Pfaff. */
+
+#ifndef COUNT_ONE_BITS_H
+# define COUNT_ONE_BITS_H 1
+
+#include <stdlib.h>
+#include "verify.h"
+
+/* Expand the code which computes the number of 1-bits of the local
+ variable 'x' of type TYPE (an unsigned integer type) and returns it
+ from the current function. */
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#define COUNT_ONE_BITS(BUILTIN, TYPE) \
+ return BUILTIN (x);
+#else
+#define COUNT_ONE_BITS(BUILTIN, TYPE) \
+ /* This condition is written so as to avoid shifting by more than \
+ 31 bits at once, and also avoids a random HP-UX cc bug. */ \
+ verify (((TYPE) -1 >> 31 >> 31 >> 2) == 0); /* TYPE has at most 64 bits */ \
+ int count = count_one_bits_32 (x); \
+ if (1 < (TYPE) -1 >> 31) /* TYPE has more than 32 bits? */ \
+ count += count_one_bits_32 (x >> 31 >> 1); \
+ return count;
+
+/* Compute and return the number of 1-bits set in the least
+ significant 32 bits of X. */
+static inline int
+count_one_bits_32 (unsigned int x)
+{
+ x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U);
+ x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U);
+ x = (x >> 16) + (x & 0xffff);
+ x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f);
+ return (x >> 8) + (x & 0x00ff);
+}
+#endif
+
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits (unsigned int x)
+{
+ COUNT_ONE_BITS (__builtin_popcount, unsigned int);
+}
+
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits_l (unsigned long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountl, unsigned long int);
+}
+
+#if HAVE_UNSIGNED_LONG_LONG_INT
+/* Compute and return the number of 1-bits set in X. */
+static inline int
+count_one_bits_ll (unsigned long long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountll, unsigned long long int);
+}
+#endif
+
+#endif /* COUNT_ONE_BITS_H */
diff --git a/gnulib/lib/crc.c b/gnulib/lib/crc.c
new file mode 100644
index 0000000..db99891
--- /dev/null
+++ b/gnulib/lib/crc.c
@@ -0,0 +1,103 @@
+/* crc.c -- cyclic redundancy checks
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "crc.h"
+
+/* Table of CRCs of all 8-bit messages. Generated by running code
+ from RFC 1952 modified to print out the table. */
+static const uint32_t crc32_table[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+/*
+ * The following function was extracted from RFC 1952 by Simon
+ * Josefsson. It was modified to avoid initial and final XOR, to use
+ * size_t for the buffer length, and to use the const keyword.
+ */
+uint32_t
+crc32_update_no_xor (uint32_t crc, const char *buf, size_t len)
+{
+ size_t n;
+
+ for (n = 0; n < len; n++)
+ crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8);
+
+ return crc;
+}
+
+uint32_t
+crc32_no_xor (const char *buf, size_t len)
+{
+ return crc32_update_no_xor (0L, buf, len);
+}
+
+uint32_t
+crc32_update (uint32_t crc, const char *buf, size_t len)
+{
+ return crc32_update_no_xor (crc ^ 0xffffffff, buf, len) ^ 0xffffffff;
+}
+
+uint32_t
+crc32 (const char *buf, size_t len)
+{
+ return crc32_update (0L, buf, len);
+}
diff --git a/gnulib/lib/crc.h b/gnulib/lib/crc.h
new file mode 100644
index 0000000..e774252
--- /dev/null
+++ b/gnulib/lib/crc.h
@@ -0,0 +1,47 @@
+/* crc.h -- cyclic redundancy checks
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef CRC_H
+# define CRC_H 1
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* Compute CRC-32 value of LEN bytes long BUF, and return it. */
+extern uint32_t crc32 (const char *buf, size_t len);
+
+/* Incrementally update CRC-32 value CRC using LEN bytes long BUF. In
+ the first call, use 0 as the value for CRC. Return the updated
+ CRC-32 value. */
+extern uint32_t crc32_update (uint32_t crc, const char *buf, size_t len);
+
+/* Compute modified-CRC-32 value of LEN bytes long BUF, and return it.
+ The "modification" is to avoid the initial and final XOR operation.
+ Due to historic implementation errors, this variant is sometimes
+ used (i.e., in RFC 3961). */
+extern uint32_t crc32_no_xor (const char *buf, size_t len);
+
+/* Incrementally update modified-CRC-32 value CRC using LEN bytes long
+ BUF. In the first call, use 0 as the value for CRC. Return the
+ updated modified-CRC-32 value. The "modification" is to avoid the
+ initial and final XOR operation. Due to historic implementation
+ errors, this variant is sometimes used (i.e., in RFC 3961). */
+extern uint32_t
+crc32_update_no_xor (uint32_t crc, const char *buf, size_t len);
+
+#endif /* CRC_H */
diff --git a/gnulib/lib/creat-safer.c b/gnulib/lib/creat-safer.c
new file mode 100644
index 0000000..2a6916d
--- /dev/null
+++ b/gnulib/lib/creat-safer.c
@@ -0,0 +1,31 @@
+/* Invoke creat, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include "unistd-safer.h"
+
+int
+creat_safer (char const *file, mode_t mode)
+{
+ return fd_safer (creat (file, mode));
+}
diff --git a/gnulib/lib/csharpcomp.c b/gnulib/lib/csharpcomp.c
new file mode 100644
index 0000000..9726bbc
--- /dev/null
+++ b/gnulib/lib/csharpcomp.c
@@ -0,0 +1,573 @@
+/* Compile a C# program.
+ Copyright (C) 2003-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "csharpcomp.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "execute.h"
+#include "spawn-pipe.h"
+#include "wait-process.h"
+#include "sh-quote.h"
+#include "safe-read.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Survey of C# compilers.
+
+ Program from
+
+ cscc pnet
+ mcs mono
+ csc sscli
+
+ We try the CIL interpreters in the following order:
+ 1. "cscc", because it is a completely free system.
+ 2. "mcs", because it is a free system but doesn't integrate so well
+ with Unix. (Command line options start with / instead of -. Errors go
+ to stdout instead of stderr. Source references are printed as
+ "file(lineno)" instead of "file:lineno:".)
+ 3. "csc", although it is not free, because it is a kind of "reference
+ implementation" of C#.
+ But the order can be changed through the --enable-csharp configuration
+ option.
+ */
+
+static int
+compile_csharp_using_pnet (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool cscc_tested;
+ static bool cscc_present;
+
+ if (!cscc_tested)
+ {
+ /* Test for presence of cscc:
+ "cscc --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "cscc";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("cscc", "cscc", argv, false, false, true, true,
+ true, false, NULL);
+ cscc_present = (exitstatus == 0);
+ cscc_tested = true;
+ }
+
+ if (cscc_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (output_is_library ? 1 : 0) + 2 + 2 * libdirs_count
+ + 2 * libraries_count + (optimize ? 1 : 0) + (debug ? 1 : 0)
+ + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "cscc";
+ if (output_is_library)
+ *argp++ = "-shared";
+ *argp++ = "-o";
+ *argp++ = (char *) output_file;
+ for (i = 0; i < libdirs_count; i++)
+ {
+ *argp++ = "-L";
+ *argp++ = (char *) libdirs[i];
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ *argp++ = "-l";
+ *argp++ = (char *) libraries[i];
+ }
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (12 + strlen (source_file) + 1);
+
+ memcpy (option, "-fresources=", 12);
+ strcpy (option + 12, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("cscc", "cscc", argv, false, false, false, false,
+ true, true, NULL);
+
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+static int
+compile_csharp_using_mono (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool mcs_tested;
+ static bool mcs_present;
+
+ if (!mcs_tested)
+ {
+ /* Test for presence of mcs:
+ "mcs --version >/dev/null 2>/dev/null"
+ and (to exclude an unrelated 'mcs' program on QNX 6)
+ "mcs --version 2>/dev/null | grep Mono >/dev/null" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "mcs";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("mcs", "mcs", argv, DEV_NULL, true, true, false,
+ fd);
+ mcs_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, and test whether it contains the
+ string "Mono". */
+ char c[4];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ count++;
+ if (count == 4)
+ {
+ if (memcmp (c, "Mono", 4) == 0)
+ mcs_present = true;
+ c[0] = c[1]; c[1] = c[2]; c[2] = c[3];
+ count--;
+ }
+ }
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "mcs", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ mcs_present = false;
+ }
+ mcs_tested = true;
+ }
+
+ if (mcs_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line[2];
+ size_t linesize[2];
+ size_t linelen[2];
+ unsigned int l;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (output_is_library ? 1 : 0) + 1 + libdirs_count + libraries_count
+ + (debug ? 1 : 0) + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "mcs";
+ if (output_is_library)
+ *argp++ = "-target:library";
+ {
+ char *option = (char *) xmalloca (5 + strlen (output_file) + 1);
+ memcpy (option, "-out:", 5);
+ strcpy (option + 5, output_file);
+ *argp++ = option;
+ }
+ for (i = 0; i < libdirs_count; i++)
+ {
+ char *option = (char *) xmalloca (5 + strlen (libdirs[i]) + 1);
+ memcpy (option, "-lib:", 5);
+ strcpy (option + 5, libdirs[i]);
+ *argp++ = option;
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ char *option = (char *) xmalloca (11 + strlen (libraries[i]) + 4 + 1);
+ memcpy (option, "-reference:", 11);
+ memcpy (option + 11, libraries[i], strlen (libraries[i]));
+ strcpy (option + 11 + strlen (libraries[i]), ".dll");
+ *argp++ = option;
+ }
+ if (debug)
+ *argp++ = "-debug";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (10 + strlen (source_file) + 1);
+
+ memcpy (option, "-resource:", 10);
+ strcpy (option + 10, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ child = create_pipe_in ("mcs", "mcs", argv, NULL, false, true, true, fd);
+
+ /* Read the subprocess output, copying it to stderr. Drop the last
+ line if it starts with "Compilation succeeded". */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ error (EXIT_FAILURE, errno, _("fdopen() failed"));
+ line[0] = NULL; linesize[0] = 0;
+ line[1] = NULL; linesize[1] = 0;
+ l = 0;
+ for (;;)
+ {
+ linelen[l] = getline (&line[l], &linesize[l], fp);
+ if (linelen[l] == (size_t)(-1))
+ break;
+ l = (l + 1) % 2;
+ if (line[l] != NULL)
+ fwrite (line[l], 1, linelen[l], stderr);
+ }
+ l = (l + 1) % 2;
+ if (line[l] != NULL
+ && !(linelen[l] >= 21
+ && memcmp (line[l], "Compilation succeeded", 21) == 0))
+ fwrite (line[l], 1, linelen[l], stderr);
+ if (line[0] != NULL)
+ free (line[0]);
+ if (line[1] != NULL)
+ free (line[1]);
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, "mcs", false, false, true, true, NULL);
+
+ for (i = 1 + (output_is_library ? 1 : 0);
+ i < 1 + (output_is_library ? 1 : 0)
+ + 1 + libdirs_count + libraries_count;
+ i++)
+ freea (argv[i]);
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+static int
+compile_csharp_using_sscli (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file, bool output_is_library,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ static bool csc_tested;
+ static bool csc_present;
+
+ if (!csc_tested)
+ {
+ /* Test for presence of csc:
+ "csc -help >/dev/null 2>/dev/null \
+ && ! { csc -help 2>/dev/null | grep -i chicken > /dev/null; }" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "csc";
+ argv[1] = "-help";
+ argv[2] = NULL;
+ child = create_pipe_in ("csc", "csc", argv, DEV_NULL, true, true, false,
+ fd);
+ csc_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, and test whether it contains the
+ string "chicken". */
+ char c[7];
+ size_t count = 0;
+
+ csc_present = true;
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] >= 'A' && c[count] <= 'Z')
+ c[count] += 'a' - 'A';
+ count++;
+ if (count == 7)
+ {
+ if (memcmp (c, "chicken", 7) == 0)
+ csc_present = false;
+ c[0] = c[1]; c[1] = c[2]; c[2] = c[3];
+ c[3] = c[4]; c[4] = c[5]; c[5] = c[6];
+ count--;
+ }
+ }
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "csc", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ csc_present = false;
+ }
+ csc_tested = true;
+ }
+
+ if (csc_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + 1 + 1 + libdirs_count + libraries_count
+ + (optimize ? 1 : 0) + (debug ? 1 : 0) + sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "csc";
+ *argp++ =
+ (char *) (output_is_library ? "-target:library" : "-target:exe");
+ {
+ char *option = (char *) xmalloca (5 + strlen (output_file) + 1);
+ memcpy (option, "-out:", 5);
+ strcpy (option + 5, output_file);
+ *argp++ = option;
+ }
+ for (i = 0; i < libdirs_count; i++)
+ {
+ char *option = (char *) xmalloca (5 + strlen (libdirs[i]) + 1);
+ memcpy (option, "-lib:", 5);
+ strcpy (option + 5, libdirs[i]);
+ *argp++ = option;
+ }
+ for (i = 0; i < libraries_count; i++)
+ {
+ char *option = (char *) xmalloca (11 + strlen (libraries[i]) + 4 + 1);
+ memcpy (option, "-reference:", 11);
+ memcpy (option + 11, libraries[i], strlen (libraries[i]));
+ strcpy (option + 11 + strlen (libraries[i]), ".dll");
+ *argp++ = option;
+ }
+ if (optimize)
+ *argp++ = "-optimize+";
+ if (debug)
+ *argp++ = "-debug+";
+ for (i = 0; i < sources_count; i++)
+ {
+ const char *source_file = sources[i];
+ if (strlen (source_file) >= 10
+ && memcmp (source_file + strlen (source_file) - 10, ".resources",
+ 10) == 0)
+ {
+ char *option = (char *) xmalloca (10 + strlen (source_file) + 1);
+
+ memcpy (option, "-resource:", 10);
+ strcpy (option + 10, source_file);
+ *argp++ = option;
+ }
+ else
+ *argp++ = (char *) source_file;
+ }
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("csc", "csc", argv, false, false, false, false,
+ true, true, NULL);
+
+ for (i = 2; i < 3 + libdirs_count + libraries_count; i++)
+ freea (argv[i]);
+ for (i = 0; i < sources_count; i++)
+ if (argv[argc - sources_count + i] != sources[i])
+ freea (argv[argc - sources_count + i]);
+ freea (argv);
+
+ return (exitstatus != 0);
+ }
+ else
+ return -1;
+}
+
+bool
+compile_csharp_class (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file,
+ bool optimize, bool debug,
+ bool verbose)
+{
+ bool output_is_library =
+ (strlen (output_file) >= 4
+ && memcmp (output_file + strlen (output_file) - 4, ".dll", 4) == 0);
+ int result;
+
+ /* First try the C# implementation specified through --enable-csharp. */
+#if CSHARP_CHOICE_PNET
+ result = compile_csharp_using_pnet (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if CSHARP_CHOICE_MONO
+ result = compile_csharp_using_mono (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ /* Then try the remaining C# implementations in our standard order. */
+#if !CSHARP_CHOICE_PNET
+ result = compile_csharp_using_pnet (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if !CSHARP_CHOICE_MONO
+ result = compile_csharp_using_mono (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ result = compile_csharp_using_sscli (sources, sources_count,
+ libdirs, libdirs_count,
+ libraries, libraries_count,
+ output_file, output_is_library,
+ optimize, debug, verbose);
+ if (result >= 0)
+ return (bool) result;
+
+ error (0, 0, _("C# compiler not found, try installing pnet"));
+ return true;
+}
diff --git a/gnulib/lib/csharpcomp.h b/gnulib/lib/csharpcomp.h
new file mode 100644
index 0000000..4bd7807
--- /dev/null
+++ b/gnulib/lib/csharpcomp.h
@@ -0,0 +1,40 @@
+/* Compile a C# program.
+ Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _CSHARPCOMP_H
+#define _CSHARPCOMP_H
+
+#include <stdbool.h>
+
+/* Compile a set of C# source files to bytecode.
+ sources is an array of source file names, including resource files.
+ libdirs is a list of directories to be searched for libraries.
+ libraries is a list of libraries on which the program depends.
+ output_file is the name of the output file; it should end in .exe or .dll.
+ If verbose, the command to be executed will be printed.
+ Return false if OK, true on error. */
+extern bool compile_csharp_class (const char * const *sources,
+ unsigned int sources_count,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *libraries,
+ unsigned int libraries_count,
+ const char *output_file,
+ bool optimize, bool debug,
+ bool verbose);
+
+#endif /* _CSHARPCOMP_H */
diff --git a/gnulib/lib/csharpexec.c b/gnulib/lib/csharpexec.c
new file mode 100644
index 0000000..15dbb29
--- /dev/null
+++ b/gnulib/lib/csharpexec.c
@@ -0,0 +1,345 @@
+/* Execute a C# program.
+ Copyright (C) 2003-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "csharpexec.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "execute.h"
+#include "sh-quote.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+/* Handling of MONO_PATH is just like Java CLASSPATH. */
+#define CLASSPATHVAR "MONO_PATH"
+#define new_classpath new_monopath
+#define set_classpath set_monopath
+#define reset_classpath reset_monopath
+#include "classpath.h"
+#include "classpath.c"
+#undef reset_classpath
+#undef set_classpath
+#undef new_classpath
+#undef CLASSPATHVAR
+
+/* Handling of clix' PATH variable is just like Java CLASSPATH. */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+ /* Win32, Cygwin */
+ #define CLASSPATHVAR "PATH"
+#elif defined __APPLE__ && defined __MACH__
+ /* MacOS X */
+ #define CLASSPATHVAR "DYLD_LIBRARY_PATH"
+#else
+ /* Normal Unix */
+ #define CLASSPATHVAR "LD_LIBRARY_PATH"
+#endif
+#define new_classpath new_clixpath
+#define set_classpath set_clixpath
+#define reset_classpath reset_clixpath
+#include "classpath.h"
+#include "classpath.c"
+#undef reset_classpath
+#undef set_classpath
+#undef new_classpath
+#undef CLASSPATHVAR
+
+#define _(str) gettext (str)
+
+
+/* Survey of CIL interpreters.
+
+ Program from
+
+ ilrun pnet
+ mono mono
+ clix sscli
+
+ With Mono, the MONO_PATH is a colon separated list of pathnames. (On
+ Windows: semicolon separated list of pathnames.)
+
+ We try the CIL interpreters in the following order:
+ 1. "ilrun", because it is a completely free system.
+ 2. "mono", because it is a partially free system but doesn't integrate
+ well with Unix.
+ 3. "clix", although it is not free, because it is a kind of "reference
+ implementation" of C#.
+ But the order can be changed through the --enable-csharp configuration
+ option.
+ */
+
+static int
+execute_csharp_using_pnet (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool ilrun_tested;
+ static bool ilrun_present;
+
+ if (!ilrun_tested)
+ {
+ /* Test for presence of ilrun:
+ "ilrun --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "ilrun";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("ilrun", "ilrun", argv, false, false, true, true,
+ true, false, NULL);
+ ilrun_present = (exitstatus == 0);
+ ilrun_tested = true;
+ }
+
+ if (ilrun_present)
+ {
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ unsigned int i;
+ bool err;
+
+ argc = 1 + 2 * libdirs_count + 1 + nargs;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "ilrun";
+ for (i = 0; i < libdirs_count; i++)
+ {
+ *argp++ = "-L";
+ *argp++ = (char *) libdirs[i];
+ }
+ *argp++ = (char *) assembly_path;
+ for (i = 0; i < nargs; i++)
+ *argp++ = (char *) args[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("ilrun", "ilrun", argv, private_data);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+static int
+execute_csharp_using_mono (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool mono_tested;
+ static bool mono_present;
+
+ if (!mono_tested)
+ {
+ /* Test for presence of mono:
+ "mono --version >/dev/null 2>/dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "mono";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("mono", "mono", argv, false, false, true, true,
+ true, false, NULL);
+ mono_present = (exitstatus == 0);
+ mono_tested = true;
+ }
+
+ if (mono_present)
+ {
+ char *old_monopath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+ bool err;
+
+ /* Set MONO_PATH. */
+ old_monopath = set_monopath (libdirs, libdirs_count, false, verbose);
+
+ argv[0] = "mono";
+ argv[1] = (char *) assembly_path;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("mono", "mono", argv, private_data);
+
+ /* Reset MONO_PATH. */
+ reset_monopath (old_monopath);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+static int
+execute_csharp_using_sscli (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args, unsigned int nargs,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ static bool clix_tested;
+ static bool clix_present;
+
+ if (!clix_tested)
+ {
+ /* Test for presence of clix:
+ "clix >/dev/null 2>/dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "clix";
+ argv[1] = NULL;
+ exitstatus = execute ("clix", "clix", argv, false, false, true, true,
+ true, false, NULL);
+ clix_present = (exitstatus == 0 || exitstatus == 1);
+ clix_tested = true;
+ }
+
+ if (clix_present)
+ {
+ char *old_clixpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+ bool err;
+
+ /* Set clix' PATH variable. */
+ old_clixpath = set_clixpath (libdirs, libdirs_count, false, verbose);
+
+ argv[0] = "clix";
+ argv[1] = (char *) assembly_path;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("clix", "clix", argv, private_data);
+
+ /* Reset clix' PATH variable. */
+ reset_clixpath (old_clixpath);
+
+ freea (argv);
+
+ return err;
+ }
+ else
+ return -1;
+}
+
+bool
+execute_csharp_program (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ unsigned int nargs;
+ int result;
+
+ /* Count args. */
+ {
+ const char * const *arg;
+
+ for (nargs = 0, arg = args; *arg != NULL; nargs++, arg++)
+ ;
+ }
+
+ /* First try the C# implementation specified through --enable-csharp. */
+#if CSHARP_CHOICE_PNET
+ result = execute_csharp_using_pnet (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if CSHARP_CHOICE_MONO
+ result = execute_csharp_using_mono (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ /* Then try the remaining C# implementations in our standard order. */
+#if !CSHARP_CHOICE_PNET
+ result = execute_csharp_using_pnet (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+#if !CSHARP_CHOICE_MONO
+ result = execute_csharp_using_mono (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+#endif
+
+ result = execute_csharp_using_sscli (assembly_path, libdirs, libdirs_count,
+ args, nargs, verbose, quiet,
+ executer, private_data);
+ if (result >= 0)
+ return (bool) result;
+
+ if (!quiet)
+ error (0, 0, _("C# virtual machine not found, try installing pnet"));
+ return true;
+}
diff --git a/gnulib/lib/csharpexec.h b/gnulib/lib/csharpexec.h
new file mode 100644
index 0000000..e1aedf7
--- /dev/null
+++ b/gnulib/lib/csharpexec.h
@@ -0,0 +1,43 @@
+/* Execute a C# program.
+ Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _CSHARPEXEC_H
+#define _CSHARPEXEC_H
+
+#include <stdbool.h>
+
+typedef bool execute_fn (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data);
+
+/* Execute a C# program.
+ assembly_path is the assembly's pathname (= program name with .exe).
+ libdirs is a list of directories to be searched for libraries.
+ args is a NULL terminated list of arguments to be passed to the program.
+ If verbose, the command to be executed will be printed.
+ Then the command is passed to the execute function together with the
+ private_data argument. This function returns false if OK, true on error.
+ Return false if OK, true on error.
+ If quiet, error messages will not be printed. */
+extern bool execute_csharp_program (const char *assembly_path,
+ const char * const *libdirs,
+ unsigned int libdirs_count,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data);
+
+#endif /* _CSHARPEXEC_H */
diff --git a/gnulib/lib/ctype.in.h b/gnulib/lib/ctype.in.h
new file mode 100644
index 0000000..8d414f4
--- /dev/null
+++ b/gnulib/lib/ctype.in.h
@@ -0,0 +1,58 @@
+/* A substitute for ISO C99 <ctype.h>, for platforms on which it is incomplete.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible. */
+
+/*
+ * ISO C 99 <ctype.h> for platforms on which it is incomplete.
+ * <http://www.opengroup.org/onlinepubs/9699919799/basedefs/ctype.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_CTYPE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Include the original <ctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_CTYPE_H@
+
+#ifndef _@GUARD_PREFIX@_CTYPE_H
+#define _@GUARD_PREFIX@_CTYPE_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Return non-zero if c is a blank, i.e. a space or tab character. */
+#if @GNULIB_ISBLANK@
+# if !@HAVE_ISBLANK@
+_GL_EXTERN_C int isblank (int c);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef isblank
+# if HAVE_RAW_DECL_ISBLANK
+_GL_WARN_ON_USE (isblank, "isblank is unportable - "
+ "use gnulib module isblank for portability");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_CTYPE_H */
+#endif /* _@GUARD_PREFIX@_CTYPE_H */
diff --git a/gnulib/lib/cycle-check.c b/gnulib/lib/cycle-check.c
new file mode 100644
index 0000000..3b48a9d
--- /dev/null
+++ b/gnulib/lib/cycle-check.c
@@ -0,0 +1,85 @@
+/* help detect directory cycles efficiently
+
+ Copyright (C) 2003-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include <stdbool.h>
+
+#include "cycle-check.h"
+
+#define CC_MAGIC 9827862
+
+/* Return true if I is a power of 2, or is zero. */
+
+static inline bool
+is_zero_or_power_of_two (uintmax_t i)
+{
+ return (i & (i - 1)) == 0;
+}
+
+void
+cycle_check_init (struct cycle_check_state *state)
+{
+ state->chdir_counter = 0;
+ state->magic = CC_MAGIC;
+}
+
+/* In traversing a directory hierarchy, call this function once for each
+ descending chdir call, with SB corresponding to the chdir operand.
+ If SB corresponds to a directory that has already been seen,
+ return true to indicate that there is a directory cycle.
+ Note that this is done `lazily', which means that some of
+ the directories in the cycle may be processed twice before
+ the cycle is detected. */
+
+bool
+cycle_check (struct cycle_check_state *state, struct stat const *sb)
+{
+ assert (state->magic == CC_MAGIC);
+
+ /* If the current directory ever happens to be the same
+ as the one we last recorded for the cycle detection,
+ then it's obviously part of a cycle. */
+ if (state->chdir_counter && SAME_INODE (*sb, state->dev_ino))
+ return true;
+
+ /* If the number of `descending' chdir calls is a power of two,
+ record the dev/ino of the current directory. */
+ if (is_zero_or_power_of_two (++(state->chdir_counter)))
+ {
+ /* On all architectures that we know about, if the counter
+ overflows then there is a directory cycle here somewhere,
+ even if we haven't detected it yet. Typically this happens
+ only after the counter is incremented 2**64 times, so it's a
+ fairly theoretical point. */
+ if (state->chdir_counter == 0)
+ return true;
+
+ state->dev_ino.st_dev = sb->st_dev;
+ state->dev_ino.st_ino = sb->st_ino;
+ }
+
+ return false;
+}
diff --git a/gnulib/lib/cycle-check.h b/gnulib/lib/cycle-check.h
new file mode 100644
index 0000000..064710e
--- /dev/null
+++ b/gnulib/lib/cycle-check.h
@@ -0,0 +1,52 @@
+/* help detect directory cycles efficiently
+
+ Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering */
+
+#ifndef CYCLE_CHECK_H
+# define CYCLE_CHECK_H 1
+
+# include <stdint.h>
+# include <stdbool.h>
+# include "dev-ino.h"
+# include "same-inode.h"
+
+struct cycle_check_state
+{
+ struct dev_ino dev_ino;
+ uintmax_t chdir_counter;
+ int magic;
+};
+
+void cycle_check_init (struct cycle_check_state *state);
+bool cycle_check (struct cycle_check_state *state, struct stat const *sb);
+
+# define CYCLE_CHECK_REFLECT_CHDIR_UP(State, SB_dir, SB_subdir) \
+ do \
+ { \
+ /* You must call cycle_check at least once before using this macro. */ \
+ if ((State)->chdir_counter == 0) \
+ abort (); \
+ if (SAME_INODE ((State)->dev_ino, SB_subdir)) \
+ { \
+ (State)->dev_ino.st_dev = (SB_dir).st_dev; \
+ (State)->dev_ino.st_ino = (SB_dir).st_ino; \
+ } \
+ } \
+ while (0)
+
+#endif
diff --git a/gnulib/lib/des.c b/gnulib/lib/des.c
new file mode 100644
index 0000000..e1c505d
--- /dev/null
+++ b/gnulib/lib/des.c
@@ -0,0 +1,668 @@
+/* des.c --- DES and Triple-DES encryption/decryption Algorithm
+ * Copyright (C) 1998-1999, 2001-2007, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
+
+/*
+ * For a description of triple encryption, see:
+ * Bruce Schneier: Applied Cryptography. Second Edition.
+ * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
+ * This implementation is according to the definition of DES in FIPS
+ * PUB 46-2 from December 1993.
+ *
+ * Written by Michael Roth <mroth@nessie.de>, September 1998
+ */
+
+/*
+ * U S A G E
+ * ===========
+ *
+ * For DES or Triple-DES encryption/decryption you must initialize a proper
+ * encryption context with a key.
+ *
+ * A DES key is 64bit wide but only 56bits of the key are used. The remaining
+ * bits are parity bits and they will _not_ checked in this implementation, but
+ * simply ignored.
+ *
+ * For Triple-DES you could use either two 64bit keys or three 64bit keys.
+ * The parity bits will _not_ checked, too.
+ *
+ * After initializing a context with a key you could use this context to
+ * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode.
+ *
+ * DES Example
+ * -----------
+ * unsigned char key[8];
+ * unsigned char plaintext[8];
+ * unsigned char ciphertext[8];
+ * unsigned char recoverd[8];
+ * gl_des_ctx context;
+ *
+ * // Fill 'key' and 'plaintext' with some data
+ * ....
+ *
+ * // Set up the DES encryption context
+ * gl_des_setkey(&context, key);
+ *
+ * // Encrypt the plaintext
+ * des_ecb_encrypt(&context, plaintext, ciphertext);
+ *
+ * // To recover the orginal plaintext from ciphertext use:
+ * des_ecb_decrypt(&context, ciphertext, recoverd);
+ *
+ *
+ * Triple-DES Example
+ * ------------------
+ * unsigned char key1[8];
+ * unsigned char key2[8];
+ * unsigned char key3[8];
+ * unsigned char plaintext[8];
+ * unsigned char ciphertext[8];
+ * unsigned char recoverd[8];
+ * gl_3des_ctx context;
+ *
+ * // If you would like to use two 64bit keys, fill 'key1' and'key2'
+ * // then setup the encryption context:
+ * gl_3des_set2keys(&context, key1, key2);
+ *
+ * // To use three 64bit keys with Triple-DES use:
+ * gl_3des_set3keys(&context, key1, key2, key3);
+ *
+ * // Encrypting plaintext with Triple-DES
+ * gl_3des_ecb_encrypt(&context, plaintext, ciphertext);
+ *
+ * // Decrypting ciphertext to recover the plaintext with Triple-DES
+ * gl_3des_ecb_decrypt(&context, ciphertext, recoverd);
+ */
+
+
+#include <config.h>
+
+#include "des.h"
+
+#include <stdio.h>
+#include <string.h> /* memcpy, memcmp */
+
+/*
+ * The s-box values are permuted according to the 'primitive function P'
+ * and are rotated one bit to the left.
+ */
+static const uint32_t sbox1[64] = {
+ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404,
+ 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400,
+ 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400,
+ 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
+ 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404,
+ 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000,
+ 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000,
+ 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
+ 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404,
+ 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000,
+ 0x00010004, 0x00010400, 0x00000000, 0x01010004
+};
+
+static const uint32_t sbox2[64] = {
+ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020,
+ 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000,
+ 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020,
+ 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
+ 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000,
+ 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000,
+ 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000,
+ 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
+ 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020,
+ 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020,
+ 0x80000000, 0x80100020, 0x80108020, 0x00108000
+};
+
+static const uint32_t sbox3[64] = {
+ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000,
+ 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000,
+ 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008,
+ 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
+ 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208,
+ 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208,
+ 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008,
+ 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
+ 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208,
+ 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000,
+ 0x00020208, 0x00000008, 0x08020008, 0x00020200
+};
+
+static const uint32_t sbox4[64] = {
+ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081,
+ 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081,
+ 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000,
+ 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
+ 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080,
+ 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081,
+ 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080,
+ 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+ 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001,
+ 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001,
+ 0x00000080, 0x00800000, 0x00002000, 0x00802080
+};
+
+static const uint32_t sbox5[64] = {
+ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100,
+ 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100,
+ 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000,
+ 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
+ 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000,
+ 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000,
+ 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000,
+ 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
+ 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000,
+ 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000,
+ 0x00000000, 0x40080000, 0x02080100, 0x40000100
+};
+
+static const uint32_t sbox6[64] = {
+ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010,
+ 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010,
+ 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010,
+ 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
+ 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000,
+ 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000,
+ 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000,
+ 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
+ 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000,
+ 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000,
+ 0x20404000, 0x20000000, 0x00400010, 0x20004010
+};
+
+static const uint32_t sbox7[64] = {
+ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802,
+ 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002,
+ 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802,
+ 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
+ 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002,
+ 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802,
+ 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000,
+ 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
+ 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000,
+ 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800,
+ 0x04000002, 0x04000800, 0x00000800, 0x00200002
+};
+
+static const uint32_t sbox8[64] = {
+ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040,
+ 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000,
+ 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040,
+ 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
+ 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000,
+ 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000,
+ 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040,
+ 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
+ 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000,
+ 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040,
+ 0x00001040, 0x00040040, 0x10000000, 0x10041000
+};
+
+/*
+ * These two tables are part of the 'permuted choice 1' function.
+ * In this implementation several speed improvements are done.
+ */
+static const uint32_t leftkey_swap[16] = {
+ 0x00000000, 0x00000001, 0x00000100, 0x00000101,
+ 0x00010000, 0x00010001, 0x00010100, 0x00010101,
+ 0x01000000, 0x01000001, 0x01000100, 0x01000101,
+ 0x01010000, 0x01010001, 0x01010100, 0x01010101
+};
+
+static const uint32_t rightkey_swap[16] = {
+ 0x00000000, 0x01000000, 0x00010000, 0x01010000,
+ 0x00000100, 0x01000100, 0x00010100, 0x01010100,
+ 0x00000001, 0x01000001, 0x00010001, 0x01010001,
+ 0x00000101, 0x01000101, 0x00010101, 0x01010101,
+};
+
+/*
+ * Numbers of left shifts per round for encryption subkeys. To
+ * calculate the decryption subkeys we just reverse the ordering of
+ * the calculated encryption subkeys, so there is no need for a
+ * decryption rotate tab.
+ */
+static const unsigned char encrypt_rotate_tab[16] = {
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+};
+
+/*
+ * Table with weak DES keys sorted in ascending order. In DES there
+ * are 64 known keys which are weak. They are weak because they
+ * produce only one, two or four different subkeys in the subkey
+ * scheduling process. The keys in this table have all their parity
+ * bits cleared.
+ */
+static const unsigned char weak_keys[64][8] = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*w */
+ {0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e},
+ {0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0},
+ {0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe},
+ {0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e}, /*sw */
+ {0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00},
+ {0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe},
+ {0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0},
+ {0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0}, /*sw */
+ {0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe},
+ {0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00},
+ {0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e},
+ {0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe}, /*sw */
+ {0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0},
+ {0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e},
+ {0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00},
+ {0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e},
+ {0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00}, /*sw */
+ {0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe},
+ {0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0},
+ {0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00},
+ {0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e}, /*w */
+ {0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0},
+ {0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe},
+ {0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe},
+ {0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0}, /*sw */
+ {0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e},
+ {0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00},
+ {0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0},
+ {0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe}, /*sw */
+ {0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00},
+ {0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e},
+ {0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0},
+ {0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe},
+ {0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00}, /*sw */
+ {0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e},
+ {0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe},
+ {0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0},
+ {0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e}, /*sw */
+ {0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00},
+ {0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00},
+ {0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e},
+ {0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0}, /*w */
+ {0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe},
+ {0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e},
+ {0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00},
+ {0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe}, /*sw */
+ {0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0},
+ {0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe},
+ {0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0},
+ {0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e},
+ {0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00}, /*sw */
+ {0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0},
+ {0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe},
+ {0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00},
+ {0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e}, /*sw */
+ {0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e},
+ {0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00},
+ {0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe},
+ {0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0}, /*sw */
+ {0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00},
+ {0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e},
+ {0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0},
+ {0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe} /*w */
+};
+
+bool
+gl_des_is_weak_key (const char * key)
+{
+ char work[8];
+ int i, left, right, middle, cmp_result;
+
+ /* clear parity bits */
+ for (i = 0; i < 8; ++i)
+ work[i] = ((unsigned char)key[i]) & 0xfe;
+
+ /* binary search in the weak key table */
+ left = 0;
+ right = 63;
+ while (left <= right)
+ {
+ middle = (left + right) / 2;
+
+ if (!(cmp_result = memcmp (work, weak_keys[middle], 8)))
+ return -1;
+
+ if (cmp_result > 0)
+ left = middle + 1;
+ else
+ right = middle - 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Macro to swap bits across two words.
+ */
+#define DO_PERMUTATION(a, temp, b, offset, mask) \
+ temp = ((a>>offset) ^ b) & mask; \
+ b ^= temp; \
+ a ^= temp<<offset;
+
+
+/*
+ * This performs the 'initial permutation' of the data to be encrypted
+ * or decrypted. Additionally the resulting two words are rotated one bit
+ * to the left.
+ */
+#define INITIAL_PERMUTATION(left, temp, right) \
+ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \
+ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
+ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
+ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
+ right = (right << 1) | (right >> 31); \
+ temp = (left ^ right) & 0xaaaaaaaa; \
+ right ^= temp; \
+ left ^= temp; \
+ left = (left << 1) | (left >> 31);
+
+/*
+ * The 'inverse initial permutation'.
+ */
+#define FINAL_PERMUTATION(left, temp, right) \
+ left = (left << 31) | (left >> 1); \
+ temp = (left ^ right) & 0xaaaaaaaa; \
+ left ^= temp; \
+ right ^= temp; \
+ right = (right << 31) | (right >> 1); \
+ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \
+ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \
+ DO_PERMUTATION(left, temp, right, 16, 0x0000ffff) \
+ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
+
+
+/*
+ * A full DES round including 'expansion function', 'sbox substitution'
+ * and 'primitive function P' but without swapping the left and right word.
+ * Please note: The data in 'from' and 'to' is already rotated one bit to
+ * the left, done in the initial permutation.
+ */
+#define DES_ROUND(from, to, work, subkey) \
+ work = from ^ *subkey++; \
+ to ^= sbox8[ work & 0x3f ]; \
+ to ^= sbox6[ (work>>8) & 0x3f ]; \
+ to ^= sbox4[ (work>>16) & 0x3f ]; \
+ to ^= sbox2[ (work>>24) & 0x3f ]; \
+ work = ((from << 28) | (from >> 4)) ^ *subkey++; \
+ to ^= sbox7[ work & 0x3f ]; \
+ to ^= sbox5[ (work>>8) & 0x3f ]; \
+ to ^= sbox3[ (work>>16) & 0x3f ]; \
+ to ^= sbox1[ (work>>24) & 0x3f ];
+
+/*
+ * Macros to convert 8 bytes from/to 32bit words.
+ */
+#define READ_64BIT_DATA(data, left, right) \
+ left = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; \
+ right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
+
+#define WRITE_64BIT_DATA(data, left, right) \
+ data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; \
+ data[2] = (left >> 8) &0xff; data[3] = left &0xff; \
+ data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff; \
+ data[6] = (right >> 8) &0xff; data[7] = right &0xff;
+
+/*
+ * des_key_schedule(): Calculate 16 subkeys pairs (even/odd) for
+ * 16 encryption rounds.
+ * To calculate subkeys for decryption the caller
+ * have to reorder the generated subkeys.
+ *
+ * rawkey: 8 Bytes of key data
+ * subkey: Array of at least 32 uint32_ts. Will be filled
+ * with calculated subkeys.
+ *
+ */
+static void
+des_key_schedule (const char * _rawkey, uint32_t * subkey)
+{
+ const unsigned char *rawkey = (const unsigned char *) _rawkey;
+ uint32_t left, right, work;
+ int round;
+
+ READ_64BIT_DATA (rawkey, left, right)
+ DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
+ DO_PERMUTATION (right, work, left, 0, 0x10101010)
+ left = ((leftkey_swap[(left >> 0) & 0xf] << 3)
+ | (leftkey_swap[(left >> 8) & 0xf] << 2)
+ | (leftkey_swap[(left >> 16) & 0xf] << 1)
+ | (leftkey_swap[(left >> 24) & 0xf])
+ | (leftkey_swap[(left >> 5) & 0xf] << 7)
+ | (leftkey_swap[(left >> 13) & 0xf] << 6)
+ | (leftkey_swap[(left >> 21) & 0xf] << 5)
+ | (leftkey_swap[(left >> 29) & 0xf] << 4));
+
+ left &= 0x0fffffff;
+
+ right = ((rightkey_swap[(right >> 1) & 0xf] << 3)
+ | (rightkey_swap[(right >> 9) & 0xf] << 2)
+ | (rightkey_swap[(right >> 17) & 0xf] << 1)
+ | (rightkey_swap[(right >> 25) & 0xf])
+ | (rightkey_swap[(right >> 4) & 0xf] << 7)
+ | (rightkey_swap[(right >> 12) & 0xf] << 6)
+ | (rightkey_swap[(right >> 20) & 0xf] << 5)
+ | (rightkey_swap[(right >> 28) & 0xf] << 4));
+
+ right &= 0x0fffffff;
+
+ for (round = 0; round < 16; ++round)
+ {
+ left = ((left << encrypt_rotate_tab[round])
+ | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+ right = ((right << encrypt_rotate_tab[round])
+ | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+
+ *subkey++ = (((left << 4) & 0x24000000)
+ | ((left << 28) & 0x10000000)
+ | ((left << 14) & 0x08000000)
+ | ((left << 18) & 0x02080000)
+ | ((left << 6) & 0x01000000)
+ | ((left << 9) & 0x00200000)
+ | ((left >> 1) & 0x00100000)
+ | ((left << 10) & 0x00040000)
+ | ((left << 2) & 0x00020000)
+ | ((left >> 10) & 0x00010000)
+ | ((right >> 13) & 0x00002000)
+ | ((right >> 4) & 0x00001000)
+ | ((right << 6) & 0x00000800)
+ | ((right >> 1) & 0x00000400)
+ | ((right >> 14) & 0x00000200)
+ | (right & 0x00000100)
+ | ((right >> 5) & 0x00000020)
+ | ((right >> 10) & 0x00000010)
+ | ((right >> 3) & 0x00000008)
+ | ((right >> 18) & 0x00000004)
+ | ((right >> 26) & 0x00000002)
+ | ((right >> 24) & 0x00000001));
+
+ *subkey++ = (((left << 15) & 0x20000000)
+ | ((left << 17) & 0x10000000)
+ | ((left << 10) & 0x08000000)
+ | ((left << 22) & 0x04000000)
+ | ((left >> 2) & 0x02000000)
+ | ((left << 1) & 0x01000000)
+ | ((left << 16) & 0x00200000)
+ | ((left << 11) & 0x00100000)
+ | ((left << 3) & 0x00080000)
+ | ((left >> 6) & 0x00040000)
+ | ((left << 15) & 0x00020000)
+ | ((left >> 4) & 0x00010000)
+ | ((right >> 2) & 0x00002000)
+ | ((right << 8) & 0x00001000)
+ | ((right >> 14) & 0x00000808)
+ | ((right >> 9) & 0x00000400)
+ | ((right) & 0x00000200)
+ | ((right << 7) & 0x00000100)
+ | ((right >> 7) & 0x00000020)
+ | ((right >> 3) & 0x00000011)
+ | ((right << 2) & 0x00000004)
+ | ((right >> 21) & 0x00000002));
+ }
+}
+
+void
+gl_des_setkey (gl_des_ctx *ctx, const char * key)
+{
+ int i;
+
+ des_key_schedule (key, ctx->encrypt_subkeys);
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i];
+ }
+}
+
+bool
+gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen)
+{
+ if (keylen != 8)
+ return false;
+
+ gl_des_setkey (ctx, key);
+
+ return !gl_des_is_weak_key (key);
+}
+
+void
+gl_des_ecb_crypt (gl_des_ctx *ctx, const char * _from, char * _to, int mode)
+{
+ const unsigned char *from = (const unsigned char *) _from;
+ unsigned char *to = (unsigned char *) _to;
+ uint32_t left, right, work;
+ uint32_t *keys;
+
+ keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+ READ_64BIT_DATA (from, left, right)
+ INITIAL_PERMUTATION (left, work, right)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ FINAL_PERMUTATION (right, work, left)
+ WRITE_64BIT_DATA (to, right, left)
+}
+
+void
+gl_3des_set2keys (gl_3des_ctx *ctx, const char * key1, const char * key2)
+{
+ int i;
+
+ des_key_schedule (key1, ctx->encrypt_subkeys);
+ des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[31 - i];
+
+ ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i];
+ ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i];
+
+ ctx->encrypt_subkeys[i + 64] = ctx->encrypt_subkeys[i];
+ ctx->encrypt_subkeys[i + 65] = ctx->encrypt_subkeys[i + 1];
+
+ ctx->decrypt_subkeys[i + 64] = ctx->decrypt_subkeys[i];
+ ctx->decrypt_subkeys[i + 65] = ctx->decrypt_subkeys[i + 1];
+ }
+}
+
+void
+gl_3des_set3keys (gl_3des_ctx *ctx, const char * key1,
+ const char * key2, const char * key3)
+{
+ int i;
+
+ des_key_schedule (key1, ctx->encrypt_subkeys);
+ des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+ des_key_schedule (key3, &(ctx->encrypt_subkeys[64]));
+
+ for (i = 0; i < 32; i += 2)
+ {
+ ctx->decrypt_subkeys[i] = ctx->encrypt_subkeys[94 - i];
+ ctx->decrypt_subkeys[i + 1] = ctx->encrypt_subkeys[95 - i];
+
+ ctx->encrypt_subkeys[i + 32] = ctx->decrypt_subkeys[62 - i];
+ ctx->encrypt_subkeys[i + 33] = ctx->decrypt_subkeys[63 - i];
+
+ ctx->decrypt_subkeys[i + 64] = ctx->encrypt_subkeys[30 - i];
+ ctx->decrypt_subkeys[i + 65] = ctx->encrypt_subkeys[31 - i];
+ }
+}
+
+void
+gl_3des_ecb_crypt (gl_3des_ctx *ctx,
+ const char * _from,
+ char * _to, int mode)
+{
+ const unsigned char *from = (const unsigned char *) _from;
+ unsigned char *to = (unsigned char *) _to;
+ uint32_t left, right, work;
+ uint32_t *keys;
+
+ keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+ READ_64BIT_DATA (from, left, right)
+ INITIAL_PERMUTATION (left, work, right)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+ FINAL_PERMUTATION (right, work, left)
+ WRITE_64BIT_DATA (to, right, left)
+}
+
+bool
+gl_3des_makekey (gl_3des_ctx *ctx, const char * key, size_t keylen)
+{
+ if (keylen != 24)
+ return false;
+
+ gl_3des_set3keys (ctx, key, key + 8, key + 16);
+
+ return !(gl_des_is_weak_key (key)
+ || gl_des_is_weak_key (key + 8)
+ || gl_des_is_weak_key (key + 16));
+}
diff --git a/gnulib/lib/des.h b/gnulib/lib/des.h
new file mode 100644
index 0000000..516d155
--- /dev/null
+++ b/gnulib/lib/des.h
@@ -0,0 +1,121 @@
+/* des.h --- DES cipher implementation.
+ * Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson, based on Libgcrypt. */
+
+#ifndef DES_H
+# define DES_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+/*
+ * Encryption/Decryption context of DES
+ */
+typedef struct
+{
+ uint32_t encrypt_subkeys[32];
+ uint32_t decrypt_subkeys[32];
+} gl_des_ctx;
+
+/*
+ * Encryption/Decryption context of Triple-DES
+ */
+typedef struct
+{
+ uint32_t encrypt_subkeys[96];
+ uint32_t decrypt_subkeys[96];
+} gl_3des_ctx;
+
+/* Check whether the 8 byte key is weak. Does not check the parity
+ * bits of the key but simple ignore them. */
+extern bool
+gl_des_is_weak_key (const char * key);
+
+/*
+ * DES
+ * ---
+ */
+
+/* Fill a DES context CTX with subkeys calculated from 64bit KEY.
+ * Does not check parity bits, but simply ignore them. Does not check
+ * for weak keys. */
+extern void
+gl_des_setkey (gl_des_ctx *ctx, const char * key);
+
+/* Fill a DES context CTX with subkeys calculated from 64bit KEY, with
+ * weak key checking. Does not check parity bits, but simply ignore
+ * them. */
+extern bool
+gl_des_makekey (gl_des_ctx *ctx, const char * key, size_t keylen);
+
+/* Electronic Codebook Mode DES encryption/decryption of data
+ * according to 'mode'. */
+extern void
+gl_des_ecb_crypt (gl_des_ctx *ctx, const char * from, char * to, int mode);
+
+#define gl_des_ecb_encrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 0)
+#define gl_des_ecb_decrypt(ctx, from, to) gl_des_ecb_crypt(ctx, from, to, 1)
+
+/* Triple-DES
+ * ----------
+ */
+
+/* Fill a Triple-DES context CTX with subkeys calculated from two
+ * 64bit keys in KEY1 and KEY2. Does not check the parity bits of the
+ * keys, but simply ignore them. Does not check for weak keys. */
+extern void
+gl_3des_set2keys (gl_3des_ctx *ctx,
+ const char * key1,
+ const char * key2);
+
+/*
+ * Fill a Triple-DES context CTX with subkeys calculated from three
+ * 64bit keys in KEY1, KEY2 and KEY3. Does not check the parity bits
+ * of the keys, but simply ignore them. Does not check for weak
+ * keys. */
+extern void
+gl_3des_set3keys (gl_3des_ctx *ctx,
+ const char * key1,
+ const char * key2,
+ const char * key3);
+
+/* Fill a Triple-DES context CTX with subkeys calculated from three
+ * concatenated 64bit keys in KEY, with weak key checking. Does not
+ * check the parity bits of the keys, but simply ignore them. */
+extern bool
+gl_3des_makekey (gl_3des_ctx *ctx,
+ const char * key,
+ size_t keylen);
+
+/* Electronic Codebook Mode Triple-DES encryption/decryption of data
+ * according to 'mode'. Sometimes this mode is named 'EDE' mode
+ * (Encryption-Decryption-Encryption). */
+extern void
+gl_3des_ecb_crypt (gl_3des_ctx *ctx,
+ const char * from,
+ char * to,
+ int mode);
+
+#define gl_3des_ecb_encrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,0)
+#define gl_3des_ecb_decrypt(ctx, from, to) gl_3des_ecb_crypt(ctx,from,to,1)
+
+#endif /* DES_H */
diff --git a/gnulib/lib/dev-ino.h b/gnulib/lib/dev-ino.h
new file mode 100644
index 0000000..695d38c
--- /dev/null
+++ b/gnulib/lib/dev-ino.h
@@ -0,0 +1,13 @@
+#ifndef DEV_INO_H
+# define DEV_INO_H 1
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+struct dev_ino
+{
+ ino_t st_ino;
+ dev_t st_dev;
+};
+
+#endif
diff --git a/gnulib/lib/di-set.c b/gnulib/lib/di-set.c
new file mode 100644
index 0000000..2f78448
--- /dev/null
+++ b/gnulib/lib/di-set.c
@@ -0,0 +1,259 @@
+/* Set operations for device-inode pairs stored in a space-efficient manner.
+
+ Copyright 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert and Jim Meyering */
+
+#include <config.h>
+#include "di-set.h"
+
+#include "hash.h"
+#include "ino-map.h"
+
+#include <limits.h>
+#include <stdlib.h>
+
+/* The hash package hashes "void *", but this package wants to hash
+ integers. Use integers that are as large as possible, but no
+ larger than void *, so that they can be cast to void * and back
+ without losing information. */
+typedef size_t hashint;
+#define HASHINT_MAX ((hashint) -1)
+
+/* Integers represent inode numbers. Integers in the range
+ 1..(LARGE_INO_MIN-1) represent inode numbers directly. (The hash
+ package does not work with null pointers, so inode 0 cannot be used
+ as a key.) To find the representations of other inode numbers, map
+ them through INO_MAP. */
+#define LARGE_INO_MIN (HASHINT_MAX / 2)
+
+/* Set operations for device-inode pairs stored in a space-efficient
+ manner. Use a two-level hash table. The top level hashes by
+ device number, as there are typically a small number of devices.
+ The lower level hashes by mapped inode numbers. In the typical
+ case where the inode number is positive and small, the inode number
+ maps to itself, masquerading as a void * value; otherwise, its
+ value is the result of hashing the inode value through INO_MAP. */
+
+/* A pair that maps a device number to a set of inode numbers. */
+struct di_ent
+{
+ dev_t dev;
+ struct hash_table *ino_set;
+};
+
+/* A two-level hash table that manages and indexes these pairs. */
+struct di_set
+{
+ /* Map device numbers to sets of inode number representatives. */
+ struct hash_table *dev_map;
+
+ /* If nonnull, map large inode numbers to their small
+ representatives. If null, there are no large inode numbers in
+ this set. */
+ struct ino_map *ino_map;
+
+ /* Cache of the most recently allocated and otherwise-unused storage
+ for probing this table. */
+ struct di_ent *probe;
+};
+
+/* Hash a device-inode-set entry. */
+static size_t
+di_ent_hash (void const *x, size_t table_size)
+{
+ struct di_ent const *p = x;
+ dev_t dev = p->dev;
+
+ /* When DEV is wider than size_t, exclusive-OR the words of DEV into H.
+ This avoids loss of info, without applying % to the wider type,
+ which could be quite slow on some systems. */
+ size_t h = dev;
+ unsigned int i;
+ unsigned int n_words = sizeof dev / sizeof h + (sizeof dev % sizeof h != 0);
+ for (i = 1; i < n_words; i++)
+ h ^= dev >> CHAR_BIT * sizeof h * i;
+
+ return h % table_size;
+}
+
+/* Return true if two device-inode-set entries are the same. */
+static bool
+di_ent_compare (void const *x, void const *y)
+{
+ struct di_ent const *a = x;
+ struct di_ent const *b = y;
+ return a->dev == b->dev;
+}
+
+/* Free a device-inode-set entry. */
+static void
+di_ent_free (void *v)
+{
+ struct di_ent *a = v;
+ hash_free (a->ino_set);
+ free (a);
+}
+
+/* Create a set of device-inode pairs. Return NULL on allocation failure. */
+struct di_set *
+di_set_alloc (void)
+{
+ struct di_set *dis = malloc (sizeof *dis);
+ if (dis)
+ {
+ enum { INITIAL_DEV_MAP_SIZE = 11 };
+ dis->dev_map = hash_initialize (INITIAL_DEV_MAP_SIZE, NULL,
+ di_ent_hash, di_ent_compare,
+ di_ent_free);
+ if (! dis->dev_map)
+ {
+ free (dis);
+ return NULL;
+ }
+ dis->ino_map = NULL;
+ dis->probe = NULL;
+ }
+
+ return dis;
+}
+
+/* Free a set of device-inode pairs. */
+void
+di_set_free (struct di_set *dis)
+{
+ hash_free (dis->dev_map);
+ free (dis->ino_map);
+ free (dis->probe);
+ free (dis);
+}
+
+/* Hash an encoded inode number I. */
+static size_t
+di_ino_hash (void const *i, size_t table_size)
+{
+ return (hashint) i % table_size;
+}
+
+/* Using the DIS table, map a device to a hash table that represents
+ a set of inode numbers. Return NULL on error. */
+static struct hash_table *
+map_device (struct di_set *dis, dev_t dev)
+{
+ /* Find space for the probe, reusing the cache if available. */
+ struct di_ent *ent;
+ struct di_ent *probe = dis->probe;
+ if (probe)
+ {
+ /* If repeating a recent query, return the cached result. */
+ if (probe->dev == dev)
+ return probe->ino_set;
+ }
+ else
+ {
+ dis->probe = probe = malloc (sizeof *probe);
+ if (! probe)
+ return NULL;
+ }
+
+ /* Probe for the device. */
+ probe->dev = dev;
+ ent = hash_insert (dis->dev_map, probe);
+ if (! ent)
+ return NULL;
+
+ if (ent != probe)
+ {
+ /* Use the existing entry. */
+ probe->ino_set = ent->ino_set;
+ }
+ else
+ {
+ enum { INITIAL_INO_SET_SIZE = 1021 };
+
+ /* Prepare to allocate a new probe next time; this one is in use. */
+ dis->probe = NULL;
+
+ /* DEV is new; allocate an inode set for it. */
+ probe->ino_set = hash_initialize (INITIAL_INO_SET_SIZE, NULL,
+ di_ino_hash, NULL, NULL);
+ }
+
+ return probe->ino_set;
+}
+
+/* Using the DIS table, map an inode number to a mapped value.
+ Return INO_MAP_INSERT_FAILURE on error. */
+static hashint
+map_inode_number (struct di_set *dis, ino_t ino)
+{
+ if (0 < ino && ino < LARGE_INO_MIN)
+ return ino;
+
+ if (! dis->ino_map)
+ {
+ dis->ino_map = ino_map_alloc (LARGE_INO_MIN);
+ if (! dis->ino_map)
+ return INO_MAP_INSERT_FAILURE;
+ }
+
+ return ino_map_insert (dis->ino_map, ino);
+}
+
+/* Attempt to insert the DEV,INO pair into the set DIS.
+ If it matches a pair already in DIS, keep that pair and return 0.
+ Otherwise, if insertion is successful, return 1.
+ Upon any failure return -1. */
+int
+di_set_insert (struct di_set *dis, dev_t dev, ino_t ino)
+{
+ hashint i;
+
+ /* Map the device number to a set of inodes. */
+ struct hash_table *ino_set = map_device (dis, dev);
+ if (! ino_set)
+ return -1;
+
+ /* Map the inode number to a small representative I. */
+ i = map_inode_number (dis, ino);
+ if (i == INO_MAP_INSERT_FAILURE)
+ return -1;
+
+ /* Put I into the inode set. */
+ return hash_insert_if_absent (ino_set, (void const *) i, NULL);
+}
+
+/* Look up the DEV,INO pair in the set DIS.
+ If found, return 1; if not found, return 0.
+ Upon any failure return -1. */
+int
+di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino)
+{
+ hashint i;
+
+ /* Map the device number to a set of inodes. */
+ struct hash_table *ino_set = map_device (dis, dev);
+ if (! ino_set)
+ return -1;
+
+ /* Map the inode number to a small representative I. */
+ i = map_inode_number (dis, ino);
+ if (i == INO_MAP_INSERT_FAILURE)
+ return -1;
+
+ /* Perform the look-up. */
+ return !!hash_lookup (ino_set, (void const *) i);
+}
diff --git a/gnulib/lib/di-set.h b/gnulib/lib/di-set.h
new file mode 100644
index 0000000..abc3161
--- /dev/null
+++ b/gnulib/lib/di-set.h
@@ -0,0 +1,19 @@
+#ifndef _GL_DI_SET_H
+# define _GL_DI_SET_H
+
+# include <sys/types.h>
+
+# undef _GL_ATTRIBUTE_NONNULL
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || 3 < __GNUC__
+# define _GL_ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
+# else
+# define _GL_ATTRIBUTE_NONNULL(m)
+# endif
+
+struct di_set *di_set_alloc (void);
+int di_set_insert (struct di_set *, dev_t, ino_t) _GL_ATTRIBUTE_NONNULL (1);
+void di_set_free (struct di_set *) _GL_ATTRIBUTE_NONNULL (1);
+int di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino)
+ _GL_ATTRIBUTE_NONNULL (1);
+
+#endif
diff --git a/gnulib/lib/diacrit.c b/gnulib/lib/diacrit.c
new file mode 100644
index 0000000..9696b06
--- /dev/null
+++ b/gnulib/lib/diacrit.c
@@ -0,0 +1,161 @@
+/* Diacritics processing for a few character codes.
+
+ Copyright (C) 1990-1993, 2000, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ François Pinard <pinard@iro.umontreal.ca>, 1988.
+
+ All this file is a temporary hack, waiting for locales in GNU.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "diacrit.h"
+
+/* ISO 8859-1 Latin-1 code is used as the underlying character set. If
+ MSDOS is defined, IBM-PC's character set code is used instead. */
+
+/*--------------------------------------------------------------------.
+| For each alphabetic character, returns what it would be without its |
+| possible diacritic symbol. |
+`--------------------------------------------------------------------*/
+
+const char diacrit_base[256] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, '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', 0, 0, 0, 0, 0,
+ 0, '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', 0, 0, 0, 0, 0,
+
+#ifdef __MSDOS__
+
+ 'C', 'u', 'e', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'i', 'i', 'i', 'A', 'A',
+ 'E', 'e', 'E', 'o', 'o', 'o', 'u', 'u',
+ 'y', 'O', 'U', 0, 0, 0, 0, 0,
+ 'a', 'i', 'o', 'u', 'n', 'N', 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+
+#else
+
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C',
+ 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I',
+ 0, 'N', 'O', 'O', 'O', 'O', 'O', 0,
+ 'O', 'U', 'U', 'U', 'U', 'Y', 0, 0,
+ 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c',
+ 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
+ 0, 'n', 'o', 'o', 'o', 'o', 'o', 0,
+ 'o', 'u', 'u', 'u', 'u', 'y', 0, 'y',
+
+#endif
+};
+
+/*------------------------------------------------------------------------.
+| For each alphabetic character, returns a code of what its diacritic is, |
+| according to the following codes: 1 (eE) over aA for latin diphtongs; 2 |
+| (') acute accent; 3 (`) grave accent; 4 (^) circumflex accent; 5 (") |
+| umlaut or diaraesis; 6 (~) tilda; 7 (,) cedilla; 8 (o) covering degree |
+| symbol; 9 (|) slashed character. |
+`------------------------------------------------------------------------*/
+
+const char diacrit_diac[256] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 0,
+
+#ifdef __MSDOS__
+
+ 7, 5, 2, 4, 5, 3, 8, 7,
+ 4, 5, 3, 5, 4, 3, 5, 8,
+ 2, 1, 1, 4, 5, 3, 4, 3,
+ 5, 5, 5, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 6, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+
+#else
+
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 2, 4, 6, 5, 8, 1, 7,
+ 3, 2, 4, 5, 3, 2, 4, 5,
+ 0, 6, 3, 2, 4, 6, 5, 0,
+ 9, 3, 2, 4, 5, 2, 0, 0,
+ 3, 2, 4, 6, 5, 8, 1, 7,
+ 3, 2, 4, 5, 3, 2, 4, 5,
+ 0, 6, 3, 2, 4, 6, 5, 0,
+ 9, 3, 2, 4, 5, 2, 0, 0,
+
+#endif
+};
diff --git a/gnulib/lib/diacrit.h b/gnulib/lib/diacrit.h
new file mode 100644
index 0000000..6244b79
--- /dev/null
+++ b/gnulib/lib/diacrit.h
@@ -0,0 +1,27 @@
+/* Diacritics processing for a few character codes.
+ Copyright (C) 1990-1993, 2009-2011 Free Software Foundation, Inc.
+ François Pinard <pinard@iro.umontreal.ca>, 1988.
+
+ All this file is a temporary hack, waiting for locales in GNU.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern const char diacrit_base[]; /* characters without diacritics */
+extern const char diacrit_diac[]; /* diacritic code for each character */
+
+/* Returns CHAR without its diacritic. CHAR is known to be alphabetic. */
+#define tobase(Char) (diacrit_base[(unsigned char) (Char)])
+
+/* Returns a diacritic code for CHAR. CHAR is known to be alphabetic. */
+#define todiac(Char) (diacrit_diac[(unsigned char) (Char)])
diff --git a/gnulib/lib/diffseq.h b/gnulib/lib/diffseq.h
new file mode 100644
index 0000000..1cdc985
--- /dev/null
+++ b/gnulib/lib/diffseq.h
@@ -0,0 +1,523 @@
+/* Analyze differences between two vectors.
+
+ Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* The basic idea is to consider two vectors as similar if, when
+ transforming the first vector into the second vector through a
+ sequence of edits (inserts and deletes of one element each),
+ this sequence is short - or equivalently, if the ordered list
+ of elements that are untouched by these edits is long. For a
+ good introduction to the subject, read about the "Levenshtein
+ distance" in Wikipedia.
+
+ The basic algorithm is described in:
+ "An O(ND) Difference Algorithm and its Variations", Eugene Myers,
+ Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
+ see especially section 4.2, which describes the variation used below.
+
+ The basic algorithm was independently discovered as described in:
+ "Algorithms for Approximate String Matching", E. Ukkonen,
+ Information and Control Vol. 64, 1985, pp. 100-118.
+
+ Unless the 'find_minimal' flag is set, this code uses the TOO_EXPENSIVE
+ heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
+ at the price of producing suboptimal output for large inputs with
+ many differences. */
+
+/* Before including this file, you need to define:
+ ELEMENT The element type of the vectors being compared.
+ EQUAL A two-argument macro that tests two elements for
+ equality.
+ OFFSET A signed integer type sufficient to hold the
+ difference between two indices. Usually
+ something like ssize_t.
+ EXTRA_CONTEXT_FIELDS Declarations of fields for 'struct context'.
+ NOTE_DELETE(ctxt, xoff) Record the removal of the object xvec[xoff].
+ NOTE_INSERT(ctxt, yoff) Record the insertion of the object yvec[yoff].
+ EARLY_ABORT(ctxt) (Optional) A boolean expression that triggers an
+ early abort of the computation.
+ USE_HEURISTIC (Optional) Define if you want to support the
+ heuristic for large vectors.
+ It is also possible to use this file with abstract arrays. In this case,
+ xvec and yvec are not represented in memory. They only exist conceptually.
+ In this case, the list of defines above is amended as follows:
+ ELEMENT Undefined.
+ EQUAL Undefined.
+ XVECREF_YVECREF_EQUAL(ctxt, xoff, yoff)
+ A three-argument macro: References xvec[xoff] and
+ yvec[yoff] and tests these elements for equality.
+ Before including this file, you also need to include:
+ #include <limits.h>
+ #include <stdbool.h>
+ #include "minmax.h"
+ */
+
+/* Maximum value of type OFFSET. */
+#define OFFSET_MAX \
+ ((((OFFSET)1 << (sizeof (OFFSET) * CHAR_BIT - 2)) - 1) * 2 + 1)
+
+/* Default to no early abort. */
+#ifndef EARLY_ABORT
+# define EARLY_ABORT(ctxt) false
+#endif
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings.
+ Beware: The Code argument must not contain commas. */
+#ifndef IF_LINT
+# ifdef lint
+# define IF_LINT(Code) Code
+# else
+# define IF_LINT(Code) /* empty */
+# endif
+#endif
+
+/* As above, but when Code must contain one comma. */
+#ifndef IF_LINT2
+# ifdef lint
+# define IF_LINT2(Code1, Code2) Code1, Code2
+# else
+# define IF_LINT2(Code1, Code2) /* empty */
+# endif
+#endif
+
+/*
+ * Context of comparison operation.
+ */
+struct context
+{
+ #ifdef ELEMENT
+ /* Vectors being compared. */
+ ELEMENT const *xvec;
+ ELEMENT const *yvec;
+ #endif
+
+ /* Extra fields. */
+ EXTRA_CONTEXT_FIELDS
+
+ /* Vector, indexed by diagonal, containing 1 + the X coordinate of the point
+ furthest along the given diagonal in the forward search of the edit
+ matrix. */
+ OFFSET *fdiag;
+
+ /* Vector, indexed by diagonal, containing the X coordinate of the point
+ furthest along the given diagonal in the backward search of the edit
+ matrix. */
+ OFFSET *bdiag;
+
+ #ifdef USE_HEURISTIC
+ /* This corresponds to the diff -H flag. With this heuristic, for
+ vectors with a constant small density of changes, the algorithm is
+ linear in the vectors size. */
+ bool heuristic;
+ #endif
+
+ /* Edit scripts longer than this are too expensive to compute. */
+ OFFSET too_expensive;
+
+ /* Snakes bigger than this are considered `big'. */
+ #define SNAKE_LIMIT 20
+};
+
+struct partition
+{
+ /* Midpoints of this partition. */
+ OFFSET xmid;
+ OFFSET ymid;
+
+ /* True if low half will be analyzed minimally. */
+ bool lo_minimal;
+
+ /* Likewise for high half. */
+ bool hi_minimal;
+};
+
+
+/* Find the midpoint of the shortest edit script for a specified portion
+ of the two vectors.
+
+ Scan from the beginnings of the vectors, and simultaneously from the ends,
+ doing a breadth-first search through the space of edit-sequence.
+ When the two searches meet, we have found the midpoint of the shortest
+ edit sequence.
+
+ If FIND_MINIMAL is true, find the minimal edit script regardless of
+ expense. Otherwise, if the search is too expensive, use heuristics to
+ stop the search and report a suboptimal answer.
+
+ Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number
+ XMID - YMID equals the number of inserted elements minus the number
+ of deleted elements (counting only elements before the midpoint).
+
+ Set PART->lo_minimal to true iff the minimal edit script for the
+ left half of the partition is known; similarly for PART->hi_minimal.
+
+ This function assumes that the first elements of the specified portions
+ of the two vectors do not match, and likewise that the last elements do not
+ match. The caller must trim matching elements from the beginning and end
+ of the portions it is going to specify.
+
+ If we return the "wrong" partitions, the worst this can do is cause
+ suboptimal diff output. It cannot cause incorrect diff output. */
+
+static void
+diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, bool find_minimal,
+ struct partition *part, struct context *ctxt)
+{
+ OFFSET *const fd = ctxt->fdiag; /* Give the compiler a chance. */
+ OFFSET *const bd = ctxt->bdiag; /* Additional help for the compiler. */
+#ifdef ELEMENT
+ ELEMENT const *const xv = ctxt->xvec; /* Still more help for the compiler. */
+ ELEMENT const *const yv = ctxt->yvec; /* And more and more . . . */
+ #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y])
+#else
+ #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y)
+#endif
+ const OFFSET dmin = xoff - ylim; /* Minimum valid diagonal. */
+ const OFFSET dmax = xlim - yoff; /* Maximum valid diagonal. */
+ const OFFSET fmid = xoff - yoff; /* Center diagonal of top-down search. */
+ const OFFSET bmid = xlim - ylim; /* Center diagonal of bottom-up search. */
+ OFFSET fmin = fmid;
+ OFFSET fmax = fmid; /* Limits of top-down search. */
+ OFFSET bmin = bmid;
+ OFFSET bmax = bmid; /* Limits of bottom-up search. */
+ OFFSET c; /* Cost. */
+ bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd
+ diagonal with respect to the northwest. */
+
+ fd[fmid] = xoff;
+ bd[bmid] = xlim;
+
+ for (c = 1;; ++c)
+ {
+ OFFSET d; /* Active diagonal. */
+ bool big_snake = false;
+
+ /* Extend the top-down search by an edit step in each diagonal. */
+ if (fmin > dmin)
+ fd[--fmin - 1] = -1;
+ else
+ ++fmin;
+ if (fmax < dmax)
+ fd[++fmax + 1] = -1;
+ else
+ --fmax;
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET x;
+ OFFSET y;
+ OFFSET tlo = fd[d - 1];
+ OFFSET thi = fd[d + 1];
+ OFFSET x0 = tlo < thi ? thi : tlo + 1;
+
+ for (x = x0, y = x0 - d;
+ x < xlim && y < ylim && XREF_YREF_EQUAL (x, y);
+ x++, y++)
+ continue;
+ if (x - x0 > SNAKE_LIMIT)
+ big_snake = true;
+ fd[d] = x;
+ if (odd && bmin <= d && d <= bmax && bd[d] <= x)
+ {
+ part->xmid = x;
+ part->ymid = y;
+ part->lo_minimal = part->hi_minimal = true;
+ return;
+ }
+ }
+
+ /* Similarly extend the bottom-up search. */
+ if (bmin > dmin)
+ bd[--bmin - 1] = OFFSET_MAX;
+ else
+ ++bmin;
+ if (bmax < dmax)
+ bd[++bmax + 1] = OFFSET_MAX;
+ else
+ --bmax;
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET x;
+ OFFSET y;
+ OFFSET tlo = bd[d - 1];
+ OFFSET thi = bd[d + 1];
+ OFFSET x0 = tlo < thi ? tlo : thi - 1;
+
+ for (x = x0, y = x0 - d;
+ xoff < x && yoff < y && XREF_YREF_EQUAL (x - 1, y - 1);
+ x--, y--)
+ continue;
+ if (x0 - x > SNAKE_LIMIT)
+ big_snake = true;
+ bd[d] = x;
+ if (!odd && fmin <= d && d <= fmax && x <= fd[d])
+ {
+ part->xmid = x;
+ part->ymid = y;
+ part->lo_minimal = part->hi_minimal = true;
+ return;
+ }
+ }
+
+ if (find_minimal)
+ continue;
+
+#ifdef USE_HEURISTIC
+ /* Heuristic: check occasionally for a diagonal that has made lots
+ of progress compared with the edit distance. If we have any
+ such, find the one that has made the most progress and return it
+ as if it had succeeded.
+
+ With this heuristic, for vectors with a constant small density
+ of changes, the algorithm is linear in the vector size. */
+
+ if (200 < c && big_snake && ctxt->heuristic)
+ {
+ {
+ OFFSET best = 0;
+
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET dd = d - fmid;
+ OFFSET x = fd[d];
+ OFFSET y = x - d;
+ OFFSET v = (x - xoff) * 2 - dd;
+
+ if (v > 12 * (c + (dd < 0 ? -dd : dd)))
+ {
+ if (v > best
+ && xoff + SNAKE_LIMIT <= x && x < xlim
+ && yoff + SNAKE_LIMIT <= y && y < ylim)
+ {
+ /* We have a good enough best diagonal; now insist
+ that it end with a significant snake. */
+ int k;
+
+ for (k = 1; XREF_YREF_EQUAL (x - k, y - k); k++)
+ if (k == SNAKE_LIMIT)
+ {
+ best = v;
+ part->xmid = x;
+ part->ymid = y;
+ break;
+ }
+ }
+ }
+ }
+ if (best > 0)
+ {
+ part->lo_minimal = true;
+ part->hi_minimal = false;
+ return;
+ }
+ }
+
+ {
+ OFFSET best = 0;
+
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET dd = d - bmid;
+ OFFSET x = bd[d];
+ OFFSET y = x - d;
+ OFFSET v = (xlim - x) * 2 + dd;
+
+ if (v > 12 * (c + (dd < 0 ? -dd : dd)))
+ {
+ if (v > best
+ && xoff < x && x <= xlim - SNAKE_LIMIT
+ && yoff < y && y <= ylim - SNAKE_LIMIT)
+ {
+ /* We have a good enough best diagonal; now insist
+ that it end with a significant snake. */
+ int k;
+
+ for (k = 0; XREF_YREF_EQUAL (x + k, y + k); k++)
+ if (k == SNAKE_LIMIT - 1)
+ {
+ best = v;
+ part->xmid = x;
+ part->ymid = y;
+ break;
+ }
+ }
+ }
+ }
+ if (best > 0)
+ {
+ part->lo_minimal = false;
+ part->hi_minimal = true;
+ return;
+ }
+ }
+ }
+#endif /* USE_HEURISTIC */
+
+ /* Heuristic: if we've gone well beyond the call of duty, give up
+ and report halfway between our best results so far. */
+ if (c >= ctxt->too_expensive)
+ {
+ OFFSET fxybest;
+ OFFSET fxbest IF_LINT (= 0);
+ OFFSET bxybest;
+ OFFSET bxbest IF_LINT (= 0);
+
+ /* Find forward diagonal that maximizes X + Y. */
+ fxybest = -1;
+ for (d = fmax; d >= fmin; d -= 2)
+ {
+ OFFSET x = MIN (fd[d], xlim);
+ OFFSET y = x - d;
+ if (ylim < y)
+ {
+ x = ylim + d;
+ y = ylim;
+ }
+ if (fxybest < x + y)
+ {
+ fxybest = x + y;
+ fxbest = x;
+ }
+ }
+
+ /* Find backward diagonal that minimizes X + Y. */
+ bxybest = OFFSET_MAX;
+ for (d = bmax; d >= bmin; d -= 2)
+ {
+ OFFSET x = MAX (xoff, bd[d]);
+ OFFSET y = x - d;
+ if (y < yoff)
+ {
+ x = yoff + d;
+ y = yoff;
+ }
+ if (x + y < bxybest)
+ {
+ bxybest = x + y;
+ bxbest = x;
+ }
+ }
+
+ /* Use the better of the two diagonals. */
+ if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff))
+ {
+ part->xmid = fxbest;
+ part->ymid = fxybest - fxbest;
+ part->lo_minimal = true;
+ part->hi_minimal = false;
+ }
+ else
+ {
+ part->xmid = bxbest;
+ part->ymid = bxybest - bxbest;
+ part->lo_minimal = false;
+ part->hi_minimal = true;
+ }
+ return;
+ }
+ }
+ #undef XREF_YREF_EQUAL
+}
+
+
+/* Compare in detail contiguous subsequences of the two vectors
+ which are known, as a whole, to match each other.
+
+ The subsequence of vector 0 is [XOFF, XLIM) and likewise for vector 1.
+
+ Note that XLIM, YLIM are exclusive bounds. All indices into the vectors
+ are origin-0.
+
+ If FIND_MINIMAL, find a minimal difference no matter how
+ expensive it is.
+
+ The results are recorded by invoking NOTE_DELETE and NOTE_INSERT.
+
+ Return false if terminated normally, or true if terminated through early
+ abort. */
+
+static bool
+compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
+ bool find_minimal, struct context *ctxt)
+{
+#ifdef ELEMENT
+ ELEMENT const *xv = ctxt->xvec; /* Help the compiler. */
+ ELEMENT const *yv = ctxt->yvec;
+ #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y])
+#else
+ #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y)
+#endif
+
+ /* Slide down the bottom initial diagonal. */
+ while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
+ {
+ xoff++;
+ yoff++;
+ }
+
+ /* Slide up the top initial diagonal. */
+ while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
+ {
+ xlim--;
+ ylim--;
+ }
+
+ /* Handle simple cases. */
+ if (xoff == xlim)
+ while (yoff < ylim)
+ {
+ NOTE_INSERT (ctxt, yoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ yoff++;
+ }
+ else if (yoff == ylim)
+ while (xoff < xlim)
+ {
+ NOTE_DELETE (ctxt, xoff);
+ if (EARLY_ABORT (ctxt))
+ return true;
+ xoff++;
+ }
+ else
+ {
+ struct partition part IF_LINT2 (= { .xmid = 0, .ymid = 0 });
+
+ /* Find a point of correspondence in the middle of the vectors. */
+ diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
+
+ /* Use the partitions to split this problem into subproblems. */
+ if (compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal, ctxt))
+ return true;
+ if (compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal, ctxt))
+ return true;
+ }
+
+ return false;
+ #undef XREF_YREF_EQUAL
+}
+
+#undef ELEMENT
+#undef EQUAL
+#undef OFFSET
+#undef EXTRA_CONTEXT_FIELDS
+#undef NOTE_DELETE
+#undef NOTE_INSERT
+#undef EARLY_ABORT
+#undef USE_HEURISTIC
+#undef XVECREF_YVECREF_EQUAL
+#undef OFFSET_MAX
diff --git a/gnulib/lib/dirchownmod.c b/gnulib/lib/dirchownmod.c
new file mode 100644
index 0000000..15b59e2
--- /dev/null
+++ b/gnulib/lib/dirchownmod.c
@@ -0,0 +1,141 @@
+/* Change the ownership and mode bits of a directory.
+
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "dirchownmod.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "stat-macros.h"
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD 0
+# undef fchmod
+# define fchmod(fd, mode) (-1)
+#endif
+
+/* Change the ownership and mode bits of a directory. If FD is
+ nonnegative, it should be a file descriptor associated with the
+ directory; close it before returning. DIR is the name of the
+ directory.
+
+ If MKDIR_MODE is not (mode_t) -1, mkdir (DIR, MKDIR_MODE) has just
+ been executed successfully with umask zero, so DIR should be a
+ directory (not a symbolic link).
+
+ First, set the file's owner to OWNER and group to GROUP, but leave
+ the owner alone if OWNER is (uid_t) -1, and similarly for GROUP.
+
+ Then, set the file's mode bits to MODE, except preserve any of the
+ bits that correspond to zero bits in MODE_BITS. In other words,
+ MODE_BITS is a mask that specifies which of the file's mode bits
+ should be set or cleared. MODE should be a subset of MODE_BITS,
+ which in turn should be a subset of CHMOD_MODE_BITS.
+
+ This implementation assumes the current umask is zero.
+
+ Return 0 if successful, -1 (setting errno) otherwise. Unsuccessful
+ calls may do the chown but not the chmod. */
+
+int
+dirchownmod (int fd, char const *dir, mode_t mkdir_mode,
+ uid_t owner, gid_t group,
+ mode_t mode, mode_t mode_bits)
+{
+ struct stat st;
+ int result = (fd < 0 ? stat (dir, &st) : fstat (fd, &st));
+
+ if (result == 0)
+ {
+ mode_t dir_mode = st.st_mode;
+
+ /* Check whether DIR is a directory. If FD is nonnegative, this
+ check avoids changing the ownership and mode bits of the
+ wrong file in many cases. This doesn't fix all the race
+ conditions, but it is better than nothing. */
+ if (! S_ISDIR (dir_mode))
+ {
+ errno = ENOTDIR;
+ result = -1;
+ }
+ else
+ {
+ /* If at least one of the S_IXUGO bits are set, chown might
+ clear the S_ISUID and S_SGID bits. Keep track of any
+ file mode bits whose values are indeterminate due to this
+ issue. */
+ mode_t indeterminate = 0;
+
+ /* On some systems, chown clears S_ISUID and S_ISGID, so do
+ chown before chmod. On older System V hosts, ordinary
+ users can give their files away via chown; don't worry
+ about that here, since users shouldn't do that. */
+
+ if ((owner != (uid_t) -1 && owner != st.st_uid)
+ || (group != (gid_t) -1 && group != st.st_gid))
+ {
+ result = (0 <= fd
+ ? fchown (fd, owner, group)
+ : mkdir_mode != (mode_t) -1
+ ? lchown (dir, owner, group)
+ : chown (dir, owner, group));
+
+ /* Either the user cares about an indeterminate bit and
+ it'll be set properly by chmod below, or the user
+ doesn't care and it's OK to use the bit's pre-chown
+ value. So there's no need to re-stat DIR here. */
+
+ if (result == 0 && (dir_mode & S_IXUGO))
+ indeterminate = dir_mode & (S_ISUID | S_ISGID);
+ }
+
+ /* If the file mode bits might not be right, use chmod to
+ change them. Don't change bits the user doesn't care
+ about. */
+ if (result == 0 && (((dir_mode ^ mode) | indeterminate) & mode_bits))
+ {
+ mode_t chmod_mode =
+ mode | (dir_mode & CHMOD_MODE_BITS & ~mode_bits);
+ result = (HAVE_FCHMOD && 0 <= fd
+ ? fchmod (fd, chmod_mode)
+ : mkdir_mode != (mode_t) -1
+ ? lchmod (dir, chmod_mode)
+ : chmod (dir, chmod_mode));
+ }
+ }
+ }
+
+ if (0 <= fd)
+ {
+ if (result == 0)
+ result = close (fd);
+ else
+ {
+ int e = errno;
+ close (fd);
+ errno = e;
+ }
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/dirchownmod.h b/gnulib/lib/dirchownmod.h
new file mode 100644
index 0000000..3f07748
--- /dev/null
+++ b/gnulib/lib/dirchownmod.h
@@ -0,0 +1,2 @@
+#include <sys/types.h>
+int dirchownmod (int, char const *, mode_t, uid_t, gid_t, mode_t, mode_t);
diff --git a/gnulib/lib/dirent--.h b/gnulib/lib/dirent--.h
new file mode 100644
index 0000000..bb20132
--- /dev/null
+++ b/gnulib/lib/dirent--.h
@@ -0,0 +1,23 @@
+/* Like dirent.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include "dirent-safer.h"
+
+#undef opendir
+#define opendir opendir_safer
diff --git a/gnulib/lib/dirent-private.h b/gnulib/lib/dirent-private.h
new file mode 100644
index 0000000..74632ff
--- /dev/null
+++ b/gnulib/lib/dirent-private.h
@@ -0,0 +1,40 @@
+/* Private details of the DIR type.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _DIRENT_PRIVATE_H
+#define _DIRENT_PRIVATE_H 1
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+struct gl_directory
+{
+ /* Status, or error code to produce in next readdir() call.
+ -2 means the end of the directory is already reached,
+ -1 means the entry was already filled by FindFirstFile,
+ 0 means the entry needs to be filled using FindNextFile.
+ A positive value is an error code. */
+ int status;
+ /* Handle, reading the directory, at current position. */
+ HANDLE current;
+ /* Found directory entry. */
+ WIN32_FIND_DATA entry;
+ /* Argument to pass to FindFirstFile. It consists of the absolutized
+ directory name, followed by a directory separator and the wildcards. */
+ char dir_name_mask[1];
+};
+
+#endif /* _DIRENT_PRIVATE_H */
diff --git a/gnulib/lib/dirent-safer.h b/gnulib/lib/dirent-safer.h
new file mode 100644
index 0000000..1a0499e
--- /dev/null
+++ b/gnulib/lib/dirent-safer.h
@@ -0,0 +1,22 @@
+/* Invoke dirent-like functions, but avoid some glitches.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <dirent.h>
+
+DIR *opendir_safer (const char *name);
diff --git a/gnulib/lib/dirent.in.h b/gnulib/lib/dirent.in.h
new file mode 100644
index 0000000..cbcf841
--- /dev/null
+++ b/gnulib/lib/dirent.in.h
@@ -0,0 +1,249 @@
+/* A GNU-like <dirent.h>.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_DIRENT_H@
+# @INCLUDE_NEXT@ @NEXT_DIRENT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+#define _@GUARD_PREFIX@_DIRENT_H
+
+/* Get ino_t. Needed on some systems, including glibc 2.8. */
+#include <sys/types.h>
+
+#if !@HAVE_DIRENT_H@
+/* Define types DIR and 'struct dirent'. */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+ char d_type;
+ char d_name[1];
+};
+/* Possible values for 'd_type'. */
+# define DT_UNKNOWN 0
+# define DT_FIFO 1 /* FIFO */
+# define DT_CHR 2 /* character device */
+# define DT_DIR 4 /* directory */
+# define DT_BLK 6 /* block device */
+# define DT_REG 8 /* regular file */
+# define DT_LNK 10 /* symbolic link */
+# define DT_SOCK 12 /* socket */
+# define DT_WHT 14 /* whiteout */
+typedef struct gl_directory DIR;
+# define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_OPENDIR@
+# if @REPLACE_OPENDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef opendir
+# define opendir rpl_opendir
+# endif
+_GL_FUNCDECL_RPL (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+# if !@HAVE_OPENDIR@
+_GL_FUNCDECL_SYS (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#elif defined GNULIB_POSIXCHECK
+# undef opendir
+# if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+ "use gnulib module opendir for portability");
+# endif
+#endif
+
+#if @GNULIB_READDIR@
+# if !@HAVE_READDIR@
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+ "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if @GNULIB_REWINDDIR@
+# if !@HAVE_REWINDDIR@
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+ "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if @GNULIB_CLOSEDIR@
+# if @REPLACE_CLOSEDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef closedir
+# define closedir rpl_closedir
+# endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+# if !@HAVE_CLOSEDIR@
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+ "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if @GNULIB_DIRFD@
+/* Return the file descriptor associated with the given directory stream,
+ or -1 if none exists. */
+# if @REPLACE_DIRFD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dirfd
+# define dirfd rpl_dirfd
+# endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+ /* dirfd is defined as a macro and not as a function.
+ Turn it into a function and get rid of the macro. */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+# undef dirfd
+# endif
+# if !(@HAVE_DECL_DIRFD@ || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+ "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if @GNULIB_FDOPENDIR@
+/* Open a directory stream visiting the given directory file
+ descriptor. Return NULL and set errno if fd is not visiting a
+ directory. On success, this function consumes fd (it will be
+ implicitly closed either by this function or by a subsequent
+ closedir). */
+# if @REPLACE_FDOPENDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopendir
+# define fdopendir rpl_fdopendir
+# endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+# if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@
+_GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopendir
+# if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+ "use gnulib module fdopendir for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANDIR@
+/* Scan the directory DIR, calling FILTER on each directory entry.
+ Entries for which FILTER returns nonzero are individually malloc'd,
+ sorted using qsort with CMP, and collected in a malloc'd array in
+ *NAMELIST. Returns the number of entries selected, or -1 on error. */
+# if !@HAVE_SCANDIR@
+_GL_FUNCDECL_SYS (scandir, int,
+ (const char *dir, struct dirent ***namelist,
+ int (*filter) (const struct dirent *),
+ int (*cmp) (const struct dirent **, const struct dirent **))
+ _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+ int (*cmp) (const void *, const void *). */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+ (const char *dir, struct dirent ***namelist,
+ int (*filter) (const struct dirent *),
+ int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+ "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if @GNULIB_ALPHASORT@
+/* Compare two 'struct dirent' entries alphabetically. */
+# if !@HAVE_ALPHASORT@
+_GL_FUNCDECL_SYS (alphasort, int,
+ (const struct dirent **, const struct dirent **)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+ (const void *, const void *). */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+ (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+ "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
diff --git a/gnulib/lib/dirfd.c b/gnulib/lib/dirfd.c
new file mode 100644
index 0000000..5f1a70e
--- /dev/null
+++ b/gnulib/lib/dirfd.c
@@ -0,0 +1,32 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+ Copyright (C) 2001, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <errno.h>
+
+int
+dirfd (DIR *dir_p)
+{
+ int fd = DIR_TO_FD (dir_p);
+ if (fd == -1)
+ errno = ENOTSUP;
+ return fd;
+}
diff --git a/gnulib/lib/dirname-lgpl.c b/gnulib/lib/dirname-lgpl.c
new file mode 100644
index 0000000..f5b0c0f
--- /dev/null
+++ b/gnulib/lib/dirname-lgpl.c
@@ -0,0 +1,86 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Return the length of the prefix of FILE that will be used by
+ dir_name. If FILE is in the working directory, this returns zero
+ even though `dir_name (FILE)' will return ".". Works properly even
+ if there are trailing slashes (by effectively ignoring them). */
+
+size_t
+dir_len (char const *file)
+{
+ size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
+ size_t length;
+
+ /* Advance prefix_length beyond important leading slashes. */
+ prefix_length += (prefix_length != 0
+ ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && ISSLASH (file[prefix_length]))
+ : (ISSLASH (file[0])
+ ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT
+ && ISSLASH (file[1]) && ! ISSLASH (file[2])
+ ? 2 : 1))
+ : 0));
+
+ /* Strip the basename and any redundant slashes before it. */
+ for (length = last_component (file) - file;
+ prefix_length < length; length--)
+ if (! ISSLASH (file[length - 1]))
+ break;
+ return length;
+}
+
+
+/* In general, we can't use the builtin `dirname' function if available,
+ since it has different meanings in different environments.
+ In some environments the builtin `dirname' modifies its argument.
+
+ Return the leading directories part of FILE, allocated with malloc.
+ Works properly even if there are trailing slashes (by effectively
+ ignoring them). Return NULL on failure.
+
+ If lstat (FILE) would succeed, then { chdir (dir_name (FILE));
+ lstat (base_name (FILE)); } will access the same file. Likewise,
+ if the sequence { chdir (dir_name (FILE));
+ rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE
+ to "foo" in the same directory FILE was in. */
+
+char *
+mdir_name (char const *file)
+{
+ size_t length = dir_len (file);
+ bool append_dot = (length == 0
+ || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && length == FILE_SYSTEM_PREFIX_LEN (file)
+ && file[2] != '\0' && ! ISSLASH (file[2])));
+ char *dir = malloc (length + append_dot + 1);
+ if (!dir)
+ return NULL;
+ memcpy (dir, file, length);
+ if (append_dot)
+ dir[length++] = '.';
+ dir[length] = '\0';
+ return dir;
+}
diff --git a/gnulib/lib/dirname.c b/gnulib/lib/dirname.c
new file mode 100644
index 0000000..411ded3
--- /dev/null
+++ b/gnulib/lib/dirname.c
@@ -0,0 +1,38 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include "xalloc.h"
+
+/* Just like mdir_name (dirname-lgpl.c), except, rather than
+ returning NULL upon malloc failure, here, we report the
+ "memory exhausted" condition and exit. */
+
+char *
+dir_name (char const *file)
+{
+ char *result = mdir_name (file);
+ if (!result)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/dirname.h b/gnulib/lib/dirname.h
new file mode 100644
index 0000000..ba9c56e
--- /dev/null
+++ b/gnulib/lib/dirname.h
@@ -0,0 +1,46 @@
+/* Take file names apart into directory and base names.
+
+ Copyright (C) 1998, 2001, 2003-2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef DIRNAME_H_
+# define DIRNAME_H_ 1
+
+# include <stdbool.h>
+# include <stddef.h>
+# include "dosname.h"
+
+# ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+# endif
+
+# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+# endif
+
+# if GNULIB_DIRNAME
+char *base_name (char const *file);
+char *dir_name (char const *file);
+# endif
+
+char *mdir_name (char const *file);
+size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
+size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
+char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
+
+bool strip_trailing_slashes (char *file);
+
+#endif /* not DIRNAME_H_ */
diff --git a/gnulib/lib/dosname.h b/gnulib/lib/dosname.h
new file mode 100644
index 0000000..acdd03b
--- /dev/null
+++ b/gnulib/lib/dosname.h
@@ -0,0 +1,53 @@
+/* File names on MS-DOS/Windows systems.
+
+ Copyright (C) 2000-2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ From Paul Eggert and Jim Meyering. */
+
+#ifndef _DOSNAME_H
+#define _DOSNAME_H
+
+#if (defined _WIN32 || defined __WIN32__ || \
+ defined __MSDOS__ || defined __CYGWIN__ || \
+ defined __EMX__ || defined __DJGPP__)
+ /* This internal macro assumes ASCII, but all hosts that support drive
+ letters use ASCII. */
+# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a' \
+ <= 'z' - 'a')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) \
+ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
+# ifndef __CYGWIN__
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
+# endif
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+#endif
+
+#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
+# else
+# define IS_ABSOLUTE_FILE_NAME(F) \
+ (ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
+#endif
+#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
+
+#endif /* DOSNAME_H_ */
diff --git a/gnulib/lib/dprintf.c b/gnulib/lib/dprintf.c
new file mode 100644
index 0000000..c58dd06
--- /dev/null
+++ b/gnulib/lib/dprintf.c
@@ -0,0 +1,70 @@
+/* Formatted output to a file descriptor.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "full-write.h"
+#include "vasnprintf.h"
+
+int
+dprintf (int fd, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (full_write (fd, output, len) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/dtoastr.c b/gnulib/lib/dtoastr.c
new file mode 100644
index 0000000..aed181d
--- /dev/null
+++ b/gnulib/lib/dtoastr.c
@@ -0,0 +1,2 @@
+#define LENGTH 2
+#include "ftoastr.c"
diff --git a/gnulib/lib/dtotimespec.c b/gnulib/lib/dtotimespec.c
new file mode 100644
index 0000000..ea0470a
--- /dev/null
+++ b/gnulib/lib/dtotimespec.c
@@ -0,0 +1,69 @@
+/* Convert double to timespec.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert */
+
+/* Convert the double value SEC to a struct timespec. Round toward
+ positive infinity. On overflow, return an extremal value. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include "intprops.h"
+
+struct timespec
+dtotimespec (double sec)
+{
+ enum { BILLION = 1000 * 1000 * 1000 };
+ double min_representable = TYPE_MINIMUM (time_t);
+ double max_representable =
+ ((TYPE_MAXIMUM (time_t) * (double) BILLION + (BILLION - 1))
+ / BILLION);
+ struct timespec r;
+
+ if (! (min_representable < sec))
+ {
+ r.tv_sec = TYPE_MINIMUM (time_t);
+ r.tv_nsec = 0;
+ }
+ else if (! (sec < max_representable))
+ {
+ r.tv_sec = TYPE_MAXIMUM (time_t);
+ r.tv_nsec = BILLION - 1;
+ }
+ else
+ {
+ time_t s = sec;
+ double frac = BILLION * (sec - s);
+ long ns = frac;
+ ns += ns < frac;
+ s += ns / BILLION;
+ ns %= BILLION;
+
+ if (ns < 0)
+ {
+ s--;
+ ns += BILLION;
+ }
+
+ r.tv_sec = s;
+ r.tv_nsec = ns;
+ }
+
+ return r;
+}
diff --git a/gnulib/lib/dummy.c b/gnulib/lib/dummy.c
new file mode 100644
index 0000000..c958ea0
--- /dev/null
+++ b/gnulib/lib/dummy.c
@@ -0,0 +1,42 @@
+/* A dummy file, to prevent empty libraries from breaking builds.
+ Copyright (C) 2004, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Some systems, reportedly OpenBSD and Mac OS X, refuse to create
+ libraries without any object files. You might get an error like:
+
+ > ar cru .libs/libgl.a
+ > ar: no archive members specified
+
+ Compiling this file, and adding its object file to the library, will
+ prevent the library from being empty. */
+
+/* Some systems, such as Solaris with cc 5.0, refuse to work with libraries
+ that don't export any symbol. You might get an error like:
+
+ > cc ... libgnu.a
+ > ild: (bad file) garbled symbol table in archive ../gllib/libgnu.a
+
+ Compiling this file, and adding its object file to the library, will
+ prevent the library from exporting no symbols. */
+
+#ifdef __sun
+/* This declaration ensures that the library will export at least 1 symbol. */
+int gl_dummy_symbol;
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+#endif
diff --git a/gnulib/lib/dup-safer-flag.c b/gnulib/lib/dup-safer-flag.c
new file mode 100644
index 0000000..e922b91
--- /dev/null
+++ b/gnulib/lib/dup-safer-flag.c
@@ -0,0 +1,40 @@
+/* Duplicate a file descriptor result, avoiding clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "cloexec.h"
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. If FLAG contains O_CLOEXEC, behave like
+ fcntl(F_DUPFD_CLOEXEC) rather than fcntl(F_DUPFD). */
+
+int
+dup_safer_flag (int fd, int flag)
+{
+ return fcntl (fd, (flag & O_CLOEXEC) ? F_DUPFD_CLOEXEC : F_DUPFD,
+ STDERR_FILENO + 1);
+}
diff --git a/gnulib/lib/dup-safer.c b/gnulib/lib/dup-safer.c
new file mode 100644
index 0000000..5441b96
--- /dev/null
+++ b/gnulib/lib/dup-safer.c
@@ -0,0 +1,34 @@
+/* Invoke dup, but avoid some glitches.
+
+ Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+dup_safer (int fd)
+{
+ return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
+}
diff --git a/gnulib/lib/dup.c b/gnulib/lib/dup.c
new file mode 100644
index 0000000..4a75a0c
--- /dev/null
+++ b/gnulib/lib/dup.c
@@ -0,0 +1,61 @@
+/* Duplicate an open file descriptor.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#include "msvc-inval.h"
+
+#undef dup
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline int
+dup_nothrow (int fd)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = dup (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#else
+# define dup_nothrow dup
+#endif
+
+int
+rpl_dup (int fd)
+{
+ int result = dup_nothrow (fd);
+#if REPLACE_FCHDIR
+ if (result >= 0)
+ result = _gl_register_dup (fd, result);
+#endif
+ return result;
+}
diff --git a/gnulib/lib/dup2.c b/gnulib/lib/dup2.c
new file mode 100644
index 0000000..790c98a
--- /dev/null
+++ b/gnulib/lib/dup2.c
@@ -0,0 +1,157 @@
+/* Duplicate an open file descriptor to a specified file descriptor.
+
+ Copyright (C) 1999, 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#if HAVE_DUP2
+
+# undef dup2
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include "msvc-inval.h"
+
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+
+static int
+ms_windows_dup2 (int fd, int desired_fd)
+{
+ int result;
+
+ /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open,
+ dup2 (fd, fd) returns 0, but all further attempts to use fd in
+ future dup2 calls will hang. */
+ if (fd == desired_fd)
+ {
+ if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ return fd;
+ }
+
+ /* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
+ http://bugs.winehq.org/show_bug.cgi?id=21289 */
+ if (desired_fd < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ TRY_MSVC_INVAL
+ {
+ result = dup2 (fd, desired_fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ errno = EBADF;
+ result = -1;
+ }
+ DONE_MSVC_INVAL;
+
+ if (result == 0)
+ result = desired_fd;
+
+ return result;
+}
+
+# define dup2 ms_windows_dup2
+
+# endif
+
+int
+rpl_dup2 (int fd, int desired_fd)
+{
+ int result;
+
+# ifdef F_GETFL
+ /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
+ On Cygwin 1.5.x, dup2 (1, 1) returns 0.
+ On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */
+ if (fd == desired_fd)
+ return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
+# endif
+
+ result = dup2 (fd, desired_fd);
+
+ /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */
+ if (result == -1 && errno == EMFILE)
+ errno = EBADF;
+# if REPLACE_FCHDIR
+ if (fd != desired_fd && result != -1)
+ result = _gl_register_dup (fd, result);
+# endif
+ return result;
+}
+
+#else /* !HAVE_DUP2 */
+
+/* On older platforms, dup2 did not exist. */
+
+# ifndef F_DUPFD
+static int
+dupfd (int fd, int desired_fd)
+{
+ int duplicated_fd = dup (fd);
+ if (duplicated_fd < 0 || duplicated_fd == desired_fd)
+ return duplicated_fd;
+ else
+ {
+ int r = dupfd (fd, desired_fd);
+ int e = errno;
+ close (duplicated_fd);
+ errno = e;
+ return r;
+ }
+}
+# endif
+
+int
+dup2 (int fd, int desired_fd)
+{
+ int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd;
+ if (result == -1 || fd == desired_fd)
+ return result;
+ close (desired_fd);
+# ifdef F_DUPFD
+ result = fcntl (fd, F_DUPFD, desired_fd);
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+# else
+ result = dupfd (fd, desired_fd);
+# endif
+ if (result == -1 && (errno == EMFILE || errno == EINVAL))
+ errno = EBADF;
+ return result;
+}
+#endif /* !HAVE_DUP2 */
diff --git a/gnulib/lib/dup3.c b/gnulib/lib/dup3.c
new file mode 100644
index 0000000..7525142
--- /dev/null
+++ b/gnulib/lib/dup3.c
@@ -0,0 +1,102 @@
+/* Copy a file descriptor, applying specific flags.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "binary-io.h"
+
+int
+dup3 (int oldfd, int newfd, int flags)
+{
+#if HAVE_DUP3
+# undef dup3
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_dup3_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_dup3_really >= 0)
+ {
+ int result = dup3 (oldfd, newfd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_dup3_really = 1;
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (oldfd, newfd);
+# endif
+ return result;
+ }
+ have_dup3_really = -1;
+ }
+ }
+#endif
+
+ if (newfd < 0 || newfd >= getdtablesize () || fcntl (oldfd, F_GETFD) == -1)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (newfd == oldfd)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Check the supported flags.
+ Note that O_NONBLOCK is not supported, because setting it on newfd
+ would implicitly also set it on oldfd. */
+ if ((flags & ~(O_CLOEXEC | O_BINARY | O_TEXT)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (flags & O_CLOEXEC)
+ {
+ int result;
+ close (newfd);
+ result = fcntl (oldfd, F_DUPFD_CLOEXEC, newfd);
+ if (newfd < result)
+ {
+ close (result);
+ errno = EIO;
+ result = -1;
+ }
+ if (result < 0)
+ return -1;
+ }
+ else if (dup2 (oldfd, newfd) < 0)
+ return -1;
+
+#if O_BINARY
+ if (flags & O_BINARY)
+ setmode (newfd, O_BINARY);
+ else if (flags & O_TEXT)
+ setmode (newfd, O_TEXT);
+#endif
+
+ return newfd;
+}
diff --git a/gnulib/lib/duplocale.c b/gnulib/lib/duplocale.c
new file mode 100644
index 0000000..dc28243
--- /dev/null
+++ b/gnulib/lib/duplocale.c
@@ -0,0 +1,102 @@
+/* Duplicate a locale object.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#include <locale.h>
+
+#include <errno.h>
+#include <string.h>
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+#undef duplocale
+
+locale_t
+rpl_duplocale (locale_t locale)
+{
+ /* Work around crash in the duplocale function in glibc < 2.12.
+ See <http://sourceware.org/bugzilla/show_bug.cgi?id=10969>.
+ Also, on AIX 7.1, duplocale(LC_GLOBAL_LOCALE) returns (locale_t)0 with
+ errno set to EINVAL. */
+ if (locale == LC_GLOBAL_LOCALE)
+ {
+ /* Create a copy of the locale by fetching the name of each locale
+ category, starting with LC_CTYPE. */
+ static struct { int cat; int mask; } const categories[] =
+ {
+ { LC_NUMERIC, LC_NUMERIC_MASK },
+ { LC_TIME, LC_TIME_MASK },
+ { LC_COLLATE, LC_COLLATE_MASK },
+ { LC_MONETARY, LC_MONETARY_MASK },
+ { LC_MESSAGES, LC_MESSAGES_MASK }
+#ifdef LC_PAPER
+ , { LC_PAPER, LC_PAPER_MASK }
+#endif
+#ifdef LC_NAME
+ , { LC_NAME, LC_NAME_MASK }
+#endif
+#ifdef LC_ADDRESS
+ , { LC_ADDRESS, LC_ADDRESS_MASK }
+#endif
+#ifdef LC_TELEPHONE
+ , { LC_TELEPHONE, LC_TELEPHONE_MASK }
+#endif
+#ifdef LC_MEASUREMENT
+ , { LC_MEASUREMENT, LC_MEASUREMENT_MASK }
+#endif
+#ifdef LC_IDENTIFICATION
+ , { LC_IDENTIFICATION, LC_IDENTIFICATION_MASK }
+#endif
+ };
+ const char *base_name;
+ locale_t base_copy;
+ unsigned int i;
+
+ base_name = setlocale (LC_CTYPE, NULL);
+ base_copy = newlocale (LC_ALL_MASK, base_name, NULL);
+ if (base_copy == NULL)
+ return NULL;
+
+ for (i = 0; i < SIZEOF (categories); i++)
+ {
+ int category = categories[i].cat;
+ int category_mask = categories[i].mask;
+ const char *name = setlocale (category, NULL);
+ if (strcmp (name, base_name) != 0)
+ {
+ locale_t copy = newlocale (category_mask, name, base_copy);
+ if (copy == NULL)
+ {
+ int saved_errno = errno;
+ freelocale (base_copy);
+ errno = saved_errno;
+ return NULL;
+ }
+ /* No need to call freelocale (base_copy) if copy != base_copy;
+ the newlocale function already takes care of doing it. */
+ base_copy = copy;
+ }
+ }
+
+ return base_copy;
+ }
+
+ return duplocale (locale);
+}
diff --git a/gnulib/lib/eealloc.h b/gnulib/lib/eealloc.h
new file mode 100644
index 0000000..7249ac7
--- /dev/null
+++ b/gnulib/lib/eealloc.h
@@ -0,0 +1,79 @@
+/* Memory allocation with expensive empty allocations.
+ Copyright (C) 2003, 2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003,
+ based on prior work by Jim Meyering.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _EEALLOC_H
+#define _EEALLOC_H
+
+/* malloc() and realloc() are allowed to return NULL when asked to allocate
+ a memory block of 0 bytes; this is not an out-of-memory condition.
+ (See ISO C 99 section 7.20.3.) In some places, this is not welcome,
+ because it requires extra checking (so as not to confuse a zero-sized
+ allocation with an out-of-memory condition). This file provides
+ malloc()/realloc() workalikes which return non-NULL pointers for
+ succeeding zero-sized allocations. GNU libc already defines malloc()
+ and realloc() this way; on such platforms the workalikes are aliased
+ to the original malloc()/realloc() functions. */
+
+#include <stdlib.h>
+
+#if MALLOC_0_IS_NONNULL
+# define eemalloc malloc
+#else
+# if __GNUC__ >= 3
+static inline void *eemalloc (size_t n)
+ __attribute__ ((__malloc__))
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ __attribute__ ((__alloc_size__ (1)))
+# endif
+ ;
+# endif
+static inline void *
+eemalloc (size_t n)
+{
+ /* If n is zero, allocate a 1-byte block. */
+ if (n == 0)
+ n = 1;
+ return malloc (n);
+}
+#endif
+
+#if REALLOC_0_IS_NONNULL
+# define eerealloc realloc
+#else
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+static inline void *eerealloc (void *p, size_t n)
+ __attribute__ ((__alloc_size__ (2)));
+# endif
+static inline void *
+eerealloc (void *p, size_t n)
+{
+ /* If n is zero, allocate or keep a 1-byte block. */
+ if (n == 0)
+ n = 1;
+ return realloc (p, n);
+}
+#endif
+
+/* Maybe we should also define variants
+ eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s)
+ eezalloc (size_t n) - like eemalloc followed by memset 0
+ eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0
+ eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
+ If this would be useful in your application. please speak up. */
+
+#endif /* _EEALLOC_H */
diff --git a/gnulib/lib/errno.in.h b/gnulib/lib/errno.in.h
new file mode 100644
index 0000000..8022c0a
--- /dev/null
+++ b/gnulib/lib/errno.in.h
@@ -0,0 +1,233 @@
+/* A POSIX-like <errno.h>.
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+#define _@GUARD_PREFIX@_ERRNO_H
+
+
+/* On native Windows platforms, many macros are not defined. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* These are the same values as defined by MSVC 10, for interoperability. */
+
+# ifndef ENOMSG
+# define ENOMSG 122
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 111
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 121
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 134
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 104
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 132
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 129
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 117
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 106
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 105
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+# ifndef EINPROGRESS
+# define EINPROGRESS 112
+# define EALREADY 103
+# define ENOTSOCK 128
+# define EDESTADDRREQ 109
+# define EMSGSIZE 115
+# define EPROTOTYPE 136
+# define ENOPROTOOPT 123
+# define EPROTONOSUPPORT 135
+# define EOPNOTSUPP 130
+# define EAFNOSUPPORT 102
+# define EADDRINUSE 100
+# define EADDRNOTAVAIL 101
+# define ENETDOWN 116
+# define ENETUNREACH 118
+# define ECONNRESET 108
+# define ENOBUFS 119
+# define EISCONN 113
+# define ENOTCONN 126
+# define ETIMEDOUT 138
+# define ECONNREFUSED 107
+# define ELOOP 114
+# define EHOSTUNREACH 110
+# define EWOULDBLOCK 140
+# define ETXTBSY 139
+# define ENODATA 120 /* not required by POSIX */
+# define ENOSR 124 /* not required by POSIX */
+# define ENOSTR 125 /* not required by POSIX */
+# define ENOTRECOVERABLE 127 /* not required by POSIX */
+# define EOWNERDEAD 133 /* not required by POSIX */
+# define ETIME 137 /* not required by POSIX */
+# define EOTHER 131 /* not required by POSIX */
+# define GNULIB_defined_ESOCK 1
+# endif
+
+/* These are intentionally the same values as the WSA* error numbers, defined
+ in <winsock2.h>. */
+# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
+# define EPFNOSUPPORT 10046 /* not required by POSIX */
+# define ESHUTDOWN 10058 /* not required by POSIX */
+# define ETOOMANYREFS 10059 /* not required by POSIX */
+# define EHOSTDOWN 10064 /* not required by POSIX */
+# define EPROCLIM 10067 /* not required by POSIX */
+# define EUSERS 10068 /* not required by POSIX */
+# define EDQUOT 10069
+# define ESTALE 10070
+# define EREMOTE 10071 /* not required by POSIX */
+# define GNULIB_defined_EWINSOCK 1
+
+# endif
+
+
+/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
+ EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
+# if @EMULTIHOP_HIDDEN@
+# define EMULTIHOP @EMULTIHOP_VALUE@
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+# if @ENOLINK_HIDDEN@
+# define ENOLINK @ENOLINK_VALUE@
+# define GNULIB_defined_ENOLINK 1
+# endif
+# if @EOVERFLOW_HIDDEN@
+# define EOVERFLOW @EOVERFLOW_VALUE@
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+
+/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
+ EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
+ Likewise, on NonStop Kernel, EDQUOT is not defined.
+ Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
+ HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
+
+ Note: When one of these systems defines some of these macros some day,
+ binaries will have to be recompiled so that they recognizes the new
+ errno values from the system. */
+
+# ifndef ENOMSG
+# define ENOMSG 2000
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 2001
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 2002
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 2003
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EMULTIHOP
+# define EMULTIHOP 2004
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 2005
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 2006
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 2007
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 2011
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 2012
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ESTALE
+# define ESTALE 2009
+# define GNULIB_defined_ESTALE 1
+# endif
+
+# ifndef EDQUOT
+# define EDQUOT 2010
+# define GNULIB_defined_EDQUOT 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 2008
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
diff --git a/gnulib/lib/error.c b/gnulib/lib/error.c
new file mode 100644
index 0000000..5ebe8bf
--- /dev/null
+++ b/gnulib/lib/error.c
@@ -0,0 +1,400 @@
+/* Error handler for noninteractive utilities
+ Copyright (C) 1990-1998, 2000-2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include "error.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC && ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <wchar.h>
+# define mbsrtowcs __mbsrtowcs
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+void (*error_print_progname) (void);
+
+/* This variable is incremented each time `error' is called. */
+unsigned int error_message_count;
+
+#ifdef _LIBC
+/* In the GNU C library, there is a predefined variable for this. */
+
+# define program_name program_invocation_name
+# include <errno.h>
+# include <limits.h>
+# include <libio/libioP.h>
+
+/* In GNU libc we want do not want to use the common name `error' directly.
+ Instead make it a weak alias. */
+extern void __error (int status, int errnum, const char *message, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern void __error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message,
+ ...)
+ __attribute__ ((__format__ (__printf__, 5, 6)));;
+# define error __error
+# define error_at_line __error_at_line
+
+# include <libio/iolibio.h>
+# define fflush(s) INTUSE(_IO_fflush) (s)
+# undef putc
+# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
+
+# include <bits/libc-lock.h>
+
+#else /* not _LIBC */
+
+# include <fcntl.h>
+# include <unistd.h>
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+# endif
+
+/* The gnulib override of fcntl is not needed in this file. */
+# undef fcntl
+
+# if !HAVE_DECL_STRERROR_R
+# ifndef HAVE_DECL_STRERROR_R
+"this configure-time declaration test was not run"
+# endif
+# if STRERROR_R_CHAR_P
+char *strerror_r ();
+# else
+int strerror_r ();
+# endif
+# endif
+
+/* The calling program should define program_name and set it to the
+ name of the executing program. */
+extern char *program_name;
+
+# if HAVE_STRERROR_R || defined strerror_r
+# define __strerror_r strerror_r
+# endif /* HAVE_STRERROR_R || defined strerror_r */
+#endif /* not _LIBC */
+
+#if !_LIBC
+/* Return non-zero if FD is open. */
+static inline int
+is_open (int fd)
+{
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On Win32: The initial state of unassigned standard file descriptors is
+ that they are open but point to an INVALID_HANDLE_VALUE. There is no
+ fcntl, and the gnulib replacement fcntl does not support F_GETFL. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+# else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+# endif
+}
+#endif
+
+static inline void
+flush_stdout (void)
+{
+#if !_LIBC
+ int stdout_fd;
+
+# if GNULIB_FREOPEN_SAFER
+ /* Use of gnulib's freopen-safer module normally ensures that
+ fileno (stdout) == 1
+ whenever stdout is open. */
+ stdout_fd = STDOUT_FILENO;
+# else
+ /* POSIX states that fileno (stdout) after fclose is unspecified. But in
+ practice it is not a problem, because stdout is statically allocated and
+ the fd of a FILE stream is stored as a field in its allocated memory. */
+ stdout_fd = fileno (stdout);
+# endif
+ /* POSIX states that fflush (stdout) after fclose is unspecified; it
+ is safe in glibc, but not on all other platforms. fflush (NULL)
+ is always defined, but too draconian. */
+ if (0 <= stdout_fd && is_open (stdout_fd))
+#endif
+ fflush (stdout);
+}
+
+static void
+print_errno_message (int errnum)
+{
+ char const *s;
+
+#if defined HAVE_STRERROR_R || _LIBC
+ char errbuf[1024];
+# if STRERROR_R_CHAR_P || _LIBC
+ s = __strerror_r (errnum, errbuf, sizeof errbuf);
+# else
+ if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
+ s = errbuf;
+ else
+ s = 0;
+# endif
+#else
+ s = strerror (errnum);
+#endif
+
+#if !_LIBC
+ if (! s)
+ s = _("Unknown system error");
+#endif
+
+#if _LIBC
+ __fxprintf (NULL, ": %s", s);
+#else
+ fprintf (stderr, ": %s", s);
+#endif
+}
+
+static void
+error_tail (int status, int errnum, const char *message, va_list args)
+{
+#if _LIBC
+ if (_IO_fwide (stderr, 0) > 0)
+ {
+# define ALLOCA_LIMIT 2000
+ size_t len = strlen (message) + 1;
+ wchar_t *wmessage = NULL;
+ mbstate_t st;
+ size_t res;
+ const char *tmp;
+ bool use_malloc = false;
+
+ while (1)
+ {
+ if (__libc_use_alloca (len * sizeof (wchar_t)))
+ wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
+ else
+ {
+ if (!use_malloc)
+ wmessage = NULL;
+
+ wchar_t *p = (wchar_t *) realloc (wmessage,
+ len * sizeof (wchar_t));
+ if (p == NULL)
+ {
+ free (wmessage);
+ fputws_unlocked (L"out of memory\n", stderr);
+ return;
+ }
+ wmessage = p;
+ use_malloc = true;
+ }
+
+ memset (&st, '\0', sizeof (st));
+ tmp = message;
+
+ res = mbsrtowcs (wmessage, &tmp, len, &st);
+ if (res != len)
+ break;
+
+ if (__builtin_expect (len >= SIZE_MAX / 2, 0))
+ {
+ /* This really should not happen if everything is fine. */
+ res = (size_t) -1;
+ break;
+ }
+
+ len *= 2;
+ }
+
+ if (res == (size_t) -1)
+ {
+ /* The string cannot be converted. */
+ if (use_malloc)
+ {
+ free (wmessage);
+ use_malloc = false;
+ }
+ wmessage = (wchar_t *) L"???";
+ }
+
+ __vfwprintf (stderr, wmessage, args);
+
+ if (use_malloc)
+ free (wmessage);
+ }
+ else
+#endif
+ vfprintf (stderr, message, args);
+ va_end (args);
+
+ ++error_message_count;
+ if (errnum)
+ print_errno_message (errnum);
+#if _LIBC
+ __fxprintf (NULL, "\n");
+#else
+ putc ('\n', stderr);
+#endif
+ fflush (stderr);
+ if (status)
+ exit (status);
+}
+
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+ format string with optional args.
+ If ERRNUM is nonzero, print its corresponding system error message.
+ Exit with status STATUS if it is nonzero. */
+void
+error (int status, int errnum, const char *message, ...)
+{
+ va_list args;
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s: ", program_name);
+#else
+ fprintf (stderr, "%s: ", program_name);
+#endif
+ }
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+int error_one_per_line;
+
+void
+error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message, ...)
+{
+ va_list args;
+
+ if (error_one_per_line)
+ {
+ static const char *old_file_name;
+ static unsigned int old_line_number;
+
+ if (old_line_number == line_number
+ && (file_name == old_file_name
+ || strcmp (old_file_name, file_name) == 0))
+ /* Simply return and print nothing. */
+ return;
+
+ old_file_name = file_name;
+ old_line_number = line_number;
+ }
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s:", program_name);
+#else
+ fprintf (stderr, "%s:", program_name);
+#endif
+ }
+
+#if _LIBC
+ __fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ",
+ file_name, line_number);
+#else
+ fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
+ file_name, line_number);
+#endif
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+#ifdef _LIBC
+/* Make the weak alias. */
+# undef error
+# undef error_at_line
+weak_alias (__error, error)
+weak_alias (__error_at_line, error_at_line)
+#endif
diff --git a/gnulib/lib/error.h b/gnulib/lib/error.h
new file mode 100644
index 0000000..80f81bc
--- /dev/null
+++ b/gnulib/lib/error.h
@@ -0,0 +1,65 @@
+/* Declaration for error-reporting function
+ Copyright (C) 1995-1997, 2003, 2006, 2008-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _ERROR_H
+#define _ERROR_H 1
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with `fprintf (stderr, FORMAT, ...)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
+
+extern void error (int __status, int __errnum, const char *__format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
+
+extern void error_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 5, 6));
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+extern void (*error_print_progname) (void);
+
+/* This variable is incremented each time `error' is called. */
+extern unsigned int error_message_count;
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+extern int error_one_per_line;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* error.h */
diff --git a/gnulib/lib/euidaccess.c b/gnulib/lib/euidaccess.c
new file mode 100644
index 0000000..b12eb46
--- /dev/null
+++ b/gnulib/lib/euidaccess.c
@@ -0,0 +1,218 @@
+/* euidaccess -- check if effective user id can access file
+
+ Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2011 Free
+ Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie and Torbjorn Granlund.
+ Adapted for GNU C library by Roland McGrath. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#if HAVE_LIBGEN_H
+# include <libgen.h>
+#endif
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#if defined EACCES && !defined EACCESS
+# define EACCESS EACCES
+#endif
+
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+#ifdef _LIBC
+
+# define access __access
+# define getuid __getuid
+# define getgid __getgid
+# define geteuid __geteuid
+# define getegid __getegid
+# define group_member __group_member
+# define euidaccess __euidaccess
+# undef stat
+# define stat stat64
+
+#endif
+
+/* Return 0 if the user has permission of type MODE on FILE;
+ otherwise, return -1 and set `errno'.
+ Like access, except that it uses the effective user and group
+ id's instead of the real ones, and it does not always check for read-only
+ file system, text busy, etc. */
+
+int
+euidaccess (const char *file, int mode)
+{
+#if HAVE_FACCESSAT /* glibc, AIX 7, Solaris 11, Cygwin 1.7 */
+ return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
+#elif defined EFF_ONLY_OK /* IRIX, OSF/1, Interix */
+ return access (file, mode | EFF_ONLY_OK);
+#elif defined ACC_SELF /* AIX */
+ return accessx (file, mode, ACC_SELF);
+#elif HAVE_EACCESS /* FreeBSD */
+ return eaccess (file, mode);
+#else /* MacOS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, mingw, BeOS */
+
+ uid_t uid = getuid ();
+ gid_t gid = getgid ();
+ uid_t euid = geteuid ();
+ gid_t egid = getegid ();
+ struct stat stats;
+
+# if HAVE_DECL_SETREGID && PREFER_NONREENTRANT_EUIDACCESS
+
+ /* Define PREFER_NONREENTRANT_EUIDACCESS if you prefer euidaccess to
+ return the correct result even if this would make it
+ nonreentrant. Define this only if your entire application is
+ safe even if the uid or gid might temporarily change. If your
+ application uses signal handlers or threads it is probably not
+ safe. */
+
+ if (mode == F_OK)
+ return stat (file, &stats);
+ else
+ {
+ int result;
+ int saved_errno;
+
+ if (uid != euid)
+ setreuid (euid, uid);
+ if (gid != egid)
+ setregid (egid, gid);
+
+ result = access (file, mode);
+ saved_errno = errno;
+
+ /* Restore them. */
+ if (uid != euid)
+ setreuid (uid, euid);
+ if (gid != egid)
+ setregid (gid, egid);
+
+ errno = saved_errno;
+ return result;
+ }
+
+# else
+
+ /* The following code assumes the traditional Unix model, and is not
+ correct on systems that have ACLs or the like. However, it's
+ better than nothing, and it is reentrant. */
+
+ unsigned int granted;
+ if (uid == euid && gid == egid)
+ /* If we are not set-uid or set-gid, access does the same. */
+ return access (file, mode);
+
+ if (stat (file, &stats) != 0)
+ return -1;
+
+ /* The super-user can read and write any file, and execute any file
+ that anyone can execute. */
+ if (euid == 0 && ((mode & X_OK) == 0
+ || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
+ return 0;
+
+ /* Convert the mode to traditional form, clearing any bogus bits. */
+ if (R_OK == 4 && W_OK == 2 && X_OK == 1 && F_OK == 0)
+ mode &= 7;
+ else
+ mode = ((mode & R_OK ? 4 : 0)
+ + (mode & W_OK ? 2 : 0)
+ + (mode & X_OK ? 1 : 0));
+
+ if (mode == 0)
+ return 0; /* The file exists. */
+
+ /* Convert the file's permission bits to traditional form. */
+ if (S_IRUSR == (4 << 6) && S_IWUSR == (2 << 6) && S_IXUSR == (1 << 6)
+ && S_IRGRP == (4 << 3) && S_IWGRP == (2 << 3) && S_IXGRP == (1 << 3)
+ && S_IROTH == (4 << 0) && S_IWOTH == (2 << 0) && S_IXOTH == (1 << 0))
+ granted = stats.st_mode;
+ else
+ granted = ((stats.st_mode & S_IRUSR ? 4 << 6 : 0)
+ + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
+ + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
+ + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
+ + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
+ + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
+ + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
+ + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
+ + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
+
+ if (euid == stats.st_uid)
+ granted >>= 6;
+ else if (egid == stats.st_gid || group_member (stats.st_gid))
+ granted >>= 3;
+
+ if ((mode & ~granted) == 0)
+ return 0;
+ __set_errno (EACCESS);
+ return -1;
+
+# endif
+#endif
+}
+#undef euidaccess
+#ifdef weak_alias
+weak_alias (__euidaccess, euidaccess)
+#endif
+
+#ifdef TEST
+# include <error.h>
+# include <stdio.h>
+# include <stdlib.h>
+
+char *program_name;
+
+int
+main (int argc, char **argv)
+{
+ char *file;
+ int mode;
+ int err;
+
+ program_name = argv[0];
+ if (argc < 3)
+ abort ();
+ file = argv[1];
+ mode = atoi (argv[2]);
+
+ err = euidaccess (file, mode);
+ printf ("%d\n", err);
+ if (err != 0)
+ error (0, errno, "%s", file);
+ exit (0);
+}
+#endif
diff --git a/gnulib/lib/exclude.c b/gnulib/lib/exclude.c
new file mode 100644
index 0000000..df49714
--- /dev/null
+++ b/gnulib/lib/exclude.c
@@ -0,0 +1,578 @@
+/* exclude.c -- exclude file names
+
+ Copyright (C) 1992-1994, 1997, 1999-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com>
+ and Sergey Poznyakoff <gray@gnu.org>.
+ Thanks to Phil Proudman <phil@proudman51.freeserve.co.uk>
+ for improvement suggestions. */
+
+#include <config.h>
+
+#include <stdbool.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wctype.h>
+
+#include "exclude.h"
+#include "hash.h"
+#include "mbuiter.h"
+#include "fnmatch.h"
+#include "xalloc.h"
+#include "verify.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Non-GNU systems lack these options, so we don't need to check them. */
+#ifndef FNM_CASEFOLD
+# define FNM_CASEFOLD 0
+#endif
+#ifndef FNM_EXTMATCH
+# define FNM_EXTMATCH 0
+#endif
+#ifndef FNM_LEADING_DIR
+# define FNM_LEADING_DIR 0
+#endif
+
+verify (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
+ & (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
+ | FNM_CASEFOLD | FNM_EXTMATCH))
+ == 0);
+
+
+/* Exclusion patterns are grouped into a singly-linked list of
+ "exclusion segments". Each segment represents a set of patterns
+ that can be matches using the same algorithm. Non-wildcard
+ patterns are kept in hash tables, to speed up searches. Wildcard
+ patterns are stored as arrays of patterns. */
+
+
+/* An exclude pattern-options pair. The options are fnmatch options
+ ORed with EXCLUDE_* options. */
+
+struct patopts
+ {
+ char const *pattern;
+ int options;
+ };
+
+/* An array of pattern-options pairs. */
+
+struct exclude_pattern
+ {
+ struct patopts *exclude;
+ size_t exclude_alloc;
+ size_t exclude_count;
+ };
+
+enum exclude_type
+ {
+ exclude_hash, /* a hash table of excluded names */
+ exclude_pattern /* an array of exclude patterns */
+ };
+
+struct exclude_segment
+ {
+ struct exclude_segment *next; /* next segment in list */
+ enum exclude_type type; /* type of this segment */
+ int options; /* common options for this segment */
+ union
+ {
+ Hash_table *table; /* for type == exclude_hash */
+ struct exclude_pattern pat; /* for type == exclude_pattern */
+ } v;
+ };
+
+/* The exclude structure keeps a singly-linked list of exclude segments */
+struct exclude
+ {
+ struct exclude_segment *head, *tail;
+ };
+
+/* Return true if str has wildcard characters */
+bool
+fnmatch_pattern_has_wildcards (const char *str, int options)
+{
+ const char *cset = "\\?*[]";
+ if (options & FNM_NOESCAPE)
+ cset++;
+ while (*str)
+ {
+ size_t n = strcspn (str, cset);
+ if (str[n] == 0)
+ break;
+ else if (str[n] == '\\')
+ {
+ str += n + 1;
+ if (*str)
+ str++;
+ }
+ else
+ return true;
+ }
+ return false;
+}
+
+static void
+unescape_pattern (char *str)
+{
+ int inset = 0;
+ char *q = str;
+ do
+ {
+ if (inset)
+ {
+ if (*q == ']')
+ inset = 0;
+ }
+ else if (*q == '[')
+ inset = 1;
+ else if (*q == '\\')
+ q++;
+ }
+ while ((*str++ = *q++));
+}
+
+/* Return a newly allocated and empty exclude list. */
+
+struct exclude *
+new_exclude (void)
+{
+ return xzalloc (sizeof *new_exclude ());
+}
+
+/* Calculate the hash of string. */
+static size_t
+string_hasher (void const *data, size_t n_buckets)
+{
+ char const *p = data;
+ return hash_string (p, n_buckets);
+}
+
+/* Ditto, for case-insensitive hashes */
+static size_t
+string_hasher_ci (void const *data, size_t n_buckets)
+{
+ char const *p = data;
+ mbui_iterator_t iter;
+ size_t value = 0;
+
+ for (mbui_init (iter, p); mbui_avail (iter); mbui_advance (iter))
+ {
+ mbchar_t m = mbui_cur (iter);
+ wchar_t wc;
+
+ if (m.wc_valid)
+ wc = towlower (m.wc);
+ else
+ wc = *m.ptr;
+
+ value = (value * 31 + wc) % n_buckets;
+ }
+
+ return value;
+}
+
+/* compare two strings for equality */
+static bool
+string_compare (void const *data1, void const *data2)
+{
+ char const *p1 = data1;
+ char const *p2 = data2;
+ return strcmp (p1, p2) == 0;
+}
+
+/* compare two strings for equality, case-insensitive */
+static bool
+string_compare_ci (void const *data1, void const *data2)
+{
+ char const *p1 = data1;
+ char const *p2 = data2;
+ return mbscasecmp (p1, p2) == 0;
+}
+
+static void
+string_free (void *data)
+{
+ free (data);
+}
+
+/* Create new exclude segment of given TYPE and OPTIONS, and attach it
+ to the tail of list in EX */
+static struct exclude_segment *
+new_exclude_segment (struct exclude *ex, enum exclude_type type, int options)
+{
+ struct exclude_segment *sp = xzalloc (sizeof (struct exclude_segment));
+ sp->type = type;
+ sp->options = options;
+ switch (type)
+ {
+ case exclude_pattern:
+ break;
+
+ case exclude_hash:
+ sp->v.table = hash_initialize (0, NULL,
+ (options & FNM_CASEFOLD) ?
+ string_hasher_ci
+ : string_hasher,
+ (options & FNM_CASEFOLD) ?
+ string_compare_ci
+ : string_compare,
+ string_free);
+ break;
+ }
+ if (ex->tail)
+ ex->tail->next = sp;
+ else
+ ex->head = sp;
+ ex->tail = sp;
+ return sp;
+}
+
+/* Free a single exclude segment */
+static void
+free_exclude_segment (struct exclude_segment *seg)
+{
+ switch (seg->type)
+ {
+ case exclude_pattern:
+ free (seg->v.pat.exclude);
+ break;
+
+ case exclude_hash:
+ hash_free (seg->v.table);
+ break;
+ }
+ free (seg);
+}
+
+/* Free the storage associated with an exclude list. */
+void
+free_exclude (struct exclude *ex)
+{
+ struct exclude_segment *seg;
+ for (seg = ex->head; seg; )
+ {
+ struct exclude_segment *next = seg->next;
+ free_exclude_segment (seg);
+ seg = next;
+ }
+ free (ex);
+}
+
+/* Return zero if PATTERN matches F, obeying OPTIONS, except that
+ (unlike fnmatch) wildcards are disabled in PATTERN. */
+
+static int
+fnmatch_no_wildcards (char const *pattern, char const *f, int options)
+{
+ if (! (options & FNM_LEADING_DIR))
+ return ((options & FNM_CASEFOLD)
+ ? mbscasecmp (pattern, f)
+ : strcmp (pattern, f));
+ else if (! (options & FNM_CASEFOLD))
+ {
+ size_t patlen = strlen (pattern);
+ int r = strncmp (pattern, f, patlen);
+ if (! r)
+ {
+ r = f[patlen];
+ if (r == '/')
+ r = 0;
+ }
+ return r;
+ }
+ else
+ {
+ /* Walk through a copy of F, seeing whether P matches any prefix
+ of F.
+
+ FIXME: This is an O(N**2) algorithm; it should be O(N).
+ Also, the copy should not be necessary. However, fixing this
+ will probably involve a change to the mbs* API. */
+
+ char *fcopy = xstrdup (f);
+ char *p;
+ int r;
+ for (p = fcopy; ; *p++ = '/')
+ {
+ p = strchr (p, '/');
+ if (p)
+ *p = '\0';
+ r = mbscasecmp (pattern, fcopy);
+ if (!p || r <= 0)
+ break;
+ }
+ free (fcopy);
+ return r;
+ }
+}
+
+bool
+exclude_fnmatch (char const *pattern, char const *f, int options)
+{
+ int (*matcher) (char const *, char const *, int) =
+ (options & EXCLUDE_WILDCARDS
+ ? fnmatch
+ : fnmatch_no_wildcards);
+ bool matched = ((*matcher) (pattern, f, options) == 0);
+ char const *p;
+
+ if (! (options & EXCLUDE_ANCHORED))
+ for (p = f; *p && ! matched; p++)
+ if (*p == '/' && p[1] != '/')
+ matched = ((*matcher) (pattern, p + 1, options) == 0);
+
+ return matched;
+}
+
+/* Return true if the exclude_pattern segment SEG excludes F. */
+
+static bool
+excluded_file_pattern_p (struct exclude_segment const *seg, char const *f)
+{
+ size_t exclude_count = seg->v.pat.exclude_count;
+ struct patopts const *exclude = seg->v.pat.exclude;
+ size_t i;
+ bool excluded = !! (exclude[0].options & EXCLUDE_INCLUDE);
+
+ /* Scan through the options, until they change excluded */
+ for (i = 0; i < exclude_count; i++)
+ {
+ char const *pattern = exclude[i].pattern;
+ int options = exclude[i].options;
+ if (exclude_fnmatch (pattern, f, options))
+ return !excluded;
+ }
+ return excluded;
+}
+
+/* Return true if the exclude_hash segment SEG excludes F.
+ BUFFER is an auxiliary storage of the same length as F (with nul
+ terminator included) */
+static bool
+excluded_file_name_p (struct exclude_segment const *seg, char const *f,
+ char *buffer)
+{
+ int options = seg->options;
+ bool excluded = !! (options & EXCLUDE_INCLUDE);
+ Hash_table *table = seg->v.table;
+
+ do
+ {
+ /* initialize the pattern */
+ strcpy (buffer, f);
+
+ while (1)
+ {
+ if (hash_lookup (table, buffer))
+ return !excluded;
+ if (options & FNM_LEADING_DIR)
+ {
+ char *p = strrchr (buffer, '/');
+ if (p)
+ {
+ *p = 0;
+ continue;
+ }
+ }
+ break;
+ }
+
+ if (!(options & EXCLUDE_ANCHORED))
+ {
+ f = strchr (f, '/');
+ if (f)
+ f++;
+ }
+ else
+ break;
+ }
+ while (f);
+ return excluded;
+}
+
+/* Return true if EX excludes F. */
+
+bool
+excluded_file_name (struct exclude const *ex, char const *f)
+{
+ struct exclude_segment *seg;
+ bool excluded;
+ char *filename = NULL;
+
+ /* If no patterns are given, the default is to include. */
+ if (!ex->head)
+ return false;
+
+ /* Otherwise, the default is the opposite of the first option. */
+ excluded = !! (ex->head->options & EXCLUDE_INCLUDE);
+ /* Scan through the segments, seeing whether they change status from
+ excluded to included or vice versa. */
+ for (seg = ex->head; seg; seg = seg->next)
+ {
+ bool rc;
+
+ switch (seg->type)
+ {
+ case exclude_pattern:
+ rc = excluded_file_pattern_p (seg, f);
+ break;
+
+ case exclude_hash:
+ if (!filename)
+ filename = xmalloc (strlen (f) + 1);
+ rc = excluded_file_name_p (seg, f, filename);
+ break;
+
+ default:
+ abort ();
+ }
+ if (rc != excluded)
+ {
+ excluded = rc;
+ break;
+ }
+ }
+ free (filename);
+ return excluded;
+}
+
+/* Append to EX the exclusion PATTERN with OPTIONS. */
+
+void
+add_exclude (struct exclude *ex, char const *pattern, int options)
+{
+ struct exclude_segment *seg;
+
+ if ((options & EXCLUDE_WILDCARDS)
+ && fnmatch_pattern_has_wildcards (pattern, options))
+ {
+ struct exclude_pattern *pat;
+ struct patopts *patopts;
+
+ if (ex->tail && ex->tail->type == exclude_pattern
+ && ((ex->tail->options & EXCLUDE_INCLUDE) ==
+ (options & EXCLUDE_INCLUDE)))
+ seg = ex->tail;
+ else
+ seg = new_exclude_segment (ex, exclude_pattern, options);
+
+ pat = &seg->v.pat;
+ if (pat->exclude_count == pat->exclude_alloc)
+ pat->exclude = x2nrealloc (pat->exclude, &pat->exclude_alloc,
+ sizeof *pat->exclude);
+ patopts = &pat->exclude[pat->exclude_count++];
+ patopts->pattern = pattern;
+ patopts->options = options;
+ }
+ else
+ {
+ char *str, *p;
+#define EXCLUDE_HASH_FLAGS (EXCLUDE_INCLUDE|EXCLUDE_ANCHORED|\
+ FNM_LEADING_DIR|FNM_CASEFOLD)
+ if (ex->tail && ex->tail->type == exclude_hash
+ && ((ex->tail->options & EXCLUDE_HASH_FLAGS) ==
+ (options & EXCLUDE_HASH_FLAGS)))
+ seg = ex->tail;
+ else
+ seg = new_exclude_segment (ex, exclude_hash, options);
+
+ str = xstrdup (pattern);
+ if (options & EXCLUDE_WILDCARDS)
+ unescape_pattern (str);
+ p = hash_insert (seg->v.table, str);
+ if (p != str)
+ free (str);
+ }
+}
+
+/* Use ADD_FUNC to append to EX the patterns in FILE_NAME, each with
+ OPTIONS. LINE_END terminates each pattern in the file. If
+ LINE_END is a space character, ignore trailing spaces and empty
+ lines in FILE. Return -1 on failure, 0 on success. */
+
+int
+add_exclude_file (void (*add_func) (struct exclude *, char const *, int),
+ struct exclude *ex, char const *file_name, int options,
+ char line_end)
+{
+ bool use_stdin = file_name[0] == '-' && !file_name[1];
+ FILE *in;
+ char *buf = NULL;
+ char *p;
+ char const *pattern;
+ char const *lim;
+ size_t buf_alloc = 0;
+ size_t buf_count = 0;
+ int c;
+ int e = 0;
+
+ if (use_stdin)
+ in = stdin;
+ else if (! (in = fopen (file_name, "r")))
+ return -1;
+
+ while ((c = getc (in)) != EOF)
+ {
+ if (buf_count == buf_alloc)
+ buf = x2realloc (buf, &buf_alloc);
+ buf[buf_count++] = c;
+ }
+
+ if (ferror (in))
+ e = errno;
+
+ if (!use_stdin && fclose (in) != 0)
+ e = errno;
+
+ buf = xrealloc (buf, buf_count + 1);
+ buf[buf_count] = line_end;
+ lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end);
+ pattern = buf;
+
+ for (p = buf; p < lim; p++)
+ if (*p == line_end)
+ {
+ char *pattern_end = p;
+
+ if (isspace ((unsigned char) line_end))
+ {
+ for (; ; pattern_end--)
+ if (pattern_end == pattern)
+ goto next_pattern;
+ else if (! isspace ((unsigned char) pattern_end[-1]))
+ break;
+ }
+
+ *pattern_end = '\0';
+ (*add_func) (ex, pattern, options);
+
+ next_pattern:
+ pattern = p + 1;
+ }
+
+ errno = e;
+ return e ? -1 : 0;
+}
diff --git a/gnulib/lib/exclude.h b/gnulib/lib/exclude.h
new file mode 100644
index 0000000..63e94d3
--- /dev/null
+++ b/gnulib/lib/exclude.h
@@ -0,0 +1,52 @@
+/* exclude.h -- declarations for excluding file names
+
+ Copyright (C) 1992-1994, 1997, 1999, 2001-2003, 2005-2006, 2009-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_EXCLUDE_H
+#define _GL_EXCLUDE_H 1
+
+#include <stdbool.h>
+
+/* Written by Paul Eggert <eggert@twinsun.com>
+ and Sergey Poznyakoff <gray@gnu.org> */
+
+/* Exclude options, which can be ORed with fnmatch options. */
+
+/* Patterns must match the start of file names, instead of matching
+ anywhere after a '/'. */
+#define EXCLUDE_ANCHORED (1 << 30)
+
+/* Include instead of exclude. */
+#define EXCLUDE_INCLUDE (1 << 29)
+
+/* '?', '*', '[', and '\\' are special in patterns. Without this
+ option, these characters are ordinary and fnmatch is not used. */
+#define EXCLUDE_WILDCARDS (1 << 28)
+
+struct exclude;
+
+bool fnmatch_pattern_has_wildcards (const char *, int) _GL_ATTRIBUTE_PURE;
+
+struct exclude *new_exclude (void);
+void free_exclude (struct exclude *);
+void add_exclude (struct exclude *, char const *, int);
+int add_exclude_file (void (*) (struct exclude *, char const *, int),
+ struct exclude *, char const *, int, char);
+bool excluded_file_name (struct exclude const *, char const *);
+bool exclude_fnmatch (char const *pattern, char const *f, int options);
+
+#endif /* _GL_EXCLUDE_H */
diff --git a/gnulib/lib/execute.c b/gnulib/lib/execute.c
new file mode 100644
index 0000000..6de6c62
--- /dev/null
+++ b/gnulib/lib/execute.c
@@ -0,0 +1,278 @@
+/* Creation of autonomous subprocesses.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "execute.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+# include <process.h>
+# include "w32spawn.h"
+
+#else
+
+/* Unix API. */
+# include <spawn.h>
+
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#ifdef EINTR
+
+/* EINTR handling for close(), open().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define close nonintr_close
+
+static inline int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+ int retval;
+
+ do
+ retval = open (pathname, oflag, mode);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef open /* avoid warning on VMS */
+#define open nonintr_open
+
+#endif
+
+
+/* Execute a command, optionally redirecting any of the three standard file
+ descriptors to /dev/null. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal. */
+int
+execute (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool ignore_sigpipe,
+ bool null_stdin, bool null_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+ /* Native Woe32 API. */
+ int orig_stdin;
+ int orig_stdout;
+ int orig_stderr;
+ int exitcode;
+ int nullinfd;
+ int nulloutfd;
+
+ /* FIXME: Need to free memory allocated by prepare_spawn. */
+ prog_argv = prepare_spawn (prog_argv);
+
+ /* Save standard file handles of parent process. */
+ if (null_stdin)
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
+ if (null_stdout)
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
+ if (null_stderr)
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
+ exitcode = -1;
+
+ /* Create standard file handles of child process. */
+ nullinfd = -1;
+ nulloutfd = -1;
+ if ((!null_stdin
+ || ((nullinfd = open ("NUL", O_RDONLY, 0)) >= 0
+ && (nullinfd == STDIN_FILENO
+ || (dup2 (nullinfd, STDIN_FILENO) >= 0
+ && close (nullinfd) >= 0))))
+ && (!(null_stdout || null_stderr)
+ || ((nulloutfd = open ("NUL", O_RDWR, 0)) >= 0
+ && (!null_stdout
+ || nulloutfd == STDOUT_FILENO
+ || dup2 (nulloutfd, STDOUT_FILENO) >= 0)
+ && (!null_stderr
+ || nulloutfd == STDERR_FILENO
+ || dup2 (nulloutfd, STDERR_FILENO) >= 0)
+ && ((null_stdout && nulloutfd == STDOUT_FILENO)
+ || (null_stderr && nulloutfd == STDERR_FILENO)
+ || close (nulloutfd) >= 0))))
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
+ {
+ exitcode = spawnvpe (P_WAIT, prog_path, (const char **) prog_argv,
+ (const char **) environ);
+ if (exitcode < 0 && errno == ENOEXEC)
+ {
+ /* prog is not a native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to prog_argv. */
+ --prog_argv;
+ exitcode = spawnvpe (P_WAIT, prog_argv[0], (const char **) prog_argv,
+ (const char **) environ);
+ }
+ }
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+ if (nullinfd >= 0)
+ close (nullinfd);
+
+ /* Restore standard file handles of parent process. */
+ if (null_stderr)
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
+ if (null_stdout)
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
+ if (null_stdin)
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+
+ if (exitcode == -1)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+
+ return exitcode;
+
+#else
+
+ /* Unix API. */
+ /* Note about 127: Some errors during posix_spawnp() cause the function
+ posix_spawnp() to return an error code; some other errors cause the
+ subprocess to exit with return code 127. It is implementation
+ dependent which error is reported which way. We treat both cases as
+ equivalent. */
+ sigset_t blocked_signals;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+
+ if (slave_process)
+ {
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ block_fatal_signals ();
+ }
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (null_stdin
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDIN_FILENO,
+ "/dev/null", O_RDONLY,
+ 0))
+ != 0)
+ || (null_stdout
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDOUT_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (null_stderr
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDERR_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (slave_process
+ && ((err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs,
+ &blocked_signals))
+ != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETSIGMASK))
+ != 0)))
+ || (err = posix_spawnp (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL, prog_argv,
+ environ))
+ != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ unblock_fatal_signals ();
+ if (termsigp != NULL)
+ *termsigp = 0;
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, err,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ {
+ register_slave_subprocess (child);
+ unblock_fatal_signals ();
+ }
+
+ return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
+ slave_process, exit_on_error, termsigp);
+
+#endif
+}
diff --git a/gnulib/lib/execute.h b/gnulib/lib/execute.h
new file mode 100644
index 0000000..5750169
--- /dev/null
+++ b/gnulib/lib/execute.h
@@ -0,0 +1,44 @@
+/* Creation of autonomous subprocesses.
+ Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _EXECUTE_H
+#define _EXECUTE_H
+
+#include <stdbool.h>
+
+/* Execute a command, optionally redirecting any of the three standard file
+ descriptors to /dev/null. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ If ignore_sigpipe is true, consider a subprocess termination due to SIGPIPE
+ as equivalent to a success. This is suitable for processes whose only
+ purpose is to write to standard output.
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal.
+ If termsigp is not NULL, *termsig will be set to the signal that terminated
+ the subprocess (if supported by the platform: not on native Windows
+ platforms), otherwise 0.
+ It is recommended that no signal is blocked or ignored while execute()
+ is called. See pipe.h for the reason. */
+extern int execute (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool ignore_sigpipe,
+ bool null_stdin, bool null_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp);
+
+#endif /* _EXECUTE_H */
diff --git a/gnulib/lib/exitfail.c b/gnulib/lib/exitfail.c
new file mode 100644
index 0000000..953aa02
--- /dev/null
+++ b/gnulib/lib/exitfail.c
@@ -0,0 +1,24 @@
+/* Failure exit status
+
+ Copyright (C) 2002-2003, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "exitfail.h"
+
+#include <stdlib.h>
+
+int volatile exit_failure = EXIT_FAILURE;
diff --git a/gnulib/lib/exitfail.h b/gnulib/lib/exitfail.h
new file mode 100644
index 0000000..6d01d4f
--- /dev/null
+++ b/gnulib/lib/exitfail.h
@@ -0,0 +1,18 @@
+/* Failure exit status
+
+ Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern int volatile exit_failure;
diff --git a/gnulib/lib/expf.c b/gnulib/lib/expf.c
new file mode 100644
index 0000000..a16dbea
--- /dev/null
+++ b/gnulib/lib/expf.c
@@ -0,0 +1,26 @@
+/* Exponential function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+expf (float x)
+{
+ return (float) exp ((double) x);
+}
diff --git a/gnulib/lib/expl.c b/gnulib/lib/expl.c
new file mode 100644
index 0000000..49fdefa
--- /dev/null
+++ b/gnulib/lib/expl.c
@@ -0,0 +1,147 @@
+/* Emulation for expl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002-2003, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+expl (long double x)
+{
+ return exp (x);
+}
+
+#else
+
+# include <float.h>
+
+static const long double C[] = {
+/* Chebyshev polynom coeficients for (exp(x)-1)/x */
+# define P1 C[0]
+# define P2 C[1]
+# define P3 C[2]
+# define P4 C[3]
+# define P5 C[4]
+# define P6 C[5]
+ 0.5L,
+ 1.66666666666666666666666666666666683E-01L,
+ 4.16666666666666666666654902320001674E-02L,
+ 8.33333333333333333333314659767198461E-03L,
+ 1.38888888889899438565058018857254025E-03L,
+ 1.98412698413981650382436541785404286E-04L,
+
+/* Smallest integer x for which e^x overflows. */
+# define himark C[6]
+ 11356.523406294143949491931077970765L,
+
+/* Largest integer x for which e^x underflows. */
+# define lomark C[7]
+-11433.4627433362978788372438434526231L,
+
+/* very small number */
+# define TINY C[8]
+ 1.0e-4900L,
+
+/* 2^16383 */
+# define TWO16383 C[9]
+ 5.94865747678615882542879663314003565E+4931L};
+
+long double
+expl (long double x)
+{
+ /* Check for usual case. */
+ if (x < himark && x > lomark)
+ {
+ int exponent;
+ long double t, x22;
+ int k = 1;
+ long double result = 1.0;
+
+ /* Compute an integer power of e with a granularity of 0.125. */
+ exponent = (int) floorl (x * 8.0L);
+ x -= exponent / 8.0L;
+
+ if (x > 0.0625)
+ {
+ exponent++;
+ x -= 0.125L;
+ }
+
+ if (exponent < 0)
+ {
+ t = 0.8824969025845954028648921432290507362220L; /* e^-0.25 */
+ exponent = -exponent;
+ }
+ else
+ t = 1.1331484530668263168290072278117938725655L; /* e^0.25 */
+
+ while (exponent)
+ {
+ if (exponent & k)
+ {
+ result *= t;
+ exponent ^= k;
+ }
+ t *= t;
+ k <<= 1;
+ }
+
+ /* Approximate (e^x - 1)/x, using a seventh-degree polynomial,
+ with maximum error in [-2^-16-2^-53,2^-16+2^-53]
+ less than 4.8e-39. */
+ x22 = x + x*x*(P1+x*(P2+x*(P3+x*(P4+x*(P5+x*P6)))));
+
+ return result + result * x22;
+ }
+ /* Exceptional cases: */
+ else if (x < himark)
+ {
+ if (x + x == x)
+ /* e^-inf == 0, with no error. */
+ return 0;
+ else
+ /* Underflow */
+ return TINY * TINY;
+ }
+ else
+ /* Return x, if x is a NaN or Inf; or overflow, otherwise. */
+ return TWO16383*x;
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", expl (1.0L));
+ printf ("%.16Lg\n", expl (-1.0L));
+ printf ("%.16Lg\n", expl (2.0L));
+ printf ("%.16Lg\n", expl (4.0L));
+ printf ("%.16Lg\n", expl (-2.0L));
+ printf ("%.16Lg\n", expl (-4.0L));
+ printf ("%.16Lg\n", expl (0.0625L));
+ printf ("%.16Lg\n", expl (0.3L));
+ printf ("%.16Lg\n", expl (0.6L));
+}
+#endif
diff --git a/gnulib/lib/fabsf.c b/gnulib/lib/fabsf.c
new file mode 100644
index 0000000..4c0f970
--- /dev/null
+++ b/gnulib/lib/fabsf.c
@@ -0,0 +1,26 @@
+/* Absolute value.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+fabsf (float x)
+{
+ return (float) fabs ((double) x);
+}
diff --git a/gnulib/lib/faccessat.c b/gnulib/lib/faccessat.c
new file mode 100644
index 0000000..3ba9fee
--- /dev/null
+++ b/gnulib/lib/faccessat.c
@@ -0,0 +1,44 @@
+/* Check the access rights of a file relative to an open directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#ifndef HAVE_ACCESS
+/* Mingw lacks access, but it also lacks real vs. effective ids, so
+ the gnulib euidaccess module is good enough. */
+# undef access
+# define access euidaccess
+#endif
+
+/* Invoke access or euidaccess on file, FILE, using mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir, then
+ (access|euidaccess)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero.
+ Note that this implementation only supports AT_EACCESS, although some
+ native versions also support AT_SYMLINK_NOFOLLOW. */
+
+#define AT_FUNC_NAME faccessat
+#define AT_FUNC_F1 euidaccess
+#define AT_FUNC_F2 access
+#define AT_FUNC_USE_F1_COND AT_EACCESS
+#define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/fatal-signal.c b/gnulib/lib/fatal-signal.c
new file mode 100644
index 0000000..aca9027
--- /dev/null
+++ b/gnulib/lib/fatal-signal.c
@@ -0,0 +1,286 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "fatal-signal.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "sig-handler.h"
+#include "xalloc.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* ========================================================================= */
+
+
+/* The list of fatal signals.
+ These are those signals whose default action is to terminate the process
+ without a core dump, except
+ SIGKILL - because it cannot be caught,
+ SIGALRM SIGUSR1 SIGUSR2 SIGPOLL SIGIO SIGLOST - because applications
+ often use them for their own purpose,
+ SIGPROF SIGVTALRM - because they are used for profiling,
+ SIGSTKFLT - because it is more similar to SIGFPE, SIGSEGV, SIGBUS,
+ SIGSYS - because it is more similar to SIGABRT, SIGSEGV,
+ SIGPWR - because it of too special use,
+ SIGRTMIN...SIGRTMAX - because they are reserved for application use.
+ plus
+ SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
+
+static int fatal_signals[] =
+ {
+ /* ISO C 99 signals. */
+#ifdef SIGINT
+ SIGINT,
+#endif
+#ifdef SIGTERM
+ SIGTERM,
+#endif
+ /* POSIX:2001 signals. */
+#ifdef SIGHUP
+ SIGHUP,
+#endif
+#ifdef SIGPIPE
+ SIGPIPE,
+#endif
+ /* BSD signals. */
+#ifdef SIGXCPU
+ SIGXCPU,
+#endif
+#ifdef SIGXFSZ
+ SIGXFSZ,
+#endif
+ /* Woe32 signals. */
+#ifdef SIGBREAK
+ SIGBREAK,
+#endif
+ 0
+ };
+
+#define num_fatal_signals (SIZEOF (fatal_signals) - 1)
+
+/* Eliminate signals whose signal handler is SIG_IGN. */
+
+static void
+init_fatal_signals (void)
+{
+ static bool fatal_signals_initialized = false;
+ if (!fatal_signals_initialized)
+ {
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ {
+ struct sigaction action;
+
+ if (sigaction (fatal_signals[i], NULL, &action) >= 0
+ && get_handler (&action) == SIG_IGN)
+ fatal_signals[i] = -1;
+ }
+
+ fatal_signals_initialized = true;
+ }
+}
+
+
+/* ========================================================================= */
+
+
+typedef void (*action_t) (void);
+
+/* Type of an entry in the actions array.
+ The 'action' field is accessed from within the fatal_signal_handler(),
+ therefore we mark it as 'volatile'. */
+typedef struct
+{
+ volatile action_t action;
+}
+actions_entry_t;
+
+/* The registered cleanup actions. */
+static actions_entry_t static_actions[32];
+static actions_entry_t * volatile actions = static_actions;
+static sig_atomic_t volatile actions_count = 0;
+static size_t actions_allocated = SIZEOF (static_actions);
+
+
+/* The saved signal handlers.
+ Size 32 would not be sufficient: On HP-UX, SIGXCPU = 33, SIGXFSZ = 34. */
+static struct sigaction saved_sigactions[64];
+
+
+/* Uninstall the handlers. */
+static inline void
+uninstall_handlers ()
+{
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+ if (saved_sigactions[sig].sa_handler == SIG_IGN)
+ saved_sigactions[sig].sa_handler = SIG_DFL;
+ sigaction (sig, &saved_sigactions[sig], NULL);
+ }
+}
+
+
+/* The signal handler. It gets called asynchronously. */
+static void
+fatal_signal_handler (int sig)
+{
+ for (;;)
+ {
+ /* Get the last registered cleanup action, in a reentrant way. */
+ action_t action;
+ size_t n = actions_count;
+ if (n == 0)
+ break;
+ n--;
+ actions_count = n;
+ action = actions[n].action;
+ /* Execute the action. */
+ action ();
+ }
+
+ /* Now execute the signal's default action.
+ If the signal being delivered was blocked, the re-raised signal would be
+ delivered when this handler returns. But the way we install this handler,
+ no signal is blocked, and the re-raised signal is delivered already
+ during raise(). */
+ uninstall_handlers ();
+ raise (sig);
+}
+
+
+/* Install the handlers. */
+static inline void
+install_handlers ()
+{
+ size_t i;
+ struct sigaction action;
+
+ action.sa_handler = &fatal_signal_handler;
+ /* If we get a fatal signal while executing fatal_signal_handler, enter
+ fatal_signal_handler recursively, since it is reentrant. Hence no
+ SA_RESETHAND. */
+ action.sa_flags = SA_NODEFER;
+ sigemptyset (&action.sa_mask);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+
+ if (!(sig < sizeof (saved_sigactions) / sizeof (saved_sigactions[0])))
+ abort ();
+ sigaction (sig, &action, &saved_sigactions[sig]);
+ }
+}
+
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs. */
+void
+at_fatal_signal (action_t action)
+{
+ static bool cleanup_initialized = false;
+ if (!cleanup_initialized)
+ {
+ init_fatal_signals ();
+ install_handlers ();
+ cleanup_initialized = true;
+ }
+
+ if (actions_count == actions_allocated)
+ {
+ /* Extend the actions array. Note that we cannot use xrealloc(),
+ because then the cleanup() function could access an already
+ deallocated array. */
+ actions_entry_t *old_actions = actions;
+ size_t old_actions_allocated = actions_allocated;
+ size_t new_actions_allocated = 2 * actions_allocated;
+ actions_entry_t *new_actions =
+ XNMALLOC (new_actions_allocated, actions_entry_t);
+ size_t k;
+
+ /* Don't use memcpy() here, because memcpy takes non-volatile arguments
+ and is therefore not guaranteed to complete all memory stores before
+ the next statement. */
+ for (k = 0; k < old_actions_allocated; k++)
+ new_actions[k] = old_actions[k];
+ actions = new_actions;
+ actions_allocated = new_actions_allocated;
+ /* Now we can free the old actions array. */
+ if (old_actions != static_actions)
+ free (old_actions);
+ }
+ /* The two uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the actions_count only after
+ the new action has been written to the memory location
+ actions[actions_count]. */
+ actions[actions_count].action = action;
+ actions_count++;
+}
+
+
+/* ========================================================================= */
+
+
+static sigset_t fatal_signal_set;
+
+static void
+init_fatal_signal_set ()
+{
+ static bool fatal_signal_set_initialized = false;
+ if (!fatal_signal_set_initialized)
+ {
+ size_t i;
+
+ init_fatal_signals ();
+
+ sigemptyset (&fatal_signal_set);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ sigaddset (&fatal_signal_set, fatal_signals[i]);
+
+ fatal_signal_set_initialized = true;
+ }
+}
+
+/* Temporarily delay the catchable fatal signals. */
+void
+block_fatal_signals ()
+{
+ init_fatal_signal_set ();
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+}
+
+/* Stop delaying the catchable fatal signals. */
+void
+unblock_fatal_signals ()
+{
+ init_fatal_signal_set ();
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+}
diff --git a/gnulib/lib/fatal-signal.h b/gnulib/lib/fatal-signal.h
new file mode 100644
index 0000000..9c6aaa2
--- /dev/null
+++ b/gnulib/lib/fatal-signal.h
@@ -0,0 +1,76 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* It is often useful to do some cleanup action when a usually fatal signal
+ terminates the process, like removing a temporary file or killing a
+ subprocess that may be stuck waiting for a device, pipe or network input.
+ Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others.
+ The limitation of this facility is that it cannot work for SIGKILL.
+
+ Signals with a SIG_IGN handler are considered to be non-fatal. The
+ functions in this file assume that when a SIG_IGN handler is installed
+ for a signal, it was installed before any functions in this file were
+ called and it stays so for the whole lifetime of the process. */
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs.
+
+ Restrictions for the cleanup function:
+ - The cleanup function can do all kinds of system calls.
+ - It can also access application dependent memory locations and data
+ structures provided they are in a consistent state. One way to ensure
+ this is through block_fatal_signals()/unblock_fatal_signals(), see
+ below. Another - more tricky - way to ensure this is the careful use
+ of 'volatile'.
+ However,
+ - malloc() and similarly complex facilities are not safe to be called
+ because they are not guaranteed to be in a consistent state.
+ - Also, the cleanup function must not block the catchable fatal signals
+ and leave them blocked upon return.
+
+ The cleanup function is executed asynchronously. It is unspecified
+ whether during its execution the catchable fatal signals are blocked
+ or not. */
+extern void at_fatal_signal (void (*function) (void));
+
+
+/* Sometimes it is necessary to block the usually fatal signals while the
+ data structures being accessed by the cleanup action are being built or
+ reorganized. This is the case, for example, when a temporary file or
+ directory is created through mkstemp() or mkdtemp(), because these
+ functions create the temporary file or directory _before_ returning its
+ name to the application. */
+
+/* Temporarily delay the catchable fatal signals.
+ The signals will be blocked (= delayed) until the next call to
+ unblock_fatal_signals(). If the signals are already blocked, a further
+ call to block_fatal_signals() has no effect. */
+extern void block_fatal_signals (void);
+
+/* Stop delaying the catchable fatal signals. */
+extern void unblock_fatal_signals (void);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fbufmode.c b/gnulib/lib/fbufmode.c
new file mode 100644
index 0000000..8b29ae7
--- /dev/null
+++ b/gnulib/lib/fbufmode.c
@@ -0,0 +1,85 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fbufmode.h"
+
+#if HAVE___FLBF
+# include <stdio_ext.h>
+#endif
+
+#include "stdio-impl.h"
+
+int
+fbufmode (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+# if HAVE___FLBF /* glibc >= 2.2 */
+ if (__flbf (fp))
+ return _IOLBF;
+# else
+ if (fp->_flags & _IO_LINE_BUF)
+ return _IOLBF;
+# endif
+ if (fp->_flags & _IO_UNBUFFERED)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (fp_->_flags & __SLBF)
+ return _IOLBF;
+ if (fp_->_flags & __SNBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __EMX__ /* emx+gcc */
+ return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
+#elif defined __minix /* Minix */
+ return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+# if HAVE___FLBF /* Solaris >= 7 */
+ if (__flbf (fp))
+ return _IOLBF;
+# else
+ if (fp->_flag & _IOLBF)
+ return _IOLBF;
+# endif
+ if (fp_->_flag & _IONBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __UCLIBC__ /* uClibc */
+ if (fp->__modeflags & __FLAG_LBF)
+ return _IOLBF;
+ if (fp->__modeflags & __FLAG_NBF)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __QNX__ /* QNX */
+ if (fp->_Mode & 0x400 /* _MLBF */)
+ return _IOLBF;
+ if (fp->_Mode & 0x800 /* _MNBF */)
+ return _IONBF;
+ return _IOFBF;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__linebuf)
+ return _IOLBF;
+ return (fp->__bufsize > 0 ? _IOFBF : _IONBF);
+#else
+# error "Please port gnulib fbufmode.c to your platform! Look at the setvbuf implementation."
+#endif
+}
diff --git a/gnulib/lib/fbufmode.h b/gnulib/lib/fbufmode.h
new file mode 100644
index 0000000..b1036b6
--- /dev/null
+++ b/gnulib/lib/fbufmode.h
@@ -0,0 +1,36 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the buffering mode of the stream STREAM.
+
+ Result means
+ ------ -------
+ _IONBF unbuffered
+ _IOLBF line buffered
+ _IOFBF fully buffered
+
+ STREAM must not be wide-character oriented. */
+extern int fbufmode (FILE *stream);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fchdir.c b/gnulib/lib/fchdir.c
new file mode 100644
index 0000000..a3623ed
--- /dev/null
+++ b/gnulib/lib/fchdir.c
@@ -0,0 +1,208 @@
+/* fchdir replacement.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "dosname.h"
+#include "filenamecat.h"
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+/* This replacement assumes that a directory is not renamed while opened
+ through a file descriptor.
+
+ FIXME: On mingw, this would be possible to enforce if we were to
+ also open a HANDLE to each directory currently visited by a file
+ descriptor, since mingw refuses to rename any in-use file system
+ object. */
+
+/* Array of file descriptors opened. If REPLACE_OPEN_DIRECTORY or if it points
+ to a directory, it stores info about this directory. */
+typedef struct
+{
+ char *name; /* Absolute name of the directory, or NULL. */
+ /* FIXME - add a DIR* member to make dirfd possible on mingw? */
+} dir_info_t;
+static dir_info_t *dirs;
+static size_t dirs_allocated;
+
+/* Try to ensure dirs has enough room for a slot at index fd; free any
+ contents already in that slot. Return false and set errno to
+ ENOMEM on allocation failure. */
+static bool
+ensure_dirs_slot (size_t fd)
+{
+ if (fd < dirs_allocated)
+ free (dirs[fd].name);
+ else
+ {
+ size_t new_allocated;
+ dir_info_t *new_dirs;
+
+ new_allocated = 2 * dirs_allocated + 1;
+ if (new_allocated <= fd)
+ new_allocated = fd + 1;
+ new_dirs =
+ (dirs != NULL
+ ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs)
+ : (dir_info_t *) malloc (new_allocated * sizeof *dirs));
+ if (new_dirs == NULL)
+ return false;
+ memset (new_dirs + dirs_allocated, 0,
+ (new_allocated - dirs_allocated) * sizeof *dirs);
+ dirs = new_dirs;
+ dirs_allocated = new_allocated;
+ }
+ return true;
+}
+
+/* Return an absolute name of DIR in malloc'd storage. */
+static char *
+get_name (char const *dir)
+{
+ char *cwd;
+ char *result;
+ int saved_errno;
+
+ if (IS_ABSOLUTE_FILE_NAME (dir))
+ return strdup (dir);
+
+ /* We often encounter "."; treat it as a special case. */
+ cwd = getcwd (NULL, 0);
+ if (!cwd || (dir[0] == '.' && dir[1] == '\0'))
+ return cwd;
+
+ result = mfile_name_concat (cwd, dir, NULL);
+ saved_errno = errno;
+ free (cwd);
+ errno = saved_errno;
+ return result;
+}
+
+/* Hook into the gnulib replacements for open() and close() to keep track
+ of the open file descriptors. */
+
+/* Close FD, cleaning up any fd to name mapping if fd was visiting a
+ directory. */
+void
+_gl_unregister_fd (int fd)
+{
+ if (fd >= 0 && fd < dirs_allocated)
+ {
+ free (dirs[fd].name);
+ dirs[fd].name = NULL;
+ }
+}
+
+/* Mark FD as visiting FILENAME. FD must be non-negative, and refer
+ to an open file descriptor. If REPLACE_OPEN_DIRECTORY is non-zero,
+ this should only be called if FD is visiting a directory. Close FD
+ and return -1 if there is insufficient memory to track the
+ directory name; otherwise return FD. */
+int
+_gl_register_fd (int fd, const char *filename)
+{
+ struct stat statbuf;
+
+ assert (0 <= fd);
+ if (REPLACE_OPEN_DIRECTORY
+ || (fstat (fd, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)))
+ {
+ if (!ensure_dirs_slot (fd)
+ || (dirs[fd].name = get_name (filename)) == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ return fd;
+}
+
+/* Mark NEWFD as a duplicate of OLDFD; useful from dup, dup2, dup3,
+ and fcntl. Both arguments must be valid and distinct file
+ descriptors. Close NEWFD and return -1 if OLDFD is tracking a
+ directory, but there is insufficient memory to track the same
+ directory in NEWFD; otherwise return NEWFD. */
+int
+_gl_register_dup (int oldfd, int newfd)
+{
+ assert (0 <= oldfd && 0 <= newfd && oldfd != newfd);
+ if (oldfd < dirs_allocated && dirs[oldfd].name)
+ {
+ /* Duplicated a directory; must ensure newfd is allocated. */
+ if (!ensure_dirs_slot (newfd)
+ || (dirs[newfd].name = strdup (dirs[oldfd].name)) == NULL)
+ {
+ int saved_errno = errno;
+ close (newfd);
+ errno = saved_errno;
+ newfd = -1;
+ }
+ }
+ else if (newfd < dirs_allocated)
+ {
+ /* Duplicated a non-directory; ensure newfd is cleared. */
+ free (dirs[newfd].name);
+ dirs[newfd].name = NULL;
+ }
+ return newfd;
+}
+
+/* If FD is currently visiting a directory, then return the name of
+ that directory. Otherwise, return NULL and set errno. */
+const char *
+_gl_directory_name (int fd)
+{
+ if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+ return dirs[fd].name;
+ /* At this point, fd is either invalid, or open but not a directory.
+ If dup2 fails, errno is correctly EBADF. */
+ if (0 <= fd)
+ {
+ if (dup2 (fd, fd) == fd)
+ errno = ENOTDIR;
+ }
+ else
+ errno = EBADF;
+ return NULL;
+}
+
+
+/* Implement fchdir() in terms of chdir(). */
+
+int
+fchdir (int fd)
+{
+ const char *name = _gl_directory_name (fd);
+ return name ? chdir (name) : -1;
+}
diff --git a/gnulib/lib/fchmodat.c b/gnulib/lib/fchmodat.c
new file mode 100644
index 0000000..18fc4df
--- /dev/null
+++ b/gnulib/lib/fchmodat.c
@@ -0,0 +1,53 @@
+/* Change the protections of file relative to an open directory.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#ifndef HAVE_LCHMOD
+/* Use a different name, to avoid conflicting with any
+ system-supplied declaration. */
+# undef lchmod
+# define lchmod lchmod_rpl
+static int
+lchmod (char const *f _GL_UNUSED, mode_t m _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#endif
+
+/* Solaris 10 has no function like this.
+ Invoke chmod or lchmod on file, FILE, using mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then (chmod|lchmod)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero.
+ Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW
+ on a system without lchmod support causes this function to fail. */
+
+#define AT_FUNC_NAME fchmodat
+#define AT_FUNC_F1 lchmod
+#define AT_FUNC_F2 chmod
+#define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/fchown-stub.c b/gnulib/lib/fchown-stub.c
new file mode 100644
index 0000000..6be750b
--- /dev/null
+++ b/gnulib/lib/fchown-stub.c
@@ -0,0 +1,16 @@
+#include <config.h>
+
+#include <sys/types.h>
+#include <errno.h>
+
+/* A trivial substitute for `fchown'.
+
+ DJGPP 2.03 and earlier (and perhaps later) don't have `fchown',
+ so we pretend no-one has permission for this operation. */
+
+int
+fchown (int fd, uid_t uid, gid_t gid)
+{
+ errno = EPERM;
+ return -1;
+}
diff --git a/gnulib/lib/fchownat.c b/gnulib/lib/fchownat.c
new file mode 100644
index 0000000..303d0fd
--- /dev/null
+++ b/gnulib/lib/fchownat.c
@@ -0,0 +1,114 @@
+/* This function serves as replacement for a missing fchownat function,
+ as well as a work around for the fchownat bug in glibc-2.4:
+ <http://lists.ubuntu.com/archives/ubuntu-users/2006-September/093218.html>
+ when the buggy fchownat-with-AT_SYMLINK_NOFOLLOW operates on a symlink, it
+ mistakenly affects the symlink referent, rather than the symlink itself.
+
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#include "openat.h"
+
+#if !HAVE_FCHOWNAT
+
+/* Replacement for Solaris' function by the same name.
+ Invoke chown or lchown on file, FILE, using OWNER and GROUP, in the
+ directory open on descriptor FD. If FLAG is AT_SYMLINK_NOFOLLOW, then
+ use lchown, otherwise, use chown. If possible, do it without changing
+ the working directory. Otherwise, resort to using save_cwd/fchdir,
+ then (chown|lchown)/restore_cwd. If either the save_cwd or the
+ restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME fchownat
+# define AT_FUNC_F1 lchown
+# define AT_FUNC_F2 chown
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , uid_t owner, gid_t group, int flag
+# define AT_FUNC_POST_FILE_ARGS , owner, group
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#else /* HAVE_FCHOWNAT */
+
+# undef fchownat
+
+# if FCHOWNAT_NOFOLLOW_BUG
+
+/* Failure to handle AT_SYMLINK_NOFOLLOW requires the /proc/self/fd or
+ fchdir workaround to call lchown for lchownat, but there is no need
+ to penalize chownat. */
+static int
+local_lchownat (int fd, char const *file, uid_t owner, gid_t group);
+
+# define AT_FUNC_NAME local_lchownat
+# define AT_FUNC_F1 lchown
+# define AT_FUNC_POST_FILE_PARAM_DECLS , uid_t owner, gid_t group
+# define AT_FUNC_POST_FILE_ARGS , owner, group
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+# endif
+
+/* Work around bugs with trailing slash, using the same workarounds as
+ chown and lchown. */
+
+int
+rpl_fchownat (int fd, char const *file, uid_t owner, gid_t group, int flag)
+{
+# if FCHOWNAT_NOFOLLOW_BUG
+ if (flag == AT_SYMLINK_NOFOLLOW)
+ return local_lchownat (fd, file, owner, group);
+# endif
+# if FCHOWNAT_EMPTY_FILENAME_BUG
+ if (file[0] == '\0')
+ {
+ errno = ENOENT;
+ return -1;
+ }
+# endif
+# if CHOWN_TRAILING_SLASH_BUG
+ {
+ size_t len = strlen (file);
+ struct stat st;
+ if (len && file[len - 1] == '/')
+ {
+ if (statat (fd, file, &st))
+ return -1;
+ if (flag == AT_SYMLINK_NOFOLLOW)
+ return fchownat (fd, file, owner, group, 0);
+ }
+ }
+# endif
+ return fchownat (fd, file, owner, group, flag);
+}
+
+#endif /* HAVE_FCHOWNAT */
diff --git a/gnulib/lib/fclose.c b/gnulib/lib/fclose.c
new file mode 100644
index 0000000..3abe2e8
--- /dev/null
+++ b/gnulib/lib/fclose.c
@@ -0,0 +1,110 @@
+/* fclose replacement.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "freading.h"
+#include "msvc-inval.h"
+
+#undef fclose
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+fclose_nothrow (FILE *fp)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = fclose (fp);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = EOF;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#else
+# define fclose_nothrow fclose
+#endif
+
+/* Override fclose() to call the overridden fflush() or close(). */
+
+int
+rpl_fclose (FILE *fp)
+{
+ int saved_errno = 0;
+ int fd;
+ int result = 0;
+
+ /* Don't change behavior on memstreams. */
+ fd = fileno (fp);
+ if (fd < 0)
+ return fclose_nothrow (fp);
+
+ /* We only need to flush the file if it is not reading or if it is
+ seekable. This only guarantees the file position of input files
+ if the fflush module is also in use. */
+ if ((!freading (fp) || lseek (fileno (fp), 0, SEEK_CUR) != -1)
+ && fflush (fp))
+ saved_errno = errno;
+
+ /* fclose() calls close(), but we need to also invoke all hooks that our
+ overridden close() function invokes. See lib/close.c. */
+#if WINDOWS_SOCKETS
+ /* Call the overridden close(), then the original fclose().
+ Note about multithread-safety: There is a race condition where some
+ other thread could open fd between our close and fclose. */
+ if (close (fd) < 0 && saved_errno == 0)
+ saved_errno = errno;
+
+ fclose_nothrow (fp); /* will fail with errno = EBADF,
+ if we did not lose a race */
+
+#else /* !WINDOWS_SOCKETS */
+ /* Call fclose() and invoke all hooks of the overridden close(). */
+
+# if REPLACE_FCHDIR
+ /* Note about multithread-safety: There is a race condition here as well.
+ Some other thread could open fd between our calls to fclose and
+ _gl_unregister_fd. */
+ result = fclose_nothrow (fp);
+ if (result == 0)
+ _gl_unregister_fd (fd);
+# else
+ /* No race condition here. */
+ result = fclose_nothrow (fp);
+# endif
+
+#endif /* !WINDOWS_SOCKETS */
+
+ if (saved_errno != 0)
+ {
+ errno = saved_errno;
+ result = EOF;
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/fcntl--.h b/gnulib/lib/fcntl--.h
new file mode 100644
index 0000000..ad696c9
--- /dev/null
+++ b/gnulib/lib/fcntl--.h
@@ -0,0 +1,32 @@
+/* Like fcntl.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <fcntl.h>
+#include "fcntl-safer.h"
+
+#undef open
+#define open open_safer
+
+#undef creat
+#define creat creat_safer
+
+#if GNULIB_OPENAT_SAFER
+# undef openat
+# define openat openat_safer
+#endif
diff --git a/gnulib/lib/fcntl-safer.h b/gnulib/lib/fcntl-safer.h
new file mode 100644
index 0000000..2aaf17e
--- /dev/null
+++ b/gnulib/lib/fcntl-safer.h
@@ -0,0 +1,27 @@
+/* Invoke fcntl-like functions, but avoid some glitches.
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <sys/types.h>
+
+int open_safer (char const *, int, ...);
+int creat_safer (char const *, mode_t);
+
+#if GNULIB_OPENAT_SAFER
+int openat_safer (int, char const *, int, ...);
+#endif
diff --git a/gnulib/lib/fcntl.c b/gnulib/lib/fcntl.c
new file mode 100644
index 0000000..92e32ee
--- /dev/null
+++ b/gnulib/lib/fcntl.c
@@ -0,0 +1,311 @@
+/* Provide file descriptor control.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <fcntl.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <unistd.h>
+
+#if !HAVE_FCNTL
+# define rpl_fcntl fcntl
+#endif
+#undef fcntl
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+
+/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
+# define OPEN_MAX_MAX 0x10000
+
+/* Duplicate OLDFD into the first available slot of at least NEWFD,
+ which must be positive, with FLAGS determining whether the duplicate
+ will be inheritable. */
+static int
+dupfd (int oldfd, int newfd, int flags)
+{
+ /* Mingw has no way to create an arbitrary fd. Iterate until all
+ file descriptors less than newfd are filled up. */
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
+ unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
+ unsigned int fds_to_close_bound = 0;
+ int result;
+ BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
+ int mode;
+
+ if (newfd < 0 || getdtablesize () <= newfd)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ if (old_handle == INVALID_HANDLE_VALUE
+ || (mode = setmode (oldfd, O_BINARY)) == -1)
+ {
+ /* oldfd is not open, or is an unassigned standard file
+ descriptor. */
+ errno = EBADF;
+ return -1;
+ }
+ setmode (oldfd, mode);
+ flags |= mode;
+
+ for (;;)
+ {
+ HANDLE new_handle;
+ int duplicated_fd;
+ unsigned int index;
+
+ if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
+ old_handle, /* SourceHandle */
+ curr_process, /* TargetProcessHandle */
+ (PHANDLE) &new_handle, /* TargetHandle */
+ (DWORD) 0, /* DesiredAccess */
+ inherit, /* InheritHandle */
+ DUPLICATE_SAME_ACCESS)) /* Options */
+ {
+ /* TODO: Translate GetLastError () into errno. */
+ errno = EMFILE;
+ result = -1;
+ break;
+ }
+ duplicated_fd = _open_osfhandle ((long) new_handle, flags);
+ if (duplicated_fd < 0)
+ {
+ CloseHandle (new_handle);
+ errno = EMFILE;
+ result = -1;
+ break;
+ }
+ if (newfd <= duplicated_fd)
+ {
+ result = duplicated_fd;
+ break;
+ }
+
+ /* Set the bit duplicated_fd in fds_to_close[]. */
+ index = (unsigned int) duplicated_fd / CHAR_BIT;
+ if (fds_to_close_bound <= index)
+ {
+ if (sizeof fds_to_close <= index)
+ /* Need to increase OPEN_MAX_MAX. */
+ abort ();
+ memset (fds_to_close + fds_to_close_bound, '\0',
+ index + 1 - fds_to_close_bound);
+ fds_to_close_bound = index + 1;
+ }
+ fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
+ }
+
+ /* Close the previous fds that turned out to be too small. */
+ {
+ int saved_errno = errno;
+ unsigned int duplicated_fd;
+
+ for (duplicated_fd = 0;
+ duplicated_fd < fds_to_close_bound * CHAR_BIT;
+ duplicated_fd++)
+ if ((fds_to_close[duplicated_fd / CHAR_BIT]
+ >> (duplicated_fd % CHAR_BIT))
+ & 1)
+ close (duplicated_fd);
+
+ errno = saved_errno;
+ }
+
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (oldfd, result);
+# endif
+ return result;
+}
+#endif /* W32 */
+
+/* Perform the specified ACTION on the file descriptor FD, possibly
+ using the argument ARG further described below. This replacement
+ handles the following actions, and forwards all others on to the
+ native fcntl. An unrecognized ACTION returns -1 with errno set to
+ EINVAL.
+
+ F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
+ If successful, return the duplicate, which will be inheritable;
+ otherwise return -1 and set errno.
+
+ F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
+ target fd. If successful, return the duplicate, which will not be
+ inheritable; otherwise return -1 and set errno.
+
+ F_GETFD - ARG need not be present. If successful, return a
+ non-negative value containing the descriptor flags of FD (only
+ FD_CLOEXEC is portable, but other flags may be present); otherwise
+ return -1 and set errno. */
+
+int
+rpl_fcntl (int fd, int action, /* arg */...)
+{
+ va_list arg;
+ int result = -1;
+ va_start (arg, action);
+ switch (action)
+ {
+
+#if !HAVE_FCNTL
+ case F_DUPFD:
+ {
+ int target = va_arg (arg, int);
+ result = dupfd (fd, target, 0);
+ break;
+ }
+#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
+ case F_DUPFD:
+ {
+ int target = va_arg (arg, int);
+ /* Detect invalid target; needed for cygwin 1.5.x. */
+ if (target < 0 || getdtablesize () <= target)
+ errno = EINVAL;
+ else
+ {
+ /* Haiku alpha 2 loses fd flags on original. */
+ int flags = fcntl (fd, F_GETFD);
+ if (flags < 0)
+ {
+ result = -1;
+ break;
+ }
+ result = fcntl (fd, action, target);
+ if (0 <= result && fcntl (fd, F_SETFD, flags) == -1)
+ {
+ int saved_errno = errno;
+ close (result);
+ result = -1;
+ errno = saved_errno;
+ }
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ break;
+ } /* F_DUPFD */
+#endif /* FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR */
+
+ case F_DUPFD_CLOEXEC:
+ {
+ int target = va_arg (arg, int);
+
+#if !HAVE_FCNTL
+ result = dupfd (fd, target, O_CLOEXEC);
+ break;
+#else /* HAVE_FCNTL */
+ /* Try the system call first, if the headers claim it exists
+ (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
+ may be running with a glibc that has the macro but with an
+ older kernel that does not support it. Cache the
+ information on whether the system call really works, but
+ avoid caching failure if the corresponding F_DUPFD fails
+ for any reason. 0 = unknown, 1 = yes, -1 = no. */
+ static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
+ if (0 <= have_dupfd_cloexec)
+ {
+ result = fcntl (fd, action, target);
+ if (0 <= result || errno != EINVAL)
+ {
+ have_dupfd_cloexec = 1;
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ else
+ {
+ result = rpl_fcntl (fd, F_DUPFD, target);
+ if (result < 0)
+ break;
+ have_dupfd_cloexec = -1;
+ }
+ }
+ else
+ result = rpl_fcntl (fd, F_DUPFD, target);
+ if (0 <= result && have_dupfd_cloexec == -1)
+ {
+ int flags = fcntl (result, F_GETFD);
+ if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+ close (result);
+ errno = saved_errno;
+ result = -1;
+ }
+ }
+ break;
+#endif /* HAVE_FCNTL */
+ } /* F_DUPFD_CLOEXEC */
+
+#if !HAVE_FCNTL
+ case F_GETFD:
+ {
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ HANDLE handle = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (handle == INVALID_HANDLE_VALUE
+ || GetHandleInformation (handle, &flags) == 0)
+ errno = EBADF;
+ else
+ result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
+# else /* !W32 */
+ /* Use dup2 to reject invalid file descriptors. No way to
+ access this information, so punt. */
+ if (0 <= dup2 (fd, fd))
+ result = 0;
+# endif /* !W32 */
+ break;
+ } /* F_GETFD */
+#endif /* !HAVE_FCNTL */
+
+ /* Implementing F_SETFD on mingw is not trivial - there is no
+ API for changing the O_NOINHERIT bit on an fd, and merely
+ changing the HANDLE_FLAG_INHERIT bit on the underlying handle
+ can lead to odd state. It may be possible by duplicating the
+ handle, using _open_osfhandle with the right flags, then
+ using dup2 to move the duplicate onto the original, but that
+ is not supported for now. */
+
+ default:
+ {
+#if HAVE_FCNTL
+ void *p = va_arg (arg, void *);
+ result = fcntl (fd, action, p);
+#else
+ errno = EINVAL;
+#endif
+ break;
+ }
+ }
+ va_end (arg);
+ return result;
+}
diff --git a/gnulib/lib/fcntl.in.h b/gnulib/lib/fcntl.in.h
new file mode 100644
index 0000000..0a07221
--- /dev/null
+++ b/gnulib/lib/fcntl.in.h
@@ -0,0 +1,325 @@
+/* Like <fcntl.h>, but with non-working flags defined to 0.
+
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_fcntl_h
+/* Special invocation convention. */
+
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+ <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
+ But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+ extern "C" { ... } block, which leads to errors in C++ mode with the
+ overridden <sys/stat.h> from gnulib. These errors are known to be gone
+ with g++ version >= 4.3. */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
+# include <sys/stat.h>
+#endif
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+ <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
+ But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+ extern "C" { ... } block, which leads to errors in C++ mode with the
+ overridden <sys/stat.h> from gnulib. These errors are known to be gone
+ with g++ version >= 4.3. */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
+# include <sys/stat.h>
+#endif
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+#define _@GUARD_PREFIX@_FCNTL_H
+
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
+# include <unistd.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_FCNTL@
+# if @REPLACE_FCNTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcntl
+# define fcntl rpl_fcntl
+# endif
+_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
+_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+# else
+# if !@HAVE_FCNTL@
+_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+# endif
+_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
+# endif
+_GL_CXXALIASWARN (fcntl);
+#elif defined GNULIB_POSIXCHECK
+# undef fcntl
+# if HAVE_RAW_DECL_FCNTL
+_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
+ "use gnulib module fcntl for portability");
+# endif
+#endif
+
+#if @GNULIB_OPEN@
+# if @REPLACE_OPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef open
+# define open rpl_open
+# endif
+_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
+ default argument. _GL_CXXALIASWARN does not work in this case. */
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef open
+/* Assume open is always declared. */
+_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
+ "use gnulib module open for portability");
+#endif
+
+#if @GNULIB_OPENAT@
+# if @REPLACE_OPENAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef openat
+# define openat rpl_openat
+# endif
+_GL_FUNCDECL_RPL (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# else
+# if !@HAVE_OPENAT@
+_GL_FUNCDECL_SYS (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# endif
+_GL_CXXALIASWARN (openat);
+#elif defined GNULIB_POSIXCHECK
+# undef openat
+# if HAVE_RAW_DECL_OPENAT
+_GL_WARN_ON_USE (openat, "openat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+/* Fix up the FD_* macros, only known to be missing on mingw. */
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 1
+#endif
+
+/* Fix up the supported F_* macros. Intentionally leave other F_*
+ macros undefined. Only known to be missing on mingw. */
+
+#ifndef F_DUPFD_CLOEXEC
+# define F_DUPFD_CLOEXEC 0x40000000
+/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
+# define GNULIB_defined_F_DUPFD_CLOEXEC 1
+#else
+# define GNULIB_defined_F_DUPFD_CLOEXEC 0
+#endif
+
+#ifndef F_DUPFD
+# define F_DUPFD 1
+#endif
+
+#ifndef F_GETFD
+# define F_GETFD 2
+#endif
+
+/* Fix up the O_* macros. */
+
+#if !defined O_DIRECT && defined O_DIRECTIO
+/* Tru64 spells it `O_DIRECTIO'. */
+# define O_DIRECT O_DIRECTIO
+#endif
+
+#if !defined O_CLOEXEC && defined O_NOINHERIT
+/* Mingw spells it `O_NOINHERIT'. */
+# define O_CLOEXEC O_NOINHERIT
+#endif
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+#endif
+
+#ifndef O_DIRECT
+# define O_DIRECT 0
+#endif
+
+#ifndef O_DIRECTORY
+# define O_DIRECTORY 0
+#endif
+
+#ifndef O_DSYNC
+# define O_DSYNC 0
+#endif
+
+#ifndef O_EXEC
+# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
+#endif
+
+#ifndef O_NDELAY
+# define O_NDELAY 0
+#endif
+
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+
+/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
+ value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
+ or to 0 as fallback. */
+#if @GNULIB_NONBLOCKING@
+# if O_NONBLOCK
+# define GNULIB_defined_O_NONBLOCK 0
+# else
+# define GNULIB_defined_O_NONBLOCK 1
+# undef O_NONBLOCK
+# define O_NONBLOCK 0x40000000
+# endif
+#endif
+
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#ifndef O_NOLINKS
+# define O_NOLINKS 0
+#endif
+
+#ifndef O_RSYNC
+# define O_RSYNC 0
+#endif
+
+#ifndef O_SEARCH
+# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */
+#endif
+
+#ifndef O_SYNC
+# define O_SYNC 0
+#endif
+
+#ifndef O_TTY_INIT
+# define O_TTY_INIT 0
+#endif
+
+#if O_ACCMODE != (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+# undef O_ACCMODE
+# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in fcntl.h */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+
+#if defined __BEOS__ || defined __HAIKU__
+ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+# define O_TEXT 0
+#endif
+
+/* Fix up the AT_* macros. */
+
+/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
+ value exceeds INT_MAX, so its use as an int doesn't conform to the
+ C standard, and GCC and Sun C complain in some cases. If the bug
+ is present, undef AT_FDCWD here, so it can be redefined below. */
+#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
+# undef AT_FDCWD
+#endif
+
+/* Use the same bit pattern as Solaris 9, but with the proper
+ signedness. The bit pattern is important, in case this actually is
+ Solaris with the above workaround. */
+#ifndef AT_FDCWD
+# define AT_FDCWD (-3041965)
+#endif
+
+/* Use the same values as Solaris 9. This shouldn't matter, but
+ there's no real reason to differ. */
+#ifndef AT_SYMLINK_NOFOLLOW
+# define AT_SYMLINK_NOFOLLOW 4096
+#endif
+
+#ifndef AT_REMOVEDIR
+# define AT_REMOVEDIR 1
+#endif
+
+/* Solaris 9 lacks these two, so just pick unique values. */
+#ifndef AT_SYMLINK_FOLLOW
+# define AT_SYMLINK_FOLLOW 2
+#endif
+
+#ifndef AT_EACCESS
+# define AT_EACCESS 4
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif
diff --git a/gnulib/lib/fd-hook.c b/gnulib/lib/fd-hook.c
new file mode 100644
index 0000000..40fbeeb
--- /dev/null
+++ b/gnulib/lib/fd-hook.c
@@ -0,0 +1,116 @@
+/* Hook for making making file descriptor functions close(), ioctl() extensible.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fd-hook.h"
+
+#include <stdlib.h>
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+/* The first and last link in the doubly linked list.
+ Initially the list is empty. */
+static struct fd_hook anchor = { &anchor, &anchor, NULL, NULL };
+
+int
+execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary,
+ int fd)
+{
+ if (remaining_list == &anchor)
+ /* End of list reached. */
+ return primary (fd);
+ else
+ return remaining_list->private_close_fn (remaining_list->private_next,
+ primary, fd);
+}
+
+int
+execute_all_close_hooks (gl_close_fn primary, int fd)
+{
+ return execute_close_hooks (anchor.private_next, primary, fd);
+}
+
+int
+execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ if (remaining_list == &anchor)
+ /* End of list reached. */
+ return primary (fd, request, arg);
+ else
+ return remaining_list->private_ioctl_fn (remaining_list->private_next,
+ primary, fd, request, arg);
+}
+
+int
+execute_all_ioctl_hooks (gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg);
+}
+
+void
+register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link)
+{
+ if (close_hook == NULL)
+ close_hook = execute_close_hooks;
+ if (ioctl_hook == NULL)
+ ioctl_hook = execute_ioctl_hooks;
+
+ if (link->private_next == NULL && link->private_prev == NULL)
+ {
+ /* Add the link to the doubly linked list. */
+ link->private_next = anchor.private_next;
+ link->private_prev = &anchor;
+ link->private_close_fn = close_hook;
+ link->private_ioctl_fn = ioctl_hook;
+ anchor.private_next->private_prev = link;
+ anchor.private_next = link;
+ }
+ else
+ {
+ /* The link is already in use. */
+ if (link->private_close_fn != close_hook
+ || link->private_ioctl_fn != ioctl_hook)
+ abort ();
+ }
+}
+
+void
+unregister_fd_hook (struct fd_hook *link)
+{
+ struct fd_hook *next = link->private_next;
+ struct fd_hook *prev = link->private_prev;
+
+ if (next != NULL && prev != NULL)
+ {
+ /* The link is in use. Remove it from the doubly linked list. */
+ prev->private_next = next;
+ next->private_prev = prev;
+ /* Clear the link, to mark it unused. */
+ link->private_next = NULL;
+ link->private_prev = NULL;
+ link->private_close_fn = NULL;
+ link->private_ioctl_fn = NULL;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/fd-hook.h b/gnulib/lib/fd-hook.h
new file mode 100644
index 0000000..aab4d91
--- /dev/null
+++ b/gnulib/lib/fd-hook.h
@@ -0,0 +1,119 @@
+/* Hook for making making file descriptor functions close(), ioctl() extensible.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef FD_HOOK_H
+#define FD_HOOK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+
+/* Type of function that closes FD. */
+typedef int (*gl_close_fn) (int fd);
+
+/* Type of function that applies a control request to FD. */
+typedef int (*gl_ioctl_fn) (int fd, int request, void *arg);
+
+/* An element of the list of file descriptor hooks.
+ In CLOS (Common Lisp Object System) speak, it consists of an "around"
+ method for the close() function and an "around" method for the ioctl()
+ function.
+ The fields of this structure are considered private. */
+struct fd_hook
+{
+ /* Doubly linked list. */
+ struct fd_hook *private_next;
+ struct fd_hook *private_prev;
+ /* Function that treats the types of FD that it knows about and calls
+ execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback. */
+ int (*private_close_fn) (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+ /* Function that treats the types of FD that it knows about and calls
+ execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a
+ fallback. */
+ int (*private_ioctl_fn) (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+};
+
+/* This type of function closes FD, applying special knowledge for the FD
+ types it knows about, and calls
+ execute_close_hooks (REMAINING_LIST, PRIMARY, FD)
+ for the other FD types.
+ In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+ and PRIMARY is the "primary" method for close(). */
+typedef int (*close_hook_fn) (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+
+/* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+ Return 0 or -1, like close() would do. */
+extern int execute_close_hooks (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+
+/* Execute all close hooks, with PRIMARY as "primary" method.
+ Return 0 or -1, like close() would do. */
+extern int execute_all_close_hooks (gl_close_fn primary, int fd);
+
+/* This type of function applies a control request to FD, applying special
+ knowledge for the FD types it knows about, and calls
+ execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG)
+ for the other FD types.
+ In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+ and PRIMARY is the "primary" method for ioctl(). */
+typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+ Return 0 or -1, like ioctl() would do. */
+extern int execute_ioctl_hooks (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Execute all ioctl hooks, with PRIMARY as "primary" method.
+ Return 0 or -1, like ioctl() would do. */
+extern int execute_all_ioctl_hooks (gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Add a function pair to the list of file descriptor hooks.
+ CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change.
+ The LINK variable points to a piece of memory which is guaranteed to be
+ accessible until the corresponding call to unregister_fd_hook. */
+extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook,
+ struct fd_hook *link);
+
+/* Removes a hook from the list of file descriptor hooks. */
+extern void unregister_fd_hook (struct fd_hook *link);
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FD_HOOK_H */
diff --git a/gnulib/lib/fd-safer-flag.c b/gnulib/lib/fd-safer-flag.c
new file mode 100644
index 0000000..2305b73
--- /dev/null
+++ b/gnulib/lib/fd-safer-flag.c
@@ -0,0 +1,52 @@
+/* Adjust a file descriptor result so that it avoids clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. If FLAG
+ contains O_CLOEXEC, the returned FD will have close-on-exec
+ semantics. On failure to duplicate, close FD, set errno, and
+ return -1. Preserve errno if FD is negative, so that the caller
+ can always inspect errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer_flag (open ("file", O_RDONLY | flag), flag). */
+
+int
+fd_safer_flag (int fd, int flag)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer_flag (fd, flag);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/gnulib/lib/fd-safer.c b/gnulib/lib/fd-safer.c
new file mode 100644
index 0000000..910fa4c
--- /dev/null
+++ b/gnulib/lib/fd-safer.c
@@ -0,0 +1,49 @@
+/* Return a safer copy of a file descriptor.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. On
+ failure to duplicate, close FD, set errno, and return -1. Preserve
+ errno if FD is negative, so that the caller can always inspect
+ errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer (open ("file", O_RDONLY)). */
+
+int
+fd_safer (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/gnulib/lib/fdatasync.c b/gnulib/lib/fdatasync.c
new file mode 100644
index 0000000..3d26793
--- /dev/null
+++ b/gnulib/lib/fdatasync.c
@@ -0,0 +1,27 @@
+/* Emulate fdatasync on platforms that lack it.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <unistd.h>
+
+int
+fdatasync (int fd)
+{
+ /* This does more work than strictly necessary, but is the best we
+ can do portably. */
+ return fsync (fd);
+}
diff --git a/gnulib/lib/fdopen.c b/gnulib/lib/fdopen.c
new file mode 100644
index 0000000..50c889b
--- /dev/null
+++ b/gnulib/lib/fdopen.c
@@ -0,0 +1,69 @@
+/* Open a stream with a given file descriptor.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef fdopen
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static FILE *
+fdopen_nothrow (int fd, const char *mode)
+{
+ FILE *result;
+
+ TRY_MSVC_INVAL
+ {
+ result = fdopen (fd, mode);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = NULL;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#else
+# define fdopen_nothrow fdopen
+#endif
+
+FILE *
+rpl_fdopen (int fd, const char *mode)
+{
+ int saved_errno = errno;
+ FILE *fp;
+
+ errno = 0;
+ fp = fdopen_nothrow (fd, mode);
+ if (fp == NULL)
+ {
+ if (errno == 0)
+ errno = EBADF;
+ }
+ else
+ errno = saved_errno;
+
+ return fp;
+}
diff --git a/gnulib/lib/fdopendir.c b/gnulib/lib/fdopendir.c
new file mode 100644
index 0000000..0853e59
--- /dev/null
+++ b/gnulib/lib/fdopendir.c
@@ -0,0 +1,204 @@
+/* provide a replacement fdopendir function
+ Copyright (C) 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if !HAVE_FDOPENDIR
+
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+# if GNULIB_DIRENT_SAFER
+# include "dirent--.h"
+# endif
+
+# ifndef REPLACE_FCHDIR
+# define REPLACE_FCHDIR 0
+# endif
+
+static DIR *fdopendir_with_dup (int, int, struct saved_cwd const *);
+static DIR *fd_clone_opendir (int, struct saved_cwd const *);
+
+/* Replacement for POSIX fdopendir.
+
+ First, try to simulate it via opendir ("/proc/self/fd/..."). Failing
+ that, simulate it by using fchdir metadata, or by doing
+ save_cwd/fchdir/opendir(".")/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+
+ If successful, the resulting stream is based on FD in
+ implementations where streams are based on file descriptors and in
+ applications where no other thread or signal handler allocates or
+ frees file descriptors. In other cases, consult dirfd on the result
+ to find out whether FD is still being used.
+
+ Otherwise, this function works just like POSIX fdopendir.
+
+ W A R N I N G:
+
+ Unlike other fd-related functions, this one places constraints on FD.
+ If this function returns successfully, FD is under control of the
+ dirent.h system, and the caller should not close or modify the state of
+ FD other than by the dirent.h functions. */
+DIR *
+fdopendir (int fd)
+{
+ DIR *dir = fdopendir_with_dup (fd, -1, NULL);
+
+ if (! REPLACE_FCHDIR && ! dir)
+ {
+ int saved_errno = errno;
+ if (EXPECTED_ERRNO (saved_errno))
+ {
+ struct saved_cwd cwd;
+ if (save_cwd (&cwd) != 0)
+ openat_save_fail (errno);
+ dir = fdopendir_with_dup (fd, -1, &cwd);
+ saved_errno = errno;
+ free_cwd (&cwd);
+ errno = saved_errno;
+ }
+ }
+
+ return dir;
+}
+
+/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known
+ to be a dup of FD which is less than FD - 1 and which will be
+ closed by the caller and not otherwise used by the caller. This
+ function makes sure that FD is closed and all file descriptors less
+ than FD are open, and then calls fd_clone_opendir on a dup of FD.
+ That way, barring race conditions, fd_clone_opendir returns a
+ stream whose file descriptor is FD.
+
+ If REPLACE_CHDIR or CWD is null, use opendir ("/proc/self/fd/...",
+ falling back on fchdir metadata. Otherwise, CWD is a saved version
+ of the working directory; use fchdir/opendir(".")/restore_cwd(CWD). */
+static DIR *
+fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd)
+{
+ int dupfd = dup (fd);
+ if (dupfd < 0 && errno == EMFILE)
+ dupfd = older_dupfd;
+ if (dupfd < 0)
+ return NULL;
+ else
+ {
+ DIR *dir;
+ int saved_errno;
+ if (dupfd < fd - 1 && dupfd != older_dupfd)
+ {
+ dir = fdopendir_with_dup (fd, dupfd, cwd);
+ saved_errno = errno;
+ }
+ else
+ {
+ close (fd);
+ dir = fd_clone_opendir (dupfd, cwd);
+ saved_errno = errno;
+ if (! dir)
+ {
+ int fd1 = dup (dupfd);
+ if (fd1 != fd)
+ openat_save_fail (fd1 < 0 ? errno : EBADF);
+ }
+ }
+
+ if (dupfd != older_dupfd)
+ close (dupfd);
+ errno = saved_errno;
+ return dir;
+ }
+}
+
+/* Like fdopendir, except the result controls a clone of FD. It is
+ the caller's responsibility both to close FD and (if the result is
+ not null) to closedir the result. */
+static DIR *
+fd_clone_opendir (int fd, struct saved_cwd const *cwd)
+{
+ if (REPLACE_FCHDIR || ! cwd)
+ {
+ DIR *dir = NULL;
+ int saved_errno = EOPNOTSUPP;
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ dir = opendir (proc_file);
+ saved_errno = errno;
+ if (proc_file != buf)
+ free (proc_file);
+ }
+# if REPLACE_FCHDIR
+ if (! dir && EXPECTED_ERRNO (saved_errno))
+ {
+ char const *name = _gl_directory_name (fd);
+ return (name ? opendir (name) : NULL);
+ }
+# endif
+ errno = saved_errno;
+ return dir;
+ }
+ else
+ {
+ if (fchdir (fd) != 0)
+ return NULL;
+ else
+ {
+ DIR *dir = opendir (".");
+ int saved_errno = errno;
+ if (restore_cwd (cwd) != 0)
+ openat_restore_fail (errno);
+ errno = saved_errno;
+ return dir;
+ }
+ }
+}
+
+#else /* HAVE_FDOPENDIR */
+
+# include <errno.h>
+# include <sys/stat.h>
+
+# undef fdopendir
+
+/* Like fdopendir, but work around GNU/Hurd bug by validating FD. */
+
+DIR *
+rpl_fdopendir (int fd)
+{
+ struct stat st;
+ if (fstat (fd, &st))
+ return NULL;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return NULL;
+ }
+ return fdopendir (fd);
+}
+
+#endif /* HAVE_FDOPENDIR */
diff --git a/gnulib/lib/fdutimensat.c b/gnulib/lib/fdutimensat.c
new file mode 100644
index 0000000..d226638
--- /dev/null
+++ b/gnulib/lib/fdutimensat.c
@@ -0,0 +1,57 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+/* derived from a function in utimens.c */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* Set the access and modification time stamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively; relative to directory DIR.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ ATFLAG is passed to utimensat if FD is negative or futimens was
+ unsupported, which can allow operation on FILE as a symlink.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+fdutimensat (int fd, int dir, char const *file, struct timespec const ts[2],
+ int atflag)
+{
+ int result = 1;
+ if (0 <= fd)
+ result = futimens (fd, ts);
+ if (file && (fd < 0 || (result == -1 && errno == ENOSYS)))
+ result = utimensat (dir, file, ts, atflag);
+ if (result == 1)
+ {
+ errno = EBADF;
+ result = -1;
+ }
+ return result;
+}
diff --git a/gnulib/lib/fflush.c b/gnulib/lib/fflush.c
new file mode 100644
index 0000000..fdbe6de
--- /dev/null
+++ b/gnulib/lib/fflush.c
@@ -0,0 +1,218 @@
+/* fflush.c -- allow flushing input streams
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+#undef fflush
+
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+
+/* Clear the stream's ungetc buffer, preserving the value of ftello (fp). */
+static inline void
+clear_ungetc_buffer_preserving_position (FILE *fp)
+{
+ if (fp->_flags & _IO_IN_BACKUP)
+ /* _IO_free_backup_area is a bit complicated. Simply call fseek. */
+ fseeko (fp, 0, SEEK_CUR);
+}
+
+#else
+
+/* Clear the stream's ungetc buffer. May modify the value of ftello (fp). */
+static inline void
+clear_ungetc_buffer (FILE *fp)
+{
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (HASUB (fp))
+ {
+ fp_->_p += fp_->_r;
+ fp_->_r = 0;
+ }
+# elif defined __EMX__ /* emx+gcc */
+ if (fp->_ungetc_count > 0)
+ {
+ fp->_ungetc_count = 0;
+ fp->_rcount = - fp->_rcount;
+ }
+# elif defined _IOERR /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ /* Nothing to do. */
+# else /* other implementations */
+ fseeko (fp, 0, SEEK_CUR);
+# endif
+}
+
+#endif
+
+#if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+static inline int
+disable_seek_optimization (FILE *fp)
+{
+ int saved_flags = fp_->_flags & (__SOPT | __SNPT);
+ fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
+ return saved_flags;
+}
+
+static inline void
+restore_seek_optimization (FILE *fp, int saved_flags)
+{
+ fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
+}
+
+#endif
+
+static inline void
+update_fpos_cache (FILE *fp, off_t pos)
+{
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ /* Use a union, since on NetBSD, the compilation flags determine
+ whether fpos_t is typedef'd to off_t or a struct containing a
+ single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+# endif
+ fp_->_flags |= __SOFF;
+#endif
+}
+
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported. */
+int
+rpl_fflush (FILE *stream)
+{
+ /* When stream is NULL, POSIX and C99 only require flushing of "output
+ streams and update streams in which the most recent operation was not
+ input", and all implementations do this.
+
+ When stream is "an output stream or an update stream in which the most
+ recent operation was not input", POSIX and C99 requires that fflush
+ writes out any buffered data, and all implementations do this.
+
+ When stream is, however, an input stream or an update stream in
+ which the most recent operation was input, C99 specifies nothing,
+ and POSIX only specifies behavior if the stream is seekable.
+ mingw, in particular, drops the input buffer, leaving the file
+ descriptor positioned at the end of the input buffer. I.e. ftell
+ (stream) is lost. We don't want to call the implementation's
+ fflush in this case.
+
+ We test ! freading (stream) here, rather than fwriting (stream), because
+ what we need to know is whether the stream holds a "read buffer", and on
+ mingw this is indicated by _IOREAD, regardless of _IOWRT. */
+ if (stream == NULL || ! freading (stream))
+ return fflush (stream);
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+
+ clear_ungetc_buffer_preserving_position (stream);
+
+ return fflush (stream);
+
+#else
+ {
+ /* Notes about the file-position indicator:
+ 1) The file position indicator is incremented by fgetc() and decremented
+ by ungetc():
+ <http://www.opengroup.org/susv3/functions/fgetc.html>
+ "... the fgetc() function shall ... advance the associated file
+ position indicator for the stream ..."
+ <http://www.opengroup.org/susv3/functions/ungetc.html>
+ "The file-position indicator is decremented by each successful
+ call to ungetc()..."
+ 2) <http://www.opengroup.org/susv3/functions/ungetc.html> says:
+ "The value of the file-position indicator for the stream after
+ reading or discarding all pushed-back bytes shall be the same
+ as it was before the bytes were pushed back."
+ Here we are discarding all pushed-back bytes. But more specifically,
+ 3) <http://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> says:
+ "[After fflush(),] the file offset of the underlying open file
+ description shall be set to the file position of the stream, and
+ any characters pushed back onto the stream by ungetc() ... shall
+ be discarded." */
+
+ /* POSIX does not specify fflush behavior for non-seekable input
+ streams. Some implementations purge unread data, some return
+ EBADF, some do nothing. */
+ off_t pos = ftello (stream);
+ if (pos == -1)
+ {
+ errno = EBADF;
+ return EOF;
+ }
+
+ /* Clear the ungetc buffer. */
+ clear_ungetc_buffer (stream);
+
+ /* To get here, we must be flushing a seekable input stream, so the
+ semantics of fpurge are now appropriate to clear the buffer. To
+ avoid losing data, the lseek is also necessary. */
+ {
+ int result = fpurge (stream);
+ if (result != 0)
+ return result;
+ }
+
+# if (defined __sferror || defined __DragonFly__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+ {
+ /* Disable seek optimization for the next fseeko call. This tells the
+ following fseeko call to seek to the desired position directly, rather
+ than to seek to a block-aligned boundary. */
+ int saved_flags = disable_seek_optimization (stream);
+ int result = fseeko (stream, pos, SEEK_SET);
+
+ restore_seek_optimization (stream, saved_flags);
+ return result;
+ }
+
+# else
+
+ pos = lseek (fileno (stream), pos, SEEK_SET);
+ if (pos == -1)
+ return EOF;
+ /* After a successful lseek, update the file descriptor's position cache
+ in the stream. */
+ update_fpos_cache (stream, pos);
+
+ return 0;
+
+# endif
+ }
+#endif
+}
diff --git a/gnulib/lib/ffs.c b/gnulib/lib/ffs.c
new file mode 100644
index 0000000..34916f5
--- /dev/null
+++ b/gnulib/lib/ffs.c
@@ -0,0 +1,56 @@
+/* ffs.c -- find the first set bit in a word.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include <strings.h>
+
+#include <limits.h>
+
+int
+ffs (int i)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ return __builtin_ffs (i);
+#else
+ /* http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup
+ gives this deBruijn constant for a branch-less computation, although
+ that table counted trailing zeros rather than bit position. This
+ requires 32-bit int, we fall back to a naive algorithm on the rare
+ platforms where that assumption is not true. */
+ if (CHAR_BIT * sizeof i == 32)
+ {
+ static unsigned int table[] = {
+ 1, 2, 29, 3, 30, 15, 25, 4, 31, 23, 21, 16, 26, 18, 5, 9,
+ 32, 28, 14, 24, 22, 20, 17, 8, 27, 13, 19, 7, 12, 6, 11, 10
+ };
+ unsigned int u = i;
+ unsigned int bit = u & -u;
+ return table[(bit * 0x077cb531U) >> 27] - !i;
+ }
+ else
+ {
+ unsigned int j;
+ for (j = 0; j < CHAR_BIT * sizeof i; j++)
+ if (i & (1U << j))
+ return j + 1;
+ return 0;
+ }
+#endif
+}
diff --git a/gnulib/lib/ffsl.c b/gnulib/lib/ffsl.c
new file mode 100644
index 0000000..ee99ba7
--- /dev/null
+++ b/gnulib/lib/ffsl.c
@@ -0,0 +1,4 @@
+#define FUNC ffsl
+#define TYPE long int
+#define GCC_BUILTIN __builtin_ffsl
+#include "ffsl.h"
diff --git a/gnulib/lib/ffsl.h b/gnulib/lib/ffsl.h
new file mode 100644
index 0000000..ab994b7
--- /dev/null
+++ b/gnulib/lib/ffsl.h
@@ -0,0 +1,67 @@
+/* ffsl.h -- find the first set bit in a word.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+/* This file is meant to be included by ffsl.c and ffsll.c, after
+ they have defined FUNC and TYPE. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <limits.h>
+#include <strings.h>
+
+#if !defined FUNC || !defined TYPE
+# error
+#endif
+
+int
+FUNC (TYPE i)
+{
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined GCC_BUILTIN
+ return GCC_BUILTIN (i);
+#else
+ unsigned TYPE j = i;
+ /* Split j into chunks, and look at one chunk after the other. */
+ enum { chunk_bits = CHAR_BIT * sizeof (unsigned int) };
+ /* The number of chunks is ceil (sizeof (TYPE) / sizeof (unsigned int))
+ = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1. */
+ enum { chunk_count = (sizeof (TYPE) - 1) / sizeof (unsigned int) + 1 };
+
+ if (chunk_count > 1)
+ {
+ size_t k;
+
+ /* It is tempting to write if (!j) here, but if we do this,
+ Solaris 10/x86 "cc -O" miscompiles the code. */
+ if (!i)
+ return 0;
+ /* Unroll the first loop round. k = 0. */
+ if ((unsigned int) j)
+ return ffs ((unsigned int) j);
+ /* Generic loop. */
+ for (k = 1; k < chunk_count - 1; k++)
+ if ((unsigned int) (j >> (k * chunk_bits)) != 0)
+ return k * chunk_bits + ffs ((unsigned int) (j >> (k * chunk_bits)));
+ }
+ /* Last loop round. k = chunk_count - 1. */
+ return (chunk_count - 1) * chunk_bits
+ + ffs ((unsigned int) (j >> ((chunk_count - 1) * chunk_bits)));
+#endif
+}
diff --git a/gnulib/lib/ffsll.c b/gnulib/lib/ffsll.c
new file mode 100644
index 0000000..f0e9425
--- /dev/null
+++ b/gnulib/lib/ffsll.c
@@ -0,0 +1,4 @@
+#define FUNC ffsll
+#define TYPE long long int
+#define GCC_BUILTIN __builtin_ffsll
+#include "ffsl.h"
diff --git a/gnulib/lib/file-has-acl.c b/gnulib/lib/file-has-acl.c
new file mode 100644
index 0000000..4ff2808
--- /dev/null
+++ b/gnulib/lib/file-has-acl.c
@@ -0,0 +1,839 @@
+/* Test whether a file has a nontrivial access control list.
+
+ Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+
+#if USE_ACL && HAVE_ACL_GET_FILE
+
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial. */
+int
+acl_extended_nontrivial (acl_t acl)
+{
+ /* acl is non-trivial if it is non-empty. */
+ return (acl_entries (acl) > 0);
+}
+
+# else /* Linux, FreeBSD, IRIX, Tru64 */
+
+/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
+ Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
+ Return -1 and set errno upon failure to determine it. */
+int
+acl_access_nontrivial (acl_t acl)
+{
+ /* acl is non-trivial if it has some entries other than for "user::",
+ "group::", and "other::". Normally these three should be present
+ at least, allowing us to write
+ return (3 < acl_entries (acl));
+ but the following code is more robust. */
+# if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD */
+
+ acl_entry_t ace;
+ int got_one;
+
+ for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
+ got_one > 0;
+ got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
+ {
+ acl_tag_t tag;
+ if (acl_get_tag_type (ace, &tag) < 0)
+ return -1;
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
+ return 1;
+ }
+ return got_one;
+
+# else /* IRIX, Tru64 */
+# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
+ /* Don't use acl_get_entry: it is undocumented. */
+
+ int count = acl->acl_cnt;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ acl_entry_t ace = &acl->acl_entry[i];
+ acl_tag_t tag = ace->ae_tag;
+
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ
+ || tag == ACL_OTHER_OBJ))
+ return 1;
+ }
+ return 0;
+
+# endif
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* Don't use acl_get_entry: it takes only one argument and does not work. */
+
+ int count = acl->acl_num;
+ acl_entry_t ace;
+
+ for (ace = acl->acl_first; count > 0; ace = ace->next, count--)
+ {
+ acl_tag_t tag;
+ acl_perm_t perm;
+
+ tag = ace->entry->acl_type;
+ if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
+ return 1;
+
+ perm = ace->entry->acl_perm;
+ /* On Tru64, perm can also contain non-standard bits such as
+ PERM_INSERT, PERM_DELETE, PERM_MODIFY, PERM_LOOKUP, ... */
+ if ((perm & ~(ACL_READ | ACL_WRITE | ACL_EXECUTE)) != 0)
+ return 1;
+ }
+ return 0;
+
+# endif
+# endif
+}
+
+# endif
+
+
+#elif USE_ACL && HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
+
+/* Test an ACL retrieved with GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (int count, aclent_t *entries)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ aclent_t *ace = &entries[i];
+
+ /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
+ If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
+ We don't need to check ace->a_id in these cases. */
+ if (!(ace->a_type == USER_OBJ
+ || ace->a_type == GROUP_OBJ
+ || ace->a_type == OTHER_OBJ
+ /* Note: Cygwin does not return a CLASS_OBJ ("mask:") entry
+ sometimes. */
+ || ace->a_type == CLASS_OBJ))
+ return 1;
+ }
+ return 0;
+}
+
+# ifdef ACE_GETACL
+
+/* Test an ACL retrieved with ACE_GETACL.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_ace_nontrivial (int count, ace_t *entries)
+{
+ int i;
+
+ /* The flags in the ace_t structure changed in a binary incompatible way
+ when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
+ How to distinguish the two conventions at runtime?
+ In the old convention, usually three ACEs have a_flags = ACE_OWNER /
+ ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400. In the new
+ convention, these values are not used. */
+ int old_convention = 0;
+
+ for (i = 0; i < count; i++)
+ if (entries[i].a_flags & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_ACE_OTHER))
+ {
+ old_convention = 1;
+ break;
+ }
+
+ if (old_convention)
+ /* Running on Solaris 10. */
+ for (i = 0; i < count; i++)
+ {
+ ace_t *ace = &entries[i];
+
+ /* Note:
+ If ace->a_flags = ACE_OWNER, ace->a_who is the st_uid from stat().
+ If ace->a_flags = ACE_GROUP, ace->a_who is the st_gid from stat().
+ We don't need to check ace->a_who in these cases. */
+ if (!(ace->a_type == OLD_ALLOW
+ && (ace->a_flags == OLD_ACE_OWNER
+ || ace->a_flags == OLD_ACE_GROUP
+ || ace->a_flags == OLD_ACE_OTHER)))
+ return 1;
+ }
+ else
+ {
+ /* Running on Solaris 10 (newer version) or Solaris 11. */
+ unsigned int access_masks[6] =
+ {
+ 0, /* owner@ deny */
+ 0, /* owner@ allow */
+ 0, /* group@ deny */
+ 0, /* group@ allow */
+ 0, /* everyone@ deny */
+ 0 /* everyone@ allow */
+ };
+
+ for (i = 0; i < count; i++)
+ {
+ ace_t *ace = &entries[i];
+ unsigned int index1;
+ unsigned int index2;
+
+ if (ace->a_type == NEW_ACE_ACCESS_ALLOWED_ACE_TYPE)
+ index1 = 1;
+ else if (ace->a_type == NEW_ACE_ACCESS_DENIED_ACE_TYPE)
+ index1 = 0;
+ else
+ return 1;
+
+ if (ace->a_flags == NEW_ACE_OWNER)
+ index2 = 0;
+ else if (ace->a_flags == (NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP))
+ index2 = 2;
+ else if (ace->a_flags == NEW_ACE_EVERYONE)
+ index2 = 4;
+ else
+ return 1;
+
+ access_masks[index1 + index2] |= ace->a_access_mask;
+ }
+
+ /* The same bit shouldn't be both allowed and denied. */
+ if (access_masks[0] & access_masks[1])
+ return 1;
+ if (access_masks[2] & access_masks[3])
+ return 1;
+ if (access_masks[4] & access_masks[5])
+ return 1;
+
+ /* Check minimum masks. */
+ if ((NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER)
+ & ~ access_masks[1])
+ return 1;
+ access_masks[1] &= ~(NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER);
+ if ((NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER)
+ & ~ access_masks[4])
+ return 1;
+ access_masks[4] &= ~(NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER);
+ if ((NEW_ACE_READ_NAMED_ATTRS
+ | NEW_ACE_READ_ATTRIBUTES
+ | NEW_ACE_READ_ACL
+ | NEW_ACE_SYNCHRONIZE)
+ & ~ access_masks[5])
+ return 1;
+ access_masks[5] &= ~(NEW_ACE_READ_NAMED_ATTRS
+ | NEW_ACE_READ_ATTRIBUTES
+ | NEW_ACE_READ_ACL
+ | NEW_ACE_SYNCHRONIZE);
+
+ /* Check the allowed or denied bits. */
+ if ((access_masks[0] | access_masks[1])
+ != (NEW_ACE_READ_DATA
+ | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA
+ | NEW_ACE_EXECUTE))
+ return 1;
+ if ((access_masks[2] | access_masks[3])
+ != (NEW_ACE_READ_DATA
+ | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA
+ | NEW_ACE_EXECUTE))
+ return 1;
+ if ((access_masks[4] | access_masks[5])
+ != (NEW_ACE_READ_DATA
+ | NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA
+ | NEW_ACE_EXECUTE))
+ return 1;
+
+ /* Check that the NEW_ACE_WRITE_DATA and NEW_ACE_APPEND_DATA bits are
+ either both allowed or both denied. */
+ if (((access_masks[0] & NEW_ACE_WRITE_DATA) != 0)
+ != ((access_masks[0] & NEW_ACE_APPEND_DATA) != 0))
+ return 1;
+ if (((access_masks[2] & NEW_ACE_WRITE_DATA) != 0)
+ != ((access_masks[2] & NEW_ACE_APPEND_DATA) != 0))
+ return 1;
+ if (((access_masks[4] & NEW_ACE_WRITE_DATA) != 0)
+ != ((access_masks[4] & NEW_ACE_APPEND_DATA) != 0))
+ return 1;
+ }
+
+ return 0;
+}
+
+# endif
+
+#elif USE_ACL && HAVE_GETACL /* HP-UX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ struct acl_entry *ace = &entries[i];
+
+ if (!((ace->uid == sb->st_uid && ace->gid == ACL_NSGROUP)
+ || (ace->uid == ACL_NSUSER && ace->gid == sb->st_gid)
+ || (ace->uid == ACL_NSUSER && ace->gid == ACL_NSGROUP)))
+ return 1;
+ }
+ return 0;
+}
+
+# if HAVE_ACLV_H /* HP-UX >= 11.11 */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+aclv_nontrivial (int count, struct acl *entries)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ struct acl *ace = &entries[i];
+
+ /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
+ If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
+ We don't need to check ace->a_id in these cases. */
+ if (!(ace->a_type == USER_OBJ /* no need to check ace->a_id here */
+ || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */
+ || ace->a_type == CLASS_OBJ
+ || ace->a_type == OTHER_OBJ))
+ return 1;
+ }
+ return 0;
+}
+
+# endif
+
+#elif USE_ACL && (HAVE_ACLX_GET || HAVE_STATACL) /* AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (struct acl *a)
+{
+ /* The normal way to iterate through an ACL is like this:
+ struct acl_entry *ace;
+ for (ace = a->acl_ext; ace != acl_last (a); ace = acl_nxt (ace))
+ {
+ struct ace_id *aei;
+ switch (ace->ace_type)
+ {
+ case ACC_PERMIT:
+ case ACC_DENY:
+ case ACC_SPECIFY:
+ ...;
+ }
+ for (aei = ace->ace_id; aei != id_last (ace); aei = id_nxt (aei))
+ ...
+ }
+ */
+ return (acl_last (a) != a->acl_ext ? 1 : 0);
+}
+
+# if HAVE_ACLX_GET && defined ACL_AIX_WIP /* newer AIX */
+
+/* Return 1 if the given ACL is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nfs4_nontrivial (nfs4_acl_int_t *a)
+{
+# if 1 /* let's try this first */
+ return (a->aclEntryN > 0 ? 1 : 0);
+# else
+ int count = a->aclEntryN;
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ nfs4_ace_int_t *ace = &a->aclEntry[i];
+
+ if (!((ace->flags & ACE4_ID_SPECIAL) != 0
+ && (ace->aceWho.special_whoid == ACE4_WHO_OWNER
+ || ace->aceWho.special_whoid == ACE4_WHO_GROUP
+ || ace->aceWho.special_whoid == ACE4_WHO_EVERYONE)
+ && ace->aceType == ACE4_ACCESS_ALLOWED_ACE_TYPE
+ && ace->aceFlags == 0
+ && (ace->aceMask & ~(ACE4_READ_DATA | ACE4_LIST_DIRECTORY
+ | ACE4_WRITE_DATA | ACE4_ADD_FILE
+ | ACE4_EXECUTE)) == 0))
+ return 1;
+ }
+ return 0;
+# endif
+}
+
+# endif
+
+#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */
+
+/* Test an ACL retrieved with ACL_GET.
+ Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
+ Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
+int
+acl_nontrivial (int count, struct acl *entries)
+{
+ int i;
+
+ for (i = 0; i < count; i++)
+ {
+ struct acl *ace = &entries[i];
+
+ /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
+ If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
+ We don't need to check ace->a_id in these cases. */
+ if (!(ace->a_type == USER_OBJ /* no need to check ace->a_id here */
+ || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */
+ || ace->a_type == CLASS_OBJ
+ || ace->a_type == OTHER_OBJ))
+ return 1;
+ }
+ return 0;
+}
+
+#endif
+
+
+/* Return 1 if NAME has a nontrivial access control list, 0 if NAME
+ only has no or a base access control list, and -1 (setting errno)
+ on error. SB must be set to the stat buffer of NAME, obtained
+ through stat() or lstat(). */
+
+int
+file_has_acl (char const *name, struct stat const *sb)
+{
+#if USE_ACL
+ if (! S_ISLNK (sb->st_mode))
+ {
+# if HAVE_ACL_GET_FILE
+
+ /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+ int ret;
+
+ if (HAVE_ACL_EXTENDED_FILE) /* Linux */
+ {
+ /* On Linux, acl_extended_file is an optimized function: It only
+ makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
+ ACL_TYPE_DEFAULT. */
+ ret = acl_extended_file (name);
+ }
+ else /* FreeBSD, MacOS X, IRIX, Tru64 */
+ {
+# if HAVE_ACL_TYPE_EXTENDED /* MacOS X */
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. There is no point in making
+ these two useless calls. The real ACL is retrieved through
+ acl_get_file (name, ACL_TYPE_EXTENDED). */
+ acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED);
+ if (acl)
+ {
+ ret = acl_extended_nontrivial (acl);
+ acl_free (acl);
+ }
+ else
+ ret = -1;
+# else /* FreeBSD, IRIX, Tru64 */
+ acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
+ if (acl)
+ {
+ int saved_errno;
+
+ ret = acl_access_nontrivial (acl);
+ saved_errno = errno;
+ acl_free (acl);
+ errno = saved_errno;
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always
+ returns NULL with errno not set. There is no point in
+ making this call. */
+# else /* FreeBSD, IRIX */
+ /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory
+ either both succeed or both fail; it depends on the
+ file system. Therefore there is no point in making the second
+ call if the first one already failed. */
+ if (ret == 0 && S_ISDIR (sb->st_mode))
+ {
+ acl = acl_get_file (name, ACL_TYPE_DEFAULT);
+ if (acl)
+ {
+ ret = (0 < acl_entries (acl));
+ acl_free (acl);
+ }
+ else
+ ret = -1;
+ }
+# endif
+ }
+ else
+ ret = -1;
+# endif
+ }
+ if (ret < 0)
+ return ACL_NOT_WELL_SUPPORTED (errno) ? 0 : -1;
+ return ret;
+
+# elif HAVE_FACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */
+
+# if defined ACL_NO_TRIVIAL
+
+ /* Solaris 10 (newer version), which has additional API declared in
+ <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial,
+ acl_fromtext, ...). */
+ return acl_trivial (name);
+
+# else /* Solaris, Cygwin, general case */
+
+ /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
+ of Unixware. The acl() call returns the access and default ACL both
+ at once. */
+ int count;
+ {
+ aclent_t *entries;
+
+ for (;;)
+ {
+ count = acl (name, GETACLCNT, 0, NULL);
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == ENOTSUP)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ break;
+
+ /* Don't use MIN_ACL_ENTRIES: It's set to 4 on Cygwin, but Cygwin
+ returns only 3 entries for files with no ACL. But this is safe:
+ If there are more than 4 entries, there cannot be only the
+ "user::", "group::", "other:", and "mask:" entries. */
+ if (count > 4)
+ return 1;
+
+ entries = (aclent_t *) malloc (count * sizeof (aclent_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if (acl (name, GETACL, count, entries) == count)
+ {
+ if (acl_nontrivial (count, entries))
+ {
+ free (entries);
+ return 1;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems). */
+ {
+ ace_t *entries;
+
+ for (;;)
+ {
+ count = acl (name, ACE_GETACLCNT, 0, NULL);
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == EINVAL)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ break;
+
+ /* In the old (original Solaris 10) convention:
+ If there are more than 3 entries, there cannot be only the
+ ACE_OWNER, ACE_GROUP, ACE_OTHER entries.
+ In the newer Solaris 10 and Solaris 11 convention:
+ If there are more than 6 entries, there cannot be only the
+ ACE_OWNER, ACE_GROUP, ACE_EVERYONE entries, each once with
+ NEW_ACE_ACCESS_ALLOWED_ACE_TYPE and once with
+ NEW_ACE_ACCESS_DENIED_ACE_TYPE. */
+ if (count > 6)
+ return 1;
+
+ entries = (ace_t *) malloc (count * sizeof (ace_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if (acl (name, ACE_GETACL, count, entries) == count)
+ {
+ if (acl_ace_nontrivial (count, entries))
+ {
+ free (entries);
+ return 1;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+# endif
+
+ return 0;
+# endif
+
+# elif HAVE_GETACL /* HP-UX */
+
+ for (;;)
+ {
+ int count;
+ struct acl_entry entries[NACLENTRIES];
+
+ count = getacl (name, 0, NULL);
+
+ if (count < 0)
+ {
+ /* ENOSYS is seen on newer HP-UX versions.
+ EOPNOTSUPP is typically seen on NFS mounts.
+ ENOTSUP was seen on Quantum StorNext file systems (cvfs). */
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ return 0;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory
+ allocation. */
+ abort ();
+
+ /* If there are more than 3 entries, there cannot be only the
+ (uid,%), (%,gid), (%,%) entries. */
+ if (count > 3)
+ return 1;
+
+ if (getacl (name, count, entries) == count)
+ {
+ struct stat statbuf;
+
+ if (stat (name, &statbuf) < 0)
+ return -1;
+
+ return acl_nontrivial (count, entries, &statbuf);
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+# if HAVE_ACLV_H /* HP-UX >= 11.11 */
+
+ for (;;)
+ {
+ int count;
+ struct acl entries[NACLVENTRIES];
+
+ count = acl ((char *) name, ACL_CNT, NACLVENTRIES, entries);
+
+ if (count < 0)
+ {
+ /* EOPNOTSUPP is seen on NFS in HP-UX 11.11, 11.23.
+ EINVAL is seen on NFS in HP-UX 11.31. */
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ return 0;
+
+ if (count > NACLVENTRIES)
+ /* If NACLVENTRIES cannot be trusted, use dynamic memory
+ allocation. */
+ abort ();
+
+ /* If there are more than 4 entries, there cannot be only the
+ four base ACL entries. */
+ if (count > 4)
+ return 1;
+
+ if (acl ((char *) name, ACL_GET, count, entries) == count)
+ return aclv_nontrivial (count, entries);
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+# endif
+
+# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
+
+ acl_type_t type;
+ char aclbuf[1024];
+ void *acl = aclbuf;
+ size_t aclsize = sizeof (aclbuf);
+ mode_t mode;
+
+ for (;;)
+ {
+ /* The docs say that type being 0 is equivalent to ACL_ANY, but it
+ is not true, in AIX 5.3. */
+ type.u64 = ACL_ANY;
+ if (aclx_get (name, 0, &type, aclbuf, &aclsize, &mode) >= 0)
+ break;
+ if (errno == ENOSYS)
+ return 0;
+ if (errno != ENOSPC)
+ {
+ if (acl != aclbuf)
+ {
+ int saved_errno = errno;
+ free (acl);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ aclsize = 2 * aclsize;
+ if (acl != aclbuf)
+ free (acl);
+ acl = malloc (aclsize);
+ if (acl == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+
+ if (type.u64 == ACL_AIXC)
+ {
+ int result = acl_nontrivial ((struct acl *) acl);
+ if (acl != aclbuf)
+ free (acl);
+ return result;
+ }
+ else if (type.u64 == ACL_NFS4)
+ {
+ int result = acl_nfs4_nontrivial ((nfs4_acl_int_t *) acl);
+ if (acl != aclbuf)
+ free (acl);
+ return result;
+ }
+ else
+ {
+ /* A newer type of ACL has been introduced in the system.
+ We should better support it. */
+ if (acl != aclbuf)
+ free (acl);
+ errno = EINVAL;
+ return -1;
+ }
+
+# elif HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[4096]; } u;
+
+ if (statacl (name, STX_NORMAL, &u.a, sizeof (u)) < 0)
+ return -1;
+
+ return acl_nontrivial (&u.a);
+
+# elif HAVE_ACLSORT /* NonStop Kernel */
+
+ int count;
+ struct acl entries[NACLENTRIES];
+
+ for (;;)
+ {
+ count = acl ((char *) name, ACL_CNT, NACLENTRIES, NULL);
+
+ if (count < 0)
+ {
+ if (errno == ENOSYS || errno == ENOTSUP)
+ break;
+ else
+ return -1;
+ }
+
+ if (count == 0)
+ return 0;
+
+ if (count > NACLENTRIES)
+ /* If NACLENTRIES cannot be trusted, use dynamic memory
+ allocation. */
+ abort ();
+
+ /* If there are more than 4 entries, there cannot be only the
+ four base ACL entries. */
+ if (count > 4)
+ return 1;
+
+ if (acl ((char *) name, ACL_GET, count, entries) == count)
+ return acl_nontrivial (count, entries);
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ }
+
+# endif
+ }
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/file-set.c b/gnulib/lib/file-set.c
new file mode 100644
index 0000000..0126556
--- /dev/null
+++ b/gnulib/lib/file-set.c
@@ -0,0 +1,74 @@
+/* Specialized functions to manipulate a set of files.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "file-set.h"
+
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
+ If HT is NULL, return immediately.
+ If memory allocation fails, exit immediately. */
+void
+record_file (Hash_table *ht, char const *file, struct stat const *stats)
+{
+ struct F_triple *ent;
+
+ if (ht == NULL)
+ return;
+
+ ent = xmalloc (sizeof *ent);
+ ent->name = xstrdup (file);
+ ent->st_ino = stats->st_ino;
+ ent->st_dev = stats->st_dev;
+
+ {
+ struct F_triple *ent_from_table = hash_insert (ht, ent);
+ if (ent_from_table == NULL)
+ {
+ /* Insertion failed due to lack of memory. */
+ xalloc_die ();
+ }
+
+ if (ent_from_table != ent)
+ {
+ /* There was alread a matching entry in the table, so ENT was
+ not inserted. Free it. */
+ triple_free (ent);
+ }
+ }
+}
+
+/* Return true if there is an entry in hash table, HT,
+ for the file described by FILE and STATS. */
+bool
+seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats)
+{
+ struct F_triple new_ent;
+
+ if (ht == NULL)
+ return false;
+
+ new_ent.name = (char *) file;
+ new_ent.st_ino = stats->st_ino;
+ new_ent.st_dev = stats->st_dev;
+
+ return !!hash_lookup (ht, &new_ent);
+}
diff --git a/gnulib/lib/file-set.h b/gnulib/lib/file-set.h
new file mode 100644
index 0000000..4e47d95
--- /dev/null
+++ b/gnulib/lib/file-set.h
@@ -0,0 +1,15 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+#include "hash.h"
+
+extern void record_file (Hash_table *ht, char const *file,
+ struct stat const *stats)
+#if defined __GNUC__ && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3)
+ __attribute__ ((nonnull (2, 3)))
+#endif
+;
+
+extern bool seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats);
diff --git a/gnulib/lib/file-type.c b/gnulib/lib/file-type.c
new file mode 100644
index 0000000..109db44
--- /dev/null
+++ b/gnulib/lib/file-type.c
@@ -0,0 +1,71 @@
+/* Return a string describing the type of a file.
+
+ Copyright (C) 1993-1994, 2001-2002, 2004-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "file-type.h"
+
+#include <gettext.h>
+#define _(text) gettext (text)
+
+char const *
+file_type (struct stat const *st)
+{
+ /* See POSIX 1003.1-2001 XCU Table 4-8 lines 17093-17107 for some of
+ these formats.
+
+ To keep diagnostics grammatical in English, the returned string
+ must start with a consonant. */
+
+ if (S_ISREG (st->st_mode))
+ return st->st_size == 0 ? _("regular empty file") : _("regular file");
+
+ if (S_ISDIR (st->st_mode))
+ return _("directory");
+
+ if (S_ISBLK (st->st_mode))
+ return _("block special file");
+
+ if (S_ISCHR (st->st_mode))
+ return _("character special file");
+
+ if (S_ISFIFO (st->st_mode))
+ return _("fifo");
+
+ if (S_ISLNK (st->st_mode))
+ return _("symbolic link");
+
+ if (S_ISSOCK (st->st_mode))
+ return _("socket");
+
+ if (S_TYPEISMQ (st))
+ return _("message queue");
+
+ if (S_TYPEISSEM (st))
+ return _("semaphore");
+
+ if (S_TYPEISSHM (st))
+ return _("shared memory object");
+
+ if (S_TYPEISTMO (st))
+ return _("typed memory object");
+
+ return _("weird file");
+}
diff --git a/gnulib/lib/file-type.h b/gnulib/lib/file-type.h
new file mode 100644
index 0000000..d7c66e9
--- /dev/null
+++ b/gnulib/lib/file-type.h
@@ -0,0 +1,29 @@
+/* Return a string describing the type of a file.
+
+ Copyright (C) 1993-1994, 2001-2002, 2004-2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#ifndef FILE_TYPE_H
+# define FILE_TYPE_H 1
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+char const *file_type (struct stat const *) _GL_ATTRIBUTE_PURE;
+
+#endif /* FILE_TYPE_H */
diff --git a/gnulib/lib/fileblocks.c b/gnulib/lib/fileblocks.c
new file mode 100644
index 0000000..993ec97
--- /dev/null
+++ b/gnulib/lib/fileblocks.c
@@ -0,0 +1,74 @@
+/* Convert file size to number of blocks on System V-like machines.
+
+ Copyright (C) 1990, 1997-1999, 2004-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Brian L. Matthews, blm@6sceng.UUCP. */
+
+#include <config.h>
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if !HAVE_STRUCT_STAT_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE
+
+# include <unistd.h>
+
+# ifndef NINDIR
+
+# if defined __DJGPP__
+typedef long daddr_t; /* for disk address */
+# endif
+
+/* Some SysV's, like Irix, seem to lack this. Hope it's correct. */
+/* Number of inode pointers per indirect block. */
+# define NINDIR (BSIZE / sizeof (daddr_t))
+# endif /* !NINDIR */
+
+/* Number of direct block addresses in an inode. */
+# define NDIR 10
+
+/* Return the number of 512-byte blocks in a file of SIZE bytes. */
+
+off_t
+st_blocks (off_t size)
+{
+ off_t datablks = size / 512 + (size % 512 != 0);
+ off_t indrblks = 0;
+
+ if (datablks > NDIR)
+ {
+ indrblks = (datablks - NDIR - 1) / NINDIR + 1;
+
+ if (datablks > NDIR + NINDIR)
+ {
+ indrblks += (datablks - NDIR - NINDIR - 1) / (NINDIR * NINDIR) + 1;
+
+ if (datablks > NDIR + NINDIR + NINDIR * NINDIR)
+ indrblks++;
+ }
+ }
+
+ return datablks + indrblks;
+}
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int textutils_fileblocks_unused;
+#endif
diff --git a/gnulib/lib/filemode.c b/gnulib/lib/filemode.c
new file mode 100644
index 0000000..0f6641a
--- /dev/null
+++ b/gnulib/lib/filemode.c
@@ -0,0 +1,180 @@
+/* filemode.c -- make a string describing file modes
+
+ Copyright (C) 1985, 1990, 1993, 1998-2000, 2004, 2006, 2009-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "filemode.h"
+
+/* The following is for Cray DMF (Data Migration Facility), which is a
+ HSM file system. A migrated file has a `st_dm_mode' that is
+ different from the normal `st_mode', so any tests for migrated
+ files should use the former. */
+#if HAVE_ST_DM_MODE
+# define IS_MIGRATED_FILE(statp) \
+ (S_ISOFD (statp->st_dm_mode) || S_ISOFL (statp->st_dm_mode))
+#else
+# define IS_MIGRATED_FILE(statp) 0
+#endif
+
+#if ! HAVE_DECL_STRMODE
+
+/* Return a character indicating the type of file described by
+ file mode BITS:
+ '-' regular file
+ 'b' block special file
+ 'c' character special file
+ 'C' high performance ("contiguous data") file
+ 'd' directory
+ 'D' door
+ 'l' symbolic link
+ 'm' multiplexed file (7th edition Unix; obsolete)
+ 'n' network special file (HP-UX)
+ 'p' fifo (named pipe)
+ 'P' port
+ 's' socket
+ 'w' whiteout (4.4BSD)
+ '?' some other file type */
+
+static char
+ftypelet (mode_t bits)
+{
+ /* These are the most common, so test for them first. */
+ if (S_ISREG (bits))
+ return '-';
+ if (S_ISDIR (bits))
+ return 'd';
+
+ /* Other letters standardized by POSIX 1003.1-2004. */
+ if (S_ISBLK (bits))
+ return 'b';
+ if (S_ISCHR (bits))
+ return 'c';
+ if (S_ISLNK (bits))
+ return 'l';
+ if (S_ISFIFO (bits))
+ return 'p';
+
+ /* Other file types (though not letters) standardized by POSIX. */
+ if (S_ISSOCK (bits))
+ return 's';
+
+ /* Nonstandard file types. */
+ if (S_ISCTG (bits))
+ return 'C';
+ if (S_ISDOOR (bits))
+ return 'D';
+ if (S_ISMPB (bits) || S_ISMPC (bits))
+ return 'm';
+ if (S_ISNWK (bits))
+ return 'n';
+ if (S_ISPORT (bits))
+ return 'P';
+ if (S_ISWHT (bits))
+ return 'w';
+
+ return '?';
+}
+
+/* Like filemodestring, but rely only on MODE. */
+
+void
+strmode (mode_t mode, char *str)
+{
+ str[0] = ftypelet (mode);
+ str[1] = mode & S_IRUSR ? 'r' : '-';
+ str[2] = mode & S_IWUSR ? 'w' : '-';
+ str[3] = (mode & S_ISUID
+ ? (mode & S_IXUSR ? 's' : 'S')
+ : (mode & S_IXUSR ? 'x' : '-'));
+ str[4] = mode & S_IRGRP ? 'r' : '-';
+ str[5] = mode & S_IWGRP ? 'w' : '-';
+ str[6] = (mode & S_ISGID
+ ? (mode & S_IXGRP ? 's' : 'S')
+ : (mode & S_IXGRP ? 'x' : '-'));
+ str[7] = mode & S_IROTH ? 'r' : '-';
+ str[8] = mode & S_IWOTH ? 'w' : '-';
+ str[9] = (mode & S_ISVTX
+ ? (mode & S_IXOTH ? 't' : 'T')
+ : (mode & S_IXOTH ? 'x' : '-'));
+ str[10] = ' ';
+ str[11] = '\0';
+}
+
+#endif /* ! HAVE_DECL_STRMODE */
+
+/* filemodestring - fill in string STR with an ls-style ASCII
+ representation of the st_mode field of file stats block STATP.
+ 12 characters are stored in STR.
+ The characters stored in STR are:
+
+ 0 File type, as in ftypelet above, except that other letters are used
+ for files whose type cannot be determined solely from st_mode:
+
+ 'F' semaphore
+ 'M' migrated file (Cray DMF)
+ 'Q' message queue
+ 'S' shared memory object
+ 'T' typed memory object
+
+ 1 'r' if the owner may read, '-' otherwise.
+
+ 2 'w' if the owner may write, '-' otherwise.
+
+ 3 'x' if the owner may execute, 's' if the file is
+ set-user-id, '-' otherwise.
+ 'S' if the file is set-user-id, but the execute
+ bit isn't set.
+
+ 4 'r' if group members may read, '-' otherwise.
+
+ 5 'w' if group members may write, '-' otherwise.
+
+ 6 'x' if group members may execute, 's' if the file is
+ set-group-id, '-' otherwise.
+ 'S' if it is set-group-id but not executable.
+
+ 7 'r' if any user may read, '-' otherwise.
+
+ 8 'w' if any user may write, '-' otherwise.
+
+ 9 'x' if any user may execute, 't' if the file is "sticky"
+ (will be retained in swap space after execution), '-'
+ otherwise.
+ 'T' if the file is sticky but not executable.
+
+ 10 ' ' for compatibility with 4.4BSD strmode,
+ since this interface does not support ACLs.
+
+ 11 '\0'. */
+
+void
+filemodestring (struct stat const *statp, char *str)
+{
+ strmode (statp->st_mode, str);
+
+ if (S_TYPEISSEM (statp))
+ str[0] = 'F';
+ else if (IS_MIGRATED_FILE (statp))
+ str[0] = 'M';
+ else if (S_TYPEISMQ (statp))
+ str[0] = 'Q';
+ else if (S_TYPEISSHM (statp))
+ str[0] = 'S';
+ else if (S_TYPEISTMO (statp))
+ str[0] = 'T';
+}
diff --git a/gnulib/lib/filemode.h b/gnulib/lib/filemode.h
new file mode 100644
index 0000000..1a50302
--- /dev/null
+++ b/gnulib/lib/filemode.h
@@ -0,0 +1,44 @@
+/* Make a string describing file modes.
+
+ Copyright (C) 1998-1999, 2003, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef FILEMODE_H_
+
+# include <sys/types.h>
+# include <sys/stat.h>
+
+/* Get the declaration of strmode. */
+# if HAVE_DECL_STRMODE
+# include <string.h> /* MacOS X, FreeBSD, OpenBSD */
+# include <unistd.h> /* NetBSD */
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !HAVE_DECL_STRMODE
+extern void strmode (mode_t mode, char *str);
+# endif
+
+extern void filemodestring (struct stat const *statp, char *str);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/filename.h b/gnulib/lib/filename.h
new file mode 100644
index 0000000..7827c11
--- /dev/null
+++ b/gnulib/lib/filename.h
@@ -0,0 +1,54 @@
+/* Basic filename support macros.
+ Copyright (C) 2001-2004, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _FILENAME_H
+#define _FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
+ it may be concatenated to a directory pathname.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FILENAME_H */
diff --git a/gnulib/lib/filenamecat-lgpl.c b/gnulib/lib/filenamecat-lgpl.c
new file mode 100644
index 0000000..26d1c73
--- /dev/null
+++ b/gnulib/lib/filenamecat-lgpl.c
@@ -0,0 +1,88 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirname.h"
+
+#if ! HAVE_MEMPCPY && ! defined mempcpy
+# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+#endif
+
+/* Return the longest suffix of F that is a relative file name.
+ If it has no such suffix, return the empty string. */
+
+static char const * _GL_ATTRIBUTE_PURE
+longest_relative_suffix (char const *f)
+{
+ for (f += FILE_SYSTEM_PREFIX_LEN (f); ISSLASH (*f); f++)
+ continue;
+ return f;
+}
+
+/* Concatenate two file name components, DIR and ABASE, in
+ newly-allocated storage and return the result.
+ The resulting file name F is such that the commands "ls F" and "(cd
+ DIR; ls BASE)" refer to the same file, where BASE is ABASE with any
+ file system prefixes and leading separators removed.
+ Arrange for a directory separator if necessary between DIR and BASE
+ in the result, removing any redundant separators.
+ In any case, if BASE_IN_RESULT is non-NULL, set
+ *BASE_IN_RESULT to point to the copy of ABASE in the returned
+ concatenation. However, if ABASE begins with more than one slash,
+ set *BASE_IN_RESULT to point to the sole corresponding slash that
+ is copied into the result buffer.
+
+ Return NULL if malloc fails. */
+
+char *
+mfile_name_concat (char const *dir, char const *abase, char **base_in_result)
+{
+ char const *dirbase = last_component (dir);
+ size_t dirbaselen = base_len (dirbase);
+ size_t dirlen = dirbase - dir + dirbaselen;
+ size_t needs_separator = (dirbaselen && ! ISSLASH (dirbase[dirbaselen - 1]));
+
+ char const *base = longest_relative_suffix (abase);
+ size_t baselen = strlen (base);
+
+ char *p_concat = malloc (dirlen + needs_separator + baselen + 1);
+ char *p;
+
+ if (p_concat == NULL)
+ return NULL;
+
+ p = mempcpy (p_concat, dir, dirlen);
+ *p = DIRECTORY_SEPARATOR;
+ p += needs_separator;
+
+ if (base_in_result)
+ *base_in_result = p - IS_ABSOLUTE_FILE_NAME (abase);
+
+ p = mempcpy (p, base, baselen);
+ *p = '\0';
+
+ return p_concat;
+}
diff --git a/gnulib/lib/filenamecat.c b/gnulib/lib/filenamecat.c
new file mode 100644
index 0000000..86b4e07
--- /dev/null
+++ b/gnulib/lib/filenamecat.c
@@ -0,0 +1,41 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+/* Just like mfile_name_concat (filenamecat-lgpl.c), except, rather than
+ returning NULL upon malloc failure, here, we report the
+ "memory exhausted" condition and exit. */
+
+char *
+file_name_concat (char const *dir, char const *abase, char **base_in_result)
+{
+ char *p = mfile_name_concat (dir, abase, base_in_result);
+ if (p == NULL)
+ xalloc_die ();
+ return p;
+}
diff --git a/gnulib/lib/filenamecat.h b/gnulib/lib/filenamecat.h
new file mode 100644
index 0000000..31b3375
--- /dev/null
+++ b/gnulib/lib/filenamecat.h
@@ -0,0 +1,27 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-1997, 2003, 2005, 2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#if GNULIB_FILENAMECAT
+char *file_name_concat (char const *dir, char const *base,
+ char **base_in_result);
+#endif
+
+char *mfile_name_concat (char const *dir, char const *base,
+ char **base_in_result);
diff --git a/gnulib/lib/filevercmp.c b/gnulib/lib/filevercmp.c
new file mode 100644
index 0000000..fd9e9f4
--- /dev/null
+++ b/gnulib/lib/filevercmp.c
@@ -0,0 +1,181 @@
+/*
+ Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include "filevercmp.h"
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <c-ctype.h>
+#include <limits.h>
+
+/* Match a file suffix defined by this regular expression:
+ /(\.[A-Za-z~][A-Za-z0-9~]*)*$/
+ Scan the string *STR and return a pointer to the matching suffix, or
+ NULL if not found. Upon return, *STR points to terminating NUL. */
+static const char *
+match_suffix (const char **str)
+{
+ const char *match = NULL;
+ bool read_alpha = false;
+ while (**str)
+ {
+ if (read_alpha)
+ {
+ read_alpha = false;
+ if (!c_isalpha (**str) && '~' != **str)
+ match = NULL;
+ }
+ else if ('.' == **str)
+ {
+ read_alpha = true;
+ if (!match)
+ match = *str;
+ }
+ else if (!c_isalnum (**str) && '~' != **str)
+ match = NULL;
+ (*str)++;
+ }
+ return match;
+}
+
+/* verrevcmp helper function */
+static inline int
+order (unsigned char c)
+{
+ if (c_isdigit (c))
+ return 0;
+ else if (c_isalpha (c))
+ return c;
+ else if (c == '~')
+ return -1;
+ else
+ return (int) c + UCHAR_MAX + 1;
+}
+
+/* slightly modified verrevcmp function from dpkg
+ S1, S2 - compared string
+ S1_LEN, S2_LEN - length of strings to be scanned
+
+ This implements the algorithm for comparison of version strings
+ specified by Debian and now widely adopted. The detailed
+ specification can be found in the Debian Policy Manual in the
+ section on the `Version' control field. This version of the code
+ implements that from s5.6.12 of Debian Policy v3.8.0.1
+ http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version */
+static int _GL_ATTRIBUTE_PURE
+verrevcmp (const char *s1, size_t s1_len, const char *s2, size_t s2_len)
+{
+ size_t s1_pos = 0;
+ size_t s2_pos = 0;
+ while (s1_pos < s1_len || s2_pos < s2_len)
+ {
+ int first_diff = 0;
+ while ((s1_pos < s1_len && !c_isdigit (s1[s1_pos]))
+ || (s2_pos < s2_len && !c_isdigit (s2[s2_pos])))
+ {
+ int s1_c = (s1_pos == s1_len) ? 0 : order (s1[s1_pos]);
+ int s2_c = (s2_pos == s2_len) ? 0 : order (s2[s2_pos]);
+ if (s1_c != s2_c)
+ return s1_c - s2_c;
+ s1_pos++;
+ s2_pos++;
+ }
+ while (s1[s1_pos] == '0')
+ s1_pos++;
+ while (s2[s2_pos] == '0')
+ s2_pos++;
+ while (c_isdigit (s1[s1_pos]) && c_isdigit (s2[s2_pos]))
+ {
+ if (!first_diff)
+ first_diff = s1[s1_pos] - s2[s2_pos];
+ s1_pos++;
+ s2_pos++;
+ }
+ if (c_isdigit (s1[s1_pos]))
+ return 1;
+ if (c_isdigit (s2[s2_pos]))
+ return -1;
+ if (first_diff)
+ return first_diff;
+ }
+ return 0;
+}
+
+/* Compare version strings S1 and S2.
+ See filevercmp.h for function description. */
+int
+filevercmp (const char *s1, const char *s2)
+{
+ const char *s1_pos;
+ const char *s2_pos;
+ const char *s1_suffix, *s2_suffix;
+ size_t s1_len, s2_len;
+ int result;
+
+ /* easy comparison to see if strings are identical */
+ int simple_cmp = strcmp (s1, s2);
+ if (simple_cmp == 0)
+ return 0;
+
+ /* special handle for "", "." and ".." */
+ if (!*s1)
+ return -1;
+ if (!*s2)
+ return 1;
+ if (0 == strcmp (".", s1))
+ return -1;
+ if (0 == strcmp (".", s2))
+ return 1;
+ if (0 == strcmp ("..", s1))
+ return -1;
+ if (0 == strcmp ("..", s2))
+ return 1;
+
+ /* special handle for other hidden files */
+ if (*s1 == '.' && *s2 != '.')
+ return -1;
+ if (*s1 != '.' && *s2 == '.')
+ return 1;
+ if (*s1 == '.' && *s2 == '.')
+ {
+ s1++;
+ s2++;
+ }
+
+ /* "cut" file suffixes */
+ s1_pos = s1;
+ s2_pos = s2;
+ s1_suffix = match_suffix (&s1_pos);
+ s2_suffix = match_suffix (&s2_pos);
+ s1_len = (s1_suffix ? s1_suffix : s1_pos) - s1;
+ s2_len = (s2_suffix ? s2_suffix : s2_pos) - s2;
+
+ /* restore file suffixes if strings are identical after "cut" */
+ if ((s1_suffix || s2_suffix) && (s1_len == s2_len)
+ && 0 == strncmp (s1, s2, s1_len))
+ {
+ s1_len = s1_pos - s1;
+ s2_len = s2_pos - s2;
+ }
+
+ result = verrevcmp (s1, s1_len, s2, s2_len);
+ return result == 0 ? simple_cmp : result;
+}
diff --git a/gnulib/lib/filevercmp.h b/gnulib/lib/filevercmp.h
new file mode 100644
index 0000000..8fedcb5
--- /dev/null
+++ b/gnulib/lib/filevercmp.h
@@ -0,0 +1,42 @@
+/*
+ Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef FILEVERCMP_H
+#define FILEVERCMP_H
+
+/* Compare version strings:
+
+ This function compares strings S1 and S2:
+ 1) By PREFIX in the same way as strcmp.
+ 2) Then by VERSION (most similarly to version compare of Debian's dpkg).
+ Leading zeros in version numbers are ignored.
+ 3) If both (PREFIX and VERSION) are equal, strcmp function is used for
+ comparison. So this function can return 0 if (and only if) strings S1
+ and S2 are identical.
+
+ It returns number >0 for S1 > S2, 0 for S1 == S2 and number <0 for S1 < S2.
+
+ This function compares strings, in a way that if VER1 and VER2 are version
+ numbers and PREFIX and SUFFIX (SUFFIX defined as (\.[A-Za-z~][A-Za-z0-9~]*)*)
+ are strings then VER1 < VER2 implies filevercmp (PREFIX VER1 SUFFIX,
+ PREFIX VER2 SUFFIX) < 0.
+
+ This function is intended to be a replacement for strverscmp. */
+int filevercmp (const char *s1, const char *s2);
+
+#endif /* FILEVERCMP_H */
diff --git a/gnulib/lib/findprog-lgpl.c b/gnulib/lib/findprog-lgpl.c
new file mode 100644
index 0000000..4adf469
--- /dev/null
+++ b/gnulib/lib/findprog-lgpl.c
@@ -0,0 +1,20 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define IN_FINDPROG_LGPL 1
+
+#include "findprog.c"
diff --git a/gnulib/lib/findprog.c b/gnulib/lib/findprog.c
new file mode 100644
index 0000000..81b641d
--- /dev/null
+++ b/gnulib/lib/findprog.c
@@ -0,0 +1,138 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "findprog.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* Avoid collision between findprog.c and findprog-lgpl.c. */
+#if IN_FINDPROG_LGPL || ! GNULIB_FINDPROG_LGPL
+
+#if !IN_FINDPROG_LGPL
+# include "xalloc.h"
+#endif
+#include "concat-filename.h"
+
+
+const char *
+find_in_path (const char *progname)
+{
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+ /* The searching rules with .COM, .EXE, .BAT, .CMD etc. suffixes are
+ too complicated. Leave it to the OS. */
+ return progname;
+#else
+ /* Unix */
+ char *path;
+ char *path_rest;
+ char *cp;
+
+ if (strchr (progname, '/') != NULL)
+ /* If progname contains a slash, it is either absolute or relative to
+ the current directory. PATH is not used. */
+ return progname;
+
+ path = getenv ("PATH");
+ if (path == NULL || *path == '\0')
+ /* If PATH is not set, the default search path is implementation
+ dependent. */
+ return progname;
+
+ /* Make a copy, to prepare for destructive modifications. */
+# if !IN_FINDPROG_LGPL
+ path = xstrdup (path);
+# else
+ path = strdup (path);
+ if (path == NULL)
+ /* Out of memory. */
+ return progname;
+# endif
+ for (path_rest = path; ; path_rest = cp + 1)
+ {
+ const char *dir;
+ bool last;
+ char *progpathname;
+
+ /* Extract next directory in PATH. */
+ dir = path_rest;
+ for (cp = path_rest; *cp != '\0' && *cp != ':'; cp++)
+ ;
+ last = (*cp == '\0');
+ *cp = '\0';
+
+ /* Empty PATH components designate the current directory. */
+ if (dir == cp)
+ dir = ".";
+
+ /* Concatenate dir and progname. */
+# if !IN_FINDPROG_LGPL
+ progpathname = xconcatenated_filename (dir, progname, NULL);
+# else
+ progpathname = concatenated_filename (dir, progname, NULL);
+ if (progpathname == NULL)
+ {
+ /* Out of memory. */
+ free (path);
+ return progname;
+ }
+# endif
+
+ /* On systems which have the eaccess() system call, let's use it.
+ On other systems, let's hope that this program is not installed
+ setuid or setgid, so that it is ok to call access() despite its
+ design flaw. */
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ /* Found! */
+ if (strcmp (progpathname, progname) == 0)
+ {
+ free (progpathname);
+
+ /* Add the "./" prefix for real, that xconcatenated_filename()
+ optimized away. This avoids a second PATH search when the
+ caller uses execlp/execvp. */
+ progpathname = XNMALLOC (2 + strlen (progname) + 1, char);
+ progpathname[0] = '.';
+ progpathname[1] = '/';
+ memcpy (progpathname + 2, progname, strlen (progname) + 1);
+ }
+
+ free (path);
+ return progpathname;
+ }
+
+ free (progpathname);
+
+ if (last)
+ break;
+ }
+
+ /* Not found in PATH. An error will be signalled at the first call. */
+ free (path);
+ return progname;
+#endif
+}
+
+#endif
diff --git a/gnulib/lib/findprog.h b/gnulib/lib/findprog.h
new file mode 100644
index 0000000..dcd6e85
--- /dev/null
+++ b/gnulib/lib/findprog.h
@@ -0,0 +1,37 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Look up a program in the PATH.
+ Attempt to determine the pathname that would be called by execlp/execvp
+ of PROGNAME. If successful, return a pathname containing a slash
+ (either absolute or relative to the current directory). Otherwise,
+ return PROGNAME unmodified.
+ Because of the latter case, callers should use execlp/execvp, not
+ execl/execv on the returned pathname.
+ The returned string is freshly malloc()ed if it is != PROGNAME. */
+extern const char *find_in_path (const char *progname);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/float+.h b/gnulib/lib/float+.h
new file mode 100644
index 0000000..c8cf5c3
--- /dev/null
+++ b/gnulib/lib/float+.h
@@ -0,0 +1,148 @@
+/* Supplemental information about the floating-point formats.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _FLOATPLUS_H
+#define _FLOATPLUS_H
+
+#include <float.h>
+#include <limits.h>
+
+/* Number of bits in the mantissa of a floating-point number, including the
+ "hidden bit". */
+#if FLT_RADIX == 2
+# define FLT_MANT_BIT FLT_MANT_DIG
+# define DBL_MANT_BIT DBL_MANT_DIG
+# define LDBL_MANT_BIT LDBL_MANT_DIG
+#elif FLT_RADIX == 4
+# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
+#elif FLT_RADIX == 16
+# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
+#endif
+
+/* Bit mask that can be used to mask the exponent, as an unsigned number. */
+#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
+#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
+
+/* Number of bits used for the exponent of a floating-point number, including
+ the exponent's sign. */
+#define FLT_EXP_BIT \
+ (FLT_EXP_MASK < 0x100 ? 8 : \
+ FLT_EXP_MASK < 0x200 ? 9 : \
+ FLT_EXP_MASK < 0x400 ? 10 : \
+ FLT_EXP_MASK < 0x800 ? 11 : \
+ FLT_EXP_MASK < 0x1000 ? 12 : \
+ FLT_EXP_MASK < 0x2000 ? 13 : \
+ FLT_EXP_MASK < 0x4000 ? 14 : \
+ FLT_EXP_MASK < 0x8000 ? 15 : \
+ FLT_EXP_MASK < 0x10000 ? 16 : \
+ FLT_EXP_MASK < 0x20000 ? 17 : \
+ FLT_EXP_MASK < 0x40000 ? 18 : \
+ FLT_EXP_MASK < 0x80000 ? 19 : \
+ FLT_EXP_MASK < 0x100000 ? 20 : \
+ FLT_EXP_MASK < 0x200000 ? 21 : \
+ FLT_EXP_MASK < 0x400000 ? 22 : \
+ FLT_EXP_MASK < 0x800000 ? 23 : \
+ FLT_EXP_MASK < 0x1000000 ? 24 : \
+ FLT_EXP_MASK < 0x2000000 ? 25 : \
+ FLT_EXP_MASK < 0x4000000 ? 26 : \
+ FLT_EXP_MASK < 0x8000000 ? 27 : \
+ FLT_EXP_MASK < 0x10000000 ? 28 : \
+ FLT_EXP_MASK < 0x20000000 ? 29 : \
+ FLT_EXP_MASK < 0x40000000 ? 30 : \
+ FLT_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define DBL_EXP_BIT \
+ (DBL_EXP_MASK < 0x100 ? 8 : \
+ DBL_EXP_MASK < 0x200 ? 9 : \
+ DBL_EXP_MASK < 0x400 ? 10 : \
+ DBL_EXP_MASK < 0x800 ? 11 : \
+ DBL_EXP_MASK < 0x1000 ? 12 : \
+ DBL_EXP_MASK < 0x2000 ? 13 : \
+ DBL_EXP_MASK < 0x4000 ? 14 : \
+ DBL_EXP_MASK < 0x8000 ? 15 : \
+ DBL_EXP_MASK < 0x10000 ? 16 : \
+ DBL_EXP_MASK < 0x20000 ? 17 : \
+ DBL_EXP_MASK < 0x40000 ? 18 : \
+ DBL_EXP_MASK < 0x80000 ? 19 : \
+ DBL_EXP_MASK < 0x100000 ? 20 : \
+ DBL_EXP_MASK < 0x200000 ? 21 : \
+ DBL_EXP_MASK < 0x400000 ? 22 : \
+ DBL_EXP_MASK < 0x800000 ? 23 : \
+ DBL_EXP_MASK < 0x1000000 ? 24 : \
+ DBL_EXP_MASK < 0x2000000 ? 25 : \
+ DBL_EXP_MASK < 0x4000000 ? 26 : \
+ DBL_EXP_MASK < 0x8000000 ? 27 : \
+ DBL_EXP_MASK < 0x10000000 ? 28 : \
+ DBL_EXP_MASK < 0x20000000 ? 29 : \
+ DBL_EXP_MASK < 0x40000000 ? 30 : \
+ DBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define LDBL_EXP_BIT \
+ (LDBL_EXP_MASK < 0x100 ? 8 : \
+ LDBL_EXP_MASK < 0x200 ? 9 : \
+ LDBL_EXP_MASK < 0x400 ? 10 : \
+ LDBL_EXP_MASK < 0x800 ? 11 : \
+ LDBL_EXP_MASK < 0x1000 ? 12 : \
+ LDBL_EXP_MASK < 0x2000 ? 13 : \
+ LDBL_EXP_MASK < 0x4000 ? 14 : \
+ LDBL_EXP_MASK < 0x8000 ? 15 : \
+ LDBL_EXP_MASK < 0x10000 ? 16 : \
+ LDBL_EXP_MASK < 0x20000 ? 17 : \
+ LDBL_EXP_MASK < 0x40000 ? 18 : \
+ LDBL_EXP_MASK < 0x80000 ? 19 : \
+ LDBL_EXP_MASK < 0x100000 ? 20 : \
+ LDBL_EXP_MASK < 0x200000 ? 21 : \
+ LDBL_EXP_MASK < 0x400000 ? 22 : \
+ LDBL_EXP_MASK < 0x800000 ? 23 : \
+ LDBL_EXP_MASK < 0x1000000 ? 24 : \
+ LDBL_EXP_MASK < 0x2000000 ? 25 : \
+ LDBL_EXP_MASK < 0x4000000 ? 26 : \
+ LDBL_EXP_MASK < 0x8000000 ? 27 : \
+ LDBL_EXP_MASK < 0x10000000 ? 28 : \
+ LDBL_EXP_MASK < 0x20000000 ? 29 : \
+ LDBL_EXP_MASK < 0x40000000 ? 30 : \
+ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+
+/* Number of bits used for a floating-point number: the mantissa (not
+ counting the "hidden bit", since it may or may not be explicit), the
+ exponent, and the sign. */
+#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
+#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
+#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
+
+/* Number of bytes used for a floating-point number.
+ This can be smaller than the 'sizeof'. For example, on i386 systems,
+ 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
+ LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
+ sizeof (long double) = 12 or = 16. */
+#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+
+/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
+typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
+typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
+typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
+
+#endif /* _FLOATPLUS_H */
diff --git a/gnulib/lib/float.c b/gnulib/lib/float.c
new file mode 100644
index 0000000..b05b40c
--- /dev/null
+++ b/gnulib/lib/float.c
@@ -0,0 +1,33 @@
+/* Auxiliary definitions for <float.h>.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
+#elif defined __i386__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+#endif
diff --git a/gnulib/lib/float.in.h b/gnulib/lib/float.in.h
new file mode 100644
index 0000000..d5b2258
--- /dev/null
+++ b/gnulib/lib/float.in.h
@@ -0,0 +1,188 @@
+/* A correct <float.h>.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+#define _@GUARD_PREFIX@_FLOAT_H
+
+/* 'long double' properties. */
+
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.0842021724855044340E-19L
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.3621031431120935063E-4932L
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+# define LDBL_MAX 1.1897314953572317650E+4932L
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
+ precision in the compiler but 64 bits of precision at runtime. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-07/msg00063.html>. */
+#if defined __i386__ && defined __FreeBSD__
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.3621031431120935E-4932L /* = 0x1p-16382L */
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
+ But the largest literal that GCC allows us to write is
+ 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
+ So, define it like this through a reference to an external variable
+
+ const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
+ extern const long double LDBL_MAX;
+
+ Unfortunately, this is not a constant expression. */
+union gl_long_double_union
+ {
+ struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
+ long double ld;
+ };
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
+ wrong.
+ On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
+ It is not easy to define:
+ #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
+ is too small, whereas
+ #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
+ is too large. Apparently a bug in GCC decimal-to-binary conversion.
+ Also, I can't get values larger than
+ #define LDBL63 ((long double) (1ULL << 63))
+ #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
+ which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
+ So, define it like this through a reference to an external variable
+
+ const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
+ extern const long double LDBL_MAX;
+
+ or through a pointer cast
+
+ #define LDBL_MAX \
+ (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
+
+ Unfortunately, this is not a constant expression, and the latter expression
+ does not work well when GCC is optimizing.. */
+union gl_long_double_union
+ {
+ struct { double hi; double lo; } dd;
+ long double ld;
+ };
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+#endif
+
+/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
+ On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
+ are wrong. */
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 106
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
+# endif
+#endif
+
+#if @REPLACE_ITOLD@
+/* Pull in a function that fixes the 'int' to 'long double' conversion
+ of glibc 2.7. */
+extern
+# ifdef __cplusplus
+"C"
+# endif
+void _Qp_itoq (long double *, int);
+static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
+#endif
+
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
diff --git a/gnulib/lib/flock.c b/gnulib/lib/flock.c
new file mode 100644
index 0000000..439ff43
--- /dev/null
+++ b/gnulib/lib/flock.c
@@ -0,0 +1,220 @@
+/* Emulate flock on platforms that lack it, primarily Windows and MinGW.
+
+ This is derived from sqlite3 sources.
+ http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c
+ http://www.sqlite.org/copyright.html
+
+ Written by Richard W.M. Jones <rjones.at.redhat.com>
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <sys/file.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* LockFileEx */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include <errno.h>
+
+/* _get_osfhandle */
+# include "msvc-nothrow.h"
+
+/* Determine the current size of a file. Because the other braindead
+ * APIs we'll call need lower/upper 32 bit pairs, keep the file size
+ * like that too.
+ */
+static BOOL
+file_size (HANDLE h, DWORD * lower, DWORD * upper)
+{
+ *lower = GetFileSize (h, upper);
+ return 1;
+}
+
+/* LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. */
+# ifndef LOCKFILE_FAIL_IMMEDIATELY
+# define LOCKFILE_FAIL_IMMEDIATELY 1
+# endif
+
+/* Acquire a lock. */
+static BOOL
+do_lock (HANDLE h, int non_blocking, int exclusive)
+{
+ BOOL res;
+ DWORD size_lower, size_upper;
+ OVERLAPPED ovlp;
+ int flags = 0;
+
+ /* We're going to lock the whole file, so get the file size. */
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ /* Start offset is 0, and also zero the remaining members of this struct. */
+ memset (&ovlp, 0, sizeof ovlp);
+
+ if (non_blocking)
+ flags |= LOCKFILE_FAIL_IMMEDIATELY;
+ if (exclusive)
+ flags |= LOCKFILE_EXCLUSIVE_LOCK;
+
+ return LockFileEx (h, flags, 0, size_lower, size_upper, &ovlp);
+}
+
+/* Unlock reader or exclusive lock. */
+static BOOL
+do_unlock (HANDLE h)
+{
+ int res;
+ DWORD size_lower, size_upper;
+
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ return UnlockFile (h, 0, 0, size_lower, size_upper);
+}
+
+/* Now our BSD-like flock operation. */
+int
+flock (int fd, int operation)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD res;
+ int non_blocking;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ non_blocking = operation & LOCK_NB;
+ operation &= ~LOCK_NB;
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ res = do_lock (h, non_blocking, 0);
+ break;
+ case LOCK_EX:
+ res = do_lock (h, non_blocking, 1);
+ break;
+ case LOCK_UN:
+ res = do_unlock (h);
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Map Windows errors into Unix errnos. As usual MSDN fails to
+ * document the permissible error codes.
+ */
+ if (!res)
+ {
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ /* This means someone else is holding a lock. */
+ case ERROR_LOCK_VIOLATION:
+ errno = EAGAIN;
+ break;
+
+ /* Out of memory. */
+ case ERROR_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_BAD_COMMAND:
+ errno = EINVAL;
+ break;
+
+ /* Unlikely to be other errors, but at least don't lose the
+ * error code.
+ */
+ default:
+ errno = err;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+#else /* !Windows */
+
+# ifdef HAVE_STRUCT_FLOCK_L_TYPE
+/* We know how to implement flock in terms of fcntl. */
+
+# include <fcntl.h>
+
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+# include <errno.h>
+# include <string.h>
+
+int
+flock (int fd, int operation)
+{
+ int cmd, r;
+ struct flock fl;
+
+ if (operation & LOCK_NB)
+ cmd = F_SETLK;
+ else
+ cmd = F_SETLKW;
+ operation &= ~LOCK_NB;
+
+ memset (&fl, 0, sizeof fl);
+ fl.l_whence = SEEK_SET;
+ /* l_start & l_len are 0, which as a special case means "whole file". */
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ fl.l_type = F_RDLCK;
+ break;
+ case LOCK_EX:
+ fl.l_type = F_WRLCK;
+ break;
+ case LOCK_UN:
+ fl.l_type = F_UNLCK;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ r = fcntl (fd, cmd, &fl);
+ if (r == -1 && errno == EACCES)
+ errno = EAGAIN;
+
+ return r;
+}
+
+# else /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+# error "This platform lacks flock function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+# endif /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+#endif /* !Windows */
diff --git a/gnulib/lib/floor.c b/gnulib/lib/floor.c
new file mode 100644
index 0000000..71a5b30
--- /dev/null
+++ b/gnulib/lib/floor.c
@@ -0,0 +1,99 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC floorl
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC floor
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC floorf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define L_(literal) literal##f
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* For 0 < x < 1, return +0.0 even if the current rounding mode is
+ FE_DOWNWARD. */
+ if (z < L_(1.0))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ else if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/floorf.c b/gnulib/lib/floorf.c
new file mode 100644
index 0000000..a62a4d1
--- /dev/null
+++ b/gnulib/lib/floorf.c
@@ -0,0 +1,20 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "floor.c"
diff --git a/gnulib/lib/floorl.c b/gnulib/lib/floorl.c
new file mode 100644
index 0000000..aa62294
--- /dev/null
+++ b/gnulib/lib/floorl.c
@@ -0,0 +1,37 @@
+/* Round towards negative infinity.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+floorl (long double x)
+{
+ return floor (x);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "floor.c"
+
+#endif
diff --git a/gnulib/lib/fma.c b/gnulib/lib/fma.c
new file mode 100644
index 0000000..d804663
--- /dev/null
+++ b/gnulib/lib/fma.c
@@ -0,0 +1,887 @@
+/* Fused multiply-add.
+ Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+#if HAVE_FEGETROUND
+# include <fenv.h>
+#endif
+
+#include "float+.h"
+#include "integer_length.h"
+#include "verify.h"
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC fmal
+# define DOUBLE long double
+# define FREXP frexpl
+# define LDEXP ldexpl
+# define MIN_EXP LDBL_MIN_EXP
+# define MANT_BIT LDBL_MANT_BIT
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC fma
+# define DOUBLE double
+# define FREXP frexp
+# define LDEXP ldexp
+# define MIN_EXP DBL_MIN_EXP
+# define MANT_BIT DBL_MANT_BIT
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC fmaf
+# define DOUBLE float
+# define FREXP frexpf
+# define LDEXP ldexpf
+# define MIN_EXP FLT_MIN_EXP
+# define MANT_BIT FLT_MANT_BIT
+# define L_(literal) literal##f
+#endif
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+/* It is possible to write an implementation of fused multiply-add with
+ floating-point operations alone. See
+ Sylvie Boldo, Guillaume Melquiond:
+ Emulation of FMA and correctly-rounded sums: proved algorithms using
+ rounding to odd.
+ <http://www.lri.fr/~melquion/doc/08-tc.pdf>
+ But is it complicated.
+ Here we take the simpler (and probably slower) approach of doing
+ multi-precision arithmetic. */
+
+/* We use the naming conventions of GNU gmp, but vastly simpler (and slower)
+ algorithms. */
+
+typedef unsigned int mp_limb_t;
+#define GMP_LIMB_BITS 32
+verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS);
+
+typedef unsigned long long mp_twolimb_t;
+#define GMP_TWOLIMB_BITS 64
+verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS);
+
+/* Number of limbs needed for a single DOUBLE. */
+#define NLIMBS1 ((MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS)
+
+/* Number of limbs needed for the accumulator. */
+#define NLIMBS3 (3 * NLIMBS1 + 1)
+
+/* Assuming 0.5 <= x < 1.0:
+ Convert the mantissa (x * 2^DBL_MANT_BIT) to a sequence of limbs. */
+static void
+decode (DOUBLE x, mp_limb_t limbs[NLIMBS1])
+{
+ /* I'm not sure whether it's safe to cast a 'double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'double' values between 0 and 2^31 (to 'unsigned int' or 'int',
+ doesn't matter).
+ So, we split the MANT_BIT bits of x into a number of chunks of
+ at most 31 bits. */
+ enum { chunk_count = (MANT_BIT - 1) / 31 + 1 };
+ /* Variables used for storing the bits limb after limb. */
+ mp_limb_t *p = limbs + NLIMBS1 - 1;
+ mp_limb_t accu = 0;
+ unsigned int bits_needed = MANT_BIT - (NLIMBS1 - 1) * GMP_LIMB_BITS;
+ /* The bits bits_needed-1...0 need to be ORed into the accu.
+ 1 <= bits_needed <= GMP_LIMB_BITS. */
+ /* Unroll the first 4 loop rounds. */
+ if (chunk_count > 0)
+ {
+ /* Here we still have MANT_BIT-0*31 bits to extract from x. */
+ enum { chunk_bits = MIN (31, MANT_BIT - 0 * 31) }; /* > 0, <= 31 */
+ mp_limb_t d;
+ x *= (mp_limb_t) 1 << chunk_bits;
+ d = (int) x; /* 0 <= d < 2^chunk_bits. */
+ x -= d;
+ if (!(x >= L_(0.0) && x < L_(1.0)))
+ abort ();
+ if (bits_needed < chunk_bits)
+ {
+ /* store bits_needed bits */
+ accu |= d >> (chunk_bits - bits_needed);
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ /* hold (chunk_bits - bits_needed) bits */
+ accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed));
+ bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed);
+ }
+ else
+ {
+ /* store chunk_bits bits */
+ accu |= d << (bits_needed - chunk_bits);
+ bits_needed -= chunk_bits;
+ if (bits_needed == 0)
+ {
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ accu = 0;
+ bits_needed = GMP_LIMB_BITS;
+ }
+ }
+ }
+ if (chunk_count > 1)
+ {
+ /* Here we still have MANT_BIT-1*31 bits to extract from x. */
+ enum { chunk_bits = MIN (31, MAX (MANT_BIT - 1 * 31, 0)) }; /* > 0, <= 31 */
+ mp_limb_t d;
+ x *= (mp_limb_t) 1 << chunk_bits;
+ d = (int) x; /* 0 <= d < 2^chunk_bits. */
+ x -= d;
+ if (!(x >= L_(0.0) && x < L_(1.0)))
+ abort ();
+ if (bits_needed < chunk_bits)
+ {
+ /* store bits_needed bits */
+ accu |= d >> (chunk_bits - bits_needed);
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ /* hold (chunk_bits - bits_needed) bits */
+ accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed));
+ bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed);
+ }
+ else
+ {
+ /* store chunk_bits bits */
+ accu |= d << (bits_needed - chunk_bits);
+ bits_needed -= chunk_bits;
+ if (bits_needed == 0)
+ {
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ accu = 0;
+ bits_needed = GMP_LIMB_BITS;
+ }
+ }
+ }
+ if (chunk_count > 2)
+ {
+ /* Here we still have MANT_BIT-2*31 bits to extract from x. */
+ enum { chunk_bits = MIN (31, MAX (MANT_BIT - 2 * 31, 0)) }; /* > 0, <= 31 */
+ mp_limb_t d;
+ x *= (mp_limb_t) 1 << chunk_bits;
+ d = (int) x; /* 0 <= d < 2^chunk_bits. */
+ x -= d;
+ if (!(x >= L_(0.0) && x < L_(1.0)))
+ abort ();
+ if (bits_needed < chunk_bits)
+ {
+ /* store bits_needed bits */
+ accu |= d >> (chunk_bits - bits_needed);
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ /* hold (chunk_bits - bits_needed) bits */
+ accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed));
+ bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed);
+ }
+ else
+ {
+ /* store chunk_bits bits */
+ accu |= d << (bits_needed - chunk_bits);
+ bits_needed -= chunk_bits;
+ if (bits_needed == 0)
+ {
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ accu = 0;
+ bits_needed = GMP_LIMB_BITS;
+ }
+ }
+ }
+ if (chunk_count > 3)
+ {
+ /* Here we still have MANT_BIT-3*31 bits to extract from x. */
+ enum { chunk_bits = MIN (31, MAX (MANT_BIT - 3 * 31, 0)) }; /* > 0, <= 31 */
+ mp_limb_t d;
+ x *= (mp_limb_t) 1 << chunk_bits;
+ d = (int) x; /* 0 <= d < 2^chunk_bits. */
+ x -= d;
+ if (!(x >= L_(0.0) && x < L_(1.0)))
+ abort ();
+ if (bits_needed < chunk_bits)
+ {
+ /* store bits_needed bits */
+ accu |= d >> (chunk_bits - bits_needed);
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ /* hold (chunk_bits - bits_needed) bits */
+ accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed));
+ bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed);
+ }
+ else
+ {
+ /* store chunk_bits bits */
+ accu |= d << (bits_needed - chunk_bits);
+ bits_needed -= chunk_bits;
+ if (bits_needed == 0)
+ {
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ accu = 0;
+ bits_needed = GMP_LIMB_BITS;
+ }
+ }
+ }
+ if (chunk_count > 4)
+ {
+ /* Here we still have MANT_BIT-4*31 bits to extract from x. */
+ /* Generic loop. */
+ size_t k;
+ for (k = 4; k < chunk_count; k++)
+ {
+ size_t chunk_bits = MIN (31, MANT_BIT - k * 31); /* > 0, <= 31 */
+ mp_limb_t d;
+ x *= (mp_limb_t) 1 << chunk_bits;
+ d = (int) x; /* 0 <= d < 2^chunk_bits. */
+ x -= d;
+ if (!(x >= L_(0.0) && x < L_(1.0)))
+ abort ();
+ if (bits_needed < chunk_bits)
+ {
+ /* store bits_needed bits */
+ accu |= d >> (chunk_bits - bits_needed);
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ /* hold (chunk_bits - bits_needed) bits */
+ accu = d << (GMP_LIMB_BITS - (chunk_bits - bits_needed));
+ bits_needed = GMP_LIMB_BITS - (chunk_bits - bits_needed);
+ }
+ else
+ {
+ /* store chunk_bits bits */
+ accu |= d << (bits_needed - chunk_bits);
+ bits_needed -= chunk_bits;
+ if (bits_needed == 0)
+ {
+ *p = accu;
+ if (p == limbs)
+ goto done;
+ p--;
+ accu = 0;
+ bits_needed = GMP_LIMB_BITS;
+ }
+ }
+ }
+ }
+ /* We shouldn't get here. */
+ abort ();
+
+ done: ;
+#ifndef USE_LONG_DOUBLE /* On FreeBSD 6.1/x86, 'long double' numbers sometimes
+ have excess precision. */
+ if (!(x == L_(0.0)))
+ abort ();
+#endif
+}
+
+/* Multiply two sequences of limbs. */
+static void
+multiply (mp_limb_t xlimbs[NLIMBS1], mp_limb_t ylimbs[NLIMBS1],
+ mp_limb_t prod_limbs[2 * NLIMBS1])
+{
+ size_t k, i, j;
+ enum { len1 = NLIMBS1 };
+ enum { len2 = NLIMBS1 };
+
+ for (k = len2; k > 0; )
+ prod_limbs[--k] = 0;
+ for (i = 0; i < len1; i++)
+ {
+ mp_limb_t digit1 = xlimbs[i];
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < len2; j++)
+ {
+ mp_limb_t digit2 = ylimbs[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ carry += prod_limbs[i + j];
+ prod_limbs[i + j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ prod_limbs[i + len2] = (mp_limb_t) carry;
+ }
+}
+
+DOUBLE
+FUNC (DOUBLE x, DOUBLE y, DOUBLE z)
+{
+ if (isfinite (x) && isfinite (y))
+ {
+ if (isfinite (z))
+ {
+ /* x, y, z are all finite. */
+ if (x == L_(0.0) || y == L_(0.0))
+ return z;
+ if (z == L_(0.0))
+ return x * y;
+ /* x, y, z are all non-zero.
+ The result is x * y + z. */
+ {
+ int e; /* exponent of x * y + z */
+ int sign;
+ mp_limb_t sum[NLIMBS3];
+ size_t sum_len;
+
+ {
+ int xys; /* sign of x * y */
+ int zs; /* sign of z */
+ int xye; /* sum of exponents of x and y */
+ int ze; /* exponent of z */
+ mp_limb_t summand1[NLIMBS3];
+ size_t summand1_len;
+ mp_limb_t summand2[NLIMBS3];
+ size_t summand2_len;
+
+ {
+ mp_limb_t zlimbs[NLIMBS1];
+ mp_limb_t xylimbs[2 * NLIMBS1];
+
+ {
+ DOUBLE xn; /* normalized part of x */
+ DOUBLE yn; /* normalized part of y */
+ DOUBLE zn; /* normalized part of z */
+ int xe; /* exponent of x */
+ int ye; /* exponent of y */
+ mp_limb_t xlimbs[NLIMBS1];
+ mp_limb_t ylimbs[NLIMBS1];
+
+ xys = 0;
+ xn = x;
+ if (x < 0)
+ {
+ xys = 1;
+ xn = - x;
+ }
+ yn = y;
+ if (y < 0)
+ {
+ xys = 1 - xys;
+ yn = - y;
+ }
+
+ zs = 0;
+ zn = z;
+ if (z < 0)
+ {
+ zs = 1;
+ zn = - z;
+ }
+
+ /* xn, yn, zn are all positive.
+ The result is (-1)^xys * xn * yn + (-1)^zs * zn. */
+ xn = FREXP (xn, &xe);
+ yn = FREXP (yn, &ye);
+ zn = FREXP (zn, &ze);
+ xye = xe + ye;
+ /* xn, yn, zn are all < 1.0 and >= 0.5.
+ The result is
+ (-1)^xys * 2^xye * xn * yn + (-1)^zs * 2^ze * zn. */
+ if (xye < ze - MANT_BIT)
+ {
+ /* 2^xye * xn * yn < 2^xye <= 2^(ze-MANT_BIT-1) */
+ return z;
+ }
+ if (xye - 2 * MANT_BIT > ze)
+ {
+ /* 2^ze * zn < 2^ze <= 2^(xye-2*MANT_BIT-1).
+ We cannot simply do
+ return x * y;
+ because it would round differently: A round-to-even
+ in the multiplication can be a round-up or round-down
+ here, due to z. So replace z with a value that doesn't
+ require the use of long bignums but that rounds the
+ same way. */
+ zn = L_(0.5);
+ ze = xye - 2 * MANT_BIT - 1;
+ }
+ /* Convert mantissas of xn, yn, zn to limb sequences:
+ xlimbs = 2^MANT_BIT * xn
+ ylimbs = 2^MANT_BIT * yn
+ zlimbs = 2^MANT_BIT * zn */
+ decode (xn, xlimbs);
+ decode (yn, ylimbs);
+ decode (zn, zlimbs);
+ /* Multiply the mantissas of xn and yn:
+ xylimbs = xlimbs * ylimbs */
+ multiply (xlimbs, ylimbs, xylimbs);
+ }
+ /* The result is
+ (-1)^xys * 2^(xye-2*MANT_BIT) * xylimbs
+ + (-1)^zs * 2^(ze-MANT_BIT) * zlimbs.
+ Compute
+ e = min (xye-2*MANT_BIT, ze-MANT_BIT)
+ then
+ summand1 = 2^(xye-2*MANT_BIT-e) * xylimbs
+ summand2 = 2^(ze-MANT_BIT-e) * zlimbs */
+ e = MIN (xye - 2 * MANT_BIT, ze - MANT_BIT);
+ if (e == xye - 2 * MANT_BIT)
+ {
+ /* Simply copy the limbs of xylimbs. */
+ size_t i;
+ for (i = 0; i < 2 * NLIMBS1; i++)
+ summand1[i] = xylimbs[i];
+ summand1_len = 2 * NLIMBS1;
+ }
+ else
+ {
+ size_t ediff = xye - 2 * MANT_BIT - e;
+ /* Left shift the limbs of xylimbs by ediff bits. */
+ size_t ldiff = ediff / GMP_LIMB_BITS;
+ size_t shift = ediff % GMP_LIMB_BITS;
+ size_t i;
+ for (i = 0; i < ldiff; i++)
+ summand1[i] = 0;
+ if (shift > 0)
+ {
+ mp_limb_t carry = 0;
+ for (i = 0; i < 2 * NLIMBS1; i++)
+ {
+ summand1[ldiff + i] = (xylimbs[i] << shift) | carry;
+ carry = xylimbs[i] >> (GMP_LIMB_BITS - shift);
+ }
+ summand1[ldiff + 2 * NLIMBS1] = carry;
+ summand1_len = ldiff + 2 * NLIMBS1 + 1;
+ }
+ else
+ {
+ for (i = 0; i < 2 * NLIMBS1; i++)
+ summand1[ldiff + i] = xylimbs[i];
+ summand1_len = ldiff + 2 * NLIMBS1;
+ }
+ /* Estimation of needed array size:
+ ediff = (xye - 2 * MANT_BIT) - (ze - MANT_BIT) <= MANT_BIT + 1
+ therefore
+ summand1_len
+ = (ediff + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + 2 * NLIMBS1
+ <= (MANT_BIT + GMP_LIMB_BITS) / GMP_LIMB_BITS + 2 * NLIMBS1
+ <= 3 * NLIMBS1 + 1
+ = NLIMBS3 */
+ if (!(summand1_len <= NLIMBS3))
+ abort ();
+ }
+ if (e == ze - MANT_BIT)
+ {
+ /* Simply copy the limbs of zlimbs. */
+ size_t i;
+ for (i = 0; i < NLIMBS1; i++)
+ summand2[i] = zlimbs[i];
+ summand2_len = NLIMBS1;
+ }
+ else
+ {
+ size_t ediff = ze - MANT_BIT - e;
+ /* Left shift the limbs of zlimbs by ediff bits. */
+ size_t ldiff = ediff / GMP_LIMB_BITS;
+ size_t shift = ediff % GMP_LIMB_BITS;
+ size_t i;
+ for (i = 0; i < ldiff; i++)
+ summand2[i] = 0;
+ if (shift > 0)
+ {
+ mp_limb_t carry = 0;
+ for (i = 0; i < NLIMBS1; i++)
+ {
+ summand2[ldiff + i] = (zlimbs[i] << shift) | carry;
+ carry = zlimbs[i] >> (GMP_LIMB_BITS - shift);
+ }
+ summand2[ldiff + NLIMBS1] = carry;
+ summand2_len = ldiff + NLIMBS1 + 1;
+ }
+ else
+ {
+ for (i = 0; i < NLIMBS1; i++)
+ summand2[ldiff + i] = zlimbs[i];
+ summand2_len = ldiff + NLIMBS1;
+ }
+ /* Estimation of needed array size:
+ ediff = (ze - MANT_BIT) - (xye - 2 * MANT_BIT) <= 2 * MANT_BIT
+ therefore
+ summand2_len
+ = (ediff + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + NLIMBS1
+ <= (2 * MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS + NLIMBS1
+ <= 3 * NLIMBS1 + 1
+ = NLIMBS3 */
+ if (!(summand2_len <= NLIMBS3))
+ abort ();
+ }
+ }
+ /* The result is
+ (-1)^xys * 2^e * summand1 + (-1)^zs * 2^e * summand2. */
+ if (xys == zs)
+ {
+ /* Perform an addition. */
+ size_t i;
+ mp_limb_t carry;
+
+ sign = xys;
+ carry = 0;
+ for (i = 0; i < MIN (summand1_len, summand2_len); i++)
+ {
+ mp_limb_t digit1 = summand1[i];
+ mp_limb_t digit2 = summand2[i];
+ sum[i] = digit1 + digit2 + carry;
+ carry = (carry
+ ? digit1 >= (mp_limb_t)-1 - digit2
+ : digit1 > (mp_limb_t)-1 - digit2);
+ }
+ if (summand1_len > summand2_len)
+ for (; i < summand1_len; i++)
+ {
+ mp_limb_t digit1 = summand1[i];
+ sum[i] = carry + digit1;
+ carry = carry && digit1 == (mp_limb_t)-1;
+ }
+ else
+ for (; i < summand2_len; i++)
+ {
+ mp_limb_t digit2 = summand2[i];
+ sum[i] = carry + digit2;
+ carry = carry && digit2 == (mp_limb_t)-1;
+ }
+ if (carry)
+ sum[i++] = carry;
+ sum_len = i;
+ }
+ else
+ {
+ /* Perform a subtraction. */
+ /* Compare summand1 and summand2 by magnitude. */
+ while (summand1[summand1_len - 1] == 0)
+ summand1_len--;
+ while (summand2[summand2_len - 1] == 0)
+ summand2_len--;
+ if (summand1_len > summand2_len)
+ sign = xys;
+ else if (summand1_len < summand2_len)
+ sign = zs;
+ else
+ {
+ size_t i = summand1_len;
+ for (;;)
+ {
+ --i;
+ if (summand1[i] > summand2[i])
+ {
+ sign = xys;
+ break;
+ }
+ if (summand1[i] < summand2[i])
+ {
+ sign = zs;
+ break;
+ }
+ if (i == 0)
+ /* summand1 and summand2 are equal. */
+ return L_(0.0);
+ }
+ }
+ if (sign == xys)
+ {
+ /* Compute summand1 - summand2. */
+ size_t i;
+ mp_limb_t carry;
+
+ carry = 0;
+ for (i = 0; i < summand2_len; i++)
+ {
+ mp_limb_t digit1 = summand1[i];
+ mp_limb_t digit2 = summand2[i];
+ sum[i] = digit1 - digit2 - carry;
+ carry = (carry ? digit1 <= digit2 : digit1 < digit2);
+ }
+ for (; i < summand1_len; i++)
+ {
+ mp_limb_t digit1 = summand1[i];
+ sum[i] = digit1 - carry;
+ carry = carry && digit1 == 0;
+ }
+ if (carry)
+ abort ();
+ sum_len = summand1_len;
+ }
+ else
+ {
+ /* Compute summand2 - summand1. */
+ size_t i;
+ mp_limb_t carry;
+
+ carry = 0;
+ for (i = 0; i < summand1_len; i++)
+ {
+ mp_limb_t digit1 = summand1[i];
+ mp_limb_t digit2 = summand2[i];
+ sum[i] = digit2 - digit1 - carry;
+ carry = (carry ? digit2 <= digit1 : digit2 < digit1);
+ }
+ for (; i < summand2_len; i++)
+ {
+ mp_limb_t digit2 = summand2[i];
+ sum[i] = digit2 - carry;
+ carry = carry && digit2 == 0;
+ }
+ if (carry)
+ abort ();
+ sum_len = summand2_len;
+ }
+ }
+ }
+ /* The result is
+ (-1)^sign * 2^e * sum. */
+ /* Now perform the rounding to MANT_BIT mantissa bits. */
+ while (sum[sum_len - 1] == 0)
+ sum_len--;
+ /* Here we know that the most significant limb, sum[sum_len - 1], is
+ non-zero. */
+ {
+ /* How many bits the sum has. */
+ unsigned int sum_bits =
+ integer_length (sum[sum_len - 1]) + (sum_len - 1) * GMP_LIMB_BITS;
+ /* How many bits to keep when rounding. */
+ unsigned int keep_bits;
+ /* How many bits to round off. */
+ unsigned int roundoff_bits;
+ if (e + (int) sum_bits >= MIN_EXP)
+ /* 2^e * sum >= 2^(MIN_EXP-1).
+ result will be a normalized number. */
+ keep_bits = MANT_BIT;
+ else if (e + (int) sum_bits >= MIN_EXP - MANT_BIT)
+ /* 2^e * sum >= 2^(MIN_EXP-MANT_BIT-1).
+ result will be a denormalized number or rounded to zero. */
+ keep_bits = e + (int) sum_bits - (MIN_EXP + MANT_BIT);
+ else
+ /* 2^e * sum < 2^(MIN_EXP-MANT_BIT-1). Round to zero. */
+ return L_(0.0);
+ /* Note: 0 <= keep_bits <= MANT_BIT. */
+ if (sum_bits <= keep_bits)
+ {
+ /* Nothing to do. */
+ roundoff_bits = 0;
+ keep_bits = sum_bits;
+ }
+ else
+ {
+ int round_up;
+ roundoff_bits = sum_bits - keep_bits; /* > 0, <= sum_bits */
+ {
+#if HAVE_FEGETROUND && defined FE_TOWARDZERO
+ /* Cf. <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fegetround.html> */
+ int rounding_mode = fegetround ();
+ if (rounding_mode == FE_TOWARDZERO)
+ round_up = 0;
+ else if (rounding_mode == FE_DOWNWARD)
+ round_up = sign;
+ else if (rounding_mode == FE_UPWARD)
+ round_up = !sign;
+#else
+ /* Cf. <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/float.h.html> */
+ int rounding_mode = FLT_ROUNDS;
+ if (rounding_mode == 0) /* toward zero */
+ round_up = 0;
+ else if (rounding_mode == 3) /* toward negative infinity */
+ round_up = sign;
+ else if (rounding_mode == 2) /* toward positive infinity */
+ round_up = !sign;
+#endif
+ else
+ {
+ /* Round to nearest. */
+ round_up = 0;
+ /* Test bit (roundoff_bits-1). */
+ if ((sum[(roundoff_bits - 1) / GMP_LIMB_BITS]
+ >> ((roundoff_bits - 1) % GMP_LIMB_BITS)) & 1)
+ {
+ /* Test bits roundoff_bits-1 .. 0. */
+ bool halfway =
+ ((sum[(roundoff_bits - 1) / GMP_LIMB_BITS]
+ & (((mp_limb_t) 1 << ((roundoff_bits - 1) % GMP_LIMB_BITS)) - 1))
+ == 0);
+ if (halfway)
+ {
+ int i;
+ for (i = (roundoff_bits - 1) / GMP_LIMB_BITS - 1; i >= 0; i--)
+ if (sum[i] != 0)
+ {
+ halfway = false;
+ break;
+ }
+ }
+ if (halfway)
+ /* Round to even. Test bit roundoff_bits. */
+ round_up = ((sum[roundoff_bits / GMP_LIMB_BITS]
+ >> (roundoff_bits % GMP_LIMB_BITS)) & 1);
+ else
+ /* Round up. */
+ round_up = 1;
+ }
+ }
+ }
+ /* Perform the rounding. */
+ {
+ size_t i = roundoff_bits / GMP_LIMB_BITS;
+ {
+ size_t j = i;
+ while (j > 0)
+ sum[--j] = 0;
+ }
+ if (round_up)
+ {
+ /* Round up. */
+ sum[i] =
+ (sum[i]
+ | (((mp_limb_t) 1 << (roundoff_bits % GMP_LIMB_BITS)) - 1))
+ + 1;
+ if (sum[i] == 0)
+ {
+ /* Propagate carry. */
+ while (i < sum_len - 1)
+ {
+ ++i;
+ sum[i] += 1;
+ if (sum[i] != 0)
+ break;
+ }
+ }
+ /* sum[i] is the most significant limb that was
+ incremented. */
+ if (i == sum_len - 1 && (sum[i] & (sum[i] - 1)) == 0)
+ {
+ /* Through the carry, one more bit is needed. */
+ if (sum[i] != 0)
+ sum_bits += 1;
+ else
+ {
+ /* Instead of requiring one more limb of memory,
+ perform a shift by one bit, and adjust the
+ exponent. */
+ sum[i] = (mp_limb_t) 1 << (GMP_LIMB_BITS - 1);
+ e += 1;
+ }
+ /* The bit sequence has the form 1000...000. */
+ keep_bits = 1;
+ }
+ }
+ else
+ {
+ /* Round down. */
+ sum[i] &= ((mp_limb_t) -1 << (roundoff_bits % GMP_LIMB_BITS));
+ if (i == sum_len - 1 && sum[i] == 0)
+ /* The entire sum has become zero. */
+ return L_(0.0);
+ }
+ }
+ }
+ /* The result is
+ (-1)^sign * 2^e * sum
+ and here we know that
+ 2^(sum_bits-1) <= sum < 2^sum_bits,
+ and sum is a multiple of 2^(sum_bits-keep_bits), where
+ 0 < keep_bits <= MANT_BIT and keep_bits <= sum_bits.
+ (If keep_bits was initially 0, the rounding either returned zero
+ or produced a bit sequence of the form 1000...000, setting
+ keep_bits to 1.) */
+ {
+ /* Split the keep_bits bits into chunks of at most 32 bits. */
+ unsigned int chunk_count = (keep_bits - 1) / GMP_LIMB_BITS + 1;
+ /* 1 <= chunk_count <= ceil (sum_bits / GMP_LIMB_BITS) = sum_len. */
+ static const DOUBLE chunk_multiplier = /* 2^-GMP_LIMB_BITS */
+ L_(1.0) / ((DOUBLE) (1 << (GMP_LIMB_BITS / 2))
+ * (DOUBLE) (1 << ((GMP_LIMB_BITS + 1) / 2)));
+ unsigned int shift = sum_bits % GMP_LIMB_BITS;
+ DOUBLE fsum;
+ if (MANT_BIT <= GMP_LIMB_BITS)
+ {
+ /* Since keep_bits <= MANT_BIT <= GMP_LIMB_BITS,
+ chunk_count is 1. No need for a loop. */
+ if (shift == 0)
+ fsum = (DOUBLE) sum[sum_len - 1];
+ else
+ fsum = (DOUBLE)
+ ((sum[sum_len - 1] << (GMP_LIMB_BITS - shift))
+ | (sum_len >= 2 ? sum[sum_len - 2] >> shift : 0));
+ }
+ else
+ {
+ int k;
+ k = chunk_count - 1;
+ if (shift == 0)
+ {
+ /* First loop round. */
+ fsum = (DOUBLE) sum[sum_len - k - 1];
+ /* General loop. */
+ while (--k >= 0)
+ {
+ fsum *= chunk_multiplier;
+ fsum += (DOUBLE) sum[sum_len - k - 1];
+ }
+ }
+ else
+ {
+ /* First loop round. */
+ fsum = (DOUBLE)
+ ((sum[sum_len - k - 1] << (GMP_LIMB_BITS - shift))
+ | (sum_len >= k + 2 ? sum[sum_len - k - 2] >> shift : 0));
+ /* General loop. */
+ while (--k >= 0)
+ {
+ fsum *= chunk_multiplier;
+ fsum += (DOUBLE)
+ ((sum[sum_len - k - 1] << (GMP_LIMB_BITS - shift))
+ | (sum[sum_len - k - 2] >> shift));
+ }
+ }
+ }
+ fsum = LDEXP (fsum, e + (int) sum_bits - GMP_LIMB_BITS);
+ return (sign ? - fsum : fsum);
+ }
+ }
+ }
+ }
+ else
+ return z;
+ }
+ else
+ return (x * y) + z;
+}
diff --git a/gnulib/lib/fmaf.c b/gnulib/lib/fmaf.c
new file mode 100644
index 0000000..d1f5310
--- /dev/null
+++ b/gnulib/lib/fmaf.c
@@ -0,0 +1,20 @@
+/* Fused multiply-add.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#define USE_FLOAT
+#include "fma.c"
diff --git a/gnulib/lib/fmal.c b/gnulib/lib/fmal.c
new file mode 100644
index 0000000..91d6dd9
--- /dev/null
+++ b/gnulib/lib/fmal.c
@@ -0,0 +1,37 @@
+/* Fused multiply-add.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+fmal (long double x, long double y, long double z)
+{
+ return fma (x, y, z);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "fma.c"
+
+#endif
diff --git a/gnulib/lib/fmodf.c b/gnulib/lib/fmodf.c
new file mode 100644
index 0000000..35a8a23
--- /dev/null
+++ b/gnulib/lib/fmodf.c
@@ -0,0 +1,26 @@
+/* Remainder.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+fmodf (float x, float y)
+{
+ return (float) fmod ((double) x, (double) y);
+}
diff --git a/gnulib/lib/fnmatch.c b/gnulib/lib/fnmatch.c
new file mode 100644
index 0000000..bd25b4c
--- /dev/null
+++ b/gnulib/lib/fnmatch.c
@@ -0,0 +1,351 @@
+/* Copyright (C) 1991-1993, 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#include <fnmatch.h>
+
+#include <alloca.h>
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define WIDE_CHAR_SUPPORT \
+ (HAVE_WCTYPE_H && HAVE_BTOWC && HAVE_ISWCTYPE \
+ && HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
+
+/* For platform which support the ISO C amendement 1 functionality we
+ support user defined character classes. */
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+# include <wctype.h>
+# include <wchar.h>
+#endif
+
+/* We need some of the locale data (the collation sequence information)
+ but there is no interface to get this information in general. Therefore
+ we support a correct implementation only in glibc. */
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# include "../locale/elem-hash.h"
+# include "../locale/coll-lookup.h"
+# include <shlib-compat.h>
+
+# define CONCAT(a,b) __CONCAT(a,b)
+# define mbsrtowcs __mbsrtowcs
+# define fnmatch __fnmatch
+extern int fnmatch (const char *pattern, const char *string, int flags);
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set. */
+#define NO_LEADING_PERIOD(flags) \
+ ((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and have not detected a bug
+ in the library. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
+
+
+# if ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(c) ((c) == ' ' || (c) == '\t')
+# endif
+
+# define STREQ(s1, s2) (strcmp (s1, s2) == 0)
+
+# if defined _LIBC || WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+ and the functions from ISO C amendement 1. */
+# ifdef CHARCLASS_NAME_MAX
+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+ problem. Use a reasonable default value. */
+# define CHAR_CLASS_MAX_LENGTH 256
+# endif
+
+# ifdef _LIBC
+# define IS_CHAR_CLASS(string) __wctype (string)
+# else
+# define IS_CHAR_CLASS(string) wctype (string)
+# endif
+
+# ifdef _LIBC
+# define ISWCTYPE(WC, WT) __iswctype (WC, WT)
+# else
+# define ISWCTYPE(WC, WT) iswctype (WC, WT)
+# endif
+
+# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
+/* In this case we are implementing the multibyte character handling. */
+# define HANDLE_MULTIBYTE 1
+# endif
+
+# else
+# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
+
+# define IS_CHAR_CLASS(string) \
+ (STREQ (string, "alpha") || STREQ (string, "upper") \
+ || STREQ (string, "lower") || STREQ (string, "digit") \
+ || STREQ (string, "alnum") || STREQ (string, "xdigit") \
+ || STREQ (string, "space") || STREQ (string, "print") \
+ || STREQ (string, "punct") || STREQ (string, "graph") \
+ || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+/* Global variable. */
+static int posixly_correct;
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way. In other
+ environments simply ignore the marking. */
+# define internal_function
+# endif
+
+/* Note that this evaluates C many times. */
+# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# define CHAR char
+# define UCHAR unsigned char
+# define INT int
+# define FCT internal_fnmatch
+# define EXT ext_match
+# define END end_pattern
+# define L_(CS) CS
+# ifdef _LIBC
+# define BTOWC(C) __btowc (C)
+# else
+# define BTOWC(C) btowc (C)
+# endif
+# define STRLEN(S) strlen (S)
+# define STRCAT(D, S) strcat (D, S)
+# ifdef _LIBC
+# define MEMPCPY(D, S, N) __mempcpy (D, S, N)
+# else
+# if HAVE_MEMPCPY
+# define MEMPCPY(D, S, N) mempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+# endif
+# endif
+# define MEMCHR(S, C, N) memchr (S, C, N)
+# include "fnmatch_loop.c"
+
+
+# if HANDLE_MULTIBYTE
+# define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c))
+# define CHAR wchar_t
+# define UCHAR wint_t
+# define INT wint_t
+# define FCT internal_fnwmatch
+# define EXT ext_wmatch
+# define END end_wpattern
+# define L_(CS) L##CS
+# define BTOWC(C) (C)
+# ifdef _LIBC
+# define STRLEN(S) __wcslen (S)
+# define STRCAT(D, S) __wcscat (D, S)
+# define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
+# else
+# define STRLEN(S) wcslen (S)
+# define STRCAT(D, S) wcscat (D, S)
+# if HAVE_WMEMPCPY
+# define MEMPCPY(D, S, N) wmempcpy (D, S, N)
+# else
+# define MEMPCPY(D, S, N) (wmemcpy (D, S, N) + (N))
+# endif
+# endif
+# define MEMCHR(S, C, N) wmemchr (S, C, N)
+# define WIDE_CHAR_VERSION 1
+
+# undef IS_CHAR_CLASS
+/* We have to convert the wide character string in a multibyte string. But
+ we know that the character class names consist of alphanumeric characters
+ from the portable character set, and since the wide character encoding
+ for a member of the portable character set is the same code point as
+ its single-byte encoding, we can use a simplified method to convert the
+ string to a multibyte character string. */
+static wctype_t
+is_char_class (const wchar_t *wcs)
+{
+ char s[CHAR_CLASS_MAX_LENGTH + 1];
+ char *cp = s;
+
+ do
+ {
+ /* Test for a printable character from the portable character set. */
+# ifdef _LIBC
+ if (*wcs < 0x20 || *wcs > 0x7e
+ || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
+ return (wctype_t) 0;
+# else
+ switch (*wcs)
+ {
+ case L' ': case L'!': case L'"': case L'#': case L'%':
+ case L'&': case L'\'': case L'(': case L')': case L'*':
+ case L'+': case L',': case L'-': case L'.': case L'/':
+ case L'0': case L'1': case L'2': case L'3': case L'4':
+ case L'5': case L'6': case L'7': case L'8': case L'9':
+ case L':': case L';': case L'<': case L'=': case L'>':
+ case L'?':
+ case L'A': case L'B': case L'C': case L'D': case L'E':
+ case L'F': case L'G': case L'H': case L'I': case L'J':
+ case L'K': case L'L': case L'M': case L'N': case L'O':
+ case L'P': case L'Q': case L'R': case L'S': case L'T':
+ case L'U': case L'V': case L'W': case L'X': case L'Y':
+ case L'Z':
+ case L'[': case L'\\': case L']': case L'^': case L'_':
+ case L'a': case L'b': case L'c': case L'd': case L'e':
+ case L'f': case L'g': case L'h': case L'i': case L'j':
+ case L'k': case L'l': case L'm': case L'n': case L'o':
+ case L'p': case L'q': case L'r': case L's': case L't':
+ case L'u': case L'v': case L'w': case L'x': case L'y':
+ case L'z': case L'{': case L'|': case L'}': case L'~':
+ break;
+ default:
+ return (wctype_t) 0;
+ }
+# endif
+
+ /* Avoid overrunning the buffer. */
+ if (cp == s + CHAR_CLASS_MAX_LENGTH)
+ return (wctype_t) 0;
+
+ *cp++ = (char) *wcs++;
+ }
+ while (*wcs != L'\0');
+
+ *cp = '\0';
+
+# ifdef _LIBC
+ return __wctype (s);
+# else
+ return wctype (s);
+# endif
+}
+# define IS_CHAR_CLASS(string) is_char_class (string)
+
+# include "fnmatch_loop.c"
+# endif
+
+
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+# if HANDLE_MULTIBYTE
+# define ALLOCA_LIMIT 2000
+ if (__builtin_expect (MB_CUR_MAX, 1) != 1)
+ {
+ mbstate_t ps;
+ size_t patsize;
+ size_t strsize;
+ size_t totsize;
+ wchar_t *wpattern;
+ wchar_t *wstring;
+ int res;
+
+ /* Calculate the size needed to convert the strings to
+ wide characters. */
+ memset (&ps, '\0', sizeof (ps));
+ patsize = mbsrtowcs (NULL, &pattern, 0, &ps) + 1;
+ if (__builtin_expect (patsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ strsize = mbsrtowcs (NULL, &string, 0, &ps) + 1;
+ if (__builtin_expect (strsize != 0, 1))
+ {
+ assert (mbsinit (&ps));
+ totsize = patsize + strsize;
+ if (__builtin_expect (! (patsize <= totsize
+ && totsize <= SIZE_MAX / sizeof (wchar_t)),
+ 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* Allocate room for the wide characters. */
+ if (__builtin_expect (totsize < ALLOCA_LIMIT, 1))
+ wpattern = (wchar_t *) alloca (totsize * sizeof (wchar_t));
+ else
+ {
+ wpattern = malloc (totsize * sizeof (wchar_t));
+ if (__builtin_expect (! wpattern, 0))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ wstring = wpattern + patsize;
+
+ /* Convert the strings into wide characters. */
+ mbsrtowcs (wpattern, &pattern, patsize, &ps);
+ assert (mbsinit (&ps));
+ mbsrtowcs (wstring, &string, strsize, &ps);
+
+ res = internal_fnwmatch (wpattern, wstring, wstring + strsize - 1,
+ flags & FNM_PERIOD, flags);
+
+ if (__builtin_expect (! (totsize < ALLOCA_LIMIT), 0))
+ free (wpattern);
+ return res;
+ }
+ }
+ }
+
+# endif /* HANDLE_MULTIBYTE */
+
+ return internal_fnmatch (pattern, string, string + strlen (string),
+ flags & FNM_PERIOD, flags);
+}
+
+# ifdef _LIBC
+# undef fnmatch
+versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
+# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
+strong_alias (__fnmatch, __fnmatch_old)
+compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
+# endif
+libc_hidden_ver (__fnmatch, fnmatch)
+# endif
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
diff --git a/gnulib/lib/fnmatch.in.h b/gnulib/lib/fnmatch.in.h
new file mode 100644
index 0000000..e06ff03
--- /dev/null
+++ b/gnulib/lib/fnmatch.in.h
@@ -0,0 +1,68 @@
+/* Copyright (C) 1991-1993, 1996-1999, 2001-2003, 2005, 2007, 2009-2011 Free
+ Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _FNMATCH_H
+#define _FNMATCH_H 1
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* We #undef these before defining them because some losing systems
+ (HP-UX A.08.07 for example) define these in <unistd.h>. */
+#undef FNM_PATHNAME
+#undef FNM_NOESCAPE
+#undef FNM_PERIOD
+
+/* Bits set in the FLAGS argument to `fnmatch'. */
+#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
+#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
+#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
+
+#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
+# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
+# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
+# define FNM_EXTMATCH (1 << 5) /* Use ksh-like extended matching. */
+#endif
+
+/* Value returned by `fnmatch' if STRING does not match PATTERN. */
+#define FNM_NOMATCH 1
+
+/* This value is returned if the implementation does not support
+ `fnmatch'. Since this is not the case here it will never be
+ returned but the conformance test suites still require the symbol
+ to be defined. */
+#ifdef _XOPEN_SOURCE
+# define FNM_NOSYS (-1)
+#endif
+
+/* Match NAME against the file name pattern PATTERN,
+ returning zero if it matches, FNM_NOMATCH if not. */
+extern int fnmatch (const char *__pattern, const char *__name,
+ int __flags)
+ _GL_ARG_NONNULL ((1, 2));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/gnulib/lib/fnmatch_loop.c b/gnulib/lib/fnmatch_loop.c
new file mode 100644
index 0000000..f35c10f
--- /dev/null
+++ b/gnulib/lib/fnmatch_loop.c
@@ -0,0 +1,1220 @@
+/* Copyright (C) 1991-1993, 1996-2006, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Match STRING against the file name pattern PATTERN, returning zero if
+ it matches, nonzero if not. */
+static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
+ const CHAR *string_end, bool no_leading_period, int flags)
+ internal_function;
+static const CHAR *END (const CHAR *patternp) internal_function;
+
+static int
+internal_function
+FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ register const CHAR *p = pattern, *n = string;
+ register UCHAR c;
+#ifdef _LIBC
+# if WIDE_CHAR_VERSION
+ const char *collseq = (const char *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+# else
+ const UCHAR *collseq = (const UCHAR *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+# endif
+#endif
+
+ while ((c = *p++) != L_('\0'))
+ {
+ bool new_no_leading_period = false;
+ c = FOLD (c);
+
+ switch (c)
+ {
+ case L_('?'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ if (res != -1)
+ return res;
+ }
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+ else if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ return FNM_NOMATCH;
+ else if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('\\'):
+ if (!(flags & FNM_NOESCAPE))
+ {
+ c = *p++;
+ if (c == L_('\0'))
+ /* Trailing \ loses. */
+ return FNM_NOMATCH;
+ c = FOLD (c);
+ }
+ if (n == string_end || FOLD ((UCHAR) *n) != c)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('*'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period,
+ flags);
+ if (res != -1)
+ return res;
+ }
+
+ if (n != string_end && *n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ for (c = *p++; c == L_('?') || c == L_('*'); c = *p++)
+ {
+ if (*p == L_('(') && (flags & FNM_EXTMATCH) != 0)
+ {
+ const CHAR *endp = END (p);
+ if (endp != p)
+ {
+ /* This is a pattern. Skip over it. */
+ p = endp;
+ continue;
+ }
+ }
+
+ if (c == L_('?'))
+ {
+ /* A ? needs to match one character. */
+ if (n == string_end)
+ /* There isn't another character; no match. */
+ return FNM_NOMATCH;
+ else if (*n == L_('/')
+ && __builtin_expect (flags & FNM_FILE_NAME, 0))
+ /* A slash does not match a wildcard under
+ FNM_FILE_NAME. */
+ return FNM_NOMATCH;
+ else
+ /* One character of the string is consumed in matching
+ this ? wildcard, so *??? won't match if there are
+ less than three characters. */
+ ++n;
+ }
+ }
+
+ if (c == L_('\0'))
+ /* The wildcard(s) is/are the last element of the pattern.
+ If the name is a file name and contains another slash
+ this means it cannot match, unless the FNM_LEADING_DIR
+ flag is set. */
+ {
+ int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
+
+ if (flags & FNM_FILE_NAME)
+ {
+ if (flags & FNM_LEADING_DIR)
+ result = 0;
+ else
+ {
+ if (MEMCHR (n, L_('/'), string_end - n) == NULL)
+ result = 0;
+ }
+ }
+
+ return result;
+ }
+ else
+ {
+ const CHAR *endp;
+
+ endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L_('/') : L_('\0'),
+ string_end - n);
+ if (endp == NULL)
+ endp = string_end;
+
+ if (c == L_('[')
+ || (__builtin_expect (flags & FNM_EXTMATCH, 0) != 0
+ && (c == L_('@') || c == L_('+') || c == L_('!'))
+ && *p == L_('(')))
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ bool no_leading_period2 = no_leading_period;
+
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0)
+ return 0;
+ }
+ else if (c == L_('/') && (flags & FNM_FILE_NAME))
+ {
+ while (n < string_end && *n != L_('/'))
+ ++n;
+ if (n < string_end && *n == L_('/')
+ && (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags)
+ == 0))
+ return 0;
+ }
+ else
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+ int no_leading_period2 = no_leading_period;
+
+ if (c == L_('\\') && !(flags & FNM_NOESCAPE))
+ c = *p;
+ c = FOLD (c);
+ for (--p; n < endp; ++n, no_leading_period2 = false)
+ if (FOLD ((UCHAR) *n) == c
+ && (FCT (p, n, string_end, no_leading_period2, flags2)
+ == 0))
+ return 0;
+ }
+ }
+
+ /* If we come here no match is possible with the wildcard. */
+ return FNM_NOMATCH;
+
+ case L_('['):
+ {
+ /* Nonzero if the sense of the character class is inverted. */
+ const CHAR *p_init = p;
+ const CHAR *n_init = n;
+ register bool not;
+ CHAR cold;
+ UCHAR fn;
+
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+
+ if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ /* `/' cannot be matched. */
+ return FNM_NOMATCH;
+
+ not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
+ if (not)
+ ++p;
+
+ fn = FOLD ((UCHAR) *n);
+
+ c = *p++;
+ for (;;)
+ {
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ c = FOLD ((UCHAR) *p);
+ ++p;
+
+ goto normal_bracket;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ /* Leave room for the null. */
+ CHAR str[CHAR_CLASS_MAX_LENGTH + 1];
+ size_t c1 = 0;
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ wctype_t wt;
+#endif
+ const CHAR *startp = p;
+
+ for (;;)
+ {
+ if (c1 == CHAR_CLASS_MAX_LENGTH)
+ /* The name is too long and therefore the pattern
+ is ill-formed. */
+ return FNM_NOMATCH;
+
+ c = *++p;
+ if (c == L_(':') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c < L_('a') || c >= L_('z'))
+ {
+ /* This cannot possibly be a character class name.
+ Match it as a normal range. */
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str[c1++] = c;
+ }
+ str[c1] = L_('\0');
+
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+ wt = IS_CHAR_CLASS (str);
+ if (wt == 0)
+ /* Invalid character class name. */
+ return FNM_NOMATCH;
+
+# if defined _LIBC && ! WIDE_CHAR_VERSION
+ /* The following code is glibc specific but does
+ there a good job in speeding up the code since
+ we can avoid the btowc() call. */
+ if (_ISCTYPE ((UCHAR) *n, wt))
+ goto matched;
+# else
+ if (ISWCTYPE (BTOWC ((UCHAR) *n), wt))
+ goto matched;
+# endif
+#else
+ if ((STREQ (str, L_("alnum")) && isalnum ((UCHAR) *n))
+ || (STREQ (str, L_("alpha")) && isalpha ((UCHAR) *n))
+ || (STREQ (str, L_("blank")) && isblank ((UCHAR) *n))
+ || (STREQ (str, L_("cntrl")) && iscntrl ((UCHAR) *n))
+ || (STREQ (str, L_("digit")) && isdigit ((UCHAR) *n))
+ || (STREQ (str, L_("graph")) && isgraph ((UCHAR) *n))
+ || (STREQ (str, L_("lower")) && islower ((UCHAR) *n))
+ || (STREQ (str, L_("print")) && isprint ((UCHAR) *n))
+ || (STREQ (str, L_("punct")) && ispunct ((UCHAR) *n))
+ || (STREQ (str, L_("space")) && isspace ((UCHAR) *n))
+ || (STREQ (str, L_("upper")) && isupper ((UCHAR) *n))
+ || (STREQ (str, L_("xdigit")) && isxdigit ((UCHAR) *n)))
+ goto matched;
+#endif
+ c = *p++;
+ }
+#ifdef _LIBC
+ else if (c == L_('[') && *p == L_('='))
+ {
+ UCHAR str[1];
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+
+ c = *++p;
+ if (c == L_('\0'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str[0] = c;
+
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ p += 2;
+
+ if (nrules == 0)
+ {
+ if ((UCHAR) *n == str[0])
+ goto matched;
+ }
+ else
+ {
+ const int32_t *table;
+# if WIDE_CHAR_VERSION
+ const int32_t *weights;
+ const int32_t *extra;
+# else
+ const unsigned char *weights;
+ const unsigned char *extra;
+# endif
+ const int32_t *indirect;
+ int32_t idx;
+ const UCHAR *cp = (const UCHAR *) str;
+
+ /* This #include defines a local function! */
+# if WIDE_CHAR_VERSION
+# include <locale/weightwc.h>
+# else
+# include <locale/weight.h>
+# endif
+
+# if WIDE_CHAR_VERSION
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
+ weights = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
+ extra = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
+# else
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+# endif
+
+ idx = findidx (&cp);
+ if (idx != 0)
+ {
+ /* We found a table entry. Now see whether the
+ character we are currently at has the same
+ equivalance class value. */
+ int len = weights[idx & 0xffffff];
+ int32_t idx2;
+ const UCHAR *np = (const UCHAR *) n;
+
+ idx2 = findidx (&np);
+ if (idx2 != 0
+ && (idx >> 24) == (idx2 >> 24)
+ && len == weights[idx2 & 0xffffff])
+ {
+ int cnt = 0;
+
+ idx &= 0xffffff;
+ idx2 &= 0xffffff;
+
+ while (cnt < len
+ && (weights[idx + 1 + cnt]
+ == weights[idx2 + 1 + cnt]))
+ ++cnt;
+
+ if (cnt == len)
+ goto matched;
+ }
+ }
+ }
+
+ c = *p++;
+ }
+#endif
+ else if (c == L_('\0'))
+ {
+ /* [ unterminated, treat as normal character. */
+ p = p_init;
+ n = n_init;
+ c = L_('[');
+ goto normal_match;
+ }
+ else
+ {
+ bool is_range = false;
+
+#ifdef _LIBC
+ bool is_seqval = false;
+
+ if (c == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = *p == L_('-') && p[1] != L_('\0');
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the collation
+ data. Therefore we only accept the trivial
+ names consisting of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ if (!is_range && *n == startp[1])
+ goto matched;
+
+ cold = startp[1];
+ c = *p++;
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ /* Locate the character in the hashing table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem
+ + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+
+ if (! is_range)
+ {
+# ifdef WIDE_CHAR_VERSION
+ for (c1 = 0;
+ (int32_t) c1 < wextra[idx];
+ ++c1)
+ if (n[c1] != wextra[1 + c1])
+ break;
+
+ if ((int32_t) c1 == wextra[idx])
+ goto matched;
+# else
+ for (c1 = 0; c1 < extra[idx]; ++c1)
+ if (n[c1] != extra[1 + c1])
+ break;
+
+ if (c1 == extra[idx])
+ goto matched;
+# endif
+ }
+
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cold = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ cold = *((int32_t *) &extra[idx]);
+# endif
+
+ c = *p++;
+ }
+ else if (c1 == 1)
+ {
+ /* No valid character. Match it as a
+ single byte. */
+ if (!is_range && *n == str[0])
+ goto matched;
+
+ cold = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+ }
+ else
+# undef str
+#endif
+ {
+ c = FOLD (c);
+ normal_bracket:
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = (*p == L_('-') && p[1] != L_('\0')
+ && p[1] != L_(']'));
+
+ if (!is_range && c == fn)
+ goto matched;
+
+#if _LIBC
+ /* This is needed if we goto normal_bracket; from
+ outside of is_seqval's scope. */
+ is_seqval = false;
+#endif
+
+ cold = c;
+ c = *p++;
+ }
+
+ if (c == L_('-') && *p != L_(']'))
+ {
+#if _LIBC
+ /* We have to find the collation sequence
+ value for C. Collation sequence is nothing
+ we can regularly access. The sequence
+ value is defined by the order in which the
+ definitions of the collation values for the
+ various characters appear in the source
+ file. A strange concept, nowhere
+ documented. */
+ uint32_t fcollseq;
+ uint32_t lcollseq;
+ UCHAR cend = *p++;
+
+# ifdef WIDE_CHAR_VERSION
+ /* Search in the `names' array for the characters. */
+ fcollseq = __collseq_table_lookup (collseq, fn);
+ if (fcollseq == ~((uint32_t) 0))
+ /* XXX We don't know anything about the character
+ we are supposed to match. This means we are
+ failing. */
+ goto range_not_matched;
+
+ if (is_seqval)
+ lcollseq = cold;
+ else
+ lcollseq = __collseq_table_lookup (collseq, cold);
+# else
+ fcollseq = collseq[fn];
+ lcollseq = is_seqval ? cold : collseq[(UCHAR) cold];
+# endif
+
+ is_seqval = false;
+ if (cend == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the
+ collation data. Therefore we only
+ accept the trivial names consisting
+ of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ cend = startp[1];
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+# ifdef WIDE_CHAR_VERSION
+ char str[c1];
+ size_t strcnt;
+# else
+# define str (startp + 1)
+# endif
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+ int32_t second;
+ int32_t hash;
+
+# ifdef WIDE_CHAR_VERSION
+ /* We have to convert the name to a single-byte
+ string. This is possible since the names
+ consist of ASCII characters and the internal
+ representation is UCS4. */
+ for (strcnt = 0; strcnt < c1; ++strcnt)
+ str[strcnt] = startp[1 + strcnt];
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ /* Locate the character in the hashing
+ table. */
+ hash = elem_hash (str, c1);
+
+ idx = 0;
+ elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ && (c1
+ == extra[symb_table[2 * elem + 1]])
+ && memcmp (str,
+ &extra[symb_table[2 * elem + 1]
+ + 1], c1) == 0)
+ {
+ /* Yep, this is the entry. */
+ idx = symb_table[2 * elem + 1];
+ idx += 1 + extra[idx];
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+
+ if (symb_table[2 * elem] != 0)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+# ifdef WIDE_CHAR_VERSION
+ int32_t *wextra;
+
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~4;
+
+ wextra = (int32_t *) &extra[idx + 4];
+# endif
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# ifdef WIDE_CHAR_VERSION
+ cend = wextra[1 + wextra[idx]];
+# else
+ /* Adjust for the alignment. */
+ idx += 1 + extra[idx];
+ idx = (idx + 3) & ~4;
+ cend = *((int32_t *) &extra[idx]);
+# endif
+ }
+ else if (symb_table[2 * elem] != 0 && c1 == 1)
+ {
+ cend = str[0];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+# undef str
+ }
+ else
+ {
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+ cend = FOLD (cend);
+ }
+
+ /* XXX It is not entirely clear to me how to handle
+ characters which are not mentioned in the
+ collation specification. */
+ if (
+# ifdef WIDE_CHAR_VERSION
+ lcollseq == 0xffffffff ||
+# endif
+ lcollseq <= fcollseq)
+ {
+ /* We have to look at the upper bound. */
+ uint32_t hcollseq;
+
+ if (is_seqval)
+ hcollseq = cend;
+ else
+ {
+# ifdef WIDE_CHAR_VERSION
+ hcollseq =
+ __collseq_table_lookup (collseq, cend);
+ if (hcollseq == ~((uint32_t) 0))
+ {
+ /* Hum, no information about the upper
+ bound. The matching succeeds if the
+ lower bound is matched exactly. */
+ if (lcollseq != fcollseq)
+ goto range_not_matched;
+
+ goto matched;
+ }
+# else
+ hcollseq = collseq[cend];
+# endif
+ }
+
+ if (lcollseq <= hcollseq && fcollseq <= hcollseq)
+ goto matched;
+ }
+# ifdef WIDE_CHAR_VERSION
+ range_not_matched:
+# endif
+#else
+ /* We use a boring value comparison of the character
+ values. This is better than comparing using
+ `strcoll' since the latter would have surprising
+ and sometimes fatal consequences. */
+ UCHAR cend = *p++;
+
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+
+ /* It is a range. */
+ if (cold <= fn && fn <= cend)
+ goto matched;
+#endif
+
+ c = *p++;
+ }
+ }
+
+ if (c == L_(']'))
+ break;
+ }
+
+ if (!not)
+ return FNM_NOMATCH;
+ break;
+
+ matched:
+ /* Skip the rest of the [...] that already matched. */
+ do
+ {
+ ignore_next:
+ c = *p++;
+
+ if (c == L_('\0'))
+ /* [... (unterminated) loses. */
+ return FNM_NOMATCH;
+
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ /* XXX 1003.2d11 is unclear if this is right. */
+ ++p;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ int c1 = 0;
+ const CHAR *startp = p;
+
+ while (1)
+ {
+ c = *++p;
+ if (++c1 == CHAR_CLASS_MAX_LENGTH)
+ return FNM_NOMATCH;
+
+ if (*p == L_(':') && p[1] == L_(']'))
+ break;
+
+ if (c < L_('a') || c >= L_('z'))
+ {
+ p = startp;
+ goto ignore_next;
+ }
+ }
+ p += 2;
+ c = *p++;
+ }
+ else if (c == L_('[') && *p == L_('='))
+ {
+ c = *++p;
+ if (c == L_('\0'))
+ return FNM_NOMATCH;
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ return FNM_NOMATCH;
+ p += 2;
+ c = *p++;
+ }
+ else if (c == L_('[') && *p == L_('.'))
+ {
+ ++p;
+ while (1)
+ {
+ c = *++p;
+ if (c == '\0')
+ return FNM_NOMATCH;
+
+ if (*p == L_('.') && p[1] == L_(']'))
+ break;
+ }
+ p += 2;
+ c = *p++;
+ }
+ }
+ while (c != L_(']'));
+ if (not)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ case L_('+'):
+ case L_('@'):
+ case L_('!'):
+ if (__builtin_expect (flags & FNM_EXTMATCH, 0) && *p == '(')
+ {
+ int res;
+
+ res = EXT (c, p, n, string_end, no_leading_period, flags);
+ if (res != -1)
+ return res;
+ }
+ goto normal_match;
+
+ case L_('/'):
+ if (NO_LEADING_PERIOD (flags))
+ {
+ if (n == string_end || c != (UCHAR) *n)
+ return FNM_NOMATCH;
+
+ new_no_leading_period = true;
+ break;
+ }
+ /* FALLTHROUGH */
+ default:
+ normal_match:
+ if (n == string_end || c != FOLD ((UCHAR) *n))
+ return FNM_NOMATCH;
+ }
+
+ no_leading_period = new_no_leading_period;
+ ++n;
+ }
+
+ if (n == string_end)
+ return 0;
+
+ if ((flags & FNM_LEADING_DIR) && n != string_end && *n == L_('/'))
+ /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
+ return 0;
+
+ return FNM_NOMATCH;
+}
+
+
+static const CHAR *
+internal_function
+END (const CHAR *pattern)
+{
+ const CHAR *p = pattern;
+
+ while (1)
+ if (*++p == L_('\0'))
+ /* This is an invalid pattern. */
+ return pattern;
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ /* This is no valid pattern. */
+ return pattern;
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ p = END (p + 1);
+ else if (*p == L_(')'))
+ break;
+
+ return p + 1;
+}
+
+
+static int
+internal_function
+EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags)
+{
+ const CHAR *startp;
+ size_t level;
+ struct patternlist
+ {
+ struct patternlist *next;
+ CHAR str[1];
+ } *list = NULL;
+ struct patternlist **lastp = &list;
+ size_t pattern_len = STRLEN (pattern);
+ const CHAR *p;
+ const CHAR *rs;
+ enum { ALLOCA_LIMIT = 8000 };
+
+ /* Parse the pattern. Store the individual parts in the list. */
+ level = 0;
+ for (startp = p = pattern + 1; ; ++p)
+ if (*p == L_('\0'))
+ /* This is an invalid pattern. */
+ return -1;
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ /* This is no valid pattern. */
+ return -1;
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ /* Remember the nesting level. */
+ ++level;
+ else if (*p == L_(')'))
+ {
+ if (level-- == 0)
+ {
+ /* This means we found the end of the pattern. */
+#define NEW_PATTERN \
+ struct patternlist *newp; \
+ size_t plen; \
+ size_t plensize; \
+ size_t newpsize; \
+ \
+ plen = (opt == L_('?') || opt == L_('@') \
+ ? pattern_len \
+ : p - startp + 1UL); \
+ plensize = plen * sizeof (CHAR); \
+ newpsize = offsetof (struct patternlist, str) + plensize; \
+ if ((size_t) -1 / sizeof (CHAR) < plen \
+ || newpsize < offsetof (struct patternlist, str) \
+ || ALLOCA_LIMIT <= newpsize) \
+ return -1; \
+ newp = (struct patternlist *) alloca (newpsize); \
+ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L_('\0'); \
+ newp->next = NULL; \
+ *lastp = newp; \
+ lastp = &newp->next
+ NEW_PATTERN;
+ break;
+ }
+ }
+ else if (*p == L_('|'))
+ {
+ if (level == 0)
+ {
+ NEW_PATTERN;
+ startp = p + 1;
+ }
+ }
+ assert (list != NULL);
+ assert (p[-1] == L_(')'));
+#undef NEW_PATTERN
+
+ switch (opt)
+ {
+ case L_('*'):
+ if (FCT (p, string, string_end, no_leading_period, flags) == 0)
+ return 0;
+ /* FALLTHROUGH */
+
+ case L_('+'):
+ do
+ {
+ for (rs = string; rs <= string_end; ++rs)
+ /* First match the prefix with the current pattern with the
+ current pattern. */
+ if (FCT (list->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0
+ /* This was successful. Now match the rest with the rest
+ of the pattern. */
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD) == 0
+ /* This didn't work. Try the whole pattern. */
+ || (rs != string
+ && FCT (pattern - 1, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD) == 0)))
+ /* It worked. Signal success. */
+ return 0;
+ }
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ case L_('?'):
+ if (FCT (p, string, string_end, no_leading_period, flags) == 0)
+ return 0;
+ /* FALLTHROUGH */
+
+ case L_('@'):
+ do
+ /* I cannot believe it but `strcat' is actually acceptable
+ here. Match the entire string with the prefix from the
+ pattern list and the rest of the pattern following the
+ pattern list. */
+ if (FCT (STRCAT (list->str, p), string, string_end,
+ no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
+ /* It worked. Signal success. */
+ return 0;
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ return FNM_NOMATCH;
+
+ case L_('!'):
+ for (rs = string; rs <= string_end; ++rs)
+ {
+ struct patternlist *runp;
+
+ for (runp = list; runp != NULL; runp = runp->next)
+ if (FCT (runp->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0)
+ break;
+
+ /* If none of the patterns matched see whether the rest does. */
+ if (runp == NULL
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD)
+ == 0))
+ /* This is successful. */
+ return 0;
+ }
+
+ /* None of the patterns together with the rest of the pattern
+ lead to a match. */
+ return FNM_NOMATCH;
+
+ default:
+ assert (! "Invalid extended matching operator");
+ break;
+ }
+
+ return -1;
+}
+
+
+#undef FOLD
+#undef CHAR
+#undef UCHAR
+#undef INT
+#undef FCT
+#undef EXT
+#undef END
+#undef MEMPCPY
+#undef MEMCHR
+#undef STRLEN
+#undef STRCAT
+#undef L_
+#undef BTOWC
diff --git a/gnulib/lib/fopen-safer.c b/gnulib/lib/fopen-safer.c
new file mode 100644
index 0000000..c0a1f16
--- /dev/null
+++ b/gnulib/lib/fopen-safer.c
@@ -0,0 +1,63 @@
+/* Invoke fopen, but avoid some glitches.
+
+ Copyright (C) 2001, 2004-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+/* Like fopen, but do not return stdin, stdout, or stderr. */
+
+FILE *
+fopen_safer (char const *file, char const *mode)
+{
+ FILE *fp = fopen (file, mode);
+
+ if (fp)
+ {
+ int fd = fileno (fp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+
+ if (f < 0)
+ {
+ int e = errno;
+ fclose (fp);
+ errno = e;
+ return NULL;
+ }
+
+ if (fclose (fp) != 0
+ || ! (fp = fdopen (f, mode)))
+ {
+ int e = errno;
+ close (f);
+ errno = e;
+ return NULL;
+ }
+ }
+ }
+
+ return fp;
+}
diff --git a/gnulib/lib/fopen.c b/gnulib/lib/fopen.c
new file mode 100644
index 0000000..e9ba6bb
--- /dev/null
+++ b/gnulib/lib/fopen.c
@@ -0,0 +1,110 @@
+/* Open a stream to a file.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* If the user's config.h happens to include <stdio.h>, let it include only
+ the system's <stdio.h> here, so that orig_fopen doesn't recurse to
+ rpl_fopen. */
+#define __need_FILE
+#include <config.h>
+
+/* Get the original definition of fopen. It might be defined as a macro. */
+#include <stdio.h>
+#undef __need_FILE
+
+static inline FILE *
+orig_fopen (const char *filename, const char *mode)
+{
+ return fopen (filename, mode);
+}
+
+/* Specification. */
+/* Write "stdio.h" here, not <stdio.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <stdio.h> above. */
+#include "stdio.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+FILE *
+rpl_fopen (const char *filename, const char *mode)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+#if FOPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and a mode that requires write access is
+ specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then if a mode that
+ requires write access is specified, fopen() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/fopen.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ fopen() must fail since the file does not contain a '.' directory. */
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ int fd;
+ struct stat statbuf;
+ FILE *fp;
+
+ if (mode[0] == 'w' || mode[0] == 'a')
+ {
+ errno = EISDIR;
+ return NULL;
+ }
+
+ fd = open (filename, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return NULL;
+ }
+
+ fp = fdopen (fd, mode);
+ if (fp == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return fp;
+ }
+ }
+# endif
+
+ return orig_fopen (filename, mode);
+}
diff --git a/gnulib/lib/forkpty.c b/gnulib/lib/forkpty.c
new file mode 100644
index 0000000..f4dd954
--- /dev/null
+++ b/gnulib/lib/forkpty.c
@@ -0,0 +1,73 @@
+/* Fork a child process attached to the slave of a pseudo-terminal.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <pty.h>
+
+#if HAVE_FORKPTY
+
+/* Provide a wrapper with the prototype of glibc-2.8 and newer. */
+# undef forkpty
+int
+rpl_forkpty (int *amaster, char *name, struct termios const *termp,
+ struct winsize const *winp)
+{
+ /* Cast away const, for implementations with weaker prototypes. */
+ return forkpty (amaster, name, (struct termios *) termp,
+ (struct winsize *) winp);
+}
+
+#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw */
+
+# include <pty.h>
+# include <unistd.h>
+
+extern int login_tty (int slave_fd);
+
+int
+forkpty (int *amaster, char *name,
+ const struct termios *termp, const struct winsize *winp)
+{
+ int master, slave, pid;
+
+ if (openpty (&master, &slave, name, termp, winp) == -1)
+ return -1;
+
+ switch (pid = fork ())
+ {
+ case -1:
+ close (master);
+ close (slave);
+ return -1;
+
+ case 0:
+ /* Child. */
+ close (master);
+ if (login_tty (slave))
+ _exit (1);
+ return 0;
+
+ default:
+ /* Parent. */
+ *amaster = master;
+ close (slave);
+ return pid;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/fpending.c b/gnulib/lib/fpending.c
new file mode 100644
index 0000000..5ec38cb
--- /dev/null
+++ b/gnulib/lib/fpending.c
@@ -0,0 +1,30 @@
+/* fpending.c -- return the number of pending output bytes on a stream
+ Copyright (C) 2000, 2004, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "fpending.h"
+
+/* Return the number of pending (aka buffered, unflushed)
+ bytes on the stream, FP, that is open for writing. */
+size_t
+__fpending (FILE *fp)
+{
+ return PENDING_OUTPUT_N_BYTES;
+}
diff --git a/gnulib/lib/fpending.h b/gnulib/lib/fpending.h
new file mode 100644
index 0000000..d7994f7
--- /dev/null
+++ b/gnulib/lib/fpending.h
@@ -0,0 +1,34 @@
+/* Declare __fpending.
+
+ Copyright (C) 2000, 2003, 2005-2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Jim Meyering. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifndef HAVE_DECL___FPENDING
+"this configure-time declaration test was not run"
+#endif
+
+#if HAVE_DECL___FPENDING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+#else
+size_t __fpending (FILE *);
+#endif
diff --git a/gnulib/lib/fprintf.c b/gnulib/lib/fprintf.c
new file mode 100644
index 0000000..28f9c5d
--- /dev/null
+++ b/gnulib/lib/fprintf.c
@@ -0,0 +1,77 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+#include "vasnprintf.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+fprintf (FILE *fp, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/fprintftime.c b/gnulib/lib/fprintftime.c
new file mode 100644
index 0000000..e6eb4f2
--- /dev/null
+++ b/gnulib/lib/fprintftime.c
@@ -0,0 +1,2 @@
+#define FPRINTFTIME 1
+#include "strftime.c"
diff --git a/gnulib/lib/fprintftime.h b/gnulib/lib/fprintftime.h
new file mode 100644
index 0000000..d55b056
--- /dev/null
+++ b/gnulib/lib/fprintftime.h
@@ -0,0 +1,29 @@
+/* Generate time strings directly to the output. */
+
+/* Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <time.h>
+
+/* A cross between fprintf and nstrftime, that prints directly
+ to the output stream, without the need for the potentially
+ large buffer that nstrftime would require.
+
+ Output to stream FP the result of formatting (according to the
+ nstrftime format string, FMT) the time data, *TM, and the UTC
+ and NANOSECONDS values. */
+size_t fprintftime (FILE *fp, char const *fmt, struct tm const *tm,
+ int utc, int nanoseconds);
diff --git a/gnulib/lib/fpucw.h b/gnulib/lib/fpucw.h
new file mode 100644
index 0000000..07403bf
--- /dev/null
+++ b/gnulib/lib/fpucw.h
@@ -0,0 +1,107 @@
+/* Manipulating the FPU control word.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _FPUCW_H
+#define _FPUCW_H
+
+/* The i386 floating point hardware (the 387 compatible FPU, not the modern
+ SSE/SSE2 hardware) has a controllable rounding precision. It is specified
+ through the 'PC' bits in the FPU control word ('fctrl' register). (See
+ the GNU libc i386 <fpu_control.h> header for details.)
+
+ On some platforms, such as Linux or Solaris, the default precision setting
+ is set to "extended precision". This means that 'long double' instructions
+ operate correctly, but 'double' computations often produce slightly
+ different results as on strictly IEEE 754 conforming systems.
+
+ On some platforms, such as NetBSD, the default precision is set to
+ "double precision". This means that 'long double' instructions will operate
+ only as 'double', i.e. lead wrong results.
+
+ The FPU control word is under control of the application, i.e. it is
+ not required to be set either way by the ABI. (In fact, the i386 ABI
+ http://refspecs.freestandards.org/elf/abi386-4.pdf page 3-12 = page 38
+ is not clear about it. But in any case, gcc treats the control word
+ like a "preserved" register: it emits code that assumes that the control
+ word is preserved across calls, and it restores the control word at the
+ end of functions that modify it.)
+
+ See Vincent Lefèvre's page http://www.vinc17.org/research/extended.en.html
+ for a good explanation.
+ See http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html for
+ some argumentation which setting should be the default. */
+
+/* This header file provides the following facilities:
+ fpucw_t integral type holding the value of 'fctrl'
+ FPU_PC_MASK bit mask denoting the precision control
+ FPU_PC_DOUBLE precision control for 53 bits mantissa
+ FPU_PC_EXTENDED precision control for 64 bits mantissa
+ GET_FPUCW () yields the current FPU control word
+ SET_FPUCW (word) sets the FPU control word
+ DECL_LONG_DOUBLE_ROUNDING variable declaration for
+ BEGIN/END_LONG_DOUBLE_ROUNDING
+ BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with
+ 'long double' safe operation precision
+ END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with
+ 'long double' safe operation precision
+ */
+
+/* Inline assembler like this works only with GNU C. */
+#if (defined __i386__ || defined __x86_64__) && defined __GNUC__
+
+typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
+
+# define FPU_PC_MASK 0x0300
+# define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */
+# define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */
+
+# define GET_FPUCW() \
+ ({ fpucw_t _cw; \
+ __asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \
+ _cw; \
+ })
+# define SET_FPUCW(word) \
+ (void)({ fpucw_t _ncw = (word); \
+ __asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \
+ })
+
+# define DECL_LONG_DOUBLE_ROUNDING \
+ fpucw_t oldcw;
+# define BEGIN_LONG_DOUBLE_ROUNDING() \
+ (void)(oldcw = GET_FPUCW (), \
+ SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED))
+# define END_LONG_DOUBLE_ROUNDING() \
+ SET_FPUCW (oldcw)
+
+#else
+
+typedef unsigned int fpucw_t;
+
+# define FPU_PC_MASK 0
+# define FPU_PC_DOUBLE 0
+# define FPU_PC_EXTENDED 0
+
+# define GET_FPUCW() 0
+# define SET_FPUCW(word) (void)(word)
+
+# define DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_LONG_DOUBLE_ROUNDING()
+# define END_LONG_DOUBLE_ROUNDING()
+
+#endif
+
+#endif /* _FPUCW_H */
diff --git a/gnulib/lib/fpurge.c b/gnulib/lib/fpurge.c
new file mode 100644
index 0000000..a299d1c
--- /dev/null
+++ b/gnulib/lib/fpurge.c
@@ -0,0 +1,142 @@
+/* Flushing buffers of a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */
+# include <stdio_ext.h>
+#endif
+#include <stdlib.h>
+
+#include "stdio-impl.h"
+
+int
+fpurge (FILE *fp)
+{
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7 */
+
+ __fpurge (fp);
+ /* The __fpurge function does not have a return value. */
+ return 0;
+
+#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin 1.7 */
+
+ /* Call the system's fpurge function. */
+# undef fpurge
+# if !HAVE_DECL_FPURGE
+ extern int fpurge (FILE *);
+# endif
+ int result = fpurge (fp);
+# if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if (result == 0)
+ /* Correct the invariants that fpurge broke.
+ <stdio.h> on BSD systems says:
+ "The following always hold: if _flags & __SRD, _w is 0."
+ If this invariant is not fulfilled and the stream is read-write but
+ currently reading, subsequent putc or fputc calls will write directly
+ into the buffer, although they shouldn't be allowed to. */
+ if ((fp_->_flags & __SRD) != 0)
+ fp_->_w = 0;
+# endif
+ return result;
+
+#else
+
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_IO_read_end = fp->_IO_read_ptr;
+ fp->_IO_write_ptr = fp->_IO_write_base;
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp->_IO_save_base != NULL)
+ {
+ free (fp->_IO_save_base);
+ fp->_IO_save_base = NULL;
+ }
+ return 0;
+# elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_p = fp_->_bf._base;
+ fp_->_r = 0;
+ fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0);
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp_ub._base != NULL)
+ {
+ if (fp_ub._base != fp_->_ubuf)
+ free (fp_ub._base);
+ fp_ub._base = NULL;
+ }
+ return 0;
+# elif defined __EMX__ /* emx+gcc */
+ fp->_ptr = fp->_buffer;
+ fp->_rcount = 0;
+ fp->_wcount = 0;
+ fp->_ungetc_count = 0;
+ return 0;
+# elif defined __minix /* Minix */
+ fp->_ptr = fp->_buf;
+ if (fp->_ptr != NULL)
+ fp->_count = 0;
+ return 0;
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ fp->_ptr = fp->_base;
+ if (fp->_ptr != NULL)
+ fp->_cnt = 0;
+ return 0;
+# elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ fp->__bufpos = fp->__bufstart;
+ else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))
+ fp->__bufpos = fp->__bufread;
+# endif
+ return 0;
+# elif defined __QNX__ /* QNX */
+ fp->_Rback = fp->_Back + sizeof (fp->_Back);
+ fp->_Rsave = NULL;
+ if (fp->_Mode & 0x2000 /* _MWRITE */)
+ /* fp->_Buf <= fp->_Next <= fp->_Wend */
+ fp->_Next = fp->_Buf;
+ else
+ /* fp->_Buf <= fp->_Next <= fp->_Rend */
+ fp->_Rend = fp->_Next;
+ return 0;
+# elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__pushed_back)
+ {
+ fp->__bufp = fp->__pushback_bufp;
+ fp->__pushed_back = 0;
+ }
+ /* Preserve the current file position. */
+ if (fp->__target != -1)
+ fp->__target += fp->__bufp - fp->__buffer;
+ fp->__bufp = fp->__buffer;
+ /* Nothing in the buffer, next getc is nontrivial. */
+ fp->__get_limit = fp->__bufp;
+ /* Nothing in the buffer, next putc is nontrivial. */
+ fp->__put_limit = fp->__buffer;
+ return 0;
+# else
+# error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
+# endif
+
+#endif
+}
diff --git a/gnulib/lib/freadable.c b/gnulib/lib/freadable.c
new file mode 100644
index 0000000..243914f
--- /dev/null
+++ b/gnulib/lib/freadable.c
@@ -0,0 +1,47 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadable.h"
+
+#include "stdio-impl.h"
+
+bool
+freadable (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & _IO_NO_READS) == 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & (__SRW | __SRD)) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & (_IORW | _IOREAD)) != 0;
+#elif defined __minix /* Minix */
+ return (fp->_flags & _IOREAD) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ return (fp->_flag & (_IORW | _IOREAD)) != 0;
+#elif defined __QNX__ /* QNX */
+ return (fp->_Mode & 0x1 /* _MOPENR */) != 0;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ return fp->__mode.__read;
+#else
+# error "Please port gnulib freadable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadable.h b/gnulib/lib/freadable.h
new file mode 100644
index 0000000..2916fda
--- /dev/null
+++ b/gnulib/lib/freadable.h
@@ -0,0 +1,42 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM supports reading, false if it supports
+ only writing, i.e. if it was opened write-only or append-only.
+ STREAM must not be wide-character oriented.
+ The result doesn't change until the stream is closed or re-opened. */
+
+#if HAVE___FREADABLE /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define freadable(stream) (__freadable (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool freadable (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/freadahead.c b/gnulib/lib/freadahead.c
new file mode 100644
index 0000000..da1ac78
--- /dev/null
+++ b/gnulib/lib/freadahead.c
@@ -0,0 +1,89 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadahead.h"
+
+#include <stdlib.h>
+#include "stdio-impl.h"
+
+size_t
+freadahead (FILE *fp)
+{
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_write_ptr > fp->_IO_write_base)
+ return 0;
+ return (fp->_IO_read_end - fp->_IO_read_ptr)
+ + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base :
+ 0);
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
+ return 0;
+# if defined __DragonFly__
+ return __sreadahead (fp);
+# else
+ return fp_->_r
+ + (HASUB (fp) ? fp_->_ur : 0);
+# endif
+#elif defined __EMX__ /* emx+gcc */
+ if ((fp->_flags & _IOWRT) != 0)
+ return 0;
+ /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+ fp->_ungetc_count = 0 implies fp->_rcount >= 0. */
+ /* equivalent to
+ (fp->_ungetc_count == 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount) */
+ return (fp->_rcount > 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount);
+#elif defined __minix /* Minix */
+ if ((fp_->_flags & _IOWRITING) != 0)
+ return 0;
+ return fp_->_count;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ if ((fp_->_flag & _IOWRT) != 0)
+ return 0;
+ return fp_->_cnt;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ return 0;
+ return (fp->__bufread - fp->__bufpos)
+ + (fp->__modeflags & __FLAG_UNGOT ? 1 : 0);
+# else
+ return 0;
+# endif
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */) != 0)
+ return 0;
+ /* fp->_Buf <= fp->_Next <= fp->_Rend,
+ and fp->_Rend may be overridden by fp->_Rsave. */
+ return ((fp->_Rsave ? fp->_Rsave : fp->_Rend) - fp->_Next)
+ + (fp->_Mode & 0x4000 /* _MBYTE */
+ ? (fp->_Back + sizeof (fp->_Back)) - fp->_Rback
+ : 0);
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return 0;
+ return (fp->__pushed_back
+ ? fp->__get_limit - fp->__pushback_bufp + 1
+ : fp->__get_limit - fp->__bufp);
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+ abort ();
+ return 0;
+#else
+ #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadahead.h b/gnulib/lib/freadahead.h
new file mode 100644
index 0000000..0ddb826
--- /dev/null
+++ b/gnulib/lib/freadahead.h
@@ -0,0 +1,38 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+ Return the number of bytes waiting in the input buffer of STREAM.
+ This includes both the bytes that have been read from the underlying input
+ source and the bytes that have been pushed back through 'ungetc'.
+
+ If this number is 0 and the stream is not currently writing,
+ fflush (STREAM) is known to be a no-op.
+
+ STREAM must not be wide-character oriented. */
+
+extern size_t freadahead (FILE *stream) _GL_ATTRIBUTE_PURE;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/freading.c b/gnulib/lib/freading.c
new file mode 100644
index 0000000..5b95c22
--- /dev/null
+++ b/gnulib/lib/freading.c
@@ -0,0 +1,70 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+/* Don't use glibc's __freading function in glibc < 2.7, see
+ <http://sourceware.org/bugzilla/show_bug.cgi?id=4359> */
+#if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
+
+bool
+freading (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+# if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return ((fp->_flags & _IO_NO_WRITES) != 0
+ || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
+ && fp->_IO_read_base != NULL));
+# elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & __SRD) != 0;
+# elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & _IOREAD) != 0;
+# elif defined __minix /* Minix */
+ return (fp->_flags & _IOREADING) != 0;
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+# if defined __sun /* Solaris */
+ return (fp->_flag & _IOREAD) != 0 && (fp->_flag & _IOWRT) == 0;
+# else
+ return (fp->_flag & _IOREAD) != 0;
+# endif
+# elif defined __UCLIBC__ /* uClibc */
+ return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
+# elif defined __QNX__ /* QNX */
+ return ((fp->_Mode & 0x2 /* _MOPENW */) == 0
+ || (fp->_Mode & 0x1000 /* _MREAD */) != 0);
+# elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__write)
+ return 1;
+ if (!fp->__mode.__read)
+ return 0;
+# ifdef _IO_CURRENTLY_GETTING /* Flag added on 2009-02-28 */
+ return (fp->__flags & _IO_CURRENTLY_GETTING) != 0;
+# else
+ return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
+# endif
+# else
+# error "Please port gnulib freading.c to your platform!"
+# endif
+}
+
+#endif
diff --git a/gnulib/lib/freading.h b/gnulib/lib/freading.h
new file mode 100644
index 0000000..a19aea6
--- /dev/null
+++ b/gnulib/lib/freading.h
@@ -0,0 +1,53 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM is opened read-only, or if the
+ last operation on the stream was a read operation. Return false if
+ the stream is opened write-only or append-only, or if it supports
+ writing and there is no current read operation (such as fgetc).
+
+ freading and fwriting will never both be true. If STREAM supports
+ both reads and writes, then:
+ - both freading and fwriting might be false when the stream is first
+ opened, after read encounters EOF, or after fflush,
+ - freading might be false or true and fwriting might be false
+ after repositioning (such as fseek, fsetpos, or rewind),
+ depending on the underlying implementation.
+
+ STREAM must not be wide-character oriented. */
+
+#if HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
+/* Solaris >= 7, not glibc >= 2.2, but glibc >= 2.7 */
+
+# include <stdio_ext.h>
+# define freading(stream) (__freading (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool freading (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/freadptr.c b/gnulib/lib/freadptr.c
new file mode 100644
index 0000000..afd7a3e
--- /dev/null
+++ b/gnulib/lib/freadptr.c
@@ -0,0 +1,111 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadptr.h"
+
+#include <stdlib.h>
+
+#include "stdio-impl.h"
+
+const char *
+freadptr (FILE *fp, size_t *sizep)
+{
+ size_t size;
+
+ /* Keep this code in sync with freadahead! */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_write_ptr > fp->_IO_write_base)
+ return NULL;
+ size = fp->_IO_read_end - fp->_IO_read_ptr;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->_IO_read_ptr;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
+ return NULL;
+ size = fp_->_r;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp_->_p;
+#elif defined __EMX__ /* emx+gcc */
+ if ((fp->_flags & _IOWRT) != 0)
+ return NULL;
+ /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
+ fp->_ungetc_count = 0 implies fp->_rcount >= 0. */
+ if (fp->_rcount <= 0)
+ return NULL;
+ if (!(fp->_ungetc_count == 0))
+ abort ();
+ *sizep = fp->_rcount;
+ return fp->_ptr;
+#elif defined __minix /* Minix */
+ if ((fp_->_flags & _IOWRITING) != 0)
+ return NULL;
+ size = fp_->_count;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp_->_ptr;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ if ((fp_->_flag & _IOWRT) != 0)
+ return NULL;
+ size = fp_->_cnt;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp_->_ptr;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ return NULL;
+ size = fp->__bufread - fp->__bufpos;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->__bufpos;
+# else
+ return NULL;
+# endif
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */) != 0)
+ return NULL;
+ /* fp->_Buf <= fp->_Next <= fp->_Rend */
+ size = fp->_Rend - fp->_Next;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return (const char *) fp->_Next;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return NULL;
+ size = fp->__get_limit - fp->__bufp;
+ if (size == 0)
+ return NULL;
+ *sizep = size;
+ return fp->__bufp;
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+ /* This implementation is correct on any ANSI C platform. It is just
+ awfully slow. */
+ return NULL;
+#else
+ #error "Please port gnulib freadptr.c to your platform! Look at the definition of fflush, fread, getc, getc_unlocked on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/freadptr.h b/gnulib/lib/freadptr.h
new file mode 100644
index 0000000..a328546
--- /dev/null
+++ b/gnulib/lib/freadptr.h
@@ -0,0 +1,39 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+ Return a pointer to the input buffer of STREAM, or NULL.
+ If the returned pointer is non-NULL, *SIZEP is set to the (positive) size
+ of the input buffer.
+ If the returned pointer is NULL, you should use getc (STREAM),
+ fgetc (STREAM), or fread (..., STREAM) to access the input from STREAM.
+
+ The resulting pointer becomes invalid upon any operation on STREAM.
+
+ STREAM must not be wide-character oriented. */
+
+extern const char * freadptr (FILE *stream, size_t *sizep);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/freadseek.c b/gnulib/lib/freadseek.c
new file mode 100644
index 0000000..4fbad2d
--- /dev/null
+++ b/gnulib/lib/freadseek.c
@@ -0,0 +1,139 @@
+/* Skipping input from a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freadseek.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "freadahead.h"
+#include "freadptr.h"
+
+#include "stdio-impl.h"
+
+/* Increment the in-memory pointer. INCREMENT must be at most the buffer size
+ returned by freadptr().
+ This is very cheap (no system calls). */
+static inline void
+freadptrinc (FILE *fp, size_t increment)
+{
+ /* Keep this code in sync with freadptr! */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_IO_read_ptr += increment;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_p += increment;
+ fp_->_r -= increment;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_ptr += increment;
+ fp->_rcount -= increment;
+#elif defined __minix /* Minix */
+ fp_->_ptr += increment;
+ fp_->_count -= increment;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ fp_->_ptr += increment;
+ fp_->_cnt -= increment;
+#elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ fp->__bufpos += increment;
+# else
+ abort ();
+# endif
+#elif defined __QNX__ /* QNX */
+ fp->_Next += increment;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__bufp += increment;
+#elif defined SLOW_BUT_NO_HACKS /* users can define this */
+#else
+ #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib."
+#endif
+}
+
+int
+freadseek (FILE *fp, size_t offset)
+{
+ size_t total_buffered;
+ int fd;
+
+ if (offset == 0)
+ return 0;
+
+ /* Seek over the already read and buffered input as quickly as possible,
+ without doing any system calls. */
+ total_buffered = freadahead (fp);
+ /* This loop is usually executed at most twice: once for ungetc buffer (if
+ present) and once for the main buffer. */
+ while (total_buffered > 0)
+ {
+ size_t buffered;
+
+ if (freadptr (fp, &buffered) != NULL && buffered > 0)
+ {
+ size_t increment = (buffered < offset ? buffered : offset);
+
+ freadptrinc (fp, increment);
+ offset -= increment;
+ if (offset == 0)
+ return 0;
+ total_buffered -= increment;
+ if (total_buffered == 0)
+ break;
+ }
+ /* Read one byte. If we were reading from the ungetc buffer, this
+ switches the stream back to the main buffer. */
+ if (fgetc (fp) == EOF)
+ goto eof;
+ offset--;
+ if (offset == 0)
+ return 0;
+ total_buffered--;
+ }
+
+ /* Test whether the stream is seekable or not. */
+ fd = fileno (fp);
+ if (fd >= 0 && lseek (fd, 0, SEEK_CUR) >= 0)
+ {
+ /* FP refers to a regular file. fseek is most efficient in this case. */
+ return fseeko (fp, offset, SEEK_CUR);
+ }
+ else
+ {
+ /* FP is a non-seekable stream, possibly not even referring to a file
+ descriptor. Read OFFSET bytes explicitly and discard them. */
+ char buf[4096];
+
+ do
+ {
+ size_t count = (sizeof (buf) < offset ? sizeof (buf) : offset);
+ if (fread (buf, 1, count, fp) < count)
+ goto eof;
+ offset -= count;
+ }
+ while (offset > 0);
+
+ return 0;
+ }
+
+ eof:
+ /* EOF, or error before or while reading. */
+ if (ferror (fp))
+ return EOF;
+ else
+ /* Encountered EOF. */
+ return 0;
+}
diff --git a/gnulib/lib/freadseek.h b/gnulib/lib/freadseek.h
new file mode 100644
index 0000000..e8c31dd
--- /dev/null
+++ b/gnulib/lib/freadseek.h
@@ -0,0 +1,42 @@
+/* Skipping input from a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Assuming the stream STREAM is open for reading:
+
+ Read and discard OFFSET bytes from STREAM.
+
+ freadseek (STREAM, OFFSET) is the same as
+ fseek (STREAM, OFFSET, SEEK_CUR), except that the latter does not work
+ on non-seekable input streams (such as pipes).
+
+ Upon success, return 0.
+ Upon premature end of stream, return 0 (like fseek does).
+ Upon error, set the error indicator in the stream and return EOF.
+
+ STREAM must not be wide-character oriented. */
+
+extern int freadseek (FILE *stream, size_t offset);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/free.c b/gnulib/lib/free.c
new file mode 100644
index 0000000..f1e01fa
--- /dev/null
+++ b/gnulib/lib/free.c
@@ -0,0 +1,30 @@
+/* Work around incompatibility on older systems where free (NULL) fails.
+
+ Copyright (C) 2003, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+#undef free
+
+#include <stdlib.h>
+
+void
+rpl_free (void *p)
+{
+ if (p)
+ free (p);
+}
diff --git a/gnulib/lib/freopen-safer.c b/gnulib/lib/freopen-safer.c
new file mode 100644
index 0000000..5b02817
--- /dev/null
+++ b/gnulib/lib/freopen-safer.c
@@ -0,0 +1,103 @@
+/* Invoke freopen, but avoid some glitches.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+/* Guarantee that FD is open; all smaller FDs must already be open.
+ Return true if successful. */
+static bool
+protect_fd (int fd)
+{
+ int value = open ("/dev/null", O_RDONLY);
+ if (value != fd)
+ {
+ if (0 <= value)
+ {
+ close (value);
+ errno = EBADF; /* Unexpected; this is as good as anything else. */
+ }
+ return false;
+ }
+ return true;
+}
+
+/* Like freopen, but guarantee that reopening stdin, stdout, or stderr
+ preserves the invariant that STDxxx_FILENO==fileno(stdxxx), and
+ that no other stream will interfere with the standard streams.
+ This is necessary because most freopen implementations will change
+ the associated fd of a stream to the lowest available slot. */
+
+FILE *
+freopen_safer (char const *name, char const *mode, FILE *f)
+{
+ /* Unfortunately, we cannot use the fopen_safer approach of using
+ fdopen (dup_safer (fileno (freopen (cmd, mode, f)))), because we
+ need to return f itself. The implementation of freopen(NULL,m,f)
+ is system-dependent, so the best we can do is guarantee that all
+ lower-valued standard fds are open prior to the freopen call,
+ even though this puts more pressure on open fds. */
+ bool protect_in = false;
+ bool protect_out = false;
+ bool protect_err = false;
+ int saved_errno;
+
+ switch (fileno (f))
+ {
+ default: /* -1 or not a standard stream. */
+ if (dup2 (STDERR_FILENO, STDERR_FILENO) != STDERR_FILENO)
+ protect_err = true;
+ /* fall through */
+ case STDERR_FILENO:
+ if (dup2 (STDOUT_FILENO, STDOUT_FILENO) != STDOUT_FILENO)
+ protect_out = true;
+ /* fall through */
+ case STDOUT_FILENO:
+ if (dup2 (STDIN_FILENO, STDIN_FILENO) != STDIN_FILENO)
+ protect_in = true;
+ /* fall through */
+ case STDIN_FILENO:
+ /* Nothing left to protect. */
+ break;
+ }
+ if (protect_in && !protect_fd (STDIN_FILENO))
+ f = NULL;
+ else if (protect_out && !protect_fd (STDOUT_FILENO))
+ f = NULL;
+ else if (protect_err && !protect_fd (STDERR_FILENO))
+ f = NULL;
+ else
+ f = freopen (name, mode, f);
+ saved_errno = errno;
+ if (protect_err)
+ close (STDERR_FILENO);
+ if (protect_out)
+ close (STDOUT_FILENO);
+ if (protect_in)
+ close (STDIN_FILENO);
+ if (!f)
+ errno = saved_errno;
+ return f;
+}
diff --git a/gnulib/lib/freopen.c b/gnulib/lib/freopen.c
new file mode 100644
index 0000000..7069ec9
--- /dev/null
+++ b/gnulib/lib/freopen.c
@@ -0,0 +1,51 @@
+/* Open a stream to a file.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* If the user's config.h happens to include <stdio.h>, let it include only
+ the system's <stdio.h> here, so that orig_freopen doesn't recurse to
+ rpl_freopen. */
+#define __need_FILE
+#include <config.h>
+
+/* Get the original definition of freopen. It might be defined as a macro. */
+#include <stdio.h>
+#undef __need_FILE
+
+static inline FILE *
+orig_freopen (const char *filename, const char *mode, FILE *stream)
+{
+ return freopen (filename, mode, stream);
+}
+
+/* Specification. */
+/* Write "stdio.h" here, not <stdio.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <stdio.h> above. */
+#include "stdio.h"
+
+#include <string.h>
+
+FILE *
+rpl_freopen (const char *filename, const char *mode, FILE *stream)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (filename != NULL && strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+ return orig_freopen (filename, mode, stream);
+}
diff --git a/gnulib/lib/frexp.c b/gnulib/lib/frexp.c
new file mode 100644
index 0000000..26bdec9
--- /dev/null
+++ b/gnulib/lib/frexp.c
@@ -0,0 +1,168 @@
+/* Split a double into fraction and mantissa.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini <bonzini@gnu.org>, 2003, and
+ Bruno Haible <bruno@clisp.org>, 2007. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+#ifdef USE_LONG_DOUBLE
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#else
+# include "isnand-nolibm.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC frexpl
+# define DOUBLE long double
+# define ISNAN isnanl
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC frexp
+# define DOUBLE double
+# define ISNAN isnand
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int sign;
+ int exponent;
+ DECL_ROUNDING
+
+ /* Test for NaN, infinity, and zero. */
+ if (ISNAN (x) || x + x == x)
+ {
+ *expptr = 0;
+ return x;
+ }
+
+ sign = 0;
+ if (x < 0)
+ {
+ x = - x;
+ sign = -1;
+ }
+
+ BEGIN_ROUNDING ();
+
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A positive exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Avoid making x too small, as it could become a denormalized
+ number and thus lose precision. */
+ while (i > 0 && x < pow2[i - 1])
+ {
+ i--;
+ powh_i = powh[i];
+ }
+ exponent += (1 << i);
+ x *= powh_i;
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+ else
+ {
+ /* A negative or zero exponent. */
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x < powh_i)
+ {
+ exponent -= (1 << i);
+ x *= pow2_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ /* Here 2^-2^i <= x < 1.0. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */
+ while (i > 0)
+ {
+ i--;
+ if (x < powh[i])
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ }
+ }
+ /* Here 0.5 <= x < 1.0. */
+ }
+
+ if (sign < 0)
+ x = - x;
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/gnulib/lib/frexpf.c b/gnulib/lib/frexpf.c
new file mode 100644
index 0000000..2bd5f51
--- /dev/null
+++ b/gnulib/lib/frexpf.c
@@ -0,0 +1,26 @@
+/* Split a float into fraction and mantissa.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+frexpf (float x, int *expptr)
+{
+ return (float) frexp ((double) x, expptr);
+}
diff --git a/gnulib/lib/frexpl.c b/gnulib/lib/frexpl.c
new file mode 100644
index 0000000..c468937
--- /dev/null
+++ b/gnulib/lib/frexpl.c
@@ -0,0 +1,35 @@
+/* Split a 'long double' into fraction and mantissa.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+frexpl (long double x, int *expptr)
+{
+ return frexp (x, expptr);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "frexp.c"
+
+#endif
diff --git a/gnulib/lib/fseek.c b/gnulib/lib/fseek.c
new file mode 100644
index 0000000..bcb76d8
--- /dev/null
+++ b/gnulib/lib/fseek.c
@@ -0,0 +1,30 @@
+/* An fseek() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t. */
+#include <unistd.h>
+
+int
+fseek (FILE *fp, long offset, int whence)
+{
+ /* Use the replacement fseeko function with all its workarounds. */
+ return fseeko (fp, (off_t)offset, whence);
+}
diff --git a/gnulib/lib/fseeko.c b/gnulib/lib/fseeko.c
new file mode 100644
index 0000000..83834a0
--- /dev/null
+++ b/gnulib/lib/fseeko.c
@@ -0,0 +1,143 @@
+/* An fseeko() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t and lseek. */
+#include <unistd.h>
+
+#include "stdio-impl.h"
+
+int
+fseeko (FILE *fp, off_t offset, int whence)
+#undef fseeko
+#if !HAVE_FSEEKO
+# undef fseek
+# define fseeko fseek
+#endif
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return EOF;
+#endif
+
+ /* These tests are based on fpurge.c. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_read_end == fp->_IO_read_ptr
+ && fp->_IO_write_ptr == fp->_IO_write_base
+ && fp->_IO_save_base == NULL)
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an fseeko that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+# endif
+ if (fp_->_p == fp_->_bf._base
+ && fp_->_r == 0
+ && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0)
+ && fp_ub._base == NULL)
+#elif defined __EMX__ /* emx+gcc */
+ if (fp->_ptr == fp->_buffer
+ && fp->_rcount == 0
+ && fp->_wcount == 0
+ && fp->_ungetc_count == 0)
+#elif defined __minix /* Minix */
+ if (fp_->_ptr == fp_->_buf
+ && (fp_->_ptr == NULL || fp_->_count == 0))
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ if (fp_->_ptr == fp_->_base
+ && (fp_->_ptr == NULL || fp_->_cnt == 0))
+#elif defined __UCLIBC__ /* uClibc */
+ if (((fp->__modeflags & __FLAG_WRITING) == 0
+ || fp->__bufpos == fp->__bufstart)
+ && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
+ || fp->__bufpos == fp->__bufread))
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
+ && fp->_Rback == fp->_Back + sizeof (fp->_Back)
+ && fp->_Rsave == NULL)
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__bufp == fp->__buffer
+ && fp->__get_limit == fp->__bufp
+ && fp->__put_limit == fp->__bufp
+ && !fp->__pushed_back)
+#else
+ #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib."
+#endif
+ {
+ /* We get here when an fflush() call immediately preceded this one (or
+ if ftell() has created buffers but no I/O has occurred on a
+ newly-opened stream). We know there are no buffers. */
+ off_t pos = lseek (fileno (fp), offset, whence);
+ if (pos == -1)
+ {
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_flags &= ~__SOFF;
+#endif
+ return -1;
+ }
+
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags &= ~_IO_EOF_SEEN;
+ fp->_offset = pos;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ {
+ /* Use a union, since on NetBSD, the compilation flags
+ determine whether fpos_t is typedef'd to off_t or a struct
+ containing a single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+ }
+# endif
+ fp_->_flags |= __SOFF;
+ fp_->_flags &= ~__SEOF;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags &= ~_IOEOF;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ fp->_flag &= ~_IOEOF;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__offset = pos;
+ fp->__eof = 0;
+#endif
+ return 0;
+ }
+ return fseeko (fp, offset, whence);
+}
diff --git a/gnulib/lib/fseterr.c b/gnulib/lib/fseterr.c
new file mode 100644
index 0000000..eaad702
--- /dev/null
+++ b/gnulib/lib/fseterr.c
@@ -0,0 +1,76 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fseterr.h"
+
+#include <errno.h>
+
+#include "stdio-impl.h"
+
+void
+fseterr (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags |= _IO_ERR_SEEN;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ fp_->_flags |= __SERR;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags |= _IOERR;
+#elif defined __minix /* Minix */
+ fp->_flags |= _IOERR;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ fp_->_flag |= _IOERR;
+#elif defined __UCLIBC__ /* uClibc */
+ fp->__modeflags |= __FLAG_ERROR;
+#elif defined __QNX__ /* QNX */
+ fp->_Mode |= 0x200 /* _MERR */;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__error = 1;
+#elif 0 /* unknown */
+ /* Portable fallback, based on an idea by Rich Felker.
+ Wow! 6 system calls for something that is just a bit operation!
+ Not activated on any system, because there is no way to repair FP when
+ the sequence of system calls fails, and library code should not call
+ abort(). */
+ int saved_errno;
+ int fd;
+ int fd2;
+
+ saved_errno = errno;
+ fflush (fp);
+ fd = fileno (fp);
+ fd2 = dup (fd);
+ if (fd2 >= 0)
+ {
+ close (fd);
+ fputc ('\0', fp); /* This should set the error indicator. */
+ fflush (fp); /* Or this. */
+ if (dup2 (fd2, fd) < 0)
+ /* Whee... we botched the stream and now cannot restore it! */
+ abort ();
+ close (fd2);
+ }
+ errno = saved_errno;
+#else
+ #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/fseterr.h b/gnulib/lib/fseterr.h
new file mode 100644
index 0000000..e4b061b
--- /dev/null
+++ b/gnulib/lib/fseterr.h
@@ -0,0 +1,37 @@
+/* Set the error indicator of a stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _FSETERR_H
+#define _FSETERR_H
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Set the error indicator of the stream FP.
+ The "error indicator" is set when an I/O operation on the stream fails, and
+ is cleared (together with the "end-of-file" indicator) by clearerr (FP). */
+extern void fseterr (FILE *fp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FSETERR_H */
diff --git a/gnulib/lib/fstat.c b/gnulib/lib/fstat.c
new file mode 100644
index 0000000..db5b17c
--- /dev/null
+++ b/gnulib/lib/fstat.c
@@ -0,0 +1,82 @@
+/* fstat() replacement.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_fstat doesn't recurse to
+ rpl_fstat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of fstat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+static inline int
+orig_fstat (int fd, struct stat *buf)
+{
+ return fstat (fd, buf);
+}
+
+/* Specification. */
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+#include "sys/stat.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline int
+fstat_nothrow (int fd, struct stat *buf)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = orig_fstat (fd, buf);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#else
+# define fstat_nothrow orig_fstat
+#endif
+
+int
+rpl_fstat (int fd, struct stat *buf)
+{
+#if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY
+ /* Handle the case when rpl_open() used a dummy file descriptor to work
+ around an open() that can't normally visit directories. */
+ const char *name = _gl_directory_name (fd);
+ if (name != NULL)
+ return stat (name, buf);
+#endif
+
+ return fstat_nothrow (fd, buf);
+}
diff --git a/gnulib/lib/fstatat.c b/gnulib/lib/fstatat.c
new file mode 100644
index 0000000..e59be91
--- /dev/null
+++ b/gnulib/lib/fstatat.c
@@ -0,0 +1,135 @@
+/* Work around an fstatat bug on Solaris 9.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_fstatat doesn't recurse to
+ rpl_fstatat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of fstatat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+#if HAVE_FSTATAT
+static inline int
+orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
+{
+ return fstatat (fd, filename, buf, flags);
+}
+#endif
+
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+#include "sys/stat.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
+
+# ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK
+# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
+# endif
+
+/* fstatat should always follow symbolic links that end in /, but on
+ Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
+ Likewise, trailing slash on a non-directory should be an error.
+ These are the same problems that lstat.c and stat.c address, so
+ solve it in a similar way.
+
+ AIX 7.1 fstatat (AT_FDCWD, ..., 0) always fails, which is a bug.
+ Work around this bug if FSTATAT_AT_FDCWD_0_BROKEN is nonzero. */
+
+int
+rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+ int result = orig_fstatat (fd, file, st, flag);
+ size_t len;
+
+ if (LSTAT_FOLLOWS_SLASHED_SYMLINK || result != 0)
+ return result;
+ len = strlen (file);
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ {
+ /* Fix lstat behavior. */
+ if (file[len - 1] != '/' || S_ISDIR (st->st_mode))
+ return 0;
+ if (!S_ISLNK (st->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ result = orig_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
+ }
+ /* Fix stat behavior. */
+ if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ return result;
+}
+
+#else /* ! (HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG) */
+
+/* On mingw, the gnulib <sys/stat.h> defines `stat' as a function-like
+ macro; but using it in AT_FUNC_F2 causes compilation failure
+ because the preprocessor sees a use of a macro that requires two
+ arguments but is only given one. Hence, we need an inline
+ forwarder to get past the preprocessor. */
+static inline int
+stat_func (char const *name, struct stat *st)
+{
+ return stat (name, st);
+}
+
+/* Likewise, if there is no native `lstat', then the gnulib
+ <sys/stat.h> defined it as stat, which also needs adjustment. */
+# if !HAVE_LSTAT
+# undef lstat
+# define lstat stat_func
+# endif
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=fstatat+site:docs.sun.com>
+ First, try to simulate it via l?stat ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(stat|lstat)/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' fstatat. */
+
+# define AT_FUNC_NAME fstatat
+# define AT_FUNC_F1 lstat
+# define AT_FUNC_F2 stat_func
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , struct stat *st, int flag
+# define AT_FUNC_POST_FILE_ARGS , st
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_FSTATAT */
diff --git a/gnulib/lib/fstrcmp.c b/gnulib/lib/fstrcmp.c
new file mode 100644
index 0000000..595c1f3
--- /dev/null
+++ b/gnulib/lib/fstrcmp.c
@@ -0,0 +1,271 @@
+/* Functions to make fuzzy comparisons between strings
+ Copyright (C) 1988-1989, 1992-1993, 1995, 2001-2003, 2006, 2008-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+ Derived from GNU diff 2.7, analyze.c et al.
+
+ The basic idea is to consider two vectors as similar if, when
+ transforming the first vector into the second vector through a
+ sequence of edits (inserts and deletes of one element each),
+ this sequence is short - or equivalently, if the ordered list
+ of elements that are untouched by these edits is long. For a
+ good introduction to the subject, read about the "Levenshtein
+ distance" in Wikipedia.
+
+ The basic algorithm is described in:
+ "An O(ND) Difference Algorithm and its Variations", Eugene Myers,
+ Algorithmica Vol. 1 No. 2, 1986, pp. 251-266;
+ see especially section 4.2, which describes the variation used below.
+
+ The basic algorithm was independently discovered as described in:
+ "Algorithms for Approximate String Matching", E. Ukkonen,
+ Information and Control Vol. 64, 1985, pp. 100-118.
+
+ Unless the 'find_minimal' flag is set, this code uses the TOO_EXPENSIVE
+ heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
+ at the price of producing suboptimal output for large inputs with
+ many differences. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fstrcmp.h"
+
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#include "glthread/lock.h"
+#include "glthread/tls.h"
+#include "minmax.h"
+#include "xalloc.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+
+#define ELEMENT char
+#define EQUAL(x,y) ((x) == (y))
+#define OFFSET int
+#define EXTRA_CONTEXT_FIELDS \
+ /* The number of edits beyond which the computation can be aborted. */ \
+ int edit_count_limit; \
+ /* The number of edits (= number of elements inserted, plus the number of \
+ elements deleted), temporarily minus edit_count_limit. */ \
+ int edit_count;
+#define NOTE_DELETE(ctxt, xoff) ctxt->edit_count++
+#define NOTE_INSERT(ctxt, yoff) ctxt->edit_count++
+#define EARLY_ABORT(ctxt) ctxt->edit_count > 0
+/* We don't need USE_HEURISTIC, since it is unlikely in typical uses of
+ fstrcmp(). */
+#include "diffseq.h"
+
+
+/* Because fstrcmp is typically called multiple times, attempt to minimize
+ the number of memory allocations performed. Thus, let a call reuse the
+ memory already allocated by the previous call, if it is sufficient.
+ To make it multithread-safe, without need for a lock that protects the
+ already allocated memory, store the allocated memory per thread. Free
+ it only when the thread exits. */
+
+static gl_tls_key_t buffer_key; /* TLS key for a 'int *' */
+static gl_tls_key_t bufmax_key; /* TLS key for a 'size_t' */
+
+static void
+keys_init (void)
+{
+ gl_tls_key_init (buffer_key, free);
+ gl_tls_key_init (bufmax_key, NULL);
+ /* The per-thread initial values are NULL and 0, respectively. */
+}
+
+/* Ensure that keys_init is called once only. */
+gl_once_define(static, keys_init_once)
+
+
+/* In the code below, branch probabilities were measured by Ralf Wildenhues,
+ by running "msgmerge LL.po coreutils.pot" with msgmerge 0.18 for many
+ values of LL. The probability indicates that the condition evaluates
+ to true; whether that leads to a branch or a non-branch in the code,
+ depends on the compiler's reordering of basic blocks. */
+
+
+double
+fstrcmp_bounded (const char *string1, const char *string2, double lower_bound)
+{
+ struct context ctxt;
+ int xvec_length = strlen (string1);
+ int yvec_length = strlen (string2);
+ int i;
+
+ size_t fdiag_len;
+ int *buffer;
+ size_t bufmax;
+
+ /* short-circuit obvious comparisons */
+ if (xvec_length == 0 || yvec_length == 0) /* Prob: 1% */
+ return (xvec_length == 0 && yvec_length == 0 ? 1.0 : 0.0);
+
+ if (lower_bound > 0)
+ {
+ /* Compute a quick upper bound.
+ Each edit is an insertion or deletion of an element, hence modifies
+ the length of the sequence by at most 1.
+ Therefore, when starting from a sequence X and ending at a sequence Y,
+ with N edits, | yvec_length - xvec_length | <= N. (Proof by
+ induction over N.)
+ So, at the end, we will have
+ edit_count >= | xvec_length - yvec_length |.
+ and hence
+ result
+ = (xvec_length + yvec_length - edit_count)
+ / (xvec_length + yvec_length)
+ <= (xvec_length + yvec_length - | yvec_length - xvec_length |)
+ / (xvec_length + yvec_length)
+ = 2 * min (xvec_length, yvec_length) / (xvec_length + yvec_length).
+ */
+ volatile double upper_bound =
+ (double) (2 * MIN (xvec_length, yvec_length))
+ / (xvec_length + yvec_length);
+
+ if (upper_bound < lower_bound) /* Prob: 74% */
+ /* Return an arbitrary value < LOWER_BOUND. */
+ return 0.0;
+
+#if CHAR_BIT <= 8
+ /* When X and Y are both small, avoid the overhead of setting up an
+ array of size 256. */
+ if (xvec_length + yvec_length >= 20) /* Prob: 99% */
+ {
+ /* Compute a less quick upper bound.
+ Each edit is an insertion or deletion of a character, hence
+ modifies the occurrence count of a character by 1 and leaves the
+ other occurrence counts unchanged.
+ Therefore, when starting from a sequence X and ending at a
+ sequence Y, and denoting the occurrence count of C in X with
+ OCC (X, C), with N edits,
+ sum_C | OCC (X, C) - OCC (Y, C) | <= N.
+ (Proof by induction over N.)
+ So, at the end, we will have
+ edit_count >= sum_C | OCC (X, C) - OCC (Y, C) |,
+ and hence
+ result
+ = (xvec_length + yvec_length - edit_count)
+ / (xvec_length + yvec_length)
+ <= (xvec_length + yvec_length - sum_C | OCC(X,C) - OCC(Y,C) |)
+ / (xvec_length + yvec_length).
+ */
+ int occ_diff[UCHAR_MAX + 1]; /* array C -> OCC(X,C) - OCC(Y,C) */
+ int sum;
+
+ /* Determine the occurrence counts in X. */
+ memset (occ_diff, 0, sizeof (occ_diff));
+ for (i = xvec_length - 1; i >= 0; i--)
+ occ_diff[(unsigned char) string1[i]]++;
+ /* Subtract the occurrence counts in Y. */
+ for (i = yvec_length - 1; i >= 0; i--)
+ occ_diff[(unsigned char) string2[i]]--;
+ /* Sum up the absolute values. */
+ sum = 0;
+ for (i = 0; i <= UCHAR_MAX; i++)
+ {
+ int d = occ_diff[i];
+ sum += (d >= 0 ? d : -d);
+ }
+
+ upper_bound = 1.0 - (double) sum / (xvec_length + yvec_length);
+
+ if (upper_bound < lower_bound) /* Prob: 66% */
+ /* Return an arbitrary value < LOWER_BOUND. */
+ return 0.0;
+ }
+#endif
+ }
+
+ /* set the info for each string. */
+ ctxt.xvec = string1;
+ ctxt.yvec = string2;
+
+ /* Set TOO_EXPENSIVE to be approximate square root of input size,
+ bounded below by 256. */
+ ctxt.too_expensive = 1;
+ for (i = xvec_length + yvec_length;
+ i != 0;
+ i >>= 2)
+ ctxt.too_expensive <<= 1;
+ if (ctxt.too_expensive < 256)
+ ctxt.too_expensive = 256;
+
+ /* Allocate memory for fdiag and bdiag from a thread-local pool. */
+ fdiag_len = xvec_length + yvec_length + 3;
+ gl_once (keys_init_once, keys_init);
+ buffer = (int *) gl_tls_get (buffer_key);
+ bufmax = (size_t) (uintptr_t) gl_tls_get (bufmax_key);
+ if (fdiag_len > bufmax)
+ {
+ /* Need more memory. */
+ bufmax = 2 * bufmax;
+ if (fdiag_len > bufmax)
+ bufmax = fdiag_len;
+ /* Calling xrealloc would be a waste: buffer's contents does not need
+ to be preserved. */
+ if (buffer != NULL)
+ free (buffer);
+ buffer = (int *) xnmalloc (bufmax, 2 * sizeof (int));
+ gl_tls_set (buffer_key, buffer);
+ gl_tls_set (bufmax_key, (void *) (uintptr_t) bufmax);
+ }
+ ctxt.fdiag = buffer + yvec_length + 1;
+ ctxt.bdiag = ctxt.fdiag + fdiag_len;
+
+ /* The edit_count is only ever increased. The computation can be aborted
+ when
+ (xvec_length + yvec_length - edit_count) / (xvec_length + yvec_length)
+ < lower_bound,
+ or equivalently
+ edit_count > (xvec_length + yvec_length) * (1 - lower_bound)
+ or equivalently
+ edit_count > floor((xvec_length + yvec_length) * (1 - lower_bound)).
+ We need to add an epsilon inside the floor(...) argument, to neutralize
+ rounding errors. */
+ ctxt.edit_count_limit =
+ (lower_bound < 1.0
+ ? (int) ((xvec_length + yvec_length) * (1.0 - lower_bound + 0.000001))
+ : 0);
+
+ /* Now do the main comparison algorithm */
+ ctxt.edit_count = - ctxt.edit_count_limit;
+ if (compareseq (0, xvec_length, 0, yvec_length, 0, &ctxt)) /* Prob: 98% */
+ /* The edit_count passed the limit. Hence the result would be
+ < lower_bound. We can return any value < lower_bound instead. */
+ return 0.0;
+ ctxt.edit_count += ctxt.edit_count_limit;
+
+ /* The result is
+ ((number of chars in common) / (average length of the strings)).
+ The numerator is
+ = xvec_length - (number of calls to NOTE_DELETE)
+ = yvec_length - (number of calls to NOTE_INSERT)
+ = 1/2 * (xvec_length + yvec_length - (number of edits)).
+ This is admittedly biased towards finding that the strings are
+ similar, however it does produce meaningful results. */
+ return ((double) (xvec_length + yvec_length - ctxt.edit_count)
+ / (xvec_length + yvec_length));
+}
diff --git a/gnulib/lib/fstrcmp.h b/gnulib/lib/fstrcmp.h
new file mode 100644
index 0000000..0596d25
--- /dev/null
+++ b/gnulib/lib/fstrcmp.h
@@ -0,0 +1,45 @@
+/* Fuzzy string comparison.
+ Copyright (C) 1995, 2000, 2002-2003, 2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This file was written by Peter Miller <pmiller@agso.gov.au>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _FSTRCMP_H
+#define _FSTRCMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Fuzzy compare of S1 and S2. Return a measure for the similarity of S1
+ and S1. The higher the result, the more similar the strings are.
+ The result is bounded between 0 (meaning very dissimilar strings) and
+ 1 (meaning identical strings). */
+extern double fstrcmp (const char *s1, const char *s2);
+
+/* Like fstrcmp (S1, S2), except that if the result is < LOWER_BOUND, an
+ arbitrary other value < LOWER_BOUND can be returned. */
+extern double fstrcmp_bounded (const char *s1, const char *s2,
+ double lower_bound);
+
+/* A shortcut for fstrcmp. Avoids a function call. */
+#define fstrcmp(s1,s2) fstrcmp_bounded (s1, s2, 0.0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gnulib/lib/fsusage.c b/gnulib/lib/fsusage.c
new file mode 100644
index 0000000..a0c39d2
--- /dev/null
+++ b/gnulib/lib/fsusage.c
@@ -0,0 +1,279 @@
+/* fsusage.c -- return space usage of mounted file systems
+
+ Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "fsusage.h"
+
+#include <limits.h>
+#include <sys/types.h>
+
+#if STAT_STATVFS || STAT_STATVFS64 /* POSIX 1003.1-2001 (and later) with XSI */
+# include <sys/statvfs.h>
+#else
+/* Don't include backward-compatibility files unless they're needed.
+ Eventually we'd like to remove all this cruft. */
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/stat.h>
+# if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# endif
+# if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+# endif
+# if HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+# endif
+# if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */
+# include <sys/fs/s5param.h>
+# endif
+# if defined HAVE_SYS_FILSYS_H && !defined _CRAY
+# include <sys/filsys.h> /* SVR2 */
+# endif
+# if HAVE_SYS_STATFS_H
+# include <sys/statfs.h>
+# endif
+# if HAVE_DUSTAT_H /* AIX PS/2 */
+# include <sys/dustat.h>
+# endif
+# include "full-read.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Many space usage primitives use all 1 bits to denote a value that is
+ not applicable or unknown. Propagate this information by returning
+ a uintmax_t value that is all 1 bits if X is all 1 bits, even if X
+ is unsigned and narrower than uintmax_t. */
+#define PROPAGATE_ALL_ONES(x) \
+ ((sizeof (x) < sizeof (uintmax_t) \
+ && (~ (x) == (sizeof (x) < sizeof (int) \
+ ? - (1 << (sizeof (x) * CHAR_BIT)) \
+ : 0))) \
+ ? UINTMAX_MAX : (uintmax_t) (x))
+
+/* Extract the top bit of X as an uintmax_t value. */
+#define EXTRACT_TOP_BIT(x) ((x) \
+ & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))
+
+/* If a value is negative, many space usage primitives store it into an
+ integer variable by assignment, even if the variable's type is unsigned.
+ So, if a space usage variable X's top bit is set, convert X to the
+ uintmax_t value V such that (- (uintmax_t) V) is the negative of
+ the original value. If X's top bit is clear, just yield X.
+ Use PROPAGATE_TOP_BIT if the original value might be negative;
+ otherwise, use PROPAGATE_ALL_ONES. */
+#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
+
+/* Fill in the fields of FSP with information about space usage for
+ the file system on which FILE resides.
+ DISK is the device on which FILE is mounted, for space-getting
+ methods that need to know it.
+ Return 0 if successful, -1 if not. When returning -1, ensure that
+ ERRNO is either a system error value, or zero if DISK is NULL
+ on a system that requires a non-NULL value. */
+int
+get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
+{
+#if defined STAT_STATVFS /* POSIX, except glibc/Linux */
+
+ struct statvfs fsd;
+
+ if (statvfs (file, &fsd) < 0)
+ return -1;
+
+ /* f_frsize isn't guaranteed to be supported. */
+ fsp->fsu_blocksize = (fsd.f_frsize
+ ? PROPAGATE_ALL_ONES (fsd.f_frsize)
+ : PROPAGATE_ALL_ONES (fsd.f_bsize));
+
+#elif defined STAT_STATVFS64 /* AIX */
+
+ struct statvfs64 fsd;
+
+ if (statvfs64 (file, &fsd) < 0)
+ return -1;
+
+ /* f_frsize isn't guaranteed to be supported. */
+ fsp->fsu_blocksize = (fsd.f_frsize
+ ? PROPAGATE_ALL_ONES (fsd.f_frsize)
+ : PROPAGATE_ALL_ONES (fsd.f_bsize));
+
+#elif defined STAT_STATFS2_FS_DATA /* Ultrix */
+
+ struct fs_data fsd;
+
+ if (statfs (file, &fsd) != 1)
+ return -1;
+
+ fsp->fsu_blocksize = 1024;
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.fd_req.bfreen);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.fd_req.bfreen) != 0;
+ fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot);
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree);
+
+#elif defined STAT_READ_FILSYS /* SVR2 */
+# ifndef SUPERBOFF
+# define SUPERBOFF (SUPERB * 512)
+# endif
+
+ struct filsys fsd;
+ int fd;
+
+ if (! disk)
+ {
+ errno = 0;
+ return -1;
+ }
+
+ fd = open (disk, O_RDONLY);
+ if (fd < 0)
+ return -1;
+ lseek (fd, (off_t) SUPERBOFF, 0);
+ if (full_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
+ {
+ close (fd);
+ return -1;
+ }
+ close (fd);
+
+ fsp->fsu_blocksize = (fsd.s_type == Fs2b ? 1024 : 512);
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.s_fsize);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.s_tfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.s_tfree);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.s_tfree) != 0;
+ fsp->fsu_files = (fsd.s_isize == -1
+ ? UINTMAX_MAX
+ : (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1));
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode);
+
+#elif defined STAT_STATFS3_OSF1 /* OSF/1 */
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd, sizeof (struct statfs)) != 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#elif defined STAT_STATFS2_BSIZE /* glibc/Linux, 4.3BSD, SunOS 4, \
+ MacOS X < 10.4, FreeBSD < 5.0, \
+ NetBSD < 3.0, OpenBSD < 4.4 */
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd) < 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
+
+# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
+
+ /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
+ struct statfs are truncated to 2GB. These conditions detect that
+ truncation, presumably without botching the 4.1.1 case, in which
+ the values are not truncated. The correct counts are stored in
+ undocumented spare fields. */
+ if (fsd.f_blocks == 0x7fffffff / fsd.f_bsize && fsd.f_spare[0] > 0)
+ {
+ fsd.f_blocks = fsd.f_spare[0];
+ fsd.f_bfree = fsd.f_spare[1];
+ fsd.f_bavail = fsd.f_spare[2];
+ }
+# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
+
+#elif defined STAT_STATFS2_FSIZE /* 4.4BSD and older NetBSD */
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd) < 0)
+ return -1;
+
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#elif defined STAT_STATFS4 /* SVR3, Dynix, old Irix, old AIX, \
+ Dolphin */
+
+# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
+# define f_bavail f_bfree
+# endif
+
+ struct statfs fsd;
+
+ if (statfs (file, &fsd, sizeof fsd, 0) < 0)
+ return -1;
+
+ /* Empirically, the block counts on most SVR3 and SVR3-derived
+ systems seem to always be in terms of 512-byte blocks,
+ no matter what value f_bsize has. */
+# if _AIX || defined _CRAY
+ fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
+# else
+ fsp->fsu_blocksize = 512;
+# endif
+
+#endif
+
+#if (defined STAT_STATVFS || defined STAT_STATVFS64 \
+ || (!defined STAT_STATFS2_FS_DATA && !defined STAT_READ_FILSYS))
+
+ fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks);
+ fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree);
+ fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail);
+ fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0;
+ fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files);
+ fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree);
+
+#endif
+
+ (void) disk; /* avoid argument-unused warning */
+ return 0;
+}
+
+#if defined _AIX && defined _I386
+/* AIX PS/2 does not supply statfs. */
+
+int
+statfs (char *file, struct statfs *fsb)
+{
+ struct stat stats;
+ struct dustat fsd;
+
+ if (stat (file, &stats) != 0)
+ return -1;
+ if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
+ return -1;
+ fsb->f_type = 0;
+ fsb->f_bsize = fsd.du_bsize;
+ fsb->f_blocks = fsd.du_fsize - fsd.du_isize;
+ fsb->f_bfree = fsd.du_tfree;
+ fsb->f_bavail = fsd.du_tfree;
+ fsb->f_files = (fsd.du_isize - 2) * fsd.du_inopb;
+ fsb->f_ffree = fsd.du_tinode;
+ fsb->f_fsid.val[0] = fsd.du_site;
+ fsb->f_fsid.val[1] = fsd.du_pckno;
+ return 0;
+}
+
+#endif /* _AIX && _I386 */
diff --git a/gnulib/lib/fsusage.h b/gnulib/lib/fsusage.h
new file mode 100644
index 0000000..86fe9aa
--- /dev/null
+++ b/gnulib/lib/fsusage.h
@@ -0,0 +1,40 @@
+/* fsusage.h -- declarations for file system space usage info
+
+ Copyright (C) 1991-1992, 1997, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Space usage statistics for a file system. Blocks are 512-byte. */
+
+#if !defined FSUSAGE_H_
+# define FSUSAGE_H_
+
+# include <stdint.h>
+# include <stdbool.h>
+
+struct fs_usage
+{
+ uintmax_t fsu_blocksize; /* Size of a block. */
+ uintmax_t fsu_blocks; /* Total blocks. */
+ uintmax_t fsu_bfree; /* Free blocks available to superuser. */
+ uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */
+ bool fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */
+ uintmax_t fsu_files; /* Total file nodes. */
+ uintmax_t fsu_ffree; /* Free file nodes. */
+};
+
+int get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp);
+
+#endif
diff --git a/gnulib/lib/fsync.c b/gnulib/lib/fsync.c
new file mode 100644
index 0000000..325f216
--- /dev/null
+++ b/gnulib/lib/fsync.c
@@ -0,0 +1,78 @@
+/* Emulate fsync on platforms that lack it, primarily Windows and
+ cross-compilers like MinGW.
+
+ This is derived from sqlite3 sources.
+ http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c
+ http://www.sqlite.org/copyright.html
+
+ Written by Richard W.M. Jones <rjones.at.redhat.com>
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* FlushFileBuffers */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include <errno.h>
+
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+
+int
+fsync (int fd)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD err;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (!FlushFileBuffers (h))
+ {
+ /* Translate some Windows errors into rough approximations of Unix
+ * errors. MSDN is useless as usual - in this case it doesn't
+ * document the full range of errors.
+ */
+ err = GetLastError ();
+ switch (err)
+ {
+ /* eg. Trying to fsync a tty. */
+ case ERROR_INVALID_HANDLE:
+ errno = EINVAL;
+ break;
+
+ default:
+ errno = EIO;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+#else /* !Windows */
+
+# error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif /* !Windows */
diff --git a/gnulib/lib/ftell.c b/gnulib/lib/ftell.c
new file mode 100644
index 0000000..74ec986
--- /dev/null
+++ b/gnulib/lib/ftell.c
@@ -0,0 +1,37 @@
+/* An ftell() function that works around platform bugs.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+
+long
+ftell (FILE *fp)
+{
+ /* Use the replacement ftello function with all its workarounds. */
+ off_t offset = ftello (fp);
+ if (LONG_MIN <= offset && offset <= LONG_MAX)
+ return /* (long) */ offset;
+ else
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/ftello.c b/gnulib/lib/ftello.c
new file mode 100644
index 0000000..fbdc44f
--- /dev/null
+++ b/gnulib/lib/ftello.c
@@ -0,0 +1,77 @@
+/* An ftello() function that works around platform bugs.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get lseek. */
+#include <unistd.h>
+
+#include "stdio-impl.h"
+
+off_t
+ftello (FILE *fp)
+#undef ftello
+#if !HAVE_FTELLO
+# undef ftell
+# define ftello ftell
+#endif
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return -1;
+#endif
+
+#if FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */
+ /* The Solaris stdio leaves the _IOREAD flag set after reading from a file
+ reaches EOF and the program then starts writing to the file. ftello
+ gets confused by this. */
+ if (fp_->_flag & _IOWRT)
+ {
+ off_t pos;
+
+ /* Call ftello nevertheless, for the side effects that it does on fp. */
+ ftello (fp);
+
+ /* Compute the file position ourselves. */
+ pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR);
+ if (pos >= 0)
+ {
+ if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL)
+ pos += fp_->_ptr - fp_->_base;
+ }
+ return pos;
+ }
+#endif
+
+#if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an ftello that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+#endif
+ return ftello (fp);
+}
diff --git a/gnulib/lib/ftoastr.c b/gnulib/lib/ftoastr.c
new file mode 100644
index 0000000..7c99ef0
--- /dev/null
+++ b/gnulib/lib/ftoastr.c
@@ -0,0 +1,138 @@
+/* floating point to accurate string
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* This code can misbehave on some buggy or older platforms, when
+ operating on arguments on floating types other than 'double', or
+ when given unusual combinations of options. Gnulib's
+ snprintf-posix module works around many of these problems.
+
+ This code relies on sprintf, strtod, etc. operating accurately;
+ otherwise, the resulting strings could be inaccurate or too long. */
+
+#include <config.h>
+
+#include "ftoastr.h"
+
+#include "intprops.h"
+#include <float.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if LENGTH == 3
+# define FLOAT long double
+# define FLOAT_DIG LDBL_DIG
+# define FLOAT_MIN LDBL_MIN
+# define FLOAT_PREC_BOUND _GL_LDBL_PREC_BOUND
+# define FTOASTR ldtoastr
+# if HAVE_C99_STRTOLD
+# define STRTOF strtold
+# endif
+#elif LENGTH == 2
+# define FLOAT double
+# define FLOAT_DIG DBL_DIG
+# define FLOAT_MIN DBL_MIN
+# define FLOAT_PREC_BOUND _GL_DBL_PREC_BOUND
+# define FTOASTR dtoastr
+#else
+# define LENGTH 1
+# define FLOAT float
+# define FLOAT_DIG FLT_DIG
+# define FLOAT_MIN FLT_MIN
+# define FLOAT_PREC_BOUND _GL_FLT_PREC_BOUND
+# define FTOASTR ftoastr
+# if HAVE_STRTOF
+# define STRTOF strtof
+# endif
+#endif
+
+/* On pre-C99 hosts, approximate strtof and strtold with strtod. This
+ may generate one or two extra digits, but that's better than not
+ working at all. */
+#ifndef STRTOF
+# define STRTOF strtod
+#endif
+
+/* On hosts where it's not known that snprintf works, use sprintf to
+ implement the subset needed here. Typically BUFSIZE is big enough
+ and there's little or no performance hit. */
+#if ! GNULIB_SNPRINTF
+# undef snprintf
+# define snprintf ftoastr_snprintf
+static int
+ftoastr_snprintf (char *buf, size_t bufsize, char const *format,
+ int width, int prec, FLOAT x)
+{
+ char width_0_buffer[LENGTH == 1 ? FLT_BUFSIZE_BOUND
+ : LENGTH == 2 ? DBL_BUFSIZE_BOUND
+ : LDBL_BUFSIZE_BOUND];
+ int n = width;
+ if (bufsize < sizeof width_0_buffer)
+ {
+ n = sprintf (width_0_buffer, format, 0, prec, x);
+ if (n < 0)
+ return n;
+ if (n < width)
+ n = width;
+ }
+ if (n < bufsize)
+ n = sprintf (buf, format, width, prec, x);
+ return n;
+}
+#endif
+
+int
+FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x)
+{
+ /* The following method is simple but slow.
+ For ideas about speeding things up, please see:
+
+ Florian Loitsch, Printing floating-point numbers quickly and accurately
+ with integers. ACM SIGPLAN notices 46, 6 (June 2010), 233-243
+ <http://dx.doi.org/10.1145/1809028.1806623>; also see the
+ 2010-03-21 draft <http://florian.loitsch.com/tmp/article.pdf>. */
+
+ char format[sizeof "%-+ 0*.*Lg"];
+ FLOAT abs_x = x < 0 ? -x : x;
+ int prec;
+
+ char *p = format;
+ *p++ = '%';
+
+ /* Support flags that generate output parsable by strtof. */
+ *p = '-'; p += (flags & FTOASTR_LEFT_JUSTIFY ) != 0;
+ *p = '+'; p += (flags & FTOASTR_ALWAYS_SIGNED ) != 0;
+ *p = ' '; p += (flags & FTOASTR_SPACE_POSITIVE) != 0;
+ *p = '0'; p += (flags & FTOASTR_ZERO_PAD ) != 0;
+
+ *p++ = '*';
+ *p++ = '.';
+ *p++ = '*';
+ *p = 'L'; p += 2 < LENGTH;
+ *p++ = flags & FTOASTR_UPPER_E ? 'G' : 'g';
+ *p = '\0';
+
+ for (prec = abs_x < FLOAT_MIN ? 1 : FLOAT_DIG; ; prec++)
+ {
+ int n = snprintf (buf, bufsize, format, width, prec, x);
+ if (n < 0
+ || FLOAT_PREC_BOUND <= prec
+ || (n < bufsize && STRTOF (buf, NULL) == x))
+ return n;
+ }
+}
diff --git a/gnulib/lib/ftoastr.h b/gnulib/lib/ftoastr.h
new file mode 100644
index 0000000..6264952
--- /dev/null
+++ b/gnulib/lib/ftoastr.h
@@ -0,0 +1,144 @@
+/* floating point to accurate string
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_FTOASTR_H
+
+#include "intprops.h"
+#include <float.h>
+#include <stddef.h>
+
+/* Store into BUF (of size BUFSIZE) an accurate minimal-precision
+ string representation of a floating point number. FLAGS affect the
+ formatting of the number. Pad the output string with spaces as
+ necessary to width WIDTH bytes, in the style of printf. WIDTH must
+ be nonnegative. X is the floating-point number to be converted.
+
+ Return the number of bytes stored into BUF, not counting the
+ terminating null. However, do not overrun BUF: if BUF is too
+ small, return a fairly tight (but not necessarily exact) upper
+ bound on the value that would have been returned if BUF had been
+ big enough. If SIZE is zero, BUF may be a null pointer. On error
+ (e.g., returned value would exceed INT_MAX), return -1 and set
+ errno.
+
+ Example:
+
+ char buf[DBL_BUFSIZE_BOUND];
+ int r = dtoastr (buf, sizeof buf, 0, 0, 0.1);
+
+ In the C locale, this sets R to 3 and stores "0.1" into BUF. */
+
+int ftoastr (char *buf, size_t bufsize, int flags, int width, float x);
+int dtoastr (char *buf, size_t bufsize, int flags, int width, double x);
+int ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x);
+
+/* Flag values for ftoastr etc. These can be ORed together. */
+enum
+ {
+ /* Left justify within the width; the default is right justification. */
+ FTOASTR_LEFT_JUSTIFY = 1,
+
+ /* Output "+" before positive numbers; the default outputs nothing. */
+ FTOASTR_ALWAYS_SIGNED = 2,
+
+ /* Output " " before positive numbers; ignored if
+ FTOASTER_ALWAYS_SIGNED is also given. */
+ FTOASTR_SPACE_POSITIVE = 4,
+
+ /* Pad with zeros instead of spaces; ignored if FTOASTR_LEFT_JUSTIFY
+ is also given. */
+ FTOASTR_ZERO_PAD = 8,
+
+ /* Use 'E' instead of 'e' before the exponent. */
+ FTOASTR_UPPER_E = 16
+ };
+
+
+/* _GL_FLT_PREC_BOUND is an upper bound on the precision needed to
+ represent a float value without losing information. Likewise for
+ _GL_DBL_PREC_BOUND and double, and _GL_LDBL_PREC_BOUND and long double. */
+
+#if FLT_RADIX == 10 /* decimal floating point */
+ enum { _GL_FLT_PREC_BOUND = FLT_MANT_DIG };
+ enum { _GL_DBL_PREC_BOUND = DBL_MANT_DIG };
+ enum { _GL_LDBL_PREC_BOUND = LDBL_MANT_DIG };
+#else
+
+/* An upper bound on the number of bits needed to represent a single
+ digit in a floating-point fraction. */
+# if FLT_RADIX == 2 /* IEEE 754 floating point, VAX floating point, etc. */
+# define _GL_FLOAT_DIG_BITS_BOUND 1
+# elif FLT_RADIX <= 16 /* IBM hex floating point has FLT_RADIX == 16. */
+# define _GL_FLOAT_DIG_BITS_BOUND 4
+# else /* no machine is this bad, but let's be complete */
+# define _GL_FLOAT_DIG_BITS_BOUND (CHAR_BIT * (int) sizeof (int) - 1)
+# endif
+
+/* An upper bound on the number of decimal digits needed to represent
+ a floating point number accurately, assuming a fraction contains
+ DIG digits. For why the "+ 1" is needed, see "Binary to Decimal
+ Conversion" in David Goldberg's paper "What Every Computer
+ Scientist Should Know About Floating-Point Arithmetic"
+ <http://docs.sun.com/source/806-3568/ncg_goldberg.html>. */
+# define _GL_FLOAT_PREC_BOUND(dig) \
+ (INT_BITS_STRLEN_BOUND ((dig) * _GL_FLOAT_DIG_BITS_BOUND) + 1)
+
+ enum { _GL_FLT_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( FLT_MANT_DIG) };
+ enum { _GL_DBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND ( DBL_MANT_DIG) };
+ enum { _GL_LDBL_PREC_BOUND = _GL_FLOAT_PREC_BOUND (LDBL_MANT_DIG) };
+#endif
+
+
+/* Bound on the number of bytes printed for an exponent in the range
+ MIN..MAX, where MIN < 0 < MAX; printf always prints a sign and at
+ least 2 digits. Although the maximum known exponent is 4932 for
+ IEEE 754 binary128, support tight bounds for exponents up to a
+ million, just in case. */
+#define _GL_FLOAT_EXPONENT_STRLEN_BOUND(min, max) \
+ ( -100 < (min) && (max) < 100 ? 3 \
+ : -1000 < (min) && (max) < 1000 ? 4 \
+ : -10000 < (min) && (max) < 10000 ? 5 \
+ : -100000 < (min) && (max) < 100000 ? 6 \
+ : -1000000 < (min) && (max) < 1000000 ? 7 \
+ : INT_STRLEN_BOUND (int) /* not a tight bound */)
+
+/* A reasonably tight bound on the length of a type-T floating value
+ formatted with ftoastr etc. Room is needed for sign, fraction
+ digits, decimal point, "e", and exponent. POINTLEN should be a
+ reasonably tight bound on the string length of the decimal
+ point. */
+#define _GL_FLOAT_STRLEN_BOUND_L(t, pointlen) \
+ (1 + _GL_##t##_PREC_BOUND + pointlen + 1 \
+ + _GL_FLOAT_EXPONENT_STRLEN_BOUND (t##_MIN_10_EXP, t##_MAX_10_EXP))
+#define FLT_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( FLT, pointlen)
+#define DBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( DBL, pointlen)
+#define LDBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L (LDBL, pointlen)
+
+/* Looser bounds that are locale-independent and are integral constant
+ expressions. */
+#define FLT_STRLEN_BOUND FLT_STRLEN_BOUND_L (MB_LEN_MAX)
+#define DBL_STRLEN_BOUND DBL_STRLEN_BOUND_L (MB_LEN_MAX)
+#define LDBL_STRLEN_BOUND LDBL_STRLEN_BOUND_L (MB_LEN_MAX)
+
+/* Looser, locale-independent bounds that include the trailing null byte. */
+#define FLT_BUFSIZE_BOUND ( FLT_STRLEN_BOUND + 1)
+#define DBL_BUFSIZE_BOUND ( DBL_STRLEN_BOUND + 1)
+#define LDBL_BUFSIZE_BOUND (LDBL_STRLEN_BOUND + 1)
+
+#endif /* _GL_FTOASTR_H */
diff --git a/gnulib/lib/ftruncate.c b/gnulib/lib/ftruncate.c
new file mode 100644
index 0000000..ae1e858
--- /dev/null
+++ b/gnulib/lib/ftruncate.c
@@ -0,0 +1,43 @@
+/* ftruncate emulations for native Windows.
+ This file is in the public domain. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if HAVE_CHSIZE
+
+# include <errno.h>
+# include <io.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+static inline int
+chsize_nothrow (int fd, long length)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = chsize (fd, length);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# define chsize chsize_nothrow
+# endif
+
+int
+ftruncate (int fd, off_t length)
+{
+ return chsize (fd, length);
+}
+
+#endif
diff --git a/gnulib/lib/fts-cycle.c b/gnulib/lib/fts-cycle.c
new file mode 100644
index 0000000..6dc60f0
--- /dev/null
+++ b/gnulib/lib/fts-cycle.c
@@ -0,0 +1,160 @@
+/* Detect cycles in file tree walks.
+
+ Copyright (C) 2003-2006, 2009-2011 Free Software Foundation, Inc.
+
+ Written by Jim Meyering.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "cycle-check.h"
+#include "hash.h"
+
+/* Use each of these to map a device/inode pair to an FTSENT. */
+struct Active_dir
+{
+ dev_t dev;
+ ino_t ino;
+ FTSENT *fts_ent;
+};
+
+static bool
+AD_compare (void const *x, void const *y)
+{
+ struct Active_dir const *ax = x;
+ struct Active_dir const *ay = y;
+ return ax->ino == ay->ino
+ && ax->dev == ay->dev;
+}
+
+static size_t
+AD_hash (void const *x, size_t table_size)
+{
+ struct Active_dir const *ax = x;
+ return (uintmax_t) ax->ino % table_size;
+}
+
+/* Set up the cycle-detection machinery. */
+
+static bool
+setup_dir (FTS *fts)
+{
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ enum { HT_INITIAL_SIZE = 31 };
+ fts->fts_cycle.ht = hash_initialize (HT_INITIAL_SIZE, NULL, AD_hash,
+ AD_compare, free);
+ if (! fts->fts_cycle.ht)
+ return false;
+ }
+ else
+ {
+ fts->fts_cycle.state = malloc (sizeof *fts->fts_cycle.state);
+ if (! fts->fts_cycle.state)
+ return false;
+ cycle_check_init (fts->fts_cycle.state);
+ }
+
+ return true;
+}
+
+/* Enter a directory during a file tree walk. */
+
+static bool
+enter_dir (FTS *fts, FTSENT *ent)
+{
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ struct stat const *st = ent->fts_statp;
+ struct Active_dir *ad = malloc (sizeof *ad);
+ struct Active_dir *ad_from_table;
+
+ if (!ad)
+ return false;
+
+ ad->dev = st->st_dev;
+ ad->ino = st->st_ino;
+ ad->fts_ent = ent;
+
+ /* See if we've already encountered this directory.
+ This can happen when following symlinks as well as
+ with a corrupted directory hierarchy. */
+ ad_from_table = hash_insert (fts->fts_cycle.ht, ad);
+
+ if (ad_from_table != ad)
+ {
+ free (ad);
+ if (!ad_from_table)
+ return false;
+
+ /* There was an entry with matching dev/inode already in the table.
+ Record the fact that we've found a cycle. */
+ ent->fts_cycle = ad_from_table->fts_ent;
+ ent->fts_info = FTS_DC;
+ }
+ }
+ else
+ {
+ if (cycle_check (fts->fts_cycle.state, ent->fts_statp))
+ {
+ /* FIXME: setting fts_cycle like this isn't proper.
+ To do what the documentation requires, we'd have to
+ go around the cycle again and find the right entry.
+ But no callers in coreutils use the fts_cycle member. */
+ ent->fts_cycle = ent;
+ ent->fts_info = FTS_DC;
+ }
+ }
+
+ return true;
+}
+
+/* Leave a directory during a file tree walk. */
+
+static void
+leave_dir (FTS *fts, FTSENT *ent)
+{
+ struct stat const *st = ent->fts_statp;
+ if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ struct Active_dir obj;
+ void *found;
+ obj.dev = st->st_dev;
+ obj.ino = st->st_ino;
+ found = hash_delete (fts->fts_cycle.ht, &obj);
+ if (!found)
+ abort ();
+ free (found);
+ }
+ else
+ {
+ FTSENT *parent = ent->fts_parent;
+ if (parent != NULL && 0 <= parent->fts_level)
+ CYCLE_CHECK_REFLECT_CHDIR_UP (fts->fts_cycle.state,
+ *(parent->fts_statp), *st);
+ }
+}
+
+/* Free any memory used for cycle detection. */
+
+static void
+free_dir (FTS *sp)
+{
+ if (sp->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
+ {
+ if (sp->fts_cycle.ht)
+ hash_free (sp->fts_cycle.ht);
+ }
+ else
+ free (sp->fts_cycle.state);
+}
diff --git a/gnulib/lib/fts.c b/gnulib/lib/fts.c
new file mode 100644
index 0000000..ccd1980
--- /dev/null
+++ b/gnulib/lib/fts.c
@@ -0,0 +1,2095 @@
+/* Traverse a file hierarchy.
+
+ Copyright (C) 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94";
+#endif /* LIBC_SCCS and not lint */
+
+#include "fts_.h"
+
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#ifdef _LIBC
+# include <include/sys/stat.h>
+#else
+# include <sys/stat.h>
+#endif
+#include <fcntl.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if ! _LIBC
+# include "fcntl--.h"
+# include "dirent--.h"
+# include "unistd--.h"
+/* FIXME - use fcntl(F_DUPFD_CLOEXEC)/openat(O_CLOEXEC) once they are
+ supported. */
+# include "cloexec.h"
+# include "openat.h"
+# include "same-inode.h"
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
+#endif
+
+#if HAVE_STRUCT_DIRENT_D_TYPE
+/* True if the type of the directory entry D is known. */
+# define DT_IS_KNOWN(d) ((d)->d_type != DT_UNKNOWN)
+/* True if the type of the directory entry D must be T. */
+# define DT_MUST_BE(d, t) ((d)->d_type == (t))
+# define D_TYPE(d) ((d)->d_type)
+#else
+# define DT_IS_KNOWN(d) false
+# define DT_MUST_BE(d, t) false
+# define D_TYPE(d) DT_UNKNOWN
+
+# undef DT_UNKNOWN
+# define DT_UNKNOWN 0
+
+/* Any nonzero values will do here, so long as they're distinct.
+ Undef any existing macros out of the way. */
+# undef DT_BLK
+# undef DT_CHR
+# undef DT_DIR
+# undef DT_FIFO
+# undef DT_LNK
+# undef DT_REG
+# undef DT_SOCK
+# define DT_BLK 1
+# define DT_CHR 2
+# define DT_DIR 3
+# define DT_FIFO 4
+# define DT_LNK 5
+# define DT_REG 6
+# define DT_SOCK 7
+#endif
+
+#ifndef S_IFLNK
+# define S_IFLNK 0
+#endif
+#ifndef S_IFSOCK
+# define S_IFSOCK 0
+#endif
+
+enum
+{
+ NOT_AN_INODE_NUMBER = 0
+};
+
+#ifdef D_INO_IN_DIRENT
+# define D_INO(dp) (dp)->d_ino
+#else
+/* Some systems don't have inodes, so fake them to avoid lots of ifdefs. */
+# define D_INO(dp) NOT_AN_INODE_NUMBER
+#endif
+
+/* If possible (see max_entries, below), read no more than this many directory
+ entries at a time. Without this limit (i.e., when using non-NULL
+ fts_compar), processing a directory with 4,000,000 entries requires ~1GiB
+ of memory, and handling 64M entries would require 16GiB of memory. */
+#ifndef FTS_MAX_READDIR_ENTRIES
+# define FTS_MAX_READDIR_ENTRIES 100000
+#endif
+
+/* If there are more than this many entries in a directory,
+ and the conditions mentioned below are satisfied, then sort
+ the entries on inode number before any further processing. */
+#ifndef FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+# define FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD 10000
+#endif
+
+enum
+{
+ _FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD = FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+};
+
+enum Fts_stat
+{
+ FTS_NO_STAT_REQUIRED = 1,
+ FTS_STAT_REQUIRED = 2
+};
+
+#ifdef _LIBC
+# undef close
+# define close __close
+# undef closedir
+# define closedir __closedir
+# undef fchdir
+# define fchdir __fchdir
+# undef open
+# define open __open
+# undef readdir
+# define readdir __readdir
+#else
+# undef internal_function
+# define internal_function /* empty */
+#endif
+
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+/* If this host provides the openat function, then we can avoid
+ attempting to open "." in some initialization code below. */
+#ifdef HAVE_OPENAT
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifdef NDEBUG
+# define fts_assert(expr) ((void) 0)
+#else
+# define fts_assert(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ abort (); \
+ } \
+ while (false)
+#endif
+
+static FTSENT *fts_alloc (FTS *, const char *, size_t) internal_function;
+static FTSENT *fts_build (FTS *, int) internal_function;
+static void fts_lfree (FTSENT *) internal_function;
+static void fts_load (FTS *, FTSENT *) internal_function;
+static size_t fts_maxarglen (char * const *) internal_function;
+static void fts_padjust (FTS *, FTSENT *) internal_function;
+static bool fts_palloc (FTS *, size_t) internal_function;
+static FTSENT *fts_sort (FTS *, FTSENT *, size_t) internal_function;
+static unsigned short int fts_stat (FTS *, FTSENT *, bool) internal_function;
+static int fts_safe_changedir (FTS *, FTSENT *, int, const char *)
+ internal_function;
+
+#include "fts-cycle.c"
+
+#ifndef MAX
+# define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+#define CLR(opt) (sp->fts_options &= ~(opt))
+#define ISSET(opt) (sp->fts_options & (opt))
+#define SET(opt) (sp->fts_options |= (opt))
+
+/* FIXME: FTS_NOCHDIR is now misnamed.
+ Call it FTS_USE_FULL_RELATIVE_FILE_NAMES instead. */
+#define FCHDIR(sp, fd) \
+ (!ISSET(FTS_NOCHDIR) && (ISSET(FTS_CWDFD) \
+ ? (cwd_advance_fd ((sp), (fd), true), 0) \
+ : fchdir (fd)))
+
+
+/* fts_build flags */
+/* FIXME: make this an enum */
+#define BCHILD 1 /* fts_children */
+#define BNAMES 2 /* fts_children, names only */
+#define BREAD 3 /* fts_read */
+
+#if FTS_DEBUG
+# include <inttypes.h>
+# include <stdint.h>
+# include <stdio.h>
+# include "getcwdat.h"
+bool fts_debug = false;
+# define Dprintf(x) do { if (fts_debug) printf x; } while (false)
+#else
+# define Dprintf(x)
+# define fd_ring_check(x)
+# define fd_ring_print(a, b, c)
+#endif
+
+#define LEAVE_DIR(Fts, Ent, Tag) \
+ do \
+ { \
+ Dprintf ((" %s-leaving: %s\n", Tag, (Ent)->fts_path)); \
+ leave_dir (Fts, Ent); \
+ fd_ring_check (Fts); \
+ } \
+ while (false)
+
+static void
+fd_ring_clear (I_ring *fd_ring)
+{
+ while ( ! i_ring_empty (fd_ring))
+ {
+ int fd = i_ring_pop (fd_ring);
+ if (0 <= fd)
+ close (fd);
+ }
+}
+
+/* Overload the fts_statp->st_size member (otherwise unused, when
+ fts_info is FTS_NSOK) to indicate whether fts_read should stat
+ this entry or not. */
+static void
+fts_set_stat_required (FTSENT *p, bool required)
+{
+ fts_assert (p->fts_info == FTS_NSOK);
+ p->fts_statp->st_size = (required
+ ? FTS_STAT_REQUIRED
+ : FTS_NO_STAT_REQUIRED);
+}
+
+/* file-descriptor-relative opendir. */
+/* FIXME: if others need this function, move it into lib/openat.c */
+static inline DIR *
+internal_function
+opendirat (int fd, char const *dir, int extra_flags, int *pdir_fd)
+{
+ int new_fd = openat (fd, dir,
+ (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+ | extra_flags));
+ DIR *dirp;
+
+ if (new_fd < 0)
+ return NULL;
+ set_cloexec_flag (new_fd, true);
+ dirp = fdopendir (new_fd);
+ if (dirp)
+ *pdir_fd = new_fd;
+ else
+ {
+ int saved_errno = errno;
+ close (new_fd);
+ errno = saved_errno;
+ }
+ return dirp;
+}
+
+/* Virtual fchdir. Advance SP's working directory file descriptor,
+ SP->fts_cwd_fd, to FD, and push the previous value onto the fd_ring.
+ CHDIR_DOWN_ONE is true if FD corresponds to an entry in the directory
+ open on sp->fts_cwd_fd; i.e., to move the working directory one level
+ down. */
+static void
+internal_function
+cwd_advance_fd (FTS *sp, int fd, bool chdir_down_one)
+{
+ int old = sp->fts_cwd_fd;
+ fts_assert (old != fd || old == AT_FDCWD);
+
+ if (chdir_down_one)
+ {
+ /* Push "old" onto the ring.
+ If the displaced file descriptor is non-negative, close it. */
+ int prev_fd_in_slot = i_ring_push (&sp->fts_fd_ring, old);
+ fd_ring_print (sp, stderr, "post-push");
+ if (0 <= prev_fd_in_slot)
+ close (prev_fd_in_slot); /* ignore any close failure */
+ }
+ else if ( ! ISSET (FTS_NOCHDIR))
+ {
+ if (0 <= old)
+ close (old); /* ignore any close failure */
+ }
+
+ sp->fts_cwd_fd = fd;
+}
+
+/* Restore the initial, pre-traversal, "working directory".
+ In FTS_CWDFD mode, we merely call cwd_advance_fd, otherwise,
+ we may actually change the working directory.
+ Return 0 upon success. Upon failure, set errno and return nonzero. */
+static int
+restore_initial_cwd (FTS *sp)
+{
+ int fail = FCHDIR (sp, ISSET (FTS_CWDFD) ? AT_FDCWD : sp->fts_rfd);
+ fd_ring_clear (&(sp->fts_fd_ring));
+ return fail;
+}
+
+/* Open the directory DIR if possible, and return a file
+ descriptor. Return -1 and set errno on failure. It doesn't matter
+ whether the file descriptor has read or write access. */
+
+static inline int
+internal_function
+diropen (FTS const *sp, char const *dir)
+{
+ int open_flags = (O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+ | (ISSET (FTS_PHYSICAL) ? O_NOFOLLOW : 0)
+ | (ISSET (FTS_NOATIME) ? O_NOATIME : 0));
+
+ int fd = (ISSET (FTS_CWDFD)
+ ? openat (sp->fts_cwd_fd, dir, open_flags)
+ : open (dir, open_flags));
+ if (0 <= fd)
+ set_cloexec_flag (fd, true);
+ return fd;
+}
+
+FTS *
+fts_open (char * const *argv,
+ register int options,
+ int (*compar) (FTSENT const **, FTSENT const **))
+{
+ register FTS *sp;
+ register FTSENT *p, *root;
+ register size_t nitems;
+ FTSENT *parent = NULL;
+ FTSENT *tmp = NULL; /* pacify gcc */
+ bool defer_stat;
+
+ /* Options check. */
+ if (options & ~FTS_OPTIONMASK) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+ if ((options & FTS_NOCHDIR) && (options & FTS_CWDFD)) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+ if ( ! (options & (FTS_LOGICAL | FTS_PHYSICAL))) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+
+ /* Allocate/initialize the stream */
+ if ((sp = malloc(sizeof(FTS))) == NULL)
+ return (NULL);
+ memset(sp, 0, sizeof(FTS));
+ sp->fts_compar = compar;
+ sp->fts_options = options;
+
+ /* Logical walks turn on NOCHDIR; symbolic links are too hard. */
+ if (ISSET(FTS_LOGICAL)) {
+ SET(FTS_NOCHDIR);
+ CLR(FTS_CWDFD);
+ }
+
+ /* Initialize fts_cwd_fd. */
+ sp->fts_cwd_fd = AT_FDCWD;
+ if ( ISSET(FTS_CWDFD) && ! HAVE_OPENAT_SUPPORT)
+ {
+ /* While it isn't technically necessary to open "." this
+ early, doing it here saves us the trouble of ensuring
+ later (where it'd be messier) that "." can in fact
+ be opened. If not, revert to FTS_NOCHDIR mode. */
+ int fd = open (".",
+ O_SEARCH | (ISSET (FTS_NOATIME) ? O_NOATIME : 0));
+ if (fd < 0)
+ {
+ /* Even if `.' is unreadable, don't revert to FTS_NOCHDIR mode
+ on systems like Linux+PROC_FS, where our openat emulation
+ is good enough. Note: on a system that emulates
+ openat via /proc, this technique can still fail, but
+ only in extreme conditions, e.g., when the working
+ directory cannot be saved (i.e. save_cwd fails) --
+ and that happens on Linux only when "." is unreadable
+ and the CWD would be longer than PATH_MAX.
+ FIXME: once Linux kernel openat support is well established,
+ replace the above open call and this entire if/else block
+ with the body of the if-block below. */
+ if ( openat_needs_fchdir ())
+ {
+ SET(FTS_NOCHDIR);
+ CLR(FTS_CWDFD);
+ }
+ }
+ else
+ {
+ close (fd);
+ }
+ }
+
+ /*
+ * Start out with 1K of file name space, and enough, in any case,
+ * to hold the user's file names.
+ */
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+ {
+ size_t maxarglen = fts_maxarglen(argv);
+ if (! fts_palloc(sp, MAX(maxarglen, MAXPATHLEN)))
+ goto mem1;
+ }
+
+ /* Allocate/initialize root's parent. */
+ if (*argv != NULL) {
+ if ((parent = fts_alloc(sp, "", 0)) == NULL)
+ goto mem2;
+ parent->fts_level = FTS_ROOTPARENTLEVEL;
+ }
+
+ /* The classic fts implementation would call fts_stat with
+ a new entry for each iteration of the loop below.
+ If the comparison function is not specified or if the
+ FTS_DEFER_STAT option is in effect, don't stat any entry
+ in this loop. This is an attempt to minimize the interval
+ between the initial stat/lstat/fstatat and the point at which
+ a directory argument is first opened. This matters for any
+ directory command line argument that resides on a file system
+ without genuine i-nodes. If you specify FTS_DEFER_STAT along
+ with a comparison function, that function must not access any
+ data via the fts_statp pointer. */
+ defer_stat = (compar == NULL || ISSET(FTS_DEFER_STAT));
+
+ /* Allocate/initialize root(s). */
+ for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
+ /* *Do* allow zero-length file names. */
+ size_t len = strlen(*argv);
+ if ((p = fts_alloc(sp, *argv, len)) == NULL)
+ goto mem3;
+ p->fts_level = FTS_ROOTLEVEL;
+ p->fts_parent = parent;
+ p->fts_accpath = p->fts_name;
+ /* Even when defer_stat is true, be sure to stat the first
+ command line argument, since fts_read (at least with
+ FTS_XDEV) requires that. */
+ if (defer_stat && root != NULL) {
+ p->fts_info = FTS_NSOK;
+ fts_set_stat_required(p, true);
+ } else {
+ p->fts_info = fts_stat(sp, p, false);
+ }
+
+ /*
+ * If comparison routine supplied, traverse in sorted
+ * order; otherwise traverse in the order specified.
+ */
+ if (compar) {
+ p->fts_link = root;
+ root = p;
+ } else {
+ p->fts_link = NULL;
+ if (root == NULL)
+ tmp = root = p;
+ else {
+ tmp->fts_link = p;
+ tmp = p;
+ }
+ }
+ }
+ if (compar && nitems > 1)
+ root = fts_sort(sp, root, nitems);
+
+ /*
+ * Allocate a dummy pointer and make fts_read think that we've just
+ * finished the node before the root(s); set p->fts_info to FTS_INIT
+ * so that everything about the "current" node is ignored.
+ */
+ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
+ goto mem3;
+ sp->fts_cur->fts_link = root;
+ sp->fts_cur->fts_info = FTS_INIT;
+ if (! setup_dir (sp))
+ goto mem3;
+
+ /*
+ * If using chdir(2), grab a file descriptor pointing to dot to ensure
+ * that we can get back here; this could be avoided for some file names,
+ * but almost certainly not worth the effort. Slashes, symbolic links,
+ * and ".." are all fairly nasty problems. Note, if we can't get the
+ * descriptor we run anyway, just more slowly.
+ */
+ if (!ISSET(FTS_NOCHDIR) && !ISSET(FTS_CWDFD)
+ && (sp->fts_rfd = diropen (sp, ".")) < 0)
+ SET(FTS_NOCHDIR);
+
+ i_ring_init (&sp->fts_fd_ring, -1);
+ return (sp);
+
+mem3: fts_lfree(root);
+ free(parent);
+mem2: free(sp->fts_path);
+mem1: free(sp);
+ return (NULL);
+}
+
+static void
+internal_function
+fts_load (FTS *sp, register FTSENT *p)
+{
+ register size_t len;
+ register char *cp;
+
+ /*
+ * Load the stream structure for the next traversal. Since we don't
+ * actually enter the directory until after the preorder visit, set
+ * the fts_accpath field specially so the chdir gets done to the right
+ * place and the user can access the first node. From fts_open it's
+ * known that the file name will fit.
+ */
+ len = p->fts_pathlen = p->fts_namelen;
+ memmove(sp->fts_path, p->fts_name, len + 1);
+ if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
+ len = strlen(++cp);
+ memmove(p->fts_name, cp, len + 1);
+ p->fts_namelen = len;
+ }
+ p->fts_accpath = p->fts_path = sp->fts_path;
+}
+
+int
+fts_close (FTS *sp)
+{
+ register FTSENT *freep, *p;
+ int saved_errno = 0;
+
+ /*
+ * This still works if we haven't read anything -- the dummy structure
+ * points to the root list, so we step through to the end of the root
+ * list which has a valid parent pointer.
+ */
+ if (sp->fts_cur) {
+ for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
+ freep = p;
+ p = p->fts_link != NULL ? p->fts_link : p->fts_parent;
+ free(freep);
+ }
+ free(p);
+ }
+
+ /* Free up child linked list, sort array, file name buffer. */
+ if (sp->fts_child)
+ fts_lfree(sp->fts_child);
+ free(sp->fts_array);
+ free(sp->fts_path);
+
+ if (ISSET(FTS_CWDFD))
+ {
+ if (0 <= sp->fts_cwd_fd)
+ if (close (sp->fts_cwd_fd))
+ saved_errno = errno;
+ }
+ else if (!ISSET(FTS_NOCHDIR))
+ {
+ /* Return to original directory, save errno if necessary. */
+ if (fchdir(sp->fts_rfd))
+ saved_errno = errno;
+
+ /* If close fails, record errno only if saved_errno is zero,
+ so that we report the probably-more-meaningful fchdir errno. */
+ if (close (sp->fts_rfd))
+ if (saved_errno == 0)
+ saved_errno = errno;
+ }
+
+ fd_ring_clear (&sp->fts_fd_ring);
+
+ if (sp->fts_leaf_optimization_works_ht)
+ hash_free (sp->fts_leaf_optimization_works_ht);
+
+ free_dir (sp);
+
+ /* Free up the stream pointer. */
+ free(sp);
+
+ /* Set errno and return. */
+ if (saved_errno) {
+ __set_errno (saved_errno);
+ return (-1);
+ }
+
+ return (0);
+}
+
+#if defined __linux__ \
+ && HAVE_SYS_VFS_H && HAVE_FSTATFS && HAVE_STRUCT_STATFS_F_TYPE
+
+# include <sys/vfs.h>
+
+/* Linux-specific constants from coreutils' src/fs.h */
+# define S_MAGIC_TMPFS 0x1021994
+# define S_MAGIC_NFS 0x6969
+# define S_MAGIC_REISERFS 0x52654973
+# define S_MAGIC_PROC 0x9FA0
+
+/* Return false if it is easy to determine the file system type of
+ the directory on which DIR_FD is open, and sorting dirents on
+ inode numbers is known not to improve traversal performance with
+ that type of file system. Otherwise, return true. */
+static bool
+dirent_inode_sort_may_be_useful (int dir_fd)
+{
+ /* Skip the sort only if we can determine efficiently
+ that skipping it is the right thing to do.
+ The cost of performing an unnecessary sort is negligible,
+ while the cost of *not* performing it can be O(N^2) with
+ a very large constant. */
+ struct statfs fs_buf;
+
+ /* If fstatfs fails, assume sorting would be useful. */
+ if (fstatfs (dir_fd, &fs_buf) != 0)
+ return true;
+
+ /* FIXME: what about when f_type is not an integral type?
+ deal with that if/when it's encountered. */
+ switch (fs_buf.f_type)
+ {
+ case S_MAGIC_TMPFS:
+ case S_MAGIC_NFS:
+ /* On a file system of any of these types, sorting
+ is unnecessary, and hence wasteful. */
+ return false;
+
+ default:
+ return true;
+ }
+}
+
+/* Given a file descriptor DIR_FD open on a directory D,
+ return true if it is valid to apply the leaf-optimization
+ technique of counting directories in D via stat.st_nlink. */
+static bool
+leaf_optimization_applies (int dir_fd)
+{
+ struct statfs fs_buf;
+
+ /* If fstatfs fails, assume we can't use the optimization. */
+ if (fstatfs (dir_fd, &fs_buf) != 0)
+ return false;
+
+ /* FIXME: do we need to detect AFS mount points? I doubt it,
+ unless fstatfs can report S_MAGIC_REISERFS for such a directory. */
+
+ switch (fs_buf.f_type)
+ {
+ /* List here the file system types that lack useable dirent.d_type
+ info, yet for which the optimization does apply. */
+ case S_MAGIC_REISERFS:
+ return true;
+
+ case S_MAGIC_PROC:
+ /* Explicitly listing this or any other file system type for which
+ the optimization is not applicable is not necessary, but we leave
+ it here to document the risk. Per http://bugs.debian.org/143111,
+ /proc may have bogus stat.st_nlink values. */
+ /* fall through */
+ default:
+ return false;
+ }
+}
+
+#else
+static bool
+dirent_inode_sort_may_be_useful (int dir_fd _GL_UNUSED) { return true; }
+static bool
+leaf_optimization_applies (int dir_fd _GL_UNUSED) { return false; }
+#endif
+
+/* link-count-optimization entry:
+ map a stat.st_dev number to a boolean: leaf_optimization_works */
+struct LCO_ent
+{
+ dev_t st_dev;
+ bool opt_ok;
+};
+
+/* Use a tiny initial size. If a traversal encounters more than
+ a few devices, the cost of growing/rehashing this table will be
+ rendered negligible by the number of inodes processed. */
+enum { LCO_HT_INITIAL_SIZE = 13 };
+
+static size_t
+LCO_hash (void const *x, size_t table_size)
+{
+ struct LCO_ent const *ax = x;
+ return (uintmax_t) ax->st_dev % table_size;
+}
+
+static bool
+LCO_compare (void const *x, void const *y)
+{
+ struct LCO_ent const *ax = x;
+ struct LCO_ent const *ay = y;
+ return ax->st_dev == ay->st_dev;
+}
+
+/* Ask the same question as leaf_optimization_applies, but query
+ the cache first (FTS.fts_leaf_optimization_works_ht), and if necessary,
+ update that cache. */
+static bool
+link_count_optimize_ok (FTSENT const *p)
+{
+ FTS *sp = p->fts_fts;
+ Hash_table *h = sp->fts_leaf_optimization_works_ht;
+ struct LCO_ent tmp;
+ struct LCO_ent *ent;
+ bool opt_ok;
+ struct LCO_ent *t2;
+
+ /* If we're not in CWDFD mode, don't bother with this optimization,
+ since the caller is not serious about performance. */
+ if (!ISSET(FTS_CWDFD))
+ return false;
+
+ /* map st_dev to the boolean, leaf_optimization_works */
+ if (h == NULL)
+ {
+ h = sp->fts_leaf_optimization_works_ht
+ = hash_initialize (LCO_HT_INITIAL_SIZE, NULL, LCO_hash,
+ LCO_compare, free);
+ if (h == NULL)
+ return false;
+ }
+ tmp.st_dev = p->fts_statp->st_dev;
+ ent = hash_lookup (h, &tmp);
+ if (ent)
+ return ent->opt_ok;
+
+ /* Look-up failed. Query directly and cache the result. */
+ t2 = malloc (sizeof *t2);
+ if (t2 == NULL)
+ return false;
+
+ /* Is it ok to perform the optimization in the dir, FTS_CWD_FD? */
+ opt_ok = leaf_optimization_applies (sp->fts_cwd_fd);
+ t2->opt_ok = opt_ok;
+ t2->st_dev = p->fts_statp->st_dev;
+
+ ent = hash_insert (h, t2);
+ if (ent == NULL)
+ {
+ /* insertion failed */
+ free (t2);
+ return false;
+ }
+ fts_assert (ent == t2);
+
+ return opt_ok;
+}
+
+/*
+ * Special case of "/" at the end of the file name so that slashes aren't
+ * appended which would cause file names to be written as "....//foo".
+ */
+#define NAPPEND(p) \
+ (p->fts_path[p->fts_pathlen - 1] == '/' \
+ ? p->fts_pathlen - 1 : p->fts_pathlen)
+
+FTSENT *
+fts_read (register FTS *sp)
+{
+ register FTSENT *p, *tmp;
+ register unsigned short int instr;
+ register char *t;
+
+ /* If finished or unrecoverable error, return NULL. */
+ if (sp->fts_cur == NULL || ISSET(FTS_STOP))
+ return (NULL);
+
+ /* Set current node pointer. */
+ p = sp->fts_cur;
+
+ /* Save and zero out user instructions. */
+ instr = p->fts_instr;
+ p->fts_instr = FTS_NOINSTR;
+
+ /* Any type of file may be re-visited; re-stat and re-turn. */
+ if (instr == FTS_AGAIN) {
+ p->fts_info = fts_stat(sp, p, false);
+ return (p);
+ }
+ Dprintf (("fts_read: p=%s\n",
+ p->fts_info == FTS_INIT ? "" : p->fts_path));
+
+ /*
+ * Following a symlink -- SLNONE test allows application to see
+ * SLNONE and recover. If indirecting through a symlink, have
+ * keep a pointer to current location. If unable to get that
+ * pointer, follow fails.
+ */
+ if (instr == FTS_FOLLOW &&
+ (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
+ p->fts_info = fts_stat(sp, p, true);
+ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+ if ((p->fts_symfd = diropen (sp, ".")) < 0) {
+ p->fts_errno = errno;
+ p->fts_info = FTS_ERR;
+ } else
+ p->fts_flags |= FTS_SYMFOLLOW;
+ }
+ goto check_for_dir;
+ }
+
+ /* Directory in pre-order. */
+ if (p->fts_info == FTS_D) {
+ /* If skipped or crossed mount point, do post-order visit. */
+ if (instr == FTS_SKIP ||
+ (ISSET(FTS_XDEV) && p->fts_statp->st_dev != sp->fts_dev)) {
+ if (p->fts_flags & FTS_SYMFOLLOW)
+ (void)close(p->fts_symfd);
+ if (sp->fts_child) {
+ fts_lfree(sp->fts_child);
+ sp->fts_child = NULL;
+ }
+ p->fts_info = FTS_DP;
+ LEAVE_DIR (sp, p, "1");
+ return (p);
+ }
+
+ /* Rebuild if only read the names and now traversing. */
+ if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) {
+ CLR(FTS_NAMEONLY);
+ fts_lfree(sp->fts_child);
+ sp->fts_child = NULL;
+ }
+
+ /*
+ * Cd to the subdirectory.
+ *
+ * If have already read and now fail to chdir, whack the list
+ * to make the names come out right, and set the parent errno
+ * so the application will eventually get an error condition.
+ * Set the FTS_DONTCHDIR flag so that when we logically change
+ * directories back to the parent we don't do a chdir.
+ *
+ * If haven't read do so. If the read fails, fts_build sets
+ * FTS_STOP or the fts_info field of the node.
+ */
+ if (sp->fts_child != NULL) {
+ if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
+ p->fts_errno = errno;
+ p->fts_flags |= FTS_DONTCHDIR;
+ for (p = sp->fts_child; p != NULL;
+ p = p->fts_link)
+ p->fts_accpath =
+ p->fts_parent->fts_accpath;
+ }
+ } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
+ if (ISSET(FTS_STOP))
+ return (NULL);
+ /* If fts_build's call to fts_safe_changedir failed
+ because it was not able to fchdir into a
+ subdirectory, tell the caller. */
+ if (p->fts_errno && p->fts_info != FTS_DNR)
+ p->fts_info = FTS_ERR;
+ LEAVE_DIR (sp, p, "2");
+ return (p);
+ }
+ p = sp->fts_child;
+ sp->fts_child = NULL;
+ goto name;
+ }
+
+ /* Move to the next node on this level. */
+next: tmp = p;
+
+ /* If we have so many directory entries that we're reading them
+ in batches, and we've reached the end of the current batch,
+ read in a new batch. */
+ if (p->fts_link == NULL && p->fts_parent->fts_dirp)
+ {
+ p = tmp->fts_parent;
+ sp->fts_cur = p;
+ sp->fts_path[p->fts_pathlen] = '\0';
+
+ if ((p = fts_build (sp, BREAD)) == NULL)
+ {
+ if (ISSET(FTS_STOP))
+ return NULL;
+ goto cd_dot_dot;
+ }
+
+ free(tmp);
+ goto name;
+ }
+
+ if ((p = p->fts_link) != NULL) {
+ sp->fts_cur = p;
+ free(tmp);
+
+ /*
+ * If reached the top, return to the original directory (or
+ * the root of the tree), and load the file names for the next
+ * root.
+ */
+ if (p->fts_level == FTS_ROOTLEVEL) {
+ if (restore_initial_cwd(sp)) {
+ SET(FTS_STOP);
+ return (NULL);
+ }
+ free_dir(sp);
+ fts_load(sp, p);
+ setup_dir(sp);
+ goto check_for_dir;
+ }
+
+ /*
+ * User may have called fts_set on the node. If skipped,
+ * ignore. If followed, get a file descriptor so we can
+ * get back if necessary.
+ */
+ if (p->fts_instr == FTS_SKIP)
+ goto next;
+ if (p->fts_instr == FTS_FOLLOW) {
+ p->fts_info = fts_stat(sp, p, true);
+ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+ if ((p->fts_symfd = diropen (sp, ".")) < 0) {
+ p->fts_errno = errno;
+ p->fts_info = FTS_ERR;
+ } else
+ p->fts_flags |= FTS_SYMFOLLOW;
+ }
+ p->fts_instr = FTS_NOINSTR;
+ }
+
+name: t = sp->fts_path + NAPPEND(p->fts_parent);
+ *t++ = '/';
+ memmove(t, p->fts_name, p->fts_namelen + 1);
+check_for_dir:
+ sp->fts_cur = p;
+ if (p->fts_info == FTS_NSOK)
+ {
+ if (p->fts_statp->st_size == FTS_STAT_REQUIRED)
+ {
+ FTSENT *parent = p->fts_parent;
+ if (FTS_ROOTLEVEL < p->fts_level
+ /* ->fts_n_dirs_remaining is not valid
+ for command-line-specified names. */
+ && parent->fts_n_dirs_remaining == 0
+ && ISSET(FTS_NOSTAT)
+ && ISSET(FTS_PHYSICAL)
+ && link_count_optimize_ok (parent))
+ {
+ /* nothing more needed */
+ }
+ else
+ {
+ p->fts_info = fts_stat(sp, p, false);
+ if (S_ISDIR(p->fts_statp->st_mode)
+ && p->fts_level != FTS_ROOTLEVEL
+ && parent->fts_n_dirs_remaining)
+ parent->fts_n_dirs_remaining--;
+ }
+ }
+ else
+ fts_assert (p->fts_statp->st_size == FTS_NO_STAT_REQUIRED);
+ }
+
+ if (p->fts_info == FTS_D)
+ {
+ /* Now that P->fts_statp is guaranteed to be valid,
+ if this is a command-line directory, record its
+ device number, to be used for FTS_XDEV. */
+ if (p->fts_level == FTS_ROOTLEVEL)
+ sp->fts_dev = p->fts_statp->st_dev;
+ Dprintf ((" entering: %s\n", p->fts_path));
+ if (! enter_dir (sp, p))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
+ return p;
+ }
+cd_dot_dot:
+
+ /* Move up to the parent node. */
+ p = tmp->fts_parent;
+ sp->fts_cur = p;
+ free(tmp);
+
+ if (p->fts_level == FTS_ROOTPARENTLEVEL) {
+ /*
+ * Done; free everything up and set errno to 0 so the user
+ * can distinguish between error and EOF.
+ */
+ free(p);
+ __set_errno (0);
+ return (sp->fts_cur = NULL);
+ }
+
+ fts_assert (p->fts_info != FTS_NSOK);
+
+ /* NUL terminate the file name. */
+ sp->fts_path[p->fts_pathlen] = '\0';
+
+ /*
+ * Return to the parent directory. If at a root node, restore
+ * the initial working directory. If we came through a symlink,
+ * go back through the file descriptor. Otherwise, move up
+ * one level, via "..".
+ */
+ if (p->fts_level == FTS_ROOTLEVEL) {
+ if (restore_initial_cwd(sp)) {
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ } else if (p->fts_flags & FTS_SYMFOLLOW) {
+ if (FCHDIR(sp, p->fts_symfd)) {
+ int saved_errno = errno;
+ (void)close(p->fts_symfd);
+ __set_errno (saved_errno);
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ (void)close(p->fts_symfd);
+ } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+ fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
+ p->fts_errno = errno;
+ SET(FTS_STOP);
+ }
+ p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
+ if (p->fts_errno == 0)
+ LEAVE_DIR (sp, p, "3");
+ return ISSET(FTS_STOP) ? NULL : p;
+}
+
+/*
+ * Fts_set takes the stream as an argument although it's not used in this
+ * implementation; it would be necessary if anyone wanted to add global
+ * semantics to fts using fts_set. An error return is allowed for similar
+ * reasons.
+ */
+/* ARGSUSED */
+int
+fts_set(FTS *sp _GL_UNUSED, FTSENT *p, int instr)
+{
+ if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
+ instr != FTS_NOINSTR && instr != FTS_SKIP) {
+ __set_errno (EINVAL);
+ return (1);
+ }
+ p->fts_instr = instr;
+ return (0);
+}
+
+FTSENT *
+fts_children (register FTS *sp, int instr)
+{
+ register FTSENT *p;
+ int fd;
+
+ if (instr != 0 && instr != FTS_NAMEONLY) {
+ __set_errno (EINVAL);
+ return (NULL);
+ }
+
+ /* Set current node pointer. */
+ p = sp->fts_cur;
+
+ /*
+ * Errno set to 0 so user can distinguish empty directory from
+ * an error.
+ */
+ __set_errno (0);
+
+ /* Fatal errors stop here. */
+ if (ISSET(FTS_STOP))
+ return (NULL);
+
+ /* Return logical hierarchy of user's arguments. */
+ if (p->fts_info == FTS_INIT)
+ return (p->fts_link);
+
+ /*
+ * If not a directory being visited in pre-order, stop here. Could
+ * allow FTS_DNR, assuming the user has fixed the problem, but the
+ * same effect is available with FTS_AGAIN.
+ */
+ if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
+ return (NULL);
+
+ /* Free up any previous child list. */
+ if (sp->fts_child != NULL)
+ fts_lfree(sp->fts_child);
+
+ if (instr == FTS_NAMEONLY) {
+ SET(FTS_NAMEONLY);
+ instr = BNAMES;
+ } else
+ instr = BCHILD;
+
+ /*
+ * If using chdir on a relative file name and called BEFORE fts_read
+ * does its chdir to the root of a traversal, we can lose -- we need to
+ * chdir into the subdirectory, and we don't know where the current
+ * directory is, so we can't get back so that the upcoming chdir by
+ * fts_read will work.
+ */
+ if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
+ ISSET(FTS_NOCHDIR))
+ return (sp->fts_child = fts_build(sp, instr));
+
+ if ((fd = diropen (sp, ".")) < 0)
+ return (sp->fts_child = NULL);
+ sp->fts_child = fts_build(sp, instr);
+ if (ISSET(FTS_CWDFD))
+ {
+ cwd_advance_fd (sp, fd, true);
+ }
+ else
+ {
+ if (fchdir(fd))
+ {
+ int saved_errno = errno;
+ close (fd);
+ __set_errno (saved_errno);
+ return NULL;
+ }
+ close (fd);
+ }
+ return (sp->fts_child);
+}
+
+/* A comparison function to sort on increasing inode number.
+ For some file system types, sorting either way makes a huge
+ performance difference for a directory with very many entries,
+ but sorting on increasing values is slightly better than sorting
+ on decreasing values. The difference is in the 5% range. */
+static int
+fts_compare_ino (struct _ftsent const **a, struct _ftsent const **b)
+{
+ return (a[0]->fts_statp->st_ino < b[0]->fts_statp->st_ino ? -1
+ : b[0]->fts_statp->st_ino < a[0]->fts_statp->st_ino ? 1 : 0);
+}
+
+/* Map the dirent.d_type value, DTYPE, to the corresponding stat.st_mode
+ S_IF* bit and set ST.st_mode, thus clearing all other bits in that field. */
+static void
+set_stat_type (struct stat *st, unsigned int dtype)
+{
+ mode_t type;
+ switch (dtype)
+ {
+ case DT_BLK:
+ type = S_IFBLK;
+ break;
+ case DT_CHR:
+ type = S_IFCHR;
+ break;
+ case DT_DIR:
+ type = S_IFDIR;
+ break;
+ case DT_FIFO:
+ type = S_IFIFO;
+ break;
+ case DT_LNK:
+ type = S_IFLNK;
+ break;
+ case DT_REG:
+ type = S_IFREG;
+ break;
+ case DT_SOCK:
+ type = S_IFSOCK;
+ break;
+ default:
+ type = 0;
+ }
+ st->st_mode = type;
+}
+
+#define closedir_and_clear(dirp) \
+ do \
+ { \
+ closedir (dirp); \
+ dirp = NULL; \
+ } \
+ while (0)
+
+#define fts_opendir(file, Pdir_fd) \
+ opendirat((! ISSET(FTS_NOCHDIR) && ISSET(FTS_CWDFD) \
+ ? sp->fts_cwd_fd : AT_FDCWD), \
+ file, \
+ (((ISSET(FTS_PHYSICAL) \
+ && ! (ISSET(FTS_COMFOLLOW) \
+ && cur->fts_level == FTS_ROOTLEVEL)) \
+ ? O_NOFOLLOW : 0) \
+ | (ISSET (FTS_NOATIME) ? O_NOATIME : 0)), \
+ Pdir_fd)
+
+/*
+ * This is the tricky part -- do not casually change *anything* in here. The
+ * idea is to build the linked list of entries that are used by fts_children
+ * and fts_read. There are lots of special cases.
+ *
+ * The real slowdown in walking the tree is the stat calls. If FTS_NOSTAT is
+ * set and it's a physical walk (so that symbolic links can't be directories),
+ * we can do things quickly. First, if it's a 4.4BSD file system, the type
+ * of the file is in the directory entry. Otherwise, we assume that the number
+ * of subdirectories in a node is equal to the number of links to the parent.
+ * The former skips all stat calls. The latter skips stat calls in any leaf
+ * directories and for any files after the subdirectories in the directory have
+ * been found, cutting the stat calls by about 2/3.
+ */
+static FTSENT *
+internal_function
+fts_build (register FTS *sp, int type)
+{
+ register FTSENT *p, *head;
+ register size_t nitems;
+ FTSENT *tail;
+ void *oldaddr;
+ int saved_errno;
+ bool descend;
+ bool doadjust;
+ ptrdiff_t level;
+ nlink_t nlinks;
+ bool nostat;
+ size_t len, maxlen, new_len;
+ char *cp;
+ int dir_fd;
+ FTSENT *cur = sp->fts_cur;
+ bool continue_readdir = !!cur->fts_dirp;
+
+ /* When cur->fts_dirp is non-NULL, that means we should
+ continue calling readdir on that existing DIR* pointer
+ rather than opening a new one. */
+ if (continue_readdir)
+ {
+ DIR *dp = cur->fts_dirp;
+ dir_fd = dirfd (dp);
+ if (dir_fd < 0)
+ {
+ closedir_and_clear (cur->fts_dirp);
+ if (type == BREAD)
+ {
+ cur->fts_info = FTS_DNR;
+ cur->fts_errno = errno;
+ }
+ return NULL;
+ }
+ }
+ else
+ {
+ /* Open the directory for reading. If this fails, we're done.
+ If being called from fts_read, set the fts_info field. */
+ if ((cur->fts_dirp = fts_opendir(cur->fts_accpath, &dir_fd)) == NULL)
+ {
+ if (type == BREAD)
+ {
+ cur->fts_info = FTS_DNR;
+ cur->fts_errno = errno;
+ }
+ return NULL;
+ }
+ /* Rather than calling fts_stat for each and every entry encountered
+ in the readdir loop (below), stat each directory only right after
+ opening it. */
+ if (cur->fts_info == FTS_NSOK)
+ cur->fts_info = fts_stat(sp, cur, false);
+ else if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK)
+ {
+ /* Now read the stat info again after opening a directory to
+ reveal eventual changes caused by a submount triggered by
+ the traversal. But do it only for utilities which use
+ FTS_TIGHT_CYCLE_CHECK. Therefore, only find and du
+ benefit/suffer from this feature for now. */
+ LEAVE_DIR (sp, cur, "4");
+ fts_stat (sp, cur, false);
+ if (! enter_dir (sp, cur))
+ {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
+ }
+
+ /* Maximum number of readdir entries to read at one time. This
+ limitation is to avoid reading millions of entries into memory
+ at once. When an fts_compar function is specified, we have no
+ choice: we must read all entries into memory before calling that
+ function. But when no such function is specified, we can read
+ entries in batches that are large enough to help us with inode-
+ sorting, yet not so large that we risk exhausting memory. */
+ size_t max_entries = (sp->fts_compar == NULL
+ ? FTS_MAX_READDIR_ENTRIES : SIZE_MAX);
+
+ /*
+ * Nlinks is the number of possible entries of type directory in the
+ * directory if we're cheating on stat calls, 0 if we're not doing
+ * any stat calls at all, (nlink_t) -1 if we're statting everything.
+ */
+ if (type == BNAMES) {
+ nlinks = 0;
+ /* Be quiet about nostat, GCC. */
+ nostat = false;
+ } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
+ nlinks = (cur->fts_statp->st_nlink
+ - (ISSET(FTS_SEEDOT) ? 0 : 2));
+ nostat = true;
+ } else {
+ nlinks = -1;
+ nostat = false;
+ }
+
+ /*
+ * If we're going to need to stat anything or we want to descend
+ * and stay in the directory, chdir. If this fails we keep going,
+ * but set a flag so we don't chdir after the post-order visit.
+ * We won't be able to stat anything, but we can still return the
+ * names themselves. Note, that since fts_read won't be able to
+ * chdir into the directory, it will have to return different file
+ * names than before, i.e. "a/b" instead of "b". Since the node
+ * has already been visited in pre-order, have to wait until the
+ * post-order visit to return the error. There is a special case
+ * here, if there was nothing to stat then it's not an error to
+ * not be able to stat. This is all fairly nasty. If a program
+ * needed sorted entries or stat information, they had better be
+ * checking FTS_NS on the returned nodes.
+ */
+ if (continue_readdir)
+ {
+ /* When resuming a short readdir run, we already have
+ the required dirp and dir_fd. */
+ descend = true;
+ }
+ else if (nlinks || type == BREAD) {
+ if (ISSET(FTS_CWDFD))
+ {
+ dir_fd = dup (dir_fd);
+ if (0 <= dir_fd)
+ set_cloexec_flag (dir_fd, true);
+ }
+ if (dir_fd < 0 || fts_safe_changedir(sp, cur, dir_fd, NULL)) {
+ if (nlinks && type == BREAD)
+ cur->fts_errno = errno;
+ cur->fts_flags |= FTS_DONTCHDIR;
+ descend = false;
+ closedir_and_clear(cur->fts_dirp);
+ if (ISSET(FTS_CWDFD) && 0 <= dir_fd)
+ close (dir_fd);
+ cur->fts_dirp = NULL;
+ } else
+ descend = true;
+ } else
+ descend = false;
+
+ /*
+ * Figure out the max file name length that can be stored in the
+ * current buffer -- the inner loop allocates more space as necessary.
+ * We really wouldn't have to do the maxlen calculations here, we
+ * could do them in fts_read before returning the name, but it's a
+ * lot easier here since the length is part of the dirent structure.
+ *
+ * If not changing directories set a pointer so that can just append
+ * each new component into the file name.
+ */
+ len = NAPPEND(cur);
+ if (ISSET(FTS_NOCHDIR)) {
+ cp = sp->fts_path + len;
+ *cp++ = '/';
+ } else {
+ /* GCC, you're too verbose. */
+ cp = NULL;
+ }
+ len++;
+ maxlen = sp->fts_pathlen - len;
+
+ level = cur->fts_level + 1;
+
+ /* Read the directory, attaching each entry to the `link' pointer. */
+ doadjust = false;
+ head = NULL;
+ tail = NULL;
+ nitems = 0;
+ while (cur->fts_dirp) {
+ bool is_dir;
+ struct dirent *dp = readdir(cur->fts_dirp);
+ if (dp == NULL)
+ break;
+ if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
+ continue;
+
+ if ((p = fts_alloc (sp, dp->d_name,
+ _D_EXACT_NAMLEN (dp))) == NULL)
+ goto mem1;
+ if (_D_EXACT_NAMLEN (dp) >= maxlen) {
+ /* include space for NUL */
+ oldaddr = sp->fts_path;
+ if (! fts_palloc(sp, _D_EXACT_NAMLEN (dp) + len + 1)) {
+ /*
+ * No more memory. Save
+ * errno, free up the current structure and the
+ * structures already allocated.
+ */
+mem1: saved_errno = errno;
+ free(p);
+ fts_lfree(head);
+ closedir_and_clear(cur->fts_dirp);
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ __set_errno (saved_errno);
+ return (NULL);
+ }
+ /* Did realloc() change the pointer? */
+ if (oldaddr != sp->fts_path) {
+ doadjust = true;
+ if (ISSET(FTS_NOCHDIR))
+ cp = sp->fts_path + len;
+ }
+ maxlen = sp->fts_pathlen - len;
+ }
+
+ new_len = len + _D_EXACT_NAMLEN (dp);
+ if (new_len < len) {
+ /*
+ * In the unlikely event that we would end up
+ * with a file name longer than SIZE_MAX, free up
+ * the current structure and the structures already
+ * allocated, then error out with ENAMETOOLONG.
+ */
+ free(p);
+ fts_lfree(head);
+ closedir_and_clear(cur->fts_dirp);
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ __set_errno (ENAMETOOLONG);
+ return (NULL);
+ }
+ p->fts_level = level;
+ p->fts_parent = sp->fts_cur;
+ p->fts_pathlen = new_len;
+
+ /* Store dirent.d_ino, in case we need to sort
+ entries before processing them. */
+ p->fts_statp->st_ino = D_INO (dp);
+
+ /* Build a file name for fts_stat to stat. */
+ if (ISSET(FTS_NOCHDIR)) {
+ p->fts_accpath = p->fts_path;
+ memmove(cp, p->fts_name, p->fts_namelen + 1);
+ } else
+ p->fts_accpath = p->fts_name;
+
+ if (sp->fts_compar == NULL || ISSET(FTS_DEFER_STAT)) {
+ /* Record what fts_read will have to do with this
+ entry. In many cases, it will simply fts_stat it,
+ but we can take advantage of any d_type information
+ to optimize away the unnecessary stat calls. I.e.,
+ if FTS_NOSTAT is in effect and we're not following
+ symlinks (FTS_PHYSICAL) and d_type indicates this
+ is *not* a directory, then we won't have to stat it
+ at all. If it *is* a directory, then (currently)
+ we stat it regardless, in order to get device and
+ inode numbers. Some day we might optimize that
+ away, too, for directories where d_ino is known to
+ be valid. */
+ bool skip_stat = (ISSET(FTS_PHYSICAL)
+ && ISSET(FTS_NOSTAT)
+ && DT_IS_KNOWN(dp)
+ && ! DT_MUST_BE(dp, DT_DIR));
+ p->fts_info = FTS_NSOK;
+ /* Propagate dirent.d_type information back
+ to caller, when possible. */
+ set_stat_type (p->fts_statp, D_TYPE (dp));
+ fts_set_stat_required(p, !skip_stat);
+ is_dir = (ISSET(FTS_PHYSICAL)
+ && DT_MUST_BE(dp, DT_DIR));
+ } else {
+ p->fts_info = fts_stat(sp, p, false);
+ is_dir = (p->fts_info == FTS_D
+ || p->fts_info == FTS_DC
+ || p->fts_info == FTS_DOT);
+ }
+
+ /* Decrement link count if applicable. */
+ if (nlinks > 0 && is_dir)
+ nlinks -= nostat;
+
+ /* We walk in directory order so "ls -f" doesn't get upset. */
+ p->fts_link = NULL;
+ if (head == NULL)
+ head = tail = p;
+ else {
+ tail->fts_link = p;
+ tail = p;
+ }
+ ++nitems;
+ if (max_entries <= nitems) {
+ /* When there are too many dir entries, leave
+ fts_dirp open, so that a subsequent fts_read
+ can take up where we leave off. */
+ goto break_without_closedir;
+ }
+ }
+
+ if (cur->fts_dirp)
+ closedir_and_clear(cur->fts_dirp);
+
+ break_without_closedir:
+
+ /*
+ * If realloc() changed the address of the file name, adjust the
+ * addresses for the rest of the tree and the dir list.
+ */
+ if (doadjust)
+ fts_padjust(sp, head);
+
+ /*
+ * If not changing directories, reset the file name back to original
+ * state.
+ */
+ if (ISSET(FTS_NOCHDIR)) {
+ if (len == sp->fts_pathlen || nitems == 0)
+ --cp;
+ *cp = '\0';
+ }
+
+ /*
+ * If descended after called from fts_children or after called from
+ * fts_read and nothing found, get back. At the root level we use
+ * the saved fd; if one of fts_open()'s arguments is a relative name
+ * to an empty directory, we wind up here with no other way back. If
+ * can't get back, we're done.
+ */
+ if (!continue_readdir && descend && (type == BCHILD || !nitems) &&
+ (cur->fts_level == FTS_ROOTLEVEL
+ ? restore_initial_cwd(sp)
+ : fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
+ cur->fts_info = FTS_ERR;
+ SET(FTS_STOP);
+ fts_lfree(head);
+ return (NULL);
+ }
+
+ /* If didn't find anything, return NULL. */
+ if (!nitems) {
+ if (type == BREAD)
+ cur->fts_info = FTS_DP;
+ fts_lfree(head);
+ return (NULL);
+ }
+
+ /* If there are many entries, no sorting function has been specified,
+ and this file system is of a type that may be slow with a large
+ number of entries, then sort the directory entries on increasing
+ inode numbers. */
+ if (nitems > _FTS_INODE_SORT_DIR_ENTRIES_THRESHOLD
+ && !sp->fts_compar
+ && ISSET (FTS_CWDFD)
+ && dirent_inode_sort_may_be_useful (sp->fts_cwd_fd)) {
+ sp->fts_compar = fts_compare_ino;
+ head = fts_sort (sp, head, nitems);
+ sp->fts_compar = NULL;
+ }
+
+ /* Sort the entries. */
+ if (sp->fts_compar && nitems > 1)
+ head = fts_sort(sp, head, nitems);
+ return (head);
+}
+
+#if FTS_DEBUG
+
+/* Walk ->fts_parent links starting at E_CURR, until the root of the
+ current hierarchy. There should be a directory with dev/inode
+ matching those of AD. If not, print a lot of diagnostics. */
+static void
+find_matching_ancestor (FTSENT const *e_curr, struct Active_dir const *ad)
+{
+ FTSENT const *ent;
+ for (ent = e_curr; ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
+ {
+ if (ad->ino == ent->fts_statp->st_ino
+ && ad->dev == ent->fts_statp->st_dev)
+ return;
+ }
+ printf ("ERROR: tree dir, %s, not active\n", ad->fts_ent->fts_accpath);
+ printf ("active dirs:\n");
+ for (ent = e_curr;
+ ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
+ printf (" %s(%"PRIuMAX"/%"PRIuMAX") to %s(%"PRIuMAX"/%"PRIuMAX")...\n",
+ ad->fts_ent->fts_accpath,
+ (uintmax_t) ad->dev,
+ (uintmax_t) ad->ino,
+ ent->fts_accpath,
+ (uintmax_t) ent->fts_statp->st_dev,
+ (uintmax_t) ent->fts_statp->st_ino);
+}
+
+void
+fts_cross_check (FTS const *sp)
+{
+ FTSENT const *ent = sp->fts_cur;
+ FTSENT const *t;
+ if ( ! ISSET (FTS_TIGHT_CYCLE_CHECK))
+ return;
+
+ Dprintf (("fts-cross-check cur=%s\n", ent->fts_path));
+ /* Make sure every parent dir is in the tree. */
+ for (t = ent->fts_parent; t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
+ {
+ struct Active_dir ad;
+ ad.ino = t->fts_statp->st_ino;
+ ad.dev = t->fts_statp->st_dev;
+ if ( ! hash_lookup (sp->fts_cycle.ht, &ad))
+ printf ("ERROR: active dir, %s, not in tree\n", t->fts_path);
+ }
+
+ /* Make sure every dir in the tree is an active dir.
+ But ENT is not necessarily a directory. If so, just skip this part. */
+ if (ent->fts_parent->fts_level >= FTS_ROOTLEVEL
+ && (ent->fts_info == FTS_DP
+ || ent->fts_info == FTS_D))
+ {
+ struct Active_dir *ad;
+ for (ad = hash_get_first (sp->fts_cycle.ht); ad != NULL;
+ ad = hash_get_next (sp->fts_cycle.ht, ad))
+ {
+ find_matching_ancestor (ent, ad);
+ }
+ }
+}
+
+static bool
+same_fd (int fd1, int fd2)
+{
+ struct stat sb1, sb2;
+ return (fstat (fd1, &sb1) == 0
+ && fstat (fd2, &sb2) == 0
+ && SAME_INODE (sb1, sb2));
+}
+
+static void
+fd_ring_print (FTS const *sp, FILE *stream, char const *msg)
+{
+ I_ring const *fd_ring = &sp->fts_fd_ring;
+ unsigned int i = fd_ring->fts_front;
+ char *cwd = getcwdat (sp->fts_cwd_fd, NULL, 0);
+ fprintf (stream, "=== %s ========== %s\n", msg, cwd);
+ free (cwd);
+ if (i_ring_empty (fd_ring))
+ return;
+
+ while (true)
+ {
+ int fd = fd_ring->fts_fd_ring[i];
+ if (fd < 0)
+ fprintf (stream, "%d: %d:\n", i, fd);
+ else
+ {
+ char *wd = getcwdat (fd, NULL, 0);
+ fprintf (stream, "%d: %d: %s\n", i, fd, wd);
+ free (wd);
+ }
+ if (i == fd_ring->fts_back)
+ break;
+ i = (i + I_RING_SIZE - 1) % I_RING_SIZE;
+ }
+}
+
+/* Ensure that each file descriptor on the fd_ring matches a
+ parent, grandparent, etc. of the current working directory. */
+static void
+fd_ring_check (FTS const *sp)
+{
+ if (!fts_debug)
+ return;
+
+ /* Make a writable copy. */
+ I_ring fd_w = sp->fts_fd_ring;
+
+ int cwd_fd = sp->fts_cwd_fd;
+ cwd_fd = dup (cwd_fd);
+ char *dot = getcwdat (cwd_fd, NULL, 0);
+ error (0, 0, "===== check ===== cwd: %s", dot);
+ free (dot);
+ while ( ! i_ring_empty (&fd_w))
+ {
+ int fd = i_ring_pop (&fd_w);
+ if (0 <= fd)
+ {
+ int parent_fd = openat (cwd_fd, "..", O_SEARCH | O_NOATIME);
+ if (parent_fd < 0)
+ {
+ // Warn?
+ break;
+ }
+ if (!same_fd (fd, parent_fd))
+ {
+ char *cwd = getcwdat (fd, NULL, 0);
+ error (0, errno, "ring : %s", cwd);
+ char *c2 = getcwdat (parent_fd, NULL, 0);
+ error (0, errno, "parent: %s", c2);
+ free (cwd);
+ free (c2);
+ fts_assert (0);
+ }
+ close (cwd_fd);
+ cwd_fd = parent_fd;
+ }
+ }
+ close (cwd_fd);
+}
+#endif
+
+static unsigned short int
+internal_function
+fts_stat(FTS *sp, register FTSENT *p, bool follow)
+{
+ struct stat *sbp = p->fts_statp;
+ int saved_errno;
+
+ if (p->fts_level == FTS_ROOTLEVEL && ISSET(FTS_COMFOLLOW))
+ follow = true;
+
+ /*
+ * If doing a logical walk, or application requested FTS_FOLLOW, do
+ * a stat(2). If that fails, check for a non-existent symlink. If
+ * fail, set the errno from the stat call.
+ */
+ if (ISSET(FTS_LOGICAL) || follow) {
+ if (stat(p->fts_accpath, sbp)) {
+ saved_errno = errno;
+ if (errno == ENOENT
+ && lstat(p->fts_accpath, sbp) == 0) {
+ __set_errno (0);
+ return (FTS_SLNONE);
+ }
+ p->fts_errno = saved_errno;
+ goto err;
+ }
+ } else if (fstatat(sp->fts_cwd_fd, p->fts_accpath, sbp,
+ AT_SYMLINK_NOFOLLOW)) {
+ p->fts_errno = errno;
+err: memset(sbp, 0, sizeof(struct stat));
+ return (FTS_NS);
+ }
+
+ if (S_ISDIR(sbp->st_mode)) {
+ p->fts_n_dirs_remaining = (sbp->st_nlink
+ - (ISSET(FTS_SEEDOT) ? 0 : 2));
+ if (ISDOT(p->fts_name)) {
+ /* Command-line "." and ".." are real directories. */
+ return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
+ }
+
+ return (FTS_D);
+ }
+ if (S_ISLNK(sbp->st_mode))
+ return (FTS_SL);
+ if (S_ISREG(sbp->st_mode))
+ return (FTS_F);
+ return (FTS_DEFAULT);
+}
+
+static int
+fts_compar (void const *a, void const *b)
+{
+ /* Convert A and B to the correct types, to pacify the compiler, and
+ for portability to bizarre hosts where "void const *" and "FTSENT
+ const **" differ in runtime representation. The comparison
+ function cannot modify *a and *b, but there is no compile-time
+ check for this. */
+ FTSENT const **pa = (FTSENT const **) a;
+ FTSENT const **pb = (FTSENT const **) b;
+ return pa[0]->fts_fts->fts_compar (pa, pb);
+}
+
+static FTSENT *
+internal_function
+fts_sort (FTS *sp, FTSENT *head, register size_t nitems)
+{
+ register FTSENT **ap, *p;
+
+ /* On most modern hosts, void * and FTSENT ** have the same
+ run-time representation, and one can convert sp->fts_compar to
+ the type qsort expects without problem. Use the heuristic that
+ this is OK if the two pointer types are the same size, and if
+ converting FTSENT ** to long int is the same as converting
+ FTSENT ** to void * and then to long int. This heuristic isn't
+ valid in general but we don't know of any counterexamples. */
+ FTSENT *dummy;
+ int (*compare) (void const *, void const *) =
+ ((sizeof &dummy == sizeof (void *)
+ && (long int) &dummy == (long int) (void *) &dummy)
+ ? (int (*) (void const *, void const *)) sp->fts_compar
+ : fts_compar);
+
+ /*
+ * Construct an array of pointers to the structures and call qsort(3).
+ * Reassemble the array in the order returned by qsort. If unable to
+ * sort for memory reasons, return the directory entries in their
+ * current order. Allocate enough space for the current needs plus
+ * 40 so don't realloc one entry at a time.
+ */
+ if (nitems > sp->fts_nitems) {
+ FTSENT **a;
+
+ sp->fts_nitems = nitems + 40;
+ if (SIZE_MAX / sizeof *a < sp->fts_nitems
+ || ! (a = realloc (sp->fts_array,
+ sp->fts_nitems * sizeof *a))) {
+ free(sp->fts_array);
+ sp->fts_array = NULL;
+ sp->fts_nitems = 0;
+ return (head);
+ }
+ sp->fts_array = a;
+ }
+ for (ap = sp->fts_array, p = head; p; p = p->fts_link)
+ *ap++ = p;
+ qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), compare);
+ for (head = *(ap = sp->fts_array); --nitems; ++ap)
+ ap[0]->fts_link = ap[1];
+ ap[0]->fts_link = NULL;
+ return (head);
+}
+
+static FTSENT *
+internal_function
+fts_alloc (FTS *sp, const char *name, register size_t namelen)
+{
+ register FTSENT *p;
+ size_t len;
+
+ /*
+ * The file name is a variable length array. Allocate the FTSENT
+ * structure and the file name in one chunk.
+ */
+ len = sizeof(FTSENT) + namelen;
+ if ((p = malloc(len)) == NULL)
+ return (NULL);
+
+ /* Copy the name and guarantee NUL termination. */
+ memmove(p->fts_name, name, namelen);
+ p->fts_name[namelen] = '\0';
+
+ p->fts_namelen = namelen;
+ p->fts_fts = sp;
+ p->fts_path = sp->fts_path;
+ p->fts_errno = 0;
+ p->fts_dirp = NULL;
+ p->fts_flags = 0;
+ p->fts_instr = FTS_NOINSTR;
+ p->fts_number = 0;
+ p->fts_pointer = NULL;
+ return (p);
+}
+
+static void
+internal_function
+fts_lfree (register FTSENT *head)
+{
+ register FTSENT *p;
+
+ /* Free a linked list of structures. */
+ while ((p = head)) {
+ head = head->fts_link;
+ if (p->fts_dirp)
+ closedir (p->fts_dirp);
+ free(p);
+ }
+}
+
+/*
+ * Allow essentially unlimited file name lengths; find, rm, ls should
+ * all work on any tree. Most systems will allow creation of file
+ * names much longer than MAXPATHLEN, even though the kernel won't
+ * resolve them. Add the size (not just what's needed) plus 256 bytes
+ * so don't realloc the file name 2 bytes at a time.
+ */
+static bool
+internal_function
+fts_palloc (FTS *sp, size_t more)
+{
+ char *p;
+ size_t new_len = sp->fts_pathlen + more + 256;
+
+ /*
+ * See if fts_pathlen would overflow.
+ */
+ if (new_len < sp->fts_pathlen) {
+ free(sp->fts_path);
+ sp->fts_path = NULL;
+ __set_errno (ENAMETOOLONG);
+ return false;
+ }
+ sp->fts_pathlen = new_len;
+ p = realloc(sp->fts_path, sp->fts_pathlen);
+ if (p == NULL) {
+ free(sp->fts_path);
+ sp->fts_path = NULL;
+ return false;
+ }
+ sp->fts_path = p;
+ return true;
+}
+
+/*
+ * When the file name is realloc'd, have to fix all of the pointers in
+ * structures already returned.
+ */
+static void
+internal_function
+fts_padjust (FTS *sp, FTSENT *head)
+{
+ FTSENT *p;
+ char *addr = sp->fts_path;
+
+#define ADJUST(p) do { \
+ if ((p)->fts_accpath != (p)->fts_name) { \
+ (p)->fts_accpath = \
+ (char *)addr + ((p)->fts_accpath - (p)->fts_path); \
+ } \
+ (p)->fts_path = addr; \
+} while (0)
+ /* Adjust the current set of children. */
+ for (p = sp->fts_child; p; p = p->fts_link)
+ ADJUST(p);
+
+ /* Adjust the rest of the tree, including the current level. */
+ for (p = head; p->fts_level >= FTS_ROOTLEVEL;) {
+ ADJUST(p);
+ p = p->fts_link ? p->fts_link : p->fts_parent;
+ }
+}
+
+static size_t
+internal_function _GL_ATTRIBUTE_PURE
+fts_maxarglen (char * const *argv)
+{
+ size_t len, max;
+
+ for (max = 0; *argv; ++argv)
+ if ((len = strlen(*argv)) > max)
+ max = len;
+ return (max + 1);
+}
+
+/*
+ * Change to dir specified by fd or file name without getting
+ * tricked by someone changing the world out from underneath us.
+ * Assumes p->fts_statp->st_dev and p->fts_statp->st_ino are filled in.
+ * If FD is non-negative, expect it to be used after this function returns,
+ * and to be closed eventually. So don't pass e.g., `dirfd(dirp)' and then
+ * do closedir(dirp), because that would invalidate the saved FD.
+ * Upon failure, close FD immediately and return nonzero.
+ */
+static int
+internal_function
+fts_safe_changedir (FTS *sp, FTSENT *p, int fd, char const *dir)
+{
+ int ret;
+ bool is_dotdot = dir && STREQ (dir, "..");
+ int newfd;
+
+ /* This clause handles the unusual case in which FTS_NOCHDIR
+ is specified, along with FTS_CWDFD. In that case, there is
+ no need to change even the virtual cwd file descriptor.
+ However, if FD is non-negative, we do close it here. */
+ if (ISSET (FTS_NOCHDIR))
+ {
+ if (ISSET (FTS_CWDFD) && 0 <= fd)
+ close (fd);
+ return 0;
+ }
+
+ if (fd < 0 && is_dotdot && ISSET (FTS_CWDFD))
+ {
+ /* When possible, skip the diropen and subsequent fstat+dev/ino
+ comparison. I.e., when changing to parent directory
+ (chdir ("..")), use a file descriptor from the ring and
+ save the overhead of diropen+fstat, as well as avoiding
+ failure when we lack "x" access to the virtual cwd. */
+ if ( ! i_ring_empty (&sp->fts_fd_ring))
+ {
+ int parent_fd;
+ fd_ring_print (sp, stderr, "pre-pop");
+ parent_fd = i_ring_pop (&sp->fts_fd_ring);
+ is_dotdot = true;
+ if (0 <= parent_fd)
+ {
+ fd = parent_fd;
+ dir = NULL;
+ }
+ }
+ }
+
+ newfd = fd;
+ if (fd < 0 && (newfd = diropen (sp, dir)) < 0)
+ return -1;
+
+ /* The following dev/inode check is necessary if we're doing a
+ `logical' traversal (through symlinks, a la chown -L), if the
+ system lacks O_NOFOLLOW support, or if we're changing to ".."
+ (but not via a popped file descriptor). When changing to the
+ name "..", O_NOFOLLOW can't help. In general, when the target is
+ not "..", diropen's use of O_NOFOLLOW ensures we don't mistakenly
+ follow a symlink, so we can avoid the expense of this fstat. */
+ if (ISSET(FTS_LOGICAL) || ! HAVE_WORKING_O_NOFOLLOW
+ || (dir && STREQ (dir, "..")))
+ {
+ struct stat sb;
+ if (fstat(newfd, &sb))
+ {
+ ret = -1;
+ goto bail;
+ }
+ if (p->fts_statp->st_dev != sb.st_dev
+ || p->fts_statp->st_ino != sb.st_ino)
+ {
+ __set_errno (ENOENT); /* disinformation */
+ ret = -1;
+ goto bail;
+ }
+ }
+
+ if (ISSET(FTS_CWDFD))
+ {
+ cwd_advance_fd (sp, newfd, ! is_dotdot);
+ return 0;
+ }
+
+ ret = fchdir(newfd);
+bail:
+ if (fd < 0)
+ {
+ int oerrno = errno;
+ (void)close(newfd);
+ __set_errno (oerrno);
+ }
+ return ret;
+}
diff --git a/gnulib/lib/fts_.h b/gnulib/lib/fts_.h
new file mode 100644
index 0000000..a0235a9
--- /dev/null
+++ b/gnulib/lib/fts_.h
@@ -0,0 +1,272 @@
+/* Traverse a file hierarchy.
+
+ Copyright (C) 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)fts.h 8.3 (Berkeley) 8/14/94
+ */
+
+#ifndef _FTS_H
+# define _FTS_H 1
+
+# ifdef _LIBC
+# include <features.h>
+# else
+# undef __THROW
+# define __THROW
+# undef __BEGIN_DECLS
+# undef __END_DECLS
+# ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+# else
+# define __BEGIN_DECLS
+# define __END_DECLS
+# endif
+# endif
+
+# include <stddef.h>
+# include <sys/types.h>
+# include <dirent.h>
+# include <sys/stat.h>
+# include "i-ring.h"
+
+typedef struct {
+ struct _ftsent *fts_cur; /* current node */
+ struct _ftsent *fts_child; /* linked list of children */
+ struct _ftsent **fts_array; /* sort array */
+ dev_t fts_dev; /* starting device # */
+ char *fts_path; /* file name for this descent */
+ int fts_rfd; /* fd for root */
+ int fts_cwd_fd; /* the file descriptor on which the
+ virtual cwd is open, or AT_FDCWD */
+ size_t fts_pathlen; /* sizeof(path) */
+ size_t fts_nitems; /* elements in the sort array */
+ int (*fts_compar) (struct _ftsent const **, struct _ftsent const **);
+ /* compare fn */
+
+# define FTS_COMFOLLOW 0x0001 /* follow command line symlinks */
+# define FTS_LOGICAL 0x0002 /* logical walk */
+# define FTS_NOCHDIR 0x0004 /* don't change directories */
+# define FTS_NOSTAT 0x0008 /* don't get stat info */
+# define FTS_PHYSICAL 0x0010 /* physical walk */
+# define FTS_SEEDOT 0x0020 /* return dot and dot-dot */
+# define FTS_XDEV 0x0040 /* don't cross devices */
+# define FTS_WHITEOUT 0x0080 /* return whiteout information */
+
+ /* There are two ways to detect cycles.
+ The lazy way (which works only with FTS_PHYSICAL),
+ with which one may process a directory that is a
+ part of the cycle several times before detecting the cycle.
+ The `tight' way, whereby fts uses more memory (proportional
+ to number of `active' directories, aka distance from root
+ of current tree to current directory -- see active_dir_ht)
+ to detect any cycle right away. For example, du must use
+ this option to avoid counting disk space in a cycle multiple
+ times, but chown -R need not.
+ The default is to use the constant-memory lazy way, when possible
+ (see below).
+
+ However, with FTS_LOGICAL (when following symlinks, e.g., chown -L)
+ using lazy cycle detection is inadequate. For example, traversing
+ a directory containing a symbolic link to a peer directory, it is
+ possible to encounter the same directory twice even though there
+ is no cycle:
+ dir
+ ...
+ slink -> dir
+ So, when FTS_LOGICAL is selected, we have to use a different
+ mode of cycle detection: FTS_TIGHT_CYCLE_CHECK. */
+# define FTS_TIGHT_CYCLE_CHECK 0x0100
+
+ /* Use this flag to enable semantics with which the parent
+ application may be made both more efficient and more robust.
+ Whereas the default is to visit each directory in a recursive
+ traversal (via chdir), using this flag makes it so the initial
+ working directory is never changed. Instead, these functions
+ perform the traversal via a virtual working directory, maintained
+ through the file descriptor member, fts_cwd_fd. */
+# define FTS_CWDFD 0x0200
+
+ /* Historically, for each directory that fts initially encounters, it would
+ open it, read all entries, and stat each entry, storing the results, and
+ then it would process the first entry. But that behavior is bad for
+ locality of reference, and also causes trouble with inode-simulating
+ file systems like FAT, CIFS, FUSE-based ones, etc., when entries from
+ their name/inode cache are flushed too early.
+ Use this flag to make fts_open and fts_read defer the stat/lstat/fststat
+ of each entry until it is actually processed. However, note that if you
+ use this option and also specify a comparison function, that function may
+ not examine any data via fts_statp. However, when fts_statp->st_mode is
+ nonzero, the S_IFMT type bits are valid, with mapped dirent.d_type data.
+ Of course, that happens only on file systems that provide useful
+ dirent.d_type data. */
+# define FTS_DEFER_STAT 0x0400
+
+# define FTS_NOATIME 0x0800 /* use O_NOATIME during traversal */
+
+# define FTS_OPTIONMASK 0x0fff /* valid user option mask */
+
+# define FTS_NAMEONLY 0x1000 /* (private) child names only */
+# define FTS_STOP 0x2000 /* (private) unrecoverable error */
+ int fts_options; /* fts_open options, global flags */
+
+ /* Map a directory's device number to a boolean. The boolean is
+ true if for that file system (type determined by a single fstatfs
+ call per FS) st_nlink can be used to calculate the number of
+ sub-directory entries in a directory.
+ Using this table is an optimization that permits us to look up
+ file system type on a per-inode basis at the minimal cost of
+ calling fstatfs only once per traversed device. */
+ struct hash_table *fts_leaf_optimization_works_ht;
+
+ union {
+ /* This data structure is used if FTS_TIGHT_CYCLE_CHECK is
+ specified. It records the directories between a starting
+ point and the current directory. I.e., a directory is
+ recorded here IFF we have visited it once, but we have not
+ yet completed processing of all its entries. Every time we
+ visit a new directory, we add that directory to this set.
+ When we finish with a directory (usually by visiting it a
+ second time), we remove it from this set. Each entry in
+ this data structure is a device/inode pair. This data
+ structure is used to detect directory cycles efficiently and
+ promptly even when the depth of a hierarchy is in the tens
+ of thousands. */
+ struct hash_table *ht;
+
+ /* FIXME: rename these two members to have the fts_ prefix */
+ /* This data structure uses a lazy cycle-detection algorithm,
+ as done by rm via cycle-check.c. It's the default,
+ but it's not appropriate for programs like du. */
+ struct cycle_check_state *state;
+ } fts_cycle;
+
+ /* A stack of the file descriptors corresponding to the
+ most-recently traversed parent directories.
+ Currently used only in FTS_CWDFD mode. */
+ I_ring fts_fd_ring;
+} FTS;
+
+typedef struct _ftsent {
+ struct _ftsent *fts_cycle; /* cycle node */
+ struct _ftsent *fts_parent; /* parent directory */
+ struct _ftsent *fts_link; /* next file in directory */
+ DIR *fts_dirp; /* Dir pointer for any directory
+ containing more entries than we
+ read at one time. */
+ long fts_number; /* local numeric value */
+ void *fts_pointer; /* local address value */
+ char *fts_accpath; /* access file name */
+ char *fts_path; /* root name; == fts_fts->fts_path */
+ int fts_errno; /* errno for this node */
+ int fts_symfd; /* fd for symlink */
+ size_t fts_pathlen; /* strlen(fts_path) */
+
+ FTS *fts_fts; /* the file hierarchy itself */
+
+# define FTS_ROOTPARENTLEVEL (-1)
+# define FTS_ROOTLEVEL 0
+ ptrdiff_t fts_level; /* depth (-1 to N) */
+
+ size_t fts_namelen; /* strlen(fts_name) */
+ nlink_t fts_n_dirs_remaining; /* count down from st_nlink */
+
+# define FTS_D 1 /* preorder directory */
+# define FTS_DC 2 /* directory that causes cycles */
+# define FTS_DEFAULT 3 /* none of the above */
+# define FTS_DNR 4 /* unreadable directory */
+# define FTS_DOT 5 /* dot or dot-dot */
+# define FTS_DP 6 /* postorder directory */
+# define FTS_ERR 7 /* error; errno is set */
+# define FTS_F 8 /* regular file */
+# define FTS_INIT 9 /* initialized only */
+# define FTS_NS 10 /* stat(2) failed */
+# define FTS_NSOK 11 /* no stat(2) requested */
+# define FTS_SL 12 /* symbolic link */
+# define FTS_SLNONE 13 /* symbolic link without target */
+# define FTS_W 14 /* whiteout object */
+ unsigned short int fts_info; /* user flags for FTSENT structure */
+
+# define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */
+# define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */
+ unsigned short int fts_flags; /* private flags for FTSENT structure */
+
+# define FTS_AGAIN 1 /* read node again */
+# define FTS_FOLLOW 2 /* follow symbolic link */
+# define FTS_NOINSTR 3 /* no instructions */
+# define FTS_SKIP 4 /* discard node */
+ unsigned short int fts_instr; /* fts_set() instructions */
+
+ struct stat fts_statp[1]; /* stat(2) information */
+ char fts_name[1]; /* file name */
+} FTSENT;
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+__BEGIN_DECLS
+FTSENT *fts_children (FTS *, int) __THROW __attribute_warn_unused_result__;
+int fts_close (FTS *) __THROW __attribute_warn_unused_result__;
+FTS *fts_open (char * const *, int,
+ int (*)(const FTSENT **, const FTSENT **))
+ __THROW __attribute_warn_unused_result__;
+FTSENT *fts_read (FTS *) __THROW __attribute_warn_unused_result__;
+int fts_set (FTS *, FTSENT *, int) __THROW;
+__END_DECLS
+
+#endif /* fts.h */
diff --git a/gnulib/lib/full-read.c b/gnulib/lib/full-read.c
new file mode 100644
index 0000000..44f483c
--- /dev/null
+++ b/gnulib/lib/full-read.c
@@ -0,0 +1,18 @@
+/* An interface to read that retries after partial reads and interrupts.
+ Copyright (C) 2002-2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define FULL_READ
+#include "full-write.c"
diff --git a/gnulib/lib/full-read.h b/gnulib/lib/full-read.h
new file mode 100644
index 0000000..0dc3172
--- /dev/null
+++ b/gnulib/lib/full-read.h
@@ -0,0 +1,24 @@
+/* An interface to read() that reads all it is asked to read.
+
+ Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, read to the Free Software Foundation,
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+/* Read COUNT bytes at BUF to descriptor FD, retrying if interrupted
+ or if partial reads occur. Return the number of bytes successfully
+ read, setting errno if that is less than COUNT. errno = 0 means EOF. */
+extern size_t full_read (int fd, void *buf, size_t count);
diff --git a/gnulib/lib/full-write.c b/gnulib/lib/full-write.c
new file mode 100644
index 0000000..b94f95f
--- /dev/null
+++ b/gnulib/lib/full-write.c
@@ -0,0 +1,79 @@
+/* An interface to read and write that retries (if necessary) until complete.
+
+ Copyright (C) 1993-1994, 1997-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef FULL_READ
+# include "full-read.h"
+#else
+# include "full-write.h"
+#endif
+
+#include <errno.h>
+
+#ifdef FULL_READ
+# include "safe-read.h"
+# define safe_rw safe_read
+# define full_rw full_read
+# undef const
+# define const /* empty */
+#else
+# include "safe-write.h"
+# define safe_rw safe_write
+# define full_rw full_write
+#endif
+
+#ifdef FULL_READ
+/* Set errno to zero upon EOF. */
+# define ZERO_BYTE_TRANSFER_ERRNO 0
+#else
+/* Some buggy drivers return 0 when one tries to write beyond
+ a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
+ Set errno to ENOSPC so they get a sensible diagnostic. */
+# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
+#endif
+
+/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
+ interrupted or if a partial write(read) occurs. Return the number
+ of bytes transferred.
+ When writing, set errno if fewer than COUNT bytes are written.
+ When reading, if fewer than COUNT bytes are read, you must examine
+ errno to distinguish failure from EOF (errno == 0). */
+size_t
+full_rw (int fd, const void *buf, size_t count)
+{
+ size_t total = 0;
+ const char *ptr = (const char *) buf;
+
+ while (count > 0)
+ {
+ size_t n_rw = safe_rw (fd, ptr, count);
+ if (n_rw == (size_t) -1)
+ break;
+ if (n_rw == 0)
+ {
+ errno = ZERO_BYTE_TRANSFER_ERRNO;
+ break;
+ }
+ total += n_rw;
+ ptr += n_rw;
+ count -= n_rw;
+ }
+
+ return total;
+}
diff --git a/gnulib/lib/full-write.h b/gnulib/lib/full-write.h
new file mode 100644
index 0000000..8a75ae6
--- /dev/null
+++ b/gnulib/lib/full-write.h
@@ -0,0 +1,34 @@
+/* An interface to write() that writes all it is asked to write.
+
+ Copyright (C) 2002-2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
+ or if partial writes occur. Return the number of bytes successfully
+ written, setting errno if that is less than COUNT. */
+extern size_t full_write (int fd, const void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/futimens.c b/gnulib/lib/futimens.c
new file mode 100644
index 0000000..0fe8a0a
--- /dev/null
+++ b/gnulib/lib/futimens.c
@@ -0,0 +1,37 @@
+/* Set the access and modification time of an open fd.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "utimens.h"
+
+/* Set the access and modification time stamps of FD to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ Fail with ENOSYS on systems without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+int
+futimens (int fd, struct timespec const times[2])
+{
+ /* fdutimens also works around bugs in native futimens, when running
+ with glibc compiled against newer headers but on a Linux kernel
+ older than 2.6.32. */
+ return fdutimens (fd, NULL, times);
+}
diff --git a/gnulib/lib/fwritable.c b/gnulib/lib/fwritable.c
new file mode 100644
index 0000000..ededfb3
--- /dev/null
+++ b/gnulib/lib/fwritable.c
@@ -0,0 +1,47 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwritable.h"
+
+#include "stdio-impl.h"
+
+bool
+fwritable (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & _IO_NO_WRITES) == 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & (__SRW | __SWR)) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & (_IORW | _IOWRT)) != 0;
+#elif defined __minix /* Minix */
+ return (fp->_flags & _IOWRITE) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ return (fp->_flag & (_IORW | _IOWRT)) != 0;
+#elif defined __QNX__ /* QNX */
+ return (fp->_Mode & 0x2 /* _MOPENW */) != 0;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ return fp->__mode.__write;
+#else
+# error "Please port gnulib fwritable.c to your platform! Look at the definition of fopen, fdopen on your system, then report this to bug-gnulib."
+#endif
+}
diff --git a/gnulib/lib/fwritable.h b/gnulib/lib/fwritable.h
new file mode 100644
index 0000000..a968136
--- /dev/null
+++ b/gnulib/lib/fwritable.h
@@ -0,0 +1,42 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM supports writing, false if it supports
+ only reading.
+ STREAM must not be wide-character oriented.
+ The result doesn't change until the stream is closed or re-opened. */
+
+#if HAVE___FWRITABLE /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define fwritable(stream) (__fwritable (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool fwritable (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/fwriteerror.c b/gnulib/lib/fwriteerror.c
new file mode 100644
index 0000000..6b3a070
--- /dev/null
+++ b/gnulib/lib/fwriteerror.c
@@ -0,0 +1,181 @@
+/* Detect write error on a stream.
+ Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwriteerror.h"
+
+#include <errno.h>
+#include <stdbool.h>
+
+static int
+do_fwriteerror (FILE *fp, bool ignore_ebadf)
+{
+ /* State to allow multiple calls to fwriteerror (stdout). */
+ static bool stdout_closed = false;
+
+ if (fp == stdout)
+ {
+ if (stdout_closed)
+ return 0;
+
+ /* If we are closing stdout, don't attempt to do it later again. */
+ stdout_closed = true;
+ }
+
+ /* This function returns an error indication if there was a previous failure
+ or if fclose failed, with two exceptions:
+ - Ignore an fclose failure if there was no previous error, no data
+ remains to be flushed, and fclose failed with EBADF. That can
+ happen when a program like cp is invoked like this `cp a b >&-'
+ (i.e., with standard output closed) and doesn't generate any
+ output (hence no previous error and nothing to be flushed).
+ - Ignore an fclose failure due to EPIPE. That can happen when a
+ program blocks or ignores SIGPIPE, and the output pipe or socket
+ has no readers now. The EPIPE tells us that we should stop writing
+ to this output. That's what we are doing anyway here.
+
+ Need to
+ 1. test the error indicator of the stream,
+ 2. flush the buffers both in userland and in the kernel, through fclose,
+ testing for error again. */
+
+ /* Clear errno, so that on non-POSIX systems the caller doesn't see a
+ wrong value of errno when we return -1. */
+ errno = 0;
+
+ if (ferror (fp))
+ {
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ /* The stream had an error earlier, but its errno was lost. If the
+ error was not temporary, we can get the same errno by writing and
+ flushing one more byte. We can do so because at this point the
+ stream's contents is garbage anyway. */
+ if (fputc ('\0', fp) == EOF)
+ goto close_preserving_errno; /* errno is set here */
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ /* Give up on errno. */
+ errno = 0;
+ goto close_preserving_errno;
+ }
+
+ if (ignore_ebadf)
+ {
+ /* We need an explicit fflush to tell whether some output was already
+ done on FP. */
+ if (fflush (fp))
+ goto close_preserving_errno; /* errno is set here */
+ if (fclose (fp) && errno != EBADF)
+ goto got_errno; /* errno is set here */
+ }
+ else
+ {
+ if (fclose (fp))
+ goto got_errno; /* errno is set here */
+ }
+
+ return 0;
+
+ close_preserving_errno:
+ /* There's an error. Nevertheless call fclose(fp), for consistency
+ with the other cases. */
+ {
+ int saved_errno = errno;
+ fclose (fp);
+ errno = saved_errno;
+ }
+ got_errno:
+ /* There's an error. Ignore EPIPE. */
+ if (errno == EPIPE)
+ return 0;
+ else
+ return -1;
+}
+
+int
+fwriteerror (FILE *fp)
+{
+ return do_fwriteerror (fp, false);
+}
+
+int
+fwriteerror_no_ebadf (FILE *fp)
+{
+ return do_fwriteerror (fp, true);
+}
+
+
+#if TEST
+
+/* Name of a file on which writing fails. On systems without /dev/full,
+ you can choose a filename on a full file system. */
+#define UNWRITABLE_FILE "/dev/full"
+
+int
+main ()
+{
+ static int sizes[] =
+ {
+ 511, 512, 513,
+ 1023, 1024, 1025,
+ 2047, 2048, 2049,
+ 4095, 4096, 4097,
+ 8191, 8192, 8193
+ };
+ static char dummy[8193];
+ unsigned int i, j;
+
+ for (i = 0; i < sizeof (sizes) / sizeof (sizes[0]); i++)
+ {
+ size_t size = sizes[i];
+
+ for (j = 0; j < 2; j++)
+ {
+ /* Run a test depending on i and j:
+ Write size bytes and then calls fflush if j==1. */
+ FILE *stream = fopen (UNWRITABLE_FILE, "w");
+
+ if (stream == NULL)
+ {
+ fprintf (stderr, "Test %u:%u: could not open file\n", i, j);
+ continue;
+ }
+
+ fwrite (dummy, 347, 1, stream);
+ fwrite (dummy, size - 347, 1, stream);
+ if (j)
+ fflush (stream);
+
+ if (fwriteerror (stream) == -1)
+ {
+ if (errno != ENOSPC)
+ fprintf (stderr, "Test %u:%u: fwriteerror ok, errno = %d\n",
+ i, j, errno);
+ }
+ else
+ fprintf (stderr, "Test %u:%u: fwriteerror found no error!\n",
+ i, j);
+ }
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/fwriteerror.h b/gnulib/lib/fwriteerror.h
new file mode 100644
index 0000000..eb1927b
--- /dev/null
+++ b/gnulib/lib/fwriteerror.h
@@ -0,0 +1,62 @@
+/* Detect write error on a stream.
+ Copyright (C) 2003, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* There are two approaches for detecting a write error on a stream opened
+ for writing:
+
+ (a) Test the return value of every fwrite() or fprintf() call, and react
+ immediately.
+ (b) Just before fclose(), test the error indicator in the stream and
+ the return value of the final fclose() call.
+
+ The benefit of (a) is that non file related errors (such that ENOMEM during
+ fprintf) and temporary error conditions can be diagnosed accurately.
+
+ A theoretical benefit of (a) is also that, on POSIX systems, in the case of
+ an ENOSPC error, errno is set and can be used by error() to provide a more
+ accurate error message. But in practice, this benefit is not big because
+ users can easily figure out by themselves why a file cannot be written to,
+ and furthermore the function fwriteerror() can provide errno as well.
+
+ The big drawback of (a) is extensive error checking code: Every function
+ which does stream output must return an error indicator.
+
+ This file provides support for (b). */
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write out the not yet written buffered contents of the stream FP, close
+ the stream FP, and test whether some error occurred on the stream FP.
+ FP must be a stream opened for writing.
+ Return 0 if no error occurred and fclose (fp) succeeded.
+ Return -1 and set errno if there was an error. The errno value will be 0
+ if the cause of the error cannot be determined.
+ For any given stream FP other than stdout, fwriteerror (FP) may only be
+ called once. */
+extern int fwriteerror (FILE *fp);
+
+/* Likewise, but don't consider it an error if FP has an invalid file
+ descriptor and no output was done to FP. */
+extern int fwriteerror_no_ebadf (FILE *fp);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/fwriting.c b/gnulib/lib/fwriting.c
new file mode 100644
index 0000000..9b1dc14
--- /dev/null
+++ b/gnulib/lib/fwriting.c
@@ -0,0 +1,58 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fwriting.h"
+
+#include "stdio-impl.h"
+
+bool
+fwriting (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return (fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) != 0;
+#elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+ return (fp_->_flags & __SWR) != 0;
+#elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & _IOWRT) != 0;
+#elif defined __minix /* Minix */
+ return (fp->_flags & _IOWRITING) != 0;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+ return (fp->_flag & _IOWRT) != 0;
+#elif defined __UCLIBC__ /* uClibc */
+ return (fp->__modeflags & __FLAG_WRITING) != 0;
+#elif defined __QNX__ /* QNX */
+ return ((fp->_Mode & 0x1 /* _MOPENR */) == 0
+ || (fp->_Mode & 0x2000 /* _MWRITE */) != 0);
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__read)
+ return 1;
+ if (!fp->__mode.__write)
+ return 0;
+# ifdef _IO_CURRENTLY_PUTTING /* Flag added on 2009-02-28 */
+ return (fp->__flags & _IO_CURRENTLY_PUTTING) != 0;
+# else
+ return (fp->__buffer < fp->__put_limit /*|| fp->__bufp == fp->__get_limit ??*/);
+# endif
+#else
+# error "Please port gnulib fwriting.c to your platform!"
+#endif
+}
diff --git a/gnulib/lib/fwriting.h b/gnulib/lib/fwriting.h
new file mode 100644
index 0000000..72af0b8
--- /dev/null
+++ b/gnulib/lib/fwriting.h
@@ -0,0 +1,53 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM is opened write-only or
+ append-only, or if the last operation on the stream was a write
+ operation. Return false if the stream is opened read-only, or if
+ it supports reading and there is no current write operation (such
+ as fputc).
+
+ freading and fwriting will never both be true. If STREAM supports
+ both reads and writes, then:
+ - both freading and fwriting might be false when the stream is first
+ opened, after read encounters EOF, or after fflush,
+ - freading might be false or true and fwriting might be false
+ after repositioning (such as fseek, fsetpos, or rewind),
+ depending on the underlying implementation.
+
+ STREAM must not be wide-character oriented. */
+
+#if HAVE___FWRITING /* glibc >= 2.2, Solaris >= 7 */
+
+# include <stdio_ext.h>
+# define fwriting(stream) (__fwriting (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool fwriting (FILE *stream);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/gai_strerror.c b/gnulib/lib/gai_strerror.c
new file mode 100644
index 0000000..f758f8e
--- /dev/null
+++ b/gnulib/lib/gai_strerror.c
@@ -0,0 +1,93 @@
+/* Copyright (C) 1997, 2001-2002, 2004-2006, 2008-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <netdb.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(String) gettext (String)
+# define N_(String) String
+#endif
+
+#if HAVE_DECL_GAI_STRERROR
+
+# include <sys/socket.h>
+# undef gai_strerror
+# if HAVE_DECL_GAI_STRERRORA
+# define gai_strerror gai_strerrorA
+# endif
+
+const char *
+rpl_gai_strerror (int code)
+{
+ return gai_strerror (code);
+}
+
+#else /* !HAVE_DECL_GAI_STRERROR */
+
+static struct
+ {
+ int code;
+ const char *msg;
+ }
+values[] =
+ {
+ { EAI_ADDRFAMILY, N_("Address family for hostname not supported") },
+ { EAI_AGAIN, N_("Temporary failure in name resolution") },
+ { EAI_BADFLAGS, N_("Bad value for ai_flags") },
+ { EAI_FAIL, N_("Non-recoverable failure in name resolution") },
+ { EAI_FAMILY, N_("ai_family not supported") },
+ { EAI_MEMORY, N_("Memory allocation failure") },
+ { EAI_NODATA, N_("No address associated with hostname") },
+ { EAI_NONAME, N_("Name or service not known") },
+ { EAI_SERVICE, N_("Servname not supported for ai_socktype") },
+ { EAI_SOCKTYPE, N_("ai_socktype not supported") },
+ { EAI_SYSTEM, N_("System error") },
+ { EAI_OVERFLOW, N_("Argument buffer too small") },
+#ifdef EAI_INPROGRESS
+ { EAI_INPROGRESS, N_("Processing request in progress") },
+ { EAI_CANCELED, N_("Request canceled") },
+ { EAI_NOTCANCELED, N_("Request not canceled") },
+ { EAI_ALLDONE, N_("All requests done") },
+ { EAI_INTR, N_("Interrupted by a signal") },
+ { EAI_IDN_ENCODE, N_("Parameter string not correctly encoded") }
+#endif
+ };
+
+const char *
+gai_strerror (int code)
+{
+ size_t i;
+ for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i)
+ if (values[i].code == code)
+ return _(values[i].msg);
+
+ return _("Unknown error");
+}
+# ifdef _LIBC
+libc_hidden_def (gai_strerror)
+# endif
+#endif /* !HAVE_DECL_GAI_STRERROR */
diff --git a/gnulib/lib/gc-gnulib.c b/gnulib/lib/gc-gnulib.c
new file mode 100644
index 0000000..c5033c9
--- /dev/null
+++ b/gnulib/lib/gc-gnulib.c
@@ -0,0 +1,918 @@
+/* gc-gnulib.c --- Common gnulib internal crypto interface functions
+ * Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Note: This file is only built if GC uses internal functions. */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* For randomize. */
+#ifdef GNULIB_GC_RANDOM
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+# include <errno.h>
+#endif
+
+/* Hashes. */
+#ifdef GNULIB_GC_MD2
+# include "md2.h"
+#endif
+#ifdef GNULIB_GC_MD4
+# include "md4.h"
+#endif
+#ifdef GNULIB_GC_MD5
+# include "md5.h"
+#endif
+#ifdef GNULIB_GC_SHA1
+# include "sha1.h"
+#endif
+#if defined(GNULIB_GC_HMAC_MD5) || defined(GNULIB_GC_HMAC_SHA1)
+# include "hmac.h"
+#endif
+
+/* Ciphers. */
+#ifdef GNULIB_GC_ARCFOUR
+# include "arcfour.h"
+#endif
+#ifdef GNULIB_GC_ARCTWO
+# include "arctwo.h"
+#endif
+#ifdef GNULIB_GC_DES
+# include "des.h"
+#endif
+#ifdef GNULIB_GC_RIJNDAEL
+# include "rijndael-api-fst.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+# include <wincrypt.h>
+HCRYPTPROV g_hProv = 0;
+# ifndef PROV_INTEL_SEC
+# define PROV_INTEL_SEC 22
+# endif
+# ifndef CRYPT_VERIFY_CONTEXT
+# define CRYPT_VERIFY_CONTEXT 0xF0000000
+# endif
+# endif
+#endif
+
+Gc_rc
+gc_init (void)
+{
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (g_hProv)
+ CryptReleaseContext (g_hProv, 0);
+
+ /* There is no need to create a container for just random data, so
+ we can use CRYPT_VERIFY_CONTEXT (one call) see:
+ http://blogs.msdn.com/dangriff/archive/2003/11/19/51709.aspx */
+
+ /* We first try to use the Intel PIII RNG if drivers are present */
+ if (!CryptAcquireContext (&g_hProv, NULL, NULL,
+ PROV_INTEL_SEC, CRYPT_VERIFY_CONTEXT))
+ {
+ /* not a PIII or no drivers available, use default RSA CSP */
+ if (!CryptAcquireContext (&g_hProv, NULL, NULL,
+ PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT))
+ return GC_RANDOM_ERROR;
+ }
+# endif
+#endif
+
+ return GC_OK;
+}
+
+void
+gc_done (void)
+{
+#ifdef GNULIB_GC_RANDOM
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (g_hProv)
+ {
+ CryptReleaseContext (g_hProv, 0);
+ g_hProv = 0;
+ }
+# endif
+#endif
+
+ return;
+}
+
+#ifdef GNULIB_GC_RANDOM
+
+/* Randomness. */
+
+static Gc_rc
+randomize (int level, char *data, size_t datalen)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (!g_hProv)
+ return GC_RANDOM_ERROR;
+ CryptGenRandom (g_hProv, (DWORD) datalen, data);
+#else
+ int fd;
+ const char *device;
+ size_t len = 0;
+ int rc;
+
+ switch (level)
+ {
+ case 0:
+ device = NAME_OF_NONCE_DEVICE;
+ break;
+
+ case 1:
+ device = NAME_OF_PSEUDO_RANDOM_DEVICE;
+ break;
+
+ default:
+ device = NAME_OF_RANDOM_DEVICE;
+ break;
+ }
+
+ if (strcmp (device, "no") == 0)
+ return GC_RANDOM_ERROR;
+
+ fd = open (device, O_RDONLY);
+ if (fd < 0)
+ return GC_RANDOM_ERROR;
+
+ do
+ {
+ ssize_t tmp;
+
+ tmp = read (fd, data, datalen);
+
+ if (tmp < 0)
+ {
+ int save_errno = errno;
+ close (fd);
+ errno = save_errno;
+ return GC_RANDOM_ERROR;
+ }
+
+ len += tmp;
+ }
+ while (len < datalen);
+
+ rc = close (fd);
+ if (rc < 0)
+ return GC_RANDOM_ERROR;
+#endif
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_nonce (char *data, size_t datalen)
+{
+ return randomize (0, data, datalen);
+}
+
+Gc_rc
+gc_pseudo_random (char *data, size_t datalen)
+{
+ return randomize (1, data, datalen);
+}
+
+Gc_rc
+gc_random (char *data, size_t datalen)
+{
+ return randomize (2, data, datalen);
+}
+
+#endif
+
+/* Memory allocation. */
+
+void
+gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc, gc_free_t func_free)
+{
+ return;
+}
+
+/* Ciphers. */
+
+typedef struct _gc_cipher_ctx
+{
+ Gc_cipher alg;
+ Gc_cipher_mode mode;
+#ifdef GNULIB_GC_ARCTWO
+ arctwo_context arctwoContext;
+ char arctwoIV[ARCTWO_BLOCK_SIZE];
+#endif
+#ifdef GNULIB_GC_ARCFOUR
+ arcfour_context arcfourContext;
+#endif
+#ifdef GNULIB_GC_DES
+ gl_des_ctx desContext;
+#endif
+#ifdef GNULIB_GC_RIJNDAEL
+ rijndaelKeyInstance aesEncKey;
+ rijndaelKeyInstance aesDecKey;
+ rijndaelCipherInstance aesContext;
+#endif
+} _gc_cipher_ctx;
+
+Gc_rc
+gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode,
+ gc_cipher_handle * outhandle)
+{
+ _gc_cipher_ctx *ctx;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = alg;
+ ctx->mode = mode;
+
+ switch (alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (mode)
+ {
+ case GC_ECB:
+ case GC_CBC:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ switch (mode)
+ {
+ case GC_STREAM:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ switch (mode)
+ {
+ case GC_ECB:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ switch (mode)
+ {
+ case GC_ECB:
+ case GC_CBC:
+ break;
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ rc = GC_INVALID_CIPHER;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ arctwo_setkey (&ctx->arctwoContext, keylen, key);
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_setkey (&ctx->arcfourContext, key, keylen);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ if (keylen != 8)
+ return GC_INVALID_CIPHER;
+ gl_des_setkey (&ctx->desContext, key);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ rijndael_rc rc;
+ size_t i;
+ char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1];
+
+ for (i = 0; i < keylen; i++)
+ sprintf (&keyMaterial[2 * i], "%02x", key[i] & 0xFF);
+
+ rc = rijndaelMakeKey (&ctx->aesEncKey, RIJNDAEL_DIR_ENCRYPT,
+ keylen * 8, keyMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+
+ rc = rijndaelMakeKey (&ctx->aesDecKey, RIJNDAEL_DIR_DECRYPT,
+ keylen * 8, keyMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+
+ rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_ECB, NULL);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ if (ivlen != ARCTWO_BLOCK_SIZE)
+ return GC_INVALID_CIPHER;
+ memcpy (ctx->arctwoIV, iv, ivlen);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ /* Doesn't use IV. */
+ break;
+
+ case GC_CBC:
+ {
+ rijndael_rc rc;
+ size_t i;
+ char ivMaterial[2 * RIJNDAEL_MAX_IV_SIZE + 1];
+
+ for (i = 0; i < ivlen; i++)
+ sprintf (&ivMaterial[2 * i], "%02x", iv[i] & 0xFF);
+
+ rc = rijndaelCipherInit (&ctx->aesContext, RIJNDAEL_MODE_CBC,
+ ivMaterial);
+ if (rc < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ arctwo_encrypt (&ctx->arctwoContext, data, data, len);
+ break;
+
+ case GC_CBC:
+ for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE,
+ data += ARCTWO_BLOCK_SIZE)
+ {
+ size_t i;
+ for (i = 0; i < ARCTWO_BLOCK_SIZE; i++)
+ data[i] ^= ctx->arctwoIV[i];
+ arctwo_encrypt (&ctx->arctwoContext, data, data,
+ ARCTWO_BLOCK_SIZE);
+ memcpy (ctx->arctwoIV, data, ARCTWO_BLOCK_SIZE);
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_stream (&ctx->arcfourContext, data, data, len);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ for (; len >= 8; len -= 8, data += 8)
+ gl_des_ecb_encrypt (&ctx->desContext, data, data);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ int nblocks;
+
+ nblocks = rijndaelBlockEncrypt (&ctx->aesContext, &ctx->aesEncKey,
+ data, 8 * len, data);
+ if (nblocks < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_ARCTWO
+ case GC_ARCTWO40:
+ switch (ctx->mode)
+ {
+ case GC_ECB:
+ arctwo_decrypt (&ctx->arctwoContext, data, data, len);
+ break;
+
+ case GC_CBC:
+ for (; len >= ARCTWO_BLOCK_SIZE; len -= ARCTWO_BLOCK_SIZE,
+ data += ARCTWO_BLOCK_SIZE)
+ {
+ char tmpIV[ARCTWO_BLOCK_SIZE];
+ size_t i;
+ memcpy (tmpIV, data, ARCTWO_BLOCK_SIZE);
+ arctwo_decrypt (&ctx->arctwoContext, data, data,
+ ARCTWO_BLOCK_SIZE);
+ for (i = 0; i < ARCTWO_BLOCK_SIZE; i++)
+ data[i] ^= ctx->arctwoIV[i];
+ memcpy (ctx->arctwoIV, tmpIV, ARCTWO_BLOCK_SIZE);
+ }
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+#ifdef GNULIB_GC_ARCFOUR
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ arcfour_stream (&ctx->arcfourContext, data, data, len);
+ break;
+#endif
+
+#ifdef GNULIB_GC_DES
+ case GC_DES:
+ for (; len >= 8; len -= 8, data += 8)
+ gl_des_ecb_decrypt (&ctx->desContext, data, data);
+ break;
+#endif
+
+#ifdef GNULIB_GC_RIJNDAEL
+ case GC_AES128:
+ case GC_AES192:
+ case GC_AES256:
+ {
+ int nblocks;
+
+ nblocks = rijndaelBlockDecrypt (&ctx->aesContext, &ctx->aesDecKey,
+ data, 8 * len, data);
+ if (nblocks < 0)
+ return GC_INVALID_CIPHER;
+ }
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_close (gc_cipher_handle handle)
+{
+ _gc_cipher_ctx *ctx = handle;
+
+ free (ctx);
+
+ return GC_OK;
+}
+
+/* Hashes. */
+
+#define MAX_DIGEST_SIZE 20
+
+typedef struct _gc_hash_ctx
+{
+ Gc_hash alg;
+ Gc_hash_mode mode;
+ char hash[MAX_DIGEST_SIZE];
+#ifdef GNULIB_GC_MD2
+ struct md2_ctx md2Context;
+#endif
+#ifdef GNULIB_GC_MD4
+ struct md4_ctx md4Context;
+#endif
+#ifdef GNULIB_GC_MD5
+ struct md5_ctx md5Context;
+#endif
+#ifdef GNULIB_GC_SHA1
+ struct sha1_ctx sha1Context;
+#endif
+} _gc_hash_ctx;
+
+Gc_rc
+gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *ctx;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = hash;
+ ctx->mode = mode;
+
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_init_ctx (&ctx->md2Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_init_ctx (&ctx->md4Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_init_ctx (&ctx->md5Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_init_ctx (&ctx->sha1Context);
+ break;
+#endif
+
+ default:
+ rc = GC_INVALID_HASH;
+ break;
+ }
+
+ switch (mode)
+ {
+ case 0:
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ break;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *in = handle;
+ _gc_hash_ctx *out;
+
+ *outhandle = out = calloc (sizeof (*out), 1);
+ if (!out)
+ return GC_MALLOC_ERROR;
+
+ memcpy (out, in, sizeof (*out));
+
+ return GC_OK;
+}
+
+size_t
+gc_hash_digest_length (Gc_hash hash)
+{
+ size_t len;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ len = GC_MD2_DIGEST_SIZE;
+ break;
+
+ case GC_MD4:
+ len = GC_MD4_DIGEST_SIZE;
+ break;
+
+ case GC_MD5:
+ len = GC_MD5_DIGEST_SIZE;
+ break;
+
+ case GC_RMD160:
+ len = GC_RMD160_DIGEST_SIZE;
+ break;
+
+ case GC_SHA1:
+ len = GC_SHA1_DIGEST_SIZE;
+ break;
+
+ default:
+ return 0;
+ }
+
+ return len;
+}
+
+void
+gc_hash_write (gc_hash_handle handle, size_t len, const char *data)
+{
+ _gc_hash_ctx *ctx = handle;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_process_bytes (data, len, &ctx->md2Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_process_bytes (data, len, &ctx->md4Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_process_bytes (data, len, &ctx->md5Context);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_process_bytes (data, len, &ctx->sha1Context);
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+const char *
+gc_hash_read (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+ const char *ret = NULL;
+
+ switch (ctx->alg)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_finish_ctx (&ctx->md2Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_finish_ctx (&ctx->md4Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_finish_ctx (&ctx->md5Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_finish_ctx (&ctx->sha1Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+ default:
+ return NULL;
+ }
+
+ return ret;
+}
+
+void
+gc_hash_close (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+
+ free (ctx);
+}
+
+Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf)
+{
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ md4_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ md5_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ sha1_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+ default:
+ return GC_INVALID_HASH;
+ }
+
+ return GC_OK;
+}
+
+#ifdef GNULIB_GC_MD2
+Gc_rc
+gc_md2 (const void *in, size_t inlen, void *resbuf)
+{
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD4
+Gc_rc
+gc_md4 (const void *in, size_t inlen, void *resbuf)
+{
+ md4_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD5
+Gc_rc
+gc_md5 (const void *in, size_t inlen, void *resbuf)
+{
+ md5_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_SHA1
+Gc_rc
+gc_sha1 (const void *in, size_t inlen, void *resbuf)
+{
+ sha1_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_MD5
+Gc_rc
+gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ hmac_md5 (key, keylen, in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_SHA1
+Gc_rc
+gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ hmac_sha1 (key, keylen, in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
diff --git a/gnulib/lib/gc-libgcrypt.c b/gnulib/lib/gc-libgcrypt.c
new file mode 100644
index 0000000..3b3facd
--- /dev/null
+++ b/gnulib/lib/gc-libgcrypt.c
@@ -0,0 +1,729 @@
+/* gc-libgcrypt.c --- Crypto wrappers around Libgcrypt for GC.
+ * Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Note: This file is only built if GC uses Libgcrypt. */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Get libgcrypt API. */
+#include <gcrypt.h>
+#ifdef GNULIB_GC_MD2
+# include "md2.h"
+#endif
+
+#include <assert.h>
+
+#ifndef MIN_GCRYPT_VERSION
+# define MIN_GCRYPT_VERSION "1.4.4"
+#endif
+
+/* Initialization. */
+
+Gc_rc
+gc_init (void)
+{
+ gcry_error_t err;
+
+ err = gcry_control (GCRYCTL_ANY_INITIALIZATION_P);
+ if (err == GPG_ERR_NO_ERROR)
+ {
+ if (gcry_control (GCRYCTL_DISABLE_SECMEM, NULL, 0))
+ return GC_INIT_ERROR;
+
+ if (gcry_check_version (MIN_GCRYPT_VERSION) == NULL)
+ return GC_INIT_ERROR;
+
+ err = gcry_control (GCRYCTL_INITIALIZATION_FINISHED, NULL, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INIT_ERROR;
+ }
+
+ return GC_OK;
+}
+
+void
+gc_done (void)
+{
+ return;
+}
+
+#ifdef GNULIB_GC_RANDOM
+
+/* Randomness. */
+
+Gc_rc
+gc_nonce (char *data, size_t datalen)
+{
+ gcry_create_nonce ((unsigned char *) data, datalen);
+ return GC_OK;
+}
+
+Gc_rc
+gc_pseudo_random (char *data, size_t datalen)
+{
+ gcry_randomize ((unsigned char *) data, datalen, GCRY_STRONG_RANDOM);
+ return GC_OK;
+}
+
+Gc_rc
+gc_random (char *data, size_t datalen)
+{
+ gcry_randomize ((unsigned char *) data, datalen, GCRY_VERY_STRONG_RANDOM);
+ return GC_OK;
+}
+
+#endif
+
+/* Memory allocation. */
+
+void
+gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc, gc_free_t func_free)
+{
+ gcry_set_allocation_handler (func_malloc, secure_malloc, secure_check,
+ func_realloc, func_free);
+}
+
+/* Ciphers. */
+
+Gc_rc
+gc_cipher_open (Gc_cipher alg, Gc_cipher_mode mode,
+ gc_cipher_handle * outhandle)
+{
+ int gcryalg, gcrymode;
+ gcry_error_t err;
+
+ switch (alg)
+ {
+ case GC_AES128:
+ gcryalg = GCRY_CIPHER_RIJNDAEL;
+ break;
+
+ case GC_AES192:
+ gcryalg = GCRY_CIPHER_RIJNDAEL;
+ break;
+
+ case GC_AES256:
+ gcryalg = GCRY_CIPHER_RIJNDAEL256;
+ break;
+
+ case GC_3DES:
+ gcryalg = GCRY_CIPHER_3DES;
+ break;
+
+ case GC_DES:
+ gcryalg = GCRY_CIPHER_DES;
+ break;
+
+ case GC_ARCFOUR128:
+ case GC_ARCFOUR40:
+ gcryalg = GCRY_CIPHER_ARCFOUR;
+ break;
+
+ case GC_ARCTWO40:
+ gcryalg = GCRY_CIPHER_RFC2268_40;
+ break;
+
+#ifdef HAVE_CAMELLIA
+ case GC_CAMELLIA128:
+ gcryalg = GCRY_CIPHER_CAMELLIA128;
+ break;
+
+ case GC_CAMELLIA256:
+ gcryalg = GCRY_CIPHER_CAMELLIA256;
+ break;
+#endif
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ switch (mode)
+ {
+ case GC_ECB:
+ gcrymode = GCRY_CIPHER_MODE_ECB;
+ break;
+
+ case GC_CBC:
+ gcrymode = GCRY_CIPHER_MODE_CBC;
+ break;
+
+ case GC_STREAM:
+ gcrymode = GCRY_CIPHER_MODE_STREAM;
+ break;
+
+ default:
+ return GC_INVALID_CIPHER;
+ }
+
+ err = gcry_cipher_open ((gcry_cipher_hd_t *) outhandle,
+ gcryalg, gcrymode, 0);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setkey (gc_cipher_handle handle, size_t keylen, const char *key)
+{
+ gcry_error_t err;
+
+ err = gcry_cipher_setkey ((gcry_cipher_hd_t) handle, key, keylen);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_setiv (gc_cipher_handle handle, size_t ivlen, const char *iv)
+{
+ gcry_error_t err;
+
+ err = gcry_cipher_setiv ((gcry_cipher_hd_t) handle, iv, ivlen);
+ if (gcry_err_code (err))
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_encrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ if (gcry_cipher_encrypt ((gcry_cipher_hd_t) handle,
+ data, len, NULL, len) != 0)
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_decrypt_inline (gc_cipher_handle handle, size_t len, char *data)
+{
+ if (gcry_cipher_decrypt ((gcry_cipher_hd_t) handle,
+ data, len, NULL, len) != 0)
+ return GC_INVALID_CIPHER;
+
+ return GC_OK;
+}
+
+Gc_rc
+gc_cipher_close (gc_cipher_handle handle)
+{
+ gcry_cipher_close (handle);
+
+ return GC_OK;
+}
+
+/* Hashes. */
+
+typedef struct _gc_hash_ctx {
+ Gc_hash alg;
+ Gc_hash_mode mode;
+ gcry_md_hd_t gch;
+#ifdef GNULIB_GC_MD2
+ char hash[GC_MD2_DIGEST_SIZE];
+ struct md2_ctx md2Context;
+#endif
+} _gc_hash_ctx;
+
+Gc_rc
+gc_hash_open (Gc_hash hash, Gc_hash_mode mode, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *ctx;
+ int gcryalg = 0, gcrymode = 0;
+ gcry_error_t err;
+ Gc_rc rc = GC_OK;
+
+ ctx = calloc (sizeof (*ctx), 1);
+ if (!ctx)
+ return GC_MALLOC_ERROR;
+
+ ctx->alg = hash;
+ ctx->mode = mode;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ gcryalg = GCRY_MD_NONE;
+ break;
+
+ case GC_MD4:
+ gcryalg = GCRY_MD_MD4;
+ break;
+
+ case GC_MD5:
+ gcryalg = GCRY_MD_MD5;
+ break;
+
+ case GC_SHA1:
+ gcryalg = GCRY_MD_SHA1;
+ break;
+
+ case GC_SHA256:
+ gcryalg = GCRY_MD_SHA256;
+ break;
+
+ case GC_SHA384:
+ gcryalg = GCRY_MD_SHA384;
+ break;
+
+ case GC_SHA512:
+ gcryalg = GCRY_MD_SHA512;
+ break;
+
+ case GC_SHA224:
+ gcryalg = GCRY_MD_SHA224;
+ break;
+
+ case GC_RMD160:
+ gcryalg = GCRY_MD_RMD160;
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ }
+
+ switch (mode)
+ {
+ case 0:
+ gcrymode = 0;
+ break;
+
+ case GC_HMAC:
+ gcrymode = GCRY_MD_FLAG_HMAC;
+ break;
+
+ default:
+ rc = GC_INVALID_HASH;
+ }
+
+ if (rc == GC_OK && gcryalg != GCRY_MD_NONE)
+ {
+ err = gcry_md_open (&ctx->gch, gcryalg, gcrymode);
+ if (gcry_err_code (err))
+ rc = GC_INVALID_HASH;
+ }
+
+ if (rc == GC_OK)
+ *outhandle = ctx;
+ else
+ free (ctx);
+
+ return rc;
+}
+
+Gc_rc
+gc_hash_clone (gc_hash_handle handle, gc_hash_handle * outhandle)
+{
+ _gc_hash_ctx *in = handle;
+ _gc_hash_ctx *out;
+ int err;
+
+ *outhandle = out = calloc (sizeof (*out), 1);
+ if (!out)
+ return GC_MALLOC_ERROR;
+
+ memcpy (out, in, sizeof (*out));
+
+ err = gcry_md_copy (&out->gch, in->gch);
+ if (err)
+ {
+ free (out);
+ return GC_INVALID_HASH;
+ }
+
+ return GC_OK;
+}
+
+size_t
+gc_hash_digest_length (Gc_hash hash)
+{
+ size_t len;
+
+ switch (hash)
+ {
+ case GC_MD2:
+ len = GC_MD2_DIGEST_SIZE;
+ break;
+
+ case GC_MD4:
+ len = GC_MD4_DIGEST_SIZE;
+ break;
+
+ case GC_MD5:
+ len = GC_MD5_DIGEST_SIZE;
+ break;
+
+ case GC_RMD160:
+ len = GC_RMD160_DIGEST_SIZE;
+ break;
+
+ case GC_SHA1:
+ len = GC_SHA1_DIGEST_SIZE;
+ break;
+
+ case GC_SHA256:
+ len = GC_SHA256_DIGEST_SIZE;
+ break;
+
+ case GC_SHA384:
+ len = GC_SHA384_DIGEST_SIZE;
+ break;
+
+ case GC_SHA512:
+ len = GC_SHA512_DIGEST_SIZE;
+ break;
+
+ case GC_SHA224:
+ len = GC_SHA224_DIGEST_SIZE;
+ break;
+
+ default:
+ return 0;
+ }
+
+ return len;
+}
+
+void
+gc_hash_hmac_setkey (gc_hash_handle handle, size_t len, const char *key)
+{
+ _gc_hash_ctx *ctx = handle;
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg != GC_MD2)
+#endif
+ gcry_md_setkey (ctx->gch, key, len);
+}
+
+void
+gc_hash_write (gc_hash_handle handle, size_t len, const char *data)
+{
+ _gc_hash_ctx *ctx = handle;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg == GC_MD2)
+ md2_process_bytes (data, len, &ctx->md2Context);
+ else
+#endif
+ gcry_md_write (ctx->gch, data, len);
+}
+
+const char *
+gc_hash_read (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+ const char *digest;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg == GC_MD2)
+ {
+ md2_finish_ctx (&ctx->md2Context, ctx->hash);
+ digest = ctx->hash;
+ }
+ else
+#endif
+ {
+ gcry_md_final (ctx->gch);
+ digest = gcry_md_read (ctx->gch, 0);
+ }
+
+ return digest;
+}
+
+void
+gc_hash_close (gc_hash_handle handle)
+{
+ _gc_hash_ctx *ctx = handle;
+
+#ifdef GNULIB_GC_MD2
+ if (ctx->alg != GC_MD2)
+#endif
+ gcry_md_close (ctx->gch);
+
+ free (ctx);
+}
+
+Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *resbuf)
+{
+ int gcryalg;
+
+ switch (hash)
+ {
+#ifdef GNULIB_GC_MD2
+ case GC_MD2:
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD4
+ case GC_MD4:
+ gcryalg = GCRY_MD_MD4;
+ break;
+#endif
+
+#ifdef GNULIB_GC_MD5
+ case GC_MD5:
+ gcryalg = GCRY_MD_MD5;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA1
+ case GC_SHA1:
+ gcryalg = GCRY_MD_SHA1;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA256
+ case GC_SHA256:
+ gcryalg = GCRY_MD_SHA256;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA384
+ case GC_SHA384:
+ gcryalg = GCRY_MD_SHA384;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA512
+ case GC_SHA512:
+ gcryalg = GCRY_MD_SHA512;
+ break;
+#endif
+
+#ifdef GNULIB_GC_SHA224
+ case GC_SHA224:
+ gcryalg = GCRY_MD_SHA224;
+ break;
+#endif
+
+#ifdef GNULIB_GC_RMD160
+ case GC_RMD160:
+ gcryalg = GCRY_MD_RMD160;
+ break;
+#endif
+
+ default:
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_hash_buffer (gcryalg, resbuf, in, inlen);
+
+ return GC_OK;
+}
+
+/* One-call interface. */
+
+#ifdef GNULIB_GC_MD2
+Gc_rc
+gc_md2 (const void *in, size_t inlen, void *resbuf)
+{
+ md2_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD4
+Gc_rc
+gc_md4 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD4);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_MD4_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_MD4, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_MD4);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_MD5
+Gc_rc
+gc_md5 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_MD5);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_MD5_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_MD5, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_MD5);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_SHA1
+Gc_rc
+gc_sha1 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_SHA1_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_SHA1, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_SHA1);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_MD5
+Gc_rc
+gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_MD5);
+ gcry_md_hd_t mdh;
+ unsigned char *hash;
+ gpg_error_t err;
+
+ assert (hlen == 16);
+
+ err = gcry_md_open (&mdh, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ err = gcry_md_setkey (mdh, key, keylen);
+ if (err != GPG_ERR_NO_ERROR)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_write (mdh, in, inlen);
+
+ hash = gcry_md_read (mdh, GCRY_MD_MD5);
+ if (hash == NULL)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, hash, hlen);
+
+ gcry_md_close (mdh);
+
+ return GC_OK;
+}
+#endif
+
+#ifdef GNULIB_GC_HMAC_SHA1
+Gc_rc
+gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf)
+{
+ size_t hlen = gcry_md_get_algo_dlen (GCRY_MD_SHA1);
+ gcry_md_hd_t mdh;
+ unsigned char *hash;
+ gpg_error_t err;
+
+ assert (hlen == GC_SHA1_DIGEST_SIZE);
+
+ err = gcry_md_open (&mdh, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ err = gcry_md_setkey (mdh, key, keylen);
+ if (err != GPG_ERR_NO_ERROR)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ gcry_md_write (mdh, in, inlen);
+
+ hash = gcry_md_read (mdh, GCRY_MD_SHA1);
+ if (hash == NULL)
+ {
+ gcry_md_close (mdh);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, hash, hlen);
+
+ gcry_md_close (mdh);
+
+ return GC_OK;
+}
+#endif
diff --git a/gnulib/lib/gc-pbkdf2-sha1.c b/gnulib/lib/gc-pbkdf2-sha1.c
new file mode 100644
index 0000000..b0b42da
--- /dev/null
+++ b/gnulib/lib/gc-pbkdf2-sha1.c
@@ -0,0 +1,103 @@
+/* gc-pbkdf2-sha1.c --- Password-Based Key Derivation Function a'la PKCS#5
+ Copyright (C) 2002-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "gc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Implement PKCS#5 PBKDF2 as per RFC 2898. The PRF to use is hard
+ coded to be HMAC-SHA1. Inputs are the password P of length PLEN,
+ the salt S of length SLEN, the iteration counter C (> 0), and the
+ desired derived output length DKLEN. Output buffer is DK which
+ must have room for at least DKLEN octets. The output buffer will
+ be filled with the derived data. */
+Gc_rc
+gc_pbkdf2_sha1 (const char *P, size_t Plen,
+ const char *S, size_t Slen,
+ unsigned int c,
+ char *DK, size_t dkLen)
+{
+ unsigned int hLen = 20;
+ char U[20];
+ char T[20];
+ unsigned int u;
+ unsigned int l;
+ unsigned int r;
+ unsigned int i;
+ unsigned int k;
+ int rc;
+ char *tmp;
+ size_t tmplen = Slen + 4;
+
+ if (c == 0)
+ return GC_PKCS5_INVALID_ITERATION_COUNT;
+
+ if (dkLen == 0)
+ return GC_PKCS5_INVALID_DERIVED_KEY_LENGTH;
+
+ if (dkLen > 4294967295U)
+ return GC_PKCS5_DERIVED_KEY_TOO_LONG;
+
+ l = ((dkLen - 1) / hLen) + 1;
+ r = dkLen - (l - 1) * hLen;
+
+ tmp = malloc (tmplen);
+ if (tmp == NULL)
+ return GC_MALLOC_ERROR;
+
+ memcpy (tmp, S, Slen);
+
+ for (i = 1; i <= l; i++)
+ {
+ memset (T, 0, hLen);
+
+ for (u = 1; u <= c; u++)
+ {
+ if (u == 1)
+ {
+ tmp[Slen + 0] = (i & 0xff000000) >> 24;
+ tmp[Slen + 1] = (i & 0x00ff0000) >> 16;
+ tmp[Slen + 2] = (i & 0x0000ff00) >> 8;
+ tmp[Slen + 3] = (i & 0x000000ff) >> 0;
+
+ rc = gc_hmac_sha1 (P, Plen, tmp, tmplen, U);
+ }
+ else
+ rc = gc_hmac_sha1 (P, Plen, U, hLen, U);
+
+ if (rc != GC_OK)
+ {
+ free (tmp);
+ return rc;
+ }
+
+ for (k = 0; k < hLen; k++)
+ T[k] ^= U[k];
+ }
+
+ memcpy (DK + (i - 1) * hLen, T, i == l ? r : hLen);
+ }
+
+ free (tmp);
+
+ return GC_OK;
+}
diff --git a/gnulib/lib/gc.h b/gnulib/lib/gc.h
new file mode 100644
index 0000000..a63ea3e
--- /dev/null
+++ b/gnulib/lib/gc.h
@@ -0,0 +1,317 @@
+/* gc.h --- Header file for implementation agnostic crypto wrapper API.
+ * Copyright (C) 2002-2005, 2007-2008, 2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+#ifndef GC_H
+# define GC_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+enum Gc_rc
+{
+ GC_OK = 0,
+ GC_MALLOC_ERROR,
+ GC_INIT_ERROR,
+ GC_RANDOM_ERROR,
+ GC_INVALID_CIPHER,
+ GC_INVALID_HASH,
+ GC_PKCS5_INVALID_ITERATION_COUNT,
+ GC_PKCS5_INVALID_DERIVED_KEY_LENGTH,
+ GC_PKCS5_DERIVED_KEY_TOO_LONG
+};
+typedef enum Gc_rc Gc_rc;
+
+/* Hash types. */
+enum Gc_hash
+{
+ GC_MD4,
+ GC_MD5,
+ GC_SHA1,
+ GC_MD2,
+ GC_RMD160,
+ GC_SHA256,
+ GC_SHA384,
+ GC_SHA512,
+ GC_SHA224
+};
+typedef enum Gc_hash Gc_hash;
+
+enum Gc_hash_mode
+{
+ GC_HMAC = 1
+};
+typedef enum Gc_hash_mode Gc_hash_mode;
+
+typedef void *gc_hash_handle;
+
+#define GC_MD2_DIGEST_SIZE 16
+#define GC_MD4_DIGEST_SIZE 16
+#define GC_MD5_DIGEST_SIZE 16
+#define GC_RMD160_DIGEST_SIZE 20
+#define GC_SHA1_DIGEST_SIZE 20
+#define GC_SHA256_DIGEST_SIZE 32
+#define GC_SHA384_DIGEST_SIZE 48
+#define GC_SHA512_DIGEST_SIZE 64
+#define GC_SHA224_DIGEST_SIZE 24
+
+/* Cipher types. */
+enum Gc_cipher
+{
+ GC_AES128,
+ GC_AES192,
+ GC_AES256,
+ GC_3DES,
+ GC_DES,
+ GC_ARCFOUR128,
+ GC_ARCFOUR40,
+ GC_ARCTWO40,
+ GC_CAMELLIA128,
+ GC_CAMELLIA256
+};
+typedef enum Gc_cipher Gc_cipher;
+
+enum Gc_cipher_mode
+{
+ GC_ECB,
+ GC_CBC,
+ GC_STREAM
+};
+typedef enum Gc_cipher_mode Gc_cipher_mode;
+
+typedef void *gc_cipher_handle;
+
+/* Call before respectively after any other functions. */
+extern Gc_rc gc_init (void);
+extern void gc_done (void);
+
+/* Memory allocation (avoid). */
+typedef void *(*gc_malloc_t) (size_t n);
+typedef int (*gc_secure_check_t) (const void *);
+typedef void *(*gc_realloc_t) (void *p, size_t n);
+typedef void (*gc_free_t) (void *);
+extern void gc_set_allocators (gc_malloc_t func_malloc,
+ gc_malloc_t secure_malloc,
+ gc_secure_check_t secure_check,
+ gc_realloc_t func_realloc,
+ gc_free_t func_free);
+
+/* Randomness. */
+extern Gc_rc gc_nonce (char *data, size_t datalen);
+extern Gc_rc gc_pseudo_random (char *data, size_t datalen);
+extern Gc_rc gc_random (char *data, size_t datalen);
+
+/* Ciphers. */
+extern Gc_rc gc_cipher_open (Gc_cipher cipher, Gc_cipher_mode mode,
+ gc_cipher_handle *outhandle);
+extern Gc_rc gc_cipher_setkey (gc_cipher_handle handle,
+ size_t keylen, const char *key);
+extern Gc_rc gc_cipher_setiv (gc_cipher_handle handle,
+ size_t ivlen, const char *iv);
+extern Gc_rc gc_cipher_encrypt_inline (gc_cipher_handle handle,
+ size_t len, char *data);
+extern Gc_rc gc_cipher_decrypt_inline (gc_cipher_handle handle,
+ size_t len, char *data);
+extern Gc_rc gc_cipher_close (gc_cipher_handle handle);
+
+/* Hashes. */
+
+extern Gc_rc gc_hash_open (Gc_hash hash, Gc_hash_mode mode,
+ gc_hash_handle *outhandle);
+extern Gc_rc gc_hash_clone (gc_hash_handle handle, gc_hash_handle *outhandle);
+extern size_t gc_hash_digest_length (Gc_hash hash);
+extern void gc_hash_hmac_setkey (gc_hash_handle handle,
+ size_t len, const char *key);
+extern void gc_hash_write (gc_hash_handle handle,
+ size_t len, const char *data);
+extern const char *gc_hash_read (gc_hash_handle handle);
+extern void gc_hash_close (gc_hash_handle handle);
+
+/* Compute a hash value over buffer IN of INLEN bytes size using the
+ algorithm HASH, placing the result in the pre-allocated buffer OUT.
+ The required size of OUT depends on HASH, and is generally
+ GC_<HASH>_DIGEST_SIZE. For example, for GC_MD5 the output buffer
+ must be 16 bytes. The return value is 0 (GC_OK) on success, or
+ another Gc_rc error code. */
+extern Gc_rc
+gc_hash_buffer (Gc_hash hash, const void *in, size_t inlen, char *out);
+
+/* One-call interface. */
+extern Gc_rc gc_md2 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf);
+extern Gc_rc gc_hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, char *resbuf);
+
+/* Derive cryptographic keys from a password P of length PLEN, with
+ salt S of length SLEN, placing the result in pre-allocated buffer
+ DK of length DKLEN. An iteration count is specified in C, where a
+ larger value means this function take more time (typical iteration
+ counts are 1000-20000). This function "stretches" the key to be
+ exactly dkLen bytes long. GC_OK is returned on success, otherwise
+ a Gc_rc error code is returned. */
+extern Gc_rc
+gc_pbkdf2_sha1 (const char *P, size_t Plen,
+ const char *S, size_t Slen,
+ unsigned int c, char *DK, size_t dkLen);
+
+/*
+ TODO:
+
+ From: Simon Josefsson <jas@extundo.com>
+ Subject: Re: generic crypto
+ Newsgroups: gmane.comp.lib.gnulib.bugs
+ Cc: bug-gnulib@gnu.org
+ Date: Fri, 07 Oct 2005 12:50:57 +0200
+ Mail-Copies-To: nobody
+
+ Paul Eggert <eggert@CS.UCLA.EDU> writes:
+
+ > Simon Josefsson <jas@extundo.com> writes:
+ >
+ >> * Perhaps the /dev/?random reading should be separated into a separate
+ >> module? It might be useful outside of the gc layer too.
+ >
+ > Absolutely. I've been meaning to do that for months (for a "shuffle"
+ > program I want to add to coreutils), but hadn't gotten around to it.
+ > It would have to be generalized a bit. I'd like to have the file
+ > descriptor cached, for example.
+
+ I'll write a separate module for that part.
+
+ I think we should even add a good PRNG that is re-seeded from
+ /dev/?random frequently. GnuTLS can need a lot of random data on a
+ big server, more than /dev/random can supply. And /dev/urandom might
+ not be strong enough. Further, the security of /dev/?random can also
+ be questionable.
+
+ >> I'm also not sure about the names of those functions, they suggest
+ >> a more higher-level API than what is really offered (i.e., the
+ >> names "nonce" and "pseudo_random" and "random" imply certain
+ >> cryptographic properties).
+ >
+ > Could you expand a bit more on that? What is the relationship between
+ > nonce/pseudorandom/random and the /dev/ values you are using?
+
+ There is none, that is the problem.
+
+ Applications generally need different kind of "random" numbers.
+ Sometimes they just need some random data and doesn't care whether it
+ is possible for an attacker to compute the string (aka a "nonce").
+ Sometimes they need data that is very difficult to compute (i.e.,
+ computing it require inverting SHA1 or similar). Sometimes they need
+ data that is not possible to compute, i.e., it wants real entropy
+ collected over time on the system. Collecting the last kind of random
+ data is very expensive, so it must not be used too often. The second
+ kind of random data ("pseudo random") is typically generated by
+ seeding a good PRNG with a couple of hundred bytes of real entropy
+ from the "real random" data pool. The "nonce" is usually computed
+ using the PRNG as well, because PRNGs are usually fast.
+
+ Pseudo-random data is typically used for session keys. Strong random
+ data is often used to generate long-term keys (e.g., private RSA
+ keys).
+
+ Of course, there are many subtleties. There are several different
+ kind of nonce:s. Sometimes a nonce is just an ever-increasing
+ integer, starting from 0. Sometimes it is assumed to be unlikely to
+ be the same as previous nonces, but without a requirement that the
+ nonce is possible to guess. MD5(system clock) would thus suffice, if
+ it isn't called too often. You can guess what the next value will be,
+ but it will always be different.
+
+ The problem is that /dev/?random doesn't offer any kind of semantic
+ guarantees. But applications need an API that make that promise.
+
+ I think we should do this in several steps:
+
+ 1) Write a module that can read from /dev/?random.
+
+ 2) Add a module for a known-good PRNG suitable for random number
+ generation, that can be continuously re-seeded.
+
+ 3) Add a high-level module that provide various different randomness
+ functions. One for nonces, perhaps even different kind of nonces,
+ one for pseudo random data, and one for strong random data. It is
+ not clear whether we can hope to achieve the last one in a portable
+ way.
+
+ Further, it would be useful to allow users to provide their own
+ entropy source as a file, used to seed the PRNG or initialize the
+ strong randomness pool. This is used on embedded platforms that
+ doesn't have enough interrupts to hope to generate good random data.
+
+ > For example, why not use OpenBSD's /dev/arandom?
+
+ I don't trust ARC4. For example, recent cryptographic efforts
+ indicate that you must throw away the first 512 bytes generated from
+ the PRNG for it to be secure. I don't know whether OpenBSD do this.
+ Further, I recall some eprint paper on RC4 security that didn't
+ inspire confidence.
+
+ While I trust the random devices in OpenBSD more than
+ Solaris/AIX/HPUX/etc, I think that since we need something better on
+ Solaris/AIX/HPUX we'd might as well use it on OpenBSD or even Linux
+ too.
+
+ > Here is one thought. The user could specify a desired quality level
+ > range, and the implementation then would supply random data that is at
+ > least as good as the lower bound of the range. I.e., ihe
+ > implementation refuses to produce any random data if it can't generate
+ > data that is at least as good as the lower end of the range. The
+ > upper bound of the range is advice from the user not to be any more
+ > expensive than that, but the implementation can ignore the advice if
+ > it doesn't have anything cheaper.
+
+ I'm not sure this is a good idea. Users can't really be expected to
+ understand this. Further, applications need many different kind of
+ random data. Selecting the randomness level for each by the user will
+ be too complicated.
+
+ I think it is better if the application decide, from its cryptographic
+ requirement, what entropy quality it require, and call the proper API.
+ Meeting the implied semantic properties should be the job for gnulib.
+
+ >> Perhaps gc_dev_random and gc_dev_urandom?
+ >
+ > To some extent. I'd rather insulate the user from the details of
+ > where the random numbers come from. On the other hand we need to
+ > provide a way for applications to specify a file that contains
+ > random bits, so that people can override the defaults.
+
+ Agreed.
+
+ This may require some thinking before it is finalized. Is it ok to
+ install the GC module as-is meanwhile? Then I can continue to add the
+ stuff that GnuTLS need, and then come back to re-working the
+ randomness module. That way, we have two different projects that use
+ the code. GnuTLS includes the same randomness code that was in GNU
+ SASL and that is in the current gc module. I feel much more
+ comfortable working in small steps at a time, rather then working on
+ this for a long time in gnulib and only later integrate the stuff in
+ GnuTLS.
+
+ Thanks,
+ Simon
+ */
+
+#endif /* GC_H */
diff --git a/gnulib/lib/gcd.c b/gnulib/lib/gcd.c
new file mode 100644
index 0000000..50c60df
--- /dev/null
+++ b/gnulib/lib/gcd.c
@@ -0,0 +1,87 @@
+/* Arithmetic.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* This file can also be used to define gcd functions for other unsigned
+ types, such as 'unsigned long long' or 'uintmax_t'. */
+#ifndef WORD_T
+/* Specification. */
+# include "gcd.h"
+# define WORD_T unsigned long
+# define GCD gcd
+#endif
+
+#include <stdlib.h>
+
+/* Return the greatest common divisor of a > 0 and b > 0. */
+WORD_T
+GCD (WORD_T a, WORD_T b)
+{
+ /* Why no division, as in Euclid's algorithm? Because in Euclid's algorithm
+ the division result floor(a/b) or floor(b/a) is very often = 1 or = 2,
+ and nearly always < 8. A sequence of a few subtractions and tests is
+ faster than a division. */
+ /* Why not Euclid's algorithm? Because the two integers can be shifted by 1
+ bit in a single instruction, and the algorithm uses fewer variables than
+ Euclid's algorithm. */
+
+ WORD_T c = a | b;
+ c = c ^ (c - 1);
+ /* c = largest power of 2 that divides a and b. */
+
+ if (a & c)
+ {
+ if (b & c)
+ goto odd_odd;
+ else
+ goto odd_even;
+ }
+ else
+ {
+ if (b & c)
+ goto even_odd;
+ else
+ abort ();
+ }
+
+ for (;;)
+ {
+ odd_odd: /* a/c and b/c both odd */
+ if (a == b)
+ break;
+ if (a > b)
+ {
+ a = a - b;
+ even_odd: /* a/c even, b/c odd */
+ do
+ a = a >> 1;
+ while ((a & c) == 0);
+ }
+ else
+ {
+ b = b - a;
+ odd_even: /* a/c odd, b/c even */
+ do
+ b = b >> 1;
+ while ((b & c) == 0);
+ }
+ }
+
+ /* a = b */
+ return a;
+}
diff --git a/gnulib/lib/gcd.h b/gnulib/lib/gcd.h
new file mode 100644
index 0000000..597b77a
--- /dev/null
+++ b/gnulib/lib/gcd.h
@@ -0,0 +1,34 @@
+/* Arithmetic.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GCD_H
+#define _GCD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the greatest common divisor of a > 0 and b > 0. */
+extern unsigned long gcd (unsigned long a, unsigned long b);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GCD_H */
diff --git a/gnulib/lib/gen-uni-tables.c b/gnulib/lib/gen-uni-tables.c
new file mode 100644
index 0000000..0eddbb1
--- /dev/null
+++ b/gnulib/lib/gen-uni-tables.c
@@ -0,0 +1,9780 @@
+/* Generate Unicode conforming character classification tables and
+ line break properties tables and word break property tables and
+ decomposition/composition and case mapping tables from a UnicodeData file.
+ Copyright (C) 2000-2002, 2004, 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Usage example:
+ $ gen-uni-tables /usr/local/share/Unidata/UnicodeData.txt \
+ /usr/local/share/Unidata/PropList.txt \
+ /usr/local/share/Unidata/DerivedCoreProperties.txt \
+ /usr/local/share/Unidata/ArabicShaping.txt \
+ /usr/local/share/Unidata/Scripts.txt \
+ /usr/local/share/Unidata/Blocks.txt \
+ /usr/local/share/Unidata/PropList-3.0.1.txt \
+ /usr/local/share/Unidata/EastAsianWidth.txt \
+ /usr/local/share/Unidata/LineBreak.txt \
+ /usr/local/share/Unidata/WordBreakProperty.txt \
+ /usr/local/share/Unidata/GraphemeBreakProperty.txt \
+ /usr/local/share/Unidata/CompositionExclusions.txt \
+ /usr/local/share/Unidata/SpecialCasing.txt \
+ /usr/local/share/Unidata/CaseFolding.txt \
+ 6.0.0
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/* ========================================================================= */
+
+/* Reading UnicodeData.txt. */
+/* See UCD.html. */
+
+/* This structure represents one line in the UnicodeData.txt file. */
+struct unicode_attribute
+{
+ const char *name; /* Character name */
+ const char *category; /* General category */
+ const char *combining; /* Canonical combining class */
+ const char *bidi; /* Bidirectional category */
+ const char *decomposition; /* Character decomposition mapping */
+ const char *decdigit; /* Decimal digit value */
+ const char *digit; /* Digit value */
+ const char *numeric; /* Numeric value */
+ bool mirrored; /* mirrored */
+ const char *oldname; /* Old Unicode 1.0 name */
+ const char *comment; /* Comment */
+ unsigned int upper; /* Uppercase mapping */
+ unsigned int lower; /* Lowercase mapping */
+ unsigned int title; /* Titlecase mapping */
+};
+
+/* Missing fields are represented with "" for strings, and NONE for
+ characters. */
+#define NONE (~(unsigned int)0)
+
+/* The entire contents of the UnicodeData.txt file. */
+struct unicode_attribute unicode_attributes [0x110000];
+
+/* Stores in unicode_attributes[i] the values from the given fields. */
+static void
+fill_attribute (unsigned int i,
+ const char *field1, const char *field2,
+ const char *field3, const char *field4,
+ const char *field5, const char *field6,
+ const char *field7, const char *field8,
+ const char *field9, const char *field10,
+ const char *field11, const char *field12,
+ const char *field13, const char *field14)
+{
+ struct unicode_attribute * uni;
+
+ if (i >= 0x110000)
+ {
+ fprintf (stderr, "index too large\n");
+ exit (1);
+ }
+ if (strcmp (field2, "Cs") == 0)
+ /* Surrogates are UTF-16 artefacts, not real characters. Ignore them. */
+ return;
+ uni = &unicode_attributes[i];
+ /* Copy the strings. */
+ uni->name = strdup (field1);
+ uni->category = (field2[0] == '\0' ? "" : strdup (field2));
+ uni->combining = (field3[0] == '\0' ? "" : strdup (field3));
+ uni->bidi = (field4[0] == '\0' ? "" : strdup (field4));
+ uni->decomposition = (field5[0] == '\0' ? "" : strdup (field5));
+ uni->decdigit = (field6[0] == '\0' ? "" : strdup (field6));
+ uni->digit = (field7[0] == '\0' ? "" : strdup (field7));
+ uni->numeric = (field8[0] == '\0' ? "" : strdup (field8));
+ uni->mirrored = (field9[0] == 'Y');
+ uni->oldname = (field10[0] == '\0' ? "" : strdup (field10));
+ uni->comment = (field11[0] == '\0' ? "" : strdup (field11));
+ uni->upper = (field12[0] =='\0' ? NONE : strtoul (field12, NULL, 16));
+ uni->lower = (field13[0] =='\0' ? NONE : strtoul (field13, NULL, 16));
+ uni->title = (field14[0] =='\0' ? NONE : strtoul (field14, NULL, 16));
+}
+
+/* Maximum length of a field in the UnicodeData.txt file. */
+#define FIELDLEN 120
+
+/* Reads the next field from STREAM. The buffer BUFFER has size FIELDLEN.
+ Reads up to (but excluding) DELIM.
+ Returns 1 when a field was successfully read, otherwise 0. */
+static int
+getfield (FILE *stream, char *buffer, int delim)
+{
+ int count = 0;
+ int c;
+
+ for (; (c = getc (stream)), (c != EOF && c != delim); )
+ {
+ /* The original unicode.org UnicodeData.txt file happens to have
+ CR/LF line terminators. Silently convert to LF. */
+ if (c == '\r')
+ continue;
+
+ /* Put c into the buffer. */
+ if (++count >= FIELDLEN - 1)
+ {
+ fprintf (stderr, "field longer than expected, increase FIELDLEN\n");
+ exit (1);
+ }
+ *buffer++ = c;
+ }
+
+ if (c == EOF)
+ return 0;
+
+ *buffer = '\0';
+ return 1;
+}
+
+/* Stores in unicode_attributes[] the entire contents of the UnicodeData.txt
+ file. */
+static void
+fill_attributes (const char *unicodedata_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ char field3[FIELDLEN];
+ char field4[FIELDLEN];
+ char field5[FIELDLEN];
+ char field6[FIELDLEN];
+ char field7[FIELDLEN];
+ char field8[FIELDLEN];
+ char field9[FIELDLEN];
+ char field10[FIELDLEN];
+ char field11[FIELDLEN];
+ char field12[FIELDLEN];
+ char field13[FIELDLEN];
+ char field14[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_attributes[i].name = NULL;
+
+ stream = fopen (unicodedata_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", unicodedata_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+
+ lineno++;
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ';');
+ n += getfield (stream, field2, ';');
+ n += getfield (stream, field3, ';');
+ n += getfield (stream, field4, ';');
+ n += getfield (stream, field5, ';');
+ n += getfield (stream, field6, ';');
+ n += getfield (stream, field7, ';');
+ n += getfield (stream, field8, ';');
+ n += getfield (stream, field9, ';');
+ n += getfield (stream, field10, ';');
+ n += getfield (stream, field11, ';');
+ n += getfield (stream, field12, ';');
+ n += getfield (stream, field13, ';');
+ n += getfield (stream, field14, '\n');
+ if (n == 0)
+ break;
+ if (n != 15)
+ {
+ fprintf (stderr, "short line in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (field1[0] == '<'
+ && strlen (field1) >= 9
+ && strcmp (field1 + strlen (field1) - 8, ", First>") == 0)
+ {
+ /* Deal with a range. */
+ lineno++;
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ';');
+ n += getfield (stream, field2, ';');
+ n += getfield (stream, field3, ';');
+ n += getfield (stream, field4, ';');
+ n += getfield (stream, field5, ';');
+ n += getfield (stream, field6, ';');
+ n += getfield (stream, field7, ';');
+ n += getfield (stream, field8, ';');
+ n += getfield (stream, field9, ';');
+ n += getfield (stream, field10, ';');
+ n += getfield (stream, field11, ';');
+ n += getfield (stream, field12, ';');
+ n += getfield (stream, field13, ';');
+ n += getfield (stream, field14, '\n');
+ if (n != 15)
+ {
+ fprintf (stderr, "missing end range in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ if (!(field1[0] == '<'
+ && strlen (field1) >= 8
+ && strcmp (field1 + strlen (field1) - 7, ", Last>") == 0))
+ {
+ fprintf (stderr, "missing end range in '%s':%d\n",
+ unicodedata_filename, lineno);
+ exit (1);
+ }
+ field1[strlen (field1) - 7] = '\0';
+ j = strtoul (field0, NULL, 16);
+ for (; i <= j; i++)
+ fill_attribute (i, field1+1, field2, field3, field4, field5,
+ field6, field7, field8, field9, field10,
+ field11, field12, field13, field14);
+ }
+ else
+ {
+ /* Single character line */
+ fill_attribute (i, field1, field2, field3, field4, field5,
+ field6, field7, field8, field9, field10,
+ field11, field12, field13, field14);
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", unicodedata_filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* General category. */
+/* See Unicode 3.0 book, section 4.5,
+ UCD.html. */
+
+static bool
+is_category_L (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L');
+}
+
+static bool
+is_category_LC (unsigned int ch)
+{
+ /* See PropertyValueAliases.txt. */
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && (unicode_attributes[ch].category[1] == 'u'
+ || unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 't'));
+}
+
+static bool
+is_category_Lu (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'u');
+}
+
+static bool
+is_category_Ll (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_Lt (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 't');
+}
+
+static bool
+is_category_Lm (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'm');
+}
+
+static bool
+is_category_Lo (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'L'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_M (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M');
+}
+
+static bool
+is_category_Mn (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'n');
+}
+
+static bool
+is_category_Mc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Me (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && unicode_attributes[ch].category[1] == 'e');
+}
+
+static bool
+is_category_N (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N');
+}
+
+static bool
+is_category_Nd (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd');
+}
+
+static bool
+is_category_Nl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_No (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_P (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P');
+}
+
+static bool
+is_category_Pc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Pd (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'd');
+}
+
+static bool
+is_category_Ps (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 's');
+}
+
+static bool
+is_category_Pe (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'e');
+}
+
+static bool
+is_category_Pi (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'i');
+}
+
+static bool
+is_category_Pf (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'f');
+}
+
+static bool
+is_category_Po (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_S (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S');
+}
+
+static bool
+is_category_Sm (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'm');
+}
+
+static bool
+is_category_Sc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Sk (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'k');
+}
+
+static bool
+is_category_So (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_Z (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z');
+}
+
+static bool
+is_category_Zs (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 's');
+}
+
+static bool
+is_category_Zl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 'l');
+}
+
+static bool
+is_category_Zp (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 'p');
+}
+
+static bool
+is_category_C (unsigned int ch)
+{
+ return (unicode_attributes[ch].name == NULL
+ || unicode_attributes[ch].category[0] == 'C');
+}
+
+static bool
+is_category_Cc (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'c');
+}
+
+static bool
+is_category_Cf (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'f');
+}
+
+static bool
+is_category_Cs (unsigned int ch)
+{
+ return (ch >= 0xd800 && ch < 0xe000);
+}
+
+static bool
+is_category_Co (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'o');
+}
+
+static bool
+is_category_Cn (unsigned int ch)
+{
+ return (unicode_attributes[ch].name == NULL
+ && !(ch >= 0xd800 && ch < 0xe000));
+}
+
+/* Output a boolean property in a human readable format. */
+static void
+debug_output_predicate (const char *filename, bool (*predicate) (unsigned int))
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+#if 0 /* This yields huge text output. */
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ fprintf (stream, "0x%04X\n", ch);
+ }
+#else
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ unsigned int first = ch;
+ unsigned int last;
+
+ while (ch + 1 < 0x110000 && predicate (ch + 1))
+ ch++;
+ last = ch;
+ if (first < last)
+ fprintf (stream, "0x%04X..0x%04X\n", first, last);
+ else
+ fprintf (stream, "0x%04X\n", ch);
+ }
+#endif
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the unit test for a boolean property. */
+static void
+output_predicate_test (const char *filename, bool (*predicate) (unsigned int), const char *expression)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Test the Unicode character type functions.\n");
+ fprintf (stream, " Copyright (C) 2007 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "#include \"test-predicate-part1.h\"\n");
+ fprintf (stream, "\n");
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ {
+ unsigned int first = ch;
+ unsigned int last;
+
+ while (ch + 1 < 0x110000 && predicate (ch + 1))
+ ch++;
+ last = ch;
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, 0x%04X }", first, last);
+ need_comma = true;
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ fprintf (stream, "\n");
+ fprintf (stream, "#define PREDICATE(c) %s\n", expression);
+ fprintf (stream, "#include \"test-predicate-part2.h\"\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE predicate_table
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3levelbit.h"
+
+/* Output a boolean property in a three-level bitmap. */
+static void
+output_predicate (const char *filename, bool (*predicate) (unsigned int), const char *name, const char *comment, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct predicate_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* %s of Unicode characters. */\n", comment);
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 4; /* or: 5 */
+ t.q = 7; /* or: 6 */
+ predicate_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ if (predicate (ch))
+ predicate_table_add (&t, ch);
+
+ predicate_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ if (i != 1)
+ fprintf (stream, "#define header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int header[1];\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " /*unsigned*/ int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "%s =\n", name);
+ fprintf (stream, "{\n");
+ fprintf (stream, " { %d },\n", ((uint32_t *) t.result)[1]);
+ fprintf (stream, " {");
+ if (t.level1_size > 1)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 1) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu * sizeof (int) / sizeof (short) + %5zu",
+ 1 + t.level1_size, (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 1)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 1)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 1) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu + %5zu * sizeof (short) / sizeof (int) + %5zu",
+ 1 + t.level1_size, t.level2_size << t.q, (offset - level3_offset) / sizeof (uint32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 1)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 4) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%08X",
+ ((uint32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output all categories. */
+static void
+output_categories (const char *version)
+{
+#define CATEGORY(C) \
+ debug_output_predicate ("unictype/categ_" #C ".txt", is_category_ ## C); \
+ output_predicate_test ("../tests/unictype/test-categ_" #C ".c", is_category_ ## C, "uc_is_general_category (c, UC_CATEGORY_" #C ")"); \
+ output_predicate ("unictype/categ_" #C ".h", is_category_ ## C, "u_categ_" #C, "Categories", version);
+ CATEGORY (L)
+ CATEGORY (LC)
+ CATEGORY (Lu)
+ CATEGORY (Ll)
+ CATEGORY (Lt)
+ CATEGORY (Lm)
+ CATEGORY (Lo)
+ CATEGORY (M)
+ CATEGORY (Mn)
+ CATEGORY (Mc)
+ CATEGORY (Me)
+ CATEGORY (N)
+ CATEGORY (Nd)
+ CATEGORY (Nl)
+ CATEGORY (No)
+ CATEGORY (P)
+ CATEGORY (Pc)
+ CATEGORY (Pd)
+ CATEGORY (Ps)
+ CATEGORY (Pe)
+ CATEGORY (Pi)
+ CATEGORY (Pf)
+ CATEGORY (Po)
+ CATEGORY (S)
+ CATEGORY (Sm)
+ CATEGORY (Sc)
+ CATEGORY (Sk)
+ CATEGORY (So)
+ CATEGORY (Z)
+ CATEGORY (Zs)
+ CATEGORY (Zl)
+ CATEGORY (Zp)
+ CATEGORY (C)
+ CATEGORY (Cc)
+ CATEGORY (Cf)
+ CATEGORY (Cs)
+ CATEGORY (Co)
+ CATEGORY (Cn)
+#undef CATEGORY
+}
+
+enum
+{
+ UC_CATEGORY_MASK_L = 0x0000001f,
+ UC_CATEGORY_MASK_LC = 0x00000007,
+ UC_CATEGORY_MASK_Lu = 0x00000001,
+ UC_CATEGORY_MASK_Ll = 0x00000002,
+ UC_CATEGORY_MASK_Lt = 0x00000004,
+ UC_CATEGORY_MASK_Lm = 0x00000008,
+ UC_CATEGORY_MASK_Lo = 0x00000010,
+ UC_CATEGORY_MASK_M = 0x000000e0,
+ UC_CATEGORY_MASK_Mn = 0x00000020,
+ UC_CATEGORY_MASK_Mc = 0x00000040,
+ UC_CATEGORY_MASK_Me = 0x00000080,
+ UC_CATEGORY_MASK_N = 0x00000700,
+ UC_CATEGORY_MASK_Nd = 0x00000100,
+ UC_CATEGORY_MASK_Nl = 0x00000200,
+ UC_CATEGORY_MASK_No = 0x00000400,
+ UC_CATEGORY_MASK_P = 0x0003f800,
+ UC_CATEGORY_MASK_Pc = 0x00000800,
+ UC_CATEGORY_MASK_Pd = 0x00001000,
+ UC_CATEGORY_MASK_Ps = 0x00002000,
+ UC_CATEGORY_MASK_Pe = 0x00004000,
+ UC_CATEGORY_MASK_Pi = 0x00008000,
+ UC_CATEGORY_MASK_Pf = 0x00010000,
+ UC_CATEGORY_MASK_Po = 0x00020000,
+ UC_CATEGORY_MASK_S = 0x003c0000,
+ UC_CATEGORY_MASK_Sm = 0x00040000,
+ UC_CATEGORY_MASK_Sc = 0x00080000,
+ UC_CATEGORY_MASK_Sk = 0x00100000,
+ UC_CATEGORY_MASK_So = 0x00200000,
+ UC_CATEGORY_MASK_Z = 0x01c00000,
+ UC_CATEGORY_MASK_Zs = 0x00400000,
+ UC_CATEGORY_MASK_Zl = 0x00800000,
+ UC_CATEGORY_MASK_Zp = 0x01000000,
+ UC_CATEGORY_MASK_C = 0x3e000000,
+ UC_CATEGORY_MASK_Cc = 0x02000000,
+ UC_CATEGORY_MASK_Cf = 0x04000000,
+ UC_CATEGORY_MASK_Cs = 0x08000000,
+ UC_CATEGORY_MASK_Co = 0x10000000,
+ UC_CATEGORY_MASK_Cn = 0x20000000
+};
+
+static int
+general_category_byname (const char *category_name)
+{
+ if (category_name[0] != '\0'
+ && (category_name[1] == '\0' || category_name[2] == '\0'))
+ switch (category_name[0])
+ {
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_L;
+ case 'C': return UC_CATEGORY_MASK_LC;
+ case 'u': return UC_CATEGORY_MASK_Lu;
+ case 'l': return UC_CATEGORY_MASK_Ll;
+ case 't': return UC_CATEGORY_MASK_Lt;
+ case 'm': return UC_CATEGORY_MASK_Lm;
+ case 'o': return UC_CATEGORY_MASK_Lo;
+ }
+ break;
+ case 'M':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_M;
+ case 'n': return UC_CATEGORY_MASK_Mn;
+ case 'c': return UC_CATEGORY_MASK_Mc;
+ case 'e': return UC_CATEGORY_MASK_Me;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_N;
+ case 'd': return UC_CATEGORY_MASK_Nd;
+ case 'l': return UC_CATEGORY_MASK_Nl;
+ case 'o': return UC_CATEGORY_MASK_No;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_P;
+ case 'c': return UC_CATEGORY_MASK_Pc;
+ case 'd': return UC_CATEGORY_MASK_Pd;
+ case 's': return UC_CATEGORY_MASK_Ps;
+ case 'e': return UC_CATEGORY_MASK_Pe;
+ case 'i': return UC_CATEGORY_MASK_Pi;
+ case 'f': return UC_CATEGORY_MASK_Pf;
+ case 'o': return UC_CATEGORY_MASK_Po;
+ }
+ break;
+ case 'S':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_S;
+ case 'm': return UC_CATEGORY_MASK_Sm;
+ case 'c': return UC_CATEGORY_MASK_Sc;
+ case 'k': return UC_CATEGORY_MASK_Sk;
+ case 'o': return UC_CATEGORY_MASK_So;
+ }
+ break;
+ case 'Z':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_Z;
+ case 's': return UC_CATEGORY_MASK_Zs;
+ case 'l': return UC_CATEGORY_MASK_Zl;
+ case 'p': return UC_CATEGORY_MASK_Zp;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case '\0': return UC_CATEGORY_MASK_C;
+ case 'c': return UC_CATEGORY_MASK_Cc;
+ case 'f': return UC_CATEGORY_MASK_Cf;
+ case 's': return UC_CATEGORY_MASK_Cs;
+ case 'o': return UC_CATEGORY_MASK_Co;
+ case 'n': return UC_CATEGORY_MASK_Cn;
+ }
+ break;
+ }
+ /* Invalid category name. */
+ abort ();
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE category_table
+#define ELEMENT uint8_t
+#define DEFAULT 29 /* = log2(UC_CATEGORY_MASK_Cn) */
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character category table. */
+static void
+output_category (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct category_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Categories of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ category_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value;
+ unsigned int log2_value;
+
+ if (is_category_Cs (ch))
+ value = UC_CATEGORY_MASK_Cs;
+ else if (unicode_attributes[ch].name != NULL)
+ value = general_category_byname (unicode_attributes[ch].category);
+ else
+ continue;
+
+ /* Now value should contain exactly one bit. */
+ if (value == 0 || ((value & (value - 1)) != 0))
+ abort ();
+
+ for (log2_value = 0; value > 1; value >>= 1, log2_value++);
+
+ category_table_add (&t, ch, log2_value);
+ }
+
+ category_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define category_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 5 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_category =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 5 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 5 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 5) / 16;
+ unsigned int k = (i * 5) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 5 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 5 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Canonical combining class. */
+/* See Unicode 3.0 book, section 4.2,
+ UCD.html. */
+
+/* Construction of sparse 3-level tables. */
+#define TABLE combclass_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character combining class table. */
+static void
+output_combclass (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct combclass_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Combining class of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ combclass_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ if (unicode_attributes[ch].name != NULL)
+ {
+ int value = atoi (unicode_attributes[ch].combining);
+ if (!(value >= 0 && value <= 255))
+ abort ();
+ combclass_table_add (&t, ch, value);
+ }
+
+ combclass_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define combclass_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_combclass =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %3d", ((uint8_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Bidirectional category. */
+/* See Unicode 3.0 book, section 4.3,
+ UCD.html. */
+
+enum
+{
+ UC_BIDI_L, /* Left-to-Right */
+ UC_BIDI_LRE, /* Left-to-Right Embedding */
+ UC_BIDI_LRO, /* Left-to-Right Override */
+ UC_BIDI_R, /* Right-to-Left */
+ UC_BIDI_AL, /* Right-to-Left Arabic */
+ UC_BIDI_RLE, /* Right-to-Left Embedding */
+ UC_BIDI_RLO, /* Right-to-Left Override */
+ UC_BIDI_PDF, /* Pop Directional Format */
+ UC_BIDI_EN, /* European Number */
+ UC_BIDI_ES, /* European Number Separator */
+ UC_BIDI_ET, /* European Number Terminator */
+ UC_BIDI_AN, /* Arabic Number */
+ UC_BIDI_CS, /* Common Number Separator */
+ UC_BIDI_NSM, /* Non-Spacing Mark */
+ UC_BIDI_BN, /* Boundary Neutral */
+ UC_BIDI_B, /* Paragraph Separator */
+ UC_BIDI_S, /* Segment Separator */
+ UC_BIDI_WS, /* Whitespace */
+ UC_BIDI_ON /* Other Neutral */
+};
+
+static int
+bidi_category_byname (const char *category_name)
+{
+ switch (category_name[0])
+ {
+ case 'A':
+ switch (category_name[1])
+ {
+ case 'L':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AL;
+ break;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_AN;
+ break;
+ }
+ break;
+ case 'B':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_B;
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_BN;
+ break;
+ }
+ break;
+ case 'C':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_CS;
+ break;
+ }
+ break;
+ case 'E':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_EN;
+ break;
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ES;
+ break;
+ case 'T':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ET;
+ break;
+ }
+ break;
+ case 'L':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_L;
+ case 'R':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_LRO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'N':
+ switch (category_name[1])
+ {
+ case 'S':
+ switch (category_name[2])
+ {
+ case 'M':
+ if (category_name[3] == '\0')
+ return UC_BIDI_NSM;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'O':
+ switch (category_name[1])
+ {
+ case 'N':
+ if (category_name[2] == '\0')
+ return UC_BIDI_ON;
+ break;
+ }
+ break;
+ case 'P':
+ switch (category_name[1])
+ {
+ case 'D':
+ switch (category_name[2])
+ {
+ case 'F':
+ if (category_name[3] == '\0')
+ return UC_BIDI_PDF;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'R':
+ switch (category_name[1])
+ {
+ case '\0':
+ return UC_BIDI_R;
+ case 'L':
+ switch (category_name[2])
+ {
+ case 'E':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLE;
+ break;
+ case 'O':
+ if (category_name[3] == '\0')
+ return UC_BIDI_RLO;
+ break;
+ }
+ break;
+ }
+ break;
+ case 'S':
+ if (category_name[1] == '\0')
+ return UC_BIDI_S;
+ break;
+ case 'W':
+ switch (category_name[1])
+ {
+ case 'S':
+ if (category_name[2] == '\0')
+ return UC_BIDI_WS;
+ break;
+ }
+ break;
+ }
+ /* Invalid bidi category name. */
+ abort ();
+}
+
+static int
+get_bidi_category (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL)
+ return bidi_category_byname (unicode_attributes[ch].bidi);
+ else
+ {
+ /* The bidi category of unassigned characters depends on the range.
+ See UTR #9 and DerivedBidiClass.txt. */
+ if ((ch >= 0x0590 && ch <= 0x05FF)
+ || (ch >= 0x07FB && ch <= 0x08FF)
+ || (ch >= 0xFB37 && ch <= 0xFB45)
+ || (ch >= 0x10800 && ch <= 0x10FFF))
+ return UC_BIDI_R;
+ else if ((ch >= 0x0600 && ch <= 0x07BF)
+ || (ch >= 0x2064 && ch <= 0x2069)
+ || (ch >= 0xFBB2 && ch <= 0xFDCF)
+ || (ch >= 0xFDFE && ch <= 0xFEFE))
+ return UC_BIDI_AL;
+ else if ((ch >= 0xFDD0 && ch <= 0xFDEF)
+ || (ch >= 0xFFF0 && ch <= 0xFFFF)
+ || (ch & 0xFFFF) == 0xFFFE
+ || (ch & 0xFFFF) == 0xFFFF
+ || (ch >= 0xE0000 && ch <= 0xE0FFF))
+ return UC_BIDI_BN;
+ else
+ return UC_BIDI_L;
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE bidi_category_table
+#define ELEMENT uint8_t
+#define DEFAULT UC_BIDI_L
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character bidi category table. */
+static void
+output_bidi_category (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct bidi_category_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Bidi categories of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ bidi_category_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_bidi_category (ch);
+
+ bidi_category_table_add (&t, ch, value);
+ }
+
+ bidi_category_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define bidi_category_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 5 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_bidi_category =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 5 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 5 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 5) / 16;
+ unsigned int k = (i * 5) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 5 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 5 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 5 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Decimal digit value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+static int
+get_decdigit_value (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].decdigit[0] != '\0')
+ return atoi (unicode_attributes[ch].decdigit);
+ return -1;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE decdigit_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the unit test for the per-character decimal digit value table. */
+static void
+output_decimal_digit_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decimal digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_decdigit_value (ch);
+
+ if (!(value >= -1 && value < 10))
+ abort ();
+
+ if (value >= 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the per-character decimal digit value table. */
+static void
+output_decimal_digit (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct decdigit_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decimal digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ decdigit_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = 1 + get_decdigit_value (ch);
+
+ if (!(value >= 0 && value <= 10))
+ abort ();
+
+ decdigit_table_add (&t, ch, value);
+ }
+
+ decdigit_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define decdigit_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size,
+ t.p - 1);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_decdigit =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 4 bits only. */
+ fprintf (stream, " {");
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << (t.p - 1); i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x",
+ ((uint8_t *) (t.result + level3_offset))[2*i]
+ + (((uint8_t *) (t.result + level3_offset))[2*i+1] << 4));
+ if (i+1 < t.level3_size << (t.p - 1))
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Digit value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+static int
+get_digit_value (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].digit[0] != '\0')
+ return atoi (unicode_attributes[ch].digit);
+ return -1;
+}
+
+/* Output the unit test for the per-character digit value table. */
+static void
+output_digit_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_digit_value (ch);
+
+ if (!(value >= -1 && value < 10))
+ abort ();
+
+ if (value >= 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the per-character digit value table. */
+static void
+output_digit (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct decdigit_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Digit values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ decdigit_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = 1 + get_digit_value (ch);
+
+ if (!(value >= 0 && value <= 10))
+ abort ();
+
+ decdigit_table_add (&t, ch, value);
+ }
+
+ decdigit_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define digit_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size,
+ t.p - 1);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_digit =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 4 bits only. */
+ fprintf (stream, " {");
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << (t.p - 1); i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x",
+ ((uint8_t *) (t.result + level3_offset))[2*i]
+ + (((uint8_t *) (t.result + level3_offset))[2*i+1] << 4));
+ if (i+1 < t.level3_size << (t.p - 1))
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << (t.p - 1) > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Numeric value. */
+/* See Unicode 3.0 book, section 4.6. */
+
+typedef struct { int numerator; int denominator; } uc_fraction_t;
+
+static uc_fraction_t
+get_numeric_value (unsigned int ch)
+{
+ uc_fraction_t value;
+
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].numeric[0] != '\0')
+ {
+ const char *str = unicode_attributes[ch].numeric;
+ /* str is of the form "integer" or "integer/posinteger". */
+ value.numerator = atoi (str);
+ if (strchr (str, '/') != NULL)
+ value.denominator = atoi (strchr (str, '/') + 1);
+ else
+ value.denominator = 1;
+ }
+ else
+ {
+ value.numerator = 0;
+ value.denominator = 0;
+ }
+ return value;
+}
+
+/* Output the unit test for the per-character numeric value table. */
+static void
+output_numeric_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Numeric values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ if (value.numerator != 0 || value.denominator != 0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %d, %d }",
+ ch, value.numerator, value.denominator);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE numeric_table
+#define ELEMENT uint8_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character numeric value table. */
+static void
+output_numeric (const char *filename, const char *version)
+{
+ FILE *stream;
+ uc_fraction_t fractions[128];
+ unsigned int nfractions;
+ unsigned int ch, i, j;
+ struct numeric_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint16_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Numeric values of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ /* Create table of occurring fractions. */
+ nfractions = 0;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ for (i = 0; i < nfractions; i++)
+ if (value.numerator == fractions[i].numerator
+ && value.denominator == fractions[i].denominator)
+ break;
+ if (i == nfractions)
+ {
+ if (nfractions == 128)
+ abort ();
+ for (i = 0; i < nfractions; i++)
+ if (value.denominator < fractions[i].denominator
+ || (value.denominator == fractions[i].denominator
+ && value.numerator < fractions[i].numerator))
+ break;
+ for (j = nfractions; j > i; j--)
+ fractions[j] = fractions[j - 1];
+ fractions[i] = value;
+ nfractions++;
+ }
+ }
+
+ fprintf (stream, "static const uc_fraction_t u_numeric_values[%d] =\n",
+ nfractions);
+ fprintf (stream, "{\n");
+ for (i = 0; i < nfractions; i++)
+ {
+ fprintf (stream, " { %d, %d }", fractions[i].numerator,
+ fractions[i].denominator);
+ if (i+1 < nfractions)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+
+ t.p = 7;
+ t.q = 9;
+ numeric_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uc_fraction_t value = get_numeric_value (ch);
+
+ for (i = 0; i < nfractions; i++)
+ if (value.numerator == fractions[i].numerator
+ && value.denominator == fractions[i].denominator)
+ break;
+ if (i == nfractions)
+ abort ();
+
+ numeric_table_add (&t, ch, i);
+ }
+
+ numeric_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define numeric_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d + 1];\n", t.level3_size,
+ (1 << t.p) * 7 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_numeric =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 7 bits only. Use 16-bit units,
+ not 32-bit units, in order to make the lookup function easier. */
+ level3_packed =
+ (uint16_t *)
+ calloc ((t.level3_size << t.p) * 7 / 16 + 1, sizeof (uint16_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 7) / 16;
+ unsigned int k = (i * 7) % 16;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i];
+ value = level3_packed[j] | (level3_packed[j+1] << 16) | (value << k);
+ level3_packed[j] = value & 0xffff;
+ level3_packed[j+1] = value >> 16;
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 7 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 7 / 16 + 1; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 7 / 16 + 1)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 7 / 16 + 1 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Mirrored. */
+/* See Unicode 3.0 book, section 4.7,
+ UAX #9. */
+
+/* List of mirrored character pairs. This is a subset of the characters
+ having the BidiMirrored property. */
+static unsigned int mirror_pairs[][2] =
+{
+ { 0x0028, 0x0029 },
+ { 0x003C, 0x003E },
+ { 0x005B, 0x005D },
+ { 0x007B, 0x007D },
+ { 0x00AB, 0x00BB },
+ { 0x2039, 0x203A },
+ { 0x2045, 0x2046 },
+ { 0x207D, 0x207E },
+ { 0x208D, 0x208E },
+ { 0x2208, 0x220B },
+ { 0x220A, 0x220D },
+ { 0x223C, 0x223D },
+ { 0x2243, 0x22CD },
+ { 0x2252, 0x2253 },
+ { 0x2254, 0x2255 },
+ { 0x2264, 0x2265 },
+ { 0x2266, 0x2267 },
+ { 0x226A, 0x226B },
+ { 0x2276, 0x2277 },
+ { 0x2278, 0x2279 },
+ { 0x227A, 0x227B },
+ { 0x227C, 0x227D },
+ { 0x2282, 0x2283 },
+ { 0x2286, 0x2287 },
+ { 0x228F, 0x2290 },
+ { 0x2291, 0x2292 },
+ { 0x22A2, 0x22A3 },
+ { 0x22B0, 0x22B1 },
+ { 0x22B2, 0x22B3 },
+ { 0x22B4, 0x22B5 },
+ { 0x22B6, 0x22B7 },
+ { 0x22C9, 0x22CA },
+ { 0x22CB, 0x22CC },
+ { 0x22D0, 0x22D1 },
+ { 0x22D6, 0x22D7 },
+ { 0x22D8, 0x22D9 },
+ { 0x22DA, 0x22DB },
+ { 0x22DC, 0x22DD },
+ { 0x22DE, 0x22DF },
+ { 0x22F0, 0x22F1 },
+ { 0x2308, 0x2309 },
+ { 0x230A, 0x230B },
+ { 0x2329, 0x232A },
+ { 0x3008, 0x3009 },
+ { 0x300A, 0x300B },
+ { 0x300C, 0x300D },
+ { 0x300E, 0x300F },
+ { 0x3010, 0x3011 },
+ { 0x3014, 0x3015 },
+ { 0x3016, 0x3017 },
+ { 0x3018, 0x3019 },
+ { 0x301A, 0x301B }
+};
+
+static int
+get_mirror_value (unsigned int ch)
+{
+ bool mirrored;
+ unsigned int mirror_char;
+ unsigned int i;
+
+ mirrored = (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].mirrored);
+ mirror_char = 0xfffd;
+ for (i = 0; i < sizeof (mirror_pairs) / sizeof (mirror_pairs[0]); i++)
+ if (ch == mirror_pairs[i][0])
+ {
+ mirror_char = mirror_pairs[i][1];
+ break;
+ }
+ else if (ch == mirror_pairs[i][1])
+ {
+ mirror_char = mirror_pairs[i][0];
+ break;
+ }
+ if (mirrored)
+ return (int) mirror_char - (int) ch;
+ else
+ {
+ if (mirror_char != 0xfffd)
+ abort ();
+ return 0;
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE mirror_table
+#define ELEMENT int32_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output the per-character mirror table. */
+static void
+output_mirror (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct mirror_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Mirrored Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ mirror_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = get_mirror_value (ch);
+
+ mirror_table_add (&t, ch, value);
+ }
+
+ mirror_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define mirror_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_mirror =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (int32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %5d", ((int32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Particular values of the word break property. */
+
+static bool
+is_WBP_MIDNUMLET (unsigned int ch)
+{
+ return (ch == 0x0027 || ch == 0x002E || ch == 0x2018 || ch == 0x2019
+ || ch == 0x2024 || ch == 0xFE52 || ch == 0xFF07 || ch == 0xFF0E);
+}
+
+static bool
+is_WBP_MIDLETTER (unsigned int ch)
+{
+ return (ch == 0x00B7 || ch == 0x05F4 || ch == 0x2027 || ch == 0x003A
+ || ch == 0x0387 || ch == 0xFE13 || ch == 0xFE55 || ch == 0xFF1A);
+}
+
+/* ========================================================================= */
+
+/* Properties. */
+
+/* Reading PropList.txt and DerivedCoreProperties.txt. */
+enum
+{
+ /* PropList.txt */
+ PROP_WHITE_SPACE,
+ PROP_BIDI_CONTROL,
+ PROP_JOIN_CONTROL,
+ PROP_DASH,
+ PROP_HYPHEN,
+ PROP_QUOTATION_MARK,
+ PROP_TERMINAL_PUNCTUATION,
+ PROP_OTHER_MATH,
+ PROP_HEX_DIGIT,
+ PROP_ASCII_HEX_DIGIT,
+ PROP_OTHER_ALPHABETIC,
+ PROP_IDEOGRAPHIC,
+ PROP_DIACRITIC,
+ PROP_EXTENDER,
+ PROP_OTHER_LOWERCASE,
+ PROP_OTHER_UPPERCASE,
+ PROP_NONCHARACTER_CODE_POINT,
+ PROP_OTHER_GRAPHEME_EXTEND,
+ PROP_IDS_BINARY_OPERATOR,
+ PROP_IDS_TRINARY_OPERATOR,
+ PROP_RADICAL,
+ PROP_UNIFIED_IDEOGRAPH,
+ PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT,
+ PROP_DEPRECATED,
+ PROP_SOFT_DOTTED,
+ PROP_LOGICAL_ORDER_EXCEPTION,
+ PROP_OTHER_ID_START,
+ PROP_OTHER_ID_CONTINUE,
+ PROP_STERM,
+ PROP_VARIATION_SELECTOR,
+ PROP_PATTERN_WHITE_SPACE,
+ PROP_PATTERN_SYNTAX,
+ /* DerivedCoreProperties.txt */
+ PROP_MATH,
+ PROP_ALPHABETIC,
+ PROP_LOWERCASE,
+ PROP_UPPERCASE,
+ PROP_CASED,
+ PROP_CASE_IGNORABLE,
+ PROP_CHANGES_WHEN_LOWERCASED,
+ PROP_CHANGES_WHEN_UPPERCASED,
+ PROP_CHANGES_WHEN_TITLECASED,
+ PROP_CHANGES_WHEN_CASEFOLDED,
+ PROP_CHANGES_WHEN_CASEMAPPED,
+ PROP_ID_START,
+ PROP_ID_CONTINUE,
+ PROP_XID_START,
+ PROP_XID_CONTINUE,
+ PROP_DEFAULT_IGNORABLE_CODE_POINT,
+ PROP_GRAPHEME_EXTEND,
+ PROP_GRAPHEME_BASE,
+ PROP_GRAPHEME_LINK
+};
+unsigned long long unicode_properties[0x110000];
+
+static void
+clear_properties (void)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_properties[i] = 0;
+}
+
+/* Stores in unicode_properties[] the properties from the
+ PropList.txt or DerivedCoreProperties.txt file. */
+static void
+fill_properties (const char *proplist_filename)
+{
+ unsigned int i;
+ FILE *stream;
+
+ stream = fopen (proplist_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", proplist_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char propname[200+1];
+ unsigned int propvalue;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n", proplist_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+#define PROP(name,value) \
+ if (strcmp (propname, name) == 0) propvalue = value; else
+ /* PropList.txt */
+ PROP ("White_Space", PROP_WHITE_SPACE)
+ PROP ("Bidi_Control", PROP_BIDI_CONTROL)
+ PROP ("Join_Control", PROP_JOIN_CONTROL)
+ PROP ("Dash", PROP_DASH)
+ PROP ("Hyphen", PROP_HYPHEN)
+ PROP ("Quotation_Mark", PROP_QUOTATION_MARK)
+ PROP ("Terminal_Punctuation", PROP_TERMINAL_PUNCTUATION)
+ PROP ("Other_Math", PROP_OTHER_MATH)
+ PROP ("Hex_Digit", PROP_HEX_DIGIT)
+ PROP ("ASCII_Hex_Digit", PROP_ASCII_HEX_DIGIT)
+ PROP ("Other_Alphabetic", PROP_OTHER_ALPHABETIC)
+ PROP ("Ideographic", PROP_IDEOGRAPHIC)
+ PROP ("Diacritic", PROP_DIACRITIC)
+ PROP ("Extender", PROP_EXTENDER)
+ PROP ("Other_Lowercase", PROP_OTHER_LOWERCASE)
+ PROP ("Other_Uppercase", PROP_OTHER_UPPERCASE)
+ PROP ("Noncharacter_Code_Point", PROP_NONCHARACTER_CODE_POINT)
+ PROP ("Other_Grapheme_Extend", PROP_OTHER_GRAPHEME_EXTEND)
+ PROP ("IDS_Binary_Operator", PROP_IDS_BINARY_OPERATOR)
+ PROP ("IDS_Trinary_Operator", PROP_IDS_TRINARY_OPERATOR)
+ PROP ("Radical", PROP_RADICAL)
+ PROP ("Unified_Ideograph", PROP_UNIFIED_IDEOGRAPH)
+ PROP ("Other_Default_Ignorable_Code_Point", PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)
+ PROP ("Deprecated", PROP_DEPRECATED)
+ PROP ("Soft_Dotted", PROP_SOFT_DOTTED)
+ PROP ("Logical_Order_Exception", PROP_LOGICAL_ORDER_EXCEPTION)
+ PROP ("Other_ID_Start", PROP_OTHER_ID_START)
+ PROP ("Other_ID_Continue", PROP_OTHER_ID_CONTINUE)
+ PROP ("STerm", PROP_STERM)
+ PROP ("Variation_Selector", PROP_VARIATION_SELECTOR)
+ PROP ("Pattern_White_Space", PROP_PATTERN_WHITE_SPACE)
+ PROP ("Pattern_Syntax", PROP_PATTERN_SYNTAX)
+ /* DerivedCoreProperties.txt */
+ PROP ("Math", PROP_MATH)
+ PROP ("Alphabetic", PROP_ALPHABETIC)
+ PROP ("Lowercase", PROP_LOWERCASE)
+ PROP ("Uppercase", PROP_UPPERCASE)
+ PROP ("Cased", PROP_CASED)
+ PROP ("Case_Ignorable", PROP_CASE_IGNORABLE)
+ PROP ("Changes_When_Lowercased", PROP_CHANGES_WHEN_LOWERCASED)
+ PROP ("Changes_When_Uppercased", PROP_CHANGES_WHEN_UPPERCASED)
+ PROP ("Changes_When_Titlecased", PROP_CHANGES_WHEN_TITLECASED)
+ PROP ("Changes_When_Casefolded", PROP_CHANGES_WHEN_CASEFOLDED)
+ PROP ("Changes_When_Casemapped", PROP_CHANGES_WHEN_CASEMAPPED)
+ PROP ("ID_Start", PROP_ID_START)
+ PROP ("ID_Continue", PROP_ID_CONTINUE)
+ PROP ("XID_Start", PROP_XID_START)
+ PROP ("XID_Continue", PROP_XID_CONTINUE)
+ PROP ("Default_Ignorable_Code_Point", PROP_DEFAULT_IGNORABLE_CODE_POINT)
+ PROP ("Grapheme_Extend", PROP_GRAPHEME_EXTEND)
+ PROP ("Grapheme_Base", PROP_GRAPHEME_BASE)
+ PROP ("Grapheme_Link", PROP_GRAPHEME_LINK)
+#undef PROP
+ {
+ fprintf (stderr, "unknown property named '%s' in '%s'\n", propname,
+ proplist_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+
+ for (i = i1; i <= i2; i++)
+ unicode_properties[i] |= 1ULL << propvalue;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", proplist_filename);
+ exit (1);
+ }
+}
+
+/* Stores in array the given property from the Unicode 3.0 PropList.txt
+ file. */
+static void
+fill_property30 (char array[0x110000], const char *proplist_filename, const char *property_name)
+{
+ unsigned int i;
+ FILE *stream;
+ char buf[100+1];
+
+ for (i = 0; i < 0x110000; i++)
+ array[i] = 0;
+
+ stream = fopen (proplist_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", proplist_filename);
+ exit (1);
+ }
+
+ /* Search for the "Property dump for: ..." line. */
+ do
+ {
+ if (fscanf (stream, "%100[^\n]\n", buf) < 1)
+ {
+ fprintf (stderr, "no property found in '%s'\n", proplist_filename);
+ exit (1);
+ }
+ }
+ while (strstr (buf, property_name) == NULL);
+
+ for (;;)
+ {
+ unsigned int i1, i2;
+
+ if (fscanf (stream, "%100[^\n]\n", buf) < 1)
+ break;
+ if (buf[0] == '*')
+ break;
+ if (strlen (buf) >= 10 && buf[4] == '.' && buf[5] == '.')
+ {
+ if (sscanf (buf, "%4X..%4X", &i1, &i2) < 2)
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ }
+ else if (strlen (buf) >= 4)
+ {
+ if (sscanf (buf, "%4X", &i1) < 1)
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+ else
+ {
+ fprintf (stderr, "parse error in property in '%s'\n",
+ proplist_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+ for (i = i1; i <= i2; i++)
+ array[i] = 1;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", proplist_filename);
+ exit (1);
+ }
+}
+
+/* Properties from Unicode 3.0 PropList.txt file. */
+
+/* The paired punctuation property from the PropList.txt file. */
+char unicode_pairedpunctuation[0x110000];
+
+/* The left of pair property from the PropList.txt file. */
+char unicode_leftofpair[0x110000];
+
+static void
+fill_properties30 (const char *proplist30_filename)
+{
+ fill_property30 (unicode_pairedpunctuation, proplist30_filename, "(Paired Punctuation)");
+ fill_property30 (unicode_leftofpair, proplist30_filename, "(Left of Pair)");
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_white_space (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_WHITE_SPACE)) != 0);
+}
+
+/* See Unicode 3.0 book, section 4.10,
+ PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_alphabetic (unsigned int ch)
+{
+ bool result1 =
+ is_category_L (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_ALPHABETIC)) != 0)
+ /* For some reason, the following are listed as having property
+ Alphabetic but not as having property Other_Alphabetic. */
+ || (ch >= 0x16EE && ch <= 0x16F0) /* RUNIC SYMBOLS */
+ || (ch >= 0x2160 && ch <= 0x2182) /* ROMAN NUMERALS */
+ || (ch >= 0x2185 && ch <= 0x2188) /* ROMAN NUMERALS */
+ || (ch >= 0x24D0 && ch <= 0x24E9) /* CIRCLED LATIN SMALL LETTER */
+ || (ch == 0x3007) /* IDEOGRAPHIC NUMBER ZERO */
+ || (ch >= 0x3021 && ch <= 0x3029) /* HANGZHOU NUMERAL */
+ || (ch >= 0x3038 && ch <= 0x303A) /* HANGZHOU NUMERAL */
+ || (ch >= 0xA6E6 && ch <= 0xA6EF) /* BAMUM LETTERS */
+ || (ch >= 0x10140 && ch <= 0x10174) /* GREEK ACROPHONICS */
+ || (ch == 0x10341) /* GOTHIC LETTER NINETY */
+ || (ch == 0x1034A) /* GOTHIC LETTER NINE HUNDRED */
+ || (ch >= 0x103D1 && ch <= 0x103D5) /* OLD PERSIAN NUMBERS */
+ || (ch >= 0x12400 && ch <= 0x12462); /* CUNEIFORM NUMERIC SIGNS */
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_ALPHABETIC)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_alphabetic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ALPHABETIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_not_a_character (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_NONCHARACTER_CODE_POINT)) != 0);
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_default_ignorable_code_point (unsigned int ch)
+{
+ bool result1 =
+ (is_category_Cf (ch)
+ && !(ch >= 0xFFF9 && ch <= 0xFFFB) /* Annotations */
+ && !((ch >= 0x0600 && ch <= 0x0603) || ch == 0x06DD || ch == 0x070F)
+ /* For some reason, the following are not listed as having property
+ Default_Ignorable_Code_Point. */
+ && !(ch == 0x110BD))
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)) != 0)
+ || ((unicode_properties[ch] & (1ULL << PROP_VARIATION_SELECTOR)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_DEFAULT_IGNORABLE_CODE_POINT)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_default_ignorable_code_point (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_DEFAULT_IGNORABLE_CODE_POINT)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_deprecated (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DEPRECATED)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_logical_order_exception (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_LOGICAL_ORDER_EXCEPTION)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_variation_selector (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_VARIATION_SELECTOR)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_private_use (unsigned int ch)
+{
+ /* Determined through "grep 'Private Use,' UnicodeData-3.1.0.txt". */
+ return (ch >= 0xE000 && ch <= 0xF8FF)
+ || (ch >= 0xF0000 && ch <= 0xFFFFD)
+ || (ch >= 0x100000 && ch <= 0x10FFFD);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_unassigned_code_value (unsigned int ch)
+{
+ return (is_category_Cn (ch) && !is_property_not_a_character (ch));
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_uppercase (unsigned int ch)
+{
+ bool result1 =
+ is_category_Lu (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_UPPERCASE)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_UPPERCASE)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_uppercase (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_UPPERCASE)) != 0);
+}
+
+/* See PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_lowercase (unsigned int ch)
+{
+ bool result1 =
+ is_category_Ll (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_LOWERCASE)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_LOWERCASE)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_lowercase (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_LOWERCASE)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_titlecase (unsigned int ch)
+{
+ return is_category_Lt (ch);
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_cased (unsigned int ch)
+{
+ bool result1 = (is_property_lowercase (ch)
+ || is_property_uppercase (ch)
+ || is_category_Lt (ch));
+ bool result2 = ((unicode_properties[ch] & (1ULL << PROP_CASED)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_case_ignorable (unsigned int ch)
+{
+ bool result1 = (is_WBP_MIDLETTER (ch) || is_WBP_MIDNUMLET (ch)
+ || is_category_Mn (ch)
+ || is_category_Me (ch)
+ || is_category_Cf (ch)
+ || is_category_Lm (ch)
+ || is_category_Sk (ch));
+ bool result2 = ((unicode_properties[ch] & (1ULL << PROP_CASE_IGNORABLE)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_changes_when_lowercased (unsigned int ch)
+{
+ bool result1 = ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_LOWERCASED)) != 0);
+ bool result2 = (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].lower != NONE
+ && unicode_attributes[ch].lower != ch);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_changes_when_uppercased (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_UPPERCASED)) != 0);
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_changes_when_titlecased (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_TITLECASED)) != 0);
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_changes_when_casefolded (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_CASEFOLDED)) != 0);
+}
+
+/* See DerivedCoreProperties.txt. */
+static bool
+is_property_changes_when_casemapped (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_CHANGES_WHEN_CASEMAPPED)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_soft_dotted (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_SOFT_DOTTED)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_id_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ID_START)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_id_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ID_START)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_id_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ID_CONTINUE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_id_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_ID_CONTINUE)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_xid_start (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_XID_START)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_xid_continue (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_XID_CONTINUE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_pattern_white_space (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_PATTERN_WHITE_SPACE)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_pattern_syntax (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_PATTERN_SYNTAX)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_join_control (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_JOIN_CONTROL)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_base (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_BASE)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_extend (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_EXTEND)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_grapheme_extend (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_GRAPHEME_EXTEND)) != 0);
+}
+
+/* See DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_grapheme_link (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_GRAPHEME_LINK)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_bidi_control (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_BIDI_CONTROL)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_left_to_right (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_L);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_hebrew_right_to_left (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_R);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_arabic_right_to_left (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_AL);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_european_digit (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_EN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_eur_num_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ES);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_eur_num_terminator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ET);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_arabic_digit (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_AN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_common_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_CS);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_block_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_B);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_segment_separator (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_S);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_whitespace (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_WS);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_non_spacing_mark (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_NSM);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_boundary_neutral (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_BN);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_pdf (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_PDF);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_embedding_or_override (unsigned int ch)
+{
+ int category = get_bidi_category (ch);
+ return (category == UC_BIDI_LRE || category == UC_BIDI_LRO
+ || category == UC_BIDI_RLE || category == UC_BIDI_RLO);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_bidi_other_neutral (unsigned int ch)
+{
+ return (get_bidi_category (ch) == UC_BIDI_ON);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_hex_digit (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_HEX_DIGIT)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ascii_hex_digit (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_ASCII_HEX_DIGIT)) != 0);
+}
+
+/* See Unicode 3.0 book, section 4.10,
+ PropList.txt, UCD.html. */
+static bool
+is_property_ideographic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDEOGRAPHIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_unified_ideograph (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_UNIFIED_IDEOGRAPH)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_radical (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_RADICAL)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ids_binary_operator (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDS_BINARY_OPERATOR)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_ids_trinary_operator (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_IDS_TRINARY_OPERATOR)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_zero_width (unsigned int ch)
+{
+ return is_category_Cf (ch)
+ || (unicode_attributes[ch].name != NULL
+ && strstr (unicode_attributes[ch].name, "ZERO WIDTH") != NULL);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_space (unsigned int ch)
+{
+ return is_category_Zs (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_non_break (unsigned int ch)
+{
+ /* This is exactly the set of characters having line breaking
+ property GL. */
+ return (ch == 0x00A0 /* NO-BREAK SPACE */
+ || ch == 0x034F /* COMBINING GRAPHEME JOINER */
+ || ch == 0x035C /* COMBINING DOUBLE BREVE BELOW */
+ || ch == 0x035D /* COMBINING DOUBLE BREVE */
+ || ch == 0x035E /* COMBINING DOUBLE MACRON */
+ || ch == 0x035F /* COMBINING DOUBLE MACRON BELOW */
+ || ch == 0x0360 /* COMBINING DOUBLE TILDE */
+ || ch == 0x0361 /* COMBINING DOUBLE INVERTED BREVE */
+ || ch == 0x0362 /* COMBINING DOUBLE RIGHTWARDS ARROW BELOW */
+ || ch == 0x0F08 /* TIBETAN MARK SBRUL SHAD */
+ || ch == 0x0F0C /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ || ch == 0x0F12 /* TIBETAN MARK RGYA GRAM SHAD */
+ || ch == 0x180E /* MONGOLIAN VOWEL SEPARATOR */
+ || ch == 0x2007 /* FIGURE SPACE */
+ || ch == 0x2011 /* NON-BREAKING HYPHEN */
+ || ch == 0x202F /* NARROW NO-BREAK SPACE */);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_iso_control (unsigned int ch)
+{
+ bool result1 =
+ (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>") == 0);
+ bool result2 =
+ is_category_Cc (ch);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_format_control (unsigned int ch)
+{
+ return (is_category_Cf (ch)
+ && get_bidi_category (ch) == UC_BIDI_BN
+ && !is_property_join_control (ch)
+ && ch != 0xFEFF);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_dash (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DASH)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_hyphen (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_HYPHEN)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_punctuation (unsigned int ch)
+{
+ return is_category_P (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_line_separator (unsigned int ch)
+{
+ return is_category_Zl (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_paragraph_separator (unsigned int ch)
+{
+ return is_category_Zp (ch);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_quotation_mark (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_QUOTATION_MARK)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_sentence_terminal (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_STERM)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_terminal_punctuation (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_TERMINAL_PUNCTUATION)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_currency_symbol (unsigned int ch)
+{
+ return is_category_Sc (ch);
+}
+
+/* See Unicode 3.0 book, section 4.9,
+ PropList.txt, UCD.html,
+ DerivedCoreProperties.txt, UCD.html. */
+static bool
+is_property_math (unsigned int ch)
+{
+ bool result1 =
+ is_category_Sm (ch)
+ || ((unicode_properties[ch] & (1ULL << PROP_OTHER_MATH)) != 0);
+ bool result2 =
+ ((unicode_properties[ch] & (1ULL << PROP_MATH)) != 0);
+
+ if (result1 != result2)
+ abort ();
+ return result1;
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_other_math (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_OTHER_MATH)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_paired_punctuation (unsigned int ch)
+{
+ return unicode_pairedpunctuation[ch];
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_left_of_pair (unsigned int ch)
+{
+ return unicode_leftofpair[ch];
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_combining (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && (strcmp (unicode_attributes[ch].combining, "0") != 0
+ || is_category_Mc (ch)
+ || is_category_Me (ch)
+ || is_category_Mn (ch)));
+}
+
+#if 0 /* same as is_property_bidi_non_spacing_mark */
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_non_spacing (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && get_bidi_category (ch) == UC_BIDI_NSM);
+}
+#endif
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_composite (unsigned int ch)
+{
+ /* This definition differs from the one in PropList-3.0.1.txt, but is more
+ logical in some sense. */
+ if (ch >= 0xAC00 && ch <= 0xD7A4) /* Hangul Syllables */
+ return true;
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].decomposition != NULL)
+ {
+ /* Test whether the decomposition contains more than one character,
+ and the first is not a space. */
+ const char *decomp = unicode_attributes[ch].decomposition;
+ if (decomp[0] == '<')
+ {
+ decomp = strchr (decomp, '>') + 1;
+ if (decomp[0] == ' ')
+ decomp++;
+ }
+ return strchr (decomp, ' ') != NULL && strncmp (decomp, "0020 ", 5) != 0;
+ }
+ return false;
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_decimal_digit (unsigned int ch)
+{
+ return is_category_Nd (ch);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_numeric (unsigned int ch)
+{
+ return ((get_numeric_value (ch)).denominator > 0)
+ || (ch == 0x09F8) /* BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR */
+ || (ch == 0x2183); /* ROMAN NUMERAL REVERSED ONE HUNDRED */
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_diacritic (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_DIACRITIC)) != 0);
+}
+
+/* See PropList.txt, UCD.html. */
+static bool
+is_property_extender (unsigned int ch)
+{
+ return ((unicode_properties[ch] & (1ULL << PROP_EXTENDER)) != 0);
+}
+
+/* See PropList-3.0.1.txt. */
+static bool
+is_property_ignorable_control (unsigned int ch)
+{
+ return ((is_category_Cc (ch) && get_bidi_category (ch) == UC_BIDI_BN)
+ || is_category_Cf (ch))
+ && ch != 0x0000;
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Output all properties. */
+static void
+output_properties (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/pr_" #P ".txt", is_property_ ## P); \
+ output_predicate_test ("../tests/unictype/test-pr_" #P ".c", is_property_ ## P, "uc_is_property_" #P " (c)"); \
+ output_predicate ("unictype/pr_" #P ".h", is_property_ ## P, "u_property_" #P, "Properties", version);
+ PROPERTY(white_space)
+ PROPERTY(alphabetic)
+ PROPERTY(other_alphabetic)
+ PROPERTY(not_a_character)
+ PROPERTY(default_ignorable_code_point)
+ PROPERTY(other_default_ignorable_code_point)
+ PROPERTY(deprecated)
+ PROPERTY(logical_order_exception)
+ PROPERTY(variation_selector)
+ PROPERTY(private_use)
+ PROPERTY(unassigned_code_value)
+ PROPERTY(uppercase)
+ PROPERTY(other_uppercase)
+ PROPERTY(lowercase)
+ PROPERTY(other_lowercase)
+ PROPERTY(titlecase)
+ PROPERTY(cased)
+ PROPERTY(case_ignorable)
+ PROPERTY(changes_when_lowercased)
+ PROPERTY(changes_when_uppercased)
+ PROPERTY(changes_when_titlecased)
+ PROPERTY(changes_when_casefolded)
+ PROPERTY(changes_when_casemapped)
+ PROPERTY(soft_dotted)
+ PROPERTY(id_start)
+ PROPERTY(other_id_start)
+ PROPERTY(id_continue)
+ PROPERTY(other_id_continue)
+ PROPERTY(xid_start)
+ PROPERTY(xid_continue)
+ PROPERTY(pattern_white_space)
+ PROPERTY(pattern_syntax)
+ PROPERTY(join_control)
+ PROPERTY(grapheme_base)
+ PROPERTY(grapheme_extend)
+ PROPERTY(other_grapheme_extend)
+ PROPERTY(grapheme_link)
+ PROPERTY(bidi_control)
+ PROPERTY(bidi_left_to_right)
+ PROPERTY(bidi_hebrew_right_to_left)
+ PROPERTY(bidi_arabic_right_to_left)
+ PROPERTY(bidi_european_digit)
+ PROPERTY(bidi_eur_num_separator)
+ PROPERTY(bidi_eur_num_terminator)
+ PROPERTY(bidi_arabic_digit)
+ PROPERTY(bidi_common_separator)
+ PROPERTY(bidi_block_separator)
+ PROPERTY(bidi_segment_separator)
+ PROPERTY(bidi_whitespace)
+ PROPERTY(bidi_non_spacing_mark)
+ PROPERTY(bidi_boundary_neutral)
+ PROPERTY(bidi_pdf)
+ PROPERTY(bidi_embedding_or_override)
+ PROPERTY(bidi_other_neutral)
+ PROPERTY(hex_digit)
+ PROPERTY(ascii_hex_digit)
+ PROPERTY(ideographic)
+ PROPERTY(unified_ideograph)
+ PROPERTY(radical)
+ PROPERTY(ids_binary_operator)
+ PROPERTY(ids_trinary_operator)
+ PROPERTY(zero_width)
+ PROPERTY(space)
+ PROPERTY(non_break)
+ PROPERTY(iso_control)
+ PROPERTY(format_control)
+ PROPERTY(dash)
+ PROPERTY(hyphen)
+ PROPERTY(punctuation)
+ PROPERTY(line_separator)
+ PROPERTY(paragraph_separator)
+ PROPERTY(quotation_mark)
+ PROPERTY(sentence_terminal)
+ PROPERTY(terminal_punctuation)
+ PROPERTY(currency_symbol)
+ PROPERTY(math)
+ PROPERTY(other_math)
+ PROPERTY(paired_punctuation)
+ PROPERTY(left_of_pair)
+ PROPERTY(combining)
+ PROPERTY(composite)
+ PROPERTY(decimal_digit)
+ PROPERTY(numeric)
+ PROPERTY(diacritic)
+ PROPERTY(extender)
+ PROPERTY(ignorable_control)
+#undef PROPERTY
+}
+
+/* ========================================================================= */
+
+/* Arabic Shaping. */
+
+enum
+{
+ UC_JOINING_TYPE_U, /* Non_Joining */
+ UC_JOINING_TYPE_T, /* Transparent */
+ UC_JOINING_TYPE_C, /* Join_Causing */
+ UC_JOINING_TYPE_L, /* Left_Joining */
+ UC_JOINING_TYPE_R, /* Right_Joining */
+ UC_JOINING_TYPE_D /* Dual_Joining */
+};
+
+static uint8_t unicode_joining_type[0x110000];
+
+enum
+{
+ UC_JOINING_GROUP_NONE, /* No_Joining_Group */
+ UC_JOINING_GROUP_AIN, /* Ain */
+ UC_JOINING_GROUP_ALAPH, /* Alaph */
+ UC_JOINING_GROUP_ALEF, /* Alef */
+ UC_JOINING_GROUP_BEH, /* Beh */
+ UC_JOINING_GROUP_BETH, /* Beth */
+ UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */
+ UC_JOINING_GROUP_DAL, /* Dal */
+ UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */
+ UC_JOINING_GROUP_E, /* E */
+ UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */
+ UC_JOINING_GROUP_FE, /* Fe */
+ UC_JOINING_GROUP_FEH, /* Feh */
+ UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */
+ UC_JOINING_GROUP_GAF, /* Gaf */
+ UC_JOINING_GROUP_GAMAL, /* Gamal */
+ UC_JOINING_GROUP_HAH, /* Hah */
+ UC_JOINING_GROUP_HE, /* He */
+ UC_JOINING_GROUP_HEH, /* Heh */
+ UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */
+ UC_JOINING_GROUP_HETH, /* Heth */
+ UC_JOINING_GROUP_KAF, /* Kaf */
+ UC_JOINING_GROUP_KAPH, /* Kaph */
+ UC_JOINING_GROUP_KHAPH, /* Khaph */
+ UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */
+ UC_JOINING_GROUP_LAM, /* Lam */
+ UC_JOINING_GROUP_LAMADH, /* Lamadh */
+ UC_JOINING_GROUP_MEEM, /* Meem */
+ UC_JOINING_GROUP_MIM, /* Mim */
+ UC_JOINING_GROUP_NOON, /* Noon */
+ UC_JOINING_GROUP_NUN, /* Nun */
+ UC_JOINING_GROUP_NYA, /* Nya */
+ UC_JOINING_GROUP_PE, /* Pe */
+ UC_JOINING_GROUP_QAF, /* Qaf */
+ UC_JOINING_GROUP_QAPH, /* Qaph */
+ UC_JOINING_GROUP_REH, /* Reh */
+ UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */
+ UC_JOINING_GROUP_SAD, /* Sad */
+ UC_JOINING_GROUP_SADHE, /* Sadhe */
+ UC_JOINING_GROUP_SEEN, /* Seen */
+ UC_JOINING_GROUP_SEMKATH, /* Semkath */
+ UC_JOINING_GROUP_SHIN, /* Shin */
+ UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */
+ UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */
+ UC_JOINING_GROUP_TAH, /* Tah */
+ UC_JOINING_GROUP_TAW, /* Taw */
+ UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */
+ UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */
+ UC_JOINING_GROUP_TETH, /* Teth */
+ UC_JOINING_GROUP_WAW, /* Waw */
+ UC_JOINING_GROUP_YEH, /* Yeh */
+ UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */
+ UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */
+ UC_JOINING_GROUP_YUDH, /* Yudh */
+ UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */
+ UC_JOINING_GROUP_ZAIN, /* Zain */
+ UC_JOINING_GROUP_ZHAIN /* Zhain */
+};
+
+static uint8_t unicode_joining_group[0x110000];
+
+static void
+fill_arabicshaping (const char *arabicshaping_filename)
+{
+ FILE *stream;
+ unsigned int i;
+ int lineno;
+
+ stream = fopen (arabicshaping_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", arabicshaping_filename);
+ exit (1);
+ }
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ unicode_joining_type[i] = (uint8_t)~(uint8_t)0;
+ unicode_joining_group[i] = UC_JOINING_GROUP_NONE;
+ }
+
+ lineno = 0;
+ for (;;)
+ {
+ char buf[100+1];
+ char separator1[100+1];
+ char padding1[100+1];
+ char schematic_name[100+1];
+ char separator2[100+1];
+ char padding2[100+1];
+ char joining_type_name[100+1];
+ char separator3[100+1];
+ char padding3[100+1];
+ char joining_group_name[100+1];
+ int joining_type;
+ int joining_group;
+
+ lineno++;
+ if (fscanf (stream, "%100[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X%[;]%[ ]%[^;]%[;]%[ ]%[^;]%[;]%[ ]%100[^\n]",
+ &i, separator1, padding1, schematic_name, separator2,
+ padding2, joining_type_name, separator3, padding3,
+ joining_group_name) != 10)
+ {
+ fprintf (stderr, "parse error in '%s':%d\n",
+ arabicshaping_filename, lineno);
+ exit (1);
+ }
+ if (i >= 0x110000)
+ abort ();
+
+#define TRY(name) else if (strcmp (joining_type_name, #name + 16) == 0) joining_type = name;
+ if (false) {}
+ TRY(UC_JOINING_TYPE_U)
+ TRY(UC_JOINING_TYPE_T)
+ TRY(UC_JOINING_TYPE_C)
+ TRY(UC_JOINING_TYPE_L)
+ TRY(UC_JOINING_TYPE_R)
+ TRY(UC_JOINING_TYPE_D)
+#undef TRY
+ else
+ {
+ fprintf (stderr, "unknown joining type value \"%s\" in '%s':%d\n",
+ joining_type_name, arabicshaping_filename, lineno);
+ exit (1);
+ }
+
+ /* Remove trailing spaces. */
+ while (joining_group_name[0] != '\0'
+ && joining_group_name[strlen (joining_group_name) - 1] == ' ')
+ joining_group_name[strlen (joining_group_name) - 1] = '\0';
+
+#define TRY(value,name) else if (strcmp (joining_group_name, name) == 0) joining_group = value;
+ if (false) {}
+ TRY(UC_JOINING_GROUP_NONE, "No_Joining_Group")
+ TRY(UC_JOINING_GROUP_AIN, "AIN")
+ TRY(UC_JOINING_GROUP_ALAPH, "ALAPH")
+ TRY(UC_JOINING_GROUP_ALEF, "ALEF")
+ TRY(UC_JOINING_GROUP_BEH, "BEH")
+ TRY(UC_JOINING_GROUP_BETH, "BETH")
+ TRY(UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, "BURUSHASKI YEH BARREE")
+ TRY(UC_JOINING_GROUP_DAL, "DAL")
+ TRY(UC_JOINING_GROUP_DALATH_RISH, "DALATH RISH")
+ TRY(UC_JOINING_GROUP_E, "E")
+ TRY(UC_JOINING_GROUP_FARSI_YEH, "FARSI YEH")
+ TRY(UC_JOINING_GROUP_FE, "FE")
+ TRY(UC_JOINING_GROUP_FEH, "FEH")
+ TRY(UC_JOINING_GROUP_FINAL_SEMKATH, "FINAL SEMKATH")
+ TRY(UC_JOINING_GROUP_GAF, "GAF")
+ TRY(UC_JOINING_GROUP_GAMAL, "GAMAL")
+ TRY(UC_JOINING_GROUP_HAH, "HAH")
+ TRY(UC_JOINING_GROUP_HE, "HE")
+ TRY(UC_JOINING_GROUP_HEH, "HEH")
+ TRY(UC_JOINING_GROUP_HEH_GOAL, "HEH GOAL")
+ TRY(UC_JOINING_GROUP_HETH, "HETH")
+ TRY(UC_JOINING_GROUP_KAF, "KAF")
+ TRY(UC_JOINING_GROUP_KAPH, "KAPH")
+ TRY(UC_JOINING_GROUP_KHAPH, "KHAPH")
+ TRY(UC_JOINING_GROUP_KNOTTED_HEH, "KNOTTED HEH")
+ TRY(UC_JOINING_GROUP_LAM, "LAM")
+ TRY(UC_JOINING_GROUP_LAMADH, "LAMADH")
+ TRY(UC_JOINING_GROUP_MEEM, "MEEM")
+ TRY(UC_JOINING_GROUP_MIM, "MIM")
+ TRY(UC_JOINING_GROUP_NOON, "NOON")
+ TRY(UC_JOINING_GROUP_NUN, "NUN")
+ TRY(UC_JOINING_GROUP_NYA, "NYA")
+ TRY(UC_JOINING_GROUP_PE, "PE")
+ TRY(UC_JOINING_GROUP_QAF, "QAF")
+ TRY(UC_JOINING_GROUP_QAPH, "QAPH")
+ TRY(UC_JOINING_GROUP_REH, "REH")
+ TRY(UC_JOINING_GROUP_REVERSED_PE, "REVERSED PE")
+ TRY(UC_JOINING_GROUP_SAD, "SAD")
+ TRY(UC_JOINING_GROUP_SADHE, "SADHE")
+ TRY(UC_JOINING_GROUP_SEEN, "SEEN")
+ TRY(UC_JOINING_GROUP_SEMKATH, "SEMKATH")
+ TRY(UC_JOINING_GROUP_SHIN, "SHIN")
+ TRY(UC_JOINING_GROUP_SWASH_KAF, "SWASH KAF")
+ TRY(UC_JOINING_GROUP_SYRIAC_WAW, "SYRIAC WAW")
+ TRY(UC_JOINING_GROUP_TAH, "TAH")
+ TRY(UC_JOINING_GROUP_TAW, "TAW")
+ TRY(UC_JOINING_GROUP_TEH_MARBUTA, "TEH MARBUTA")
+ TRY(UC_JOINING_GROUP_TEH_MARBUTA_GOAL, "TEH MARBUTA GOAL")
+ TRY(UC_JOINING_GROUP_TETH, "TETH")
+ TRY(UC_JOINING_GROUP_WAW, "WAW")
+ TRY(UC_JOINING_GROUP_YEH, "YEH")
+ TRY(UC_JOINING_GROUP_YEH_BARREE, "YEH BARREE")
+ TRY(UC_JOINING_GROUP_YEH_WITH_TAIL, "YEH WITH TAIL")
+ TRY(UC_JOINING_GROUP_YUDH, "YUDH")
+ TRY(UC_JOINING_GROUP_YUDH_HE, "YUDH HE")
+ TRY(UC_JOINING_GROUP_ZAIN, "ZAIN")
+ TRY(UC_JOINING_GROUP_ZHAIN, "ZHAIN")
+#undef TRY
+ else
+ {
+ fprintf (stderr, "unknown joining group value \"%s\" in '%s':%d\n",
+ joining_group_name, arabicshaping_filename, lineno);
+ exit (1);
+ }
+
+ unicode_joining_type[i] = joining_type;
+ unicode_joining_group[i] = joining_group;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", arabicshaping_filename);
+ exit (1);
+ }
+}
+
+/* Convert a Joining_Type value to a C identifier. */
+static const char *
+joining_type_as_c_identifier (int joining_type)
+{
+#define TRY(value) if (joining_type == value) return #value;
+ TRY(UC_JOINING_TYPE_U)
+ TRY(UC_JOINING_TYPE_T)
+ TRY(UC_JOINING_TYPE_C)
+ TRY(UC_JOINING_TYPE_L)
+ TRY(UC_JOINING_TYPE_R)
+ TRY(UC_JOINING_TYPE_D)
+#undef TRY
+ abort ();
+}
+
+static void
+output_joining_type_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Arabic joining type of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = unicode_joining_type[ch];
+
+ if (value != (uint8_t)~(uint8_t)0)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %s }", ch, joining_type_as_c_identifier (value));
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE joining_type_table
+#define ELEMENT uint8_t
+#define DEFAULT (uint8_t)~(uint8_t)0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_joining_type (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct joining_type_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ uint8_t *level3_packed;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Arabic joining type of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ joining_type_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ uint8_t value = unicode_joining_type[ch];
+
+ joining_type_table_add (&t, ch, value);
+ }
+
+ joining_type_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define joining_type_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu * %d];\n", t.level3_size,
+ (1 << t.p) * 4 / 8);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_joining_type =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 4 bits only. */
+ level3_packed =
+ (uint8_t *) calloc ((t.level3_size << t.p) * 4 / 8, sizeof (uint8_t));
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned int j = (i * 4) / 8;
+ unsigned int k = (i * 4) % 8;
+ uint32_t value = ((unsigned char *) (t.result + level3_offset))[i] & 0x0f;
+ level3_packed[j] |= (value << k);
+ }
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 4 / 8 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 4 / 8; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x", level3_packed[i]);
+ if (i+1 < (t.level3_size << t.p) * 4 / 8)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 4 / 8 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ free (level3_packed);
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Convert a Joining_Group value to a C identifier. */
+static const char *
+joining_group_as_c_identifier (int joining_group)
+{
+#define TRY(value) if (joining_group == value) return #value;
+ TRY(UC_JOINING_GROUP_NONE)
+ TRY(UC_JOINING_GROUP_AIN)
+ TRY(UC_JOINING_GROUP_ALAPH)
+ TRY(UC_JOINING_GROUP_ALEF)
+ TRY(UC_JOINING_GROUP_BEH)
+ TRY(UC_JOINING_GROUP_BETH)
+ TRY(UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE)
+ TRY(UC_JOINING_GROUP_DAL)
+ TRY(UC_JOINING_GROUP_DALATH_RISH)
+ TRY(UC_JOINING_GROUP_E)
+ TRY(UC_JOINING_GROUP_FARSI_YEH)
+ TRY(UC_JOINING_GROUP_FE)
+ TRY(UC_JOINING_GROUP_FEH)
+ TRY(UC_JOINING_GROUP_FINAL_SEMKATH)
+ TRY(UC_JOINING_GROUP_GAF)
+ TRY(UC_JOINING_GROUP_GAMAL)
+ TRY(UC_JOINING_GROUP_HAH)
+ TRY(UC_JOINING_GROUP_HE)
+ TRY(UC_JOINING_GROUP_HEH)
+ TRY(UC_JOINING_GROUP_HEH_GOAL)
+ TRY(UC_JOINING_GROUP_HETH)
+ TRY(UC_JOINING_GROUP_KAF)
+ TRY(UC_JOINING_GROUP_KAPH)
+ TRY(UC_JOINING_GROUP_KHAPH)
+ TRY(UC_JOINING_GROUP_KNOTTED_HEH)
+ TRY(UC_JOINING_GROUP_LAM)
+ TRY(UC_JOINING_GROUP_LAMADH)
+ TRY(UC_JOINING_GROUP_MEEM)
+ TRY(UC_JOINING_GROUP_MIM)
+ TRY(UC_JOINING_GROUP_NOON)
+ TRY(UC_JOINING_GROUP_NUN)
+ TRY(UC_JOINING_GROUP_NYA)
+ TRY(UC_JOINING_GROUP_PE)
+ TRY(UC_JOINING_GROUP_QAF)
+ TRY(UC_JOINING_GROUP_QAPH)
+ TRY(UC_JOINING_GROUP_REH)
+ TRY(UC_JOINING_GROUP_REVERSED_PE)
+ TRY(UC_JOINING_GROUP_SAD)
+ TRY(UC_JOINING_GROUP_SADHE)
+ TRY(UC_JOINING_GROUP_SEEN)
+ TRY(UC_JOINING_GROUP_SEMKATH)
+ TRY(UC_JOINING_GROUP_SHIN)
+ TRY(UC_JOINING_GROUP_SWASH_KAF)
+ TRY(UC_JOINING_GROUP_SYRIAC_WAW)
+ TRY(UC_JOINING_GROUP_TAH)
+ TRY(UC_JOINING_GROUP_TAW)
+ TRY(UC_JOINING_GROUP_TEH_MARBUTA)
+ TRY(UC_JOINING_GROUP_TEH_MARBUTA_GOAL)
+ TRY(UC_JOINING_GROUP_TETH)
+ TRY(UC_JOINING_GROUP_WAW)
+ TRY(UC_JOINING_GROUP_YEH)
+ TRY(UC_JOINING_GROUP_YEH_BARREE)
+ TRY(UC_JOINING_GROUP_YEH_WITH_TAIL)
+ TRY(UC_JOINING_GROUP_YUDH)
+ TRY(UC_JOINING_GROUP_YUDH_HE)
+ TRY(UC_JOINING_GROUP_ZAIN)
+ TRY(UC_JOINING_GROUP_ZHAIN)
+#undef TRY
+ abort ();
+}
+
+static void
+output_joining_group_test (const char *filename, const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Arabic joining group of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = unicode_joining_group[ch];
+
+ if (value != UC_JOINING_GROUP_NONE)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, %s }", ch, joining_group_as_c_identifier (value));
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_joining_group (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch_min, ch_max, ch, i;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Arabic joining type of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ ch_min = 0x10FFFF;
+ for (ch = 0; ch < 0x110000; ch++)
+ if (unicode_joining_group[ch] != UC_JOINING_GROUP_NONE)
+ {
+ ch_min = ch;
+ break;
+ }
+
+ ch_max = 0;
+ for (ch = 0x10FFFF; ch > 0; ch--)
+ if (unicode_joining_group[ch] != UC_JOINING_GROUP_NONE)
+ {
+ ch_max = ch;
+ break;
+ }
+
+ if (!(ch_min <= ch_max))
+ abort ();
+
+ /* If the interval [ch_min, ch_max] is too large, we should better use a
+ 3-level table. */
+ if (!(ch_max - ch_min < 0x200))
+ abort ();
+
+ fprintf (stream, "#define joining_group_header_0 0x%x\n", ch_min);
+ fprintf (stream, "static const unsigned char u_joining_group[0x%x - 0x%x] =\n",
+ ch_max + 1, ch_min);
+ fprintf (stream, "{");
+ for (i = 0; i <= ch_max - ch_min; i++)
+ {
+ const char *s;
+
+ ch = ch_min + i;
+ if ((i % 2) == 0)
+ fprintf (stream, "\n ");
+ s = joining_group_as_c_identifier (unicode_joining_group[ch]);
+ fprintf (stream, " %s", s);
+ if (i+1 <= ch_max - ch_min)
+ {
+ fprintf (stream, ",");
+ if (((i+1) % 2) != 0)
+ fprintf (stream, "%*s", 38 - (int) strlen (s), "");
+ }
+ }
+ fprintf (stream, "\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Scripts. */
+
+static const char *scripts[256];
+static unsigned int numscripts;
+
+static uint8_t unicode_scripts[0x110000];
+
+static void
+fill_scripts (const char *scripts_filename)
+{
+ FILE *stream;
+ unsigned int i;
+
+ stream = fopen (scripts_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", scripts_filename);
+ exit (1);
+ }
+
+ numscripts = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_scripts[i] = (uint8_t)~(uint8_t)0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char scriptname[200+1];
+ int script;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, scriptname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, scriptname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n", scripts_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+ if (i2 < i1)
+ abort ();
+ if (i2 >= 0x110000)
+ abort ();
+
+ for (script = numscripts - 1; script >= 0; script--)
+ if (strcmp (scripts[script], scriptname) == 0)
+ break;
+ if (script < 0)
+ {
+ scripts[numscripts] = strdup (scriptname);
+ script = numscripts;
+ numscripts++;
+ if (numscripts == 256)
+ abort ();
+ }
+
+ for (i = i1; i <= i2; i++)
+ {
+ if (unicode_scripts[i] != (uint8_t)~(uint8_t)0)
+ fprintf (stderr, "0x%04X belongs to multiple scripts\n", i);
+ unicode_scripts[i] = script;
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", scripts_filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE script_table
+#define ELEMENT uint8_t
+#define DEFAULT (uint8_t)~(uint8_t)0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_scripts (const char *version)
+{
+ const char *filename = "unictype/scripts.h";
+ FILE *stream;
+ unsigned int ch, s, i;
+ struct script_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ typedef struct
+ {
+ const char *lowercase_name;
+ }
+ scriptinfo_t;
+ scriptinfo_t scriptinfo[256];
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode scripts. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ for (s = 0; s < numscripts; s++)
+ {
+ char *lcp = strdup (scripts[s]);
+ char *cp;
+
+ for (cp = lcp; *cp != '\0'; cp++)
+ if (*cp >= 'A' && *cp <= 'Z')
+ *cp += 'a' - 'A';
+
+ scriptinfo[s].lowercase_name = lcp;
+ }
+
+ for (s = 0; s < numscripts; s++)
+ {
+ fprintf (stream, "static const uc_interval_t script_%s_intervals[] =\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, "{\n");
+ i = 0;
+ for (ch = 0; ch < 0x110000; ch++)
+ if (unicode_scripts[ch] == s)
+ {
+ unsigned int start;
+ unsigned int end;
+
+ start = ch;
+ while (ch + 1 < 0x110000 && unicode_scripts[ch + 1] == s)
+ ch++;
+ end = ch;
+
+ if (i > 0)
+ fprintf (stream, ",\n");
+ if (start == end)
+ fprintf (stream, " { 0x%04X, 1, 1 }", start);
+ else
+ fprintf (stream, " { 0x%04X, 1, 0 }, { 0x%04X, 0, 1 }",
+ start, end);
+ i++;
+ }
+ fprintf (stream, "\n");
+ fprintf (stream, "};\n");
+ }
+
+ fprintf (stream, "static const uc_script_t scripts[%d] =\n", numscripts);
+ fprintf (stream, "{\n");
+ for (s = 0; s < numscripts; s++)
+ {
+ fprintf (stream, " {\n");
+ fprintf (stream, " sizeof (script_%s_intervals) / sizeof (uc_interval_t),\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, " script_%s_intervals,\n",
+ scriptinfo[s].lowercase_name);
+ fprintf (stream, " \"%s\"\n", scripts[s]);
+ fprintf (stream, " }");
+ if (s+1 < numscripts)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+
+ t.p = 7;
+ t.q = 9;
+ script_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int s = unicode_scripts[ch];
+ if (s != (uint8_t)~(uint8_t)0)
+ script_table_add (&t, ch, s);
+ }
+
+ script_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define script_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_script =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %3d", ((uint8_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_scripts_byname (const char *version)
+{
+ const char *filename = "unictype/scripts_byname.gperf";
+ FILE *stream;
+ unsigned int s;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode scripts. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "struct named_script { int name; unsigned int index; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define hash-function-name scripts_hash\n");
+ fprintf (stream, "%%define lookup-function-name uc_script_lookup\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%global-table\n");
+ fprintf (stream, "%%define word-array-name script_names\n");
+ fprintf (stream, "%%pic\n");
+ fprintf (stream, "%%define string-pool-name script_stringpool\n");
+ fprintf (stream, "%%%%\n");
+ for (s = 0; s < numscripts; s++)
+ fprintf (stream, "%s, %u\n", scripts[s], s);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Blocks. */
+
+typedef struct { unsigned int start; unsigned int end; const char *name; }
+ block_t;
+static block_t blocks[256];
+static unsigned int numblocks;
+
+static void
+fill_blocks (const char *blocks_filename)
+{
+ FILE *stream;
+
+ stream = fopen (blocks_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", blocks_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char blockname[200+1];
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^\r]", &i1, &i2, padding, blockname) != 4)
+ {
+ fprintf (stderr, "parse error in '%s'\n", blocks_filename);
+ exit (1);
+ }
+ blocks[numblocks].start = i1;
+ blocks[numblocks].end = i2;
+ blocks[numblocks].name = strdup (blockname);
+ /* It must be sorted. */
+ if (numblocks > 0 && !(blocks[numblocks-1].end < blocks[numblocks].start))
+ abort ();
+ numblocks++;
+ if (numblocks == 256)
+ abort ();
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", blocks_filename);
+ exit (1);
+ }
+}
+
+/* Return the smallest block index among the blocks for characters >= ch. */
+static unsigned int
+block_first_index (unsigned int ch)
+{
+ /* Binary search. */
+ unsigned int lo = 0;
+ unsigned int hi = numblocks;
+ /* Invariants:
+ All blocks[i], i < lo, have blocks[i].end < ch,
+ all blocks[i], i >= hi, have blocks[i].end >= ch. */
+ while (lo < hi)
+ {
+ unsigned int mid = (lo + hi) / 2; /* >= lo, < hi */
+ if (blocks[mid].end < ch)
+ lo = mid + 1;
+ else
+ hi = mid;
+ }
+ return hi;
+}
+
+/* Return the largest block index among the blocks for characters <= ch,
+ plus 1. */
+static unsigned int
+block_last_index (unsigned int ch)
+{
+ /* Binary search. */
+ unsigned int lo = 0;
+ unsigned int hi = numblocks;
+ /* Invariants:
+ All blocks[i], i < lo, have blocks[i].start <= ch,
+ all blocks[i], i >= hi, have blocks[i].start > ch. */
+ while (lo < hi)
+ {
+ unsigned int mid = (lo + hi) / 2; /* >= lo, < hi */
+ if (blocks[mid].start <= ch)
+ lo = mid + 1;
+ else
+ hi = mid;
+ }
+ return hi;
+}
+
+static void
+output_blocks (const char *version)
+{
+ const char *filename = "unictype/blocks.h";
+ const unsigned int shift = 8; /* bits to shift away for array access */
+ const unsigned int threshold = 0x30000; /* cut-off table here to save space */
+ FILE *stream;
+ unsigned int i;
+ unsigned int i1;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Unicode blocks. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ fprintf (stream, "static const uc_block_t blocks[] =\n");
+ fprintf (stream, "{\n");
+ for (i = 0; i < numblocks; i++)
+ {
+ fprintf (stream, " { 0x%04X, 0x%04X, \"%s\" }", blocks[i].start,
+ blocks[i].end, blocks[i].name);
+ if (i+1 < numblocks)
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+ fprintf (stream, "#define blocks_level1_shift %d\n", shift);
+ fprintf (stream, "#define blocks_level1_threshold 0x%04X\n", threshold);
+ fprintf (stream, "static const uint8_t blocks_level1[%d * 2] =\n",
+ threshold >> shift);
+ fprintf (stream, "{\n");
+ for (i1 = 0; i1 < (threshold >> shift); i1++)
+ {
+ unsigned int first_index = block_first_index (i1 << shift);
+ unsigned int last_index = block_last_index (((i1 + 1) << shift) - 1);
+ fprintf (stream, " %3d, %3d", first_index, last_index);
+ if (i1+1 < (threshold >> shift))
+ fprintf (stream, ",");
+ fprintf (stream, "\n");
+ }
+ fprintf (stream, "};\n");
+ fprintf (stream, "#define blocks_upper_first_index %d\n",
+ block_first_index (threshold));
+ fprintf (stream, "#define blocks_upper_last_index %d\n",
+ block_last_index (0x10FFFF));
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* C and Java syntax. */
+
+enum
+{
+ UC_IDENTIFIER_START, /* valid as first or subsequent character */
+ UC_IDENTIFIER_VALID, /* valid as subsequent character only */
+ UC_IDENTIFIER_INVALID, /* not valid */
+ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
+};
+
+/* ISO C 99 section 6.4.(3). */
+static bool
+is_c_whitespace (unsigned int ch)
+{
+ return (ch == ' ' /* space */
+ || ch == '\t' /* horizontal tab */
+ || ch == '\n' || ch == '\r' /* new-line */
+ || ch == '\v' /* vertical tab */
+ || ch == '\f'); /* form-feed */
+}
+
+/* ISO C 99 section 6.4.2.1 and appendix D. */
+static int
+c_ident_category (unsigned int ch)
+{
+ /* Section 6.4.2.1. */
+ if (ch >= '0' && ch <= '9')
+ return UC_IDENTIFIER_VALID;
+ if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_')
+ return UC_IDENTIFIER_START;
+ /* Appendix D. */
+ if (0
+ /* Latin */
+ || (ch == 0x00AA)
+ || (ch == 0x00BA)
+ || (ch >= 0x00C0 && ch <= 0x00D6)
+ || (ch >= 0x00D8 && ch <= 0x00F6)
+ || (ch >= 0x00F8 && ch <= 0x01F5)
+ || (ch >= 0x01FA && ch <= 0x0217)
+ || (ch >= 0x0250 && ch <= 0x02A8)
+ || (ch >= 0x1E00 && ch <= 0x1E9B)
+ || (ch >= 0x1EA0 && ch <= 0x1EF9)
+ || (ch == 0x207F)
+ /* Greek */
+ || (ch == 0x0386)
+ || (ch >= 0x0388 && ch <= 0x038A)
+ || (ch == 0x038C)
+ || (ch >= 0x038E && ch <= 0x03A1)
+ || (ch >= 0x03A3 && ch <= 0x03CE)
+ || (ch >= 0x03D0 && ch <= 0x03D6)
+ || (ch == 0x03DA)
+ || (ch == 0x03DC)
+ || (ch == 0x03DE)
+ || (ch == 0x03E0)
+ || (ch >= 0x03E2 && ch <= 0x03F3)
+ || (ch >= 0x1F00 && ch <= 0x1F15)
+ || (ch >= 0x1F18 && ch <= 0x1F1D)
+ || (ch >= 0x1F20 && ch <= 0x1F45)
+ || (ch >= 0x1F48 && ch <= 0x1F4D)
+ || (ch >= 0x1F50 && ch <= 0x1F57)
+ || (ch == 0x1F59)
+ || (ch == 0x1F5B)
+ || (ch == 0x1F5D)
+ || (ch >= 0x1F5F && ch <= 0x1F7D)
+ || (ch >= 0x1F80 && ch <= 0x1FB4)
+ || (ch >= 0x1FB6 && ch <= 0x1FBC)
+ || (ch >= 0x1FC2 && ch <= 0x1FC4)
+ || (ch >= 0x1FC6 && ch <= 0x1FCC)
+ || (ch >= 0x1FD0 && ch <= 0x1FD3)
+ || (ch >= 0x1FD6 && ch <= 0x1FDB)
+ || (ch >= 0x1FE0 && ch <= 0x1FEC)
+ || (ch >= 0x1FF2 && ch <= 0x1FF4)
+ || (ch >= 0x1FF6 && ch <= 0x1FFC)
+ /* Cyrillic */
+ || (ch >= 0x0401 && ch <= 0x040C)
+ || (ch >= 0x040E && ch <= 0x044F)
+ || (ch >= 0x0451 && ch <= 0x045C)
+ || (ch >= 0x045E && ch <= 0x0481)
+ || (ch >= 0x0490 && ch <= 0x04C4)
+ || (ch >= 0x04C7 && ch <= 0x04C8)
+ || (ch >= 0x04CB && ch <= 0x04CC)
+ || (ch >= 0x04D0 && ch <= 0x04EB)
+ || (ch >= 0x04EE && ch <= 0x04F5)
+ || (ch >= 0x04F8 && ch <= 0x04F9)
+ /* Armenian */
+ || (ch >= 0x0531 && ch <= 0x0556)
+ || (ch >= 0x0561 && ch <= 0x0587)
+ /* Hebrew */
+ || (ch >= 0x05B0 && ch <= 0x05B9)
+ || (ch >= 0x05BB && ch <= 0x05BD)
+ || (ch == 0x05BF)
+ || (ch >= 0x05C1 && ch <= 0x05C2)
+ || (ch >= 0x05D0 && ch <= 0x05EA)
+ || (ch >= 0x05F0 && ch <= 0x05F2)
+ /* Arabic */
+ || (ch >= 0x0621 && ch <= 0x063A)
+ || (ch >= 0x0640 && ch <= 0x0652)
+ || (ch >= 0x0670 && ch <= 0x06B7)
+ || (ch >= 0x06BA && ch <= 0x06BE)
+ || (ch >= 0x06C0 && ch <= 0x06CE)
+ || (ch >= 0x06D0 && ch <= 0x06DC)
+ || (ch >= 0x06E5 && ch <= 0x06E8)
+ || (ch >= 0x06EA && ch <= 0x06ED)
+ /* Devanagari */
+ || (ch >= 0x0901 && ch <= 0x0903)
+ || (ch >= 0x0905 && ch <= 0x0939)
+ || (ch >= 0x093E && ch <= 0x094D)
+ || (ch >= 0x0950 && ch <= 0x0952)
+ || (ch >= 0x0958 && ch <= 0x0963)
+ /* Bengali */
+ || (ch >= 0x0981 && ch <= 0x0983)
+ || (ch >= 0x0985 && ch <= 0x098C)
+ || (ch >= 0x098F && ch <= 0x0990)
+ || (ch >= 0x0993 && ch <= 0x09A8)
+ || (ch >= 0x09AA && ch <= 0x09B0)
+ || (ch == 0x09B2)
+ || (ch >= 0x09B6 && ch <= 0x09B9)
+ || (ch >= 0x09BE && ch <= 0x09C4)
+ || (ch >= 0x09C7 && ch <= 0x09C8)
+ || (ch >= 0x09CB && ch <= 0x09CD)
+ || (ch >= 0x09DC && ch <= 0x09DD)
+ || (ch >= 0x09DF && ch <= 0x09E3)
+ || (ch >= 0x09F0 && ch <= 0x09F1)
+ /* Gurmukhi */
+ || (ch == 0x0A02)
+ || (ch >= 0x0A05 && ch <= 0x0A0A)
+ || (ch >= 0x0A0F && ch <= 0x0A10)
+ || (ch >= 0x0A13 && ch <= 0x0A28)
+ || (ch >= 0x0A2A && ch <= 0x0A30)
+ || (ch >= 0x0A32 && ch <= 0x0A33)
+ || (ch >= 0x0A35 && ch <= 0x0A36)
+ || (ch >= 0x0A38 && ch <= 0x0A39)
+ || (ch >= 0x0A3E && ch <= 0x0A42)
+ || (ch >= 0x0A47 && ch <= 0x0A48)
+ || (ch >= 0x0A4B && ch <= 0x0A4D)
+ || (ch >= 0x0A59 && ch <= 0x0A5C)
+ || (ch == 0x0A5E)
+ || (ch == 0x0A74)
+ /* Gujarati */
+ || (ch >= 0x0A81 && ch <= 0x0A83)
+ || (ch >= 0x0A85 && ch <= 0x0A8B)
+ || (ch == 0x0A8D)
+ || (ch >= 0x0A8F && ch <= 0x0A91)
+ || (ch >= 0x0A93 && ch <= 0x0AA8)
+ || (ch >= 0x0AAA && ch <= 0x0AB0)
+ || (ch >= 0x0AB2 && ch <= 0x0AB3)
+ || (ch >= 0x0AB5 && ch <= 0x0AB9)
+ || (ch >= 0x0ABD && ch <= 0x0AC5)
+ || (ch >= 0x0AC7 && ch <= 0x0AC9)
+ || (ch >= 0x0ACB && ch <= 0x0ACD)
+ || (ch == 0x0AD0)
+ || (ch == 0x0AE0)
+ /* Oriya */
+ || (ch >= 0x0B01 && ch <= 0x0B03)
+ || (ch >= 0x0B05 && ch <= 0x0B0C)
+ || (ch >= 0x0B0F && ch <= 0x0B10)
+ || (ch >= 0x0B13 && ch <= 0x0B28)
+ || (ch >= 0x0B2A && ch <= 0x0B30)
+ || (ch >= 0x0B32 && ch <= 0x0B33)
+ || (ch >= 0x0B36 && ch <= 0x0B39)
+ || (ch >= 0x0B3E && ch <= 0x0B43)
+ || (ch >= 0x0B47 && ch <= 0x0B48)
+ || (ch >= 0x0B4B && ch <= 0x0B4D)
+ || (ch >= 0x0B5C && ch <= 0x0B5D)
+ || (ch >= 0x0B5F && ch <= 0x0B61)
+ /* Tamil */
+ || (ch >= 0x0B82 && ch <= 0x0B83)
+ || (ch >= 0x0B85 && ch <= 0x0B8A)
+ || (ch >= 0x0B8E && ch <= 0x0B90)
+ || (ch >= 0x0B92 && ch <= 0x0B95)
+ || (ch >= 0x0B99 && ch <= 0x0B9A)
+ || (ch == 0x0B9C)
+ || (ch >= 0x0B9E && ch <= 0x0B9F)
+ || (ch >= 0x0BA3 && ch <= 0x0BA4)
+ || (ch >= 0x0BA8 && ch <= 0x0BAA)
+ || (ch >= 0x0BAE && ch <= 0x0BB5)
+ || (ch >= 0x0BB7 && ch <= 0x0BB9)
+ || (ch >= 0x0BBE && ch <= 0x0BC2)
+ || (ch >= 0x0BC6 && ch <= 0x0BC8)
+ || (ch >= 0x0BCA && ch <= 0x0BCD)
+ /* Telugu */
+ || (ch >= 0x0C01 && ch <= 0x0C03)
+ || (ch >= 0x0C05 && ch <= 0x0C0C)
+ || (ch >= 0x0C0E && ch <= 0x0C10)
+ || (ch >= 0x0C12 && ch <= 0x0C28)
+ || (ch >= 0x0C2A && ch <= 0x0C33)
+ || (ch >= 0x0C35 && ch <= 0x0C39)
+ || (ch >= 0x0C3E && ch <= 0x0C44)
+ || (ch >= 0x0C46 && ch <= 0x0C48)
+ || (ch >= 0x0C4A && ch <= 0x0C4D)
+ || (ch >= 0x0C60 && ch <= 0x0C61)
+ /* Kannada */
+ || (ch >= 0x0C82 && ch <= 0x0C83)
+ || (ch >= 0x0C85 && ch <= 0x0C8C)
+ || (ch >= 0x0C8E && ch <= 0x0C90)
+ || (ch >= 0x0C92 && ch <= 0x0CA8)
+ || (ch >= 0x0CAA && ch <= 0x0CB3)
+ || (ch >= 0x0CB5 && ch <= 0x0CB9)
+ || (ch >= 0x0CBE && ch <= 0x0CC4)
+ || (ch >= 0x0CC6 && ch <= 0x0CC8)
+ || (ch >= 0x0CCA && ch <= 0x0CCD)
+ || (ch == 0x0CDE)
+ || (ch >= 0x0CE0 && ch <= 0x0CE1)
+ /* Malayalam */
+ || (ch >= 0x0D02 && ch <= 0x0D03)
+ || (ch >= 0x0D05 && ch <= 0x0D0C)
+ || (ch >= 0x0D0E && ch <= 0x0D10)
+ || (ch >= 0x0D12 && ch <= 0x0D28)
+ || (ch >= 0x0D2A && ch <= 0x0D39)
+ || (ch >= 0x0D3E && ch <= 0x0D43)
+ || (ch >= 0x0D46 && ch <= 0x0D48)
+ || (ch >= 0x0D4A && ch <= 0x0D4D)
+ || (ch >= 0x0D60 && ch <= 0x0D61)
+ /* Thai */
+ || (ch >= 0x0E01 && ch <= 0x0E3A)
+ || (ch >= 0x0E40 && ch <= 0x0E5B)
+ /* Lao */
+ || (ch >= 0x0E81 && ch <= 0x0E82)
+ || (ch == 0x0E84)
+ || (ch >= 0x0E87 && ch <= 0x0E88)
+ || (ch == 0x0E8A)
+ || (ch == 0x0E8D)
+ || (ch >= 0x0E94 && ch <= 0x0E97)
+ || (ch >= 0x0E99 && ch <= 0x0E9F)
+ || (ch >= 0x0EA1 && ch <= 0x0EA3)
+ || (ch == 0x0EA5)
+ || (ch == 0x0EA7)
+ || (ch >= 0x0EAA && ch <= 0x0EAB)
+ || (ch >= 0x0EAD && ch <= 0x0EAE)
+ || (ch >= 0x0EB0 && ch <= 0x0EB9)
+ || (ch >= 0x0EBB && ch <= 0x0EBD)
+ || (ch >= 0x0EC0 && ch <= 0x0EC4)
+ || (ch == 0x0EC6)
+ || (ch >= 0x0EC8 && ch <= 0x0ECD)
+ || (ch >= 0x0EDC && ch <= 0x0EDD)
+ /* Tibetan */
+ || (ch == 0x0F00)
+ || (ch >= 0x0F18 && ch <= 0x0F19)
+ || (ch == 0x0F35)
+ || (ch == 0x0F37)
+ || (ch == 0x0F39)
+ || (ch >= 0x0F3E && ch <= 0x0F47)
+ || (ch >= 0x0F49 && ch <= 0x0F69)
+ || (ch >= 0x0F71 && ch <= 0x0F84)
+ || (ch >= 0x0F86 && ch <= 0x0F8B)
+ || (ch >= 0x0F90 && ch <= 0x0F95)
+ || (ch == 0x0F97)
+ || (ch >= 0x0F99 && ch <= 0x0FAD)
+ || (ch >= 0x0FB1 && ch <= 0x0FB7)
+ || (ch == 0x0FB9)
+ /* Georgian */
+ || (ch >= 0x10A0 && ch <= 0x10C5)
+ || (ch >= 0x10D0 && ch <= 0x10F6)
+ /* Hiragana */
+ || (ch >= 0x3041 && ch <= 0x3093)
+ || (ch >= 0x309B && ch <= 0x309C)
+ /* Katakana */
+ || (ch >= 0x30A1 && ch <= 0x30F6)
+ || (ch >= 0x30FB && ch <= 0x30FC)
+ /* Bopomofo */
+ || (ch >= 0x3105 && ch <= 0x312C)
+ /* CJK Unified Ideographs */
+ || (ch >= 0x4E00 && ch <= 0x9FA5)
+ /* Hangul */
+ || (ch >= 0xAC00 && ch <= 0xD7A3)
+ /* Digits */
+ || (ch >= 0x0660 && ch <= 0x0669)
+ || (ch >= 0x06F0 && ch <= 0x06F9)
+ || (ch >= 0x0966 && ch <= 0x096F)
+ || (ch >= 0x09E6 && ch <= 0x09EF)
+ || (ch >= 0x0A66 && ch <= 0x0A6F)
+ || (ch >= 0x0AE6 && ch <= 0x0AEF)
+ || (ch >= 0x0B66 && ch <= 0x0B6F)
+ || (ch >= 0x0BE7 && ch <= 0x0BEF)
+ || (ch >= 0x0C66 && ch <= 0x0C6F)
+ || (ch >= 0x0CE6 && ch <= 0x0CEF)
+ || (ch >= 0x0D66 && ch <= 0x0D6F)
+ || (ch >= 0x0E50 && ch <= 0x0E59)
+ || (ch >= 0x0ED0 && ch <= 0x0ED9)
+ || (ch >= 0x0F20 && ch <= 0x0F33)
+ /* Special characters */
+ || (ch == 0x00B5)
+ || (ch == 0x00B7)
+ || (ch >= 0x02B0 && ch <= 0x02B8)
+ || (ch == 0x02BB)
+ || (ch >= 0x02BD && ch <= 0x02C1)
+ || (ch >= 0x02D0 && ch <= 0x02D1)
+ || (ch >= 0x02E0 && ch <= 0x02E4)
+ || (ch == 0x037A)
+ || (ch == 0x0559)
+ || (ch == 0x093D)
+ || (ch == 0x0B3D)
+ || (ch == 0x1FBE)
+ || (ch >= 0x203F && ch <= 0x2040)
+ || (ch == 0x2102)
+ || (ch == 0x2107)
+ || (ch >= 0x210A && ch <= 0x2113)
+ || (ch == 0x2115)
+ || (ch >= 0x2118 && ch <= 0x211D)
+ || (ch == 0x2124)
+ || (ch == 0x2126)
+ || (ch == 0x2128)
+ || (ch >= 0x212A && ch <= 0x2131)
+ || (ch >= 0x2133 && ch <= 0x2138)
+ || (ch >= 0x2160 && ch <= 0x2182)
+ || (ch >= 0x3005 && ch <= 0x3007)
+ || (ch >= 0x3021 && ch <= 0x3029)
+ )
+ return UC_IDENTIFIER_START;
+ return UC_IDENTIFIER_INVALID;
+}
+
+/* The Java Language Specification, 3rd edition, §3.6.
+ http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#95710 */
+static bool
+is_java_whitespace (unsigned int ch)
+{
+ return (ch == ' ' || ch == '\t' || ch == '\f'
+ || ch == '\n' || ch == '\r');
+}
+
+/* The Java Language Specification, 3rd edition, §3.8.
+ http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#40625
+ and Character.isJavaIdentifierStart and Character.isJavaIdentifierPart */
+static int
+java_ident_category (unsigned int ch)
+{
+ /* FIXME: Check this against Sun's JDK implementation. */
+ if (is_category_L (ch) /* = Character.isLetter(ch) */
+ || is_category_Nl (ch) /* = Character.getType(ch)==LETTER_NUMBER */
+ || is_category_Sc (ch) /* currency symbol */
+ || is_category_Pc (ch) /* connector punctuation */
+ )
+ return UC_IDENTIFIER_START;
+ if (is_category_Nd (ch) /* digit */
+ || is_category_Mc (ch) /* combining mark */
+ || is_category_Mn (ch) /* non-spacing mark */
+ )
+ return UC_IDENTIFIER_VALID;
+ if ((ch >= 0x0000 && ch <= 0x0008)
+ || (ch >= 0x000E && ch <= 0x001B)
+ || (ch >= 0x007F && ch <= 0x009F)
+ || is_category_Cf (ch) /* = Character.getType(ch)==FORMAT */
+ )
+ return UC_IDENTIFIER_IGNORABLE;
+ return UC_IDENTIFIER_INVALID;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE identsyntax_table
+#define ELEMENT uint8_t
+#define DEFAULT UC_IDENTIFIER_INVALID
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output an identifier syntax categorization in a three-level bitmap. */
+static void
+output_ident_category (const char *filename, int (*predicate) (unsigned int), const char *name, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct identsyntax_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Language syntax properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7; /* or 8 */
+ t.q = 5; /* or 4 */
+ identsyntax_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int syntaxcode = predicate (ch);
+ if (syntaxcode != UC_IDENTIFIER_INVALID)
+ identsyntax_table_add (&t, ch, syntaxcode);
+ }
+
+ identsyntax_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define identsyntax_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned short level3[%zu * %d];\n", t.level3_size,
+ (1 << t.p) * 2 / 16);
+ fprintf (stream, " }\n");
+ fprintf (stream, "%s =\n", name);
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ /* Pack the level3 array. Each entry needs 2 bits only. */
+ fprintf (stream, " {");
+ if ((t.level3_size << t.p) * 2 / 16 > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) * 2 / 16; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%04x",
+ (((uint8_t *) (t.result + level3_offset))[8 * i] << 0)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 1] << 2)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 2] << 4)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 3] << 6)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 4] << 8)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 5] << 10)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 6] << 12)
+ | (((uint8_t *) (t.result + level3_offset))[8 * i + 7] << 14));
+ if (i+1 < (t.level3_size << t.p) * 2 / 16)
+ fprintf (stream, ",");
+ }
+ if ((t.level3_size << t.p) * 2 / 16 > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_ident_properties (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/sy_" #P ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unictype/test-sy_" #P ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unictype/sy_" #P ".h", is_ ## P, "u_" #P, "Language syntax properties", version);
+ PROPERTY(c_whitespace)
+ PROPERTY(java_whitespace)
+#undef PROPERTY
+
+ output_ident_category ("unictype/sy_c_ident.h", c_ident_category, "u_c_ident", version);
+ output_ident_category ("unictype/sy_java_ident.h", java_ident_category, "u_java_ident", version);
+}
+
+/* ========================================================================= */
+
+/* Like ISO C <ctype.h> and <wctype.h>. Compatible to glibc's
+ glibc/localedata/locales/i18n file, generated by
+ glibc/localedata/gen-unicode-ctype.c. */
+
+/* Character mappings. */
+
+static unsigned int
+to_upper (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].upper != NONE)
+ return unicode_attributes[ch].upper;
+ else
+ return ch;
+}
+
+static unsigned int
+to_lower (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].lower != NONE)
+ return unicode_attributes[ch].lower;
+ else
+ return ch;
+}
+
+static unsigned int
+to_title (unsigned int ch)
+{
+ if (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].title != NONE)
+ return unicode_attributes[ch].title;
+ else
+ return ch;
+}
+
+/* Character class properties. */
+
+static bool
+is_upper (unsigned int ch)
+{
+ return (to_lower (ch) != ch);
+}
+
+static bool
+is_lower (unsigned int ch)
+{
+ return (to_upper (ch) != ch)
+ /* <U00DF> is lowercase, but without simple to_upper mapping. */
+ || (ch == 0x00DF);
+}
+
+static bool
+is_alpha (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && ((unicode_attributes[ch].category[0] == 'L'
+ /* Theppitak Karoonboonyanan <thep@links.nectec.or.th> says
+ <U0E2F>, <U0E46> should belong to is_punct. */
+ && (ch != 0x0E2F) && (ch != 0x0E46))
+ /* Theppitak Karoonboonyanan <thep@links.nectec.or.th> says
+ <U0E31>, <U0E34>..<U0E3A>, <U0E47>..<U0E4E> are is_alpha. */
+ || (ch == 0x0E31)
+ || (ch >= 0x0E34 && ch <= 0x0E3A)
+ || (ch >= 0x0E47 && ch <= 0x0E4E)
+ /* Avoid warning for <U0345>. */
+ || (ch == 0x0345)
+ /* Avoid warnings for <U2160>..<U217F>. */
+ || (unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'l')
+ /* Avoid warnings for <U24B6>..<U24E9>. */
+ || (unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'o'
+ && strstr (unicode_attributes[ch].name, " LETTER ")
+ != NULL)
+ /* Consider all the non-ASCII digits as alphabetic.
+ ISO C 99 forbids us to have them in category "digit",
+ but we want iswalnum to return true on them. */
+ || (unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd'
+ && !(ch >= 0x0030 && ch <= 0x0039))));
+}
+
+static bool
+is_digit (unsigned int ch)
+{
+#if 0
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd');
+ /* Note: U+0BE7..U+0BEF and U+1369..U+1371 are digit systems without
+ a zero. Must add <0> in front of them by hand. */
+#else
+ /* SUSV2 gives us some freedom for the "digit" category, but ISO C 99
+ takes it away:
+ 7.25.2.1.5:
+ The iswdigit function tests for any wide character that corresponds
+ to a decimal-digit character (as defined in 5.2.1).
+ 5.2.1:
+ the 10 decimal digits 0 1 2 3 4 5 6 7 8 9
+ */
+ return (ch >= 0x0030 && ch <= 0x0039);
+#endif
+}
+
+static bool
+is_outdigit (unsigned int ch)
+{
+ return (ch >= 0x0030 && ch <= 0x0039);
+}
+
+static bool
+is_alnum (unsigned int ch)
+{
+ return is_alpha (ch) || is_digit (ch);
+}
+
+static bool
+is_blank (unsigned int ch)
+{
+ return (ch == 0x0009 /* '\t' */
+ /* Category Zs without mention of "<noBreak>" */
+ || (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && unicode_attributes[ch].category[1] == 's'
+ && !strstr (unicode_attributes[ch].decomposition, "<noBreak>")));
+}
+
+static bool
+is_space (unsigned int ch)
+{
+ /* Don't make U+00A0 a space. Non-breaking space means that all programs
+ should treat it like a punctuation character, not like a space. */
+ return (ch == 0x0020 /* ' ' */
+ || ch == 0x000C /* '\f' */
+ || ch == 0x000A /* '\n' */
+ || ch == 0x000D /* '\r' */
+ || ch == 0x0009 /* '\t' */
+ || ch == 0x000B /* '\v' */
+ /* Categories Zl, Zp, and Zs without mention of "<noBreak>" */
+ || (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p'
+ || (unicode_attributes[ch].category[1] == 's'
+ && !strstr (unicode_attributes[ch].decomposition,
+ "<noBreak>")))));
+}
+
+static bool
+is_cntrl (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && (strcmp (unicode_attributes[ch].name, "<control>") == 0
+ /* Categories Zl and Zp */
+ || (unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p'))));
+}
+
+static bool
+is_xdigit (unsigned int ch)
+{
+#if 0
+ return is_digit (ch)
+ || (ch >= 0x0041 && ch <= 0x0046)
+ || (ch >= 0x0061 && ch <= 0x0066);
+#else
+ /* SUSV2 gives us some freedom for the "xdigit" category, but ISO C 99
+ takes it away:
+ 7.25.2.1.12:
+ The iswxdigit function tests for any wide character that corresponds
+ to a hexadecimal-digit character (as defined in 6.4.4.1).
+ 6.4.4.1:
+ hexadecimal-digit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
+ */
+ return (ch >= 0x0030 && ch <= 0x0039)
+ || (ch >= 0x0041 && ch <= 0x0046)
+ || (ch >= 0x0061 && ch <= 0x0066);
+#endif
+}
+
+static bool
+is_graph (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>")
+ && !is_space (ch));
+}
+
+static bool
+is_print (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && strcmp (unicode_attributes[ch].name, "<control>")
+ /* Categories Zl and Zp */
+ && !(unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'Z'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'p')));
+}
+
+static bool
+is_punct (unsigned int ch)
+{
+#if 0
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'P');
+#else
+ /* The traditional POSIX definition of punctuation is every graphic,
+ non-alphanumeric character. */
+ return (is_graph (ch) && !is_alpha (ch) && !is_digit (ch));
+#endif
+}
+
+/* Output all properties. */
+static void
+output_old_ctype (const char *version)
+{
+#define PROPERTY(P) \
+ debug_output_predicate ("unictype/ctype_" #P ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unictype/test-ctype_" #P ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unictype/ctype_" #P ".h", is_ ## P, "u_is_" #P, "ISO C <ctype.h> like properties", version);
+ PROPERTY(alnum)
+ PROPERTY(alpha)
+ PROPERTY(cntrl)
+ PROPERTY(digit)
+ PROPERTY(graph)
+ PROPERTY(lower)
+ PROPERTY(print)
+ PROPERTY(punct)
+ PROPERTY(space)
+ PROPERTY(upper)
+ PROPERTY(xdigit)
+ PROPERTY(blank)
+#undef PROPERTY
+}
+
+#if 0
+
+static bool
+is_combining (unsigned int ch)
+{
+ /* Up to Unicode 3.0.1 we took the Combining property from the PropList.txt
+ file. In 3.0.1 it was identical to the union of the general categories
+ "Mn", "Mc", "Me". In Unicode 3.1 this property has been dropped from the
+ PropList.txt file, so we take the latter definition. */
+ return (unicode_attributes[ch].name != NULL
+ && unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'n'
+ || unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'e'));
+}
+
+static bool
+is_combining_level3 (unsigned int ch)
+{
+ return is_combining (ch)
+ && !(unicode_attributes[ch].combining[0] != '\0'
+ && unicode_attributes[ch].combining[0] != '0'
+ && strtoul (unicode_attributes[ch].combining, NULL, 10) >= 200);
+}
+
+/* Return the UCS symbol string for a Unicode character. */
+static const char *
+ucs_symbol (unsigned int i)
+{
+ static char buf[11+1];
+
+ sprintf (buf, (i < 0x10000 ? "<U%04X>" : "<U%08X>"), i);
+ return buf;
+}
+
+/* Return the UCS symbol range string for a Unicode characters interval. */
+static const char *
+ucs_symbol_range (unsigned int low, unsigned int high)
+{
+ static char buf[24+1];
+
+ strcpy (buf, ucs_symbol (low));
+ strcat (buf, "..");
+ strcat (buf, ucs_symbol (high));
+ return buf;
+}
+
+/* Output a character class (= property) table. */
+
+static void
+output_charclass (FILE *stream, const char *classname,
+ bool (*func) (unsigned int))
+{
+ char table[0x110000];
+ unsigned int i;
+ bool need_semicolon;
+ const int max_column = 75;
+ int column;
+
+ for (i = 0; i < 0x110000; i++)
+ table[i] = (int) func (i);
+
+ fprintf (stream, "%s ", classname);
+ need_semicolon = false;
+ column = 1000;
+ for (i = 0; i < 0x110000; )
+ {
+ if (!table[i])
+ i++;
+ else
+ {
+ unsigned int low, high;
+ char buf[25];
+
+ low = i;
+ do
+ i++;
+ while (i < 0x110000 && table[i]);
+ high = i - 1;
+
+ if (low == high)
+ strcpy (buf, ucs_symbol (low));
+ else
+ strcpy (buf, ucs_symbol_range (low, high));
+
+ if (need_semicolon)
+ {
+ fprintf (stream, ";");
+ column++;
+ }
+
+ if (column + strlen (buf) > max_column)
+ {
+ fprintf (stream, "/\n ");
+ column = 3;
+ }
+
+ fprintf (stream, "%s", buf);
+ column += strlen (buf);
+ need_semicolon = true;
+ }
+ }
+ fprintf (stream, "\n");
+}
+
+/* Output a character mapping table. */
+
+static void
+output_charmap (FILE *stream, const char *mapname,
+ unsigned int (*func) (unsigned int))
+{
+ char table[0x110000];
+ unsigned int i;
+ bool need_semicolon;
+ const int max_column = 75;
+ int column;
+
+ for (i = 0; i < 0x110000; i++)
+ table[i] = (func (i) != i);
+
+ fprintf (stream, "%s ", mapname);
+ need_semicolon = false;
+ column = 1000;
+ for (i = 0; i < 0x110000; i++)
+ if (table[i])
+ {
+ char buf[25+1];
+
+ strcpy (buf, "(");
+ strcat (buf, ucs_symbol (i));
+ strcat (buf, ",");
+ strcat (buf, ucs_symbol (func (i)));
+ strcat (buf, ")");
+
+ if (need_semicolon)
+ {
+ fprintf (stream, ";");
+ column++;
+ }
+
+ if (column + strlen (buf) > max_column)
+ {
+ fprintf (stream, "/\n ");
+ column = 3;
+ }
+
+ fprintf (stream, "%s", buf);
+ column += strlen (buf);
+ need_semicolon = true;
+ }
+ fprintf (stream, "\n");
+}
+
+/* Output the width table. */
+
+static void
+output_widthmap (FILE *stream)
+{
+}
+
+/* Output the tables to the given file. */
+
+static void
+output_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "escape_char /\n");
+ fprintf (stream, "comment_char %%\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "%% Generated automatically by gen-uni-tables.c for Unicode %s.\n",
+ version);
+ fprintf (stream, "\n");
+
+ fprintf (stream, "LC_IDENTIFICATION\n");
+ fprintf (stream, "title \"Unicode %s FDCC-set\"\n", version);
+ fprintf (stream, "source \"UnicodeData.txt, PropList.txt\"\n");
+ fprintf (stream, "address \"\"\n");
+ fprintf (stream, "contact \"\"\n");
+ fprintf (stream, "email \"bug-glibc@gnu.org\"\n");
+ fprintf (stream, "tel \"\"\n");
+ fprintf (stream, "fax \"\"\n");
+ fprintf (stream, "language \"\"\n");
+ fprintf (stream, "territory \"Earth\"\n");
+ fprintf (stream, "revision \"%s\"\n", version);
+ {
+ time_t now;
+ char date[11];
+ now = time (NULL);
+ strftime (date, sizeof (date), "%Y-%m-%d", gmtime (&now));
+ fprintf (stream, "date \"%s\"\n", date);
+ }
+ fprintf (stream, "category \"unicode:2001\";LC_CTYPE\n");
+ fprintf (stream, "END LC_IDENTIFICATION\n");
+ fprintf (stream, "\n");
+
+ /* Verifications. */
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ /* toupper restriction: "Only characters specified for the keywords
+ lower and upper shall be specified. */
+ if (to_upper (ch) != ch && !(is_lower (ch) || is_upper (ch)))
+ fprintf (stderr,
+ "%s is not upper|lower but toupper(0x%04X) = 0x%04X\n",
+ ucs_symbol (ch), ch, to_upper (ch));
+
+ /* tolower restriction: "Only characters specified for the keywords
+ lower and upper shall be specified. */
+ if (to_lower (ch) != ch && !(is_lower (ch) || is_upper (ch)))
+ fprintf (stderr,
+ "%s is not upper|lower but tolower(0x%04X) = 0x%04X\n",
+ ucs_symbol (ch), ch, to_lower (ch));
+
+ /* alpha restriction: "Characters classified as either upper or lower
+ shall automatically belong to this class. */
+ if ((is_lower (ch) || is_upper (ch)) && !is_alpha (ch))
+ fprintf (stderr, "%s is upper|lower but not alpha\n", ucs_symbol (ch));
+
+ /* alpha restriction: "No character specified for the keywords cntrl,
+ digit, punct or space shall be specified." */
+ if (is_alpha (ch) && is_cntrl (ch))
+ fprintf (stderr, "%s is alpha and cntrl\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_digit (ch))
+ fprintf (stderr, "%s is alpha and digit\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_punct (ch))
+ fprintf (stderr, "%s is alpha and punct\n", ucs_symbol (ch));
+ if (is_alpha (ch) && is_space (ch))
+ fprintf (stderr, "%s is alpha and space\n", ucs_symbol (ch));
+
+ /* space restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, graph or xdigit shall be specified."
+ upper, lower, alpha already checked above. */
+ if (is_space (ch) && is_digit (ch))
+ fprintf (stderr, "%s is space and digit\n", ucs_symbol (ch));
+ if (is_space (ch) && is_graph (ch))
+ fprintf (stderr, "%s is space and graph\n", ucs_symbol (ch));
+ if (is_space (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is space and xdigit\n", ucs_symbol (ch));
+
+ /* cntrl restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, punct, graph, print or xdigit shall be
+ specified." upper, lower, alpha already checked above. */
+ if (is_cntrl (ch) && is_digit (ch))
+ fprintf (stderr, "%s is cntrl and digit\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_punct (ch))
+ fprintf (stderr, "%s is cntrl and punct\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_graph (ch))
+ fprintf (stderr, "%s is cntrl and graph\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_print (ch))
+ fprintf (stderr, "%s is cntrl and print\n", ucs_symbol (ch));
+ if (is_cntrl (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is cntrl and xdigit\n", ucs_symbol (ch));
+
+ /* punct restriction: "No character specified for the keywords upper,
+ lower, alpha, digit, cntrl, xdigit or as the <space> character shall
+ be specified." upper, lower, alpha, cntrl already checked above. */
+ if (is_punct (ch) && is_digit (ch))
+ fprintf (stderr, "%s is punct and digit\n", ucs_symbol (ch));
+ if (is_punct (ch) && is_xdigit (ch))
+ fprintf (stderr, "%s is punct and xdigit\n", ucs_symbol (ch));
+ if (is_punct (ch) && (ch == 0x0020))
+ fprintf (stderr, "%s is punct\n", ucs_symbol (ch));
+
+ /* graph restriction: "No character specified for the keyword cntrl
+ shall be specified." Already checked above. */
+
+ /* print restriction: "No character specified for the keyword cntrl
+ shall be specified." Already checked above. */
+
+ /* graph - print relation: differ only in the <space> character.
+ How is this possible if there are more than one space character?!
+ I think susv2/xbd/locale.html should speak of "space characters",
+ not "space character". */
+ if (is_print (ch) && !(is_graph (ch) || /* ch == 0x0020 */ is_space (ch)))
+ fprintf (stderr,
+ "%s is print but not graph|<space>\n", ucs_symbol (ch));
+ if (!is_print (ch) && (is_graph (ch) || ch == 0x0020))
+ fprintf (stderr,
+ "%s is graph|<space> but not print\n", ucs_symbol (ch));
+ }
+
+ fprintf (stream, "LC_CTYPE\n");
+ output_charclass (stream, "upper", is_upper);
+ output_charclass (stream, "lower", is_lower);
+ output_charclass (stream, "alpha", is_alpha);
+ output_charclass (stream, "digit", is_digit);
+ output_charclass (stream, "outdigit", is_outdigit);
+ output_charclass (stream, "blank", is_blank);
+ output_charclass (stream, "space", is_space);
+ output_charclass (stream, "cntrl", is_cntrl);
+ output_charclass (stream, "punct", is_punct);
+ output_charclass (stream, "xdigit", is_xdigit);
+ output_charclass (stream, "graph", is_graph);
+ output_charclass (stream, "print", is_print);
+ output_charclass (stream, "class \"combining\";", is_combining);
+ output_charclass (stream, "class \"combining_level3\";", is_combining_level3);
+ output_charmap (stream, "toupper", to_upper);
+ output_charmap (stream, "tolower", to_lower);
+ output_charmap (stream, "map \"totitle\";", to_title);
+ output_widthmap (stream);
+ fprintf (stream, "END LC_CTYPE\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+#endif
+
+/* ========================================================================= */
+
+/* The width property from the EastAsianWidth.txt file.
+ Each is NULL (unassigned) or "N", "A", "H", "W", "F", "Na". */
+const char * unicode_width[0x110000];
+
+/* Stores in unicode_width[] the width property from the EastAsianWidth.txt
+ file. */
+static void
+fill_width (const char *width_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_width[i] = (unicode_attributes[i].name != NULL ? "N" : NULL);
+
+ stream = fopen (width_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", width_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+ int c;
+
+ lineno++;
+ c = getc (stream);
+ if (c == EOF)
+ break;
+ if (c == '#')
+ {
+ do c = getc (stream); while (c != EOF && c != '\n');
+ continue;
+ }
+ ungetc (c, stream);
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ' ');
+ n += getfield (stream, field2, '\n');
+ if (n == 0)
+ break;
+ if (n != 3)
+ {
+ fprintf (stderr, "short line in '%s':%d\n", width_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (strstr (field0, "..") != NULL)
+ {
+ /* Deal with a range. */
+ j = strtoul (strstr (field0, "..") + 2, NULL, 16);
+ for (; i <= j; i++)
+ unicode_width[i] = strdup (field1);
+ }
+ else
+ {
+ /* Single character line. */
+ unicode_width[i] = strdup (field1);
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", width_filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Non-spacing attribute and width. */
+
+/* The non-spacing attribute table consists of:
+ - Non-spacing characters; generated from PropList.txt or
+ "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
+ - Format control characters; generated from
+ "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
+ - Zero width characters; generated from
+ "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
+ */
+
+static bool
+is_nonspacing (unsigned int ch)
+{
+ return (unicode_attributes[ch].name != NULL
+ && (get_bidi_category (ch) == UC_BIDI_NSM
+ || is_category_Cc (ch) || is_category_Cf (ch)
+ || strncmp (unicode_attributes[ch].name, "ZERO WIDTH ", 11) == 0));
+}
+
+static void
+output_nonspacing_property (const char *filename)
+{
+ FILE *stream;
+ int ind[0x110000 / 0x200];
+ unsigned int i;
+ unsigned int i_max;
+ int next_ind;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ next_ind = 0;
+ for (i = 0; i < 0x110000 / 0x200; i++)
+ {
+ bool nontrivial = false;
+ unsigned int ch;
+
+ if (i != 0xe0000 / 0x200) /* The 0xe0000 block is handled by code. */
+ for (ch = i * 0x200; ch < (i + 1) * 0x200; ch++)
+ if (is_nonspacing (ch))
+ {
+ nontrivial = true;
+ break;
+ }
+ if (nontrivial)
+ ind[i] = next_ind++;
+ else
+ ind[i] = -1;
+ }
+
+ fprintf (stream, "static const unsigned char nonspacing_table_data[%d*64] = {\n",
+ next_ind);
+ i_max = 0;
+ for (i = 0; i < 0x110000 / 0x200; i++)
+ {
+ bool nontrivial = (ind[i] >= 0);
+
+ if (nontrivial)
+ {
+ unsigned int j;
+
+ fprintf (stream, " /* 0x%04x-0x%04x */\n", i * 0x200, (i + 1) * 0x200 - 1);
+ for (j = 0; j < 8; j++)
+ {
+ unsigned int k;
+
+ fprintf (stream, " ");
+ for (k = 0; k < 8; k++)
+ {
+ unsigned int l;
+ unsigned char bits = 0;
+
+ for (l = 0; l < 8; l++)
+ {
+ unsigned int ch = i * 0x200 + j * 0x40 + k * 8 + l;
+
+ if (is_nonspacing (ch))
+ bits |= 1 << l;
+ }
+ fprintf (stream, " 0x%02x%c", bits,
+ ind[i] + 1 == next_ind && j == 8 - 1 && k == 8 - 1 ? ' ' : ',');
+ }
+ fprintf (stream, " /* 0x%04x-0x%04x */\n",
+ i * 0x200 + j * 0x40, i * 0x200 + (j + 1) * 0x40 - 1);
+ }
+ i_max = i;
+ }
+ }
+ fprintf (stream, "};\n");
+
+ i_max = ((i_max + 8 - 1) / 8) * 8;
+ fprintf (stream, "static const signed char nonspacing_table_ind[%u] = {\n",
+ i_max);
+ {
+ unsigned int j;
+
+ for (j = 0; j < i_max / 8; j++)
+ {
+ unsigned int k;
+
+ fprintf (stream, " ");
+ for (k = 0; k < 8; k++)
+ {
+ i = j * 8 + k;
+ fprintf (stream, " %2d%c", ind[i],
+ j == i_max / 8 - 1 && k == 8 - 1 ? ' ' : ',');
+ }
+ fprintf (stream, " /* 0x%04x-0x%04x */\n",
+ j * 8 * 0x200, (j + 1) * 8 * 0x200 - 1);
+ }
+ }
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Returns the width of ch as one of 0, '0', '1', '2', 'A'. */
+static char
+symbolic_width (unsigned int ch)
+{
+ /* Test for unassigned character. */
+ if (is_property_unassigned_code_value (ch))
+ {
+ /* Unicode TR#11 section "Unassigned and Private-Use Characters". */
+ if (ch >= 0xE000 && ch <= 0xF8FF) /* Private Use */
+ return 'A';
+ if ((ch >= 0x4E00 && ch <= 0x9FFF) /* CJK Unified Ideographs block */
+ || (ch >= 0x3400 && ch <= 0x4DBF) /* CJK Unified Ideographs Extension A block */
+ || (ch >= 0xF900 && ch <= 0xFAFF) /* CJK Compatibility Ideographs block */
+ || (ch >= 0x20000 && ch <= 0x2FFFF) /* Supplementary Ideographic Plane */
+ || (ch >= 0x30000 && ch <= 0x3FFFF) /* Tertiary Ideographic Plane */)
+ return '2';
+ return 0;
+ }
+ else
+ {
+ /* Test for non-spacing or control character. */
+ if (is_category_Cc (ch) && ch < 0x00A0)
+ return 0;
+ if (is_nonspacing (ch))
+ return '0';
+ /* Test for double-width character. */
+ if (unicode_width[ch] != NULL
+ && (strcmp (unicode_width[ch], "W") == 0
+ || strcmp (unicode_width[ch], "F") == 0))
+ return '2';
+ /* Test for half-width character. */
+ if (unicode_width[ch] != NULL
+ && strcmp (unicode_width[ch], "H") == 0)
+ return '1';
+ }
+ /* In ancient CJK encodings, Cyrillic and most other characters are
+ double-width as well. */
+ if (ch >= 0x00A1 && ch < 0x10000)
+ return 'A';
+ return '1';
+}
+
+static void
+output_width_property_test (const char *filename)
+{
+ FILE *stream;
+ unsigned int interval_start, interval_end, ch;
+ char interval_value;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ interval_value = 0;
+ interval_start = interval_end = 0; /* avoid GCC warning */
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ char value = symbolic_width (ch);
+ if (value != 0) /* skip Cc control characters and unassigned characters */
+ {
+ if (value == interval_value)
+ /* Extend the interval. */
+ interval_end = ch;
+ else
+ {
+ /* Terminate the interval. */
+ if (interval_value != 0)
+ {
+ if (interval_end == interval_start)
+ fprintf (stream, "%04X\t\t%c\n", interval_start, interval_value);
+ else
+ fprintf (stream, "%04X..%04X\t%c\n", interval_start, interval_end, interval_value);
+ }
+ /* Start a new interval. */
+ interval_start = interval_end = ch;
+ interval_value = value;
+ }
+ }
+ }
+ /* Terminate the last interval. */
+ if (interval_value != 0)
+ {
+ if (interval_end == interval_start)
+ fprintf (stream, "%04X\t\t%c\n", interval_start, interval_value);
+ else
+ fprintf (stream, "%04X..%04X\t%c\n", interval_start, interval_end, interval_value);
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Line breaking classification.
+ Updated for Unicode TR #14 revision 26. */
+
+enum
+{
+ /* Values >= 25 are resolved at run time. */
+ LBP_BK = 25, /* mandatory break */
+/*LBP_CR, carriage return - not used here because it's a DOSism */
+/*LBP_LF, line feed - not used here because it's a DOSism */
+ LBP_CM = 26, /* attached characters and combining marks */
+/*LBP_NL, next line - not used here because it's equivalent to LBP_BK */
+/*LBP_SG, surrogates - not used here because they are not characters */
+ LBP_WJ = 0, /* word joiner */
+ LBP_ZW = 27, /* zero width space */
+ LBP_GL = 1, /* non-breaking (glue) */
+ LBP_SP = 28, /* space */
+ LBP_B2 = 2, /* break opportunity before and after */
+ LBP_BA = 3, /* break opportunity after */
+ LBP_BB = 4, /* break opportunity before */
+ LBP_HY = 5, /* hyphen */
+ LBP_CB = 29, /* contingent break opportunity */
+ LBP_CL = 6, /* closing punctuation */
+ LBP_CP = 7, /* closing parenthesis */
+ LBP_EX = 8, /* exclamation/interrogation */
+ LBP_IN = 9, /* inseparable */
+ LBP_NS = 10, /* non starter */
+ LBP_OP = 11, /* opening punctuation */
+ LBP_QU = 12, /* ambiguous quotation */
+ LBP_IS = 13, /* infix separator (numeric) */
+ LBP_NU = 14, /* numeric */
+ LBP_PO = 15, /* postfix (numeric) */
+ LBP_PR = 16, /* prefix (numeric) */
+ LBP_SY = 17, /* symbols allowing breaks */
+ LBP_AI = 30, /* ambiguous (alphabetic or ideograph) */
+ LBP_AL = 18, /* ordinary alphabetic and symbol characters */
+ LBP_H2 = 19, /* Hangul LV syllable */
+ LBP_H3 = 20, /* Hangul LVT syllable */
+ LBP_ID = 21, /* ideographic */
+ LBP_JL = 22, /* Hangul L Jamo */
+ LBP_JV = 23, /* Hangul V Jamo */
+ LBP_JT = 24, /* Hangul T Jamo */
+ LBP_SA = 31, /* complex context (South East Asian) */
+ LBP_XX = 32 /* unknown */
+};
+
+/* Returns the line breaking classification for ch, as a bit mask. */
+static int64_t
+get_lbp (unsigned int ch)
+{
+ int64_t attr = 0;
+
+ if (unicode_attributes[ch].name != NULL)
+ {
+ /* mandatory break */
+ if (ch == 0x000A || ch == 0x000D || ch == 0x0085 /* newline */
+ || ch == 0x000C /* form feed */
+ || ch == 0x000B /* line tabulation */
+ || ch == 0x2028 /* LINE SEPARATOR */
+ || ch == 0x2029 /* PARAGRAPH SEPARATOR */)
+ attr |= (int64_t) 1 << LBP_BK;
+
+ if (ch == 0x2060 /* WORD JOINER */
+ || ch == 0xFEFF /* ZERO WIDTH NO-BREAK SPACE */)
+ attr |= (int64_t) 1 << LBP_WJ;
+
+ /* zero width space */
+ if (ch == 0x200B /* ZERO WIDTH SPACE */)
+ attr |= (int64_t) 1 << LBP_ZW;
+
+ /* non-breaking (glue) */
+ if (ch == 0x00A0 /* NO-BREAK SPACE */
+ || ch == 0x202F /* NARROW NO-BREAK SPACE */
+ || ch == 0x180E /* MONGOLIAN VOWEL SEPARATOR */
+ || ch == 0x034F /* COMBINING GRAPHEME JOINER */
+ || ch == 0x2007 /* FIGURE SPACE */
+ || ch == 0x2011 /* NON-BREAKING HYPHEN */
+ || ch == 0x0F08 /* TIBETAN MARK SBRUL SHAD */
+ || ch == 0x0F0C /* TIBETAN MARK DELIMITER TSHEG BSTAR */
+ || ch == 0x0F12 /* TIBETAN MARK RGYA GRAM SHAD */
+ || (ch >= 0x035C && ch <= 0x0362) /* COMBINING DOUBLE ... */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x0FD9 /* TIBETAN MARK LEADING MCHAN RTAGS */
+ || ch == 0x0FDA /* TIBETAN MARK TRAILING MCHAN RTAGS */)
+ attr |= (int64_t) 1 << LBP_GL;
+
+ /* space */
+ if (ch == 0x0020 /* SPACE */)
+ attr |= (int64_t) 1 << LBP_SP;
+
+ /* break opportunity before and after */
+ if (ch == 0x2014 /* EM DASH */)
+ attr |= (int64_t) 1 << LBP_B2;
+
+ /* break opportunity after */
+ if (/* Breaking Spaces */
+ ch == 0x1680 /* OGHAM SPACE MARK */
+ || ch == 0x2000 /* EN QUAD */
+ || ch == 0x2001 /* EM QUAD */
+ || ch == 0x2002 /* EN SPACE */
+ || ch == 0x2003 /* EM SPACE */
+ || ch == 0x2004 /* THREE-PER-EM SPACE */
+ || ch == 0x2005 /* FOUR-PER-EM SPACE */
+ || ch == 0x2006 /* SIX-PER-EM SPACE */
+ || ch == 0x2008 /* PUNCTUATION SPACE */
+ || ch == 0x2009 /* THIN SPACE */
+ || ch == 0x200A /* HAIR SPACE */
+ || ch == 0x205F /* MEDIUM MATHEMATICAL SPACE */
+ /* Tabs */
+ || ch == 0x0009 /* tab */
+ /* Conditional Hyphens */
+ || ch == 0x00AD /* SOFT HYPHEN */
+ /* Breaking Hyphens */
+ || ch == 0x058A /* ARMENIAN HYPHEN */
+ || ch == 0x1400 /* CANADIAN SYLLABICS HYPHEN */
+ || ch == 0x2010 /* HYPHEN */
+ || ch == 0x2012 /* FIGURE DASH */
+ || ch == 0x2013 /* EN DASH */
+ /* Visible Word Dividers */
+ || ch == 0x05BE /* HEBREW PUNCTUATION MAQAF */
+ || ch == 0x0F0B /* TIBETAN MARK INTERSYLLABIC TSHEG */
+ || ch == 0x1361 /* ETHIOPIC WORDSPACE */
+ || ch == 0x17D8 /* KHMER SIGN BEYYAL */
+ || ch == 0x17DA /* KHMER SIGN KOOMUUT */
+ || ch == 0x2027 /* HYPHENATION POINT */
+ || ch == 0x007C /* VERTICAL LINE */
+ /* Historic Word Separators */
+ || ch == 0x16EB /* RUNIC SINGLE PUNCTUATION */
+ || ch == 0x16EC /* RUNIC MULTIPLE PUNCTUATION */
+ || ch == 0x16ED /* RUNIC CROSS PUNCTUATION */
+ || ch == 0x2056 /* THREE DOT PUNCTUATION */
+ || ch == 0x2058 /* FOUR DOT PUNCTUATION */
+ || ch == 0x2059 /* FIVE DOT PUNCTUATION */
+ || ch == 0x205A /* TWO DOT PUNCTUATION */
+ || ch == 0x205B /* FOUR DOT MARK */
+ || ch == 0x205D /* TRICOLON */
+ || ch == 0x205E /* VERTICAL FOUR DOTS */
+ || ch == 0x2E19 /* PALM BRANCH */
+ || ch == 0x2E2A /* TWO DOTS OVER ONE DOT PUNCTUATION */
+ || ch == 0x2E2B /* ONE DOT OVER TWO DOTS PUNCTUATION */
+ || ch == 0x2E2C /* SQUARED FOUR DOT PUNCTUATION */
+ || ch == 0x2E2D /* FIVE DOT PUNCTUATION */
+ || ch == 0x2E30 /* RING POINT */
+ || ch == 0x2E31 /* WORD SEPARATOR MIDDLE DOT */
+ || ch == 0x10100 /* AEGEAN WORD SEPARATOR LINE */
+ || ch == 0x10101 /* AEGEAN WORD SEPARATOR DOT */
+ || ch == 0x10102 /* AEGEAN CHECK MARK */
+ || ch == 0x1039F /* UGARITIC WORD DIVIDER */
+ || ch == 0x103D0 /* OLD PERSIAN WORD DIVIDER */
+ || ch == 0x1091F /* PHOENICIAN WORD SEPARATOR */
+ || ch == 0x12470 /* CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER */
+ /* Dandas */
+ || ch == 0x0964 /* DEVANAGARI DANDA */
+ || ch == 0x0965 /* DEVANAGARI DOUBLE DANDA */
+ || ch == 0x0E5A /* THAI CHARACTER ANGKHANKHU */
+ || ch == 0x0E5B /* THAI CHARACTER KHOMUT */
+ || ch == 0x104A /* MYANMAR SIGN LITTLE SECTION */
+ || ch == 0x104B /* MYANMAR SIGN SECTION */
+ || ch == 0x1735 /* PHILIPPINE SINGLE PUNCTUATION */
+ || ch == 0x1736 /* PHILIPPINE DOUBLE PUNCTUATION */
+ || ch == 0x17D4 /* KHMER SIGN KHAN */
+ || ch == 0x17D5 /* KHMER SIGN BARIYOOSAN */
+ || ch == 0x1B5E /* BALINESE CARIK SIKI */
+ || ch == 0x1B5F /* BALINESE CARIK PAREREN */
+ || ch == 0xA8CE /* SAURASHTRA DANDA */
+ || ch == 0xA8CF /* SAURASHTRA DOUBLE DANDA */
+ || ch == 0xAA5D /* CHAM PUNCTUATION DANDA */
+ || ch == 0xAA5E /* CHAM PUNCTUATION DOUBLE DANDA */
+ || ch == 0xAA5F /* CHAM PUNCTUATION TRIPLE DANDA */
+ || ch == 0x10A56 /* KHAROSHTHI PUNCTUATION DANDA */
+ || ch == 0x10A57 /* KHAROSHTHI PUNCTUATION DOUBLE DANDA */
+ /* Tibetan */
+ || ch == 0x0F34 /* TIBETAN MARK BSDUS RTAGS */
+ || ch == 0x0F7F /* TIBETAN SIGN RNAM BCAD */
+ || ch == 0x0F85 /* TIBETAN MARK PALUTA */
+ || ch == 0x0FBE /* TIBETAN KU RU KHA */
+ || ch == 0x0FBF /* TIBETAN KU RU KHA BZHI MIG CAN */
+ || ch == 0x0FD2 /* TIBETAN MARK NYIS TSHEG */
+ /* Other Terminating Punctuation */
+ || ch == 0x1804 /* MONGOLIAN COLON */
+ || ch == 0x1805 /* MONGOLIAN FOUR DOTS */
+ || ch == 0x1B5A /* BALINESE PANTI */
+ || ch == 0x1B5B /* BALINESE PAMADA */
+ || ch == 0x1B5D /* BALINESE CARIK PAMUNGKAH */
+ || ch == 0x1B60 /* BALINESE PAMENENG */
+ || ch == 0x1C3B /* LEPCHA PUNCTUATION TA-ROL */
+ || ch == 0x1C3C /* LEPCHA PUNCTUATION NYET THYOOM TA-ROL */
+ || ch == 0x1C3D /* LEPCHA PUNCTUATION CER-WA */
+ || ch == 0x1C3E /* LEPCHA PUNCTUATION TSHOOK CER-WA */
+ || ch == 0x1C3F /* LEPCHA PUNCTUATION TSHOOK */
+ || ch == 0x1C7E /* OL CHIKI PUNCTUATION MUCAAD */
+ || ch == 0x1C7F /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */
+ || ch == 0x2CFA /* COPTIC OLD NUBIAN DIRECT QUESTION MARK */
+ || ch == 0x2CFB /* COPTIC OLD NUBIAN INDIRECT QUESTION MARK */
+ || ch == 0x2CFC /* COPTIC OLD NUBIAN VERSE DIVIDER */
+ || ch == 0x2CFF /* COPTIC MORPHOLOGICAL DIVIDER */
+ || (ch >= 0x2E0E && ch <= 0x2E15) /* EDITORIAL CORONIS .. UPWARDS ANCORA */
+ || ch == 0x2E17 /* DOUBLE OBLIQUE HYPHEN */
+ || ch == 0xA60D /* VAI COMMA */
+ || ch == 0xA60F /* VAI QUESTION MARK */
+ || ch == 0xA92E /* KAYAH LI SIGN CWI */
+ || ch == 0xA92F /* KAYAH LI SIGN SHYA */
+ || ch == 0x10A50 /* KHAROSHTHI PUNCTUATION DOT */
+ || ch == 0x10A51 /* KHAROSHTHI PUNCTUATION SMALL CIRCLE */
+ || ch == 0x10A52 /* KHAROSHTHI PUNCTUATION CIRCLE */
+ || ch == 0x10A53 /* KHAROSHTHI PUNCTUATION CRESCENT BAR */
+ || ch == 0x10A54 /* KHAROSHTHI PUNCTUATION MANGALAM */
+ || ch == 0x10A55 /* KHAROSHTHI PUNCTUATION LOTUS */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x2D70 /* TIFINAGH SEPARATOR MARK */
+ || ch == 0xA4FE /* LISU PUNCTUATION COMMA */
+ || ch == 0xA4FF /* LISU PUNCTUATION FULL STOP */
+ || ch == 0xA6F3 /* BAMUM FULL STOP */
+ || ch == 0xA6F4 /* BAMUM COLON */
+ || ch == 0xA6F5 /* BAMUM COMMA */
+ || ch == 0xA6F6 /* BAMUM SEMICOLON */
+ || ch == 0xA6F7 /* BAMUM QUESTION MARK */
+ || ch == 0xA9C7 /* JAVANESE PADA PANGKAT */
+ || ch == 0xA9C8 /* JAVANESE PADA LINGSA */
+ || ch == 0xA9C9 /* JAVANESE PADA LUNGSI */
+ || ch == 0xABEB /* MEETEI MAYEK CHEIKHEI */
+ || ch == 0x10857 /* IMPERIAL ARAMAIC SECTION SIGN */
+ || ch == 0x10B39 /* AVESTAN ABBREVIATION MARK */
+ || ch == 0x10B3A /* TINY TWO DOTS OVER ONE DOT PUNCTUATION */
+ || ch == 0x10B3B /* SMALL TWO DOTS OVER ONE DOT PUNCTUATION */
+ || ch == 0x10B3C /* LARGE TWO DOTS OVER ONE DOT PUNCTUATION */
+ || ch == 0x10B3D /* LARGE ONE DOT OVER TWO DOTS PUNCTUATION */
+ || ch == 0x10B3E /* LARGE TWO RINGS OVER ONE RING PUNCTUATION */
+ || ch == 0x10B3F /* LARGE ONE RING OVER TWO RINGS PUNCTUATION */
+ || ch == 0x11047 /* BRAHMI DANDA */
+ || ch == 0x11048 /* BRAHMI DOUBLE DANDA */
+ || ch == 0x110BE /* KAITHI SECTION MARK */
+ || ch == 0x110BF /* KAITHI DOUBLE SECTION MARK */
+ || ch == 0x110C0 /* KAITHI DANDA */
+ || ch == 0x110C1 /* KAITHI DOUBLE DANDA */
+ || ch == 0x12471 /* CUNEIFORM PUNCTUATION SIGN VERTICAL COLON */
+ || ch == 0x12472 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON */
+ || ch == 0x12473 /* CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON */)
+ attr |= (int64_t) 1 << LBP_BA;
+
+ /* break opportunity before */
+ if (ch == 0x00B4 /* ACUTE ACCENT */
+ || ch == 0x1FFD /* GREEK OXIA */
+ || ch == 0x02DF /* MODIFIER LETTER CROSS ACCENT */
+ || ch == 0x02C8 /* MODIFIER LETTER VERTICAL LINE */
+ || ch == 0x02CC /* MODIFIER LETTER LOW VERTICAL LINE */
+ || ch == 0x0F01 /* TIBETAN MARK GTER YIG MGO TRUNCATED A */
+ || ch == 0x0F02 /* TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA */
+ || ch == 0x0F03 /* TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA */
+ || ch == 0x0F04 /* TIBETAN MARK INITIAL YIG MGO MDUN MA */
+ || ch == 0x0F06 /* TIBETAN MARK CARET YIG MGO PHUR SHAD MA */
+ || ch == 0x0F07 /* TIBETAN MARK YIG MGO TSHEG SHAD MA */
+ || ch == 0x0F09 /* TIBETAN MARK BSKUR YIG MGO */
+ || ch == 0x0F0A /* TIBETAN MARK BKA- SHOG YIG MGO */
+ || ch == 0x0FD0 /* TIBETAN MARK BSKA- SHOG GI MGO RGYAN */
+ || ch == 0x0FD1 /* TIBETAN MARK MNYAM YIG GI MGO RGYAN */
+ || ch == 0x0FD3 /* TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA */
+ || ch == 0xA874 /* PHAGS-PA SINGLE HEAD MARK */
+ || ch == 0xA875 /* PHAGS-PA DOUBLE HEAD MARK */
+ || ch == 0x1806 /* MONGOLIAN TODO SOFT HYPHEN */)
+ attr |= (int64_t) 1 << LBP_BB;
+
+ /* hyphen */
+ if (ch == 0x002D /* HYPHEN-MINUS */)
+ attr |= (int64_t) 1 << LBP_HY;
+
+ /* contingent break opportunity */
+ if (ch == 0xFFFC /* OBJECT REPLACEMENT CHARACTER */)
+ attr |= (int64_t) 1 << LBP_CB;
+
+ /* closing parenthesis */
+ if (ch == 0x0029 /* RIGHT PARENTHESIS */
+ || ch == 0x005D /* RIGHT SQUARE BRACKET */)
+ attr |= (int64_t) 1 << LBP_CP;
+
+ /* closing punctuation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 'e'
+ && !(attr & ((int64_t) 1 << LBP_CP)))
+ || ch == 0x3001 /* IDEOGRAPHIC COMMA */
+ || ch == 0x3002 /* IDEOGRAPHIC FULL STOP */
+ || ch == 0xFE11 /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA */
+ || ch == 0xFE12 /* PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP */
+ || ch == 0xFE50 /* SMALL COMMA */
+ || ch == 0xFE52 /* SMALL FULL STOP */
+ || ch == 0xFF0C /* FULLWIDTH COMMA */
+ || ch == 0xFF0E /* FULLWIDTH FULL STOP */
+ || ch == 0xFF61 /* HALFWIDTH IDEOGRAPHIC FULL STOP */
+ || ch == 0xFF64 /* HALFWIDTH IDEOGRAPHIC COMMA */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x1325B /* EGYPTIAN HIEROGLYPH O006D */
+ || ch == 0x1325C /* EGYPTIAN HIEROGLYPH O006E */
+ || ch == 0x1325D /* EGYPTIAN HIEROGLYPH O006F */
+ || ch == 0x13282 /* EGYPTIAN HIEROGLYPH O033A */
+ || ch == 0x13287 /* EGYPTIAN HIEROGLYPH O036B */
+ || ch == 0x13289 /* EGYPTIAN HIEROGLYPH O036D */
+ || ch == 0x1337A /* EGYPTIAN HIEROGLYPH V011B */
+ || ch == 0x1337B /* EGYPTIAN HIEROGLYPH V011C */)
+ attr |= (int64_t) 1 << LBP_CL;
+
+ /* exclamation/interrogation */
+ if (ch == 0x0021 /* EXCLAMATION MARK */
+ || ch == 0x003F /* QUESTION MARK */
+ || ch == 0x05C6 /* HEBREW PUNCTUATION NUN HAFUKHA */
+ || ch == 0x061B /* ARABIC SEMICOLON */
+ || ch == 0x061E /* ARABIC TRIPLE DOT PUNCTUATION MARK */
+ || ch == 0x061F /* ARABIC QUESTION MARK */
+ || ch == 0x06D4 /* ARABIC FULL STOP */
+ || ch == 0x07F9 /* NKO EXCLAMATION MARK */
+ || ch == 0x0F0D /* TIBETAN MARK SHAD */
+ || ch == 0x0F0E /* TIBETAN MARK NYIS SHAD */
+ || ch == 0x0F0F /* TIBETAN MARK TSHEG SHAD */
+ || ch == 0x0F10 /* TIBETAN MARK NYIS TSHEG SHAD */
+ || ch == 0x0F11 /* TIBETAN MARK RIN CHEN SPUNGS SHAD */
+ || ch == 0x0F14 /* TIBETAN MARK GTER TSHEG */
+ || ch == 0x1802 /* MONGOLIAN COMMA */
+ || ch == 0x1803 /* MONGOLIAN FULL STOP */
+ || ch == 0x1808 /* MONGOLIAN MANCHU COMMA */
+ || ch == 0x1809 /* MONGOLIAN MANCHU FULL STOP */
+ || ch == 0x1944 /* LIMBU EXCLAMATION MARK */
+ || ch == 0x1945 /* LIMBU QUESTION MARK */
+ || ch == 0x2762 /* HEAVY EXCLAMATION MARK ORNAMENT */
+ || ch == 0x2763 /* HEAVY HEART EXCLAMATION MARK ORNAMENT */
+ || ch == 0x2CF9 /* COPTIC OLD NUBIAN FULL STOP */
+ || ch == 0x2CFE /* COPTIC FULL STOP */
+ || ch == 0x2E2E /* REVERSED QUESTION MARK */
+ || ch == 0xA60E /* VAI FULL STOP */
+ || ch == 0xA876 /* PHAGS-PA MARK SHAD */
+ || ch == 0xA877 /* PHAGS-PA MARK DOUBLE SHAD */
+ || ch == 0xFE15 /* PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK */
+ || ch == 0xFE16 /* PRESENTATION FORM FOR VERTICAL QUESTION MARK */
+ || ch == 0xFE56 /* SMALL QUESTION MARK */
+ || ch == 0xFE57 /* SMALL EXCLAMATION MARK */
+ || ch == 0xFF01 /* FULLWIDTH EXCLAMATION MARK */
+ || ch == 0xFF1F /* FULLWIDTH QUESTION MARK */)
+ attr |= (int64_t) 1 << LBP_EX;
+
+ /* inseparable */
+ if (ch == 0x2024 /* ONE DOT LEADER */
+ || ch == 0x2025 /* TWO DOT LEADER */
+ || ch == 0x2026 /* HORIZONTAL ELLIPSIS */
+ || ch == 0xFE19 /* PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS */)
+ attr |= (int64_t) 1 << LBP_IN;
+
+ /* non starter */
+ if (ch == 0x17D6 /* KHMER SIGN CAMNUC PII KUUH */
+ || ch == 0x203C /* DOUBLE EXCLAMATION MARK */
+ || ch == 0x203D /* INTERROBANG */
+ || ch == 0x2047 /* DOUBLE QUESTION MARK */
+ || ch == 0x2048 /* QUESTION EXCLAMATION MARK */
+ || ch == 0x2049 /* EXCLAMATION QUESTION MARK */
+ || ch == 0x3005 /* IDEOGRAPHIC ITERATION MARK */
+ || ch == 0x301C /* WAVE DASH */
+ || ch == 0x303C /* MASU MARK */
+ || ch == 0x303B /* VERTICAL IDEOGRAPHIC ITERATION MARK */
+ || ch == 0x309B /* KATAKANA-HIRAGANA VOICED SOUND MARK */
+ || ch == 0x309C /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+ || ch == 0x309D /* HIRAGANA ITERATION MARK */
+ || ch == 0x309E /* HIRAGANA VOICED ITERATION MARK */
+ || ch == 0x30A0 /* KATAKANA-HIRAGANA DOUBLE HYPHEN */
+ || ch == 0x30FB /* KATAKANA MIDDLE DOT */
+ || ch == 0x30FC /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ || ch == 0x30FD /* KATAKANA ITERATION MARK */
+ || ch == 0x30FE /* KATAKANA VOICED ITERATION MARK */
+ || ch == 0xA015 /* YI SYLLABLE WU */
+ || ch == 0xFE54 /* SMALL SEMICOLON */
+ || ch == 0xFE55 /* SMALL COLON */
+ || ch == 0xFF1A /* FULLWIDTH COLON */
+ || ch == 0xFF1B /* FULLWIDTH SEMICOLON */
+ || ch == 0xFF65 /* HALFWIDTH KATAKANA MIDDLE DOT */
+ || ch == 0xFF70 /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ || ch == 0xFF9E /* HALFWIDTH KATAKANA VOICED SOUND MARK */
+ || ch == 0xFF9F /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
+ || strstr (unicode_attributes[ch].name, "HIRAGANA LETTER SMALL ") != NULL
+ || strstr (unicode_attributes[ch].name, "KATAKANA LETTER SMALL ") != NULL)
+ attr |= (int64_t) 1 << LBP_NS;
+
+ /* opening punctuation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && unicode_attributes[ch].category[1] == 's')
+ || ch == 0x00A1 /* INVERTED EXCLAMATION MARK */
+ || ch == 0x00BF /* INVERTED QUESTION MARK */
+ || ch == 0x2E18 /* INVERTED INTERROBANG */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x13258 /* EGYPTIAN HIEROGLYPH O006A */
+ || ch == 0x13259 /* EGYPTIAN HIEROGLYPH O006B */
+ || ch == 0x1325A /* EGYPTIAN HIEROGLYPH O006C */
+ || ch == 0x13286 /* EGYPTIAN HIEROGLYPH O036A */
+ || ch == 0x13288 /* EGYPTIAN HIEROGLYPH O036C */
+ || ch == 0x13379 /* EGYPTIAN HIEROGLYPH V011A */)
+ attr |= (int64_t) 1 << LBP_OP;
+
+ /* ambiguous quotation */
+ if ((unicode_attributes[ch].category[0] == 'P'
+ && (unicode_attributes[ch].category[1] == 'f'
+ || unicode_attributes[ch].category[1] == 'i'))
+ || ch == 0x0022 /* QUOTATION MARK */
+ || ch == 0x0027 /* APOSTROPHE */
+ || ch == 0x275B /* HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275C /* HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275D /* HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x275E /* HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT */
+ || ch == 0x2E00 /* RIGHT ANGLE SUBSTITUTION MARKER */
+ || ch == 0x2E01 /* RIGHT ANGLE DOTTED SUBSTITUTION MARKER */
+ || ch == 0x2E06 /* RAISED INTERPOLATION MARKER */
+ || ch == 0x2E07 /* RAISED DOTTED INTERPOLATION MARKER */
+ || ch == 0x2E08 /* DOTTED TRANSPOSITION MARKER */
+ || ch == 0x2E0B /* RAISED SQUARE */)
+ attr |= (int64_t) 1 << LBP_QU;
+
+ /* infix separator (numeric) */
+ if (ch == 0x002C /* COMMA */
+ || ch == 0x002E /* FULL STOP */
+ || ch == 0x003A /* COLON */
+ || ch == 0x003B /* SEMICOLON */
+ || ch == 0x037E /* GREEK QUESTION MARK */
+ || ch == 0x0589 /* ARMENIAN FULL STOP */
+ || ch == 0x060C /* ARABIC COMMA */
+ || ch == 0x060D /* ARABIC DATE SEPARATOR */
+ || ch == 0x07F8 /* NKO COMMA */
+ || ch == 0x2044 /* FRACTION SLASH */
+ || ch == 0xFE10 /* PRESENTATION FORM FOR VERTICAL COMMA */
+ || ch == 0xFE13 /* PRESENTATION FORM FOR VERTICAL COLON */
+ || ch == 0xFE14 /* PRESENTATION FORM FOR VERTICAL SEMICOLON */)
+ attr |= (int64_t) 1 << LBP_IS;
+
+ /* numeric */
+ if ((unicode_attributes[ch].category[0] == 'N'
+ && unicode_attributes[ch].category[1] == 'd'
+ && strstr (unicode_attributes[ch].name, "FULLWIDTH") == NULL)
+ || ch == 0x066B /* ARABIC DECIMAL SEPARATOR */
+ || ch == 0x066C /* ARABIC THOUSANDS SEPARATOR */)
+ attr |= (int64_t) 1 << LBP_NU;
+
+ /* postfix (numeric) */
+ if (ch == 0x0025 /* PERCENT SIGN */
+ || ch == 0x00A2 /* CENT SIGN */
+ || ch == 0x00B0 /* DEGREE SIGN */
+ || ch == 0x060B /* AFGHANI SIGN */
+ || ch == 0x066A /* ARABIC PERCENT SIGN */
+ || ch == 0x2030 /* PER MILLE SIGN */
+ || ch == 0x2031 /* PER TEN THOUSAND SIGN */
+ || ch == 0x2032 /* PRIME */
+ || ch == 0x2033 /* DOUBLE PRIME */
+ || ch == 0x2034 /* TRIPLE PRIME */
+ || ch == 0x2035 /* REVERSED PRIME */
+ || ch == 0x2036 /* REVERSED DOUBLE PRIME */
+ || ch == 0x2037 /* REVERSED TRIPLE PRIME */
+ || ch == 0x20A7 /* PESETA SIGN */
+ || ch == 0x2103 /* DEGREE CELSIUS */
+ || ch == 0x2109 /* DEGREE FAHRENHEIT */
+ || ch == 0xFDFC /* RIAL SIGN */
+ || ch == 0xFE6A /* SMALL PERCENT SIGN */
+ || ch == 0xFF05 /* FULLWIDTH PERCENT SIGN */
+ || ch == 0xFFE0 /* FULLWIDTH DIGIT ZERO */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x0609 /* ARABIC-INDIC PER MILLE SIGN */
+ || ch == 0x060A /* ARABIC-INDIC PER TEN THOUSAND SIGN */
+ || ch == 0x09F2 /* BENGALI RUPEE MARK */
+ || ch == 0x09F3 /* BENGALI RUPEE SIGN */
+ || ch == 0x09F9 /* BENGALI CURRENCY DENOMINATOR SIXTEEN */
+ || ch == 0x0D79 /* MALAYALAM DATE MARK */
+ || ch == 0x20B6 /* LIVRE TOURNOIS SIGN */
+ || ch == 0xA838 /* NORTH INDIC RUPEE MARK */)
+ attr |= (int64_t) 1 << LBP_PO;
+
+ /* prefix (numeric) */
+ if ((unicode_attributes[ch].category[0] == 'S'
+ && unicode_attributes[ch].category[1] == 'c')
+ || ch == 0x002B /* PLUS SIGN */
+ || ch == 0x005C /* REVERSE SOLIDUS */
+ || ch == 0x00B1 /* PLUS-MINUS SIGN */
+ || ch == 0x2116 /* NUMERO SIGN */
+ || ch == 0x2212 /* MINUS SIGN */
+ || ch == 0x2213 /* MINUS-OR-PLUS SIGN */)
+ if (!(attr & ((int64_t) 1 << LBP_PO)))
+ attr |= (int64_t) 1 << LBP_PR;
+
+ /* symbols allowing breaks */
+ if (ch == 0x002F /* SOLIDUS */)
+ attr |= (int64_t) 1 << LBP_SY;
+
+ if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) == 0)
+ attr |= (int64_t) 1 << LBP_H2;
+
+ if (ch >= 0xAC00 && ch <= 0xD7A3 && ((ch - 0xAC00) % 28) != 0)
+ attr |= (int64_t) 1 << LBP_H3;
+
+ if ((ch >= 0x1100 && ch <= 0x115F) || (ch >= 0xA960 && ch <= 0xA97C))
+ attr |= (int64_t) 1 << LBP_JL;
+
+ if ((ch >= 0x1160 && ch <= 0x11A7) || (ch >= 0xD7B0 && ch <= 0xD7C6))
+ attr |= (int64_t) 1 << LBP_JV;
+
+ if ((ch >= 0x11A8 && ch <= 0x11FF) || (ch >= 0xD7CB && ch <= 0xD7FB))
+ attr |= (int64_t) 1 << LBP_JT;
+
+ /* complex context (South East Asian) */
+ if (((unicode_attributes[ch].category[0] == 'C'
+ && unicode_attributes[ch].category[1] == 'f')
+ || (unicode_attributes[ch].category[0] == 'L'
+ && (unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'n')
+ && ch != 0x1A7F /* TAI THAM COMBINING CRYPTOGRAMMIC DOT */)
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x109E /* MYANMAR SYMBOL SHAN ONE */
+ || ch == 0x109F /* MYANMAR SYMBOL SHAN EXCLAMATION */
+ || ch == 0x19DA /* NEW TAI LUE THAM DIGIT ONE */
+ || ch == 0x19DE /* NEW TAI LUE SIGN LAE */
+ || ch == 0x19DF /* NEW TAI LUE SIGN LAEV */
+ || (ch >= 0x1AA0 && ch <= 0x1AAD) /* TAI THAM SIGN */
+ || (ch >= 0xAA77 && ch <= 0xAA79) /* MYANMAR SYMBOL AITON */
+ || (ch >= 0xAADE && ch <= 0xAADF) /* TAI VIET SYMBOL */)
+ && ((ch >= 0x0E00 && ch <= 0x0EFF) /* Thai, Lao */
+ || (ch >= 0x1000 && ch <= 0x109F) /* Myanmar */
+ || (ch >= 0x1780 && ch <= 0x17FF) /* Khmer */
+ || (ch >= 0x1950 && ch <= 0x19DF) /* Tai Le, New Tai Lue */
+ || (ch >= 0x1A20 && ch <= 0x1AAF) /* Tai Tham */
+ || (ch >= 0xAA60 && ch <= 0xAADF) /* Myanmar Extended-A, Tai Viet */))
+ attr |= (int64_t) 1 << LBP_SA;
+
+ /* attached characters and combining marks */
+ if ((unicode_attributes[ch].category[0] == 'M'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'e'
+ || unicode_attributes[ch].category[1] == 'n'))
+ || (unicode_attributes[ch].category[0] == 'C'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'f')
+ && ch != 0x110BD /* KAITHI NUMBER SIGN */))
+ if (!(attr & (((int64_t) 1 << LBP_BK) | ((int64_t) 1 << LBP_BA) | ((int64_t) 1 << LBP_GL) | ((int64_t) 1 << LBP_SA) | ((int64_t) 1 << LBP_WJ) | ((int64_t) 1 << LBP_ZW))))
+ attr |= (int64_t) 1 << LBP_CM;
+
+ /* ideographic */
+ if ((ch >= 0x2E80 && ch <= 0x2FFF) /* CJK RADICAL, KANGXI RADICAL, IDEOGRAPHIC DESCRIPTION */
+ || ch == 0x3000 /* IDEOGRAPHIC SPACE */
+ || (ch >= 0x3040 && ch <= 0x309F) /* HIRAGANA */
+ || (ch >= 0x30A0 && ch <= 0x30FF) /* KATAKANA */
+ || (ch >= 0x3400 && ch <= 0x4DBF) /* CJK Ideograph Extension A */
+ || (ch >= 0x4E00 && ch <= 0x9FFF) /* CJK Ideograph */
+ || (ch >= 0xF900 && ch <= 0xFAD9) /* CJK COMPATIBILITY IDEOGRAPH */
+ || (ch >= 0xA000 && ch <= 0xA48F) /* YI SYLLABLE */
+ || (ch >= 0xA490 && ch <= 0xA4CF) /* YI RADICAL */
+ || ch == 0xFE62 /* SMALL PLUS SIGN */
+ || ch == 0xFE63 /* SMALL HYPHEN-MINUS */
+ || ch == 0xFE64 /* SMALL LESS-THAN SIGN */
+ || ch == 0xFE65 /* SMALL GREATER-THAN SIGN */
+ || ch == 0xFE66 /* SMALL EQUALS SIGN */
+ || (ch >= 0xFF10 && ch <= 0xFF19) /* FULLWIDTH DIGIT */
+ || (ch >= 0x20000 && ch <= 0x2A6D6) /* CJK Ideograph Extension B */
+ || (ch >= 0x2F800 && ch <= 0x2FA1D) /* CJK COMPATIBILITY IDEOGRAPH */
+ || strstr (unicode_attributes[ch].name, "FULLWIDTH LATIN ") != NULL
+ || (ch >= 0x3000 && ch <= 0x33FF
+ && !(attr & (((int64_t) 1 << LBP_CM) | ((int64_t) 1 << LBP_NS) | ((int64_t) 1 << LBP_OP) | ((int64_t) 1 << LBP_CL) | ((int64_t) 1 << LBP_CP))))
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0xFE30 /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER */
+ || ch == 0xFE31 /* PRESENTATION FORM FOR VERTICAL EM DASH */
+ || ch == 0xFE32 /* PRESENTATION FORM FOR VERTICAL EN DASH */
+ || ch == 0xFE33 /* PRESENTATION FORM FOR VERTICAL LOW LINE */
+ || ch == 0xFE34 /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE */
+ || ch == 0xFE45 /* SESAME DOT */
+ || ch == 0xFE46 /* WHITE SESAME DOT */
+ || ch == 0xFE49 /* DASHED OVERLINE */
+ || ch == 0xFE4A /* CENTRELINE OVERLINE */
+ || ch == 0xFE4B /* WAVY OVERLINE */
+ || ch == 0xFE4C /* DOUBLE WAVY OVERLINE */
+ || ch == 0xFE4D /* DASHED LOW LINE */
+ || ch == 0xFE4E /* CENTRELINE LOW LINE */
+ || ch == 0xFE4F /* WAVY LOW LINE */
+ || ch == 0xFE51 /* SMALL IDEOGRAPHIC COMMA */
+ || ch == 0xFE58 /* SMALL EM DASH */
+ || ch == 0xFE5F /* SMALL NUMBER SIGN */
+ || ch == 0xFE60 /* SMALL AMPERSAND */
+ || ch == 0xFE61 /* SMALL ASTERISK */
+ || ch == 0xFE68 /* SMALL REVERSE SOLIDUS */
+ || ch == 0xFE6B /* SMALL COMMERCIAL AT */
+ || ch == 0xFF02 /* FULLWIDTH QUOTATION MARK */
+ || ch == 0xFF03 /* FULLWIDTH NUMBER SIGN */
+ || ch == 0xFF06 /* FULLWIDTH AMPERSAND */
+ || ch == 0xFF07 /* FULLWIDTH APOSTROPHE */
+ || ch == 0xFF0A /* FULLWIDTH ASTERISK */
+ || ch == 0xFF0B /* FULLWIDTH PLUS SIGN */
+ || ch == 0xFF0D /* FULLWIDTH HYPHEN-MINUS */
+ || ch == 0xFF0F /* FULLWIDTH SOLIDUS */
+ || ch == 0xFF1C /* FULLWIDTH LESS-THAN SIGN */
+ || ch == 0xFF1D /* FULLWIDTH EQUALS SIGN */
+ || ch == 0xFF1E /* FULLWIDTH GREATER-THAN SIGN */
+ || ch == 0xFF20 /* FULLWIDTH COMMERCIAL AT */
+ || ch == 0xFF3C /* FULLWIDTH REVERSE SOLIDUS */
+ || ch == 0xFF3E /* FULLWIDTH CIRCUMFLEX ACCENT */
+ || ch == 0xFF3F /* FULLWIDTH LOW LINE */
+ || ch == 0xFF40 /* FULLWIDTH GRAVE ACCENT */
+ || ch == 0xFF5C /* FULLWIDTH VERTICAL LINE */
+ || ch == 0xFF5E /* FULLWIDTH TILDE */
+ || ch == 0xFFE2 /* FULLWIDTH NOT SIGN */
+ || ch == 0xFFE3 /* FULLWIDTH MACRON */
+ || ch == 0xFFE4 /* FULLWIDTH BROKEN BAR */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || (ch >= 0x1B000 && ch <= 0x1B001) /* Kana Supplement */
+ || (ch >= 0x1F200 && ch <= 0x1F248) /* Enclosed Ideographic Supplement */
+ || (ch >= 0x1F250 && ch <= 0x1F251) /* Enclosed Ideographic Supplement */
+ || (ch >= 0x2A700 && ch <= 0x2B734) /* CJK Ideograph Extension C */
+ || (ch >= 0x2B740 && ch <= 0x2B81D) /* CJK Ideograph Extension D */)
+ if (!(attr & (((int64_t) 1 << LBP_NS) | ((int64_t) 1 << LBP_CM))))
+ {
+ /* ambiguous (ideograph) ? */
+ if ((unicode_width[ch] != NULL
+ && unicode_width[ch][0] == 'A'
+ && ch >= 0x2000)
+ || ch == 0x24EA /* CIRCLED DIGIT ZERO */
+ || (ch >= 0x2780 && ch <= 0x2793) /* DINGBAT ... CIRCLED DIGIT ... */)
+ attr |= (int64_t) 1 << LBP_AI;
+ else
+ attr |= (int64_t) 1 << LBP_ID;
+ }
+
+ /* ordinary alphabetic and symbol characters */
+ if ((unicode_attributes[ch].category[0] == 'L'
+ && (unicode_attributes[ch].category[1] == 'u'
+ || unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 't'
+ || unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'S'
+ && (unicode_attributes[ch].category[1] == 'm'
+ || unicode_attributes[ch].category[1] == 'k'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'N'
+ && (unicode_attributes[ch].category[1] == 'l'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || (unicode_attributes[ch].category[0] == 'P'
+ && (unicode_attributes[ch].category[1] == 'c'
+ || unicode_attributes[ch].category[1] == 'd'
+ || unicode_attributes[ch].category[1] == 'o'))
+ || ch == 0x0600 /* ARABIC NUMBER SIGN */
+ || ch == 0x0601 /* ARABIC SIGN SANAH */
+ || ch == 0x0602 /* ARABIC FOOTNOTE MARKER */
+ || ch == 0x0603 /* ARABIC SIGN SAFHA */
+ || ch == 0x06DD /* ARABIC END OF AYAH */
+ || ch == 0x070F /* SYRIAC ABBREVIATION MARK */
+ || ch == 0x2061 /* FUNCTION APPLICATION */
+ || ch == 0x2062 /* INVISIBLE TIMES */
+ || ch == 0x2063 /* INVISIBLE SEPARATOR */
+ || ch == 0x2064 /* INVISIBLE PLUS */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x110BD /* KAITHI NUMBER SIGN */)
+ if (!(attr & (((int64_t) 1 << LBP_GL) | ((int64_t) 1 << LBP_B2) | ((int64_t) 1 << LBP_BA) | ((int64_t) 1 << LBP_BB) | ((int64_t) 1 << LBP_HY) | ((int64_t) 1 << LBP_CB) | ((int64_t) 1 << LBP_CL) | ((int64_t) 1 << LBP_CP) | ((int64_t) 1 << LBP_EX) | ((int64_t) 1 << LBP_IN) | ((int64_t) 1 << LBP_NS) | ((int64_t) 1 << LBP_OP) | ((int64_t) 1 << LBP_QU) | ((int64_t) 1 << LBP_IS) | ((int64_t) 1 << LBP_NU) | ((int64_t) 1 << LBP_PO) | ((int64_t) 1 << LBP_PR) | ((int64_t) 1 << LBP_SY) | ((int64_t) 1 << LBP_H2) | ((int64_t) 1 << LBP_H3) | ((int64_t) 1 << LBP_JL) | ((int64_t) 1 << LBP_JV) | ((int64_t) 1 << LBP_JT) | ((int64_t) 1 << LBP_SA) | ((int64_t) 1 << LBP_ID))))
+ {
+ /* ambiguous (alphabetic) ? */
+ if ((unicode_width[ch] != NULL
+ && unicode_width[ch][0] == 'A'
+ && ch >= 0x2000
+ /* Extra exceptions for compatibility with Unicode LineBreak.txt. */
+ && ch != 0x2022 /* BULLET */
+ && ch != 0x203E /* OVERLINE */
+ && ch != 0x2126 /* OHM SIGN */
+ && ch != 0x2153 /* VULGAR FRACTION ONE THIRD */
+ && ch != 0x215C /* VULGAR FRACTION THREE EIGHTHS */
+ && ch != 0x215D /* VULGAR FRACTION FIVE EIGHTHS */
+ && ch != 0x21B8 /* NORTH WEST ARROW TO LONG BAR */
+ && ch != 0x21B9 /* LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR */
+ && ch != 0x21E7 /* UPWARDS WHITE ARROW */
+ && ch != 0x24FF /* NEGATIVE CIRCLED DIGIT ZERO */
+ && ch != 0x273D /* HEAVY TEARDROP-SPOKED ASTERISK */)
+ || ch == 0x00A7 /* SECTION SIGN */
+ || ch == 0x00A8 /* DIAERESIS */
+ || ch == 0x00AA /* FEMININE ORDINAL INDICATOR */
+ || ch == 0x00B2 /* SUPERSCRIPT TWO */
+ || ch == 0x00B3 /* SUPERSCRIPT THREE */
+ || ch == 0x00B6 /* PILCROW SIGN */
+ || ch == 0x00B7 /* MIDDLE DOT */
+ || ch == 0x00B8 /* CEDILLA */
+ || ch == 0x00B9 /* SUPERSCRIPT ONE */
+ || ch == 0x00BA /* MASCULINE ORDINAL INDICATOR */
+ || ch == 0x00BC /* VULGAR FRACTION ONE QUARTER */
+ || ch == 0x00BD /* VULGAR FRACTION ONE HALF */
+ || ch == 0x00BE /* VULGAR FRACTION THREE QUARTERS */
+ || ch == 0x00D7 /* MULTIPLICATION SIGN */
+ || ch == 0x00F7 /* DIVISION SIGN */
+ || ch == 0x02C7 /* CARON */
+ || ch == 0x02C9 /* MODIFIER LETTER MACRON */
+ || ch == 0x02CA /* MODIFIER LETTER ACUTE ACCENT */
+ || ch == 0x02CB /* MODIFIER LETTER GRAVE ACCENT */
+ || ch == 0x02CD /* MODIFIER LETTER LOW MACRON */
+ || ch == 0x02D0 /* MODIFIER LETTER TRIANGULAR COLON */
+ || ch == 0x02D8 /* BREVE */
+ || ch == 0x02D9 /* DOT ABOVE */
+ || ch == 0x02DA /* RING ABOVE */
+ || ch == 0x02DB /* OGONEK */
+ || ch == 0x02DD /* DOUBLE ACUTE ACCENT */
+ || ch == 0x24EA /* CIRCLED DIGIT ZERO */
+ || (ch >= 0x2780 && ch <= 0x2793) /* DINGBAT ... CIRCLED DIGIT ... */
+ /* Extra characters for compatibility with Unicode LineBreak.txt. */
+ || ch == 0x2155 /* VULGAR FRACTION ONE FIFTH */
+ || ch == 0x2574 /* BOX DRAWINGS LIGHT LEFT */
+ || ch == 0x2616 /* WHITE SHOGI PIECE */
+ || ch == 0x2617 /* BLACK SHOGI PIECE */)
+ attr |= (int64_t) 1 << LBP_AI;
+ else
+ attr |= (int64_t) 1 << LBP_AL;
+ attr &= ~((int64_t) 1 << LBP_CM);
+ }
+ }
+ else
+ {
+ /* Unassigned character. */
+ if ((ch >= 0x3400 && ch <= 0x4DBF) /* CJK Unified Ideographs Extension A */
+ || (ch >= 0x4E00 && ch <= 0x9FFF) /* CJK Unified Ideographs */
+ || (ch >= 0xF900 && ch <= 0xFAFF) /* CJK Compatibility Ideographs */
+ || (ch >= 0x20000 && ch <= 0x2A6FF) /* CJK Unified Ideographs Extension B */
+ || (ch >= 0x2A700 && ch <= 0x2F7FF) /* CJK Unified Ideographs Extension C,
+ Supplementary Ideographic Plane (Plane 2) outside of blocks */
+ || (ch >= 0x2F800 && ch <= 0x2FFFD) /* CJK Compatibility Ideographs Supplement,
+ Supplementary Ideographic Plane (Plane 2) outside of blocks */
+ || (ch >= 0x30000 && ch <= 0x3FFFD) /* Tertiary Ideographic Plane (Plane 3) outside of blocks */)
+ attr |= (int64_t) 1 << LBP_ID;
+ }
+
+ if (attr == 0)
+ /* unknown */
+ attr |= (int64_t) 1 << LBP_XX;
+
+ return attr;
+}
+
+/* Output the line breaking properties in a human readable format. */
+static void
+debug_output_lbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int64_t attr = get_lbp (i);
+ if (attr != (int64_t) 1 << LBP_XX)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PRINT_BIT(attr,bit) \
+ if (attr & ((int64_t) 1 << bit)) fprintf (stream, " " #bit);
+ PRINT_BIT(attr,LBP_BK);
+ PRINT_BIT(attr,LBP_CM);
+ PRINT_BIT(attr,LBP_WJ);
+ PRINT_BIT(attr,LBP_ZW);
+ PRINT_BIT(attr,LBP_GL);
+ PRINT_BIT(attr,LBP_SP);
+ PRINT_BIT(attr,LBP_B2);
+ PRINT_BIT(attr,LBP_BA);
+ PRINT_BIT(attr,LBP_BB);
+ PRINT_BIT(attr,LBP_HY);
+ PRINT_BIT(attr,LBP_CB);
+ PRINT_BIT(attr,LBP_CL);
+ PRINT_BIT(attr,LBP_CP);
+ PRINT_BIT(attr,LBP_EX);
+ PRINT_BIT(attr,LBP_IN);
+ PRINT_BIT(attr,LBP_NS);
+ PRINT_BIT(attr,LBP_OP);
+ PRINT_BIT(attr,LBP_QU);
+ PRINT_BIT(attr,LBP_IS);
+ PRINT_BIT(attr,LBP_NU);
+ PRINT_BIT(attr,LBP_PO);
+ PRINT_BIT(attr,LBP_PR);
+ PRINT_BIT(attr,LBP_SY);
+ PRINT_BIT(attr,LBP_AI);
+ PRINT_BIT(attr,LBP_AL);
+ PRINT_BIT(attr,LBP_H2);
+ PRINT_BIT(attr,LBP_H3);
+ PRINT_BIT(attr,LBP_ID);
+ PRINT_BIT(attr,LBP_JL);
+ PRINT_BIT(attr,LBP_JV);
+ PRINT_BIT(attr,LBP_JT);
+ PRINT_BIT(attr,LBP_SA);
+ PRINT_BIT(attr,LBP_XX);
+#undef PRINT_BIT
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_lbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_lbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* The line breaking property from the LineBreak.txt file. */
+int unicode_org_lbp[0x110000];
+
+/* Stores in unicode_org_lbp[] the line breaking property from the
+ LineBreak.txt file. */
+static void
+fill_org_lbp (const char *linebreak_filename)
+{
+ unsigned int i, j;
+ FILE *stream;
+ char field0[FIELDLEN];
+ char field1[FIELDLEN];
+ char field2[FIELDLEN];
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_org_lbp[i] = LBP_XX;
+
+ stream = fopen (linebreak_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", linebreak_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ int n;
+ int c;
+ int value;
+
+ lineno++;
+ c = getc (stream);
+ if (c == EOF)
+ break;
+ if (c == '#')
+ {
+ do c = getc (stream); while (c != EOF && c != '\n');
+ continue;
+ }
+ ungetc (c, stream);
+ n = getfield (stream, field0, ';');
+ n += getfield (stream, field1, ' ');
+ n += getfield (stream, field2, '\n');
+ if (n == 0)
+ break;
+ if (n != 3)
+ {
+ fprintf (stderr, "short line in '%s':%d\n", linebreak_filename,
+ lineno);
+ exit (1);
+ }
+#define TRY(bit) else if (strcmp (field1, #bit + 4) == 0) value = bit;
+ if (false) {}
+ TRY(LBP_BK)
+ TRY(LBP_CM)
+ TRY(LBP_WJ)
+ TRY(LBP_ZW)
+ TRY(LBP_GL)
+ TRY(LBP_SP)
+ TRY(LBP_B2)
+ TRY(LBP_BA)
+ TRY(LBP_BB)
+ TRY(LBP_HY)
+ TRY(LBP_CB)
+ TRY(LBP_CL)
+ TRY(LBP_CP)
+ TRY(LBP_EX)
+ TRY(LBP_IN)
+ TRY(LBP_NS)
+ TRY(LBP_OP)
+ TRY(LBP_QU)
+ TRY(LBP_IS)
+ TRY(LBP_NU)
+ TRY(LBP_PO)
+ TRY(LBP_PR)
+ TRY(LBP_SY)
+ TRY(LBP_AI)
+ TRY(LBP_AL)
+ TRY(LBP_H2)
+ TRY(LBP_H3)
+ TRY(LBP_ID)
+ TRY(LBP_JL)
+ TRY(LBP_JV)
+ TRY(LBP_JT)
+ TRY(LBP_SA)
+ TRY(LBP_XX)
+#undef TRY
+ else if (strcmp (field1, "LF") == 0) value = LBP_BK;
+ else if (strcmp (field1, "CR") == 0) value = LBP_BK;
+ else if (strcmp (field1, "NL") == 0) value = LBP_BK;
+ else if (strcmp (field1, "SG") == 0) value = LBP_XX;
+ else
+ {
+ fprintf (stderr, "unknown property value \"%s\" in '%s':%d\n",
+ field1, linebreak_filename, lineno);
+ exit (1);
+ }
+ i = strtoul (field0, NULL, 16);
+ if (strstr (field0, "..") != NULL)
+ {
+ /* Deal with a range. */
+ j = strtoul (strstr (field0, "..") + 2, NULL, 16);
+ for (; i <= j; i++)
+ unicode_org_lbp[i] = value;
+ }
+ else
+ {
+ /* Single character line. */
+ unicode_org_lbp[i] = value;
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", linebreak_filename);
+ exit (1);
+ }
+}
+
+/* Output the line breaking properties in a human readable format. */
+static void
+debug_output_org_lbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = unicode_org_lbp[i];
+ if (attr != LBP_XX)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PRINT_BIT(attr,bit) \
+ if (attr == bit) fprintf (stream, " " #bit);
+ PRINT_BIT(attr,LBP_BK);
+ PRINT_BIT(attr,LBP_CM);
+ PRINT_BIT(attr,LBP_WJ);
+ PRINT_BIT(attr,LBP_ZW);
+ PRINT_BIT(attr,LBP_GL);
+ PRINT_BIT(attr,LBP_SP);
+ PRINT_BIT(attr,LBP_B2);
+ PRINT_BIT(attr,LBP_BA);
+ PRINT_BIT(attr,LBP_BB);
+ PRINT_BIT(attr,LBP_HY);
+ PRINT_BIT(attr,LBP_CB);
+ PRINT_BIT(attr,LBP_CL);
+ PRINT_BIT(attr,LBP_CP);
+ PRINT_BIT(attr,LBP_EX);
+ PRINT_BIT(attr,LBP_IN);
+ PRINT_BIT(attr,LBP_NS);
+ PRINT_BIT(attr,LBP_OP);
+ PRINT_BIT(attr,LBP_QU);
+ PRINT_BIT(attr,LBP_IS);
+ PRINT_BIT(attr,LBP_NU);
+ PRINT_BIT(attr,LBP_PO);
+ PRINT_BIT(attr,LBP_PR);
+ PRINT_BIT(attr,LBP_SY);
+ PRINT_BIT(attr,LBP_AI);
+ PRINT_BIT(attr,LBP_AL);
+ PRINT_BIT(attr,LBP_H2);
+ PRINT_BIT(attr,LBP_H3);
+ PRINT_BIT(attr,LBP_ID);
+ PRINT_BIT(attr,LBP_JL);
+ PRINT_BIT(attr,LBP_JV);
+ PRINT_BIT(attr,LBP_JT);
+ PRINT_BIT(attr,LBP_SA);
+ PRINT_BIT(attr,LBP_XX);
+#undef PRINT_BIT
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_org_lbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_org_lbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE lbp_table
+#define ELEMENT unsigned char
+#define DEFAULT LBP_XX
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_lbp (FILE *stream1, FILE *stream2)
+{
+ unsigned int i;
+ struct lbp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ t.p = 7;
+ t.q = 9;
+ lbp_table_init (&t);
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int64_t attr = get_lbp (i);
+
+ /* Now attr should contain exactly one bit. */
+ if (attr == 0 || ((attr & (attr - 1)) != 0))
+ abort ();
+
+ if (attr != (int64_t) 1 << LBP_XX)
+ {
+ unsigned int log2_attr;
+ for (log2_attr = 0; attr > 1; attr >>= 1, log2_attr++);
+
+ lbp_table_add (&t, i, log2_attr);
+ }
+ }
+
+ lbp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream1, "#define lbrkprop_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream1, "\n");
+ fprintf (stream1, "typedef struct\n");
+ fprintf (stream1, " {\n");
+ fprintf (stream1, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream1, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream1, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream1, " }\n");
+ fprintf (stream1, "lbrkprop_t;\n");
+ fprintf (stream1, "extern const lbrkprop_t unilbrkprop;\n");
+
+ fprintf (stream2, "const lbrkprop_t unilbrkprop =\n");
+ fprintf (stream2, "{\n");
+ fprintf (stream2, " {");
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream2, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level3_offset) / sizeof (unsigned char));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream2, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned char value = ((unsigned char *) (t.result + level3_offset))[i];
+ const char *value_string;
+ switch (value)
+ {
+#define CASE(x) case x: value_string = #x; break;
+ CASE(LBP_BK);
+ CASE(LBP_CM);
+ CASE(LBP_WJ);
+ CASE(LBP_ZW);
+ CASE(LBP_GL);
+ CASE(LBP_SP);
+ CASE(LBP_B2);
+ CASE(LBP_BA);
+ CASE(LBP_BB);
+ CASE(LBP_HY);
+ CASE(LBP_CB);
+ CASE(LBP_CL);
+ CASE(LBP_CP);
+ CASE(LBP_EX);
+ CASE(LBP_IN);
+ CASE(LBP_NS);
+ CASE(LBP_OP);
+ CASE(LBP_QU);
+ CASE(LBP_IS);
+ CASE(LBP_NU);
+ CASE(LBP_PO);
+ CASE(LBP_PR);
+ CASE(LBP_SY);
+ CASE(LBP_AI);
+ CASE(LBP_AL);
+ CASE(LBP_H2);
+ CASE(LBP_H3);
+ CASE(LBP_ID);
+ CASE(LBP_JL);
+ CASE(LBP_JV);
+ CASE(LBP_JT);
+ CASE(LBP_SA);
+ CASE(LBP_XX);
+#undef CASE
+ default:
+ abort ();
+ }
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " %s%s", value_string,
+ (i+1 < t.level3_size << t.p ? "," : ""));
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " }\n");
+ fprintf (stream2, "};\n");
+}
+
+static void
+output_lbrk_tables (const char *filename1, const char *filename2, const char *version)
+{
+ const char *filenames[2];
+ FILE *streams[2];
+ size_t i;
+
+ filenames[0] = filename1;
+ filenames[1] = filename2;
+
+ for (i = 0; i < 2; i++)
+ {
+ streams[i] = fopen (filenames[i], "w");
+ if (streams[i] == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filenames[i]);
+ exit (1);
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ FILE *stream = streams[i];
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Line breaking properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ }
+
+ output_lbp (streams[0], streams[1]);
+
+ for (i = 0; i < 2; i++)
+ {
+ if (ferror (streams[i]) || fclose (streams[i]))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filenames[i]);
+ exit (1);
+ }
+ }
+}
+
+/* ========================================================================= */
+
+/* Word break property.
+ Updated for Unicode TR #29 revision 17. */
+
+/* Possible values of the Word_Break property. */
+enum
+{
+ WBP_OTHER = 0,
+ WBP_CR = 11,
+ WBP_LF = 12,
+ WBP_NEWLINE = 10,
+ WBP_EXTEND = 8,
+ WBP_FORMAT = 9,
+ WBP_KATAKANA = 1,
+ WBP_ALETTER = 2,
+ WBP_MIDNUMLET = 3,
+ WBP_MIDLETTER = 4,
+ WBP_MIDNUM = 5,
+ WBP_NUMERIC = 6,
+ WBP_EXTENDNUMLET = 7
+};
+
+/* Returns the word breaking property for ch, as a bit mask. */
+static int
+get_wbp (unsigned int ch)
+{
+ int attr = 0;
+
+ if (unicode_attributes[ch].name != NULL)
+ {
+ if (ch == 0x000D)
+ attr |= 1 << WBP_CR;
+
+ if (ch == 0x000A)
+ attr |= 1 << WBP_LF;
+
+ if (ch == 0x000B || ch == 0x000C
+ || ch == 0x0085
+ || ch == 0x2028 || ch == 0x2029)
+ attr |= 1 << WBP_NEWLINE;
+
+ if (((unicode_properties[ch] >> PROP_GRAPHEME_EXTEND) & 1) != 0
+ || (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Mc") == 0))
+ attr |= 1 << WBP_EXTEND;
+
+ if (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Cf") == 0
+ && ch != 0x200B && ch != 0x200C && ch != 0x200D)
+ attr |= 1 << WBP_FORMAT;
+
+ if ((unicode_scripts[ch] < numscripts
+ && strcmp (scripts[unicode_scripts[ch]], "Katakana") == 0)
+ || (ch >= 0x3031 && ch <= 0x3035)
+ || ch == 0x309B || ch == 0x309C || ch == 0x30A0 || ch == 0x30FC
+ || ch == 0xFF70)
+ attr |= 1 << WBP_KATAKANA;
+
+ if ((((unicode_properties[ch] >> PROP_ALPHABETIC) & 1) != 0
+ || ch == 0x05F3)
+ && ((unicode_properties[ch] >> PROP_IDEOGRAPHIC) & 1) == 0
+ && (attr & (1 << WBP_KATAKANA)) == 0
+ && ((get_lbp (ch) >> LBP_SA) & 1) == 0
+ && !(unicode_scripts[ch] < numscripts
+ && strcmp (scripts[unicode_scripts[ch]], "Hiragana") == 0)
+ && (attr & (1 << WBP_EXTEND)) == 0)
+ attr |= 1 << WBP_ALETTER;
+
+ if (is_WBP_MIDNUMLET (ch))
+ attr |= 1 << WBP_MIDNUMLET;
+
+ if (is_WBP_MIDLETTER (ch))
+ attr |= 1 << WBP_MIDLETTER;
+
+ if ((((get_lbp (ch) >> LBP_IS) & 1) != 0
+ || ch == 0x066C || ch == 0xFE50 || ch == 0xFE54 || ch == 0xFF0C
+ || ch == 0xFF1B)
+ && ch != 0x003A && ch != 0xFE13 && ch != 0x002E)
+ attr |= 1 << WBP_MIDNUM;
+
+ if (((get_lbp (ch) >> LBP_NU) & 1) != 0
+ && ch != 0x066C)
+ attr |= 1 << WBP_NUMERIC;
+
+ if (unicode_attributes[ch].category != NULL
+ && strcmp (unicode_attributes[ch].category, "Pc") == 0)
+ attr |= 1 << WBP_EXTENDNUMLET;
+ }
+
+ if (attr == 0)
+ /* other */
+ attr |= 1 << WBP_OTHER;
+
+ return attr;
+}
+
+/* Output the word break property in a human readable format. */
+static void
+debug_output_wbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_wbp (i);
+ if (attr != 1 << WBP_OTHER)
+ {
+ fprintf (stream, "0x%04X", i);
+ if (attr & (1 << WBP_CR))
+ fprintf (stream, " CR");
+ if (attr & (1 << WBP_LF))
+ fprintf (stream, " LF");
+ if (attr & (1 << WBP_NEWLINE))
+ fprintf (stream, " Newline");
+ if (attr & (1 << WBP_EXTEND))
+ fprintf (stream, " Extend");
+ if (attr & (1 << WBP_FORMAT))
+ fprintf (stream, " Format");
+ if (attr & (1 << WBP_KATAKANA))
+ fprintf (stream, " Katakana");
+ if (attr & (1 << WBP_ALETTER))
+ fprintf (stream, " ALetter");
+ if (attr & (1 << WBP_MIDNUMLET))
+ fprintf (stream, " MidNumLet");
+ if (attr & (1 << WBP_MIDLETTER))
+ fprintf (stream, " MidLetter");
+ if (attr & (1 << WBP_MIDNUM))
+ fprintf (stream, " MidNum");
+ if (attr & (1 << WBP_NUMERIC))
+ fprintf (stream, " Numeric");
+ if (attr & (1 << WBP_EXTENDNUMLET))
+ fprintf (stream, " ExtendNumLet");
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_wbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* The word break property from the WordBreakProperty.txt file. */
+int unicode_org_wbp[0x110000];
+
+/* Stores in unicode_org_wbp[] the word break property from the
+ WordBreakProperty.txt file. */
+static void
+fill_org_wbp (const char *wordbreakproperty_filename)
+{
+ unsigned int i;
+ FILE *stream;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_org_wbp[i] = WBP_OTHER;
+
+ stream = fopen (wordbreakproperty_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", wordbreakproperty_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char propname[200+1];
+ int propvalue;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n",
+ wordbreakproperty_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+#define PROP(name,value) \
+ if (strcmp (propname, name) == 0) propvalue = value; else
+ PROP ("CR", WBP_CR)
+ PROP ("LF", WBP_LF)
+ PROP ("Newline", WBP_NEWLINE)
+ PROP ("Extend", WBP_EXTEND)
+ PROP ("Format", WBP_FORMAT)
+ PROP ("Katakana", WBP_KATAKANA)
+ PROP ("ALetter", WBP_ALETTER)
+ PROP ("MidNumLet", WBP_MIDNUMLET)
+ PROP ("MidLetter", WBP_MIDLETTER)
+ PROP ("MidNum", WBP_MIDNUM)
+ PROP ("Numeric", WBP_NUMERIC)
+ PROP ("ExtendNumLet", WBP_EXTENDNUMLET)
+#undef PROP
+ {
+ fprintf (stderr, "unknown property value '%s' in '%s'\n", propname,
+ wordbreakproperty_filename);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+
+ for (i = i1; i <= i2; i++)
+ unicode_org_wbp[i] = propvalue;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", wordbreakproperty_filename);
+ exit (1);
+ }
+}
+
+/* Output the word break property in a human readable format. */
+static void
+debug_output_org_wbp (FILE *stream)
+{
+ unsigned int i;
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int propvalue = unicode_org_wbp[i];
+ if (propvalue != WBP_OTHER)
+ {
+ fprintf (stream, "0x%04X", i);
+#define PROP(name,value) \
+ if (propvalue == value) fprintf (stream, " " name); else
+ PROP ("CR", WBP_CR)
+ PROP ("LF", WBP_LF)
+ PROP ("Newline", WBP_NEWLINE)
+ PROP ("Extend", WBP_EXTEND)
+ PROP ("Format", WBP_FORMAT)
+ PROP ("Katakana", WBP_KATAKANA)
+ PROP ("ALetter", WBP_ALETTER)
+ PROP ("MidNumLet", WBP_MIDNUMLET)
+ PROP ("MidLetter", WBP_MIDLETTER)
+ PROP ("MidNum", WBP_MIDNUM)
+ PROP ("Numeric", WBP_NUMERIC)
+ PROP ("ExtendNumLet", WBP_EXTENDNUMLET)
+#undef PROP
+ fprintf (stream, " ??");
+ fprintf (stream, "\n");
+ }
+ }
+}
+
+static void
+debug_output_org_wbrk_tables (const char *filename)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ debug_output_org_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE wbp_table
+#define ELEMENT unsigned char
+#define DEFAULT WBP_OTHER
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_wbp (FILE *stream)
+{
+ unsigned int i;
+ struct wbp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ t.p = 7;
+ t.q = 9;
+ wbp_table_init (&t);
+
+ for (i = 0; i < 0x110000; i++)
+ {
+ int attr = get_wbp (i);
+
+ /* Now attr should contain exactly one bit. */
+ if (attr == 0 || ((attr & (attr - 1)) != 0))
+ abort ();
+
+ if (attr != 1 << WBP_OTHER)
+ {
+ unsigned int log2_attr;
+ for (log2_attr = 0; attr > 1; attr >>= 1, log2_attr++);
+
+ wbp_table_add (&t, i, log2_attr);
+ }
+ }
+
+ wbp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define wbrkprop_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "\n");
+ fprintf (stream, "typedef struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "wbrkprop_t;\n");
+ fprintf (stream, "static const wbrkprop_t uniwbrkprop =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (unsigned char));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ unsigned char value = ((unsigned char *) (t.result + level3_offset))[i];
+ const char *value_string;
+ switch (value)
+ {
+#define CASE(x) case x: value_string = #x; break;
+ CASE(WBP_OTHER);
+ CASE(WBP_CR);
+ CASE(WBP_LF);
+ CASE(WBP_NEWLINE);
+ CASE(WBP_EXTEND);
+ CASE(WBP_FORMAT);
+ CASE(WBP_KATAKANA);
+ CASE(WBP_ALETTER);
+ CASE(WBP_MIDNUMLET);
+ CASE(WBP_MIDLETTER);
+ CASE(WBP_MIDNUM);
+ CASE(WBP_NUMERIC);
+ CASE(WBP_EXTENDNUMLET);
+#undef CASE
+ default:
+ abort ();
+ }
+ if (i > 0 && (i % 4) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %s%s", value_string,
+ (i+1 < t.level3_size << t.p ? "," : ""));
+ }
+ if (t.level3_size << t.p > 4)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+}
+
+static void
+output_wbrk_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Line breaking properties of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2000-2002, 2004, 2007-2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+
+ output_wbp (stream);
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Grapheme break property.
+ Updated for Unicode TR #29 revision 17. */
+
+/* Possible values of the Grapheme_Cluster_Break property. */
+enum
+{
+ GBP_OTHER = 0,
+ GBP_CR = 1,
+ GBP_LF = 2,
+ GBP_CONTROL = 3,
+ GBP_EXTEND = 4,
+ GBP_PREPEND = 5,
+ GBP_SPACINGMARK = 6,
+ GBP_L = 7,
+ GBP_V = 8,
+ GBP_T = 9,
+ GBP_LV = 10,
+ GBP_LVT = 11
+};
+
+/* Construction of sparse 3-level tables. */
+#define TABLE gbp_table
+#define ELEMENT unsigned char
+#define DEFAULT GBP_OTHER
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* The grapheme break property from the GraphemeBreakProperty.txt file. */
+int unicode_org_gbp[0x110000];
+
+/* Output the unit test data for the grapheme break property. */
+static void
+output_gbp_test (const char *filename)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Test the Unicode grapheme break property functions.\n");
+ fprintf (stream, " Copyright (C) 2010 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int gbp = unicode_org_gbp[ch];
+ const char *gbp_string;
+
+ while (ch + 1 < 0x110000 && unicode_org_gbp[ch + 1] == gbp)
+ ch++;
+
+ switch (gbp)
+ {
+#define CASE(x) case x: gbp_string = #x; break;
+ CASE (GBP_OTHER)
+ CASE (GBP_CR)
+ CASE (GBP_LF)
+ CASE (GBP_CONTROL)
+ CASE (GBP_EXTEND)
+ CASE (GBP_PREPEND)
+ CASE (GBP_SPACINGMARK)
+ CASE (GBP_L)
+ CASE (GBP_V)
+ CASE (GBP_T)
+ CASE (GBP_LV)
+ CASE (GBP_LVT)
+#undef CASE
+ default:
+ abort ();
+ }
+
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, "{ 0x%04X, %s }", ch + 1, gbp_string);
+
+ need_comma = true;
+ }
+ fprintf (stream, "\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Output the per-character grapheme break property table. */
+static void
+output_gbp_table (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct gbp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Grapheme break property of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ gbp_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ gbp_table_add (&t, ch, unicode_org_gbp[ch]);
+
+ gbp_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define gbrkprop_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " unsigned char level3[(%zu << %d) / 2];\n",
+ t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "unigbrkprop =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (uint8_t) / 2);
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < (t.level3_size << t.p) / 2; i++)
+ {
+ unsigned char *p = (unsigned char *) (t.result + level3_offset);
+ unsigned char value0 = p[i * 2];
+ unsigned char value1 = p[i * 2 + 1];
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " 0x%02x%s", (value1 << 4) + value0,
+ (i+1 < (t.level3_size << t.p) / 2 ? "," : ""));
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Stores in unicode_org_gbp[] the grapheme breaking property from the
+ GraphemeBreakProperty.txt file. */
+static void
+fill_org_gbp (const char *graphemebreakproperty_filename)
+{
+ unsigned int i;
+ FILE *stream;
+ int lineno = 0;
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_org_gbp[i] = GBP_OTHER;
+
+ stream = fopen (graphemebreakproperty_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n",
+ graphemebreakproperty_filename);
+ exit (1);
+ }
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i1, i2;
+ char padding[200+1];
+ char propname[200+1];
+ int propvalue;
+
+ lineno++;
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X..%X%[ ;]%[^ ]", &i1, &i2, padding, propname) != 4)
+ {
+ if (sscanf (buf, "%X%[ ;]%[^ ]", &i1, padding, propname) != 3)
+ {
+ fprintf (stderr, "parse error in '%s'\n",
+ graphemebreakproperty_filename);
+ exit (1);
+ }
+ i2 = i1;
+ }
+#define PROP(name,value) \
+ if (strcmp (propname, name) == 0) propvalue = value; else
+ PROP ("CR", GBP_CR)
+ PROP ("LF", GBP_LF)
+ PROP ("Control", GBP_CONTROL)
+ PROP ("Extend", GBP_EXTEND)
+ PROP ("Prepend", GBP_PREPEND)
+ PROP ("SpacingMark", GBP_SPACINGMARK)
+ PROP ("L", GBP_L)
+ PROP ("V", GBP_V)
+ PROP ("T", GBP_T)
+ PROP ("LV", GBP_LV)
+ PROP ("LVT", GBP_LVT)
+#undef PROP
+ {
+ fprintf (stderr, "unknown property value '%s' in %s:%d\n", propname,
+ graphemebreakproperty_filename, lineno);
+ exit (1);
+ }
+ if (!(i1 <= i2 && i2 < 0x110000))
+ abort ();
+
+ for (i = i1; i <= i2; i++)
+ unicode_org_gbp[i] = propvalue;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", graphemebreakproperty_filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Composition and decomposition.
+ Updated for Unicode TR #15 revision 33. */
+
+/* Maximum number of characters into which a single Unicode character can be
+ decomposed. */
+#define MAX_DECOMP_LENGTH 18
+
+enum
+{
+ UC_DECOMP_CANONICAL,/* Canonical decomposition. */
+ UC_DECOMP_FONT, /* <font> A font variant (e.g. a blackletter form). */
+ UC_DECOMP_NOBREAK, /* <noBreak> A no-break version of a space or hyphen. */
+ UC_DECOMP_INITIAL, /* <initial> An initial presentation form (Arabic). */
+ UC_DECOMP_MEDIAL, /* <medial> A medial presentation form (Arabic). */
+ UC_DECOMP_FINAL, /* <final> A final presentation form (Arabic). */
+ UC_DECOMP_ISOLATED,/* <isolated> An isolated presentation form (Arabic). */
+ UC_DECOMP_CIRCLE, /* <circle> An encircled form. */
+ UC_DECOMP_SUPER, /* <super> A superscript form. */
+ UC_DECOMP_SUB, /* <sub> A subscript form. */
+ UC_DECOMP_VERTICAL,/* <vertical> A vertical layout presentation form. */
+ UC_DECOMP_WIDE, /* <wide> A wide (or zenkaku) compatibility character. */
+ UC_DECOMP_NARROW, /* <narrow> A narrow (or hankaku) compatibility character. */
+ UC_DECOMP_SMALL, /* <small> A small variant form (CNS compatibility). */
+ UC_DECOMP_SQUARE, /* <square> A CJK squared font variant. */
+ UC_DECOMP_FRACTION,/* <fraction> A vulgar fraction form. */
+ UC_DECOMP_COMPAT /* <compat> Otherwise unspecified compatibility character. */
+};
+
+/* Return the decomposition for a Unicode character (ignoring Hangul Jamo
+ decompositions). Return the type, or -1 for none. */
+static int
+get_decomposition (unsigned int ch,
+ unsigned int *lengthp, unsigned int decomposed[MAX_DECOMP_LENGTH])
+{
+ const char *decomposition = unicode_attributes[ch].decomposition;
+
+ if (decomposition != NULL && decomposition[0] != '\0')
+ {
+ int type = UC_DECOMP_CANONICAL;
+ unsigned int length;
+ char *endptr;
+
+ if (decomposition[0] == '<')
+ {
+ const char *rangle;
+ size_t typelen;
+
+ rangle = strchr (decomposition + 1, '>');
+ if (rangle == NULL)
+ abort ();
+ typelen = rangle + 1 - decomposition;
+#define TYPE(t1,t2) \
+ if (typelen == (sizeof (t1) - 1) && memcmp (decomposition, t1, typelen) == 0) \
+ type = t2; \
+ else
+ TYPE ("<font>", UC_DECOMP_FONT)
+ TYPE ("<noBreak>", UC_DECOMP_NOBREAK)
+ TYPE ("<initial>", UC_DECOMP_INITIAL)
+ TYPE ("<medial>", UC_DECOMP_MEDIAL)
+ TYPE ("<final>", UC_DECOMP_FINAL)
+ TYPE ("<isolated>", UC_DECOMP_ISOLATED)
+ TYPE ("<circle>", UC_DECOMP_CIRCLE)
+ TYPE ("<super>", UC_DECOMP_SUPER)
+ TYPE ("<sub>", UC_DECOMP_SUB)
+ TYPE ("<vertical>", UC_DECOMP_VERTICAL)
+ TYPE ("<wide>", UC_DECOMP_WIDE)
+ TYPE ("<narrow>", UC_DECOMP_NARROW)
+ TYPE ("<small>", UC_DECOMP_SMALL)
+ TYPE ("<square>", UC_DECOMP_SQUARE)
+ TYPE ("<fraction>", UC_DECOMP_FRACTION)
+ TYPE ("<compat>", UC_DECOMP_COMPAT)
+ {
+ fprintf (stderr, "unknown decomposition type %*s\n", (int)typelen, decomposition);
+ exit (1);
+ }
+#undef TYPE
+ decomposition = rangle + 1;
+ if (decomposition[0] == ' ')
+ decomposition++;
+ }
+ for (length = 0; length < MAX_DECOMP_LENGTH; length++)
+ {
+ decomposed[length] = strtoul (decomposition, &endptr, 16);
+ if (endptr == decomposition)
+ break;
+ decomposition = endptr;
+ if (decomposition[0] == ' ')
+ decomposition++;
+ }
+ if (*decomposition != '\0')
+ /* MAX_DECOMP_LENGTH is too small. */
+ abort ();
+
+ *lengthp = length;
+ return type;
+ }
+ else
+ return -1;
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE decomp_table
+#define ELEMENT uint16_t
+#define DEFAULT (uint16_t)(-1)
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+static void
+output_decomposition (FILE *stream1, FILE *stream2)
+{
+ struct decomp_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+ unsigned int offset;
+ unsigned int ch;
+ unsigned int i;
+
+ t.p = 5;
+ t.q = 5;
+ decomp_table_init (&t);
+
+ fprintf (stream1, "extern const unsigned char gl_uninorm_decomp_chars_table[];\n");
+ fprintf (stream1, "\n");
+ fprintf (stream2, "const unsigned char gl_uninorm_decomp_chars_table[] =\n{");
+ offset = 0;
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type >= 0)
+ {
+ if (!(offset < (1 << 15)))
+ abort ();
+ decomp_table_add (&t, ch, ((type == UC_DECOMP_CANONICAL ? 0 : 1) << 15) | offset);
+
+ /* Produce length 3-bytes entries. */
+ if (length == 0)
+ /* We would need a special representation of zero-length entries. */
+ abort ();
+ for (i = 0; i < length; i++)
+ {
+ if (offset > 0)
+ fprintf (stream2, ",");
+ if ((offset % 4) == 0)
+ fprintf (stream2, "\n ");
+ if (!(decomposed[i] < (1 << 18)))
+ abort ();
+ fprintf (stream2, " 0x%02X, 0x%02X, 0x%02X",
+ (((i+1 < length ? (1 << 23) : 0)
+ | (i == 0 ? (type << 18) : 0)
+ | decomposed[i]) >> 16) & 0xff,
+ (decomposed[i] >> 8) & 0xff,
+ decomposed[i] & 0xff);
+ offset++;
+ }
+ }
+ }
+
+ fprintf (stream2, "\n};\n");
+ fprintf (stream2, "\n");
+
+ decomp_table_finalize (&t);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream1, "#define decomp_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream1, "\n");
+ fprintf (stream1, "typedef struct\n");
+ fprintf (stream1, " {\n");
+ fprintf (stream1, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream1, " int level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream1, " unsigned short level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream1, " }\n");
+ fprintf (stream1, "decomp_index_table_t;\n");
+ fprintf (stream1, "extern const decomp_index_table_t gl_uninorm_decomp_index_table;\n");
+ fprintf (stream2, "const decomp_index_table_t gl_uninorm_decomp_index_table =\n");
+ fprintf (stream2, "{\n");
+ fprintf (stream2, " {");
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream2, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream2, " %5d", -1);
+ else
+ fprintf (stream2, " %5zu",
+ (offset - level3_offset) / sizeof (uint16_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream2, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " },\n");
+ fprintf (stream2, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ uint16_t value = ((uint16_t *) (t.result + level3_offset))[i];
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " %5d", value == (uint16_t)(-1) ? -1 : value);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream2, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream2, "\n ");
+ fprintf (stream2, " }\n");
+ fprintf (stream2, "};\n");
+}
+
+static void
+output_decomposition_tables (const char *filename1, const char *filename2, const char *version)
+{
+ const char *filenames[2];
+ FILE *streams[2];
+ size_t i;
+
+ filenames[0] = filename1;
+ filenames[1] = filename2;
+
+ for (i = 0; i < 2; i++)
+ {
+ streams[i] = fopen (filenames[i], "w");
+ if (streams[i] == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filenames[i]);
+ exit (1);
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ FILE *stream = streams[i];
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Decomposition of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+ }
+
+ output_decomposition (streams[0], streams[1]);
+
+ for (i = 0; i < 2; i++)
+ {
+ if (ferror (streams[i]) || fclose (streams[i]))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filenames[i]);
+ exit (1);
+ }
+ }
+}
+
+/* The "excluded from composition" property from the CompositionExclusions.txt file. */
+char unicode_composition_exclusions[0x110000];
+
+static void
+fill_composition_exclusions (const char *compositionexclusions_filename)
+{
+ FILE *stream;
+ unsigned int i;
+
+ stream = fopen (compositionexclusions_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+
+ for (i = 0; i < 0x110000; i++)
+ unicode_composition_exclusions[i] = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ unsigned int i;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ if (sscanf (buf, "%X", &i) != 1)
+ {
+ fprintf (stderr, "parse error in '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+ if (!(i < 0x110000))
+ abort ();
+
+ unicode_composition_exclusions[i] = 1;
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", compositionexclusions_filename);
+ exit (1);
+ }
+}
+
+static void
+debug_output_composition_tables (const char *filename)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type == UC_DECOMP_CANONICAL
+ /* Consider only binary decompositions.
+ Exclude singleton decompositions. */
+ && length == 2)
+ {
+ unsigned int code1 = decomposed[0];
+ unsigned int code2 = decomposed[1];
+ unsigned int combined = ch;
+
+ /* Exclude decompositions where the first part is not a starter,
+ i.e. is not of canonical combining class 0. */
+ if (strcmp (unicode_attributes[code1].combining, "0") == 0
+ /* Exclude characters listed in CompositionExclusions.txt. */
+ && !unicode_composition_exclusions[combined])
+ {
+ /* The combined character must now also be a starter.
+ Verify this. */
+ if (strcmp (unicode_attributes[combined].combining, "0") != 0)
+ abort ();
+
+ fprintf (stream, "0x%04X\t0x%04X\t0x%04X\t%s\n",
+ code1,
+ code2,
+ combined,
+ unicode_attributes[code2].combining);
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+static void
+output_composition_tables (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Canonical composition of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+
+ /* Put a GPL header on it. The gnulib module is under LGPL (although it
+ still carries the GPL header), and it's gnulib-tool which replaces the
+ GPL header with an LGPL header. */
+ fprintf (stream, "/* Copyright (C) 2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+
+ /* The composition table is a set of mappings (code1, code2) -> combined,
+ with 928 entries,
+ 367 values for code1 (from 0x003C to 0x30FD),
+ 54 values for code2 (from 0x0300 to 0x309A).
+ For a fixed code1, there are from 1 to 19 possible values for code2.
+ For a fixed code2, there are from 1 to 117 possible values for code1.
+ This is a very sparse matrix.
+
+ We want an O(1) hash lookup.
+
+ We could implement the hash lookup by mapping (code1, code2) to a linear
+ combination mul1*code1 + mul2*code2, which is then used as an index into
+ a 3-level table. But this leads to a table of size 37 KB.
+
+ We use gperf to implement the hash lookup, giving it the 928 sets of
+ 4 bytes (code1, code2) as input. gperf generates a hash table of size
+ 1527, which is quite good (60% filled). It requires an auxiliary table
+ lookup in a table of size 0.5 KB. The total tables size is 11 KB. */
+
+ fprintf (stream, "struct composition_rule { char codes[6]; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define slot-name codes\n");
+ fprintf (stream, "%%define hash-function-name gl_uninorm_compose_hash\n");
+ fprintf (stream, "%%define lookup-function-name gl_uninorm_compose_lookup\n");
+ fprintf (stream, "%%compare-lengths\n");
+ fprintf (stream, "%%compare-strncmp\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%omit-struct-type\n");
+ fprintf (stream, "%%%%\n");
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int length;
+ unsigned int decomposed[MAX_DECOMP_LENGTH];
+ int type = get_decomposition (ch, &length, decomposed);
+
+ if (type == UC_DECOMP_CANONICAL
+ /* Consider only binary decompositions.
+ Exclude singleton decompositions. */
+ && length == 2)
+ {
+ unsigned int code1 = decomposed[0];
+ unsigned int code2 = decomposed[1];
+ unsigned int combined = ch;
+
+ /* Exclude decompositions where the first part is not a starter,
+ i.e. is not of canonical combining class 0. */
+ if (strcmp (unicode_attributes[code1].combining, "0") == 0
+ /* Exclude characters listed in CompositionExclusions.txt. */
+ && !unicode_composition_exclusions[combined])
+ {
+ /* The combined character must now also be a starter.
+ Verify this. */
+ if (strcmp (unicode_attributes[combined].combining, "0") != 0)
+ abort ();
+
+ fprintf (stream, "\"\\x%02x\\x%02x\\x%02x\\x%02x\\x%02x\\x%02x\", 0x%04x\n",
+ (code1 >> 16) & 0xff, (code1 >> 8) & 0xff, code1 & 0xff,
+ (code2 >> 16) & 0xff, (code2 >> 8) & 0xff, code2 & 0xff,
+ combined);
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Output the test for a simple character mapping table to the given file. */
+
+static void
+output_simple_mapping_test (const char *filename,
+ const char *function_name,
+ unsigned int (*func) (unsigned int),
+ const char *version)
+{
+ FILE *stream;
+ bool need_comma;
+ unsigned int ch;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Test the Unicode character mapping functions.\n");
+ fprintf (stream, " Copyright (C) 2009 Free Software Foundation, Inc.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is free software: you can redistribute it and/or modify\n");
+ fprintf (stream, " it under the terms of the GNU General Public License as published by\n");
+ fprintf (stream, " the Free Software Foundation; either version 3 of the License, or\n");
+ fprintf (stream, " (at your option) any later version.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " This program is distributed in the hope that it will be useful,\n");
+ fprintf (stream, " but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ fprintf (stream, " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ fprintf (stream, " GNU General Public License for more details.\n");
+ fprintf (stream, "\n");
+ fprintf (stream, " You should have received a copy of the GNU General Public License\n");
+ fprintf (stream, " along with this program. If not, see <http://www.gnu.org/licenses/>. */\n");
+ fprintf (stream, "\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "\n");
+ fprintf (stream, "#include \"test-mapping-part1.h\"\n");
+ fprintf (stream, "\n");
+
+ need_comma = false;
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ unsigned int value = func (ch);
+
+ if (value != ch)
+ {
+ if (need_comma)
+ fprintf (stream, ",\n");
+ fprintf (stream, " { 0x%04X, 0x%04X }", ch, value);
+ need_comma = true;
+ }
+ }
+ if (need_comma)
+ fprintf (stream, "\n");
+
+ fprintf (stream, "\n");
+ fprintf (stream, "#define MAP(c) %s (c)\n", function_name);
+ fprintf (stream, "#include \"test-mapping-part2.h\"\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* Construction of sparse 3-level tables. */
+#define TABLE mapping_table
+#define ELEMENT int32_t
+#define DEFAULT 0
+#define xmalloc malloc
+#define xrealloc realloc
+#include "3level.h"
+
+/* Output a simple character mapping table to the given file. */
+
+static void
+output_simple_mapping (const char *filename,
+ unsigned int (*func) (unsigned int),
+ const char *version)
+{
+ FILE *stream;
+ unsigned int ch, i;
+ struct mapping_table t;
+ unsigned int level1_offset, level2_offset, level3_offset;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Simple character mapping of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+
+ t.p = 7;
+ t.q = 9;
+ mapping_table_init (&t);
+
+ for (ch = 0; ch < 0x110000; ch++)
+ {
+ int value = (int) func (ch) - (int) ch;
+
+ mapping_table_add (&t, ch, value);
+ }
+
+ mapping_table_finalize (&t);
+
+ /* Offsets in t.result, in memory of this process. */
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t.level1_size * sizeof (uint32_t)
+ + (t.level2_size << t.q) * sizeof (uint32_t);
+
+ for (i = 0; i < 5; i++)
+ fprintf (stream, "#define mapping_header_%d %d\n", i,
+ ((uint32_t *) t.result)[i]);
+ fprintf (stream, "static const\n");
+ fprintf (stream, "struct\n");
+ fprintf (stream, " {\n");
+ fprintf (stream, " int level1[%zu];\n", t.level1_size);
+ fprintf (stream, " short level2[%zu << %d];\n", t.level2_size, t.q);
+ fprintf (stream, " int level3[%zu << %d];\n", t.level3_size, t.p);
+ fprintf (stream, " }\n");
+ fprintf (stream, "u_mapping =\n");
+ fprintf (stream, "{\n");
+ fprintf (stream, " {");
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level1_size; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level1_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level2_offset) / sizeof (uint32_t));
+ if (i+1 < t.level1_size)
+ fprintf (stream, ",");
+ }
+ if (t.level1_size > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level2_size << t.q; i++)
+ {
+ uint32_t offset;
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ offset = ((uint32_t *) (t.result + level2_offset))[i];
+ if (offset == 0)
+ fprintf (stream, " %5d", -1);
+ else
+ fprintf (stream, " %5zu",
+ (offset - level3_offset) / sizeof (int32_t));
+ if (i+1 < t.level2_size << t.q)
+ fprintf (stream, ",");
+ }
+ if (t.level2_size << t.q > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " },\n");
+ fprintf (stream, " {");
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ for (i = 0; i < t.level3_size << t.p; i++)
+ {
+ if (i > 0 && (i % 8) == 0)
+ fprintf (stream, "\n ");
+ fprintf (stream, " %5d", ((int32_t *) (t.result + level3_offset))[i]);
+ if (i+1 < t.level3_size << t.p)
+ fprintf (stream, ",");
+ }
+ if (t.level3_size << t.p > 8)
+ fprintf (stream, "\n ");
+ fprintf (stream, " }\n");
+ fprintf (stream, "};\n");
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* A special casing context.
+ A context is negated through x -> -x. */
+enum
+{
+ SCC_ALWAYS = 0,
+ SCC_FINAL_SIGMA,
+ SCC_AFTER_SOFT_DOTTED,
+ SCC_MORE_ABOVE,
+ SCC_BEFORE_DOT,
+ SCC_AFTER_I
+};
+
+/* A special casing rule. */
+struct special_casing_rule
+{
+ unsigned int code;
+ unsigned int lower_mapping[3];
+ unsigned int title_mapping[3];
+ unsigned int upper_mapping[3];
+ unsigned int casefold_mapping[3];
+ const char *language;
+ int context;
+};
+
+/* The special casing rules. */
+struct special_casing_rule **casing_rules;
+unsigned int num_casing_rules;
+unsigned int allocated_casing_rules;
+
+static void
+add_casing_rule (struct special_casing_rule *new_rule)
+{
+ if (num_casing_rules == allocated_casing_rules)
+ {
+ allocated_casing_rules = 2 * allocated_casing_rules;
+ if (allocated_casing_rules < 16)
+ allocated_casing_rules = 16;
+ casing_rules =
+ (struct special_casing_rule **)
+ realloc (casing_rules, allocated_casing_rules * sizeof (struct special_casing_rule *));
+ }
+ casing_rules[num_casing_rules++] = new_rule;
+}
+
+/* Stores in casing_rules the special casing rules found in
+ specialcasing_filename. */
+static void
+fill_casing_rules (const char *specialcasing_filename)
+{
+ FILE *stream;
+
+ stream = fopen (specialcasing_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+
+ casing_rules = NULL;
+ num_casing_rules = 0;
+ allocated_casing_rules = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ char *scanptr;
+ char *endptr;
+ int i;
+
+ unsigned int code;
+ unsigned int lower_mapping[3];
+ unsigned int title_mapping[3];
+ unsigned int upper_mapping[3];
+ char *language;
+ int context;
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ /* Scan code. */
+ scanptr = buf;
+ code = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan lower mapping. */
+ for (i = 0; i < 3; i++)
+ lower_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ lower_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan title mapping. */
+ for (i = 0; i < 3; i++)
+ title_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ title_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan upper mapping. */
+ for (i = 0; i < 3; i++)
+ upper_mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ upper_mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan language and context. */
+ language = NULL;
+ context = SCC_ALWAYS;
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr != '\0' && *scanptr != '#')
+ {
+ const char *word_begin = scanptr;
+ const char *word_end;
+
+ while (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';' && *scanptr != ' ')
+ scanptr++;
+ word_end = scanptr;
+
+ while (*scanptr == ' ')
+ scanptr++;
+
+ if (word_end - word_begin == 2)
+ {
+ language = (char *) malloc ((word_end - word_begin) + 1);
+ memcpy (language, word_begin, 2);
+ language[word_end - word_begin] = '\0';
+ word_begin = word_end = NULL;
+
+ if (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';')
+ {
+ word_begin = scanptr;
+ while (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';' && *scanptr != ' ')
+ scanptr++;
+ word_end = scanptr;
+ }
+ }
+
+ if (word_end > word_begin)
+ {
+ bool negate = false;
+
+ if (word_end - word_begin >= 4 && memcmp (word_begin, "Not_", 4) == 0)
+ {
+ word_begin += 4;
+ negate = true;
+ }
+ if (word_end - word_begin == 11 && memcmp (word_begin, "Final_Sigma", 11) == 0)
+ context = SCC_FINAL_SIGMA;
+ else if (word_end - word_begin == 17 && memcmp (word_begin, "After_Soft_Dotted", 17) == 0)
+ context = SCC_AFTER_SOFT_DOTTED;
+ else if (word_end - word_begin == 10 && memcmp (word_begin, "More_Above", 10) == 0)
+ context = SCC_MORE_ABOVE;
+ else if (word_end - word_begin == 10 && memcmp (word_begin, "Before_Dot", 10) == 0)
+ context = SCC_BEFORE_DOT;
+ else if (word_end - word_begin == 7 && memcmp (word_begin, "After_I", 7) == 0)
+ context = SCC_AFTER_I;
+ else
+ {
+ fprintf (stderr, "unknown context type in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ if (negate)
+ context = - context;
+ }
+
+ if (*scanptr != '\0' && *scanptr != '#' && *scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+ }
+
+ /* Store the rule. */
+ {
+ struct special_casing_rule *new_rule =
+ (struct special_casing_rule *) malloc (sizeof (struct special_casing_rule));
+ new_rule->code = code;
+ new_rule->language = language;
+ new_rule->context = context;
+ memcpy (new_rule->lower_mapping, lower_mapping, sizeof (new_rule->lower_mapping));
+ memcpy (new_rule->title_mapping, title_mapping, sizeof (new_rule->title_mapping));
+ memcpy (new_rule->upper_mapping, upper_mapping, sizeof (new_rule->upper_mapping));
+
+ add_casing_rule (new_rule);
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", specialcasing_filename);
+ exit (1);
+ }
+}
+
+/* A casefolding rule. */
+struct casefold_rule
+{
+ unsigned int code;
+ unsigned int mapping[3];
+ const char *language;
+};
+
+/* The casefolding rules. */
+struct casefold_rule **casefolding_rules;
+unsigned int num_casefolding_rules;
+unsigned int allocated_casefolding_rules;
+
+/* Stores in casefolding_rules the case folding rules found in
+ casefolding_filename. */
+static void
+fill_casefolding_rules (const char *casefolding_filename)
+{
+ FILE *stream;
+
+ stream = fopen (casefolding_filename, "r");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "error during fopen of '%s'\n", casefolding_filename);
+ exit (1);
+ }
+
+ casefolding_rules = NULL;
+ num_casefolding_rules = 0;
+ allocated_casefolding_rules = 0;
+
+ for (;;)
+ {
+ char buf[200+1];
+ char *scanptr;
+ char *endptr;
+ int i;
+
+ unsigned int code;
+ char type;
+ unsigned int mapping[3];
+
+ if (fscanf (stream, "%200[^\n]\n", buf) < 1)
+ break;
+
+ if (buf[0] == '\0' || buf[0] == '#')
+ continue;
+
+ /* Scan code. */
+ scanptr = buf;
+ code = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan type. */
+ while (*scanptr == ' ')
+ scanptr++;
+
+ switch (*scanptr)
+ {
+ case 'C': case 'F': case 'S': case 'T':
+ type = *scanptr;
+ break;
+ default:
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Scan casefold mapping. */
+ for (i = 0; i < 3; i++)
+ mapping[i] = 0;
+ for (i = 0; i < 3; i++)
+ {
+ while (*scanptr == ' ')
+ scanptr++;
+ if (*scanptr == ';')
+ break;
+ mapping[i] = strtoul (scanptr, &endptr, 16);
+ if (endptr == scanptr)
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr = endptr;
+ }
+ if (*scanptr != ';')
+ {
+ fprintf (stderr, "parse error in '%s'\n", casefolding_filename);
+ exit (1);
+ }
+ scanptr++;
+
+ /* Ignore rules of type 'S'; we use the rules of type 'F' instead. */
+ if (type != 'S')
+ {
+ const char * const *languages;
+ unsigned int languages_count;
+
+ /* Type 'T' indicates that the rule is applicable to Turkish
+ languages only. */
+ if (type == 'T')
+ {
+ static const char * const turkish_languages[] = { "tr", "az" };
+ languages = turkish_languages;
+ languages_count = 2;
+ }
+ else
+ {
+ static const char * const all_languages[] = { NULL };
+ languages = all_languages;
+ languages_count = 1;
+ }
+
+ for (i = 0; i < languages_count; i++)
+ {
+ /* Store a new rule. */
+ struct casefold_rule *new_rule =
+ (struct casefold_rule *) malloc (sizeof (struct casefold_rule));
+ new_rule->code = code;
+ memcpy (new_rule->mapping, mapping, sizeof (new_rule->mapping));
+ new_rule->language = languages[i];
+
+ if (num_casefolding_rules == allocated_casefolding_rules)
+ {
+ allocated_casefolding_rules = 2 * allocated_casefolding_rules;
+ if (allocated_casefolding_rules < 16)
+ allocated_casefolding_rules = 16;
+ casefolding_rules =
+ (struct casefold_rule **)
+ realloc (casefolding_rules,
+ allocated_casefolding_rules * sizeof (struct casefold_rule *));
+ }
+ casefolding_rules[num_casefolding_rules++] = new_rule;
+ }
+ }
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error reading from '%s'\n", casefolding_filename);
+ exit (1);
+ }
+}
+
+/* Casefold mapping, when it maps to a single character. */
+unsigned int unicode_casefold[0x110000];
+
+static unsigned int
+to_casefold (unsigned int ch)
+{
+ return unicode_casefold[ch];
+}
+
+/* Redistribute the casefolding_rules:
+ - Rules that map to a single character, language independently, are stored
+ in unicode_casefold.
+ - Other rules are merged into casing_rules. */
+static void
+redistribute_casefolding_rules (void)
+{
+ unsigned int ch, i, j;
+
+ /* Fill unicode_casefold[]. */
+ for (ch = 0; ch < 0x110000; ch++)
+ unicode_casefold[ch] = ch;
+ for (i = 0; i < num_casefolding_rules; i++)
+ {
+ struct casefold_rule *cfrule = casefolding_rules[i];
+
+ if (cfrule->language == NULL && cfrule->mapping[1] == 0)
+ {
+ ch = cfrule->code;
+ if (!(ch < 0x110000))
+ abort ();
+ unicode_casefold[ch] = cfrule->mapping[0];
+ }
+ }
+
+ /* Extend the special casing rules by filling in their casefold_mapping[]
+ field. */
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+ unsigned int k;
+
+ rule->casefold_mapping[0] = to_casefold (rule->code);
+ for (k = 1; k < 3; k++)
+ rule->casefold_mapping[k] = 0;
+ }
+
+ /* Now merge the other casefolding rules into casing_rules. */
+ for (i = 0; i < num_casefolding_rules; i++)
+ {
+ struct casefold_rule *cfrule = casefolding_rules[i];
+
+ if (!(cfrule->language == NULL && cfrule->mapping[1] == 0))
+ {
+ /* Find a rule that applies to the same code, same language, and it
+ has context SCC_ALWAYS. At the same time, update all rules that
+ have the same code and same or more specific language. */
+ struct special_casing_rule *found_rule = NULL;
+
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+
+ if (rule->code == cfrule->code
+ && (cfrule->language == NULL
+ || (rule->language != NULL
+ && strcmp (rule->language, cfrule->language) == 0)))
+ {
+ memcpy (rule->casefold_mapping, cfrule->mapping,
+ sizeof (rule->casefold_mapping));
+
+ if ((cfrule->language == NULL
+ ? rule->language == NULL
+ : rule->language != NULL
+ && strcmp (rule->language, cfrule->language) == 0)
+ && rule->context == SCC_ALWAYS)
+ {
+ /* Found it. */
+ found_rule = rule;
+ }
+ }
+ }
+
+ if (found_rule == NULL)
+ {
+ /* Create a new rule. */
+ struct special_casing_rule *new_rule =
+ (struct special_casing_rule *) malloc (sizeof (struct special_casing_rule));
+
+ /* Try to find a rule that applies to the same code, no language
+ restriction, and with context SCC_ALWAYS. */
+ for (j = 0; j < num_casing_rules; j++)
+ {
+ struct special_casing_rule *rule = casing_rules[j];
+
+ if (rule->code == cfrule->code
+ && rule->context == SCC_ALWAYS
+ && rule->language == NULL)
+ {
+ /* Found it. */
+ found_rule = rule;
+ break;
+ }
+ }
+
+ new_rule->code = cfrule->code;
+ new_rule->language = cfrule->language;
+ new_rule->context = SCC_ALWAYS;
+ if (found_rule != NULL)
+ {
+ memcpy (new_rule->lower_mapping, found_rule->lower_mapping,
+ sizeof (new_rule->lower_mapping));
+ memcpy (new_rule->title_mapping, found_rule->title_mapping,
+ sizeof (new_rule->title_mapping));
+ memcpy (new_rule->upper_mapping, found_rule->upper_mapping,
+ sizeof (new_rule->upper_mapping));
+ }
+ else
+ {
+ unsigned int k;
+
+ new_rule->lower_mapping[0] = to_lower (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->lower_mapping[k] = 0;
+ new_rule->title_mapping[0] = to_title (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->title_mapping[k] = 0;
+ new_rule->upper_mapping[0] = to_upper (cfrule->code);
+ for (k = 1; k < 3; k++)
+ new_rule->upper_mapping[k] = 0;
+ }
+ memcpy (new_rule->casefold_mapping, cfrule->mapping,
+ sizeof (new_rule->casefold_mapping));
+
+ add_casing_rule (new_rule);
+ }
+ }
+ }
+}
+
+static int
+compare_casing_rules (const void *a, const void *b)
+{
+ struct special_casing_rule *a_rule = *(struct special_casing_rule **) a;
+ struct special_casing_rule *b_rule = *(struct special_casing_rule **) b;
+ unsigned int a_code = a_rule->code;
+ unsigned int b_code = b_rule->code;
+
+ if (a_code < b_code)
+ return -1;
+ if (a_code > b_code)
+ return 1;
+
+ /* Sort the more specific rules before the more general ones. */
+ return (- ((a_rule->language != NULL ? 1 : 0) + (a_rule->context != SCC_ALWAYS ? 1 : 0))
+ + ((b_rule->language != NULL ? 1 : 0) + (b_rule->context != SCC_ALWAYS ? 1 : 0)));
+}
+
+static void
+sort_casing_rules (void)
+{
+ /* Sort the rules 1. by code, 2. by specificity. */
+ if (num_casing_rules > 1)
+ qsort (casing_rules, num_casing_rules, sizeof (struct special_casing_rule *),
+ compare_casing_rules);
+}
+
+/* Output the special casing rules. */
+static void
+output_casing_rules (const char *filename, const char *version)
+{
+ FILE *stream;
+ unsigned int i, j;
+ unsigned int minor;
+
+ stream = fopen (filename, "w");
+ if (stream == NULL)
+ {
+ fprintf (stderr, "cannot open '%s' for writing\n", filename);
+ exit (1);
+ }
+
+ fprintf (stream, "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */\n");
+ fprintf (stream, "/* Special casing rules of Unicode characters. */\n");
+ fprintf (stream, "/* Generated automatically by gen-uni-tables.c for Unicode %s. */\n",
+ version);
+ fprintf (stream, "struct special_casing_rule { char code[3]; };\n");
+ fprintf (stream, "%%struct-type\n");
+ fprintf (stream, "%%language=ANSI-C\n");
+ fprintf (stream, "%%define slot-name code\n");
+ fprintf (stream, "%%define hash-function-name gl_unicase_special_hash\n");
+ fprintf (stream, "%%define lookup-function-name gl_unicase_special_lookup\n");
+ fprintf (stream, "%%compare-lengths\n");
+ fprintf (stream, "%%compare-strncmp\n");
+ fprintf (stream, "%%readonly-tables\n");
+ fprintf (stream, "%%omit-struct-type\n");
+ fprintf (stream, "%%%%\n");
+
+ minor = 0;
+ for (i = 0; i < num_casing_rules; i++)
+ {
+ struct special_casing_rule *rule = casing_rules[i];
+ int context;
+
+ if (i > 0 && rule->code == casing_rules[i - 1]->code)
+ minor += 1;
+ else
+ minor = 0;
+
+ if (!(rule->code < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+
+ fprintf (stream, "\"\\x%02x\\x%02x\\x%02x\", ",
+ (rule->code >> 8) & 0xff, rule->code & 0xff, minor);
+
+ fprintf (stream, "%d, ",
+ i + 1 < num_casing_rules && casing_rules[i + 1]->code == rule->code ? 1 : 0);
+
+ context = rule->context;
+ if (context < 0)
+ {
+ fprintf (stream, "-");
+ context = - context;
+ }
+ else
+ fprintf (stream, " ");
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ fprintf (stream, "SCC_ALWAYS ");
+ break;
+ case SCC_FINAL_SIGMA:
+ fprintf (stream, "SCC_FINAL_SIGMA ");
+ break;
+ case SCC_AFTER_SOFT_DOTTED:
+ fprintf (stream, "SCC_AFTER_SOFT_DOTTED");
+ break;
+ case SCC_MORE_ABOVE:
+ fprintf (stream, "SCC_MORE_ABOVE ");
+ break;
+ case SCC_BEFORE_DOT:
+ fprintf (stream, "SCC_BEFORE_DOT ");
+ break;
+ case SCC_AFTER_I:
+ fprintf (stream, "SCC_AFTER_I ");
+ break;
+ default:
+ abort ();
+ }
+ fprintf (stream, ", ");
+
+ if (rule->language != NULL)
+ {
+ if (strlen (rule->language) != 2)
+ abort ();
+ fprintf (stream, "{ '%c', '%c' }, ", rule->language[0], rule->language[1]);
+ }
+ else
+ fprintf (stream, "{ '\\0', '\\0' }, ");
+
+ fprintf (stream, "{ ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->upper_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: upper mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->upper_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->upper_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->lower_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: lower mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->lower_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->lower_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->title_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: title mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->title_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->title_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }, { ");
+ for (j = 0; j < 3; j++)
+ {
+ if (j > 0)
+ fprintf (stream, ", ");
+ if (!(rule->casefold_mapping[j] < 0x10000))
+ {
+ fprintf (stderr, "special rule #%u: casefold mapping of code %u out of range\n", i, rule->code);
+ exit (1);
+ }
+ if (rule->casefold_mapping[j] != 0)
+ fprintf (stream, "0x%04X", rule->casefold_mapping[j]);
+ else
+ fprintf (stream, " 0");
+ }
+ fprintf (stream, " }\n");
+ }
+
+ if (ferror (stream) || fclose (stream))
+ {
+ fprintf (stderr, "error writing to '%s'\n", filename);
+ exit (1);
+ }
+}
+
+/* ========================================================================= */
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "cased" if it has the Lowercase
+ or Uppercase property or has a General_Category value of
+ Titlecase_Letter. */
+static bool
+is_cased (unsigned int ch)
+{
+ return (is_property_lowercase (ch)
+ || is_property_uppercase (ch)
+ || is_category_Lt (ch));
+}
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "case-ignorable" if it has the
+ value MidLetter {or the value MidNumLet} for the Word_Break property or
+ its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me),
+ Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+ The text marked in braces was added in Unicode 5.1.0, see
+ <http://www.unicode.org/versions/Unicode5.1.0/> section "Update of
+ Definition of case-ignorable". */
+/* Since this predicate is only used for the "Before C" and "After C"
+ conditions of FINAL_SIGMA, we exclude the "cased" characters here.
+ This simplifies the evaluation of the regular expressions
+ \p{cased} (\p{case-ignorable})* C
+ and
+ C (\p{case-ignorable})* \p{cased}
+ */
+static bool
+is_case_ignorable (unsigned int ch)
+{
+ return (unicode_org_wbp[ch] == WBP_MIDLETTER
+ || unicode_org_wbp[ch] == WBP_MIDNUMLET
+ || is_category_Mn (ch)
+ || is_category_Me (ch)
+ || is_category_Cf (ch)
+ || is_category_Lm (ch)
+ || is_category_Sk (ch))
+ && !is_cased (ch);
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Output all case related properties. */
+static void
+output_casing_properties (const char *version)
+{
+#define PROPERTY(FN,P) \
+ debug_output_predicate ("unicase/" #FN ".txt", is_ ## P); \
+ output_predicate_test ("../tests/unicase/test-" #FN ".c", is_ ## P, "uc_is_" #P " (c)"); \
+ output_predicate ("unicase/" #FN ".h", is_ ## P, "u_casing_property_" #P, "Casing Properties", version);
+ PROPERTY(cased, cased)
+ PROPERTY(ignorable, case_ignorable)
+#undef PROPERTY
+}
+
+/* ========================================================================= */
+
+int
+main (int argc, char * argv[])
+{
+ const char *unicodedata_filename;
+ const char *proplist_filename;
+ const char *derivedproplist_filename;
+ const char *arabicshaping_filename;
+ const char *scripts_filename;
+ const char *blocks_filename;
+ const char *proplist30_filename;
+ const char *eastasianwidth_filename;
+ const char *linebreak_filename;
+ const char *wordbreakproperty_filename;
+ const char *graphemebreakproperty_filename;
+ const char *compositionexclusions_filename;
+ const char *specialcasing_filename;
+ const char *casefolding_filename;
+ const char *version;
+
+ if (argc != 16)
+ {
+ fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt DerivedCoreProperties.txt ArabicShaping.txt Scripts.txt Blocks.txt PropList-3.0.1.txt EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt GraphemeBreakProperty.txt CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
+ argv[0]);
+ exit (1);
+ }
+
+ unicodedata_filename = argv[1];
+ proplist_filename = argv[2];
+ derivedproplist_filename = argv[3];
+ arabicshaping_filename = argv[4];
+ scripts_filename = argv[5];
+ blocks_filename = argv[6];
+ proplist30_filename = argv[7];
+ eastasianwidth_filename = argv[8];
+ linebreak_filename = argv[9];
+ wordbreakproperty_filename = argv[10];
+ graphemebreakproperty_filename = argv[11];
+ compositionexclusions_filename = argv[12];
+ specialcasing_filename = argv[13];
+ casefolding_filename = argv[14];
+ version = argv[15];
+
+ fill_attributes (unicodedata_filename);
+ clear_properties ();
+ fill_properties (proplist_filename);
+ fill_properties (derivedproplist_filename);
+ fill_properties30 (proplist30_filename);
+ fill_arabicshaping (arabicshaping_filename);
+ fill_scripts (scripts_filename);
+ fill_blocks (blocks_filename);
+ fill_width (eastasianwidth_filename);
+ fill_org_lbp (linebreak_filename);
+ fill_org_wbp (wordbreakproperty_filename);
+ fill_org_gbp (graphemebreakproperty_filename);
+ fill_composition_exclusions (compositionexclusions_filename);
+ fill_casing_rules (specialcasing_filename);
+ fill_casefolding_rules (casefolding_filename);
+ redistribute_casefolding_rules ();
+ sort_casing_rules ();
+
+ output_categories (version);
+ output_category ("unictype/categ_of.h", version);
+ output_combclass ("unictype/combiningclass.h", version);
+ output_bidi_category ("unictype/bidi_of.h", version);
+ output_decimal_digit_test ("../tests/unictype/test-decdigit.h", version);
+ output_decimal_digit ("unictype/decdigit.h", version);
+ output_digit_test ("../tests/unictype/test-digit.h", version);
+ output_digit ("unictype/digit.h", version);
+ output_numeric_test ("../tests/unictype/test-numeric.h", version);
+ output_numeric ("unictype/numeric.h", version);
+ output_mirror ("unictype/mirror.h", version);
+ output_properties (version);
+ output_joining_type_test ("../tests/unictype/test-joiningtype_of.h", version);
+ output_joining_type ("unictype/joiningtype_of.h", version);
+ output_joining_group_test ("../tests/unictype/test-joininggroup_of.h", version);
+ output_joining_group ("unictype/joininggroup_of.h", version);
+
+ output_scripts (version);
+ output_scripts_byname (version);
+ output_blocks (version);
+ output_ident_properties (version);
+ output_nonspacing_property ("uniwidth/width.c.part");
+ output_width_property_test ("../tests/uniwidth/test-uc_width2.sh.part");
+ output_old_ctype (version);
+
+ debug_output_lbrk_tables ("unilbrk/lbrkprop.txt");
+ debug_output_org_lbrk_tables ("unilbrk/lbrkprop_org.txt");
+ output_lbrk_tables ("unilbrk/lbrkprop1.h", "unilbrk/lbrkprop2.h", version);
+
+ debug_output_wbrk_tables ("uniwbrk/wbrkprop.txt");
+ debug_output_org_wbrk_tables ("uniwbrk/wbrkprop_org.txt");
+ output_wbrk_tables ("uniwbrk/wbrkprop.h", version);
+
+ output_gbp_test ("../tests/unigbrk/test-uc-gbrk-prop.h");
+ output_gbp_table ("unigbrk/gbrkprop.h", version);
+
+ output_decomposition_tables ("uninorm/decomposition-table1.h", "uninorm/decomposition-table2.h", version);
+ debug_output_composition_tables ("uninorm/composition.txt");
+ output_composition_tables ("uninorm/composition-table.gperf", version);
+
+ output_simple_mapping_test ("../tests/unicase/test-uc_toupper.c", "uc_toupper", to_upper, version);
+ output_simple_mapping_test ("../tests/unicase/test-uc_tolower.c", "uc_tolower", to_lower, version);
+ output_simple_mapping_test ("../tests/unicase/test-uc_totitle.c", "uc_totitle", to_title, version);
+ output_simple_mapping ("unicase/toupper.h", to_upper, version);
+ output_simple_mapping ("unicase/tolower.h", to_lower, version);
+ output_simple_mapping ("unicase/totitle.h", to_title, version);
+ output_simple_mapping ("unicase/tocasefold.h", to_casefold, version);
+ output_casing_rules ("unicase/special-casing-table.gperf", version);
+ output_casing_properties (version);
+
+ return 0;
+}
+
+/*
+ * For Emacs M-x compile
+ * Local Variables:
+ * compile-command: "
+ gcc -O -Wall gen-uni-tables.c -Iunictype -o gen-uni-tables && \
+ ./gen-uni-tables \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/UnicodeData.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/PropList.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/DerivedCoreProperties.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/ArabicShaping.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/Scripts.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/Blocks.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/3.0.1/PropList-3.0.1.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/EastAsianWidth.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/LineBreak.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/auxiliary/WordBreakProperty.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/auxiliary/GraphemeBreakProperty.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/CompositionExclusions.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/SpecialCasing.txt \
+ /gfs/petix/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/6.0.0/ucd/CaseFolding.txt \
+ 6.0.0 \
+ && diff unilbrk/lbrkprop_org.txt unilbrk/lbrkprop.txt \
+ && diff uniwbrk/wbrkprop_org.txt uniwbrk/wbrkprop.txt
+ "
+ * End:
+ */
diff --git a/gnulib/lib/get-rusage-as.c b/gnulib/lib/get-rusage-as.c
new file mode 100644
index 0000000..5567f95
--- /dev/null
+++ b/gnulib/lib/get-rusage-as.c
@@ -0,0 +1,402 @@
+/* Getter for RLIMIT_AS.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "resource-ext.h"
+
+/* The "address space size" is defined as the total size of the virtual memory
+ areas of the current process. This includes
+ - areas belonging to the executable and shared libraries,
+ - areas allocated by malloc() or mmap(),
+ - the stack and environment areas,
+ - gaps and guard pages (mappings with PROT_NONE),
+ - other system dependent areas, such as vsyscall or vdso on Linux.
+
+ There are two ways of retrieving the current address space size:
+ a) by trying setrlimit with various values and observing whether the
+ kernel allows additional mmap calls,
+ b) by using system dependent APIs that allow to iterate over the list
+ of virtual memory areas.
+ We don't use the mincore() based approach here, because it would be very
+ slow when applied to an entire address space, especially on 64-bit
+ platforms.
+ We define two functions
+ get_rusage_as_via_setrlimit(),
+ get_rusage_as_via_iterator().
+
+ Discussion per platform:
+
+ Linux:
+ a) setrlimit with RLIMIT_AS works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+ Both methods agree, except that on x86_64 systems, the value of
+ get_rusage_as_via_iterator() is 4 KB higher than
+ get_rusage_as_via_setrlimit().
+
+ MacOS X:
+ a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS
+ ignores RLIMIT_AS. mmap() of a page always succeeds, therefore
+ get_rusage_as_via_setrlimit() is always 0.
+ b) The Mach based API works.
+
+ FreeBSD:
+ a) setrlimit with RLIMIT_AS works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+
+ NetBSD:
+ a) setrlimit with RLIMIT_AS works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+ Both methods agree,
+
+ OpenBSD:
+ a) setrlimit exists, but RLIMIT_AS is not defined.
+ b) mquery() can be used to find out about the virtual memory areas.
+
+ AIX:
+ a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS
+ apparently ignores RLIMIT_AS. mmap() of a page always succeeds,
+ therefore get_rusage_as_via_setrlimit() is always 0.
+ b) No VMA iteration API exists.
+
+ HP-UX:
+ a) setrlimit with RLIMIT_AS works.
+ b) No VMA iteration API exists.
+
+ IRIX:
+ a) setrlimit with RLIMIT_AS works.
+ b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
+ Both methods agree,
+
+ OSF/1:
+ a) setrlimit with RLIMIT_AS works.
+ b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
+ The value returned by get_rusage_as_via_setrlimit() is 64 KB higher than
+ get_rusage_as_via_iterator(). It's not clear why.
+
+ Solaris:
+ a) setrlimit with RLIMIT_AS works.
+ b) No VMA iteration API exists.
+
+ Cygwin:
+ a) setrlimit with RLIMIT_AS always fails when the limit is < 0x80000000.
+ get_rusage_as_via_setrlimit() therefore produces a wrong value.
+ b) The /proc/$pid/maps file lists only the memory areas belonging to
+ the executable and shared libraries, not the anonymous memory.
+ But the native Win32 API works.
+
+ mingw:
+ a) There is no setrlimit function.
+ b) The native Win32 API works.
+
+ BeOS, Haiku:
+ a) On BeOS, there is no setrlimit function.
+ On Haiku, setrlimit exists. RLIMIT_AS is defined but unsupported.
+ b) There is a specific BeOS API: get_next_area_info().
+ */
+
+
+#include <errno.h> /* errno */
+#include <stdlib.h> /* size_t, abort */
+#include <fcntl.h> /* open, O_RDONLY */
+#include <unistd.h> /* getpagesize, read, close */
+
+
+/* System support for get_rusage_as_via_setrlimit(). */
+
+#if HAVE_SETRLIMIT
+# include <sys/time.h>
+# include <sys/resource.h> /* getrlimit, setrlimit */
+#endif
+
+/* Test whether mmap() and mprotect() are available.
+ We don't use HAVE_MMAP, because AC_FUNC_MMAP would not define it on HP-UX.
+ HAVE_MPROTECT is not enough, because mingw does not have mmap() but has an
+ mprotect() function in libgcc.a. */
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/mman.h> /* mmap, munmap */
+/* Define MAP_FILE when it isn't otherwise. */
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+
+
+/* System support for get_rusage_as_via_iterator(). */
+
+#include "vma-iter.h"
+
+
+#if HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT
+
+static inline uintptr_t
+get_rusage_as_via_setrlimit (void)
+{
+ uintptr_t result;
+
+ struct rlimit orig_limit;
+
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd < 0)
+ return 0;
+# endif
+
+ /* Record the original limit. */
+ if (getrlimit (RLIMIT_AS, &orig_limit) < 0)
+ {
+ result = 0;
+ goto done2;
+ }
+
+ if (orig_limit.rlim_max != RLIM_INFINITY
+ && (orig_limit.rlim_cur == RLIM_INFINITY
+ || orig_limit.rlim_cur > orig_limit.rlim_max))
+ /* We may not be able to restore the current rlim_cur value.
+ So bail out. */
+ {
+ result = 0;
+ goto done2;
+ }
+
+ {
+ /* The granularity is a single page. */
+ const size_t pagesize = getpagesize ();
+
+ uintptr_t low_bound = 0;
+ uintptr_t high_bound;
+
+ for (;;)
+ {
+ /* Here we know that the address space size is >= low_bound. */
+ struct rlimit try_limit;
+ uintptr_t try_next = 2 * low_bound + pagesize;
+
+ if (try_next < low_bound)
+ /* Overflow. */
+ try_next = ((uintptr_t) (~ 0) / pagesize) * pagesize;
+
+ /* There's no point in trying a value > orig_limit.rlim_max, as
+ setrlimit would fail anyway. */
+ if (orig_limit.rlim_max != RLIM_INFINITY
+ && orig_limit.rlim_max < try_next)
+ try_next = orig_limit.rlim_max;
+
+ /* Avoid endless loop. */
+ if (try_next == low_bound)
+ {
+ /* try_next could not be increased. */
+ result = low_bound;
+ goto done1;
+ }
+
+ try_limit.rlim_max = orig_limit.rlim_max;
+ try_limit.rlim_cur = try_next;
+ if (setrlimit (RLIMIT_AS, &try_limit) == 0)
+ {
+ /* Allocate a page of memory, to compare the current address space
+ size with try_limit.rlim_cur. */
+ void *new_page =
+ mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
+
+ if (new_page != (void *)(-1))
+ {
+ /* The page could be added successfully. Free it. */
+ if (munmap (new_page, pagesize) < 0)
+ abort ();
+ /* We know that the address space size is
+ < try_limit.rlim_cur. */
+ high_bound = try_next;
+ break;
+ }
+ else
+ {
+ /* We know that the address space size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+ else
+ {
+ /* Here we expect only EINVAL, not EPERM. */
+ if (errno != EINVAL)
+ abort ();
+ /* We know that the address space size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+
+ /* Here we know that the address space size is
+ >= low_bound and < high_bound. */
+ while (high_bound - low_bound > pagesize)
+ {
+ struct rlimit try_limit;
+ uintptr_t try_next =
+ low_bound + (((high_bound - low_bound) / 2) / pagesize) * pagesize;
+
+ /* Here low_bound <= try_next < high_bound. */
+ try_limit.rlim_max = orig_limit.rlim_max;
+ try_limit.rlim_cur = try_next;
+ if (setrlimit (RLIMIT_AS, &try_limit) == 0)
+ {
+ /* Allocate a page of memory, to compare the current address space
+ size with try_limit.rlim_cur. */
+ void *new_page =
+ mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
+
+ if (new_page != (void *)(-1))
+ {
+ /* The page could be added successfully. Free it. */
+ if (munmap (new_page, pagesize) < 0)
+ abort ();
+ /* We know that the address space size is
+ < try_limit.rlim_cur. */
+ high_bound = try_next;
+ }
+ else
+ {
+ /* We know that the address space size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+ else
+ {
+ /* Here we expect only EINVAL, not EPERM. */
+ if (errno != EINVAL)
+ abort ();
+ /* We know that the address space size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+
+ result = low_bound;
+ }
+
+ done1:
+ /* Restore the original rlim_cur value. */
+ if (setrlimit (RLIMIT_AS, &orig_limit) < 0)
+ abort ();
+
+ done2:
+# if !HAVE_MAP_ANONYMOUS
+ close (fd);
+# endif
+ return result;
+}
+
+#else
+
+static inline uintptr_t
+get_rusage_as_via_setrlimit (void)
+{
+ return 0;
+}
+
+#endif
+
+
+#if VMA_ITERATE_SUPPORTED
+
+static int
+vma_iterate_callback (void *data, uintptr_t start, uintptr_t end,
+ unsigned int flags)
+{
+ uintptr_t *totalp = (uintptr_t *) data;
+
+ *totalp += end - start;
+ return 0;
+}
+
+static inline uintptr_t
+get_rusage_as_via_iterator (void)
+{
+ uintptr_t total = 0;
+
+ vma_iterate (vma_iterate_callback, &total);
+
+ return total;
+}
+
+#else
+
+static inline uintptr_t
+get_rusage_as_via_iterator (void)
+{
+ return 0;
+}
+
+#endif
+
+
+uintptr_t
+get_rusage_as (void)
+{
+#if (defined __APPLE__ && defined __MACH__) || defined _AIX || defined __CYGWIN__ /* MacOS X, AIX, Cygwin */
+ /* get_rusage_as_via_setrlimit() does not work.
+ Prefer get_rusage_as_via_iterator(). */
+ return get_rusage_as_via_iterator ();
+#elif HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT
+ /* Prefer get_rusage_as_via_setrlimit() if it succeeds,
+ because the caller may want to use the result with setrlimit(). */
+ uintptr_t result;
+
+ result = get_rusage_as_via_setrlimit ();
+ if (result == 0)
+ result = get_rusage_as_via_iterator ();
+ return result;
+#else
+ return get_rusage_as_via_iterator ();
+#endif
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main ()
+{
+ printf ("Initially: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
+ get_rusage_as ());
+ malloc (0x88);
+ printf ("After small malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
+ get_rusage_as ());
+ malloc (0x8812);
+ printf ("After medium malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
+ get_rusage_as ());
+ malloc (0x281237);
+ printf ("After large malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
+ get_rusage_as ());
+ return 0;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/get-rusage-data.c b/gnulib/lib/get-rusage-data.c
new file mode 100644
index 0000000..1b9214b
--- /dev/null
+++ b/gnulib/lib/get-rusage-data.c
@@ -0,0 +1,436 @@
+/* Getter for RLIMIT_DATA.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "resource-ext.h"
+
+/* The "data segment size" is defined as the virtual memory area of the
+ current process that contains malloc()ed memory.
+
+ There are two ways of retrieving the current data segment size:
+ a) by trying setrlimit with various values and observing whether the
+ kernel allows additional sbrk() calls,
+ b) by using system dependent APIs that allow to iterate over the list
+ of virtual memory areas.
+ We define two functions
+ get_rusage_data_via_setrlimit(),
+ get_rusage_data_via_iterator().
+
+ The variant
+ a') by trying setrlimit with various values and observing whether
+ additional malloc() calls succeed
+ is not as good as a), because a malloc() call can be served by already
+ allocated memory or through mmap(), and because a malloc() of 1 page may
+ require 2 pages.
+
+ Discussion per platform:
+
+ Linux:
+ a) setrlimit with RLIMIT_DATA works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+ get_rusage_data_via_setrlimit() returns the sum of the length of the
+ executable's data segment plus the heap VMA (an anonymous memory area),
+ whereas get_rusage_data_via_iterator() returns only the latter.
+ Note that malloc() falls back on mmap() for large allocations and also
+ for small allocations if there is not enough room in the data segment.
+
+ MacOS X:
+ a) setrlimit with RLIMIT_DATA succeeds but does not really work: The OS
+ ignores RLIMIT_DATA. Therefore get_rusage_data_via_setrlimit() is
+ always 0.
+ b) The Mach based API works.
+ Note that malloc() falls back on mmap() for large allocations.
+
+ FreeBSD:
+ a) setrlimit with RLIMIT_DATA works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+
+ NetBSD:
+ a) setrlimit with RLIMIT_DATA works.
+ b) The /proc/self/maps file contains a list of the virtual memory areas.
+ Both methods agree.
+ Note that malloc() uses mmap() for large allocations.
+
+ OpenBSD:
+ a) setrlimit with RLIMIT_DATA works.
+ b) mquery() can be used to find out about the virtual memory areas.
+ get_rusage_data_via_setrlimit() works much better than
+ get_rusage_data_via_iterator().
+ Note that malloc() appears to use mmap() for both large and small
+ allocations.
+
+ AIX:
+ a) setrlimit with RLIMIT_DATA works.
+ b) No VMA iteration API exists.
+
+ HP-UX:
+ a) setrlimit with RLIMIT_DATA works, except on HP-UX 11.00, where it
+ cannot restore the previous limits, and except on HP-UX 11.11, where
+ it sometimes has no effect.
+ b) No VMA iteration API exists.
+
+ IRIX:
+ a) setrlimit with RLIMIT_DATA works.
+ b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
+ get_rusage_data_via_setrlimit() works slightly better than
+ get_rusage_data_via_iterator() before the first malloc() call.
+
+ OSF/1:
+ a) setrlimit with RLIMIT_DATA works.
+ b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
+ Both methods agree.
+
+ Solaris:
+ a) setrlimit with RLIMIT_DATA works.
+ b) No VMA iteration API exists.
+
+ Cygwin:
+ a) setrlimit with RLIMIT_DATA always fails.
+ get_rusage_data_via_setrlimit() therefore produces a wrong value.
+ b) The /proc/$pid/maps file lists only the memory areas belonging to
+ the executable and shared libraries, not the anonymous memory.
+ But the native Win32 API works.
+ Note that malloc() apparently falls back on mmap() for large allocations.
+
+ mingw:
+ a) There is no setrlimit function.
+ b) There is no sbrk() function.
+ Note that malloc() falls back on VirtualAlloc() for large allocations.
+
+ BeOS, Haiku:
+ a) On BeOS, there is no setrlimit function.
+ On Haiku, setrlimit exists. RLIMIT_DATA is defined but unsupported:
+ getrlimit of RLIMIT_DATA always fails with errno = EINVAL.
+ b) There is a specific BeOS API: get_next_area_info().
+ */
+
+
+#include <errno.h> /* errno */
+#include <stdlib.h> /* size_t, abort, malloc, free, sbrk */
+#include <fcntl.h> /* open, O_RDONLY */
+#include <unistd.h> /* getpagesize, read, close */
+
+
+/* System support for get_rusage_data_via_setrlimit(). */
+
+#if HAVE_SETRLIMIT
+# include <sys/time.h>
+# include <sys/resource.h> /* getrlimit, setrlimit */
+# include <sys/utsname.h>
+# include <string.h> /* strlen, strcmp */
+#endif
+
+
+/* System support for get_rusage_data_via_iterator(). */
+
+#include "vma-iter.h"
+
+
+#if HAVE_SETRLIMIT && defined RLIMIT_DATA
+
+# ifdef _AIX
+# define errno_expected() (errno == EINVAL || errno == EFAULT)
+# else
+# define errno_expected() (errno == EINVAL)
+# endif
+
+static inline uintptr_t
+get_rusage_data_via_setrlimit (void)
+{
+ uintptr_t result;
+
+ struct rlimit orig_limit;
+
+# ifdef __hpux
+ /* On HP-UX 11.00, setrlimit() RLIMIT_DATA of does not work: It cannot
+ restore the previous limits.
+ On HP-UX 11.11, setrlimit() RLIMIT_DATA of does not work: It sometimes
+ has no effect on the next sbrk() call. */
+ {
+ struct utsname buf;
+
+ if (uname (&buf) == 0
+ && strlen (buf.release) >= 5
+ && (strcmp (buf.release + strlen (buf.release) - 5, "11.00") == 0
+ || strcmp (buf.release + strlen (buf.release) - 5, "11.11") == 0))
+ return 0;
+ }
+# endif
+
+ /* Record the original limit. */
+ if (getrlimit (RLIMIT_DATA, &orig_limit) < 0)
+ return 0;
+
+ if (orig_limit.rlim_max != RLIM_INFINITY
+ && (orig_limit.rlim_cur == RLIM_INFINITY
+ || orig_limit.rlim_cur > orig_limit.rlim_max))
+ /* We may not be able to restore the current rlim_cur value.
+ So bail out. */
+ return 0;
+
+ {
+ /* The granularity is a single page. */
+ const intptr_t pagesize = getpagesize ();
+
+ uintptr_t low_bound = 0;
+ uintptr_t high_bound;
+
+ for (;;)
+ {
+ /* Here we know that the data segment size is >= low_bound. */
+ struct rlimit try_limit;
+ uintptr_t try_next = 2 * low_bound + pagesize;
+
+ if (try_next < low_bound)
+ /* Overflow. */
+ try_next = ((uintptr_t) (~ 0) / pagesize) * pagesize;
+
+ /* There's no point in trying a value > orig_limit.rlim_max, as
+ setrlimit would fail anyway. */
+ if (orig_limit.rlim_max != RLIM_INFINITY
+ && orig_limit.rlim_max < try_next)
+ try_next = orig_limit.rlim_max;
+
+ /* Avoid endless loop. */
+ if (try_next == low_bound)
+ {
+ /* try_next could not be increased. */
+ result = low_bound;
+ goto done;
+ }
+
+ try_limit.rlim_max = orig_limit.rlim_max;
+ try_limit.rlim_cur = try_next;
+ if (setrlimit (RLIMIT_DATA, &try_limit) == 0)
+ {
+ /* Allocate a page of memory, to compare the current data segment
+ size with try_limit.rlim_cur. */
+ void *new_page = sbrk (pagesize);
+
+ if (new_page != (void *)(-1))
+ {
+ /* The page could be added successfully. Free it. */
+ sbrk (- pagesize);
+ /* We know that the data segment size is
+ < try_limit.rlim_cur. */
+ high_bound = try_next;
+ break;
+ }
+ else
+ {
+ /* We know that the data segment size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+ else
+ {
+ /* Here we expect only EINVAL or (on AIX) EFAULT, not EPERM. */
+ if (! errno_expected ())
+ abort ();
+ /* We know that the data segment size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+
+ /* Here we know that the data segment size is
+ >= low_bound and < high_bound. */
+ while (high_bound - low_bound > pagesize)
+ {
+ struct rlimit try_limit;
+ uintptr_t try_next =
+ low_bound + (((high_bound - low_bound) / 2) / pagesize) * pagesize;
+
+ /* Here low_bound <= try_next < high_bound. */
+ try_limit.rlim_max = orig_limit.rlim_max;
+ try_limit.rlim_cur = try_next;
+ if (setrlimit (RLIMIT_DATA, &try_limit) == 0)
+ {
+ /* Allocate a page of memory, to compare the current data segment
+ size with try_limit.rlim_cur. */
+ void *new_page = sbrk (pagesize);
+
+ if (new_page != (void *)(-1))
+ {
+ /* The page could be added successfully. Free it. */
+ sbrk (- pagesize);
+ /* We know that the data segment size is
+ < try_limit.rlim_cur. */
+ high_bound = try_next;
+ }
+ else
+ {
+ /* We know that the data segment size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+ else
+ {
+ /* Here we expect only EINVAL or (on AIX) EFAULT, not EPERM. */
+ if (! errno_expected ())
+ abort ();
+ /* We know that the data segment size is
+ >= try_limit.rlim_cur. */
+ low_bound = try_next;
+ }
+ }
+
+ result = low_bound;
+ }
+
+ done:
+ /* Restore the original rlim_cur value. */
+ if (setrlimit (RLIMIT_DATA, &orig_limit) < 0)
+ abort ();
+
+ return result;
+}
+
+#else
+
+static inline uintptr_t
+get_rusage_data_via_setrlimit (void)
+{
+ return 0;
+}
+
+#endif
+
+
+#if VMA_ITERATE_SUPPORTED
+
+struct locals
+{
+ uintptr_t brk_value;
+ uintptr_t data_segment_size;
+};
+
+static int
+vma_iterate_callback (void *data, uintptr_t start, uintptr_t end,
+ unsigned int flags)
+{
+ struct locals *lp = (struct locals *) data;
+
+ if (start <= lp->brk_value && lp->brk_value - 1 <= end - 1)
+ {
+ lp->data_segment_size = end - start;
+ return 1;
+ }
+ return 0;
+}
+
+static inline uintptr_t
+get_rusage_data_via_iterator (void)
+{
+# if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __BEOS__ || defined __HAIKU__
+ /* On mingw, there is no sbrk() function.
+ On Haiku, sbrk(0) always returns 0. */
+ static void *brk_value;
+
+ if (brk_value == NULL)
+ {
+ brk_value = malloc (1);
+ if (brk_value == NULL)
+ return 0;
+ }
+# else
+ void *brk_value;
+
+ brk_value = sbrk (0);
+ if (brk_value == (void *)-1)
+ return 0;
+# endif
+
+ {
+ struct locals l;
+
+ l.brk_value = (uintptr_t) brk_value;
+ l.data_segment_size = 0;
+ vma_iterate (vma_iterate_callback, &l);
+
+ return l.data_segment_size;
+ }
+}
+
+#else
+
+static inline uintptr_t
+get_rusage_data_via_iterator (void)
+{
+ return 0;
+}
+
+#endif
+
+
+uintptr_t
+get_rusage_data (void)
+{
+#if (defined __APPLE__ && defined __MACH__) || defined __CYGWIN__ /* MacOS X, Cygwin */
+ /* get_rusage_data_via_setrlimit() does not work.
+ Prefer get_rusage_data_via_iterator(). */
+ return get_rusage_data_via_iterator ();
+#elif HAVE_SETRLIMIT && defined RLIMIT_DATA
+# if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined _AIX || defined __sgi || defined __osf__ || defined __sun /* Linux, FreeBSD, NetBSD, OpenBSD, AIX, IRIX, OSF/1, Solaris */
+ /* get_rusage_data_via_setrlimit() works. */
+ return get_rusage_data_via_setrlimit ();
+# else
+ /* Prefer get_rusage_data_via_setrlimit() if it succeeds,
+ because the caller may want to use the result with setrlimit(). */
+ uintptr_t result;
+
+ result = get_rusage_data_via_setrlimit ();
+ if (result == 0)
+ result = get_rusage_data_via_iterator ();
+ return result;
+# endif
+#else
+ return get_rusage_data_via_iterator ();
+#endif
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main ()
+{
+ printf ("Initially: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (),
+ get_rusage_data ());
+ malloc (0x88);
+ printf ("After small malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (),
+ get_rusage_data ());
+ malloc (0x8812);
+ printf ("After medium malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (),
+ get_rusage_data ());
+ malloc (0x281237);
+ printf ("After large malloc: 0x%08lX 0x%08lX 0x%08lX\n",
+ get_rusage_data_via_setrlimit (), get_rusage_data_via_iterator (),
+ get_rusage_data ());
+ return 0;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/getaddrinfo.c b/gnulib/lib/getaddrinfo.c
new file mode 100644
index 0000000..9109d44
--- /dev/null
+++ b/gnulib/lib/getaddrinfo.c
@@ -0,0 +1,444 @@
+/* Get address information (partial implementation).
+ Copyright (C) 1997, 2001-2002, 2004-2011 Free Software Foundation, Inc.
+ Contributed by Simon Josefsson <simon@josefsson.org>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the sa == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <netdb.h>
+
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+/* Get inet_ntop. */
+#include <arpa/inet.h>
+
+/* Get calloc. */
+#include <stdlib.h>
+
+/* Get memcpy, strdup. */
+#include <string.h>
+
+/* Get snprintf. */
+#include <stdio.h>
+
+#include <stdbool.h>
+
+#include "gettext.h"
+#define _(String) gettext (String)
+#define N_(String) String
+
+/* BeOS has AF_INET, but not PF_INET. */
+#ifndef PF_INET
+# define PF_INET AF_INET
+#endif
+/* BeOS also lacks PF_UNSPEC. */
+#ifndef PF_UNSPEC
+# define PF_UNSPEC 0
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+/* gl_sockets_startup */
+#include "sockets.h"
+
+#ifdef WIN32_NATIVE
+typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*,
+ const struct addrinfo*,
+ struct addrinfo**);
+typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*);
+typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*,
+ socklen_t, char*, DWORD,
+ char*, DWORD, int);
+
+static getaddrinfo_func getaddrinfo_ptr = NULL;
+static freeaddrinfo_func freeaddrinfo_ptr = NULL;
+static getnameinfo_func getnameinfo_ptr = NULL;
+
+static int
+use_win32_p (void)
+{
+ static int done = 0;
+ HMODULE h;
+
+ if (done)
+ return getaddrinfo_ptr ? 1 : 0;
+
+ done = 1;
+
+ h = GetModuleHandle ("ws2_32.dll");
+
+ if (h)
+ {
+ getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo");
+ freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo");
+ getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo");
+ }
+
+ /* If either is missing, something is odd. */
+ if (!getaddrinfo_ptr || !freeaddrinfo_ptr || !getnameinfo_ptr)
+ {
+ getaddrinfo_ptr = NULL;
+ freeaddrinfo_ptr = NULL;
+ getnameinfo_ptr = NULL;
+ return 0;
+ }
+
+ gl_sockets_startup (SOCKETS_1_1);
+
+ return 1;
+}
+#endif
+
+static inline bool
+validate_family (int family)
+{
+ /* FIXME: Support more families. */
+#if HAVE_IPV4
+ if (family == PF_INET)
+ return true;
+#endif
+#if HAVE_IPV6
+ if (family == PF_INET6)
+ return true;
+#endif
+ if (family == PF_UNSPEC)
+ return true;
+ return false;
+}
+
+/* Translate name of a service location and/or a service name to set of
+ socket addresses. */
+int
+getaddrinfo (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+{
+ struct addrinfo *tmp;
+ int port = 0;
+ struct hostent *he;
+ void *storage;
+ size_t size;
+#if HAVE_IPV6
+ struct v6_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in6 sockaddr_in6;
+ };
+#endif
+#if HAVE_IPV4
+ struct v4_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in sockaddr_in;
+ };
+#endif
+
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ return getaddrinfo_ptr (nodename, servname, hints, res);
+#endif
+
+ if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE)))
+ /* FIXME: Support more flags. */
+ return EAI_BADFLAGS;
+
+ if (hints && !validate_family (hints->ai_family))
+ return EAI_FAMILY;
+
+ if (hints &&
+ hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM)
+ /* FIXME: Support other socktype. */
+ return EAI_SOCKTYPE; /* FIXME: Better return code? */
+
+ if (!nodename)
+ {
+ if (!(hints->ai_flags & AI_PASSIVE))
+ return EAI_NONAME;
+
+#ifdef HAVE_IPV6
+ nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0";
+#else
+ nodename = "0.0.0.0";
+#endif
+ }
+
+ if (servname)
+ {
+ struct servent *se = NULL;
+ const char *proto =
+ (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp";
+
+ if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV))
+ /* FIXME: Use getservbyname_r if available. */
+ se = getservbyname (servname, proto);
+
+ if (!se)
+ {
+ char *c;
+ if (!(*servname >= '0' && *servname <= '9'))
+ return EAI_NONAME;
+ port = strtoul (servname, &c, 10);
+ if (*c || port > 0xffff)
+ return EAI_NONAME;
+ port = htons (port);
+ }
+ else
+ port = se->s_port;
+ }
+
+ /* FIXME: Use gethostbyname_r if available. */
+ he = gethostbyname (nodename);
+ if (!he || he->h_addr_list[0] == NULL)
+ return EAI_NONAME;
+
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV6
+ case PF_INET6:
+ size = sizeof (struct v6_pair);
+ break;
+#endif
+
+#if HAVE_IPV4
+ case PF_INET:
+ size = sizeof (struct v4_pair);
+ break;
+#endif
+
+ default:
+ return EAI_NODATA;
+ }
+
+ storage = calloc (1, size);
+ if (!storage)
+ return EAI_MEMORY;
+
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV6
+ case PF_INET6:
+ {
+ struct v6_pair *p = storage;
+ struct sockaddr_in6 *sinp = &p->sockaddr_in6;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin6_port = port;
+
+ if (he->h_length != sizeof (sinp->sin6_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+#endif
+
+#if HAVE_IPV4
+ case PF_INET:
+ {
+ struct v4_pair *p = storage;
+ struct sockaddr_in *sinp = &p->sockaddr_in;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin_port = port;
+
+ if (he->h_length != sizeof (sinp->sin_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+#endif
+
+ default:
+ free (storage);
+ return EAI_NODATA;
+ }
+
+ if (hints && hints->ai_flags & AI_CANONNAME)
+ {
+ const char *cn;
+ if (he->h_name)
+ cn = he->h_name;
+ else
+ cn = nodename;
+
+ tmp->ai_canonname = strdup (cn);
+ if (!tmp->ai_canonname)
+ {
+ free (storage);
+ return EAI_MEMORY;
+ }
+ }
+
+ tmp->ai_protocol = (hints) ? hints->ai_protocol : 0;
+ tmp->ai_socktype = (hints) ? hints->ai_socktype : 0;
+ tmp->ai_addr->sa_family = he->h_addrtype;
+ tmp->ai_family = he->h_addrtype;
+
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ switch (he->h_addrtype)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in);
+ break;
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in6);
+ break;
+#endif
+ }
+#endif
+
+ /* FIXME: If more than one address, create linked list of addrinfo's. */
+
+ *res = tmp;
+
+ return 0;
+}
+
+/* Free `addrinfo' structure AI including associated storage. */
+void
+freeaddrinfo (struct addrinfo *ai)
+{
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ {
+ freeaddrinfo_ptr (ai);
+ return;
+ }
+#endif
+
+ while (ai)
+ {
+ struct addrinfo *cur;
+
+ cur = ai;
+ ai = ai->ai_next;
+
+ free (cur->ai_canonname);
+ free (cur);
+ }
+}
+
+int
+getnameinfo (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+{
+#ifdef WIN32_NATIVE
+ if (use_win32_p ())
+ return getnameinfo_ptr (sa, salen, node, nodelen,
+ service, servicelen, flags);
+#endif
+
+ /* FIXME: Support other flags. */
+ if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV)))
+ return EAI_BADFLAGS;
+
+ if (sa == NULL || salen < sizeof (sa->sa_family))
+ return EAI_FAMILY;
+
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ if (salen < sizeof (struct sockaddr_in))
+ return EAI_FAMILY;
+ break;
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+ if (salen < sizeof (struct sockaddr_in6))
+ return EAI_FAMILY;
+ break;
+#endif
+ default:
+ return EAI_FAMILY;
+ }
+
+ if (node && nodelen > 0 && flags & NI_NUMERICHOST)
+ {
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+ if (!inet_ntop (AF_INET,
+ &(((const struct sockaddr_in *) sa)->sin_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+#endif
+
+#if HAVE_IPV6
+ case AF_INET6:
+ if (!inet_ntop (AF_INET6,
+ &(((const struct sockaddr_in6 *) sa)->sin6_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+#endif
+
+ default:
+ return EAI_FAMILY;
+ }
+ }
+
+ if (service && servicelen > 0 && flags & NI_NUMERICSERV)
+ switch (sa->sa_family)
+ {
+#if HAVE_IPV4
+ case AF_INET:
+#endif
+#if HAVE_IPV6
+ case AF_INET6:
+#endif
+ {
+ unsigned short int port
+ = ntohs (((const struct sockaddr_in *) sa)->sin_port);
+ if (servicelen <= snprintf (service, servicelen, "%u", port))
+ return EAI_OVERFLOW;
+ }
+ break;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/getcwd-lgpl.c b/gnulib/lib/getcwd-lgpl.c
new file mode 100644
index 0000000..2761422
--- /dev/null
+++ b/gnulib/lib/getcwd-lgpl.c
@@ -0,0 +1,125 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if GNULIB_GETCWD
+/* Favor GPL getcwd.c if both getcwd and getcwd-lgpl modules are in use. */
+typedef int dummy;
+#else
+
+/* Get the name of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined
+ (perhaps because the absolute name was longer than PATH_MAX, or
+ because of missing read/search permissions on parent directories)
+ or SIZE was too small. If successful, returns BUF. If BUF is
+ NULL, an array is allocated with `malloc'; the array is SIZE bytes
+ long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+
+# undef getcwd
+char *
+rpl_getcwd (char *buf, size_t size)
+{
+ char *ptr;
+ char *result;
+
+ /* Handle single size operations. */
+ if (buf)
+ {
+ if (!size)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+ return getcwd (buf, size);
+ }
+
+ if (size)
+ {
+ buf = malloc (size);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ result = getcwd (buf, size);
+ if (!result)
+ {
+ int saved_errno = errno;
+ free (buf);
+ errno = saved_errno;
+ }
+ return result;
+ }
+
+ /* Flexible sizing requested. Avoid over-allocation for the common
+ case of a name that fits within a 4k page, minus some space for
+ local variables, to be sure we don't skip over a guard page. */
+ {
+ char tmp[4032];
+ size = sizeof tmp;
+ ptr = getcwd (tmp, size);
+ if (ptr)
+ {
+ result = strdup (ptr);
+ if (!result)
+ errno = ENOMEM;
+ return result;
+ }
+ if (errno != ERANGE)
+ return NULL;
+ }
+
+ /* My what a large directory name we have. */
+ do
+ {
+ size <<= 1;
+ ptr = realloc (buf, size);
+ if (ptr == NULL)
+ {
+ free (buf);
+ errno = ENOMEM;
+ return NULL;
+ }
+ buf = ptr;
+ result = getcwd (buf, size);
+ }
+ while (!result && errno == ERANGE);
+
+ if (!result)
+ {
+ int saved_errno = errno;
+ free (buf);
+ errno = saved_errno;
+ }
+ else
+ {
+ /* Trim to fit, if possible. */
+ result = realloc (buf, strlen (buf) + 1);
+ if (!result)
+ result = buf;
+ }
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/getcwd.c b/gnulib/lib/getcwd.c
new file mode 100644
index 0000000..9b8171c
--- /dev/null
+++ b/gnulib/lib/getcwd.c
@@ -0,0 +1,442 @@
+/* Copyright (C) 1991-1999, 2004-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <fcntl.h> /* For AT_FDCWD on Solaris 9. */
+
+/* If this host provides the openat function or if we're using the
+ gnulib replacement function, then enable code below to make getcwd
+ more efficient and robust. */
+#if defined HAVE_OPENAT || defined GNULIB_OPENAT
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) strlen ((d)->d_name)
+#endif
+#ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if _LIBC
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#include "pathmax.h"
+
+/* In this file, PATH_MAX only serves as a threshold for choosing among two
+ algorithms. */
+#ifndef PATH_MAX
+# define PATH_MAX 8192
+#endif
+
+#if D_INO_IN_DIRENT
+# define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino))
+#else
+# define MATCHING_INO(dp, ino) true
+#endif
+
+#if !_LIBC
+# define __getcwd rpl_getcwd
+# define __lstat lstat
+# define __closedir closedir
+# define __opendir opendir
+# define __readdir readdir
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer and
+ openat_safer. */
+#undef opendir
+#undef closedir
+
+/* Get the name of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined or
+ SIZE was too small. If successful, returns BUF. In GNU, if BUF is
+ NULL, an array is allocated with `malloc'; the array is SIZE bytes long,
+ unless SIZE == 0, in which case it is as big as necessary. */
+
+char *
+__getcwd (char *buf, size_t size)
+{
+ /* Lengths of big file name components and entire file names, and a
+ deep level of file name nesting. These numbers are not upper
+ bounds; they are merely large values suitable for initial
+ allocations, designed to be large enough for most real-world
+ uses. */
+ enum
+ {
+ BIG_FILE_NAME_COMPONENT_LENGTH = 255,
+ BIG_FILE_NAME_LENGTH = MIN (4095, PATH_MAX - 1),
+ DEEP_NESTING = 100
+ };
+
+#if HAVE_OPENAT_SUPPORT
+ int fd = AT_FDCWD;
+ bool fd_needs_closing = false;
+#else
+ char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1];
+ char *dotlist = dots;
+ size_t dotsize = sizeof dots;
+ size_t dotlen = 0;
+#endif
+ DIR *dirstream = NULL;
+ dev_t rootdev, thisdev;
+ ino_t rootino, thisino;
+ char *dir;
+ register char *dirp;
+ struct stat st;
+ size_t allocated = size;
+ size_t used;
+
+#if HAVE_RAW_DECL_GETCWD && HAVE_MINIMALLY_WORKING_GETCWD
+ /* If AT_FDCWD is not defined, the algorithm below is O(N**2) and
+ this is much slower than the system getcwd (at least on
+ GNU/Linux). So trust the system getcwd's results unless they
+ look suspicious.
+
+ Use the system getcwd even if we have openat support, since the
+ system getcwd works even when a parent is unreadable, while the
+ openat-based approach does not.
+
+ But on AIX 5.1..7.1, the system getcwd is not even minimally
+ working: If the current directory name is slightly longer than
+ PATH_MAX, it omits the first directory component and returns
+ this wrong result with errno = 0. */
+
+# undef getcwd
+ dir = getcwd (buf, size);
+ if (dir || (size && errno == ERANGE))
+ return dir;
+
+ /* Solaris getcwd (NULL, 0) fails with errno == EINVAL, but it has
+ internal magic that lets it work even if an ancestor directory is
+ inaccessible, which is better in many cases. So in this case try
+ again with a buffer that's almost always big enough. */
+ if (errno == EINVAL && buf == NULL && size == 0)
+ {
+ char big_buffer[BIG_FILE_NAME_LENGTH + 1];
+ dir = getcwd (big_buffer, sizeof big_buffer);
+ if (dir)
+ return strdup (dir);
+ }
+
+# if HAVE_PARTLY_WORKING_GETCWD
+ /* The system getcwd works, except it sometimes fails when it
+ shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+ if (errno != ERANGE && errno != ENAMETOOLONG && errno != ENOENT)
+ return NULL;
+# endif
+#endif
+
+ if (size == 0)
+ {
+ if (buf != NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ allocated = BIG_FILE_NAME_LENGTH + 1;
+ }
+
+ if (buf == NULL)
+ {
+ dir = malloc (allocated);
+ if (dir == NULL)
+ return NULL;
+ }
+ else
+ dir = buf;
+
+ dirp = dir + allocated;
+ *--dirp = '\0';
+
+ if (__lstat (".", &st) < 0)
+ goto lose;
+ thisdev = st.st_dev;
+ thisino = st.st_ino;
+
+ if (__lstat ("/", &st) < 0)
+ goto lose;
+ rootdev = st.st_dev;
+ rootino = st.st_ino;
+
+ while (!(thisdev == rootdev && thisino == rootino))
+ {
+ struct dirent *d;
+ dev_t dotdev;
+ ino_t dotino;
+ bool mount_point;
+ int parent_status;
+ size_t dirroom;
+ size_t namlen;
+ bool use_d_ino = true;
+
+ /* Look at the parent directory. */
+#if HAVE_OPENAT_SUPPORT
+ fd = openat (fd, "..", O_RDONLY);
+ if (fd < 0)
+ goto lose;
+ fd_needs_closing = true;
+ parent_status = fstat (fd, &st);
+#else
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen] = '\0';
+ parent_status = __lstat (dotlist, &st);
+#endif
+ if (parent_status != 0)
+ goto lose;
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ /* Figure out if this directory is a mount point. */
+ dotdev = st.st_dev;
+ dotino = st.st_ino;
+ mount_point = dotdev != thisdev;
+
+ /* Search for the last directory. */
+#if HAVE_OPENAT_SUPPORT
+ dirstream = fdopendir (fd);
+ if (dirstream == NULL)
+ goto lose;
+ fd_needs_closing = false;
+#else
+ dirstream = __opendir (dotlist);
+ if (dirstream == NULL)
+ goto lose;
+ dotlist[dotlen++] = '/';
+#endif
+ for (;;)
+ {
+ /* Clear errno to distinguish EOF from error if readdir returns
+ NULL. */
+ __set_errno (0);
+ d = __readdir (dirstream);
+
+ /* When we've iterated through all directory entries without finding
+ one with a matching d_ino, rewind the stream and consider each
+ name again, but this time, using lstat. This is necessary in a
+ chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where
+ .., ../.., ../../.., etc. all had the same device number, yet the
+ d_ino values for entries in / did not match those obtained
+ via lstat. */
+ if (d == NULL && errno == 0 && use_d_ino)
+ {
+ use_d_ino = false;
+ rewinddir (dirstream);
+ d = __readdir (dirstream);
+ }
+
+ if (d == NULL)
+ {
+ if (errno == 0)
+ /* EOF on dirstream, which can mean e.g., that the current
+ directory has been removed. */
+ __set_errno (ENOENT);
+ goto lose;
+ }
+ if (d->d_name[0] == '.' &&
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0')))
+ continue;
+
+ if (use_d_ino)
+ {
+ bool match = (MATCHING_INO (d, thisino) || mount_point);
+ if (! match)
+ continue;
+ }
+
+ {
+ int entry_status;
+#if HAVE_OPENAT_SUPPORT
+ entry_status = fstatat (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW);
+#else
+ /* Compute size needed for this file name, or for the file
+ name ".." in the same directory, whichever is larger.
+ Room for ".." might be needed the next time through
+ the outer loop. */
+ size_t name_alloc = _D_ALLOC_NAMLEN (d);
+ size_t filesize = dotlen + MAX (sizeof "..", name_alloc);
+
+ if (filesize < dotlen)
+ goto memory_exhausted;
+
+ if (dotsize < filesize)
+ {
+ /* My, what a deep directory tree you have, Grandma. */
+ size_t newsize = MAX (filesize, dotsize * 2);
+ size_t i;
+ if (newsize < dotsize)
+ goto memory_exhausted;
+ if (dotlist != dots)
+ free (dotlist);
+ dotlist = malloc (newsize);
+ if (dotlist == NULL)
+ goto lose;
+ dotsize = newsize;
+
+ i = 0;
+ do
+ {
+ dotlist[i++] = '.';
+ dotlist[i++] = '.';
+ dotlist[i++] = '/';
+ }
+ while (i < dotlen);
+ }
+
+ memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
+ entry_status = __lstat (dotlist, &st);
+#endif
+ /* We don't fail here if we cannot stat() a directory entry.
+ This can happen when (network) file systems fail. If this
+ entry is in fact the one we are looking for we will find
+ out soon as we reach the end of the directory without
+ having found anything. */
+ if (entry_status == 0 && S_ISDIR (st.st_mode)
+ && st.st_dev == thisdev && st.st_ino == thisino)
+ break;
+ }
+ }
+
+ dirroom = dirp - dir;
+ namlen = _D_EXACT_NAMLEN (d);
+
+ if (dirroom <= namlen)
+ {
+ if (size != 0)
+ {
+ __set_errno (ERANGE);
+ goto lose;
+ }
+ else
+ {
+ char *tmp;
+ size_t oldsize = allocated;
+
+ allocated += MAX (allocated, namlen);
+ if (allocated < oldsize
+ || ! (tmp = realloc (dir, allocated)))
+ goto memory_exhausted;
+
+ /* Move current contents up to the end of the buffer.
+ This is guaranteed to be non-overlapping. */
+ dirp = memcpy (tmp + allocated - (oldsize - dirroom),
+ tmp + dirroom,
+ oldsize - dirroom);
+ dir = tmp;
+ }
+ }
+ dirp -= namlen;
+ memcpy (dirp, d->d_name, namlen);
+ *--dirp = '/';
+
+ thisdev = dotdev;
+ thisino = dotino;
+ }
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ if (dirp == &dir[allocated - 1])
+ *--dirp = '/';
+
+#if ! HAVE_OPENAT_SUPPORT
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+
+ used = dir + allocated - dirp;
+ memmove (dir, dirp, used);
+
+ if (size == 0)
+ /* Ensure that the buffer is only as large as necessary. */
+ buf = realloc (dir, used);
+
+ if (buf == NULL)
+ /* Either buf was NULL all along, or `realloc' failed but
+ we still have the original string. */
+ buf = dir;
+
+ return buf;
+
+ memory_exhausted:
+ __set_errno (ENOMEM);
+ lose:
+ {
+ int save = errno;
+ if (dirstream)
+ __closedir (dirstream);
+#if HAVE_OPENAT_SUPPORT
+ if (fd_needs_closing)
+ close (fd);
+#else
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+ if (buf == NULL)
+ free (dir);
+ __set_errno (save);
+ }
+ return NULL;
+}
+
+#ifdef weak_alias
+weak_alias (__getcwd, getcwd)
+#endif
diff --git a/gnulib/lib/getdate.h b/gnulib/lib/getdate.h
new file mode 100644
index 0000000..9f5d1a9
--- /dev/null
+++ b/gnulib/lib/getdate.h
@@ -0,0 +1,3 @@
+/* Obsolete; consider using parse-datetime.h instead. */
+#include "parse-datetime.h"
+#define get_date(a, b, c) parse_datetime (a, b, c)
diff --git a/gnulib/lib/getdelim.c b/gnulib/lib/getdelim.c
new file mode 100644
index 0000000..6580b9d
--- /dev/null
+++ b/gnulib/lib/getdelim.c
@@ -0,0 +1,137 @@
+/* getdelim.c --- Implementation of replacement getdelim function.
+ Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Ported from glibc by Simon Josefsson. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <stdio.h>
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# define getc_maybe_unlocked(fp) getc(fp)
+#elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED
+# undef flockfile
+# undef funlockfile
+# define flockfile(x) ((void) 0)
+# define funlockfile(x) ((void) 0)
+# define getc_maybe_unlocked(fp) getc(fp)
+#else
+# define getc_maybe_unlocked(fp) getc_unlocked(fp)
+#endif
+
+/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
+ NUL-terminate it). *LINEPTR is a pointer returned from malloc (or
+ NULL), pointing to *N characters of space. It is realloc'ed as
+ necessary. Returns the number of characters read (not including
+ the null terminator), or -1 on error or EOF. */
+
+ssize_t
+getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
+{
+ ssize_t result;
+ size_t cur_len = 0;
+
+ if (lineptr == NULL || n == NULL || fp == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ flockfile (fp);
+
+ if (*lineptr == NULL || *n == 0)
+ {
+ char *new_lineptr;
+ *n = 120;
+ new_lineptr = (char *) realloc (*lineptr, *n);
+ if (new_lineptr == NULL)
+ {
+ result = -1;
+ goto unlock_return;
+ }
+ *lineptr = new_lineptr;
+ }
+
+ for (;;)
+ {
+ int i;
+
+ i = getc_maybe_unlocked (fp);
+ if (i == EOF)
+ {
+ result = -1;
+ break;
+ }
+
+ /* Make enough space for len+1 (for final NUL) bytes. */
+ if (cur_len + 1 >= *n)
+ {
+ size_t needed_max =
+ SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+ size_t needed = 2 * *n + 1; /* Be generous. */
+ char *new_lineptr;
+
+ if (needed_max < needed)
+ needed = needed_max;
+ if (cur_len + 1 >= needed)
+ {
+ result = -1;
+ errno = EOVERFLOW;
+ goto unlock_return;
+ }
+
+ new_lineptr = (char *) realloc (*lineptr, needed);
+ if (new_lineptr == NULL)
+ {
+ result = -1;
+ goto unlock_return;
+ }
+
+ *lineptr = new_lineptr;
+ *n = needed;
+ }
+
+ (*lineptr)[cur_len] = i;
+ cur_len++;
+
+ if (i == delimiter)
+ break;
+ }
+ (*lineptr)[cur_len] = '\0';
+ result = cur_len ? cur_len : result;
+
+ unlock_return:
+ funlockfile (fp); /* doesn't set errno */
+
+ return result;
+}
diff --git a/gnulib/lib/getdomainname.c b/gnulib/lib/getdomainname.c
new file mode 100644
index 0000000..62efa61
--- /dev/null
+++ b/gnulib/lib/getdomainname.c
@@ -0,0 +1,83 @@
+/* getdomainname emulation for systems that doesn't have it.
+
+ Copyright (C) 2003, 2006, 2008, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+
+#if HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H /* IRIX, OSF/1, Solaris */
+# include <sys/systeminfo.h>
+#endif
+
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+int
+getdomainname (char *name, size_t len)
+#undef getdomainname
+{
+#if HAVE_GETDOMAINNAME /* MacOS X, FreeBSD, AIX, IRIX, OSF/1 */
+ extern int getdomainname (char *, int);
+
+ if (len > INT_MAX)
+ len = INT_MAX;
+ return getdomainname (name, (int) len);
+#elif HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H && defined SI_SRPC_DOMAIN
+ /* Solaris */
+ int ret;
+
+ /* The third argument is a 'long', but the return value must fit in an
+ 'int', therefore it's better to avoid arguments > INT_MAX. */
+ ret = sysinfo (SI_SRPC_DOMAIN, name, len > INT_MAX ? INT_MAX : len);
+ if (ret < 0)
+ /* errno is set here. */
+ return -1;
+ if (ret > len)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+#else /* HP-UX, Cygwin, mingw */
+ const char *result = ""; /* Hardcode your domain name if you want. */
+ size_t result_len = strlen (result);
+
+ if (result_len > len)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ memcpy (name, result, result_len);
+ if (result_len < len)
+ name[result_len] = '\0';
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/getdtablesize.c b/gnulib/lib/getdtablesize.c
new file mode 100644
index 0000000..a07c4a2
--- /dev/null
+++ b/gnulib/lib/getdtablesize.c
@@ -0,0 +1,86 @@
+/* getdtablesize() function for platforms that don't have it.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+#include <stdio.h>
+
+#include "msvc-inval.h"
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline int
+_setmaxstdio_nothrow (int newmax)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _setmaxstdio (newmax);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# define _setmaxstdio _setmaxstdio_nothrow
+#endif
+
+/* Cache for the previous getdtablesize () result. */
+static int dtablesize;
+
+int
+getdtablesize (void)
+{
+ if (dtablesize == 0)
+ {
+ /* We are looking for the number N such that the valid file descriptors
+ are 0..N-1. It can be obtained through a loop as follows:
+ {
+ int fd;
+ for (fd = 3; fd < 65536; fd++)
+ if (dup2 (0, fd) == -1)
+ break;
+ return fd;
+ }
+ On Windows XP, the result is 2048.
+ The drawback of this loop is that it allocates memory for a libc
+ internal array that is never freed.
+
+ The number N can also be obtained as the upper bound for
+ _getmaxstdio (). _getmaxstdio () returns the maximum number of open
+ FILE objects. The sanity check in _setmaxstdio reveals the maximum
+ number of file descriptors. This too allocates memory, but it is
+ freed when we call _setmaxstdio with the original value. */
+ int orig_max_stdio = _getmaxstdio ();
+ unsigned int bound;
+ for (bound = 0x10000; _setmaxstdio (bound) < 0; bound = bound / 2)
+ ;
+ _setmaxstdio (orig_max_stdio);
+ dtablesize = bound;
+ }
+ return dtablesize;
+}
+
+#endif
diff --git a/gnulib/lib/getfilecon.c b/gnulib/lib/getfilecon.c
new file mode 100644
index 0000000..ccd9fa5
--- /dev/null
+++ b/gnulib/lib/getfilecon.c
@@ -0,0 +1,87 @@
+/* wrap getfilecon, lgetfilecon, and fgetfilecon
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <selinux/selinux.h>
+
+#include <sys/types.h>
+#include <errno.h>
+#include <string.h>
+
+/* FIXME: remove this once there is an errno-gnu module
+ that guarantees the definition of ENODATA. */
+#ifndef ENODATA
+# define ENODATA ENOTSUP
+#endif
+
+#undef getfilecon
+#undef lgetfilecon
+#undef fgetfilecon
+int getfilecon (char const *file, security_context_t *con);
+int lgetfilecon (char const *file, security_context_t *con);
+int fgetfilecon (int fd, security_context_t *con);
+
+/* getfilecon, lgetfilecon, and fgetfilecon can all misbehave, be it
+ via an old version of libselinux where these would return 0 and set the
+ result context to NULL, or via a modern kernel+lib operating on a file
+ from a disk whose attributes were set by a kernel from around 2006.
+ In that latter case, the functions return a length of 10 for the
+ "unlabeled" context. Map both failures to a return value of -1, and
+ set errno to ENOTSUP in the first case, and ENODATA in the latter. */
+
+static inline int
+map_to_failure (int ret, security_context_t *con)
+{
+ if (ret == 0)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+
+ if (ret == 10 && strcmp (*con, "unlabeled") == 0)
+ {
+ freecon (*con);
+ errno = ENODATA;
+ return -1;
+ }
+
+ return ret;
+}
+
+int
+rpl_getfilecon (char const *file, security_context_t *con)
+{
+ int ret = getfilecon (file, con);
+ return map_to_failure (ret, con);
+}
+
+int
+rpl_lgetfilecon (char const *file, security_context_t *con)
+{
+ int ret = lgetfilecon (file, con);
+ return map_to_failure (ret, con);
+}
+
+int
+rpl_fgetfilecon (int fd, security_context_t *con)
+{
+ int ret = fgetfilecon (fd, con);
+ return map_to_failure (ret, con);
+}
diff --git a/gnulib/lib/getgroups.c b/gnulib/lib/getgroups.c
new file mode 100644
index 0000000..87e1679
--- /dev/null
+++ b/gnulib/lib/getgroups.c
@@ -0,0 +1,116 @@
+/* provide consistent interface to getgroups for systems that don't allow N==0
+
+ Copyright (C) 1996, 1999, 2003, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#if !HAVE_GETGROUPS
+
+/* Provide a stub that fails with ENOSYS, since there is no group
+ information available on mingw. */
+int
+getgroups (int n _GL_UNUSED, GETGROUPS_T *groups _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_GETGROUPS */
+
+# undef getgroups
+# ifndef GETGROUPS_ZERO_BUG
+# define GETGROUPS_ZERO_BUG 0
+# endif
+
+/* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always
+ fails. On other systems, it returns the number of supplemental
+ groups for the process. This function handles that special case
+ and lets the system-provided function handle all others. However,
+ it can fail with ENOMEM if memory is tight. It is unspecified
+ whether the effective group id is included in the list. */
+
+int
+rpl_getgroups (int n, gid_t *group)
+{
+ int n_groups;
+ GETGROUPS_T *gbuf;
+ int saved_errno;
+
+ if (n < 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (n != 0 || !GETGROUPS_ZERO_BUG)
+ {
+ int result;
+ if (sizeof *group == sizeof *gbuf)
+ return getgroups (n, (GETGROUPS_T *) group);
+
+ if (SIZE_MAX / sizeof *gbuf <= n)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ result = getgroups (n, gbuf);
+ if (0 <= result)
+ {
+ n = result;
+ while (n--)
+ group[n] = gbuf[n];
+ }
+ saved_errno = errno;
+ free (gbuf);
+ errno == saved_errno;
+ return result;
+ }
+
+ n = 20;
+ while (1)
+ {
+ /* No need to worry about address arithmetic overflow here,
+ since the ancient systems that we're running on have low
+ limits on the number of secondary groups. */
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ n_groups = getgroups (n, gbuf);
+ if (n_groups == -1 ? errno != EINVAL : n_groups < n)
+ break;
+ free (gbuf);
+ n *= 2;
+ }
+
+ saved_errno = errno;
+ free (gbuf);
+ errno = saved_errno;
+
+ return n_groups;
+}
+
+#endif /* HAVE_GETGROUPS */
diff --git a/gnulib/lib/gethostname.c b/gnulib/lib/gethostname.c
new file mode 100644
index 0000000..9de54bc
--- /dev/null
+++ b/gnulib/lib/gethostname.c
@@ -0,0 +1,104 @@
+/* gethostname emulation for SysV and POSIX.1.
+
+ Copyright (C) 1992, 2003, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* David MacKenzie <djm@gnu.ai.mit.edu>
+ Windows port by Simon Josefsson <simon@josefsson.org> */
+
+#include <config.h>
+
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+/* Unix API. */
+
+/* Specification. */
+#include <unistd.h>
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif
+
+#include <string.h>
+
+/* Put up to LEN chars of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ Return 0 if ok, -1 if error. */
+
+#include <stddef.h>
+
+int
+gethostname (char *name, size_t len)
+{
+#ifdef HAVE_UNAME
+ struct utsname uts;
+
+ if (uname (&uts) == -1)
+ return -1;
+ if (len > sizeof (uts.nodename))
+ {
+ /* More space than we need is available. */
+ name[sizeof (uts.nodename)] = '\0';
+ len = sizeof (uts.nodename);
+ }
+ strncpy (name, uts.nodename, len);
+#else
+ strcpy (name, ""); /* Hardcode your system name if you want. */
+#endif
+ return 0;
+}
+
+#else
+/* Native Windows API. Which primitive to choose?
+ - gethostname() requires linking with -lws2_32.
+ - GetComputerName() does not return the right kind of hostname.
+ - GetComputerNameEx(ComputerNameDnsHostname,...) returns the right hostname,
+ but it is hard to use portably:
+ - It requires defining _WIN32_WINNT to at least 0x0500.
+ - With mingw, it also requires
+ "#define GetComputerNameEx GetComputerNameExA".
+ - With older versions of mingw, none of the declarations are present at
+ all, not even of the enum value ComputerNameDnsHostname.
+ So we use gethostname(). Linking with -lws2_32 is the least evil. */
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <unistd.h>
+
+/* Get INT_MAX. */
+#include <limits.h>
+
+/* Get set_winsock_errno. */
+#include "w32sock.h"
+
+#include "sockets.h"
+
+#undef gethostname
+
+int
+rpl_gethostname (char *name, size_t len)
+{
+ int r;
+
+ if (len > INT_MAX)
+ len = INT_MAX;
+ gl_sockets_startup (SOCKETS_1_1);
+ r = gethostname (name, (int) len);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+}
+
+#endif
diff --git a/gnulib/lib/gethrxtime.c b/gnulib/lib/gethrxtime.c
new file mode 100644
index 0000000..3886752
--- /dev/null
+++ b/gnulib/lib/gethrxtime.c
@@ -0,0 +1,68 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "gethrxtime.h"
+
+#include <sys/time.h>
+#include "timespec.h"
+
+/* Get the current time, as a count of the number of nanoseconds since
+ an arbitrary epoch (e.g., the system boot time). Prefer a
+ high-resolution clock that is not subject to resetting or
+ drifting. */
+
+xtime_t
+gethrxtime (void)
+{
+#if HAVE_NANOUPTIME
+ {
+ struct timespec ts;
+ nanouptime (&ts);
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+#else
+
+# if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME
+ {
+ struct timespec ts;
+ if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0)
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+# endif
+
+# if HAVE_MICROUPTIME
+ {
+ struct timeval tv;
+ microuptime (&tv);
+ return xtime_make (tv.tv_sec, 1000 * tv.tv_usec);
+ }
+
+# else
+ /* No monotonically increasing clocks are available; fall back on a
+ clock that might jump backwards, since it's the best we can do. */
+ {
+ struct timespec ts;
+ gettime (&ts);
+ return xtime_make (ts.tv_sec, ts.tv_nsec);
+ }
+# endif
+#endif
+}
diff --git a/gnulib/lib/gethrxtime.h b/gnulib/lib/gethrxtime.h
new file mode 100644
index 0000000..481f3f5
--- /dev/null
+++ b/gnulib/lib/gethrxtime.h
@@ -0,0 +1,37 @@
+/* gethrxtime -- get high resolution real time
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef GETHRXTIME_H_
+# define GETHRXTIME_H_ 1
+
+# include "xtime.h"
+
+/* Get the current time, as a count of the number of nanoseconds since
+ an arbitrary epoch (e.g., the system boot time). Prefer a
+ high-resolution clock that is not subject to resetting or
+ drifting. */
+
+# if HAVE_ARITHMETIC_HRTIME_T && HAVE_DECL_GETHRTIME
+# include <time.h>
+static inline xtime_t gethrxtime (void) { return gethrtime (); }
+# else
+xtime_t gethrxtime (void);
+# endif
+
+#endif
diff --git a/gnulib/lib/getline.c b/gnulib/lib/getline.c
new file mode 100644
index 0000000..0528db1
--- /dev/null
+++ b/gnulib/lib/getline.c
@@ -0,0 +1,29 @@
+/* getline.c --- Implementation of replacement getline function.
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+ssize_t
+getline (char **lineptr, size_t *n, FILE *stream)
+{
+ return getdelim (lineptr, n, '\n', stream);
+}
diff --git a/gnulib/lib/getloadavg.c b/gnulib/lib/getloadavg.c
new file mode 100644
index 0000000..d324451
--- /dev/null
+++ b/gnulib/lib/getloadavg.c
@@ -0,0 +1,1046 @@
+/* Get the system load averages.
+
+ Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2011 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with gnulib.
+ Bugs can be reported to bug-gnulib@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Compile-time symbols that this file uses:
+
+ HAVE_PSTAT_GETDYNAMIC Define this if your system has the
+ pstat_getdynamic function. I think it
+ is unique to HPUX9. The best way to get the
+ definition is through the AC_FUNC_GETLOADAVG
+ macro that comes with autoconf 2.13 or newer.
+ If that isn't an option, then just put
+ AC_CHECK_FUNCS(pstat_getdynamic) in your
+ configure.in file.
+ HAVE_LIBPERFSTAT Define this if your system has the
+ perfstat_cpu_total function in libperfstat (AIX).
+ FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist.
+ KERNEL_FILE Name of the kernel file to nlist.
+ LDAV_CVT() Scale the load average from the kernel.
+ Returns a double.
+ LDAV_SYMBOL Name of kernel symbol giving load average.
+ LOAD_AVE_TYPE Type of the load average array in the kernel.
+ Must be defined unless one of
+ apollo, DGUX, NeXT, or UMAX is defined;
+ or we have libkstat;
+ otherwise, no load average is available.
+ HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults
+ to this.
+ NLIST_STRUCT Include nlist.h, not a.out.h.
+ N_NAME_POINTER The nlist n_name element is a pointer,
+ not an array.
+ HAVE_STRUCT_NLIST_N_UN_N_NAME `n_un.n_name' is member of `struct nlist'.
+ LINUX_LDAV_FILE [__linux__, __CYGWIN__]: File containing
+ load averages.
+
+ Specific system predefines this file uses, aside from setting
+ default values if not emacs:
+
+ apollo
+ BSD Real BSD, not just BSD-like.
+ convex
+ DGUX
+ eunice UNIX emulator under VMS.
+ hpux
+ __MSDOS__ No-op for MSDOS.
+ NeXT
+ sgi
+ sequent Sequent Dynix 3.x.x (BSD)
+ _SEQUENT_ Sequent DYNIX/ptx 1.x.x (SYSV)
+ sony_news NEWS-OS (works at least for 4.1C)
+ UMAX
+ UMAX4_3
+ VMS
+ WINDOWS32 No-op for Windows95/NT.
+ __linux__ Linux: assumes /proc file system mounted.
+ Support from Michael K. Johnson.
+ __CYGWIN__ Cygwin emulates linux /proc/loadavg.
+ __NetBSD__ NetBSD: assumes /kern file system mounted.
+
+ In addition, to avoid nesting many #ifdefs, we internally set
+ LDAV_DONE to indicate that the load average has been computed.
+
+ We also #define LDAV_PRIVILEGED if a program will require
+ special installation to be able to call getloadavg. */
+
+/* "configure" defines CONFIGURING_GETLOADAVG to sidestep problems
+ with partially-configured source directories. */
+
+#ifndef CONFIGURING_GETLOADAVG
+# include <config.h>
+# include <stdbool.h>
+#endif
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+# include <sys/types.h>
+
+/* Both the Emacs and non-Emacs sections want this. Some
+ configuration files' definitions for the LOAD_AVE_CVT macro (like
+ sparc.h's) use macros like FSCALE, defined here. */
+# if defined (unix) || defined (__unix)
+# include <sys/param.h>
+# endif
+
+# include "intprops.h"
+
+/* The existing Emacs configuration files define a macro called
+ LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and
+ returns the load average multiplied by 100. What we actually want
+ is a macro called LDAV_CVT, which returns the load average as an
+ unmultiplied double.
+
+ For backwards compatibility, we'll define LDAV_CVT in terms of
+ LOAD_AVE_CVT, but future machine config files should just define
+ LDAV_CVT directly. */
+
+# if !defined (LDAV_CVT) && defined (LOAD_AVE_CVT)
+# define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
+# endif
+
+# if !defined (BSD) && defined (ultrix)
+/* Ultrix behaves like BSD on Vaxen. */
+# define BSD
+# endif
+
+# ifdef NeXT
+/* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which
+ conflicts with the definition understood in this file, that this
+ really is BSD. */
+# undef BSD
+
+/* NeXT defines FSCALE in <sys/param.h>. However, we take FSCALE being
+ defined to mean that the nlist method should be used, which is not true. */
+# undef FSCALE
+# endif
+
+/* Same issues as for NeXT apply to the HURD-based GNU system. */
+# ifdef __GNU__
+# undef BSD
+# undef FSCALE
+# endif /* __GNU__ */
+
+/* Set values that are different from the defaults, which are
+ set a little farther down with #ifndef. */
+
+
+/* Some shorthands. */
+
+# if defined (HPUX) && !defined (hpux)
+# define hpux
+# endif
+
+# if defined (__hpux) && !defined (hpux)
+# define hpux
+# endif
+
+# if defined (__sun) && !defined (sun)
+# define sun
+# endif
+
+# if defined (hp300) && !defined (hpux)
+# define MORE_BSD
+# endif
+
+# if defined (ultrix) && defined (mips)
+# define decstation
+# endif
+
+# if defined (__SVR4) && !defined (SVR4)
+# define SVR4
+# endif
+
+# if (defined (sun) && defined (SVR4)) || defined (SOLARIS2)
+# define SUNOS_5
+# endif
+
+# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
+# define OSF_ALPHA
+# include <sys/mbuf.h>
+# include <sys/socket.h>
+# include <net/route.h>
+# include <sys/table.h>
+/* Tru64 4.0D's table.h redefines sys */
+# undef sys
+# endif
+
+# if defined (__osf__) && (defined (mips) || defined (__mips__))
+# define OSF_MIPS
+# include <sys/table.h>
+# endif
+
+/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by
+ default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>. Combine
+ that with a couple of other things and we'll have a unique match. */
+# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES)
+# define tek4300 /* Define by emacs, but not by other users. */
+# endif
+
+
+/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */
+# ifndef LOAD_AVE_TYPE
+
+# ifdef MORE_BSD
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sun
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef decstation
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef _SEQUENT_
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sgi
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef SVR4
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sony_news
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef sequent
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef OSF_ALPHA
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined (ardent) && defined (titan)
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef tek4300
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined (alliant) && defined (i860) /* Alliant FX/2800 */
+# define LOAD_AVE_TYPE long
+# endif
+
+# if defined _AIX && ! defined HAVE_LIBPERFSTAT
+# define LOAD_AVE_TYPE long
+# endif
+
+# ifdef convex
+# define LOAD_AVE_TYPE double
+# ifndef LDAV_CVT
+# define LDAV_CVT(n) (n)
+# endif
+# endif
+
+# endif /* No LOAD_AVE_TYPE. */
+
+# ifdef OSF_ALPHA
+/* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
+ according to ghazi@noc.rutgers.edu. */
+# undef FSCALE
+# define FSCALE 1024.0
+# endif
+
+# if defined (alliant) && defined (i860) /* Alliant FX/2800 */
+/* <sys/param.h> defines an incorrect value for FSCALE on an
+ Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu. */
+# undef FSCALE
+# define FSCALE 100.0
+# endif
+
+
+# ifndef FSCALE
+
+/* SunOS and some others define FSCALE in sys/param.h. */
+
+# ifdef MORE_BSD
+# define FSCALE 2048.0
+# endif
+
+# if defined (MIPS) || defined (SVR4) || defined (decstation)
+# define FSCALE 256
+# endif
+
+# if defined (sgi) || defined (sequent)
+/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
+ above under #ifdef MIPS. But we want the sgi value. */
+# undef FSCALE
+# define FSCALE 1000.0
+# endif
+
+# if defined (ardent) && defined (titan)
+# define FSCALE 65536.0
+# endif
+
+# ifdef tek4300
+# define FSCALE 100.0
+# endif
+
+# if defined _AIX && !defined HAVE_LIBPERFSTAT
+# define FSCALE 65536.0
+# endif
+
+# endif /* Not FSCALE. */
+
+# if !defined (LDAV_CVT) && defined (FSCALE)
+# define LDAV_CVT(n) (((double) (n)) / FSCALE)
+# endif
+
+# ifndef NLIST_STRUCT
+# if HAVE_NLIST_H
+# define NLIST_STRUCT
+# endif
+# endif
+
+# if defined (sgi) || (defined (mips) && !defined (BSD))
+# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
+# endif
+
+
+# if !defined (KERNEL_FILE) && defined (sequent)
+# define KERNEL_FILE "/dynix"
+# endif
+
+# if !defined (KERNEL_FILE) && defined (hpux)
+# define KERNEL_FILE "/hp-ux"
+# endif
+
+# if !defined (KERNEL_FILE) && (defined (_SEQUENT_) || defined (MIPS) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (ardent) && defined (titan)))
+# define KERNEL_FILE "/unix"
+# endif
+
+
+# if !defined (LDAV_SYMBOL) && defined (alliant)
+# define LDAV_SYMBOL "_Loadavg"
+# endif
+
+# if !defined (LDAV_SYMBOL) && ((defined (hpux) && !defined (hp9000s300)) || defined (_SEQUENT_) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (ardent) && defined (titan)) || (defined (_AIX) && !defined(HAVE_LIBPERFSTAT)))
+# define LDAV_SYMBOL "avenrun"
+# endif
+
+# include <unistd.h>
+
+/* LOAD_AVE_TYPE should only get defined if we're going to use the
+ nlist method. */
+# if !defined (LOAD_AVE_TYPE) && (defined (BSD) || defined (LDAV_CVT) || defined (KERNEL_FILE) || defined (LDAV_SYMBOL))
+# define LOAD_AVE_TYPE double
+# endif
+
+# ifdef LOAD_AVE_TYPE
+
+# ifndef __VMS
+# ifndef __linux__
+# ifndef NLIST_STRUCT
+# include <a.out.h>
+# else /* NLIST_STRUCT */
+# include <nlist.h>
+# endif /* NLIST_STRUCT */
+
+# ifdef SUNOS_5
+# include <kvm.h>
+# include <kstat.h>
+# endif
+
+# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+# include <sys/pstat.h>
+# endif
+
+# ifndef KERNEL_FILE
+# define KERNEL_FILE "/vmunix"
+# endif /* KERNEL_FILE */
+
+# ifndef LDAV_SYMBOL
+# define LDAV_SYMBOL "_avenrun"
+# endif /* LDAV_SYMBOL */
+# endif /* __linux__ */
+
+# else /* __VMS */
+
+# ifndef eunice
+# include <iodef.h>
+# include <descrip.h>
+# else /* eunice */
+# include <vms/iodef.h>
+# endif /* eunice */
+# endif /* __VMS */
+
+# ifndef LDAV_CVT
+# define LDAV_CVT(n) ((double) (n))
+# endif /* !LDAV_CVT */
+
+# endif /* LOAD_AVE_TYPE */
+
+# if defined HAVE_LIBPERFSTAT
+# include <sys/protosw.h>
+# include <libperfstat.h>
+# include <sys/proc.h>
+# ifndef SBITS
+# define SBITS 16
+# endif
+# endif
+
+# if defined (__GNU__) && !defined (NeXT)
+/* Note that NeXT Openstep defines __GNU__ even though it should not. */
+/* GNU system acts much like NeXT, for load average purposes,
+ but not exactly. */
+# define NeXT
+# define host_self mach_host_self
+# endif
+
+# ifdef NeXT
+# ifdef HAVE_MACH_MACH_H
+# include <mach/mach.h>
+# else
+# include <mach.h>
+# endif
+# endif /* NeXT */
+
+# ifdef sgi
+# include <sys/sysmp.h>
+# endif /* sgi */
+
+# ifdef UMAX
+# include <signal.h>
+# include <sys/time.h>
+# include <sys/wait.h>
+# include <sys/syscall.h>
+
+# ifdef UMAX_43
+# include <machine/cpu.h>
+# include <inq_stats/statistics.h>
+# include <inq_stats/sysstats.h>
+# include <inq_stats/cpustats.h>
+# include <inq_stats/procstats.h>
+# else /* Not UMAX_43. */
+# include <sys/sysdefs.h>
+# include <sys/statistics.h>
+# include <sys/sysstats.h>
+# include <sys/cpudefs.h>
+# include <sys/cpustats.h>
+# include <sys/procstats.h>
+# endif /* Not UMAX_43. */
+# endif /* UMAX */
+
+# ifdef DGUX
+# include <sys/dg_sys_info.h>
+# endif
+
+# if (defined __linux__ || defined __CYGWIN__ || defined SUNOS_5 \
+ || (defined LOAD_AVE_TYPE && ! defined __VMS))
+# include <fcntl.h>
+# endif
+
+/* Avoid static vars inside a function since in HPUX they dump as pure. */
+
+# ifdef NeXT
+static processor_set_t default_set;
+static bool getloadavg_initialized;
+# endif /* NeXT */
+
+# ifdef UMAX
+static unsigned int cpus = 0;
+static unsigned int samples;
+# endif /* UMAX */
+
+# ifdef DGUX
+static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */
+# endif /* DGUX */
+
+# if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
+/* File descriptor open to /dev/kmem or VMS load ave driver. */
+static int channel;
+/* True if channel is valid. */
+static bool getloadavg_initialized;
+/* Offset in kmem to seek to read load average, or 0 means invalid. */
+static long offset;
+
+# if ! defined __VMS && ! defined sgi && ! defined __linux__
+static struct nlist name_list[2];
+# endif
+
+# ifdef SUNOS_5
+static kvm_t *kd;
+# endif /* SUNOS_5 */
+
+# endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
+
+/* Put the 1 minute, 5 minute and 15 minute load averages
+ into the first NELEM elements of LOADAVG.
+ Return the number written (never more than 3, but may be less than NELEM),
+ or -1 (setting errno) if an error occurred. */
+
+int
+getloadavg (double loadavg[], int nelem)
+{
+ int elem = 0; /* Return value. */
+
+# ifdef NO_GET_LOAD_AVG
+# define LDAV_DONE
+ errno = ENOSYS;
+ elem = -1;
+# endif
+
+# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT) /* Solaris <= 2.6 */
+/* Use libkstat because we don't have to be root. */
+# define LDAV_DONE
+ kstat_ctl_t *kc;
+ kstat_t *ksp;
+ kstat_named_t *kn;
+ int saved_errno;
+
+ kc = kstat_open ();
+ if (kc == 0)
+ return -1;
+ ksp = kstat_lookup (kc, "unix", 0, "system_misc");
+ if (ksp == 0)
+ return -1;
+ if (kstat_read (kc, ksp, 0) == -1)
+ return -1;
+
+
+ kn = kstat_data_lookup (ksp, "avenrun_1min");
+ if (kn == 0)
+ {
+ /* Return -1 if no load average information is available. */
+ nelem = 0;
+ elem = -1;
+ }
+
+ if (nelem >= 1)
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+ if (nelem >= 2)
+ {
+ kn = kstat_data_lookup (ksp, "avenrun_5min");
+ if (kn != 0)
+ {
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+ if (nelem >= 3)
+ {
+ kn = kstat_data_lookup (ksp, "avenrun_15min");
+ if (kn != 0)
+ loadavg[elem++] = (double) kn->value.ul / FSCALE;
+ }
+ }
+ }
+
+ saved_errno = errno;
+ kstat_close (kc);
+ errno = saved_errno;
+# endif /* HAVE_LIBKSTAT */
+
+# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+ /* HP-UX */
+/* Use pstat_getdynamic() because we don't have to be root. */
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+ struct pst_dynamic dyn_info;
+ if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
+ return -1;
+ if (nelem > 0)
+ loadavg[elem++] = dyn_info.psd_avg_1_min;
+ if (nelem > 1)
+ loadavg[elem++] = dyn_info.psd_avg_5_min;
+ if (nelem > 2)
+ loadavg[elem++] = dyn_info.psd_avg_15_min;
+
+# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
+
+# if ! defined LDAV_DONE && defined HAVE_LIBPERFSTAT /* AIX */
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+/* Use perfstat_cpu_total because we don't have to be root. */
+ {
+ perfstat_cpu_total_t cpu_stats;
+ int result = perfstat_cpu_total (NULL, &cpu_stats, sizeof cpu_stats, 1);
+ if (result == -1)
+ return result;
+ loadavg[0] = cpu_stats.loadavg[0] / (double)(1 << SBITS);
+ loadavg[1] = cpu_stats.loadavg[1] / (double)(1 << SBITS);
+ loadavg[2] = cpu_stats.loadavg[2] / (double)(1 << SBITS);
+ elem = 3;
+ }
+# endif
+
+# if !defined (LDAV_DONE) && (defined (__linux__) || defined (__CYGWIN__))
+ /* Linux without glibc, Cygwin */
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+# ifndef LINUX_LDAV_FILE
+# define LINUX_LDAV_FILE "/proc/loadavg"
+# endif
+
+ char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")];
+ char const *ptr = ldavgbuf;
+ int fd, count, saved_errno;
+
+ fd = open (LINUX_LDAV_FILE, O_RDONLY);
+ if (fd == -1)
+ return -1;
+ count = read (fd, ldavgbuf, sizeof ldavgbuf - 1);
+ saved_errno = errno;
+ (void) close (fd);
+ errno = saved_errno;
+ if (count <= 0)
+ return -1;
+ ldavgbuf[count] = '\0';
+
+ for (elem = 0; elem < nelem; elem++)
+ {
+ double numerator = 0;
+ double denominator = 1;
+
+ while (*ptr == ' ')
+ ptr++;
+
+ /* Finish if this number is missing, and report an error if all
+ were missing. */
+ if (! ('0' <= *ptr && *ptr <= '9'))
+ {
+ if (elem == 0)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+ break;
+ }
+
+ while ('0' <= *ptr && *ptr <= '9')
+ numerator = 10 * numerator + (*ptr++ - '0');
+
+ if (*ptr == '.')
+ for (ptr++; '0' <= *ptr && *ptr <= '9'; ptr++)
+ numerator = 10 * numerator + (*ptr - '0'), denominator *= 10;
+
+ loadavg[elem++] = numerator / denominator;
+ }
+
+ return elem;
+
+# endif /* __linux__ || __CYGWIN__ */
+
+# if !defined (LDAV_DONE) && defined (__NetBSD__) /* NetBSD < 0.9 */
+# define LDAV_DONE
+# undef LOAD_AVE_TYPE
+
+# ifndef NETBSD_LDAV_FILE
+# define NETBSD_LDAV_FILE "/kern/loadavg"
+# endif
+
+ unsigned long int load_ave[3], scale;
+ int count;
+ FILE *fp;
+
+ fp = fopen (NETBSD_LDAV_FILE, "r");
+ if (fp == NULL)
+ return -1;
+ count = fscanf (fp, "%lu %lu %lu %lu\n",
+ &load_ave[0], &load_ave[1], &load_ave[2],
+ &scale);
+ (void) fclose (fp);
+ if (count != 4)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+
+ for (elem = 0; elem < nelem; elem++)
+ loadavg[elem] = (double) load_ave[elem] / (double) scale;
+
+ return elem;
+
+# endif /* __NetBSD__ */
+
+# if !defined (LDAV_DONE) && defined (NeXT) /* NeXTStep */
+# define LDAV_DONE
+ /* The NeXT code was adapted from iscreen 3.2. */
+
+ host_t host;
+ struct processor_set_basic_info info;
+ unsigned int info_count;
+
+ /* We only know how to get the 1-minute average for this system,
+ so even if the caller asks for more than 1, we only return 1. */
+
+ if (!getloadavg_initialized)
+ {
+ if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
+ getloadavg_initialized = true;
+ }
+
+ if (getloadavg_initialized)
+ {
+ info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
+ if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
+ (processor_set_info_t) &info, &info_count)
+ != KERN_SUCCESS)
+ getloadavg_initialized = false;
+ else
+ {
+ if (nelem > 0)
+ loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
+ }
+ }
+
+ if (!getloadavg_initialized)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+# endif /* NeXT */
+
+# if !defined (LDAV_DONE) && defined (UMAX)
+# define LDAV_DONE
+/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
+ have a /dev/kmem. Information about the workings of the running kernel
+ can be gathered with inq_stats system calls.
+ We only know how to get the 1-minute average for this system. */
+
+ struct proc_summary proc_sum_data;
+ struct stat_descr proc_info;
+ double load;
+ register unsigned int i, j;
+
+ if (cpus == 0)
+ {
+ register unsigned int c, i;
+ struct cpu_config conf;
+ struct stat_descr desc;
+
+ desc.sd_next = 0;
+ desc.sd_subsys = SUBSYS_CPU;
+ desc.sd_type = CPUTYPE_CONFIG;
+ desc.sd_addr = (char *) &conf;
+ desc.sd_size = sizeof conf;
+
+ if (inq_stats (1, &desc))
+ return -1;
+
+ c = 0;
+ for (i = 0; i < conf.config_maxclass; ++i)
+ {
+ struct class_stats stats;
+ memset (&stats, 0, sizeof stats);
+
+ desc.sd_type = CPUTYPE_CLASS;
+ desc.sd_objid = i;
+ desc.sd_addr = (char *) &stats;
+ desc.sd_size = sizeof stats;
+
+ if (inq_stats (1, &desc))
+ return -1;
+
+ c += stats.class_numcpus;
+ }
+ cpus = c;
+ samples = cpus < 2 ? 3 : (2 * cpus / 3);
+ }
+
+ proc_info.sd_next = 0;
+ proc_info.sd_subsys = SUBSYS_PROC;
+ proc_info.sd_type = PROCTYPE_SUMMARY;
+ proc_info.sd_addr = (char *) &proc_sum_data;
+ proc_info.sd_size = sizeof (struct proc_summary);
+ proc_info.sd_sizeused = 0;
+
+ if (inq_stats (1, &proc_info) != 0)
+ return -1;
+
+ load = proc_sum_data.ps_nrunnable;
+ j = 0;
+ for (i = samples - 1; i > 0; --i)
+ {
+ load += proc_sum_data.ps_nrun[j];
+ if (j++ == PS_NRUNSIZE)
+ j = 0;
+ }
+
+ if (nelem > 0)
+ loadavg[elem++] = load / samples / cpus;
+# endif /* UMAX */
+
+# if !defined (LDAV_DONE) && defined (DGUX)
+# define LDAV_DONE
+ /* This call can return -1 for an error, but with good args
+ it's not supposed to fail. The first argument is for no
+ apparent reason of type `long int *'. */
+ dg_sys_info ((long int *) &load_info,
+ DG_SYS_INFO_LOAD_INFO_TYPE,
+ DG_SYS_INFO_LOAD_VERSION_0);
+
+ if (nelem > 0)
+ loadavg[elem++] = load_info.one_minute;
+ if (nelem > 1)
+ loadavg[elem++] = load_info.five_minute;
+ if (nelem > 2)
+ loadavg[elem++] = load_info.fifteen_minute;
+# endif /* DGUX */
+
+# if !defined (LDAV_DONE) && defined (apollo)
+# define LDAV_DONE
+/* Apollo code from lisch@mentorg.com (Ray Lischner).
+
+ This system call is not documented. The load average is obtained as
+ three long integers, for the load average over the past minute,
+ five minutes, and fifteen minutes. Each value is a scaled integer,
+ with 16 bits of integer part and 16 bits of fraction part.
+
+ I'm not sure which operating system first supported this system call,
+ but I know that SR10.2 supports it. */
+
+ extern void proc1_$get_loadav ();
+ unsigned long load_ave[3];
+
+ proc1_$get_loadav (load_ave);
+
+ if (nelem > 0)
+ loadavg[elem++] = load_ave[0] / 65536.0;
+ if (nelem > 1)
+ loadavg[elem++] = load_ave[1] / 65536.0;
+ if (nelem > 2)
+ loadavg[elem++] = load_ave[2] / 65536.0;
+# endif /* apollo */
+
+# if !defined (LDAV_DONE) && defined (OSF_MIPS)
+# define LDAV_DONE
+
+ struct tbl_loadavg load_ave;
+ table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+ loadavg[elem++]
+ = (load_ave.tl_lscale == 0
+ ? load_ave.tl_avenrun.d[0]
+ : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
+# endif /* OSF_MIPS */
+
+# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
+ /* DJGPP */
+# define LDAV_DONE
+
+ /* A faithful emulation is going to have to be saved for a rainy day. */
+ for ( ; elem < nelem; elem++)
+ {
+ loadavg[elem] = 0.0;
+ }
+# endif /* __MSDOS__ || WINDOWS32 */
+
+# if !defined (LDAV_DONE) && defined (OSF_ALPHA) /* OSF/1 */
+# define LDAV_DONE
+
+ struct tbl_loadavg load_ave;
+ table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+ for (elem = 0; elem < nelem; elem++)
+ loadavg[elem]
+ = (load_ave.tl_lscale == 0
+ ? load_ave.tl_avenrun.d[elem]
+ : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
+# endif /* OSF_ALPHA */
+
+# if ! defined LDAV_DONE && defined __VMS /* VMS */
+ /* VMS specific code -- read from the Load Ave driver. */
+
+ LOAD_AVE_TYPE load_ave[3];
+ static bool getloadavg_initialized;
+# ifdef eunice
+ struct
+ {
+ int dsc$w_length;
+ char *dsc$a_pointer;
+ } descriptor;
+# endif
+
+ /* Ensure that there is a channel open to the load ave device. */
+ if (!getloadavg_initialized)
+ {
+ /* Attempt to open the channel. */
+# ifdef eunice
+ descriptor.dsc$w_length = 18;
+ descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
+# else
+ $DESCRIPTOR (descriptor, "LAV0:");
+# endif
+ if (sys$assign (&descriptor, &channel, 0, 0) & 1)
+ getloadavg_initialized = true;
+ }
+
+ /* Read the load average vector. */
+ if (getloadavg_initialized
+ && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
+ load_ave, 12, 0, 0, 0, 0) & 1))
+ {
+ sys$dassgn (channel);
+ getloadavg_initialized = false;
+ }
+
+ if (!getloadavg_initialized)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+# endif /* ! defined LDAV_DONE && defined __VMS */
+
+# if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS
+ /* IRIX, other old systems */
+
+ /* UNIX-specific code -- read the average from /dev/kmem. */
+
+# define LDAV_PRIVILEGED /* This code requires special installation. */
+
+ LOAD_AVE_TYPE load_ave[3];
+
+ /* Get the address of LDAV_SYMBOL. */
+ if (offset == 0)
+ {
+# ifndef sgi
+# if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
+ strcpy (name_list[0].n_name, LDAV_SYMBOL);
+ strcpy (name_list[1].n_name, "");
+# else /* NLIST_STRUCT */
+# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+ name_list[0].n_un.n_name = LDAV_SYMBOL;
+ name_list[1].n_un.n_name = 0;
+# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+ name_list[0].n_name = LDAV_SYMBOL;
+ name_list[1].n_name = 0;
+# endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+# endif /* NLIST_STRUCT */
+
+# ifndef SUNOS_5
+ if (
+# if !(defined (_AIX) && !defined (ps2))
+ nlist (KERNEL_FILE, name_list)
+# else /* _AIX */
+ knlist (name_list, 1, sizeof (name_list[0]))
+# endif
+ >= 0)
+ /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i. */
+ {
+# ifdef FIXUP_KERNEL_SYMBOL_ADDR
+ FIXUP_KERNEL_SYMBOL_ADDR (name_list);
+# endif
+ offset = name_list[0].n_value;
+ }
+# endif /* !SUNOS_5 */
+# else /* sgi */
+ ptrdiff_t ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
+ if (ldav_off != -1)
+ offset = (long int) ldav_off & 0x7fffffff;
+# endif /* sgi */
+ }
+
+ /* Make sure we have /dev/kmem open. */
+ if (!getloadavg_initialized)
+ {
+# ifndef SUNOS_5
+ /* Set the channel to close on exec, so it does not
+ litter any child's descriptor table. */
+# ifndef O_CLOEXEC
+# define O_CLOEXEC 0
+# endif
+ int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC);
+ if (0 <= fd)
+ {
+# if F_DUPFD_CLOEXEC
+ if (fd <= STDERR_FILENO)
+ {
+ int fd1 = fcntl (fd, F_DUPFD_CLOEXEC, STDERR_FILENO + 1);
+ close (fd);
+ fd = fd1;
+ }
+# endif
+ if (0 <= fd)
+ {
+ channel = fd;
+ getloadavg_initialized = true;
+ }
+ }
+# else /* SUNOS_5 */
+ /* We pass 0 for the kernel, corefile, and swapfile names
+ to use the currently running kernel. */
+ kd = kvm_open (0, 0, 0, O_RDONLY, 0);
+ if (kd != 0)
+ {
+ /* nlist the currently running kernel. */
+ kvm_nlist (kd, name_list);
+ offset = name_list[0].n_value;
+ getloadavg_initialized = true;
+ }
+# endif /* SUNOS_5 */
+ }
+
+ /* If we can, get the load average values. */
+ if (offset && getloadavg_initialized)
+ {
+ /* Try to read the load. */
+# ifndef SUNOS_5
+ if (lseek (channel, offset, 0) == -1L
+ || read (channel, (char *) load_ave, sizeof (load_ave))
+ != sizeof (load_ave))
+ {
+ close (channel);
+ getloadavg_initialized = false;
+ }
+# else /* SUNOS_5 */
+ if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
+ != sizeof (load_ave))
+ {
+ kvm_close (kd);
+ getloadavg_initialized = false;
+ }
+# endif /* SUNOS_5 */
+ }
+
+ if (offset == 0 || !getloadavg_initialized)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+# endif /* ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS */
+
+# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */
+ if (nelem > 0)
+ loadavg[elem++] = LDAV_CVT (load_ave[0]);
+ if (nelem > 1)
+ loadavg[elem++] = LDAV_CVT (load_ave[1]);
+ if (nelem > 2)
+ loadavg[elem++] = LDAV_CVT (load_ave[2]);
+
+# define LDAV_DONE
+# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
+
+# if !defined LDAV_DONE
+ errno = ENOSYS;
+ elem = -1;
+# endif
+ return elem;
+}
diff --git a/gnulib/lib/getlogin.c b/gnulib/lib/getlogin.c
new file mode 100644
index 0000000..56662b0
--- /dev/null
+++ b/gnulib/lib/getlogin.c
@@ -0,0 +1,41 @@
+/* Provide a working getlogin for systems which lack it.
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible, 2010. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+char *
+getlogin (void)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ static char login_name[1024];
+ DWORD sz = sizeof (login_name);
+
+ if (GetUserName (login_name, &sz))
+ return login_name;
+#endif
+ return NULL;
+}
diff --git a/gnulib/lib/getlogin_r.c b/gnulib/lib/getlogin_r.c
new file mode 100644
index 0000000..096a1fe
--- /dev/null
+++ b/gnulib/lib/getlogin_r.c
@@ -0,0 +1,88 @@
+/* Provide a working getlogin_r for systems which lack it.
+
+ Copyright (C) 2005-2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert, Derek Price, and Bruno Haible. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#else
+# if !HAVE_DECL_GETLOGIN
+extern char *getlogin (void);
+# endif
+#endif
+
+/* See unistd.in.h for documentation. */
+int
+getlogin_r (char *name, size_t size)
+{
+#undef getlogin_r
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Native Windows platform. */
+ DWORD sz;
+
+ /* When size > 0x7fff, the doc says that GetUserName will fail.
+ Actually, on Windows XP SP3, it succeeds. But let's be safe,
+ for the sake of older Windows versions. */
+ if (size > 0x7fff)
+ size = 0x7fff;
+ sz = size;
+ if (!GetUserName (name, &sz))
+ {
+ if (GetLastError () == ERROR_INSUFFICIENT_BUFFER)
+ /* In this case, the doc says that sz contains the required size, but
+ actually, on Windows XP SP3, it contains 2 * the required size. */
+ return ERANGE;
+ else
+ return ENOENT;
+ }
+ return 0;
+#elif HAVE_GETLOGIN_R
+ /* Platform with a getlogin_r() function. */
+ int ret = getlogin_r (name, size);
+
+ if (ret == 0 && memchr (name, '\0', size) == NULL)
+ /* name contains a truncated result. */
+ return ERANGE;
+ return ret;
+#else
+ /* Platform with a getlogin() function. */
+ char *n;
+ size_t nlen;
+
+ errno = 0;
+ n = getlogin ();
+ if (!n)
+ /* ENOENT is a reasonable errno value if getlogin returns NULL. */
+ return (errno != 0 ? errno : ENOENT);
+
+ nlen = strlen (n);
+ if (size <= nlen)
+ return ERANGE;
+ memcpy (name, n, nlen + 1);
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/getndelim2.c b/gnulib/lib/getndelim2.c
new file mode 100644
index 0000000..fcdf7df
--- /dev/null
+++ b/gnulib/lib/getndelim2.c
@@ -0,0 +1,217 @@
+/* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters,
+ with bounded memory allocation.
+
+ Copyright (C) 1993, 1996-1998, 2000, 2003-2004, 2006, 2008-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Originally written by Jan Brittenson, bson@gnu.ai.mit.edu. */
+
+#include <config.h>
+
+#include "getndelim2.h"
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+#if !HAVE_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+#endif
+#if !HAVE_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+#endif
+
+#include <limits.h>
+#include <stdint.h>
+
+#include "freadptr.h"
+#include "freadseek.h"
+#include "memchr2.h"
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* The maximum value that getndelim2 can return without suffering from
+ overflow problems, either internally (because of pointer
+ subtraction overflow) or due to the API (because of ssize_t). */
+#define GETNDELIM2_MAXIMUM (PTRDIFF_MAX < SSIZE_MAX ? PTRDIFF_MAX : SSIZE_MAX)
+
+/* Try to add at least this many bytes when extending the buffer.
+ MIN_CHUNK must be no greater than GETNDELIM2_MAXIMUM. */
+#define MIN_CHUNK 64
+
+ssize_t
+getndelim2 (char **lineptr, size_t *linesize, size_t offset, size_t nmax,
+ int delim1, int delim2, FILE *stream)
+{
+ size_t nbytes_avail; /* Allocated but unused bytes in *LINEPTR. */
+ char *read_pos; /* Where we're reading into *LINEPTR. */
+ ssize_t bytes_stored = -1;
+ char *ptr = *lineptr;
+ size_t size = *linesize;
+ bool found_delimiter;
+
+ if (!ptr)
+ {
+ size = nmax < MIN_CHUNK ? nmax : MIN_CHUNK;
+ ptr = malloc (size);
+ if (!ptr)
+ return -1;
+ }
+
+ if (size < offset)
+ goto done;
+
+ nbytes_avail = size - offset;
+ read_pos = ptr + offset;
+
+ if (nbytes_avail == 0 && nmax <= size)
+ goto done;
+
+ /* Normalize delimiters, since memchr2 doesn't handle EOF. */
+ if (delim1 == EOF)
+ delim1 = delim2;
+ else if (delim2 == EOF)
+ delim2 = delim1;
+
+ flockfile (stream);
+
+ found_delimiter = false;
+ do
+ {
+ /* Here always ptr + size == read_pos + nbytes_avail.
+ Also nbytes_avail > 0 || size < nmax. */
+
+ int c IF_LINT (= 0);
+ const char *buffer;
+ size_t buffer_len;
+
+ buffer = freadptr (stream, &buffer_len);
+ if (buffer)
+ {
+ if (delim1 != EOF)
+ {
+ const char *end = memchr2 (buffer, delim1, delim2, buffer_len);
+ if (end)
+ {
+ buffer_len = end - buffer + 1;
+ found_delimiter = true;
+ }
+ }
+ }
+ else
+ {
+ c = getc (stream);
+ if (c == EOF)
+ {
+ /* Return partial line, if any. */
+ if (read_pos == ptr)
+ goto unlock_done;
+ else
+ break;
+ }
+ if (c == delim1 || c == delim2)
+ found_delimiter = true;
+ buffer_len = 1;
+ }
+
+ /* We always want at least one byte left in the buffer, since we
+ always (unless we get an error while reading the first byte)
+ NUL-terminate the line buffer. */
+
+ if (nbytes_avail < buffer_len + 1 && size < nmax)
+ {
+ /* Grow size proportionally, not linearly, to avoid O(n^2)
+ running time. */
+ size_t newsize = size < MIN_CHUNK ? size + MIN_CHUNK : 2 * size;
+ char *newptr;
+
+ /* Increase newsize so that it becomes
+ >= (read_pos - ptr) + buffer_len. */
+ if (newsize - (read_pos - ptr) < buffer_len + 1)
+ newsize = (read_pos - ptr) + buffer_len + 1;
+ /* Respect nmax. This handles possible integer overflow. */
+ if (! (size < newsize && newsize <= nmax))
+ newsize = nmax;
+
+ if (GETNDELIM2_MAXIMUM < newsize - offset)
+ {
+ size_t newsizemax = offset + GETNDELIM2_MAXIMUM + 1;
+ if (size == newsizemax)
+ goto unlock_done;
+ newsize = newsizemax;
+ }
+
+ nbytes_avail = newsize - (read_pos - ptr);
+ newptr = realloc (ptr, newsize);
+ if (!newptr)
+ goto unlock_done;
+ ptr = newptr;
+ size = newsize;
+ read_pos = size - nbytes_avail + ptr;
+ }
+
+ /* Here, if size < nmax, nbytes_avail >= buffer_len + 1.
+ If size == nmax, nbytes_avail > 0. */
+
+ if (1 < nbytes_avail)
+ {
+ size_t copy_len = nbytes_avail - 1;
+ if (buffer_len < copy_len)
+ copy_len = buffer_len;
+ if (buffer)
+ memcpy (read_pos, buffer, copy_len);
+ else
+ *read_pos = c;
+ read_pos += copy_len;
+ nbytes_avail -= copy_len;
+ }
+
+ /* Here still nbytes_avail > 0. */
+
+ if (buffer && freadseek (stream, buffer_len))
+ goto unlock_done;
+ }
+ while (!found_delimiter);
+
+ /* Done - NUL terminate and return the number of bytes read.
+ At this point we know that nbytes_avail >= 1. */
+ *read_pos = '\0';
+
+ bytes_stored = read_pos - (ptr + offset);
+
+ unlock_done:
+ funlockfile (stream);
+
+ done:
+ *lineptr = ptr;
+ *linesize = size;
+ return bytes_stored ? bytes_stored : -1;
+}
diff --git a/gnulib/lib/getndelim2.h b/gnulib/lib/getndelim2.h
new file mode 100644
index 0000000..0824174
--- /dev/null
+++ b/gnulib/lib/getndelim2.h
@@ -0,0 +1,42 @@
+/* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters,
+ with bounded memory allocation.
+
+ Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GETNDELIM2_H
+#define GETNDELIM2_H 1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#define GETNLINE_NO_LIMIT ((size_t) -1)
+
+/* Read into a buffer *LINEPTR returned from malloc (or NULL),
+ pointing to *LINESIZE bytes of space. Store the input bytes
+ starting at *LINEPTR + OFFSET, and null-terminate them. Reallocate
+ the buffer as necessary, but if NMAX is not GETNLINE_NO_LIMIT
+ then do not allocate more than NMAX bytes; if the line is longer
+ than that, read and discard the extra bytes. Stop reading after
+ the first occurrence of DELIM1 or DELIM2, whichever comes first;
+ a delimiter equal to EOF stands for no delimiter. Read the
+ input bytes from STREAM.
+ Return the number of bytes read and stored at *LINEPTR + OFFSET (not
+ including the NUL terminator), or -1 on error or EOF. */
+extern ssize_t getndelim2 (char **lineptr, size_t *linesize, size_t offset,
+ size_t nmax, int delim1, int delim2,
+ FILE *stream);
+
+#endif /* GETNDELIM2_H */
diff --git a/gnulib/lib/getnline.c b/gnulib/lib/getnline.c
new file mode 100644
index 0000000..be1296f
--- /dev/null
+++ b/gnulib/lib/getnline.c
@@ -0,0 +1,36 @@
+/* getnline - Read a line from a stream, with bounded memory allocation.
+
+ Copyright (C) 2003-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "getnline.h"
+
+#include "getndelim2.h"
+
+ssize_t
+getndelim (char **lineptr, size_t *linesize, size_t nmax,
+ int delimiter, FILE *stream)
+{
+ return getndelim2 (lineptr, linesize, 0, nmax, delimiter, EOF, stream);
+}
+
+ssize_t
+getnline (char **lineptr, size_t *linesize, size_t nmax, FILE *stream)
+{
+ return getndelim (lineptr, linesize, nmax, '\n', stream);
+}
diff --git a/gnulib/lib/getnline.h b/gnulib/lib/getnline.h
new file mode 100644
index 0000000..34534a2
--- /dev/null
+++ b/gnulib/lib/getnline.h
@@ -0,0 +1,47 @@
+/* getnline - Read a line from a stream, with bounded memory allocation.
+
+ Copyright (C) 2003-2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GETNLINE_H
+#define GETNLINE_H 1
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#define GETNLINE_NO_LIMIT ((size_t) -1)
+
+/* Read a line, up to the next newline, from STREAM, and store it in *LINEPTR.
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary. Reallocation is limited to
+ NMAX bytes; if the line is longer than that, the extra bytes are read but
+ thrown away.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getnline (char **lineptr, size_t *linesize, size_t nmax,
+ FILE *stream);
+
+/* Read a line, up to the next occurrence of DELIMITER, from STREAM, and store
+ it in *LINEPTR.
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary. Reallocation is limited to
+ NMAX bytes; if the line is longer than that, the extra bytes are read but
+ thrown away.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+extern ssize_t getndelim (char **lineptr, size_t *linesize, size_t nmax,
+ int delimiter, FILE *stream);
+
+#endif /* GETNLINE_H */
diff --git a/gnulib/lib/getopt.c b/gnulib/lib/getopt.c
new file mode 100644
index 0000000..7c9f704
--- /dev/null
+++ b/gnulib/lib/getopt.c
@@ -0,0 +1,1245 @@
+/* Getopt for GNU.
+ NOTE: getopt is part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to drepper@gnu.org
+ before changing it!
+ Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getopt.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt_long' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Using `getopt' or setting the environment variable POSIXLY_CORRECT
+ disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt_int.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* 1003.2 says this must be 1 before any call. */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data. */
+
+static struct _getopt_data getopt_data;
+
+
+#if defined HAVE_DECL_GETENV && !HAVE_DECL_GETENV
+extern char *getenv ();
+#endif
+
+#ifdef _LIBC
+/* Stored original parameters.
+ XXX This is no good solution. We should rather copy the args so
+ that we can compare them later. But we must not use malloc(3). */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+ indicating ARGV elements that should not be considered arguments. */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+# define SWAP_FLAGS(ch1, ch2) \
+ if (d->__nonoption_flags_len > 0) \
+ { \
+ char __tmp = __getopt_nonoption_flags[ch1]; \
+ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
+ __getopt_nonoption_flags[ch2] = __tmp; \
+ }
+# else
+# define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+ int bottom = d->__first_nonopt;
+ int middle = d->__last_nonopt;
+ int top = d->optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ /* First make sure the handling of the `__getopt_nonoption_flags'
+ string can work normally. Our top argument must be in the range
+ of the string. */
+ if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+ {
+ /* We must extend the array. The user plays games with us and
+ presents new arguments. */
+ char *new_str = malloc (top + 1);
+ if (new_str == NULL)
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+ else
+ {
+ memset (__mempcpy (new_str, __getopt_nonoption_flags,
+ d->__nonoption_flags_max_len),
+ '\0', top + 1 - d->__nonoption_flags_max_len);
+ d->__nonoption_flags_max_len = top + 1;
+ __getopt_nonoption_flags = new_str;
+ }
+ }
+#endif
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ SWAP_FLAGS (bottom + i, middle + i);
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ d->__first_nonopt += (d->optind - d->__last_nonopt);
+ d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (int argc _GL_UNUSED,
+ char **argv _GL_UNUSED, const char *optstring,
+ struct _getopt_data *d, int posixly_correct)
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+
+ d->__nextchar = NULL;
+
+ d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT");
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ d->__ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ d->__ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (d->__posixly_correct)
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ if (!d->__posixly_correct
+ && argc == __libc_argc && argv == __libc_argv)
+ {
+ if (d->__nonoption_flags_max_len == 0)
+ {
+ if (__getopt_nonoption_flags == NULL
+ || __getopt_nonoption_flags[0] == '\0')
+ d->__nonoption_flags_max_len = -1;
+ else
+ {
+ const char *orig_str = __getopt_nonoption_flags;
+ int len = d->__nonoption_flags_max_len = strlen (orig_str);
+ if (d->__nonoption_flags_max_len < argc)
+ d->__nonoption_flags_max_len = argc;
+ __getopt_nonoption_flags =
+ (char *) malloc (d->__nonoption_flags_max_len);
+ if (__getopt_nonoption_flags == NULL)
+ d->__nonoption_flags_max_len = -1;
+ else
+ memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+ '\0', d->__nonoption_flags_max_len - len);
+ }
+ }
+ d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+ }
+ else
+ d->__nonoption_flags_len = 0;
+#endif
+
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns -1.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal_r (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, struct _getopt_data *d, int posixly_correct)
+{
+ int print_errors = d->opterr;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ {
+ if (d->optind == 0)
+ d->optind = 1; /* Don't scan ARGV[0], the program name. */
+ optstring = _getopt_initialize (argc, argv, optstring, d,
+ posixly_correct);
+ d->__initialized = 1;
+ }
+ else if (optstring[0] == '-' || optstring[0] == '+')
+ optstring++;
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ /* Test whether ARGV[optind] points to a non-option argument.
+ Either it does not have option syntax, or there is an environment flag
+ from the shell indicating it is not an option. The later information
+ is only used when the used in the GNU libc. */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+ || (d->optind < d->__nonoption_flags_len \
+ && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+ if (d->__nextchar == NULL || *d->__nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ moved back by the user (who may also have changed the arguments). */
+ if (d->__last_nonopt > d->optind)
+ d->__last_nonopt = d->optind;
+ if (d->__first_nonopt > d->optind)
+ d->__first_nonopt = d->optind;
+
+ if (d->__ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__last_nonopt != d->optind)
+ d->__first_nonopt = d->optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (d->optind < argc && NONOPTION_P)
+ d->optind++;
+ d->__last_nonopt = d->optind;
+ }
+
+ /* The special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+ {
+ d->optind++;
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange ((char **) argv, d);
+ else if (d->__first_nonopt == d->__last_nonopt)
+ d->__first_nonopt = d->optind;
+ d->__last_nonopt = argc;
+
+ d->optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (d->optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (d->__first_nonopt != d->__last_nonopt)
+ d->optind = d->__first_nonopt;
+ return -1;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if (NONOPTION_P)
+ {
+ if (d->__ordering == REQUIRE_ORDER)
+ return -1;
+ d->optarg = argv[d->optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Skip the initial punctuation. */
+
+ d->__nextchar = (argv[d->optind] + 1
+ + (longopts != NULL && argv[d->optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an abbreviation of
+ the long option, just like "--fu", and not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+
+ if (longopts != NULL
+ && (argv[d->optind][1] == '-'
+ || (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))))
+ {
+ char *nameend;
+ unsigned int namelen;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ struct option_list
+ {
+ const struct option *p;
+ struct option_list *next;
+ } *ambig_list = NULL;
+ int exact = 0;
+ int indfound = -1;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+ namelen = nameend - d->__nextchar;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, namelen))
+ {
+ if (namelen == (unsigned int) strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ {
+ /* Second or later nonexact match found. */
+ struct option_list *newp = malloc (sizeof (*newp));
+ newp->p = p;
+ newp->next = ambig_list;
+ ambig_list = newp;
+ }
+ }
+
+ if (ambig_list != NULL && !exact)
+ {
+ if (print_errors)
+ {
+ struct option_list first;
+ first.p = pfound;
+ first.next = ambig_list;
+ ambig_list = &first;
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf = NULL;
+ size_t buflen = 0;
+
+ FILE *fp = open_memstream (&buf, &buflen);
+ if (fp != NULL)
+ {
+ fprintf (fp,
+ _("%s: option '%s' is ambiguous; possibilities:"),
+ argv[0], argv[d->optind]);
+
+ do
+ {
+ fprintf (fp, " '--%s'", ambig_list->p->name);
+ ambig_list = ambig_list->next;
+ }
+ while (ambig_list != NULL);
+
+ fputc_unlocked ('\n', fp);
+
+ if (__builtin_expect (fclose (fp) != EOF, 1))
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '%s' is ambiguous; possibilities:"),
+ argv[0], argv[d->optind]);
+ do
+ {
+ fprintf (stderr, " '--%s'", ambig_list->p->name);
+ ambig_list = ambig_list->next;
+ }
+ while (ambig_list != NULL);
+
+ fputc ('\n', stderr);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ while (ambig_list != NULL)
+ {
+ struct option_list *pn = ambig_list->next;
+ free (ambig_list);
+ ambig_list = pn;
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ d->optind++;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind - 1][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#else
+ fprintf (stderr, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+ argv[0], argv[d->optind - 1][0],
+ pfound->name);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '--%s' requires an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option '--%s' requires an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+ if (argv[d->optind][1] == '-')
+ {
+ /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
+ argv[0], d->__nextchar);
+#endif
+ }
+ else
+ {
+ /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#else
+ fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
+ argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+ }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->__nextchar = (char *) "";
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ const char *temp = strchr (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*d->__nextchar == '\0')
+ ++d->optind;
+
+ if (temp == NULL || c == ':' || c == ';')
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+ int n;
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"),
+ argv[0], c);
+#else
+ fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+ if (n >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#endif
+ }
+ d->optopt = c;
+ return '?';
+ }
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';')
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound = 0;
+ int option_index;
+
+ if (longopts == NULL)
+ goto no_longs;
+
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ /* We already incremented `d->optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+
+ /* optarg is now the argument, see if it's in the
+ table of longopts. */
+
+ for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+ nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+ {
+ if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+ if (ambig && !exact)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], d->optarg) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
+ argv[0], d->optarg);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ return '?';
+ }
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+
+ d->__nextchar += strlen (d->__nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option '-W %s' requires an argument\n"),
+ argv[0], pfound->name) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2
+ |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr, _("\
+%s: option '-W %s' requires an argument\n"),
+ argv[0], pfound->name);
+#endif
+ }
+ d->__nextchar += strlen (d->__nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar += strlen (d->__nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ no_longs:
+ d->__nextchar = NULL;
+ return 'W'; /* Let the application handle it. */
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ d->optind++;
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ {
+#if defined _LIBC && defined USE_IN_LIBIO
+ char *buf;
+
+ if (__asprintf (&buf, _("\
+%s: option requires an argument -- '%c'\n"),
+ argv[0], c) >= 0)
+ {
+ _IO_flockfile (stderr);
+
+ int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+ ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+ __fxprintf (NULL, "%s", buf);
+
+ ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+ _IO_funlockfile (stderr);
+
+ free (buf);
+ }
+#else
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+#endif
+ }
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+ d->__nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+_getopt_internal (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind, int long_only,
+ int posixly_correct)
+{
+ int result;
+
+ getopt_data.optind = optind;
+ getopt_data.opterr = opterr;
+
+ result = _getopt_internal_r (argc, argv, optstring, longopts,
+ longind, long_only, &getopt_data,
+ posixly_correct);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+/* glibc gets a LSB-compliant getopt.
+ Standalone applications get a POSIX-compliant getopt. */
+#if _LIBC
+enum { POSIXLY_CORRECT = 0 };
+#else
+enum { POSIXLY_CORRECT = 1 };
+#endif
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, (char **) argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0, POSIXLY_CORRECT);
+}
+
+#ifdef _LIBC
+int
+__posix_getopt (int argc, char *const *argv, const char *optstring)
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0, 1);
+}
+#endif
+
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/getopt.in.h b/gnulib/lib/getopt.in.h
new file mode 100644
index 0000000..0f3918a
--- /dev/null
+++ b/gnulib/lib/getopt.in.h
@@ -0,0 +1,253 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_GETOPT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. We must
+ also inform the replacement unistd.h to not recursively use
+ <getopt.h>; our definitions will be present soon enough. */
+#if @HAVE_GETOPT_H@
+# define _GL_SYSTEM_GETOPT
+# @INCLUDE_NEXT@ @NEXT_GETOPT_H@
+# undef _GL_SYSTEM_GETOPT
+#endif
+
+#ifndef _@GUARD_PREFIX@_GETOPT_H
+
+#ifndef __need_getopt
+# define _@GUARD_PREFIX@_GETOPT_H 1
+#endif
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in this header. When this happens, include the
+ headers that might declare getopt so that they will not cause
+ confusion if included after this file (if the system had <getopt.h>,
+ we have already included it). Then systematically rename
+ identifiers so that they do not collide with the system functions
+ and variables. Renaming avoids problems with some compilers and
+ linkers. */
+#if defined __GETOPT_PREFIX && !defined __need_getopt
+# if !@HAVE_GETOPT_H@
+# include <stdlib.h>
+# include <stdio.h>
+# include <unistd.h>
+# endif
+# undef __need_getopt
+# undef getopt
+# undef getopt_long
+# undef getopt_long_only
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# undef option
+# define __GETOPT_CONCAT(x, y) x ## y
+# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
+# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
+# define getopt __GETOPT_ID (getopt)
+# define getopt_long __GETOPT_ID (getopt_long)
+# define getopt_long_only __GETOPT_ID (getopt_long_only)
+# define optarg __GETOPT_ID (optarg)
+# define opterr __GETOPT_ID (opterr)
+# define optind __GETOPT_ID (optind)
+# define optopt __GETOPT_ID (optopt)
+# define option __GETOPT_ID (option)
+# define _getopt_internal __GETOPT_ID (getopt_internal)
+#endif
+
+/* Standalone applications get correct prototypes for getopt_long and
+ getopt_long_only; they declare "char **argv". libc uses prototypes
+ with "char *const *argv" that are incorrect because getopt_long and
+ getopt_long_only can permute argv; this is required for backward
+ compatibility (e.g., for LSB 2.0.1).
+
+ This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
+ but it caused redefinition warnings if both unistd.h and getopt.h were
+ included, since unistd.h includes getopt.h having previously defined
+ __need_getopt.
+
+ The only place where __getopt_argv_const is used is in definitions
+ of getopt_long and getopt_long_only below, but these are visible
+ only if __need_getopt is not defined, so it is quite safe to rewrite
+ the conditional as follows:
+*/
+#if !defined __need_getopt
+# if defined __GETOPT_PREFIX
+# define __getopt_argv_const /* empty */
+# else
+# define __getopt_argv_const const
+# endif
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+ standalone, or this is the first header included in the source file.
+ If we are being used with glibc, we need to include <features.h>, but
+ that does not exist if we are standalone. So: if __GNU_LIBRARY__ is
+ not defined, include <ctype.h>, which will pull in <features.h> for us
+ if it's from glibc. (Why ctype.h? It's guaranteed to exist and it
+ doesn't flood the namespace with stuff the way some other headers do.) */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+# define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+# if !GNULIB_defined_struct_option
+struct option
+{
+ const char *name;
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+# define GNULIB_defined_struct_option 1
+# endif
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+# define no_argument 0
+# define required_argument 1
+# define optional_argument 2
+#endif /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+ arguments in ARGV (ARGC of them, minus the program name) for
+ options given in OPTS.
+
+ Return the option character from OPTS just read. Return -1 when
+ there are no more options. For unrecognized options, or options
+ missing arguments, `optopt' is set to the option letter, and '?' is
+ returned.
+
+ The OPTS string is a list of characters which are recognized option
+ letters, optionally followed by colons, specifying that that letter
+ takes an argument, to be placed in `optarg'.
+
+ If a letter in OPTS is followed by two colons, its argument is
+ optional. This behavior is specific to the GNU `getopt'.
+
+ The argument `--' causes premature termination of argument
+ scanning, explicitly telling `getopt' that there are no more
+ options.
+
+ If OPTS begins with `-', then non-option arguments are treated as
+ arguments to the option '\1'. This behavior is specific to the GNU
+ `getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in
+ the environment, then do not permute arguments. */
+
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations. */
+#undef __need_getopt
+
+#endif /* _@GUARD_PREFIX@_GETOPT_H */
+#endif /* _@GUARD_PREFIX@_GETOPT_H */
diff --git a/gnulib/lib/getopt1.c b/gnulib/lib/getopt1.c
new file mode 100644
index 0000000..3656802
--- /dev/null
+++ b/gnulib/lib/getopt1.c
@@ -0,0 +1,170 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include <config.h>
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 0, 0);
+}
+
+int
+_getopt_long_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 0, d, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (int argc, char *__getopt_argv_const *argv,
+ const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 1, 0);
+}
+
+int
+_getopt_long_only_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 1, d, 0);
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static const struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/getopt_int.h b/gnulib/lib/getopt_int.h
new file mode 100644
index 0000000..9f0c713
--- /dev/null
+++ b/gnulib/lib/getopt_int.h
@@ -0,0 +1,135 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+#include <getopt.h>
+
+extern int _getopt_internal (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, int __posixly_correct);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+ vectors at the same time. */
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters, or by calling getopt.
+
+ PERMUTE is the default. We permute the contents of ARGV as we
+ scan, so that eventually all the non-options are at the end.
+ This allows options to be given in any order, even with programs
+ that were not written to expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were
+ written to expect options and other ARGV-elements in any order
+ and that care about the ordering of the two. We describe each
+ non-option ARGV-element as if it were the argument of an option
+ with character code 1. Using `-' as the first character of the
+ list of option characters selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return -1 with `optind' != ARGC. */
+
+enum __ord
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ };
+
+/* Data type for reentrant functions. */
+struct _getopt_data
+{
+ /* These have exactly the same meaning as the corresponding global
+ variables, except that they are used for the reentrant
+ versions of getopt. */
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+
+ /* Internal members. */
+
+ /* True if the internal members have been initialized. */
+ int __initialized;
+
+ /* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+ char *__nextchar;
+
+ /* See __ord above. */
+ enum __ord __ordering;
+
+ /* If the POSIXLY_CORRECT environment variable is set
+ or getopt was called. */
+ int __posixly_correct;
+
+
+ /* Handle permutation of arguments. */
+
+ /* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first
+ of them; `last_nonopt' is the index after the last of them. */
+
+ int __first_nonopt;
+ int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+ int __nonoption_flags_max_len;
+ int __nonoption_flags_len;
+#endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+ default values and to clear the initialization flag. */
+#define _GETOPT_DATA_INITIALIZER { 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, struct _getopt_data *__data,
+ int __posixly_correct);
+
+extern int _getopt_long_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts,
+ int *__longind,
+ struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/gnulib/lib/getpagesize.c b/gnulib/lib/getpagesize.c
new file mode 100644
index 0000000..d7c1ba8
--- /dev/null
+++ b/gnulib/lib/getpagesize.c
@@ -0,0 +1,39 @@
+/* getpagesize emulation for systems where it cannot be done in a C macro.
+
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible and Martin Lambers. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+/* This implementation is only for native Win32 systems. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+int
+getpagesize (void)
+{
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ return system_info.dwPageSize;
+}
+
+#endif
diff --git a/gnulib/lib/getpass.c b/gnulib/lib/getpass.c
new file mode 100644
index 0000000..c747f35
--- /dev/null
+++ b/gnulib/lib/getpass.c
@@ -0,0 +1,230 @@
+/* Copyright (C) 1992-2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getpass.h"
+
+#include <stdio.h>
+
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+
+# include <stdbool.h>
+
+# if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+# else
+# define __fsetlocking(stream, type) /* empty */
+# endif
+
+# if HAVE_TERMIOS_H
+# include <termios.h>
+# endif
+
+# if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# else
+# if !HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush_unlocked
+# define fflush_unlocked(x) fflush (x)
+# endif
+# if !HAVE_DECL_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs_unlocked
+# define fputs_unlocked(str,stream) fputs (str, stream)
+# endif
+# if !HAVE_DECL_PUTC_UNLOCKED
+# undef putc_unlocked
+# define putc_unlocked(c,stream) putc (c, stream)
+# endif
+# endif
+
+/* It is desirable to use this bit on systems that have it.
+ The only bit of terminal state we want to twiddle is echoing, which is
+ done in software; there is no need to change the state of the terminal
+ hardware. */
+
+# ifndef TCSASOFT
+# define TCSASOFT 0
+# endif
+
+static void
+call_fclose (void *arg)
+{
+ if (arg != NULL)
+ fclose (arg);
+}
+
+char *
+getpass (const char *prompt)
+{
+ FILE *tty;
+ FILE *in, *out;
+ struct termios s, t;
+ bool tty_changed = false;
+ static char *buf;
+ static size_t bufsize;
+ ssize_t nread;
+
+ /* Try to write to and read from the terminal if we can.
+ If we can't open the terminal, use stderr and stdin. */
+
+ tty = fopen ("/dev/tty", "w+");
+ if (tty == NULL)
+ {
+ in = stdin;
+ out = stderr;
+ }
+ else
+ {
+ /* We do the locking ourselves. */
+ __fsetlocking (tty, FSETLOCKING_BYCALLER);
+
+ out = in = tty;
+ }
+
+ flockfile (out);
+
+ /* Turn echoing off if it is on now. */
+# if HAVE_TCGETATTR
+ if (tcgetattr (fileno (in), &t) == 0)
+ {
+ /* Save the old one. */
+ s = t;
+ /* Tricky, tricky. */
+ t.c_lflag &= ~(ECHO | ISIG);
+ tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0);
+ }
+# endif
+
+ /* Write the prompt. */
+ fputs_unlocked (prompt, out);
+ fflush_unlocked (out);
+
+ /* Read the password. */
+ nread = getline (&buf, &bufsize, in);
+
+ /* According to the C standard, input may not be followed by output
+ on the same stream without an intervening call to a file
+ positioning function. Suppose in == out; then without this fseek
+ call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets
+ echoed, whereas on IRIX, the following newline is not output as
+ it should be. POSIX imposes similar restrictions if fileno (in)
+ == fileno (out). The POSIX restrictions are tricky and change
+ from POSIX version to POSIX version, so play it safe and invoke
+ fseek even if in != out. */
+ fseeko (out, 0, SEEK_CUR);
+
+ if (buf != NULL)
+ {
+ if (nread < 0)
+ buf[0] = '\0';
+ else if (buf[nread - 1] == '\n')
+ {
+ /* Remove the newline. */
+ buf[nread - 1] = '\0';
+ if (tty_changed)
+ {
+ /* Write the newline that was not echoed. */
+ putc_unlocked ('\n', out);
+ }
+ }
+ }
+
+ /* Restore the original setting. */
+# if HAVE_TCSETATTR
+ if (tty_changed)
+ tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s);
+# endif
+
+ funlockfile (out);
+
+ call_fclose (tty);
+
+ return buf;
+}
+
+#else /* W32 native */
+
+/* Windows implementation by Martin Lambers <marlam@marlam.de>,
+ improved by Simon Josefsson. */
+
+/* For PASS_MAX. */
+# include <limits.h>
+/* For _getch(). */
+# include <conio.h>
+/* For strdup(). */
+# include <string.h>
+
+# ifndef PASS_MAX
+# define PASS_MAX 512
+# endif
+
+char *
+getpass (const char *prompt)
+{
+ char getpassbuf[PASS_MAX + 1];
+ size_t i = 0;
+ int c;
+
+ if (prompt)
+ {
+ fputs (prompt, stderr);
+ fflush (stderr);
+ }
+
+ for (;;)
+ {
+ c = _getch ();
+ if (c == '\r')
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ else if (i < PASS_MAX)
+ {
+ getpassbuf[i++] = c;
+ }
+
+ if (i >= PASS_MAX)
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ }
+
+ if (prompt)
+ {
+ fputs ("\r\n", stderr);
+ fflush (stderr);
+ }
+
+ return strdup (getpassbuf);
+}
+#endif
diff --git a/gnulib/lib/getpass.h b/gnulib/lib/getpass.h
new file mode 100644
index 0000000..251c20a
--- /dev/null
+++ b/gnulib/lib/getpass.h
@@ -0,0 +1,31 @@
+/* getpass.h -- Read a password of arbitrary length from /dev/tty or stdin.
+ Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc.
+ Contributed by Simon Josefsson <jas@extundo.com>, 2004.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef GETPASS_H
+# define GETPASS_H
+
+/* Get getpass declaration, if available. */
+# include <unistd.h>
+
+# if defined HAVE_DECL_GETPASS && !HAVE_DECL_GETPASS
+/* Read a password of arbitrary length from /dev/tty or stdin. */
+char *getpass (const char *prompt);
+
+# endif
+
+#endif /* GETPASS_H */
diff --git a/gnulib/lib/getpeername.c b/gnulib/lib/getpeername.c
new file mode 100644
index 0000000..abe5a40
--- /dev/null
+++ b/gnulib/lib/getpeername.c
@@ -0,0 +1,49 @@
+/* getpeername.c --- wrappers for Windows getpeername function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getpeername
+
+int
+rpl_getpeername (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = getpeername (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/getsockname.c b/gnulib/lib/getsockname.c
new file mode 100644
index 0000000..1c494bb
--- /dev/null
+++ b/gnulib/lib/getsockname.c
@@ -0,0 +1,49 @@
+/* getsockname.c --- wrappers for Windows getsockname function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockname
+
+int
+rpl_getsockname (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = getsockname (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/getsockopt.c b/gnulib/lib/getsockopt.c
new file mode 100644
index 0000000..2217664
--- /dev/null
+++ b/gnulib/lib/getsockopt.c
@@ -0,0 +1,79 @@
+/* getsockopt.c --- wrappers for Windows getsockopt function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get struct timeval. */
+#include <sys/time.h>
+
+/* Get memcpy. */
+#include <string.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockopt
+
+int
+rpl_getsockopt (int fd, int level, int optname, void *optval, socklen_t *optlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r;
+
+ if (level == SOL_SOCKET
+ && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
+ {
+ int milliseconds;
+ int milliseconds_len = sizeof (int);
+ struct timeval tv;
+ size_t n;
+
+ r = getsockopt (sock, level, optname, (char *) &milliseconds,
+ &milliseconds_len);
+ tv.tv_sec = milliseconds / 1000;
+ tv.tv_usec = (milliseconds - 1000 * tv.tv_sec) * 1000;
+ n = sizeof (struct timeval);
+ if (n > *optlen)
+ n = *optlen;
+ memcpy (optval, &tv, n);
+ *optlen = n;
+ }
+ else
+ {
+ r = getsockopt (sock, level, optname, optval, optlen);
+ }
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/getsubopt.c b/gnulib/lib/getsubopt.c
new file mode 100644
index 0000000..ab74d03
--- /dev/null
+++ b/gnulib/lib/getsubopt.c
@@ -0,0 +1,82 @@
+/* Parse comma separated list into words.
+ Copyright (C) 1996-1997, 1999, 2004, 2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC
+/* This code is written for inclusion in gnu-libc, and uses names in
+ the namespace reserved for libc. If we're compiling in gnulib,
+ define those names to be the normal ones instead. */
+# undef __strchrnul
+# define __strchrnul strchrnul
+#endif
+
+/* Parse comma separated suboption from *OPTIONP and match against
+ strings in TOKENS. If found return index and set *VALUEP to
+ optional value introduced by an equal sign. If the suboption is
+ not part of TOKENS return in *VALUEP beginning of unknown
+ suboption. On exit *OPTIONP is set to the beginning of the next
+ token or at the terminating NUL character. */
+int
+getsubopt (char **optionp, char *const *tokens, char **valuep)
+{
+ char *endp, *vstart;
+ int cnt;
+
+ if (**optionp == '\0')
+ return -1;
+
+ /* Find end of next token. */
+ endp = __strchrnul (*optionp, ',');
+
+ /* Find start of value. */
+ vstart = memchr (*optionp, '=', endp - *optionp);
+ if (vstart == NULL)
+ vstart = endp;
+
+ /* Try to match the characters between *OPTIONP and VSTART against
+ one of the TOKENS. */
+ for (cnt = 0; tokens[cnt] != NULL; ++cnt)
+ if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0
+ && tokens[cnt][vstart - *optionp] == '\0')
+ {
+ /* We found the current option in TOKENS. */
+ *valuep = vstart != endp ? vstart + 1 : NULL;
+
+ if (*endp != '\0')
+ *endp++ = '\0';
+ *optionp = endp;
+
+ return cnt;
+ }
+
+ /* The current suboption does not match any option. */
+ *valuep = *optionp;
+
+ if (*endp != '\0')
+ *endp++ = '\0';
+ *optionp = endp;
+
+ return -1;
+}
diff --git a/gnulib/lib/gettext.h b/gnulib/lib/gettext.h
new file mode 100644
index 0000000..1ddd68a
--- /dev/null
+++ b/gnulib/lib/gettext.h
@@ -0,0 +1,286 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option. */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
+ the gettext() and ngettext() macros. This is an alternative to calling
+ textdomain(), and is useful for libraries. */
+# ifdef DEFAULT_TEXT_DOMAIN
+# undef gettext
+# define gettext(Msgid) \
+ dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
+# endif
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+ chokes if dcgettext is defined as a macro. So include it now, to make
+ later inclusions of <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
+ <libintl.h>, which chokes if dcgettext is defined as a macro. So include
+ it now, to make later inclusions of <libintl.h> a NOP. */
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
+# include <cstdlib>
+# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
+# include <libintl.h>
+# endif
+#endif
+
+/* Disabled NLS.
+ The casts to 'const char *' serve the purpose of producing warnings
+ for invalid uses of the value returned from these functions.
+ On pre-ANSI systems without 'const', the config.h file is supposed to
+ contain "#define const". */
+# undef gettext
+# define gettext(Msgid) ((const char *) (Msgid))
+# undef dgettext
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# undef dcgettext
+# define dcgettext(Domainname, Msgid, Category) \
+ ((void) (Category), dgettext (Domainname, Msgid))
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 \
+ ? ((void) (Msgid2), (const char *) (Msgid1)) \
+ : ((void) (Msgid1), (const char *) (Msgid2)))
+# undef dngettext
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# undef dcngettext
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
+# undef textdomain
+# define textdomain(Domainname) ((const char *) (Domainname))
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+ ((void) (Domainname), (const char *) (Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+ ((void) (Domainname), (const char *) (Codeset))
+
+#endif
+
+/* Prefer gnulib's setlocale override over libintl's setlocale override. */
+#ifdef GNULIB_defined_setlocale
+# undef setlocale
+# define setlocale rpl_setlocale
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code.
+ The argument, String, should be a literal string. Concatenated strings
+ and other string expressions won't work.
+ The macro's expansion is not parenthesized, so that it is suitable as
+ initializer for static 'char[]' or 'const char[]' variables. */
+#define gettext_noop(String) String
+
+/* The separator between msgctxt and msgid in a .mo file. */
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
+ MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
+ short and rarely need to change.
+ The letter 'p' stands for 'particular' or 'special'. */
+#ifdef DEFAULT_TEXT_DOMAIN
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#else
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#endif
+#define dpgettext(Domainname, Msgctxt, Msgid) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
+#ifdef DEFAULT_TEXT_DOMAIN
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#else
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#endif
+#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+pgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ int category)
+{
+ const char *translation = dcgettext (domain, msg_ctxt_id, category);
+ if (translation == msg_ctxt_id)
+ return msgid;
+ else
+ return translation;
+}
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+npgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ const char *translation =
+ dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+ if (translation == msg_ctxt_id || translation == msgid_plural)
+ return (n == 1 ? msgid : msgid_plural);
+ else
+ return translation;
+}
+
+/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
+ can be arbitrary expressions. But for string literals these macros are
+ less efficient than those above. */
+
+#include <string.h>
+
+#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
+ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
+ /* || __STDC_VERSION__ >= 199901L */ )
+
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+#include <stdlib.h>
+#endif
+
+#define pgettext_expr(Msgctxt, Msgid) \
+ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
+#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
+ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcgettext (domain, msg_ctxt_id, category);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (translation != msg_ctxt_id)
+ return translation;
+ }
+ return msgid;
+}
+
+#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcnpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (!(translation == msg_ctxt_id || translation == msgid_plural))
+ return translation;
+ }
+ return (n == 1 ? msgid : msgid_plural);
+}
+
+#endif /* _LIBGETTEXT_H */
diff --git a/gnulib/lib/gettime.c b/gnulib/lib/gettime.c
new file mode 100644
index 0000000..6dbb457
--- /dev/null
+++ b/gnulib/lib/gettime.c
@@ -0,0 +1,48 @@
+/* gettime -- get the system clock
+
+ Copyright (C) 2002, 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include <sys/time.h>
+
+/* Get the system time into *TS. */
+
+void
+gettime (struct timespec *ts)
+{
+#if HAVE_NANOTIME
+ nanotime (ts);
+#else
+
+# if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
+ if (clock_gettime (CLOCK_REALTIME, ts) == 0)
+ return;
+# endif
+
+ {
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+ }
+
+#endif
+}
diff --git a/gnulib/lib/gettimeofday.c b/gnulib/lib/gettimeofday.c
new file mode 100644
index 0000000..ae2a6f1
--- /dev/null
+++ b/gnulib/lib/gettimeofday.c
@@ -0,0 +1,144 @@
+/* Provide gettimeofday for systems that don't have it or for which it's broken.
+
+ Copyright (C) 2001-2003, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/time.h>
+
+#include <time.h>
+
+#if HAVE_SYS_TIMEB_H
+# include <sys/timeb.h>
+#endif
+
+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME
+
+/* Work around the bug in some systems whereby gettimeofday clobbers
+ the static buffer that localtime uses for its return value. The
+ gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has
+ this problem. The tzset replacement is necessary for at least
+ Solaris 2.5, 2.5.1, and 2.6. */
+
+static struct tm tm_zero_buffer;
+static struct tm *localtime_buffer_addr = &tm_zero_buffer;
+
+# undef localtime
+extern struct tm *localtime (time_t const *);
+
+# undef gmtime
+extern struct tm *gmtime (time_t const *);
+
+/* This is a wrapper for localtime. It is used only on systems for which
+ gettimeofday clobbers the static buffer used for localtime's result.
+
+ On the first call, record the address of the static buffer that
+ localtime uses for its result. */
+
+struct tm *
+rpl_localtime (time_t const *timep)
+{
+ struct tm *tm = localtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+/* Same as above, since gmtime and localtime use the same buffer. */
+struct tm *
+rpl_gmtime (time_t const *timep)
+{
+ struct tm *tm = gmtime (timep);
+
+ if (localtime_buffer_addr == &tm_zero_buffer)
+ localtime_buffer_addr = tm;
+
+ return tm;
+}
+
+#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */
+
+#if TZSET_CLOBBERS_LOCALTIME
+
+# undef tzset
+extern void tzset (void);
+
+/* This is a wrapper for tzset, for systems on which tzset may clobber
+ the static buffer used for localtime's result. */
+void
+rpl_tzset (void)
+{
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to tzset. */
+ struct tm save = *localtime_buffer_addr;
+ tzset ();
+ *localtime_buffer_addr = save;
+}
+#endif
+
+/* This is a wrapper for gettimeofday. It is used only on systems
+ that lack this function, or whose implementation of this function
+ causes problems. */
+
+int
+gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
+#undef gettimeofday
+#if HAVE_GETTIMEOFDAY
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ /* Save and restore the contents of the buffer used for localtime's
+ result around the call to gettimeofday. */
+ struct tm save = *localtime_buffer_addr;
+# endif
+
+ int result = gettimeofday (tv, (struct timezone *) tz);
+
+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME
+ *localtime_buffer_addr = save;
+# endif
+
+ return result;
+
+#else
+
+# if HAVE__FTIME
+
+ struct _timeb timebuf;
+ _ftime (&timebuf);
+ tv->tv_sec = timebuf.time;
+ tv->tv_usec = timebuf.millitm * 1000;
+
+# else
+
+# if !defined OK_TO_USE_1S_CLOCK
+# error "Only 1-second nominal clock resolution found. Is that intended?" \
+ "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
+# endif
+ tv->tv_sec = time (NULL);
+ tv->tv_usec = 0;
+
+# endif
+
+ return 0;
+
+#endif
+}
diff --git a/gnulib/lib/getugroups.c b/gnulib/lib/getugroups.c
new file mode 100644
index 0000000..dc8089b
--- /dev/null
+++ b/gnulib/lib/getugroups.c
@@ -0,0 +1,125 @@
+/* getugroups.c -- return a list of the groups a user is in
+
+ Copyright (C) 1990-1991, 1998-2000, 2003-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie. */
+
+#include <config.h>
+
+#include "getugroups.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h> /* grp.h on alpha OSF1 V2.0 uses "FILE *". */
+#include <string.h>
+#include <unistd.h>
+
+#if !HAVE_GRP_H
+
+/* Mingw lacks all things related to group management. The best we
+ can do is fail with ENOSYS. */
+
+int
+getugroups (int maxcount _GL_UNUSED,
+ gid_t *grouplist _GL_UNUSED,
+ char const *username _GL_UNUSED,
+ gid_t gid _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_GRP_H */
+# include <grp.h>
+
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Like `getgroups', but for user USERNAME instead of for the current
+ process. Store at most MAXCOUNT group IDs in the GROUPLIST array.
+ If GID is not -1, store it first (if possible). GID should be the
+ group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
+ listed in /etc/groups. Upon failure, set errno and return -1.
+ Otherwise, return the number of IDs we've written into GROUPLIST. */
+
+int
+getugroups (int maxcount, gid_t *grouplist, char const *username,
+ gid_t gid)
+{
+ int count = 0;
+
+ if (gid != (gid_t) -1)
+ {
+ if (maxcount != 0)
+ grouplist[count] = gid;
+ ++count;
+ }
+
+ setgrent ();
+ while (1)
+ {
+ char **cp;
+ struct group *grp;
+
+ errno = 0;
+ grp = getgrent ();
+ if (grp == NULL)
+ break;
+
+ for (cp = grp->gr_mem; *cp; ++cp)
+ {
+ int n;
+
+ if ( ! STREQ (username, *cp))
+ continue;
+
+ /* See if this group number is already on the list. */
+ for (n = 0; n < count; ++n)
+ if (grouplist && grouplist[n] == grp->gr_gid)
+ break;
+
+ /* If it's a new group number, then try to add it to the list. */
+ if (n == count)
+ {
+ if (maxcount != 0)
+ {
+ if (count >= maxcount)
+ goto done;
+ grouplist[count] = grp->gr_gid;
+ }
+ if (count == INT_MAX)
+ {
+ errno = EOVERFLOW;
+ goto done;
+ }
+ count++;
+ }
+ }
+ }
+
+ if (errno != 0)
+ count = -1;
+
+ done:
+ {
+ int saved_errno = errno;
+ endgrent ();
+ errno = saved_errno;
+ }
+
+ return count;
+}
+
+#endif /* HAVE_GRP_H */
diff --git a/gnulib/lib/getugroups.h b/gnulib/lib/getugroups.h
new file mode 100644
index 0000000..9df9952
--- /dev/null
+++ b/gnulib/lib/getugroups.h
@@ -0,0 +1,19 @@
+/* Get a list of group IDs associated with a specified user ID.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+int getugroups (int maxcount, gid_t *grouplist, char const *username,
+ gid_t gid);
diff --git a/gnulib/lib/getusershell.c b/gnulib/lib/getusershell.c
new file mode 100644
index 0000000..3ac7c8d
--- /dev/null
+++ b/gnulib/lib/getusershell.c
@@ -0,0 +1,173 @@
+/* getusershell.c -- Return names of valid user shells.
+
+ Copyright (C) 1991, 1997, 2000-2001, 2003-2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#ifndef SHELLS_FILE
+# ifndef __DJGPP__
+/* File containing a list of nonrestricted shells, one per line. */
+# define SHELLS_FILE "/etc/shells"
+# else
+/* This is a horrible kludge. Isn't there a better way? */
+# define SHELLS_FILE "/dev/env/DJDIR/etc/shells"
+# endif
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "stdio--.h"
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+static size_t readname (char **, size_t *, FILE *);
+
+#if ! defined ADDITIONAL_DEFAULT_SHELLS && defined __MSDOS__
+# define ADDITIONAL_DEFAULT_SHELLS \
+ "c:/dos/command.com", "c:/windows/command.com", "c:/command.com",
+#else
+# define ADDITIONAL_DEFAULT_SHELLS /* empty */
+#endif
+
+/* List of shells to use if the shells file is missing. */
+static char const* const default_shells[] =
+{
+ ADDITIONAL_DEFAULT_SHELLS
+ "/bin/sh", "/bin/csh", "/usr/bin/sh", "/usr/bin/csh", NULL
+};
+
+/* Index of the next shell in `default_shells' to return.
+ 0 means we are not using `default_shells'. */
+static size_t default_index = 0;
+
+/* Input stream from the shells file. */
+static FILE *shellstream = NULL;
+
+/* Line of input from the shells file. */
+static char *line = NULL;
+
+/* Number of bytes allocated for `line'. */
+static size_t line_size = 0;
+
+/* Return an entry from the shells file, ignoring comment lines.
+ If the file doesn't exist, use the list in DEFAULT_SHELLS (above).
+ In any case, the returned string is in memory allocated through malloc.
+ Return NULL if there are no more entries. */
+
+char *
+getusershell (void)
+{
+ if (default_index > 0)
+ {
+ if (default_shells[default_index])
+ /* Not at the end of the list yet. */
+ return xstrdup (default_shells[default_index++]);
+ return NULL;
+ }
+
+ if (shellstream == NULL)
+ {
+ shellstream = fopen (SHELLS_FILE, "r");
+ if (shellstream == NULL)
+ {
+ /* No shells file. Use the default list. */
+ default_index = 1;
+ return xstrdup (default_shells[0]);
+ }
+ }
+
+ while (readname (&line, &line_size, shellstream))
+ {
+ if (*line != '#')
+ return line;
+ }
+ return NULL; /* End of file. */
+}
+
+/* Rewind the shells file. */
+
+void
+setusershell (void)
+{
+ default_index = 0;
+ if (shellstream)
+ rewind (shellstream);
+}
+
+/* Close the shells file. */
+
+void
+endusershell (void)
+{
+ if (shellstream)
+ {
+ fclose (shellstream);
+ shellstream = NULL;
+ }
+}
+
+/* Read a line from STREAM, removing any newline at the end.
+ Place the result in *NAME, which is malloc'd
+ and/or realloc'd as necessary and can start out NULL,
+ and whose size is passed and returned in *SIZE.
+
+ Return the number of bytes placed in *NAME
+ if some nonempty sequence was found, otherwise 0. */
+
+static size_t
+readname (char **name, size_t *size, FILE *stream)
+{
+ int c;
+ size_t name_index = 0;
+
+ /* Skip blank space. */
+ while ((c = getc (stream)) != EOF && isspace (c))
+ /* Do nothing. */ ;
+
+ for (;;)
+ {
+ if (*size <= name_index)
+ *name = x2nrealloc (*name, size, sizeof **name);
+ if (c == EOF || isspace (c))
+ break;
+ (*name)[name_index++] = c;
+ c = getc (stream);
+ }
+ (*name)[name_index] = '\0';
+ return name_index;
+}
+
+#ifdef TEST
+int
+main (void)
+{
+ char *s;
+
+ while (s = getusershell ())
+ puts (s);
+ exit (0);
+}
+#endif
diff --git a/gnulib/lib/git-merge-changelog.c b/gnulib/lib/git-merge-changelog.c
new file mode 100644
index 0000000..652b40a
--- /dev/null
+++ b/gnulib/lib/git-merge-changelog.c
@@ -0,0 +1,1676 @@
+/* git-merge-changelog - git "merge" driver for GNU style ChangeLog files.
+ Copyright (C) 2008-2010 Bruno Haible <bruno@clisp.org>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* README:
+ The default merge driver of 'git' *always* produces conflicts when
+ pulling public modifications into a privately modified ChangeLog file.
+ This is because ChangeLog files are always modified at the top; the
+ default merge driver has no clue how to deal with this. Furthermore
+ the conflicts are presented with more <<<< ==== >>>> markers than
+ necessary; this is because the default merge driver makes pointless
+ efforts to look at the individual line changes inside a ChangeLog entry.
+
+ This program serves as a 'git' merge driver that avoids these problems.
+ 1. It produces no conflict when ChangeLog entries have been inserted
+ at the top both in the public and in the private modification. It
+ puts the privately added entries above the publicly added entries.
+ 2. It respects the structure of ChangeLog files: entries are not split
+ into lines but kept together.
+ 3. It also handles the case of small modifications of past ChangeLog
+ entries, or of removed ChangeLog entries: they are merged as one
+ would expect it.
+ 4. Conflicts are presented at the top of the file, rather than where
+ they occurred, so that the user will see them immediately. (Unlike
+ for source code written in some programming language, conflict markers
+ that are located several hundreds lines from the top will not cause
+ any syntax error and therefore would be likely to remain unnoticed.)
+ */
+
+/* Installation:
+
+ $ gnulib-tool --create-testdir --dir=/tmp/testdir123 git-merge-changelog
+ $ cd /tmp/testdir123
+ $ ./configure
+ $ make
+ $ make install
+
+ Additionally, for git users:
+ - Add to .git/config of the checkout (or to your $HOME/.gitconfig) the
+ lines
+
+ [merge "merge-changelog"]
+ name = GNU-style ChangeLog merge driver
+ driver = /usr/local/bin/git-merge-changelog %O %A %B
+
+ - In every directory that contains a ChangeLog file, add a file
+ '.gitattributes' with this line:
+
+ ChangeLog merge=merge-changelog
+
+ (See "man 5 gitattributes" for more info.)
+
+ Additionally, for bzr users:
+ - Install the 'extmerge' bzr plug-in listed at
+ <http://doc.bazaar.canonical.com/plugins/en/index.html>
+ <http://wiki.bazaar.canonical.com/BzrPlugins>
+ - Add to your $HOME/.bazaar/bazaar.conf the line
+
+ external_merge = git-merge-changelog %b %T %o
+
+ - Then, to merge a conflict in a ChangeLog file, use
+
+ $ bzr extmerge ChangeLog
+
+ Additionally, for hg users:
+ - Add to your $HOME/.hgrc a couple of lines in a section [merge-tools].
+ See <http://www.selenic.com/mercurial/hgrc.5.html> section merge-tools
+ for reference.
+ */
+
+/* Use as an alternative to 'diff3':
+ git-merge-changelog performs the same role as "diff3 -m", just with
+ reordered arguments:
+ $ git-merge-changelog %O %A %B
+ is comparable to
+ $ diff3 -m %A %O %B
+ */
+
+/* Calling convention:
+ A merge driver is called with three filename arguments:
+ 1. %O = The common ancestor of %A and %B.
+ 2. %A = The file's contents from the "current branch".
+ 3. %B = The file's contents from the "other branch"; this is the contents
+ being merged in.
+
+ In case of a "git stash apply" or of an upstream pull (e.g. from a subsystem
+ maintainer to a central maintainer) or of a downstream pull with --rebase:
+ 2. %A = The file's newest pulled contents; modified by other committers.
+ 3. %B = The user's newest copy of the file; modified by the user.
+ In case of a downstream pull (e.g. from a central repository to the user)
+ or of an upstream pull with --rebase:
+ 2. %A = The user's newest copy of the file; modified by the user.
+ 3. %B = The file's newest pulled contents; modified by other committers.
+
+ It should write its merged output into file %A. It can also echo some
+ remarks to stdout. It should exit with return code 0 if the merge could
+ be resolved cleanly, or with non-zero return code if there were conflicts.
+ */
+
+/* How it works:
+ The structure of a ChangeLog file: It consists of ChangeLog entries. A
+ ChangeLog entry starts at a line following a blank line and that starts with
+ a non-whitespace character, or at the beginning of a file.
+ The merge driver works as follows: It reads the three files into memory and
+ dissects them into ChangeLog entries. It then finds the differences between
+ %O and %B. They are classified as:
+ - removals (some consecutive entries removed),
+ - changes (some consecutive entries removed, some consecutive entries
+ added),
+ - additions (some consecutive entries added).
+ The driver then attempts to apply the changes to %A.
+ To this effect, it first computes a correspondence between the entries in %O
+ and the entries in %A, using fuzzy string matching to still identify changed
+ entries.
+ - Removals are applied one by one. If the entry is present in %A, at any
+ position, it is removed. If not, the removal is marked as a conflict.
+ - Additions at the top of %B are applied at the top of %A.
+ - Additions between entry x and entry y (y may be the file end) in %B are
+ applied between entry x and entry y in %A (if they still exist and are
+ still consecutive in %A), otherwise the additions are marked as a
+ conflict.
+ - Changes are categorized into "simple changes":
+ entry1 ... entryn
+ are mapped to
+ added_entry ... added_entry modified_entry1 ... modified_entryn,
+ where the correspondence between entry_i and modified_entry_i is still
+ clear; and "big changes": these are all the rest. Simple changes at the
+ top of %B are applied by putting the added entries at the top of %A. The
+ changes in simple changes are applied one by one; possibly leading to
+ single-entry conflicts. Big changes are applied en bloc, possibly
+ leading to conflicts spanning multiple entries.
+ - Conflicts are output at the top of the file and cause an exit status of
+ 1.
+ */
+
+#include <config.h>
+
+#include <getopt.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "progname.h"
+#include "error.h"
+#include "read-file.h"
+#include "gl_xlist.h"
+#include "gl_array_list.h"
+#include "gl_linkedhash_list.h"
+#include "gl_rbtreehash_list.h"
+#include "gl_linked_list.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "fstrcmp.h"
+#include "minmax.h"
+#include "c-strstr.h"
+#include "fwriteerror.h"
+
+#define ASSERT(expr) \
+ do \
+ { \
+ if (!(expr)) \
+ abort (); \
+ } \
+ while (0)
+
+#define FSTRCMP_THRESHOLD 0.6
+#define FSTRCMP_STRICTER_THRESHOLD 0.8
+
+/* Representation of a ChangeLog entry.
+ The string may contain NUL bytes; therefore it is represented as a plain
+ opaque memory region. */
+struct entry
+{
+ char *string;
+ size_t length;
+ /* Cache for the hash code. */
+ bool hashcode_cached;
+ size_t hashcode;
+};
+
+/* Create an entry.
+ The memory region passed by the caller must of indefinite extent. It is
+ *not* copied here. */
+static struct entry *
+entry_create (char *string, size_t length)
+{
+ struct entry *result = XMALLOC (struct entry);
+ result->string = string;
+ result->length = length;
+ result->hashcode_cached = false;
+ return result;
+}
+
+/* Compare two entries for equality. */
+static bool
+entry_equals (const void *elt1, const void *elt2)
+{
+ const struct entry *entry1 = (const struct entry *) elt1;
+ const struct entry *entry2 = (const struct entry *) elt2;
+ return entry1->length == entry2->length
+ && memcmp (entry1->string, entry2->string, entry1->length) == 0;
+}
+
+/* Return a hash code of the contents of a ChangeLog entry. */
+static size_t
+entry_hashcode (const void *elt)
+{
+ struct entry *entry = (struct entry *) elt;
+ if (!entry->hashcode_cached)
+ {
+ /* See http://www.haible.de/bruno/hashfunc.html. */
+ const char *s;
+ size_t n;
+ size_t h = 0;
+
+ for (s = entry->string, n = entry->length; n > 0; s++, n--)
+ h = (unsigned char) *s + ((h << 9) | (h >> (sizeof (size_t) * CHAR_BIT - 9)));
+
+ entry->hashcode = h;
+ entry->hashcode_cached = true;
+ }
+ return entry->hashcode;
+}
+
+/* Perform a fuzzy comparison of two ChangeLog entries.
+ Return a similarity measure of the two entries, a value between 0 and 1.
+ 0 stands for very distinct, 1 for identical.
+ If the result is < LOWER_BOUND, an arbitrary other value < LOWER_BOUND can
+ be returned. */
+static double
+entry_fstrcmp (const struct entry *entry1, const struct entry *entry2,
+ double lower_bound)
+{
+ /* fstrcmp works only on NUL terminated strings. */
+ char *memory;
+ double similarity;
+
+ if (memchr (entry1->string, '\0', entry1->length) != NULL)
+ return 0.0;
+ if (memchr (entry2->string, '\0', entry2->length) != NULL)
+ return 0.0;
+ memory = (char *) xmalloca (entry1->length + 1 + entry2->length + 1);
+ {
+ char *p = memory;
+ memcpy (p, entry1->string, entry1->length);
+ p += entry1->length;
+ *p++ = '\0';
+ memcpy (p, entry2->string, entry2->length);
+ p += entry2->length;
+ *p++ = '\0';
+ }
+ similarity =
+ fstrcmp_bounded (memory, memory + entry1->length + 1, lower_bound);
+ freea (memory);
+ return similarity;
+}
+
+/* This structure represents an entire ChangeLog file, after it was read
+ into memory. */
+struct changelog_file
+{
+ /* The entries, as a list. */
+ gl_list_t /* <struct entry *> */ entries_list;
+ /* The entries, as a list in opposite direction. */
+ gl_list_t /* <struct entry *> */ entries_reversed;
+ /* The entries, as an array. */
+ size_t num_entries;
+ struct entry **entries;
+};
+
+/* Read a ChangeLog file into memory.
+ Return the contents in *RESULT. */
+static void
+read_changelog_file (const char *filename, struct changelog_file *result)
+{
+ /* Read the file in text mode, otherwise it's hard to recognize empty
+ lines. */
+ size_t length;
+ char *contents = read_file (filename, &length);
+ if (contents == NULL)
+ {
+ fprintf (stderr, "could not read file '%s'\n", filename);
+ exit (EXIT_FAILURE);
+ }
+
+ result->entries_list =
+ gl_list_create_empty (GL_LINKEDHASH_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ result->entries_reversed =
+ gl_list_create_empty (GL_RBTREEHASH_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ /* A ChangeLog file consists of ChangeLog entries. A ChangeLog entry starts
+ at a line following a blank line and that starts with a non-whitespace
+ character, or at the beginning of a file.
+ Split the file contents into entries. */
+ {
+ char *contents_end = contents + length;
+ char *start = contents;
+ while (start < contents_end)
+ {
+ /* Search the end of the current entry. */
+ char *ptr = start;
+ struct entry *curr;
+
+ while (ptr < contents_end)
+ {
+ ptr = memchr (ptr, '\n', contents_end - ptr);
+ if (ptr == NULL)
+ {
+ ptr = contents_end;
+ break;
+ }
+ ptr++;
+ if (contents_end - ptr >= 2
+ && ptr[0] == '\n'
+ && !(ptr[1] == '\n' || ptr[1] == '\t' || ptr[1] == ' '))
+ {
+ ptr++;
+ break;
+ }
+ }
+
+ curr = entry_create (start, ptr - start);
+ gl_list_add_last (result->entries_list, curr);
+ gl_list_add_first (result->entries_reversed, curr);
+
+ start = ptr;
+ }
+ }
+
+ result->num_entries = gl_list_size (result->entries_list);
+ result->entries = XNMALLOC (result->num_entries, struct entry *);
+ {
+ size_t index = 0;
+ gl_list_iterator_t iter = gl_list_iterator (result->entries_list);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ result->entries[index++] = (struct entry *) elt;
+ gl_list_iterator_free (&iter);
+ ASSERT (index == result->num_entries);
+ }
+}
+
+/* A mapping (correspondence) between entries of FILE1 and of FILE2. */
+struct entries_mapping
+{
+ struct changelog_file *file1;
+ struct changelog_file *file2;
+ /* Mapping from indices in FILE1 to indices in FILE2.
+ A value -1 means that the entry from FILE1 is not found in FILE2.
+ A value -2 means that it has not yet been computed. */
+ ssize_t *index_mapping;
+ /* Mapping from indices in FILE2 to indices in FILE1.
+ A value -1 means that the entry from FILE2 is not found in FILE1.
+ A value -2 means that it has not yet been computed. */
+ ssize_t *index_mapping_reverse;
+};
+
+/* Look up (or lazily compute) the mapping of an entry in FILE1.
+ i is the index in FILE1.
+ Return the index in FILE2, or -1 when the entry is not found in FILE2. */
+static ssize_t
+entries_mapping_get (struct entries_mapping *mapping, ssize_t i)
+{
+ if (mapping->index_mapping[i] < -1)
+ {
+ struct changelog_file *file1 = mapping->file1;
+ struct changelog_file *file2 = mapping->file2;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ struct entry *entry_i = file1->entries[i];
+ ssize_t j;
+
+ /* Search whether it approximately occurs in file2. */
+ ssize_t best_j = -1;
+ double best_j_similarity = 0.0;
+ for (j = n2 - 1; j >= 0; j--)
+ if (mapping->index_mapping_reverse[j] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (entry_i, file2->entries[j], best_j_similarity);
+ if (similarity > best_j_similarity)
+ {
+ best_j = j;
+ best_j_similarity = similarity;
+ }
+ }
+ if (best_j_similarity >= FSTRCMP_THRESHOLD)
+ {
+ /* Found a similar entry in file2. */
+ struct entry *entry_j = file2->entries[best_j];
+ /* Search whether it approximately occurs in file1 at index i. */
+ ssize_t best_i = -1;
+ double best_i_similarity = 0.0;
+ ssize_t ii;
+ for (ii = n1 - 1; ii >= 0; ii--)
+ if (mapping->index_mapping[ii] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (file1->entries[ii], entry_j,
+ best_i_similarity);
+ if (similarity > best_i_similarity)
+ {
+ best_i = ii;
+ best_i_similarity = similarity;
+ }
+ }
+ if (best_i_similarity >= FSTRCMP_THRESHOLD && best_i == i)
+ {
+ mapping->index_mapping[i] = best_j;
+ mapping->index_mapping_reverse[best_j] = i;
+ }
+ }
+ if (mapping->index_mapping[i] < -1)
+ /* It does not approximately occur in FILE2.
+ Remember it, for next time. */
+ mapping->index_mapping[i] = -1;
+ }
+ return mapping->index_mapping[i];
+}
+
+/* Look up (or lazily compute) the mapping of an entry in FILE2.
+ j is the index in FILE2.
+ Return the index in FILE1, or -1 when the entry is not found in FILE1. */
+static ssize_t
+entries_mapping_reverse_get (struct entries_mapping *mapping, ssize_t j)
+{
+ if (mapping->index_mapping_reverse[j] < -1)
+ {
+ struct changelog_file *file1 = mapping->file1;
+ struct changelog_file *file2 = mapping->file2;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ struct entry *entry_j = file2->entries[j];
+ ssize_t i;
+
+ /* Search whether it approximately occurs in file1. */
+ ssize_t best_i = -1;
+ double best_i_similarity = 0.0;
+ for (i = n1 - 1; i >= 0; i--)
+ if (mapping->index_mapping[i] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (file1->entries[i], entry_j, best_i_similarity);
+ if (similarity > best_i_similarity)
+ {
+ best_i = i;
+ best_i_similarity = similarity;
+ }
+ }
+ if (best_i_similarity >= FSTRCMP_THRESHOLD)
+ {
+ /* Found a similar entry in file1. */
+ struct entry *entry_i = file1->entries[best_i];
+ /* Search whether it approximately occurs in file2 at index j. */
+ ssize_t best_j = -1;
+ double best_j_similarity = 0.0;
+ ssize_t jj;
+ for (jj = n2 - 1; jj >= 0; jj--)
+ if (mapping->index_mapping_reverse[jj] < 0)
+ {
+ double similarity =
+ entry_fstrcmp (entry_i, file2->entries[jj],
+ best_j_similarity);
+ if (similarity > best_j_similarity)
+ {
+ best_j = jj;
+ best_j_similarity = similarity;
+ }
+ }
+ if (best_j_similarity >= FSTRCMP_THRESHOLD && best_j == j)
+ {
+ mapping->index_mapping_reverse[j] = best_i;
+ mapping->index_mapping[best_i] = j;
+ }
+ }
+ if (mapping->index_mapping_reverse[j] < -1)
+ /* It does not approximately occur in FILE1.
+ Remember it, for next time. */
+ mapping->index_mapping_reverse[j] = -1;
+ }
+ return mapping->index_mapping_reverse[j];
+}
+
+/* Compute a mapping (correspondence) between entries of FILE1 and of FILE2.
+ The correspondence also takes into account small modifications; i.e. the
+ indicated relation is not equality of entries but best-match similarity
+ of entries.
+ If FULL is true, the maximum of matching is done up-front. If it is false,
+ it is done in a lazy way through the functions entries_mapping_get and
+ entries_mapping_reverse_get.
+ Return the result in *RESULT. */
+static void
+compute_mapping (struct changelog_file *file1, struct changelog_file *file2,
+ bool full,
+ struct entries_mapping *result)
+{
+ /* Mapping from indices in file1 to indices in file2. */
+ ssize_t *index_mapping;
+ /* Mapping from indices in file2 to indices in file1. */
+ ssize_t *index_mapping_reverse;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ ssize_t i, j;
+
+ index_mapping = XNMALLOC (n1, ssize_t);
+ for (i = 0; i < n1; i++)
+ index_mapping[i] = -2;
+
+ index_mapping_reverse = XNMALLOC (n2, ssize_t);
+ for (j = 0; j < n2; j++)
+ index_mapping_reverse[j] = -2;
+
+ for (i = n1 - 1; i >= 0; i--)
+ /* Take an entry from file1. */
+ if (index_mapping[i] < -1)
+ {
+ struct entry *entry = file1->entries[i];
+ /* Search whether it occurs in file2. */
+ j = gl_list_indexof (file2->entries_reversed, entry);
+ if (j >= 0)
+ {
+ j = n2 - 1 - j;
+ /* Found an exact correspondence. */
+ /* If index_mapping_reverse[j] >= 0, we have already seen other
+ copies of this entry, and there were more occurrences of it in
+ file1 than in file2. In this case, do nothing. */
+ if (index_mapping_reverse[j] < 0)
+ {
+ index_mapping[i] = j;
+ index_mapping_reverse[j] = i;
+ /* Look for more occurrences of the same entry. Match them
+ as long as they pair up. Unpaired occurrences of the same
+ entry are left without mapping. */
+ {
+ ssize_t curr_i = i;
+ ssize_t curr_j = j;
+
+ for (;;)
+ {
+ ssize_t next_i;
+ ssize_t next_j;
+
+ next_i =
+ gl_list_indexof_from (file1->entries_reversed,
+ n1 - curr_i, entry);
+ if (next_i < 0)
+ break;
+ next_j =
+ gl_list_indexof_from (file2->entries_reversed,
+ n2 - curr_j, entry);
+ if (next_j < 0)
+ break;
+ curr_i = n1 - 1 - next_i;
+ curr_j = n2 - 1 - next_j;
+ ASSERT (index_mapping[curr_i] < 0);
+ ASSERT (index_mapping_reverse[curr_j] < 0);
+ index_mapping[curr_i] = curr_j;
+ index_mapping_reverse[curr_j] = curr_i;
+ }
+ }
+ }
+ }
+ }
+
+ result->file1 = file1;
+ result->file2 = file2;
+ result->index_mapping = index_mapping;
+ result->index_mapping_reverse = index_mapping_reverse;
+
+ if (full)
+ for (i = n1 - 1; i >= 0; i--)
+ entries_mapping_get (result, i);
+}
+
+/* An "edit" is a textual modification performed by the user, that needs to
+ be applied to the other file. */
+enum edit_type
+{
+ /* Some consecutive entries were added. */
+ ADDITION,
+ /* Some consecutive entries were removed; some other consecutive entries
+ were added at the same position. (Not necessarily the same number of
+ entries.) */
+ CHANGE,
+ /* Some consecutive entries were removed. */
+ REMOVAL
+};
+
+/* This structure represents an edit. */
+struct edit
+{
+ enum edit_type type;
+ /* Range of indices into the entries of FILE1. */
+ ssize_t i1, i2; /* first, last index; only used for CHANGE, REMOVAL */
+ /* Range of indices into the entries of FILE2. */
+ ssize_t j1, j2; /* first, last index; only used for ADDITION, CHANGE */
+};
+
+/* This structure represents the differences from one file, FILE1, to another
+ file, FILE2. */
+struct differences
+{
+ /* An array mapping FILE1 indices to FILE2 indices (or -1 when the entry
+ from FILE1 is not found in FILE2). */
+ ssize_t *index_mapping;
+ /* An array mapping FILE2 indices to FILE1 indices (or -1 when the entry
+ from FILE2 is not found in FILE1). */
+ ssize_t *index_mapping_reverse;
+ /* The edits that transform FILE1 into FILE2. */
+ size_t num_edits;
+ struct edit **edits;
+};
+
+/* Import the difference detection algorithm from GNU diff. */
+#define ELEMENT struct entry *
+#define EQUAL entry_equals
+#define OFFSET ssize_t
+#define EXTRA_CONTEXT_FIELDS \
+ ssize_t *index_mapping; \
+ ssize_t *index_mapping_reverse;
+#define NOTE_DELETE(ctxt, xoff) \
+ ctxt->index_mapping[xoff] = -1
+#define NOTE_INSERT(ctxt, yoff) \
+ ctxt->index_mapping_reverse[yoff] = -1
+#include "diffseq.h"
+
+/* Compute the differences between the entries of FILE1 and the entries of
+ FILE2. */
+static void
+compute_differences (struct changelog_file *file1, struct changelog_file *file2,
+ struct differences *result)
+{
+ /* Unlike compute_mapping, which mostly ignores the order of the entries and
+ therefore works well when some entries are permuted, here we use the order.
+ I think this is needed in order to distinguish changes from
+ additions+removals; I don't know how to say what is a "change" if the
+ files are considered as unordered sets of entries. */
+ struct context ctxt;
+ size_t n1 = file1->num_entries;
+ size_t n2 = file2->num_entries;
+ ssize_t i;
+ ssize_t j;
+ gl_list_t /* <struct edit *> */ edits;
+
+ ctxt.xvec = file1->entries;
+ ctxt.yvec = file2->entries;
+ ctxt.index_mapping = XNMALLOC (n1, ssize_t);
+ for (i = 0; i < n1; i++)
+ ctxt.index_mapping[i] = 0;
+ ctxt.index_mapping_reverse = XNMALLOC (n2, ssize_t);
+ for (j = 0; j < n2; j++)
+ ctxt.index_mapping_reverse[j] = 0;
+ ctxt.fdiag = XNMALLOC (2 * (n1 + n2 + 3), ssize_t) + n2 + 1;
+ ctxt.bdiag = ctxt.fdiag + n1 + n2 + 3;
+ ctxt.too_expensive = n1 + n2;
+
+ /* Store in ctxt.index_mapping and ctxt.index_mapping_reverse a -1 for
+ each removed or added entry. */
+ compareseq (0, n1, 0, n2, 0, &ctxt);
+
+ /* Complete the index_mapping and index_mapping_reverse arrays. */
+ i = 0;
+ j = 0;
+ while (i < n1 || j < n2)
+ {
+ while (i < n1 && ctxt.index_mapping[i] < 0)
+ i++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0)
+ j++;
+ ASSERT ((i < n1) == (j < n2));
+ if (i == n1 && j == n2)
+ break;
+ ctxt.index_mapping[i] = j;
+ ctxt.index_mapping_reverse[j] = i;
+ i++;
+ j++;
+ }
+
+ /* Create the edits. */
+ edits = gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
+ i = 0;
+ j = 0;
+ while (i < n1 || j < n2)
+ {
+ if (i == n1)
+ {
+ struct edit *e;
+ ASSERT (j < n2);
+ e = XMALLOC (struct edit);
+ e->type = ADDITION;
+ e->j1 = j;
+ e->j2 = n2 - 1;
+ gl_list_add_last (edits, e);
+ break;
+ }
+ if (j == n2)
+ {
+ struct edit *e;
+ ASSERT (i < n1);
+ e = XMALLOC (struct edit);
+ e->type = REMOVAL;
+ e->i1 = i;
+ e->i2 = n1 - 1;
+ gl_list_add_last (edits, e);
+ break;
+ }
+ if (ctxt.index_mapping[i] >= 0)
+ {
+ if (ctxt.index_mapping_reverse[j] >= 0)
+ {
+ ASSERT (ctxt.index_mapping[i] == j);
+ ASSERT (ctxt.index_mapping_reverse[j] == i);
+ i++;
+ j++;
+ }
+ else
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping_reverse[j] < 0);
+ e = XMALLOC (struct edit);
+ e->type = ADDITION;
+ e->j1 = j;
+ do
+ j++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0);
+ e->j2 = j - 1;
+ gl_list_add_last (edits, e);
+ }
+ }
+ else
+ {
+ if (ctxt.index_mapping_reverse[j] >= 0)
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping[i] < 0);
+ e = XMALLOC (struct edit);
+ e->type = REMOVAL;
+ e->i1 = i;
+ do
+ i++;
+ while (i < n1 && ctxt.index_mapping[i] < 0);
+ e->i2 = i - 1;
+ gl_list_add_last (edits, e);
+ }
+ else
+ {
+ struct edit *e;
+ ASSERT (ctxt.index_mapping[i] < 0);
+ ASSERT (ctxt.index_mapping_reverse[j] < 0);
+ e = XMALLOC (struct edit);
+ e->type = CHANGE;
+ e->i1 = i;
+ do
+ i++;
+ while (i < n1 && ctxt.index_mapping[i] < 0);
+ e->i2 = i - 1;
+ e->j1 = j;
+ do
+ j++;
+ while (j < n2 && ctxt.index_mapping_reverse[j] < 0);
+ e->j2 = j - 1;
+ gl_list_add_last (edits, e);
+ }
+ }
+ }
+
+ result->index_mapping = ctxt.index_mapping;
+ result->index_mapping_reverse = ctxt.index_mapping_reverse;
+ result->num_edits = gl_list_size (edits);
+ result->edits = XNMALLOC (result->num_edits, struct edit *);
+ {
+ size_t index = 0;
+ gl_list_iterator_t iter = gl_list_iterator (edits);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ result->edits[index++] = (struct edit *) elt;
+ gl_list_iterator_free (&iter);
+ ASSERT (index == result->num_edits);
+ }
+}
+
+/* An empty entry. */
+static struct entry empty_entry = { NULL, 0 };
+
+/* Return the end a paragraph.
+ ENTRY is an entry.
+ OFFSET is an offset into the entry, OFFSET <= ENTRY->length.
+ Return the offset of the end of paragraph, as an offset <= ENTRY->length;
+ it is the start of a blank line or the end of the entry. */
+static size_t
+find_paragraph_end (const struct entry *entry, size_t offset)
+{
+ const char *string = entry->string;
+ size_t length = entry->length;
+
+ for (;;)
+ {
+ const char *nl = memchr (string + offset, '\n', length - offset);
+ if (nl == NULL)
+ return length;
+ offset = (nl - string) + 1;
+ if (offset < length && string[offset] == '\n')
+ return offset;
+ }
+}
+
+/* Split a merged entry.
+ Given an old entry of the form
+ TITLE
+ BODY
+ and a new entry of the form
+ TITLE
+ BODY1
+ BODY'
+ where the two titles are the same and BODY and BODY' are very similar,
+ this computes two new entries
+ TITLE
+ BODY1
+ and
+ TITLE
+ BODY'
+ and returns true.
+ If the entries don't have this form, it returns false. */
+static bool
+try_split_merged_entry (const struct entry *old_entry,
+ const struct entry *new_entry,
+ struct entry *new_split[2])
+{
+ size_t old_title_len = find_paragraph_end (old_entry, 0);
+ size_t new_title_len = find_paragraph_end (new_entry, 0);
+ struct entry old_body;
+ struct entry new_body;
+ size_t best_split_offset;
+ double best_similarity;
+ size_t split_offset;
+
+ /* Same title? */
+ if (!(old_title_len == new_title_len
+ && memcmp (old_entry->string, new_entry->string, old_title_len) == 0))
+ return false;
+
+ old_body.string = old_entry->string + old_title_len;
+ old_body.length = old_entry->length - old_title_len;
+
+ /* Determine where to split the new entry.
+ This is done by maximizing the similarity between BODY and BODY'. */
+ best_split_offset = split_offset = new_title_len;
+ best_similarity = 0.0;
+ for (;;)
+ {
+ double similarity;
+
+ new_body.string = new_entry->string + split_offset;
+ new_body.length = new_entry->length - split_offset;
+ similarity =
+ entry_fstrcmp (&old_body, &new_body, best_similarity);
+ if (similarity > best_similarity)
+ {
+ best_split_offset = split_offset;
+ best_similarity = similarity;
+ }
+ if (best_similarity == 1.0)
+ /* It cannot get better. */
+ break;
+
+ if (split_offset < new_entry->length)
+ split_offset = find_paragraph_end (new_entry, split_offset + 1);
+ else
+ break;
+ }
+
+ /* BODY' should not be empty. */
+ if (best_split_offset == new_entry->length)
+ return false;
+ ASSERT (new_entry->string[best_split_offset] == '\n');
+
+ /* A certain similarity between BODY and BODY' is required. */
+ if (best_similarity < FSTRCMP_STRICTER_THRESHOLD)
+ return false;
+
+ new_split[0] = entry_create (new_entry->string, best_split_offset + 1);
+
+ {
+ size_t len1 = new_title_len;
+ size_t len2 = new_entry->length - best_split_offset;
+ char *combined = XNMALLOC (len1 + len2, char);
+ memcpy (combined, new_entry->string, len1);
+ memcpy (combined + len1, new_entry->string + best_split_offset, len2);
+ new_split[1] = entry_create (combined, len1 + len2);
+ }
+
+ return true;
+}
+
+/* Write the contents of an entry to the output stream FP. */
+static void
+entry_write (FILE *fp, struct entry *entry)
+{
+ if (entry->length > 0)
+ fwrite (entry->string, 1, entry->length, fp);
+}
+
+/* This structure represents a conflict.
+ A conflict can occur for various reasons. */
+struct conflict
+{
+ /* Parts from the ancestor file. */
+ size_t num_old_entries;
+ struct entry **old_entries;
+ /* Parts of the modified file. */
+ size_t num_modified_entries;
+ struct entry **modified_entries;
+};
+
+/* Write a conflict to the output stream FP, including markers. */
+static void
+conflict_write (FILE *fp, struct conflict *c)
+{
+ size_t i;
+
+ /* Use the same syntax as git's default merge driver.
+ Don't indent the contents of the entries (with things like ">" or "-"),
+ otherwise the user needs more textual editing to resolve the conflict. */
+ fputs ("<<<<<<<\n", fp);
+ for (i = 0; i < c->num_old_entries; i++)
+ entry_write (fp, c->old_entries[i]);
+ fputs ("=======\n", fp);
+ for (i = 0; i < c->num_modified_entries; i++)
+ entry_write (fp, c->modified_entries[i]);
+ fputs (">>>>>>>\n", fp);
+}
+
+/* Long options. */
+static const struct option long_options[] =
+{
+ { "help", no_argument, NULL, 'h' },
+ { "split-merged-entry", no_argument, NULL, CHAR_MAX + 1 },
+ { "version", no_argument, NULL, 'V' },
+ { NULL, 0, NULL, 0 }
+};
+
+/* Print a usage mesage and exit. */
+static void
+usage (int status)
+{
+ if (status != EXIT_SUCCESS)
+ fprintf (stderr, "Try `%s --help' for more information.\n",
+ program_name);
+ else
+ {
+ printf ("Usage: %s [OPTION] O-FILE-NAME A-FILE-NAME B-FILE-NAME\n",
+ program_name);
+ printf ("\n");
+ printf ("Merges independent modifications of a ChangeLog style file.\n");
+ printf ("O-FILE-NAME names the original file, the ancestor of the two others.\n");
+ printf ("A-FILE-NAME names the publicly modified file.\n");
+ printf ("B-FILE-NAME names the user-modified file.\n");
+ printf ("Writes the merged file into A-FILE-NAME.\n");
+ printf ("\n");
+ #if 0 /* --split-merged-entry is now on by default. */
+ printf ("Operation modifiers:\n");
+ printf ("\
+ --split-merged-entry Possibly split a merged entry between paragraphs.\n\
+ Use this if you have the habit to merge unrelated\n\
+ entries into a single one, separated only by a\n\
+ newline, just because they happened on the same\n\
+ date.\n");
+ printf ("\n");
+ #endif
+ printf ("Informative output:\n");
+ printf (" -h, --help display this help and exit\n");
+ printf (" -V, --version output version information and exit\n");
+ printf ("\n");
+ fputs ("Report bugs to <bug-gnu-gettext@gnu.org>.\n",
+ stdout);
+ }
+
+ exit (status);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int optchar;
+ bool do_help;
+ bool do_version;
+ bool split_merged_entry;
+
+ /* Set program name for messages. */
+ set_program_name (argv[0]);
+
+ /* Set default values for variables. */
+ do_help = false;
+ do_version = false;
+ split_merged_entry = true;
+
+ /* Parse command line options. */
+ while ((optchar = getopt_long (argc, argv, "hV", long_options, NULL)) != EOF)
+ switch (optchar)
+ {
+ case '\0': /* Long option. */
+ break;
+ case 'h':
+ do_help = true;
+ break;
+ case 'V':
+ do_version = true;
+ break;
+ case CHAR_MAX + 1: /* --split-merged-entry */
+ break;
+ default:
+ usage (EXIT_FAILURE);
+ }
+
+ if (do_version)
+ {
+ /* Version information is requested. */
+ printf ("%s\n", program_name);
+ printf ("Copyright (C) %s Free Software Foundation, Inc.\n\
+License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n\
+",
+ "2008");
+ printf ("Written by %s.\n", "Bruno Haible");
+ exit (EXIT_SUCCESS);
+ }
+
+ if (do_help)
+ {
+ /* Help is requested. */
+ usage (EXIT_SUCCESS);
+ }
+
+ /* Test argument count. */
+ if (optind + 3 != argc)
+ error (EXIT_FAILURE, 0, "expected three arguments");
+
+ {
+ const char *ancestor_file_name; /* O-FILE-NAME */
+ const char *destination_file_name; /* A-FILE-NAME */
+ bool downstream;
+ const char *other_file_name; /* B-FILE-NAME */
+ const char *mainstream_file_name;
+ const char *modified_file_name;
+ struct changelog_file ancestor_file;
+ struct changelog_file mainstream_file;
+ struct changelog_file modified_file;
+ /* Mapping from indices in ancestor_file to indices in mainstream_file. */
+ struct entries_mapping mapping;
+ struct differences diffs;
+ gl_list_node_t *result_entries_pointers; /* array of pointers into result_entries */
+ gl_list_t /* <struct entry *> */ result_entries;
+ gl_list_t /* <struct conflict *> */ result_conflicts;
+
+ ancestor_file_name = argv[optind];
+ destination_file_name = argv[optind + 1];
+ other_file_name = argv[optind + 2];
+
+ /* Heuristic to determine whether it's a pull in downstream direction
+ (e.g. pull from a centralized server) or a pull in upstream direction
+ (e.g. "git stash apply").
+
+ For ChangeLog this distinction is important. The difference between
+ an "upstream" and a "downstream" repository is that more people are
+ looking at the "upstream" repository. They want to be informed about
+ changes and expect them to be shown at the top of the ChangeLog.
+ When a user pulls downstream, on the other hand, he has two options:
+ a) He gets the change entries from the central repository also at the
+ top of his ChangeLog, and his own changes come after them.
+ b) He gets the change entries from the central repository after those
+ he has collected for his branch. His own change entries stay at
+ the top of the ChangeLog file.
+ In the case a) he has to reorder the ChangeLog before he can commit.
+ No one does that. So most people want b).
+ In other words, the order of entries in a ChangeLog should represent
+ the order in which they have flown (or will flow) into the *central*
+ repository.
+
+ But in git this is fundamentally indistinguishable, because when Linus
+ pulls patches from akpm and akpm pulls patches from Linus, it's not
+ clear which of the two is more "upstream". Also, when you have many
+ branches in a repository and pull from one to another, "git" has no way
+ to know which branch is more "upstream" than the other. The git-tag(1)
+ manual page also says:
+ "One important aspect of git is it is distributed, and being
+ distributed largely means there is no inherent "upstream" or
+ "downstream" in the system."
+ Therefore anyone who attempts to produce a ChangeLog from the merge
+ history will fail.
+
+ Here we allow the user to specify the pull direction through an
+ environment variable (GIT_UPSTREAM or GIT_DOWNSTREAM). If these two
+ environment variables are not set, we assume a "simple single user"
+ usage pattern: He manages local changes through stashes and uses
+ "git pull" only to pull downstream.
+
+ How to distinguish these situation? There are several hints:
+ - During a "git stash apply", GIT_REFLOG_ACTION is not set. During
+ a "git pull", it is set to 'pull '. During a "git pull --rebase",
+ it is set to 'pull --rebase'. During a "git cherry-pick", it is
+ set to 'cherry-pick'.
+ - During a "git stash apply", there is an environment variable of
+ the form GITHEAD_<40_hex_digits>='Stashed changes'. */
+ {
+ const char *var;
+
+ var = getenv ("GIT_DOWNSTREAM");
+ if (var != NULL && var[0] != '\0')
+ downstream = true;
+ else
+ {
+ var = getenv ("GIT_UPSTREAM");
+ if (var != NULL && var[0] != '\0')
+ downstream = false;
+ else
+ {
+ var = getenv ("GIT_REFLOG_ACTION");
+ #if 0 /* Debugging code */
+ printf ("GIT_REFLOG_ACTION=|%s|\n", var);
+ #endif
+ if (var != NULL
+ && ((strncmp (var, "pull", 4) == 0
+ && c_strstr (var, " --rebase") == NULL)
+ || strncmp (var, "merge origin", 12) == 0))
+ downstream = true;
+ else
+ {
+ /* "git stash apply", "git rebase", "git cherry-pick" and
+ similar. */
+ downstream = false;
+ }
+ }
+ }
+ }
+
+ #if 0 /* Debugging code */
+ {
+ char buf[1000];
+ printf ("First line of %%A:\n");
+ sprintf (buf, "head -1 %s", destination_file_name); system (buf);
+ printf ("First line of %%B:\n");
+ sprintf (buf, "head -1 %s", other_file_name); system (buf);
+ printf ("Guessing calling convention: %s\n",
+ downstream
+ ? "%A = modified by user, %B = upstream"
+ : "%A = upstream, %B = modified by user");
+ }
+ #endif
+
+ if (downstream)
+ {
+ mainstream_file_name = other_file_name;
+ modified_file_name = destination_file_name;
+ }
+ else
+ {
+ mainstream_file_name = destination_file_name;
+ modified_file_name = other_file_name;
+ }
+
+ /* Read the three files into memory. */
+ read_changelog_file (ancestor_file_name, &ancestor_file);
+ read_changelog_file (mainstream_file_name, &mainstream_file);
+ read_changelog_file (modified_file_name, &modified_file);
+
+ /* Compute correspondence between the entries of ancestor_file and of
+ mainstream_file. */
+ compute_mapping (&ancestor_file, &mainstream_file, false, &mapping);
+ (void) entries_mapping_reverse_get; /* avoid gcc "defined but not" warning */
+
+ /* Compute differences between the entries of ancestor_file and of
+ modified_file. */
+ compute_differences (&ancestor_file, &modified_file, &diffs);
+
+ /* Compute the result. */
+ result_entries_pointers =
+ XNMALLOC (mainstream_file.num_entries, gl_list_node_t);
+ result_entries =
+ gl_list_create_empty (GL_LINKED_LIST, entry_equals, entry_hashcode,
+ NULL, true);
+ {
+ size_t k;
+ for (k = 0; k < mainstream_file.num_entries; k++)
+ result_entries_pointers[k] =
+ gl_list_add_last (result_entries, mainstream_file.entries[k]);
+ }
+ result_conflicts =
+ gl_list_create_empty (GL_ARRAY_LIST, NULL, NULL, NULL, true);
+ {
+ size_t e;
+ for (e = 0; e < diffs.num_edits; e++)
+ {
+ struct edit *edit = diffs.edits[e];
+ switch (edit->type)
+ {
+ case ADDITION:
+ if (edit->j1 == 0)
+ {
+ /* An addition to the top of modified_file.
+ Apply it to the top of mainstream_file. */
+ ssize_t j;
+ for (j = edit->j2; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ }
+ else
+ {
+ ssize_t i_before;
+ ssize_t i_after;
+ ssize_t k_before;
+ ssize_t k_after;
+ i_before = diffs.index_mapping_reverse[edit->j1 - 1];
+ ASSERT (i_before >= 0);
+ i_after = (edit->j2 + 1 == modified_file.num_entries
+ ? ancestor_file.num_entries
+ : diffs.index_mapping_reverse[edit->j2 + 1]);
+ ASSERT (i_after >= 0);
+ ASSERT (i_after == i_before + 1);
+ /* An addition between ancestor_file.entries[i_before] and
+ ancestor_file.entries[i_after]. See whether these two
+ entries still exist in mainstream_file and are still
+ consecutive. */
+ k_before = entries_mapping_get (&mapping, i_before);
+ k_after = (i_after == ancestor_file.num_entries
+ ? mainstream_file.num_entries
+ : entries_mapping_get (&mapping, i_after));
+ if (k_before >= 0 && k_after >= 0 && k_after == k_before + 1)
+ {
+ /* Yes, the entry before and after are still neighbours
+ in mainstream_file. Apply the addition between
+ them. */
+ if (k_after == mainstream_file.num_entries)
+ {
+ size_t j;
+ for (j = edit->j1; j <= edit->j2; j++)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_last (result_entries, added_entry);
+ }
+ }
+ else
+ {
+ gl_list_node_t node_k_after = result_entries_pointers[k_after];
+ size_t j;
+ for (j = edit->j1; j <= edit->j2; j++)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_k_after, added_entry);
+ }
+ }
+ }
+ else
+ {
+ /* It's not clear where the additions should be applied.
+ Let the user decide. */
+ struct conflict *c = XMALLOC (struct conflict);
+ size_t j;
+ c->num_old_entries = 0;
+ c->old_entries = NULL;
+ c->num_modified_entries = edit->j2 - edit->j1 + 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ for (j = edit->j1; j <= edit->j2; j++)
+ c->modified_entries[j - edit->j1] = modified_file.entries[j];
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ break;
+ case REMOVAL:
+ {
+ /* Apply the removals one by one. */
+ size_t i;
+ for (i = edit->i1; i <= edit->i2; i++)
+ {
+ struct entry *removed_entry = ancestor_file.entries[i];
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (removed_entry,
+ mainstream_file.entries[k]))
+ {
+ /* The entry to be removed still exists in
+ mainstream_file. Remove it. */
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ &empty_entry);
+ }
+ else
+ {
+ /* The entry to be removed was already removed or was
+ modified. This is a conflict. */
+ struct conflict *c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = removed_entry;
+ c->num_modified_entries = 0;
+ c->modified_entries = NULL;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ }
+ break;
+ case CHANGE:
+ {
+ bool done = false;
+ /* When the user usually merges entries from the same day,
+ and this edit is at the top of the file: */
+ if (split_merged_entry && edit->j1 == 0)
+ {
+ /* Test whether the change is "simple merged", i.e. whether
+ it consists of additions, followed by an augmentation of
+ the first changed entry, followed by small changes of the
+ remaining entries:
+ entry_1
+ entry_2
+ ...
+ entry_n
+ are mapped to
+ added_entry
+ ...
+ added_entry
+ augmented_entry_1
+ modified_entry_2
+ ...
+ modified_entry_n. */
+ if (edit->i2 - edit->i1 <= edit->j2 - edit->j1)
+ {
+ struct entry *split[2];
+ bool simple_merged =
+ try_split_merged_entry (ancestor_file.entries[edit->i1],
+ modified_file.entries[edit->i1 + edit->j2 - edit->i2],
+ split);
+ if (simple_merged)
+ {
+ size_t i;
+ for (i = edit->i1 + 1; i <= edit->i2; i++)
+ if (entry_fstrcmp (ancestor_file.entries[i],
+ modified_file.entries[i + edit->j2 - edit->i2],
+ FSTRCMP_THRESHOLD)
+ < FSTRCMP_THRESHOLD)
+ {
+ simple_merged = false;
+ break;
+ }
+ }
+ if (simple_merged)
+ {
+ /* Apply the additions at the top of modified_file.
+ Apply each of the single-entry changes
+ separately. */
+ size_t num_changed = edit->i2 - edit->i1 + 1; /* > 0 */
+ size_t num_added = (edit->j2 - edit->j1 + 1) - num_changed;
+ ssize_t j;
+ /* First part of the split modified_file.entries[edit->j2 - edit->i2 + edit->i1]: */
+ gl_list_add_first (result_entries, split[0]);
+ /* The additions. */
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ /* Now the single-entry changes. */
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry =
+ (j == edit->j1 + num_added
+ ? split[1]
+ : modified_file.entries[j]);
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else if (!entry_equals (ancestor_file.entries[i],
+ changed_entry))
+ {
+ struct conflict *c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ }
+ }
+ if (!done)
+ {
+ bool simple;
+ /* Test whether the change is "simple", i.e. whether it
+ consists of small changes to the old ChangeLog entries
+ and additions before them:
+ entry_1
+ ...
+ entry_n
+ are mapped to
+ added_entry
+ ...
+ added_entry
+ modified_entry_1
+ ...
+ modified_entry_n. */
+ if (edit->i2 - edit->i1 <= edit->j2 - edit->j1)
+ {
+ size_t i;
+ simple = true;
+ for (i = edit->i1; i <= edit->i2; i++)
+ if (entry_fstrcmp (ancestor_file.entries[i],
+ modified_file.entries[i + edit->j2 - edit->i2],
+ FSTRCMP_THRESHOLD)
+ < FSTRCMP_THRESHOLD)
+ {
+ simple = false;
+ break;
+ }
+ }
+ else
+ simple = false;
+ if (simple)
+ {
+ /* Apply the additions and each of the single-entry
+ changes separately. */
+ size_t num_changed = edit->i2 - edit->i1 + 1; /* > 0 */
+ size_t num_added = (edit->j2 - edit->j1 + 1) - num_changed;
+ if (edit->j1 == 0)
+ {
+ /* A simple change at the top of modified_file.
+ Apply it to the top of mainstream_file. */
+ ssize_t j;
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_first (result_entries, added_entry);
+ }
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry = modified_file.entries[j];
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ if (k >= 0
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else
+ {
+ struct conflict *c;
+ ASSERT (!entry_equals (ancestor_file.entries[i],
+ changed_entry));
+ c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ else
+ {
+ ssize_t i_before;
+ ssize_t k_before;
+ bool linear;
+ i_before = diffs.index_mapping_reverse[edit->j1 - 1];
+ ASSERT (i_before >= 0);
+ /* A simple change after ancestor_file.entries[i_before].
+ See whether this entry and the following num_changed
+ entries still exist in mainstream_file and are still
+ consecutive. */
+ k_before = entries_mapping_get (&mapping, i_before);
+ linear = (k_before >= 0);
+ if (linear)
+ {
+ size_t i;
+ for (i = i_before + 1; i <= i_before + num_changed; i++)
+ if (entries_mapping_get (&mapping, i) != k_before + (i - i_before))
+ {
+ linear = false;
+ break;
+ }
+ }
+ if (linear)
+ {
+ gl_list_node_t node_for_insert =
+ result_entries_pointers[k_before + 1];
+ ssize_t j;
+ for (j = edit->j1 + num_added - 1; j >= edit->j1; j--)
+ {
+ struct entry *added_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_for_insert, added_entry);
+ }
+ for (j = edit->j1 + num_added; j <= edit->j2; j++)
+ {
+ struct entry *changed_entry = modified_file.entries[j];
+ size_t i = j + edit->i2 - edit->j2;
+ ssize_t k = entries_mapping_get (&mapping, i);
+ ASSERT (k >= 0);
+ if (entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]))
+ {
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ changed_entry);
+ }
+ else
+ {
+ struct conflict *c;
+ ASSERT (!entry_equals (ancestor_file.entries[i],
+ changed_entry));
+ c = XMALLOC (struct conflict);
+ c->num_old_entries = 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ c->old_entries[0] = ancestor_file.entries[i];
+ c->num_modified_entries = 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ c->modified_entries[0] = changed_entry;
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ done = true;
+ }
+ }
+ }
+ else
+ {
+ /* A big change.
+ See whether the num_changed entries still exist
+ unchanged in mainstream_file and are still
+ consecutive. */
+ ssize_t i_first;
+ ssize_t k_first;
+ bool linear_unchanged;
+ i_first = edit->i1;
+ k_first = entries_mapping_get (&mapping, i_first);
+ linear_unchanged =
+ (k_first >= 0
+ && entry_equals (ancestor_file.entries[i_first],
+ mainstream_file.entries[k_first]));
+ if (linear_unchanged)
+ {
+ size_t i;
+ for (i = i_first + 1; i <= edit->i2; i++)
+ if (!(entries_mapping_get (&mapping, i) == k_first + (i - i_first)
+ && entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[entries_mapping_get (&mapping, i)])))
+ {
+ linear_unchanged = false;
+ break;
+ }
+ }
+ if (linear_unchanged)
+ {
+ gl_list_node_t node_for_insert =
+ result_entries_pointers[k_first];
+ ssize_t j;
+ size_t i;
+ for (j = edit->j2; j >= edit->j1; j--)
+ {
+ struct entry *new_entry = modified_file.entries[j];
+ gl_list_add_before (result_entries, node_for_insert, new_entry);
+ }
+ for (i = edit->i1; i <= edit->i2; i++)
+ {
+ ssize_t k = entries_mapping_get (&mapping, i);
+ ASSERT (k >= 0);
+ ASSERT (entry_equals (ancestor_file.entries[i],
+ mainstream_file.entries[k]));
+ gl_list_node_set_value (result_entries,
+ result_entries_pointers[k],
+ &empty_entry);
+ }
+ done = true;
+ }
+ }
+ }
+ if (!done)
+ {
+ struct conflict *c = XMALLOC (struct conflict);
+ size_t i, j;
+ c->num_old_entries = edit->i2 - edit->i1 + 1;
+ c->old_entries =
+ XNMALLOC (c->num_old_entries, struct entry *);
+ for (i = edit->i1; i <= edit->i2; i++)
+ c->old_entries[i - edit->i1] = ancestor_file.entries[i];
+ c->num_modified_entries = edit->j2 - edit->j1 + 1;
+ c->modified_entries =
+ XNMALLOC (c->num_modified_entries, struct entry *);
+ for (j = edit->j1; j <= edit->j2; j++)
+ c->modified_entries[j - edit->j1] = modified_file.entries[j];
+ gl_list_add_last (result_conflicts, c);
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ /* Output the result. */
+ {
+ FILE *fp = fopen (destination_file_name, "w");
+ if (fp == NULL)
+ {
+ fprintf (stderr, "could not write file '%s'\n", destination_file_name);
+ exit (EXIT_FAILURE);
+ }
+
+ /* Output the conflicts at the top. */
+ {
+ size_t n = gl_list_size (result_conflicts);
+ size_t i;
+ for (i = 0; i < n; i++)
+ conflict_write (fp, (struct conflict *) gl_list_get_at (result_conflicts, i));
+ }
+ /* Output the modified and unmodified entries, in order. */
+ {
+ gl_list_iterator_t iter = gl_list_iterator (result_entries);
+ const void *elt;
+ gl_list_node_t node;
+ while (gl_list_iterator_next (&iter, &elt, &node))
+ entry_write (fp, (struct entry *) elt);
+ gl_list_iterator_free (&iter);
+ }
+
+ if (fwriteerror (fp))
+ {
+ fprintf (stderr, "error writing to file '%s'\n", destination_file_name);
+ exit (EXIT_FAILURE);
+ }
+ }
+
+ exit (gl_list_size (result_conflicts) > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
+}
diff --git a/gnulib/lib/gl_anyavltree_list1.h b/gnulib/lib/gl_anyavltree_list1.h
new file mode 100644
index 0000000..c0f1679
--- /dev/null
+++ b/gnulib/lib/gl_anyavltree_list1.h
@@ -0,0 +1,70 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltree_list.c and gl_avltreehash_list.c. */
+
+/* An AVL tree is a binary tree where
+ 1. The height of each node is calculated as
+ heightof(node) = 1 + max (heightof(node.left), heightof(node.right)).
+ 2. The heights of the subtrees of each node differ by at most 1:
+ | heightof(right) - heightof(left) | <= 1.
+ 3. The index of the elements in the node.left subtree are smaller than
+ the index of node.
+ The index of the elements in the node.right subtree are larger than
+ the index of node.
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *left; /* left branch, or NULL */
+ struct gl_list_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_list_node_t can be returned
+ without memory allocation, on which the functions gl_list_remove_node,
+ gl_list_add_before, gl_list_add_after can be implemented. */
+ struct gl_list_node_impl *parent;
+ int balance; /* heightof(right) - heightof(left),
+ always = -1 or 0 or 1 */
+ size_t branch_size; /* number of nodes in this branch,
+ = branchsize(left)+branchsize(right)+1 */
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ struct gl_list_node_impl *root; /* root node or NULL */
+};
+
+/* An AVL tree of height h has at least F_(h+2) [Fibonacci number] and at most
+ 2^h - 1 elements. So, h <= 84 (because a tree of height h >= 85 would have
+ at least F_87 elements, and because even on 64-bit machines,
+ sizeof (gl_list_node_impl) * F_87 > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 83
diff --git a/gnulib/lib/gl_anyavltree_list2.h b/gnulib/lib/gl_anyavltree_list2.h
new file mode 100644
index 0000000..41cca3c
--- /dev/null
+++ b/gnulib/lib/gl_anyavltree_list2.h
@@ -0,0 +1,809 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltree_list.c and gl_avltreehash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Create a subtree for count >= 1 elements.
+ Its height is h where 2^(h-1) <= count <= 2^h - 1.
+ Return NULL upon out-of-memory. */
+static gl_list_node_t
+create_subtree_with_contents (size_t count, const void **contents)
+{
+ size_t half1 = (count - 1) / 2;
+ size_t half2 = count / 2;
+ /* Note: half1 + half2 = count - 1. */
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (node == NULL)
+ return NULL;
+
+ if (half1 > 0)
+ {
+ node->left = create_subtree_with_contents (half1, contents);
+ if (node->left == NULL)
+ goto fail1;
+ node->left->parent = node;
+ }
+ else
+ node->left = NULL;
+
+ node->value = contents[half1];
+
+ if (half2 > 0)
+ {
+ node->right = create_subtree_with_contents (half2, contents + half1 + 1);
+ if (node->right == NULL)
+ goto fail2;
+ node->right->parent = node;
+ }
+ else
+ node->right = NULL;
+
+ /* balance is 0, except when count is a power of two and > 1.
+ Reason: half1 <= half2 <= half1 + 1, and the two branches can have
+ different heights only if half1 = 2^h - 1 and half2 = 2^h; in this
+ case, count = half1 + half2 + 1 = 2^(h+1). */
+ node->balance = (count > 1 && (count & (count - 1)) == 0 ? 1 : 0);
+
+ node->branch_size = count;
+
+ return node;
+
+ fail2:
+ if (node->left != NULL)
+ free_subtree (node->left);
+ fail1:
+ free (node);
+ return NULL;
+}
+
+static gl_list_t
+gl_tree_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ if (count > 0)
+ {
+ list->root = create_subtree_with_contents (count, contents);
+ if (list->root == NULL)
+ goto fail2;
+ list->root->parent = NULL;
+
+#if WITH_HASHTABLE
+ /* Now that the tree is built, node_position() works. Now we can
+ add the nodes to the hash table. */
+ if (add_nodes_to_buckets (list) < 0)
+ goto fail3;
+#endif
+ }
+ else
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail3:
+ free_subtree (list->root);
+#endif
+ fail2:
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+/* Ensure the tree is balanced, after an insertion or deletion operation.
+ The height of NODE is incremented by HEIGHT_DIFF (1 or -1).
+ PARENT = NODE->parent. (NODE can also be NULL. But PARENT is non-NULL.)
+ Rotation operations are performed starting at PARENT (not NODE itself!). */
+static void
+rebalance (gl_list_t list,
+ gl_list_node_t node, int height_diff, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ gl_list_node_t child;
+ int previous_balance;
+ int balance_diff;
+ gl_list_node_t nodeleft;
+ gl_list_node_t noderight;
+
+ child = node;
+ node = parent;
+
+ previous_balance = node->balance;
+
+ /* The balance of NODE is incremented by BALANCE_DIFF: +1 if the right
+ branch's height has increased by 1 or the left branch's height has
+ decreased by 1, -1 if the right branch's height has decreased by 1 or
+ the left branch's height has increased by 1, 0 if no height change. */
+ if (node->left != NULL || node->right != NULL)
+ balance_diff = (child == node->right ? height_diff : -height_diff);
+ else
+ /* Special case where above formula doesn't work, because the caller
+ didn't tell whether node's left or right branch shrunk from height 1
+ to NULL. */
+ balance_diff = - previous_balance;
+
+ node->balance += balance_diff;
+ if (balance_diff == previous_balance)
+ {
+ /* node->balance is outside the range [-1,1]. Must rotate. */
+ gl_list_node_t *nodep;
+
+ if (node->parent == NULL)
+ /* node == list->root */
+ nodep = &list->root;
+ else if (node->parent->left == node)
+ nodep = &node->parent->left;
+ else if (node->parent->right == node)
+ nodep = &node->parent->right;
+ else
+ abort ();
+
+ nodeleft = node->left;
+ noderight = node->right;
+
+ if (balance_diff < 0)
+ {
+ /* node->balance = -2. The subtree is heavier on the left side.
+ Rotate from left to right:
+
+ *
+ / \
+ h+2 h
+ */
+ gl_list_node_t nodeleftleft = nodeleft->left;
+ gl_list_node_t nodeleftright = nodeleft->right;
+ if (nodeleft->balance <= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h+2 h --> / h+1|h+2
+ / \ | / \
+ h+1 h|h+1 h+1 h|h+1 h
+ */
+ node->left = nodeleftright;
+ nodeleft->right = node;
+
+ nodeleft->parent = node->parent;
+ node->parent = nodeleft;
+ if (nodeleftright != NULL)
+ nodeleftright->parent = node;
+
+ nodeleft->balance += 1;
+ node->balance = - nodeleft->balance;
+
+ node->branch_size =
+ (nodeleftright != NULL ? nodeleftright->branch_size : 0)
+ + 1 + (noderight != NULL ? noderight->branch_size : 0);
+ nodeleft->branch_size =
+ nodeleftleft->branch_size + 1 + node->branch_size;
+
+ *nodep = nodeleft;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ nodeleft->balance - 1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ nodeleft->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h+2 h --> h+1 h+1
+ / \ / \ / \
+ h h+1 h L R h
+ / \
+ L R
+
+ */
+ gl_list_node_t L = nodeleft->right = nodeleftright->left;
+ gl_list_node_t R = node->left = nodeleftright->right;
+ nodeleftright->left = nodeleft;
+ nodeleftright->right = node;
+
+ nodeleftright->parent = node->parent;
+ if (L != NULL)
+ L->parent = nodeleft;
+ if (R != NULL)
+ R->parent = node;
+ nodeleft->parent = nodeleftright;
+ node->parent = nodeleftright;
+
+ nodeleft->balance = (nodeleftright->balance > 0 ? -1 : 0);
+ node->balance = (nodeleftright->balance < 0 ? 1 : 0);
+ nodeleftright->balance = 0;
+
+ nodeleft->branch_size =
+ (nodeleft->left != NULL ? nodeleft->left->branch_size : 0)
+ + 1 + (nodeleft->right != NULL ? nodeleft->right->branch_size : 0);
+ node->branch_size =
+ (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0);
+ nodeleftright->branch_size =
+ nodeleft->branch_size + 1 + node->branch_size;
+
+ *nodep = nodeleftright;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ else
+ {
+ /* node->balance = 2. The subtree is heavier on the right side.
+ Rotate from right to left:
+
+ *
+ / \
+ h h+2
+ */
+ gl_list_node_t noderightleft = noderight->left;
+ gl_list_node_t noderightright = noderight->right;
+ if (noderight->balance >= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h h+2 --> h+1|h+2 \
+ / \ / \ |
+ h|h+1 h+1 h h|h+1 h+1
+ */
+ node->right = noderightleft;
+ noderight->left = node;
+
+ noderight->parent = node->parent;
+ node->parent = noderight;
+ if (noderightleft != NULL)
+ noderightleft->parent = node;
+
+ noderight->balance -= 1;
+ node->balance = - noderight->balance;
+
+ node->branch_size =
+ (nodeleft != NULL ? nodeleft->branch_size : 0)
+ + 1 + (noderightleft != NULL ? noderightleft->branch_size : 0);
+ noderight->branch_size =
+ node->branch_size + 1 + noderightright->branch_size;
+
+ *nodep = noderight;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ - noderight->balance - 1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ - noderight->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h h+2 --> h+1 h+1
+ / \ / \ / \
+ h+1 h h L R h
+ / \
+ L R
+
+ */
+ gl_list_node_t L = node->right = noderightleft->left;
+ gl_list_node_t R = noderight->left = noderightleft->right;
+ noderightleft->left = node;
+ noderightleft->right = noderight;
+
+ noderightleft->parent = node->parent;
+ if (L != NULL)
+ L->parent = node;
+ if (R != NULL)
+ R->parent = noderight;
+ node->parent = noderightleft;
+ noderight->parent = noderightleft;
+
+ node->balance = (noderightleft->balance > 0 ? -1 : 0);
+ noderight->balance = (noderightleft->balance < 0 ? 1 : 0);
+ noderightleft->balance = 0;
+
+ node->branch_size =
+ (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0);
+ noderight->branch_size =
+ (noderight->left != NULL ? noderight->left->branch_size : 0)
+ + 1 + (noderight->right != NULL ? noderight->right->branch_size : 0);
+ noderightleft->branch_size =
+ node->branch_size + 1 + noderight->branch_size;
+
+ *nodep = noderightleft;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ node = *nodep;
+ }
+ else
+ {
+ /* No rotation needed. Only propagation of the height change to the
+ next higher level. */
+ if (height_diff < 0)
+ height_diff = (previous_balance == 0 ? 0 : -1);
+ else
+ height_diff = (node->balance == 0 ? 0 : 1);
+ }
+
+ if (height_diff == 0)
+ break;
+
+ parent = node->parent;
+ if (parent == NULL)
+ break;
+ }
+}
+
+static void
+gl_tree_remove_node_from_tree (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_list_node_t child = node->right;
+
+ if (child != NULL)
+ child->parent = parent;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ rebalance (list, child, -1, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_list_node_t child = node->left;
+
+ child->parent = parent;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ rebalance (list, child, -1, parent);
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_list_node_t subst;
+ gl_list_node_t subst_parent;
+ gl_list_node_t child;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = subst_parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->balance = node->balance;
+ subst->branch_size = node->branch_size;
+ subst->parent = parent;
+ if (parent == NULL)
+ list->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance (list, child, -1, subst_parent != node ? subst_parent : subst);
+ }
+}
+
+static gl_list_node_t
+gl_tree_nx_add_first (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+ node->balance--;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (node->right == NULL && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_last (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->right != NULL; )
+ node = node->right;
+
+ node->right = new_node;
+ new_node->parent = node;
+ node->balance++;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (node->left == NULL && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node;
+ bool height_inc;
+
+ new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ {
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node;
+ bool height_inc;
+
+ new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ {
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (list, node, 1, node->parent);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
diff --git a/gnulib/lib/gl_anyhash_list1.h b/gnulib/lib/gl_anyhash_list1.h
new file mode 100644
index 0000000..47400e1
--- /dev/null
+++ b/gnulib/lib/gl_anyhash_list1.h
@@ -0,0 +1,27 @@
+/* Sequential list data type implemented by a hash table with another list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of
+ gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* Hash table entry. */
+struct gl_hash_entry
+{
+ struct gl_hash_entry *hash_next; /* chain of entries in same bucket */
+ size_t hashcode; /* cache of values' common hash code */
+};
+typedef struct gl_hash_entry * gl_hash_entry_t;
diff --git a/gnulib/lib/gl_anyhash_list2.h b/gnulib/lib/gl_anyhash_list2.h
new file mode 100644
index 0000000..96b98e8
--- /dev/null
+++ b/gnulib/lib/gl_anyhash_list2.h
@@ -0,0 +1,138 @@
+/* Sequential list data type implemented by a hash table with another list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of
+ gl_linkedhash_list.c, gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* Array of primes, approximately in steps of factor 1.2.
+ This table was computed by executing the Common Lisp expression
+ (dotimes (i 244) (format t "nextprime(~D)~%" (ceiling (expt 1.2d0 i))))
+ and feeding the result to PARI/gp. */
+static const size_t primes[] =
+ {
+ 11, 13, 17, 19, 23, 29, 37, 41, 47, 59, 67, 83, 97, 127, 139, 167, 199,
+ 239, 293, 347, 419, 499, 593, 709, 853, 1021, 1229, 1471, 1777, 2129, 2543,
+ 3049, 3659, 4391, 5273, 6323, 7589, 9103, 10937, 13109, 15727, 18899,
+ 22651, 27179, 32609, 39133, 46957, 56359, 67619, 81157, 97369, 116849,
+ 140221, 168253, 201907, 242309, 290761, 348889, 418667, 502409, 602887,
+ 723467, 868151, 1041779, 1250141, 1500181, 1800191, 2160233, 2592277,
+ 3110741, 3732887, 4479463, 5375371, 6450413, 7740517, 9288589, 11146307,
+ 13375573, 16050689, 19260817, 23112977, 27735583, 33282701, 39939233,
+ 47927081, 57512503, 69014987, 82818011, 99381577, 119257891, 143109469,
+ 171731387, 206077643, 247293161, 296751781, 356102141, 427322587,
+ 512787097, 615344489, 738413383, 886096061, 1063315271, 1275978331,
+ 1531174013, 1837408799, 2204890543UL, 2645868653UL, 3175042391UL,
+ 3810050851UL,
+#if SIZE_MAX > 4294967295UL
+ 4572061027UL, 5486473229UL, 6583767889UL, 7900521449UL, 9480625733UL,
+ 11376750877UL, 13652101063UL, 16382521261UL, 19659025513UL, 23590830631UL,
+ 28308996763UL, 33970796089UL, 40764955463UL, 48917946377UL, 58701535657UL,
+ 70441842749UL, 84530211301UL, 101436253561UL, 121723504277UL,
+ 146068205131UL, 175281846149UL, 210338215379UL, 252405858521UL,
+ 302887030151UL, 363464436191UL, 436157323417UL, 523388788231UL,
+ 628066545713UL, 753679854847UL, 904415825857UL, 1085298991109UL,
+ 1302358789181UL, 1562830547009UL, 1875396656429UL, 2250475987709UL,
+ 2700571185239UL, 3240685422287UL, 3888822506759UL, 4666587008147UL,
+ 5599904409713UL, 6719885291641UL, 8063862349969UL, 9676634819959UL,
+ 11611961783951UL, 13934354140769UL, 16721224968907UL, 20065469962669UL,
+ 24078563955191UL, 28894276746229UL, 34673132095507UL, 41607758514593UL,
+ 49929310217531UL, 59915172260971UL, 71898206713183UL, 86277848055823UL,
+ 103533417666967UL, 124240101200359UL, 149088121440451UL, 178905745728529UL,
+ 214686894874223UL, 257624273849081UL, 309149128618903UL, 370978954342639UL,
+ 445174745211143UL, 534209694253381UL, 641051633104063UL, 769261959724877UL,
+ 923114351670013UL, 1107737222003791UL, 1329284666404567UL,
+ 1595141599685509UL, 1914169919622551UL, 2297003903547091UL,
+ 2756404684256459UL, 3307685621107757UL, 3969222745329323UL,
+ 4763067294395177UL, 5715680753274209UL, 6858816903929113UL,
+ 8230580284714831UL, 9876696341657791UL, 11852035609989371UL,
+ 14222442731987227UL, 17066931278384657UL, 20480317534061597UL,
+ 24576381040873903UL, 29491657249048679UL, 35389988698858471UL,
+ 42467986438630267UL, 50961583726356109UL, 61153900471627387UL,
+ 73384680565952851UL, 88061616679143347UL, 105673940014972061UL,
+ 126808728017966413UL, 152170473621559703UL, 182604568345871671UL,
+ 219125482015045997UL, 262950578418055169UL, 315540694101666193UL,
+ 378648832921999397UL, 454378599506399233UL, 545254319407679131UL,
+ 654305183289214771UL, 785166219947057701UL, 942199463936469157UL,
+ 1130639356723763129UL, 1356767228068515623UL, 1628120673682218619UL,
+ 1953744808418662409UL, 2344493770102394881UL, 2813392524122873857UL,
+ 3376071028947448339UL, 4051285234736937517UL, 4861542281684325481UL,
+ 5833850738021191727UL, 7000620885625427969UL, 8400745062750513217UL,
+ 10080894075300616261UL, 12097072890360739951UL, 14516487468432885797UL,
+ 17419784962119465179UL,
+#endif
+ SIZE_MAX /* sentinel, to ensure the search terminates */
+ };
+
+/* Return a suitable prime >= ESTIMATE. */
+static size_t
+next_prime (size_t estimate)
+{
+ size_t i;
+
+ for (i = 0; i < sizeof (primes) / sizeof (primes[0]); i++)
+ if (primes[i] >= estimate)
+ return primes[i];
+ return SIZE_MAX; /* not a prime, but better than nothing */
+}
+
+/* Resize the hash table with a new estimated size. */
+static void
+hash_resize (gl_list_t list, size_t estimate)
+{
+ size_t new_size = next_prime (estimate);
+
+ if (new_size > list->table_size)
+ {
+ gl_hash_entry_t *old_table = list->table;
+ /* Allocate the new table. */
+ gl_hash_entry_t *new_table;
+ size_t i;
+
+ if (size_overflow_p (xtimes (new_size, sizeof (gl_hash_entry_t))))
+ goto fail;
+ new_table =
+ (gl_hash_entry_t *) calloc (new_size, sizeof (gl_hash_entry_t));
+ if (new_table == NULL)
+ goto fail;
+
+ /* Iterate through the entries of the old table. */
+ for (i = list->table_size; i > 0; )
+ {
+ gl_hash_entry_t node = old_table[--i];
+
+ while (node != NULL)
+ {
+ gl_hash_entry_t next = node->hash_next;
+ /* Add the entry to the new table. */
+ size_t bucket = node->hashcode % new_size;
+ node->hash_next = new_table[bucket];
+ new_table[bucket] = node;
+
+ node = next;
+ }
+ }
+
+ list->table = new_table;
+ list->table_size = new_size;
+ free (old_table);
+ }
+ return;
+
+ fail:
+ /* Just continue without resizing the table. */
+ return;
+}
diff --git a/gnulib/lib/gl_anylinked_list1.h b/gnulib/lib/gl_anylinked_list1.h
new file mode 100644
index 0000000..b6bc8b4
--- /dev/null
+++ b/gnulib/lib/gl_anylinked_list1.h
@@ -0,0 +1,48 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *next;
+ struct gl_list_node_impl *prev;
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ /* A circular list anchored at root.
+ The first node is = root.next, the last node is = root.prev.
+ The root's value is unused. */
+ struct gl_list_node_impl root;
+ /* Number of list nodes, excluding the root. */
+ size_t count;
+};
diff --git a/gnulib/lib/gl_anylinked_list2.h b/gnulib/lib/gl_anylinked_list2.h
new file mode 100644
index 0000000..c5ba2ff
--- /dev/null
+++ b/gnulib/lib/gl_anylinked_list2.h
@@ -0,0 +1,1195 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_linked_list.c and gl_linkedhash_list.c. */
+
+/* If the symbol SIGNAL_SAFE_LIST is defined, the code is compiled in such
+ a way that a gl_list_t data structure may be used from within a signal
+ handler. The operations allowed in the signal handler are:
+ gl_list_iterator, gl_list_iterator_next, gl_list_iterator_free.
+ The list and node fields that are therefore accessed from the signal handler
+ are:
+ list->root, node->next, node->value.
+ We are careful to make modifications to these fields only in an order
+ that maintains the consistency of the list data structure at any moment,
+ and we use 'volatile' assignments to prevent the compiler from reordering
+ such assignments. */
+#ifdef SIGNAL_SAFE_LIST
+# define ASYNCSAFE(type) *(volatile type *)&
+#else
+# define ASYNCSAFE(type)
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+static gl_list_t
+gl_linked_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ list->table_size = 11;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail;
+#endif
+ list->root.next = &list->root;
+ list->root.prev = &list->root;
+ list->count = 0;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail:
+ free (list);
+ return NULL;
+#endif
+}
+
+static gl_list_t
+gl_linked_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+ gl_list_node_t tail;
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ list->count = count;
+ tail = &list->root;
+ for (; count > 0; contents++, count--)
+ {
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ goto fail2;
+
+ node->value = *contents;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ goto fail2;
+ }
+#endif
+
+ /* Add node to the list. */
+ node->prev = tail;
+ tail->next = node;
+ tail = node;
+ }
+ tail->next = &list->root;
+ list->root.prev = tail;
+
+ return list;
+
+ fail2:
+ {
+ gl_list_node_t node;
+
+ for (node = tail; node != &list->root; )
+ {
+ gl_list_node_t prev = node->prev;
+
+ free (node);
+ node = prev;
+ }
+ }
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_linked_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_linked_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return node->value;
+}
+
+static int
+gl_linked_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_list_node_t before_removed = node->prev;
+ gl_list_node_t after_removed = node->next;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+ after_removed->prev = before_removed;
+ list->count--;
+ free (node);
+ return -1;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return 0;
+}
+
+static gl_list_node_t
+gl_linked_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return (node->next != &list->root ? node->next : NULL);
+}
+
+static gl_list_node_t
+gl_linked_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return (node->prev != &list->root ? node->prev : NULL);
+}
+
+static const void *
+gl_linked_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ gl_list_node_t node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+ return node->value;
+}
+
+static gl_list_node_t
+gl_linked_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ gl_list_node_t node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_list_node_t before_removed = node->prev;
+ gl_list_node_t after_removed = node->next;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = after_removed;
+ after_removed->prev = before_removed;
+ list->count--;
+ free (node);
+ return NULL;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ {
+#if WITH_HASHTABLE
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+
+ if (!list->base.allow_duplicates)
+ {
+ /* Look for the first match in the hash bucket. */
+ gl_list_node_t found = NULL;
+ gl_list_node_t node;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ found = node;
+ break;
+ }
+ if (start_index > 0)
+ /* Look whether found's index is < start_index. */
+ for (node = list->root.next; ; node = node->next)
+ {
+ if (node == found)
+ return NULL;
+ if (--start_index == 0)
+ break;
+ }
+ if (end_index < count)
+ /* Look whether found's index is >= end_index. */
+ {
+ end_index = count - end_index;
+ for (node = list->root.prev; ; node = node->prev)
+ {
+ if (node == found)
+ return NULL;
+ if (--end_index == 0)
+ break;
+ }
+ }
+ return found;
+ }
+ else
+ {
+ /* Look whether there is more than one match in the hash bucket. */
+ bool multiple_matches = false;
+ gl_list_node_t first_match = NULL;
+ gl_list_node_t node;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ if (first_match == NULL)
+ first_match = node;
+ else
+ {
+ multiple_matches = true;
+ break;
+ }
+ }
+ if (multiple_matches)
+ {
+ /* We need the match with the smallest index. But we don't have
+ a fast mapping node -> index. So we have to walk the list. */
+ end_index -= start_index;
+ node = list->root.next;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ for (;
+ end_index > 0;
+ node = node->next, end_index--)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ return node;
+ /* The matches must have all been at indices < start_index or
+ >= end_index. */
+ return NULL;
+ }
+ else
+ {
+ if (start_index > 0)
+ /* Look whether first_match's index is < start_index. */
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ if (node == first_match)
+ return NULL;
+ if (--start_index == 0)
+ break;
+ }
+ if (end_index < list->count)
+ /* Look whether first_match's index is >= end_index. */
+ {
+ end_index = list->count - end_index;
+ for (node = list->root.prev; ; node = node->prev)
+ {
+ if (node == first_match)
+ return NULL;
+ if (--end_index == 0)
+ break;
+ }
+ }
+ return first_match;
+ }
+ }
+#else
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_list_node_t node = list->root.next;
+
+ end_index -= start_index;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ if (equals != NULL)
+ {
+ for (; end_index > 0; node = node->next, end_index--)
+ if (equals (elt, node->value))
+ return node;
+ }
+ else
+ {
+ for (; end_index > 0; node = node->next, end_index--)
+ if (elt == node->value)
+ return node;
+ }
+ return NULL;
+#endif
+ }
+}
+
+static size_t
+gl_linked_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ {
+#if WITH_HASHTABLE
+ /* Here the hash table doesn't help much. It only allows us to minimize
+ the number of equals() calls, by looking up first the node and then
+ its index. */
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_list_node_t node;
+
+ /* First step: Look up the node. */
+ if (!list->base.allow_duplicates)
+ {
+ /* Look for the first match in the hash bucket. */
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ break;
+ }
+ else
+ {
+ /* Look whether there is more than one match in the hash bucket. */
+ bool multiple_matches = false;
+ gl_list_node_t first_match = NULL;
+
+ for (node = (gl_list_node_t) list->table[bucket];
+ node != NULL;
+ node = (gl_list_node_t) node->h.hash_next)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ {
+ if (first_match == NULL)
+ first_match = node;
+ else
+ {
+ multiple_matches = true;
+ break;
+ }
+ }
+ if (multiple_matches)
+ {
+ /* We need the match with the smallest index. But we don't have
+ a fast mapping node -> index. So we have to walk the list. */
+ size_t index;
+
+ index = start_index;
+ node = list->root.next;
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (node->h.hashcode == hashcode
+ && (equals != NULL
+ ? equals (elt, node->value)
+ : elt == node->value))
+ return index;
+ /* The matches must have all been at indices < start_index or
+ >= end_index. */
+ return (size_t)(-1);
+ }
+ node = first_match;
+ }
+
+ /* Second step: Look up the index of the node. */
+ if (node == NULL)
+ return (size_t)(-1);
+ else
+ {
+ size_t index = 0;
+
+ for (; node->prev != &list->root; node = node->prev)
+ index++;
+
+ if (index >= start_index && index < end_index)
+ return index;
+ else
+ return (size_t)(-1);
+ }
+#else
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ size_t index = start_index;
+ gl_list_node_t node = list->root.next;
+
+ for (; start_index > 0; start_index--)
+ node = node->next;
+
+ if (equals != NULL)
+ {
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (equals (elt, node->value))
+ return index;
+ }
+ else
+ {
+ for (;
+ index < end_index;
+ node = node->next, index++)
+ if (elt == node->value)
+ return index;
+ }
+ return (size_t)(-1);
+#endif
+ }
+}
+
+static gl_list_node_t
+gl_linked_nx_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ return NULL;
+ }
+#endif
+
+ /* Add node to the list. */
+ node->prev = &list->root;
+ ASYNCSAFE(gl_list_node_t) node->next = list->root.next;
+ node->next->prev = node;
+ ASYNCSAFE(gl_list_node_t) list->root.next = node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) node->value = elt;
+#if WITH_HASHTABLE
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+
+ /* Add node to the hash table. */
+ if (add_to_bucket (list, node) < 0)
+ {
+ free (node);
+ return NULL;
+ }
+#endif
+
+ /* Add node to the list. */
+ ASYNCSAFE(gl_list_node_t) node->next = &list->root;
+ node->prev = list->root.prev;
+ ASYNCSAFE(gl_list_node_t) node->prev->next = node;
+ list->root.prev = node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ ASYNCSAFE(gl_list_node_t) new_node->next = node;
+ new_node->prev = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+ node->prev = new_node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ new_node->prev = node;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+ new_node->next->prev = new_node;
+ ASYNCSAFE(gl_list_node_t) node->next = new_node;
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_linked_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ gl_list_node_t new_node;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+
+ new_node = (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (new_node == NULL)
+ return NULL;
+
+ ASYNCSAFE(const void *) new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+
+ /* Add new_node to the hash table. */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ free (new_node);
+ return NULL;
+ }
+#endif
+
+ /* Add new_node to the list. */
+ if (position <= (count / 2))
+ {
+ gl_list_node_t node;
+
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->next;
+ new_node->prev = node;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node->next;
+ new_node->next->prev = new_node;
+ ASYNCSAFE(gl_list_node_t) node->next = new_node;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ position = count - position;
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->next = node;
+ new_node->prev = node->prev;
+ ASYNCSAFE(gl_list_node_t) new_node->prev->next = new_node;
+ node->prev = new_node;
+ }
+ list->count++;
+
+#if WITH_HASHTABLE
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static bool
+gl_linked_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t prev;
+ gl_list_node_t next;
+
+#if WITH_HASHTABLE
+ /* Remove node from the hash table. */
+ remove_from_bucket (list, node);
+#endif
+
+ /* Remove node from the list. */
+ prev = node->prev;
+ next = node->next;
+
+ ASYNCSAFE(gl_list_node_t) prev->next = next;
+ next->prev = prev;
+ list->count--;
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+static bool
+gl_linked_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ gl_list_node_t removed_node;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ if (position <= ((count - 1) / 2))
+ {
+ gl_list_node_t node;
+ gl_list_node_t after_removed;
+
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->next;
+ removed_node = node->next;
+ after_removed = node->next->next;
+ ASYNCSAFE(gl_list_node_t) node->next = after_removed;
+ after_removed->prev = node;
+ }
+ else
+ {
+ gl_list_node_t node;
+ gl_list_node_t before_removed;
+
+ position = count - 1 - position;
+ node = &list->root;
+ for (; position > 0; position--)
+ node = node->prev;
+ removed_node = node->prev;
+ before_removed = node->prev->prev;
+ node->prev = before_removed;
+ ASYNCSAFE(gl_list_node_t) before_removed->next = node;
+ }
+#if WITH_HASHTABLE
+ remove_from_bucket (list, removed_node);
+#endif
+ list->count--;
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (removed_node->value);
+ free (removed_node);
+ return true;
+}
+
+static bool
+gl_linked_remove (gl_list_t list, const void *elt)
+{
+ gl_list_node_t node = gl_linked_search_from_to (list, 0, list->count, elt);
+
+ if (node != NULL)
+ return gl_linked_remove_node (list, node);
+ else
+ return false;
+}
+
+static void
+gl_linked_list_free (gl_list_t list)
+{
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; )
+ {
+ gl_list_node_t next = node->next;
+ if (dispose != NULL)
+ dispose (node->value);
+ free (node);
+ node = next;
+ }
+#if WITH_HASHTABLE
+ free (list->table);
+#endif
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_linked_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.p = list->root.next;
+ result.q = &list->root;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_linked_iterator_from_to (gl_list_t list,
+ size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+ size_t n1, n2, n3;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ n1 = start_index;
+ n2 = end_index - start_index;
+ n3 = list->count - end_index;
+ /* Find the maximum among n1, n2, n3, so as to reduce the number of
+ loop iterations to n1 + n2 + n3 - max(n1,n2,n3). */
+ if (n1 > n2 && n1 > n3)
+ {
+ /* n1 is the maximum, use n2 and n3. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = &list->root;
+ for (i = n3; i > 0; i--)
+ node = node->prev;
+ result.q = node;
+ for (i = n2; i > 0; i--)
+ node = node->prev;
+ result.p = node;
+ }
+ else if (n2 > n3)
+ {
+ /* n2 is the maximum, use n1 and n3. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = list->root.next;
+ for (i = n1; i > 0; i--)
+ node = node->next;
+ result.p = node;
+
+ node = &list->root;
+ for (i = n3; i > 0; i--)
+ node = node->prev;
+ result.q = node;
+ }
+ else
+ {
+ /* n3 is the maximum, use n1 and n2. */
+ gl_list_node_t node;
+ size_t i;
+
+ node = list->root.next;
+ for (i = n1; i > 0; i--)
+ node = node->next;
+ result.p = node;
+ for (i = n2; i > 0; i--)
+ node = node->next;
+ result.q = node;
+ }
+
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_linked_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_list_node_t node = (gl_list_node_t) iterator->p;
+ *eltp = node->value;
+ if (nodep != NULL)
+ *nodep = node;
+ iterator->p = node->next;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_linked_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_linked_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return node;
+ }
+ return NULL;
+}
+
+static gl_list_node_t
+gl_linked_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+
+ high -= low;
+ if (high > 0)
+ {
+ /* Here we know low < count. */
+ size_t position = low;
+ gl_list_node_t node;
+
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+
+ do
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return node;
+ node = node->next;
+ }
+ while (--high > 0);
+ }
+ return NULL;
+}
+
+static size_t
+gl_linked_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t index;
+
+ for (node = list->root.next, index = 0;
+ node != &list->root;
+ node = node->next, index++)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return index;
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_linked_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+
+ high -= low;
+ if (high > 0)
+ {
+ /* Here we know low < count. */
+ size_t index = low;
+ size_t position = low;
+ gl_list_node_t node;
+
+ if (position <= ((count - 1) / 2))
+ {
+ node = list->root.next;
+ for (; position > 0; position--)
+ node = node->next;
+ }
+ else
+ {
+ position = count - 1 - position;
+ node = list->root.prev;
+ for (; position > 0; position--)
+ node = node->prev;
+ }
+
+ do
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return index;
+ node = node->next;
+ index++;
+ }
+ while (--high > 0);
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_linked_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ if (compar (node->value, elt) >= 0)
+ return gl_linked_nx_add_before (list, node, elt);
+ return gl_linked_nx_add_last (list, elt);
+}
+
+static bool
+gl_linked_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root.next; node != &list->root; node = node->next)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp > 0)
+ break;
+ if (cmp == 0)
+ return gl_linked_remove_node (list, node);
+ }
+ return false;
+}
diff --git a/gnulib/lib/gl_anyrbtree_list1.h b/gnulib/lib/gl_anyrbtree_list1.h
new file mode 100644
index 0000000..0838d9d
--- /dev/null
+++ b/gnulib/lib/gl_anyrbtree_list1.h
@@ -0,0 +1,76 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c. */
+
+/* A red-black tree is a binary tree where every node is colored black or
+ red such that
+ 1. The root is black.
+ 2. No red node has a red parent.
+ Or equivalently: No red node has a red child.
+ 3. All paths from the root down to any NULL endpoint contain the same
+ number of black nodes.
+ Let's call this the "black-height" bh of the tree. It follows that every
+ such path contains exactly bh black and between 0 and bh red nodes. (The
+ extreme cases are a path containing only black nodes, and a path colored
+ alternatingly black-red-black-red-...-black-red.) The height of the tree
+ therefore is >= bh, <= 2*bh.
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Color of a node. */
+typedef enum color { BLACK, RED } color_t;
+
+/* Concrete list node implementation, valid for this file only. */
+struct gl_list_node_impl
+{
+#if WITH_HASHTABLE
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+#endif
+ struct gl_list_node_impl *left; /* left branch, or NULL */
+ struct gl_list_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_list_node_t can be returned
+ without memory allocation, on which the functions gl_list_remove_node,
+ gl_list_add_before, gl_list_add_after can be implemented. */
+ struct gl_list_node_impl *parent;
+ color_t color; /* node's color */
+ size_t branch_size; /* number of nodes in this branch,
+ = branchsize(left)+branchsize(right)+1 */
+ const void *value;
+};
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+#if WITH_HASHTABLE
+ /* A hash table: managed as an array of collision lists. */
+ struct gl_hash_entry **table;
+ size_t table_size;
+#endif
+ struct gl_list_node_impl *root; /* root node or NULL */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+ therefore at least 2^ceil(h/2) - 1 elements. So, h <= 116 (because a tree
+ of height h >= 117 would have at least 2^59 - 1 elements, and because even
+ on 64-bit machines,
+ sizeof (gl_list_node_impl) * (2^59 - 1) > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 116
diff --git a/gnulib/lib/gl_anyrbtree_list2.h b/gnulib/lib/gl_anyrbtree_list2.h
new file mode 100644
index 0000000..9056d74
--- /dev/null
+++ b/gnulib/lib/gl_anyrbtree_list2.h
@@ -0,0 +1,1028 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_rbtree_list.c and gl_rbtreehash_list.c. */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Create a subtree for count >= 1 elements.
+ Its black-height bh is passed as argument, with
+ 2^bh - 1 <= count <= 2^(bh+1) - 1. bh == 0 implies count == 1.
+ Its height is h where 2^(h-1) <= count <= 2^h - 1.
+ Return NULL upon out-of-memory. */
+static gl_list_node_t
+create_subtree_with_contents (unsigned int bh,
+ size_t count, const void **contents)
+{
+ size_t half1 = (count - 1) / 2;
+ size_t half2 = count / 2;
+ /* Note: half1 + half2 = count - 1. */
+ gl_list_node_t node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+ if (node == NULL)
+ return NULL;
+
+ if (half1 > 0)
+ {
+ /* half1 > 0 implies count > 1, implies bh >= 1, implies
+ 2^(bh-1) - 1 <= half1 <= 2^bh - 1. */
+ node->left =
+ create_subtree_with_contents (bh - 1, half1, contents);
+ if (node->left == NULL)
+ goto fail1;
+ node->left->parent = node;
+ }
+ else
+ node->left = NULL;
+
+ node->value = contents[half1];
+
+ if (half2 > 0)
+ {
+ /* half2 > 0 implies count > 1, implies bh >= 1, implies
+ 2^(bh-1) - 1 <= half2 <= 2^bh - 1. */
+ node->right =
+ create_subtree_with_contents (bh - 1, half2, contents + half1 + 1);
+ if (node->right == NULL)
+ goto fail2;
+ node->right->parent = node;
+ }
+ else
+ node->right = NULL;
+
+ node->color = (bh == 0 ? RED : BLACK);
+
+ node->branch_size = count;
+
+ return node;
+
+ fail2:
+ if (node->left != NULL)
+ free_subtree (node->left);
+ fail1:
+ free (node);
+ return NULL;
+}
+
+static gl_list_t
+gl_tree_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ {
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate < 10)
+ estimate = 10;
+ list->table_size = next_prime (estimate);
+ if (size_overflow_p (xtimes (list->table_size, sizeof (gl_hash_entry_t))))
+ goto fail1;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail1;
+ }
+#endif
+ if (count > 0)
+ {
+ /* Assuming 2^bh - 1 <= count <= 2^(bh+1) - 2, we create a tree whose
+ upper bh levels are black, and only the partially present lowest
+ level is red. */
+ unsigned int bh;
+ {
+ size_t n;
+ for (n = count + 1, bh = 0; n > 1; n = n >> 1)
+ bh++;
+ }
+
+ list->root = create_subtree_with_contents (bh, count, contents);
+ if (list->root == NULL)
+ goto fail2;
+ list->root->parent = NULL;
+
+#if WITH_HASHTABLE
+ /* Now that the tree is built, node_position() works. Now we can
+ add the nodes to the hash table. */
+ if (add_nodes_to_buckets (list) < 0)
+ goto fail3;
+#endif
+ }
+ else
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail3:
+ free_subtree (list->root);
+#endif
+ fail2:
+#if WITH_HASHTABLE
+ free (list->table);
+ fail1:
+#endif
+ free (list);
+ return NULL;
+}
+
+/* Rotate left a subtree.
+
+ B D
+ / \ / \
+ A D --> B E
+ / \ / \
+ C E A C
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register D as child of its parent. */
+static inline gl_list_node_t
+rotate_left (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+ gl_list_node_t a_node = b_node->left;
+ gl_list_node_t c_node = d_node->left;
+ gl_list_node_t e_node = d_node->right;
+
+ b_node->right = c_node;
+ d_node->left = b_node;
+
+ d_node->parent = b_node->parent;
+ b_node->parent = d_node;
+ if (c_node != NULL)
+ c_node->parent = b_node;
+
+ b_node->branch_size =
+ (a_node != NULL ? a_node->branch_size : 0)
+ + 1 + (c_node != NULL ? c_node->branch_size : 0);
+ d_node->branch_size =
+ b_node->branch_size + 1 + (e_node != NULL ? e_node->branch_size : 0);
+
+ return d_node;
+}
+
+/* Rotate right a subtree.
+
+ D B
+ / \ / \
+ B E --> A D
+ / \ / \
+ A C C E
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register B as child of its parent. */
+static inline gl_list_node_t
+rotate_right (gl_list_node_t b_node, gl_list_node_t d_node)
+{
+ gl_list_node_t a_node = b_node->left;
+ gl_list_node_t c_node = b_node->right;
+ gl_list_node_t e_node = d_node->right;
+
+ d_node->left = c_node;
+ b_node->right = d_node;
+
+ b_node->parent = d_node->parent;
+ d_node->parent = b_node;
+ if (c_node != NULL)
+ c_node->parent = d_node;
+
+ d_node->branch_size =
+ (c_node != NULL ? c_node->branch_size : 0)
+ + 1 + (e_node != NULL ? e_node->branch_size : 0);
+ b_node->branch_size =
+ (a_node != NULL ? a_node->branch_size : 0) + 1 + d_node->branch_size;
+
+ return b_node;
+}
+
+/* Ensure the tree is balanced, after an insertion operation.
+ Also assigns node->color.
+ parent is the given node's parent, known to be non-NULL. */
+static void
+rebalance_after_add (gl_list_t list, gl_list_node_t node, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, parent = node->parent != NULL.
+ Think of node->color being RED (although node->color is not yet
+ assigned.) */
+ gl_list_node_t grandparent;
+ gl_list_node_t uncle;
+
+ if (parent->color == BLACK)
+ {
+ /* A RED color for node is acceptable. */
+ node->color = RED;
+ return;
+ }
+
+ grandparent = parent->parent;
+ /* Since parent is RED, we know that
+ grandparent is != NULL and colored BLACK. */
+
+ if (grandparent->left == parent)
+ uncle = grandparent->right;
+ else if (grandparent->right == parent)
+ uncle = grandparent->left;
+ else
+ abort ();
+
+ if (uncle != NULL && uncle->color == RED)
+ {
+ /* Change grandparent from BLACK to RED, and
+ change parent and uncle from RED to BLACK.
+ This makes it acceptable for node to be RED. */
+ node->color = RED;
+ parent->color = uncle->color = BLACK;
+ node = grandparent;
+ }
+ else
+ {
+ /* grandparent and uncle are BLACK. parent is RED. node wants
+ to be RED too.
+ In this case, recoloring is not sufficient. Need to perform
+ one or two rotations. */
+ gl_list_node_t *grandparentp;
+
+ if (grandparent->parent == NULL)
+ grandparentp = &list->root;
+ else if (grandparent->parent->left == grandparent)
+ grandparentp = &grandparent->parent->left;
+ else if (grandparent->parent->right == grandparent)
+ grandparentp = &grandparent->parent->right;
+ else
+ abort ();
+
+ if (grandparent->left == parent)
+ {
+ if (parent->right == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->left = rotate_left (parent, node);
+ node = parent;
+ parent = grandparent->left;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->left. node = parent->left.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ parent uncle --> node grandparent
+ bh bh bh bh
+ / \ / \
+ node C C uncle
+ bh bh bh bh
+ */
+ *grandparentp = rotate_right (parent, grandparent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ else /* grandparent->right == parent */
+ {
+ if (parent->left == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->right = rotate_right (node, parent);
+ node = parent;
+ parent = grandparent->right;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->right. node = parent->right.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ uncle parent --> grandparent node
+ bh bh bh bh
+ / \ / \
+ C node uncle C
+ bh bh bh bh
+ */
+ *grandparentp = rotate_left (grandparent, parent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ return;
+ }
+
+ /* Start again with a new (node, parent) pair. */
+ parent = node->parent;
+
+ if (parent == NULL)
+ {
+ /* Change node's color from RED to BLACK. This increases the
+ tree's black-height. */
+ node->color = BLACK;
+ return;
+ }
+ }
+}
+
+/* Ensure the tree is balanced, after a deletion operation.
+ CHILD was a grandchild of PARENT and is now its child. Between them,
+ a black node was removed. CHILD is also black, or NULL.
+ (CHILD can also be NULL. But PARENT is non-NULL.) */
+static void
+rebalance_after_remove (gl_list_t list, gl_list_node_t child, gl_list_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, we reduced the black-height of the CHILD subtree by 1.
+ To make up, either look for a possibility to turn a RED to a BLACK
+ node, or try to reduce the black-height tree of CHILD's sibling
+ subtree as well. */
+ gl_list_node_t *parentp;
+
+ if (parent->parent == NULL)
+ parentp = &list->root;
+ else if (parent->parent->left == parent)
+ parentp = &parent->parent->left;
+ else if (parent->parent->right == parent)
+ parentp = &parent->parent->right;
+ else
+ abort ();
+
+ if (parent->left == child)
+ {
+ gl_list_node_t sibling = parent->right;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh+1 bh+1 bh bh+1
+ */
+ *parentp = rotate_left (parent, sibling);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->left;
+ sibling = parent->right;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+ if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh bh bh bh
+ */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> child SL
+ bh bh+1 bh bh+1
+ / \ / \
+ SL SR SLL sibling
+ bh bh bh bh
+ / \ / \
+ SLL SLR SLR SR
+ bh bh bh bh
+
+ where SLL, SLR, SR are all black.
+ */
+ parent->right = rotate_right (sibling->left, sibling);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->right;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else if (parent->right == child)
+ {
+ gl_list_node_t sibling = parent->left;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ sibling child --> SR parent
+ bh+1 ch bh+1 bh+1
+ / \ / \
+ SL SR SL child
+ bh+1 bh+1 bh+1 bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->right;
+ sibling = parent->left;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+ if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SL parent
+ bh+1 bh bh+1 bh+1
+ / \ / \
+ SL SR SR child
+ bh bh bh bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SR child
+ bh+1 bh bh+1 bh
+ / \ / \
+ SL SR sibling SRR
+ bh bh bh bh
+ / \ / \
+ SRL SRR SL SRL
+ bh bh bh bh
+
+ where SL, SRL, SRR are all black.
+ */
+ parent->left = rotate_left (sibling, sibling->right);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->left;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else
+ abort ();
+
+ /* Start again with a new (child, parent) pair. */
+ parent = child->parent;
+
+#if 0 /* Already handled. */
+ if (child != NULL && child->color == RED)
+ {
+ child->color = BLACK;
+ return;
+ }
+#endif
+
+ if (parent == NULL)
+ return;
+ }
+}
+
+static void
+gl_tree_remove_node_from_tree (gl_list_t list, gl_list_node_t node)
+{
+ gl_list_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_list_node_t child = node->right;
+
+ if (child != NULL)
+ {
+ child->parent = parent;
+ /* Since node->left == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ }
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ if (child == NULL && node->color == BLACK)
+ rebalance_after_remove (list, child, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_list_node_t child = node->left;
+
+ child->parent = parent;
+ /* Since node->right == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ if (parent == NULL)
+ list->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_list_node_t subst;
+ gl_list_node_t subst_parent;
+ gl_list_node_t child;
+ color_t removed_color;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ removed_color = subst->color;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = subst_parent; p != NULL; p = p->parent)
+ p->branch_size--;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->color = node->color;
+ subst->branch_size = node->branch_size;
+ subst->parent = parent;
+ if (parent == NULL)
+ list->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ if (removed_color == BLACK)
+ {
+ if (child != NULL && child->color == RED)
+ /* Recolor the child. */
+ child->color = BLACK;
+ else
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance_after_remove (list, child,
+ subst_parent != node ? subst_parent : subst);
+ }
+ }
+}
+
+static gl_list_node_t
+gl_tree_nx_add_first (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ new_node->color = BLACK;
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_last (gl_list_t list, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (list->root == NULL)
+ {
+ new_node->color = BLACK;
+ list->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_list_node_t node;
+
+ for (node = list->root; node->right != NULL; )
+ node = node->right;
+
+ node->right = new_node;
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+ }
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ node->left = new_node;
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
+
+static gl_list_node_t
+gl_tree_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_list_node_t new_node =
+ (struct gl_list_node_impl *) malloc (sizeof (struct gl_list_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->branch_size = 1;
+ new_node->value = elt;
+#if WITH_HASHTABLE
+ new_node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (new_node->value)
+ : (size_t)(uintptr_t) new_node->value);
+#endif
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ node->right = new_node;
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ }
+ new_node->parent = node;
+
+ /* Update branch_size fields of the parent nodes. */
+ {
+ gl_list_node_t p;
+
+ for (p = node; p != NULL; p = p->parent)
+ p->branch_size++;
+ }
+
+ /* Color and rebalance. */
+ rebalance_after_add (list, new_node, node);
+
+#if WITH_HASHTABLE
+ /* Add node to the hash table.
+ Note that this is only possible _after_ the node has been added to the
+ tree structure, because add_to_bucket() uses node_position(). */
+ if (add_to_bucket (list, new_node) < 0)
+ {
+ gl_tree_remove_node_from_tree (list, new_node);
+ free (new_node);
+ return NULL;
+ }
+ hash_resize_after_add (list);
+#endif
+
+ return new_node;
+}
diff --git a/gnulib/lib/gl_anytree_list1.h b/gnulib/lib/gl_anytree_list1.h
new file mode 100644
index 0000000..3cef1da
--- /dev/null
+++ b/gnulib/lib/gl_anytree_list1.h
@@ -0,0 +1,41 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+ gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+/* An item on the stack used for iterating across the elements. */
+typedef struct
+{
+ gl_list_node_t node;
+ size_t rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements. */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+/* Free a non-empty subtree recursively.
+ This function is recursive and therefore not very fast. */
+static void
+free_subtree (gl_list_node_t node)
+{
+ if (node->left != NULL)
+ free_subtree (node->left);
+ if (node->right != NULL)
+ free_subtree (node->right);
+ free (node);
+}
diff --git a/gnulib/lib/gl_anytree_list2.h b/gnulib/lib/gl_anytree_list2.h
new file mode 100644
index 0000000..4e3098f
--- /dev/null
+++ b/gnulib/lib/gl_anytree_list2.h
@@ -0,0 +1,940 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltree_list.c, gl_rbtree_list.c,
+ gl_avltreehash_list.c, gl_rbtreehash_list.c. */
+
+static gl_list_t
+gl_tree_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list = (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+#if WITH_HASHTABLE
+ list->table_size = 11;
+ list->table =
+ (gl_hash_entry_t *) calloc (list->table_size, sizeof (gl_hash_entry_t));
+ if (list->table == NULL)
+ goto fail;
+#endif
+ list->root = NULL;
+
+ return list;
+
+#if WITH_HASHTABLE
+ fail:
+ free (list);
+ return NULL;
+#endif
+}
+
+static size_t
+gl_tree_size (gl_list_t list)
+{
+ return (list->root != NULL ? list->root->branch_size : 0);
+}
+
+static const void *
+gl_tree_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return node->value;
+}
+
+static int
+gl_tree_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_tree_remove_node_from_tree (list, node);
+ free (node);
+ return -1;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return 0;
+}
+
+static gl_list_node_t
+gl_tree_next_node (gl_list_t list, gl_list_node_t node)
+{
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ return node;
+}
+
+static gl_list_node_t
+gl_tree_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ if (node->left != NULL)
+ {
+ node = node->left;
+ while (node->right != NULL)
+ node = node->right;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->left == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ return node;
+}
+
+/* Return the node at the given position < gl_tree_size (list). */
+static inline gl_list_node_t
+node_at (gl_list_node_t root, size_t position)
+{
+ /* Here we know that root != NULL. */
+ gl_list_node_t node = root;
+
+ for (;;)
+ {
+ if (node->left != NULL)
+ {
+ if (position < node->left->branch_size)
+ {
+ node = node->left;
+ continue;
+ }
+ position -= node->left->branch_size;
+ }
+ if (position == 0)
+ break;
+ position--;
+ node = node->right;
+ }
+ return node;
+}
+
+static const void *
+gl_tree_get_at (gl_list_t list, size_t position)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+ return node->value;
+}
+
+static gl_list_node_t
+gl_tree_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+#if WITH_HASHTABLE
+ if (elt != node->value)
+ {
+ size_t new_hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+
+ if (new_hashcode != node->h.hashcode)
+ {
+ remove_from_bucket (list, node);
+ node->value = elt;
+ node->h.hashcode = new_hashcode;
+ if (add_to_bucket (list, node) < 0)
+ {
+ /* Out of memory. We removed node from a bucket but cannot add
+ it to another bucket. In order to avoid inconsistencies, we
+ must remove node entirely from the list. */
+ gl_tree_remove_node_from_tree (list, node);
+ free (node);
+ return NULL;
+ }
+ }
+ else
+ node->value = elt;
+ }
+#else
+ node->value = elt;
+#endif
+ return node;
+}
+
+#if !WITH_HASHTABLE
+
+static gl_list_node_t
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ /* Iterate across all elements. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+ size_t index = 0;
+
+ if (start_index == 0)
+ {
+ /* Consider all elements. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return NULL;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return node;
+ index++;
+ if (index >= end_index)
+ return NULL;
+ /* Descend on right branch. */
+ stack_ptr->rightp = 1;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ else
+ {
+ /* Consider only elements at indices >= start_index.
+ In this case, rightp contains the difference between the start_index
+ for the parent node and the one for the child node (0 when the child
+ node is the parent's left child, > 0 when the child is the parent's
+ right child). */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ if (node->branch_size <= start_index)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return NULL;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ start_index += stack_ptr->rightp;
+ }
+ node = stack_ptr->node;
+ {
+ size_t left_branch_size1 =
+ (node->left != NULL ? node->left->branch_size : 0) + 1;
+ if (start_index < left_branch_size1)
+ {
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return node;
+ /* Now that we have considered all indices < left_branch_size1,
+ we can increment start_index. */
+ start_index = left_branch_size1;
+ }
+ index++;
+ if (index >= end_index)
+ return NULL;
+ /* Descend on right branch. */
+ start_index -= left_branch_size1;
+ stack_ptr->rightp = left_branch_size1;
+ }
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ }
+}
+
+static size_t
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ /* Iterate across all elements. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+ size_t index = 0;
+
+ if (start_index == 0)
+ {
+ /* Consider all elements. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return (size_t)(-1);
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return index;
+ index++;
+ if (index >= end_index)
+ return (size_t)(-1);
+ /* Descend on right branch. */
+ stack_ptr->rightp = 1;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ else
+ {
+ /* Consider only elements at indices >= start_index.
+ In this case, rightp contains the difference between the start_index
+ for the parent node and the one for the child node (0 when the child
+ node is the parent's left child, > 0 when the child is the parent's
+ right child). */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ if (node->branch_size <= start_index)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = 0;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ return (size_t)(-1);
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ start_index += stack_ptr->rightp;
+ }
+ node = stack_ptr->node;
+ {
+ size_t left_branch_size1 =
+ (node->left != NULL ? node->left->branch_size : 0) + 1;
+ if (start_index < left_branch_size1)
+ {
+ /* Test against current element. */
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ return index;
+ /* Now that we have considered all indices < left_branch_size1,
+ we can increment start_index. */
+ start_index = left_branch_size1;
+ }
+ index++;
+ if (index >= end_index)
+ return (size_t)(-1);
+ /* Descend on right branch. */
+ start_index -= left_branch_size1;
+ stack_ptr->rightp = left_branch_size1;
+ }
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ }
+}
+
+#endif
+
+static gl_list_node_t
+gl_tree_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = (list->root != NULL ? list->root->branch_size : 0);
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (position == count)
+ return gl_tree_nx_add_last (list, elt);
+ else
+ return gl_tree_nx_add_before (list, node_at (list->root, position), elt);
+}
+
+static bool
+gl_tree_remove_node (gl_list_t list, gl_list_node_t node)
+{
+#if WITH_HASHTABLE
+ /* Remove node from the hash table.
+ Note that this is only possible _before_ the node is removed from the
+ tree structure, because remove_from_bucket() uses node_position(). */
+ remove_from_bucket (list, node);
+#endif
+
+ gl_tree_remove_node_from_tree (list, node);
+
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+static bool
+gl_tree_remove_at (gl_list_t list, size_t position)
+{
+ gl_list_node_t node = list->root;
+
+ if (!(node != NULL && position < node->branch_size))
+ /* Invalid argument. */
+ abort ();
+ node = node_at (node, position);
+ return gl_tree_remove_node (list, node);
+}
+
+static bool
+gl_tree_remove (gl_list_t list, const void *elt)
+{
+ if (list->root != NULL)
+ {
+ gl_list_node_t node =
+ gl_tree_search_from_to (list, 0, list->root->branch_size, elt);
+
+ if (node != NULL)
+ return gl_tree_remove_node (list, node);
+ }
+ return false;
+}
+
+#if !WITH_HASHTABLE
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+ /* Iterate across all elements in post-order. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done_iterate:
+ free (list);
+}
+
+#endif
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_tree_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+ gl_list_node_t node;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ /* Start node is the leftmost node. */
+ node = list->root;
+ if (node != NULL)
+ while (node->left != NULL)
+ node = node->left;
+ result.p = node;
+ /* End point is past the rightmost node. */
+ result.q = NULL;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_tree_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ size_t count = (list->root != NULL ? list->root->branch_size : 0);
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ /* Start node is the node at position start_index. */
+ result.p = (start_index < count ? node_at (list->root, start_index) : NULL);
+ /* End point is the node at position end_index. */
+ result.q = (end_index < count ? node_at (list->root, end_index) : NULL);
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_list_node_t node = (gl_list_node_t) iterator->p;
+ *eltp = node->value;
+ if (nodep != NULL)
+ *nodep = node;
+ /* Advance to the next node. */
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ iterator->p = node;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_tree_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_tree_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ for (node = list->root; node != NULL; )
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost such
+ element. */
+ gl_list_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ node = node->right;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ return found;
+ }
+ }
+ return NULL;
+}
+
+static gl_list_node_t
+gl_tree_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ gl_list_node_t node;
+
+ if (!(low <= high
+ && high <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+
+ for (node = list->root; node != NULL; )
+ {
+ size_t left_branch_size =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size)
+ {
+ low -= left_branch_size + 1;
+ high -= left_branch_size + 1;
+ node = node->right;
+ }
+ else if (high <= left_branch_size)
+ node = node->left;
+ else
+ {
+ /* Here low <= left_branch_size < high. */
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ low = 0;
+ high -= left_branch_size + 1;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost
+ such element. */
+ gl_list_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ size_t left_branch_size2 =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size2)
+ {
+ low -= left_branch_size2 + 1;
+ node = node->right;
+ }
+ else
+ {
+ /* Here low <= left_branch_size2. */
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ low = 0;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ }
+ return found;
+ }
+ }
+ }
+ return NULL;
+}
+
+static size_t
+gl_tree_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t position;
+
+ for (node = list->root, position = 0; node != NULL; )
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ position++;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost such
+ element. */
+ size_t found_position =
+ position + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ for (; node != NULL; )
+ {
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ position++;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found_position =
+ position
+ + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ }
+ }
+ return found_position;
+ }
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_tree_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ gl_list_node_t node;
+ size_t position;
+
+ if (!(low <= high
+ && high <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+
+ for (node = list->root, position = 0; node != NULL; )
+ {
+ size_t left_branch_size =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size)
+ {
+ low -= left_branch_size + 1;
+ high -= left_branch_size + 1;
+ position += left_branch_size + 1;
+ node = node->right;
+ }
+ else if (high <= left_branch_size)
+ node = node->left;
+ else
+ {
+ /* Here low <= left_branch_size < high. */
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ low = 0;
+ high -= left_branch_size + 1;
+ position += left_branch_size + 1;
+ node = node->right;
+ }
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT. But we need the leftmost
+ such element. */
+ size_t found_position =
+ position + (node->left != NULL ? node->left->branch_size : 0);
+ node = node->left;
+ for (; node != NULL; )
+ {
+ size_t left_branch_size2 =
+ (node->left != NULL ? node->left->branch_size : 0);
+
+ if (low > left_branch_size2)
+ {
+ low -= left_branch_size2 + 1;
+ node = node->right;
+ }
+ else
+ {
+ /* Here low <= left_branch_size2. */
+ int cmp2 = compar (node->value, elt);
+
+ if (cmp2 < 0)
+ {
+ position += left_branch_size2 + 1;
+ node = node->right;
+ }
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ found_position = position + left_branch_size2;
+ node = node->left;
+ }
+ }
+ }
+ return found_position;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_tree_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node = list->root;
+
+ if (node == NULL)
+ return gl_tree_nx_add_first (list, elt);
+
+ for (;;)
+ {
+ int cmp = compar (node->value, elt);
+
+ if (cmp < 0)
+ {
+ if (node->right == NULL)
+ return gl_tree_nx_add_after (list, node, elt);
+ node = node->right;
+ }
+ else if (cmp > 0)
+ {
+ if (node->left == NULL)
+ return gl_tree_nx_add_before (list, node, elt);
+ node = node->left;
+ }
+ else /* cmp == 0 */
+ return gl_tree_nx_add_before (list, node, elt);
+ }
+}
+
+static bool
+gl_tree_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t node = gl_tree_sortedlist_search (list, compar, elt);
+ if (node != NULL)
+ return gl_tree_remove_node (list, node);
+ else
+ return false;
+}
diff --git a/gnulib/lib/gl_anytree_oset.h b/gnulib/lib/gl_anytree_oset.h
new file mode 100644
index 0000000..c0a0a2f
--- /dev/null
+++ b/gnulib/lib/gl_anytree_oset.h
@@ -0,0 +1,297 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltree_oset.c and gl_rbtree_oset.c. */
+
+/* An item on the stack used for iterating across the elements. */
+typedef struct
+{
+ gl_oset_node_t node;
+ bool rightp;
+} iterstack_item_t;
+
+/* A stack used for iterating across the elements. */
+typedef iterstack_item_t iterstack_t[MAXHEIGHT];
+
+static gl_oset_t
+gl_tree_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ struct gl_oset_impl *set =
+ (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+ if (set == NULL)
+ return NULL;
+
+ set->base.vtable = implementation;
+ set->base.compar_fn = compar_fn;
+ set->base.dispose_fn = dispose_fn;
+ set->root = NULL;
+ set->count = 0;
+
+ return set;
+}
+
+static size_t
+gl_tree_size (gl_oset_t set)
+{
+ return set->count;
+}
+
+static bool
+gl_tree_search (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT. */
+ return true;
+ }
+ return false;
+}
+
+static bool
+gl_tree_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp)
+{
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ if (! threshold_fn (node->value, threshold))
+ node = node->right;
+ else
+ {
+ /* We have an element >= VALUE. But we need the leftmost such
+ element. */
+ gl_oset_node_t found = node;
+ node = node->left;
+ for (; node != NULL; )
+ {
+ if (! threshold_fn (node->value, threshold))
+ node = node->right;
+ else
+ {
+ found = node;
+ node = node->left;
+ }
+ }
+ *eltp = found->value;
+ return true;
+ }
+ }
+ return false;
+}
+
+static gl_oset_node_t
+gl_tree_search_node (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ gl_oset_node_t node;
+
+ for (node = set->root; node != NULL; )
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ node = node->right;
+ else if (cmp > 0)
+ node = node->left;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT. */
+ return node;
+ }
+ return NULL;
+}
+
+static int
+gl_tree_nx_add (gl_oset_t set, const void *elt)
+{
+ gl_setelement_compar_fn compar;
+ gl_oset_node_t node = set->root;
+
+ if (node == NULL)
+ {
+ if (gl_tree_nx_add_first (set, elt) == NULL)
+ return -1;
+ return true;
+ }
+
+ compar = set->base.compar_fn;
+
+ for (;;)
+ {
+ int cmp = (compar != NULL
+ ? compar (node->value, elt)
+ : (node->value > elt ? 1 :
+ node->value < elt ? -1 : 0));
+
+ if (cmp < 0)
+ {
+ if (node->right == NULL)
+ {
+ if (gl_tree_nx_add_after (set, node, elt) == NULL)
+ return -1;
+ return true;
+ }
+ node = node->right;
+ }
+ else if (cmp > 0)
+ {
+ if (node->left == NULL)
+ {
+ if (gl_tree_nx_add_before (set, node, elt) == NULL)
+ return -1;
+ return true;
+ }
+ node = node->left;
+ }
+ else /* cmp == 0 */
+ return false;
+ }
+}
+
+static bool
+gl_tree_remove (gl_oset_t set, const void *elt)
+{
+ gl_oset_node_t node = gl_tree_search_node (set, elt);
+
+ if (node != NULL)
+ return gl_tree_remove_node (set, node);
+ else
+ return false;
+}
+
+static void
+gl_tree_oset_free (gl_oset_t set)
+{
+ /* Iterate across all elements in post-order. */
+ gl_oset_node_t node = set->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done_iterate:
+ free (set);
+}
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+static gl_oset_iterator_t
+gl_tree_iterator (gl_oset_t set)
+{
+ gl_oset_iterator_t result;
+ gl_oset_node_t node;
+
+ result.vtable = set->base.vtable;
+ result.set = set;
+ /* Start node is the leftmost node. */
+ node = set->root;
+ if (node != NULL)
+ while (node->left != NULL)
+ node = node->left;
+ result.p = node;
+ /* End point is past the rightmost node. */
+ result.q = NULL;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+ result.count = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_tree_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ if (iterator->p != iterator->q)
+ {
+ gl_oset_node_t node = (gl_oset_node_t) iterator->p;
+ *eltp = node->value;
+ /* Advance to the next node. */
+ if (node->right != NULL)
+ {
+ node = node->right;
+ while (node->left != NULL)
+ node = node->left;
+ }
+ else
+ {
+ while (node->parent != NULL && node->parent->right == node)
+ node = node->parent;
+ node = node->parent;
+ }
+ iterator->p = node;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_tree_iterator_free (gl_oset_iterator_t *iterator)
+{
+}
diff --git a/gnulib/lib/gl_anytreehash_list1.h b/gnulib/lib/gl_anytreehash_list1.h
new file mode 100644
index 0000000..d3b8a06
--- /dev/null
+++ b/gnulib/lib/gl_anytreehash_list1.h
@@ -0,0 +1,358 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c. */
+
+/* Hash table entry representing the same value at more than one position. */
+struct gl_multiple_nodes
+{
+ struct gl_hash_entry h; /* hash table entry fields; must be first */
+ void *magic; /* used to distinguish from single node */
+ gl_oset_t nodes; /* set of nodes, sorted by position */
+};
+/* A value that cannot occur at the corresponding field (->left) in
+ gl_list_node_impl. */
+#define MULTIPLE_NODES_MAGIC (void *) -1
+
+/* Resize the hash table if needed, after list->count was incremented. */
+static inline void
+hash_resize_after_add (gl_list_t list)
+{
+ size_t count = (list->root != 0 ? list->root->branch_size : 0);
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate > list->table_size)
+ hash_resize (list, estimate);
+}
+
+/* Return the position of the given node in the tree. */
+static size_t
+node_position (gl_list_node_t node)
+{
+ size_t position = 0;
+
+ if (node->left != NULL)
+ position += node->left->branch_size;
+ for (;;)
+ {
+ gl_list_node_t parent = node->parent;
+
+ if (parent == NULL)
+ return position;
+ /* position is now relative to the subtree of node. */
+ if (parent->right == node)
+ {
+ position += 1;
+ if (parent->left != NULL)
+ position += parent->left->branch_size;
+ }
+ /* position is now relative to the subtree of parent. */
+ node = parent;
+ }
+}
+
+/* Compares two nodes by their position in the tree. */
+static int
+compare_by_position (const void *x1, const void *x2)
+{
+ gl_list_node_t node1 = (gl_list_node_t) x1;
+ gl_list_node_t node2 = (gl_list_node_t) x2;
+ size_t position1 = node_position (node1);
+ size_t position2 = node_position (node2);
+
+ return (position1 > position2 ? 1 :
+ position1 < position2 ? -1 : 0);
+}
+
+/* Compares a node's position in the tree with a given threshold. */
+static bool
+compare_position_threshold (const void *x, const void *threshold)
+{
+ gl_list_node_t node = (gl_list_node_t) x;
+ size_t position = node_position (node);
+ return (position >= (uintptr_t)threshold);
+}
+
+/* Return the first element of a non-empty ordered set of nodes. */
+static inline gl_list_node_t
+gl_oset_first (gl_oset_t set)
+{
+ gl_oset_iterator_t iter = gl_oset_iterator (set);
+ const void *first;
+
+ if (!gl_oset_iterator_next (&iter, &first))
+ abort ();
+ gl_oset_iterator_free (&iter);
+ return (gl_list_node_t) first;
+}
+
+/* Add a node to the hash table structure.
+ If duplicates are allowed, this function performs in average time
+ O((log n)^2): gl_oset_nx_add may need to add an element to an ordered set
+ of size O(n), needing O(log n) comparison function calls. The comparison
+ function is compare_by_position, which is O(log n) worst-case.
+ If duplicates are forbidden, this function is O(1).
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+add_to_bucket (gl_list_t list, gl_list_node_t new_node)
+{
+ size_t bucket = new_node->h.hashcode % list->table_size;
+
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ if (list->base.allow_duplicates)
+ {
+ size_t hashcode = new_node->h.hashcode;
+ const void *value = new_node->value;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; *entryp != NULL; entryp = &(*entryp)->hash_next)
+ {
+ gl_hash_entry_t entry = *entryp;
+
+ if (entry->hashcode == hashcode)
+ {
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* Only the first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found already multiple nodes with the same value.
+ Add the new_node to it. */
+ return gl_oset_nx_add (nodes, new_node);
+ }
+ }
+ else
+ {
+ /* An entry representing a single node. */
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found already a node with the same value. Turn it
+ into an ordered set, and add new_node to it. */
+ gl_oset_t nodes;
+ struct gl_multiple_nodes *multi_entry;
+
+ nodes =
+ gl_oset_nx_create_empty (OSET_TREE_FLAVOR,
+ compare_by_position, NULL);
+ if (nodes == NULL)
+ return -1;
+
+ if (gl_oset_nx_add (nodes, node) < 0)
+ goto fail;
+ if (gl_oset_nx_add (nodes, new_node) < 0)
+ goto fail;
+
+ multi_entry =
+ (struct gl_multiple_nodes *) malloc (sizeof (struct gl_multiple_nodes));
+ if (multi_entry == NULL)
+ goto fail;
+ multi_entry->h.hash_next = entry->hash_next;
+ multi_entry->h.hashcode = entry->hashcode;
+ multi_entry->magic = MULTIPLE_NODES_MAGIC;
+ multi_entry->nodes = nodes;
+ *entryp = &multi_entry->h;
+ return 0;
+
+ fail:
+ gl_oset_free (nodes);
+ return -1;
+ }
+ }
+ }
+ }
+ }
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ new_node->h.hash_next = list->table[bucket];
+ list->table[bucket] = &new_node->h;
+ return 0;
+}
+/* Tell GCC that the likely return value is 0. */
+#if __GNUC__ >= 3
+# define add_to_bucket(list,node) \
+ __builtin_expect ((add_to_bucket) (list, node), 0)
+#endif
+
+/* Remove a node from the hash table structure.
+ If duplicates are allowed, this function performs in average time
+ O((log n)^2): gl_oset_remove may need to remove an element from an ordered
+ set of size O(n), needing O(log n) comparison function calls. The
+ comparison function is compare_by_position, which is O(log n) worst-case.
+ If duplicates are forbidden, this function is O(1) on average. */
+static void
+remove_from_bucket (gl_list_t list, gl_list_node_t old_node)
+{
+ size_t bucket = old_node->h.hashcode % list->table_size;
+
+ if (list->base.allow_duplicates)
+ {
+ size_t hashcode = old_node->h.hashcode;
+ const void *value = old_node->value;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+ {
+ gl_hash_entry_t entry = *entryp;
+
+ if (entry == &old_node->h)
+ {
+ /* Found old_node as a single node in the bucket. Remove it. */
+ *entryp = old_node->h.hash_next;
+ break;
+ }
+ if (entry == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC
+ && entry->hashcode == hashcode)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* Only the first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (value, node->value) : value == node->value)
+ {
+ /* Found multiple nodes with the same value.
+ old_node must be one of them. Remove it. */
+ if (!gl_oset_remove (nodes, old_node))
+ abort ();
+ if (gl_oset_size (nodes) == 1)
+ {
+ /* Replace a one-element set with a single node. */
+ node = gl_oset_first (nodes);
+ node->h.hash_next = entry->hash_next;
+ *entryp = &node->h;
+ gl_oset_free (nodes);
+ free (entry);
+ }
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ gl_hash_entry_t *entryp;
+
+ for (entryp = &list->table[bucket]; ; entryp = &(*entryp)->hash_next)
+ {
+ if (*entryp == &old_node->h)
+ {
+ *entryp = old_node->h.hash_next;
+ break;
+ }
+ if (*entryp == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ }
+ }
+}
+
+/* Build up the hash table during initialization: Store all the nodes of
+ list->root in the hash table.
+ Return 0 upon success, -1 upon out-of-memory. */
+static inline int
+add_nodes_to_buckets (gl_list_t list)
+{
+ /* Iterate across all nodes. */
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done;
+ stack_ptr--;
+ if (!stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Add the current node to the hash table. */
+ node->h.hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (node->value)
+ : (size_t)(uintptr_t) node->value);
+ if (add_to_bucket (list, node) < 0)
+ goto fail;
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ done:
+ return 0;
+
+ fail:
+ /* Undo everything. */
+ for (;;)
+ {
+ /* Descend on left branch. */
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ /* Descend on right branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto fail_done;
+ stack_ptr--;
+ if (stack_ptr->rightp)
+ break;
+ }
+ node = stack_ptr->node;
+ /* Remove the current node from the hash table. */
+ remove_from_bucket (list, node);
+ }
+ fail_done:
+ return -1;
+}
+/* Tell GCC that the likely return value is 0. */
+#if __GNUC__ >= 3
+# define add_nodes_to_buckets(list) \
+ __builtin_expect ((add_nodes_to_buckets) (list), 0)
+#endif
diff --git a/gnulib/lib/gl_anytreehash_list2.h b/gnulib/lib/gl_anytreehash_list2.h
new file mode 100644
index 0000000..d2cb1e6
--- /dev/null
+++ b/gnulib/lib/gl_anytreehash_list2.h
@@ -0,0 +1,213 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Common code of gl_avltreehash_list.c and gl_rbtreehash_list.c. */
+
+static gl_list_node_t
+gl_tree_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index
+ && end_index <= (list->root != NULL ? list->root->branch_size : 0)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t hashcode =
+ (list->base.hashcode_fn != NULL
+ ? list->base.hashcode_fn (elt)
+ : (size_t)(uintptr_t) elt);
+ size_t bucket = hashcode % list->table_size;
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ gl_hash_entry_t entry;
+
+ if (list->base.allow_duplicates)
+ {
+ for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+ if (entry->hashcode == hashcode)
+ {
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ /* An entry representing multiple nodes. */
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+ /* The first node is interesting. */
+ gl_list_node_t node = gl_oset_first (nodes);
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ /* All nodes in the entry are equal to the given ELT. */
+ if (start_index == 0)
+ {
+ /* We have to return only the one at the minimal
+ position, and this is the first one in the ordered
+ set. */
+ if (end_index == list->root->branch_size
+ || node_position (node) < end_index)
+ return node;
+ }
+ else
+ {
+ /* We have to return only the one at the minimal
+ position >= start_index. */
+ const void *elt;
+ if (gl_oset_search_atleast (nodes,
+ compare_position_threshold,
+ (void *)(uintptr_t)start_index,
+ &elt))
+ {
+ node = (gl_list_node_t) elt;
+ if (end_index == list->root->branch_size
+ || node_position (node) < end_index)
+ return node;
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ /* An entry representing a single node. */
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ bool position_in_bounds;
+ if (start_index == 0 && end_index == list->root->branch_size)
+ position_in_bounds = true;
+ else
+ {
+ size_t position = node_position (node);
+ position_in_bounds =
+ (position >= start_index && position < end_index);
+ }
+ if (position_in_bounds)
+ return node;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* If no duplicates are allowed, multiple nodes are not needed. */
+ for (entry = list->table[bucket]; entry != NULL; entry = entry->hash_next)
+ if (entry->hashcode == hashcode)
+ {
+ gl_list_node_t node = (struct gl_list_node_impl *) entry;
+ if (equals != NULL ? equals (elt, node->value) : elt == node->value)
+ {
+ bool position_in_bounds;
+ if (start_index == 0 && end_index == list->root->branch_size)
+ position_in_bounds = true;
+ else
+ {
+ size_t position = node_position (node);
+ position_in_bounds =
+ (position >= start_index && position < end_index);
+ }
+ if (position_in_bounds)
+ return node;
+ break;
+ }
+ }
+ }
+
+ return NULL;
+ }
+}
+
+static size_t
+gl_tree_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ gl_list_node_t node =
+ gl_tree_search_from_to (list, start_index, end_index, elt);
+
+ if (node != NULL)
+ return node_position (node);
+ else
+ return (size_t)(-1);
+}
+
+static void
+gl_tree_list_free (gl_list_t list)
+{
+ if (list->base.allow_duplicates)
+ {
+ /* Free the ordered sets in the hash buckets. */
+ size_t i;
+
+ for (i = list->table_size; i > 0; )
+ {
+ gl_hash_entry_t entry = list->table[--i];
+
+ while (entry != NULL)
+ {
+ gl_hash_entry_t next = entry->hash_next;
+
+ if (((struct gl_multiple_nodes *) entry)->magic == MULTIPLE_NODES_MAGIC)
+ {
+ gl_oset_t nodes = ((struct gl_multiple_nodes *) entry)->nodes;
+
+ gl_oset_free (nodes);
+ free (entry);
+ }
+
+ entry = next;
+ }
+ }
+ }
+
+ /* Iterate across all elements in post-order. */
+ {
+ gl_list_node_t node = list->root;
+ iterstack_t stack;
+ iterstack_item_t *stack_ptr = &stack[0];
+
+ for (;;)
+ {
+ /* Descend on left branch. */
+ for (;;)
+ {
+ if (node == NULL)
+ break;
+ stack_ptr->node = node;
+ stack_ptr->rightp = false;
+ node = node->left;
+ stack_ptr++;
+ }
+ /* Climb up again. */
+ for (;;)
+ {
+ if (stack_ptr == &stack[0])
+ goto done_iterate;
+ stack_ptr--;
+ node = stack_ptr->node;
+ if (!stack_ptr->rightp)
+ break;
+ /* Free the current node. */
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (node->value);
+ free (node);
+ }
+ /* Descend on right branch. */
+ stack_ptr->rightp = true;
+ node = node->right;
+ stack_ptr++;
+ }
+ }
+ done_iterate:
+ free (list->table);
+ free (list);
+}
diff --git a/gnulib/lib/gl_array_list.c b/gnulib/lib/gl_array_list.c
new file mode 100644
index 0000000..d0e2336
--- /dev/null
+++ b/gnulib/lib/gl_array_list.c
@@ -0,0 +1,680 @@
+/* Sequential list data type implemented by an array.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_array_list.h"
+
+#include <stdlib.h>
+/* Get memcpy. */
+#include <string.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* An array of ALLOCATED elements, of which the first COUNT are used.
+ 0 <= COUNT <= ALLOCATED. */
+ const void **elements;
+ size_t count;
+ size_t allocated;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_array_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ list->elements = NULL;
+ list->count = 0;
+ list->allocated = 0;
+
+ return list;
+}
+
+static gl_list_t
+gl_array_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ if (count > 0)
+ {
+ if (size_overflow_p (xtimes (count, sizeof (const void *))))
+ goto fail;
+ list->elements = (const void **) malloc (count * sizeof (const void *));
+ if (list->elements == NULL)
+ goto fail;
+ memcpy (list->elements, contents, count * sizeof (const void *));
+ }
+ else
+ list->elements = NULL;
+ list->count = count;
+ list->allocated = count;
+
+ return list;
+
+ fail:
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_array_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_array_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ return list->elements[index];
+}
+
+static int
+gl_array_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ list->elements[index] = elt;
+ return 0;
+}
+
+static gl_list_node_t
+gl_array_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < list->count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_array_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_array_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ return list->elements[position];
+}
+
+static gl_list_node_t
+gl_array_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ list->elements[position] = elt;
+ return INDEX_TO_NODE (position);
+}
+
+static size_t
+gl_array_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+
+ if (start_index < end_index)
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ if (equals != NULL)
+ {
+ size_t i;
+
+ for (i = start_index;;)
+ {
+ if (equals (elt, list->elements[i]))
+ return i;
+ i++;
+ if (i == end_index)
+ break;
+ }
+ }
+ else
+ {
+ size_t i;
+
+ for (i = start_index;;)
+ {
+ if (elt == list->elements[i])
+ return i;
+ i++;
+ if (i == end_index)
+ break;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_array_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t index = gl_array_indexof_from_to (list, start_index, end_index, elt);
+ return INDEX_TO_NODE (index);
+}
+
+/* Ensure that list->allocated > list->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_list_t list)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (list->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ memory = (const void **) realloc (list->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ list->elements = memory;
+ list->allocated = new_allocated;
+ return 0;
+}
+
+static gl_list_node_t
+gl_array_nx_add_first (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_array_nx_add_last (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ list->elements[count] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (count);
+}
+
+static gl_list_node_t
+gl_array_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index;
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_array_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index + 1;
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_array_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static bool
+gl_array_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t position;
+ const void **elements;
+ size_t i;
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ position = index;
+ elements = list->elements;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_array_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ const void **elements;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ elements = list->elements;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_array_remove (gl_list_t list, const void *elt)
+{
+ size_t position = gl_array_indexof_from_to (list, 0, list->count, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_array_remove_at (list, position);
+}
+
+static void
+gl_array_list_free (gl_list_t list)
+{
+ if (list->elements != NULL)
+ {
+ if (list->base.dispose_fn != NULL)
+ {
+ size_t count = list->count;
+
+ if (count > 0)
+ {
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ const void **elements = list->elements;
+
+ do
+ dispose (*elements++);
+ while (--count > 0);
+ }
+ }
+ free (list->elements);
+ }
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_array_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.p = list->elements + 0;
+ result.q = list->elements + list->count;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_array_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.p = list->elements + start_index;
+ result.q = list->elements + end_index;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_array_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ gl_list_t list = iterator->list;
+ if (iterator->count != list->count)
+ {
+ if (iterator->count != list->count + 1)
+ /* Concurrent modifications were done on the list. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->p = (const void **) iterator->p - 1;
+ iterator->q = (const void **) iterator->q - 1;
+ }
+ if (iterator->p < iterator->q)
+ {
+ const void **p = (const void **) iterator->p;
+ *eltp = *p;
+ if (nodep != NULL)
+ *nodep = INDEX_TO_NODE (p - list->elements);
+ iterator->p = p + 1;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static size_t
+gl_array_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ if (low < high)
+ {
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = compar (list->elements[mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT at index MID. But we need
+ the minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[high], elt) == 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+ int cmp2 = compar (list->elements[mid2], elt);
+
+ if (cmp2 < 0)
+ low = mid2 + 1;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ if (mid2 == low)
+ break;
+ high = mid2 - 1;
+ }
+ }
+ return low;
+ }
+ }
+ while (low < high);
+ /* Here low == high. */
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_array_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ return gl_array_sortedlist_indexof_from_to (list, compar, 0, list->count,
+ elt);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index =
+ gl_array_sortedlist_indexof_from_to (list, compar, low, high, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_array_sortedlist_indexof_from_to (list, compar, 0, list->count, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_array_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t count = list->count;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low <= high; for indices < low the values are
+ smaller than ELT; for indices >= high the values are greater than ELT. */
+ while (low < high)
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = compar (list->elements[mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ low = mid;
+ break;
+ }
+ }
+ return gl_array_nx_add_at (list, low, elt);
+}
+
+static bool
+gl_array_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_array_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_array_remove_at (list, index);
+}
+
+
+const struct gl_list_implementation gl_array_list_implementation =
+ {
+ gl_array_nx_create_empty,
+ gl_array_nx_create,
+ gl_array_size,
+ gl_array_node_value,
+ gl_array_node_nx_set_value,
+ gl_array_next_node,
+ gl_array_previous_node,
+ gl_array_get_at,
+ gl_array_nx_set_at,
+ gl_array_search_from_to,
+ gl_array_indexof_from_to,
+ gl_array_nx_add_first,
+ gl_array_nx_add_last,
+ gl_array_nx_add_before,
+ gl_array_nx_add_after,
+ gl_array_nx_add_at,
+ gl_array_remove_node,
+ gl_array_remove_at,
+ gl_array_remove,
+ gl_array_list_free,
+ gl_array_iterator,
+ gl_array_iterator_from_to,
+ gl_array_iterator_next,
+ gl_array_iterator_free,
+ gl_array_sortedlist_search,
+ gl_array_sortedlist_search_from_to,
+ gl_array_sortedlist_indexof,
+ gl_array_sortedlist_indexof_from_to,
+ gl_array_sortedlist_nx_add,
+ gl_array_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_array_list.h b/gnulib/lib/gl_array_list.h
new file mode 100644
index 0000000..72e8062
--- /dev/null
+++ b/gnulib/lib/gl_array_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by an array.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_ARRAY_LIST_H
+#define _GL_ARRAY_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_array_list_implementation;
+#define GL_ARRAY_LIST &gl_array_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ARRAY_LIST_H */
diff --git a/gnulib/lib/gl_array_oset.c b/gnulib/lib/gl_array_oset.c
new file mode 100644
index 0000000..ca2419c
--- /dev/null
+++ b/gnulib/lib/gl_array_oset.c
@@ -0,0 +1,357 @@
+/* Ordered set data type implemented by an array.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_array_oset.h"
+
+#include <stdlib.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ /* An array of ALLOCATED elements, of which the first COUNT are used.
+ 0 <= COUNT <= ALLOCATED. */
+ const void **elements;
+ size_t count;
+ size_t allocated;
+};
+
+static gl_oset_t
+gl_array_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ struct gl_oset_impl *set =
+ (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+ if (set == NULL)
+ return NULL;
+
+ set->base.vtable = implementation;
+ set->base.compar_fn = compar_fn;
+ set->base.dispose_fn = dispose_fn;
+ set->elements = NULL;
+ set->count = 0;
+ set->allocated = 0;
+
+ return set;
+}
+
+static size_t
+gl_array_size (gl_oset_t set)
+{
+ return set->count;
+}
+
+static size_t
+gl_array_indexof (gl_oset_t set, const void *elt)
+{
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = (compar != NULL
+ ? compar (set->elements[mid], elt)
+ : (set->elements[mid] > elt ? 1 :
+ set->elements[mid] < elt ? -1 : 0));
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ /* We have an element equal to ELT at index MID. */
+ return mid;
+ }
+ while (low < high);
+ }
+ return (size_t)(-1);
+}
+
+static bool
+gl_array_search (gl_oset_t set, const void *elt)
+{
+ return gl_array_indexof (set, elt) != (size_t)(-1);
+}
+
+static bool
+gl_array_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp)
+{
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values are
+ smaller than THRESHOLD; for indices >= high the values are nonexistent.
+ So, if an element >= THRESHOLD occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+
+ if (! threshold_fn (set->elements[mid], threshold))
+ low = mid + 1;
+ else
+ {
+ /* We have an element >= THRESHOLD at index MID. But we need the
+ minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[high], value) >= 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+
+ if (! threshold_fn (set->elements[mid2], threshold))
+ low = mid2 + 1;
+ else
+ high = mid2;
+ }
+ *eltp = set->elements[low];
+ return true;
+ }
+ }
+ while (low < high);
+ }
+ return false;
+}
+
+/* Ensure that set->allocated > set->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_oset_t set)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (set->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ memory = (const void **) realloc (set->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ set->elements = memory;
+ set->allocated = new_allocated;
+ return 0;
+}
+
+/* Add the given element ELT at the given position,
+ 0 <= position <= gl_oset_size (set).
+ Return 1 upon success, -1 upon out-of-memory. */
+static inline int
+gl_array_nx_add_at (gl_oset_t set, size_t position, const void *elt)
+{
+ size_t count = set->count;
+ const void **elements;
+ size_t i;
+
+ if (count == set->allocated)
+ if (grow (set) < 0)
+ return -1;
+ elements = set->elements;
+ for (i = count; i > position; i--)
+ elements[i] = elements[i - 1];
+ elements[position] = elt;
+ set->count = count + 1;
+ return 1;
+}
+
+/* Remove the element at the given position,
+ 0 <= position < gl_oset_size (set). */
+static inline void
+gl_array_remove_at (gl_oset_t set, size_t position)
+{
+ size_t count = set->count;
+ const void **elements;
+ size_t i;
+
+ elements = set->elements;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (elements[position]);
+ for (i = position + 1; i < count; i++)
+ elements[i - 1] = elements[i];
+ set->count = count - 1;
+}
+
+static int
+gl_array_nx_add (gl_oset_t set, const void *elt)
+{
+ size_t count = set->count;
+ size_t low = 0;
+
+ if (count > 0)
+ {
+ gl_setelement_compar_fn compar = set->base.compar_fn;
+ size_t high = count;
+
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ int cmp = (compar != NULL
+ ? compar (set->elements[mid], elt)
+ : (set->elements[mid] > elt ? 1 :
+ set->elements[mid] < elt ? -1 : 0));
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ return false;
+ }
+ while (low < high);
+ }
+ return gl_array_nx_add_at (set, low, elt);
+}
+
+static bool
+gl_array_remove (gl_oset_t set, const void *elt)
+{
+ size_t index = gl_array_indexof (set, elt);
+ if (index != (size_t)(-1))
+ {
+ gl_array_remove_at (set, index);
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_free (gl_oset_t set)
+{
+ if (set->elements != NULL)
+ {
+ if (set->base.dispose_fn != NULL)
+ {
+ size_t count = set->count;
+
+ if (count > 0)
+ {
+ gl_setelement_dispose_fn dispose = set->base.dispose_fn;
+ const void **elements = set->elements;
+
+ do
+ dispose (*elements++);
+ while (--count > 0);
+ }
+ }
+ free (set->elements);
+ }
+ free (set);
+}
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+static gl_oset_iterator_t
+gl_array_iterator (gl_oset_t set)
+{
+ gl_oset_iterator_t result;
+
+ result.vtable = set->base.vtable;
+ result.set = set;
+ result.count = set->count;
+ result.p = set->elements + 0;
+ result.q = set->elements + set->count;
+#ifdef lint
+ result.i = 0;
+ result.j = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_array_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ gl_oset_t set = iterator->set;
+ if (iterator->count != set->count)
+ {
+ if (iterator->count != set->count + 1)
+ /* Concurrent modifications were done on the set. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->p = (const void **) iterator->p - 1;
+ iterator->q = (const void **) iterator->q - 1;
+ }
+ if (iterator->p < iterator->q)
+ {
+ const void **p = (const void **) iterator->p;
+ *eltp = *p;
+ iterator->p = p + 1;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_array_iterator_free (gl_oset_iterator_t *iterator)
+{
+}
+
+
+const struct gl_oset_implementation gl_array_oset_implementation =
+ {
+ gl_array_nx_create_empty,
+ gl_array_size,
+ gl_array_search,
+ gl_array_search_atleast,
+ gl_array_nx_add,
+ gl_array_remove,
+ gl_array_free,
+ gl_array_iterator,
+ gl_array_iterator_next,
+ gl_array_iterator_free
+ };
diff --git a/gnulib/lib/gl_array_oset.h b/gnulib/lib/gl_array_oset.h
new file mode 100644
index 0000000..79a6404
--- /dev/null
+++ b/gnulib/lib/gl_array_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by an array.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_ARRAY_OSET_H
+#define _GL_ARRAY_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_array_oset_implementation;
+#define GL_ARRAY_OSET &gl_array_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_ARRAY_OSET_H */
diff --git a/gnulib/lib/gl_avltree_list.c b/gnulib/lib/gl_avltree_list.c
new file mode 100644
index 0000000..4151672
--- /dev/null
+++ b/gnulib/lib/gl_avltree_list.c
@@ -0,0 +1,101 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltree_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic AVL tree code. */
+#include "gl_anyavltree_list1.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list1.h"
+
+/* Generic AVL tree code. */
+#include "gl_anyavltree_list2.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltree_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+const struct gl_list_implementation gl_avltree_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_avltree_list.h b/gnulib/lib/gl_avltree_list.h
new file mode 100644
index 0000000..71b6244
--- /dev/null
+++ b/gnulib/lib/gl_avltree_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_AVLTREE_LIST_H
+#define _GL_AVLTREE_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_avltree_list_implementation;
+#define GL_AVLTREE_LIST &gl_avltree_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREE_LIST_H */
diff --git a/gnulib/lib/gl_avltree_oset.c b/gnulib/lib/gl_avltree_oset.c
new file mode 100644
index 0000000..af473d2
--- /dev/null
+++ b/gnulib/lib/gl_avltree_oset.c
@@ -0,0 +1,583 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltree_oset.h"
+
+#include <stdlib.h>
+
+/* An AVL tree is a binary tree where
+ 1. The height of each node is calculated as
+ heightof(node) = 1 + max (heightof(node.left), heightof(node.right)).
+ 2. The heights of the subtrees of each node differ by at most 1:
+ | heightof(right) - heightof(left) | <= 1.
+ 3. The index of the elements in the node.left subtree are smaller than
+ the index of node.
+ The index of the elements in the node.right subtree are larger than
+ the index of node.
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Tree node implementation, valid for this file only. */
+struct gl_oset_node_impl
+{
+ struct gl_oset_node_impl *left; /* left branch, or NULL */
+ struct gl_oset_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_oset_node_t can be returned
+ without memory allocation, on which the functions gl_oset_remove_node,
+ gl_oset_add_before, gl_oset_add_after can be implemented. */
+ struct gl_oset_node_impl *parent;
+ int balance; /* heightof(right) - heightof(left),
+ always = -1 or 0 or 1 */
+ const void *value;
+};
+typedef struct gl_oset_node_impl * gl_oset_node_t;
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ struct gl_oset_node_impl *root; /* root node or NULL */
+ size_t count; /* number of nodes */
+};
+
+/* An AVL tree of height h has at least F_(h+2) [Fibonacci number] and at most
+ 2^h - 1 elements. So, h <= 84 (because a tree of height h >= 85 would have
+ at least F_87 elements, and because even on 64-bit machines,
+ sizeof (gl_oset_node_impl) * F_87 > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 83
+
+/* Ensure the tree is balanced, after an insertion or deletion operation.
+ The height of NODE is incremented by HEIGHT_DIFF (1 or -1).
+ PARENT = NODE->parent. (NODE can also be NULL. But PARENT is non-NULL.)
+ Rotation operations are performed starting at PARENT (not NODE itself!). */
+static void
+rebalance (gl_oset_t set,
+ gl_oset_node_t node, int height_diff, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ gl_oset_node_t child;
+ int previous_balance;
+ int balance_diff;
+ gl_oset_node_t nodeleft;
+ gl_oset_node_t noderight;
+
+ child = node;
+ node = parent;
+
+ previous_balance = node->balance;
+
+ /* The balance of NODE is incremented by BALANCE_DIFF: +1 if the right
+ branch's height has increased by 1 or the left branch's height has
+ decreased by 1, -1 if the right branch's height has decreased by 1 or
+ the left branch's height has increased by 1, 0 if no height change. */
+ if (node->left != NULL || node->right != NULL)
+ balance_diff = (child == node->right ? height_diff : -height_diff);
+ else
+ /* Special case where above formula doesn't work, because the caller
+ didn't tell whether node's left or right branch shrunk from height 1
+ to NULL. */
+ balance_diff = - previous_balance;
+
+ node->balance += balance_diff;
+ if (balance_diff == previous_balance)
+ {
+ /* node->balance is outside the range [-1,1]. Must rotate. */
+ gl_oset_node_t *nodep;
+
+ if (node->parent == NULL)
+ /* node == set->root */
+ nodep = &set->root;
+ else if (node->parent->left == node)
+ nodep = &node->parent->left;
+ else if (node->parent->right == node)
+ nodep = &node->parent->right;
+ else
+ abort ();
+
+ nodeleft = node->left;
+ noderight = node->right;
+
+ if (balance_diff < 0)
+ {
+ /* node->balance = -2. The subtree is heavier on the left side.
+ Rotate from left to right:
+
+ *
+ / \
+ h+2 h
+ */
+ gl_oset_node_t nodeleftright = nodeleft->right;
+ if (nodeleft->balance <= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h+2 h --> / h+1|h+2
+ / \ | / \
+ h+1 h|h+1 h+1 h|h+1 h
+ */
+ node->left = nodeleftright;
+ nodeleft->right = node;
+
+ nodeleft->parent = node->parent;
+ node->parent = nodeleft;
+ if (nodeleftright != NULL)
+ nodeleftright->parent = node;
+
+ nodeleft->balance += 1;
+ node->balance = - nodeleft->balance;
+
+ *nodep = nodeleft;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ nodeleft->balance - 1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ nodeleft->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h+2 h --> h+1 h+1
+ / \ / \ / \
+ h h+1 h L R h
+ / \
+ L R
+
+ */
+ gl_oset_node_t L = nodeleft->right = nodeleftright->left;
+ gl_oset_node_t R = node->left = nodeleftright->right;
+ nodeleftright->left = nodeleft;
+ nodeleftright->right = node;
+
+ nodeleftright->parent = node->parent;
+ if (L != NULL)
+ L->parent = nodeleft;
+ if (R != NULL)
+ R->parent = node;
+ nodeleft->parent = nodeleftright;
+ node->parent = nodeleftright;
+
+ nodeleft->balance = (nodeleftright->balance > 0 ? -1 : 0);
+ node->balance = (nodeleftright->balance < 0 ? 1 : 0);
+ nodeleftright->balance = 0;
+
+ *nodep = nodeleftright;
+ height_diff = (height_diff < 0
+ ? /* noderight's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* nodeleft's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ else
+ {
+ /* node->balance = 2. The subtree is heavier on the right side.
+ Rotate from right to left:
+
+ *
+ / \
+ h h+2
+ */
+ gl_oset_node_t noderightleft = noderight->left;
+ if (noderight->balance >= 0)
+ {
+ /*
+ * h+2|h+3
+ / \ / \
+ h h+2 --> h+1|h+2 \
+ / \ / \ |
+ h|h+1 h+1 h h|h+1 h+1
+ */
+ node->right = noderightleft;
+ noderight->left = node;
+
+ noderight->parent = node->parent;
+ node->parent = noderight;
+ if (noderightleft != NULL)
+ noderightleft->parent = node;
+
+ noderight->balance -= 1;
+ node->balance = - noderight->balance;
+
+ *nodep = noderight;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2|h+3. */
+ - noderight->balance - 1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2|h+3. */
+ - noderight->balance);
+ }
+ else
+ {
+ /*
+ * h+2
+ / \ / \
+ h h+2 --> h+1 h+1
+ / \ / \ / \
+ h+1 h h L R h
+ / \
+ L R
+
+ */
+ gl_oset_node_t L = node->right = noderightleft->left;
+ gl_oset_node_t R = noderight->left = noderightleft->right;
+ noderightleft->left = node;
+ noderightleft->right = noderight;
+
+ noderightleft->parent = node->parent;
+ if (L != NULL)
+ L->parent = node;
+ if (R != NULL)
+ R->parent = noderight;
+ node->parent = noderightleft;
+ noderight->parent = noderightleft;
+
+ node->balance = (noderightleft->balance > 0 ? -1 : 0);
+ noderight->balance = (noderightleft->balance < 0 ? 1 : 0);
+ noderightleft->balance = 0;
+
+ *nodep = noderightleft;
+ height_diff = (height_diff < 0
+ ? /* nodeleft's height had been decremented from
+ h+1 to h. The subtree's height changes from
+ h+3 to h+2. */
+ -1
+ : /* noderight's height had been incremented from
+ h+1 to h+2. The subtree's height changes from
+ h+2 to h+2. */
+ 0);
+ }
+ }
+ node = *nodep;
+ }
+ else
+ {
+ /* No rotation needed. Only propagation of the height change to the
+ next higher level. */
+ if (height_diff < 0)
+ height_diff = (previous_balance == 0 ? 0 : -1);
+ else
+ height_diff = (node->balance == 0 ? 0 : 1);
+ }
+
+ if (height_diff == 0)
+ break;
+
+ parent = node->parent;
+ if (parent == NULL)
+ break;
+ }
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_first (gl_oset_t set, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (set->root == NULL)
+ {
+ set->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_oset_node_t node;
+
+ for (node = set->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+ node->balance--;
+
+ /* Rebalance. */
+ if (node->right == NULL && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+ }
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_before (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+ bool height_inc;
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ {
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ new_node->parent = node;
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_after (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+ bool height_inc;
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->balance = 0;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ {
+ node->right = new_node;
+ node->balance++;
+ height_inc = (node->left == NULL);
+ }
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ node->balance--;
+ height_inc = (node->right == NULL);
+ }
+ new_node->parent = node;
+
+ /* Rebalance. */
+ if (height_inc && node->parent != NULL)
+ rebalance (set, node, 1, node->parent);
+
+ set->count++;
+ return new_node;
+}
+
+static bool
+gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node)
+{
+ gl_oset_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_oset_node_t child = node->right;
+
+ if (child != NULL)
+ child->parent = parent;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ rebalance (set, child, -1, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_oset_node_t child = node->left;
+
+ child->parent = parent;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ rebalance (set, child, -1, parent);
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_oset_node_t subst;
+ gl_oset_node_t subst_parent;
+ gl_oset_node_t child;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->balance = node->balance;
+ subst->parent = parent;
+ if (parent == NULL)
+ set->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance (set, child, -1, subst_parent != node ? subst_parent : subst);
+ }
+
+ set->count--;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+/* Generic binary tree code. */
+#include "gl_anytree_oset.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_oset_node_t node, gl_oset_node_t parent, size_t *counterp)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node, counterp) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node, counterp) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ (*counterp)++;
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltree_oset_check_invariants (gl_oset_t set)
+{
+ size_t counter = 0;
+ if (set->root != NULL)
+ check_invariants (set->root, NULL, &counter);
+ if (!(set->count == counter))
+ abort ();
+}
+
+const struct gl_oset_implementation gl_avltree_oset_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_size,
+ gl_tree_search,
+ gl_tree_search_atleast,
+ gl_tree_nx_add,
+ gl_tree_remove,
+ gl_tree_oset_free,
+ gl_tree_iterator,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free
+ };
diff --git a/gnulib/lib/gl_avltree_oset.h b/gnulib/lib/gl_avltree_oset.h
new file mode 100644
index 0000000..9b888cc
--- /dev/null
+++ b/gnulib/lib/gl_avltree_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_AVLTREE_OSET_H
+#define _GL_AVLTREE_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_avltree_oset_implementation;
+#define GL_AVLTREE_OSET &gl_avltree_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREE_OSET_H */
diff --git a/gnulib/lib/gl_avltreehash_list.c b/gnulib/lib/gl_avltreehash_list.c
new file mode 100644
index 0000000..23152e3
--- /dev/null
+++ b/gnulib/lib/gl_avltreehash_list.c
@@ -0,0 +1,127 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_avltreehash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "gl_avltree_oset.h"
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* Which kind of binary trees to use for ordered sets. Quite arbitrary. */
+#define OSET_TREE_FLAVOR GL_AVLTREE_OSET
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code: Type definitions. */
+#include "gl_anyhash_list1.h"
+
+/* Generic AVL tree code: Type definitions. */
+#include "gl_anyavltree_list1.h"
+
+/* Generic hash-table code: Low-level code. */
+#include "gl_anyhash_list2.h"
+
+/* Generic binary tree code: Type definitions. */
+#include "gl_anytree_list1.h"
+
+/* Hash-table with binary tree code: Handling of hash buckets. */
+#include "gl_anytreehash_list1.h"
+
+/* Generic AVL tree code: Insertion/deletion algorithms. */
+#include "gl_anyavltree_list2.h"
+
+/* Generic binary tree code: Functions taking advantage of the hash table. */
+#include "gl_anytreehash_list2.h"
+
+/* Generic binary tree code: All other functions. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_height =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_height =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+ int balance = (int)right_height - (int)left_height;
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(balance >= -1 && balance <= 1))
+ abort ();
+ if (!(node->balance == balance))
+ abort ();
+
+ return 1 + (left_height > right_height ? left_height : right_height);
+}
+void
+gl_avltreehash_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+
+const struct gl_list_implementation gl_avltreehash_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_avltreehash_list.h b/gnulib/lib/gl_avltreehash_list.h
new file mode 100644
index 0000000..2fecb11
--- /dev/null
+++ b/gnulib/lib/gl_avltreehash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_AVLTREEHASH_LIST_H
+#define _GL_AVLTREEHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_avltreehash_list_implementation;
+#define GL_AVLTREEHASH_LIST &gl_avltreehash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_AVLTREEHASH_LIST_H */
diff --git a/gnulib/lib/gl_carray_list.c b/gnulib/lib/gl_carray_list.c
new file mode 100644
index 0000000..e7aee8c
--- /dev/null
+++ b/gnulib/lib/gl_carray_list.c
@@ -0,0 +1,873 @@
+/* Sequential list data type implemented by a circular array.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_carray_list.h"
+
+#include <stdlib.h>
+/* Get memcpy. */
+#include <string.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* An array of ALLOCATED elements, of which the elements
+ OFFSET, (OFFSET + 1) % ALLOCATED, ..., (OFFSET + COUNT - 1) % ALLOCATED
+ are used. 0 <= COUNT <= ALLOCATED. Either OFFSET = ALLOCATED = 0 or
+ 0 <= OFFSET < ALLOCATED. */
+ const void **elements;
+ size_t offset;
+ size_t count;
+ size_t allocated;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_carray_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ list->elements = NULL;
+ list->offset = 0;
+ list->count = 0;
+ list->allocated = 0;
+
+ return list;
+}
+
+static gl_list_t
+gl_carray_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = implementation;
+ list->base.equals_fn = equals_fn;
+ list->base.hashcode_fn = hashcode_fn;
+ list->base.dispose_fn = dispose_fn;
+ list->base.allow_duplicates = allow_duplicates;
+ if (count > 0)
+ {
+ if (size_overflow_p (xtimes (count, sizeof (const void *))))
+ goto fail;
+ list->elements = (const void **) malloc (count * sizeof (const void *));
+ if (list->elements == NULL)
+ goto fail;
+ memcpy (list->elements, contents, count * sizeof (const void *));
+ }
+ else
+ list->elements = NULL;
+ list->offset = 0;
+ list->count = count;
+ list->allocated = count;
+
+ return list;
+
+ fail:
+ free (list);
+ return NULL;
+}
+
+static size_t
+gl_carray_size (gl_list_t list)
+{
+ return list->count;
+}
+
+static const void *
+gl_carray_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t i;
+
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + index;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ return list->elements[i];
+}
+
+static int
+gl_carray_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t i;
+
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + index;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ return 0;
+}
+
+static gl_list_node_t
+gl_carray_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < list->count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_carray_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->count))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_carray_get_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + position;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ return list->elements[i];
+}
+
+static gl_list_node_t
+gl_carray_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ i = list->offset + position;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ return INDEX_TO_NODE (position);
+}
+
+static size_t
+gl_carray_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t count = list->count;
+
+ if (!(start_index <= end_index && end_index <= count))
+ /* Invalid arguments. */
+ abort ();
+
+ if (start_index < end_index)
+ {
+ gl_listelement_equals_fn equals = list->base.equals_fn;
+ size_t allocated = list->allocated;
+ size_t i_end;
+
+ i_end = list->offset + end_index;
+ if (i_end >= allocated)
+ i_end -= allocated;
+
+ if (equals != NULL)
+ {
+ size_t i;
+
+ i = list->offset + start_index;
+ if (i >= allocated) /* can only happen if start_index > 0 */
+ i -= allocated;
+
+ for (;;)
+ {
+ if (equals (elt, list->elements[i]))
+ return (i >= list->offset ? i : i + allocated) - list->offset;
+ i++;
+ if (i == allocated)
+ i = 0;
+ if (i == i_end)
+ break;
+ }
+ }
+ else
+ {
+ size_t i;
+
+ i = list->offset + start_index;
+ if (i >= allocated) /* can only happen if start_index > 0 */
+ i -= allocated;
+
+ for (;;)
+ {
+ if (elt == list->elements[i])
+ return (i >= list->offset ? i : i + allocated) - list->offset;
+ i++;
+ if (i == allocated)
+ i = 0;
+ if (i == i_end)
+ break;
+ }
+ }
+ }
+ return (size_t)(-1);
+}
+
+static gl_list_node_t
+gl_carray_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ size_t index = gl_carray_indexof_from_to (list, start_index, end_index, elt);
+ return INDEX_TO_NODE (index);
+}
+
+/* Ensure that list->allocated > list->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
+grow (gl_list_t list)
+{
+ size_t new_allocated;
+ size_t memory_size;
+ const void **memory;
+
+ new_allocated = xtimes (list->allocated, 2);
+ new_allocated = xsum (new_allocated, 1);
+ memory_size = xtimes (new_allocated, sizeof (const void *));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ return -1;
+ if (list->offset > 0 && list->count > 0)
+ {
+ memory = (const void **) malloc (memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ if (list->offset + list->count > list->allocated)
+ {
+ memcpy (memory, &list->elements[list->offset],
+ (list->allocated - list->offset) * sizeof (const void *));
+ memcpy (memory + (list->allocated - list->offset), list->elements,
+ (list->offset + list->count - list->allocated)
+ * sizeof (const void *));
+
+ }
+ else
+ memcpy (memory, &list->elements[list->offset],
+ list->count * sizeof (const void *));
+ if (list->elements != NULL)
+ free (list->elements);
+ }
+ else
+ {
+ memory = (const void **) realloc (list->elements, memory_size);
+ if (memory == NULL)
+ /* Out of memory. */
+ return -1;
+ }
+ list->elements = memory;
+ list->offset = 0;
+ list->allocated = new_allocated;
+ return 0;
+}
+
+static gl_list_node_t
+gl_carray_nx_add_first (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ list->offset = (list->offset == 0 ? list->allocated : list->offset) - 1;
+ list->elements[list->offset] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_last (gl_list_t list, const void *elt)
+{
+ size_t count = list->count;
+ size_t i;
+
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ i = list->offset + count;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ list->elements[i] = elt;
+ list->count = count + 1;
+ return INDEX_TO_NODE (count);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ size_t count = list->count;
+ const void **elements;
+
+ if (!(position <= count))
+ /* Invalid argument. */
+ abort ();
+ if (count == list->allocated)
+ if (grow (list) < 0)
+ return NULL;
+ elements = list->elements;
+ if (position <= (count / 2))
+ {
+ /* Shift at most count/2 elements to the left. */
+ size_t i2, i;
+
+ list->offset = (list->offset == 0 ? list->allocated : list->offset) - 1;
+
+ i2 = list->offset + position;
+ if (i2 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i1 = list->allocated - 1;
+ i2 -= list->allocated;
+ for (i = list->offset; i < i1; i++)
+ elements[i] = elements[i + 1];
+ elements[i1] = elements[0];
+ for (i = 0; i < i2; i++)
+ elements[i] = elements[i + 1];
+ }
+ else
+ {
+ for (i = list->offset; i < i2; i++)
+ elements[i] = elements[i + 1];
+ }
+ elements[i2] = elt;
+ }
+ else
+ {
+ /* Shift at most (count+1)/2 elements to the right. */
+ size_t i1, i3, i;
+
+ i1 = list->offset + position;
+ i3 = list->offset + count;
+ if (i1 >= list->allocated)
+ {
+ i1 -= list->allocated;
+ i3 -= list->allocated;
+ for (i = i3; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ else if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ i3 -= list->allocated;
+ for (i = i3; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elements[i2];
+ for (i = i2; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ else
+ {
+ for (i = i3; i > i1; i--)
+ elements[i] = elements[i - 1];
+ }
+ elements[i1] = elt;
+ }
+ list->count = count + 1;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_nx_add_at (list, index, elt);
+}
+
+static gl_list_node_t
+gl_carray_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_nx_add_at (list, index + 1, elt);
+}
+
+static bool
+gl_carray_remove_at (gl_list_t list, size_t position)
+{
+ size_t count = list->count;
+ const void **elements;
+
+ if (!(position < count))
+ /* Invalid argument. */
+ abort ();
+ /* Here we know count > 0. */
+ elements = list->elements;
+ if (position <= ((count - 1) / 2))
+ {
+ /* Shift at most (count-1)/2 elements to the right. */
+ size_t i0, i2, i;
+
+ i0 = list->offset;
+ i2 = list->offset + position;
+ if (i2 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i1 = list->allocated - 1;
+ i2 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i2]);
+ for (i = i2; i > 0; i--)
+ elements[i] = elements[i - 1];
+ elements[0] = elements[i1];
+ for (i = i1; i > i0; i--)
+ elements[i] = elements[i - 1];
+ }
+ else
+ {
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i2]);
+ for (i = i2; i > i0; i--)
+ elements[i] = elements[i - 1];
+ }
+
+ i0++;
+ list->offset = (i0 == list->allocated ? 0 : i0);
+ }
+ else
+ {
+ /* Shift at most count/2 elements to the left. */
+ size_t i1, i3, i;
+
+ i1 = list->offset + position;
+ i3 = list->offset + count - 1;
+ if (i1 >= list->allocated)
+ {
+ i1 -= list->allocated;
+ i3 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ else if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ i3 -= list->allocated;
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i2; i++)
+ elements[i] = elements[i + 1];
+ elements[i2] = elements[0];
+ for (i = 0; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ else
+ {
+ if (list->base.dispose_fn != NULL)
+ list->base.dispose_fn (elements[i1]);
+ for (i = i1; i < i3; i++)
+ elements[i] = elements[i + 1];
+ }
+ }
+ list->count = count - 1;
+ return true;
+}
+
+static bool
+gl_carray_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ size_t count = list->count;
+ uintptr_t index = NODE_TO_INDEX (node);
+
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ return gl_carray_remove_at (list, index);
+}
+
+static bool
+gl_carray_remove (gl_list_t list, const void *elt)
+{
+ size_t position = gl_carray_indexof_from_to (list, 0, list->count, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_carray_remove_at (list, position);
+}
+
+static void
+gl_carray_list_free (gl_list_t list)
+{
+ if (list->elements != NULL)
+ {
+ if (list->base.dispose_fn != NULL)
+ {
+ size_t count = list->count;
+
+ if (count > 0)
+ {
+ gl_listelement_dispose_fn dispose = list->base.dispose_fn;
+ const void **elements = list->elements;
+ size_t i1 = list->offset;
+ size_t i3 = list->offset + count - 1;
+
+ if (i3 >= list->allocated)
+ {
+ /* Here we must have list->offset > 0, hence
+ list->allocated > 0. */
+ size_t i2 = list->allocated - 1;
+ size_t i;
+
+ i3 -= list->allocated;
+ for (i = i1; i <= i2; i++)
+ dispose (elements[i]);
+ for (i = 0; i <= i3; i++)
+ dispose (elements[i]);
+ }
+ else
+ {
+ size_t i;
+
+ for (i = i1; i <= i3; i++)
+ dispose (elements[i]);
+ }
+ }
+ }
+ free (list->elements);
+ }
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_carray_iterator (gl_list_t list)
+{
+ gl_list_iterator_t result;
+
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.i = 0;
+ result.j = list->count;
+#ifdef lint
+ result.p = 0;
+ result.q = 0;
+#endif
+
+ return result;
+}
+
+static gl_list_iterator_t
+gl_carray_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ gl_list_iterator_t result;
+
+ if (!(start_index <= end_index && end_index <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ result.vtable = list->base.vtable;
+ result.list = list;
+ result.count = list->count;
+ result.i = start_index;
+ result.j = end_index;
+#ifdef lint
+ result.p = 0;
+ result.q = 0;
+#endif
+
+ return result;
+}
+
+static bool
+gl_carray_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ gl_list_t list = iterator->list;
+ if (iterator->count != list->count)
+ {
+ if (iterator->count != list->count + 1)
+ /* Concurrent modifications were done on the list. */
+ abort ();
+ /* The last returned element was removed. */
+ iterator->count--;
+ iterator->i--;
+ iterator->j--;
+ }
+ if (iterator->i < iterator->j)
+ {
+ size_t i = list->offset + iterator->i;
+ if (i >= list->allocated)
+ i -= list->allocated;
+ *eltp = list->elements[i];
+ if (nodep != NULL)
+ *nodep = INDEX_TO_NODE (iterator->i);
+ iterator->i++;
+ return true;
+ }
+ else
+ return false;
+}
+
+static void
+gl_carray_iterator_free (gl_list_iterator_t *iterator)
+{
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static size_t
+gl_carray_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ if (!(low <= high && high <= list->count))
+ /* Invalid arguments. */
+ abort ();
+ if (low < high)
+ {
+ /* At each loop iteration, low < high; for indices < low the values
+ are smaller than ELT; for indices >= high the values are greater
+ than ELT. So, if the element occurs in the list, it is at
+ low <= position < high. */
+ do
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ size_t i_mid;
+ int cmp;
+
+ i_mid = list->offset + mid;
+ if (i_mid >= list->allocated)
+ i_mid -= list->allocated;
+
+ cmp = compar (list->elements[i_mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ /* We have an element equal to ELT at index MID. But we need
+ the minimal such index. */
+ high = mid;
+ /* At each loop iteration, low <= high and
+ compar (list->elements[i_high], elt) == 0,
+ and we know that the first occurrence of the element is at
+ low <= position <= high. */
+ while (low < high)
+ {
+ size_t mid2 = low + (high - low) / 2; /* low <= mid2 < high */
+ size_t i_mid2;
+ int cmp2;
+
+ i_mid2 = list->offset + mid2;
+ if (i_mid2 >= list->allocated)
+ i_mid2 -= list->allocated;
+
+ cmp2 = compar (list->elements[i_mid2], elt);
+
+ if (cmp2 < 0)
+ low = mid2 + 1;
+ else if (cmp2 > 0)
+ /* The list was not sorted. */
+ abort ();
+ else /* cmp2 == 0 */
+ {
+ if (mid2 == low)
+ break;
+ high = mid2 - 1;
+ }
+ }
+ return low;
+ }
+ }
+ while (low < high);
+ /* Here low == high. */
+ }
+ return (size_t)(-1);
+}
+
+static size_t
+gl_carray_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ return gl_carray_sortedlist_indexof_from_to (list, compar, 0, list->count,
+ elt);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index =
+ gl_carray_sortedlist_indexof_from_to (list, compar, low, high, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_carray_sortedlist_indexof_from_to (list, compar, 0, list->count, elt);
+ return INDEX_TO_NODE (index);
+}
+
+static gl_list_node_t
+gl_carray_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t count = list->count;
+ size_t low = 0;
+ size_t high = count;
+
+ /* At each loop iteration, low <= high; for indices < low the values are
+ smaller than ELT; for indices >= high the values are greater than ELT. */
+ while (low < high)
+ {
+ size_t mid = low + (high - low) / 2; /* low <= mid < high */
+ size_t i_mid;
+ int cmp;
+
+ i_mid = list->offset + mid;
+ if (i_mid >= list->allocated)
+ i_mid -= list->allocated;
+
+ cmp = compar (list->elements[i_mid], elt);
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else /* cmp == 0 */
+ {
+ low = mid;
+ break;
+ }
+ }
+ return gl_carray_nx_add_at (list, low, elt);
+}
+
+static bool
+gl_carray_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_carray_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_carray_remove_at (list, index);
+}
+
+
+const struct gl_list_implementation gl_carray_list_implementation =
+ {
+ gl_carray_nx_create_empty,
+ gl_carray_nx_create,
+ gl_carray_size,
+ gl_carray_node_value,
+ gl_carray_node_nx_set_value,
+ gl_carray_next_node,
+ gl_carray_previous_node,
+ gl_carray_get_at,
+ gl_carray_nx_set_at,
+ gl_carray_search_from_to,
+ gl_carray_indexof_from_to,
+ gl_carray_nx_add_first,
+ gl_carray_nx_add_last,
+ gl_carray_nx_add_before,
+ gl_carray_nx_add_after,
+ gl_carray_nx_add_at,
+ gl_carray_remove_node,
+ gl_carray_remove_at,
+ gl_carray_remove,
+ gl_carray_list_free,
+ gl_carray_iterator,
+ gl_carray_iterator_from_to,
+ gl_carray_iterator_next,
+ gl_carray_iterator_free,
+ gl_carray_sortedlist_search,
+ gl_carray_sortedlist_search_from_to,
+ gl_carray_sortedlist_indexof,
+ gl_carray_sortedlist_indexof_from_to,
+ gl_carray_sortedlist_nx_add,
+ gl_carray_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_carray_list.h b/gnulib/lib/gl_carray_list.h
new file mode 100644
index 0000000..bec77fa
--- /dev/null
+++ b/gnulib/lib/gl_carray_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a circular array.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_CARRAY_LIST_H
+#define _GL_CARRAY_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_carray_list_implementation;
+#define GL_CARRAY_LIST &gl_carray_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_CARRAY_LIST_H */
diff --git a/gnulib/lib/gl_linked_list.c b/gnulib/lib/gl_linked_list.c
new file mode 100644
index 0000000..b724249
--- /dev/null
+++ b/gnulib/lib/gl_linked_list.c
@@ -0,0 +1,64 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_linked_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic linked list code. */
+#include "gl_anylinked_list1.h"
+#include "gl_anylinked_list2.h"
+
+
+const struct gl_list_implementation gl_linked_list_implementation =
+ {
+ gl_linked_nx_create_empty,
+ gl_linked_nx_create,
+ gl_linked_size,
+ gl_linked_node_value,
+ gl_linked_node_nx_set_value,
+ gl_linked_next_node,
+ gl_linked_previous_node,
+ gl_linked_get_at,
+ gl_linked_nx_set_at,
+ gl_linked_search_from_to,
+ gl_linked_indexof_from_to,
+ gl_linked_nx_add_first,
+ gl_linked_nx_add_last,
+ gl_linked_nx_add_before,
+ gl_linked_nx_add_after,
+ gl_linked_nx_add_at,
+ gl_linked_remove_node,
+ gl_linked_remove_at,
+ gl_linked_remove,
+ gl_linked_list_free,
+ gl_linked_iterator,
+ gl_linked_iterator_from_to,
+ gl_linked_iterator_next,
+ gl_linked_iterator_free,
+ gl_linked_sortedlist_search,
+ gl_linked_sortedlist_search_from_to,
+ gl_linked_sortedlist_indexof,
+ gl_linked_sortedlist_indexof_from_to,
+ gl_linked_sortedlist_nx_add,
+ gl_linked_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_linked_list.h b/gnulib/lib/gl_linked_list.h
new file mode 100644
index 0000000..cefd90d
--- /dev/null
+++ b/gnulib/lib/gl_linked_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a linked list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_LINKED_LIST_H
+#define _GL_LINKED_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_linked_list_implementation;
+#define GL_LINKED_LIST &gl_linked_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LINKED_LIST_H */
diff --git a/gnulib/lib/gl_linkedhash_list.c b/gnulib/lib/gl_linkedhash_list.c
new file mode 100644
index 0000000..fb6fbec
--- /dev/null
+++ b/gnulib/lib/gl_linkedhash_list.c
@@ -0,0 +1,124 @@
+/* Sequential list data type implemented by a hash table with a linked list.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_linkedhash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code. */
+#include "gl_anyhash_list1.h"
+
+/* Generic linked list code. */
+#include "gl_anylinked_list1.h"
+
+/* Generic hash-table code. */
+#include "gl_anyhash_list2.h"
+
+/* Resize the hash table if needed, after list->count was incremented. */
+static inline void
+hash_resize_after_add (gl_list_t list)
+{
+ size_t count = list->count;
+ size_t estimate = xsum (count, count / 2); /* 1.5 * count */
+ if (estimate > list->table_size)
+ hash_resize (list, estimate);
+}
+
+/* Add a node to the hash table structure. */
+static inline void
+add_to_bucket (gl_list_t list, gl_list_node_t node)
+{
+ size_t bucket = node->h.hashcode % list->table_size;
+
+ node->h.hash_next = list->table[bucket];
+ list->table[bucket] = &node->h;
+}
+/* Tell all compilers that the return value is 0. */
+#define add_to_bucket(list,node) ((add_to_bucket) (list, node), 0)
+
+/* Remove a node from the hash table structure. */
+static inline void
+remove_from_bucket (gl_list_t list, gl_list_node_t node)
+{
+ size_t bucket = node->h.hashcode % list->table_size;
+ gl_hash_entry_t *p;
+
+ for (p = &list->table[bucket]; ; p = &(*p)->hash_next)
+ {
+ if (*p == &node->h)
+ {
+ *p = node->h.hash_next;
+ break;
+ }
+ if (*p == NULL)
+ /* node is not in the right bucket. Did the hash codes
+ change inadvertently? */
+ abort ();
+ }
+}
+
+/* Generic linked list code. */
+#include "gl_anylinked_list2.h"
+
+
+const struct gl_list_implementation gl_linkedhash_list_implementation =
+ {
+ gl_linked_nx_create_empty,
+ gl_linked_nx_create,
+ gl_linked_size,
+ gl_linked_node_value,
+ gl_linked_node_nx_set_value,
+ gl_linked_next_node,
+ gl_linked_previous_node,
+ gl_linked_get_at,
+ gl_linked_nx_set_at,
+ gl_linked_search_from_to,
+ gl_linked_indexof_from_to,
+ gl_linked_nx_add_first,
+ gl_linked_nx_add_last,
+ gl_linked_nx_add_before,
+ gl_linked_nx_add_after,
+ gl_linked_nx_add_at,
+ gl_linked_remove_node,
+ gl_linked_remove_at,
+ gl_linked_remove,
+ gl_linked_list_free,
+ gl_linked_iterator,
+ gl_linked_iterator_from_to,
+ gl_linked_iterator_next,
+ gl_linked_iterator_free,
+ gl_linked_sortedlist_search,
+ gl_linked_sortedlist_search_from_to,
+ gl_linked_sortedlist_indexof,
+ gl_linked_sortedlist_indexof_from_to,
+ gl_linked_sortedlist_nx_add,
+ gl_linked_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_linkedhash_list.h b/gnulib/lib/gl_linkedhash_list.h
new file mode 100644
index 0000000..c9e7c70
--- /dev/null
+++ b/gnulib/lib/gl_linkedhash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a linked list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_LINKEDHASH_LIST_H
+#define _GL_LINKEDHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_linkedhash_list_implementation;
+#define GL_LINKEDHASH_LIST &gl_linkedhash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LINKEDHASH_LIST_H */
diff --git a/gnulib/lib/gl_list.c b/gnulib/lib/gl_list.c
new file mode 100644
index 0000000..919a0cd
--- /dev/null
+++ b/gnulib/lib/gl_list.c
@@ -0,0 +1,283 @@
+/* Abstract sequential list data type.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_list.h"
+
+#if !HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+gl_list_t
+gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ return implementation->nx_create_empty (implementation, equals_fn,
+ hashcode_fn, dispose_fn,
+ allow_duplicates);
+}
+
+gl_list_t
+gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ return implementation->nx_create (implementation, equals_fn, hashcode_fn,
+ dispose_fn, allow_duplicates, count,
+ contents);
+}
+
+size_t
+gl_list_size (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->size (list);
+}
+
+const void *
+gl_list_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_value (list, node);
+}
+
+int
+gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_nx_set_value (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->next_node (list, node);
+}
+
+gl_list_node_t
+gl_list_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->previous_node (list, node);
+}
+
+const void *
+gl_list_get_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->get_at (list, position);
+}
+
+gl_list_node_t
+gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_set_at (list, position, elt);
+}
+
+gl_list_node_t
+gl_list_search (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, 0, size, elt);
+}
+
+gl_list_node_t
+gl_list_search_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, size, elt);
+}
+
+gl_list_node_t
+gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, end_index, elt);
+}
+
+size_t
+gl_list_indexof (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, 0, size, elt);
+}
+
+size_t
+gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, size, elt);
+}
+
+size_t
+gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, end_index, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_first (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_first (list, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_last (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_last (list, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_before (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_after (list, node, elt);
+}
+
+gl_list_node_t
+gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_at (list, position, elt);
+}
+
+bool
+gl_list_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_node (list, node);
+}
+
+bool
+gl_list_remove_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_at (list, position);
+}
+
+bool
+gl_list_remove (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_elt (list, elt);
+}
+
+void
+gl_list_free (gl_list_t list)
+{
+ ((const struct gl_list_impl_base *) list)->vtable->list_free (list);
+}
+
+gl_list_iterator_t
+gl_list_iterator (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator (list);
+}
+
+gl_list_iterator_t
+gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator_from_to (list, start_index, end_index);
+}
+
+bool
+gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ return iterator->vtable->iterator_next (iterator, eltp, nodep);
+}
+
+void
+gl_list_iterator_free (gl_list_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+gl_list_node_t
+gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search (list, compar, elt);
+}
+
+gl_list_node_t
+gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+size_t
+gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof (list, compar, elt);
+}
+
+size_t
+gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+gl_list_node_t
+gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_nx_add (list, compar, elt);
+}
+
+bool
+gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_remove (list, compar, elt);
+}
+
+#endif
diff --git a/gnulib/lib/gl_list.h b/gnulib/lib/gl_list.h
new file mode 100644
index 0000000..be60020
--- /dev/null
+++ b/gnulib/lib/gl_list.h
@@ -0,0 +1,844 @@
+/* Abstract sequential list data type.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_LIST_H
+#define _GL_LIST_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_list is an abstract list data type. It can contain any number of
+ objects ('void *' or 'const void *' pointers) in any given order.
+ Duplicates are allowed, but can optionally be forbidden.
+
+ There are several implementations of this list datatype, optimized for
+ different operations or for memory. You can start using the simplest list
+ implementation, GL_ARRAY_LIST, and switch to a different implementation
+ later, when you realize which operations are performed the most frequently.
+ The API of the different implementations is exactly the same; when
+ switching to a different implementation, you only have to change the
+ gl_list_create call.
+
+ The implementations are:
+ GL_ARRAY_LIST a growable array
+ GL_CARRAY_LIST a growable circular array
+ GL_LINKED_LIST a linked list
+ GL_AVLTREE_LIST a binary tree (AVL tree)
+ GL_RBTREE_LIST a binary tree (red-black tree)
+ GL_LINKEDHASH_LIST a hash table with a linked list
+ GL_AVLTREEHASH_LIST a hash table with a binary tree (AVL tree)
+ GL_RBTREEHASH_LIST a hash table with a binary tree (red-black tree)
+
+ The memory consumption is asymptotically the same: O(1) for every object
+ in the list. When looking more closely at the average memory consumed
+ for an object, GL_ARRAY_LIST is the most compact representation, and
+ GL_LINKEDHASH_LIST and GL_TREEHASH_LIST need more memory.
+
+ The guaranteed average performance of the operations is, for a list of
+ n elements:
+
+ Operation ARRAY LINKED TREE LINKEDHASH TREEHASH
+ CARRAY with|without with|without
+ duplicates duplicates
+
+ gl_list_size O(1) O(1) O(1) O(1) O(1)
+ gl_list_node_value O(1) O(1) O(1) O(1) O(1)
+ gl_list_node_set_value O(1) O(1) O(1) O(1) O((log n)²)/O(1)
+ gl_list_next_node O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_previous_node O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_get_at O(1) O(n) O(log n) O(n) O(log n)
+ gl_list_set_at O(1) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_search O(n) O(n) O(n) O(n)/O(1) O(log n)/O(1)
+ gl_list_search_from O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_search_from_to O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_indexof O(n) O(n) O(n) O(n) O(log n)
+ gl_list_indexof_from O(n) O(n) O(n) O(n) O((log n)²)/O(log n)
+ gl_list_indexof_from_to O(n) O(n) O(n) O(n) O((log n)²)/O(log n)
+ gl_list_add_first O(n)/O(1) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_last O(1) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_before O(n) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_after O(n) O(1) O(log n) O(1) O((log n)²)/O(log n)
+ gl_list_add_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_remove_node O(n) O(1) O(log n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_remove_at O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_list_remove O(n) O(n) O(n) O(n)/O(1) O((log n)²)/O(log n)
+ gl_list_iterator O(1) O(1) O(log n) O(1) O(log n)
+ gl_list_iterator_from_to O(1) O(n) O(log n) O(n) O(log n)
+ gl_list_iterator_next O(1) O(1) O(log n) O(1) O(log n)
+ gl_sortedlist_search O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_search_from O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_indexof O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_indexof_fro O(log n) O(n) O(log n) O(n) O(log n)
+ gl_sortedlist_add O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ gl_sortedlist_remove O(n) O(n) O(log n) O(n) O((log n)²)/O(log n)
+ */
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Type of function used to compare two elements.
+ NULL denotes pointer comparison. */
+typedef bool (*gl_listelement_equals_fn) (const void *elt1, const void *elt2);
+
+/* Type of function used to compute a hash code.
+ NULL denotes a function that depends only on the pointer itself. */
+typedef size_t (*gl_listelement_hashcode_fn) (const void *elt);
+
+/* Type of function used to dispose an element once it's removed from a list.
+ NULL denotes a no-op. */
+typedef void (*gl_listelement_dispose_fn) (const void *elt);
+
+struct gl_list_impl;
+/* Type representing an entire list. */
+typedef struct gl_list_impl * gl_list_t;
+
+struct gl_list_node_impl;
+/* Type representing the position of an element in the list, in a way that
+ is more adapted to the list implementation than a plain index.
+ Note: It is invalidated by insertions and removals! */
+typedef struct gl_list_node_impl * gl_list_node_t;
+
+struct gl_list_implementation;
+/* Type representing a list datatype implementation. */
+typedef const struct gl_list_implementation * gl_list_implementation_t;
+
+/* Create an empty list.
+ IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
+ GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
+ GL_RBTREEHASH_LIST.
+ EQUALS_FN is an element comparison function or NULL.
+ HASHCODE_FN is an element hash code function or NULL.
+ DISPOSE_FN is an element disposal function or NULL.
+ ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
+ the list. The implementation may verify this at runtime. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+
+/* Create a list with given contents.
+ IMPLEMENTATION is one of GL_ARRAY_LIST, GL_CARRAY_LIST, GL_LINKED_LIST,
+ GL_AVLTREE_LIST, GL_RBTREE_LIST, GL_LINKEDHASH_LIST, GL_AVLTREEHASH_LIST,
+ GL_RBTREEHASH_LIST.
+ EQUALS_FN is an element comparison function or NULL.
+ HASHCODE_FN is an element hash code function or NULL.
+ DISPOSE_FN is an element disposal function or NULL.
+ ALLOW_DUPLICATES is false if duplicate elements shall not be allowed in
+ the list. The implementation may verify this at runtime.
+ COUNT is the number of initial elements.
+ CONTENTS[0..COUNT-1] is the initial contents. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+
+/* Return the current number of elements in a list. */
+extern size_t gl_list_size (gl_list_t list);
+
+/* Return the element value represented by a list node. */
+extern const void * gl_list_node_value (gl_list_t list, gl_list_node_t node);
+
+/* Replace the element value represented by a list node. */
+#if 0 /* declared in gl_xlist.h */
+extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return 0 upon success, -1 upon out-of-memory. */
+extern int gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Return the node immediately after the given node in the list, or NULL
+ if the given node is the last (rightmost) one in the list. */
+extern gl_list_node_t gl_list_next_node (gl_list_t list, gl_list_node_t node);
+
+/* Return the node immediately before the given node in the list, or NULL
+ if the given node is the first (leftmost) one in the list. */
+extern gl_list_node_t gl_list_previous_node (gl_list_t list, gl_list_node_t node);
+
+/* Return the element at a given position in the list.
+ POSITION must be >= 0 and < gl_list_size (list). */
+extern const void * gl_list_get_at (gl_list_t list, size_t position);
+
+/* Replace the element at a given position in the list.
+ POSITION must be >= 0 and < gl_list_size (list).
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_set_at (gl_list_t list, size_t position,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Search whether an element is already in the list.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search (gl_list_t list, const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search_from (gl_list_t list, size_t start_index,
+ const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX and < END_INDEX.
+ Return its node if found, or NULL if not present in the list. */
+extern gl_list_node_t gl_list_search_from_to (gl_list_t list,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof (gl_list_t list, const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof_from (gl_list_t list, size_t start_index,
+ const void *elt);
+
+/* Search whether an element is already in the list,
+ at a position >= START_INDEX and < END_INDEX.
+ Return its position if found, or (size_t)(-1) if not present in the list. */
+extern size_t gl_list_indexof_from_to (gl_list_t list,
+ size_t start_index, size_t end_index,
+ const void *elt);
+
+/* Add an element as the first element of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_first (gl_list_t list, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element as the last element of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_last (gl_list_t list, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element before a given element node of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_before (gl_list_t list,
+ gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element after a given element node of the list.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Add an element at a given position in the list.
+ POSITION must be >= 0 and <= gl_list_size (list). */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_list_nx_add_at (gl_list_t list, size_t position,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Remove an element from the list.
+ Return true. */
+extern bool gl_list_remove_node (gl_list_t list, gl_list_node_t node);
+
+/* Remove an element at a given position from the list.
+ POSITION must be >= 0 and < gl_list_size (list).
+ Return true. */
+extern bool gl_list_remove_at (gl_list_t list, size_t position);
+
+/* Search and remove an element from the list.
+ Return true if it was found and removed. */
+extern bool gl_list_remove (gl_list_t list, const void *elt);
+
+/* Free an entire list.
+ (But this call does not free the elements of the list.) */
+extern void gl_list_free (gl_list_t list);
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+/* Functions for iterating through a list. */
+
+/* Type of an iterator that traverses a list.
+ This is a fixed-size struct, so that creation of an iterator doesn't need
+ memory allocation on the heap. */
+typedef struct
+{
+ /* For fast dispatch of gl_list_iterator_next. */
+ const struct gl_list_implementation *vtable;
+ /* For detecting whether the last returned element was removed. */
+ gl_list_t list;
+ size_t count;
+ /* Other, implementation-private fields. */
+ void *p; void *q;
+ size_t i; size_t j;
+} gl_list_iterator_t;
+
+/* Create an iterator traversing a list.
+ The list contents must not be modified while the iterator is in use,
+ except for replacing or removing the last returned element. */
+extern gl_list_iterator_t gl_list_iterator (gl_list_t list);
+
+/* Create an iterator traversing the element with indices i,
+ start_index <= i < end_index, of a list.
+ The list contents must not be modified while the iterator is in use,
+ except for replacing or removing the last returned element. */
+extern gl_list_iterator_t gl_list_iterator_from_to (gl_list_t list,
+ size_t start_index,
+ size_t end_index);
+
+/* If there is a next element, store the next element in *ELTP, store its
+ node in *NODEP if NODEP is non-NULL, advance the iterator and return true.
+ Otherwise, return false. */
+extern bool gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep);
+
+/* Free an iterator. */
+extern void gl_list_iterator_free (gl_list_iterator_t *iterator);
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+/* The following functions are for lists without duplicates where the
+ order is given by a sort criterion. */
+
+/* Type of function used to compare two elements. Same as for qsort().
+ NULL denotes pointer comparison. */
+typedef int (*gl_listelement_compar_fn) (const void *elt1, const void *elt2);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its node if found, or NULL if not present in the list.
+ If the list contains several copies of ELT, the node of the leftmost one is
+ returned. */
+extern gl_list_node_t gl_sortedlist_search (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Only list elements with indices >= START_INDEX and < END_INDEX are
+ considered; the implementation uses these bounds to minimize the number
+ of COMPAR invocations.
+ Return its node if found, or NULL if not present in the list.
+ If the list contains several copies of ELT, the node of the leftmost one is
+ returned. */
+extern gl_list_node_t gl_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its position if found, or (size_t)(-1) if not present in the list.
+ If the list contains several copies of ELT, the position of the leftmost one
+ is returned. */
+extern size_t gl_sortedlist_indexof (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* Search whether an element is already in the list.
+ The list is assumed to be sorted with COMPAR.
+ Only list elements with indices >= START_INDEX and < END_INDEX are
+ considered; the implementation uses these bounds to minimize the number
+ of COMPAR invocations.
+ Return its position if found, or (size_t)(-1) if not present in the list.
+ If the list contains several copies of ELT, the position of the leftmost one
+ is returned. */
+extern size_t gl_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+
+/* Add an element at the appropriate position in the list.
+ The list is assumed to be sorted with COMPAR.
+ Return its node. */
+#if 0 /* declared in gl_xlist.h */
+extern gl_list_node_t gl_sortedlist_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_node_t gl_sortedlist_nx_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Search and remove an element from the list.
+ The list is assumed to be sorted with COMPAR.
+ Return true if it was found and removed.
+ If the list contains several copies of ELT, only the leftmost one is
+ removed. */
+extern bool gl_sortedlist_remove (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+/* ------------------------ Implementation Details ------------------------ */
+
+struct gl_list_implementation
+{
+ /* gl_list_t functions. */
+ gl_list_t (*nx_create_empty) (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+ gl_list_t (*nx_create) (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+ size_t (*size) (gl_list_t list);
+ const void * (*node_value) (gl_list_t list, gl_list_node_t node);
+ int (*node_nx_set_value) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*next_node) (gl_list_t list, gl_list_node_t node);
+ gl_list_node_t (*previous_node) (gl_list_t list, gl_list_node_t node);
+ const void * (*get_at) (gl_list_t list, size_t position);
+ gl_list_node_t (*nx_set_at) (gl_list_t list, size_t position,
+ const void *elt);
+ gl_list_node_t (*search_from_to) (gl_list_t list, size_t start_index,
+ size_t end_index, const void *elt);
+ size_t (*indexof_from_to) (gl_list_t list, size_t start_index,
+ size_t end_index, const void *elt);
+ gl_list_node_t (*nx_add_first) (gl_list_t list, const void *elt);
+ gl_list_node_t (*nx_add_last) (gl_list_t list, const void *elt);
+ gl_list_node_t (*nx_add_before) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*nx_add_after) (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+ gl_list_node_t (*nx_add_at) (gl_list_t list, size_t position,
+ const void *elt);
+ bool (*remove_node) (gl_list_t list, gl_list_node_t node);
+ bool (*remove_at) (gl_list_t list, size_t position);
+ bool (*remove_elt) (gl_list_t list, const void *elt);
+ void (*list_free) (gl_list_t list);
+ /* gl_list_iterator_t functions. */
+ gl_list_iterator_t (*iterator) (gl_list_t list);
+ gl_list_iterator_t (*iterator_from_to) (gl_list_t list,
+ size_t start_index,
+ size_t end_index);
+ bool (*iterator_next) (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep);
+ void (*iterator_free) (gl_list_iterator_t *iterator);
+ /* Sorted gl_list_t functions. */
+ gl_list_node_t (*sortedlist_search) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ gl_list_node_t (*sortedlist_search_from_to) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index,
+ size_t end_index,
+ const void *elt);
+ size_t (*sortedlist_indexof) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ size_t (*sortedlist_indexof_from_to) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t start_index, size_t end_index,
+ const void *elt);
+ gl_list_node_t (*sortedlist_nx_add) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+ bool (*sortedlist_remove) (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+};
+
+struct gl_list_impl_base
+{
+ const struct gl_list_implementation *vtable;
+ gl_listelement_equals_fn equals_fn;
+ gl_listelement_hashcode_fn hashcode_fn;
+ gl_listelement_dispose_fn dispose_fn;
+ bool allow_duplicates;
+};
+
+#if HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+# define gl_list_nx_create_empty gl_list_nx_create_empty_inline
+static inline gl_list_t
+gl_list_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ return implementation->nx_create_empty (implementation, equals_fn,
+ hashcode_fn, dispose_fn,
+ allow_duplicates);
+}
+
+# define gl_list_nx_create gl_list_nx_create_inline
+static inline gl_list_t
+gl_list_nx_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ return implementation->nx_create (implementation, equals_fn, hashcode_fn,
+ dispose_fn, allow_duplicates, count,
+ contents);
+}
+
+# define gl_list_size gl_list_size_inline
+static inline size_t
+gl_list_size (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->size (list);
+}
+
+# define gl_list_node_value gl_list_node_value_inline
+static inline const void *
+gl_list_node_value (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_value (list, node);
+}
+
+# define gl_list_node_nx_set_value gl_list_node_nx_set_value_inline
+static inline int
+gl_list_node_nx_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->node_nx_set_value (list, node, elt);
+}
+
+# define gl_list_next_node gl_list_next_node_inline
+static inline gl_list_node_t
+gl_list_next_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->next_node (list, node);
+}
+
+# define gl_list_previous_node gl_list_previous_node_inline
+static inline gl_list_node_t
+gl_list_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->previous_node (list, node);
+}
+
+# define gl_list_get_at gl_list_get_at_inline
+static inline const void *
+gl_list_get_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->get_at (list, position);
+}
+
+# define gl_list_nx_set_at gl_list_nx_set_at_inline
+static inline gl_list_node_t
+gl_list_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_set_at (list, position, elt);
+}
+
+# define gl_list_search gl_list_search_inline
+static inline gl_list_node_t
+gl_list_search (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, 0, size, elt);
+}
+
+# define gl_list_search_from gl_list_search_from_inline
+static inline gl_list_node_t
+gl_list_search_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, size, elt);
+}
+
+# define gl_list_search_from_to gl_list_search_from_to_inline
+static inline gl_list_node_t
+gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->search_from_to (list, start_index, end_index, elt);
+}
+
+# define gl_list_indexof gl_list_indexof_inline
+static inline size_t
+gl_list_indexof (gl_list_t list, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, 0, size, elt);
+}
+
+# define gl_list_indexof_from gl_list_indexof_from_inline
+static inline size_t
+gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt)
+{
+ size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, size, elt);
+}
+
+# define gl_list_indexof_from_to gl_list_indexof_from_to_inline
+static inline size_t
+gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->indexof_from_to (list, start_index, end_index, elt);
+}
+
+# define gl_list_nx_add_first gl_list_nx_add_first_inline
+static inline gl_list_node_t
+gl_list_nx_add_first (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_first (list, elt);
+}
+
+# define gl_list_nx_add_last gl_list_nx_add_last_inline
+static inline gl_list_node_t
+gl_list_nx_add_last (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_last (list, elt);
+}
+
+# define gl_list_nx_add_before gl_list_nx_add_before_inline
+static inline gl_list_node_t
+gl_list_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_before (list, node, elt);
+}
+
+# define gl_list_nx_add_after gl_list_nx_add_after_inline
+static inline gl_list_node_t
+gl_list_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_after (list, node, elt);
+}
+
+# define gl_list_nx_add_at gl_list_nx_add_at_inline
+static inline gl_list_node_t
+gl_list_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->nx_add_at (list, position, elt);
+}
+
+# define gl_list_remove_node gl_list_remove_node_inline
+static inline bool
+gl_list_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_node (list, node);
+}
+
+# define gl_list_remove_at gl_list_remove_at_inline
+static inline bool
+gl_list_remove_at (gl_list_t list, size_t position)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_at (list, position);
+}
+
+# define gl_list_remove gl_list_remove_inline
+static inline bool
+gl_list_remove (gl_list_t list, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->remove_elt (list, elt);
+}
+
+# define gl_list_free gl_list_free_inline
+static inline void
+gl_list_free (gl_list_t list)
+{
+ ((const struct gl_list_impl_base *) list)->vtable->list_free (list);
+}
+
+# define gl_list_iterator gl_list_iterator_inline
+static inline gl_list_iterator_t
+gl_list_iterator (gl_list_t list)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator (list);
+}
+
+# define gl_list_iterator_from_to gl_list_iterator_from_to_inline
+static inline gl_list_iterator_t
+gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->iterator_from_to (list, start_index, end_index);
+}
+
+# define gl_list_iterator_next gl_list_iterator_next_inline
+static inline bool
+gl_list_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ return iterator->vtable->iterator_next (iterator, eltp, nodep);
+}
+
+# define gl_list_iterator_free gl_list_iterator_free_inline
+static inline void
+gl_list_iterator_free (gl_list_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+# define gl_sortedlist_search gl_sortedlist_search_inline
+static inline gl_list_node_t
+gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search (list, compar, elt);
+}
+
+# define gl_sortedlist_search_from_to gl_sortedlist_search_from_to_inline
+static inline gl_list_node_t
+gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_search_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+# define gl_sortedlist_indexof gl_sortedlist_indexof_inline
+static inline size_t
+gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof (list, compar, elt);
+}
+
+# define gl_sortedlist_indexof_from_to gl_sortedlist_indexof_from_to_inline
+static inline size_t
+gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_indexof_from_to (list, compar, start_index, end_index,
+ elt);
+}
+
+# define gl_sortedlist_nx_add gl_sortedlist_nx_add_inline
+static inline gl_list_node_t
+gl_sortedlist_nx_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_nx_add (list, compar, elt);
+}
+
+# define gl_sortedlist_remove gl_sortedlist_remove_inline
+static inline bool
+gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
+{
+ return ((const struct gl_list_impl_base *) list)->vtable
+ ->sortedlist_remove (list, compar, elt);
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LIST_H */
diff --git a/gnulib/lib/gl_oset.c b/gnulib/lib/gl_oset.c
new file mode 100644
index 0000000..40e5073
--- /dev/null
+++ b/gnulib/lib/gl_oset.c
@@ -0,0 +1,96 @@
+/* Abstract ordered set data type.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_oset.h"
+
+#if !HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_list_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+gl_oset_t
+gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ return implementation->nx_create_empty (implementation, compar_fn,
+ dispose_fn);
+}
+
+size_t
+gl_oset_size (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->size (set);
+}
+
+bool
+gl_oset_search (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->search (set, elt);
+}
+
+bool
+gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->search_atleast (set, threshold_fn, threshold, eltp);
+}
+
+int
+gl_oset_nx_add (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->nx_add (set, elt);
+}
+
+bool
+gl_oset_remove (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->remove_elt (set, elt);
+}
+
+void
+gl_oset_free (gl_oset_t set)
+{
+ ((const struct gl_oset_impl_base *) set)->vtable->oset_free (set);
+}
+
+gl_oset_iterator_t
+gl_oset_iterator (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->iterator (set);
+}
+
+bool
+gl_oset_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ return iterator->vtable->iterator_next (iterator, eltp);
+}
+
+void
+gl_oset_iterator_free (gl_oset_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+#endif
diff --git a/gnulib/lib/gl_oset.h b/gnulib/lib/gl_oset.h
new file mode 100644
index 0000000..99d0aba
--- /dev/null
+++ b/gnulib/lib/gl_oset.h
@@ -0,0 +1,289 @@
+/* Abstract ordered set data type.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_OSET_H
+#define _GL_OSET_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* gl_oset is an abstract ordered set data type. It can contain any number
+ of objects ('void *' or 'const void *' pointers) in the order of a given
+ comparator function. Duplicates (in the sense of the comparator) are
+ forbidden.
+
+ There are several implementations of this ordered set datatype, optimized
+ for different operations or for memory. You can start using the simplest
+ ordered set implementation, GL_ARRAY_OSET, and switch to a different
+ implementation later, when you realize which operations are performed
+ the most frequently. The API of the different implementations is exactly
+ the same; when switching to a different implementation, you only have to
+ change the gl_oset_create call.
+
+ The implementations are:
+ GL_ARRAY_OSET a growable array
+ GL_AVLTREE_OSET a binary tree (AVL tree)
+ GL_RBTREE_OSET a binary tree (red-black tree)
+
+ The memory consumption is asymptotically the same: O(1) for every object
+ in the set. When looking more closely at the average memory consumed
+ for an object, GL_ARRAY_OSET is the most compact representation, and
+ GL_AVLTREE_OSET, GL_RBTREE_OSET need more memory.
+
+ The guaranteed average performance of the operations is, for a set of
+ n elements:
+
+ Operation ARRAY TREE
+
+ gl_oset_size O(1) O(1)
+ gl_oset_add O(n) O(log n)
+ gl_oset_remove O(n) O(log n)
+ gl_oset_search O(log n) O(log n)
+ gl_oset_search_atleast O(log n) O(log n)
+ gl_oset_iterator O(1) O(log n)
+ gl_oset_iterator_next O(1) O(log n)
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Type of function used to compare two elements. Same as for qsort().
+ NULL denotes pointer comparison. */
+typedef int (*gl_setelement_compar_fn) (const void *elt1, const void *elt2);
+
+/* Type of function used to dispose an element once it's removed from a set.
+ NULL denotes a no-op. */
+typedef void (*gl_setelement_dispose_fn) (const void *elt);
+
+/* Type of function used to compare an element with a threshold.
+ Return true if the element is greater or equal than the threshold. */
+typedef bool (*gl_setelement_threshold_fn) (const void *elt, const void *threshold);
+
+struct gl_oset_impl;
+/* Type representing an entire ordered set. */
+typedef struct gl_oset_impl * gl_oset_t;
+
+struct gl_oset_implementation;
+/* Type representing a ordered set datatype implementation. */
+typedef const struct gl_oset_implementation * gl_oset_implementation_t;
+
+/* Create an empty set.
+ IMPLEMENTATION is one of GL_ARRAY_OSET, GL_AVLTREE_OSET, GL_RBTREE_OSET.
+ COMPAR_FN is an element comparison function or NULL.
+ DISPOSE_FN is an element disposal function or NULL. */
+#if 0 /* declared in gl_xoset.h */
+extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_oset_t gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+
+/* Return the current number of elements in an ordered set. */
+extern size_t gl_oset_size (gl_oset_t set);
+
+/* Search whether an element is already in the ordered set.
+ Return true if found, or false if not present in the set. */
+extern bool gl_oset_search (gl_oset_t set, const void *elt);
+
+/* Search the least element in the ordered set that compares greater or equal
+ to the given THRESHOLD. The representation of the THRESHOLD is defined
+ by the THRESHOLD_FN.
+ Return true and store the found element in *ELTP if found, otherwise return
+ false. */
+extern bool gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold,
+ const void **eltp);
+
+/* Add an element to an ordered set.
+ Return true if it was not already in the set and added, false otherwise. */
+#if 0 /* declared in gl_xoset.h */
+extern bool gl_oset_add (gl_oset_t set, const void *elt);
+#endif
+/* Likewise. Return -1 upon out-of-memory. */
+extern int gl_oset_nx_add (gl_oset_t set, const void *elt)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ __attribute__ ((__warn_unused_result__))
+#endif
+ ;
+
+/* Remove an element from an ordered set.
+ Return true if it was found and removed. */
+extern bool gl_oset_remove (gl_oset_t set, const void *elt);
+
+/* Free an entire ordered set.
+ (But this call does not free the elements of the set.) */
+extern void gl_oset_free (gl_oset_t set);
+
+/* --------------------- gl_oset_iterator_t Data Type --------------------- */
+
+/* Functions for iterating through an ordered set. */
+
+/* Type of an iterator that traverses an ordered set.
+ This is a fixed-size struct, so that creation of an iterator doesn't need
+ memory allocation on the heap. */
+typedef struct
+{
+ /* For fast dispatch of gl_oset_iterator_next. */
+ const struct gl_oset_implementation *vtable;
+ /* For detecting whether the last returned element was removed. */
+ gl_oset_t set;
+ size_t count;
+ /* Other, implementation-private fields. */
+ void *p; void *q;
+ size_t i; size_t j;
+} gl_oset_iterator_t;
+
+/* Create an iterator traversing an ordered set.
+ The set's contents must not be modified while the iterator is in use,
+ except for removing the last returned element. */
+extern gl_oset_iterator_t gl_oset_iterator (gl_oset_t set);
+
+/* If there is a next element, store the next element in *ELTP, advance the
+ iterator and return true. Otherwise, return false. */
+extern bool gl_oset_iterator_next (gl_oset_iterator_t *iterator,
+ const void **eltp);
+
+/* Free an iterator. */
+extern void gl_oset_iterator_free (gl_oset_iterator_t *iterator);
+
+/* ------------------------ Implementation Details ------------------------ */
+
+struct gl_oset_implementation
+{
+ /* gl_oset_t functions. */
+ gl_oset_t (*nx_create_empty) (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+ size_t (*size) (gl_oset_t set);
+ bool (*search) (gl_oset_t set, const void *elt);
+ bool (*search_atleast) (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp);
+ int (*nx_add) (gl_oset_t set, const void *elt);
+ bool (*remove_elt) (gl_oset_t set, const void *elt);
+ void (*oset_free) (gl_oset_t set);
+ /* gl_oset_iterator_t functions. */
+ gl_oset_iterator_t (*iterator) (gl_oset_t set);
+ bool (*iterator_next) (gl_oset_iterator_t *iterator, const void **eltp);
+ void (*iterator_free) (gl_oset_iterator_t *iterator);
+};
+
+struct gl_oset_impl_base
+{
+ const struct gl_oset_implementation *vtable;
+ gl_setelement_compar_fn compar_fn;
+ gl_setelement_dispose_fn dispose_fn;
+};
+
+#if HAVE_INLINE
+
+/* Define all functions of this file as inline accesses to the
+ struct gl_oset_implementation.
+ Use #define to avoid a warning because of extern vs. static. */
+
+# define gl_oset_nx_create_empty gl_oset_nx_create_empty_inline
+static inline gl_oset_t
+gl_oset_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ return implementation->nx_create_empty (implementation, compar_fn,
+ dispose_fn);
+}
+
+# define gl_oset_size gl_oset_size_inline
+static inline size_t
+gl_oset_size (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->size (set);
+}
+
+# define gl_oset_search gl_oset_search_inline
+static inline bool
+gl_oset_search (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->search (set, elt);
+}
+
+# define gl_oset_search_atleast gl_oset_search_atleast_inline
+static inline bool
+gl_oset_search_atleast (gl_oset_t set,
+ gl_setelement_threshold_fn threshold_fn,
+ const void *threshold, const void **eltp)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->search_atleast (set, threshold_fn, threshold, eltp);
+}
+
+# define gl_oset_nx_add gl_oset_nx_add_inline
+static inline int
+gl_oset_nx_add (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->nx_add (set, elt);
+}
+
+# define gl_oset_remove gl_oset_remove_inline
+static inline bool
+gl_oset_remove (gl_oset_t set, const void *elt)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable
+ ->remove_elt (set, elt);
+}
+
+# define gl_oset_free gl_oset_free_inline
+static inline void
+gl_oset_free (gl_oset_t set)
+{
+ ((const struct gl_oset_impl_base *) set)->vtable->oset_free (set);
+}
+
+# define gl_oset_iterator gl_oset_iterator_inline
+static inline gl_oset_iterator_t
+gl_oset_iterator (gl_oset_t set)
+{
+ return ((const struct gl_oset_impl_base *) set)->vtable->iterator (set);
+}
+
+# define gl_oset_iterator_next gl_oset_iterator_next_inline
+static inline bool
+gl_oset_iterator_next (gl_oset_iterator_t *iterator, const void **eltp)
+{
+ return iterator->vtable->iterator_next (iterator, eltp);
+}
+
+# define gl_oset_iterator_free gl_oset_iterator_free_inline
+static inline void
+gl_oset_iterator_free (gl_oset_iterator_t *iterator)
+{
+ iterator->vtable->iterator_free (iterator);
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_OSET_H */
diff --git a/gnulib/lib/gl_rbtree_list.c b/gnulib/lib/gl_rbtree_list.c
new file mode 100644
index 0000000..9836b1c
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_list.c
@@ -0,0 +1,102 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtree_list.h"
+
+#include <stdlib.h>
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic red-black tree code. */
+#include "gl_anyrbtree_list1.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list1.h"
+
+/* Generic red-black tree code. */
+#include "gl_anyrbtree_list2.h"
+
+/* Generic binary tree code. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtree_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+const struct gl_list_implementation gl_rbtree_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_rbtree_list.h b/gnulib/lib/gl_rbtree_list.h
new file mode 100644
index 0000000..0f2acce
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_RBTREE_LIST_H
+#define _GL_RBTREE_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_rbtree_list_implementation;
+#define GL_RBTREE_LIST &gl_rbtree_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREE_LIST_H */
diff --git a/gnulib/lib/gl_rbtree_oset.c b/gnulib/lib/gl_rbtree_oset.c
new file mode 100644
index 0000000..fa0fb15
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_oset.c
@@ -0,0 +1,814 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtree_oset.h"
+
+#include <stdlib.h>
+
+/* A red-black tree is a binary tree where every node is colored black or
+ red such that
+ 1. The root is black.
+ 2. No red node has a red parent.
+ Or equivalently: No red node has a red child.
+ 3. All paths from the root down to any NULL endpoint contain the same
+ number of black nodes.
+ Let's call this the "black-height" bh of the tree. It follows that every
+ such path contains exactly bh black and between 0 and bh red nodes. (The
+ extreme cases are a path containing only black nodes, and a path colored
+ alternatingly black-red-black-red-...-black-red.) The height of the tree
+ therefore is >= bh, <= 2*bh.
+ */
+
+/* -------------------------- gl_oset_t Data Type -------------------------- */
+
+/* Color of a node. */
+typedef enum color { BLACK, RED } color_t;
+
+/* Tree node implementation, valid for this file only. */
+struct gl_oset_node_impl
+{
+ struct gl_oset_node_impl *left; /* left branch, or NULL */
+ struct gl_oset_node_impl *right; /* right branch, or NULL */
+ /* Parent pointer, or NULL. The parent pointer is not needed for most
+ operations. It is needed so that a gl_oset_node_t can be returned
+ without memory allocation, on which the functions gl_oset_remove_node,
+ gl_oset_add_before, gl_oset_add_after can be implemented. */
+ struct gl_oset_node_impl *parent;
+ color_t color; /* node's color */
+ const void *value;
+};
+typedef struct gl_oset_node_impl * gl_oset_node_t;
+
+/* Concrete gl_oset_impl type, valid for this file only. */
+struct gl_oset_impl
+{
+ struct gl_oset_impl_base base;
+ struct gl_oset_node_impl *root; /* root node or NULL */
+ size_t count; /* number of nodes */
+};
+
+/* A red-black tree of height h has a black-height bh >= ceil(h/2) and
+ therefore at least 2^ceil(h/2) - 1 elements. So, h <= 116 (because a tree
+ of height h >= 117 would have at least 2^59 - 1 elements, and because even
+ on 64-bit machines,
+ sizeof (gl_oset_node_impl) * (2^59 - 1) > 2^64
+ this would exceed the address space of the machine. */
+#define MAXHEIGHT 116
+
+/* Rotate left a subtree.
+
+ B D
+ / \ / \
+ A D --> B E
+ / \ / \
+ C E A C
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register D as child of its parent. */
+static inline gl_oset_node_t
+rotate_left (gl_oset_node_t b_node, gl_oset_node_t d_node)
+{
+ gl_oset_node_t c_node = d_node->left;
+
+ b_node->right = c_node;
+ d_node->left = b_node;
+
+ d_node->parent = b_node->parent;
+ b_node->parent = d_node;
+ if (c_node != NULL)
+ c_node->parent = b_node;
+
+ return d_node;
+}
+
+/* Rotate right a subtree.
+
+ D B
+ / \ / \
+ B E --> A D
+ / \ / \
+ A C C E
+
+ Change the tree structure, update the branch sizes.
+ The caller must update the colors and register B as child of its parent. */
+static inline gl_oset_node_t
+rotate_right (gl_oset_node_t b_node, gl_oset_node_t d_node)
+{
+ gl_oset_node_t c_node = b_node->right;
+
+ d_node->left = c_node;
+ b_node->right = d_node;
+
+ b_node->parent = d_node->parent;
+ d_node->parent = b_node;
+ if (c_node != NULL)
+ c_node->parent = d_node;
+
+ return b_node;
+}
+
+/* Ensure the tree is balanced, after an insertion operation.
+ Also assigns node->color.
+ parent is the given node's parent, known to be non-NULL. */
+static void
+rebalance_after_add (gl_oset_t set, gl_oset_node_t node, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, parent = node->parent != NULL.
+ Think of node->color being RED (although node->color is not yet
+ assigned.) */
+ gl_oset_node_t grandparent;
+ gl_oset_node_t uncle;
+
+ if (parent->color == BLACK)
+ {
+ /* A RED color for node is acceptable. */
+ node->color = RED;
+ return;
+ }
+
+ grandparent = parent->parent;
+ /* Since parent is RED, we know that
+ grandparent is != NULL and colored BLACK. */
+
+ if (grandparent->left == parent)
+ uncle = grandparent->right;
+ else if (grandparent->right == parent)
+ uncle = grandparent->left;
+ else
+ abort ();
+
+ if (uncle != NULL && uncle->color == RED)
+ {
+ /* Change grandparent from BLACK to RED, and
+ change parent and uncle from RED to BLACK.
+ This makes it acceptable for node to be RED. */
+ node->color = RED;
+ parent->color = uncle->color = BLACK;
+ node = grandparent;
+ }
+ else
+ {
+ /* grandparent and uncle are BLACK. parent is RED. node wants
+ to be RED too.
+ In this case, recoloring is not sufficient. Need to perform
+ one or two rotations. */
+ gl_oset_node_t *grandparentp;
+
+ if (grandparent->parent == NULL)
+ grandparentp = &set->root;
+ else if (grandparent->parent->left == grandparent)
+ grandparentp = &grandparent->parent->left;
+ else if (grandparent->parent->right == grandparent)
+ grandparentp = &grandparent->parent->right;
+ else
+ abort ();
+
+ if (grandparent->left == parent)
+ {
+ if (parent->right == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->left = rotate_left (parent, node);
+ node = parent;
+ parent = grandparent->left;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->left. node = parent->left.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ parent uncle --> node grandparent
+ bh bh bh bh
+ / \ / \
+ node C C uncle
+ bh bh bh bh
+ */
+ *grandparentp = rotate_right (parent, grandparent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ else /* grandparent->right == parent */
+ {
+ if (parent->left == node)
+ {
+ /* Rotation between node and parent. */
+ grandparent->right = rotate_right (node, parent);
+ node = parent;
+ parent = grandparent->right;
+ }
+ /* grandparent and uncle are BLACK. parent and node want to be
+ RED. parent = grandparent->right. node = parent->right.
+
+ grandparent parent
+ bh+1 bh+1
+ / \ / \
+ uncle parent --> grandparent node
+ bh bh bh bh
+ / \ / \
+ C node uncle C
+ bh bh bh bh
+ */
+ *grandparentp = rotate_left (grandparent, parent);
+ parent->color = BLACK;
+ node->color = grandparent->color = RED;
+ }
+ return;
+ }
+
+ /* Start again with a new (node, parent) pair. */
+ parent = node->parent;
+
+ if (parent == NULL)
+ {
+ /* Change node's color from RED to BLACK. This increases the
+ tree's black-height. */
+ node->color = BLACK;
+ return;
+ }
+ }
+}
+
+/* Ensure the tree is balanced, after a deletion operation.
+ CHILD was a grandchild of PARENT and is now its child. Between them,
+ a black node was removed. CHILD is also black, or NULL.
+ (CHILD can also be NULL. But PARENT is non-NULL.) */
+static void
+rebalance_after_remove (gl_oset_t set, gl_oset_node_t child, gl_oset_node_t parent)
+{
+ for (;;)
+ {
+ /* At this point, we reduced the black-height of the CHILD subtree by 1.
+ To make up, either look for a possibility to turn a RED to a BLACK
+ node, or try to reduce the black-height tree of CHILD's sibling
+ subtree as well. */
+ gl_oset_node_t *parentp;
+
+ if (parent->parent == NULL)
+ parentp = &set->root;
+ else if (parent->parent->left == parent)
+ parentp = &parent->parent->left;
+ else if (parent->parent->right == parent)
+ parentp = &parent->parent->right;
+ else
+ abort ();
+
+ if (parent->left == child)
+ {
+ gl_oset_node_t sibling = parent->right;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh+1 bh+1 bh bh+1
+ */
+ *parentp = rotate_left (parent, sibling);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->left;
+ sibling = parent->right;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ child sibling
+ bh bh+1
+ */
+ if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> parent SR
+ bh bh+1 bh+1 bh+1
+ / \ / \
+ SL SR child SL
+ bh bh bh bh
+ */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ child sibling --> child SL
+ bh bh+1 bh bh+1
+ / \ / \
+ SL SR SLL sibling
+ bh bh bh bh
+ / \ / \
+ SLL SLR SLR SR
+ bh bh bh bh
+
+ where SLL, SLR, SR are all black.
+ */
+ parent->right = rotate_right (sibling->left, sibling);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->right;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_left (parent, sibling);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->right->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ child sibling --> child sibling
+ bh bh+1 bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else if (parent->right == child)
+ {
+ gl_oset_node_t sibling = parent->left;
+ /* sibling's black-height is >= 1. In particular,
+ sibling != NULL.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+
+ if (sibling->color == RED)
+ {
+ /* sibling is RED, hence parent is BLACK and sibling's children
+ are non-NULL and BLACK.
+
+ parent sibling
+ bh+2 bh+2
+ / \ / \
+ sibling child --> SR parent
+ bh+1 ch bh+1 bh+1
+ / \ / \
+ SL SR SL child
+ bh+1 bh+1 bh+1 bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ parent->color = RED;
+ sibling->color = BLACK;
+
+ /* Concentrate on the subtree of parent. The new sibling is
+ one of the old sibling's children, and known to be BLACK. */
+ parentp = &sibling->right;
+ sibling = parent->left;
+ }
+ /* Now we know that sibling is BLACK.
+
+ parent
+ / \
+ sibling child
+ bh+1 bh
+ */
+ if (sibling->left != NULL && sibling->left->color == RED)
+ {
+ /*
+ parent sibling
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SL parent
+ bh+1 bh bh+1 bh+1
+ / \ / \
+ SL SR SR child
+ bh bh bh bh
+ */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else if (sibling->right != NULL && sibling->right->color == RED)
+ {
+ /*
+ parent parent
+ bh+1|bh+2 bh+1|bh+2
+ / \ / \
+ sibling child --> SR child
+ bh+1 bh bh+1 bh
+ / \ / \
+ SL SR sibling SRR
+ bh bh bh bh
+ / \ / \
+ SRL SRR SL SRL
+ bh bh bh bh
+
+ where SL, SRL, SRR are all black.
+ */
+ parent->left = rotate_left (sibling, sibling->right);
+ /* Change sibling from BLACK to RED and SL from RED to BLACK. */
+ sibling->color = RED;
+ sibling = parent->left;
+ sibling->color = BLACK;
+
+ /* Now do as in the previous case. */
+ *parentp = rotate_right (sibling, parent);
+ sibling->color = parent->color;
+ parent->color = BLACK;
+ sibling->left->color = BLACK;
+ return;
+ }
+ else
+ {
+ if (parent->color == BLACK)
+ {
+ /* Change sibling from BLACK to RED. Then the entire
+ subtree at parent has decreased its black-height.
+ parent parent
+ bh+2 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ sibling->color = RED;
+
+ child = parent;
+ }
+ else
+ {
+ /* Change parent from RED to BLACK, but compensate by
+ changing sibling from BLACK to RED.
+ parent parent
+ bh+1 bh+1
+ / \ / \
+ sibling child --> sibling child
+ bh+1 bh bh bh
+ */
+ parent->color = BLACK;
+ sibling->color = RED;
+ return;
+ }
+ }
+ }
+ else
+ abort ();
+
+ /* Start again with a new (child, parent) pair. */
+ parent = child->parent;
+
+#if 0 /* Already handled. */
+ if (child != NULL && child->color == RED)
+ {
+ child->color = BLACK;
+ return;
+ }
+#endif
+
+ if (parent == NULL)
+ return;
+ }
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_first (gl_oset_t set, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (set->root == NULL)
+ {
+ new_node->color = BLACK;
+ set->root = new_node;
+ new_node->parent = NULL;
+ }
+ else
+ {
+ gl_oset_node_t node;
+
+ for (node = set->root; node->left != NULL; )
+ node = node->left;
+
+ node->left = new_node;
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+ }
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_before (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->left == NULL)
+ node->left = new_node;
+ else
+ {
+ for (node = node->left; node->right != NULL; )
+ node = node->right;
+ node->right = new_node;
+ }
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+
+ set->count++;
+ return new_node;
+}
+
+static gl_oset_node_t
+gl_tree_nx_add_after (gl_oset_t set, gl_oset_node_t node, const void *elt)
+{
+ /* Create new node. */
+ gl_oset_node_t new_node =
+ (struct gl_oset_node_impl *) malloc (sizeof (struct gl_oset_node_impl));
+
+ if (new_node == NULL)
+ return NULL;
+
+ new_node->left = NULL;
+ new_node->right = NULL;
+ new_node->value = elt;
+
+ /* Add it to the tree. */
+ if (node->right == NULL)
+ node->right = new_node;
+ else
+ {
+ for (node = node->right; node->left != NULL; )
+ node = node->left;
+ node->left = new_node;
+ }
+ new_node->parent = node;
+
+ /* Color and rebalance. */
+ rebalance_after_add (set, new_node, node);
+
+ set->count++;
+ return new_node;
+}
+
+static bool
+gl_tree_remove_node (gl_oset_t set, gl_oset_node_t node)
+{
+ gl_oset_node_t parent = node->parent;
+
+ if (node->left == NULL)
+ {
+ /* Replace node with node->right. */
+ gl_oset_node_t child = node->right;
+
+ if (child != NULL)
+ {
+ child->parent = parent;
+ /* Since node->left == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ }
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+
+ if (child == NULL && node->color == BLACK)
+ rebalance_after_remove (set, child, parent);
+ }
+ }
+ else if (node->right == NULL)
+ {
+ /* It is not absolutely necessary to treat this case. But the more
+ general case below is more complicated, hence slower. */
+ /* Replace node with node->left. */
+ gl_oset_node_t child = node->left;
+
+ child->parent = parent;
+ /* Since node->right == NULL, child must be RED and of height 1,
+ hence node must have been BLACK. Recolor the child. */
+ child->color = BLACK;
+ if (parent == NULL)
+ set->root = child;
+ else
+ {
+ if (parent->left == node)
+ parent->left = child;
+ else /* parent->right == node */
+ parent->right = child;
+ }
+ }
+ else
+ {
+ /* Replace node with the rightmost element of the node->left subtree. */
+ gl_oset_node_t subst;
+ gl_oset_node_t subst_parent;
+ gl_oset_node_t child;
+ color_t removed_color;
+
+ for (subst = node->left; subst->right != NULL; )
+ subst = subst->right;
+
+ subst_parent = subst->parent;
+
+ child = subst->left;
+
+ removed_color = subst->color;
+
+ /* The case subst_parent == node is special: If we do nothing special,
+ we get confusion about node->left, subst->left and child->parent.
+ subst_parent == node
+ <==> The 'for' loop above terminated immediately.
+ <==> subst == subst_parent->left
+ [otherwise subst == subst_parent->right]
+ In this case, we would need to first set
+ child->parent = node; node->left = child;
+ and later - when we copy subst into node's position - again
+ child->parent = subst; subst->left = child;
+ Altogether a no-op. */
+ if (subst_parent != node)
+ {
+ if (child != NULL)
+ child->parent = subst_parent;
+ subst_parent->right = child;
+ }
+
+ /* Copy subst into node's position.
+ (This is safer than to copy subst's value into node, keep node in
+ place, and free subst.) */
+ if (subst_parent != node)
+ {
+ subst->left = node->left;
+ subst->left->parent = subst;
+ }
+ subst->right = node->right;
+ subst->right->parent = subst;
+ subst->color = node->color;
+ subst->parent = parent;
+ if (parent == NULL)
+ set->root = subst;
+ else if (parent->left == node)
+ parent->left = subst;
+ else /* parent->right == node */
+ parent->right = subst;
+
+ if (removed_color == BLACK)
+ {
+ if (child != NULL && child->color == RED)
+ /* Recolor the child. */
+ child->color = BLACK;
+ else
+ /* Rebalancing starts at child's parent, that is subst_parent -
+ except when subst_parent == node. In this case, we need to use
+ its replacement, subst. */
+ rebalance_after_remove (set, child,
+ subst_parent != node ? subst_parent : subst);
+ }
+ }
+
+ set->count--;
+ if (set->base.dispose_fn != NULL)
+ set->base.dispose_fn (node->value);
+ free (node);
+ return true;
+}
+
+/* Generic binary tree code. */
+#include "gl_anytree_oset.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_oset_node_t node, gl_oset_node_t parent, size_t *counterp)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node, counterp) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node, counterp) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ (*counterp)++;
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtree_oset_check_invariants (gl_oset_t set)
+{
+ size_t counter = 0;
+ if (set->root != NULL)
+ check_invariants (set->root, NULL, &counter);
+ if (!(set->count == counter))
+ abort ();
+}
+
+const struct gl_oset_implementation gl_rbtree_oset_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_size,
+ gl_tree_search,
+ gl_tree_search_atleast,
+ gl_tree_nx_add,
+ gl_tree_remove,
+ gl_tree_oset_free,
+ gl_tree_iterator,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free
+ };
diff --git a/gnulib/lib/gl_rbtree_oset.h b/gnulib/lib/gl_rbtree_oset.h
new file mode 100644
index 0000000..91b8269
--- /dev/null
+++ b/gnulib/lib/gl_rbtree_oset.h
@@ -0,0 +1,34 @@
+/* Ordered set data type implemented by a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_RBTREE_OSET_H
+#define _GL_RBTREE_OSET_H
+
+#include "gl_oset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_oset_implementation gl_rbtree_oset_implementation;
+#define GL_RBTREE_OSET &gl_rbtree_oset_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREE_OSET_H */
diff --git a/gnulib/lib/gl_rbtreehash_list.c b/gnulib/lib/gl_rbtreehash_list.c
new file mode 100644
index 0000000..462f91c
--- /dev/null
+++ b/gnulib/lib/gl_rbtreehash_list.c
@@ -0,0 +1,128 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_rbtreehash_list.h"
+
+#include <stdint.h> /* for SIZE_MAX */
+#include <stdlib.h>
+
+#include "gl_rbtree_oset.h"
+#include "xsize.h"
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+#define WITH_HASHTABLE 1
+
+/* Which kind of binary trees to use for ordered sets. Quite arbitrary. */
+#define OSET_TREE_FLAVOR GL_RBTREE_OSET
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Generic hash-table code: Type definitions. */
+#include "gl_anyhash_list1.h"
+
+/* Generic red-black tree code: Type definitions. */
+#include "gl_anyrbtree_list1.h"
+
+/* Generic hash-table code: Low-level code. */
+#include "gl_anyhash_list2.h"
+
+/* Generic binary tree code: Type definitions. */
+#include "gl_anytree_list1.h"
+
+/* Hash-table with binary tree code: Handling of hash buckets. */
+#include "gl_anytreehash_list1.h"
+
+/* Generic red-black tree code: Insertion/deletion algorithms. */
+#include "gl_anyrbtree_list2.h"
+
+/* Generic binary tree code: Functions taking advantage of the hash table. */
+#include "gl_anytreehash_list2.h"
+
+/* Generic binary tree code: All other functions. */
+#include "gl_anytree_list2.h"
+
+/* For debugging. */
+static unsigned int
+check_invariants (gl_list_node_t node, gl_list_node_t parent)
+{
+ unsigned int left_blackheight =
+ (node->left != NULL ? check_invariants (node->left, node) : 0);
+ unsigned int right_blackheight =
+ (node->right != NULL ? check_invariants (node->right, node) : 0);
+
+ if (!(node->parent == parent))
+ abort ();
+ if (!(node->branch_size
+ == (node->left != NULL ? node->left->branch_size : 0)
+ + 1 + (node->right != NULL ? node->right->branch_size : 0)))
+ abort ();
+ if (!(node->color == BLACK || node->color == RED))
+ abort ();
+ if (parent == NULL && !(node->color == BLACK))
+ abort ();
+ if (!(left_blackheight == right_blackheight))
+ abort ();
+
+ return left_blackheight + (node->color == BLACK ? 1 : 0);
+}
+void
+gl_rbtreehash_list_check_invariants (gl_list_t list)
+{
+ if (list->root != NULL)
+ check_invariants (list->root, NULL);
+}
+
+
+const struct gl_list_implementation gl_rbtreehash_list_implementation =
+ {
+ gl_tree_nx_create_empty,
+ gl_tree_nx_create,
+ gl_tree_size,
+ gl_tree_node_value,
+ gl_tree_node_nx_set_value,
+ gl_tree_next_node,
+ gl_tree_previous_node,
+ gl_tree_get_at,
+ gl_tree_nx_set_at,
+ gl_tree_search_from_to,
+ gl_tree_indexof_from_to,
+ gl_tree_nx_add_first,
+ gl_tree_nx_add_last,
+ gl_tree_nx_add_before,
+ gl_tree_nx_add_after,
+ gl_tree_nx_add_at,
+ gl_tree_remove_node,
+ gl_tree_remove_at,
+ gl_tree_remove,
+ gl_tree_list_free,
+ gl_tree_iterator,
+ gl_tree_iterator_from_to,
+ gl_tree_iterator_next,
+ gl_tree_iterator_free,
+ gl_tree_sortedlist_search,
+ gl_tree_sortedlist_search_from_to,
+ gl_tree_sortedlist_indexof,
+ gl_tree_sortedlist_indexof_from_to,
+ gl_tree_sortedlist_nx_add,
+ gl_tree_sortedlist_remove
+ };
diff --git a/gnulib/lib/gl_rbtreehash_list.h b/gnulib/lib/gl_rbtreehash_list.h
new file mode 100644
index 0000000..7acc746
--- /dev/null
+++ b/gnulib/lib/gl_rbtreehash_list.h
@@ -0,0 +1,34 @@
+/* Sequential list data type implemented by a hash table with a binary tree.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_RBTREEHASH_LIST_H
+#define _GL_RBTREEHASH_LIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const struct gl_list_implementation gl_rbtreehash_list_implementation;
+#define GL_RBTREEHASH_LIST &gl_rbtreehash_list_implementation
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_RBTREEHASH_LIST_H */
diff --git a/gnulib/lib/gl_sublist.c b/gnulib/lib/gl_sublist.c
new file mode 100644
index 0000000..d8f701e
--- /dev/null
+++ b/gnulib/lib/gl_sublist.c
@@ -0,0 +1,479 @@
+/* Sequential list data type backed by another list.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_sublist.h"
+
+#include <stdlib.h>
+
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+/* -------------------------- gl_list_t Data Type -------------------------- */
+
+/* Concrete gl_list_impl type, valid for this file only. */
+struct gl_list_impl
+{
+ struct gl_list_impl_base base;
+ /* Reference to the whole list. */
+ gl_list_t whole;
+ /* Limits of the index range. */
+ size_t start;
+ size_t end;
+};
+
+/* struct gl_list_node_impl doesn't exist here. The pointers are actually
+ indices + 1. (We don't use the whole list's gl_list_node_t implementation,
+ because gl_sublist_next_node and gl_sublist_previous_node would not be easy
+ to implement with this choice.) */
+#define INDEX_TO_NODE(index) (gl_list_node_t)(uintptr_t)(size_t)((index) + 1)
+#define NODE_TO_INDEX(node) ((uintptr_t)(node) - 1)
+
+static gl_list_t
+gl_sublist_nx_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static gl_list_t
+gl_sublist_nx_create_fill (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static size_t
+gl_sublist_size (gl_list_t list)
+{
+ return list->end - list->start;
+}
+
+static const void *
+gl_sublist_node_value (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_get_at (list->whole, list->start + index);
+}
+
+static int
+gl_sublist_node_nx_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_set_at (list->whole, list->start + index, elt) == NULL)
+ return -1;
+ return 0;
+}
+
+static gl_list_node_t
+gl_sublist_next_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ size_t count = list->end - list->start;
+ if (!(index < count))
+ /* Invalid argument. */
+ abort ();
+ index++;
+ if (index < count)
+ return INDEX_TO_NODE (index);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_sublist_previous_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (index > 0)
+ return INDEX_TO_NODE (index - 1);
+ else
+ return NULL;
+}
+
+static const void *
+gl_sublist_get_at (gl_list_t list, size_t position)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_get_at (list->whole, list->start + position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_set_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_search_from_to (gl_list_t list, size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t index =
+ gl_list_indexof_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index,
+ elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+ }
+}
+
+static size_t
+gl_sublist_indexof_from_to (gl_list_t list,
+ size_t start_index, size_t end_index,
+ const void *elt)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ {
+ size_t index =
+ gl_list_indexof_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+ }
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_first (gl_list_t list, const void *elt)
+{
+ if (gl_list_nx_add_at (list->whole, list->start, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (0);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_last (gl_list_t list, const void *elt)
+{
+ if (gl_list_nx_add_at (list->whole, list->end, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (list->end - list->start - 1);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t position = NODE_TO_INDEX (node);
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ size_t position = NODE_TO_INDEX (node);
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ position++;
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static gl_list_node_t
+gl_sublist_nx_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ if (!(position <= list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ if (gl_list_nx_add_at (list->whole, list->start + position, elt) == NULL)
+ return NULL;
+ list->end++;
+ return INDEX_TO_NODE (position);
+}
+
+static bool
+gl_sublist_remove_node (gl_list_t list, gl_list_node_t node)
+{
+ uintptr_t index = NODE_TO_INDEX (node);
+ if (!(index < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_remove_at (list->whole, list->start + index);
+}
+
+static bool
+gl_sublist_remove_at (gl_list_t list, size_t position)
+{
+ if (!(position < list->end - list->start))
+ /* Invalid argument. */
+ abort ();
+ return gl_list_remove_at (list->whole, list->start + position);
+}
+
+static bool
+gl_sublist_remove (gl_list_t list, const void *elt)
+{
+ size_t position =
+ gl_list_indexof_from_to (list->whole, list->start, list->end, elt);
+ if (position == (size_t)(-1))
+ return false;
+ else
+ return gl_list_remove_at (list->whole, position);
+}
+
+static void
+gl_sublist_list_free (gl_list_t list)
+{
+ free (list);
+}
+
+/* --------------------- gl_list_iterator_t Data Type --------------------- */
+
+static gl_list_iterator_t
+gl_sublist_iterator (gl_list_t list)
+{
+ return gl_list_iterator_from_to (list->whole, list->start, list->end);
+}
+
+static gl_list_iterator_t
+gl_sublist_iterator_from_to (gl_list_t list,
+ size_t start_index, size_t end_index)
+{
+ if (!(start_index <= end_index && end_index <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+ return gl_list_iterator_from_to (list->whole,
+ list->start + start_index,
+ list->start + end_index);
+}
+
+static bool
+gl_sublist_iterator_next (gl_list_iterator_t *iterator,
+ const void **eltp, gl_list_node_t *nodep)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+static void
+gl_sublist_iterator_free (gl_list_iterator_t *iterator)
+{
+ /* Shouldn't be called. */
+ abort ();
+}
+
+/* ---------------------- Sorted gl_list_t Data Type ---------------------- */
+
+static gl_list_node_t
+gl_sublist_sortedlist_search (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start, list->end, elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+}
+
+static gl_list_node_t
+gl_sublist_sortedlist_search_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index;
+
+ if (!(low <= high && high <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+
+ index =
+ gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start + low, list->start + high, elt);
+ if (index != (size_t)(-1))
+ return INDEX_TO_NODE (index - list->start);
+ else
+ return NULL;
+}
+
+static size_t
+gl_sublist_sortedlist_indexof (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index =
+ gl_sortedlist_indexof_from_to (list->whole, compar, list->start, list->end,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+}
+
+static size_t
+gl_sublist_sortedlist_indexof_from_to (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ size_t low, size_t high,
+ const void *elt)
+{
+ size_t index;
+
+ if (!(low <= high && high <= list->end - list->start))
+ /* Invalid arguments. */
+ abort ();
+
+ index = gl_sortedlist_indexof_from_to (list->whole, compar,
+ list->start + low, list->start + high,
+ elt);
+ if (index != (size_t)(-1))
+ index -= list->start;
+ return index;
+}
+
+static gl_list_node_t
+gl_sublist_sortedlist_nx_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ /* It's impossible to implement this method without risking to put the
+ whole list into unsorted order (namely, when the given ELT is smaller
+ or larger than all elements of the sublist). */
+ abort ();
+}
+
+static bool
+gl_sublist_sortedlist_remove (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ size_t index = gl_sublist_sortedlist_indexof (list, compar, elt);
+ if (index == (size_t)(-1))
+ return false;
+ else
+ return gl_sublist_remove_at (list, index);
+}
+
+
+static const struct gl_list_implementation gl_sublist_list_implementation =
+ {
+ gl_sublist_nx_create_empty,
+ gl_sublist_nx_create_fill,
+ gl_sublist_size,
+ gl_sublist_node_value,
+ gl_sublist_node_nx_set_value,
+ gl_sublist_next_node,
+ gl_sublist_previous_node,
+ gl_sublist_get_at,
+ gl_sublist_nx_set_at,
+ gl_sublist_search_from_to,
+ gl_sublist_indexof_from_to,
+ gl_sublist_nx_add_first,
+ gl_sublist_nx_add_last,
+ gl_sublist_nx_add_before,
+ gl_sublist_nx_add_after,
+ gl_sublist_nx_add_at,
+ gl_sublist_remove_node,
+ gl_sublist_remove_at,
+ gl_sublist_remove,
+ gl_sublist_list_free,
+ gl_sublist_iterator,
+ gl_sublist_iterator_from_to,
+ gl_sublist_iterator_next,
+ gl_sublist_iterator_free,
+ gl_sublist_sortedlist_search,
+ gl_sublist_sortedlist_search_from_to,
+ gl_sublist_sortedlist_indexof,
+ gl_sublist_sortedlist_indexof_from_to,
+ gl_sublist_sortedlist_nx_add,
+ gl_sublist_sortedlist_remove
+ };
+
+gl_list_t
+gl_sublist_nx_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ if (!(start_index <= end_index && end_index <= gl_list_size (whole_list)))
+ /* Invalid arguments. */
+ abort ();
+ {
+ struct gl_list_impl *list =
+ (struct gl_list_impl *) malloc (sizeof (struct gl_list_impl));
+
+ if (list == NULL)
+ return NULL;
+
+ list->base.vtable = &gl_sublist_list_implementation;
+ list->base.equals_fn = whole_list->base.equals_fn; /* actually unused */
+ list->base.hashcode_fn = whole_list->base.hashcode_fn; /* actually unused */
+ list->base.dispose_fn = whole_list->base.dispose_fn; /* actually unused */
+ list->base.allow_duplicates = whole_list->base.allow_duplicates; /* unused */
+ if (whole_list->base.vtable == &gl_sublist_list_implementation)
+ {
+ /* Optimization of a sublist of a sublist: Collapse the two
+ indirections into a single indirection. */
+ list->whole = whole_list->whole;
+ list->start = whole_list->start + start_index;
+ list->end = whole_list->start + end_index;
+ }
+ else
+ {
+ list->whole = whole_list;
+ list->start = start_index;
+ list->end = end_index;
+ }
+
+ return list;
+ }
+}
diff --git a/gnulib/lib/gl_sublist.h b/gnulib/lib/gl_sublist.h
new file mode 100644
index 0000000..1f06905
--- /dev/null
+++ b/gnulib/lib/gl_sublist.h
@@ -0,0 +1,49 @@
+/* Sequential list data type backed by another list.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_SUBLIST_H
+#define _GL_SUBLIST_H
+
+#include "gl_list.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Create a sublist of a given list.
+ This is the list of elements with indices i, start_index <= i < end_index.
+ The sublist is backed by the given list, which means:
+ - Modifications to the sublist affect the whole list.
+ - Modifications to the whole list are immediately visible in the sublist.
+ - The sublist is only valid as long as the whole list is valid.
+ - The sublist must not be passed to the gl_list_sortedlist_add() function.
+ */
+#if 0 /* declared in gl_xsublist.h */
+extern gl_list_t gl_sublist_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+#endif
+/* Likewise. Return NULL upon out-of-memory. */
+extern gl_list_t gl_sublist_nx_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_SUBLIST_H */
diff --git a/gnulib/lib/gl_xlist.c b/gnulib/lib/gl_xlist.c
new file mode 100644
index 0000000..f177caa
--- /dev/null
+++ b/gnulib/lib/gl_xlist.c
@@ -0,0 +1,128 @@
+/* Abstract sequential list data type, with out-of-memory checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xlist.h"
+
+#if !HAVE_INLINE
+
+gl_list_t
+gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ gl_list_t result =
+ gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_t
+gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ gl_list_t result =
+ gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates, count, contents);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+void
+gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ int result = gl_list_node_nx_set_value (list, node, elt);
+ if (result < 0)
+ xalloc_die ();
+}
+
+gl_list_node_t
+gl_list_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_set_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_first (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_last (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_before (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_after (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_list_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+gl_list_node_t
+gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xlist.h b/gnulib/lib/gl_xlist.h
new file mode 100644
index 0000000..9bc446d
--- /dev/null
+++ b/gnulib/lib/gl_xlist.h
@@ -0,0 +1,179 @@
+/* Abstract sequential list data type, with out-of-memory checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_XLIST_H
+#define _GL_XLIST_H
+
+#include "gl_list.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_list.h. Upon out-of-memory, they invoke xalloc_die (),
+ instead of returning an error indicator. */
+extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates);
+extern gl_list_t gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents);
+extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position,
+ const void *elt);
+extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt);
+extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt);
+extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node,
+ const void *elt);
+extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position,
+ const void *elt);
+extern gl_list_node_t gl_sortedlist_add (gl_list_t list,
+ gl_listelement_compar_fn compar,
+ const void *elt);
+
+#if HAVE_INLINE
+
+# define gl_list_create_empty gl_list_create_empty_inline
+static inline gl_list_t
+gl_list_create_empty (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates)
+{
+ gl_list_t result =
+ gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_create gl_list_create_inline
+static inline gl_list_t
+gl_list_create (gl_list_implementation_t implementation,
+ gl_listelement_equals_fn equals_fn,
+ gl_listelement_hashcode_fn hashcode_fn,
+ gl_listelement_dispose_fn dispose_fn,
+ bool allow_duplicates,
+ size_t count, const void **contents)
+{
+ gl_list_t result =
+ gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn,
+ allow_duplicates, count, contents);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_node_set_value gl_list_node_set_value_inline
+static inline void
+gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ int result = gl_list_node_nx_set_value (list, node, elt);
+ if (result < 0)
+ xalloc_die ();
+}
+
+# define gl_list_set_at gl_list_set_at_inline
+static inline gl_list_node_t
+gl_list_set_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_set_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_first gl_list_add_first_inline
+static inline gl_list_node_t
+gl_list_add_first (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_first (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_last gl_list_add_last_inline
+static inline gl_list_node_t
+gl_list_add_last (gl_list_t list, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_last (list, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_before gl_list_add_before_inline
+static inline gl_list_node_t
+gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_before (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_after gl_list_add_after_inline
+static inline gl_list_node_t
+gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_after (list, node, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_list_add_at gl_list_add_at_inline
+static inline gl_list_node_t
+gl_list_add_at (gl_list_t list, size_t position, const void *elt)
+{
+ gl_list_node_t result = gl_list_nx_add_at (list, position, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_sortedlist_add gl_sortedlist_add_inline
+static inline gl_list_node_t
+gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar,
+ const void *elt)
+{
+ gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XLIST_H */
diff --git a/gnulib/lib/gl_xoset.c b/gnulib/lib/gl_xoset.c
new file mode 100644
index 0000000..a85b904
--- /dev/null
+++ b/gnulib/lib/gl_xoset.c
@@ -0,0 +1,46 @@
+/* Abstract ordered set data type, with out-of-memory checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xoset.h"
+
+#if !HAVE_INLINE
+
+gl_oset_t
+gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ gl_oset_t result =
+ gl_oset_nx_create_empty (implementation, compar_fn, dispose_fn);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+bool
+gl_oset_add (gl_oset_t set, const void *elt)
+{
+ int result = gl_oset_nx_add (set, elt);
+ if (result < 0)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xoset.h b/gnulib/lib/gl_xoset.h
new file mode 100644
index 0000000..1fe2dcc
--- /dev/null
+++ b/gnulib/lib/gl_xoset.h
@@ -0,0 +1,67 @@
+/* Abstract ordered set data type, with out-of-memory checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_XOSET_H
+#define _GL_XOSET_H
+
+#include "gl_oset.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_oset.h. Upon out-of-memory, they invoke xalloc_die (),
+ instead of returning an error indicator. */
+extern gl_oset_t gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn);
+extern bool gl_oset_add (gl_oset_t set, const void *elt);
+
+#if HAVE_INLINE
+
+# define gl_oset_create_empty gl_oset_create_empty_inline
+static inline gl_oset_t
+gl_oset_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
+{
+ gl_oset_t result =
+ gl_oset_nx_create_empty (implementation, compar_fn, dispose_fn);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+# define gl_oset_add gl_oset_add_inline
+static inline bool
+gl_oset_add (gl_oset_t set, const void *elt)
+{
+ int result = gl_oset_nx_add (set, elt);
+ if (result < 0)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XOSET_H */
diff --git a/gnulib/lib/gl_xsublist.c b/gnulib/lib/gl_xsublist.c
new file mode 100644
index 0000000..66959e5
--- /dev/null
+++ b/gnulib/lib/gl_xsublist.c
@@ -0,0 +1,35 @@
+/* Sequential list data type backed by another list, with out-of-memory
+ checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "gl_xsublist.h"
+
+#if !HAVE_INLINE
+
+gl_list_t
+gl_sublist_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ gl_list_t result = gl_sublist_nx_create (whole_list, start_index, end_index);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
diff --git a/gnulib/lib/gl_xsublist.h b/gnulib/lib/gl_xsublist.h
new file mode 100644
index 0000000..7aa3b9e
--- /dev/null
+++ b/gnulib/lib/gl_xsublist.h
@@ -0,0 +1,53 @@
+/* Sequential list data type backed by another list, with out-of-memory
+ checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_XSUBLIST_H
+#define _GL_XSUBLIST_H
+
+#include "gl_sublist.h"
+#include "xalloc.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions are thin wrappers around the corresponding functions with
+ _nx_ infix from gl_sublist.h. Upon out-of-memory, they invoke
+ xalloc_die (), instead of returning an error indicator. */
+extern gl_list_t gl_sublist_create (gl_list_t whole_list,
+ size_t start_index, size_t end_index);
+
+#if HAVE_INLINE
+
+# define gl_sublist_create gl_sublist_create_inline
+static inline gl_list_t
+gl_sublist_create (gl_list_t whole_list, size_t start_index, size_t end_index)
+{
+ gl_list_t result = gl_sublist_nx_create (whole_list, start_index, end_index);
+ if (result == NULL)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_XSUBLIST_H */
diff --git a/gnulib/lib/glob-libc.h b/gnulib/lib/glob-libc.h
new file mode 100644
index 0000000..ab4bd50
--- /dev/null
+++ b/gnulib/lib/glob-libc.h
@@ -0,0 +1,212 @@
+/* Copyright (C) 1991-1992, 1995-1998, 2000-2001, 2004-2007, 2009-2011 Free
+ Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GLOB_H
+#define _GLOB_H 1
+
+#ifndef __GLOB_GNULIB
+# include <sys/cdefs.h>
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+
+__BEGIN_DECLS
+
+/* We need `size_t' for the following definitions. */
+#ifndef __size_t
+# if defined __GNUC__ && __GNUC__ >= 2
+typedef __SIZE_TYPE__ __size_t;
+# ifdef __USE_XOPEN
+typedef __SIZE_TYPE__ size_t;
+# endif
+# else
+# include <stddef.h>
+# ifndef __size_t
+# define __size_t size_t
+# endif
+# endif
+#else
+/* The GNU CC stddef.h version defines __size_t as empty. We need a real
+ definition. */
+# undef __size_t
+# define __size_t size_t
+#endif
+
+/* Bits set in the FLAGS argument to `glob'. */
+#define GLOB_ERR (1 << 0)/* Return on read errors. */
+#define GLOB_MARK (1 << 1)/* Append a slash to each name. */
+#define GLOB_NOSORT (1 << 2)/* Don't sort the names. */
+#define GLOB_DOOFFS (1 << 3)/* Insert PGLOB->gl_offs NULLs. */
+#define GLOB_NOCHECK (1 << 4)/* If nothing matches, return the pattern. */
+#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */
+#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */
+#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */
+
+#if !defined __USE_POSIX2 || defined __USE_BSD || defined __USE_GNU
+# define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */
+# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */
+# define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */
+# define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */
+# define GLOB_TILDE (1 << 12)/* Expand ~user and ~ to home directories. */
+# define GLOB_ONLYDIR (1 << 13)/* Match only directories. */
+# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
+ if the user name is not available. */
+# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+ GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
+ GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \
+ GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
+#else
+# define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+ GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \
+ GLOB_PERIOD)
+#endif
+
+/* Error returns from `glob'. */
+#define GLOB_NOSPACE 1 /* Ran out of memory. */
+#define GLOB_ABORTED 2 /* Read error. */
+#define GLOB_NOMATCH 3 /* No matches found. */
+#define GLOB_NOSYS 4 /* Not implemented. */
+#ifdef __USE_GNU
+/* Previous versions of this file defined GLOB_ABEND instead of
+ GLOB_ABORTED. Provide a compatibility definition here. */
+# define GLOB_ABEND GLOB_ABORTED
+#endif
+
+/* Structure describing a globbing run. */
+#ifdef __USE_GNU
+struct stat;
+#endif
+typedef struct
+ {
+ __size_t gl_pathc; /* Count of paths matched by the pattern. */
+ char **gl_pathv; /* List of matched pathnames. */
+ __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */
+ int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */
+
+ /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+ are used instead of the normal file access functions. */
+ void (*gl_closedir) (void *);
+#ifdef __USE_GNU
+ struct dirent *(*gl_readdir) (void *);
+#else
+ void *(*gl_readdir) (void *);
+#endif
+ void *(*gl_opendir) (const char *);
+#ifdef __USE_GNU
+ int (*gl_lstat) (const char *_Restrict_, struct stat *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, struct stat *_Restrict_);
+#else
+ int (*gl_lstat) (const char *_Restrict_, void *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, void *_Restrict_);
+#endif
+ } glob_t;
+
+#if defined __USE_LARGEFILE64 && !defined __GLOB_GNULIB
+# ifdef __USE_GNU
+struct stat64;
+# endif
+typedef struct
+ {
+ __size_t gl_pathc;
+ char **gl_pathv;
+ __size_t gl_offs;
+ int gl_flags;
+
+ /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+ are used instead of the normal file access functions. */
+ void (*gl_closedir) (void *);
+# ifdef __USE_GNU
+ struct dirent64 *(*gl_readdir) (void *);
+# else
+ void *(*gl_readdir) (void *);
+# endif
+ void *(*gl_opendir) (const char *);
+# ifdef __USE_GNU
+ int (*gl_lstat) (const char *_Restrict_, struct stat64 *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, struct stat64 *_Restrict_);
+# else
+ int (*gl_lstat) (const char *_Restrict_, void *_Restrict_);
+ int (*gl_stat) (const char *_Restrict_, void *_Restrict_);
+# endif
+ } glob64_t;
+#endif
+
+#if __USE_FILE_OFFSET64 && __GNUC__ < 2 && !defined __GLOB_GNULIB
+# define glob glob64
+# define globfree globfree64
+#endif
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+ The bits defined above may be set in FLAGS.
+ If a directory cannot be opened or read and ERRFUNC is not nil,
+ it is called with the pathname that caused the error, and the
+ `errno' value from the failing call; if it returns non-zero
+ `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+ If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+ Otherwise, `glob' returns zero. */
+#if !defined __USE_FILE_OFFSET64 || __GNUC__ < 2 || defined __GLOB_GNULIB
+extern int glob (const char *_Restrict_ __pattern, int __flags,
+ int (*__errfunc) (const char *, int),
+ glob_t *_Restrict_ __pglob) __THROW _GL_ARG_NONNULL ((1, 4));
+
+/* Free storage allocated in PGLOB by a previous `glob' call. */
+extern void globfree (glob_t *__pglob) __THROW _GL_ARG_NONNULL ((1));
+#else
+extern int __REDIRECT_NTH (glob, (const char *_Restrict_ __pattern,
+ int __flags,
+ int (*__errfunc) (const char *, int),
+ glob_t *_Restrict_ __pglob), glob64);
+
+extern void __REDIRECT_NTH (globfree, (glob_t *__pglob), globfree64);
+#endif
+
+#if defined __USE_LARGEFILE64 && !defined __GLOB_GNULIB
+extern int glob64 (const char *_Restrict_ __pattern, int __flags,
+ int (*__errfunc) (const char *, int),
+ glob64_t *_Restrict_ __pglob)
+ __THROW _GL_ARG_NONNULL ((1, 4));
+
+extern void globfree64 (glob64_t *__pglob) __THROW _GL_ARG_NONNULL ((1));
+#endif
+
+
+#ifdef __USE_GNU
+/* Return nonzero if PATTERN contains any metacharacters.
+ Metacharacters can be quoted with backslashes if QUOTE is nonzero.
+
+ This function is not part of the interface specified by POSIX.2
+ but several programs want to use it. */
+extern int glob_pattern_p (const char *__pattern, int __quote)
+ __THROW _GL_ARG_NONNULL ((1));
+#endif
+
+__END_DECLS
+
+#endif /* glob.h */
diff --git a/gnulib/lib/glob.c b/gnulib/lib/glob.c
new file mode 100644
index 0000000..fddd02d
--- /dev/null
+++ b/gnulib/lib/glob.c
@@ -0,0 +1,1552 @@
+/* Copyright (C) 1991-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the pattern == NULL || pglob == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <glob.h>
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stddef.h>
+
+/* Outcomment the following line for production quality code. */
+/* #define NDEBUG 1 */
+#include <assert.h>
+
+#include <stdbool.h>
+
+#include <stdio.h> /* Needed on stupid SunOS for assert. */
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+
+#include <unistd.h>
+#if !defined POSIX && defined _POSIX_VERSION
+# define POSIX
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WINDOWS32
+#endif
+
+#ifndef WINDOWS32
+# include <pwd.h>
+#endif
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <dirent.h>
+
+
+/* In GNU systems, <dirent.h> defines this macro for us. */
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
+#endif
+
+/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
+ if the `d_type' member for `struct dirent' is available.
+ HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */
+#if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE
+/* True if the directory entry D must be of type T. */
+# define DIRENT_MUST_BE(d, t) ((d)->d_type == (t))
+
+/* True if the directory entry D might be a symbolic link. */
+# define DIRENT_MIGHT_BE_SYMLINK(d) \
+ ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK)
+
+/* True if the directory entry D might be a directory. */
+# define DIRENT_MIGHT_BE_DIR(d) \
+ ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d))
+
+#else /* !HAVE_D_TYPE */
+# define DIRENT_MUST_BE(d, t) false
+# define DIRENT_MIGHT_BE_SYMLINK(d) true
+# define DIRENT_MIGHT_BE_DIR(d) true
+#endif /* HAVE_D_TYPE */
+
+/* If the system has the `struct dirent64' type we use it internally. */
+#if defined _LIBC && !defined COMPILE_GLOB64
+# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+# define CONVERT_D_INO(d64, d32)
+# else
+# define CONVERT_D_INO(d64, d32) \
+ (d64)->d_ino = (d32)->d_ino;
+# endif
+
+# ifdef _DIRENT_HAVE_D_TYPE
+# define CONVERT_D_TYPE(d64, d32) \
+ (d64)->d_type = (d32)->d_type;
+# else
+# define CONVERT_D_TYPE(d64, d32)
+# endif
+
+# define CONVERT_DIRENT_DIRENT64(d64, d32) \
+ memcpy ((d64)->d_name, (d32)->d_name, _D_EXACT_NAMLEN (d32) + 1); \
+ CONVERT_D_INO (d64, d32) \
+ CONVERT_D_TYPE (d64, d32)
+#endif
+
+
+#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+/* Posix does not require that the d_ino field be present, and some
+ systems do not provide it. */
+# define REAL_DIR_ENTRY(dp) 1
+#else
+# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* POSIX */
+
+#include <stdlib.h>
+#include <string.h>
+
+/* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */
+#include <limits.h>
+#ifndef NAME_MAX
+# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name))
+#endif
+
+#include <alloca.h>
+
+#ifdef _LIBC
+# undef strdup
+# define strdup(str) __strdup (str)
+# define sysconf(id) __sysconf (id)
+# define closedir(dir) __closedir (dir)
+# define opendir(name) __opendir (name)
+# define readdir(str) __readdir64 (str)
+# define getpwnam_r(name, bufp, buf, len, res) \
+ __getpwnam_r (name, bufp, buf, len, res)
+# ifndef __stat64
+# define __stat64(fname, buf) __xstat64 (_STAT_VER, fname, buf)
+# endif
+# define struct_stat64 struct stat64
+#else /* !_LIBC */
+# define __stat64(fname, buf) stat (fname, buf)
+# define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
+# define struct_stat64 struct stat
+# define __alloca alloca
+# define __readdir readdir
+# define __glob_pattern_p glob_pattern_p
+#endif /* _LIBC */
+
+#include <fnmatch.h>
+
+#ifdef _SC_GETPW_R_SIZE_MAX
+# define GETPW_R_SIZE_MAX() sysconf (_SC_GETPW_R_SIZE_MAX)
+#else
+# define GETPW_R_SIZE_MAX() (-1)
+#endif
+#ifdef _SC_LOGIN_NAME_MAX
+# define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX)
+#else
+# define GET_LOGIN_NAME_MAX() (-1)
+#endif
+
+static const char *next_brace_sub (const char *begin, int flags) __THROW;
+
+#endif /* !defined _LIBC || !defined GLOB_ONLY_P */
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+#ifndef __attribute_noinline__
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
+# define __attribute_noinline__ /* Ignore */
+#else
+# define __attribute_noinline__ __attribute__ ((__noinline__))
+# endif
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#ifndef _LIBC
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer. */
+# undef opendir
+# undef closedir
+
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc. */
+# define __libc_use_alloca(n) 0
+# endif
+#endif
+
+static int glob_in_dir (const char *pattern, const char *directory,
+ int flags, int (*errfunc) (const char *, int),
+ glob_t *pglob);
+extern int __glob_pattern_type (const char *pattern, int quote)
+ attribute_hidden;
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
+static int collated_compare (const void *, const void *) __THROW;
+
+
+/* Find the end of the sub-pattern in a brace expression. */
+static const char *
+next_brace_sub (const char *cp, int flags)
+{
+ unsigned int depth = 0;
+ while (*cp != '\0')
+ if ((flags & GLOB_NOESCAPE) == 0 && *cp == '\\')
+ {
+ if (*++cp == '\0')
+ break;
+ ++cp;
+ }
+ else
+ {
+ if ((*cp == '}' && depth-- == 0) || (*cp == ',' && depth == 0))
+ break;
+
+ if (*cp++ == '{')
+ depth++;
+ }
+
+ return *cp != '\0' ? cp : NULL;
+}
+
+#endif /* !defined _LIBC || !defined GLOB_ONLY_P */
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+ The bits defined above may be set in FLAGS.
+ If a directory cannot be opened or read and ERRFUNC is not nil,
+ it is called with the pathname that caused the error, and the
+ `errno' value from the failing call; if it returns non-zero
+ `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
+ If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+ Otherwise, `glob' returns zero. */
+int
+#ifdef GLOB_ATTRIBUTE
+GLOB_ATTRIBUTE
+#endif
+glob (pattern, flags, errfunc, pglob)
+ const char * restrict pattern;
+ int flags;
+ int (*errfunc) (const char *, int);
+ glob_t * restrict pglob;
+{
+ const char *filename;
+ const char *dirname;
+ size_t dirlen;
+ int status;
+ size_t oldcount;
+ int meta;
+ int dirname_modified;
+ glob_t dirs;
+
+ if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ if (!(flags & GLOB_DOOFFS))
+ /* Have to do this so `globfree' knows where to start freeing. It
+ also makes all the code that uses gl_offs simpler. */
+ pglob->gl_offs = 0;
+
+ if (flags & GLOB_BRACE)
+ {
+ const char *begin;
+
+ if (flags & GLOB_NOESCAPE)
+ begin = strchr (pattern, '{');
+ else
+ {
+ begin = pattern;
+ while (1)
+ {
+ if (*begin == '\0')
+ {
+ begin = NULL;
+ break;
+ }
+
+ if (*begin == '\\' && begin[1] != '\0')
+ ++begin;
+ else if (*begin == '{')
+ break;
+
+ ++begin;
+ }
+ }
+
+ if (begin != NULL)
+ {
+ /* Allocate working buffer large enough for our work. Note that
+ we have at least an opening and closing brace. */
+ size_t firstc;
+ char *alt_start;
+ const char *p;
+ const char *next;
+ const char *rest;
+ size_t rest_len;
+#ifdef __GNUC__
+ char onealt[strlen (pattern) - 1];
+#else
+ char *onealt = malloc (strlen (pattern) - 1);
+ if (onealt == NULL)
+ {
+ if (!(flags & GLOB_APPEND))
+ {
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ }
+ return GLOB_NOSPACE;
+ }
+#endif
+
+ /* We know the prefix for all sub-patterns. */
+ alt_start = mempcpy (onealt, pattern, begin - pattern);
+
+ /* Find the first sub-pattern and at the same time find the
+ rest after the closing brace. */
+ next = next_brace_sub (begin + 1, flags);
+ if (next == NULL)
+ {
+ /* It is an invalid expression. */
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+ }
+
+ /* Now find the end of the whole brace expression. */
+ rest = next;
+ while (*rest != '}')
+ {
+ rest = next_brace_sub (rest + 1, flags);
+ if (rest == NULL)
+ {
+ /* It is an invalid expression. */
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+ }
+ }
+ /* Please note that we now can be sure the brace expression
+ is well-formed. */
+ rest_len = strlen (++rest) + 1;
+
+ /* We have a brace expression. BEGIN points to the opening {,
+ NEXT points past the terminator of the first element, and END
+ points past the final }. We will accumulate result names from
+ recursive runs for each brace alternative in the buffer using
+ GLOB_APPEND. */
+
+ if (!(flags & GLOB_APPEND))
+ {
+ /* This call is to set a new vector, so clear out the
+ vector so we can append to it. */
+ pglob->gl_pathc = 0;
+ pglob->gl_pathv = NULL;
+ }
+ firstc = pglob->gl_pathc;
+
+ p = begin + 1;
+ while (1)
+ {
+ int result;
+
+ /* Construct the new glob expression. */
+ mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
+
+ result = glob (onealt,
+ ((flags & ~(GLOB_NOCHECK | GLOB_NOMAGIC))
+ | GLOB_APPEND), errfunc, pglob);
+
+ /* If we got an error, return it. */
+ if (result && result != GLOB_NOMATCH)
+ {
+#ifndef __GNUC__
+ free (onealt);
+#endif
+ if (!(flags & GLOB_APPEND))
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ }
+ return result;
+ }
+
+ if (*next == '}')
+ /* We saw the last entry. */
+ break;
+
+ p = next + 1;
+ next = next_brace_sub (p, flags);
+ assert (next != NULL);
+ }
+
+#ifndef __GNUC__
+ free (onealt);
+#endif
+
+ if (pglob->gl_pathc != firstc)
+ /* We found some entries. */
+ return 0;
+ else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
+ return GLOB_NOMATCH;
+ }
+ }
+
+ /* Find the filename. */
+ filename = strrchr (pattern, '/');
+#if defined __MSDOS__ || defined WINDOWS32
+ /* The case of "d:pattern". Since `:' is not allowed in
+ file names, we can safely assume that wherever it
+ happens in pattern, it signals the filename part. This
+ is so we could some day support patterns like "[a-z]:foo". */
+ if (filename == NULL)
+ filename = strchr (pattern, ':');
+#endif /* __MSDOS__ || WINDOWS32 */
+ dirname_modified = 0;
+ if (filename == NULL)
+ {
+ /* This can mean two things: a simple name or "~name". The latter
+ case is nothing but a notation for a directory. */
+ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
+ {
+ dirname = pattern;
+ dirlen = strlen (pattern);
+
+ /* Set FILENAME to NULL as a special flag. This is ugly but
+ other solutions would require much more code. We test for
+ this special case below. */
+ filename = NULL;
+ }
+ else
+ {
+ filename = pattern;
+#ifdef _AMIGA
+ dirname = "";
+#else
+ dirname = ".";
+#endif
+ dirlen = 0;
+ }
+ }
+ else if (filename == pattern
+ || (filename == pattern + 1 && pattern[0] == '\\'
+ && (flags & GLOB_NOESCAPE) == 0))
+ {
+ /* "/pattern" or "\\/pattern". */
+ dirname = "/";
+ dirlen = 1;
+ ++filename;
+ }
+ else
+ {
+ char *newp;
+ dirlen = filename - pattern;
+#if defined __MSDOS__ || defined WINDOWS32
+ if (*filename == ':'
+ || (filename > pattern + 1 && filename[-1] == ':'))
+ {
+ char *drive_spec;
+
+ ++dirlen;
+ drive_spec = __alloca (dirlen + 1);
+ *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
+ /* For now, disallow wildcards in the drive spec, to
+ prevent infinite recursion in glob. */
+ if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
+ return GLOB_NOMATCH;
+ /* If this is "d:pattern", we need to copy `:' to DIRNAME
+ as well. If it's "d:/pattern", don't remove the slash
+ from "d:/", since "d:" and "d:/" are not the same.*/
+ }
+#endif
+ newp = __alloca (dirlen + 1);
+ *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
+ dirname = newp;
+ ++filename;
+
+ if (filename[0] == '\0'
+#if defined __MSDOS__ || defined WINDOWS32
+ && dirname[dirlen - 1] != ':'
+ && (dirlen < 3 || dirname[dirlen - 2] != ':'
+ || dirname[dirlen - 1] != '/')
+#endif
+ && dirlen > 1)
+ /* "pattern/". Expand "pattern", appending slashes. */
+ {
+ int orig_flags = flags;
+ int val;
+ if (!(flags & GLOB_NOESCAPE) && dirname[dirlen - 1] == '\\')
+ {
+ /* "pattern\\/". Remove the final backslash if it hasn't
+ been quoted. */
+ char *p = (char *) &dirname[dirlen - 1];
+
+ while (p > dirname && p[-1] == '\\') --p;
+ if ((&dirname[dirlen] - p) & 1)
+ {
+ *(char *) &dirname[--dirlen] = '\0';
+ flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
+ }
+ }
+ val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
+ if (val == 0)
+ pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
+ | (flags & GLOB_MARK));
+ else if (val == GLOB_NOMATCH && flags != orig_flags)
+ {
+ /* Make sure globfree (&dirs); is a nop. */
+ dirs.gl_pathv = NULL;
+ flags = orig_flags;
+ oldcount = pglob->gl_pathc + pglob->gl_offs;
+ goto no_matches;
+ }
+ return val;
+ }
+ }
+
+ if (!(flags & GLOB_APPEND))
+ {
+ pglob->gl_pathc = 0;
+ if (!(flags & GLOB_DOOFFS))
+ pglob->gl_pathv = NULL;
+ else
+ {
+ size_t i;
+ pglob->gl_pathv = malloc ((pglob->gl_offs + 1) * sizeof (char *));
+ if (pglob->gl_pathv == NULL)
+ return GLOB_NOSPACE;
+
+ for (i = 0; i <= pglob->gl_offs; ++i)
+ pglob->gl_pathv[i] = NULL;
+ }
+ }
+
+ oldcount = pglob->gl_pathc + pglob->gl_offs;
+
+ if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
+ {
+ if (dirname[1] == '\0' || dirname[1] == '/'
+ || (!(flags & GLOB_NOESCAPE) && dirname[1] == '\\'
+ && (dirname[2] == '\0' || dirname[2] == '/')))
+ {
+ /* Look up home directory. */
+ const char *home_dir = getenv ("HOME");
+# ifdef _AMIGA
+ if (home_dir == NULL || home_dir[0] == '\0')
+ home_dir = "SYS:";
+# else
+# ifdef WINDOWS32
+ /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference
+ to HOME, because the user can change HOME. */
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ const char *home_drive = getenv ("HOMEDRIVE");
+ const char *home_path = getenv ("HOMEPATH");
+
+ if (home_drive != NULL && home_path != NULL)
+ {
+ size_t home_drive_len = strlen (home_drive);
+ size_t home_path_len = strlen (home_path);
+ char *mem = alloca (home_drive_len + home_path_len + 1);
+
+ memcpy (mem, home_drive, home_drive_len);
+ memcpy (mem + home_drive_len, home_path, home_path_len + 1);
+ home_dir = mem;
+ }
+ else
+ home_dir = "c:/users/default"; /* poor default */
+ }
+# else
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ int success;
+ char *name;
+ size_t buflen = GET_LOGIN_NAME_MAX () + 1;
+
+ if (buflen == 0)
+ /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try
+ a moderate value. */
+ buflen = 20;
+ name = __alloca (buflen);
+
+ success = getlogin_r (name, buflen) == 0;
+ if (success)
+ {
+ struct passwd *p;
+# if defined HAVE_GETPWNAM_R || defined _LIBC
+ long int pwbuflen = GETPW_R_SIZE_MAX ();
+ char *pwtmpbuf;
+ struct passwd pwbuf;
+ int save = errno;
+
+# ifndef _LIBC
+ if (pwbuflen == -1)
+ /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
+ Try a moderate value. */
+ pwbuflen = 1024;
+# endif
+ pwtmpbuf = __alloca (pwbuflen);
+
+ while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
+ != 0)
+ {
+ if (errno != ERANGE)
+ {
+ p = NULL;
+ break;
+ }
+# ifdef _LIBC
+ pwtmpbuf = extend_alloca (pwtmpbuf, pwbuflen,
+ 2 * pwbuflen);
+# else
+ pwbuflen *= 2;
+ pwtmpbuf = __alloca (pwbuflen);
+# endif
+ __set_errno (save);
+ }
+# else
+ p = getpwnam (name);
+# endif
+ if (p != NULL)
+ home_dir = p->pw_dir;
+ }
+ }
+ if (home_dir == NULL || home_dir[0] == '\0')
+ {
+ if (flags & GLOB_TILDE_CHECK)
+ return GLOB_NOMATCH;
+ else
+ home_dir = "~"; /* No luck. */
+ }
+# endif /* WINDOWS32 */
+# endif
+ /* Now construct the full directory. */
+ if (dirname[1] == '\0')
+ {
+ dirname = home_dir;
+ dirlen = strlen (dirname);
+ }
+ else
+ {
+ char *newp;
+ size_t home_len = strlen (home_dir);
+ newp = __alloca (home_len + dirlen);
+ mempcpy (mempcpy (newp, home_dir, home_len),
+ &dirname[1], dirlen);
+ dirname = newp;
+ dirlen += home_len - 1;
+ }
+ dirname_modified = 1;
+ }
+# if !defined _AMIGA && !defined WINDOWS32
+ else
+ {
+ char *end_name = strchr (dirname, '/');
+ const char *user_name;
+ const char *home_dir;
+ char *unescape = NULL;
+
+ if (!(flags & GLOB_NOESCAPE))
+ {
+ if (end_name == NULL)
+ {
+ unescape = strchr (dirname, '\\');
+ if (unescape)
+ end_name = strchr (unescape, '\0');
+ }
+ else
+ unescape = memchr (dirname, '\\', end_name - dirname);
+ }
+ if (end_name == NULL)
+ user_name = dirname + 1;
+ else
+ {
+ char *newp;
+ newp = __alloca (end_name - dirname);
+ *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
+ = '\0';
+ if (unescape != NULL)
+ {
+ char *p = mempcpy (newp, dirname + 1,
+ unescape - dirname - 1);
+ char *q = unescape;
+ while (*q != '\0')
+ {
+ if (*q == '\\')
+ {
+ if (q[1] == '\0')
+ {
+ /* "~fo\\o\\" unescape to user_name "foo\\",
+ but "~fo\\o\\/" unescape to user_name
+ "foo". */
+ if (filename == NULL)
+ *p++ = '\\';
+ break;
+ }
+ ++q;
+ }
+ *p++ = *q++;
+ }
+ *p = '\0';
+ }
+ else
+ *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
+ = '\0';
+ user_name = newp;
+ }
+
+ /* Look up specific user's home directory. */
+ {
+ struct passwd *p;
+# if defined HAVE_GETPWNAM_R || defined _LIBC
+ long int buflen = GETPW_R_SIZE_MAX ();
+ char *pwtmpbuf;
+ struct passwd pwbuf;
+ int save = errno;
+
+# ifndef _LIBC
+ if (buflen == -1)
+ /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. Try a
+ moderate value. */
+ buflen = 1024;
+# endif
+ pwtmpbuf = __alloca (buflen);
+
+ while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
+ {
+ if (errno != ERANGE)
+ {
+ p = NULL;
+ break;
+ }
+# ifdef _LIBC
+ pwtmpbuf = extend_alloca (pwtmpbuf, buflen, 2 * buflen);
+# else
+ buflen *= 2;
+ pwtmpbuf = __alloca (buflen);
+# endif
+ __set_errno (save);
+ }
+# else
+ p = getpwnam (user_name);
+# endif
+ if (p != NULL)
+ home_dir = p->pw_dir;
+ else
+ home_dir = NULL;
+ }
+ /* If we found a home directory use this. */
+ if (home_dir != NULL)
+ {
+ char *newp;
+ size_t home_len = strlen (home_dir);
+ size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
+ newp = __alloca (home_len + rest_len + 1);
+ *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
+ end_name, rest_len)) = '\0';
+ dirname = newp;
+ dirlen = home_len + rest_len;
+ dirname_modified = 1;
+ }
+ else
+ if (flags & GLOB_TILDE_CHECK)
+ /* We have to regard it as an error if we cannot find the
+ home directory. */
+ return GLOB_NOMATCH;
+ }
+# endif /* Not Amiga && not WINDOWS32. */
+ }
+
+ /* Now test whether we looked for "~" or "~NAME". In this case we
+ can give the answer now. */
+ if (filename == NULL)
+ {
+ struct stat st;
+ struct_stat64 st64;
+
+ /* Return the directory if we don't check for error or if it exists. */
+ if ((flags & GLOB_NOCHECK)
+ || (((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ ? ((*pglob->gl_stat) (dirname, &st) == 0
+ && S_ISDIR (st.st_mode))
+ : (__stat64 (dirname, &st64) == 0 && S_ISDIR (st64.st_mode)))))
+ {
+ int newcount = pglob->gl_pathc + pglob->gl_offs;
+ char **new_gl_pathv;
+
+ new_gl_pathv
+ = realloc (pglob->gl_pathv, (newcount + 1 + 1) * sizeof (char *));
+ if (new_gl_pathv == NULL)
+ {
+ nospace:
+ free (pglob->gl_pathv);
+ pglob->gl_pathv = NULL;
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ pglob->gl_pathv = new_gl_pathv;
+
+ if (flags & GLOB_MARK)
+ {
+ char *p;
+ pglob->gl_pathv[newcount] = malloc (dirlen + 2);
+ if (pglob->gl_pathv[newcount] == NULL)
+ goto nospace;
+ p = mempcpy (pglob->gl_pathv[newcount], dirname, dirlen);
+ p[0] = '/';
+ p[1] = '\0';
+ }
+ else
+ {
+ pglob->gl_pathv[newcount] = strdup (dirname);
+ if (pglob->gl_pathv[newcount] == NULL)
+ goto nospace;
+ }
+ pglob->gl_pathv[++newcount] = NULL;
+ ++pglob->gl_pathc;
+ pglob->gl_flags = flags;
+
+ return 0;
+ }
+
+ /* Not found. */
+ return GLOB_NOMATCH;
+ }
+
+ meta = __glob_pattern_type (dirname, !(flags & GLOB_NOESCAPE));
+ /* meta is 1 if correct glob pattern containing metacharacters.
+ If meta has bit (1 << 2) set, it means there was an unterminated
+ [ which we handle the same, using fnmatch. Broken unterminated
+ pattern bracket expressions ought to be rare enough that it is
+ not worth special casing them, fnmatch will do the right thing. */
+ if (meta & 5)
+ {
+ /* The directory name contains metacharacters, so we
+ have to glob for the directory, and then glob for
+ the pattern in each directory found. */
+ size_t i;
+
+ if (!(flags & GLOB_NOESCAPE) && dirlen > 0 && dirname[dirlen - 1] == '\\')
+ {
+ /* "foo\\/bar". Remove the final backslash from dirname
+ if it has not been quoted. */
+ char *p = (char *) &dirname[dirlen - 1];
+
+ while (p > dirname && p[-1] == '\\') --p;
+ if ((&dirname[dirlen] - p) & 1)
+ *(char *) &dirname[--dirlen] = '\0';
+ }
+
+ if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
+ {
+ /* Use the alternative access functions also in the recursive
+ call. */
+ dirs.gl_opendir = pglob->gl_opendir;
+ dirs.gl_readdir = pglob->gl_readdir;
+ dirs.gl_closedir = pglob->gl_closedir;
+ dirs.gl_stat = pglob->gl_stat;
+ dirs.gl_lstat = pglob->gl_lstat;
+ }
+
+ status = glob (dirname,
+ ((flags & (GLOB_ERR | GLOB_NOESCAPE
+ | GLOB_ALTDIRFUNC))
+ | GLOB_NOSORT | GLOB_ONLYDIR),
+ errfunc, &dirs);
+ if (status != 0)
+ {
+ if ((flags & GLOB_NOCHECK) == 0 || status != GLOB_NOMATCH)
+ return status;
+ goto no_matches;
+ }
+
+ /* We have successfully globbed the preceding directory name.
+ For each name we found, call glob_in_dir on it and FILENAME,
+ appending the results to PGLOB. */
+ for (i = 0; i < dirs.gl_pathc; ++i)
+ {
+ int old_pathc;
+
+#ifdef SHELL
+ {
+ /* Make globbing interruptible in the bash shell. */
+ extern int interrupt_state;
+
+ if (interrupt_state)
+ {
+ globfree (&dirs);
+ return GLOB_ABORTED;
+ }
+ }
+#endif /* SHELL. */
+
+ old_pathc = pglob->gl_pathc;
+ status = glob_in_dir (filename, dirs.gl_pathv[i],
+ ((flags | GLOB_APPEND)
+ & ~(GLOB_NOCHECK | GLOB_NOMAGIC)),
+ errfunc, pglob);
+ if (status == GLOB_NOMATCH)
+ /* No matches in this directory. Try the next. */
+ continue;
+
+ if (status != 0)
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return status;
+ }
+
+ /* Stick the directory on the front of each name. */
+ if (prefix_array (dirs.gl_pathv[i],
+ &pglob->gl_pathv[old_pathc + pglob->gl_offs],
+ pglob->gl_pathc - old_pathc))
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ }
+
+ flags |= GLOB_MAGCHAR;
+
+ /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
+ But if we have not found any matching entry and the GLOB_NOCHECK
+ flag was set we must return the input pattern itself. */
+ if (pglob->gl_pathc + pglob->gl_offs == oldcount)
+ {
+ no_matches:
+ /* No matches. */
+ if (flags & GLOB_NOCHECK)
+ {
+ int newcount = pglob->gl_pathc + pglob->gl_offs;
+ char **new_gl_pathv;
+
+ new_gl_pathv = realloc (pglob->gl_pathv,
+ (newcount + 2) * sizeof (char *));
+ if (new_gl_pathv == NULL)
+ {
+ globfree (&dirs);
+ return GLOB_NOSPACE;
+ }
+ pglob->gl_pathv = new_gl_pathv;
+
+ pglob->gl_pathv[newcount] = strdup (pattern);
+ if (pglob->gl_pathv[newcount] == NULL)
+ {
+ globfree (&dirs);
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+
+ ++pglob->gl_pathc;
+ ++newcount;
+
+ pglob->gl_pathv[newcount] = NULL;
+ pglob->gl_flags = flags;
+ }
+ else
+ {
+ globfree (&dirs);
+ return GLOB_NOMATCH;
+ }
+ }
+
+ globfree (&dirs);
+ }
+ else
+ {
+ int old_pathc = pglob->gl_pathc;
+ int orig_flags = flags;
+
+ if (meta & 2)
+ {
+ char *p = strchr (dirname, '\\'), *q;
+ /* We need to unescape the dirname string. It is certainly
+ allocated by alloca, as otherwise filename would be NULL
+ or dirname wouldn't contain backslashes. */
+ q = p;
+ do
+ {
+ if (*p == '\\')
+ {
+ *q = *++p;
+ --dirlen;
+ }
+ else
+ *q = *p;
+ ++q;
+ }
+ while (*p++ != '\0');
+ dirname_modified = 1;
+ }
+ if (dirname_modified)
+ flags &= ~(GLOB_NOCHECK | GLOB_NOMAGIC);
+ status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
+ if (status != 0)
+ {
+ if (status == GLOB_NOMATCH && flags != orig_flags
+ && pglob->gl_pathc + pglob->gl_offs == oldcount)
+ {
+ /* Make sure globfree (&dirs); is a nop. */
+ dirs.gl_pathv = NULL;
+ flags = orig_flags;
+ goto no_matches;
+ }
+ return status;
+ }
+
+ if (dirlen > 0)
+ {
+ /* Stick the directory on the front of each name. */
+ if (prefix_array (dirname,
+ &pglob->gl_pathv[old_pathc + pglob->gl_offs],
+ pglob->gl_pathc - old_pathc))
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ }
+ }
+
+ if (flags & GLOB_MARK)
+ {
+ /* Append slashes to directory names. */
+ size_t i;
+ struct stat st;
+ struct_stat64 st64;
+
+ for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; ++i)
+ if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? ((*pglob->gl_stat) (pglob->gl_pathv[i], &st) == 0
+ && S_ISDIR (st.st_mode))
+ : (__stat64 (pglob->gl_pathv[i], &st64) == 0
+ && S_ISDIR (st64.st_mode))))
+ {
+ size_t len = strlen (pglob->gl_pathv[i]) + 2;
+ char *new = realloc (pglob->gl_pathv[i], len);
+ if (new == NULL)
+ {
+ globfree (pglob);
+ pglob->gl_pathc = 0;
+ return GLOB_NOSPACE;
+ }
+ strcpy (&new[len - 2], "/");
+ pglob->gl_pathv[i] = new;
+ }
+ }
+
+ if (!(flags & GLOB_NOSORT))
+ {
+ /* Sort the vector. */
+ qsort (&pglob->gl_pathv[oldcount],
+ pglob->gl_pathc + pglob->gl_offs - oldcount,
+ sizeof (char *), collated_compare);
+ }
+
+ return 0;
+}
+#if defined _LIBC && !defined glob
+libc_hidden_def (glob)
+#endif
+
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+
+/* Free storage allocated in PGLOB by a previous `glob' call. */
+void
+globfree (pglob)
+ register glob_t *pglob;
+{
+ if (pglob->gl_pathv != NULL)
+ {
+ size_t i;
+ for (i = 0; i < pglob->gl_pathc; ++i)
+ if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
+ free (pglob->gl_pathv[pglob->gl_offs + i]);
+ free (pglob->gl_pathv);
+ pglob->gl_pathv = NULL;
+ }
+}
+#if defined _LIBC && !defined globfree
+libc_hidden_def (globfree)
+#endif
+
+
+/* Do a collated comparison of A and B. */
+static int
+collated_compare (const void *a, const void *b)
+{
+ char *const *ps1 = a; char *s1 = *ps1;
+ char *const *ps2 = b; char *s2 = *ps2;
+
+ if (s1 == s2)
+ return 0;
+ if (s1 == NULL)
+ return 1;
+ if (s2 == NULL)
+ return -1;
+ return strcoll (s1, s2);
+}
+
+
+/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
+ elements in place. Return nonzero if out of memory, zero if successful.
+ A slash is inserted between DIRNAME and each elt of ARRAY,
+ unless DIRNAME is just "/". Each old element of ARRAY is freed. */
+static int
+prefix_array (const char *dirname, char **array, size_t n)
+{
+ register size_t i;
+ size_t dirlen = strlen (dirname);
+#if defined __MSDOS__ || defined WINDOWS32
+ int sep_char = '/';
+# define DIRSEP_CHAR sep_char
+#else
+# define DIRSEP_CHAR '/'
+#endif
+
+ if (dirlen == 1 && dirname[0] == '/')
+ /* DIRNAME is just "/", so normal prepending would get us "//foo".
+ We want "/foo" instead, so don't prepend any chars from DIRNAME. */
+ dirlen = 0;
+#if defined __MSDOS__ || defined WINDOWS32
+ else if (dirlen > 1)
+ {
+ if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
+ /* DIRNAME is "d:/". Don't prepend the slash from DIRNAME. */
+ --dirlen;
+ else if (dirname[dirlen - 1] == ':')
+ {
+ /* DIRNAME is "d:". Use `:' instead of `/'. */
+ --dirlen;
+ sep_char = ':';
+ }
+ }
+#endif
+
+ for (i = 0; i < n; ++i)
+ {
+ size_t eltlen = strlen (array[i]) + 1;
+ char *new = malloc (dirlen + 1 + eltlen);
+ if (new == NULL)
+ {
+ while (i > 0)
+ free (array[--i]);
+ return 1;
+ }
+
+ {
+ char *endp = mempcpy (new, dirname, dirlen);
+ *endp++ = DIRSEP_CHAR;
+ mempcpy (endp, array[i], eltlen);
+ }
+ free (array[i]);
+ array[i] = new;
+ }
+
+ return 0;
+}
+
+
+/* We must not compile this function twice. */
+#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
+int
+__glob_pattern_type (pattern, quote)
+ const char *pattern;
+ int quote;
+{
+ register const char *p;
+ int ret = 0;
+
+ for (p = pattern; *p != '\0'; ++p)
+ switch (*p)
+ {
+ case '?':
+ case '*':
+ return 1;
+
+ case '\\':
+ if (quote)
+ {
+ if (p[1] != '\0')
+ ++p;
+ ret |= 2;
+ }
+ break;
+
+ case '[':
+ ret |= 4;
+ break;
+
+ case ']':
+ if (ret & 4)
+ return 1;
+ break;
+ }
+
+ return ret;
+}
+
+/* Return nonzero if PATTERN contains any metacharacters.
+ Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
+int
+__glob_pattern_p (pattern, quote)
+ const char *pattern;
+ int quote;
+{
+ return __glob_pattern_type (pattern, quote) == 1;
+}
+# ifdef _LIBC
+weak_alias (__glob_pattern_p, glob_pattern_p)
+# endif
+#endif
+
+#endif /* !GLOB_ONLY_P */
+
+
+#if !defined _LIBC || !defined GLOB_ONLY_P
+/* We put this in a separate function mainly to allow the memory
+ allocated with alloca to be recycled. */
+static int
+__attribute_noinline__
+link_exists2_p (const char *dir, size_t dirlen, const char *fname,
+ glob_t *pglob
+# if !defined _LIBC && !HAVE_FSTATAT
+ , int flags
+# endif
+ )
+{
+ size_t fnamelen = strlen (fname);
+ char *fullname = __alloca (dirlen + 1 + fnamelen + 1);
+ struct stat st;
+
+ mempcpy (mempcpy (mempcpy (fullname, dir, dirlen), "/", 1),
+ fname, fnamelen + 1);
+
+# if !defined _LIBC && !HAVE_FSTATAT
+ if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) == 0, 1))
+ {
+ struct_stat64 st64;
+ return __stat64 (fullname, &st64) == 0;
+ }
+# endif
+ return (*pglob->gl_stat) (fullname, &st) == 0;
+}
+
+/* Return true if DIR/FNAME exists. */
+static int
+link_exists_p (int dfd, const char *dir, size_t dirlen, const char *fname,
+ glob_t *pglob, int flags)
+{
+# if defined _LIBC || HAVE_FSTATAT
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ return link_exists2_p (dir, dirlen, fname, pglob);
+ else
+ {
+ /* dfd cannot be -1 here, because dirfd never returns -1 on
+ glibc, or on hosts that have fstatat. */
+ struct_stat64 st64;
+ return __fxstatat64 (_STAT_VER, dfd, fname, &st64, 0) == 0;
+ }
+# else
+ return link_exists2_p (dir, dirlen, fname, pglob, flags);
+# endif
+}
+#endif
+
+
+/* Like `glob', but PATTERN is a final pathname component,
+ and matches are searched for in DIRECTORY.
+ The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done.
+ The GLOB_APPEND flag is assumed to be set (always appends). */
+static int
+glob_in_dir (const char *pattern, const char *directory, int flags,
+ int (*errfunc) (const char *, int),
+ glob_t *pglob)
+{
+ size_t dirlen = strlen (directory);
+ void *stream = NULL;
+ struct globnames
+ {
+ struct globnames *next;
+ size_t count;
+ char *name[64];
+ };
+#define INITIAL_COUNT sizeof (init_names.name) / sizeof (init_names.name[0])
+ struct globnames init_names;
+ struct globnames *names = &init_names;
+ struct globnames *names_alloca = &init_names;
+ size_t nfound = 0;
+ size_t allocasize = sizeof (init_names);
+ size_t cur = 0;
+ int meta;
+ int save;
+ int result;
+
+ init_names.next = NULL;
+ init_names.count = INITIAL_COUNT;
+
+ meta = __glob_pattern_type (pattern, !(flags & GLOB_NOESCAPE));
+ if (meta == 0 && (flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
+ {
+ /* We need not do any tests. The PATTERN contains no meta
+ characters and we must not return an error therefore the
+ result will always contain exactly one name. */
+ flags |= GLOB_NOCHECK;
+ }
+ else if (meta == 0)
+ {
+ /* Since we use the normal file functions we can also use stat()
+ to verify the file is there. */
+ struct stat st;
+ struct_stat64 st64;
+ size_t patlen = strlen (pattern);
+ char *fullname = __alloca (dirlen + 1 + patlen + 1);
+
+ mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
+ "/", 1),
+ pattern, patlen + 1);
+ if ((__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? (*pglob->gl_stat) (fullname, &st)
+ : __stat64 (fullname, &st64)) == 0)
+ /* We found this file to be existing. Now tell the rest
+ of the function to copy this name into the result. */
+ flags |= GLOB_NOCHECK;
+ }
+ else
+ {
+ stream = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? (*pglob->gl_opendir) (directory)
+ : opendir (directory));
+ if (stream == NULL)
+ {
+ if (errno != ENOTDIR
+ && ((errfunc != NULL && (*errfunc) (directory, errno))
+ || (flags & GLOB_ERR)))
+ return GLOB_ABORTED;
+ }
+ else
+ {
+ int dfd = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? -1 : dirfd ((DIR *) stream));
+ int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
+ | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+#if defined _AMIGA || defined VMS
+ | FNM_CASEFOLD
+#endif
+ );
+ flags |= GLOB_MAGCHAR;
+
+ while (1)
+ {
+ const char *name;
+ size_t len;
+#if defined _LIBC && !defined COMPILE_GLOB64
+ struct dirent64 *d;
+ union
+ {
+ struct dirent64 d64;
+ char room [offsetof (struct dirent64, d_name[0])
+ + NAME_MAX + 1];
+ }
+ d64buf;
+
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ {
+ struct dirent *d32 = (*pglob->gl_readdir) (stream);
+ if (d32 != NULL)
+ {
+ CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32);
+ d = &d64buf.d64;
+ }
+ else
+ d = NULL;
+ }
+ else
+ d = __readdir64 (stream);
+#else
+ struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)
+ ? ((struct dirent *)
+ (*pglob->gl_readdir) (stream))
+ : __readdir (stream));
+#endif
+ if (d == NULL)
+ break;
+ if (! REAL_DIR_ENTRY (d))
+ continue;
+
+ /* If we shall match only directories use the information
+ provided by the dirent call if possible. */
+ if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d))
+ continue;
+
+ name = d->d_name;
+
+ if (fnmatch (pattern, name, fnm_flags) == 0)
+ {
+ /* If the file we found is a symlink we have to
+ make sure the target file exists. */
+ if (!DIRENT_MIGHT_BE_SYMLINK (d)
+ || link_exists_p (dfd, directory, dirlen, name, pglob,
+ flags))
+ {
+ if (cur == names->count)
+ {
+ struct globnames *newnames;
+ size_t count = names->count * 2;
+ size_t size = (sizeof (struct globnames)
+ + ((count - INITIAL_COUNT)
+ * sizeof (char *)));
+ allocasize += size;
+ if (__libc_use_alloca (allocasize))
+ newnames = names_alloca = __alloca (size);
+ else if ((newnames = malloc (size))
+ == NULL)
+ goto memory_error;
+ newnames->count = count;
+ newnames->next = names;
+ names = newnames;
+ cur = 0;
+ }
+ len = _D_EXACT_NAMLEN (d);
+ names->name[cur] = malloc (len + 1);
+ if (names->name[cur] == NULL)
+ goto memory_error;
+ *((char *) mempcpy (names->name[cur++], name, len))
+ = '\0';
+ ++nfound;
+ }
+ }
+ }
+ }
+ }
+
+ if (nfound == 0 && (flags & GLOB_NOCHECK))
+ {
+ size_t len = strlen (pattern);
+ nfound = 1;
+ names->name[cur] = malloc (len + 1);
+ if (names->name[cur] == NULL)
+ goto memory_error;
+ *((char *) mempcpy (names->name[cur++], pattern, len)) = '\0';
+ }
+
+ result = GLOB_NOMATCH;
+ if (nfound != 0)
+ {
+ char **new_gl_pathv
+ = realloc (pglob->gl_pathv,
+ (pglob->gl_pathc + pglob->gl_offs + nfound + 1)
+ * sizeof (char *));
+ result = 0;
+
+ if (new_gl_pathv == NULL)
+ {
+ memory_error:
+ while (1)
+ {
+ struct globnames *old = names;
+ size_t i;
+ for (i = 0; i < cur; ++i)
+ free (names->name[i]);
+ names = names->next;
+ /* NB: we will not leak memory here if we exit without
+ freeing the current block assigned to OLD. At least
+ the very first block is always allocated on the stack
+ and this is the block assigned to OLD here. */
+ if (names == NULL)
+ {
+ assert (old == &init_names);
+ break;
+ }
+ cur = names->count;
+ if (old == names_alloca)
+ names_alloca = names;
+ else
+ free (old);
+ }
+ result = GLOB_NOSPACE;
+ }
+ else
+ {
+ while (1)
+ {
+ struct globnames *old = names;
+ size_t i;
+ for (i = 0; i < cur; ++i)
+ new_gl_pathv[pglob->gl_offs + pglob->gl_pathc++]
+ = names->name[i];
+ names = names->next;
+ /* NB: we will not leak memory here if we exit without
+ freeing the current block assigned to OLD. At least
+ the very first block is always allocated on the stack
+ and this is the block assigned to OLD here. */
+ if (names == NULL)
+ {
+ assert (old == &init_names);
+ break;
+ }
+ cur = names->count;
+ if (old == names_alloca)
+ names_alloca = names;
+ else
+ free (old);
+ }
+
+ pglob->gl_pathv = new_gl_pathv;
+
+ pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = NULL;
+
+ pglob->gl_flags = flags;
+ }
+ }
+
+ if (stream != NULL)
+ {
+ save = errno;
+ if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+ (*pglob->gl_closedir) (stream);
+ else
+ closedir (stream);
+ __set_errno (save);
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/glob.in.h b/gnulib/lib/glob.in.h
new file mode 100644
index 0000000..e0d1f85
--- /dev/null
+++ b/gnulib/lib/glob.in.h
@@ -0,0 +1,91 @@
+/* glob.h -- Find a path matching a pattern.
+
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ Written by Derek Price <derek@ximbiot.com> & Paul Eggert <eggert@CS.UCLA.EDU>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_GLOB_H
+#define _GL_GLOB_H
+
+#if @HAVE_SYS_CDEFS_H@
+# include <sys/cdefs.h>
+#endif
+
+#include <stddef.h>
+
+/* On some systems, such as AIX 5.1, <sys/stat.h> does a "#define stat stat64".
+ Make sure this definition is seen before glob-libc.h defines types that
+ rely on 'struct stat'. */
+#include <sys/stat.h>
+
+#ifndef __BEGIN_DECLS
+# ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+# else
+# define __BEGIN_DECLS
+# define __END_DECLS
+# endif
+#endif
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifndef __size_t
+# define __size_t size_t
+#endif
+#ifndef __USE_GNU
+# define __USE_GNU 1
+#endif
+
+
+#define glob rpl_glob
+#define globfree rpl_globfree
+#define glob_pattern_p rpl_glob_pattern_p
+
+#define __GLOB_GNULIB 1
+
+/* Now the standard GNU C Library header should work. */
+#include "glob-libc.h"
+
+__BEGIN_DECLS
+typedef int (*_gl_glob_errfunc_fn) (const char *, int);
+__END_DECLS
+
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef glob
+# undef globfree
+# undef glob_pattern_p
+_GL_CXXALIAS_RPL (glob, int, (const char *_Restrict_ __pattern, int __flags,
+ _gl_glob_errfunc_fn __errfunc,
+ glob_t *_Restrict_ __pglob));
+_GL_CXXALIAS_RPL (globfree, void, (glob_t *__pglob));
+_GL_CXXALIAS_RPL (glob_pattern_p, int, (const char *__pattern, int __quote));
+# if 0 /* The C function name is rpl_glob, not glob. */
+_GL_CXXALIASWARN (glob);
+_GL_CXXALIASWARN (globfree);
+_GL_CXXALIASWARN (glob_pattern_p);
+# endif
+#endif
+
+#endif /* _GL_GLOB_H */
diff --git a/gnulib/lib/glthread/cond.c b/gnulib/lib/glthread/cond.c
new file mode 100644
index 0000000..124da95
--- /dev/null
+++ b/gnulib/lib/glthread/cond.c
@@ -0,0 +1,464 @@
+/* Condition variables for multithreading.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Yoann Vandoorselaere <yoann@prelude-ids.org>, 2008,
+ and Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+#include "glthread/cond.h"
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+int
+glthread_cond_timedwait_multithreaded (gl_cond_t *cond,
+ gl_lock_t *lock,
+ struct timespec *abstime)
+{
+ int ret, status;
+ pth_event_t ev;
+
+ ev = pth_event (PTH_EVENT_TIME, pth_time (abstime->tv_sec, abstime->tv_nsec / 1000));
+ ret = pth_cond_await (cond, lock, ev);
+
+ status = pth_event_status (ev);
+ pth_event_free (ev, PTH_FREE_THIS);
+
+ if (status == PTH_STATUS_OCCURRED)
+ return ETIMEDOUT;
+
+ return ret;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+int
+glthread_cond_timedwait_multithreaded (gl_cond_t *cond,
+ gl_lock_t *lock,
+ struct timespec *abstime)
+{
+ int ret;
+
+ ret = cond_timedwait (cond, lock, abstime);
+ if (ret == ETIME)
+ return ETIMEDOUT;
+ return ret;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#include <sys/time.h>
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+/* In this file, the waitqueues are implemented as linked lists. */
+#define gl_waitqueue_t gl_linked_waitqueue_t
+
+/* All links of a circular list, except the anchor, are of this type, carrying
+ a payload. */
+struct gl_waitqueue_element
+{
+ struct gl_waitqueue_link link; /* must be the first field! */
+ HANDLE event; /* Waiting thread, represented by an event.
+ This field is immutable once initialized. */
+};
+
+static inline void
+gl_waitqueue_init (gl_waitqueue_t *wq)
+{
+ wq->wq_list.wql_next = &wq->wq_list;
+ wq->wq_list.wql_prev = &wq->wq_list;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+ Returns NULL if an allocation failure occurs. */
+static struct gl_waitqueue_element *
+gl_waitqueue_add (gl_waitqueue_t *wq)
+{
+ struct gl_waitqueue_element *elt;
+ HANDLE event;
+
+ /* Allocate the memory for the waitqueue element on the heap, not on the
+ thread's stack. If the thread exits unexpectedly, we prefer to leak
+ some memory rather than to access unavailable memory and crash. */
+ elt =
+ (struct gl_waitqueue_element *)
+ malloc (sizeof (struct gl_waitqueue_element));
+ if (elt == NULL)
+ /* No more memory. */
+ return NULL;
+
+ /* Whether the created event is a manual-reset one or an auto-reset one,
+ does not matter, since we will wait on it only once. */
+ event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (event == INVALID_HANDLE_VALUE)
+ {
+ /* No way to allocate an event. */
+ free (elt);
+ return NULL;
+ }
+ elt->event = event;
+ /* Insert elt at the end of the circular list. */
+ (elt->link.wql_prev = wq->wq_list.wql_prev)->wql_next = &elt->link;
+ (elt->link.wql_next = &wq->wq_list)->wql_prev = &elt->link;
+ return elt;
+}
+
+/* Removes the current thread, represented by a 'struct gl_waitqueue_element *',
+ from a wait queue.
+ Returns true if is was found and removed, false if it was not present. */
+static inline bool
+gl_waitqueue_remove (gl_waitqueue_t *wq, struct gl_waitqueue_element *elt)
+{
+ if (elt->link.wql_next != NULL && elt->link.wql_prev != NULL)
+ {
+ /* Remove elt from the circular list. */
+ struct gl_waitqueue_link *prev = elt->link.wql_prev;
+ struct gl_waitqueue_link *next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+ return true;
+ }
+ else
+ return false;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it. */
+static inline void
+gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+{
+ if (wq->wq_list.wql_next != &wq->wq_list)
+ {
+ struct gl_waitqueue_element *elt =
+ (struct gl_waitqueue_element *) wq->wq_list.wql_next;
+ struct gl_waitqueue_link *prev;
+ struct gl_waitqueue_link *next;
+
+ /* Remove elt from the circular list. */
+ prev = &wq->wq_list; /* = elt->link.wql_prev; */
+ next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+
+ SetEvent (elt->event);
+ /* After the SetEvent, this thread cannot access *elt any more, because
+ the woken-up thread will quickly call free (elt). */
+ }
+}
+
+/* Notifies all threads from a wait queue and dequeues them all. */
+static inline void
+gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+{
+ struct gl_waitqueue_link *l;
+
+ for (l = wq->wq_list.wql_next; l != &wq->wq_list; )
+ {
+ struct gl_waitqueue_element *elt = (struct gl_waitqueue_element *) l;
+ struct gl_waitqueue_link *prev;
+ struct gl_waitqueue_link *next;
+
+ /* Remove elt from the circular list. */
+ prev = &wq->wq_list; /* = elt->link.wql_prev; */
+ next = elt->link.wql_next;
+ prev->wql_next = next;
+ next->wql_prev = prev;
+ elt->link.wql_next = NULL;
+ elt->link.wql_prev = NULL;
+
+ SetEvent (elt->event);
+ /* After the SetEvent, this thread cannot access *elt any more, because
+ the woken-up thread will quickly call free (elt). */
+
+ l = next;
+ }
+ if (!(wq->wq_list.wql_next == &wq->wq_list
+ && wq->wq_list.wql_prev == &wq->wq_list))
+ abort ();
+}
+
+int
+glthread_cond_init_func (gl_cond_t *cond)
+{
+ InitializeCriticalSection (&cond->lock);
+ gl_waitqueue_init (&cond->waiters);
+
+ cond->guard.done = 1;
+ return 0;
+}
+
+int
+glthread_cond_wait_func (gl_cond_t *cond, gl_lock_t *lock)
+{
+ if (!cond->guard.done)
+ {
+ if (InterlockedIncrement (&cond->guard.started) == 0)
+ /* This thread is the first one to need this condition variable.
+ Initialize it. */
+ glthread_cond_init (cond);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this condition variable. */
+ while (!cond->guard.done)
+ Sleep (0);
+ }
+
+ EnterCriticalSection (&cond->lock);
+ {
+ struct gl_waitqueue_element *elt = gl_waitqueue_add (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+ if (elt == NULL)
+ {
+ /* Allocation failure. Weird. */
+ return EAGAIN;
+ }
+ else
+ {
+ HANDLE event = elt->event;
+ int err;
+ DWORD result;
+
+ /* Now release the lock and let any other thread take it. */
+ err = glthread_lock_unlock (lock);
+ if (err != 0)
+ {
+ EnterCriticalSection (&cond->lock);
+ gl_waitqueue_remove (&cond->waiters, elt);
+ LeaveCriticalSection (&cond->lock);
+ CloseHandle (event);
+ free (elt);
+ return err;
+ }
+ /* POSIX says:
+ "If another thread is able to acquire the mutex after the
+ about-to-block thread has released it, then a subsequent call to
+ pthread_cond_broadcast() or pthread_cond_signal() in that thread
+ shall behave as if it were issued after the about-to-block thread
+ has blocked."
+ This is fulfilled here, because the thread signalling is done
+ through SetEvent, not PulseEvent. */
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ free (elt);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiters. */
+ return glthread_lock_lock (lock);
+ }
+ }
+}
+
+int
+glthread_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime)
+{
+ struct timeval currtime;
+
+ gettimeofday (&currtime, NULL);
+ if (currtime.tv_sec > abstime->tv_sec
+ || (currtime.tv_sec == abstime->tv_sec
+ && currtime.tv_usec * 1000 >= abstime->tv_nsec))
+ return ETIMEDOUT;
+
+ if (!cond->guard.done)
+ {
+ if (InterlockedIncrement (&cond->guard.started) == 0)
+ /* This thread is the first one to need this condition variable.
+ Initialize it. */
+ glthread_cond_init (cond);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this condition variable. */
+ while (!cond->guard.done)
+ Sleep (0);
+ }
+
+ EnterCriticalSection (&cond->lock);
+ {
+ struct gl_waitqueue_element *elt = gl_waitqueue_add (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+ if (elt == NULL)
+ {
+ /* Allocation failure. Weird. */
+ return EAGAIN;
+ }
+ else
+ {
+ HANDLE event = elt->event;
+ int err;
+ DWORD timeout;
+ DWORD result;
+
+ /* Now release the lock and let any other thread take it. */
+ err = glthread_lock_unlock (lock);
+ if (err != 0)
+ {
+ EnterCriticalSection (&cond->lock);
+ gl_waitqueue_remove (&cond->waiters, elt);
+ LeaveCriticalSection (&cond->lock);
+ CloseHandle (event);
+ free (elt);
+ return err;
+ }
+ /* POSIX says:
+ "If another thread is able to acquire the mutex after the
+ about-to-block thread has released it, then a subsequent call to
+ pthread_cond_broadcast() or pthread_cond_signal() in that thread
+ shall behave as if it were issued after the about-to-block thread
+ has blocked."
+ This is fulfilled here, because the thread signalling is done
+ through SetEvent, not PulseEvent. */
+ /* Wait until another thread signals this event or until the abstime
+ passes. */
+ gettimeofday (&currtime, NULL);
+ if (currtime.tv_sec > abstime->tv_sec)
+ timeout = 0;
+ else
+ {
+ unsigned long seconds = abstime->tv_sec - currtime.tv_sec;
+ timeout = seconds * 1000;
+ if (timeout / 1000 != seconds) /* overflow? */
+ timeout = INFINITE;
+ else
+ {
+ long milliseconds =
+ abstime->tv_nsec / 1000000 - currtime.tv_usec / 1000;
+ if (milliseconds >= 0)
+ {
+ timeout += milliseconds;
+ if (timeout < milliseconds) /* overflow? */
+ timeout = INFINITE;
+ }
+ else
+ {
+ if (timeout >= - milliseconds)
+ timeout -= (- milliseconds);
+ else
+ timeout = 0;
+ }
+ }
+ }
+ result = WaitForSingleObject (event, timeout);
+ if (result == WAIT_FAILED)
+ abort ();
+ if (result == WAIT_TIMEOUT)
+ {
+ EnterCriticalSection (&cond->lock);
+ if (gl_waitqueue_remove (&cond->waiters, elt))
+ {
+ /* The event was not signaled between the WaitForSingleObject
+ call and the EnterCriticalSection call. */
+ if (!(WaitForSingleObject (event, 0) == WAIT_TIMEOUT))
+ abort ();
+ }
+ else
+ {
+ /* The event was signaled between the WaitForSingleObject
+ call and the EnterCriticalSection call. */
+ if (!(WaitForSingleObject (event, 0) == WAIT_OBJECT_0))
+ abort ();
+ /* Produce the right return value. */
+ result = WAIT_OBJECT_0;
+ }
+ LeaveCriticalSection (&cond->lock);
+ }
+ else
+ {
+ /* The thread which signalled the event already did the
+ bookkeeping: removed us from the waiters. */
+ }
+ CloseHandle (event);
+ free (elt);
+ /* Take the lock again. It does not matter whether this is done
+ before or after the bookkeeping for WAIT_TIMEOUT. */
+ err = glthread_lock_lock (lock);
+ return (err ? err :
+ result == WAIT_OBJECT_0 ? 0 :
+ result == WAIT_TIMEOUT ? ETIMEDOUT :
+ /* WAIT_FAILED shouldn't happen */ EAGAIN);
+ }
+ }
+}
+
+int
+glthread_cond_signal_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+
+ EnterCriticalSection (&cond->lock);
+ /* POSIX says:
+ "The pthread_cond_broadcast() and pthread_cond_signal() functions shall
+ have no effect if there are no threads currently blocked on cond." */
+ if (cond->waiters.wq_list.wql_next != &cond->waiters.wq_list)
+ gl_waitqueue_notify_first (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+
+ return 0;
+}
+
+int
+glthread_cond_broadcast_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+
+ EnterCriticalSection (&cond->lock);
+ /* POSIX says:
+ "The pthread_cond_broadcast() and pthread_cond_signal() functions shall
+ have no effect if there are no threads currently blocked on cond."
+ gl_waitqueue_notify_all is a nop in this case. */
+ gl_waitqueue_notify_all (&cond->waiters);
+ LeaveCriticalSection (&cond->lock);
+
+ return 0;
+}
+
+int
+glthread_cond_destroy_func (gl_cond_t *cond)
+{
+ if (!cond->guard.done)
+ return EINVAL;
+ if (cond->waiters.wq_list.wql_next != &cond->waiters.wq_list)
+ return EBUSY;
+ DeleteCriticalSection (&cond->lock);
+ cond->guard.done = 0;
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/cond.h b/gnulib/lib/glthread/cond.h
new file mode 100644
index 0000000..e205045
--- /dev/null
+++ b/gnulib/lib/glthread/cond.h
@@ -0,0 +1,409 @@
+/* Condition variables for multithreading.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Yoann Vandoorselaere <yoann@prelude-ids.org>, 2008.
+ Based on Bruno Haible <bruno@clisp.org> lock.h */
+
+/*
+ Condition variables can be used for waiting until a condition
+ becomes true. In this respect, they are similar to wait queues. But
+ contrary to wait queues, condition variables have different
+ semantics that allows events to be lost when there is no thread
+ waiting for them.
+
+ Condition variable:
+ Type: gl_cond_t
+ Declaration: gl_cond_define(extern, name)
+ Initializer: gl_cond_define_initialized(, name)
+ Initialization: gl_cond_init (name);
+ Waiting: gl_cond_wait (name, lock);
+ Timed wait: bool timedout = gl_cond_timedwait (name, lock, abstime);
+ where lock is a gl_lock_t variable (cf. <glthread/lock.h>)
+ Signaling: gl_cond_signal (name);
+ Broadcasting: gl_cond_broadcast (name);
+ De-initialization: gl_cond_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_cond_init (&name);
+ Waiting: err = glthread_cond_wait (&name);
+ Timed wait: err = glthread_cond_timedwait (&name, &lock, abstime);
+ Signaling: err = glthread_cond_signal (&name);
+ Broadcasting: err = glthread_cond_broadcast (&name);
+ De-initialization: err = glthread_cond_destroy (&name);
+*/
+
+
+#ifndef _GLTHREAD_COND_H
+#define _GLTHREAD_COND_H
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_cond_init
+# pragma weak pthread_cond_wait
+# pragma weak pthread_cond_timedwait
+# pragma weak pthread_cond_signal
+# pragma weak pthread_cond_broadcast
+# pragma weak pthread_cond_destroy
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef pthread_cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ PTHREAD_COND_INITIALIZER
+# define glthread_cond_init(COND) \
+ (pthread_in_use () ? pthread_cond_init (COND, NULL) : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pthread_in_use () ? pthread_cond_wait (COND, LOCK) : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pthread_in_use () ? pthread_cond_timedwait (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pthread_in_use () ? pthread_cond_signal (COND) : 0)
+# define glthread_cond_broadcast(COND) \
+ (pthread_in_use () ? pthread_cond_broadcast (COND) : 0)
+# define glthread_cond_destroy(COND) \
+ (pthread_in_use () ? pthread_cond_destroy (COND) : 0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_cond_init
+# pragma weak pth_cond_await
+# pragma weak pth_cond_notify
+# pragma weak pth_event
+# pragma weak pth_timeout
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef pth_cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ PTH_COND_INIT
+# define glthread_cond_init(COND) \
+ (pth_in_use () && !pth_cond_init (COND) ? errno : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pth_in_use () && !pth_cond_await (COND, LOCK, NULL) ? errno : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pth_in_use () ? glthread_cond_timedwait_multithreaded (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pth_in_use () && !pth_cond_notify (COND, FALSE) ? errno : 0)
+# define glthread_cond_broadcast(COND) \
+ (pth_in_use () && !pth_cond_notify (COND, TRUE) ? errno : 0)
+# define glthread_cond_destroy(COND) 0
+extern int glthread_cond_timedwait_multithreaded (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak cond_init
+# pragma weak cond_wait
+# pragma weak cond_timedwait
+# pragma weak cond_signal
+# pragma weak cond_broadcast
+# pragma weak cond_destroy
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+typedef cond_t gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ DEFAULTCV
+# define glthread_cond_init(COND) \
+ (pthread_in_use () ? cond_init (COND, USYNC_THREAD, NULL) : 0)
+# define glthread_cond_wait(COND, LOCK) \
+ (pthread_in_use () ? cond_wait (COND, LOCK) : 0)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ (pthread_in_use () ? glthread_cond_timedwait_multithreaded (COND, LOCK, ABSTIME) : 0)
+# define glthread_cond_signal(COND) \
+ (pthread_in_use () ? cond_signal (COND) : 0)
+# define glthread_cond_broadcast(COND) \
+ (pthread_in_use () ? cond_broadcast (COND) : 0)
+# define glthread_cond_destroy(COND) \
+ (pthread_in_use () ? cond_destroy (COND) : 0)
+extern int glthread_cond_timedwait_multithreaded (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* -------------------------- gl_cond_t datatype -------------------------- */
+
+struct gl_waitqueue_link
+{
+ struct gl_waitqueue_link *wql_next;
+ struct gl_waitqueue_link *wql_prev;
+};
+typedef struct
+ {
+ struct gl_waitqueue_link wq_list; /* circular list of waiting threads */
+ }
+ gl_linked_waitqueue_t;
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock; /* protects the remaining fields */
+ gl_linked_waitqueue_t waiters; /* waiting threads */
+ }
+ gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME;
+# define gl_cond_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_cond_t NAME = gl_cond_initializer;
+# define gl_cond_initializer \
+ { { 0, -1 } }
+# define glthread_cond_init(COND) \
+ glthread_cond_init_func (COND)
+# define glthread_cond_wait(COND, LOCK) \
+ glthread_cond_wait_func (COND, LOCK)
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) \
+ glthread_cond_timedwait_func (COND, LOCK, ABSTIME)
+# define glthread_cond_signal(COND) \
+ glthread_cond_signal_func (COND)
+# define glthread_cond_broadcast(COND) \
+ glthread_cond_broadcast_func (COND)
+# define glthread_cond_destroy(COND) \
+ glthread_cond_destroy_func (COND)
+extern int glthread_cond_init_func (gl_cond_t *cond);
+extern int glthread_cond_wait_func (gl_cond_t *cond, gl_lock_t *lock);
+extern int glthread_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime);
+extern int glthread_cond_signal_func (gl_cond_t *cond);
+extern int glthread_cond_broadcast_func (gl_cond_t *cond);
+extern int glthread_cond_destroy_func (gl_cond_t *cond);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+typedef int gl_cond_t;
+# define gl_cond_define(STORAGECLASS, NAME)
+# define gl_cond_define_initialized(STORAGECLASS, NAME)
+# define glthread_cond_init(COND) 0
+# define glthread_cond_wait(COND, LOCK) 0
+# define glthread_cond_timedwait(COND, LOCK, ABSTIME) 0
+# define glthread_cond_signal(COND) 0
+# define glthread_cond_broadcast(COND) 0
+# define glthread_cond_destroy(COND) 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define gl_cond_init(COND) \
+ do \
+ { \
+ if (glthread_cond_init (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_wait(COND, LOCK) \
+ do \
+ { \
+ if (glthread_cond_wait (&COND, &LOCK)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_timedwait(COND, LOCK, ABSTIME) \
+ gl_cond_timedwait_func (&COND, &LOCK, ABSTIME)
+static inline bool
+gl_cond_timedwait_func (gl_cond_t *cond, gl_lock_t *lock, struct timespec *abstime)
+{
+ int err = glthread_cond_timedwait (cond, lock, abstime);
+ if (err == ETIMEDOUT)
+ return true;
+ if (err != 0)
+ abort ();
+ return false;
+}
+#define gl_cond_signal(COND) \
+ do \
+ { \
+ if (glthread_cond_signal (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_broadcast(COND) \
+ do \
+ { \
+ if (glthread_cond_broadcast (&COND)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_cond_destroy(COND) \
+ do \
+ { \
+ if (glthread_cond_destroy (&COND)) \
+ abort (); \
+ } \
+ while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GLTHREAD_COND_H */
diff --git a/gnulib/lib/glthread/lock.c b/gnulib/lib/glthread/lock.c
new file mode 100644
index 0000000..6e5d3b1
--- /dev/null
+++ b/gnulib/lib/glthread/lock.c
@@ -0,0 +1,1058 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+#include <config.h>
+
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+# if !defined PTHREAD_RWLOCK_INITIALIZER
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_rwlock_init (&lock->rwlock, NULL);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_rdlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_wrlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_rwlock_unlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_rwlock_destroy (&lock->rwlock);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->lock, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_readers, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_writers, NULL);
+ if (err != 0)
+ return err;
+ lock->waiting_writers_count = 0;
+ lock->runcount = 0;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow. */
+ /* POSIX says: "It is implementation-defined whether the calling thread
+ acquires the lock when a writer does not hold the lock and there are
+ writers blocked on the lock." Let's say, no: give the writers a higher
+ priority. */
+ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ err = pthread_cond_wait (&lock->waiting_readers, &lock->lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ lock->runcount++;
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether no readers or writers are currently running. */
+ while (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ lock->waiting_writers_count++;
+ err = pthread_cond_wait (&lock->waiting_writers, &lock->lock);
+ if (err != 0)
+ {
+ lock->waiting_writers_count--;
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ lock->waiting_writers_count--;
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers_count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ err = pthread_cond_signal (&lock->waiting_writers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ err = pthread_cond_broadcast (&lock->waiting_readers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ }
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_destroy (&lock->lock);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_readers);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_writers);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (lock, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (&lock->recmutex, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_recursive_lock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_mutex_lock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_mutex_unlock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_mutex_destroy (&lock->recmutex);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->mutex, NULL);
+ if (err != 0)
+ return err;
+ lock->owner = (pthread_t) 0;
+ lock->depth = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_t self = pthread_self ();
+ if (lock->owner != self)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->mutex);
+ if (err != 0)
+ return err;
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != pthread_self ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = (pthread_t) 0;
+ return pthread_mutex_unlock (&lock->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != (pthread_t) 0)
+ return EBUSY;
+ return pthread_mutex_destroy (&lock->mutex);
+}
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT;
+
+int
+glthread_once_singlethreaded (pthread_once_t *once_control)
+{
+ /* We don't know whether pthread_once_t is an integer type, a floating-point
+ type, a pointer type, or a structure type. */
+ char *firstbyte = (char *)once_control;
+ if (*firstbyte == *(const char *)&fresh_once)
+ {
+ /* First time use of once_control. Invert the first byte. */
+ *firstbyte = ~ *(const char *)&fresh_once;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static void
+glthread_once_call (void *arg)
+{
+ void (**gl_once_temp_addr) (void) = (void (**) (void)) arg;
+ void (*initfunction) (void) = *gl_once_temp_addr;
+ initfunction ();
+}
+
+int
+glthread_once_multithreaded (pth_once_t *once_control, void (*initfunction) (void))
+{
+ void (*temp) (void) = initfunction;
+ return (!pth_once (once_control, glthread_once_call, &temp) ? errno : 0);
+}
+
+int
+glthread_once_singlethreaded (pth_once_t *once_control)
+{
+ /* We know that pth_once_t is an integer type. */
+ if (*once_control == PTH_ONCE_INIT)
+ {
+ /* First time use of once_control. Invert the marker. */
+ *once_control = ~ PTH_ONCE_INIT;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ err = mutex_init (&lock->mutex, USYNC_THREAD, NULL);
+ if (err != 0)
+ return err;
+ lock->owner = (thread_t) 0;
+ lock->depth = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ thread_t self = thr_self ();
+ if (lock->owner != self)
+ {
+ int err;
+
+ err = mutex_lock (&lock->mutex);
+ if (err != 0)
+ return err;
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != thr_self ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = (thread_t) 0;
+ return mutex_unlock (&lock->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != (thread_t) 0)
+ return EBUSY;
+ return mutex_destroy (&lock->mutex);
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+int
+glthread_once_multithreaded (gl_once_t *once_control, void (*initfunction) (void))
+{
+ if (!once_control->inited)
+ {
+ int err;
+
+ /* Use the mutex to guarantee that if another thread is already calling
+ the initfunction, this thread waits until it's finished. */
+ err = mutex_lock (&once_control->mutex);
+ if (err != 0)
+ return err;
+ if (!once_control->inited)
+ {
+ once_control->inited = 1;
+ initfunction ();
+ }
+ return mutex_unlock (&once_control->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_once_singlethreaded (gl_once_t *once_control)
+{
+ /* We know that gl_once_t contains an integer type. */
+ if (!once_control->inited)
+ {
+ /* First time use of once_control. Invert the marker. */
+ once_control->inited = ~ 0;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+void
+glthread_lock_init_func (gl_lock_t *lock)
+{
+ InitializeCriticalSection (&lock->lock);
+ lock->guard.done = 1;
+}
+
+int
+glthread_lock_lock_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_lock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_lock_unlock_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_lock_destroy_func (gl_lock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ DeleteCriticalSection (&lock->lock);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* In this file, the waitqueues are implemented as circular arrays. */
+#define gl_waitqueue_t gl_carray_waitqueue_t
+
+static inline void
+gl_waitqueue_init (gl_waitqueue_t *wq)
+{
+ wq->array = NULL;
+ wq->count = 0;
+ wq->alloc = 0;
+ wq->offset = 0;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+ Returns INVALID_HANDLE_VALUE if an allocation failure occurs. */
+static HANDLE
+gl_waitqueue_add (gl_waitqueue_t *wq)
+{
+ HANDLE event;
+ unsigned int index;
+
+ if (wq->count == wq->alloc)
+ {
+ unsigned int new_alloc = 2 * wq->alloc + 1;
+ HANDLE *new_array =
+ (HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE));
+ if (new_array == NULL)
+ /* No more memory. */
+ return INVALID_HANDLE_VALUE;
+ /* Now is a good opportunity to rotate the array so that its contents
+ starts at offset 0. */
+ if (wq->offset > 0)
+ {
+ unsigned int old_count = wq->count;
+ unsigned int old_alloc = wq->alloc;
+ unsigned int old_offset = wq->offset;
+ unsigned int i;
+ if (old_offset + old_count > old_alloc)
+ {
+ unsigned int limit = old_offset + old_count - old_alloc;
+ for (i = 0; i < limit; i++)
+ new_array[old_alloc + i] = new_array[i];
+ }
+ for (i = 0; i < old_count; i++)
+ new_array[i] = new_array[old_offset + i];
+ wq->offset = 0;
+ }
+ wq->array = new_array;
+ wq->alloc = new_alloc;
+ }
+ /* Whether the created event is a manual-reset one or an auto-reset one,
+ does not matter, since we will wait on it only once. */
+ event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (event == INVALID_HANDLE_VALUE)
+ /* No way to allocate an event. */
+ return INVALID_HANDLE_VALUE;
+ index = wq->offset + wq->count;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ wq->array[index] = event;
+ wq->count++;
+ return event;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it. */
+static inline void
+gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+{
+ SetEvent (wq->array[wq->offset + 0]);
+ wq->offset++;
+ wq->count--;
+ if (wq->count == 0 || wq->offset == wq->alloc)
+ wq->offset = 0;
+}
+
+/* Notifies all threads from a wait queue and dequeues them all. */
+static inline void
+gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+{
+ unsigned int i;
+
+ for (i = 0; i < wq->count; i++)
+ {
+ unsigned int index = wq->offset + i;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ SetEvent (wq->array[index]);
+ }
+ wq->count = 0;
+ wq->offset = 0;
+}
+
+void
+glthread_rwlock_init_func (gl_rwlock_t *lock)
+{
+ InitializeCriticalSection (&lock->lock);
+ gl_waitqueue_init (&lock->waiting_readers);
+ gl_waitqueue_init (&lock->waiting_writers);
+ lock->runcount = 0;
+ lock->guard.done = 1;
+}
+
+int
+glthread_rwlock_rdlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_rwlock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow. */
+ if (!(lock->runcount + 1 > 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ HANDLE event = gl_waitqueue_add (&lock->waiting_readers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_readers, incremented lock->runcount. */
+ if (!(lock->runcount > 0))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount + 1 > 0));
+ }
+ }
+ lock->runcount++;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_wrlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_rwlock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether no readers or writers are currently running. */
+ if (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ HANDLE event = gl_waitqueue_add (&lock->waiting_writers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_writers, set lock->runcount = -1. */
+ if (!(lock->runcount == -1))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount == 0));
+ }
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_unlock_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ EnterCriticalSection (&lock->lock);
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ abort ();
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ LeaveCriticalSection (&lock->lock);
+ return EPERM;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers.count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ lock->runcount--;
+ gl_waitqueue_notify_first (&lock->waiting_writers);
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ lock->runcount += lock->waiting_readers.count;
+ gl_waitqueue_notify_all (&lock->waiting_readers);
+ }
+ }
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glthread_rwlock_destroy_func (gl_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ if (lock->runcount != 0)
+ return EBUSY;
+ DeleteCriticalSection (&lock->lock);
+ if (lock->waiting_readers.array != NULL)
+ free (lock->waiting_readers.array);
+ if (lock->waiting_writers.array != NULL)
+ free (lock->waiting_writers.array);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+void
+glthread_recursive_lock_init_func (gl_recursive_lock_t *lock)
+{
+ lock->owner = 0;
+ lock->depth = 0;
+ InitializeCriticalSection (&lock->lock);
+ lock->guard.done = 1;
+}
+
+int
+glthread_recursive_lock_lock_func (gl_recursive_lock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glthread_recursive_lock_init (lock);
+ else
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ {
+ DWORD self = GetCurrentThreadId ();
+ if (lock->owner != self)
+ {
+ EnterCriticalSection (&lock->lock);
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_func (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != GetCurrentThreadId ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = 0;
+ LeaveCriticalSection (&lock->lock);
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_func (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != 0)
+ return EBUSY;
+ DeleteCriticalSection (&lock->lock);
+ lock->guard.done = 0;
+ return 0;
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+void
+glthread_once_func (gl_once_t *once_control, void (*initfunction) (void))
+{
+ if (once_control->inited <= 0)
+ {
+ if (InterlockedIncrement (&once_control->started) == 0)
+ {
+ /* This thread is the first one to come to this once_control. */
+ InitializeCriticalSection (&once_control->lock);
+ EnterCriticalSection (&once_control->lock);
+ once_control->inited = 0;
+ initfunction ();
+ once_control->inited = 1;
+ LeaveCriticalSection (&once_control->lock);
+ }
+ else
+ {
+ /* Undo last operation. */
+ InterlockedDecrement (&once_control->started);
+ /* Some other thread has already started the initialization.
+ Yield the CPU while waiting for the other thread to finish
+ initializing and taking the lock. */
+ while (once_control->inited < 0)
+ Sleep (0);
+ if (once_control->inited <= 0)
+ {
+ /* Take the lock. This blocks until the other thread has
+ finished calling the initfunction. */
+ EnterCriticalSection (&once_control->lock);
+ LeaveCriticalSection (&once_control->lock);
+ if (!(once_control->inited > 0))
+ abort ();
+ }
+ }
+ }
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/lock.h b/gnulib/lib/glthread/lock.h
new file mode 100644
index 0000000..f764d14
--- /dev/null
+++ b/gnulib/lib/glthread/lock.h
@@ -0,0 +1,928 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+/* This file contains locking primitives for use with a given thread library.
+ It does not contain primitives for creating threads or for other
+ synchronization primitives.
+
+ Normal (non-recursive) locks:
+ Type: gl_lock_t
+ Declaration: gl_lock_define(extern, name)
+ Initializer: gl_lock_define_initialized(, name)
+ Initialization: gl_lock_init (name);
+ Taking the lock: gl_lock_lock (name);
+ Releasing the lock: gl_lock_unlock (name);
+ De-initialization: gl_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_lock_init (&name);
+ Taking the lock: err = glthread_lock_lock (&name);
+ Releasing the lock: err = glthread_lock_unlock (&name);
+ De-initialization: err = glthread_lock_destroy (&name);
+
+ Read-Write (non-recursive) locks:
+ Type: gl_rwlock_t
+ Declaration: gl_rwlock_define(extern, name)
+ Initializer: gl_rwlock_define_initialized(, name)
+ Initialization: gl_rwlock_init (name);
+ Taking the lock: gl_rwlock_rdlock (name);
+ gl_rwlock_wrlock (name);
+ Releasing the lock: gl_rwlock_unlock (name);
+ De-initialization: gl_rwlock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_rwlock_init (&name);
+ Taking the lock: err = glthread_rwlock_rdlock (&name);
+ err = glthread_rwlock_wrlock (&name);
+ Releasing the lock: err = glthread_rwlock_unlock (&name);
+ De-initialization: err = glthread_rwlock_destroy (&name);
+
+ Recursive locks:
+ Type: gl_recursive_lock_t
+ Declaration: gl_recursive_lock_define(extern, name)
+ Initializer: gl_recursive_lock_define_initialized(, name)
+ Initialization: gl_recursive_lock_init (name);
+ Taking the lock: gl_recursive_lock_lock (name);
+ Releasing the lock: gl_recursive_lock_unlock (name);
+ De-initialization: gl_recursive_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_recursive_lock_init (&name);
+ Taking the lock: err = glthread_recursive_lock_lock (&name);
+ Releasing the lock: err = glthread_recursive_lock_unlock (&name);
+ De-initialization: err = glthread_recursive_lock_destroy (&name);
+
+ Once-only execution:
+ Type: gl_once_t
+ Initializer: gl_once_define(extern, name)
+ Execution: gl_once (name, initfunction);
+ Equivalent functions with control of error handling:
+ Execution: err = glthread_once (&name, initfunction);
+*/
+
+
+#ifndef _LOCK_H
+#define _LOCK_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_mutex_init
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+# pragma weak pthread_mutex_destroy
+# pragma weak pthread_rwlock_init
+# pragma weak pthread_rwlock_rdlock
+# pragma weak pthread_rwlock_wrlock
+# pragma weak pthread_rwlock_unlock
+# pragma weak pthread_rwlock_destroy
+# pragma weak pthread_once
+# pragma weak pthread_cond_init
+# pragma weak pthread_cond_wait
+# pragma weak pthread_cond_signal
+# pragma weak pthread_cond_broadcast
+# pragma weak pthread_cond_destroy
+# pragma weak pthread_mutexattr_init
+# pragma weak pthread_mutexattr_settype
+# pragma weak pthread_mutexattr_destroy
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pthread_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ PTHREAD_MUTEX_INITIALIZER
+# define glthread_lock_init(LOCK) \
+ (pthread_in_use () ? pthread_mutex_init (LOCK, NULL) : 0)
+# define glthread_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+# ifdef PTHREAD_RWLOCK_INITIALIZER
+
+typedef pthread_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ PTHREAD_RWLOCK_INITIALIZER
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_rdlock (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_wrlock (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_unlock (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_destroy (LOCK) : 0)
+
+# else
+
+typedef struct
+ {
+ int initialized;
+ pthread_mutex_t guard; /* protects the initialization */
+ pthread_rwlock_t rwlock; /* read-write lock */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { 0, PTHREAD_MUTEX_INITIALIZER }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t lock; /* protects the remaining fields */
+ pthread_cond_t waiting_readers; /* waiting readers */
+ pthread_cond_t waiting_writers; /* waiting writers */
+ unsigned int waiting_writers_count; /* number of waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+typedef pthread_mutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer;
+# ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# else
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+# endif
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t recmutex; /* recursive mutex */
+ pthread_mutex_t guard; /* protects the initialization */
+ int initialized;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+# else
+
+/* Old versions of POSIX threads on Solaris did not have recursive locks.
+ We have to implement them ourselves. */
+
+typedef struct
+ {
+ pthread_mutex_t mutex;
+ pthread_t owner;
+ unsigned long depth;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pthread_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pthread_in_use () \
+ ? pthread_once (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_singlethreaded (pthread_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_mutex_init
+# pragma weak pth_mutex_acquire
+# pragma weak pth_mutex_release
+# pragma weak pth_rwlock_init
+# pragma weak pth_rwlock_acquire
+# pragma weak pth_rwlock_release
+# pragma weak pth_once
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pth_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ PTH_MUTEX_INIT
+# define glthread_lock_init(LOCK) \
+ (pth_in_use () && !pth_mutex_init (LOCK) ? errno : 0)
+# define glthread_lock_lock(LOCK) \
+ (pth_in_use () && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
+# define glthread_lock_unlock(LOCK) \
+ (pth_in_use () && !pth_mutex_release (LOCK) ? errno : 0)
+# define glthread_lock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef pth_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ PTH_RWLOCK_INIT
+# define glthread_rwlock_init(LOCK) \
+ (pth_in_use () && !pth_rwlock_init (LOCK) ? errno : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pth_in_use () && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RD, 0, NULL) ? errno : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pth_in_use () && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RW, 0, NULL) ? errno : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pth_in_use () && !pth_rwlock_release (LOCK) ? errno : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* In Pth, mutexes are recursive by default. */
+typedef pth_mutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ PTH_MUTEX_INIT
+# define glthread_recursive_lock_init(LOCK) \
+ (pth_in_use () && !pth_mutex_init (LOCK) ? errno : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pth_in_use () && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pth_in_use () && !pth_mutex_release (LOCK) ? errno : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ ((void)(LOCK), 0)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pth_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pth_in_use () \
+ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (pth_once_t *once_control, void (*initfunction) (void));
+extern int glthread_once_singlethreaded (pth_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak mutex_init
+# pragma weak mutex_lock
+# pragma weak mutex_unlock
+# pragma weak mutex_destroy
+# pragma weak rwlock_init
+# pragma weak rw_rdlock
+# pragma weak rw_wrlock
+# pragma weak rw_unlock
+# pragma weak rwlock_destroy
+# pragma weak thr_self
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ DEFAULTMUTEX
+# define glthread_lock_init(LOCK) \
+ (thread_in_use () ? mutex_init (LOCK, USYNC_THREAD, NULL) : 0)
+# define glthread_lock_lock(LOCK) \
+ (thread_in_use () ? mutex_lock (LOCK) : 0)
+# define glthread_lock_unlock(LOCK) \
+ (thread_in_use () ? mutex_unlock (LOCK) : 0)
+# define glthread_lock_destroy(LOCK) \
+ (thread_in_use () ? mutex_destroy (LOCK) : 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ DEFAULTRWLOCK
+# define glthread_rwlock_init(LOCK) \
+ (thread_in_use () ? rwlock_init (LOCK, USYNC_THREAD, NULL) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (thread_in_use () ? rw_rdlock (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (thread_in_use () ? rw_wrlock (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (thread_in_use () ? rw_unlock (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (thread_in_use () ? rwlock_destroy (LOCK) : 0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* Old Solaris threads did not have recursive locks.
+ We have to implement them ourselves. */
+
+typedef struct
+ {
+ mutex_t mutex;
+ thread_t owner;
+ unsigned long depth;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { DEFAULTMUTEX, (thread_t) 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (thread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+ {
+ volatile int inited;
+ mutex_t mutex;
+ }
+ gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX };
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (thread_in_use () \
+ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (gl_once_t *once_control, void (*initfunction) (void));
+extern int glthread_once_singlethreaded (gl_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* We can use CRITICAL_SECTION directly, rather than the Win32 Event, Mutex,
+ Semaphore types, because
+ - we need only to synchronize inside a single process (address space),
+ not inter-process locking,
+ - we don't need to support trylock operations. (TryEnterCriticalSection
+ does not work on Windows 95/98/ME. Packages that need trylock usually
+ define their own mutex type.) */
+
+/* There is no way to statically initialize a CRITICAL_SECTION. It needs
+ to be done lazily, once only. For this we need spinlocks. */
+
+typedef struct { volatile int done; volatile long started; } gl_spinlock_t;
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock;
+ }
+ gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ { { 0, -1 } }
+# define glthread_lock_init(LOCK) \
+ (glthread_lock_init_func (LOCK), 0)
+# define glthread_lock_lock(LOCK) \
+ glthread_lock_lock_func (LOCK)
+# define glthread_lock_unlock(LOCK) \
+ glthread_lock_unlock_func (LOCK)
+# define glthread_lock_destroy(LOCK) \
+ glthread_lock_destroy_func (LOCK)
+extern void glthread_lock_init_func (gl_lock_t *lock);
+extern int glthread_lock_lock_func (gl_lock_t *lock);
+extern int glthread_lock_unlock_func (gl_lock_t *lock);
+extern int glthread_lock_destroy_func (gl_lock_t *lock);
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* It is impossible to implement read-write locks using plain locks, without
+ introducing an extra thread dedicated to managing read-write locks.
+ Therefore here we need to use the low-level Event type. */
+
+typedef struct
+ {
+ HANDLE *array; /* array of waiting threads, each represented by an event */
+ unsigned int count; /* number of waiting threads */
+ unsigned int alloc; /* length of allocated array */
+ unsigned int offset; /* index of first waiting thread in array */
+ }
+ gl_carray_waitqueue_t;
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock; /* protects the remaining fields */
+ gl_carray_waitqueue_t waiting_readers; /* waiting readers */
+ gl_carray_waitqueue_t waiting_writers; /* waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { { 0, -1 } }
+# define glthread_rwlock_init(LOCK) \
+ (glthread_rwlock_init_func (LOCK), 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ glthread_rwlock_rdlock_func (LOCK)
+# define glthread_rwlock_wrlock(LOCK) \
+ glthread_rwlock_wrlock_func (LOCK)
+# define glthread_rwlock_unlock(LOCK) \
+ glthread_rwlock_unlock_func (LOCK)
+# define glthread_rwlock_destroy(LOCK) \
+ glthread_rwlock_destroy_func (LOCK)
+extern void glthread_rwlock_init_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_func (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_func (gl_rwlock_t *lock);
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* The Win32 documentation says that CRITICAL_SECTION already implements a
+ recursive lock. But we need not rely on it: It's easy to implement a
+ recursive lock without this assumption. */
+
+typedef struct
+ {
+ gl_spinlock_t guard; /* protects the initialization */
+ DWORD owner;
+ unsigned long depth;
+ CRITICAL_SECTION lock;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { { 0, -1 }, 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (glthread_recursive_lock_init_func (LOCK), 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ glthread_recursive_lock_lock_func (LOCK)
+# define glthread_recursive_lock_unlock(LOCK) \
+ glthread_recursive_lock_unlock_func (LOCK)
+# define glthread_recursive_lock_destroy(LOCK) \
+ glthread_recursive_lock_destroy_func (LOCK)
+extern void glthread_recursive_lock_init_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_func (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_func (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+ {
+ volatile int inited;
+ volatile long started;
+ CRITICAL_SECTION lock;
+ }
+ gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = { -1, -1 };
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (glthread_once_func (ONCE_CONTROL, INITFUNCTION), 0)
+extern void glthread_once_func (gl_once_t *once_control, void (*initfunction) (void));
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef int gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME)
+# define gl_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_lock_init(NAME) 0
+# define glthread_lock_lock(NAME) 0
+# define glthread_lock_unlock(NAME) 0
+# define glthread_lock_destroy(NAME) 0
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef int gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME)
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME)
+# define glthread_rwlock_init(NAME) 0
+# define glthread_rwlock_rdlock(NAME) 0
+# define glthread_rwlock_wrlock(NAME) 0
+# define glthread_rwlock_unlock(NAME) 0
+# define glthread_rwlock_destroy(NAME) 0
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef int gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME)
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_recursive_lock_init(NAME) 0
+# define glthread_recursive_lock_lock(NAME) 0
+# define glthread_recursive_lock_unlock(NAME) 0
+# define glthread_recursive_lock_destroy(NAME) 0
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef int gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = 0;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (*(ONCE_CONTROL) == 0 ? (*(ONCE_CONTROL) = ~ 0, INITFUNCTION (), 0) : 0)
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+#define gl_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+#define gl_rwlock_init(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_rdlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_rdlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_wrlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_wrlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+#define gl_recursive_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+#define gl_once(NAME, INITFUNCTION) \
+ do \
+ { \
+ if (glthread_once (&NAME, INITFUNCTION)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ========================================================================= */
+
+#endif /* _LOCK_H */
diff --git a/gnulib/lib/glthread/thread.c b/gnulib/lib/glthread/thread.c
new file mode 100644
index 0000000..d6af6f3
--- /dev/null
+++ b/gnulib/lib/glthread/thread.c
@@ -0,0 +1,232 @@
+/* Creating and controlling threads.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "glthread/thread.h"
+
+#include <stdlib.h>
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+#include <pthread.h>
+
+#ifdef PTW32_VERSION
+
+const gl_thread_t gl_null_thread /* = { .p = NULL } */;
+
+#endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#include <process.h>
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* The Thread-Local Storage (TLS) key that allows to access each thread's
+ 'struct gl_thread_struct *' pointer. */
+static DWORD self_key = (DWORD)-1;
+
+/* Initializes self_key. This function must only be called once. */
+static void
+do_init_self_key (void)
+{
+ self_key = TlsAlloc ();
+ /* If this fails, we're hosed. */
+ if (self_key == (DWORD)-1)
+ abort ();
+}
+
+/* Initializes self_key. */
+static void
+init_self_key (void)
+{
+ gl_once_define(static, once)
+ gl_once (once, do_init_self_key);
+}
+
+/* This structure contains information about a thread.
+ It is stored in TLS under key self_key. */
+struct gl_thread_struct
+{
+ /* Fields for managing the handle. */
+ HANDLE volatile handle;
+ CRITICAL_SECTION handle_lock;
+ /* Fields for managing the exit value. */
+ void * volatile result;
+ /* Fields for managing the thread start. */
+ void * (*func) (void *);
+ void *arg;
+};
+
+/* Return a real HANDLE object for the current thread. */
+static inline HANDLE
+get_current_thread_handle (void)
+{
+ HANDLE this_handle;
+
+ /* GetCurrentThread() returns a pseudo-handle, i.e. only a symbolic
+ identifier, not a real handle. */
+ if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
+ GetCurrentProcess (), &this_handle,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ abort ();
+ return this_handle;
+}
+
+gl_thread_t
+gl_thread_self_func (void)
+{
+ gl_thread_t thread;
+
+ if (self_key == (DWORD)-1)
+ init_self_key ();
+ thread = TlsGetValue (self_key);
+ if (thread == NULL)
+ {
+ /* This happens only in threads that have not been created through
+ glthread_create(), such as the main thread. */
+ for (;;)
+ {
+ thread =
+ (struct gl_thread_struct *)
+ malloc (sizeof (struct gl_thread_struct));
+ if (thread != NULL)
+ break;
+ /* Memory allocation failed. There is not much we can do. Have to
+ busy-loop, waiting for the availability of memory. */
+ Sleep (1);
+ }
+
+ thread->handle = get_current_thread_handle ();
+ InitializeCriticalSection (&thread->handle_lock);
+ thread->result = NULL; /* just to be deterministic */
+ TlsSetValue (self_key, thread);
+ }
+ return thread;
+}
+
+/* The main function of a freshly creating thread. It's a wrapper around
+ the FUNC and ARG arguments passed to glthread_create_func. */
+static unsigned int WINAPI
+wrapper_func (void *varg)
+{
+ struct gl_thread_struct *thread = (struct gl_thread_struct *)varg;
+
+ EnterCriticalSection (&thread->handle_lock);
+ /* Create a new handle for the thread only if the parent thread did not yet
+ fill in the handle. */
+ if (thread->handle == NULL)
+ thread->handle = get_current_thread_handle ();
+ LeaveCriticalSection (&thread->handle_lock);
+
+ if (self_key == (DWORD)-1)
+ init_self_key ();
+ TlsSetValue (self_key, thread);
+
+ /* Run the thread. Store the exit value if the thread was not terminated
+ otherwise. */
+ thread->result = thread->func (thread->arg);
+ return 0;
+}
+
+int
+glthread_create_func (gl_thread_t *threadp, void * (*func) (void *), void *arg)
+{
+ struct gl_thread_struct *thread =
+ (struct gl_thread_struct *) malloc (sizeof (struct gl_thread_struct));
+ if (thread == NULL)
+ return ENOMEM;
+ thread->handle = NULL;
+ InitializeCriticalSection (&thread->handle_lock);
+ thread->result = NULL; /* just to be deterministic */
+ thread->func = func;
+ thread->arg = arg;
+
+ {
+ unsigned int thread_id;
+ HANDLE thread_handle;
+
+ thread_handle = (HANDLE)
+ _beginthreadex (NULL, 100000, wrapper_func, thread, 0, &thread_id);
+ /* calls CreateThread with the same arguments */
+ if (thread_handle == NULL)
+ {
+ DeleteCriticalSection (&thread->handle_lock);
+ free (thread);
+ return EAGAIN;
+ }
+
+ EnterCriticalSection (&thread->handle_lock);
+ if (thread->handle == NULL)
+ thread->handle = thread_handle;
+ else
+ /* thread->handle was already set by the thread itself. */
+ CloseHandle (thread_handle);
+ LeaveCriticalSection (&thread->handle_lock);
+
+ *threadp = thread;
+ return 0;
+ }
+}
+
+int
+glthread_join_func (gl_thread_t thread, void **retvalp)
+{
+ if (thread == NULL)
+ return EINVAL;
+
+ if (thread == gl_thread_self ())
+ return EDEADLK;
+
+ if (WaitForSingleObject (thread->handle, INFINITE) == WAIT_FAILED)
+ return EINVAL;
+
+ if (retvalp != NULL)
+ *retvalp = thread->result;
+
+ DeleteCriticalSection (&thread->handle_lock);
+ CloseHandle (thread->handle);
+ free (thread);
+
+ return 0;
+}
+
+int
+gl_thread_exit_func (void *retval)
+{
+ gl_thread_t thread = gl_thread_self ();
+ thread->result = retval;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/thread.h b/gnulib/lib/glthread/thread.h
new file mode 100644
index 0000000..be13ed9
--- /dev/null
+++ b/gnulib/lib/glthread/thread.h
@@ -0,0 +1,401 @@
+/* Creating and controlling threads.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+ gthr-win32.h. */
+
+/* This file contains primitives for creating and controlling threads.
+
+ Thread data type: gl_thread_t.
+
+ Creating a thread:
+ thread = gl_thread_create (func, arg);
+ Or with control of error handling:
+ err = glthread_create (&thread, func, arg);
+ extern int glthread_create (gl_thread_t *result,
+ void *(*func) (void *), void *arg);
+
+ Querying and changing the signal mask of a thread (not supported on all
+ platforms):
+ gl_thread_sigmask (how, newmask, oldmask);
+ Or with control of error handling:
+ err = glthread_sigmask (how, newmask, oldmask);
+ extern int glthread_sigmask (int how, const sigset_t *newmask, sigset_t *oldmask);
+
+ Waiting for termination of another thread:
+ gl_thread_join (thread, &return_value);
+ Or with control of error handling:
+ err = glthread_join (thread, &return_value);
+ extern int glthread_join (gl_thread_t thread, void **return_value_ptr);
+
+ Getting a reference to the current thread:
+ current = gl_thread_self ();
+ extern gl_thread_t gl_thread_self (void);
+
+ Getting a reference to the current thread as a pointer, for debugging:
+ ptr = gl_thread_self_pointer ();
+ extern void * gl_thread_self_pointer (void);
+
+ Terminating the current thread:
+ gl_thread_exit (return_value);
+ extern _Noreturn void gl_thread_exit (void *return_value);
+
+ Requesting custom code to be executed at fork() time(not supported on all
+ platforms):
+ gl_thread_atfork (prepare_func, parent_func, child_func);
+ Or with control of error handling:
+ err = glthread_atfork (prepare_func, parent_func, child_func);
+ extern int glthread_atfork (void (*prepare_func) (void),
+ void (*parent_func) (void),
+ void (*child_func) (void));
+ Note that even on platforms where this is supported, use of fork() and
+ threads together is problematic, see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2008-08/msg00062.html>
+ */
+
+
+#ifndef _GLTHREAD_THREAD_H
+#define _GLTHREAD_THREAD_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_create
+# pragma weak pthread_sigmask
+# pragma weak pthread_join
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+# pragma weak pthread_exit
+# if HAVE_PTHREAD_ATFORK
+# pragma weak pthread_atfork
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* This choice of gl_thread_t assumes that
+ pthread_equal (a, b) is equivalent to ((a) == (b)).
+ This is the case on all platforms in use in 2008. */
+typedef pthread_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (pthread_in_use () ? pthread_create (THREADP, NULL, FUNC, ARG) : ENOSYS)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (pthread_in_use () ? pthread_sigmask (HOW, SET, OSET) : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (pthread_in_use () ? pthread_join (THREAD, RETVALP) : 0)
+# ifdef PTW32_VERSION
+ /* In pthreads-win32, pthread_t is a struct with a pointer field 'p' and
+ other fields. */
+# define gl_thread_self() \
+ (pthread_in_use () ? pthread_self () : gl_null_thread)
+# define gl_thread_self_pointer() \
+ (pthread_in_use () ? pthread_self ().p : NULL)
+extern const gl_thread_t gl_null_thread;
+# else
+# define gl_thread_self() \
+ (pthread_in_use () ? pthread_self () : (pthread_t) NULL)
+# define gl_thread_self_pointer() \
+ (pthread_in_use () ? (void *) pthread_self () : NULL)
+# endif
+# define gl_thread_exit(RETVAL) \
+ (pthread_in_use () ? pthread_exit (RETVAL) : 0)
+
+# if HAVE_PTHREAD_ATFORK
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) \
+ (pthread_in_use () ? pthread_atfork (PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) : 0)
+# else
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_spawn
+# pragma weak pth_sigmask
+# pragma weak pth_join
+# pragma weak pth_self
+# pragma weak pth_exit
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+typedef pth_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (pth_in_use () ? ((*(THREADP) = pth_spawn (NULL, FUNC, ARG)) ? 0 : errno) : 0)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (pth_in_use () && !pth_sigmask (HOW, SET, OSET) ? errno : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (pth_in_use () && !pth_join (THREAD, RETVALP) ? errno : 0)
+# define gl_thread_self() \
+ (pth_in_use () ? (void *) pth_self () : NULL)
+# define gl_thread_self_pointer() \
+ gl_thread_self ()
+# define gl_thread_exit(RETVAL) \
+ (pth_in_use () ? pth_exit (RETVAL) : 0)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+# include <synch.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak thr_create
+# pragma weak thr_join
+# pragma weak thr_self
+# pragma weak thr_exit
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+typedef thread_t gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ (thread_in_use () ? thr_create (NULL, 0, FUNC, ARG, 0, THREADP) : 0)
+# define glthread_sigmask(HOW, SET, OSET) \
+ (thread_in_use () ? sigprocmask (HOW, SET, OSET) : 0)
+# define glthread_join(THREAD, RETVALP) \
+ (thread_in_use () ? thr_join (THREAD, NULL, RETVALP) : 0)
+# define gl_thread_self() \
+ (thread_in_use () ? (void *) thr_self () : NULL)
+# define gl_thread_self_pointer() \
+ gl_thread_self ()
+# define gl_thread_exit(RETVAL) \
+ (thread_in_use () ? thr_exit (RETVAL) : 0)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* -------------------------- gl_thread_t datatype -------------------------- */
+
+/* The gl_thread_t is a pointer to a structure in memory.
+ Why not the thread handle? If it were the thread handle, it would be hard
+ to implement gl_thread_self() (since GetCurrentThread () returns a pseudo-
+ handle, DuplicateHandle (GetCurrentThread ()) returns a handle that must be
+ closed afterwards, and there is no function for quickly retrieving a thread
+ handle from its id).
+ Why not the thread id? I tried it. It did not work: Sometimes ids appeared
+ that did not belong to running threads, and glthread_join failed with ESRCH.
+ */
+typedef struct gl_thread_struct *gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) \
+ glthread_create_func (THREADP, FUNC, ARG)
+# define glthread_sigmask(HOW, SET, OSET) \
+ /* unsupported */ 0
+# define glthread_join(THREAD, RETVALP) \
+ glthread_join_func (THREAD, RETVALP)
+# define gl_thread_self() \
+ gl_thread_self_func ()
+# define gl_thread_self_pointer() \
+ gl_thread_self ()
+# define gl_thread_exit(RETVAL) \
+ gl_thread_exit_func (RETVAL)
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+extern int glthread_create_func (gl_thread_t *threadp, void * (*func) (void *), void *arg);
+extern int glthread_join_func (gl_thread_t thread, void **retvalp);
+extern gl_thread_t gl_thread_self_func (void);
+extern int gl_thread_exit_func (void *retval);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+typedef int gl_thread_t;
+# define glthread_create(THREADP, FUNC, ARG) ENOSYS
+# define glthread_sigmask(HOW, SET, OSET) 0
+# define glthread_join(THREAD, RETVALP) 0
+# define gl_thread_self() 0
+# define gl_thread_self_pointer() \
+ ((void *) gl_thread_self ())
+# define gl_thread_exit(RETVAL) 0
+# define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline gl_thread_t
+gl_thread_create (void *(*func) (void *arg), void *arg)
+{
+ gl_thread_t thread;
+ int ret;
+
+ ret = glthread_create (&thread, func, arg);
+ if (ret != 0)
+ abort ();
+ return thread;
+}
+#define gl_thread_sigmask(HOW, SET, OSET) \
+ do \
+ { \
+ if (glthread_sigmask (HOW, SET, OSET)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_thread_join(THREAD, RETVAL) \
+ do \
+ { \
+ if (glthread_join (THREAD, RETVAL)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_thread_atfork(PREPARE, PARENT, CHILD) \
+ do \
+ { \
+ if (glthread_atfork (PREPARE, PARENT, CHILD)) \
+ abort (); \
+ } \
+ while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GLTHREAD_THREAD_H */
diff --git a/gnulib/lib/glthread/threadlib.c b/gnulib/lib/glthread/threadlib.c
new file mode 100644
index 0000000..a8259dc
--- /dev/null
+++ b/gnulib/lib/glthread/threadlib.c
@@ -0,0 +1,74 @@
+/* Multithreading primitives.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+# include <stdlib.h>
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The function to be executed by a dummy thread. */
+static void *
+dummy_thread_func (void *arg)
+{
+ return arg;
+}
+
+int
+glthread_in_use (void)
+{
+ static int tested;
+ static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+ if (!tested)
+ {
+ pthread_t thread;
+
+ if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
+ /* Thread creation failed. */
+ result = 0;
+ else
+ {
+ /* Thread creation works. */
+ void *retval;
+ if (pthread_join (thread, &retval) != 0)
+ abort ();
+ result = 1;
+ }
+ tested = 1;
+ }
+ return result;
+}
+
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
diff --git a/gnulib/lib/glthread/tls.c b/gnulib/lib/glthread/tls.c
new file mode 100644
index 0000000..9738ff1
--- /dev/null
+++ b/gnulib/lib/glthread/tls.c
@@ -0,0 +1,61 @@
+/* Thread-local storage in multithreaded situations.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+#include "glthread/tls.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+void *
+glthread_tls_get_multithreaded (thread_key_t key)
+{
+ void *value;
+
+ if (thr_getspecific (key, &value) != 0)
+ abort ();
+ return value;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+#endif
+
+/* ========================================================================= */
diff --git a/gnulib/lib/glthread/tls.h b/gnulib/lib/glthread/tls.h
new file mode 100644
index 0000000..4f39986
--- /dev/null
+++ b/gnulib/lib/glthread/tls.h
@@ -0,0 +1,299 @@
+/* Thread-local storage in multithreaded situations.
+ Copyright (C) 2005, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+/* This file contains thread-local storage primitives for use with a given
+ thread library. It does not contain primitives for creating threads or
+ for other multithreading primitives.
+
+ Type: gl_tls_key_t
+ Initialization: gl_tls_key_init (name, destructor);
+ Getting per-thread value: gl_tls_get (name)
+ Setting per-thread value: gl_tls_set (name, pointer);
+ De-initialization: gl_tls_key_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_tls_key_init (&name, destructor);
+ Setting per-thread value: err = glthread_tls_set (&name, pointer);
+ De-initialization: err = glthread_tls_key_destroy (&name);
+
+ A per-thread value is of type 'void *'.
+
+ A destructor is a function pointer of type 'void (*) (void *)', called
+ when a thread exits, and taking the last per-thread value as argument. It
+ is unspecified whether the destructor function is called when the last
+ per-thread value is NULL. On some platforms, the destructor function is
+ not called at all.
+*/
+
+
+#ifndef _TLS_H
+#define _TLS_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+# pragma weak pthread_key_create
+# pragma weak pthread_getspecific
+# pragma weak pthread_setspecific
+# pragma weak pthread_key_delete
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# pragma weak pthread_cancel
+# define pthread_in_use() (pthread_cancel != NULL)
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ pthread_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (pthread_in_use () \
+ ? pthread_key_create (&(KEY)->key, DESTRUCTOR) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (pthread_in_use () \
+ ? pthread_getspecific ((NAME).key) \
+ : (NAME).singlethread_value)
+# define glthread_tls_set(KEY, POINTER) \
+ (pthread_in_use () \
+ ? pthread_setspecific ((KEY)->key, (POINTER)) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ (pthread_in_use () ? pthread_key_delete ((KEY)->key) : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library. */
+
+# pragma weak pth_key_create
+# pragma weak pth_key_getdata
+# pragma weak pth_key_setdata
+# pragma weak pth_key_delete
+
+# pragma weak pth_cancel
+# define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+# define pth_in_use() 1
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ pth_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (pth_in_use () \
+ ? (!pth_key_create (&(KEY)->key, DESTRUCTOR) ? errno : 0) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (pth_in_use () \
+ ? pth_key_getdata ((NAME).key) \
+ : (NAME).singlethread_value)
+# define glthread_tls_set(KEY, POINTER) \
+ (pth_in_use () \
+ ? (!pth_key_setdata ((KEY)->key, (POINTER)) ? errno : 0) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ (pth_in_use () \
+ ? (!pth_key_delete ((KEY)->key) ? errno : 0) \
+ : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library. */
+
+# pragma weak thr_keycreate
+# pragma weak thr_getspecific
+# pragma weak thr_setspecific
+
+# pragma weak thr_suspend
+# define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+# define thread_in_use() 1
+
+# endif
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef union
+ {
+ void *singlethread_value;
+ thread_key_t key;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ (thread_in_use () \
+ ? thr_keycreate (&(KEY)->key, DESTRUCTOR) \
+ : ((KEY)->singlethread_value = NULL, 0))
+# define gl_tls_get(NAME) \
+ (thread_in_use () \
+ ? glthread_tls_get_multithreaded ((NAME).key) \
+ : (NAME).singlethread_value)
+extern void *glthread_tls_get_multithreaded (thread_key_t key);
+# define glthread_tls_set(KEY, POINTER) \
+ (thread_in_use () \
+ ? thr_setspecific ((KEY)->key, (POINTER)) \
+ : ((KEY)->singlethread_value = (POINTER), 0))
+# define glthread_tls_key_destroy(KEY) \
+ /* Unsupported. */ \
+ 0
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef DWORD gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ /* The destructor is unsupported. */ \
+ ((*(KEY) = TlsAlloc ()) == (DWORD)-1 ? EAGAIN : ((void) (DESTRUCTOR), 0))
+# define gl_tls_get(NAME) \
+ TlsGetValue (NAME)
+# define glthread_tls_set(KEY, POINTER) \
+ (!TlsSetValue (*(KEY), POINTER) ? EINVAL : 0)
+# define glthread_tls_key_destroy(KEY) \
+ (!TlsFree (*(KEY)) ? EINVAL : 0)
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+typedef struct
+ {
+ void *singlethread_value;
+ }
+ gl_tls_key_t;
+# define glthread_tls_key_init(KEY, DESTRUCTOR) \
+ ((KEY)->singlethread_value = NULL, \
+ (void) (DESTRUCTOR), \
+ 0)
+# define gl_tls_get(NAME) \
+ (NAME).singlethread_value
+# define glthread_tls_set(KEY, POINTER) \
+ ((KEY)->singlethread_value = (POINTER), 0)
+# define glthread_tls_key_destroy(KEY) \
+ 0
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+/* ------------------------- gl_tls_key_t datatype ------------------------- */
+
+#define gl_tls_key_init(NAME, DESTRUCTOR) \
+ do \
+ { \
+ if (glthread_tls_key_init (&NAME, DESTRUCTOR)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_tls_set(NAME, POINTER) \
+ do \
+ { \
+ if (glthread_tls_set (&NAME, POINTER)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_tls_key_destroy(NAME) \
+ do \
+ { \
+ if (glthread_tls_key_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ========================================================================= */
+
+#endif /* _TLS_H */
diff --git a/gnulib/lib/glthread/yield.h b/gnulib/lib/glthread/yield.h
new file mode 100644
index 0000000..0482315
--- /dev/null
+++ b/gnulib/lib/glthread/yield.h
@@ -0,0 +1,122 @@
+/* Yielding the processor to other threads and processes.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file contains a primitive for yielding the processor to other threads.
+ extern void gl_thread_yield (void);
+ */
+
+#ifndef _GLTHREAD_YIELD_H
+#define _GLTHREAD_YIELD_H
+
+#include <errno.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <sched.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ sched_yield ()
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library. */
+
+# include <pth.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ pth_yield (NULL)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library. */
+
+# include <thread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ thr_yield ()
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define gl_thread_yield() \
+ Sleep (0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+# define gl_thread_yield() 0
+
+#endif
+
+/* ========================================================================= */
+
+#endif /* _GLTHREAD_YIELD_H */
diff --git a/gnulib/lib/grantpt.c b/gnulib/lib/grantpt.c
new file mode 100644
index 0000000..b757044
--- /dev/null
+++ b/gnulib/lib/grantpt.c
@@ -0,0 +1,123 @@
+/* Acquire ownership of the slave side of a pseudo-terminal.
+ Copyright (C) 1998-2002, 2009-2011 Free Software Foundation, Inc.
+ Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#if HAVE_SETRLIMIT
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif
+
+#include "configmake.h"
+#include "pty-private.h"
+
+#ifndef _LIBC
+# define __builtin_expect(expr,val) (expr)
+# define __set_errno(e) errno = (e)
+# define __dup2 dup2
+# define __fork fork
+# define __setrlimit setrlimit
+# define __waitpid waitpid
+#endif
+
+int
+grantpt (int fd)
+{
+#if defined __OpenBSD__
+ /* On OpenBSD, master and slave of a pseudo-terminal are allocated together,
+ through an ioctl on /dev/ptm. There is no need for grantpt(). */
+ if (fcntl (fd, F_GETFD) < 0)
+ return -1;
+ return 0;
+#else
+ /* This function is most often called from a process without 'root'
+ credentials. Use the helper program. */
+ int retval = -1;
+ pid_t pid = __fork ();
+ if (pid == -1)
+ goto cleanup;
+ else if (pid == 0)
+ {
+ /* This is executed in the child process. */
+
+# if HAVE_SETRLIMIT && defined RLIMIT_CORE
+ /* Disable core dumps. */
+ struct rlimit rl = { 0, 0 };
+ __setrlimit (RLIMIT_CORE, &rl);
+# endif
+
+ /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */
+ if (fd != PTY_FILENO)
+ if (__dup2 (fd, PTY_FILENO) < 0)
+ _exit (FAIL_EBADF);
+
+# ifdef CLOSE_ALL_FDS
+ CLOSE_ALL_FDS ();
+# endif
+
+ execle (_PATH_PT_CHOWN, strrchr (_PATH_PT_CHOWN, '/') + 1, NULL, NULL);
+ _exit (FAIL_EXEC);
+ }
+ else
+ {
+ int w;
+
+ if (__waitpid (pid, &w, 0) == -1)
+ goto cleanup;
+ if (!WIFEXITED (w))
+ __set_errno (ENOEXEC);
+ else
+ switch (WEXITSTATUS (w))
+ {
+ case 0:
+ retval = 0;
+ break;
+ case FAIL_EBADF:
+ __set_errno (EBADF);
+ break;
+ case FAIL_EINVAL:
+ __set_errno (EINVAL);
+ break;
+ case FAIL_EACCES:
+ __set_errno (EACCES);
+ break;
+ case FAIL_EXEC:
+ __set_errno (ENOEXEC);
+ break;
+ case FAIL_ENOMEM:
+ __set_errno (ENOMEM);
+ break;
+
+ default:
+ assert(! "getpt: internal error: invalid exit code from pt_chown");
+ }
+ }
+
+ cleanup:
+ return retval;
+#endif
+}
diff --git a/gnulib/lib/group-member.c b/gnulib/lib/group-member.c
new file mode 100644
index 0000000..cc787d1
--- /dev/null
+++ b/gnulib/lib/group-member.c
@@ -0,0 +1,124 @@
+/* group-member.c -- determine whether group id is in calling user's group list
+
+ Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "xalloc.h"
+
+struct group_info
+ {
+ int n_groups;
+ gid_t *group;
+ };
+
+static void
+free_group_info (struct group_info const *g)
+{
+ free (g->group);
+}
+
+static bool
+get_group_info (struct group_info *gi)
+{
+ int n_groups;
+ int n_group_slots = getgroups (0, NULL);
+ gid_t *group;
+
+ if (n_group_slots < 0)
+ return false;
+
+ /* Avoid xnmalloc, as it goes awry when SIZE_MAX < n_group_slots. */
+ if (xalloc_oversized (n_group_slots, sizeof *group))
+ xalloc_die ();
+ group = xmalloc (n_group_slots * sizeof *group);
+ n_groups = getgroups (n_group_slots, group);
+
+ /* In case of error, the user loses. */
+ if (n_groups < 0)
+ {
+ free (group);
+ return false;
+ }
+
+ gi->n_groups = n_groups;
+ gi->group = group;
+
+ return true;
+}
+
+/* Return non-zero if GID is one that we have in our groups list.
+ Note that the groups list is not guaranteed to contain the current
+ or effective group ID, so they should generally be checked
+ separately. */
+
+int
+group_member (gid_t gid)
+{
+ int i;
+ int found;
+ struct group_info gi;
+
+ if (! get_group_info (&gi))
+ return 0;
+
+ /* Search through the list looking for GID. */
+ found = 0;
+ for (i = 0; i < gi.n_groups; i++)
+ {
+ if (gid == gi.group[i])
+ {
+ found = 1;
+ break;
+ }
+ }
+
+ free_group_info (&gi);
+
+ return found;
+}
+
+#ifdef TEST
+
+char *program_name;
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ program_name = argv[0];
+
+ for (i = 1; i < argc; i++)
+ {
+ gid_t gid;
+
+ gid = atoi (argv[i]);
+ printf ("%d: %s\n", gid, group_member (gid) ? "yes" : "no");
+ }
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/hard-locale.c b/gnulib/lib/hard-locale.c
new file mode 100644
index 0000000..26e614b
--- /dev/null
+++ b/gnulib/lib/hard-locale.c
@@ -0,0 +1,72 @@
+/* hard-locale.c -- Determine whether a locale is hard.
+
+ Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "hard-locale.h"
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __GLIBC__
+# define GLIBC_VERSION __GLIBC__
+#elif defined __UCLIBC__
+# define GLIBC_VERSION 2
+#else
+# define GLIBC_VERSION 0
+#endif
+
+/* Return true if the current CATEGORY locale is hard, i.e. if you
+ can't get away with assuming traditional C or POSIX behavior. */
+bool
+hard_locale (int category)
+{
+ bool hard = true;
+ char const *p = setlocale (category, NULL);
+
+ if (p)
+ {
+ if (2 <= GLIBC_VERSION)
+ {
+ if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0)
+ hard = false;
+ }
+ else
+ {
+ char *locale = strdup (p);
+ if (locale)
+ {
+ /* Temporarily set the locale to the "C" and "POSIX" locales
+ to find their names, so that we can determine whether one
+ or the other is the caller's locale. */
+ if (((p = setlocale (category, "C"))
+ && strcmp (p, locale) == 0)
+ || ((p = setlocale (category, "POSIX"))
+ && strcmp (p, locale) == 0))
+ hard = false;
+
+ /* Restore the caller's locale. */
+ setlocale (category, locale);
+ free (locale);
+ }
+ }
+ }
+
+ return hard;
+}
diff --git a/gnulib/lib/hard-locale.h b/gnulib/lib/hard-locale.h
new file mode 100644
index 0000000..7540628
--- /dev/null
+++ b/gnulib/lib/hard-locale.h
@@ -0,0 +1,25 @@
+/* Determine whether a locale is hard.
+
+ Copyright (C) 1999, 2003-2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef HARD_LOCALE_H_
+# define HARD_LOCALE_H_ 1
+
+# include <stdbool.h>
+
+bool hard_locale (int);
+
+#endif /* HARD_LOCALE_H_ */
diff --git a/gnulib/lib/hash-pjw.c b/gnulib/lib/hash-pjw.c
new file mode 100644
index 0000000..743bb57
--- /dev/null
+++ b/gnulib/lib/hash-pjw.c
@@ -0,0 +1,40 @@
+/* hash-pjw.c -- compute a hash value from a NUL-terminated string.
+
+ Copyright (C) 2001, 2003, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "hash-pjw.h"
+
+#include <limits.h>
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+
+size_t
+hash_pjw (const void *x, size_t tablesize)
+{
+ const char *s;
+ size_t h = 0;
+
+ for (s = x; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h % tablesize;
+}
diff --git a/gnulib/lib/hash-pjw.h b/gnulib/lib/hash-pjw.h
new file mode 100644
index 0000000..36b776a
--- /dev/null
+++ b/gnulib/lib/hash-pjw.h
@@ -0,0 +1,23 @@
+/* hash-pjw.h -- declaration for a simple hash function
+ Copyright (C) 2001, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+/* Compute a hash code for a NUL-terminated string starting at X,
+ and return the hash code modulo TABLESIZE.
+ The result is platform dependent: it depends on the size of the 'size_t'
+ type and on the signedness of the 'char' type. */
+extern size_t hash_pjw (void const *x, size_t tablesize) _GL_ATTRIBUTE_PURE;
diff --git a/gnulib/lib/hash-triple.c b/gnulib/lib/hash-triple.c
new file mode 100644
index 0000000..1649377
--- /dev/null
+++ b/gnulib/lib/hash-triple.c
@@ -0,0 +1,77 @@
+/* Hash functions for file-related triples: name, device, inode.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "hash-triple.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hash-pjw.h"
+#include "same.h"
+#include "same-inode.h"
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Hash an F_triple, and *do* consider the file name. */
+size_t
+triple_hash (void const *x, size_t table_size)
+{
+ struct F_triple const *p = x;
+ size_t tmp = hash_pjw (p->name, table_size);
+
+ /* Ignoring the device number here should be fine. */
+ return (tmp ^ p->st_ino) % table_size;
+}
+
+/* Hash an F_triple, without considering the file name. */
+size_t
+triple_hash_no_name (void const *x, size_t table_size)
+{
+ struct F_triple const *p = x;
+
+ /* Ignoring the device number here should be fine. */
+ return p->st_ino % table_size;
+}
+
+/* Compare two F_triple structs. */
+bool
+triple_compare (void const *x, void const *y)
+{
+ struct F_triple const *a = x;
+ struct F_triple const *b = y;
+ return (SAME_INODE (*a, *b) && same_name (a->name, b->name)) ? true : false;
+}
+
+bool
+triple_compare_ino_str (void const *x, void const *y)
+{
+ struct F_triple const *a = x;
+ struct F_triple const *b = y;
+ return (SAME_INODE (*a, *b) && STREQ (a->name, b->name)) ? true : false;
+}
+
+/* Free an F_triple. */
+void
+triple_free (void *x)
+{
+ struct F_triple *a = x;
+ free (a->name);
+ free (a);
+}
diff --git a/gnulib/lib/hash-triple.h b/gnulib/lib/hash-triple.h
new file mode 100644
index 0000000..0658d81
--- /dev/null
+++ b/gnulib/lib/hash-triple.h
@@ -0,0 +1,24 @@
+#ifndef HASH_TRIPLE_H
+#define HASH_TRIPLE_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+/* Describe a just-created or just-renamed destination file. */
+struct F_triple
+{
+ char *name;
+ ino_t st_ino;
+ dev_t st_dev;
+};
+
+extern size_t triple_hash (void const *x, size_t table_size) _GL_ATTRIBUTE_PURE;
+extern size_t triple_hash_no_name (void const *x, size_t table_size)
+ _GL_ATTRIBUTE_PURE;
+extern bool triple_compare (void const *x, void const *y);
+extern bool triple_compare_ino_str (void const *x, void const *y)
+ _GL_ATTRIBUTE_PURE;
+extern void triple_free (void *x);
+
+#endif
diff --git a/gnulib/lib/hash.c b/gnulib/lib/hash.c
new file mode 100644
index 0000000..0ee32d0
--- /dev/null
+++ b/gnulib/lib/hash.c
@@ -0,0 +1,1233 @@
+/* hash - hashing table processing.
+
+ Copyright (C) 1998-2004, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ Written by Jim Meyering, 1992.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* A generic hash table package. */
+
+/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
+ of malloc. If you change USE_OBSTACK, you have to recompile! */
+
+#include <config.h>
+
+#include "hash.h"
+
+#include "bitrotate.h"
+#include "xalloc-oversized.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_OBSTACK
+# include "obstack.h"
+# ifndef obstack_chunk_alloc
+# define obstack_chunk_alloc malloc
+# endif
+# ifndef obstack_chunk_free
+# define obstack_chunk_free free
+# endif
+#endif
+
+struct hash_entry
+ {
+ void *data;
+ struct hash_entry *next;
+ };
+
+struct hash_table
+ {
+ /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
+ for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets
+ are not empty, there are N_ENTRIES active entries in the table. */
+ struct hash_entry *bucket;
+ struct hash_entry const *bucket_limit;
+ size_t n_buckets;
+ size_t n_buckets_used;
+ size_t n_entries;
+
+ /* Tuning arguments, kept in a physically separate structure. */
+ const Hash_tuning *tuning;
+
+ /* Three functions are given to `hash_initialize', see the documentation
+ block for this function. In a word, HASHER randomizes a user entry
+ into a number up from 0 up to some maximum minus 1; COMPARATOR returns
+ true if two user entries compare equally; and DATA_FREER is the cleanup
+ function for a user entry. */
+ Hash_hasher hasher;
+ Hash_comparator comparator;
+ Hash_data_freer data_freer;
+
+ /* A linked list of freed struct hash_entry structs. */
+ struct hash_entry *free_entry_list;
+
+#if USE_OBSTACK
+ /* Whenever obstacks are used, it is possible to allocate all overflowed
+ entries into a single stack, so they all can be freed in a single
+ operation. It is not clear if the speedup is worth the trouble. */
+ struct obstack entry_stack;
+#endif
+ };
+
+/* A hash table contains many internal entries, each holding a pointer to
+ some user-provided data (also called a user entry). An entry indistinctly
+ refers to both the internal entry and its associated user entry. A user
+ entry contents may be hashed by a randomization function (the hashing
+ function, or just `hasher' for short) into a number (or `slot') between 0
+ and the current table size. At each slot position in the hash table,
+ starts a linked chain of entries for which the user data all hash to this
+ slot. A bucket is the collection of all entries hashing to the same slot.
+
+ A good `hasher' function will distribute entries rather evenly in buckets.
+ In the ideal case, the length of each bucket is roughly the number of
+ entries divided by the table size. Finding the slot for a data is usually
+ done in constant time by the `hasher', and the later finding of a precise
+ entry is linear in time with the size of the bucket. Consequently, a
+ larger hash table size (that is, a larger number of buckets) is prone to
+ yielding shorter chains, *given* the `hasher' function behaves properly.
+
+ Long buckets slow down the lookup algorithm. One might use big hash table
+ sizes in hope to reduce the average length of buckets, but this might
+ become inordinate, as unused slots in the hash table take some space. The
+ best bet is to make sure you are using a good `hasher' function (beware
+ that those are not that easy to write! :-), and to use a table size
+ larger than the actual number of entries. */
+
+/* If an insertion makes the ratio of nonempty buckets to table size larger
+ than the growth threshold (a number between 0.0 and 1.0), then increase
+ the table size by multiplying by the growth factor (a number greater than
+ 1.0). The growth threshold defaults to 0.8, and the growth factor
+ defaults to 1.414, meaning that the table will have doubled its size
+ every second time 80% of the buckets get used. */
+#define DEFAULT_GROWTH_THRESHOLD 0.8f
+#define DEFAULT_GROWTH_FACTOR 1.414f
+
+/* If a deletion empties a bucket and causes the ratio of used buckets to
+ table size to become smaller than the shrink threshold (a number between
+ 0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
+ number greater than the shrink threshold but smaller than 1.0). The shrink
+ threshold and factor default to 0.0 and 1.0, meaning that the table never
+ shrinks. */
+#define DEFAULT_SHRINK_THRESHOLD 0.0f
+#define DEFAULT_SHRINK_FACTOR 1.0f
+
+/* Use this to initialize or reset a TUNING structure to
+ some sensible values. */
+static const Hash_tuning default_tuning =
+ {
+ DEFAULT_SHRINK_THRESHOLD,
+ DEFAULT_SHRINK_FACTOR,
+ DEFAULT_GROWTH_THRESHOLD,
+ DEFAULT_GROWTH_FACTOR,
+ false
+ };
+
+/* Information and lookup. */
+
+/* The following few functions provide information about the overall hash
+ table organization: the number of entries, number of buckets and maximum
+ length of buckets. */
+
+/* Return the number of buckets in the hash table. The table size, the total
+ number of buckets (used plus unused), or the maximum number of slots, are
+ the same quantity. */
+
+size_t
+hash_get_n_buckets (const Hash_table *table)
+{
+ return table->n_buckets;
+}
+
+/* Return the number of slots in use (non-empty buckets). */
+
+size_t
+hash_get_n_buckets_used (const Hash_table *table)
+{
+ return table->n_buckets_used;
+}
+
+/* Return the number of active entries. */
+
+size_t
+hash_get_n_entries (const Hash_table *table)
+{
+ return table->n_entries;
+}
+
+/* Return the length of the longest chain (bucket). */
+
+size_t
+hash_get_max_bucket_length (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t max_bucket_length = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+ size_t bucket_length = 1;
+
+ while (cursor = cursor->next, cursor)
+ bucket_length++;
+
+ if (bucket_length > max_bucket_length)
+ max_bucket_length = bucket_length;
+ }
+ }
+
+ return max_bucket_length;
+}
+
+/* Do a mild validation of a hash table, by traversing it and checking two
+ statistics. */
+
+bool
+hash_table_ok (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t n_buckets_used = 0;
+ size_t n_entries = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+
+ /* Count bucket head. */
+ n_buckets_used++;
+ n_entries++;
+
+ /* Count bucket overflow. */
+ while (cursor = cursor->next, cursor)
+ n_entries++;
+ }
+ }
+
+ if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
+ return true;
+
+ return false;
+}
+
+void
+hash_print_statistics (const Hash_table *table, FILE *stream)
+{
+ size_t n_entries = hash_get_n_entries (table);
+ size_t n_buckets = hash_get_n_buckets (table);
+ size_t n_buckets_used = hash_get_n_buckets_used (table);
+ size_t max_bucket_length = hash_get_max_bucket_length (table);
+
+ fprintf (stream, "# entries: %lu\n", (unsigned long int) n_entries);
+ fprintf (stream, "# buckets: %lu\n", (unsigned long int) n_buckets);
+ fprintf (stream, "# buckets used: %lu (%.2f%%)\n",
+ (unsigned long int) n_buckets_used,
+ (100.0 * n_buckets_used) / n_buckets);
+ fprintf (stream, "max bucket length: %lu\n",
+ (unsigned long int) max_bucket_length);
+}
+
+/* Hash KEY and return a pointer to the selected bucket.
+ If TABLE->hasher misbehaves, abort. */
+static struct hash_entry *
+safe_hasher (const Hash_table *table, const void *key)
+{
+ size_t n = table->hasher (key, table->n_buckets);
+ if (! (n < table->n_buckets))
+ abort ();
+ return table->bucket + n;
+}
+
+/* If ENTRY matches an entry already in the hash table, return the
+ entry from the table. Otherwise, return NULL. */
+
+void *
+hash_lookup (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket = safe_hasher (table, entry);
+ struct hash_entry const *cursor;
+
+ if (bucket->data == NULL)
+ return NULL;
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (entry == cursor->data || table->comparator (entry, cursor->data))
+ return cursor->data;
+
+ return NULL;
+}
+
+/* Walking. */
+
+/* The functions in this page traverse the hash table and process the
+ contained entries. For the traversal to work properly, the hash table
+ should not be resized nor modified while any particular entry is being
+ processed. In particular, entries should not be added, and an entry
+ may be removed only if there is no shrink threshold and the entry being
+ removed has already been passed to hash_get_next. */
+
+/* Return the first data in the table, or NULL if the table is empty. */
+
+void *
+hash_get_first (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+
+ if (table->n_entries == 0)
+ return NULL;
+
+ for (bucket = table->bucket; ; bucket++)
+ if (! (bucket < table->bucket_limit))
+ abort ();
+ else if (bucket->data)
+ return bucket->data;
+}
+
+/* Return the user data for the entry following ENTRY, where ENTRY has been
+ returned by a previous call to either `hash_get_first' or `hash_get_next'.
+ Return NULL if there are no more entries. */
+
+void *
+hash_get_next (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket = safe_hasher (table, entry);
+ struct hash_entry const *cursor;
+
+ /* Find next entry in the same bucket. */
+ cursor = bucket;
+ do
+ {
+ if (cursor->data == entry && cursor->next)
+ return cursor->next->data;
+ cursor = cursor->next;
+ }
+ while (cursor != NULL);
+
+ /* Find first entry in any subsequent bucket. */
+ while (++bucket < table->bucket_limit)
+ if (bucket->data)
+ return bucket->data;
+
+ /* None found. */
+ return NULL;
+}
+
+/* Fill BUFFER with pointers to active user entries in the hash table, then
+ return the number of pointers copied. Do not copy more than BUFFER_SIZE
+ pointers. */
+
+size_t
+hash_get_entries (const Hash_table *table, void **buffer,
+ size_t buffer_size)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (counter >= buffer_size)
+ return counter;
+ buffer[counter++] = cursor->data;
+ }
+ }
+ }
+
+ return counter;
+}
+
+/* Call a PROCESSOR function for each entry of a hash table, and return the
+ number of entries for which the processor function returned success. A
+ pointer to some PROCESSOR_DATA which will be made available to each call to
+ the processor function. The PROCESSOR accepts two arguments: the first is
+ the user entry being walked into, the second is the value of PROCESSOR_DATA
+ as received. The walking continue for as long as the PROCESSOR function
+ returns nonzero. When it returns zero, the walking is interrupted. */
+
+size_t
+hash_do_for_each (const Hash_table *table, Hash_processor processor,
+ void *processor_data)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (! processor (cursor->data, processor_data))
+ return counter;
+ counter++;
+ }
+ }
+ }
+
+ return counter;
+}
+
+/* Allocation and clean-up. */
+
+/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
+ This is a convenience routine for constructing other hashing functions. */
+
+#if USE_DIFF_HASH
+
+/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
+ B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
+ Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
+ algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
+ may not be good for your application." */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+# define HASH_ONE_CHAR(Value, Byte) \
+ ((Byte) + rotl_sz (Value, 7))
+
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = HASH_ONE_CHAR (value, ch);
+ return value % n_buckets;
+
+# undef HASH_ONE_CHAR
+}
+
+#else /* not USE_DIFF_HASH */
+
+/* This one comes from `recode', and performs a bit better than the above as
+ per a few experiments. It is inspired from a hashing routine found in the
+ very old Cyber `snoop', itself written in typical Greg Mansfield style.
+ (By the way, what happened to this excellent man? Is he still alive?) */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = (value * 31 + ch) % n_buckets;
+ return value;
+}
+
+#endif /* not USE_DIFF_HASH */
+
+/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd
+ number at least equal to 11. */
+
+static bool _GL_ATTRIBUTE_CONST
+is_prime (size_t candidate)
+{
+ size_t divisor = 3;
+ size_t square = divisor * divisor;
+
+ while (square < candidate && (candidate % divisor))
+ {
+ divisor++;
+ square += 4 * divisor;
+ divisor++;
+ }
+
+ return (candidate % divisor ? true : false);
+}
+
+/* Round a given CANDIDATE number up to the nearest prime, and return that
+ prime. Primes lower than 10 are merely skipped. */
+
+static size_t _GL_ATTRIBUTE_CONST
+next_prime (size_t candidate)
+{
+ /* Skip small primes. */
+ if (candidate < 10)
+ candidate = 10;
+
+ /* Make it definitely odd. */
+ candidate |= 1;
+
+ while (SIZE_MAX != candidate && !is_prime (candidate))
+ candidate += 2;
+
+ return candidate;
+}
+
+void
+hash_reset_tuning (Hash_tuning *tuning)
+{
+ *tuning = default_tuning;
+}
+
+/* If the user passes a NULL hasher, we hash the raw pointer. */
+static size_t
+raw_hasher (const void *data, size_t n)
+{
+ /* When hashing unique pointers, it is often the case that they were
+ generated by malloc and thus have the property that the low-order
+ bits are 0. As this tends to give poorer performance with small
+ tables, we rotate the pointer value before performing division,
+ in an attempt to improve hash quality. */
+ size_t val = rotr_sz ((size_t) data, 3);
+ return val % n;
+}
+
+/* If the user passes a NULL comparator, we use pointer comparison. */
+static bool
+raw_comparator (const void *a, const void *b)
+{
+ return a == b;
+}
+
+
+/* For the given hash TABLE, check the user supplied tuning structure for
+ reasonable values, and return true if there is no gross error with it.
+ Otherwise, definitively reset the TUNING field to some acceptable default
+ in the hash table (that is, the user loses the right of further modifying
+ tuning arguments), and return false. */
+
+static bool
+check_tuning (Hash_table *table)
+{
+ const Hash_tuning *tuning = table->tuning;
+ float epsilon;
+ if (tuning == &default_tuning)
+ return true;
+
+ /* Be a bit stricter than mathematics would require, so that
+ rounding errors in size calculations do not cause allocations to
+ fail to grow or shrink as they should. The smallest allocation
+ is 11 (due to next_prime's algorithm), so an epsilon of 0.1
+ should be good enough. */
+ epsilon = 0.1f;
+
+ if (epsilon < tuning->growth_threshold
+ && tuning->growth_threshold < 1 - epsilon
+ && 1 + epsilon < tuning->growth_factor
+ && 0 <= tuning->shrink_threshold
+ && tuning->shrink_threshold + epsilon < tuning->shrink_factor
+ && tuning->shrink_factor <= 1
+ && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
+ return true;
+
+ table->tuning = &default_tuning;
+ return false;
+}
+
+/* Compute the size of the bucket array for the given CANDIDATE and
+ TUNING, or return 0 if there is no possible way to allocate that
+ many entries. */
+
+static size_t _GL_ATTRIBUTE_PURE
+compute_bucket_size (size_t candidate, const Hash_tuning *tuning)
+{
+ if (!tuning->is_n_buckets)
+ {
+ float new_candidate = candidate / tuning->growth_threshold;
+ if (SIZE_MAX <= new_candidate)
+ return 0;
+ candidate = new_candidate;
+ }
+ candidate = next_prime (candidate);
+ if (xalloc_oversized (candidate, sizeof (struct hash_entry *)))
+ return 0;
+ return candidate;
+}
+
+/* Allocate and return a new hash table, or NULL upon failure. The initial
+ number of buckets is automatically selected so as to _guarantee_ that you
+ may insert at least CANDIDATE different user entries before any growth of
+ the hash table size occurs. So, if have a reasonably tight a-priori upper
+ bound on the number of entries you intend to insert in the hash table, you
+ may save some table memory and insertion time, by specifying it here. If
+ the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
+ argument has its meaning changed to the wanted number of buckets.
+
+ TUNING points to a structure of user-supplied values, in case some fine
+ tuning is wanted over the default behavior of the hasher. If TUNING is
+ NULL, the default tuning parameters are used instead. If TUNING is
+ provided but the values requested are out of bounds or might cause
+ rounding errors, return NULL.
+
+ The user-supplied HASHER function, when not NULL, accepts two
+ arguments ENTRY and TABLE_SIZE. It computes, by hashing ENTRY contents, a
+ slot number for that entry which should be in the range 0..TABLE_SIZE-1.
+ This slot number is then returned.
+
+ The user-supplied COMPARATOR function, when not NULL, accepts two
+ arguments pointing to user data, it then returns true for a pair of entries
+ that compare equal, or false otherwise. This function is internally called
+ on entries which are already known to hash to the same bucket index,
+ but which are distinct pointers.
+
+ The user-supplied DATA_FREER function, when not NULL, may be later called
+ with the user data as an argument, just before the entry containing the
+ data gets freed. This happens from within `hash_free' or `hash_clear'.
+ You should specify this function only if you want these functions to free
+ all of your `data' data. This is typically the case when your data is
+ simply an auxiliary struct that you have malloc'd to aggregate several
+ values. */
+
+Hash_table *
+hash_initialize (size_t candidate, const Hash_tuning *tuning,
+ Hash_hasher hasher, Hash_comparator comparator,
+ Hash_data_freer data_freer)
+{
+ Hash_table *table;
+
+ if (hasher == NULL)
+ hasher = raw_hasher;
+ if (comparator == NULL)
+ comparator = raw_comparator;
+
+ table = malloc (sizeof *table);
+ if (table == NULL)
+ return NULL;
+
+ if (!tuning)
+ tuning = &default_tuning;
+ table->tuning = tuning;
+ if (!check_tuning (table))
+ {
+ /* Fail if the tuning options are invalid. This is the only occasion
+ when the user gets some feedback about it. Once the table is created,
+ if the user provides invalid tuning options, we silently revert to
+ using the defaults, and ignore further request to change the tuning
+ options. */
+ goto fail;
+ }
+
+ table->n_buckets = compute_bucket_size (candidate, tuning);
+ if (!table->n_buckets)
+ goto fail;
+
+ table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
+ if (table->bucket == NULL)
+ goto fail;
+ table->bucket_limit = table->bucket + table->n_buckets;
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+
+ table->hasher = hasher;
+ table->comparator = comparator;
+ table->data_freer = data_freer;
+
+ table->free_entry_list = NULL;
+#if USE_OBSTACK
+ obstack_init (&table->entry_stack);
+#endif
+ return table;
+
+ fail:
+ free (table);
+ return NULL;
+}
+
+/* Make all buckets empty, placing any chained entries on the free list.
+ Apply the user-specified function data_freer (if any) to the datas of any
+ affected entries. */
+
+void
+hash_clear (Hash_table *table)
+{
+ struct hash_entry *bucket;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Free the bucket overflow. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ if (table->data_freer)
+ table->data_freer (cursor->data);
+ cursor->data = NULL;
+
+ next = cursor->next;
+ /* Relinking is done one entry at a time, as it is to be expected
+ that overflows are either rare or short. */
+ cursor->next = table->free_entry_list;
+ table->free_entry_list = cursor;
+ }
+
+ /* Free the bucket head. */
+ if (table->data_freer)
+ table->data_freer (bucket->data);
+ bucket->data = NULL;
+ bucket->next = NULL;
+ }
+ }
+
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+}
+
+/* Reclaim all storage associated with a hash table. If a data_freer
+ function has been supplied by the user when the hash table was created,
+ this function applies it to the data of each entry before freeing that
+ entry. */
+
+void
+hash_free (Hash_table *table)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Call the user data_freer function. */
+ if (table->data_freer && table->n_entries)
+ {
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ table->data_freer (cursor->data);
+ }
+ }
+ }
+
+#if USE_OBSTACK
+
+ obstack_free (&table->entry_stack, NULL);
+
+#else
+
+ /* Free all bucket overflowed entries. */
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+ }
+
+ /* Also reclaim the internal list of previously freed entries. */
+ for (cursor = table->free_entry_list; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+
+#endif
+
+ /* Free the remainder of the hash table structure. */
+ free (table->bucket);
+ free (table);
+}
+
+/* Insertion and deletion. */
+
+/* Get a new hash entry for a bucket overflow, possibly by recycling a
+ previously freed one. If this is not possible, allocate a new one. */
+
+static struct hash_entry *
+allocate_entry (Hash_table *table)
+{
+ struct hash_entry *new;
+
+ if (table->free_entry_list)
+ {
+ new = table->free_entry_list;
+ table->free_entry_list = new->next;
+ }
+ else
+ {
+#if USE_OBSTACK
+ new = obstack_alloc (&table->entry_stack, sizeof *new);
+#else
+ new = malloc (sizeof *new);
+#endif
+ }
+
+ return new;
+}
+
+/* Free a hash entry which was part of some bucket overflow,
+ saving it for later recycling. */
+
+static void
+free_entry (Hash_table *table, struct hash_entry *entry)
+{
+ entry->data = NULL;
+ entry->next = table->free_entry_list;
+ table->free_entry_list = entry;
+}
+
+/* This private function is used to help with insertion and deletion. When
+ ENTRY matches an entry in the table, return a pointer to the corresponding
+ user data and set *BUCKET_HEAD to the head of the selected bucket.
+ Otherwise, return NULL. When DELETE is true and ENTRY matches an entry in
+ the table, unlink the matching entry. */
+
+static void *
+hash_find_entry (Hash_table *table, const void *entry,
+ struct hash_entry **bucket_head, bool delete)
+{
+ struct hash_entry *bucket = safe_hasher (table, entry);
+ struct hash_entry *cursor;
+
+ *bucket_head = bucket;
+
+ /* Test for empty bucket. */
+ if (bucket->data == NULL)
+ return NULL;
+
+ /* See if the entry is the first in the bucket. */
+ if (entry == bucket->data || table->comparator (entry, bucket->data))
+ {
+ void *data = bucket->data;
+
+ if (delete)
+ {
+ if (bucket->next)
+ {
+ struct hash_entry *next = bucket->next;
+
+ /* Bump the first overflow entry into the bucket head, then save
+ the previous first overflow entry for later recycling. */
+ *bucket = *next;
+ free_entry (table, next);
+ }
+ else
+ {
+ bucket->data = NULL;
+ }
+ }
+
+ return data;
+ }
+
+ /* Scan the bucket overflow. */
+ for (cursor = bucket; cursor->next; cursor = cursor->next)
+ {
+ if (entry == cursor->next->data
+ || table->comparator (entry, cursor->next->data))
+ {
+ void *data = cursor->next->data;
+
+ if (delete)
+ {
+ struct hash_entry *next = cursor->next;
+
+ /* Unlink the entry to delete, then save the freed entry for later
+ recycling. */
+ cursor->next = next->next;
+ free_entry (table, next);
+ }
+
+ return data;
+ }
+ }
+
+ /* No entry found. */
+ return NULL;
+}
+
+/* Internal helper, to move entries from SRC to DST. Both tables must
+ share the same free entry list. If SAFE, only move overflow
+ entries, saving bucket heads for later, so that no allocations will
+ occur. Return false if the free entry list is exhausted and an
+ allocation fails. */
+
+static bool
+transfer_entries (Hash_table *dst, Hash_table *src, bool safe)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+ for (bucket = src->bucket; bucket < src->bucket_limit; bucket++)
+ if (bucket->data)
+ {
+ void *data;
+ struct hash_entry *new_bucket;
+
+ /* Within each bucket, transfer overflow entries first and
+ then the bucket head, to minimize memory pressure. After
+ all, the only time we might allocate is when moving the
+ bucket head, but moving overflow entries first may create
+ free entries that can be recycled by the time we finally
+ get to the bucket head. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ data = cursor->data;
+ new_bucket = safe_hasher (dst, data);
+
+ next = cursor->next;
+
+ if (new_bucket->data)
+ {
+ /* Merely relink an existing entry, when moving from a
+ bucket overflow into a bucket overflow. */
+ cursor->next = new_bucket->next;
+ new_bucket->next = cursor;
+ }
+ else
+ {
+ /* Free an existing entry, when moving from a bucket
+ overflow into a bucket header. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ free_entry (dst, cursor);
+ }
+ }
+ /* Now move the bucket head. Be sure that if we fail due to
+ allocation failure that the src table is in a consistent
+ state. */
+ data = bucket->data;
+ bucket->next = NULL;
+ if (safe)
+ continue;
+ new_bucket = safe_hasher (dst, data);
+
+ if (new_bucket->data)
+ {
+ /* Allocate or recycle an entry, when moving from a bucket
+ header into a bucket overflow. */
+ struct hash_entry *new_entry = allocate_entry (dst);
+
+ if (new_entry == NULL)
+ return false;
+
+ new_entry->data = data;
+ new_entry->next = new_bucket->next;
+ new_bucket->next = new_entry;
+ }
+ else
+ {
+ /* Move from one bucket header to another. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ }
+ bucket->data = NULL;
+ src->n_buckets_used--;
+ }
+ return true;
+}
+
+/* For an already existing hash table, change the number of buckets through
+ specifying CANDIDATE. The contents of the hash table are preserved. The
+ new number of buckets is automatically selected so as to _guarantee_ that
+ the table may receive at least CANDIDATE different user entries, including
+ those already in the table, before any other growth of the hash table size
+ occurs. If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
+ exact number of buckets desired. Return true iff the rehash succeeded. */
+
+bool
+hash_rehash (Hash_table *table, size_t candidate)
+{
+ Hash_table storage;
+ Hash_table *new_table;
+ size_t new_size = compute_bucket_size (candidate, table->tuning);
+
+ if (!new_size)
+ return false;
+ if (new_size == table->n_buckets)
+ return true;
+ new_table = &storage;
+ new_table->bucket = calloc (new_size, sizeof *new_table->bucket);
+ if (new_table->bucket == NULL)
+ return false;
+ new_table->n_buckets = new_size;
+ new_table->bucket_limit = new_table->bucket + new_size;
+ new_table->n_buckets_used = 0;
+ new_table->n_entries = 0;
+ new_table->tuning = table->tuning;
+ new_table->hasher = table->hasher;
+ new_table->comparator = table->comparator;
+ new_table->data_freer = table->data_freer;
+
+ /* In order for the transfer to successfully complete, we need
+ additional overflow entries when distinct buckets in the old
+ table collide into a common bucket in the new table. The worst
+ case possible is a hasher that gives a good spread with the old
+ size, but returns a constant with the new size; if we were to
+ guarantee table->n_buckets_used-1 free entries in advance, then
+ the transfer would be guaranteed to not allocate memory.
+ However, for large tables, a guarantee of no further allocation
+ introduces a lot of extra memory pressure, all for an unlikely
+ corner case (most rehashes reduce, rather than increase, the
+ number of overflow entries needed). So, we instead ensure that
+ the transfer process can be reversed if we hit a memory
+ allocation failure mid-transfer. */
+
+ /* Merely reuse the extra old space into the new table. */
+#if USE_OBSTACK
+ new_table->entry_stack = table->entry_stack;
+#endif
+ new_table->free_entry_list = table->free_entry_list;
+
+ if (transfer_entries (new_table, table, false))
+ {
+ /* Entries transferred successfully; tie up the loose ends. */
+ free (table->bucket);
+ table->bucket = new_table->bucket;
+ table->bucket_limit = new_table->bucket_limit;
+ table->n_buckets = new_table->n_buckets;
+ table->n_buckets_used = new_table->n_buckets_used;
+ table->free_entry_list = new_table->free_entry_list;
+ /* table->n_entries and table->entry_stack already hold their value. */
+ return true;
+ }
+
+ /* We've allocated new_table->bucket (and possibly some entries),
+ exhausted the free list, and moved some but not all entries into
+ new_table. We must undo the partial move before returning
+ failure. The only way to get into this situation is if new_table
+ uses fewer buckets than the old table, so we will reclaim some
+ free entries as overflows in the new table are put back into
+ distinct buckets in the old table.
+
+ There are some pathological cases where a single pass through the
+ table requires more intermediate overflow entries than using two
+ passes. Two passes give worse cache performance and takes
+ longer, but at this point, we're already out of memory, so slow
+ and safe is better than failure. */
+ table->free_entry_list = new_table->free_entry_list;
+ if (! (transfer_entries (table, new_table, true)
+ && transfer_entries (table, new_table, false)))
+ abort ();
+ /* table->n_entries already holds its value. */
+ free (new_table->bucket);
+ return false;
+}
+
+/* Insert ENTRY into hash TABLE if there is not already a matching entry.
+
+ Return -1 upon memory allocation failure.
+ Return 1 if insertion succeeded.
+ Return 0 if there is already a matching entry in the table,
+ and in that case, if MATCHED_ENT is non-NULL, set *MATCHED_ENT
+ to that entry.
+
+ This interface is easier to use than hash_insert when you must
+ distinguish between the latter two cases. More importantly,
+ hash_insert is unusable for some types of ENTRY values. When using
+ hash_insert, the only way to distinguish those cases is to compare
+ the return value and ENTRY. That works only when you can have two
+ different ENTRY values that point to data that compares "equal". Thus,
+ when the ENTRY value is a simple scalar, you must use
+ hash_insert_if_absent. ENTRY must not be NULL. */
+int
+hash_insert_if_absent (Hash_table *table, void const *entry,
+ void const **matched_ent)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ /* The caller cannot insert a NULL entry, since hash_lookup returns NULL
+ to indicate "not found", and hash_find_entry uses "bucket->data == NULL"
+ to indicate an empty bucket. */
+ if (! entry)
+ abort ();
+
+ /* If there's a matching entry already in the table, return that. */
+ if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
+ {
+ if (matched_ent)
+ *matched_ent = data;
+ return 0;
+ }
+
+ /* If the growth threshold of the buckets in use has been reached, increase
+ the table size and rehash. There's no point in checking the number of
+ entries: if the hashing function is ill-conditioned, rehashing is not
+ likely to improve it. */
+
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ float candidate =
+ (tuning->is_n_buckets
+ ? (table->n_buckets * tuning->growth_factor)
+ : (table->n_buckets * tuning->growth_factor
+ * tuning->growth_threshold));
+
+ if (SIZE_MAX <= candidate)
+ return -1;
+
+ /* If the rehash fails, arrange to return NULL. */
+ if (!hash_rehash (table, candidate))
+ return -1;
+
+ /* Update the bucket we are interested in. */
+ if (hash_find_entry (table, entry, &bucket, false) != NULL)
+ abort ();
+ }
+ }
+
+ /* ENTRY is not matched, it should be inserted. */
+
+ if (bucket->data)
+ {
+ struct hash_entry *new_entry = allocate_entry (table);
+
+ if (new_entry == NULL)
+ return -1;
+
+ /* Add ENTRY in the overflow of the bucket. */
+
+ new_entry->data = (void *) entry;
+ new_entry->next = bucket->next;
+ bucket->next = new_entry;
+ table->n_entries++;
+ return 1;
+ }
+
+ /* Add ENTRY right in the bucket head. */
+
+ bucket->data = (void *) entry;
+ table->n_entries++;
+ table->n_buckets_used++;
+
+ return 1;
+}
+
+/* hash_insert0 is the deprecated name for hash_insert_if_absent.
+ . */
+int
+hash_insert0 (Hash_table *table, void const *entry, void const **matched_ent)
+{
+ return hash_insert_if_absent (table, entry, matched_ent);
+}
+
+/* If ENTRY matches an entry already in the hash table, return the pointer
+ to the entry from the table. Otherwise, insert ENTRY and return ENTRY.
+ Return NULL if the storage required for insertion cannot be allocated.
+ This implementation does not support duplicate entries or insertion of
+ NULL. */
+
+void *
+hash_insert (Hash_table *table, void const *entry)
+{
+ void const *matched_ent;
+ int err = hash_insert_if_absent (table, entry, &matched_ent);
+ return (err == -1
+ ? NULL
+ : (void *) (err == 0 ? matched_ent : entry));
+}
+
+/* If ENTRY is already in the table, remove it and return the just-deleted
+ data (the user may want to deallocate its storage). If ENTRY is not in the
+ table, don't modify the table and return NULL. */
+
+void *
+hash_delete (Hash_table *table, const void *entry)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ data = hash_find_entry (table, entry, &bucket, true);
+ if (!data)
+ return NULL;
+
+ table->n_entries--;
+ if (!bucket->data)
+ {
+ table->n_buckets_used--;
+
+ /* If the shrink threshold of the buckets in use has been reached,
+ rehash into a smaller table. */
+
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ size_t candidate =
+ (tuning->is_n_buckets
+ ? table->n_buckets * tuning->shrink_factor
+ : (table->n_buckets * tuning->shrink_factor
+ * tuning->growth_threshold));
+
+ if (!hash_rehash (table, candidate))
+ {
+ /* Failure to allocate memory in an attempt to
+ shrink the table is not fatal. But since memory
+ is low, we can at least be kind and free any
+ spare entries, rather than keeping them tied up
+ in the free entry list. */
+#if ! USE_OBSTACK
+ struct hash_entry *cursor = table->free_entry_list;
+ struct hash_entry *next;
+ while (cursor)
+ {
+ next = cursor->next;
+ free (cursor);
+ cursor = next;
+ }
+ table->free_entry_list = NULL;
+#endif
+ }
+ }
+ }
+ }
+
+ return data;
+}
+
+/* Testing. */
+
+#if TESTING
+
+void
+hash_print (const Hash_table *table)
+{
+ struct hash_entry *bucket = (struct hash_entry *) table->bucket;
+
+ for ( ; bucket < table->bucket_limit; bucket++)
+ {
+ struct hash_entry *cursor;
+
+ if (bucket)
+ printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ char const *s = cursor->data;
+ /* FIXME */
+ if (s)
+ printf (" %s\n", s);
+ }
+ }
+}
+
+#endif /* TESTING */
diff --git a/gnulib/lib/hash.h b/gnulib/lib/hash.h
new file mode 100644
index 0000000..541abc4
--- /dev/null
+++ b/gnulib/lib/hash.h
@@ -0,0 +1,107 @@
+/* hash - hashing table processing.
+ Copyright (C) 1998-1999, 2001, 2003, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Jim Meyering <meyering@ascend.com>, 1998.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* A generic hash table package. */
+
+/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
+ obstacks instead of malloc, and recompile `hash.c' with same setting. */
+
+#ifndef HASH_H_
+# define HASH_H_
+
+# include <stdio.h>
+# include <stdbool.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The warn_unused_result attribute appeared first in gcc-3.4.0. */
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_WUR __attribute__ ((__warn_unused_result__))
+# else
+# define _GL_ATTRIBUTE_WUR /* empty */
+# endif
+
+# ifndef _GL_ATTRIBUTE_DEPRECATED
+/* The __attribute__((__deprecated__)) feature
+ is available in gcc versions 3.1 and newer. */
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
+# define _GL_ATTRIBUTE_DEPRECATED /* empty */
+# else
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+# endif
+# endif
+
+typedef size_t (*Hash_hasher) (const void *, size_t);
+typedef bool (*Hash_comparator) (const void *, const void *);
+typedef void (*Hash_data_freer) (void *);
+typedef bool (*Hash_processor) (void *, void *);
+
+struct hash_tuning
+ {
+ /* This structure is mainly used for `hash_initialize', see the block
+ documentation of `hash_reset_tuning' for more complete comments. */
+
+ float shrink_threshold; /* ratio of used buckets to trigger a shrink */
+ float shrink_factor; /* ratio of new smaller size to original size */
+ float growth_threshold; /* ratio of used buckets to trigger a growth */
+ float growth_factor; /* ratio of new bigger size to original size */
+ bool is_n_buckets; /* if CANDIDATE really means table size */
+ };
+
+typedef struct hash_tuning Hash_tuning;
+
+struct hash_table;
+
+typedef struct hash_table Hash_table;
+
+/* Information and lookup. */
+size_t hash_get_n_buckets (const Hash_table *) _GL_ATTRIBUTE_PURE;
+size_t hash_get_n_buckets_used (const Hash_table *) _GL_ATTRIBUTE_PURE;
+size_t hash_get_n_entries (const Hash_table *) _GL_ATTRIBUTE_PURE;
+size_t hash_get_max_bucket_length (const Hash_table *) _GL_ATTRIBUTE_PURE;
+bool hash_table_ok (const Hash_table *) _GL_ATTRIBUTE_PURE;
+void hash_print_statistics (const Hash_table *, FILE *);
+void *hash_lookup (const Hash_table *, const void *);
+
+/* Walking. */
+void *hash_get_first (const Hash_table *) _GL_ATTRIBUTE_PURE;
+void *hash_get_next (const Hash_table *, const void *);
+size_t hash_get_entries (const Hash_table *, void **, size_t);
+size_t hash_do_for_each (const Hash_table *, Hash_processor, void *);
+
+/* Allocation and clean-up. */
+size_t hash_string (const char *, size_t) _GL_ATTRIBUTE_PURE;
+void hash_reset_tuning (Hash_tuning *);
+Hash_table *hash_initialize (size_t, const Hash_tuning *,
+ Hash_hasher, Hash_comparator,
+ Hash_data_freer) _GL_ATTRIBUTE_WUR;
+void hash_clear (Hash_table *);
+void hash_free (Hash_table *);
+
+/* Insertion and deletion. */
+bool hash_rehash (Hash_table *, size_t) _GL_ATTRIBUTE_WUR;
+void *hash_insert (Hash_table *, const void *) _GL_ATTRIBUTE_WUR;
+
+/* Deprecate this interface. It has been renamed to hash_insert_if_absent. */
+int hash_insert0 (Hash_table *table, /* FIXME: remove in 2013 */
+ const void *entry,
+ const void **matched_ent) _GL_ATTRIBUTE_DEPRECATED;
+int hash_insert_if_absent (Hash_table *table, const void *entry,
+ const void **matched_ent);
+void *hash_delete (Hash_table *, const void *);
+
+#endif
diff --git a/gnulib/lib/hmac-md5.c b/gnulib/lib/hmac-md5.c
new file mode 100644
index 0000000..b357a15
--- /dev/null
+++ b/gnulib/lib/hmac-md5.c
@@ -0,0 +1,81 @@
+/* hmac-md5.c -- hashed message authentication codes
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "hmac.h"
+
+#include "memxor.h"
+#include "md5.h"
+
+#include <string.h>
+
+#define IPAD 0x36
+#define OPAD 0x5c
+
+int
+hmac_md5 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf)
+{
+ struct md5_ctx inner;
+ struct md5_ctx outer;
+ char optkeybuf[16];
+ char block[64];
+ char innerhash[16];
+
+ /* Reduce the key's size, so that it becomes <= 64 bytes large. */
+
+ if (keylen > 64)
+ {
+ struct md5_ctx keyhash;
+
+ md5_init_ctx (&keyhash);
+ md5_process_bytes (key, keylen, &keyhash);
+ md5_finish_ctx (&keyhash, optkeybuf);
+
+ key = optkeybuf;
+ keylen = 16;
+ }
+
+ /* Compute INNERHASH from KEY and IN. */
+
+ md5_init_ctx (&inner);
+
+ memset (block, IPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ md5_process_block (block, 64, &inner);
+ md5_process_bytes (in, inlen, &inner);
+
+ md5_finish_ctx (&inner, innerhash);
+
+ /* Compute result from KEY and INNERHASH. */
+
+ md5_init_ctx (&outer);
+
+ memset (block, OPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ md5_process_block (block, 64, &outer);
+ md5_process_bytes (innerhash, 16, &outer);
+
+ md5_finish_ctx (&outer, resbuf);
+
+ return 0;
+}
diff --git a/gnulib/lib/hmac-sha1.c b/gnulib/lib/hmac-sha1.c
new file mode 100644
index 0000000..816bfb2
--- /dev/null
+++ b/gnulib/lib/hmac-sha1.c
@@ -0,0 +1,81 @@
+/* hmac-sha1.c -- hashed message authentication codes
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include "hmac.h"
+
+#include "memxor.h"
+#include "sha1.h"
+
+#include <string.h>
+
+#define IPAD 0x36
+#define OPAD 0x5c
+
+int
+hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf)
+{
+ struct sha1_ctx inner;
+ struct sha1_ctx outer;
+ char optkeybuf[20];
+ char block[64];
+ char innerhash[20];
+
+ /* Reduce the key's size, so that it becomes <= 64 bytes large. */
+
+ if (keylen > 64)
+ {
+ struct sha1_ctx keyhash;
+
+ sha1_init_ctx (&keyhash);
+ sha1_process_bytes (key, keylen, &keyhash);
+ sha1_finish_ctx (&keyhash, optkeybuf);
+
+ key = optkeybuf;
+ keylen = 20;
+ }
+
+ /* Compute INNERHASH from KEY and IN. */
+
+ sha1_init_ctx (&inner);
+
+ memset (block, IPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ sha1_process_block (block, 64, &inner);
+ sha1_process_bytes (in, inlen, &inner);
+
+ sha1_finish_ctx (&inner, innerhash);
+
+ /* Compute result from KEY and INNERHASH. */
+
+ sha1_init_ctx (&outer);
+
+ memset (block, OPAD, sizeof (block));
+ memxor (block, key, keylen);
+
+ sha1_process_block (block, 64, &outer);
+ sha1_process_bytes (innerhash, 20, &outer);
+
+ sha1_finish_ctx (&outer, resbuf);
+
+ return 0;
+}
diff --git a/gnulib/lib/hmac.h b/gnulib/lib/hmac.h
new file mode 100644
index 0000000..b2eeb7d
--- /dev/null
+++ b/gnulib/lib/hmac.h
@@ -0,0 +1,41 @@
+/* hmac.h -- hashed message authentication codes
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. */
+
+#ifndef HMAC_H
+# define HMAC_H 1
+
+#include <stddef.h>
+
+/* Compute Hashed Message Authentication Code with MD5, as described
+ in RFC 2104, over BUFFER data of BUFLEN bytes using the KEY of
+ KEYLEN bytes, writing the output to pre-allocated 16 byte minimum
+ RESBUF buffer. Return 0 on success. */
+int
+hmac_md5 (const void *key, size_t keylen,
+ const void *buffer, size_t buflen, void *resbuf);
+
+/* Compute Hashed Message Authentication Code with SHA-1, over BUFFER
+ data of BUFLEN bytes using the KEY of KEYLEN bytes, writing the
+ output to pre-allocated 20 byte minimum RESBUF buffer. Return 0 on
+ success. */
+int
+hmac_sha1 (const void *key, size_t keylen,
+ const void *in, size_t inlen, void *resbuf);
+
+#endif /* HMAC_H */
diff --git a/gnulib/lib/human.c b/gnulib/lib/human.c
new file mode 100644
index 0000000..4c261da
--- /dev/null
+++ b/gnulib/lib/human.c
@@ -0,0 +1,470 @@
+/* human.c -- print human readable file size
+
+ Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#include <config.h>
+
+#include "human.h"
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <argmatch.h>
+#include <error.h>
+#include <intprops.h>
+
+/* The maximum length of a suffix like "KiB". */
+#define HUMAN_READABLE_SUFFIX_LENGTH_MAX 3
+
+static const char power_letter[] =
+{
+ 0, /* not used */
+ 'K', /* kibi ('k' for kilo is a special case) */
+ 'M', /* mega or mebi */
+ 'G', /* giga or gibi */
+ 'T', /* tera or tebi */
+ 'P', /* peta or pebi */
+ 'E', /* exa or exbi */
+ 'Z', /* zetta or 2**70 */
+ 'Y' /* yotta or 2**80 */
+};
+
+
+/* If INEXACT_STYLE is not human_round_to_nearest, and if easily
+ possible, adjust VALUE according to the style. */
+
+static long double
+adjust_value (int inexact_style, long double value)
+{
+ /* Do not use the floorl or ceill functions, as that would mean
+ checking for their presence and possibly linking with the
+ standard math library, which is a porting pain. So leave the
+ value alone if it is too large to easily round. */
+ if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX)
+ {
+ uintmax_t u = value;
+ value = u + (inexact_style == human_ceiling && u != value);
+ }
+
+ return value;
+}
+
+/* Group the digits of NUMBER according to the grouping rules of the
+ current locale. NUMBER contains NUMBERLEN digits. Modify the
+ bytes pointed to by NUMBER in place, subtracting 1 from NUMBER for
+ each byte inserted. Return the starting address of the modified
+ number.
+
+ To group the digits, use GROUPING and THOUSANDS_SEP as in `struct
+ lconv' from <locale.h>. */
+
+static char *
+group_number (char *number, size_t numberlen,
+ char const *grouping, char const *thousands_sep)
+{
+ register char *d;
+ size_t grouplen = SIZE_MAX;
+ size_t thousands_seplen = strlen (thousands_sep);
+ size_t i = numberlen;
+
+ /* The maximum possible value for NUMBERLEN is the number of digits
+ in the square of the largest uintmax_t, so double the size needed. */
+ char buf[2 * INT_STRLEN_BOUND (uintmax_t) + 1];
+
+ memcpy (buf, number, numberlen);
+ d = number + numberlen;
+
+ for (;;)
+ {
+ unsigned char g = *grouping;
+
+ if (g)
+ {
+ grouplen = g < CHAR_MAX ? g : i;
+ grouping++;
+ }
+
+ if (i < grouplen)
+ grouplen = i;
+
+ d -= grouplen;
+ i -= grouplen;
+ memcpy (d, buf + i, grouplen);
+ if (i == 0)
+ return d;
+
+ d -= thousands_seplen;
+ memcpy (d, thousands_sep, thousands_seplen);
+ }
+}
+
+/* Convert N to a human readable format in BUF, using the options OPTS.
+
+ N is expressed in units of FROM_BLOCK_SIZE. FROM_BLOCK_SIZE must
+ be nonnegative.
+
+ Use units of TO_BLOCK_SIZE in the output number. TO_BLOCK_SIZE
+ must be positive.
+
+ Use (OPTS & (human_round_to_nearest | human_floor | human_ceiling))
+ to determine whether to take the ceiling or floor of any result
+ that cannot be expressed exactly.
+
+ If (OPTS & human_group_digits), group the thousands digits
+ according to the locale, e.g., `1,000,000' in an American English
+ locale.
+
+ If (OPTS & human_autoscale), deduce the output block size
+ automatically; TO_BLOCK_SIZE must be 1 but it has no effect on the
+ output. Use powers of 1024 if (OPTS & human_base_1024), and powers
+ of 1000 otherwise. For example, assuming powers of 1024, 8500
+ would be converted to 8.3, 133456345 to 127, 56990456345 to 53, and
+ so on. Numbers smaller than the power aren't modified.
+ human_autoscale is normally used together with human_SI.
+
+ If (OPTS & human_space_before_unit), use a space to separate the
+ number from any suffix that is appended as described below.
+
+ If (OPTS & human_SI), append an SI prefix indicating which power is
+ being used. If in addition (OPTS & human_B), append "B" (if base
+ 1000) or "iB" (if base 1024) to the SI prefix. When ((OPTS &
+ human_SI) && ! (OPTS & human_autoscale)), TO_BLOCK_SIZE must be a
+ power of 1024 or of 1000, depending on (OPTS &
+ human_base_1024). */
+
+char *
+human_readable (uintmax_t n, char *buf, int opts,
+ uintmax_t from_block_size, uintmax_t to_block_size)
+{
+ int inexact_style =
+ opts & (human_round_to_nearest | human_floor | human_ceiling);
+ unsigned int base = opts & human_base_1024 ? 1024 : 1000;
+ uintmax_t amt;
+ int tenths;
+ int exponent = -1;
+ int exponent_max = sizeof power_letter - 1;
+ char *p;
+ char *psuffix;
+ char const *integerlim;
+
+ /* 0 means adjusted N == AMT.TENTHS;
+ 1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
+ 2 means adjusted N == AMT.TENTHS + 0.05;
+ 3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1. */
+ int rounding;
+
+ char const *decimal_point = ".";
+ size_t decimal_pointlen = 1;
+ char const *grouping = "";
+ char const *thousands_sep = "";
+ struct lconv const *l = localeconv ();
+ size_t pointlen = strlen (l->decimal_point);
+ if (0 < pointlen && pointlen <= MB_LEN_MAX)
+ {
+ decimal_point = l->decimal_point;
+ decimal_pointlen = pointlen;
+ }
+ grouping = l->grouping;
+ if (strlen (l->thousands_sep) <= MB_LEN_MAX)
+ thousands_sep = l->thousands_sep;
+
+ psuffix = buf + LONGEST_HUMAN_READABLE - HUMAN_READABLE_SUFFIX_LENGTH_MAX;
+ p = psuffix;
+
+ /* Adjust AMT out of FROM_BLOCK_SIZE units and into TO_BLOCK_SIZE
+ units. If this can be done exactly with integer arithmetic, do
+ not use floating point operations. */
+ if (to_block_size <= from_block_size)
+ {
+ if (from_block_size % to_block_size == 0)
+ {
+ uintmax_t multiplier = from_block_size / to_block_size;
+ amt = n * multiplier;
+ if (amt / multiplier == n)
+ {
+ tenths = 0;
+ rounding = 0;
+ goto use_integer_arithmetic;
+ }
+ }
+ }
+ else if (from_block_size != 0 && to_block_size % from_block_size == 0)
+ {
+ uintmax_t divisor = to_block_size / from_block_size;
+ uintmax_t r10 = (n % divisor) * 10;
+ uintmax_t r2 = (r10 % divisor) * 2;
+ amt = n / divisor;
+ tenths = r10 / divisor;
+ rounding = r2 < divisor ? 0 < r2 : 2 + (divisor < r2);
+ goto use_integer_arithmetic;
+ }
+
+ {
+ /* Either the result cannot be computed easily using uintmax_t,
+ or from_block_size is zero. Fall back on floating point.
+ FIXME: This can yield answers that are slightly off. */
+
+ long double dto_block_size = to_block_size;
+ long double damt = n * (from_block_size / dto_block_size);
+ size_t buflen;
+ size_t nonintegerlen;
+
+ if (! (opts & human_autoscale))
+ {
+ sprintf (buf, "%.0Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ else
+ {
+ long double e = 1;
+ exponent = 0;
+
+ do
+ {
+ e *= base;
+ exponent++;
+ }
+ while (e * base <= damt && exponent < exponent_max);
+
+ damt /= e;
+
+ sprintf (buf, "%.1Lf", adjust_value (inexact_style, damt));
+ buflen = strlen (buf);
+ nonintegerlen = decimal_pointlen + 1;
+
+ if (1 + nonintegerlen + ! (opts & human_base_1024) < buflen
+ || ((opts & human_suppress_point_zero)
+ && buf[buflen - 1] == '0'))
+ {
+ sprintf (buf, "%.0Lf",
+ adjust_value (inexact_style, damt * 10) / 10);
+ buflen = strlen (buf);
+ nonintegerlen = 0;
+ }
+ }
+
+ p = psuffix - buflen;
+ memmove (p, buf, buflen);
+ integerlim = p + buflen - nonintegerlen;
+ }
+ goto do_grouping;
+
+ use_integer_arithmetic:
+ {
+ /* The computation can be done exactly, with integer arithmetic.
+
+ Use power of BASE notation if requested and if adjusted AMT is
+ large enough. */
+
+ if (opts & human_autoscale)
+ {
+ exponent = 0;
+
+ if (base <= amt)
+ {
+ do
+ {
+ unsigned int r10 = (amt % base) * 10 + tenths;
+ unsigned int r2 = (r10 % base) * 2 + (rounding >> 1);
+ amt /= base;
+ tenths = r10 / base;
+ rounding = (r2 < base
+ ? (r2 + rounding) != 0
+ : 2 + (base < r2 + rounding));
+ exponent++;
+ }
+ while (base <= amt && exponent < exponent_max);
+
+ if (amt < 10)
+ {
+ if (inexact_style == human_round_to_nearest
+ ? 2 < rounding + (tenths & 1)
+ : inexact_style == human_ceiling && 0 < rounding)
+ {
+ tenths++;
+ rounding = 0;
+
+ if (tenths == 10)
+ {
+ amt++;
+ tenths = 0;
+ }
+ }
+
+ if (amt < 10
+ && (tenths || ! (opts & human_suppress_point_zero)))
+ {
+ *--p = '0' + tenths;
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ tenths = rounding = 0;
+ }
+ }
+ }
+ }
+
+ if (inexact_style == human_round_to_nearest
+ ? 5 < tenths + (0 < rounding + (amt & 1))
+ : inexact_style == human_ceiling && 0 < tenths + rounding)
+ {
+ amt++;
+
+ if ((opts & human_autoscale)
+ && amt == base && exponent < exponent_max)
+ {
+ exponent++;
+ if (! (opts & human_suppress_point_zero))
+ {
+ *--p = '0';
+ p -= decimal_pointlen;
+ memcpy (p, decimal_point, decimal_pointlen);
+ }
+ amt = 1;
+ }
+ }
+
+ integerlim = p;
+
+ do
+ {
+ int digit = amt % 10;
+ *--p = digit + '0';
+ }
+ while ((amt /= 10) != 0);
+ }
+
+ do_grouping:
+ if (opts & human_group_digits)
+ p = group_number (p, integerlim - p, grouping, thousands_sep);
+
+ if (opts & human_SI)
+ {
+ if (exponent < 0)
+ {
+ uintmax_t power;
+ exponent = 0;
+ for (power = 1; power < to_block_size; power *= base)
+ if (++exponent == exponent_max)
+ break;
+ }
+
+ if ((exponent | (opts & human_B)) && (opts & human_space_before_unit))
+ *psuffix++ = ' ';
+
+ if (exponent)
+ *psuffix++ = (! (opts & human_base_1024) && exponent == 1
+ ? 'k'
+ : power_letter[exponent]);
+
+ if (opts & human_B)
+ {
+ if ((opts & human_base_1024) && exponent)
+ *psuffix++ = 'i';
+ *psuffix++ = 'B';
+ }
+ }
+
+ *psuffix = '\0';
+
+ return p;
+}
+
+
+/* The default block size used for output. This number may change in
+ the future as disks get larger. */
+#ifndef DEFAULT_BLOCK_SIZE
+# define DEFAULT_BLOCK_SIZE 1024
+#endif
+
+static char const *const block_size_args[] = { "human-readable", "si", 0 };
+static int const block_size_opts[] =
+ {
+ human_autoscale + human_SI + human_base_1024,
+ human_autoscale + human_SI
+ };
+
+static uintmax_t
+default_block_size (void)
+{
+ return getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
+}
+
+static strtol_error
+humblock (char const *spec, uintmax_t *block_size, int *options)
+{
+ int i;
+ int opts = 0;
+
+ if (! spec
+ && ! (spec = getenv ("BLOCK_SIZE"))
+ && ! (spec = getenv ("BLOCKSIZE")))
+ *block_size = default_block_size ();
+ else
+ {
+ if (*spec == '\'')
+ {
+ opts |= human_group_digits;
+ spec++;
+ }
+
+ if (0 <= (i = ARGMATCH (spec, block_size_args, block_size_opts)))
+ {
+ opts |= block_size_opts[i];
+ *block_size = 1;
+ }
+ else
+ {
+ char *ptr;
+ strtol_error e = xstrtoumax (spec, &ptr, 0, block_size,
+ "eEgGkKmMpPtTyYzZ0");
+ if (e != LONGINT_OK)
+ {
+ *options = 0;
+ return e;
+ }
+ for (; ! ('0' <= *spec && *spec <= '9'); spec++)
+ if (spec == ptr)
+ {
+ opts |= human_SI;
+ if (ptr[-1] == 'B')
+ opts |= human_B;
+ if (ptr[-1] != 'B' || ptr[-2] == 'i')
+ opts |= human_base_1024;
+ break;
+ }
+ }
+ }
+
+ *options = opts;
+ return LONGINT_OK;
+}
+
+enum strtol_error
+human_options (char const *spec, int *opts, uintmax_t *block_size)
+{
+ strtol_error e = humblock (spec, block_size, opts);
+ if (*block_size == 0)
+ {
+ *block_size = default_block_size ();
+ e = LONGINT_INVALID;
+ }
+ return e;
+}
diff --git a/gnulib/lib/human.h b/gnulib/lib/human.h
new file mode 100644
index 0000000..fb8a089
--- /dev/null
+++ b/gnulib/lib/human.h
@@ -0,0 +1,83 @@
+/* human.h -- print human readable file size
+
+ Copyright (C) 1996-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Larry McVoy. */
+
+#ifndef HUMAN_H_
+# define HUMAN_H_ 1
+
+# include <limits.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <unistd.h>
+
+# include <xstrtol.h>
+
+/* A conservative bound on the maximum length of a human-readable string.
+ The output can be the square of the largest uintmax_t, so double
+ its size before converting to a bound.
+ log10 (2.0) < 146/485. Add 1 for integer division truncation.
+ Also, the output can have a thousands separator between every digit,
+ so multiply by MB_LEN_MAX + 1 and then subtract MB_LEN_MAX.
+ Append 1 for a space before the suffix.
+ Finally, append 3, the maximum length of a suffix. */
+# define LONGEST_HUMAN_READABLE \
+ ((2 * sizeof (uintmax_t) * CHAR_BIT * 146 / 485 + 1) * (MB_LEN_MAX + 1) \
+ - MB_LEN_MAX + 1 + 3)
+
+/* Options for human_readable. */
+enum
+{
+ /* Unless otherwise specified these options may be ORed together. */
+
+ /* The following three options are mutually exclusive. */
+ /* Round to plus infinity (default). */
+ human_ceiling = 0,
+ /* Round to nearest, ties to even. */
+ human_round_to_nearest = 1,
+ /* Round to minus infinity. */
+ human_floor = 2,
+
+ /* Group digits together, e.g. `1,000,000'. This uses the
+ locale-defined grouping; the traditional C locale does not group,
+ so this has effect only if some other locale is in use. */
+ human_group_digits = 4,
+
+ /* When autoscaling, suppress ".0" at end. */
+ human_suppress_point_zero = 8,
+
+ /* Scale output and use SI-style units, ignoring the output block size. */
+ human_autoscale = 16,
+
+ /* Prefer base 1024 to base 1000. */
+ human_base_1024 = 32,
+
+ /* Prepend " " before unit symbol. */
+ human_space_before_unit = 64,
+
+ /* Append SI prefix, e.g. "k" or "M". */
+ human_SI = 128,
+
+ /* Append "B" (if base 1000) or "iB" (if base 1024) to SI prefix. */
+ human_B = 256
+};
+
+char *human_readable (uintmax_t, char *, int, uintmax_t, uintmax_t);
+
+enum strtol_error human_options (char const *, int *, uintmax_t *);
+
+#endif /* HUMAN_H_ */
diff --git a/gnulib/lib/i-ring.c b/gnulib/lib/i-ring.c
new file mode 100644
index 0000000..b603b0b
--- /dev/null
+++ b/gnulib/lib/i-ring.c
@@ -0,0 +1,68 @@
+/* a simple ring buffer
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "i-ring.h"
+
+#include <stdlib.h>
+
+void
+i_ring_init (I_ring *ir, int default_val)
+{
+ int i;
+ ir->ir_empty = true;
+ ir->ir_front = 0;
+ ir->ir_back = 0;
+ for (i = 0; i < I_RING_SIZE; i++)
+ ir->ir_data[i] = default_val;
+ ir->ir_default_val = default_val;
+}
+
+bool
+i_ring_empty (I_ring const *ir)
+{
+ return ir->ir_empty;
+}
+
+int
+i_ring_push (I_ring *ir, int val)
+{
+ unsigned int dest_idx = (ir->ir_front + !ir->ir_empty) % I_RING_SIZE;
+ int old_val = ir->ir_data[dest_idx];
+ ir->ir_data[dest_idx] = val;
+ ir->ir_front = dest_idx;
+ if (dest_idx == ir->ir_back)
+ ir->ir_back = (ir->ir_back + !ir->ir_empty) % I_RING_SIZE;
+ ir->ir_empty = false;
+ return old_val;
+}
+
+int
+i_ring_pop (I_ring *ir)
+{
+ int top_val;
+ if (i_ring_empty (ir))
+ abort ();
+ top_val = ir->ir_data[ir->ir_front];
+ ir->ir_data[ir->ir_front] = ir->ir_default_val;
+ if (ir->ir_front == ir->ir_back)
+ ir->ir_empty = true;
+ else
+ ir->ir_front = ((ir->ir_front + I_RING_SIZE - 1) % I_RING_SIZE);
+ return top_val;
+}
diff --git a/gnulib/lib/i-ring.h b/gnulib/lib/i-ring.h
new file mode 100644
index 0000000..ae81f68
--- /dev/null
+++ b/gnulib/lib/i-ring.h
@@ -0,0 +1,44 @@
+/* definitions for a simple ring buffer
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include "verify.h"
+
+enum { I_RING_SIZE = 4 };
+verify (1 <= I_RING_SIZE);
+
+/* When ir_empty is true, the ring is empty.
+ Otherwise, ir_data[B..F] are defined, where B..F is the contiguous
+ range of indices, modulo I_RING_SIZE, from back to front, inclusive.
+ Undefined elements of ir_data are always set to ir_default_val.
+ Popping from an empty ring aborts.
+ Pushing onto a full ring returns the displaced value.
+ An empty ring has F==B and ir_empty == true.
+ A ring with one entry still has F==B, but now ir_empty == false. */
+struct I_ring
+{
+ int ir_data[I_RING_SIZE];
+ int ir_default_val;
+ unsigned int ir_front;
+ unsigned int ir_back;
+ bool ir_empty;
+};
+typedef struct I_ring I_ring;
+
+void i_ring_init (I_ring *ir, int ir_default_val);
+int i_ring_push (I_ring *ir, int val);
+int i_ring_pop (I_ring *ir);
+bool i_ring_empty (I_ring const *ir) _GL_ATTRIBUTE_PURE;
diff --git a/gnulib/lib/iconv.c b/gnulib/lib/iconv.c
new file mode 100644
index 0000000..ecf0d9f
--- /dev/null
+++ b/gnulib/lib/iconv.c
@@ -0,0 +1,450 @@
+/* Character set conversion.
+ Copyright (C) 1999-2001, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <stddef.h>
+
+#if REPLACE_ICONV_UTF
+# include <errno.h>
+# include <stdint.h>
+# include <stdlib.h>
+# include "unistr.h"
+# ifndef uintptr_t
+# define uintptr_t unsigned long
+# endif
+#endif
+
+#if REPLACE_ICONV_UTF
+
+/* UTF-{16,32}{BE,LE} converters taken from GNU libiconv 1.11. */
+
+/* Return code if invalid. (xxx_mbtowc) */
+# define RET_ILSEQ -1
+/* Return code if no bytes were read. (xxx_mbtowc) */
+# define RET_TOOFEW -2
+
+/* Return code if invalid. (xxx_wctomb) */
+# define RET_ILUNI -1
+/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
+# define RET_TOOSMALL -2
+
+/*
+ * UTF-16BE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 2)
+ {
+ ucs4_t wc = (s[0] << 8) + s[1];
+ if (wc >= 0xd800 && wc < 0xdc00)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc2 = (s[2] << 8) + s[3];
+ if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+ return RET_ILSEQ;
+ *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+ return 4;
+ }
+ }
+ else if (wc >= 0xdc00 && wc < 0xe000)
+ {
+ return RET_ILSEQ;
+ }
+ else
+ {
+ *pwc = wc;
+ return 2;
+ }
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf16be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (!(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (wc < 0x10000)
+ {
+ if (n >= 2)
+ {
+ r[0] = (unsigned char) (wc >> 8);
+ r[1] = (unsigned char) wc;
+ return 2;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ else if (wc < 0x110000)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+ ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+ r[0] = (unsigned char) (wc1 >> 8);
+ r[1] = (unsigned char) wc1;
+ r[2] = (unsigned char) (wc2 >> 8);
+ r[3] = (unsigned char) wc2;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-16LE
+ */
+
+/* Specification: RFC 2781 */
+
+static int
+utf16le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 2)
+ {
+ ucs4_t wc = s[0] + (s[1] << 8);
+ if (wc >= 0xd800 && wc < 0xdc00)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc2 = s[2] + (s[3] << 8);
+ if (!(wc2 >= 0xdc00 && wc2 < 0xe000))
+ return RET_ILSEQ;
+ *pwc = 0x10000 + ((wc - 0xd800) << 10) + (wc2 - 0xdc00);
+ return 4;
+ }
+ }
+ else if (wc >= 0xdc00 && wc < 0xe000)
+ {
+ return RET_ILSEQ;
+ }
+ else
+ {
+ *pwc = wc;
+ return 2;
+ }
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf16le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (!(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (wc < 0x10000)
+ {
+ if (n >= 2)
+ {
+ r[0] = (unsigned char) wc;
+ r[1] = (unsigned char) (wc >> 8);
+ return 2;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ else if (wc < 0x110000)
+ {
+ if (n >= 4)
+ {
+ ucs4_t wc1 = 0xd800 + ((wc - 0x10000) >> 10);
+ ucs4_t wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff);
+ r[0] = (unsigned char) wc1;
+ r[1] = (unsigned char) (wc1 >> 8);
+ r[2] = (unsigned char) wc2;
+ r[3] = (unsigned char) (wc2 >> 8);
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-32BE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32be_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 4)
+ {
+ ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ *pwc = wc;
+ return 4;
+ }
+ else
+ return RET_ILSEQ;
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf32be_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (n >= 4)
+ {
+ r[0] = 0;
+ r[1] = (unsigned char) (wc >> 16);
+ r[2] = (unsigned char) (wc >> 8);
+ r[3] = (unsigned char) wc;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ return RET_ILUNI;
+}
+
+/*
+ * UTF-32LE
+ */
+
+/* Specification: Unicode 3.1 Standard Annex #19 */
+
+static int
+utf32le_mbtowc (ucs4_t *pwc, const unsigned char *s, size_t n)
+{
+ if (n >= 4)
+ {
+ ucs4_t wc = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ *pwc = wc;
+ return 4;
+ }
+ else
+ return RET_ILSEQ;
+ }
+ return RET_TOOFEW;
+}
+
+static int
+utf32le_wctomb (unsigned char *r, ucs4_t wc, size_t n)
+{
+ if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000))
+ {
+ if (n >= 4)
+ {
+ r[0] = (unsigned char) wc;
+ r[1] = (unsigned char) (wc >> 8);
+ r[2] = (unsigned char) (wc >> 16);
+ r[3] = 0;
+ return 4;
+ }
+ else
+ return RET_TOOSMALL;
+ }
+ return RET_ILUNI;
+}
+
+#endif
+
+size_t
+rpl_iconv (iconv_t cd,
+ ICONV_CONST char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+#undef iconv
+{
+#if REPLACE_ICONV_UTF
+ switch ((uintptr_t) cd)
+ {
+ {
+ int (*xxx_wctomb) (unsigned char *, ucs4_t, size_t);
+
+ case (uintptr_t) _ICONV_UTF8_UTF16BE:
+ xxx_wctomb = utf16be_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF16LE:
+ xxx_wctomb = utf16le_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF32BE:
+ xxx_wctomb = utf32be_wctomb;
+ goto loop_from_utf8;
+ case (uintptr_t) _ICONV_UTF8_UTF32LE:
+ xxx_wctomb = utf32le_wctomb;
+ goto loop_from_utf8;
+
+ loop_from_utf8:
+ if (inbuf == NULL || *inbuf == NULL)
+ return 0;
+ {
+ ICONV_CONST char *inptr = *inbuf;
+ size_t inleft = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outleft = *outbytesleft;
+ size_t res = 0;
+ while (inleft > 0)
+ {
+ ucs4_t uc;
+ int m = u8_mbtoucr (&uc, (const uint8_t *) inptr, inleft);
+ if (m <= 0)
+ {
+ if (m == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (m == -2)
+ {
+ errno = EINVAL;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ int n = xxx_wctomb ((uint8_t *) outptr, uc, outleft);
+ if (n < 0)
+ {
+ if (n == RET_ILUNI)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (n == RET_TOOSMALL)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ inptr += m;
+ inleft -= m;
+ outptr += n;
+ outleft -= n;
+ }
+ }
+ }
+ *inbuf = inptr;
+ *inbytesleft = inleft;
+ *outbuf = outptr;
+ *outbytesleft = outleft;
+ return res;
+ }
+ }
+
+ {
+ int (*xxx_mbtowc) (ucs4_t *, const unsigned char *, size_t);
+
+ case (uintptr_t) _ICONV_UTF16BE_UTF8:
+ xxx_mbtowc = utf16be_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF16LE_UTF8:
+ xxx_mbtowc = utf16le_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF32BE_UTF8:
+ xxx_mbtowc = utf32be_mbtowc;
+ goto loop_to_utf8;
+ case (uintptr_t) _ICONV_UTF32LE_UTF8:
+ xxx_mbtowc = utf32le_mbtowc;
+ goto loop_to_utf8;
+
+ loop_to_utf8:
+ if (inbuf == NULL || *inbuf == NULL)
+ return 0;
+ {
+ ICONV_CONST char *inptr = *inbuf;
+ size_t inleft = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outleft = *outbytesleft;
+ size_t res = 0;
+ while (inleft > 0)
+ {
+ ucs4_t uc;
+ int m = xxx_mbtowc (&uc, (const uint8_t *) inptr, inleft);
+ if (m <= 0)
+ {
+ if (m == RET_ILSEQ)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (m == RET_TOOFEW)
+ {
+ errno = EINVAL;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ int n = u8_uctomb ((uint8_t *) outptr, uc, outleft);
+ if (n < 0)
+ {
+ if (n == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ break;
+ }
+ if (n == -2)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ break;
+ }
+ abort ();
+ }
+ else
+ {
+ inptr += m;
+ inleft -= m;
+ outptr += n;
+ outleft -= n;
+ }
+ }
+ }
+ *inbuf = inptr;
+ *inbytesleft = inleft;
+ *outbuf = outptr;
+ *outbytesleft = outleft;
+ return res;
+ }
+ }
+ }
+#endif
+ return iconv (cd, inbuf, inbytesleft, outbuf, outbytesleft);
+}
diff --git a/gnulib/lib/iconv.in.h b/gnulib/lib/iconv.in.h
new file mode 100644
index 0000000..6ff3493
--- /dev/null
+++ b/gnulib/lib/iconv.in.h
@@ -0,0 +1,111 @@
+/* A GNU-like <iconv.h>.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ICONV_H@
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+#define _@GUARD_PREFIX@_ICONV_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV_OPEN@
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+ ("ISO-8859-1" etc.) as far as possible. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv_open rpl_iconv_open
+# endif
+_GL_FUNCDECL_RPL (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode));
+# else
+_GL_CXXALIAS_SYS (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode));
+# endif
+_GL_CXXALIASWARN (iconv_open);
+#endif
+
+#if @REPLACE_ICONV_UTF@
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+ Not public. */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv rpl_iconv
+# endif
+_GL_FUNCDECL_RPL (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft));
+_GL_CXXALIAS_RPL (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft));
+# else
+_GL_CXXALIAS_SYS (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft));
+# endif
+_GL_CXXALIASWARN (iconv);
+# ifndef ICONV_CONST
+# define ICONV_CONST @ICONV_CONST@
+# endif
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv_close rpl_iconv_close
+# endif
+_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd));
+_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd));
+# else
+_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd));
+# endif
+_GL_CXXALIASWARN (iconv_close);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_ICONV_H */
+#endif /* _@GUARD_PREFIX@_ICONV_H */
diff --git a/gnulib/lib/iconv_close.c b/gnulib/lib/iconv_close.c
new file mode 100644
index 0000000..8061dd0
--- /dev/null
+++ b/gnulib/lib/iconv_close.c
@@ -0,0 +1,47 @@
+/* Character set conversion.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <stdint.h>
+#ifndef uintptr_t
+# define uintptr_t unsigned long
+#endif
+
+int
+rpl_iconv_close (iconv_t cd)
+#undef iconv_close
+{
+#if REPLACE_ICONV_UTF
+ switch ((uintptr_t) cd)
+ {
+ case (uintptr_t) _ICONV_UTF8_UTF16BE:
+ case (uintptr_t) _ICONV_UTF8_UTF16LE:
+ case (uintptr_t) _ICONV_UTF8_UTF32BE:
+ case (uintptr_t) _ICONV_UTF8_UTF32LE:
+ case (uintptr_t) _ICONV_UTF16BE_UTF8:
+ case (uintptr_t) _ICONV_UTF16LE_UTF8:
+ case (uintptr_t) _ICONV_UTF32BE_UTF8:
+ case (uintptr_t) _ICONV_UTF32LE_UTF8:
+ return 0;
+ }
+#endif
+ return iconv_close (cd);
+}
diff --git a/gnulib/lib/iconv_open-aix.gperf b/gnulib/lib/iconv_open-aix.gperf
new file mode 100644
index 0000000..6782b99
--- /dev/null
+++ b/gnulib/lib/iconv_open-aix.gperf
@@ -0,0 +1,44 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On AIX 5.1, look in /usr/lib/nls/loc/uconvTable.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "IBM-437"
+CP850, "IBM-850"
+CP852, "IBM-852"
+CP856, "IBM-856"
+CP857, "IBM-857"
+CP861, "IBM-861"
+CP865, "IBM-865"
+CP869, "IBM-869"
+ISO-8859-13, "IBM-921"
+CP922, "IBM-922"
+CP932, "IBM-932"
+CP943, "IBM-943"
+CP1046, "IBM-1046"
+CP1124, "IBM-1124"
+CP1125, "IBM-1125"
+CP1129, "IBM-1129"
+CP1252, "IBM-1252"
+GB2312, "IBM-eucCN"
+EUC-JP, "IBM-eucJP"
+EUC-KR, "IBM-eucKR"
+EUC-TW, "IBM-eucTW"
+BIG5, "big5"
diff --git a/gnulib/lib/iconv_open-hpux.gperf b/gnulib/lib/iconv_open-hpux.gperf
new file mode 100644
index 0000000..5a35c83
--- /dev/null
+++ b/gnulib/lib/iconv_open-hpux.gperf
@@ -0,0 +1,56 @@
+struct mapping { int standard_name; const char vendor_name[9 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On HP-UX 11.11, look in /usr/lib/nls/iconv.
+ISO-8859-1, "iso88591"
+ISO-8859-2, "iso88592"
+ISO-8859-5, "iso88595"
+ISO-8859-6, "iso88596"
+ISO-8859-7, "iso88597"
+ISO-8859-8, "iso88598"
+ISO-8859-9, "iso88599"
+ISO-8859-15, "iso885915"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP864, "cp864"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+HP-ROMAN8, "roman8"
+HP-ARABIC8, "arabic8"
+HP-GREEK8, "greek8"
+HP-HEBREW8, "hebrew8"
+HP-TURKISH8, "turkish8"
+HP-KANA8, "kana8"
+TIS-620, "tis620"
+GB2312, "hp15CN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "sjis"
+UTF-8, "utf8"
diff --git a/gnulib/lib/iconv_open-irix.gperf b/gnulib/lib/iconv_open-irix.gperf
new file mode 100644
index 0000000..3672a80
--- /dev/null
+++ b/gnulib/lib/iconv_open-irix.gperf
@@ -0,0 +1,31 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On IRIX 6.5, look in /usr/lib/iconv and /usr/lib/international/encodings.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+KOI8-R, "KOI8"
+CP855, "DOS855"
+CP1251, "WIN1251"
+GB2312, "eucCN"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+SHIFT_JIS, "sjis"
+TIS-620, "TIS620"
diff --git a/gnulib/lib/iconv_open-osf.gperf b/gnulib/lib/iconv_open-osf.gperf
new file mode 100644
index 0000000..f468ff6
--- /dev/null
+++ b/gnulib/lib/iconv_open-osf.gperf
@@ -0,0 +1,50 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On OSF/1 5.1, look in /usr/lib/nls/loc/iconv.
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP437, "cp437"
+CP775, "cp775"
+CP850, "cp850"
+CP852, "cp852"
+CP855, "cp855"
+CP857, "cp857"
+CP861, "cp861"
+CP862, "cp862"
+CP865, "cp865"
+CP866, "cp866"
+CP869, "cp869"
+CP874, "cp874"
+CP949, "KSC5601"
+CP1250, "cp1250"
+CP1251, "cp1251"
+CP1252, "cp1252"
+CP1253, "cp1253"
+CP1254, "cp1254"
+CP1255, "cp1255"
+CP1256, "cp1256"
+CP1257, "cp1257"
+CP1258, "cp1258"
+EUC-JP, "eucJP"
+EUC-KR, "eucKR"
+EUC-TW, "eucTW"
+BIG5, "big5"
+SHIFT_JIS, "SJIS"
+TIS-620, "TACTIS"
diff --git a/gnulib/lib/iconv_open-solaris.gperf b/gnulib/lib/iconv_open-solaris.gperf
new file mode 100644
index 0000000..7d7da38
--- /dev/null
+++ b/gnulib/lib/iconv_open-solaris.gperf
@@ -0,0 +1,30 @@
+struct mapping { int standard_name; const char vendor_name[10 + 1]; };
+%struct-type
+%language=ANSI-C
+%define slot-name standard_name
+%define hash-function-name mapping_hash
+%define lookup-function-name mapping_lookup
+%readonly-tables
+%global-table
+%define word-array-name mappings
+%pic
+%%
+# On Solaris 10, look in the "iconv -l" output. Some aliases are advertised but
+# not actually supported by the iconv() function and by the 'iconv' program.
+# For example:
+# $ echo abc | iconv -f 646 -t ISO-8859-1
+# Not supported 646 to ISO-8859-1
+# $ echo abc | iconv -f 646 -t ISO8859-1
+$ abc
+ASCII, "646"
+ISO-8859-1, "ISO8859-1"
+ISO-8859-2, "ISO8859-2"
+ISO-8859-3, "ISO8859-3"
+ISO-8859-4, "ISO8859-4"
+ISO-8859-5, "ISO8859-5"
+ISO-8859-6, "ISO8859-6"
+ISO-8859-7, "ISO8859-7"
+ISO-8859-8, "ISO8859-8"
+ISO-8859-9, "ISO8859-9"
+ISO-8859-15, "ISO8859-15"
+CP1251, "ansi-1251"
diff --git a/gnulib/lib/iconv_open.c b/gnulib/lib/iconv_open.c
new file mode 100644
index 0000000..b303169
--- /dev/null
+++ b/gnulib/lib/iconv_open.c
@@ -0,0 +1,173 @@
+/* Character set conversion.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <iconv.h>
+
+#include <errno.h>
+#include <string.h>
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* Namespace cleanliness. */
+#define mapping_lookup rpl_iconv_open_mapping_lookup
+
+/* The macro ICONV_FLAVOR is defined to one of these or undefined. */
+
+#define ICONV_FLAVOR_AIX "iconv_open-aix.h"
+#define ICONV_FLAVOR_HPUX "iconv_open-hpux.h"
+#define ICONV_FLAVOR_IRIX "iconv_open-irix.h"
+#define ICONV_FLAVOR_OSF "iconv_open-osf.h"
+#define ICONV_FLAVOR_SOLARIS "iconv_open-solaris.h"
+
+#ifdef ICONV_FLAVOR
+# include ICONV_FLAVOR
+#endif
+
+iconv_t
+rpl_iconv_open (const char *tocode, const char *fromcode)
+#undef iconv_open
+{
+ char fromcode_upper[32];
+ char tocode_upper[32];
+ char *fromcode_upper_end;
+ char *tocode_upper_end;
+
+#if REPLACE_ICONV_UTF
+ /* Special handling of conversion between UTF-8 and UTF-{16,32}{BE,LE}.
+ Do this here, before calling the real iconv_open(), because OSF/1 5.1
+ iconv() to these encoding inserts a BOM, which is wrong.
+ We do not need to handle conversion between arbitrary encodings and
+ UTF-{16,32}{BE,LE}, because the 'striconveh' module implements two-step
+ conversion throough UTF-8.
+ The _ICONV_* constants are chosen to be disjoint from any iconv_t
+ returned by the system's iconv_open() functions. Recall that iconv_t
+ is a scalar type. */
+ if (c_toupper (fromcode[0]) == 'U'
+ && c_toupper (fromcode[1]) == 'T'
+ && c_toupper (fromcode[2]) == 'F'
+ && fromcode[3] == '-')
+ {
+ if (c_toupper (tocode[0]) == 'U'
+ && c_toupper (tocode[1]) == 'T'
+ && c_toupper (tocode[2]) == 'F'
+ && tocode[3] == '-')
+ {
+ if (strcmp (fromcode + 4, "8") == 0)
+ {
+ if (c_strcasecmp (tocode + 4, "16BE") == 0)
+ return _ICONV_UTF8_UTF16BE;
+ if (c_strcasecmp (tocode + 4, "16LE") == 0)
+ return _ICONV_UTF8_UTF16LE;
+ if (c_strcasecmp (tocode + 4, "32BE") == 0)
+ return _ICONV_UTF8_UTF32BE;
+ if (c_strcasecmp (tocode + 4, "32LE") == 0)
+ return _ICONV_UTF8_UTF32LE;
+ }
+ else if (strcmp (tocode + 4, "8") == 0)
+ {
+ if (c_strcasecmp (fromcode + 4, "16BE") == 0)
+ return _ICONV_UTF16BE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "16LE") == 0)
+ return _ICONV_UTF16LE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "32BE") == 0)
+ return _ICONV_UTF32BE_UTF8;
+ if (c_strcasecmp (fromcode + 4, "32LE") == 0)
+ return _ICONV_UTF32LE_UTF8;
+ }
+ }
+ }
+#endif
+
+ /* Do *not* add special support for 8-bit encodings like ASCII or ISO-8859-1
+ here. This would lead to programs that work in some locales (such as the
+ "C" or "en_US" locales) but do not work in East Asian locales. It is
+ better if programmers make their programs depend on GNU libiconv (except
+ on glibc systems), e.g. by using the AM_ICONV macro and documenting the
+ dependency in an INSTALL or DEPENDENCIES file. */
+
+ /* Try with the original names first.
+ This covers the case when fromcode or tocode is a lowercase encoding name
+ that is understood by the system's iconv_open but not listed in our
+ mappings table. */
+ {
+ iconv_t cd = iconv_open (tocode, fromcode);
+ if (cd != (iconv_t)(-1))
+ return cd;
+ }
+
+ /* Convert the encodings to upper case, because
+ 1. in the arguments of iconv_open() on AIX, HP-UX, and OSF/1 the case
+ matters,
+ 2. it makes searching in the table faster. */
+ {
+ const char *p = fromcode;
+ char *q = fromcode_upper;
+ while ((*q = c_toupper (*p)) != '\0')
+ {
+ p++;
+ q++;
+ if (q == &fromcode_upper[SIZEOF (fromcode_upper)])
+ {
+ errno = EINVAL;
+ return (iconv_t)(-1);
+ }
+ }
+ fromcode_upper_end = q;
+ }
+
+ {
+ const char *p = tocode;
+ char *q = tocode_upper;
+ while ((*q = c_toupper (*p)) != '\0')
+ {
+ p++;
+ q++;
+ if (q == &tocode_upper[SIZEOF (tocode_upper)])
+ {
+ errno = EINVAL;
+ return (iconv_t)(-1);
+ }
+ }
+ tocode_upper_end = q;
+ }
+
+#ifdef ICONV_FLAVOR
+ /* Apply the mappings. */
+ {
+ const struct mapping *m =
+ mapping_lookup (fromcode_upper, fromcode_upper_end - fromcode_upper);
+
+ fromcode = (m != NULL ? m->vendor_name : fromcode_upper);
+ }
+ {
+ const struct mapping *m =
+ mapping_lookup (tocode_upper, tocode_upper_end - tocode_upper);
+
+ tocode = (m != NULL ? m->vendor_name : tocode_upper);
+ }
+#else
+ fromcode = fromcode_upper;
+ tocode = tocode_upper;
+#endif
+
+ return iconv_open (tocode, fromcode);
+}
diff --git a/gnulib/lib/iconveh.h b/gnulib/lib/iconveh.h
new file mode 100644
index 0000000..7f7286b
--- /dev/null
+++ b/gnulib/lib/iconveh.h
@@ -0,0 +1,41 @@
+/* Character set conversion handler type.
+ Copyright (C) 2001-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _ICONVEH_H
+#define _ICONVEH_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Handling of unconvertible characters. */
+enum iconv_ilseq_handler
+{
+ iconveh_error, /* return and set errno = EILSEQ */
+ iconveh_question_mark, /* use one '?' per unconvertible character */
+ iconveh_escape_sequence /* use escape sequence \uxxxx or \Uxxxxxxxx */
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _ICONVEH_H */
diff --git a/gnulib/lib/idcache.c b/gnulib/lib/idcache.c
new file mode 100644
index 0000000..9065cc8
--- /dev/null
+++ b/gnulib/lib/idcache.c
@@ -0,0 +1,227 @@
+/* idcache.c -- map user and group IDs, cached for speed
+
+ Copyright (C) 1985, 1988-1990, 1997-1998, 2003, 2005-2007, 2009-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "idcache.h"
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include <unistd.h>
+
+#include "xalloc.h"
+
+#ifdef __DJGPP__
+static char digits[] = "0123456789";
+#endif
+
+struct userid
+{
+ union
+ {
+ uid_t u;
+ gid_t g;
+ } id;
+ struct userid *next;
+ char name[FLEXIBLE_ARRAY_MEMBER];
+};
+
+/* FIXME: provide a function to free any malloc'd storage and reset lists,
+ so that an application can use code like this just before exiting:
+ #ifdef lint
+ idcache_clear ();
+ #endif
+*/
+
+static struct userid *user_alist;
+
+/* Each entry on list is a user name for which the first lookup failed. */
+static struct userid *nouser_alist;
+
+/* Use the same struct as for userids. */
+static struct userid *group_alist;
+
+/* Each entry on list is a group name for which the first lookup failed. */
+static struct userid *nogroup_alist;
+
+/* Translate UID to a login name, with cache, or NULL if unresolved. */
+
+char *
+getuser (uid_t uid)
+{
+ struct userid *tail;
+ struct userid *match = NULL;
+
+ for (tail = user_alist; tail; tail = tail->next)
+ {
+ if (tail->id.u == uid)
+ {
+ match = tail;
+ break;
+ }
+ }
+
+ if (match == NULL)
+ {
+ struct passwd *pwent = getpwuid (uid);
+ char const *name = pwent ? pwent->pw_name : "";
+ match = xmalloc (offsetof (struct userid, name) + strlen (name) + 1);
+ match->id.u = uid;
+ strcpy (match->name, name);
+
+ /* Add to the head of the list, so most recently used is first. */
+ match->next = user_alist;
+ user_alist = match;
+ }
+
+ return match->name[0] ? match->name : NULL;
+}
+
+/* Translate USER to a UID, with cache.
+ Return NULL if there is no such user.
+ (We also cache which user names have no passwd entry,
+ so we don't keep looking them up.) */
+
+uid_t *
+getuidbyname (const char *user)
+{
+ struct userid *tail;
+ struct passwd *pwent;
+
+ for (tail = user_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *user && !strcmp (tail->name, user))
+ return &tail->id.u;
+
+ for (tail = nouser_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *user && !strcmp (tail->name, user))
+ return NULL;
+
+ pwent = getpwnam (user);
+#ifdef __DJGPP__
+ /* We need to pretend to be the user USER, to make
+ pwd functions know about an arbitrary user name. */
+ if (!pwent && strspn (user, digits) < strlen (user))
+ {
+ setenv ("USER", user, 1);
+ pwent = getpwnam (user); /* now it will succeed */
+ }
+#endif
+
+ tail = xmalloc (offsetof (struct userid, name) + strlen (user) + 1);
+ strcpy (tail->name, user);
+
+ /* Add to the head of the list, so most recently used is first. */
+ if (pwent)
+ {
+ tail->id.u = pwent->pw_uid;
+ tail->next = user_alist;
+ user_alist = tail;
+ return &tail->id.u;
+ }
+
+ tail->next = nouser_alist;
+ nouser_alist = tail;
+ return NULL;
+}
+
+/* Translate GID to a group name, with cache, or NULL if unresolved. */
+
+char *
+getgroup (gid_t gid)
+{
+ struct userid *tail;
+ struct userid *match = NULL;
+
+ for (tail = group_alist; tail; tail = tail->next)
+ {
+ if (tail->id.g == gid)
+ {
+ match = tail;
+ break;
+ }
+ }
+
+ if (match == NULL)
+ {
+ struct group *grent = getgrgid (gid);
+ char const *name = grent ? grent->gr_name : "";
+ match = xmalloc (offsetof (struct userid, name) + strlen (name) + 1);
+ match->id.g = gid;
+ strcpy (match->name, name);
+
+ /* Add to the head of the list, so most recently used is first. */
+ match->next = group_alist;
+ group_alist = match;
+ }
+
+ return match->name[0] ? match->name : NULL;
+}
+
+/* Translate GROUP to a GID, with cache.
+ Return NULL if there is no such group.
+ (We also cache which group names have no group entry,
+ so we don't keep looking them up.) */
+
+gid_t *
+getgidbyname (const char *group)
+{
+ struct userid *tail;
+ struct group *grent;
+
+ for (tail = group_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *group && !strcmp (tail->name, group))
+ return &tail->id.g;
+
+ for (tail = nogroup_alist; tail; tail = tail->next)
+ /* Avoid a function call for the most common case. */
+ if (*tail->name == *group && !strcmp (tail->name, group))
+ return NULL;
+
+ grent = getgrnam (group);
+#ifdef __DJGPP__
+ /* We need to pretend to belong to group GROUP, to make
+ grp functions know about an arbitrary group name. */
+ if (!grent && strspn (group, digits) < strlen (group))
+ {
+ setenv ("GROUP", group, 1);
+ grent = getgrnam (group); /* now it will succeed */
+ }
+#endif
+
+ tail = xmalloc (offsetof (struct userid, name) + strlen (group) + 1);
+ strcpy (tail->name, group);
+
+ /* Add to the head of the list, so most recently used is first. */
+ if (grent)
+ {
+ tail->id.g = grent->gr_gid;
+ tail->next = group_alist;
+ group_alist = tail;
+ return &tail->id.g;
+ }
+
+ tail->next = nogroup_alist;
+ nogroup_alist = tail;
+ return NULL;
+}
diff --git a/gnulib/lib/idcache.h b/gnulib/lib/idcache.h
new file mode 100644
index 0000000..e7573b8
--- /dev/null
+++ b/gnulib/lib/idcache.h
@@ -0,0 +1,11 @@
+#ifndef IDCACHE_H
+# define IDCACHE_H 1
+
+# include <sys/types.h>
+
+extern char *getuser (uid_t uid);
+extern char *getgroup (gid_t gid);
+extern uid_t *getuidbyname (const char *user);
+extern gid_t *getgidbyname (const char *group);
+
+#endif
diff --git a/gnulib/lib/idpriv-drop.c b/gnulib/lib/idpriv-drop.c
new file mode 100644
index 0000000..f4929d4
--- /dev/null
+++ b/gnulib/lib/idpriv-drop.c
@@ -0,0 +1,129 @@
+/* Dropping uid/gid privileges of the current process permanently.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int
+idpriv_drop (void)
+{
+#if HAVE_GETUID
+ int uid = getuid ();
+#endif
+#if HAVE_GETGID
+ int gid = getgid ();
+#endif
+
+ /* Drop the gid privilege first, because in some cases the gid privilege
+ cannot be dropped after the uid privilege has been dropped. */
+
+ /* This is for executables that have the setgid bit set. */
+#if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* This code is needed: In particular, on HP-UX 11.11, setregid (gid, gid)
+ may leave the saved gid as 0. See also the comment below regarding
+ setresuid. */
+ if (setresgid (gid, gid, gid) < 0)
+ return -1;
+#elif HAVE_SETREGID /* MacOS X, NetBSD, AIX, IRIX, Solaris, OSF/1, Cygwin */
+ if (setregid (gid, gid) < 0)
+ return -1;
+#elif HAVE_SETEGID /* Solaris 2.4 */
+ if (setegid (gid) < 0)
+ return -1;
+#endif
+
+ /* This is for executables that have the setuid bit set. */
+#if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* On systems which have setresuid(), we use it instead of setreuid(),
+ because
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ says about setreuid(): "The rule by which the saved uid id is modified
+ is complicated." Similarly, <http://unixpapa.com/incnote/setuid.html>
+ says about setreuid(): "What exactly happens to the saved UID when this
+ is used seems to vary a lot." */
+ if (setresuid (uid, uid, uid) < 0)
+ return -1;
+#elif HAVE_SETREUID /* MacOS X, NetBSD, AIX, IRIX, Solaris, OSF/1, Cygwin */
+ if (setreuid (uid, uid) < 0)
+ return -1;
+#elif HAVE_SETEUID /* Solaris 2.4 */
+ if (seteuid (uid) < 0)
+ return -1;
+#endif
+
+ /* Verify that the privileges have really been dropped.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ On Solaris (which has saved uids and gids but no getresuid, getresgid
+ functions), we could read /proc/<pid>/cred and verify the saved uid and
+ gid found there. But it's not clear to me when to interpret the file as a
+ 'prcred_t' and when as a 'prcred32_t'.
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ section 8.1.3 also recommends to use a setreuid call as a probe, but
+ this call would unexpectedly succeed (and the verification thus fail)
+ on Linux if the process has the CAP_SETUID capability.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+#if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != uid
+ || saved != uid)
+ abort ();
+ }
+#else
+# if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETUID
+ if (getuid () != uid)
+ abort ();
+# endif
+#endif
+#if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ gid_t real;
+ gid_t effective;
+ gid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != gid
+ || saved != gid)
+ abort ();
+ }
+#else
+# if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+# endif
+# if HAVE_GETGID
+ if (getgid () != gid)
+ abort ();
+# endif
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/idpriv-droptemp.c b/gnulib/lib/idpriv-droptemp.c
new file mode 100644
index 0000000..801a442
--- /dev/null
+++ b/gnulib/lib/idpriv-droptemp.c
@@ -0,0 +1,204 @@
+/* Dropping uid/gid privileges of the current process temporarily.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "idpriv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* The privileged uid and gid that the process had earlier. */
+#if HAVE_GETUID
+static int saved_uid = -1;
+#endif
+#if HAVE_GETGID
+static int saved_gid = -1;
+#endif
+
+int
+idpriv_temp_drop (void)
+{
+#if HAVE_GETEUID && HAVE_GETEGID && (HAVE_SETRESUID || HAVE_SETREUID) && (HAVE_SETRESGID || HAVE_SETREGID)
+ int uid = getuid ();
+ int gid = getgid ();
+
+ /* Find out about the privileged uid and gid at the first call. */
+ if (saved_uid == -1)
+ saved_uid = geteuid ();
+ if (saved_gid == -1)
+ saved_gid = getegid ();
+
+ /* Drop the gid privilege first, because in some cases the gid privilege
+ cannot be dropped after the uid privilege has been dropped. */
+
+ /* This is for executables that have the setgid bit set. */
+# if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ if (setresgid (-1, gid, saved_gid) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setregid (-1, gid) < 0)
+ return -1;
+# endif
+
+ /* This is for executables that have the setuid bit set. */
+# if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* See <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ figure 14. */
+ if (setresuid (-1, uid, saved_uid) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setreuid (-1, uid) < 0)
+ return -1;
+# endif
+
+ /* Verify that the privileges have really been dropped.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+# if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != uid
+ || saved != saved_uid)
+ abort ();
+ }
+# else
+# if HAVE_GETEUID
+ if (geteuid () != uid)
+ abort ();
+# endif
+ if (getuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != gid
+ || saved != saved_gid)
+ abort ();
+ }
+# else
+# if HAVE_GETEGID
+ if (getegid () != gid)
+ abort ();
+# endif
+ if (getgid () != gid)
+ abort ();
+# endif
+
+ return 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+int
+idpriv_temp_restore (void)
+{
+#if HAVE_GETEUID && HAVE_GETEGID && (HAVE_SETRESUID || HAVE_SETREUID) && (HAVE_SETRESGID || HAVE_SETREGID)
+ int uid = getuid ();
+ int gid = getgid ();
+
+ if (saved_uid == -1 || saved_gid == -1)
+ /* Caller error: idpriv_temp_drop was never invoked. */
+ abort ();
+
+ /* Acquire the gid privilege last, because in some cases the gid privilege
+ cannot be acquired before the uid privilege has been acquired. */
+
+ /* This is for executables that have the setuid bit set. */
+# if HAVE_SETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ /* See <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ figure 14. */
+ if (setresuid (-1, saved_uid, -1) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setreuid (-1, saved_uid) < 0)
+ return -1;
+# endif
+
+ /* This is for executables that have the setgid bit set. */
+# if HAVE_SETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ if (setresgid (-1, saved_gid, -1) < 0)
+ return -1;
+# else /* MacOS X, NetBSD, AIX, IRIX, Solaris >= 2.5, OSF/1, Cygwin */
+ if (setregid (-1, saved_gid) < 0)
+ return -1;
+# endif
+
+ /* Verify that the privileges have really been acquired.
+ This verification is here for security reasons. Doesn't matter if it
+ takes a couple of system calls.
+ When the verification fails, it indicates that we need to use different
+ API in the code above. Therefore 'abort ()', not 'return -1'. */
+# if HAVE_GETRESUID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresuid (&real, &effective, &saved) < 0
+ || real != uid
+ || effective != saved_uid
+ || saved != saved_uid)
+ abort ();
+ }
+# else
+# if HAVE_GETEUID
+ if (geteuid () != saved_uid)
+ abort ();
+# endif
+ if (getuid () != uid)
+ abort ();
+# endif
+# if HAVE_GETRESGID /* glibc, FreeBSD, OpenBSD, HP-UX */
+ {
+ uid_t real;
+ uid_t effective;
+ uid_t saved;
+ if (getresgid (&real, &effective, &saved) < 0
+ || real != gid
+ || effective != saved_gid
+ || saved != saved_gid)
+ abort ();
+ }
+# else
+# if HAVE_GETEGID
+ if (getegid () != saved_gid)
+ abort ();
+# endif
+ if (getgid () != gid)
+ abort ();
+# endif
+
+ return 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/idpriv.h b/gnulib/lib/idpriv.h
new file mode 100644
index 0000000..06024c2
--- /dev/null
+++ b/gnulib/lib/idpriv.h
@@ -0,0 +1,116 @@
+/* Dropping uid/gid privileges of the current process.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _IDPRIV_H
+#define _IDPRIV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This module allows programs which are installed with setuid or setgid bit
+ (and which therefore initially run with an effective user id or group id
+ different from the one of the current user) to drop their uid or gid
+ privilege, either permanently or temporarily.
+
+ It is absolutely necessary to minimize the amount of code that is running
+ with escalated privileges (e.g. with effective uid = root). The reason is
+ that any bug or exploit in a part of a program that is running with
+ escalated privileges is a security vulnerability that - upon discovery -
+ puts the users in danger and requires immediate fixing. Then consider that
+ there's a bug every 10 or 20 lines of code on average...
+
+ For programs that temporarily drop privileges but have the ability to
+ restore them later, there are additionally the dangers that
+ - Any bug in the non-privileged part of the program may be used to
+ create invalid data structures that will trigger security
+ vulnerabilities in the privileged part of the program.
+ - Code execution exploits in the non-privileged part of the program may
+ be used to invoke the function that restores high privileges and then
+ execute additional arbitrary code.
+
+ 1) The usual, and reasonably safe, way to minimize the amount of code
+ running with privileges is to create a separate executable, with setuid
+ or setgid bit, that contains only code for the tasks that require
+ privileges (and,of course, strict checking of the arguments, so that the
+ program cannot be abused). The main program is installed without setuid
+ or setgid bit.
+
+ 2) A less safe way is to do some privileged tasks at the beginning of the
+ program's run, and drop privileges permanently as soon as possible.
+
+ Note: There may still be security issues if the privileged task puts
+ sensitive data into the process memory or opens communication channels
+ to restricted facilities.
+
+ 3) The most unsafe way is to drop privileges temporarily for most of the
+ main program but to re-enable them for the duration of privileged tasks.
+
+ As explained above, this approach has uncontrollable dangers for
+ security.
+
+ This approach is normally not usable in multithreaded programs, because
+ you cannot know what kind of system calls the other threads could be
+ doing during the time the privileges are enabled.
+
+ With approach 1, you don't need gnulib modules.
+ With approach 2, you need the gnulib module 'idpriv-drop'.
+ With approach 3, you need the gnulib module 'idpriv-droptemp'. But really,
+ you should better stay away from this approach.
+ */
+
+/* For more in-depth discussion of these topics, see the papers/articles
+ * Hao Chen, David Wagner, Drew Dean: Setuid Demystified
+ <http://www.usenix.org/events/sec02/full_papers/chen/chen.pdf>
+ * Dan Tsafrir, Dilma da Silva, David Wagner: The Murky Issue of Changing
+ Process Identity: Revising "Setuid Demystified"
+ <http://www.eecs.berkeley.edu/~daw/papers/setuid-login08b.pdf>
+ <http://code.google.com/p/change-process-identity/>
+ * Dhruv Mohindra: Observe correct revocation order while relinquishing
+ privileges
+ <https://www.securecoding.cert.org/confluence/display/seccode/POS36-C.+Observe+correct+revocation+order+while+relinquishing+privileges>
+ */
+
+
+/* For approach 2. */
+
+/* Drop the uid and gid privileges of the current process.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to terminate the process. */
+extern int idpriv_drop (void);
+
+
+/* For approach 3. */
+
+/* Drop the uid and gid privileges of the current process in a way that allows
+ them to be restored later.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to terminate the process. */
+extern int idpriv_temp_drop (void);
+
+/* Restore the uid and gid privileges of the current process.
+ Return 0 if successful, or -1 with errno set upon failure. The recommended
+ handling of failure is to not perform the actions that require the escalated
+ privileges. */
+extern int idpriv_temp_restore (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _IDPRIV_H */
diff --git a/gnulib/lib/ignore-value.h b/gnulib/lib/ignore-value.h
new file mode 100644
index 0000000..f021a1a
--- /dev/null
+++ b/gnulib/lib/ignore-value.h
@@ -0,0 +1,62 @@
+/* ignore a function return without a compiler warning
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering, Eric Blake and Pádraig Brady. */
+
+/* Use "ignore_value" to avoid a warning when using a function declared with
+ gcc's warn_unused_result attribute, but for which you really do want to
+ ignore the result. Traditionally, people have used a "(void)" cast to
+ indicate that a function's return value is deliberately unused. However,
+ if the function is declared with __attribute__((warn_unused_result)),
+ gcc issues a warning even with the cast.
+
+ Caution: most of the time, you really should heed gcc's warning, and
+ check the return value. However, in those exceptional cases in which
+ you're sure you know what you're doing, use this function.
+
+ For the record, here's one of the ignorable warnings:
+ "copy.c:233: warning: ignoring return value of 'fchown',
+ declared with attribute warn_unused_result". */
+
+#ifndef _GL_IGNORE_VALUE_H
+# define _GL_IGNORE_VALUE_H
+
+# ifndef _GL_ATTRIBUTE_DEPRECATED
+/* The __attribute__((__deprecated__)) feature
+ is available in gcc versions 3.1 and newer. */
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1)
+# define _GL_ATTRIBUTE_DEPRECATED /* empty */
+# else
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+# endif
+# endif
+
+/* The __attribute__((__warn_unused_result__)) feature
+ is available in gcc versions 3.4 and newer,
+ while the typeof feature has been available since 2.7 at least. */
+# if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
+# define ignore_value(x) ((void) (x))
+# else
+# define ignore_value(x) (({ __typeof__ (x) __x = (x); (void) __x; }))
+# endif
+
+/* ignore_value works for scalars, pointers and aggregates;
+ deprecate ignore_ptr. */
+static inline void _GL_ATTRIBUTE_DEPRECATED
+ignore_ptr (void *p) { (void) p; } /* deprecated: use ignore_value */
+
+#endif
diff --git a/gnulib/lib/imaxabs.c b/gnulib/lib/imaxabs.c
new file mode 100644
index 0000000..f36bb21
--- /dev/null
+++ b/gnulib/lib/imaxabs.c
@@ -0,0 +1,26 @@
+/* imaxabs() function: absolute value of 'intmax_t'.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <inttypes.h>
+
+intmax_t
+imaxabs (intmax_t x)
+{
+ return (x >= 0 ? x : - x);
+}
diff --git a/gnulib/lib/imaxdiv.c b/gnulib/lib/imaxdiv.c
new file mode 100644
index 0000000..4d25a8a
--- /dev/null
+++ b/gnulib/lib/imaxdiv.c
@@ -0,0 +1,63 @@
+/* imaxdiv() function: division of 'intmax_t'.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <inttypes.h>
+
+#include <stdlib.h>
+
+imaxdiv_t
+imaxdiv (intmax_t numer, intmax_t denom)
+{
+ imaxdiv_t result;
+
+ result.quot = numer / denom;
+ result.rem = numer % denom;
+
+ /* Verify the requirements of ISO C 99 section 6.5.5 paragraph 6:
+ "When integers are divided, the result of the / operator is the
+ algebraic quotient with any fractional part discarded. (This is
+ often called "truncation toward zero".) If the quotient a/b is
+ representable, the expression (a/b)*b + a%b shall equal a." */
+ if (!(denom == 0
+ || (INTMAX_MIN + INTMAX_MAX < 0
+ && denom == -1
+ && numer < - INTMAX_MAX)))
+ {
+ if (!(result.quot * denom + result.rem == numer))
+ /* The compiler's implementation of / and % is broken. */
+ abort ();
+ if (!(numer >= 0
+ ? result.rem >= 0
+ && (denom >= 0
+ ? result.rem < denom
+ : /* Don't write result.rem < - denom,
+ as it gives integer overflow if denom == INTMAX_MIN. */
+ - result.rem > denom)
+ : result.rem <= 0
+ && (denom >= 0
+ ? result.rem > - denom
+ : result.rem > denom)))
+ /* The compiler's implementation of / and % may be ok according to
+ C89, but not to C99. Please report this to <bug-gnulib@ngu.org>.
+ This might be a big portability problem. */
+ abort ();
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/imaxtostr.c b/gnulib/lib/imaxtostr.c
new file mode 100644
index 0000000..b91ac98
--- /dev/null
+++ b/gnulib/lib/imaxtostr.c
@@ -0,0 +1,3 @@
+#define anytostr imaxtostr
+#define inttype intmax_t
+#include "anytostr.c"
diff --git a/gnulib/lib/inet_ntop.c b/gnulib/lib/inet_ntop.c
new file mode 100644
index 0000000..6b80174
--- /dev/null
+++ b/gnulib/lib/inet_ntop.c
@@ -0,0 +1,249 @@
+/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <arpa/inet.h>
+
+#if HAVE_DECL_INET_NTOP
+
+# undef inet_ntop
+
+const char *
+rpl_inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+{
+ return inet_ntop (af, src, dst, cnt);
+}
+
+#else
+
+# include <stdio.h>
+# include <string.h>
+# include <errno.h>
+
+# define NS_IN6ADDRSZ 16
+# define NS_INT16SZ 2
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+typedef int verify_int_size[4 <= sizeof (int) ? 1 : -1];
+
+static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size);
+# if HAVE_IPV6
+static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t size);
+# endif
+
+
+/* char *
+ * inet_ntop(af, src, dst, size)
+ * convert a network format address to presentation format.
+ * return:
+ * pointer to presentation format address (`dst'), or NULL (see errno).
+ * author:
+ * Paul Vixie, 1996.
+ */
+const char *
+inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+{
+ switch (af)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+ return (inet_ntop4 (src, dst, cnt));
+# endif
+
+# if HAVE_IPV6
+ case AF_INET6:
+ return (inet_ntop6 (src, dst, cnt));
+# endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return (NULL);
+ }
+ /* NOTREACHED */
+}
+
+/* const char *
+ * inet_ntop4(src, dst, size)
+ * format an IPv4 address
+ * return:
+ * `dst' (as a const)
+ * notes:
+ * (1) uses no statics
+ * (2) takes a u_char* not an in_addr as input
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop4 (const unsigned char *src, char *dst, socklen_t size)
+{
+ char tmp[sizeof "255.255.255.255"];
+ int len;
+
+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
+ if (len < 0)
+ return NULL;
+
+ if (len > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+# if HAVE_IPV6
+
+/* const char *
+ * inet_ntop6(src, dst, size)
+ * convert IPv6 binary address into presentation (printable) format
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop6 (const unsigned char *src, char *dst, socklen_t size)
+{
+ /*
+ * Note that int32_t and int16_t need only be "at least" large enough
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * Keep this in mind if you think this function should have been coded
+ * to use pointer overlays. All the world's not a VAX.
+ */
+ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
+ struct
+ {
+ int base, len;
+ } best, cur;
+ unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
+ int i;
+
+ /*
+ * Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ memset (words, '\0', sizeof words);
+ for (i = 0; i < NS_IN6ADDRSZ; i += 2)
+ words[i / 2] = (src[i] << 8) | src[i + 1];
+ best.base = -1;
+ cur.base = -1;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ if (words[i] == 0)
+ {
+ if (cur.base == -1)
+ cur.base = i, cur.len = 1;
+ else
+ cur.len++;
+ }
+ else
+ {
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ cur.base = -1;
+ }
+ }
+ }
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ }
+ if (best.base != -1 && best.len < 2)
+ best.base = -1;
+
+ /*
+ * Format the result.
+ */
+ tp = tmp;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ /* Are we inside the best run of 0x00's? */
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len))
+ {
+ if (i == best.base)
+ *tp++ = ':';
+ continue;
+ }
+ /* Are we following an initial run of 0x00s or any real hex? */
+ if (i != 0)
+ *tp++ = ':';
+ /* Is this address an encapsulated IPv4? */
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
+ {
+ if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp)))
+ return (NULL);
+ tp += strlen (tp);
+ break;
+ }
+ {
+ int len = sprintf (tp, "%x", words[i]);
+ if (len < 0)
+ return NULL;
+ tp += len;
+ }
+ }
+ /* Was it a trailing run of 0x00's? */
+ if (best.base != -1 && (best.base + best.len) ==
+ (NS_IN6ADDRSZ / NS_INT16SZ))
+ *tp++ = ':';
+ *tp++ = '\0';
+
+ /*
+ * Check for overflow, copy, and we're done.
+ */
+ if ((socklen_t) (tp - tmp) > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+# endif
+
+#endif
diff --git a/gnulib/lib/inet_pton.c b/gnulib/lib/inet_pton.c
new file mode 100644
index 0000000..cb1a872
--- /dev/null
+++ b/gnulib/lib/inet_pton.c
@@ -0,0 +1,268 @@
+/* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form
+
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * Copyright (c) 1996,1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <arpa/inet.h>
+
+#if HAVE_DECL_INET_PTON
+
+# undef inet_pton
+
+int
+rpl_inet_pton (int af, const char *restrict src, void *restrict dst)
+{
+ return inet_pton (af, src, dst);
+}
+
+#else
+
+# include <c-ctype.h>
+# include <string.h>
+# include <errno.h>
+
+# define NS_INADDRSZ 4
+# define NS_IN6ADDRSZ 16
+# define NS_INT16SZ 2
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+
+static int inet_pton4 (const char *src, unsigned char *dst);
+# if HAVE_IPV6
+static int inet_pton6 (const char *src, unsigned char *dst);
+# endif
+
+/* int
+ * inet_pton(af, src, dst)
+ * convert from presentation format (which usually means ASCII printable)
+ * to network format (which is usually some kind of binary format).
+ * return:
+ * 1 if the address was valid for the specified address family
+ * 0 if the address wasn't valid (`dst' is untouched in this case)
+ * -1 if some other error occurred (`dst' is untouched in this case, too)
+ * author:
+ * Paul Vixie, 1996.
+ */
+int
+inet_pton (int af, const char *restrict src, void *restrict dst)
+{
+ switch (af)
+ {
+ case AF_INET:
+ return (inet_pton4 (src, dst));
+
+# if HAVE_IPV6
+ case AF_INET6:
+ return (inet_pton6 (src, dst));
+# endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return (-1);
+ }
+ /* NOTREACHED */
+}
+
+/* int
+ * inet_pton4(src, dst)
+ * like inet_aton() but without all the hexadecimal, octal (with the
+ * exception of 0) and shorthand.
+ * return:
+ * 1 if `src' is a valid dotted quad, else 0.
+ * notice:
+ * does not touch `dst' unless it's returning 1.
+ * author:
+ * Paul Vixie, 1996.
+ */
+static int
+inet_pton4 (const char *restrict src, unsigned char *restrict dst)
+{
+ int saw_digit, octets, ch;
+ unsigned char tmp[NS_INADDRSZ], *tp;
+
+ saw_digit = 0;
+ octets = 0;
+ *(tp = tmp) = 0;
+ while ((ch = *src++) != '\0')
+ {
+
+ if (ch >= '0' && ch <= '9')
+ {
+ unsigned new = *tp * 10 + (ch - '0');
+
+ if (saw_digit && *tp == 0)
+ return (0);
+ if (new > 255)
+ return (0);
+ *tp = new;
+ if (!saw_digit)
+ {
+ if (++octets > 4)
+ return (0);
+ saw_digit = 1;
+ }
+ }
+ else if (ch == '.' && saw_digit)
+ {
+ if (octets == 4)
+ return (0);
+ *++tp = 0;
+ saw_digit = 0;
+ }
+ else
+ return (0);
+ }
+ if (octets < 4)
+ return (0);
+ memcpy (dst, tmp, NS_INADDRSZ);
+ return (1);
+}
+
+# if HAVE_IPV6
+
+/* int
+ * inet_pton6(src, dst)
+ * convert presentation level address to network order binary form.
+ * return:
+ * 1 if `src' is a valid [RFC1884 2.2] address, else 0.
+ * notice:
+ * (1) does not touch `dst' unless it's returning 1.
+ * (2) :: in a full address is silently ignored.
+ * credit:
+ * inspired by Mark Andrews.
+ * author:
+ * Paul Vixie, 1996.
+ */
+static int
+inet_pton6 (const char *restrict src, unsigned char *restrict dst)
+{
+ static const char xdigits[] = "0123456789abcdef";
+ unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
+ const char *curtok;
+ int ch, saw_xdigit;
+ unsigned val;
+
+ tp = memset (tmp, '\0', NS_IN6ADDRSZ);
+ endp = tp + NS_IN6ADDRSZ;
+ colonp = NULL;
+ /* Leading :: requires some special handling. */
+ if (*src == ':')
+ if (*++src != ':')
+ return (0);
+ curtok = src;
+ saw_xdigit = 0;
+ val = 0;
+ while ((ch = c_tolower (*src++)) != '\0')
+ {
+ const char *pch;
+
+ pch = strchr (xdigits, ch);
+ if (pch != NULL)
+ {
+ val <<= 4;
+ val |= (pch - xdigits);
+ if (val > 0xffff)
+ return (0);
+ saw_xdigit = 1;
+ continue;
+ }
+ if (ch == ':')
+ {
+ curtok = src;
+ if (!saw_xdigit)
+ {
+ if (colonp)
+ return (0);
+ colonp = tp;
+ continue;
+ }
+ else if (*src == '\0')
+ {
+ return (0);
+ }
+ if (tp + NS_INT16SZ > endp)
+ return (0);
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ saw_xdigit = 0;
+ val = 0;
+ continue;
+ }
+ if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
+ inet_pton4 (curtok, tp) > 0)
+ {
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ break; /* '\0' was seen by inet_pton4(). */
+ }
+ return (0);
+ }
+ if (saw_xdigit)
+ {
+ if (tp + NS_INT16SZ > endp)
+ return (0);
+ *tp++ = (u_char) (val >> 8) & 0xff;
+ *tp++ = (u_char) val & 0xff;
+ }
+ if (colonp != NULL)
+ {
+ /*
+ * Since some memmove()'s erroneously fail to handle
+ * overlapping regions, we'll do the shift by hand.
+ */
+ const int n = tp - colonp;
+ int i;
+
+ if (tp == endp)
+ return (0);
+ for (i = 1; i <= n; i++)
+ {
+ endp[-i] = colonp[n - i];
+ colonp[n - i] = 0;
+ }
+ tp = endp;
+ }
+ if (tp != endp)
+ return (0);
+ memcpy (dst, tmp, NS_IN6ADDRSZ);
+ return (1);
+}
+
+# endif
+
+#endif
diff --git a/gnulib/lib/ino-map.c b/gnulib/lib/ino-map.c
new file mode 100644
index 0000000..9133a19
--- /dev/null
+++ b/gnulib/lib/ino-map.c
@@ -0,0 +1,164 @@
+/* Map an ino_t inode number to a small integer.
+
+ Copyright 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Paul Eggert and Jim Meyering */
+
+#include <config.h>
+#include "ino-map.h"
+
+#include "hash.h"
+#include "verify.h"
+
+#include <limits.h>
+#include <stdlib.h>
+
+/* A pair that maps an inode number to a mapped inode number; the
+ latter is a small unique ID for the former. */
+struct ino_map_ent
+{
+ ino_t ino;
+ size_t mapped_ino;
+};
+
+/* A table that manages and indexes these pairs. */
+struct ino_map
+{
+ /* A table of KEY,VAL pairs, where KEY is the raw ino_t value and
+ VAL is the small number that it maps to. */
+ struct hash_table *map;
+
+ /* The next mapped inode number to hand out. */
+ size_t next_mapped_ino;
+
+ /* Cache of the most recently allocated and otherwise-unused storage
+ for probing the table. */
+ struct ino_map_ent *probe;
+};
+
+/* Hash an inode map entry. */
+static size_t
+ino_hash (void const *x, size_t table_size)
+{
+ struct ino_map_ent const *p = x;
+ ino_t ino = p->ino;
+
+ /* When INO is wider than size_t, exclusive-OR the words of INO into H.
+ This avoids loss of info, without applying % to the wider type,
+ which could be quite slow on some systems. */
+ size_t h = ino;
+ unsigned int i;
+ unsigned int n_words = sizeof ino / sizeof h + (sizeof ino % sizeof h != 0);
+ for (i = 1; i < n_words; i++)
+ h ^= ino >> CHAR_BIT * sizeof h * i;
+
+ return h % table_size;
+}
+
+/* Return true if two inode map entries are the same. */
+static bool
+ino_compare (void const *x, void const *y)
+{
+ struct ino_map_ent const *a = x;
+ struct ino_map_ent const *b = y;
+ return a->ino == b->ino;
+}
+
+/* Allocate an inode map that will hand out integers starting with
+ NEXT_MAPPED_INO. Return NULL if memory is exhausted. */
+struct ino_map *
+ino_map_alloc (size_t next_mapped_ino)
+{
+ struct ino_map *im = malloc (sizeof *im);
+
+ if (im)
+ {
+ enum { INITIAL_INO_MAP_TABLE_SIZE = 1021 };
+ im->map = hash_initialize (INITIAL_INO_MAP_TABLE_SIZE, NULL,
+ ino_hash, ino_compare, free);
+ if (! im->map)
+ {
+ free (im);
+ return NULL;
+ }
+ im->next_mapped_ino = next_mapped_ino;
+ im->probe = NULL;
+ }
+
+ return im;
+}
+
+/* Free an inode map. */
+void
+ino_map_free (struct ino_map *map)
+{
+ hash_free (map->map);
+ free (map->probe);
+ free (map);
+}
+
+
+/* Insert into MAP the inode number INO if it's not there already,
+ and return its nonnegative mapped inode number.
+ If INO is already in MAP, return the existing mapped inode number.
+ Return INO_MAP_INSERT_FAILURE on memory or counter exhaustion. */
+size_t
+ino_map_insert (struct ino_map *im, ino_t ino)
+{
+ struct ino_map_ent *ent;
+
+ /* Find space for the probe, reusing the cache if available. */
+ struct ino_map_ent *probe = im->probe;
+ if (probe)
+ {
+ /* If repeating a recent query, return the cached result. */
+ if (probe->ino == ino)
+ return probe->mapped_ino;
+ }
+ else
+ {
+ im->probe = probe = malloc (sizeof *probe);
+ if (! probe)
+ return INO_MAP_INSERT_FAILURE;
+ }
+
+ probe->ino = ino;
+ ent = hash_insert (im->map, probe);
+ if (! ent)
+ return INO_MAP_INSERT_FAILURE;
+
+ if (ent != probe)
+ {
+ /* Use the existing entry. */
+ probe->mapped_ino = ent->mapped_ino;
+ }
+ else
+ {
+ /* If adding 1 to map->next_mapped_ino would cause it to
+ overflow to zero, then it must equal INO_MAP_INSERT_FAILURE,
+ which is the value that should be returned in that case.
+ Verify that this works. */
+ verify (INO_MAP_INSERT_FAILURE + 1 == 0);
+
+ /* Prepare to allocate a new probe next time; this one is in use. */
+ im->probe = NULL;
+
+ /* INO is new; allocate a mapped inode number for it. */
+ probe->mapped_ino = im->next_mapped_ino++;
+ }
+
+ return probe->mapped_ino;
+}
diff --git a/gnulib/lib/ino-map.h b/gnulib/lib/ino-map.h
new file mode 100644
index 0000000..b742291
--- /dev/null
+++ b/gnulib/lib/ino-map.h
@@ -0,0 +1,19 @@
+#ifndef _GL_INO_MAP_H
+# define _GL_INO_MAP_H
+
+# include <sys/types.h>
+
+# undef _GL_ATTRIBUTE_NONNULL
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || 3 < __GNUC__
+# define _GL_ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
+# else
+# define _GL_ATTRIBUTE_NONNULL(m)
+# endif
+
+# define INO_MAP_INSERT_FAILURE ((size_t) -1)
+
+struct ino_map *ino_map_alloc (size_t);
+void ino_map_free (struct ino_map *) _GL_ATTRIBUTE_NONNULL (1);
+size_t ino_map_insert (struct ino_map *, ino_t) _GL_ATTRIBUTE_NONNULL (1);
+
+#endif
diff --git a/gnulib/lib/integer_length.c b/gnulib/lib/integer_length.c
new file mode 100644
index 0000000..e5ab665
--- /dev/null
+++ b/gnulib/lib/integer_length.c
@@ -0,0 +1,141 @@
+/* integer_length - find most significant bit in an 'unsigned int'.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#include <config.h>
+
+/* Specification. */
+#include "integer_length.h"
+
+#include <limits.h>
+
+#include "float+.h"
+
+#define NBITS (sizeof (unsigned int) * CHAR_BIT)
+
+int
+integer_length (unsigned int x)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ if (x == 0)
+ return 0;
+ else
+ return NBITS - __builtin_clz (x);
+#else
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ if (NBITS <= DBL_MANT_BIT)
+ {
+ /* Use 'double' operations.
+ Assumes an IEEE 754 'double' implementation. */
+# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ typedef union { double value; unsigned int word[NWORDS]; }
+ memory_double;
+
+ if (x == 0)
+ return 0;
+ else
+ {
+ memory_double m;
+ unsigned int exponent;
+
+ if (1)
+ {
+ /* Use a single integer to floating-point conversion. */
+ m.value = x;
+ }
+ else
+ {
+ /* Use a single floating-point subtraction. */
+ /* 2^(DBL_MANT_DIG-1). */
+ static const double TWO_DBL_MANT_DIG =
+ /* Assume DBL_MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (double) (1U << ((DBL_MANT_DIG - 1) / 5))
+ * (double) (1U << ((DBL_MANT_DIG - 1 + 1) / 5))
+ * (double) (1U << ((DBL_MANT_DIG - 1 + 2) / 5))
+ * (double) (1U << ((DBL_MANT_DIG - 1 + 3) / 5))
+ * (double) (1U << ((DBL_MANT_DIG - 1 + 4) / 5));
+
+ /* Construct 2^(DBL_MANT_DIG-1) + x by hand. */
+ m.word[DBL_EXPBIT0_WORD] =
+ (DBL_MANT_DIG + DBL_EXP_BIAS) << DBL_EXPBIT0_BIT;
+ m.word[1 - DBL_EXPBIT0_WORD] = x;
+
+ /* Subtract 2^(DBL_MANT_DIG-1). */
+ m.value = m.value - TWO_DBL_MANT_DIG;
+ }
+
+ exponent =
+ (m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK;
+ return exponent - DBL_EXP_BIAS;
+ }
+ }
+ else
+# endif
+ if (NBITS == 32)
+ {
+ /* 6 comparisons. */
+ if (x != 0)
+ {
+ int result = 1;
+ if (x >= 0x10000)
+ {
+ x = x >> 16;
+ result += 16;
+ }
+ if (x >= 0x100)
+ {
+ x = x >> 8;
+ result += 8;
+ }
+ if (x >= 0x10)
+ {
+ x = x >> 4;
+ result += 4;
+ }
+ if (x >= 0x4)
+ {
+ x = x >> 2;
+ result += 2;
+ }
+ if (x >= 0x2)
+ {
+ x = x >> 1;
+ result += 1;
+ }
+ return result;
+ }
+ else
+ return 0;
+ }
+ else
+ {
+ /* Naive loop.
+ Works for any value of NBITS. */
+ int j;
+
+ for (j = NBITS - 1; j >= 0; j--)
+ if (x & (1U << j))
+ return j + 1;
+ return 0;
+ }
+#endif
+}
diff --git a/gnulib/lib/integer_length.h b/gnulib/lib/integer_length.h
new file mode 100644
index 0000000..d51130f
--- /dev/null
+++ b/gnulib/lib/integer_length.h
@@ -0,0 +1,49 @@
+/* integer_length - find most significant bit in an unsigned integer.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#ifndef _INTEGER_LENGTH_H
+#define _INTEGER_LENGTH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These functions return the minimum number of bits required to represent
+ the given unsigned integer.
+ For non-zero values, this is the position of the most significant bit
+ that is set, plus one. For zero, it is 0. */
+
+/* Returns the integer length of x.
+ The result is >= 0, <= sizeof (unsigned int) * CHAR_BIT. */
+extern int integer_length (unsigned int x);
+
+/* Returns the integer length of x.
+ The result is >= 0, <= sizeof (unsigned long) * CHAR_BIT. */
+extern int integer_length_l (unsigned long x);
+
+#if HAVE_UNSIGNED_LONG_LONG_INT
+/* Returns the integer length of x.
+ The result is >= 0, <= sizeof (unsigned long long) * CHAR_BIT. */
+extern int integer_length_ll (unsigned long long x);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INTEGER_LENGTH_H */
diff --git a/gnulib/lib/integer_length_l.c b/gnulib/lib/integer_length_l.c
new file mode 100644
index 0000000..483e023
--- /dev/null
+++ b/gnulib/lib/integer_length_l.c
@@ -0,0 +1,81 @@
+/* integer_length_l - find most significant bit in an 'unsigned long'.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#include <config.h>
+
+/* Specification. */
+#include "integer_length.h"
+
+#include <limits.h>
+#include <stddef.h>
+
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+#ifdef USE_LONG_LONG
+# define FUNC integer_length_ll
+# define TYPE unsigned long long
+# define GCC_BUILTIN __builtin_clzll
+#else
+# define FUNC integer_length_l
+# define TYPE unsigned long
+# define GCC_BUILTIN __builtin_clzl
+#endif
+
+#define NBITS (sizeof (TYPE) * CHAR_BIT)
+
+/* Modify shift count to be in bounds, even in dead code, otherwise GCC
+ emits warnings "right shift count >= width of type". */
+#define MSC(i) MIN (i, NBITS - 1)
+
+int
+FUNC (TYPE x)
+{
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ if (x == 0)
+ return 0;
+ else
+ return NBITS - GCC_BUILTIN (x);
+#else
+ /* Split x into chunks, and look at one chunk after the other. */
+ if (sizeof (TYPE) > 2 * sizeof (unsigned int))
+ {
+ /* Generic loop. */
+ size_t i;
+
+ for (i = (sizeof (TYPE) - 1) / sizeof (unsigned int); i >= 2; i--)
+ {
+ unsigned int y = x >> (i * sizeof (unsigned int) * CHAR_BIT);
+ if (y != 0)
+ return i * sizeof (unsigned int) * CHAR_BIT + integer_length (y);
+ }
+ }
+
+ /* Unrolled the last 2 loop rounds. */
+ /* i = 1 */
+ if (sizeof (TYPE) > 1 * sizeof (unsigned int))
+ {
+ unsigned int y = x >> MSC (1 * sizeof (unsigned int) * CHAR_BIT);
+ if (y != 0)
+ return 1 * sizeof (unsigned int) * CHAR_BIT + integer_length (y);
+ }
+
+ /* i = 0 */
+ return integer_length ((unsigned int) x);
+#endif
+}
diff --git a/gnulib/lib/integer_length_ll.c b/gnulib/lib/integer_length_ll.c
new file mode 100644
index 0000000..c380486
--- /dev/null
+++ b/gnulib/lib/integer_length_ll.c
@@ -0,0 +1,20 @@
+/* integer_length_ll - find most significant bit in an 'unsigned long long'.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2011. */
+
+#define USE_LONG_LONG
+#include "integer_length_l.c"
diff --git a/gnulib/lib/intprops.h b/gnulib/lib/intprops.h
new file mode 100644
index 0000000..1f6a539
--- /dev/null
+++ b/gnulib/lib/intprops.h
@@ -0,0 +1,319 @@
+/* intprops.h -- properties of integer types
+
+ Copyright (C) 2001-2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_INTPROPS_H
+#define _GL_INTPROPS_H
+
+#include <limits.h>
+
+/* Return an integer value, converted to the same type as the integer
+ expression E after integer type promotion. V is the unconverted value. */
+#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))
+
+/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>. */
+#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if the arithmetic type T is an integer type. bool counts as
+ an integer. */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the signed integer expression E uses two's complement. */
+#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1)
+
+/* True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Return 1 if the integer expression E, after integer promotion, has
+ a signed type. */
+#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
+
+
+/* Minimum and maximum values for integer types and expressions. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+
+/* The maximum and minimum values for the integer type T. */
+#define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+
+/* The maximum and minimum values for the type of the expression E,
+ after integer promotion. E should not have side effects. */
+#define _GL_INT_MINIMUM(e) \
+ (_GL_INT_SIGNED (e) \
+ ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \
+ : _GL_INT_CONVERT (e, 0))
+#define _GL_INT_MAXIMUM(e) \
+ (_GL_INT_SIGNED (e) \
+ ? _GL_SIGNED_INT_MAXIMUM (e) \
+ : _GL_INT_NEGATE_CONVERT (e, 1))
+#define _GL_SIGNED_INT_MAXIMUM(e) \
+ (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)
+
+
+/* Return 1 if the __typeof__ keyword works. This could be done by
+ 'configure', but for now it's easier to do it by hand. */
+#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C
+# define _GL_HAVE___TYPEOF__ 1
+#else
+# define _GL_HAVE___TYPEOF__ 0
+#endif
+
+/* Return 1 if the integer type or expression T might be signed. Return 0
+ if it is definitely unsigned. This macro does not evaluate its argument,
+ and expands to an integer constant expression. */
+#if _GL_HAVE___TYPEOF__
+# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
+#else
+# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
+#endif
+
+/* Bound on length of the string representing an unsigned integer
+ value representable in B bits. log10 (2.0) < 146/485. The
+ smallest value of B where this bound is not tight is 2621. */
+#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
+
+/* Bound on length of the string representing an integer type or expression T.
+ Subtract 1 for the sign bit if T is signed, and then add 1 more for
+ a minus sign if needed.
+
+ Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is
+ signed, this macro may overestimate the true bound by one byte when
+ applied to unsigned types of size 2, 4, 16, ... bytes. */
+#define INT_STRLEN_BOUND(t) \
+ (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \
+ - _GL_SIGNED_TYPE_OR_EXPR (t)) \
+ + _GL_SIGNED_TYPE_OR_EXPR (t))
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+ including the terminating null. */
+#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
+
+
+/* Range overflow checks.
+
+ The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
+ operators might not yield numerically correct answers due to
+ arithmetic overflow. They do not rely on undefined or
+ implementation-defined behavior. Their implementations are simple
+ and straightforward, but they are a bit harder to use than the
+ INT_<op>_OVERFLOW macros described below.
+
+ Example usage:
+
+ long int i = ...;
+ long int j = ...;
+ if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
+ printf ("multiply would overflow");
+ else
+ printf ("product is %ld", i * j);
+
+ Restrictions on *_RANGE_OVERFLOW macros:
+
+ These macros do not check for all possible numerical problems or
+ undefined or unspecified behavior: they do not check for division
+ by zero, for bad shift counts, or for shifting negative numbers.
+
+ These macros may evaluate their arguments zero or multiple times,
+ so the arguments should not have side effects. The arithmetic
+ arguments (including the MIN and MAX arguments) must be of the same
+ integer type after the usual arithmetic conversions, and the type
+ must have minimum value MIN and maximum MAX. Unsigned types should
+ use a zero MIN of the proper type.
+
+ These macros are tuned for constant MIN and MAX. For commutative
+ operations such as A + B, they are also tuned for constant B. */
+
+/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? (a) < (min) - (b) \
+ : (max) - (b) < (a))
+
+/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? (max) + (b) < (a) \
+ : (a) < (min) + (b))
+
+/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
+ ((min) < 0 \
+ ? (a) < - (max) \
+ : 0 < (a))
+
+/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Avoid && and || as they tickle
+ bugs in Sun C 5.11 2010/08/13 and other compilers; see
+ <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>. */
+#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? ((a) < 0 \
+ ? (a) < (max) / (b) \
+ : (b) == -1 \
+ ? 0 \
+ : (min) / (b) < (a)) \
+ : (b) == 0 \
+ ? 0 \
+ : ((a) < 0 \
+ ? (a) < (min) / (b) \
+ : (max) / (b) < (a)))
+
+/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Do not check for division by zero. */
+#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \
+ ((min) < 0 && (b) == -1 && (a) < - (max))
+
+/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Do not check for division by zero.
+ Mathematically, % should never overflow, but on x86-like hosts
+ INT_MIN % -1 traps, and the C standard permits this, so treat this
+ as an overflow too. */
+#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \
+ INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
+
+/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Here, MIN and MAX are for A only, and B need
+ not be of the same type as the other arguments. The C standard says that
+ behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
+ A is negative then A << B has undefined behavior and A >> B has
+ implementation-defined behavior, but do not check these other
+ restrictions. */
+#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \
+ ((a) < 0 \
+ ? (a) < (min) >> (b) \
+ : (max) >> (b) < (a))
+
+
+/* The _GL*_OVERFLOW macros have the same restrictions as the
+ *_RANGE_OVERFLOW macros, except that they do not assume that operands
+ (e.g., A and B) have the same type as MIN and MAX. Instead, they assume
+ that the result (e.g., A + B) has that type. */
+#define _GL_ADD_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \
+ : (a) < 0 ? (b) <= (a) + (b) \
+ : (b) < 0 ? (a) <= (a) + (b) \
+ : (a) + (b) < (b))
+#define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \
+ : (a) < 0 ? 1 \
+ : (b) < 0 ? (a) - (b) <= (a) \
+ : (a) < (b))
+#define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
+ (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \
+ || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
+#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
+ : (a) < 0 ? (b) <= (a) + (b) - 1 \
+ : (b) < 0 && (a) + (b) <= (a))
+#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
+ : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \
+ : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
+
+/* Return a nonzero value if A is a mathematical multiple of B, where
+ A is unsigned, B is negative, and MAX is the maximum value of A's
+ type. A's type must be the same as (A % B)'s type. Normally (A %
+ -B == 0) suffices, but things get tricky if -B would overflow. */
+#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \
+ (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \
+ ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \
+ ? (a) \
+ : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \
+ : (a) % - (b)) \
+ == 0)
+
+
+/* Integer overflow checks.
+
+ The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
+ might not yield numerically correct answers due to arithmetic overflow.
+ They work correctly on all known practical hosts, and do not rely
+ on undefined behavior due to signed arithmetic overflow.
+
+ Example usage:
+
+ long int i = ...;
+ long int j = ...;
+ if (INT_MULTIPLY_OVERFLOW (i, j))
+ printf ("multiply would overflow");
+ else
+ printf ("product is %ld", i * j);
+
+ These macros do not check for all possible numerical problems or
+ undefined or unspecified behavior: they do not check for division
+ by zero, for bad shift counts, or for shifting negative numbers.
+
+ These macros may evaluate their arguments zero or multiple times, so the
+ arguments should not have side effects.
+
+ These macros are tuned for their last argument being a constant.
+
+ Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
+ A % B, and A << B would overflow, respectively. */
+
+#define INT_ADD_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
+#define INT_SUBTRACT_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
+#define INT_NEGATE_OVERFLOW(a) \
+ INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+#define INT_MULTIPLY_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
+#define INT_DIVIDE_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
+#define INT_REMAINDER_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
+#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
+ INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
+ _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+
+/* Return 1 if the expression A <op> B would overflow,
+ where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
+ assuming MIN and MAX are the minimum and maximum for the result type.
+ Arguments should be free of side effects. */
+#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \
+ op_result_overflow (a, b, \
+ _GL_INT_MINIMUM (0 * (b) + (a)), \
+ _GL_INT_MAXIMUM (0 * (b) + (a)))
+
+#endif /* _GL_INTPROPS_H */
diff --git a/gnulib/lib/inttostr.c b/gnulib/lib/inttostr.c
new file mode 100644
index 0000000..c96b5ca
--- /dev/null
+++ b/gnulib/lib/inttostr.c
@@ -0,0 +1,3 @@
+#define anytostr inttostr
+#define inttype int
+#include "anytostr.c"
diff --git a/gnulib/lib/inttostr.h b/gnulib/lib/inttostr.h
new file mode 100644
index 0000000..1825f56
--- /dev/null
+++ b/gnulib/lib/inttostr.h
@@ -0,0 +1,46 @@
+/* inttostr.h -- convert integers to printable strings
+
+ Copyright (C) 2001-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert */
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include "intprops.h"
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+char *imaxtostr (intmax_t, char *) __attribute_warn_unused_result__;
+char *inttostr (int, char *) __attribute_warn_unused_result__;
+char *offtostr (off_t, char *) __attribute_warn_unused_result__;
+char *uinttostr (unsigned int, char *) __attribute_warn_unused_result__;
+char *umaxtostr (uintmax_t, char *) __attribute_warn_unused_result__;
diff --git a/gnulib/lib/inttypes.in.h b/gnulib/lib/inttypes.in.h
new file mode 100644
index 0000000..f7c489a
--- /dev/null
+++ b/gnulib/lib/inttypes.in.h
@@ -0,0 +1,1112 @@
+/* Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Derek Price.
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/inttypes.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Include the original <inttypes.h> if it exists, and if this file
+ has not been included yet or if this file includes gnulib stdint.h
+ which in turn includes this file.
+ The include_next requires a split double-inclusion guard. */
+#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+# if @HAVE_INTTYPES_H@
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# if defined __cplusplus && ! defined __STDC_FORMAT_MACROS
+# define __STDC_FORMAT_MACROS 1
+# endif
+
+# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdint.h>
+#endif
+/* Get CHAR_BIT. */
+#include <limits.h>
+
+#if !(INT_MIN == INT32_MIN && INT_MAX == INT32_MAX)
+# error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>."
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* 7.8.1 Macros for format specifiers */
+
+#if defined _TNS_R_TARGET
+ /* Tandem NonStop R series and compatible platforms released before
+ July 2005 support %Ld but not %lld. */
+# define _LONG_LONG_FORMAT_PREFIX "L"
+#else
+# define _LONG_LONG_FORMAT_PREFIX "ll"
+#endif
+
+#if !defined PRId8 || @PRI_MACROS_BROKEN@
+# undef PRId8
+# ifdef INT8_MAX
+# define PRId8 "d"
+# endif
+#endif
+#if !defined PRIi8 || @PRI_MACROS_BROKEN@
+# undef PRIi8
+# ifdef INT8_MAX
+# define PRIi8 "i"
+# endif
+#endif
+#if !defined PRIo8 || @PRI_MACROS_BROKEN@
+# undef PRIo8
+# ifdef UINT8_MAX
+# define PRIo8 "o"
+# endif
+#endif
+#if !defined PRIu8 || @PRI_MACROS_BROKEN@
+# undef PRIu8
+# ifdef UINT8_MAX
+# define PRIu8 "u"
+# endif
+#endif
+#if !defined PRIx8 || @PRI_MACROS_BROKEN@
+# undef PRIx8
+# ifdef UINT8_MAX
+# define PRIx8 "x"
+# endif
+#endif
+#if !defined PRIX8 || @PRI_MACROS_BROKEN@
+# undef PRIX8
+# ifdef UINT8_MAX
+# define PRIX8 "X"
+# endif
+#endif
+#if !defined PRId16 || @PRI_MACROS_BROKEN@
+# undef PRId16
+# ifdef INT16_MAX
+# define PRId16 "d"
+# endif
+#endif
+#if !defined PRIi16 || @PRI_MACROS_BROKEN@
+# undef PRIi16
+# ifdef INT16_MAX
+# define PRIi16 "i"
+# endif
+#endif
+#if !defined PRIo16 || @PRI_MACROS_BROKEN@
+# undef PRIo16
+# ifdef UINT16_MAX
+# define PRIo16 "o"
+# endif
+#endif
+#if !defined PRIu16 || @PRI_MACROS_BROKEN@
+# undef PRIu16
+# ifdef UINT16_MAX
+# define PRIu16 "u"
+# endif
+#endif
+#if !defined PRIx16 || @PRI_MACROS_BROKEN@
+# undef PRIx16
+# ifdef UINT16_MAX
+# define PRIx16 "x"
+# endif
+#endif
+#if !defined PRIX16 || @PRI_MACROS_BROKEN@
+# undef PRIX16
+# ifdef UINT16_MAX
+# define PRIX16 "X"
+# endif
+#endif
+#if !defined PRId32 || @PRI_MACROS_BROKEN@
+# undef PRId32
+# ifdef INT32_MAX
+# define PRId32 "d"
+# endif
+#endif
+#if !defined PRIi32 || @PRI_MACROS_BROKEN@
+# undef PRIi32
+# ifdef INT32_MAX
+# define PRIi32 "i"
+# endif
+#endif
+#if !defined PRIo32 || @PRI_MACROS_BROKEN@
+# undef PRIo32
+# ifdef UINT32_MAX
+# define PRIo32 "o"
+# endif
+#endif
+#if !defined PRIu32 || @PRI_MACROS_BROKEN@
+# undef PRIu32
+# ifdef UINT32_MAX
+# define PRIu32 "u"
+# endif
+#endif
+#if !defined PRIx32 || @PRI_MACROS_BROKEN@
+# undef PRIx32
+# ifdef UINT32_MAX
+# define PRIx32 "x"
+# endif
+#endif
+#if !defined PRIX32 || @PRI_MACROS_BROKEN@
+# undef PRIX32
+# ifdef UINT32_MAX
+# define PRIX32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRI64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64 || @PRI_MACROS_BROKEN@
+# undef PRId64
+# define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64 || @PRI_MACROS_BROKEN@
+# undef PRIi64
+# define PRIi64 _PRI64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRIu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64 || @PRI_MACROS_BROKEN@
+# undef PRIo64
+# define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64 || @PRI_MACROS_BROKEN@
+# undef PRIu64
+# define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64 || @PRI_MACROS_BROKEN@
+# undef PRIx64
+# define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64 || @PRI_MACROS_BROKEN@
+# undef PRIX64
+# define PRIX64 _PRIu64_PREFIX "X"
+# endif
+#endif
+
+#if !defined PRIdLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIdFAST8 PRId64
+# else
+# define PRIdFAST8 "d"
+# endif
+#endif
+#if !defined PRIiFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIiFAST8 PRIi64
+# else
+# define PRIiFAST8 "i"
+# endif
+#endif
+#if !defined PRIoFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIoFAST8 PRIo64
+# else
+# define PRIoFAST8 "o"
+# endif
+#endif
+#if !defined PRIuFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIuFAST8 PRIu64
+# else
+# define PRIuFAST8 "u"
+# endif
+#endif
+#if !defined PRIxFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIxFAST8 PRIx64
+# else
+# define PRIxFAST8 "x"
+# endif
+#endif
+#if !defined PRIXFAST8 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIXFAST8 PRIX64
+# else
+# define PRIXFAST8 "X"
+# endif
+#endif
+#if !defined PRIdFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIdFAST16 PRId64
+# else
+# define PRIdFAST16 "d"
+# endif
+#endif
+#if !defined PRIiFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIiFAST16 PRIi64
+# else
+# define PRIiFAST16 "i"
+# endif
+#endif
+#if !defined PRIoFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIoFAST16 PRIo64
+# else
+# define PRIoFAST16 "o"
+# endif
+#endif
+#if !defined PRIuFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIuFAST16 PRIu64
+# else
+# define PRIuFAST16 "u"
+# endif
+#endif
+#if !defined PRIxFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIxFAST16 PRIx64
+# else
+# define PRIxFAST16 "x"
+# endif
+#endif
+#if !defined PRIXFAST16 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIXFAST16 PRIX64
+# else
+# define PRIXFAST16 "X"
+# endif
+#endif
+#if !defined PRIdFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIdFAST32 PRId64
+# else
+# define PRIdFAST32 "d"
+# endif
+#endif
+#if !defined PRIiFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIiFAST32 PRIi64
+# else
+# define PRIiFAST32 "i"
+# endif
+#endif
+#if !defined PRIoFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIoFAST32 PRIo64
+# else
+# define PRIoFAST32 "o"
+# endif
+#endif
+#if !defined PRIuFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIuFAST32 PRIu64
+# else
+# define PRIuFAST32 "u"
+# endif
+#endif
+#if !defined PRIxFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIxFAST32 PRIx64
+# else
+# define PRIxFAST32 "x"
+# endif
+#endif
+#if !defined PRIXFAST32 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIXFAST32 PRIX64
+# else
+# define PRIXFAST32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64 || @PRI_MACROS_BROKEN@
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdMAX || @PRI_MACROS_BROKEN@
+# undef PRIdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIdMAX PRId64
+# else
+# define PRIdMAX "ld"
+# endif
+#endif
+#if !defined PRIiMAX || @PRI_MACROS_BROKEN@
+# undef PRIiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIiMAX PRIi64
+# else
+# define PRIiMAX "li"
+# endif
+#endif
+#if !defined PRIoMAX || @PRI_MACROS_BROKEN@
+# undef PRIoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIoMAX PRIo64
+# else
+# define PRIoMAX "lo"
+# endif
+#endif
+#if !defined PRIuMAX || @PRI_MACROS_BROKEN@
+# undef PRIuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIuMAX PRIu64
+# else
+# define PRIuMAX "lu"
+# endif
+#endif
+#if !defined PRIxMAX || @PRI_MACROS_BROKEN@
+# undef PRIxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIxMAX PRIx64
+# else
+# define PRIxMAX "lx"
+# endif
+#endif
+#if !defined PRIXMAX || @PRI_MACROS_BROKEN@
+# undef PRIXMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIXMAX PRIX64
+# else
+# define PRIXMAX "lX"
+# endif
+#endif
+
+#if !defined PRIdPTR || @PRI_MACROS_BROKEN@
+# undef PRIdPTR
+# ifdef INTPTR_MAX
+# define PRIdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined PRIiPTR || @PRI_MACROS_BROKEN@
+# undef PRIiPTR
+# ifdef INTPTR_MAX
+# define PRIiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined PRIoPTR || @PRI_MACROS_BROKEN@
+# undef PRIoPTR
+# ifdef UINTPTR_MAX
+# define PRIoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined PRIuPTR || @PRI_MACROS_BROKEN@
+# undef PRIuPTR
+# ifdef UINTPTR_MAX
+# define PRIuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined PRIxPTR || @PRI_MACROS_BROKEN@
+# undef PRIxPTR
+# ifdef UINTPTR_MAX
+# define PRIxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+#if !defined PRIXPTR || @PRI_MACROS_BROKEN@
+# undef PRIXPTR
+# ifdef UINTPTR_MAX
+# define PRIXPTR @PRIPTR_PREFIX@ "X"
+# endif
+#endif
+
+#if !defined SCNd8 || @PRI_MACROS_BROKEN@
+# undef SCNd8
+# ifdef INT8_MAX
+# define SCNd8 "hhd"
+# endif
+#endif
+#if !defined SCNi8 || @PRI_MACROS_BROKEN@
+# undef SCNi8
+# ifdef INT8_MAX
+# define SCNi8 "hhi"
+# endif
+#endif
+#if !defined SCNo8 || @PRI_MACROS_BROKEN@
+# undef SCNo8
+# ifdef UINT8_MAX
+# define SCNo8 "hho"
+# endif
+#endif
+#if !defined SCNu8 || @PRI_MACROS_BROKEN@
+# undef SCNu8
+# ifdef UINT8_MAX
+# define SCNu8 "hhu"
+# endif
+#endif
+#if !defined SCNx8 || @PRI_MACROS_BROKEN@
+# undef SCNx8
+# ifdef UINT8_MAX
+# define SCNx8 "hhx"
+# endif
+#endif
+#if !defined SCNd16 || @PRI_MACROS_BROKEN@
+# undef SCNd16
+# ifdef INT16_MAX
+# define SCNd16 "hd"
+# endif
+#endif
+#if !defined SCNi16 || @PRI_MACROS_BROKEN@
+# undef SCNi16
+# ifdef INT16_MAX
+# define SCNi16 "hi"
+# endif
+#endif
+#if !defined SCNo16 || @PRI_MACROS_BROKEN@
+# undef SCNo16
+# ifdef UINT16_MAX
+# define SCNo16 "ho"
+# endif
+#endif
+#if !defined SCNu16 || @PRI_MACROS_BROKEN@
+# undef SCNu16
+# ifdef UINT16_MAX
+# define SCNu16 "hu"
+# endif
+#endif
+#if !defined SCNx16 || @PRI_MACROS_BROKEN@
+# undef SCNx16
+# ifdef UINT16_MAX
+# define SCNx16 "hx"
+# endif
+#endif
+#if !defined SCNd32 || @PRI_MACROS_BROKEN@
+# undef SCNd32
+# ifdef INT32_MAX
+# define SCNd32 "d"
+# endif
+#endif
+#if !defined SCNi32 || @PRI_MACROS_BROKEN@
+# undef SCNi32
+# ifdef INT32_MAX
+# define SCNi32 "i"
+# endif
+#endif
+#if !defined SCNo32 || @PRI_MACROS_BROKEN@
+# undef SCNo32
+# ifdef UINT32_MAX
+# define SCNo32 "o"
+# endif
+#endif
+#if !defined SCNu32 || @PRI_MACROS_BROKEN@
+# undef SCNu32
+# ifdef UINT32_MAX
+# define SCNu32 "u"
+# endif
+#endif
+#if !defined SCNx32 || @PRI_MACROS_BROKEN@
+# undef SCNx32
+# ifdef UINT32_MAX
+# define SCNx32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCN64_PREFIX "I64"
+# elif @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64 || @PRI_MACROS_BROKEN@
+# undef SCNd64
+# define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64 || @PRI_MACROS_BROKEN@
+# undef SCNi64
+# define SCNi64 _SCN64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCNu64_PREFIX "I64"
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64 || @PRI_MACROS_BROKEN@
+# undef SCNo64
+# define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64 || @PRI_MACROS_BROKEN@
+# undef SCNu64
+# define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64 || @PRI_MACROS_BROKEN@
+# undef SCNx64
+# define SCNx64 _SCNu64_PREFIX "x"
+# endif
+#endif
+
+#if !defined SCNdLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+#endif
+#if !defined SCNiLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+#endif
+#if !defined SCNoLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST8
+# define SCNoLEAST8 "hho"
+#endif
+#if !defined SCNuLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+#endif
+#if !defined SCNxLEAST8 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+#endif
+#if !defined SCNdLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST16
+# define SCNdLEAST16 "hd"
+#endif
+#if !defined SCNiLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST16
+# define SCNiLEAST16 "hi"
+#endif
+#if !defined SCNoLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST16
+# define SCNoLEAST16 "ho"
+#endif
+#if !defined SCNuLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST16
+# define SCNuLEAST16 "hu"
+#endif
+#if !defined SCNxLEAST16 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST16
+# define SCNxLEAST16 "hx"
+#endif
+#if !defined SCNdLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST32
+# define SCNdLEAST32 "d"
+#endif
+#if !defined SCNiLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST32
+# define SCNiLEAST32 "i"
+#endif
+#if !defined SCNoLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST32
+# define SCNoLEAST32 "o"
+#endif
+#if !defined SCNuLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST32
+# define SCNuLEAST32 "u"
+#endif
+#if !defined SCNxLEAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST32
+# define SCNxLEAST32 "x"
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdLEAST64
+# define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiLEAST64
+# define SCNiLEAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoLEAST64
+# define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuLEAST64
+# define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxLEAST64
+# define SCNxLEAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNdFAST8 SCNd64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNdFAST8 "hd"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNdFAST8 "hhd"
+# else
+# define SCNdFAST8 "d"
+# endif
+#endif
+#if !defined SCNiFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNiFAST8 SCNi64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNiFAST8 "hi"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNiFAST8 "hhi"
+# else
+# define SCNiFAST8 "i"
+# endif
+#endif
+#if !defined SCNoFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNoFAST8 SCNo64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNoFAST8 "ho"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNoFAST8 "hho"
+# else
+# define SCNoFAST8 "o"
+# endif
+#endif
+#if !defined SCNuFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNuFAST8 SCNu64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNuFAST8 "hu"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNuFAST8 "hhu"
+# else
+# define SCNuFAST8 "u"
+# endif
+#endif
+#if !defined SCNxFAST8 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNxFAST8 SCNx64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNxFAST8 "hx"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNxFAST8 "hhx"
+# else
+# define SCNxFAST8 "x"
+# endif
+#endif
+#if !defined SCNdFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNdFAST16 SCNd64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNdFAST16 "hd"
+# else
+# define SCNdFAST16 "d"
+# endif
+#endif
+#if !defined SCNiFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNiFAST16 SCNi64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNiFAST16 "hi"
+# else
+# define SCNiFAST16 "i"
+# endif
+#endif
+#if !defined SCNoFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNoFAST16 SCNo64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNoFAST16 "ho"
+# else
+# define SCNoFAST16 "o"
+# endif
+#endif
+#if !defined SCNuFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNuFAST16 SCNu64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNuFAST16 "hu"
+# else
+# define SCNuFAST16 "u"
+# endif
+#endif
+#if !defined SCNxFAST16 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNxFAST16 SCNx64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNxFAST16 "hx"
+# else
+# define SCNxFAST16 "x"
+# endif
+#endif
+#if !defined SCNdFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNdFAST32 SCNd64
+# else
+# define SCNdFAST32 "d"
+# endif
+#endif
+#if !defined SCNiFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNiFAST32 SCNi64
+# else
+# define SCNiFAST32 "i"
+# endif
+#endif
+#if !defined SCNoFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNoFAST32 SCNo64
+# else
+# define SCNoFAST32 "o"
+# endif
+#endif
+#if !defined SCNuFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNuFAST32 SCNu64
+# else
+# define SCNuFAST32 "u"
+# endif
+#endif
+#if !defined SCNxFAST32 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNxFAST32 SCNx64
+# else
+# define SCNxFAST32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNdFAST64
+# define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNiFAST64
+# define SCNiFAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNoFAST64
+# define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNuFAST64
+# define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64 || @PRI_MACROS_BROKEN@
+# undef SCNxFAST64
+# define SCNxFAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdMAX || @PRI_MACROS_BROKEN@
+# undef SCNdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNdMAX SCNd64
+# else
+# define SCNdMAX "ld"
+# endif
+#endif
+#if !defined SCNiMAX || @PRI_MACROS_BROKEN@
+# undef SCNiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNiMAX SCNi64
+# else
+# define SCNiMAX "li"
+# endif
+#endif
+#if !defined SCNoMAX || @PRI_MACROS_BROKEN@
+# undef SCNoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNoMAX SCNo64
+# else
+# define SCNoMAX "lo"
+# endif
+#endif
+#if !defined SCNuMAX || @PRI_MACROS_BROKEN@
+# undef SCNuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNuMAX SCNu64
+# else
+# define SCNuMAX "lu"
+# endif
+#endif
+#if !defined SCNxMAX || @PRI_MACROS_BROKEN@
+# undef SCNxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNxMAX SCNx64
+# else
+# define SCNxMAX "lx"
+# endif
+#endif
+
+#if !defined SCNdPTR || @PRI_MACROS_BROKEN@
+# undef SCNdPTR
+# ifdef INTPTR_MAX
+# define SCNdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined SCNiPTR || @PRI_MACROS_BROKEN@
+# undef SCNiPTR
+# ifdef INTPTR_MAX
+# define SCNiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined SCNoPTR || @PRI_MACROS_BROKEN@
+# undef SCNoPTR
+# ifdef UINTPTR_MAX
+# define SCNoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined SCNuPTR || @PRI_MACROS_BROKEN@
+# undef SCNuPTR
+# ifdef UINTPTR_MAX
+# define SCNuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined SCNxPTR || @PRI_MACROS_BROKEN@
+# undef SCNxPTR
+# ifdef UINTPTR_MAX
+# define SCNxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+
+/* 7.8.2 Functions for greatest-width integer types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_IMAXABS@
+# if !@HAVE_DECL_IMAXABS@
+extern intmax_t imaxabs (intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxabs
+# if HAVE_RAW_DECL_IMAXABS
+_GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - "
+ "use gnulib module imaxabs for portability");
+# endif
+#endif
+
+#if @GNULIB_IMAXDIV@
+# if !@HAVE_DECL_IMAXDIV@
+# if !GNULIB_defined_imaxdiv_t
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+# define GNULIB_defined_imaxdiv_t 1
+# endif
+extern imaxdiv_t imaxdiv (intmax_t, intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# if HAVE_RAW_DECL_IMAXDIV
+_GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - "
+ "use gnulib module imaxdiv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOIMAX@
+# if !@HAVE_DECL_STRTOIMAX@
+# undef strtoimax
+extern intmax_t strtoimax (const char *, char **, int) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# if HAVE_RAW_DECL_STRTOIMAX
+_GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - "
+ "use gnulib module strtoimax for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOUMAX@
+# if !@HAVE_DECL_STRTOUMAX@
+# undef strtoumax
+extern uintmax_t strtoumax (const char *, char **, int) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# if HAVE_RAW_DECL_STRTOUMAX
+_GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - "
+ "use gnulib module strtoumax for portability");
+# endif
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+ wide-character functions like this are hardly ever useful. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */
diff --git a/gnulib/lib/ioctl.c b/gnulib/lib/ioctl.c
new file mode 100644
index 0000000..c6ba989
--- /dev/null
+++ b/gnulib/lib/ioctl.c
@@ -0,0 +1,79 @@
+/* ioctl.c --- wrappers for Windows ioctl function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#include <sys/ioctl.h>
+
+#include <stdarg.h>
+
+#if HAVE_IOCTL
+
+/* Provide a wrapper with the POSIX prototype. */
+# undef ioctl
+int
+rpl_ioctl (int fd, int request, ... /* {void *,char *} arg */)
+{
+ void *buf;
+ va_list args;
+
+ va_start (args, request);
+ buf = va_arg (args, void *);
+ va_end (args);
+
+ /* Cast 'request' so that when the system's ioctl function takes a 64-bit
+ request argument, the value gets zero-extended, not sign-extended. */
+ return ioctl (fd, (unsigned int) request, buf);
+}
+
+#else /* mingw */
+
+# include <errno.h>
+
+# include "fd-hook.h"
+
+static int
+primary_ioctl (int fd, int request, void *arg)
+{
+ /* We don't support FIONBIO on pipes here. If you want to make pipe
+ fds non-blocking, use the gnulib 'nonblocking' module, until
+ gnulib implements fcntl F_GETFL / F_SETFL with O_NONBLOCK. */
+
+ errno = ENOSYS;
+ return -1;
+}
+
+int
+ioctl (int fd, int request, ... /* {void *,char *} arg */)
+{
+ void *arg;
+ va_list args;
+
+ va_start (args, request);
+ arg = va_arg (args, void *);
+ va_end (args);
+
+# if WINDOWS_SOCKETS
+ return execute_all_ioctl_hooks (primary_ioctl, fd, request, arg);
+# else
+ return primary_ioctl (fd, request, arg);
+# endif
+}
+
+#endif
diff --git a/gnulib/lib/isapipe.c b/gnulib/lib/isapipe.c
new file mode 100644
index 0000000..f6e16d1
--- /dev/null
+++ b/gnulib/lib/isapipe.c
@@ -0,0 +1,119 @@
+/* Test whether a file descriptor is a pipe.
+
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "isapipe.h"
+
+#include <errno.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms. */
+
+/* Get GetFileType. */
+# include <windows.h>
+
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+
+int
+isapipe (int fd)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ return (GetFileType (h) == FILE_TYPE_PIPE);
+}
+
+#else
+/* Unix platforms. */
+
+# include <stdbool.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+/* The maximum link count for pipes; (nlink_t) -1 if not known. */
+# ifndef PIPE_LINK_COUNT_MAX
+# define PIPE_LINK_COUNT_MAX ((nlink_t) (-1))
+# endif
+
+/* Return 1 if FD is a pipe, 0 if not, -1 (setting errno) on error.
+
+ Test fairly strictly whether FD is a pipe. lseek and checking for
+ ESPIPE does not suffice, since many non-pipe files cause lseek to
+ fail with errno == ESPIPE. */
+
+int
+isapipe (int fd)
+{
+ nlink_t pipe_link_count_max = PIPE_LINK_COUNT_MAX;
+ bool check_for_fifo = (HAVE_FIFO_PIPES == 1);
+ struct stat st;
+ int fstat_result = fstat (fd, &st);
+
+ if (fstat_result != 0)
+ return fstat_result;
+
+ /* We want something that succeeds only for pipes, but on
+ POSIX-conforming hosts S_ISFIFO succeeds for both FIFOs and pipes
+ and we know of no portable, reliable way to distinguish them in
+ general. However, in practice pipes always have a link count <=
+ PIPE_LINK_COUNT_MAX (unless someone attaches them to the file
+ system name space using fattach, in which case they're not really
+ pipes any more), so test for that as well.
+
+ On Darwin 7.7, pipes are sockets, so check for those instead. */
+
+ if (! ((HAVE_FIFO_PIPES == 0 || HAVE_FIFO_PIPES == 1)
+ && PIPE_LINK_COUNT_MAX != (nlink_t) -1)
+ && (S_ISFIFO (st.st_mode) | S_ISSOCK (st.st_mode)))
+ {
+ int fd_pair[2];
+ int pipe_result = pipe (fd_pair);
+ if (pipe_result != 0)
+ return pipe_result;
+ else
+ {
+ struct stat pipe_st;
+ int fstat_pipe_result = fstat (fd_pair[0], &pipe_st);
+ int fstat_pipe_errno = errno;
+ close (fd_pair[0]);
+ close (fd_pair[1]);
+ if (fstat_pipe_result != 0)
+ {
+ errno = fstat_pipe_errno;
+ return fstat_pipe_result;
+ }
+ check_for_fifo = (S_ISFIFO (pipe_st.st_mode) != 0);
+ pipe_link_count_max = pipe_st.st_nlink;
+ }
+ }
+
+ return
+ (st.st_nlink <= pipe_link_count_max
+ && (check_for_fifo ? S_ISFIFO (st.st_mode) : S_ISSOCK (st.st_mode)));
+}
+
+#endif
diff --git a/gnulib/lib/isapipe.h b/gnulib/lib/isapipe.h
new file mode 100644
index 0000000..c108e30
--- /dev/null
+++ b/gnulib/lib/isapipe.h
@@ -0,0 +1,6 @@
+/* Whether pipes are FIFOs; -1 if not known. */
+#ifndef HAVE_FIFO_PIPES
+# define HAVE_FIFO_PIPES (-1)
+#endif
+
+int isapipe (int fd);
diff --git a/gnulib/lib/isblank.c b/gnulib/lib/isblank.c
new file mode 100644
index 0000000..65cc54f
--- /dev/null
+++ b/gnulib/lib/isblank.c
@@ -0,0 +1,33 @@
+/* Test whether a character is a blank.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <ctype.h>
+
+int
+isblank (int c)
+{
+ /* On all known platforms, in all predefined locales, isblank(c) is likely
+ equivalent with (c == ' ' || c == '\t'). Look at the glibc definition
+ (in glibc/localedata/locales/i18n): The "blank" characters are '\t', ' ',
+ U+1680, U+180E, U+2000..U+2006, U+2008..U+200A, U+205F, U+3000, and none
+ except the first two is present in a common 8-bit encoding. Therefore
+ the substitute for other platforms is not more complicated than this. */
+ return (c == ' ' || c == '\t');
+}
diff --git a/gnulib/lib/isdir.c b/gnulib/lib/isdir.c
new file mode 100644
index 0000000..77cd7a2
--- /dev/null
+++ b/gnulib/lib/isdir.c
@@ -0,0 +1,33 @@
+/* isdir.c -- determine whether a directory exists
+
+ Copyright (C) 1990, 1998, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "isdir.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* If PATH is an existing directory or symbolic link to a directory,
+ return nonzero, else 0. */
+int
+isdir (const char *path)
+{
+ struct stat stats;
+
+ return stat (path, &stats) == 0 && S_ISDIR (stats.st_mode);
+}
diff --git a/gnulib/lib/isdir.h b/gnulib/lib/isdir.h
new file mode 100644
index 0000000..80116bc
--- /dev/null
+++ b/gnulib/lib/isdir.h
@@ -0,0 +1 @@
+int isdir (const char *path);
diff --git a/gnulib/lib/isfinite.c b/gnulib/lib/isfinite.c
new file mode 100644
index 0000000..310ac2c
--- /dev/null
+++ b/gnulib/lib/isfinite.c
@@ -0,0 +1,52 @@
+/* Test for finite value (zero, subnormal, or normal, and not infinite or NaN).
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007. */
+
+#include <config.h>
+
+#include "isnanf-nolibm.h"
+#include "isnand-nolibm.h"
+#include "isnanl-nolibm.h"
+
+/* The "cc" compiler on HP-UX 11.11, when optimizing, simplifies the test
+ x - y == 0.0 to x == y, a simplification which is invalid when x and y
+ are Infinity. Disable this optimization. */
+#if defined __hpux && !defined __GNUC__
+static float zerof;
+static double zerod;
+static long double zerol;
+#else
+# define zerof 0.f
+# define zerod 0.
+# define zerol 0.L
+#endif
+
+int gl_isfinitef (float x)
+{
+ return !isnanf (x) && x - x == zerof;
+}
+
+int gl_isfinited (double x)
+{
+ return !isnand (x) && x - x == zerod;
+}
+
+int gl_isfinitel (long double x)
+{
+ return !isnanl (x) && x - x == zerol;
+}
diff --git a/gnulib/lib/isinf.c b/gnulib/lib/isinf.c
new file mode 100644
index 0000000..7ccca79
--- /dev/null
+++ b/gnulib/lib/isinf.c
@@ -0,0 +1,40 @@
+/* Test for positive or negative infinity.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2008. */
+
+#include <config.h>
+
+#include <float.h>
+
+int
+gl_isinff (float x)
+{
+ return x < -FLT_MAX || x > FLT_MAX;
+}
+
+int
+gl_isinfd (double x)
+{
+ return x < -DBL_MAX || x > DBL_MAX;
+}
+
+int
+gl_isinfl (long double x)
+{
+ return x < -LDBL_MAX || x > LDBL_MAX;
+}
diff --git a/gnulib/lib/isnan.c b/gnulib/lib/isnan.c
new file mode 100644
index 0000000..db0c685
--- /dev/null
+++ b/gnulib/lib/isnan.c
@@ -0,0 +1,177 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+/* Specification found in math.h or isnanl-nolibm.h. */
+extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
+#elif ! defined USE_FLOAT
+/* Specification found in math.h or isnand-nolibm.h. */
+extern int rpl_isnand (double x);
+#else /* defined USE_FLOAT */
+/* Specification found in math.h or isnanf-nolibm.h. */
+extern int rpl_isnanf (float x);
+#endif
+
+#include <float.h>
+#include <string.h>
+
+#include "float+.h"
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC rpl_isnanl
+# define DOUBLE long double
+# define MAX_EXP LDBL_MAX_EXP
+# define MIN_EXP LDBL_MIN_EXP
+# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
+# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_LDBL
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC rpl_isnand
+# define DOUBLE double
+# define MAX_EXP DBL_MAX_EXP
+# define MIN_EXP DBL_MIN_EXP
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD DBL_EXPBIT0_WORD
+# define EXPBIT0_BIT DBL_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_DBL
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC rpl_isnanf
+# define DOUBLE float
+# define MAX_EXP FLT_MAX_EXP
+# define MIN_EXP FLT_MIN_EXP
+# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
+# define KNOWN_EXPBIT0_LOCATION
+# define EXPBIT0_WORD FLT_EXPBIT0_WORD
+# define EXPBIT0_BIT FLT_EXPBIT0_BIT
+# endif
+# define SIZE SIZEOF_FLT
+# define L_(literal) literal##f
+#endif
+
+#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
+
+#define NWORDS \
+ ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
+
+int
+FUNC (DOUBLE x)
+{
+#ifdef KNOWN_EXPBIT0_LOCATION
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+ /* Special CPU dependent code is needed to treat bit patterns outside the
+ IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
+ Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
+ These bit patterns are:
+ - exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
+ - exponent = 0x0000, mantissa bit 63 = 1.
+ The NaN bit pattern is:
+ - exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
+ memory_double m;
+ unsigned int exponent;
+
+ m.value = x;
+ exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
+# ifdef WORDS_BIGENDIAN
+ /* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
+ if (exponent == 0)
+ return 1 & (m.word[0] >> 15);
+ else if (exponent == EXP_MASK)
+ return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
+ else
+ return 1 & ~(m.word[0] >> 15);
+# else
+ /* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
+ if (exponent == 0)
+ return (m.word[1] >> 31);
+ else if (exponent == EXP_MASK)
+ return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
+ else
+ return (m.word[1] >> 31) ^ 1;
+# endif
+# else
+ /* Be careful to not do any floating-point operation on x, such as x == x,
+ because x may be a signaling NaN. */
+# if defined __SUNPRO_C || defined __ICC || defined _MSC_VER \
+ || defined __DECC || defined __TINYC__ \
+ || (defined __sgi && !defined __GNUC__)
+ /* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC)
+ 6.4, and TinyCC compilers don't recognize the initializers as constant
+ expressions. The Compaq compiler also fails when constant-folding
+ 0.0 / 0.0 even when constant-folding is not required. The Microsoft
+ Visual C/C++ compiler also fails when constant-folding 1.0 / 0.0 even
+ when constant-folding is not required. The SGI MIPSpro C compiler
+ complains about "floating-point operation result is out of range". */
+ static DOUBLE zero = L_(0.0);
+ memory_double nan;
+ DOUBLE plus_inf = L_(1.0) / zero;
+ DOUBLE minus_inf = -L_(1.0) / zero;
+ nan.value = zero / zero;
+# else
+ static memory_double nan = { L_(0.0) / L_(0.0) };
+ static DOUBLE plus_inf = L_(1.0) / L_(0.0);
+ static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
+# endif
+ {
+ memory_double m;
+
+ /* A NaN can be recognized through its exponent. But exclude +Infinity and
+ -Infinity, which have the same exponent. */
+ m.value = x;
+ if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
+ & (EXP_MASK << EXPBIT0_BIT))
+ == 0)
+ return (memcmp (&m.value, &plus_inf, SIZE) != 0
+ && memcmp (&m.value, &minus_inf, SIZE) != 0);
+ else
+ return 0;
+ }
+# endif
+#else
+ /* The configuration did not find sufficient information. Give up about
+ the signaling NaNs, handle only the quiet NaNs. */
+ if (x == x)
+ {
+# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+ /* Detect any special bit patterns that pass ==; see comment above. */
+ memory_double m1;
+ memory_double m2;
+
+ memset (&m1.value, 0, SIZE);
+ memset (&m2.value, 0, SIZE);
+ m1.value = x;
+ m2.value = x + (x ? 0.0L : -0.0L);
+ if (memcmp (&m1.value, &m2.value, SIZE) != 0)
+ return 1;
+# endif
+ return 0;
+ }
+ else
+ return 1;
+#endif
+}
diff --git a/gnulib/lib/isnand-nolibm.h b/gnulib/lib/isnand-nolibm.h
new file mode 100644
index 0000000..4c49c32
--- /dev/null
+++ b/gnulib/lib/isnand-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNAND_IN_LIBC
+/* Get declaration of isnan macro. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+extern int isnand (double x);
+#endif
diff --git a/gnulib/lib/isnand.c b/gnulib/lib/isnand.c
new file mode 100644
index 0000000..c47ff25
--- /dev/null
+++ b/gnulib/lib/isnand.c
@@ -0,0 +1,19 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include "isnan.c"
diff --git a/gnulib/lib/isnanf-nolibm.h b/gnulib/lib/isnanf-nolibm.h
new file mode 100644
index 0000000..1a1cbf9
--- /dev/null
+++ b/gnulib/lib/isnanf-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNANF_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanf function. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+extern int isnanf (float x);
+#endif
diff --git a/gnulib/lib/isnanf.c b/gnulib/lib/isnanf.c
new file mode 100644
index 0000000..adb7059
--- /dev/null
+++ b/gnulib/lib/isnanf.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "isnan.c"
diff --git a/gnulib/lib/isnanl-nolibm.h b/gnulib/lib/isnanl-nolibm.h
new file mode 100644
index 0000000..bf14228
--- /dev/null
+++ b/gnulib/lib/isnanl-nolibm.h
@@ -0,0 +1,33 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if HAVE_ISNANL_IN_LIBC
+/* Get declaration of isnan macro or (older) isnanl function. */
+# include <math.h>
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanl
+# define isnanl(x) __builtin_isnanl ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+#else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+extern int isnanl (long double x);
+#endif
diff --git a/gnulib/lib/isnanl.c b/gnulib/lib/isnanl.c
new file mode 100644
index 0000000..1482fb2
--- /dev/null
+++ b/gnulib/lib/isnanl.c
@@ -0,0 +1,20 @@
+/* Test for NaN that does not need libm.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_LONG_DOUBLE
+#include "isnan.c"
diff --git a/gnulib/lib/iswblank.c b/gnulib/lib/iswblank.c
new file mode 100644
index 0000000..694f4b9
--- /dev/null
+++ b/gnulib/lib/iswblank.c
@@ -0,0 +1,27 @@
+/* Test wide character for being blank.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+int
+iswblank (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
diff --git a/gnulib/lib/iswctype-impl.h b/gnulib/lib/iswctype-impl.h
new file mode 100644
index 0000000..8a88d6f
--- /dev/null
+++ b/gnulib/lib/iswctype-impl.h
@@ -0,0 +1,22 @@
+/* Test whether a wide character has a given property.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+iswctype (wint_t wc, wctype_t desc)
+{
+ return ((int (*) (wint_t)) desc) (wc);
+}
diff --git a/gnulib/lib/iswctype.c b/gnulib/lib/iswctype.c
new file mode 100644
index 0000000..6f4c362
--- /dev/null
+++ b/gnulib/lib/iswctype.c
@@ -0,0 +1,23 @@
+/* Test whether a wide character has a given property.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+#include "iswctype-impl.h"
diff --git a/gnulib/lib/itold.c b/gnulib/lib/itold.c
new file mode 100644
index 0000000..0236f33
--- /dev/null
+++ b/gnulib/lib/itold.c
@@ -0,0 +1,28 @@
+/* Replacement for 'int' to 'long double' conversion routine.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+void
+_Qp_itoq (long double *result, int a)
+{
+ /* Convert from 'int' to 'double', then from 'double' to 'long double'. */
+ *result = (double) a;
+}
diff --git a/gnulib/lib/javacomp.c b/gnulib/lib/javacomp.c
new file mode 100644
index 0000000..000e308
--- /dev/null
+++ b/gnulib/lib/javacomp.c
@@ -0,0 +1,2355 @@
+/* Compile a Java program.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "javacomp.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "javaversion.h"
+#include "execute.h"
+#include "spawn-pipe.h"
+#include "wait-process.h"
+#include "classpath.h"
+#include "xsetenv.h"
+#include "sh-quote.h"
+#include "binary-io.h"
+#include "safe-read.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "concat-filename.h"
+#include "fwriteerror.h"
+#include "clean-temp.h"
+#include "error.h"
+#include "xvasprintf.h"
+#include "c-strstr.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+/* Survey of Java compilers.
+
+ A = does it work without CLASSPATH being set
+ C = option to set CLASSPATH, other than setting it in the environment
+ O = option for optimizing
+ g = option for debugging
+ T = test for presence
+
+ Program from A C O g T
+
+ $JAVAC unknown N n/a -O -g true
+ gcj -C GCC 3.2 Y --classpath=P -O -g gcj --version | sed -e 's,^[^0-9]*,,' -e 1q | sed -e '/^3\.[01]/d' | grep '^[3-9]' >/dev/null
+ javac JDK 1.1.8 Y -classpath P -O -g javac 2>/dev/null; test $? = 1
+ javac JDK 1.3.0 Y -classpath P -O -g javac 2>/dev/null; test $? -le 2
+ jikes Jikes 1.14 N -classpath P -O -g jikes 2>/dev/null; test $? = 1
+
+ All compilers support the option "-d DIRECTORY" for the base directory
+ of the classes to be written.
+
+ The CLASSPATH is a colon separated list of pathnames. (On Windows: a
+ semicolon separated list of pathnames.)
+
+ We try the Java compilers in the following order:
+ 1. getenv ("JAVAC"), because the user must be able to override our
+ preferences,
+ 2. "gcj -C", because it is a completely free compiler,
+ 3. "javac", because it is a standard compiler,
+ 4. "jikes", comes last because it has some deviating interpretation
+ of the Java Language Specification and because it requires a
+ CLASSPATH environment variable.
+
+ We unset the JAVA_HOME environment variable, because a wrong setting of
+ this variable can confuse the JDK's javac.
+ */
+
+/* Return the default target_version. */
+static const char *
+default_target_version (void)
+{
+ /* Use a cache. Assumes that the PATH environment variable doesn't change
+ during the lifetime of the program. */
+ static const char *java_version_cache;
+ if (java_version_cache == NULL)
+ {
+ /* Determine the version from the found JVM. */
+ java_version_cache = javaexec_version ();
+ if (java_version_cache == NULL
+ || !(java_version_cache[0] == '1' && java_version_cache[1] == '.'
+ && (java_version_cache[2] >= '1' && java_version_cache[2] <= '6')
+ && java_version_cache[3] == '\0'))
+ java_version_cache = "1.1";
+ }
+ return java_version_cache;
+}
+
+/* ======================= Source version dependent ======================= */
+
+/* Convert a source version to an index. */
+#define SOURCE_VERSION_BOUND 3 /* exclusive upper bound */
+static unsigned int
+source_version_index (const char *source_version)
+{
+ if (source_version[0] == '1' && source_version[1] == '.'
+ && (source_version[2] >= '3' && source_version[2] <= '5')
+ && source_version[3] == '\0')
+ return source_version[2] - '3';
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return 0;
+}
+
+/* Return a snippet of code that should compile in the given source version. */
+static const char *
+get_goodcode_snippet (const char *source_version)
+{
+ if (strcmp (source_version, "1.3") == 0)
+ return "class conftest {}\n";
+ if (strcmp (source_version, "1.4") == 0)
+ return "class conftest { static { assert(true); } }\n";
+ if (strcmp (source_version, "1.5") == 0)
+ return "class conftest<T> { T foo() { return null; } }\n";
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return NULL;
+}
+
+/* Return a snippet of code that should fail to compile in the given source
+ version, or NULL (standing for a snippet that would fail to compile with
+ any compiler). */
+static const char *
+get_failcode_snippet (const char *source_version)
+{
+ if (strcmp (source_version, "1.3") == 0)
+ return "class conftestfail { static { assert(true); } }\n";
+ if (strcmp (source_version, "1.4") == 0)
+ return "class conftestfail<T> { T foo() { return null; } }\n";
+ if (strcmp (source_version, "1.5") == 0)
+ return NULL;
+ error (EXIT_FAILURE, 0, _("invalid source_version argument to compile_java_class"));
+ return NULL;
+}
+
+/* ======================= Target version dependent ======================= */
+
+/* Convert a target version to an index. */
+#define TARGET_VERSION_BOUND 6 /* exclusive upper bound */
+static unsigned int
+target_version_index (const char *target_version)
+{
+ if (target_version[0] == '1' && target_version[1] == '.'
+ && (target_version[2] >= '1' && target_version[2] <= '6')
+ && target_version[3] == '\0')
+ return target_version[2] - '1';
+ error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
+ return 0;
+}
+
+/* Return the class file version number corresponding to a given target
+ version. */
+static int
+corresponding_classfile_version (const char *target_version)
+{
+ if (strcmp (target_version, "1.1") == 0)
+ return 45;
+ if (strcmp (target_version, "1.2") == 0)
+ return 46;
+ if (strcmp (target_version, "1.3") == 0)
+ return 47;
+ if (strcmp (target_version, "1.4") == 0)
+ return 48;
+ if (strcmp (target_version, "1.5") == 0)
+ return 49;
+ if (strcmp (target_version, "1.6") == 0)
+ return 50;
+ error (EXIT_FAILURE, 0, _("invalid target_version argument to compile_java_class"));
+ return 0;
+}
+
+/* ======================== Compilation subroutines ======================== */
+
+/* Try to compile a set of Java sources with $JAVAC.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_envjavac (const char *javac,
+ const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ /* Because $JAVAC may consist of a command and options, we use the
+ shell. Because $JAVAC has been set by the user, we leave all
+ environment variables in place, including JAVA_HOME, and we don't
+ erase the user's CLASSPATH. */
+ bool err;
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ int exitstatus;
+ unsigned int i;
+ char *p;
+
+ command_length = strlen (javac);
+ if (optimize)
+ command_length += 3;
+ if (debug)
+ command_length += 3;
+ if (directory != NULL)
+ command_length += 4 + shell_quote_length (directory);
+ for (i = 0; i < java_sources_count; i++)
+ command_length += 1 + shell_quote_length (java_sources[i]);
+ command_length += 1;
+
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ if (optimize)
+ {
+ memcpy (p, " -O", 3);
+ p += 3;
+ }
+ if (debug)
+ {
+ memcpy (p, " -g", 3);
+ p += 3;
+ }
+ if (directory != NULL)
+ {
+ memcpy (p, " -d ", 4);
+ p += 4;
+ p = shell_quote_copy (p, directory);
+ }
+ for (i = 0; i < java_sources_count; i++)
+ {
+ *p++ = ' ';
+ p = shell_quote_copy (p, java_sources[i]);
+ }
+ *p++ = '\0';
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ if (verbose)
+ printf ("%s\n", command);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ exitstatus = execute (javac, "/bin/sh", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (command);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with gcj.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_gcj (const char * const *java_sources,
+ unsigned int java_sources_count,
+ bool no_assert_option,
+ bool fsource_option, const char *source_version,
+ bool ftarget_option, const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ char *fsource_arg;
+ char *ftarget_arg;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 2 + (no_assert_option ? 1 : 0) + (fsource_option ? 1 : 0)
+ + (ftarget_option ? 1 : 0) + (optimize ? 1 : 0) + (debug ? 1 : 0)
+ + (directory != NULL ? 2 : 0) + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "gcj";
+ *argp++ = "-C";
+ if (no_assert_option)
+ *argp++ = "-fno-assert";
+ if (fsource_option)
+ {
+ fsource_arg = (char *) xmalloca (9 + strlen (source_version) + 1);
+ memcpy (fsource_arg, "-fsource=", 9);
+ strcpy (fsource_arg + 9, source_version);
+ *argp++ = fsource_arg;
+ }
+ else
+ fsource_arg = NULL;
+ if (ftarget_option)
+ {
+ ftarget_arg = (char *) xmalloca (9 + strlen (target_version) + 1);
+ memcpy (ftarget_arg, "-ftarget=", 9);
+ strcpy (ftarget_arg + 9, target_version);
+ *argp++ = ftarget_arg;
+ }
+ else
+ ftarget_arg = NULL;
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("gcj", "gcj", argv, false, false, false, null_stderr,
+ true, true, NULL);
+ err = (exitstatus != 0);
+
+ if (ftarget_arg != NULL)
+ freea (ftarget_arg);
+ if (fsource_arg != NULL)
+ freea (fsource_arg);
+ freea (argv);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with javac.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_javac (const char * const *java_sources,
+ unsigned int java_sources_count,
+ bool source_option, const char *source_version,
+ bool target_option, const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (source_option ? 2 : 0) + (target_option ? 2 : 0) + (optimize ? 1 : 0)
+ + (debug ? 1 : 0) + (directory != NULL ? 2 : 0) + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "javac";
+ if (source_option)
+ {
+ *argp++ = "-source";
+ *argp++ = (char *) source_version;
+ }
+ if (target_option)
+ {
+ *argp++ = "-target";
+ *argp++ = (char *) target_version;
+ }
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("javac", "javac", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (argv);
+
+ return err;
+}
+
+/* Try to compile a set of Java sources with jikes.
+ Return a failure indicator (true upon error). */
+static bool
+compile_using_jikes (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char *directory,
+ bool optimize, bool debug,
+ bool verbose, bool null_stderr)
+{
+ bool err;
+ unsigned int argc;
+ char **argv;
+ char **argp;
+ int exitstatus;
+ unsigned int i;
+
+ argc =
+ 1 + (optimize ? 1 : 0) + (debug ? 1 : 0) + (directory != NULL ? 2 : 0)
+ + java_sources_count;
+ argv = (char **) xmalloca ((argc + 1) * sizeof (char *));
+
+ argp = argv;
+ *argp++ = "jikes";
+ if (optimize)
+ *argp++ = "-O";
+ if (debug)
+ *argp++ = "-g";
+ if (directory != NULL)
+ {
+ *argp++ = "-d";
+ *argp++ = (char *) directory;
+ }
+ for (i = 0; i < java_sources_count; i++)
+ *argp++ = (char *) java_sources[i];
+ *argp = NULL;
+ /* Ensure argv length was correctly calculated. */
+ if (argp - argv != argc)
+ abort ();
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ exitstatus = execute ("jikes", "jikes", argv, false, false, false,
+ null_stderr, true, true, NULL);
+ err = (exitstatus != 0);
+
+ freea (argv);
+
+ return err;
+}
+
+/* ====================== Usability test subroutines ====================== */
+
+/* Write a given contents to a temporary file.
+ FILE_NAME is the name of a file inside TMPDIR that is known not to exist
+ yet.
+ Return a failure indicator (true upon error). */
+static bool
+write_temp_file (struct temp_dir *tmpdir, const char *file_name,
+ const char *contents)
+{
+ FILE *fp;
+
+ register_temp_file (tmpdir, file_name);
+ fp = fopen_temp (file_name, "w");
+ if (fp == NULL)
+ {
+ error (0, errno, _("failed to create \"%s\""), file_name);
+ unregister_temp_file (tmpdir, file_name);
+ return true;
+ }
+ fputs (contents, fp);
+ if (fwriteerror_temp (fp))
+ {
+ error (0, errno, _("error while writing \"%s\" file"), file_name);
+ return true;
+ }
+ return false;
+}
+
+/* Return the class file version number of a class file on disk. */
+static int
+get_classfile_version (const char *compiled_file_name)
+{
+ unsigned char header[8];
+ int fd;
+
+ /* Open the class file. */
+ fd = open (compiled_file_name, O_RDONLY | O_BINARY, 0);
+ if (fd >= 0)
+ {
+ /* Read its first 8 bytes. */
+ if (safe_read (fd, header, 8) == 8)
+ {
+ /* Verify the class file signature. */
+ if (header[0] == 0xCA && header[1] == 0xFE
+ && header[2] == 0xBA && header[3] == 0xBE)
+ return header[7];
+ }
+ close (fd);
+ }
+
+ /* Could not get the class file version. Return a very large one. */
+ return INT_MAX;
+}
+
+/* Return true if $JAVAC is a version of gcj. */
+static bool
+is_envjavac_gcj (const char *javac)
+{
+ static bool envjavac_tested;
+ static bool envjavac_gcj;
+
+ if (!envjavac_tested)
+ {
+ /* Test whether $JAVAC is gcj:
+ "$JAVAC --version 2>/dev/null | sed -e 1q | grep gcj > /dev/null" */
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+ char *p;
+
+ /* Setup the command "$JAVAC --version". */
+ command_length = strlen (javac) + 1 + 9 + 1;
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ memcpy (p, " --version", 1 + 9 + 1);
+ p += 1 + 9 + 1;
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ /* Call $JAVAC --version 2>/dev/null. */
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ child = create_pipe_in (javac, "/bin/sh", argv, DEV_NULL, true, true,
+ false, fd);
+ if (child == -1)
+ goto failed;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ goto failed;
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ fclose (fp);
+ goto failed;
+ }
+ /* It is safe to call c_strstr() instead of strstr() here; see the
+ comments in c-strstr.h. */
+ envjavac_gcj = (c_strstr (line, "gcj") != NULL);
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, javac, true, true, true, false, NULL);
+ if (exitstatus != 0)
+ envjavac_gcj = false;
+
+ failed:
+ freea (command);
+
+ envjavac_tested = true;
+ }
+
+ return envjavac_gcj;
+}
+
+/* Return true if $JAVAC, known to be a version of gcj, is a version >= 4.3
+ of gcj. */
+static bool
+is_envjavac_gcj43 (const char *javac)
+{
+ static bool envjavac_tested;
+ static bool envjavac_gcj43;
+
+ if (!envjavac_tested)
+ {
+ /* Test whether $JAVAC is gcj:
+ "$JAVAC --version 2>/dev/null | sed -e 's,^[^0-9]*,,' -e 1q \
+ | sed -e '/^4\.[012]/d' | grep '^[4-9]' >/dev/null" */
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+ char *p;
+
+ /* Setup the command "$JAVAC --version". */
+ command_length = strlen (javac) + 1 + 9 + 1;
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVAC, because it may consist of a command
+ and options. */
+ memcpy (p, javac, strlen (javac));
+ p += strlen (javac);
+ memcpy (p, " --version", 1 + 9 + 1);
+ p += 1 + 9 + 1;
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ /* Call $JAVAC --version 2>/dev/null. */
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ child = create_pipe_in (javac, "/bin/sh", argv, DEV_NULL, true, true,
+ false, fd);
+ if (child == -1)
+ goto failed;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ goto failed;
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ fclose (fp);
+ goto failed;
+ }
+ p = line;
+ while (*p != '\0' && !(*p >= '0' && *p <= '9'))
+ p++;
+ envjavac_gcj43 =
+ !(*p == '4' && p[1] == '.' && p[2] >= '0' && p[2] <= '2')
+ && (*p >= '4' && *p <= '9');
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, javac, true, true, true, false, NULL);
+ if (exitstatus != 0)
+ envjavac_gcj43 = false;
+
+ failed:
+ freea (command);
+
+ envjavac_tested = true;
+ }
+
+ return envjavac_gcj43;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj >= 4.3, can be used, and
+ whether it needs a -fsource and/or -ftarget option.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_gcj43_usable (const char *javac,
+ const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *fsource_option_p, bool *ftarget_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool fsource_option;
+ bool ftarget_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* $JAVAC compiled conftest.java successfully. */
+ /* Try adding -fsource option if it is useful. */
+ char *javac_source =
+ xasprintf ("%s -fsource=%s", javac, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ free (javac_source);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* $JAVAC compiled conftestfail.java successfully, and
+ "$JAVAC -fsource=$source_version" rejects it. So
+ the -fsource option is useful. */
+ resultp->fsource_option = true;
+ }
+ }
+ }
+
+ free (javac_source);
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -fsource and -ftarget options. */
+ char *javac_target =
+ xasprintf ("%s -fsource=%s -ftarget=%s",
+ javac, source_version, target_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -fsource $source_version -ftarget $target_version"
+ compiled conftest.java successfully. */
+ resultp->fsource_option = true;
+ resultp->ftarget_option = true;
+ resultp->usable = true;
+ }
+
+ free (javac_target);
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *fsource_option_p = resultp->fsource_option;
+ *ftarget_option_p = resultp->ftarget_option;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for
+ compiling with target_version = 1.4 and source_version = 1.4.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_oldgcj_14_14_usable (const char *javac, bool *usablep)
+{
+ static bool envjavac_tested;
+ static bool envjavac_usable;
+
+ if (!envjavac_tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.4")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac, java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ envjavac_usable = true;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ envjavac_tested = true;
+ }
+
+ *usablep = envjavac_usable;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be a version of gcj < 4.3, can be used for
+ compiling with target_version = 1.4 and source_version = 1.3.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_oldgcj_14_13_usable (const char *javac,
+ bool *usablep, bool *need_no_assert_option_p)
+{
+ static bool envjavac_tested;
+ static bool envjavac_usable;
+ static bool envjavac_need_no_assert_option;
+
+ if (!envjavac_tested)
+ {
+ /* Try $JAVAC and "$JAVAC -fno-assert". But add -fno-assert only if
+ it makes a difference. (It could already be part of $JAVAC.) */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+ bool javac_works;
+ char *javac_noassert;
+ bool javac_noassert_works;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ javac_works = true;
+ else
+ javac_works = false;
+
+ unlink (compiled_file_name);
+
+ javac_noassert = xasprintf ("%s -fno-assert", javac);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_noassert,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ javac_noassert_works = true;
+ else
+ javac_noassert_works = false;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ if (javac_works && javac_noassert_works)
+ {
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_failcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ free (javac_noassert);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ /* Compilation succeeded. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!(!compile_using_envjavac (javac_noassert,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0))
+ /* Compilation failed. */
+ /* "$JAVAC -fno-assert" works better than $JAVAC. */
+ javac_works = true;
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+ }
+
+ cleanup_temp_dir (tmpdir);
+
+ if (javac_works)
+ {
+ envjavac_usable = true;
+ envjavac_need_no_assert_option = false;
+ }
+ else if (javac_noassert_works)
+ {
+ envjavac_usable = true;
+ envjavac_need_no_assert_option = true;
+ }
+
+ envjavac_tested = true;
+ }
+
+ *usablep = envjavac_usable;
+ *need_no_assert_option_p = envjavac_need_no_assert_option;
+ return false;
+}
+
+/* Test whether $JAVAC, known to be not a version of gcj, can be used, and
+ whether it needs a -source and/or -target option.
+ Return a failure indicator (true upon error). */
+static bool
+is_envjavac_nongcj_usable (const char *javac,
+ const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *source_option_p, bool *target_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool source_option;
+ bool target_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try $JAVAC. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* $JAVAC compiled conftest.java successfully. */
+ /* Try adding -source option if it is useful. */
+ char *javac_source =
+ xasprintf ("%s -source %s", javac, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ free (javac_source);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* $JAVAC compiled conftestfail.java successfully, and
+ "$JAVAC -source $source_version" rejects it. So the
+ -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ free (javac_source);
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -target option alone. (Sun javac 1.3.1 has the -target
+ option but no -source option.) */
+ char *javac_target =
+ xasprintf ("%s -target %s", javac, target_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -target $target_version" compiled conftest.java
+ successfully. */
+ /* Try adding -source option if it is useful. */
+ char *javac_target_source =
+ xasprintf ("%s -source %s", javac_target, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ failcode))
+ {
+ free (conftest_file_name);
+ free (javac_target_source);
+ free (javac_target);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_envjavac (javac_target_source,
+ java_sources, 1,
+ tmpdir->dir_name,
+ false, false, false,
+ true))
+ /* "$JAVAC -target $target_version" compiled
+ conftestfail.java successfully, and
+ "$JAVAC -target $target_version -source $source_version"
+ rejects it. So the -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ free (javac_target_source);
+
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Maybe this -target option requires a -source option? Try with
+ -target and -source options. (Supported by Sun javac 1.4 and
+ higher.) */
+ char *javac_target_source =
+ xasprintf ("%s -source %s", javac_target, source_version);
+
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_envjavac (javac_target_source,
+ java_sources, 1, tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "$JAVAC -target $target_version -source $source_version"
+ compiled conftest.java successfully. */
+ resultp->source_option = true;
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+
+ free (javac_target_source);
+ }
+
+ free (javac_target);
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *source_option_p = resultp->source_option;
+ *target_option_p = resultp->target_option;
+ return false;
+}
+
+static bool
+is_gcj_present (void)
+{
+ static bool gcj_tested;
+ static bool gcj_present;
+
+ if (!gcj_tested)
+ {
+ /* Test for presence of gcj:
+ "gcj --version 2> /dev/null | \
+ sed -e 's,^[^0-9]*,,' -e 1q | \
+ sed -e '/^3\.[01]/d' | grep '^[3-9]' > /dev/null" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "gcj";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("gcj", "gcj", argv, DEV_NULL, true, true,
+ false, fd);
+ gcj_present = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, drop all lines except the first,
+ drop all characters before the first digit, and test whether
+ the remaining string starts with a digit >= 3, but not with
+ "3.0" or "3.1". */
+ char c[3];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] == '\n')
+ break;
+ if (count == 0)
+ {
+ if (!(c[0] >= '0' && c[0] <= '9'))
+ continue;
+ gcj_present = (c[0] >= '3');
+ }
+ count++;
+ if (count == 3)
+ {
+ if (c[0] == '3' && c[1] == '.'
+ && (c[2] == '0' || c[2] == '1'))
+ gcj_present = false;
+ break;
+ }
+ }
+ while (safe_read (fd[0], &c[0], 1) > 0)
+ ;
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "gcj", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ gcj_present = false;
+ }
+
+ if (gcj_present)
+ {
+ /* See if libgcj.jar is well installed. */
+ struct temp_dir *tmpdir;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ gcj_present = false;
+ else
+ {
+ char *conftest_file_name;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftestlib.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+"public class conftestlib {\n"
+" public static void main (String[] args) {\n"
+" }\n"
+"}\n"))
+ gcj_present = false;
+ else
+ {
+ char *compiled_file_name;
+ const char *java_sources[1];
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestlib.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_gcj (java_sources, 1, false,
+ false, NULL, false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true))
+ gcj_present = false;
+
+ free (compiled_file_name);
+ }
+ free (conftest_file_name);
+ }
+ cleanup_temp_dir (tmpdir);
+ }
+
+ gcj_tested = true;
+ }
+
+ return gcj_present;
+}
+
+static bool
+is_gcj_43 (void)
+{
+ static bool gcj_tested;
+ static bool gcj_43;
+
+ if (!gcj_tested)
+ {
+ /* Test for presence of gcj:
+ "gcj --version 2> /dev/null | \
+ sed -e 's,^[^0-9]*,,' -e 1q | \
+ sed -e '/^4\.[012]/d' | grep '^[4-9]'" */
+ char *argv[3];
+ pid_t child;
+ int fd[1];
+ int exitstatus;
+
+ argv[0] = "gcj";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ child = create_pipe_in ("gcj", "gcj", argv, DEV_NULL, true, true,
+ false, fd);
+ gcj_43 = false;
+ if (child != -1)
+ {
+ /* Read the subprocess output, drop all lines except the first,
+ drop all characters before the first digit, and test whether
+ the remaining string starts with a digit >= 4, but not with
+ "4.0" or "4.1" or "4.2". */
+ char c[3];
+ size_t count = 0;
+
+ while (safe_read (fd[0], &c[count], 1) > 0)
+ {
+ if (c[count] == '\n')
+ break;
+ if (count == 0)
+ {
+ if (!(c[0] >= '0' && c[0] <= '9'))
+ continue;
+ gcj_43 = (c[0] >= '4');
+ }
+ count++;
+ if (count == 3)
+ {
+ if (c[0] == '4' && c[1] == '.' && c[2] >= '0' && c[2] <= '2')
+ gcj_43 = false;
+ break;
+ }
+ }
+ while (safe_read (fd[0], &c[0], 1) > 0)
+ ;
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list, and retrieve exit
+ status. */
+ exitstatus =
+ wait_subprocess (child, "gcj", false, true, true, false, NULL);
+ if (exitstatus != 0)
+ gcj_43 = false;
+ }
+
+ gcj_tested = true;
+ }
+
+ return gcj_43;
+}
+
+/* Test whether gcj >= 4.3 can be used, and whether it needs a -fsource and/or
+ -ftarget option.
+ Return a failure indicator (true upon error). */
+static bool
+is_gcj43_usable (const char *source_version,
+ const char *target_version,
+ bool *usablep,
+ bool *fsource_option_p, bool *ftarget_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool fsource_option;
+ bool ftarget_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try gcj. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* gcj compiled conftest.java successfully. */
+ /* Try adding -fsource option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, true, source_version, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, false, NULL, false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_gcj (java_sources, 1,
+ false, true, source_version,
+ false, NULL,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* gcj compiled conftestfail.java successfully, and
+ "gcj -fsource=$source_version" rejects it. So
+ the -fsource option is useful. */
+ resultp->fsource_option = true;
+ }
+ }
+ }
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -fsource and -ftarget options. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1,
+ false, true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "gcj -fsource $source_version -ftarget $target_version"
+ compiled conftest.java successfully. */
+ resultp->fsource_option = true;
+ resultp->ftarget_option = true;
+ resultp->usable = true;
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *fsource_option_p = resultp->fsource_option;
+ *ftarget_option_p = resultp->ftarget_option;
+ return false;
+}
+
+/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4
+ and source_version = 1.4.
+ Return a failure indicator (true upon error). */
+static bool
+is_oldgcj_14_14_usable (bool *usablep)
+{
+ static bool gcj_tested;
+ static bool gcj_usable;
+
+ if (!gcj_tested)
+ {
+ /* Try gcj. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.4")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ gcj_usable = true;
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ gcj_tested = true;
+ }
+
+ *usablep = gcj_usable;
+ return false;
+}
+
+/* Test whether gcj < 4.3 can be used for compiling with target_version = 1.4
+ and source_version = 1.3.
+ Return a failure indicator (true upon error). */
+static bool
+is_oldgcj_14_13_usable (bool *usablep, bool *need_no_assert_option_p)
+{
+ static bool gcj_tested;
+ static bool gcj_usable;
+ static bool gcj_need_no_assert_option;
+
+ if (!gcj_tested)
+ {
+ /* Try gcj and "gcj -fno-assert". But add -fno-assert only if
+ it works (not gcj < 3.3). */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet ("1.3")))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, true, false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ {
+ gcj_usable = true;
+ gcj_need_no_assert_option = true;
+ }
+ else
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_gcj (java_sources, 1, false,
+ false, NULL, false, NULL,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ /* Compilation succeeded. */
+ {
+ gcj_usable = true;
+ gcj_need_no_assert_option = false;
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ cleanup_temp_dir (tmpdir);
+
+ gcj_tested = true;
+ }
+
+ *usablep = gcj_usable;
+ *need_no_assert_option_p = gcj_need_no_assert_option;
+ return false;
+}
+
+static bool
+is_javac_present (void)
+{
+ static bool javac_tested;
+ static bool javac_present;
+
+ if (!javac_tested)
+ {
+ /* Test for presence of javac: "javac 2> /dev/null ; test $? -le 2" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "javac";
+ argv[1] = NULL;
+ exitstatus = execute ("javac", "javac", argv, false, false, true, true,
+ true, false, NULL);
+ javac_present = (exitstatus == 0 || exitstatus == 1 || exitstatus == 2);
+ javac_tested = true;
+ }
+
+ return javac_present;
+}
+
+/* Test whether javac can be used and whether it needs a -source and/or
+ -target option.
+ Return a failure indicator (true upon error). */
+static bool
+is_javac_usable (const char *source_version, const char *target_version,
+ bool *usablep, bool *source_option_p, bool *target_option_p)
+{
+ /* The cache depends on the source_version and target_version. */
+ struct result_t
+ {
+ bool tested;
+ bool usable;
+ bool source_option;
+ bool target_option;
+ };
+ static struct result_t result_cache[SOURCE_VERSION_BOUND][TARGET_VERSION_BOUND];
+ struct result_t *resultp;
+
+ resultp = &result_cache[source_version_index (source_version)]
+ [target_version_index (target_version)];
+ if (!resultp->tested)
+ {
+ /* Try javac. */
+ struct temp_dir *tmpdir;
+ char *conftest_file_name;
+ char *compiled_file_name;
+ const char *java_sources[1];
+ struct stat statbuf;
+
+ tmpdir = create_temp_dir ("java", NULL, false);
+ if (tmpdir == NULL)
+ return true;
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.java", NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ get_goodcode_snippet (source_version)))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name, "conftest.class", NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ false, target_version,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* javac compiled conftest.java successfully. */
+ /* Try adding -source option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ false, target_version,
+ tmpdir->dir_name, false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name, failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ false, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_javac (java_sources, 1,
+ true, source_version,
+ false, target_version,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* javac compiled conftestfail.java successfully, and
+ "javac -source $source_version" rejects it. So the
+ -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Try with -target option alone. (Sun javac 1.3.1 has the -target
+ option but no -source option.) */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "javac -target $target_version" compiled conftest.java
+ successfully. */
+ /* Try adding -source option if it is useful. */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ const char *failcode = get_failcode_snippet (source_version);
+
+ if (failcode != NULL)
+ {
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ conftest_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.java",
+ NULL);
+ if (write_temp_file (tmpdir, conftest_file_name,
+ failcode))
+ {
+ free (conftest_file_name);
+ cleanup_temp_dir (tmpdir);
+ return true;
+ }
+
+ compiled_file_name =
+ xconcatenated_filename (tmpdir->dir_name,
+ "conftestfail.class",
+ NULL);
+ register_temp_file (tmpdir, compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ false, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0)
+ {
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true))
+ /* "javac -target $target_version" compiled
+ conftestfail.java successfully, and
+ "javac -target $target_version -source $source_version"
+ rejects it. So the -source option is useful. */
+ resultp->source_option = true;
+ }
+ }
+ }
+
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ else
+ {
+ /* Maybe this -target option requires a -source option? Try with
+ -target and -source options. (Supported by Sun javac 1.4 and
+ higher.) */
+ unlink (compiled_file_name);
+
+ java_sources[0] = conftest_file_name;
+ if (!compile_using_javac (java_sources, 1,
+ true, source_version,
+ true, target_version,
+ tmpdir->dir_name,
+ false, false, false, true)
+ && stat (compiled_file_name, &statbuf) >= 0
+ && get_classfile_version (compiled_file_name)
+ <= corresponding_classfile_version (target_version))
+ {
+ /* "javac -target $target_version -source $source_version"
+ compiled conftest.java successfully. */
+ resultp->source_option = true;
+ resultp->target_option = true;
+ resultp->usable = true;
+ }
+ }
+ }
+
+ free (compiled_file_name);
+ free (conftest_file_name);
+
+ resultp->tested = true;
+ }
+
+ *usablep = resultp->usable;
+ *source_option_p = resultp->source_option;
+ *target_option_p = resultp->target_option;
+ return false;
+}
+
+static bool
+is_jikes_present (void)
+{
+ static bool jikes_tested;
+ static bool jikes_present;
+
+ if (!jikes_tested)
+ {
+ /* Test for presence of jikes: "jikes 2> /dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "jikes";
+ argv[1] = NULL;
+ exitstatus = execute ("jikes", "jikes", argv, false, false, true, true,
+ true, false, NULL);
+ jikes_present = (exitstatus == 0 || exitstatus == 1);
+ jikes_tested = true;
+ }
+
+ return jikes_present;
+}
+
+/* ============================= Main function ============================= */
+
+bool
+compile_java_class (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ const char *source_version,
+ const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool use_minimal_classpath,
+ bool verbose)
+{
+ bool err = false;
+ char *old_JAVA_HOME;
+
+ {
+ const char *javac = getenv ("JAVAC");
+ if (javac != NULL && javac[0] != '\0')
+ {
+ bool usable = false;
+ bool no_assert_option = false;
+ bool source_option = false;
+ bool target_option = false;
+ bool fsource_option = false;
+ bool ftarget_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_envjavac_gcj (javac))
+ {
+ /* It's a version of gcj. */
+ if (is_envjavac_gcj43 (javac))
+ {
+ /* It's a version of gcj >= 4.3. Assume the classfile versions
+ are correct. */
+ if (is_envjavac_gcj43_usable (javac,
+ source_version, target_version,
+ &usable,
+ &fsource_option, &ftarget_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else
+ {
+ /* It's a version of gcj < 4.3. Ignore the version of the
+ class files that it creates. */
+ if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.4") == 0)
+ {
+ if (is_envjavac_oldgcj_14_14_usable (javac, &usable))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.3") == 0)
+ {
+ if (is_envjavac_oldgcj_14_13_usable (javac,
+ &usable,
+ &no_assert_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* It's not gcj. Assume the classfile versions are correct. */
+ if (is_envjavac_nongcj_usable (javac,
+ source_version, target_version,
+ &usable,
+ &source_option, &target_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+ char *javac_with_options;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false, verbose);
+
+ javac_with_options =
+ (no_assert_option
+ ? xasprintf ("%s -fno-assert", javac)
+ : xasprintf ("%s%s%s%s%s%s%s%s%s",
+ javac,
+ source_option ? " -source " : "",
+ source_option ? source_version : "",
+ target_option ? " -target " : "",
+ target_option ? target_version : "",
+ fsource_option ? " -fsource=" : "",
+ fsource_option ? source_version : "",
+ ftarget_option ? " -ftarget=" : "",
+ ftarget_option ? target_version : ""));
+
+ err = compile_using_envjavac (javac_with_options,
+ java_sources, java_sources_count,
+ directory, optimize, debug, verbose,
+ false);
+
+ free (javac_with_options);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done1;
+ }
+ }
+ }
+
+ /* Unset the JAVA_HOME environment variable. */
+ old_JAVA_HOME = getenv ("JAVA_HOME");
+ if (old_JAVA_HOME != NULL)
+ {
+ old_JAVA_HOME = xstrdup (old_JAVA_HOME);
+ unsetenv ("JAVA_HOME");
+ }
+
+ if (is_gcj_present ())
+ {
+ /* It's a version of gcj. */
+ bool usable = false;
+ bool no_assert_option = false;
+ bool fsource_option = false;
+ bool ftarget_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_gcj_43 ())
+ {
+ /* It's a version of gcj >= 4.3. Assume the classfile versions
+ are correct. */
+ if (is_gcj43_usable (source_version, target_version,
+ &usable, &fsource_option, &ftarget_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else
+ {
+ /* It's a version of gcj < 4.3. Ignore the version of the class
+ files that it creates.
+ Test whether it supports the desired target-version and
+ source-version. */
+ if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.4") == 0)
+ {
+ if (is_oldgcj_14_14_usable (&usable))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ else if (strcmp (target_version, "1.4") == 0
+ && strcmp (source_version, "1.3") == 0)
+ {
+ if (is_oldgcj_14_13_usable (&usable, &no_assert_option))
+ {
+ err = true;
+ goto done1;
+ }
+ }
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We could also use the --CLASSPATH=... option
+ of gcj. Note that --classpath=... option is different: its
+ argument should also contain gcj's libgcj.jar, but we don't
+ know its location. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ err = compile_using_gcj (java_sources, java_sources_count,
+ no_assert_option,
+ fsource_option, source_version,
+ ftarget_option, target_version,
+ directory, optimize, debug, verbose, false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ if (is_javac_present ())
+ {
+ bool usable = false;
+ bool source_option = false;
+ bool target_option = false;
+
+ if (target_version == NULL)
+ target_version = default_target_version ();
+
+ if (is_javac_usable (source_version, target_version,
+ &usable, &source_option, &target_option))
+ {
+ err = true;
+ goto done1;
+ }
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's
+ classes.zip, but we don't know its location. (In JDK 1.3.0 it
+ would work.) */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ err = compile_using_javac (java_sources, java_sources_count,
+ source_option, source_version,
+ target_option, target_version,
+ directory, optimize, debug, verbose,
+ false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ if (is_jikes_present ())
+ {
+ /* Test whether it supports the desired target-version and
+ source-version. */
+ bool usable = (strcmp (source_version, "1.3") == 0);
+
+ if (usable)
+ {
+ char *old_classpath;
+
+ /* Set CLASSPATH. We could also use the "-classpath ..." option.
+ Since jikes doesn't come with its own standard library, it
+ needs a classes.zip or rt.jar or libgcj.jar in the CLASSPATH.
+ To increase the chance of success, we reuse the current CLASSPATH
+ if the user has set it. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false, verbose);
+
+ err = compile_using_jikes (java_sources, java_sources_count,
+ directory, optimize, debug, verbose,
+ false);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done2;
+ }
+ }
+
+ error (0, 0, _("Java compiler not found, try installing gcj or set $JAVAC"));
+ err = true;
+
+ done2:
+ if (old_JAVA_HOME != NULL)
+ {
+ xsetenv ("JAVA_HOME", old_JAVA_HOME, 1);
+ free (old_JAVA_HOME);
+ }
+
+ done1:
+ return err;
+}
diff --git a/gnulib/lib/javacomp.h b/gnulib/lib/javacomp.h
new file mode 100644
index 0000000..e0767d1
--- /dev/null
+++ b/gnulib/lib/javacomp.h
@@ -0,0 +1,75 @@
+/* Compile a Java program.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _JAVACOMP_H
+#define _JAVACOMP_H
+
+#include <stdbool.h>
+
+/* Compile a Java source file to bytecode.
+ java_sources is an array of source file names.
+ classpaths is a list of pathnames to be prepended to the CLASSPATH.
+
+ source_version can be: support for
+ 1.3 inner classes
+ 1.4 assert keyword
+ 1.5 generic classes and methods
+ 1.6 (not yet supported)
+ target_version can be: classfile version:
+ 1.1 45.3
+ 1.2 46.0
+ 1.3 47.0
+ 1.4 48.0
+ 1.5 49.0
+ 1.6 50.0
+ target_version can also be given as NULL. In this case, the required
+ target_version is determined from the found JVM (see javaversion.h).
+ Specifying target_version is useful when building a library (.jar) that is
+ useful outside the given package. Passing target_version = NULL is useful
+ when building an application.
+ It is unreasonable to ask for:
+ - target_version < 1.4 with source_version >= 1.4, or
+ - target_version < 1.5 with source_version >= 1.5, or
+ - target_version < 1.6 with source_version >= 1.6,
+ because even Sun's javac doesn't support these combinations.
+ It is redundant to ask for a target_version > source_version, since the
+ smaller target_version = source_version will also always work and newer JVMs
+ support the older target_versions too. Except for the case
+ target_version = 1.4, source_version = 1.3, which allows gcj versions 3.0
+ to 3.2 to be used.
+
+ directory is the target directory. The .class file for class X.Y.Z is
+ written at directory/X/Y/Z.class. If directory is NULL, the .class
+ file is written in the source's directory.
+ use_minimal_classpath = true means to ignore the user's CLASSPATH and
+ use a minimal one. This is likely to reduce possible problems if the
+ user's CLASSPATH contains garbage or a classes.zip file of the wrong
+ Java version.
+ If verbose, the command to be executed will be printed.
+ Return false if OK, true on error. */
+extern bool compile_java_class (const char * const *java_sources,
+ unsigned int java_sources_count,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ const char *source_version,
+ const char *target_version,
+ const char *directory,
+ bool optimize, bool debug,
+ bool use_minimal_classpath,
+ bool verbose);
+
+#endif /* _JAVACOMP_H */
diff --git a/gnulib/lib/javaexec.c b/gnulib/lib/javaexec.c
new file mode 100644
index 0000000..4afabdf
--- /dev/null
+++ b/gnulib/lib/javaexec.c
@@ -0,0 +1,429 @@
+/* Execute a Java program.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "javaexec.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "execute.h"
+#include "classpath.h"
+#include "xsetenv.h"
+#include "sh-quote.h"
+#include "concat-filename.h"
+#include "xalloc.h"
+#include "xmalloca.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Survey of Java virtual machines.
+
+ A = does it work without CLASSPATH being set
+ B = does it work with CLASSPATH being set to empty
+ C = option to set CLASSPATH, other than setting it in the environment
+ T = test for presence
+
+ Program from A B C T
+
+ $JAVA unknown N Y n/a true
+ gij GCC 3.0 Y Y n/a gij --version >/dev/null
+ java JDK 1.1.8 Y Y -classpath P java -version 2>/dev/null
+ jre JDK 1.1.8 N Y -classpath P jre 2>/dev/null; test $? = 1
+ java JDK 1.3.0 Y Y -classpath P java -version 2>/dev/null
+ jview MS IE Y Y -cp P jview -? >nul; %errorlevel% = 1
+
+ The CLASSPATH is a colon separated list of pathnames. (On Windows: a
+ semicolon separated list of pathnames.)
+
+ We try the Java virtual machines in the following order:
+ 1. getenv ("JAVA"), because the user must be able to override our
+ preferences,
+ 2. "gij", because it is a completely free JVM,
+ 3. "java", because it is a standard JVM,
+ 4. "jre", comes last because it requires a CLASSPATH environment variable,
+ 5. "jview", on Windows only, because it is frequently installed.
+
+ We unset the JAVA_HOME environment variable, because a wrong setting of
+ this variable can confuse the JDK's javac.
+ */
+
+bool
+execute_java_class (const char *class_name,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath,
+ const char *exe_dir,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data)
+{
+ bool err = false;
+ unsigned int nargs;
+ char *old_JAVA_HOME;
+
+ /* Count args. */
+ {
+ const char * const *arg;
+
+ for (nargs = 0, arg = args; *arg != NULL; nargs++, arg++)
+ ;
+ }
+
+ /* First, try a class compiled to a native code executable. */
+ if (exe_dir != NULL)
+ {
+ char *exe_pathname = xconcatenated_filename (exe_dir, class_name, EXEEXT);
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((1 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = exe_pathname;
+ for (i = 0; i <= nargs; i++)
+ argv[1 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer (class_name, exe_pathname, argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done1;
+ }
+
+ {
+ const char *java = getenv ("JAVA");
+ if (java != NULL && java[0] != '\0')
+ {
+ /* Because $JAVA may consist of a command and options, we use the
+ shell. Because $JAVA has been set by the user, we leave all
+ all environment variables in place, including JAVA_HOME, and
+ we don't erase the user's CLASSPATH. */
+ char *old_classpath;
+ unsigned int command_length;
+ char *command;
+ char *argv[4];
+ const char * const *arg;
+ char *p;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, false,
+ verbose);
+
+ command_length = strlen (java);
+ command_length += 1 + shell_quote_length (class_name);
+ for (arg = args; *arg != NULL; arg++)
+ command_length += 1 + shell_quote_length (*arg);
+ command_length += 1;
+
+ command = (char *) xmalloca (command_length);
+ p = command;
+ /* Don't shell_quote $JAVA, because it may consist of a command
+ and options. */
+ memcpy (p, java, strlen (java));
+ p += strlen (java);
+ *p++ = ' ';
+ p = shell_quote_copy (p, class_name);
+ for (arg = args; *arg != NULL; arg++)
+ {
+ *p++ = ' ';
+ p = shell_quote_copy (p, *arg);
+ }
+ *p++ = '\0';
+ /* Ensure command_length was correctly calculated. */
+ if (p - command > command_length)
+ abort ();
+
+ if (verbose)
+ printf ("%s\n", command);
+
+ argv[0] = "/bin/sh";
+ argv[1] = "-c";
+ argv[2] = command;
+ argv[3] = NULL;
+ err = executer (java, "/bin/sh", argv, private_data);
+
+ freea (command);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ goto done1;
+ }
+ }
+
+ /* Unset the JAVA_HOME environment variable. */
+ old_JAVA_HOME = getenv ("JAVA_HOME");
+ if (old_JAVA_HOME != NULL)
+ {
+ old_JAVA_HOME = xstrdup (old_JAVA_HOME);
+ unsetenv ("JAVA_HOME");
+ }
+
+ {
+ static bool gij_tested;
+ static bool gij_present;
+
+ if (!gij_tested)
+ {
+ /* Test for presence of gij: "gij --version > /dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "gij";
+ argv[1] = "--version";
+ argv[2] = NULL;
+ exitstatus = execute ("gij", "gij", argv, false, false, true, true,
+ true, false, NULL);
+ gij_present = (exitstatus == 0);
+ gij_tested = true;
+ }
+
+ if (gij_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "gij";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("gij", "gij", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+ {
+ static bool java_tested;
+ static bool java_present;
+
+ if (!java_tested)
+ {
+ /* Test for presence of java: "java -version 2> /dev/null" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "java";
+ argv[1] = "-version";
+ argv[2] = NULL;
+ exitstatus = execute ("java", "java", argv, false, false, true, true,
+ true, false, NULL);
+ java_present = (exitstatus == 0);
+ java_tested = true;
+ }
+
+ if (java_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's classes.zip,
+ but we don't know its location. (In JDK 1.3.0 it would work.) */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "java";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("java", "java", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+ {
+ static bool jre_tested;
+ static bool jre_present;
+
+ if (!jre_tested)
+ {
+ /* Test for presence of jre: "jre 2> /dev/null ; test $? = 1" */
+ char *argv[2];
+ int exitstatus;
+
+ argv[0] = "jre";
+ argv[1] = NULL;
+ exitstatus = execute ("jre", "jre", argv, false, false, true, true,
+ true, false, NULL);
+ jre_present = (exitstatus == 0 || exitstatus == 1);
+ jre_tested = true;
+ }
+
+ if (jre_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. We don't use the "-classpath ..." option because
+ in JDK 1.1.x its argument should also contain the JDK's classes.zip,
+ but we don't know its location. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "jre";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("jre", "jre", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+ /* Win32, Cygwin */
+ {
+ static bool jview_tested;
+ static bool jview_present;
+
+ if (!jview_tested)
+ {
+ /* Test for presence of jview: "jview -? >nul ; test $? = 1" */
+ char *argv[3];
+ int exitstatus;
+
+ argv[0] = "jview";
+ argv[1] = "-?";
+ argv[2] = NULL;
+ exitstatus = execute ("jview", "jview", argv, false, false, true, true,
+ true, false, NULL);
+ jview_present = (exitstatus == 0 || exitstatus == 1);
+ jview_tested = true;
+ }
+
+ if (jview_present)
+ {
+ char *old_classpath;
+ char **argv = (char **) xmalloca ((2 + nargs + 1) * sizeof (char *));
+ unsigned int i;
+
+ /* Set CLASSPATH. */
+ old_classpath =
+ set_classpath (classpaths, classpaths_count, use_minimal_classpath,
+ verbose);
+
+ argv[0] = "jview";
+ argv[1] = (char *) class_name;
+ for (i = 0; i <= nargs; i++)
+ argv[2 + i] = (char *) args[i];
+
+ if (verbose)
+ {
+ char *command = shell_quote_argv (argv);
+ printf ("%s\n", command);
+ free (command);
+ }
+
+ err = executer ("jview", "jview", argv, private_data);
+
+ /* Reset CLASSPATH. */
+ reset_classpath (old_classpath);
+
+ freea (argv);
+
+ goto done2;
+ }
+ }
+#endif
+
+ if (!quiet)
+ error (0, 0, _("Java virtual machine not found, try installing gij or set $JAVA"));
+ err = true;
+
+ done2:
+ if (old_JAVA_HOME != NULL)
+ {
+ xsetenv ("JAVA_HOME", old_JAVA_HOME, 1);
+ free (old_JAVA_HOME);
+ }
+
+ done1:
+ return err;
+}
diff --git a/gnulib/lib/javaexec.h b/gnulib/lib/javaexec.h
new file mode 100644
index 0000000..120d590
--- /dev/null
+++ b/gnulib/lib/javaexec.h
@@ -0,0 +1,50 @@
+/* Execute a Java program.
+ Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _JAVAEXEC_H
+#define _JAVAEXEC_H
+
+#include <stdbool.h>
+
+typedef bool execute_fn (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data);
+
+/* Execute a Java class.
+ class_name is the Java class name to be executed.
+ classpaths is a list of pathnames to be prepended to the CLASSPATH.
+ use_minimal_classpath = true means to ignore the user's CLASSPATH and
+ use a minimal one. This is likely to reduce possible problems if the
+ user's CLASSPATH contains garbage or a classes.zip file of the wrong
+ Java version.
+ exe_dir is a directory that may contain a native executable for the class.
+ args is a NULL terminated list of arguments to be passed to the program.
+ If verbose, the command to be executed will be printed.
+ Then the command is passed to the execute function together with the
+ private_data argument. This function returns false if OK, true on error.
+ Return false if OK, true on error.
+ If quiet, error messages will not be printed. */
+extern bool execute_java_class (const char *class_name,
+ const char * const *classpaths,
+ unsigned int classpaths_count,
+ bool use_minimal_classpath,
+ const char *exe_dir,
+ const char * const *args,
+ bool verbose, bool quiet,
+ execute_fn *executer, void *private_data);
+
+#endif /* _JAVAEXEC_H */
diff --git a/gnulib/lib/javaversion.c b/gnulib/lib/javaversion.c
new file mode 100644
index 0000000..3346187
--- /dev/null
+++ b/gnulib/lib/javaversion.c
@@ -0,0 +1,119 @@
+/* Determine the Java version supported by javaexec.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "javaversion.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+#include "javaexec.h"
+#include "spawn-pipe.h"
+#include "wait-process.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* Get PKGDATADIR. */
+#include "configmake.h"
+
+
+struct locals
+{
+ /* OUT */
+ char *line;
+};
+
+static bool
+execute_and_read_line (const char *progname,
+ const char *prog_path, char **prog_argv,
+ void *private_data)
+{
+ struct locals *l = (struct locals *) private_data;
+ pid_t child;
+ int fd[1];
+ FILE *fp;
+ char *line;
+ size_t linesize;
+ size_t linelen;
+ int exitstatus;
+
+ /* Open a pipe to the JVM. */
+ child = create_pipe_in (progname, prog_path, prog_argv, DEV_NULL, false,
+ true, false, fd);
+
+ if (child == -1)
+ return false;
+
+ /* Retrieve its result. */
+ fp = fdopen (fd[0], "r");
+ if (fp == NULL)
+ {
+ error (0, errno, _("fdopen() failed"));
+ return false;
+ }
+
+ line = NULL; linesize = 0;
+ linelen = getline (&line, &linesize, fp);
+ if (linelen == (size_t)(-1))
+ {
+ error (0, 0, _("%s subprocess I/O error"), progname);
+ return false;
+ }
+ if (linelen > 0 && line[linelen - 1] == '\n')
+ line[linelen - 1] = '\0';
+
+ fclose (fp);
+
+ /* Remove zombie process from process list, and retrieve exit status. */
+ exitstatus =
+ wait_subprocess (child, progname, true, false, true, false, NULL);
+ if (exitstatus != 0)
+ {
+ free (line);
+ return false;
+ }
+
+ l->line = line;
+ return false;
+}
+
+char *
+javaexec_version (void)
+{
+ const char *class_name = "javaversion";
+ const char *pkgdatadir = relocate (PKGDATADIR);
+ const char *args[1];
+ struct locals locals;
+
+ args[0] = NULL;
+ locals.line = NULL;
+ execute_java_class (class_name, &pkgdatadir, 1, true, NULL, args,
+ false, false, execute_and_read_line, &locals);
+
+ return locals.line;
+}
diff --git a/gnulib/lib/javaversion.class b/gnulib/lib/javaversion.class
new file mode 100644
index 0000000..d62585b
--- /dev/null
+++ b/gnulib/lib/javaversion.class
Binary files differ
diff --git a/gnulib/lib/javaversion.h b/gnulib/lib/javaversion.h
new file mode 100644
index 0000000..ef330ba
--- /dev/null
+++ b/gnulib/lib/javaversion.h
@@ -0,0 +1,39 @@
+/* Determine the Java version supported by javaexec.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _JAVAVERSION_H
+#define _JAVAVERSION_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return information about the Java version used by execute_java_class().
+ This is the value of System.getProperty("java.specification.version").
+ Some possible values are: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6. Return NULL if
+ the Java version cannot be determined. */
+extern char * javaexec_version (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _JAVAVERSION_H */
diff --git a/gnulib/lib/javaversion.java b/gnulib/lib/javaversion.java
new file mode 100644
index 0000000..a8c83d0
--- /dev/null
+++ b/gnulib/lib/javaversion.java
@@ -0,0 +1,31 @@
+/* Show the Java version.
+ * Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * This program shows the Java version.
+ *
+ * This program _must_ be compiled with
+ * javac -d . -target 1.1 javaversion.java
+ * since its purpose is to show the version of _any_ Java implementation.
+ *
+ * @author Bruno Haible
+ */
+public class javaversion {
+ public static void main (String[] args) {
+ System.out.println(System.getProperty("java.specification.version"));
+ }
+}
diff --git a/gnulib/lib/langinfo.in.h b/gnulib/lib/langinfo.in.h
new file mode 100644
index 0000000..b6588a3
--- /dev/null
+++ b/gnulib/lib/langinfo.in.h
@@ -0,0 +1,177 @@
+/* Substitute for and wrapper around <langinfo.h>.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * POSIX <langinfo.h> for platforms that lack it or have an incomplete one.
+ * <http://www.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_LANGINFO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_LANGINFO_H@
+# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_LANGINFO_H
+#define _@GUARD_PREFIX@_LANGINFO_H
+
+
+#if !@HAVE_LANGINFO_H@
+
+/* A platform that lacks <langinfo.h>. */
+
+/* Assume that it also lacks <nl_types.h> and the nl_item type. */
+# if !GNULIB_defined_nl_item
+typedef int nl_item;
+# define GNULIB_defined_nl_item 1
+# endif
+
+/* nl_langinfo items of the LC_CTYPE category */
+# define CODESET 10000
+/* nl_langinfo items of the LC_NUMERIC category */
+# define RADIXCHAR 10001
+# define THOUSEP 10002
+/* nl_langinfo items of the LC_TIME category */
+# define D_T_FMT 10003
+# define D_FMT 10004
+# define T_FMT 10005
+# define T_FMT_AMPM 10006
+# define AM_STR 10007
+# define PM_STR 10008
+# define DAY_1 10009
+# define DAY_2 (DAY_1 + 1)
+# define DAY_3 (DAY_1 + 2)
+# define DAY_4 (DAY_1 + 3)
+# define DAY_5 (DAY_1 + 4)
+# define DAY_6 (DAY_1 + 5)
+# define DAY_7 (DAY_1 + 6)
+# define ABDAY_1 10016
+# define ABDAY_2 (ABDAY_1 + 1)
+# define ABDAY_3 (ABDAY_1 + 2)
+# define ABDAY_4 (ABDAY_1 + 3)
+# define ABDAY_5 (ABDAY_1 + 4)
+# define ABDAY_6 (ABDAY_1 + 5)
+# define ABDAY_7 (ABDAY_1 + 6)
+# define MON_1 10023
+# define MON_2 (MON_1 + 1)
+# define MON_3 (MON_1 + 2)
+# define MON_4 (MON_1 + 3)
+# define MON_5 (MON_1 + 4)
+# define MON_6 (MON_1 + 5)
+# define MON_7 (MON_1 + 6)
+# define MON_8 (MON_1 + 7)
+# define MON_9 (MON_1 + 8)
+# define MON_10 (MON_1 + 9)
+# define MON_11 (MON_1 + 10)
+# define MON_12 (MON_1 + 11)
+# define ABMON_1 10035
+# define ABMON_2 (ABMON_1 + 1)
+# define ABMON_3 (ABMON_1 + 2)
+# define ABMON_4 (ABMON_1 + 3)
+# define ABMON_5 (ABMON_1 + 4)
+# define ABMON_6 (ABMON_1 + 5)
+# define ABMON_7 (ABMON_1 + 6)
+# define ABMON_8 (ABMON_1 + 7)
+# define ABMON_9 (ABMON_1 + 8)
+# define ABMON_10 (ABMON_1 + 9)
+# define ABMON_11 (ABMON_1 + 10)
+# define ABMON_12 (ABMON_1 + 11)
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+/* nl_langinfo items of the LC_MONETARY category */
+# define CRNCYSTR 10052
+/* nl_langinfo items of the LC_MESSAGES category */
+# define YESEXPR 10053
+# define NOEXPR 10054
+
+#else
+
+/* A platform that has <langinfo.h>. */
+
+# if !@HAVE_LANGINFO_CODESET@
+# define CODESET 10000
+# define GNULIB_defined_CODESET 1
+# endif
+
+# if !@HAVE_LANGINFO_T_FMT_AMPM@
+# define T_FMT_AMPM 10006
+# define GNULIB_defined_T_FMT_AMPM 1
+# endif
+
+# if !@HAVE_LANGINFO_ERA@
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+# define GNULIB_defined_ERA 1
+# endif
+
+# if !@HAVE_LANGINFO_YESEXPR@
+# define YESEXPR 10053
+# define NOEXPR 10054
+# define GNULIB_defined_YESEXPR 1
+# endif
+
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Declare overridden functions. */
+
+
+/* Return a piece of locale dependent information.
+ Note: The difference between nl_langinfo (CODESET) and locale_charset ()
+ is that the latter normalizes the encoding names to GNU conventions. */
+
+#if @GNULIB_NL_LANGINFO@
+# if @REPLACE_NL_LANGINFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef nl_langinfo
+# define nl_langinfo rpl_nl_langinfo
+# endif
+_GL_FUNCDECL_RPL (nl_langinfo, char *, (nl_item item));
+_GL_CXXALIAS_RPL (nl_langinfo, char *, (nl_item item));
+# else
+# if !@HAVE_NL_LANGINFO@
+_GL_FUNCDECL_SYS (nl_langinfo, char *, (nl_item item));
+# endif
+_GL_CXXALIAS_SYS (nl_langinfo, char *, (nl_item item));
+# endif
+_GL_CXXALIASWARN (nl_langinfo);
+#elif defined GNULIB_POSIXCHECK
+# undef nl_langinfo
+# if HAVE_RAW_DECL_NL_LANGINFO
+_GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - "
+ "use gnulib module nl_langinfo for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_LANGINFO_H */
+#endif /* _@GUARD_PREFIX@_LANGINFO_H */
diff --git a/gnulib/lib/lchown.c b/gnulib/lib/lchown.c
new file mode 100644
index 0000000..406b9c1
--- /dev/null
+++ b/gnulib/lib/lchown.c
@@ -0,0 +1,117 @@
+/* Provide a stub lchown function for systems that lack it.
+
+ Copyright (C) 1998-1999, 2002, 2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_LCHOWN
+
+/* If the system chown does not follow symlinks, we don't want it
+ replaced by gnulib's chown, which does follow symlinks. */
+# if CHOWN_MODIFIES_SYMLINK
+# undef chown
+# endif
+
+/* Work just like chown, except when FILE is a symbolic link.
+ In that case, set errno to EOPNOTSUPP and return -1.
+ But if autoconf tests determined that chown modifies
+ symlinks, then just call chown. */
+
+int
+lchown (const char *file, uid_t uid, gid_t gid)
+{
+# if HAVE_CHOWN
+# if ! CHOWN_MODIFIES_SYMLINK
+ struct stat stats;
+
+ if (lstat (file, &stats) == 0 && S_ISLNK (stats.st_mode))
+ {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+# endif
+
+ return chown (file, uid, gid);
+
+# else /* !HAVE_CHOWN */
+ errno = ENOSYS;
+ return -1;
+# endif
+}
+
+#else /* HAVE_LCHOWN */
+
+# undef lchown
+
+/* Work around trailing slash bugs in lchown. */
+int
+rpl_lchown (const char *file, uid_t uid, gid_t gid)
+{
+ bool stat_valid = false;
+ int result;
+
+# if CHOWN_CHANGE_TIME_BUG
+ struct stat st;
+
+ if (gid != (gid_t) -1 || uid != (uid_t) -1)
+ {
+ if (lstat (file, &st))
+ return -1;
+ stat_valid = true;
+ if (!S_ISLNK (st.st_mode))
+ return chown (file, uid, gid);
+ }
+# endif
+
+# if CHOWN_TRAILING_SLASH_BUG
+ if (!stat_valid)
+ {
+ size_t len = strlen (file);
+ if (len && file[len - 1] == '/')
+ return chown (file, uid, gid);
+ }
+# endif
+
+ result = lchown (file, uid, gid);
+
+# if CHOWN_CHANGE_TIME_BUG && HAVE_LCHMOD
+ if (result == 0 && stat_valid
+ && (uid == st.st_uid || uid == (uid_t) -1)
+ && (gid == st.st_gid || gid == (gid_t) -1))
+ {
+ /* No change in ownership, but at least one argument was not -1,
+ so we are required to update ctime. Since lchown succeeded,
+ we assume that lchmod will do likewise. But if the system
+ lacks lchmod and lutimes, we are out of luck. Oh well. */
+ result = lchmod (file, st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO
+ | S_ISUID | S_ISGID | S_ISVTX));
+ }
+# endif
+
+ return result;
+}
+
+#endif /* HAVE_LCHOWN */
diff --git a/gnulib/lib/ldexpf.c b/gnulib/lib/ldexpf.c
new file mode 100644
index 0000000..0460d1a
--- /dev/null
+++ b/gnulib/lib/ldexpf.c
@@ -0,0 +1,31 @@
+/* Multiply a 'float' by a power of 2.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() function. */
+#undef exp
+#define exp exponent
+
+float
+ldexpf (float x, int exp)
+{
+ return (float) ldexp ((double) x, exp);
+}
diff --git a/gnulib/lib/ldexpl.c b/gnulib/lib/ldexpl.c
new file mode 100644
index 0000000..7fb3a7d
--- /dev/null
+++ b/gnulib/lib/ldexpl.c
@@ -0,0 +1,89 @@
+/* Emulation for ldexpl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002-2003, 2007-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+ldexpl (long double x, int exp)
+{
+ return ldexp (x, exp);
+}
+
+#else
+
+# include <float.h>
+# include "fpucw.h"
+
+long double
+ldexpl (long double x, int exp)
+{
+ long double factor;
+ int bit;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ /* Check for zero, nan and infinity. */
+ if (!(isnanl (x) || x + x == x))
+ {
+ if (exp < 0)
+ {
+ exp = -exp;
+ factor = 0.5L;
+ }
+ else
+ factor = 2.0L;
+
+ if (exp > 0)
+ for (bit = 1;;)
+ {
+ /* Invariant: Here bit = 2^i, factor = 2^-2^i or = 2^2^i,
+ and bit <= exp. */
+ if (exp & bit)
+ x *= factor;
+ bit <<= 1;
+ if (bit > exp)
+ break;
+ factor = factor * factor;
+ }
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+
+ return x;
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ long double x;
+ int y;
+ for (y = 0; y < 29; y++)
+ printf ("%5d %.16Lg %.16Lg\n", y, ldexpl (0.8L, y), ldexpl (0.8L, -y) * ldexpl (0.8L, y));
+}
+#endif
diff --git a/gnulib/lib/ldtoastr.c b/gnulib/lib/ldtoastr.c
new file mode 100644
index 0000000..bf54a35
--- /dev/null
+++ b/gnulib/lib/ldtoastr.c
@@ -0,0 +1,2 @@
+#define LENGTH 3
+#include "ftoastr.c"
diff --git a/gnulib/lib/libunistring.valgrind b/gnulib/lib/libunistring.valgrind
new file mode 100644
index 0000000..aba265a
--- /dev/null
+++ b/gnulib/lib/libunistring.valgrind
@@ -0,0 +1,9 @@
+# Suppress valgrind messages in an installed libunistring.
+
+# Suppress a valgrind message about use of uninitialized memory in freea().
+# This use is OK because it provides only a speedup.
+{
+ libunistring_freea
+ Memcheck:Cond
+ fun:libunistring_freea
+}
diff --git a/gnulib/lib/linebuffer.c b/gnulib/lib/linebuffer.c
new file mode 100644
index 0000000..f15c1c2
--- /dev/null
+++ b/gnulib/lib/linebuffer.c
@@ -0,0 +1,103 @@
+/* linebuffer.c -- read arbitrarily long lines
+
+ Copyright (C) 1986, 1991, 1998-1999, 2001, 2003-2004, 2006-2007, 2009-2011
+ Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Richard Stallman. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include "linebuffer.h"
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Initialize linebuffer LINEBUFFER for use. */
+
+void
+initbuffer (struct linebuffer *linebuffer)
+{
+ memset (linebuffer, 0, sizeof *linebuffer);
+}
+
+struct linebuffer *
+readlinebuffer (struct linebuffer *linebuffer, FILE *stream)
+{
+ return readlinebuffer_delim (linebuffer, stream, '\n');
+}
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Consider lines to be terminated by DELIMITER.
+ Keep the delimiter; append DELIMITER if it's the last line of a file
+ that ends in a character other than DELIMITER. Do not NUL-terminate.
+ Therefore the stream can contain NUL bytes, and the length
+ (including the delimiter) is returned in linebuffer->length.
+ Return NULL when stream is empty. Return NULL and set errno upon
+ error; callers can distinguish this case from the empty case by
+ invoking ferror (stream).
+ Otherwise, return LINEBUFFER. */
+struct linebuffer *
+readlinebuffer_delim (struct linebuffer *linebuffer, FILE *stream,
+ char delimiter)
+{
+ int c;
+ char *buffer = linebuffer->buffer;
+ char *p = linebuffer->buffer;
+ char *end = buffer + linebuffer->size; /* Sentinel. */
+
+ if (feof (stream))
+ return NULL;
+
+ do
+ {
+ c = getc (stream);
+ if (c == EOF)
+ {
+ if (p == buffer || ferror (stream))
+ return NULL;
+ if (p[-1] == delimiter)
+ break;
+ c = delimiter;
+ }
+ if (p == end)
+ {
+ size_t oldsize = linebuffer->size;
+ buffer = x2realloc (buffer, &linebuffer->size);
+ p = buffer + oldsize;
+ linebuffer->buffer = buffer;
+ end = buffer + linebuffer->size;
+ }
+ *p++ = c;
+ }
+ while (c != delimiter);
+
+ linebuffer->length = p - buffer;
+ return linebuffer;
+}
+
+/* Free the buffer that was allocated for linebuffer LINEBUFFER. */
+
+void
+freebuffer (struct linebuffer *linebuffer)
+{
+ free (linebuffer->buffer);
+}
diff --git a/gnulib/lib/linebuffer.h b/gnulib/lib/linebuffer.h
new file mode 100644
index 0000000..4050fb0
--- /dev/null
+++ b/gnulib/lib/linebuffer.h
@@ -0,0 +1,53 @@
+/* linebuffer.h -- declarations for reading arbitrarily long lines
+
+ Copyright (C) 1986, 1991, 1998-1999, 2002-2003, 2007, 2009-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !defined LINEBUFFER_H
+# define LINEBUFFER_H
+
+# include <stdio.h>
+
+/* A `struct linebuffer' holds a line of text. */
+
+struct linebuffer
+{
+ size_t size; /* Allocated. */
+ size_t length; /* Used. */
+ char *buffer;
+};
+
+/* Initialize linebuffer LINEBUFFER for use. */
+void initbuffer (struct linebuffer *linebuffer);
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Consider lines to be terminated by DELIMITER.
+ Keep the delimiter; append DELIMITER if we reach EOF and it wasn't
+ the last character in the file. Do not NUL-terminate.
+ Return LINEBUFFER, except at end of file return NULL. */
+struct linebuffer *readlinebuffer_delim (struct linebuffer *linebuffer,
+ FILE *stream, char delimiter);
+
+/* Read an arbitrarily long line of text from STREAM into LINEBUFFER.
+ Keep the newline; append a newline if it's the last line of a file
+ that ends in a non-newline character. Do not NUL-terminate.
+ Return LINEBUFFER, except at end of file return NULL. */
+struct linebuffer *readlinebuffer (struct linebuffer *linebuffer, FILE *stream);
+
+/* Free linebuffer LINEBUFFER and its data, all allocated with malloc. */
+void freebuffer (struct linebuffer *);
+
+#endif /* LINEBUFFER_H */
diff --git a/gnulib/lib/link.c b/gnulib/lib/link.c
new file mode 100644
index 0000000..b58eb25
--- /dev/null
+++ b/gnulib/lib/link.c
@@ -0,0 +1,212 @@
+/* Emulate link on platforms that lack it, namely native Windows platforms.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_LINK
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* CreateHardLink was introduced only in Windows 2000. */
+typedef BOOL (WINAPI * CreateHardLinkFuncType) (LPCTSTR lpFileName,
+ LPCTSTR lpExistingFileName,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+static CreateHardLinkFuncType CreateHardLinkFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE kernel32 = GetModuleHandle ("kernel32.dll");
+ if (kernel32 != NULL)
+ {
+ CreateHardLinkFunc =
+ (CreateHardLinkFuncType) GetProcAddress (kernel32, "CreateHardLinkA");
+ }
+ initialized = TRUE;
+}
+
+int
+link (const char *file1, const char *file2)
+{
+ char *dir;
+ size_t len1 = strlen (file1);
+ size_t len2 = strlen (file2);
+ if (!initialized)
+ initialize ();
+ if (CreateHardLinkFunc == NULL)
+ {
+ /* System does not support hard links. */
+ errno = EPERM;
+ return -1;
+ }
+ /* Reject trailing slashes on non-directories; mingw does not
+ support hard-linking directories. */
+ if ((len1 && (file1[len1 - 1] == '/' || file1[len1 - 1] == '\\'))
+ || (len2 && (file2[len2 - 1] == '/' || file2[len2 - 1] == '\\')))
+ {
+ struct stat st;
+ if (stat (file1, &st) == 0 && S_ISDIR (st.st_mode))
+ errno = EPERM;
+ else
+ errno = ENOTDIR;
+ return -1;
+ }
+ /* CreateHardLink("b/.","a",NULL) creates file "b", so we must check
+ that dirname(file2) exists. */
+ dir = strdup (file2);
+ if (!dir)
+ return -1;
+ {
+ struct stat st;
+ char *p = strchr (dir, '\0');
+ while (dir < p && (*--p != '/' && *p != '\\'));
+ *p = '\0';
+ if (p != dir && stat (dir, &st) == -1)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ free (dir);
+ }
+ /* Now create the link. */
+ if (CreateHardLinkFunc (file2, file1, NULL) == 0)
+ {
+ /* It is not documented which errors CreateHardLink() can produce.
+ * The following conversions are based on tests on a Windows XP SP2
+ * system. */
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ case ERROR_ACCESS_DENIED:
+ errno = EACCES;
+ break;
+
+ case ERROR_INVALID_FUNCTION: /* fs does not support hard links */
+ errno = EPERM;
+ break;
+
+ case ERROR_NOT_SAME_DEVICE:
+ errno = EXDEV;
+ break;
+
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
+ errno = ENOENT;
+ break;
+
+ case ERROR_INVALID_PARAMETER:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_TOO_MANY_LINKS:
+ errno = EMLINK;
+ break;
+
+ case ERROR_ALREADY_EXISTS:
+ errno = EEXIST;
+ break;
+
+ default:
+ errno = EIO;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+# else /* !Windows */
+
+# error "This platform lacks a link function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+# endif /* !Windows */
+#else /* HAVE_LINK */
+
+# undef link
+
+/* Create a hard link from FILE1 to FILE2, working around platform bugs. */
+int
+rpl_link (char const *file1, char const *file2)
+{
+ size_t len1;
+ size_t len2;
+ struct stat st;
+
+ /* Don't allow IRIX to dereference dangling file2 symlink. */
+ if (!lstat (file2, &st))
+ {
+ errno = EEXIST;
+ return -1;
+ }
+
+ /* Reject trailing slashes on non-directories. */
+ len1 = strlen (file1);
+ len2 = strlen (file2);
+ if ((len1 && file1[len1 - 1] == '/')
+ || (len2 && file2[len2 - 1] == '/'))
+ {
+ /* Let link() decide whether hard-linking directories is legal.
+ If stat() fails, then link() should fail for the same reason
+ (although on Solaris 9, link("file/","oops") mistakenly
+ succeeds); if stat() succeeds, require a directory. */
+ if (stat (file1, &st))
+ return -1;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ else
+ {
+ /* Fix Cygwin 1.5.x bug where link("a","b/.") creates file "b". */
+ char *dir = strdup (file2);
+ char *p;
+ if (!dir)
+ return -1;
+ /* We already know file2 does not end in slash. Strip off the
+ basename, then check that the dirname exists. */
+ p = strrchr (dir, '/');
+ if (p)
+ {
+ *p = '\0';
+ if (stat (dir, &st) == -1)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ free (dir);
+ }
+ return link (file1, file2);
+}
+#endif /* HAVE_LINK */
diff --git a/gnulib/lib/linkat.c b/gnulib/lib/linkat.c
new file mode 100644
index 0000000..7b6d0dd
--- /dev/null
+++ b/gnulib/lib/linkat.c
@@ -0,0 +1,343 @@
+/* Create a hard link relative to open directories.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "areadlink.h"
+#include "dirname.h"
+#include "filenamecat.h"
+#include "openat-priv.h"
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifndef MAXSYMLINKS
+# ifdef SYMLOOP_MAX
+# define MAXSYMLINKS SYMLOOP_MAX
+# else
+# define MAXSYMLINKS 20
+# endif
+#endif
+
+#if !HAVE_LINKAT
+
+/* Create a link. If FILE1 is a symlink, either create a hardlink to
+ that symlink, or fake it by creating an identical symlink. */
+# if LINK_FOLLOWS_SYMLINKS == 0
+# define link_immediate link
+# else
+static int
+link_immediate (char const *file1, char const *file2)
+{
+ char *target = areadlink (file1);
+ if (target)
+ {
+ /* A symlink cannot be modified in-place. Therefore, creating
+ an identical symlink behaves like a hard link to a symlink,
+ except for incorrect st_ino and st_nlink. However, we must
+ be careful of EXDEV. */
+ struct stat st1;
+ struct stat st2;
+ char *dir = mdir_name (file2);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (lstat (file1, &st1) == 0 && stat (dir, &st2) == 0)
+ {
+ if (st1.st_dev == st2.st_dev)
+ {
+ int result = symlink (target, file2);
+ int saved_errno = errno;
+ free (target);
+ free (dir);
+ errno = saved_errno;
+ return result;
+ }
+ free (target);
+ free (dir);
+ errno = EXDEV;
+ return -1;
+ }
+ free (target);
+ free (dir);
+ }
+ if (errno == ENOMEM)
+ return -1;
+ return link (file1, file2);
+}
+# endif /* LINK_FOLLOWS_SYMLINKS == 0 */
+
+/* Create a link. If FILE1 is a symlink, create a hardlink to the
+ canonicalized file. */
+# if 0 < LINK_FOLLOWS_SYMLINKS
+# define link_follow link
+# else
+static int
+link_follow (char const *file1, char const *file2)
+{
+ char *name = (char *) file1;
+ char *target;
+ int result;
+ int i = MAXSYMLINKS;
+
+ /* Using realpath or canonicalize_file_name is too heavy-handed: we
+ don't need an absolute name, and we don't need to resolve
+ intermediate symlinks, just the basename of each iteration. */
+ while (i-- && (target = areadlink (name)))
+ {
+ if (IS_ABSOLUTE_FILE_NAME (target))
+ {
+ if (name != file1)
+ free (name);
+ name = target;
+ }
+ else
+ {
+ char *dir = mdir_name (name);
+ if (name != file1)
+ free (name);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ name = mfile_name_concat (dir, target, NULL);
+ free (dir);
+ free (target);
+ if (!name)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ }
+ if (i < 0)
+ {
+ target = NULL;
+ errno = ELOOP;
+ }
+ if (!target && errno != EINVAL)
+ {
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ result = link (name, file2);
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return result;
+}
+# endif /* 0 < LINK_FOLLOWS_SYMLINKS */
+
+/* On Solaris, link() doesn't follow symlinks by default, but does so as soon
+ as a library or executable takes part in the program that has been compiled
+ with "c99" or "cc -xc99=all" or "cc ... /usr/lib/values-xpg4.o ...". */
+# if LINK_FOLLOWS_SYMLINKS == -1
+
+/* Reduce the penalty of link_immediate and link_follow by incorporating the
+ knowledge that link()'s behaviour depends on the __xpg4 variable. */
+extern int __xpg4;
+
+static int
+solaris_optimized_link_immediate (char const *file1, char const *file2)
+{
+ if (__xpg4 == 0)
+ return link (file1, file2);
+ return link_immediate (file1, file2);
+}
+
+static int
+solaris_optimized_link_follow (char const *file1, char const *file2)
+{
+ if (__xpg4 != 0)
+ return link (file1, file2);
+ return link_follow (file1, file2);
+}
+
+# define link_immediate solaris_optimized_link_immediate
+# define link_follow solaris_optimized_link_follow
+
+# endif
+
+/* Create a link to FILE1, in the directory open on descriptor FD1, to FILE2,
+ in the directory open on descriptor FD2. If FILE1 is a symlink, FLAG
+ controls whether to dereference FILE1 first. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then rename/restore_cwd. If either the save_cwd or
+ the restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+int
+linkat (int fd1, char const *file1, int fd2, char const *file2, int flag)
+{
+ if (flag & ~AT_SYMLINK_FOLLOW)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return at_func2 (fd1, file1, fd2, file2,
+ flag ? link_follow : link_immediate);
+}
+
+#else /* HAVE_LINKAT */
+
+# undef linkat
+
+/* Create a link. If FILE1 is a symlink, create a hardlink to the
+ canonicalized file. */
+
+static int
+linkat_follow (int fd1, char const *file1, int fd2, char const *file2)
+{
+ char *name = (char *) file1;
+ char *target;
+ int result;
+ int i = MAXSYMLINKS;
+
+ /* There is no realpathat. */
+ while (i-- && (target = areadlinkat (fd1, name)))
+ {
+ if (IS_ABSOLUTE_FILE_NAME (target))
+ {
+ if (name != file1)
+ free (name);
+ name = target;
+ }
+ else
+ {
+ char *dir = mdir_name (name);
+ if (name != file1)
+ free (name);
+ if (!dir)
+ {
+ free (target);
+ errno = ENOMEM;
+ return -1;
+ }
+ name = mfile_name_concat (dir, target, NULL);
+ free (dir);
+ free (target);
+ if (!name)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ }
+ if (i < 0)
+ {
+ target = NULL;
+ errno = ELOOP;
+ }
+ if (!target && errno != EINVAL)
+ {
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ result = linkat (fd1, name, fd2, file2, 0);
+ if (name != file1)
+ {
+ int saved_errno = errno;
+ free (name);
+ errno = saved_errno;
+ }
+ return result;
+}
+
+
+/* Like linkat, but guarantee that AT_SYMLINK_FOLLOW works even on
+ older Linux kernels. */
+
+int
+rpl_linkat (int fd1, char const *file1, int fd2, char const *file2, int flag)
+{
+ if (flag & ~AT_SYMLINK_FOLLOW)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+# if LINKAT_TRAILING_SLASH_BUG
+ /* Reject trailing slashes on non-directories. */
+ {
+ size_t len1 = strlen (file1);
+ size_t len2 = strlen (file2);
+ if ((len1 && file1[len1 - 1] == '/')
+ || (len2 && file2[len2 - 1] == '/'))
+ {
+ /* Let linkat() decide whether hard-linking directories is legal.
+ If fstatat() fails, then linkat() should fail for the same reason;
+ if fstatat() succeeds, require a directory. */
+ struct stat st;
+ if (fstatat (fd1, file1, &st, flag ? 0 : AT_SYMLINK_NOFOLLOW))
+ return -1;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+# endif
+
+ if (!flag)
+ return linkat (fd1, file1, fd2, file2, flag);
+
+ /* Cache the information on whether the system call really works. */
+ {
+ static int have_follow_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (0 <= have_follow_really)
+ {
+ int result = linkat (fd1, file1, fd2, file2, flag);
+ if (!(result == -1 && errno == EINVAL))
+ {
+ have_follow_really = 1;
+ return result;
+ }
+ have_follow_really = -1;
+ }
+ }
+ return linkat_follow (fd1, file1, fd2, file2);
+}
+
+#endif /* HAVE_LINKAT */
diff --git a/gnulib/lib/listen.c b/gnulib/lib/listen.c
new file mode 100644
index 0000000..b7d070e
--- /dev/null
+++ b/gnulib/lib/listen.c
@@ -0,0 +1,49 @@
+/* listen.c --- wrappers for Windows listen function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef listen
+
+int
+rpl_listen (int fd, int backlog)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = listen (sock, backlog);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/localcharset.c b/gnulib/lib/localcharset.c
new file mode 100644
index 0000000..38e36ef
--- /dev/null
+++ b/gnulib/lib/localcharset.c
@@ -0,0 +1,547 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
+# define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# ifndef OS2
+# define OS2
+# endif
+#endif
+
+#if !defined WIN32_NATIVE
+# include <unistd.h>
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* Get LIBDIR. */
+#ifndef LIBDIR
+# include "configmake.h"
+#endif
+
+/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+ possible multithread problem in the function get_charset_aliases. If we
+ are running in a threaded environment, and if two threads initialize
+ 'charset_aliases' simultaneously, both will produce the same value,
+ and everything will be ok if the two assignments to 'charset_aliases'
+ are atomic. But I don't know what will happen if the two assignments mix. */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+ read, else NULL. Its format is:
+ ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file. */
+static const char *
+get_charset_aliases (void)
+{
+ const char *cp;
+
+ cp = charset_aliases;
+ if (cp == NULL)
+ {
+#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+ const char *dir;
+ const char *base = "charset.alias";
+ char *file_name;
+
+ /* Make it possible to override the charset.alias location. This is
+ necessary for running the testsuite before "make install". */
+ dir = getenv ("CHARSETALIASDIR");
+ if (dir == NULL || dir[0] == '\0')
+ dir = relocate (LIBDIR);
+
+ /* Concatenate dir and base into freshly allocated file_name. */
+ {
+ size_t dir_len = strlen (dir);
+ size_t base_len = strlen (base);
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+ if (file_name != NULL)
+ {
+ memcpy (file_name, dir, dir_len);
+ if (add_slash)
+ file_name[dir_len] = DIRECTORY_SEPARATOR;
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+ }
+ }
+
+ if (file_name == NULL)
+ /* Out of memory. Treat the file as empty. */
+ cp = "";
+ else
+ {
+ int fd;
+
+ /* Open the file. Reject symbolic links on platforms that support
+ O_NOFOLLOW. This is a security feature. Without it, an attacker
+ could retrieve parts of the contents (namely, the tail of the
+ first line that starts with "* ") of an arbitrary file by placing
+ a symbolic link to that file under the name "charset.alias" in
+ some writable directory and defining the environment variable
+ CHARSETALIASDIR to point to that directory. */
+ fd = open (file_name,
+ O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0));
+ if (fd < 0)
+ /* File not found. Treat it as empty. */
+ cp = "";
+ else
+ {
+ FILE *fp;
+
+ fp = fdopen (fd, "r");
+ if (fp == NULL)
+ {
+ /* Out of memory. Treat the file as empty. */
+ close (fd);
+ cp = "";
+ }
+ else
+ {
+ /* Parse the file's contents. */
+ char *res_ptr = NULL;
+ size_t res_size = 0;
+
+ for (;;)
+ {
+ int c;
+ char buf1[50+1];
+ char buf2[50+1];
+ size_t l1, l2;
+ char *old_res_ptr;
+
+ c = getc (fp);
+ if (c == EOF)
+ break;
+ if (c == '\n' || c == ' ' || c == '\t')
+ continue;
+ if (c == '#')
+ {
+ /* Skip comment, to end of line. */
+ do
+ c = getc (fp);
+ while (!(c == EOF || c == '\n'));
+ if (c == EOF)
+ break;
+ continue;
+ }
+ ungetc (c, fp);
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+ break;
+ l1 = strlen (buf1);
+ l2 = strlen (buf2);
+ old_res_ptr = res_ptr;
+ if (res_size == 0)
+ {
+ res_size = l1 + 1 + l2 + 1;
+ res_ptr = (char *) malloc (res_size + 1);
+ }
+ else
+ {
+ res_size += l1 + 1 + l2 + 1;
+ res_ptr = (char *) realloc (res_ptr, res_size + 1);
+ }
+ if (res_ptr == NULL)
+ {
+ /* Out of memory. */
+ res_size = 0;
+ free (old_res_ptr);
+ break;
+ }
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+ strcpy (res_ptr + res_size - (l2 + 1), buf2);
+ }
+ fclose (fp);
+ if (res_size == 0)
+ cp = "";
+ else
+ {
+ *(res_ptr + res_size) = '\0';
+ cp = res_ptr;
+ }
+ }
+ }
+
+ free (file_name);
+ }
+
+#else
+
+# if defined DARWIN7
+ /* To avoid the trouble of installing a file that is shared by many
+ GNU packages -- many packaging systems have problems with this --,
+ simply inline the aliases here. */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-4" "\0" "ISO-8859-4" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ "ISO8859-13" "\0" "ISO-8859-13" "\0"
+ "ISO8859-15" "\0" "ISO-8859-15" "\0"
+ "KOI8-R" "\0" "KOI8-R" "\0"
+ "KOI8-U" "\0" "KOI8-U" "\0"
+ "CP866" "\0" "CP866" "\0"
+ "CP949" "\0" "CP949" "\0"
+ "CP1131" "\0" "CP1131" "\0"
+ "CP1251" "\0" "CP1251" "\0"
+ "eucCN" "\0" "GB2312" "\0"
+ "GB2312" "\0" "GB2312" "\0"
+ "eucJP" "\0" "EUC-JP" "\0"
+ "eucKR" "\0" "EUC-KR" "\0"
+ "Big5" "\0" "BIG5" "\0"
+ "Big5HKSCS" "\0" "BIG5-HKSCS" "\0"
+ "GBK" "\0" "GBK" "\0"
+ "GB18030" "\0" "GB18030" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "ARMSCII-8" "\0" "ARMSCII-8" "\0"
+ "PT154" "\0" "PT154" "\0"
+ /*"ISCII-DEV" "\0" "?" "\0"*/
+ "*" "\0" "UTF-8" "\0";
+# endif
+
+# if defined VMS
+ /* To avoid the troubles of an extra file charset.alias_vms in the
+ sources of many GNU packages, simply inline the aliases here. */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+ "ISO8859-2" "\0" "ISO-8859-2" "\0"
+ "ISO8859-5" "\0" "ISO-8859-5" "\0"
+ "ISO8859-7" "\0" "ISO-8859-7" "\0"
+ "ISO8859-8" "\0" "ISO-8859-8" "\0"
+ "ISO8859-9" "\0" "ISO-8859-9" "\0"
+ /* Japanese */
+ "eucJP" "\0" "EUC-JP" "\0"
+ "SJIS" "\0" "SHIFT_JIS" "\0"
+ "DECKANJI" "\0" "DEC-KANJI" "\0"
+ "SDECKANJI" "\0" "EUC-JP" "\0"
+ /* Chinese */
+ "eucTW" "\0" "EUC-TW" "\0"
+ "DECHANYU" "\0" "DEC-HANYU" "\0"
+ "DECHANZI" "\0" "GB2312" "\0"
+ /* Korean */
+ "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__
+ /* To avoid the troubles of installing a separate file in the same
+ directory as the DLL and of retrieving the DLL's directory at
+ runtime, simply inline the aliases here. */
+
+ cp = "CP936" "\0" "GBK" "\0"
+ "CP1361" "\0" "JOHAB" "\0"
+ "CP20127" "\0" "ASCII" "\0"
+ "CP20866" "\0" "KOI8-R" "\0"
+ "CP20936" "\0" "GB2312" "\0"
+ "CP21866" "\0" "KOI8-RU" "\0"
+ "CP28591" "\0" "ISO-8859-1" "\0"
+ "CP28592" "\0" "ISO-8859-2" "\0"
+ "CP28593" "\0" "ISO-8859-3" "\0"
+ "CP28594" "\0" "ISO-8859-4" "\0"
+ "CP28595" "\0" "ISO-8859-5" "\0"
+ "CP28596" "\0" "ISO-8859-6" "\0"
+ "CP28597" "\0" "ISO-8859-7" "\0"
+ "CP28598" "\0" "ISO-8859-8" "\0"
+ "CP28599" "\0" "ISO-8859-9" "\0"
+ "CP28605" "\0" "ISO-8859-15" "\0"
+ "CP38598" "\0" "ISO-8859-8" "\0"
+ "CP51932" "\0" "EUC-JP" "\0"
+ "CP51936" "\0" "GB2312" "\0"
+ "CP51949" "\0" "EUC-KR" "\0"
+ "CP51950" "\0" "EUC-TW" "\0"
+ "CP54936" "\0" "GB18030" "\0"
+ "CP65001" "\0" "UTF-8" "\0";
+# endif
+#endif
+
+ charset_aliases = cp;
+ }
+
+ return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+ const char *aliases;
+
+#if !(defined WIN32_NATIVE || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". Return the suffix of the locale name from the
+ environment variables (if present) or the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+
+ /* Woe32 has a function returning the locale's codepage as a number:
+ GetACP(). This encoding is used by Cygwin, unless the user has set
+ the environment variable CYGWIN=codepage:oem (which very few people
+ do).
+ Output directed to console windows needs to be converted (to
+ GetOEMCP() if the console is using a raster font, or to
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+ converting to GetConsoleOutputCP(). This leads to correct results,
+ except when SetConsoleOutputCP has been called and a raster font is
+ in use. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+ }
+# endif
+
+# else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't
+ use setlocale here; it would return "C" when it doesn't support the
+ locale name the user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ }
+
+ /* On some old systems, one used to set locale = "iso8859_1". On others,
+ you set it to "language_COUNTRY.charset". In any case, we resolve it
+ through the charset.alias file. */
+ codeset = locale;
+
+# endif
+
+#elif defined WIN32_NATIVE
+
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number:
+ GetACP().
+ When the output goes to a console window, it needs to be provided in
+ GetOEMCP() encoding if the console is using a raster font, or in
+ GetConsoleOutputCP() encoding if it is using a TrueType font.
+ But in GUI programs and for output sent to files and pipes, GetACP()
+ encoding is the best bet. */
+ sprintf (buf, "CP%u", GetACP ());
+ codeset = buf;
+
+#elif defined OS2
+
+ const char *locale;
+ static char buf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+
+ /* Resolve through the charset.alias file. */
+ codeset = locale;
+ }
+ else
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ sprintf (buf, "CP%u", cp[0]);
+ codeset = buf;
+ }
+ }
+
+#endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+ /* Resolve alias. */
+ for (aliases = get_charset_aliases ();
+ *aliases != '\0';
+ aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+ if (strcmp (codeset, aliases) == 0
+ || (aliases[0] == '*' && aliases[1] == '\0'))
+ {
+ codeset = aliases + strlen (aliases) + 1;
+ break;
+ }
+
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+
+ return codeset;
+}
diff --git a/gnulib/lib/localcharset.h b/gnulib/lib/localcharset.h
new file mode 100644
index 0000000..8907ccd
--- /dev/null
+++ b/gnulib/lib/localcharset.h
@@ -0,0 +1,41 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed in config.charset.
+ The result must not be freed; it is statically allocated.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/gnulib/lib/locale.in.h b/gnulib/lib/locale.in.h
new file mode 100644
index 0000000..79c1490
--- /dev/null
+++ b/gnulib/lib/locale.in.h
@@ -0,0 +1,96 @@
+/* A POSIX <locale.h>.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+#define _@GUARD_PREFIX@_LOCALE_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MacOS X 10.5 defines the locale_t type in <xlocale.h>. */
+#if @HAVE_XLOCALE_H@
+# include <xlocale.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
+ On systems that don't define it, use the same value as GNU libintl. */
+#if !defined LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
+#if @GNULIB_SETLOCALE@
+# if @REPLACE_SETLOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setlocale
+# define setlocale rpl_setlocale
+# define GNULIB_defined_setlocale 1
+# endif
+_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
+_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
+# else
+_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
+# endif
+_GL_CXXALIASWARN (setlocale);
+#elif defined GNULIB_POSIXCHECK
+# undef setlocale
+# if HAVE_RAW_DECL_SETLOCALE
+_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
+ "use gnulib module setlocale for portability");
+# endif
+#endif
+
+#if @GNULIB_DUPLOCALE@
+# if @REPLACE_DUPLOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef duplocale
+# define duplocale rpl_duplocale
+# endif
+_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
+# else
+# if @HAVE_DUPLOCALE@
+_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
+# endif
+# endif
+# if @HAVE_DUPLOCALE@
+_GL_CXXALIASWARN (duplocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef duplocale
+# if HAVE_RAW_DECL_DUPLOCALE
+_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
+ "use gnulib module duplocale for portability");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
diff --git a/gnulib/lib/localename.c b/gnulib/lib/localename.c
new file mode 100644
index 0000000..8fd5d89
--- /dev/null
+++ b/gnulib/lib/localename.c
@@ -0,0 +1,2957 @@
+/* Determine name of the currently selected locale.
+ Copyright (C) 1995-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
+/* MacOS X code written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBINTL
+# include "gettextP.h"
+#else
+# include "localename.h"
+#endif
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <string.h>
+
+#if HAVE_USELOCALE
+/* MacOS X 10.5 defines the locale_t type in <xlocale.h>. */
+# if defined __APPLE__ && defined __MACH__
+# include <xlocale.h>
+# endif
+# include <langinfo.h>
+# if !defined IN_LIBINTL
+# include "glthread/lock.h"
+# endif
+#endif
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <CoreFoundation/CFString.h>
+# if HAVE_CFLOCALECOPYCURRENT
+# include <CoreFoundation/CFLocale.h>
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <CoreFoundation/CFPreferences.h>
+# endif
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+ 0x01 LANG_ARABIC
+ 0x02 LANG_BULGARIAN
+ 0x03 LANG_CATALAN
+ 0x04 LANG_CHINESE
+ 0x05 LANG_CZECH
+ 0x06 LANG_DANISH
+ 0x07 LANG_GERMAN
+ 0x08 LANG_GREEK
+ 0x09 LANG_ENGLISH
+ 0x0a LANG_SPANISH
+ 0x0b LANG_FINNISH
+ 0x0c LANG_FRENCH
+ 0x0d LANG_HEBREW
+ 0x0e LANG_HUNGARIAN
+ 0x0f LANG_ICELANDIC
+ 0x10 LANG_ITALIAN
+ 0x11 LANG_JAPANESE
+ 0x12 LANG_KOREAN
+ 0x13 LANG_DUTCH
+ 0x14 LANG_NORWEGIAN
+ 0x15 LANG_POLISH
+ 0x16 LANG_PORTUGUESE
+ 0x17 LANG_ROMANSH
+ 0x18 LANG_ROMANIAN
+ 0x19 LANG_RUSSIAN
+ 0x1a LANG_CROATIAN == LANG_SERBIAN
+ 0x1b LANG_SLOVAK
+ 0x1c LANG_ALBANIAN
+ 0x1d LANG_SWEDISH
+ 0x1e LANG_THAI
+ 0x1f LANG_TURKISH
+ 0x20 LANG_URDU
+ 0x21 LANG_INDONESIAN
+ 0x22 LANG_UKRAINIAN
+ 0x23 LANG_BELARUSIAN
+ 0x24 LANG_SLOVENIAN
+ 0x25 LANG_ESTONIAN
+ 0x26 LANG_LATVIAN
+ 0x27 LANG_LITHUANIAN
+ 0x28 LANG_TAJIK
+ 0x29 LANG_FARSI
+ 0x2a LANG_VIETNAMESE
+ 0x2b LANG_ARMENIAN
+ 0x2c LANG_AZERI
+ 0x2d LANG_BASQUE
+ 0x2e LANG_SORBIAN
+ 0x2f LANG_MACEDONIAN
+ 0x30 LANG_SUTU
+ 0x31 LANG_TSONGA
+ 0x32 LANG_TSWANA
+ 0x33 LANG_VENDA
+ 0x34 LANG_XHOSA
+ 0x35 LANG_ZULU
+ 0x36 LANG_AFRIKAANS
+ 0x37 LANG_GEORGIAN
+ 0x38 LANG_FAEROESE
+ 0x39 LANG_HINDI
+ 0x3a LANG_MALTESE
+ 0x3b LANG_SAMI
+ 0x3c LANG_GAELIC
+ 0x3d LANG_YIDDISH
+ 0x3e LANG_MALAY
+ 0x3f LANG_KAZAK
+ 0x40 LANG_KYRGYZ
+ 0x41 LANG_SWAHILI
+ 0x42 LANG_TURKMEN
+ 0x43 LANG_UZBEK
+ 0x44 LANG_TATAR
+ 0x45 LANG_BENGALI
+ 0x46 LANG_PUNJABI
+ 0x47 LANG_GUJARATI
+ 0x48 LANG_ORIYA
+ 0x49 LANG_TAMIL
+ 0x4a LANG_TELUGU
+ 0x4b LANG_KANNADA
+ 0x4c LANG_MALAYALAM
+ 0x4d LANG_ASSAMESE
+ 0x4e LANG_MARATHI
+ 0x4f LANG_SANSKRIT
+ 0x50 LANG_MONGOLIAN
+ 0x51 LANG_TIBETAN
+ 0x52 LANG_WELSH
+ 0x53 LANG_CAMBODIAN
+ 0x54 LANG_LAO
+ 0x55 LANG_BURMESE
+ 0x56 LANG_GALICIAN
+ 0x57 LANG_KONKANI
+ 0x58 LANG_MANIPURI
+ 0x59 LANG_SINDHI
+ 0x5a LANG_SYRIAC
+ 0x5b LANG_SINHALESE
+ 0x5c LANG_CHEROKEE
+ 0x5d LANG_INUKTITUT
+ 0x5e LANG_AMHARIC
+ 0x5f LANG_TAMAZIGHT
+ 0x60 LANG_KASHMIRI
+ 0x61 LANG_NEPALI
+ 0x62 LANG_FRISIAN
+ 0x63 LANG_PASHTO
+ 0x64 LANG_TAGALOG
+ 0x65 LANG_DIVEHI
+ 0x66 LANG_EDO
+ 0x67 LANG_FULFULDE
+ 0x68 LANG_HAUSA
+ 0x69 LANG_IBIBIO
+ 0x6a LANG_YORUBA
+ 0x6d LANG_BASHKIR
+ 0x6e LANG_LUXEMBOURGISH
+ 0x6f LANG_GREENLANDIC
+ 0x70 LANG_IGBO
+ 0x71 LANG_KANURI
+ 0x72 LANG_OROMO
+ 0x73 LANG_TIGRINYA
+ 0x74 LANG_GUARANI
+ 0x75 LANG_HAWAIIAN
+ 0x76 LANG_LATIN
+ 0x77 LANG_SOMALI
+ 0x78 LANG_YI
+ 0x79 LANG_PAPIAMENTU
+ 0x7a LANG_MAPUDUNGUN
+ 0x7c LANG_MOHAWK
+ 0x7e LANG_BRETON
+ 0x82 LANG_OCCITAN
+ 0x83 LANG_CORSICAN
+ 0x84 LANG_ALSATIAN
+ 0x85 LANG_YAKUT
+ 0x86 LANG_KICHE
+ 0x87 LANG_KINYARWANDA
+ 0x88 LANG_WOLOF
+ 0x8c LANG_DARI
+ 0x91 LANG_SCOTTISH_GAELIC
+*/
+/* Mingw headers don't have latest language and sublanguage codes. */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_ALSATIAN
+# define LANG_ALSATIAN 0x84
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASHKIR
+# define LANG_BASHKIR 0x6d
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BRETON
+# define LANG_BRETON 0x7e
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_CORSICAN
+# define LANG_CORSICAN 0x83
+# endif
+# ifndef LANG_DARI
+# define LANG_DARI 0x8c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GREENLANDIC
+# define LANG_GREENLANDIC 0x6f
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KICHE
+# define LANG_KICHE 0x86
+# endif
+# ifndef LANG_KINYARWANDA
+# define LANG_KINYARWANDA 0x87
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_LUXEMBOURGISH
+# define LANG_LUXEMBOURGISH 0x6e
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MAORI
+# define LANG_MAORI 0x81
+# endif
+# ifndef LANG_MAPUDUNGUN
+# define LANG_MAPUDUNGUN 0x7a
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MOHAWK
+# define LANG_MOHAWK 0x7c
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_OCCITAN
+# define LANG_OCCITAN 0x82
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_QUECHUA
+# define LANG_QUECHUA 0x6b
+# endif
+# ifndef LANG_ROMANSH
+# define LANG_ROMANSH 0x17
+# endif
+# ifndef LANG_SAMI
+# define LANG_SAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SCOTTISH_GAELIC
+# define LANG_SCOTTISH_GAELIC 0x91
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SOTHO
+# define LANG_SOTHO 0x6c
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UIGHUR
+# define LANG_UIGHUR 0x80
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_WOLOF
+# define LANG_WOLOF 0x88
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YAKUT
+# define LANG_YAKUT 0x85
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_AFRIKAANS_SOUTH_AFRICA
+# define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_ALBANIAN_ALBANIA
+# define SUBLANG_ALBANIAN_ALBANIA 0x01
+# endif
+# ifndef SUBLANG_ALSATIAN_FRANCE
+# define SUBLANG_ALSATIAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_AMHARIC_ETHIOPIA
+# define SUBLANG_AMHARIC_ETHIOPIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_ARMENIAN_ARMENIA
+# define SUBLANG_ARMENIAN_ARMENIA 0x01
+# endif
+# ifndef SUBLANG_ASSAMESE_INDIA
+# define SUBLANG_ASSAMESE_INDIA 0x01
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BASHKIR_RUSSIA
+# define SUBLANG_BASHKIR_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_BASQUE_BASQUE
+# define SUBLANG_BASQUE_BASQUE 0x01
+# endif
+# ifndef SUBLANG_BELARUSIAN_BELARUS
+# define SUBLANG_BELARUSIAN_BELARUS 0x01
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x01
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x02
+# endif
+# ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN
+# define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05
+# endif
+# ifndef SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC
+# define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08
+# endif
+# ifndef SUBLANG_BRETON_FRANCE
+# define SUBLANG_BRETON_FRANCE 0x01
+# endif
+# ifndef SUBLANG_BULGARIAN_BULGARIA
+# define SUBLANG_BULGARIAN_BULGARIA 0x01
+# endif
+# ifndef SUBLANG_CAMBODIAN_CAMBODIA
+# define SUBLANG_CAMBODIAN_CAMBODIA 0x01
+# endif
+# ifndef SUBLANG_CATALAN_SPAIN
+# define SUBLANG_CATALAN_SPAIN 0x01
+# endif
+# ifndef SUBLANG_CORSICAN_FRANCE
+# define SUBLANG_CORSICAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_CROATIAN_CROATIA
+# define SUBLANG_CROATIAN_CROATIA 0x01
+# endif
+# ifndef SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN
+# define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_CZECH_CZECH_REPUBLIC
+# define SUBLANG_CZECH_CZECH_REPUBLIC 0x01
+# endif
+# ifndef SUBLANG_DANISH_DENMARK
+# define SUBLANG_DANISH_DENMARK 0x01
+# endif
+# ifndef SUBLANG_DARI_AFGHANISTAN
+# define SUBLANG_DARI_AFGHANISTAN 0x01
+# endif
+# ifndef SUBLANG_DIVEHI_MALDIVES
+# define SUBLANG_DIVEHI_MALDIVES 0x01
+# endif
+# ifndef SUBLANG_DUTCH_SURINAM
+# define SUBLANG_DUTCH_SURINAM 0x03
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_ESTONIAN_ESTONIA
+# define SUBLANG_ESTONIAN_ESTONIA 0x01
+# endif
+# ifndef SUBLANG_FAEROESE_FAROE_ISLANDS
+# define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01
+# endif
+# ifndef SUBLANG_FARSI_IRAN
+# define SUBLANG_FARSI_IRAN 0x01
+# endif
+# ifndef SUBLANG_FINNISH_FINLAND
+# define SUBLANG_FINNISH_FINLAND 0x01
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_FRISIAN_NETHERLANDS
+# define SUBLANG_FRISIAN_NETHERLANDS 0x01
+# endif
+# ifndef SUBLANG_GALICIAN_SPAIN
+# define SUBLANG_GALICIAN_SPAIN 0x01
+# endif
+# ifndef SUBLANG_GEORGIAN_GEORGIA
+# define SUBLANG_GEORGIAN_GEORGIA 0x01
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_GREEK_GREECE
+# define SUBLANG_GREEK_GREECE 0x01
+# endif
+# ifndef SUBLANG_GREENLANDIC_GREENLAND
+# define SUBLANG_GREENLANDIC_GREENLAND 0x01
+# endif
+# ifndef SUBLANG_GUJARATI_INDIA
+# define SUBLANG_GUJARATI_INDIA 0x01
+# endif
+# ifndef SUBLANG_HAUSA_NIGERIA_LATIN
+# define SUBLANG_HAUSA_NIGERIA_LATIN 0x01
+# endif
+# ifndef SUBLANG_HEBREW_ISRAEL
+# define SUBLANG_HEBREW_ISRAEL 0x01
+# endif
+# ifndef SUBLANG_HINDI_INDIA
+# define SUBLANG_HINDI_INDIA 0x01
+# endif
+# ifndef SUBLANG_HUNGARIAN_HUNGARY
+# define SUBLANG_HUNGARIAN_HUNGARY 0x01
+# endif
+# ifndef SUBLANG_ICELANDIC_ICELAND
+# define SUBLANG_ICELANDIC_ICELAND 0x01
+# endif
+# ifndef SUBLANG_IGBO_NIGERIA
+# define SUBLANG_IGBO_NIGERIA 0x01
+# endif
+# ifndef SUBLANG_INDONESIAN_INDONESIA
+# define SUBLANG_INDONESIAN_INDONESIA 0x01
+# endif
+# ifndef SUBLANG_INUKTITUT_CANADA
+# define SUBLANG_INUKTITUT_CANADA 0x01
+# endif
+# undef SUBLANG_INUKTITUT_CANADA_LATIN
+# define SUBLANG_INUKTITUT_CANADA_LATIN 0x02
+# undef SUBLANG_IRISH_IRELAND
+# define SUBLANG_IRISH_IRELAND 0x02
+# ifndef SUBLANG_JAPANESE_JAPAN
+# define SUBLANG_JAPANESE_JAPAN 0x01
+# endif
+# ifndef SUBLANG_KANNADA_INDIA
+# define SUBLANG_KANNADA_INDIA 0x01
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_KAZAK_KAZAKHSTAN
+# define SUBLANG_KAZAK_KAZAKHSTAN 0x01
+# endif
+# ifndef SUBLANG_KICHE_GUATEMALA
+# define SUBLANG_KICHE_GUATEMALA 0x01
+# endif
+# ifndef SUBLANG_KINYARWANDA_RWANDA
+# define SUBLANG_KINYARWANDA_RWANDA 0x01
+# endif
+# ifndef SUBLANG_KONKANI_INDIA
+# define SUBLANG_KONKANI_INDIA 0x01
+# endif
+# ifndef SUBLANG_KYRGYZ_KYRGYZSTAN
+# define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01
+# endif
+# ifndef SUBLANG_LAO_LAOS
+# define SUBLANG_LAO_LAOS 0x01
+# endif
+# ifndef SUBLANG_LATVIAN_LATVIA
+# define SUBLANG_LATVIAN_LATVIA 0x01
+# endif
+# ifndef SUBLANG_LITHUANIAN_LITHUANIA
+# define SUBLANG_LITHUANIAN_LITHUANIA 0x01
+# endif
+# undef SUBLANG_LOWER_SORBIAN_GERMANY
+# define SUBLANG_LOWER_SORBIAN_GERMANY 0x02
+# ifndef SUBLANG_LUXEMBOURGISH_LUXEMBOURG
+# define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01
+# endif
+# ifndef SUBLANG_MACEDONIAN_MACEDONIA
+# define SUBLANG_MACEDONIAN_MACEDONIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_MALAYALAM_INDIA
+# define SUBLANG_MALAYALAM_INDIA 0x01
+# endif
+# ifndef SUBLANG_MALTESE_MALTA
+# define SUBLANG_MALTESE_MALTA 0x01
+# endif
+# ifndef SUBLANG_MAORI_NEW_ZEALAND
+# define SUBLANG_MAORI_NEW_ZEALAND 0x01
+# endif
+# ifndef SUBLANG_MAPUDUNGUN_CHILE
+# define SUBLANG_MAPUDUNGUN_CHILE 0x01
+# endif
+# ifndef SUBLANG_MARATHI_INDIA
+# define SUBLANG_MARATHI_INDIA 0x01
+# endif
+# ifndef SUBLANG_MOHAWK_CANADA
+# define SUBLANG_MOHAWK_CANADA 0x01
+# endif
+# ifndef SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA
+# define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01
+# endif
+# ifndef SUBLANG_MONGOLIAN_PRC
+# define SUBLANG_MONGOLIAN_PRC 0x02
+# endif
+# ifndef SUBLANG_NEPALI_NEPAL
+# define SUBLANG_NEPALI_NEPAL 0x01
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_OCCITAN_FRANCE
+# define SUBLANG_OCCITAN_FRANCE 0x01
+# endif
+# ifndef SUBLANG_ORIYA_INDIA
+# define SUBLANG_ORIYA_INDIA 0x01
+# endif
+# ifndef SUBLANG_PASHTO_AFGHANISTAN
+# define SUBLANG_PASHTO_AFGHANISTAN 0x01
+# endif
+# ifndef SUBLANG_POLISH_POLAND
+# define SUBLANG_POLISH_POLAND 0x01
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x01
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x02
+# endif
+# ifndef SUBLANG_QUECHUA_BOLIVIA
+# define SUBLANG_QUECHUA_BOLIVIA 0x01
+# endif
+# ifndef SUBLANG_QUECHUA_ECUADOR
+# define SUBLANG_QUECHUA_ECUADOR 0x02
+# endif
+# ifndef SUBLANG_QUECHUA_PERU
+# define SUBLANG_QUECHUA_PERU 0x03
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x02
+# endif
+# ifndef SUBLANG_ROMANSH_SWITZERLAND
+# define SUBLANG_ROMANSH_SWITZERLAND 0x01
+# endif
+# ifndef SUBLANG_RUSSIAN_RUSSIA
+# define SUBLANG_RUSSIAN_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_RUSSIAN_MOLDAVIA
+# define SUBLANG_RUSSIAN_MOLDAVIA 0x02
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_NORWAY
+# define SUBLANG_SAMI_NORTHERN_NORWAY 0x01
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_SWEDEN
+# define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02
+# endif
+# ifndef SUBLANG_SAMI_NORTHERN_FINLAND
+# define SUBLANG_SAMI_NORTHERN_FINLAND 0x03
+# endif
+# ifndef SUBLANG_SAMI_LULE_NORWAY
+# define SUBLANG_SAMI_LULE_NORWAY 0x04
+# endif
+# ifndef SUBLANG_SAMI_LULE_SWEDEN
+# define SUBLANG_SAMI_LULE_SWEDEN 0x05
+# endif
+# ifndef SUBLANG_SAMI_SOUTHERN_NORWAY
+# define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06
+# endif
+# ifndef SUBLANG_SAMI_SOUTHERN_SWEDEN
+# define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07
+# endif
+# undef SUBLANG_SAMI_SKOLT_FINLAND
+# define SUBLANG_SAMI_SKOLT_FINLAND 0x08
+# undef SUBLANG_SAMI_INARI_FINLAND
+# define SUBLANG_SAMI_INARI_FINLAND 0x09
+# ifndef SUBLANG_SANSKRIT_INDIA
+# define SUBLANG_SANSKRIT_INDIA 0x01
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_INDIA
+# define SUBLANG_SINDHI_INDIA 0x01
+# endif
+# undef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x02
+# ifndef SUBLANG_SINDHI_AFGHANISTAN
+# define SUBLANG_SINDHI_AFGHANISTAN 0x02
+# endif
+# ifndef SUBLANG_SINHALESE_SRI_LANKA
+# define SUBLANG_SINHALESE_SRI_LANKA 0x01
+# endif
+# ifndef SUBLANG_SLOVAK_SLOVAKIA
+# define SUBLANG_SLOVAK_SLOVAKIA 0x01
+# endif
+# ifndef SUBLANG_SLOVENIAN_SLOVENIA
+# define SUBLANG_SLOVENIAN_SLOVENIA 0x01
+# endif
+# ifndef SUBLANG_SOTHO_SOUTH_AFRICA
+# define SUBLANG_SOTHO_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SPANISH_US
+# define SUBLANG_SPANISH_US 0x15
+# endif
+# ifndef SUBLANG_SWAHILI_KENYA
+# define SUBLANG_SWAHILI_KENYA 0x01
+# endif
+# ifndef SUBLANG_SWEDISH_SWEDEN
+# define SUBLANG_SWEDISH_SWEDEN 0x01
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_SYRIAC_SYRIA
+# define SUBLANG_SYRIAC_SYRIA 0x01
+# endif
+# ifndef SUBLANG_TAGALOG_PHILIPPINES
+# define SUBLANG_TAGALOG_PHILIPPINES 0x01
+# endif
+# ifndef SUBLANG_TAJIK_TAJIKISTAN
+# define SUBLANG_TAJIK_TAJIKISTAN 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN
+# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02
+# endif
+# ifndef SUBLANG_TAMIL_INDIA
+# define SUBLANG_TAMIL_INDIA 0x01
+# endif
+# ifndef SUBLANG_TATAR_RUSSIA
+# define SUBLANG_TATAR_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_TELUGU_INDIA
+# define SUBLANG_TELUGU_INDIA 0x01
+# endif
+# ifndef SUBLANG_THAI_THAILAND
+# define SUBLANG_THAI_THAILAND 0x01
+# endif
+# ifndef SUBLANG_TIBETAN_PRC
+# define SUBLANG_TIBETAN_PRC 0x01
+# endif
+# undef SUBLANG_TIBETAN_BHUTAN
+# define SUBLANG_TIBETAN_BHUTAN 0x02
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x01
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x02
+# endif
+# ifndef SUBLANG_TSWANA_SOUTH_AFRICA
+# define SUBLANG_TSWANA_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_TURKISH_TURKEY
+# define SUBLANG_TURKISH_TURKEY 0x01
+# endif
+# ifndef SUBLANG_TURKMEN_TURKMENISTAN
+# define SUBLANG_TURKMEN_TURKMENISTAN 0x01
+# endif
+# ifndef SUBLANG_UIGHUR_PRC
+# define SUBLANG_UIGHUR_PRC 0x01
+# endif
+# ifndef SUBLANG_UKRAINIAN_UKRAINE
+# define SUBLANG_UKRAINIAN_UKRAINE 0x01
+# endif
+# ifndef SUBLANG_UPPER_SORBIAN_GERMANY
+# define SUBLANG_UPPER_SORBIAN_GERMANY 0x01
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_VIETNAMESE_VIETNAM
+# define SUBLANG_VIETNAMESE_VIETNAM 0x01
+# endif
+# ifndef SUBLANG_WELSH_UNITED_KINGDOM
+# define SUBLANG_WELSH_UNITED_KINGDOM 0x01
+# endif
+# ifndef SUBLANG_WOLOF_SENEGAL
+# define SUBLANG_WOLOF_SENEGAL 0x01
+# endif
+# ifndef SUBLANG_XHOSA_SOUTH_AFRICA
+# define SUBLANG_XHOSA_SOUTH_AFRICA 0x01
+# endif
+# ifndef SUBLANG_YAKUT_RUSSIA
+# define SUBLANG_YAKUT_RUSSIA 0x01
+# endif
+# ifndef SUBLANG_YI_PRC
+# define SUBLANG_YI_PRC 0x01
+# endif
+# ifndef SUBLANG_YORUBA_NIGERIA
+# define SUBLANG_YORUBA_NIGERIA 0x01
+# endif
+# ifndef SUBLANG_ZULU_SOUTH_AFRICA
+# define SUBLANG_ZULU_SOUTH_AFRICA 0x01
+# endif
+/* GetLocaleInfoA operations. */
+# ifndef LOCALE_SNAME
+# define LOCALE_SNAME 0x5c
+# endif
+#endif
+
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+/* MacOS X 10.2 or newer */
+
+/* Canonicalize a MacOS X locale name to a Unix locale name.
+ NAME is a sufficiently large buffer.
+ On input, it contains the MacOS X locale name.
+ On output, it contains the Unix locale name. */
+# if !defined IN_LIBINTL
+static
+# endif
+void
+gl_locale_name_canonicalize (char *name)
+{
+ /* This conversion is based on a posting by
+ Deborah GoldSmith <goldsmit@apple.com> on 2005-03-08,
+ http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */
+
+ /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and
+ ISO 3166) names. Prior to MacOS X 10.3, there is no API for doing this.
+ Therefore we do it ourselves, using a table based on the results of the
+ MacOS X 10.3.8 function
+ CFLocaleCreateCanonicalLocaleIdentifierFromString(). */
+ typedef struct { const char legacy[21+1]; const char unixy[5+1]; }
+ legacy_entry;
+ static const legacy_entry legacy_table[] = {
+ { "Afrikaans", "af" },
+ { "Albanian", "sq" },
+ { "Amharic", "am" },
+ { "Arabic", "ar" },
+ { "Armenian", "hy" },
+ { "Assamese", "as" },
+ { "Aymara", "ay" },
+ { "Azerbaijani", "az" },
+ { "Basque", "eu" },
+ { "Belarusian", "be" },
+ { "Belorussian", "be" },
+ { "Bengali", "bn" },
+ { "Brazilian Portugese", "pt_BR" },
+ { "Brazilian Portuguese", "pt_BR" },
+ { "Breton", "br" },
+ { "Bulgarian", "bg" },
+ { "Burmese", "my" },
+ { "Byelorussian", "be" },
+ { "Catalan", "ca" },
+ { "Chewa", "ny" },
+ { "Chichewa", "ny" },
+ { "Chinese", "zh" },
+ { "Chinese, Simplified", "zh_CN" },
+ { "Chinese, Traditional", "zh_TW" },
+ { "Chinese, Tradtional", "zh_TW" },
+ { "Croatian", "hr" },
+ { "Czech", "cs" },
+ { "Danish", "da" },
+ { "Dutch", "nl" },
+ { "Dzongkha", "dz" },
+ { "English", "en" },
+ { "Esperanto", "eo" },
+ { "Estonian", "et" },
+ { "Faroese", "fo" },
+ { "Farsi", "fa" },
+ { "Finnish", "fi" },
+ { "Flemish", "nl_BE" },
+ { "French", "fr" },
+ { "Galician", "gl" },
+ { "Gallegan", "gl" },
+ { "Georgian", "ka" },
+ { "German", "de" },
+ { "Greek", "el" },
+ { "Greenlandic", "kl" },
+ { "Guarani", "gn" },
+ { "Gujarati", "gu" },
+ { "Hawaiian", "haw" }, /* Yes, "haw", not "cpe". */
+ { "Hebrew", "he" },
+ { "Hindi", "hi" },
+ { "Hungarian", "hu" },
+ { "Icelandic", "is" },
+ { "Indonesian", "id" },
+ { "Inuktitut", "iu" },
+ { "Irish", "ga" },
+ { "Italian", "it" },
+ { "Japanese", "ja" },
+ { "Javanese", "jv" },
+ { "Kalaallisut", "kl" },
+ { "Kannada", "kn" },
+ { "Kashmiri", "ks" },
+ { "Kazakh", "kk" },
+ { "Khmer", "km" },
+ { "Kinyarwanda", "rw" },
+ { "Kirghiz", "ky" },
+ { "Korean", "ko" },
+ { "Kurdish", "ku" },
+ { "Latin", "la" },
+ { "Latvian", "lv" },
+ { "Lithuanian", "lt" },
+ { "Macedonian", "mk" },
+ { "Malagasy", "mg" },
+ { "Malay", "ms" },
+ { "Malayalam", "ml" },
+ { "Maltese", "mt" },
+ { "Manx", "gv" },
+ { "Marathi", "mr" },
+ { "Moldavian", "mo" },
+ { "Mongolian", "mn" },
+ { "Nepali", "ne" },
+ { "Norwegian", "nb" }, /* Yes, "nb", not the obsolete "no". */
+ { "Nyanja", "ny" },
+ { "Nynorsk", "nn" },
+ { "Oriya", "or" },
+ { "Oromo", "om" },
+ { "Panjabi", "pa" },
+ { "Pashto", "ps" },
+ { "Persian", "fa" },
+ { "Polish", "pl" },
+ { "Portuguese", "pt" },
+ { "Portuguese, Brazilian", "pt_BR" },
+ { "Punjabi", "pa" },
+ { "Pushto", "ps" },
+ { "Quechua", "qu" },
+ { "Romanian", "ro" },
+ { "Ruanda", "rw" },
+ { "Rundi", "rn" },
+ { "Russian", "ru" },
+ { "Sami", "se_NO" }, /* Not just "se". */
+ { "Sanskrit", "sa" },
+ { "Scottish", "gd" },
+ { "Serbian", "sr" },
+ { "Simplified Chinese", "zh_CN" },
+ { "Sindhi", "sd" },
+ { "Sinhalese", "si" },
+ { "Slovak", "sk" },
+ { "Slovenian", "sl" },
+ { "Somali", "so" },
+ { "Spanish", "es" },
+ { "Sundanese", "su" },
+ { "Swahili", "sw" },
+ { "Swedish", "sv" },
+ { "Tagalog", "tl" },
+ { "Tajik", "tg" },
+ { "Tajiki", "tg" },
+ { "Tamil", "ta" },
+ { "Tatar", "tt" },
+ { "Telugu", "te" },
+ { "Thai", "th" },
+ { "Tibetan", "bo" },
+ { "Tigrinya", "ti" },
+ { "Tongan", "to" },
+ { "Traditional Chinese", "zh_TW" },
+ { "Turkish", "tr" },
+ { "Turkmen", "tk" },
+ { "Uighur", "ug" },
+ { "Ukrainian", "uk" },
+ { "Urdu", "ur" },
+ { "Uzbek", "uz" },
+ { "Vietnamese", "vi" },
+ { "Welsh", "cy" },
+ { "Yiddish", "yi" }
+ };
+
+ /* Convert new-style locale names with language tags (ISO 639 and ISO 15924)
+ to Unix (ISO 639 and ISO 3166) names. */
+ typedef struct { const char langtag[7+1]; const char unixy[12+1]; }
+ langtag_entry;
+ static const langtag_entry langtag_table[] = {
+ /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".
+ The default script for az on Unix is Latin. */
+ { "az-Latn", "az" },
+ /* MacOS X has "ga-dots". Does not yet exist on Unix. */
+ { "ga-dots", "ga" },
+ /* MacOS X has "kk-Cyrl". Does not yet exist on Unix. */
+ /* MacOS X has "mn-Cyrl", "mn-Mong".
+ The default script for mn on Unix is Cyrillic. */
+ { "mn-Cyrl", "mn" },
+ /* MacOS X has "ms-Arab", "ms-Latn".
+ The default script for ms on Unix is Latin. */
+ { "ms-Latn", "ms" },
+ /* MacOS X has "tg-Cyrl".
+ The default script for tg on Unix is Cyrillic. */
+ { "tg-Cyrl", "tg" },
+ /* MacOS X has "tk-Cyrl". Does not yet exist on Unix. */
+ /* MacOS X has "tt-Cyrl".
+ The default script for tt on Unix is Cyrillic. */
+ { "tt-Cyrl", "tt" },
+ /* MacOS X has "zh-Hans", "zh-Hant".
+ Country codes are used to distinguish these on Unix. */
+ { "zh-Hans", "zh_CN" },
+ { "zh-Hant", "zh_TW" }
+ };
+
+ /* Convert script names (ISO 15924) to Unix conventions.
+ See http://www.unicode.org/iso15924/iso15924-codes.html */
+ typedef struct { const char script[4+1]; const char unixy[9+1]; }
+ script_entry;
+ static const script_entry script_table[] = {
+ { "Arab", "arabic" },
+ { "Cyrl", "cyrillic" },
+ { "Mong", "mongolian" }
+ };
+
+ /* Step 1: Convert using legacy_table. */
+ if (name[0] >= 'A' && name[0] <= 'Z')
+ {
+ unsigned int i1, i2;
+ i1 = 0;
+ i2 = sizeof (legacy_table) / sizeof (legacy_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if name occurs in legacy_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const legacy_entry *p = &legacy_table[i];
+ if (strcmp (name, p->legacy) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name, legacy_table[i1].legacy) == 0)
+ {
+ strcpy (name, legacy_table[i1].unixy);
+ return;
+ }
+ }
+
+ /* Step 2: Convert using langtag_table and script_table. */
+ if (strlen (name) == 7 && name[2] == '-')
+ {
+ unsigned int i1, i2;
+ i1 = 0;
+ i2 = sizeof (langtag_table) / sizeof (langtag_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if name occurs in langtag_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const langtag_entry *p = &langtag_table[i];
+ if (strcmp (name, p->langtag) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name, langtag_table[i1].langtag) == 0)
+ {
+ strcpy (name, langtag_table[i1].unixy);
+ return;
+ }
+
+ i1 = 0;
+ i2 = sizeof (script_table) / sizeof (script_entry);
+ while (i2 - i1 > 1)
+ {
+ /* At this point we know that if (name + 3) occurs in script_table,
+ its index must be >= i1 and < i2. */
+ unsigned int i = (i1 + i2) >> 1;
+ const script_entry *p = &script_table[i];
+ if (strcmp (name + 3, p->script) < 0)
+ i2 = i;
+ else
+ i1 = i;
+ }
+ if (strcmp (name + 3, script_table[i1].script) == 0)
+ {
+ name[2] = '@';
+ strcpy (name + 3, script_table[i1].unixy);
+ return;
+ }
+ }
+
+ /* Step 3: Convert new-style dash to Unix underscore. */
+ {
+ char *p;
+ for (p = name; *p != '\0'; p++)
+ if (*p == '-')
+ *p = '_';
+ }
+}
+
+#endif
+
+
+#if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+
+/* Canonicalize a Win32 native locale name to a Unix locale name.
+ NAME is a sufficiently large buffer.
+ On input, it contains the Win32 locale name.
+ On output, it contains the Unix locale name. */
+# if !defined IN_LIBINTL
+static
+# endif
+void
+gl_locale_name_canonicalize (char *name)
+{
+ /* FIXME: This is probably incomplete: it does not handle "zh-Hans" and
+ "zh-Hant". */
+ char *p;
+
+ for (p = name; *p != '\0'; p++)
+ if (*p == '-')
+ {
+ *p = '_';
+ p++;
+ for (; *p != '\0'; p++)
+ {
+ if (*p >= 'a' && *p <= 'z')
+ *p += 'A' - 'a';
+ if (*p == '-')
+ {
+ *p = '\0';
+ return;
+ }
+ }
+ return;
+ }
+}
+
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_from_win32_LANGID (LANGID langid)
+{
+ /* Activate the new code only when the GETTEXT_MUI environment variable is
+ set, for the time being, since the new code is not well tested. */
+ if (getenv ("GETTEXT_MUI") != NULL)
+ {
+ static char namebuf[256];
+
+ /* Query the system's notion of locale name.
+ On Windows95/98/ME, GetLocaleInfoA returns some incorrect results.
+ But we don't need to support systems that are so old. */
+ if (GetLocaleInfoA (MAKELCID (langid, SORT_DEFAULT), LOCALE_SNAME,
+ namebuf, sizeof (namebuf) - 1))
+ {
+ /* Convert it to a Unix locale name. */
+ gl_locale_name_canonicalize (namebuf);
+ return namebuf;
+ }
+ }
+ /* Internet Explorer has an LCID to RFC3066 name mapping stored in
+ HKEY_CLASSES_ROOT\Mime\Database\Rfc1766. But we better don't use that
+ since IE's i18n subsystem is known to be inconsistent with the Win32 base
+ (e.g. they have different character conversion facilities that produce
+ different results). */
+ /* Use our own table. */
+ {
+ int primary, sub;
+
+ /* Split into language and territory part. */
+ primary = PRIMARYLANGID (langid);
+ sub = SUBLANGID (langid);
+
+ /* Dispatch on language.
+ See also http://www.unicode.org/unicode/onlinedat/languages.html .
+ For details about languages, see http://www.ethnologue.com/ . */
+ switch (primary)
+ {
+ case LANG_AFRIKAANS:
+ switch (sub)
+ {
+ case SUBLANG_AFRIKAANS_SOUTH_AFRICA: return "af_ZA";
+ }
+ return "af";
+ case LANG_ALBANIAN:
+ switch (sub)
+ {
+ case SUBLANG_ALBANIAN_ALBANIA: return "sq_AL";
+ }
+ return "sq";
+ case LANG_ALSATIAN:
+ switch (sub)
+ {
+ case SUBLANG_ALSATIAN_FRANCE: return "gsw_FR";
+ }
+ return "gsw";
+ case LANG_AMHARIC:
+ switch (sub)
+ {
+ case SUBLANG_AMHARIC_ETHIOPIA: return "am_ET";
+ }
+ return "am";
+ case LANG_ARABIC:
+ switch (sub)
+ {
+ case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+ case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+ case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+ case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+ case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+ case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+ case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+ case SUBLANG_ARABIC_OMAN: return "ar_OM";
+ case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+ case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+ case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+ case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+ case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+ case SUBLANG_ARABIC_UAE: return "ar_AE";
+ case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+ case SUBLANG_ARABIC_QATAR: return "ar_QA";
+ }
+ return "ar";
+ case LANG_ARMENIAN:
+ switch (sub)
+ {
+ case SUBLANG_ARMENIAN_ARMENIA: return "hy_AM";
+ }
+ return "hy";
+ case LANG_ASSAMESE:
+ switch (sub)
+ {
+ case SUBLANG_ASSAMESE_INDIA: return "as_IN";
+ }
+ return "as";
+ case LANG_AZERI:
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */
+ case 0x1e: return "az@latin";
+ case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+ case 0x1d: return "az@cyrillic";
+ case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+ }
+ return "az";
+ case LANG_BASHKIR:
+ switch (sub)
+ {
+ case SUBLANG_BASHKIR_RUSSIA: return "ba_RU";
+ }
+ return "ba";
+ case LANG_BASQUE:
+ switch (sub)
+ {
+ case SUBLANG_BASQUE_BASQUE: return "eu_ES";
+ }
+ return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */
+ case LANG_BELARUSIAN:
+ switch (sub)
+ {
+ case SUBLANG_BELARUSIAN_BELARUS: return "be_BY";
+ }
+ return "be";
+ case LANG_BENGALI:
+ switch (sub)
+ {
+ case SUBLANG_BENGALI_INDIA: return "bn_IN";
+ case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+ }
+ return "bn";
+ case LANG_BRETON:
+ switch (sub)
+ {
+ case SUBLANG_BRETON_FRANCE: return "br_FR";
+ }
+ return "br";
+ case LANG_BULGARIAN:
+ switch (sub)
+ {
+ case SUBLANG_BULGARIAN_BULGARIA: return "bg_BG";
+ }
+ return "bg";
+ case LANG_BURMESE:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "my_MM";
+ }
+ return "my";
+ case LANG_CAMBODIAN:
+ switch (sub)
+ {
+ case SUBLANG_CAMBODIAN_CAMBODIA: return "km_KH";
+ }
+ return "km";
+ case LANG_CATALAN:
+ switch (sub)
+ {
+ case SUBLANG_CATALAN_SPAIN: return "ca_ES";
+ }
+ return "ca";
+ case LANG_CHEROKEE:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "chr_US";
+ }
+ return "chr";
+ case LANG_CHINESE:
+ switch (sub)
+ {
+ case SUBLANG_CHINESE_TRADITIONAL: case 0x1f: return "zh_TW";
+ case SUBLANG_CHINESE_SIMPLIFIED: case 0x00: return "zh_CN";
+ case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; /* traditional */
+ case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; /* simplified */
+ case SUBLANG_CHINESE_MACAU: return "zh_MO"; /* traditional */
+ }
+ return "zh";
+ case LANG_CORSICAN:
+ switch (sub)
+ {
+ case SUBLANG_CORSICAN_FRANCE: return "co_FR";
+ }
+ return "co";
+ case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN
+ * What used to be called Serbo-Croatian
+ * should really now be two separate
+ * languages because of political reasons.
+ * (Says tml, who knows nothing about Serbian
+ * or Croatian.)
+ * (I can feel those flames coming already.)
+ */
+ switch (sub)
+ {
+ /* Croatian */
+ case 0x00: return "hr";
+ case SUBLANG_CROATIAN_CROATIA: return "hr_HR";
+ case SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN: return "hr_BA";
+ /* Serbian */
+ case 0x1f: return "sr";
+ case 0x1c: return "sr"; /* latin */
+ case SUBLANG_SERBIAN_LATIN: return "sr_CS"; /* latin */
+ case 0x09: return "sr_RS"; /* latin */
+ case 0x0b: return "sr_ME"; /* latin */
+ case 0x06: return "sr_BA"; /* latin */
+ case 0x1b: return "sr@cyrillic";
+ case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
+ case 0x0a: return "sr_RS@cyrillic";
+ case 0x0c: return "sr_ME@cyrillic";
+ case 0x07: return "sr_BA@cyrillic";
+ /* Bosnian */
+ case 0x1e: return "bs";
+ case 0x1a: return "bs"; /* latin */
+ case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN: return "bs_BA"; /* latin */
+ case 0x19: return "bs@cyrillic";
+ case SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC: return "bs_BA@cyrillic";
+ }
+ return "hr";
+ case LANG_CZECH:
+ switch (sub)
+ {
+ case SUBLANG_CZECH_CZECH_REPUBLIC: return "cs_CZ";
+ }
+ return "cs";
+ case LANG_DANISH:
+ switch (sub)
+ {
+ case SUBLANG_DANISH_DENMARK: return "da_DK";
+ }
+ return "da";
+ case LANG_DARI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_DARI_AFGHANISTAN: return "prs_AF";
+ }
+ return "prs";
+ case LANG_DIVEHI:
+ switch (sub)
+ {
+ case SUBLANG_DIVEHI_MALDIVES: return "dv_MV";
+ }
+ return "dv";
+ case LANG_DUTCH:
+ switch (sub)
+ {
+ case SUBLANG_DUTCH: return "nl_NL";
+ case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+ case SUBLANG_DUTCH_SURINAM: return "nl_SR";
+ }
+ return "nl";
+ case LANG_EDO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "bin_NG";
+ }
+ return "bin";
+ case LANG_ENGLISH:
+ switch (sub)
+ {
+ /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+ * English was the language spoken in England.
+ * Oh well.
+ */
+ case SUBLANG_ENGLISH_US: return "en_US";
+ case SUBLANG_ENGLISH_UK: return "en_GB";
+ case SUBLANG_ENGLISH_AUS: return "en_AU";
+ case SUBLANG_ENGLISH_CAN: return "en_CA";
+ case SUBLANG_ENGLISH_NZ: return "en_NZ";
+ case SUBLANG_ENGLISH_EIRE: return "en_IE";
+ case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+ case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+ case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+ case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+ case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+ case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+ case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+ case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+ case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+ case SUBLANG_ENGLISH_INDIA: return "en_IN";
+ case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+ case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+ }
+ return "en";
+ case LANG_ESTONIAN:
+ switch (sub)
+ {
+ case SUBLANG_ESTONIAN_ESTONIA: return "et_EE";
+ }
+ return "et";
+ case LANG_FAEROESE:
+ switch (sub)
+ {
+ case SUBLANG_FAEROESE_FAROE_ISLANDS: return "fo_FO";
+ }
+ return "fo";
+ case LANG_FARSI:
+ switch (sub)
+ {
+ case SUBLANG_FARSI_IRAN: return "fa_IR";
+ }
+ return "fa";
+ case LANG_FINNISH:
+ switch (sub)
+ {
+ case SUBLANG_FINNISH_FINLAND: return "fi_FI";
+ }
+ return "fi";
+ case LANG_FRENCH:
+ switch (sub)
+ {
+ case SUBLANG_FRENCH: return "fr_FR";
+ case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+ case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+ case SUBLANG_FRENCH_SWISS: return "fr_CH";
+ case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+ case SUBLANG_FRENCH_MONACO: return "fr_MC";
+ case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+ case SUBLANG_FRENCH_REUNION: return "fr_RE";
+ case SUBLANG_FRENCH_CONGO: return "fr_CG";
+ case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+ case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+ case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+ case SUBLANG_FRENCH_MALI: return "fr_ML";
+ case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+ case SUBLANG_FRENCH_HAITI: return "fr_HT";
+ }
+ return "fr";
+ case LANG_FRISIAN:
+ switch (sub)
+ {
+ case SUBLANG_FRISIAN_NETHERLANDS: return "fy_NL";
+ }
+ return "fy";
+ case LANG_FULFULDE:
+ /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ff_NG";
+ }
+ return "ff";
+ case LANG_GAELIC:
+ switch (sub)
+ {
+ case 0x01: /* SCOTTISH */
+ /* old, superseded by LANG_SCOTTISH_GAELIC */
+ return "gd_GB";
+ case SUBLANG_IRISH_IRELAND: return "ga_IE";
+ }
+ return "ga";
+ case LANG_GALICIAN:
+ switch (sub)
+ {
+ case SUBLANG_GALICIAN_SPAIN: return "gl_ES";
+ }
+ return "gl";
+ case LANG_GEORGIAN:
+ switch (sub)
+ {
+ case SUBLANG_GEORGIAN_GEORGIA: return "ka_GE";
+ }
+ return "ka";
+ case LANG_GERMAN:
+ switch (sub)
+ {
+ case SUBLANG_GERMAN: return "de_DE";
+ case SUBLANG_GERMAN_SWISS: return "de_CH";
+ case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+ case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+ case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+ }
+ return "de";
+ case LANG_GREEK:
+ switch (sub)
+ {
+ case SUBLANG_GREEK_GREECE: return "el_GR";
+ }
+ return "el";
+ case LANG_GREENLANDIC:
+ switch (sub)
+ {
+ case SUBLANG_GREENLANDIC_GREENLAND: return "kl_GL";
+ }
+ return "kl";
+ case LANG_GUARANI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "gn_PY";
+ }
+ return "gn";
+ case LANG_GUJARATI:
+ switch (sub)
+ {
+ case SUBLANG_GUJARATI_INDIA: return "gu_IN";
+ }
+ return "gu";
+ case LANG_HAUSA:
+ switch (sub)
+ {
+ case 0x1f: return "ha";
+ case SUBLANG_HAUSA_NIGERIA_LATIN: return "ha_NG";
+ }
+ return "ha";
+ case LANG_HAWAIIAN:
+ /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+ or Hawaii Creole English ("cpe_US", 600000 speakers)? */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "cpe_US";
+ }
+ return "cpe";
+ case LANG_HEBREW:
+ switch (sub)
+ {
+ case SUBLANG_HEBREW_ISRAEL: return "he_IL";
+ }
+ return "he";
+ case LANG_HINDI:
+ switch (sub)
+ {
+ case SUBLANG_HINDI_INDIA: return "hi_IN";
+ }
+ return "hi";
+ case LANG_HUNGARIAN:
+ switch (sub)
+ {
+ case SUBLANG_HUNGARIAN_HUNGARY: return "hu_HU";
+ }
+ return "hu";
+ case LANG_IBIBIO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "nic_NG";
+ }
+ return "nic";
+ case LANG_ICELANDIC:
+ switch (sub)
+ {
+ case SUBLANG_ICELANDIC_ICELAND: return "is_IS";
+ }
+ return "is";
+ case LANG_IGBO:
+ switch (sub)
+ {
+ case SUBLANG_IGBO_NIGERIA: return "ig_NG";
+ }
+ return "ig";
+ case LANG_INDONESIAN:
+ switch (sub)
+ {
+ case SUBLANG_INDONESIAN_INDONESIA: return "id_ID";
+ }
+ return "id";
+ case LANG_INUKTITUT:
+ switch (sub)
+ {
+ case 0x1e: return "iu"; /* syllabic */
+ case SUBLANG_INUKTITUT_CANADA: return "iu_CA"; /* syllabic */
+ case 0x1f: return "iu@latin";
+ case SUBLANG_INUKTITUT_CANADA_LATIN: return "iu_CA@latin";
+ }
+ return "iu";
+ case LANG_ITALIAN:
+ switch (sub)
+ {
+ case SUBLANG_ITALIAN: return "it_IT";
+ case SUBLANG_ITALIAN_SWISS: return "it_CH";
+ }
+ return "it";
+ case LANG_JAPANESE:
+ switch (sub)
+ {
+ case SUBLANG_JAPANESE_JAPAN: return "ja_JP";
+ }
+ return "ja";
+ case LANG_KANNADA:
+ switch (sub)
+ {
+ case SUBLANG_KANNADA_INDIA: return "kn_IN";
+ }
+ return "kn";
+ case LANG_KANURI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "kr_NG";
+ }
+ return "kr";
+ case LANG_KASHMIRI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ks_PK";
+ case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+ }
+ return "ks";
+ case LANG_KAZAK:
+ switch (sub)
+ {
+ case SUBLANG_KAZAK_KAZAKHSTAN: return "kk_KZ";
+ }
+ return "kk";
+ case LANG_KICHE:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_KICHE_GUATEMALA: return "qut_GT";
+ }
+ return "qut";
+ case LANG_KINYARWANDA:
+ switch (sub)
+ {
+ case SUBLANG_KINYARWANDA_RWANDA: return "rw_RW";
+ }
+ return "rw";
+ case LANG_KONKANI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_KONKANI_INDIA: return "kok_IN";
+ }
+ return "kok";
+ case LANG_KOREAN:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ko_KR";
+ }
+ return "ko";
+ case LANG_KYRGYZ:
+ switch (sub)
+ {
+ case SUBLANG_KYRGYZ_KYRGYZSTAN: return "ky_KG";
+ }
+ return "ky";
+ case LANG_LAO:
+ switch (sub)
+ {
+ case SUBLANG_LAO_LAOS: return "lo_LA";
+ }
+ return "lo";
+ case LANG_LATIN:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "la_VA";
+ }
+ return "la";
+ case LANG_LATVIAN:
+ switch (sub)
+ {
+ case SUBLANG_LATVIAN_LATVIA: return "lv_LV";
+ }
+ return "lv";
+ case LANG_LITHUANIAN:
+ switch (sub)
+ {
+ case SUBLANG_LITHUANIAN_LITHUANIA: return "lt_LT";
+ }
+ return "lt";
+ case LANG_LUXEMBOURGISH:
+ switch (sub)
+ {
+ case SUBLANG_LUXEMBOURGISH_LUXEMBOURG: return "lb_LU";
+ }
+ return "lb";
+ case LANG_MACEDONIAN:
+ switch (sub)
+ {
+ case SUBLANG_MACEDONIAN_MACEDONIA: return "mk_MK";
+ }
+ return "mk";
+ case LANG_MALAY:
+ switch (sub)
+ {
+ case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+ case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+ }
+ return "ms";
+ case LANG_MALAYALAM:
+ switch (sub)
+ {
+ case SUBLANG_MALAYALAM_INDIA: return "ml_IN";
+ }
+ return "ml";
+ case LANG_MALTESE:
+ switch (sub)
+ {
+ case SUBLANG_MALTESE_MALTA: return "mt_MT";
+ }
+ return "mt";
+ case LANG_MANIPURI:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "mni_IN";
+ }
+ return "mni";
+ case LANG_MAORI:
+ switch (sub)
+ {
+ case SUBLANG_MAORI_NEW_ZEALAND: return "mi_NZ";
+ }
+ return "mi";
+ case LANG_MAPUDUNGUN:
+ switch (sub)
+ {
+ case SUBLANG_MAPUDUNGUN_CHILE: return "arn_CL";
+ }
+ return "arn";
+ case LANG_MARATHI:
+ switch (sub)
+ {
+ case SUBLANG_MARATHI_INDIA: return "mr_IN";
+ }
+ return "mr";
+ case LANG_MOHAWK:
+ switch (sub)
+ {
+ case SUBLANG_MOHAWK_CANADA: return "moh_CA";
+ }
+ return "moh";
+ case LANG_MONGOLIAN:
+ switch (sub)
+ {
+ case SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA: case 0x1e: return "mn_MN";
+ case SUBLANG_MONGOLIAN_PRC: case 0x1f: return "mn_CN";
+ }
+ return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */
+ case LANG_NEPALI:
+ switch (sub)
+ {
+ case SUBLANG_NEPALI_NEPAL: return "ne_NP";
+ case SUBLANG_NEPALI_INDIA: return "ne_IN";
+ }
+ return "ne";
+ case LANG_NORWEGIAN:
+ switch (sub)
+ {
+ case 0x1f: return "nb";
+ case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";
+ case 0x1e: return "nn";
+ case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+ }
+ return "no";
+ case LANG_OCCITAN:
+ switch (sub)
+ {
+ case SUBLANG_OCCITAN_FRANCE: return "oc_FR";
+ }
+ return "oc";
+ case LANG_ORIYA:
+ switch (sub)
+ {
+ case SUBLANG_ORIYA_INDIA: return "or_IN";
+ }
+ return "or";
+ case LANG_OROMO:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "om_ET";
+ }
+ return "om";
+ case LANG_PAPIAMENTU:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "pap_AN";
+ }
+ return "pap";
+ case LANG_PASHTO:
+ switch (sub)
+ {
+ case SUBLANG_PASHTO_AFGHANISTAN: return "ps_AF";
+ }
+ return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */
+ case LANG_POLISH:
+ switch (sub)
+ {
+ case SUBLANG_POLISH_POLAND: return "pl_PL";
+ }
+ return "pl";
+ case LANG_PORTUGUESE:
+ switch (sub)
+ {
+ /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+ Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+ case SUBLANG_PORTUGUESE: return "pt_PT";
+ }
+ return "pt";
+ case LANG_PUNJABI:
+ switch (sub)
+ {
+ case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+ }
+ return "pa";
+ case LANG_QUECHUA:
+ /* Note: Microsoft uses the non-ISO language code "quz". */
+ switch (sub)
+ {
+ case SUBLANG_QUECHUA_BOLIVIA: return "qu_BO";
+ case SUBLANG_QUECHUA_ECUADOR: return "qu_EC";
+ case SUBLANG_QUECHUA_PERU: return "qu_PE";
+ }
+ return "qu";
+ case LANG_ROMANIAN:
+ switch (sub)
+ {
+ case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+ case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+ }
+ return "ro";
+ case LANG_ROMANSH:
+ switch (sub)
+ {
+ case SUBLANG_ROMANSH_SWITZERLAND: return "rm_CH";
+ }
+ return "rm";
+ case LANG_RUSSIAN:
+ switch (sub)
+ {
+ case SUBLANG_RUSSIAN_RUSSIA: return "ru_RU";
+ case SUBLANG_RUSSIAN_MOLDAVIA: return "ru_MD";
+ }
+ return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */
+ case LANG_SAMI:
+ switch (sub)
+ {
+ /* Northern Sami */
+ case 0x00: return "se";
+ case SUBLANG_SAMI_NORTHERN_NORWAY: return "se_NO";
+ case SUBLANG_SAMI_NORTHERN_SWEDEN: return "se_SE";
+ case SUBLANG_SAMI_NORTHERN_FINLAND: return "se_FI";
+ /* Lule Sami */
+ case 0x1f: return "smj";
+ case SUBLANG_SAMI_LULE_NORWAY: return "smj_NO";
+ case SUBLANG_SAMI_LULE_SWEDEN: return "smj_SE";
+ /* Southern Sami */
+ case 0x1e: return "sma";
+ case SUBLANG_SAMI_SOUTHERN_NORWAY: return "sma_NO";
+ case SUBLANG_SAMI_SOUTHERN_SWEDEN: return "sma_SE";
+ /* Skolt Sami */
+ case 0x1d: return "sms";
+ case SUBLANG_SAMI_SKOLT_FINLAND: return "sms_FI";
+ /* Inari Sami */
+ case 0x1c: return "smn";
+ case SUBLANG_SAMI_INARI_FINLAND: return "smn_FI";
+ }
+ return "se"; /* or "smi"? */
+ case LANG_SANSKRIT:
+ switch (sub)
+ {
+ case SUBLANG_SANSKRIT_INDIA: return "sa_IN";
+ }
+ return "sa";
+ case LANG_SCOTTISH_GAELIC:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "gd_GB";
+ }
+ return "gd";
+ case LANG_SINDHI:
+ switch (sub)
+ {
+ case SUBLANG_SINDHI_INDIA: return "sd_IN";
+ case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+ /*case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";*/
+ }
+ return "sd";
+ case LANG_SINHALESE:
+ switch (sub)
+ {
+ case SUBLANG_SINHALESE_SRI_LANKA: return "si_LK";
+ }
+ return "si";
+ case LANG_SLOVAK:
+ switch (sub)
+ {
+ case SUBLANG_SLOVAK_SLOVAKIA: return "sk_SK";
+ }
+ return "sk";
+ case LANG_SLOVENIAN:
+ switch (sub)
+ {
+ case SUBLANG_SLOVENIAN_SLOVENIA: return "sl_SI";
+ }
+ return "sl";
+ case LANG_SOMALI:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "so_SO";
+ }
+ return "so";
+ case LANG_SORBIAN:
+ /* FIXME: Adjust this when such locales appear on Unix. */
+ switch (sub)
+ {
+ /* Upper Sorbian */
+ case 0x00: return "hsb";
+ case SUBLANG_UPPER_SORBIAN_GERMANY: return "hsb_DE";
+ /* Lower Sorbian */
+ case 0x1f: return "dsb";
+ case SUBLANG_LOWER_SORBIAN_GERMANY: return "dsb_DE";
+ }
+ return "wen";
+ case LANG_SOTHO:
+ /* <http://www.microsoft.com/globaldev/reference/lcid-all.mspx> calls
+ it "Sepedi"; according to
+ <http://www.ethnologue.com/show_language.asp?code=nso>
+ <http://www.ethnologue.com/show_language.asp?code=sot>
+ it's the same as Northern Sotho. */
+ switch (sub)
+ {
+ case SUBLANG_SOTHO_SOUTH_AFRICA: return "nso_ZA";
+ }
+ return "nso";
+ case LANG_SPANISH:
+ switch (sub)
+ {
+ case SUBLANG_SPANISH: return "es_ES";
+ case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+ case SUBLANG_SPANISH_MODERN:
+ return "es_ES@modern"; /* not seen on Unix */
+ case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+ case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+ case SUBLANG_SPANISH_PANAMA: return "es_PA";
+ case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+ case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+ case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+ case SUBLANG_SPANISH_PERU: return "es_PE";
+ case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+ case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+ case SUBLANG_SPANISH_CHILE: return "es_CL";
+ case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+ case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+ case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+ case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+ case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+ case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+ case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+ case SUBLANG_SPANISH_US: return "es_US";
+ }
+ return "es";
+ case LANG_SUTU:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+ }
+ return "bnt";
+ case LANG_SWAHILI:
+ switch (sub)
+ {
+ case SUBLANG_SWAHILI_KENYA: return "sw_KE";
+ }
+ return "sw";
+ case LANG_SWEDISH:
+ switch (sub)
+ {
+ case SUBLANG_SWEDISH_SWEDEN: return "sv_SE";
+ case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+ }
+ return "sv";
+ case LANG_SYRIAC:
+ switch (sub)
+ {
+ case SUBLANG_SYRIAC_SYRIA: return "syr_SY"; /* An extinct language. */
+ }
+ return "syr";
+ case LANG_TAGALOG:
+ switch (sub)
+ {
+ case SUBLANG_TAGALOG_PHILIPPINES: return "tl_PH"; /* or "fil_PH"? */
+ }
+ return "tl"; /* or "fil"? */
+ case LANG_TAJIK:
+ switch (sub)
+ {
+ case 0x1f: return "tg";
+ case SUBLANG_TAJIK_TAJIKISTAN: return "tg_TJ";
+ }
+ return "tg";
+ case LANG_TAMAZIGHT:
+ /* Note: Microsoft uses the non-ISO language code "tmz". */
+ switch (sub)
+ {
+ /* FIXME: Adjust this when Tamazight locales appear on Unix. */
+ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
+ case 0x1f: return "ber@latin";
+ case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ@latin";
+ }
+ return "ber";
+ case LANG_TAMIL:
+ switch (sub)
+ {
+ case SUBLANG_TAMIL_INDIA: return "ta_IN";
+ }
+ return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */
+ case LANG_TATAR:
+ switch (sub)
+ {
+ case SUBLANG_TATAR_RUSSIA: return "tt_RU";
+ }
+ return "tt";
+ case LANG_TELUGU:
+ switch (sub)
+ {
+ case SUBLANG_TELUGU_INDIA: return "te_IN";
+ }
+ return "te";
+ case LANG_THAI:
+ switch (sub)
+ {
+ case SUBLANG_THAI_THAILAND: return "th_TH";
+ }
+ return "th";
+ case LANG_TIBETAN:
+ switch (sub)
+ {
+ case SUBLANG_TIBETAN_PRC:
+ /* Most Tibetans would not like "bo_CN". But Tibet does not yet
+ have a country code of its own. */
+ return "bo";
+ case SUBLANG_TIBETAN_BHUTAN: return "bo_BT";
+ }
+ return "bo";
+ case LANG_TIGRINYA:
+ switch (sub)
+ {
+ case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+ case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+ }
+ return "ti";
+ case LANG_TSONGA:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ts_ZA";
+ }
+ return "ts";
+ case LANG_TSWANA:
+ /* Spoken in South Africa, Botswana. */
+ switch (sub)
+ {
+ case SUBLANG_TSWANA_SOUTH_AFRICA: return "tn_ZA";
+ }
+ return "tn";
+ case LANG_TURKISH:
+ switch (sub)
+ {
+ case SUBLANG_TURKISH_TURKEY: return "tr_TR";
+ }
+ return "tr";
+ case LANG_TURKMEN:
+ switch (sub)
+ {
+ case SUBLANG_TURKMEN_TURKMENISTAN: return "tk_TM";
+ }
+ return "tk";
+ case LANG_UIGHUR:
+ switch (sub)
+ {
+ case SUBLANG_UIGHUR_PRC: return "ug_CN";
+ }
+ return "ug";
+ case LANG_UKRAINIAN:
+ switch (sub)
+ {
+ case SUBLANG_UKRAINIAN_UKRAINE: return "uk_UA";
+ }
+ return "uk";
+ case LANG_URDU:
+ switch (sub)
+ {
+ case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+ case SUBLANG_URDU_INDIA: return "ur_IN";
+ }
+ return "ur";
+ case LANG_UZBEK:
+ switch (sub)
+ {
+ case 0x1f: return "uz";
+ case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+ case 0x1e: return "uz@cyrillic";
+ case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+ }
+ return "uz";
+ case LANG_VENDA:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "ve_ZA";
+ }
+ return "ve";
+ case LANG_VIETNAMESE:
+ switch (sub)
+ {
+ case SUBLANG_VIETNAMESE_VIETNAM: return "vi_VN";
+ }
+ return "vi";
+ case LANG_WELSH:
+ switch (sub)
+ {
+ case SUBLANG_WELSH_UNITED_KINGDOM: return "cy_GB";
+ }
+ return "cy";
+ case LANG_WOLOF:
+ switch (sub)
+ {
+ case SUBLANG_WOLOF_SENEGAL: return "wo_SN";
+ }
+ return "wo";
+ case LANG_XHOSA:
+ switch (sub)
+ {
+ case SUBLANG_XHOSA_SOUTH_AFRICA: return "xh_ZA";
+ }
+ return "xh";
+ case LANG_YAKUT:
+ switch (sub)
+ {
+ case SUBLANG_YAKUT_RUSSIA: return "sah_RU";
+ }
+ return "sah";
+ case LANG_YI:
+ switch (sub)
+ {
+ case SUBLANG_YI_PRC: return "ii_CN";
+ }
+ return "ii";
+ case LANG_YIDDISH:
+ switch (sub)
+ {
+ case SUBLANG_DEFAULT: return "yi_IL";
+ }
+ return "yi";
+ case LANG_YORUBA:
+ switch (sub)
+ {
+ case SUBLANG_YORUBA_NIGERIA: return "yo_NG";
+ }
+ return "yo";
+ case LANG_ZULU:
+ switch (sub)
+ {
+ case SUBLANG_ZULU_SOUTH_AFRICA: return "zu_ZA";
+ }
+ return "zu";
+ default: return "C";
+ }
+ }
+}
+
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_from_win32_LCID (LCID lcid)
+{
+ LANGID langid;
+
+ /* Strip off the sorting rules, keep only the language part. */
+ langid = LANGIDFROMLCID (lcid);
+
+ return gl_locale_name_from_win32_LANGID (langid);
+}
+
+#endif
+
+
+#if HAVE_USELOCALE /* glibc or MacOS X */
+
+/* Simple hash set of strings. We don't want to drag in lots of hash table
+ code here. */
+
+# define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See http://www.haible.de/bruno/hashfunc.html. */
+static size_t
+string_hash (const void *x)
+{
+ const char *s = (const char *) x;
+ size_t h = 0;
+
+ for (; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h;
+}
+
+/* A hash table of fixed size. Multiple threads can access it read-only
+ simultaneously, but only one thread can insert into it at the same time. */
+
+/* A node in a hash bucket collision list. */
+struct hash_node
+ {
+ struct hash_node * volatile next;
+ char contents[100]; /* has variable size */
+ };
+
+# define HASH_TABLE_SIZE 257
+static struct hash_node * volatile struniq_hash_table[HASH_TABLE_SIZE]
+ /* = { NULL, ..., NULL } */;
+
+/* This lock protects the struniq_hash_table against multiple simultaneous
+ insertions. */
+gl_lock_define_initialized(static, struniq_lock)
+
+/* Store a copy of the given string in a string pool with indefinite extent.
+ Return a pointer to this copy. */
+static const char *
+struniq (const char *string)
+{
+ size_t hashcode = string_hash (string);
+ size_t slot = hashcode % HASH_TABLE_SIZE;
+ size_t size;
+ struct hash_node *new_node;
+ struct hash_node *p;
+ for (p = struniq_hash_table[slot]; p != NULL; p = p->next)
+ if (strcmp (p->contents, string) == 0)
+ return p->contents;
+ size = strlen (string) + 1;
+ new_node =
+ (struct hash_node *)
+ malloc (offsetof (struct hash_node, contents[0]) + size);
+ if (new_node == NULL)
+ /* Out of memory. Return a statically allocated string. */
+ return "C";
+ memcpy (new_node->contents, string, size);
+ /* Lock while inserting new_node. */
+ gl_lock_lock (struniq_lock);
+ /* Check whether another thread already added the string while we were
+ waiting on the lock. */
+ for (p = struniq_hash_table[slot]; p != NULL; p = p->next)
+ if (strcmp (p->contents, string) == 0)
+ {
+ free (new_node);
+ new_node = p;
+ goto done;
+ }
+ /* Really insert new_node into the hash table. Fill new_node entirely first,
+ because other threads may be iterating over the linked list. */
+ new_node->next = struniq_hash_table[slot];
+ struniq_hash_table[slot] = new_node;
+ done:
+ /* Unlock after new_node is inserted. */
+ gl_lock_unlock (struniq_lock);
+ return new_node->contents;
+}
+
+#endif
+
+
+#if defined IN_LIBINTL || HAVE_USELOCALE
+
+/* Like gl_locale_name_thread, except that the result is not in storage of
+ indefinite extent. */
+# if !defined IN_LIBINTL
+static
+# endif
+const char *
+gl_locale_name_thread_unsafe (int category, const char *categoryname)
+{
+# if HAVE_USELOCALE
+ {
+ locale_t thread_locale = uselocale (NULL);
+ if (thread_locale != LC_GLOBAL_LOCALE)
+ {
+# if __GLIBC__ >= 2 && !defined __UCLIBC__
+ /* Work around an incorrect definition of the _NL_LOCALE_NAME macro in
+ glibc < 2.12.
+ See <http://sourceware.org/bugzilla/show_bug.cgi?id=10968>. */
+ const char *name =
+ nl_langinfo (_NL_ITEM ((category), _NL_ITEM_INDEX (-1)));
+ if (name[0] == '\0')
+ /* Fallback code for glibc < 2.4, which did not implement
+ nl_langinfo (_NL_LOCALE_NAME (category)). */
+ name = thread_locale->__names[category];
+ return name;
+# endif
+# if defined __APPLE__ && defined __MACH__ /* MacOS X */
+ /* The locale name is found deep in an undocumented data structure.
+ Since it's stored in a buffer of size 32 and newlocale() rejects
+ locale names of length > 31, we can assume that it is NUL terminated
+ in this buffer. But we need to make a copy of the locale name, of
+ indefinite extent. */
+ struct _xlocale_part1_v0 /* used in MacOS X 10.5 */
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ __darwin_mbstate_t __mbs[10];
+ int64_t __magic;
+ };
+ struct _xlocale_part1_v1 /* used in MacOS X >= 10.6.0 */
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ __darwin_mbstate_t __mbs[10];
+ /*pthread_lock_t*/ int __lock;
+ int64_t __magic;
+ };
+ struct _xlocale_part2
+ {
+ int64_t __magic;
+ unsigned char __collate_load_error;
+ unsigned char __collate_substitute_nontrivial;
+ unsigned char _messages_using_locale;
+ unsigned char _monetary_using_locale;
+ unsigned char _numeric_using_locale;
+ unsigned char _time_using_locale;
+ unsigned char __mlocale_changed;
+ unsigned char __nlocale_changed;
+ unsigned char __numeric_fp_cvt;
+ struct __xlocale_st_collate *__lc_collate;
+ struct __xlocale_st_runelocale *__lc_ctype;
+ struct __xlocale_st_messages *__lc_messages;
+ struct __xlocale_st_monetary *__lc_monetary;
+ struct __xlocale_st_numeric *__lc_numeric;
+ struct _xlocale *__lc_numeric_loc;
+ struct __xlocale_st_time *__lc_time;
+ /* more */
+ };
+ struct __xlocale_st_collate
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char __encoding[32];
+ /* more */
+ };
+ struct __xlocale_st_runelocale
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char __ctype_encoding[32];
+ /* more */
+ };
+ struct __xlocale_st_messages
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_messages_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_monetary
+ {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_monetary_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_numeric {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_numeric_locale_buf;
+ /* more */
+ };
+ struct __xlocale_st_time {
+ int32_t __refcount;
+ void (*__free_extra)(void *);
+ char *_time_locale_buf;
+ /* more */
+ };
+ struct _xlocale_part2 *tlp;
+ if (((struct _xlocale_part1_v0 *) thread_locale)->__magic
+ == 0x786C6F63616C6530LL)
+ /* MacOS X 10.5 */
+ tlp =
+ (struct _xlocale_part2 *)
+ &((struct _xlocale_part1_v0 *) thread_locale)->__magic;
+ else if (((struct _xlocale_part1_v1 *) thread_locale)->__magic
+ == 0x786C6F63616C6530LL)
+ /* MacOS X >= 10.6.0 */
+ tlp =
+ (struct _xlocale_part2 *)
+ &((struct _xlocale_part1_v1 *) thread_locale)->__magic;
+ else
+ /* Unsupported version of MacOS X: The internals of 'struct _xlocale'
+ have changed again. */
+ return "";
+ switch (category)
+ {
+ case LC_CTYPE:
+ return tlp->__lc_ctype->__ctype_encoding;
+ case LC_NUMERIC:
+ return tlp->_numeric_using_locale
+ ? tlp->__lc_numeric->_numeric_locale_buf
+ : "C";
+ case LC_TIME:
+ return tlp->_time_using_locale
+ ? tlp->__lc_time->_time_locale_buf
+ : "C";
+ case LC_COLLATE:
+ return !tlp->__collate_load_error
+ ? tlp->__lc_collate->__encoding
+ : "C";
+ case LC_MONETARY:
+ return tlp->_monetary_using_locale
+ ? tlp->__lc_monetary->_monetary_locale_buf
+ : "C";
+ case LC_MESSAGES:
+ return tlp->_messages_using_locale
+ ? tlp->__lc_messages->_messages_locale_buf
+ : "C";
+ default: /* We shouldn't get here. */
+ return "";
+ }
+# endif
+ }
+ }
+# endif
+ return NULL;
+}
+
+#endif
+
+const char *
+gl_locale_name_thread (int category, const char *categoryname)
+{
+#if HAVE_USELOCALE
+ const char *name = gl_locale_name_thread_unsafe (category, categoryname);
+ if (name != NULL)
+ return struniq (name);
+#endif
+ return NULL;
+}
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+ "Directs 'setlocale()' to query 'category' and return the current
+ setting of 'local'."
+ However it does not specify the exact format. Neither do SUSV2 and
+ ISO C 99. So we can use this feature only on selected systems (e.g.
+ those using GNU C Library). */
+#if defined _LIBC || ((defined __GLIBC__ && __GLIBC__ >= 2) && !defined __UCLIBC__)
+# define HAVE_LOCALE_NULL
+#endif
+
+const char *
+gl_locale_name_posix (int category, const char *categoryname)
+{
+ /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+ On some systems this can be done by the 'setlocale' function itself. */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ return setlocale (category, NULL);
+#else
+ /* On other systems we ignore what setlocale reports and instead look at the
+ environment variables directly. This is necessary
+ 1. on systems which have a facility for customizing the default locale
+ (MacOS X, native Windows, Cygwin) and where the system's setlocale()
+ function ignores this default locale (MacOS X, Cygwin), in two cases:
+ a. when the user missed to use the setlocale() override from libintl
+ (for example by not including <libintl.h>),
+ b. when setlocale supports only the "C" locale, such as on Cygwin
+ 1.5.x. In this case even the override from libintl cannot help.
+ 2. on all systems where setlocale supports only the "C" locale. */
+ /* Strictly speaking, it is a POSIX violation to look at the environment
+ variables regardless whether setlocale has been called or not. POSIX
+ says:
+ "For C-language programs, the POSIX locale shall be the
+ default locale when the setlocale() function is not called."
+ But we assume that all programs that use internationalized APIs call
+ setlocale (LC_ALL, ""). */
+ return gl_locale_name_environ (category, categoryname);
+#endif
+}
+
+const char *
+gl_locale_name_environ (int category, const char *categoryname)
+{
+ const char *retval;
+
+ /* Setting of LC_ALL overrides all other. */
+ retval = getenv ("LC_ALL");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval != NULL && retval[0] != '\0')
+ {
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+ /* MacOS X 10.2 or newer.
+ Ignore invalid LANG value set by the Terminal application. */
+ if (strcmp (retval, "UTF-8") != 0)
+#endif
+#if defined __CYGWIN__
+ /* Cygwin.
+ Ignore dummy LANG value set by ~/.profile. */
+ if (strcmp (retval, "C.UTF-8") != 0)
+#endif
+ return retval;
+ }
+
+ return NULL;
+}
+
+const char *
+gl_locale_name_default (void)
+{
+ /* POSIX:2001 says:
+ "All implementations shall define a locale as the default locale, to be
+ invoked when no environment variables are set, or set to the empty
+ string. This default locale can be the POSIX locale or any other
+ implementation-defined locale. Some implementations may provide
+ facilities for local installation administrators to set the default
+ locale, customizing it for each location. POSIX:2001 does not require
+ such a facility.
+
+ The systems with such a facility are MacOS X and Windows: They provide a
+ GUI that allows the user to choose a locale.
+ - On MacOS X, by default, none of LC_* or LANG are set. Starting with
+ MacOS X 10.4 or 10.5, LANG is set for processes launched by the
+ 'Terminal' application (but sometimes to an incorrect value "UTF-8").
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C" locale.
+ - On native Windows, by default, none of LC_* or LANG are set.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ locale chosen by the user.
+ - On Cygwin 1.5.x, by default, none of LC_* or LANG are set.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C" locale.
+ - On Cygwin 1.7, by default, LANG is set to "C.UTF-8" when the default
+ ~/.profile is executed.
+ When no environment variable is set, setlocale (LC_ALL, "") uses the
+ "C.UTF-8" locale, which operates in the same way as the "C" locale.
+ */
+
+#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined WIN32_NATIVE || defined __CYGWIN__)
+
+ /* The system does not have a way of setting the locale, other than the
+ POSIX specified environment variables. We use C as default locale. */
+ return "C";
+
+#else
+
+ /* Return an XPG style locale name language[_territory][@modifier].
+ Don't even bother determining the codeset; it's not useful in this
+ context, because message catalogs are not specific to a single
+ codeset. */
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+ /* MacOS X 10.2 or newer */
+ {
+ /* Cache the locale name, since CoreFoundation calls are expensive. */
+ static const char *cached_localename;
+
+ if (cached_localename == NULL)
+ {
+ char namebuf[256];
+# if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */
+ CFLocaleRef locale = CFLocaleCopyCurrent ();
+ CFStringRef name = CFLocaleGetIdentifier (locale);
+
+ if (CFStringGetCString (name, namebuf, sizeof (namebuf),
+ kCFStringEncodingASCII))
+ {
+ gl_locale_name_canonicalize (namebuf);
+ cached_localename = strdup (namebuf);
+ }
+ CFRelease (locale);
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+ CFTypeRef value =
+ CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),
+ kCFPreferencesCurrentApplication);
+ if (value != NULL
+ && CFGetTypeID (value) == CFStringGetTypeID ()
+ && CFStringGetCString ((CFStringRef)value,
+ namebuf, sizeof (namebuf),
+ kCFStringEncodingASCII))
+ {
+ gl_locale_name_canonicalize (namebuf);
+ cached_localename = strdup (namebuf);
+ }
+# endif
+ if (cached_localename == NULL)
+ cached_localename = "C";
+ }
+ return cached_localename;
+ }
+
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__ /* WIN32 or Cygwin */
+ {
+ LCID lcid;
+
+ /* Use native Win32 API locale ID. */
+ lcid = GetThreadLocale ();
+
+ return gl_locale_name_from_win32_LCID (lcid);
+ }
+# endif
+#endif
+}
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+ language[_territory][.codeset][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+
+const char *
+gl_locale_name (int category, const char *categoryname)
+{
+ const char *retval;
+
+ retval = gl_locale_name_thread (category, categoryname);
+ if (retval != NULL)
+ return retval;
+
+ retval = gl_locale_name_posix (category, categoryname);
+ if (retval != NULL)
+ return retval;
+
+ return gl_locale_name_default ();
+}
diff --git a/gnulib/lib/localename.h b/gnulib/lib/localename.h
new file mode 100644
index 0000000..118a426
--- /dev/null
+++ b/gnulib/lib/localename.h
@@ -0,0 +1,95 @@
+/* Determine name of the currently selected locale.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_LOCALENAME_H
+#define _GL_LOCALENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's name.
+ It considers both the POSIX notion of locale name (see functions
+ gl_locale_name_thread and gl_locale_name_posix) and the system notion
+ of locale name (see function gl_locale_name_default).
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name (int category, const char *categoryname);
+
+/* Determine the current per-thread locale's name, as specified by uselocale()
+ calls.
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ or NULL if no locale has been specified for the current thread.
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_thread (int category, const char *categoryname);
+
+/* Determine the thread-independent current locale's name, as specified by
+ setlocale() calls or by environment variables.
+ CATEGORY is a locale category abbreviation, as defined in <locale.h>,
+ but not LC_ALL. E.g. LC_MESSAGES.
+ CATEGORYNAME is the name of CATEGORY as a string, e.g. "LC_MESSAGES".
+ Return the locale category's name, canonicalized into XPG syntax
+ language[_territory][.codeset][@modifier]
+ or NULL if no locale has been specified to setlocale() or by environment
+ variables.
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_posix (int category, const char *categoryname);
+
+/* Determine the default locale's name, as specified by environment
+ variables.
+ Return the locale category's name, or NULL if no locale has been specified
+ by environment variables.
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_environ (int category, const char *categoryname);
+
+/* Determine the default locale's name. This is the current locale's name,
+ if not specified by uselocale() calls, by setlocale() calls, or by
+ environment variables. This locale name is usually determined by systems
+ settings that the user can manipulate through a GUI.
+
+ Quoting POSIX:2001:
+ "All implementations shall define a locale as the default locale,
+ to be invoked when no environment variables are set, or set to the
+ empty string. This default locale can be the C locale or any other
+ implementation-defined locale. Some implementations may provide
+ facilities for local installation administrators to set the default
+ locale, customizing it for each location. IEEE Std 1003.1-2001 does
+ not require such a facility."
+
+ The result must not be freed; it is statically allocated. */
+extern const char * gl_locale_name_default (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GL_LOCALENAME_H */
diff --git a/gnulib/lib/log10f.c b/gnulib/lib/log10f.c
new file mode 100644
index 0000000..ad50c53
--- /dev/null
+++ b/gnulib/lib/log10f.c
@@ -0,0 +1,26 @@
+/* Base 10 logarithmic function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+log10f (float x)
+{
+ return (float) log10 ((double) x);
+}
diff --git a/gnulib/lib/logf.c b/gnulib/lib/logf.c
new file mode 100644
index 0000000..684e9f3
--- /dev/null
+++ b/gnulib/lib/logf.c
@@ -0,0 +1,26 @@
+/* Natural logarithmic function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+logf (float x)
+{
+ return (float) log ((double) x);
+}
diff --git a/gnulib/lib/login_tty.c b/gnulib/lib/login_tty.c
new file mode 100644
index 0000000..d959df9
--- /dev/null
+++ b/gnulib/lib/login_tty.c
@@ -0,0 +1,75 @@
+/* Assign a given terminal as controlling terminal and as standard input,
+ standard output, standard error of the current process.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Currently no specification header. */
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+int
+login_tty (int slave_fd)
+{
+ int i;
+
+ /* Create a new session. */
+ setsid ();
+
+ /* Make fd the controlling terminal for the current process.
+ On BSD and OSF/1: There is ioctl TIOCSCTTY for this purpose.
+ On Solaris:
+ A terminal becomes the controlling terminal of a session
+ if it is being open()ed, at a moment when
+ 1. it is not already the controlling terminal of some session, and
+ 2. the process that open()s it is a session leader that does not have
+ a controlling terminal.
+ We assume condition 1, try to ensure condition 2, and then open() it.
+ */
+ for (i = 0; i < 3; i++)
+ if (i != slave_fd)
+ close (i);
+#ifdef TIOCSCTTY
+ if (ioctl (slave_fd, TIOCSCTTY, NULL) < 0)
+ return -1;
+#else
+ {
+ char *slave_name;
+ int dummy_fd;
+
+ slave_name = ttyname (slave_fd);
+ if (slave_name == NULL)
+ return -1;
+ dummy_fd = open (slave_name, O_RDWR);
+ if (dummy_fd < 0)
+ return -1;
+ close (dummy_fd);
+ }
+#endif
+
+ /* Assign fd to the standard input, standard output, and standard error of
+ the current process. */
+ for (i = 0; i < 3; i++)
+ if (slave_fd != i)
+ if (dup2 (slave_fd, i) < 0)
+ return -1;
+ if (slave_fd >= 3)
+ close (slave_fd);
+
+ return 0;
+}
diff --git a/gnulib/lib/logl.c b/gnulib/lib/logl.c
new file mode 100644
index 0000000..42c50cb
--- /dev/null
+++ b/gnulib/lib/logl.c
@@ -0,0 +1,273 @@
+/* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+logl (long double x)
+{
+ return log (x);
+}
+
+#else
+
+/* logll.c
+ *
+ * Natural logarithm for 128-bit long double precision.
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, logl();
+ *
+ * y = logl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Returns the base e (2.718...) logarithm of x.
+ *
+ * The argument is separated into its exponent and fractional
+ * parts. Use of a lookup table increases the speed of the routine.
+ * The program uses logarithms tabulated at intervals of 1/128 to
+ * cover the domain from approximately 0.7 to 1.4.
+ *
+ * On the interval [-1/128, +1/128] the logarithm of 1+x is approximated by
+ * log(1+x) = x - 0.5 x^2 + x^3 P(x) .
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0.875, 1.125 100000 1.2e-34 4.1e-35
+ * IEEE 0.125, 8 100000 1.2e-34 4.1e-35
+ *
+ *
+ * WARNING:
+ *
+ * This program uses integer operations on bit fields of floating-point
+ * numbers. It does not work with data structures other than the
+ * structure assumed.
+ *
+ */
+
+/* log(1+x) = x - .5 x^2 + x^3 l(x)
+ -.0078125 <= x <= +.0078125
+ peak relative error 1.2e-37 */
+static const long double
+l3 = 3.333333333333333333333333333333336096926E-1L,
+l4 = -2.499999999999999999999999999486853077002E-1L,
+l5 = 1.999999999999999999999999998515277861905E-1L,
+l6 = -1.666666666666666666666798448356171665678E-1L,
+l7 = 1.428571428571428571428808945895490721564E-1L,
+l8 = -1.249999999999999987884655626377588149000E-1L,
+l9 = 1.111111111111111093947834982832456459186E-1L,
+l10 = -1.000000000000532974938900317952530453248E-1L,
+l11 = 9.090909090915566247008015301349979892689E-2L,
+l12 = -8.333333211818065121250921925397567745734E-2L,
+l13 = 7.692307559897661630807048686258659316091E-2L,
+l14 = -7.144242754190814657241902218399056829264E-2L,
+l15 = 6.668057591071739754844678883223432347481E-2L;
+
+/* Lookup table of ln(t) - (t-1)
+ t = 0.5 + (k+26)/128)
+ k = 0, ..., 91 */
+static const long double logtbl[92] = {
+-5.5345593589352099112142921677820359632418E-2L,
+-5.2108257402767124761784665198737642086148E-2L,
+-4.8991686870576856279407775480686721935120E-2L,
+-4.5993270766361228596215288742353061431071E-2L,
+-4.3110481649613269682442058976885699556950E-2L,
+-4.0340872319076331310838085093194799765520E-2L,
+-3.7682072451780927439219005993827431503510E-2L,
+-3.5131785416234343803903228503274262719586E-2L,
+-3.2687785249045246292687241862699949178831E-2L,
+-3.0347913785027239068190798397055267411813E-2L,
+-2.8110077931525797884641940838507561326298E-2L,
+-2.5972247078357715036426583294246819637618E-2L,
+-2.3932450635346084858612873953407168217307E-2L,
+-2.1988775689981395152022535153795155900240E-2L,
+-2.0139364778244501615441044267387667496733E-2L,
+-1.8382413762093794819267536615342902718324E-2L,
+-1.6716169807550022358923589720001638093023E-2L,
+-1.5138929457710992616226033183958974965355E-2L,
+-1.3649036795397472900424896523305726435029E-2L,
+-1.2244881690473465543308397998034325468152E-2L,
+-1.0924898127200937840689817557742469105693E-2L,
+-9.6875626072830301572839422532631079809328E-3L,
+-8.5313926245226231463436209313499745894157E-3L,
+-7.4549452072765973384933565912143044991706E-3L,
+-6.4568155251217050991200599386801665681310E-3L,
+-5.5356355563671005131126851708522185605193E-3L,
+-4.6900728132525199028885749289712348829878E-3L,
+-3.9188291218610470766469347968659624282519E-3L,
+-3.2206394539524058873423550293617843896540E-3L,
+-2.5942708080877805657374888909297113032132E-3L,
+-2.0385211375711716729239156839929281289086E-3L,
+-1.5522183228760777967376942769773768850872E-3L,
+-1.1342191863606077520036253234446621373191E-3L,
+-7.8340854719967065861624024730268350459991E-4L,
+-4.9869831458030115699628274852562992756174E-4L,
+-2.7902661731604211834685052867305795169688E-4L,
+-1.2335696813916860754951146082826952093496E-4L,
+-3.0677461025892873184042490943581654591817E-5L,
+# define ZERO logtbl[38]
+ 0.0000000000000000000000000000000000000000E0L,
+-3.0359557945051052537099938863236321874198E-5L,
+-1.2081346403474584914595395755316412213151E-4L,
+-2.7044071846562177120083903771008342059094E-4L,
+-4.7834133324631162897179240322783590830326E-4L,
+-7.4363569786340080624467487620270965403695E-4L,
+-1.0654639687057968333207323853366578860679E-3L,
+-1.4429854811877171341298062134712230604279E-3L,
+-1.8753781835651574193938679595797367137975E-3L,
+-2.3618380914922506054347222273705859653658E-3L,
+-2.9015787624124743013946600163375853631299E-3L,
+-3.4938307889254087318399313316921940859043E-3L,
+-4.1378413103128673800485306215154712148146E-3L,
+-4.8328735414488877044289435125365629849599E-3L,
+-5.5782063183564351739381962360253116934243E-3L,
+-6.3731336597098858051938306767880719015261E-3L,
+-7.2169643436165454612058905294782949315193E-3L,
+-8.1090214990427641365934846191367315083867E-3L,
+-9.0486422112807274112838713105168375482480E-3L,
+-1.0035177140880864314674126398350812606841E-2L,
+-1.1067990155502102718064936259435676477423E-2L,
+-1.2146457974158024928196575103115488672416E-2L,
+-1.3269969823361415906628825374158424754308E-2L,
+-1.4437927104692837124388550722759686270765E-2L,
+-1.5649743073340777659901053944852735064621E-2L,
+-1.6904842527181702880599758489058031645317E-2L,
+-1.8202661505988007336096407340750378994209E-2L,
+-1.9542647000370545390701192438691126552961E-2L,
+-2.0924256670080119637427928803038530924742E-2L,
+-2.2346958571309108496179613803760727786257E-2L,
+-2.3810230892650362330447187267648486279460E-2L,
+-2.5313561699385640380910474255652501521033E-2L,
+-2.6856448685790244233704909690165496625399E-2L,
+-2.8438398935154170008519274953860128449036E-2L,
+-3.0058928687233090922411781058956589863039E-2L,
+-3.1717563112854831855692484086486099896614E-2L,
+-3.3413836095418743219397234253475252001090E-2L,
+-3.5147290019036555862676702093393332533702E-2L,
+-3.6917475563073933027920505457688955423688E-2L,
+-3.8723951502862058660874073462456610731178E-2L,
+-4.0566284516358241168330505467000838017425E-2L,
+-4.2444048996543693813649967076598766917965E-2L,
+-4.4356826869355401653098777649745233339196E-2L,
+-4.6304207416957323121106944474331029996141E-2L,
+-4.8285787106164123613318093945035804818364E-2L,
+-5.0301169421838218987124461766244507342648E-2L,
+-5.2349964705088137924875459464622098310997E-2L,
+-5.4431789996103111613753440311680967840214E-2L,
+-5.6546268881465384189752786409400404404794E-2L,
+-5.8693031345788023909329239565012647817664E-2L,
+-6.0871713627532018185577188079210189048340E-2L,
+-6.3081958078862169742820420185833800925568E-2L,
+-6.5323413029406789694910800219643791556918E-2L,
+-6.7595732653791419081537811574227049288168E-2L
+};
+
+/* ln(2) = ln2a + ln2b with extended precision. */
+static const long double
+ ln2a = 6.93145751953125e-1L,
+ ln2b = 1.4286068203094172321214581765680755001344E-6L;
+
+long double
+logl (long double x)
+{
+ long double z, y, w;
+ long double t;
+ int k, e;
+
+ /* Check for IEEE special cases. */
+
+ /* log(NaN) = NaN. */
+ if (isnanl (x))
+ {
+ return x;
+ }
+ /* log(0) = -infinity. */
+ if (x == 0.0L)
+ {
+ return -0.5L / ZERO;
+ }
+ /* log ( x < 0 ) = NaN */
+ if (x < 0.0L)
+ {
+ return (x - x) / ZERO;
+ }
+ /* log (infinity) */
+ if (x + x == x)
+ {
+ return x + x;
+ }
+
+ /* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */
+ x = frexpl (x, &e);
+ if (x < 0.703125L)
+ {
+ x += x;
+ e--;
+ }
+
+ /* On this interval the table is not used due to cancellation error. */
+ if ((x <= 1.0078125L) && (x >= 0.9921875L))
+ {
+ z = x - 1.0L;
+ k = 64;
+ t = 1.0L;
+ }
+ else
+ {
+ k = floorl ((x - 0.5L) * 128.0L);
+ t = 0.5L + k / 128.0L;
+ z = (x - t) / t;
+ }
+
+ /* Series expansion of log(1+z). */
+ w = z * z;
+ y = ((((((((((((l15 * z
+ + l14) * z
+ + l13) * z
+ + l12) * z
+ + l11) * z
+ + l10) * z
+ + l9) * z
+ + l8) * z
+ + l7) * z
+ + l6) * z
+ + l5) * z
+ + l4) * z
+ + l3) * z * w;
+ y -= 0.5 * w;
+ y += e * ln2b; /* Base 2 exponent offset times ln(2). */
+ y += z;
+ y += logtbl[k-26]; /* log(t) - (t-1) */
+ y += (t - 1.0L);
+ y += e * ln2a;
+ return y;
+}
+
+#endif
diff --git a/gnulib/lib/long-options.c b/gnulib/lib/long-options.c
new file mode 100644
index 0000000..0b86276
--- /dev/null
+++ b/gnulib/lib/long-options.c
@@ -0,0 +1,88 @@
+/* Utility to accept --help and --version options as unobtrusively as possible.
+
+ Copyright (C) 1993-1994, 1998-2000, 2002-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "long-options.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+#include "version-etc.h"
+
+static struct option const long_options[] =
+{
+ {"help", no_argument, NULL, 'h'},
+ {"version", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+};
+
+/* Process long options --help and --version, but only if argc == 2.
+ Be careful not to gobble up `--'. */
+
+void
+parse_long_options (int argc,
+ char **argv,
+ const char *command_name,
+ const char *package,
+ const char *version,
+ void (*usage_func) (int),
+ /* const char *author1, ...*/ ...)
+{
+ int c;
+ int saved_opterr;
+
+ saved_opterr = opterr;
+
+ /* Don't print an error message for unrecognized options. */
+ opterr = 0;
+
+ if (argc == 2
+ && (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ (*usage_func) (EXIT_SUCCESS);
+
+ case 'v':
+ {
+ va_list authors;
+ va_start (authors, usage_func);
+ version_etc_va (stdout, command_name, package, version, authors);
+ exit (0);
+ }
+
+ default:
+ /* Don't process any other long-named options. */
+ break;
+ }
+ }
+
+ /* Restore previous value. */
+ opterr = saved_opterr;
+
+ /* Reset this to zero so that getopt internals get initialized from
+ the probably-new parameters when/if getopt is called later. */
+ optind = 0;
+}
diff --git a/gnulib/lib/long-options.h b/gnulib/lib/long-options.h
new file mode 100644
index 0000000..12d3e0e
--- /dev/null
+++ b/gnulib/lib/long-options.h
@@ -0,0 +1,26 @@
+/* long-options.h -- declaration for --help- and --version-handling function.
+ Copyright (C) 1993-1994, 1998-1999, 2003, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+void parse_long_options (int _argc,
+ char **_argv,
+ const char *_command_name,
+ const char *_package,
+ const char *_version,
+ void (*_usage) (int),
+ /* const char *author1, ...*/ ...);
diff --git a/gnulib/lib/lseek.c b/gnulib/lib/lseek.c
new file mode 100644
index 0000000..134e8b7
--- /dev/null
+++ b/gnulib/lib/lseek.c
@@ -0,0 +1,64 @@
+/* An lseek() function that detects pipes.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms. */
+/* Get GetFileType. */
+# include <windows.h>
+/* Get _get_osfhandle. */
+# include "msvc-nothrow.h"
+#else
+# include <sys/stat.h>
+#endif
+#include <errno.h>
+
+#undef lseek
+
+off_t
+rpl_lseek (int fd, off_t offset, int whence)
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (GetFileType (h) != FILE_TYPE_DISK)
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#else
+ /* BeOS lseek mistakenly succeeds on pipes... */
+ struct stat statbuf;
+ if (fstat (fd, &statbuf) < 0)
+ return -1;
+ if (!S_ISREG (statbuf.st_mode))
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#endif
+ return lseek (fd, offset, whence);
+}
diff --git a/gnulib/lib/lstat.c b/gnulib/lib/lstat.c
new file mode 100644
index 0000000..d786288
--- /dev/null
+++ b/gnulib/lib/lstat.c
@@ -0,0 +1,97 @@
+/* Work around a bug of lstat on some systems
+
+ Copyright (C) 1997-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_lstat doesn't recurse to
+ rpl_lstat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+#if !HAVE_LSTAT
+/* On systems that lack symlinks, our replacement <sys/stat.h> already
+ defined lstat as stat, so there is nothing further to do other than
+ avoid an empty file. */
+typedef int dummy;
+#else /* HAVE_LSTAT */
+
+/* Get the original definition of lstat. It might be defined as a macro. */
+# include <sys/types.h>
+# include <sys/stat.h>
+# undef __need_system_sys_stat_h
+
+static inline int
+orig_lstat (const char *filename, struct stat *buf)
+{
+ return lstat (filename, buf);
+}
+
+/* Specification. */
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+# include "sys/stat.h"
+
+# include <string.h>
+# include <errno.h>
+
+/* lstat works differently on Linux and Solaris systems. POSIX (see
+ `pathname resolution' in the glossary) requires that programs like
+ `ls' take into consideration the fact that FILE has a trailing slash
+ when FILE is a symbolic link. On Linux and Solaris 10 systems, the
+ lstat function already has the desired semantics (in treating
+ `lstat ("symlink/", sbuf)' just like `lstat ("symlink/.", sbuf)',
+ but on Solaris 9 and earlier it does not.
+
+ If FILE has a trailing slash and specifies a symbolic link,
+ then use stat() to get more info on the referent of FILE.
+ If the referent is a non-directory, then set errno to ENOTDIR
+ and return -1. Otherwise, return stat's result. */
+
+int
+rpl_lstat (const char *file, struct stat *sbuf)
+{
+ size_t len;
+ int lstat_result = orig_lstat (file, sbuf);
+
+ if (lstat_result != 0)
+ return lstat_result;
+
+ /* This replacement file can blindly check against '/' rather than
+ using the ISSLASH macro, because all platforms with '\\' either
+ lack symlinks (mingw) or have working lstat (cygwin) and thus do
+ not compile this file. 0 len should have already been filtered
+ out above, with a failure return of ENOENT. */
+ len = strlen (file);
+ if (file[len - 1] != '/' || S_ISDIR (sbuf->st_mode))
+ return 0;
+
+ /* At this point, a trailing slash is only permitted on
+ symlink-to-dir; but it should have found information on the
+ directory, not the symlink. Call stat() to get info about the
+ link's referent. Our replacement stat guarantees valid results,
+ even if the symlink is not pointing to a directory. */
+ if (!S_ISLNK (sbuf->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ return stat (file, sbuf);
+}
+
+#endif /* HAVE_LSTAT */
diff --git a/gnulib/lib/malloc.c b/gnulib/lib/malloc.c
new file mode 100644
index 0000000..ef07f6c
--- /dev/null
+++ b/gnulib/lib/malloc.c
@@ -0,0 +1,57 @@
+/* malloc() function that is glibc compatible.
+
+ Copyright (C) 1997-1998, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
+#ifdef malloc
+# define NEED_MALLOC_GNU 1
+# undef malloc
+/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */
+#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
+# define NEED_MALLOC_GNU 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Allocate an N-byte block of memory from the heap.
+ If N is zero, allocate a 1-byte block. */
+
+void *
+rpl_malloc (size_t n)
+{
+ void *result;
+
+#if NEED_MALLOC_GNU
+ if (n == 0)
+ n = 1;
+#endif
+
+ result = malloc (n);
+
+#if !HAVE_MALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/malloca.c b/gnulib/lib/malloca.c
new file mode 100644
index 0000000..45d3075
--- /dev/null
+++ b/gnulib/lib/malloca.c
@@ -0,0 +1,139 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Specification. */
+#include "malloca.h"
+
+#include "verify.h"
+
+/* The speed critical point in this file is freea() applied to an alloca()
+ result: it must be fast, to match the speed of alloca(). The speed of
+ mmalloca() and freea() in the other case are not critical, because they
+ are only invoked for big memory sizes. */
+
+#if HAVE_ALLOCA
+
+/* Store the mmalloca() results in a hash table. This is needed to reliably
+ distinguish a mmalloca() result and an alloca() result.
+
+ Although it is possible that the same pointer is returned by alloca() and
+ by mmalloca() at different times in the same application, it does not lead
+ to a bug in freea(), because:
+ - Before a pointer returned by alloca() can point into malloc()ed memory,
+ the function must return, and once this has happened the programmer must
+ not call freea() on it anyway.
+ - Before a pointer returned by mmalloca() can point into the stack, it
+ must be freed. The only function that can free it is freea(), and
+ when freea() frees it, it also removes it from the hash table. */
+
+#define MAGIC_NUMBER 0x1415fb4a
+#define MAGIC_SIZE sizeof (int)
+/* This is how the header info would look like without any alignment
+ considerations. */
+struct preliminary_header { void *next; char room[MAGIC_SIZE]; };
+/* But the header's size must be a multiple of sa_alignment_max. */
+#define HEADER_SIZE \
+ (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max)
+struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; };
+verify (HEADER_SIZE == sizeof (struct header));
+/* We make the hash table quite big, so that during lookups the probability
+ of empty hash buckets is quite high. There is no need to make the hash
+ table resizable, because when the hash table gets filled so much that the
+ lookup becomes slow, it means that the application has memory leaks. */
+#define HASH_TABLE_SIZE 257
+static void * mmalloca_results[HASH_TABLE_SIZE];
+
+#endif
+
+void *
+mmalloca (size_t n)
+{
+#if HAVE_ALLOCA
+ /* Allocate one more word, that serves as an indicator for malloc()ed
+ memory, so that freea() of an alloca() result is fast. */
+ size_t nplus = n + HEADER_SIZE;
+
+ if (nplus >= n)
+ {
+ char *p = (char *) malloc (nplus);
+
+ if (p != NULL)
+ {
+ size_t slot;
+
+ p += HEADER_SIZE;
+
+ /* Put a magic number into the indicator word. */
+ ((int *) p)[-1] = MAGIC_NUMBER;
+
+ /* Enter p into the hash table. */
+ slot = (unsigned long) p % HASH_TABLE_SIZE;
+ ((struct header *) (p - HEADER_SIZE))->next = mmalloca_results[slot];
+ mmalloca_results[slot] = p;
+
+ return p;
+ }
+ }
+ /* Out of memory. */
+ return NULL;
+#else
+# if !MALLOC_0_IS_NONNULL
+ if (n == 0)
+ n = 1;
+# endif
+ return malloc (n);
+#endif
+}
+
+#if HAVE_ALLOCA
+void
+freea (void *p)
+{
+ /* mmalloca() may have returned NULL. */
+ if (p != NULL)
+ {
+ /* Attempt to quickly distinguish the mmalloca() result - which has
+ a magic indicator word - and the alloca() result - which has an
+ uninitialized indicator word. It is for this test that sa_increment
+ additional bytes are allocated in the alloca() case. */
+ if (((int *) p)[-1] == MAGIC_NUMBER)
+ {
+ /* Looks like a mmalloca() result. To see whether it really is one,
+ perform a lookup in the hash table. */
+ size_t slot = (unsigned long) p % HASH_TABLE_SIZE;
+ void **chain = &mmalloca_results[slot];
+ for (; *chain != NULL;)
+ {
+ if (*chain == p)
+ {
+ /* Found it. Remove it from the hash table and free it. */
+ char *p_begin = (char *) p - HEADER_SIZE;
+ *chain = ((struct header *) p_begin)->next;
+ free (p_begin);
+ return;
+ }
+ chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next;
+ }
+ }
+ /* At this point, we know it was not a mmalloca() result. */
+ }
+}
+#endif
diff --git a/gnulib/lib/malloca.h b/gnulib/lib/malloca.h
new file mode 100644
index 0000000..9432161
--- /dev/null
+++ b/gnulib/lib/malloca.h
@@ -0,0 +1,134 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MALLOCA_H
+#define _MALLOCA_H
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* safe_alloca(N) is equivalent to alloca(N) when it is safe to call
+ alloca(N); otherwise it returns NULL. It either returns N bytes of
+ memory allocated on the stack, that lasts until the function returns,
+ or NULL.
+ Use of safe_alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns.
+*/
+#if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots.
+ This must be a macro, not an inline function. */
+# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL)
+#else
+# define safe_alloca(N) ((void) (N), NULL)
+#endif
+
+/* malloca(N) is a safe variant of alloca(N). It allocates N bytes of
+ memory allocated on the stack, that must be freed using freea() before
+ the function returns. Upon failure, it returns NULL. */
+#if HAVE_ALLOCA
+# define malloca(N) \
+ ((N) < 4032 - sa_increment \
+ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+ : mmalloca (N))
+#else
+# define malloca(N) \
+ mmalloca (N)
+#endif
+extern void * mmalloca (size_t n);
+
+/* Free a block of memory allocated through malloca(). */
+#if HAVE_ALLOCA
+extern void freea (void *p);
+#else
+# define freea free
+#endif
+
+/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns. */
+#if 1
+/* Cf. the definition of xalloc_oversized. */
+# define nmalloca(n, s) \
+ ((n) > (size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) \
+ ? NULL \
+ : malloca ((n) * (s)))
+#else
+extern void * nmalloca (size_t n, size_t s);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ------------------- Auxiliary, non-public definitions ------------------- */
+
+/* Determine the alignment of a type at compile time. */
+#if defined __GNUC__
+# define sa_alignof __alignof__
+#elif defined __cplusplus
+ template <class type> struct sa_alignof_helper { char __slot1; type __slot2; };
+# define sa_alignof(type) offsetof (sa_alignof_helper<type>, __slot2)
+#elif defined __hpux
+ /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#elif defined _AIX
+ /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#else
+# define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+enum
+{
+/* The desired alignment of memory allocations is the maximum alignment
+ among all elementary types. */
+ sa_alignment_long = sa_alignof (long),
+ sa_alignment_double = sa_alignof (double),
+#if HAVE_LONG_LONG_INT
+ sa_alignment_longlong = sa_alignof (long long),
+#endif
+ sa_alignment_longdouble = sa_alignof (long double),
+ sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
+#if HAVE_LONG_LONG_INT
+ | (sa_alignment_longlong - 1)
+#endif
+ | (sa_alignment_longdouble - 1)
+ ) + 1,
+/* The increment that guarantees room for a magic word must be >= sizeof (int)
+ and a multiple of sa_alignment_max. */
+ sa_increment = ((sizeof (int) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max
+};
+
+#endif /* _MALLOCA_H */
diff --git a/gnulib/lib/malloca.valgrind b/gnulib/lib/malloca.valgrind
new file mode 100644
index 0000000..52f0a50
--- /dev/null
+++ b/gnulib/lib/malloca.valgrind
@@ -0,0 +1,7 @@
+# Suppress a valgrind message about use of uninitialized memory in freea().
+# This use is OK because it provides only a speedup.
+{
+ freea
+ Memcheck:Cond
+ fun:freea
+}
diff --git a/gnulib/lib/math.in.h b/gnulib/lib/math.in.h
new file mode 100644
index 0000000..6b5966a
--- /dev/null
+++ b/gnulib/lib/math.in.h
@@ -0,0 +1,1381 @@
+/* A GNU-like <math.h>.
+
+ Copyright (C) 2002-2003, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_MATH_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
+
+#ifndef _@GUARD_PREFIX@_MATH_H
+#define _@GUARD_PREFIX@_MATH_H
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+/* Helper macros to define type-generic function FUNC as overloaded functions,
+ rather than as macros like in C. POSIX declares these with an argument of
+ real-floating (that is, one of float, double, or long double). */
+# define _GL_MATH_CXX_REAL_FLOATING_DECL_1(func) \
+static inline int \
+_gl_cxx_ ## func ## f (float f) \
+{ \
+ return func (f); \
+} \
+static inline int \
+_gl_cxx_ ## func ## d (double d) \
+{ \
+ return func (d); \
+} \
+static inline int \
+_gl_cxx_ ## func ## l (long double l) \
+{ \
+ return func (l); \
+}
+# define _GL_MATH_CXX_REAL_FLOATING_DECL_2(func) \
+inline int \
+func (float f) \
+{ \
+ return _gl_cxx_ ## func ## f (f); \
+} \
+inline int \
+func (double d) \
+{ \
+ return _gl_cxx_ ## func ## d (d); \
+} \
+inline int \
+func (long double l) \
+{ \
+ return _gl_cxx_ ## func ## l (l); \
+}
+#endif
+
+/* Helper macros to define a portability warning for the
+ classification macro FUNC called with VALUE. POSIX declares the
+ classification macros with an argument of real-floating (that is,
+ one of float, double, or long double). */
+#define _GL_WARN_REAL_FLOATING_DECL(func) \
+static inline int \
+rpl_ ## func ## f (float f) \
+{ \
+ return func (f); \
+} \
+static inline int \
+rpl_ ## func ## d (double d) \
+{ \
+ return func (d); \
+} \
+static inline int \
+rpl_ ## func ## l (long double l) \
+{ \
+ return func (l); \
+} \
+_GL_WARN_ON_USE (rpl_ ## func ## f, #func " is unportable - " \
+ "use gnulib module " #func " for portability"); \
+_GL_WARN_ON_USE (rpl_ ## func ## d, #func " is unportable - " \
+ "use gnulib module " #func " for portability"); \
+_GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \
+ "use gnulib module " #func " for portability")
+#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
+ (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \
+ : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \
+ : rpl_ ## func ## l (value))
+
+
+#if @REPLACE_ITOLD@
+/* Pull in a function that fixes the 'int' to 'long double' conversion
+ of glibc 2.7. */
+_GL_EXTERN_C void _Qp_itoq (long double *, int);
+static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq;
+#endif
+
+
+/* POSIX allows platforms that don't support NAN. But all major
+ machines in the past 15 years have supported something close to
+ IEEE NaN, so we define this unconditionally. We also must define
+ it on platforms like Solaris 10, where NAN is present but defined
+ as a function pointer rather than a floating point constant. */
+#if !defined NAN || @REPLACE_NAN@
+# if !GNULIB_defined_NAN
+# undef NAN
+ /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler
+ choke on the expression 0.0 / 0.0. */
+# if defined __DECC || defined _MSC_VER
+static float
+_NaN ()
+{
+ static float zero = 0.0f;
+ return zero / zero;
+}
+# define NAN (_NaN())
+# else
+# define NAN (0.0f / 0.0f)
+# endif
+# define GNULIB_defined_NAN 1
+# endif
+#endif
+
+/* Solaris 10 defines HUGE_VAL, but as a function pointer rather
+ than a floating point constant. */
+#if @REPLACE_HUGE_VAL@
+# undef HUGE_VAL
+# define HUGE_VAL (1.0 / 0.0)
+#endif
+
+
+#if @GNULIB_ACOSF@
+# if !@HAVE_ACOSF@
+# undef acosf
+_GL_FUNCDECL_SYS (acosf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (acosf, float, (float x));
+_GL_CXXALIASWARN (acosf);
+#elif defined GNULIB_POSIXCHECK
+# undef acosf
+# if HAVE_RAW_DECL_ACOSF
+_GL_WARN_ON_USE (acosf, "acosf is unportable - "
+ "use gnulib module acosf for portability");
+# endif
+#endif
+
+#if @GNULIB_ACOSL@
+# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
+_GL_FUNCDECL_SYS (acosl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (acosl, long double, (long double x));
+_GL_CXXALIASWARN (acosl);
+#elif defined GNULIB_POSIXCHECK
+# undef acosl
+# if HAVE_RAW_DECL_ACOSL
+_GL_WARN_ON_USE (acosl, "acosl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ASINF@
+# if !@HAVE_ASINF@
+# undef asinf
+_GL_FUNCDECL_SYS (asinf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (asinf, float, (float x));
+_GL_CXXALIASWARN (asinf);
+#elif defined GNULIB_POSIXCHECK
+# undef asinf
+# if HAVE_RAW_DECL_ASINF
+_GL_WARN_ON_USE (asinf, "asinf is unportable - "
+ "use gnulib module asinf for portability");
+# endif
+#endif
+
+#if @GNULIB_ASINL@
+# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
+_GL_FUNCDECL_SYS (asinl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (asinl, long double, (long double x));
+_GL_CXXALIASWARN (asinl);
+#elif defined GNULIB_POSIXCHECK
+# undef asinl
+# if HAVE_RAW_DECL_ASINL
+_GL_WARN_ON_USE (asinl, "asinl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATANF@
+# if !@HAVE_ATANF@
+# undef atanf
+_GL_FUNCDECL_SYS (atanf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (atanf, float, (float x));
+_GL_CXXALIASWARN (atanf);
+#elif defined GNULIB_POSIXCHECK
+# undef atanf
+# if HAVE_RAW_DECL_ATANF
+_GL_WARN_ON_USE (atanf, "atanf is unportable - "
+ "use gnulib module atanf for portability");
+# endif
+#endif
+
+#if @GNULIB_ATANL@
+# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
+_GL_FUNCDECL_SYS (atanl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (atanl, long double, (long double x));
+_GL_CXXALIASWARN (atanl);
+#elif defined GNULIB_POSIXCHECK
+# undef atanl
+# if HAVE_RAW_DECL_ATANL
+_GL_WARN_ON_USE (atanl, "atanl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATAN2F@
+# if !@HAVE_ATAN2F@
+# undef atan2f
+_GL_FUNCDECL_SYS (atan2f, float, (float y, float x));
+# endif
+_GL_CXXALIAS_SYS (atan2f, float, (float y, float x));
+_GL_CXXALIASWARN (atan2f);
+#elif defined GNULIB_POSIXCHECK
+# undef atan2f
+# if HAVE_RAW_DECL_ATAN2F
+_GL_WARN_ON_USE (atan2f, "atan2f is unportable - "
+ "use gnulib module atan2f for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CEILF@
+# if @REPLACE_CEILF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceilf
+# define ceilf rpl_ceilf
+# endif
+_GL_FUNCDECL_RPL (ceilf, float, (float x));
+_GL_CXXALIAS_RPL (ceilf, float, (float x));
+# else
+# if !@HAVE_DECL_CEILF@
+_GL_FUNCDECL_SYS (ceilf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (ceilf, float, (float x));
+# endif
+_GL_CXXALIASWARN (ceilf);
+#elif defined GNULIB_POSIXCHECK
+# undef ceilf
+# if HAVE_RAW_DECL_CEILF
+_GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
+ "use gnulib module ceilf for portability");
+# endif
+#endif
+
+#if @GNULIB_CEIL@
+# if @REPLACE_CEIL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define ceil rpl_ceil
+# endif
+_GL_FUNCDECL_RPL (ceil, double, (double x));
+_GL_CXXALIAS_RPL (ceil, double, (double x));
+# else
+_GL_CXXALIAS_SYS (ceil, double, (double x));
+# endif
+_GL_CXXALIASWARN (ceil);
+#endif
+
+#if @GNULIB_CEILL@
+# if @REPLACE_CEILL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ceill
+# define ceill rpl_ceill
+# endif
+_GL_FUNCDECL_RPL (ceill, long double, (long double x));
+_GL_CXXALIAS_RPL (ceill, long double, (long double x));
+# else
+# if !@HAVE_DECL_CEILL@
+_GL_FUNCDECL_SYS (ceill, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (ceill, long double, (long double x));
+# endif
+_GL_CXXALIASWARN (ceill);
+#elif defined GNULIB_POSIXCHECK
+# undef ceill
+# if HAVE_RAW_DECL_CEILL
+_GL_WARN_ON_USE (ceill, "ceill is unportable - "
+ "use gnulib module ceill for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COPYSIGNF@
+# if !@HAVE_COPYSIGNF@
+_GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
+_GL_CXXALIASWARN (copysignf);
+#elif defined GNULIB_POSIXCHECK
+# undef copysignf
+# if HAVE_RAW_DECL_COPYSIGNF
+_GL_WARN_ON_USE (copysignf, "copysignf is unportable - "
+ "use gnulib module copysignf for portability");
+# endif
+#endif
+
+#if @GNULIB_COPYSIGN@
+# if !@HAVE_COPYSIGN@
+_GL_FUNCDECL_SYS (copysign, double, (double x, double y));
+# endif
+_GL_CXXALIAS_SYS (copysign, double, (double x, double y));
+_GL_CXXALIASWARN (copysign);
+#elif defined GNULIB_POSIXCHECK
+# undef copysign
+# if HAVE_RAW_DECL_COPYSIGN
+_GL_WARN_ON_USE (copysign, "copysign is unportable - "
+ "use gnulib module copysign for portability");
+# endif
+#endif
+
+#if @GNULIB_COPYSIGNL@
+# if !@HAVE_COPYSIGNL@
+_GL_FUNCDECL_SYS (copysignl, long double, (long double x, long double y));
+# endif
+_GL_CXXALIAS_SYS (copysignl, long double, (long double x, long double y));
+_GL_CXXALIASWARN (copysignl);
+#elif defined GNULIB_POSIXCHECK
+# undef copysignl
+# if HAVE_RAW_DECL_COPYSIGNL
+_GL_WARN_ON_USE (copysign, "copysignl is unportable - "
+ "use gnulib module copysignl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COSF@
+# if !@HAVE_COSF@
+# undef cosf
+_GL_FUNCDECL_SYS (cosf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (cosf, float, (float x));
+_GL_CXXALIASWARN (cosf);
+#elif defined GNULIB_POSIXCHECK
+# undef cosf
+# if HAVE_RAW_DECL_COSF
+_GL_WARN_ON_USE (cosf, "cosf is unportable - "
+ "use gnulib module cosf for portability");
+# endif
+#endif
+
+#if @GNULIB_COSL@
+# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
+_GL_FUNCDECL_SYS (cosl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (cosl, long double, (long double x));
+_GL_CXXALIASWARN (cosl);
+#elif defined GNULIB_POSIXCHECK
+# undef cosl
+# if HAVE_RAW_DECL_COSL
+_GL_WARN_ON_USE (cosl, "cosl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_COSHF@
+# if !@HAVE_COSHF@
+# undef coshf
+_GL_FUNCDECL_SYS (coshf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (coshf, float, (float x));
+_GL_CXXALIASWARN (coshf);
+#elif defined GNULIB_POSIXCHECK
+# undef coshf
+# if HAVE_RAW_DECL_COSHF
+_GL_WARN_ON_USE (coshf, "coshf is unportable - "
+ "use gnulib module coshf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXPF@
+# if !@HAVE_EXPF@
+# undef expf
+_GL_FUNCDECL_SYS (expf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (expf, float, (float x));
+_GL_CXXALIASWARN (expf);
+#elif defined GNULIB_POSIXCHECK
+# undef expf
+# if HAVE_RAW_DECL_EXPF
+_GL_WARN_ON_USE (expf, "expf is unportable - "
+ "use gnulib module expf for portability");
+# endif
+#endif
+
+#if @GNULIB_EXPL@
+# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
+_GL_FUNCDECL_SYS (expl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (expl, long double, (long double x));
+_GL_CXXALIASWARN (expl);
+#elif defined GNULIB_POSIXCHECK
+# undef expl
+# if HAVE_RAW_DECL_EXPL
+_GL_WARN_ON_USE (expl, "expl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FABSF@
+# if !@HAVE_FABSF@
+# undef fabsf
+_GL_FUNCDECL_SYS (fabsf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (fabsf, float, (float x));
+_GL_CXXALIASWARN (fabsf);
+#elif defined GNULIB_POSIXCHECK
+# undef fabsf
+# if HAVE_RAW_DECL_FABSF
+_GL_WARN_ON_USE (fabsf, "fabsf is unportable - "
+ "use gnulib module fabsf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FLOORF@
+# if @REPLACE_FLOORF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floorf
+# define floorf rpl_floorf
+# endif
+_GL_FUNCDECL_RPL (floorf, float, (float x));
+_GL_CXXALIAS_RPL (floorf, float, (float x));
+# else
+# if !@HAVE_DECL_FLOORF@
+_GL_FUNCDECL_SYS (floorf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (floorf, float, (float x));
+# endif
+_GL_CXXALIASWARN (floorf);
+#elif defined GNULIB_POSIXCHECK
+# undef floorf
+# if HAVE_RAW_DECL_FLOORF
+_GL_WARN_ON_USE (floorf, "floorf is unportable - "
+ "use gnulib module floorf for portability");
+# endif
+#endif
+
+#if @GNULIB_FLOOR@
+# if @REPLACE_FLOOR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define floor rpl_floor
+# endif
+_GL_FUNCDECL_RPL (floor, double, (double x));
+_GL_CXXALIAS_RPL (floor, double, (double x));
+# else
+_GL_CXXALIAS_SYS (floor, double, (double x));
+# endif
+_GL_CXXALIASWARN (floor);
+#endif
+
+#if @GNULIB_FLOORL@
+# if @REPLACE_FLOORL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef floorl
+# define floorl rpl_floorl
+# endif
+_GL_FUNCDECL_RPL (floorl, long double, (long double x));
+_GL_CXXALIAS_RPL (floorl, long double, (long double x));
+# else
+# if !@HAVE_DECL_FLOORL@
+_GL_FUNCDECL_SYS (floorl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (floorl, long double, (long double x));
+# endif
+_GL_CXXALIASWARN (floorl);
+#elif defined GNULIB_POSIXCHECK
+# undef floorl
+# if HAVE_RAW_DECL_FLOORL
+_GL_WARN_ON_USE (floorl, "floorl is unportable - "
+ "use gnulib module floorl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FMAF@
+# if @REPLACE_FMAF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmaf
+# define fmaf rpl_fmaf
+# endif
+_GL_FUNCDECL_RPL (fmaf, float, (float x, float y, float z));
+_GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
+# else
+# if !@HAVE_FMAF@
+_GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
+# endif
+_GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
+# endif
+_GL_CXXALIASWARN (fmaf);
+#elif defined GNULIB_POSIXCHECK
+# undef fmaf
+# if HAVE_RAW_DECL_FMAF
+_GL_WARN_ON_USE (fmaf, "fmaf is unportable - "
+ "use gnulib module fmaf for portability");
+# endif
+#endif
+
+#if @GNULIB_FMA@
+# if @REPLACE_FMA@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fma
+# define fma rpl_fma
+# endif
+_GL_FUNCDECL_RPL (fma, double, (double x, double y, double z));
+_GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
+# else
+# if !@HAVE_FMA@
+_GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
+# endif
+_GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
+# endif
+_GL_CXXALIASWARN (fma);
+#elif defined GNULIB_POSIXCHECK
+# undef fma
+# if HAVE_RAW_DECL_FMA
+_GL_WARN_ON_USE (fma, "fma is unportable - "
+ "use gnulib module fma for portability");
+# endif
+#endif
+
+#if @GNULIB_FMAL@
+# if @REPLACE_FMAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fmal
+# define fmal rpl_fmal
+# endif
+_GL_FUNCDECL_RPL (fmal, long double,
+ (long double x, long double y, long double z));
+_GL_CXXALIAS_RPL (fmal, long double,
+ (long double x, long double y, long double z));
+# else
+# if !@HAVE_FMAL@
+_GL_FUNCDECL_SYS (fmal, long double,
+ (long double x, long double y, long double z));
+# endif
+_GL_CXXALIAS_SYS (fmal, long double,
+ (long double x, long double y, long double z));
+# endif
+_GL_CXXALIASWARN (fmal);
+#elif defined GNULIB_POSIXCHECK
+# undef fmal
+# if HAVE_RAW_DECL_FMAL
+_GL_WARN_ON_USE (fmal, "fmal is unportable - "
+ "use gnulib module fmal for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FMODF@
+# if !@HAVE_FMODF@
+# undef fmodf
+_GL_FUNCDECL_SYS (fmodf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (fmodf, float, (float x, float y));
+_GL_CXXALIASWARN (fmodf);
+#elif defined GNULIB_POSIXCHECK
+# undef fmodf
+# if HAVE_RAW_DECL_FMODF
+_GL_WARN_ON_USE (fmodf, "fmodf is unportable - "
+ "use gnulib module fmodf for portability");
+# endif
+#endif
+
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXPF@
+# if @REPLACE_FREXPF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexpf
+# define frexpf rpl_frexpf
+# endif
+_GL_FUNCDECL_RPL (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexpf, float, (float x, int *expptr));
+# else
+# if !@HAVE_FREXPF@
+# undef frexpf
+_GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
+# endif
+_GL_CXXALIASWARN (frexpf);
+#elif defined GNULIB_POSIXCHECK
+# undef frexpf
+# if HAVE_RAW_DECL_FREXPF
+_GL_WARN_ON_USE (frexpf, "frexpf is unportable - "
+ "use gnulib module frexpf for portability");
+# endif
+#endif
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXP@
+# if @REPLACE_FREXP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define frexp rpl_frexp
+# endif
+_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr));
+# else
+_GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr));
+# endif
+_GL_CXXALIASWARN (frexp);
+#elif defined GNULIB_POSIXCHECK
+# undef frexp
+/* Assume frexp is always declared. */
+_GL_WARN_ON_USE (frexp, "frexp is unportable - "
+ "use gnulib module frexp for portability");
+#endif
+
+/* Write x as
+ x = mantissa * 2^exp
+ where
+ If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
+ If x is zero: mantissa = x, exp = 0.
+ If x is infinite or NaN: mantissa = x, exp unspecified.
+ Store exp in *EXPPTR and return mantissa. */
+#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef frexpl
+# define frexpl rpl_frexpl
+# endif
+_GL_FUNCDECL_RPL (frexpl, long double,
+ (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr));
+#else
+# if !@HAVE_DECL_FREXPL@
+_GL_FUNCDECL_SYS (frexpl, long double,
+ (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
+# endif
+# if @GNULIB_FREXPL@
+_GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr));
+# endif
+#endif
+#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
+_GL_CXXALIASWARN (frexpl);
+#endif
+#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
+# undef frexpl
+# if HAVE_RAW_DECL_FREXPL
+_GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
+ "use gnulib module frexpl for portability");
+# endif
+#endif
+
+
+/* Return x * 2^exp. */
+#if @GNULIB_LDEXPF@
+# if !@HAVE_LDEXPF@
+# undef ldexpf
+_GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
+# endif
+_GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
+_GL_CXXALIASWARN (ldexpf);
+#elif defined GNULIB_POSIXCHECK
+# undef ldexpf
+# if HAVE_RAW_DECL_LDEXPF
+_GL_WARN_ON_USE (ldexpf, "ldexpf is unportable - "
+ "use gnulib module ldexpf for portability");
+# endif
+#endif
+
+/* Return x * 2^exp. */
+#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ldexpl
+# define ldexpl rpl_ldexpl
+# endif
+_GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp));
+_GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp));
+#else
+# if !@HAVE_DECL_LDEXPL@
+_GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp));
+# endif
+# if @GNULIB_LDEXPL@
+_GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp));
+# endif
+#endif
+#if @GNULIB_LDEXPL@
+_GL_CXXALIASWARN (ldexpl);
+#endif
+#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
+# undef ldexpl
+# if HAVE_RAW_DECL_LDEXPL
+_GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
+ "use gnulib module ldexpl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOGB@
+# if !@HAVE_DECL_LOGB@
+_GL_EXTERN_C double logb (double x);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef logb
+# if HAVE_RAW_DECL_LOGB
+_GL_WARN_ON_USE (logb, "logb is unportable - "
+ "use gnulib module logb for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOGF@
+# if !@HAVE_LOGF@
+# undef logf
+_GL_FUNCDECL_SYS (logf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (logf, float, (float x));
+_GL_CXXALIASWARN (logf);
+#elif defined GNULIB_POSIXCHECK
+# undef logf
+# if HAVE_RAW_DECL_LOGF
+_GL_WARN_ON_USE (logf, "logf is unportable - "
+ "use gnulib module logf for portability");
+# endif
+#endif
+
+#if @GNULIB_LOGL@
+# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
+_GL_FUNCDECL_SYS (logl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (logl, long double, (long double x));
+_GL_CXXALIASWARN (logl);
+#elif defined GNULIB_POSIXCHECK
+# undef logl
+# if HAVE_RAW_DECL_LOGL
+_GL_WARN_ON_USE (logl, "logl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LOG10F@
+# if !@HAVE_LOG10F@
+# undef log10f
+_GL_FUNCDECL_SYS (log10f, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (log10f, float, (float x));
+_GL_CXXALIASWARN (log10f);
+#elif defined GNULIB_POSIXCHECK
+# undef log10f
+# if HAVE_RAW_DECL_LOG10F
+_GL_WARN_ON_USE (log10f, "log10f is unportable - "
+ "use gnulib module log10f for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MODFF@
+# if !@HAVE_MODFF@
+# undef modff
+_GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (modff, float, (float x, float *iptr));
+_GL_CXXALIASWARN (modff);
+#elif defined GNULIB_POSIXCHECK
+# undef modff
+# if HAVE_RAW_DECL_MODFF
+_GL_WARN_ON_USE (modff, "modff is unportable - "
+ "use gnulib module modff for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POWF@
+# if !@HAVE_POWF@
+# undef powf
+_GL_FUNCDECL_SYS (powf, float, (float x, float y));
+# endif
+_GL_CXXALIAS_SYS (powf, float, (float x, float y));
+_GL_CXXALIASWARN (powf);
+#elif defined GNULIB_POSIXCHECK
+# undef powf
+# if HAVE_RAW_DECL_POWF
+_GL_WARN_ON_USE (powf, "powf is unportable - "
+ "use gnulib module powf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RINTF@
+# if !@HAVE_RINTF@
+_GL_FUNCDECL_SYS (rintf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (rintf, float, (float x));
+_GL_CXXALIASWARN (rintf);
+#elif defined GNULIB_POSIXCHECK
+# undef rintf
+# if HAVE_RAW_DECL_RINTF
+_GL_WARN_ON_USE (rintf, "rintf is unportable - "
+ "use gnulib module rintf for portability");
+# endif
+#endif
+
+#if @GNULIB_RINT@
+# if !@HAVE_RINT@
+_GL_FUNCDECL_SYS (rint, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (rint, double, (double x));
+_GL_CXXALIASWARN (rint);
+#elif defined GNULIB_POSIXCHECK
+# undef rint
+# if HAVE_RAW_DECL_RINT
+_GL_WARN_ON_USE (rint, "rint is unportable - "
+ "use gnulib module rint for portability");
+# endif
+#endif
+
+#if @GNULIB_RINTL@
+# if !@HAVE_RINTL@
+_GL_FUNCDECL_SYS (rintl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (rintl, long double, (long double x));
+_GL_CXXALIASWARN (rintl);
+#elif defined GNULIB_POSIXCHECK
+# undef rintl
+# if HAVE_RAW_DECL_RINTL
+_GL_WARN_ON_USE (rintl, "rintl is unportable - "
+ "use gnulib module rintl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ROUNDF@
+# if @REPLACE_ROUNDF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef roundf
+# define roundf rpl_roundf
+# endif
+_GL_FUNCDECL_RPL (roundf, float, (float x));
+_GL_CXXALIAS_RPL (roundf, float, (float x));
+# else
+# if !@HAVE_DECL_ROUNDF@
+_GL_FUNCDECL_SYS (roundf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (roundf, float, (float x));
+# endif
+_GL_CXXALIASWARN (roundf);
+#elif defined GNULIB_POSIXCHECK
+# undef roundf
+# if HAVE_RAW_DECL_ROUNDF
+_GL_WARN_ON_USE (roundf, "roundf is unportable - "
+ "use gnulib module roundf for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUND@
+# if @REPLACE_ROUND@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef round
+# define round rpl_round
+# endif
+_GL_FUNCDECL_RPL (round, double, (double x));
+_GL_CXXALIAS_RPL (round, double, (double x));
+# else
+# if !@HAVE_DECL_ROUND@
+_GL_FUNCDECL_SYS (round, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (round, double, (double x));
+# endif
+_GL_CXXALIASWARN (round);
+#elif defined GNULIB_POSIXCHECK
+# undef round
+# if HAVE_RAW_DECL_ROUND
+_GL_WARN_ON_USE (round, "round is unportable - "
+ "use gnulib module round for portability");
+# endif
+#endif
+
+#if @GNULIB_ROUNDL@
+# if @REPLACE_ROUNDL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef roundl
+# define roundl rpl_roundl
+# endif
+_GL_FUNCDECL_RPL (roundl, long double, (long double x));
+_GL_CXXALIAS_RPL (roundl, long double, (long double x));
+# else
+# if !@HAVE_DECL_ROUNDL@
+_GL_FUNCDECL_SYS (roundl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (roundl, long double, (long double x));
+# endif
+_GL_CXXALIASWARN (roundl);
+#elif defined GNULIB_POSIXCHECK
+# undef roundl
+# if HAVE_RAW_DECL_ROUNDL
+_GL_WARN_ON_USE (roundl, "roundl is unportable - "
+ "use gnulib module roundl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SINF@
+# if !@HAVE_SINF@
+# undef sinf
+_GL_FUNCDECL_SYS (sinf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sinf, float, (float x));
+_GL_CXXALIASWARN (sinf);
+#elif defined GNULIB_POSIXCHECK
+# undef sinf
+# if HAVE_RAW_DECL_SINF
+_GL_WARN_ON_USE (sinf, "sinf is unportable - "
+ "use gnulib module sinf for portability");
+# endif
+#endif
+
+#if @GNULIB_SINL@
+# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
+_GL_FUNCDECL_SYS (sinl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (sinl, long double, (long double x));
+_GL_CXXALIASWARN (sinl);
+#elif defined GNULIB_POSIXCHECK
+# undef sinl
+# if HAVE_RAW_DECL_SINL
+_GL_WARN_ON_USE (sinl, "sinl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SINHF@
+# if !@HAVE_SINHF@
+# undef sinhf
+_GL_FUNCDECL_SYS (sinhf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sinhf, float, (float x));
+_GL_CXXALIASWARN (sinhf);
+#elif defined GNULIB_POSIXCHECK
+# undef sinhf
+# if HAVE_RAW_DECL_SINHF
+_GL_WARN_ON_USE (sinhf, "sinhf is unportable - "
+ "use gnulib module sinhf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SQRTF@
+# if !@HAVE_SQRTF@
+# undef sqrtf
+_GL_FUNCDECL_SYS (sqrtf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (sqrtf, float, (float x));
+_GL_CXXALIASWARN (sqrtf);
+#elif defined GNULIB_POSIXCHECK
+# undef sqrtf
+# if HAVE_RAW_DECL_SQRTF
+_GL_WARN_ON_USE (sqrtf, "sqrtf is unportable - "
+ "use gnulib module sqrtf for portability");
+# endif
+#endif
+
+#if @GNULIB_SQRTL@
+# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
+_GL_FUNCDECL_SYS (sqrtl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
+_GL_CXXALIASWARN (sqrtl);
+#elif defined GNULIB_POSIXCHECK
+# undef sqrtl
+# if HAVE_RAW_DECL_SQRTL
+_GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TANF@
+# if !@HAVE_TANF@
+# undef tanf
+_GL_FUNCDECL_SYS (tanf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (tanf, float, (float x));
+_GL_CXXALIASWARN (tanf);
+#elif defined GNULIB_POSIXCHECK
+# undef tanf
+# if HAVE_RAW_DECL_TANF
+_GL_WARN_ON_USE (tanf, "tanf is unportable - "
+ "use gnulib module tanf for portability");
+# endif
+#endif
+
+#if @GNULIB_TANL@
+# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
+_GL_FUNCDECL_SYS (tanl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (tanl, long double, (long double x));
+_GL_CXXALIASWARN (tanl);
+#elif defined GNULIB_POSIXCHECK
+# undef tanl
+# if HAVE_RAW_DECL_TANL
+_GL_WARN_ON_USE (tanl, "tanl is unportable - "
+ "use gnulib module mathl for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TANHF@
+# if !@HAVE_TANHF@
+# undef tanhf
+_GL_FUNCDECL_SYS (tanhf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (tanhf, float, (float x));
+_GL_CXXALIASWARN (tanhf);
+#elif defined GNULIB_POSIXCHECK
+# undef tanhf
+# if HAVE_RAW_DECL_TANHF
+_GL_WARN_ON_USE (tanhf, "tanhf is unportable - "
+ "use gnulib module tanhf for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCF@
+# if @REPLACE_TRUNCF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define truncf rpl_truncf
+# endif
+_GL_FUNCDECL_RPL (truncf, float, (float x));
+_GL_CXXALIAS_RPL (truncf, float, (float x));
+# else
+# if !@HAVE_DECL_TRUNCF@
+_GL_FUNCDECL_SYS (truncf, float, (float x));
+# endif
+_GL_CXXALIAS_SYS (truncf, float, (float x));
+# endif
+_GL_CXXALIASWARN (truncf);
+#elif defined GNULIB_POSIXCHECK
+# undef truncf
+# if HAVE_RAW_DECL_TRUNCF
+_GL_WARN_ON_USE (truncf, "truncf is unportable - "
+ "use gnulib module truncf for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNC@
+# if @REPLACE_TRUNC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define trunc rpl_trunc
+# endif
+_GL_FUNCDECL_RPL (trunc, double, (double x));
+_GL_CXXALIAS_RPL (trunc, double, (double x));
+# else
+# if !@HAVE_DECL_TRUNC@
+_GL_FUNCDECL_SYS (trunc, double, (double x));
+# endif
+_GL_CXXALIAS_SYS (trunc, double, (double x));
+# endif
+_GL_CXXALIASWARN (trunc);
+#elif defined GNULIB_POSIXCHECK
+# undef trunc
+# if HAVE_RAW_DECL_TRUNC
+_GL_WARN_ON_USE (trunc, "trunc is unportable - "
+ "use gnulib module trunc for portability");
+# endif
+#endif
+
+#if @GNULIB_TRUNCL@
+# if @REPLACE_TRUNCL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncl
+# define truncl rpl_truncl
+# endif
+_GL_FUNCDECL_RPL (truncl, long double, (long double x));
+_GL_CXXALIAS_RPL (truncl, long double, (long double x));
+# else
+# if !@HAVE_DECL_TRUNCL@
+_GL_FUNCDECL_SYS (truncl, long double, (long double x));
+# endif
+_GL_CXXALIAS_SYS (truncl, long double, (long double x));
+# endif
+_GL_CXXALIASWARN (truncl);
+#elif defined GNULIB_POSIXCHECK
+# undef truncl
+# if HAVE_RAW_DECL_TRUNCL
+_GL_WARN_ON_USE (truncl, "truncl is unportable - "
+ "use gnulib module truncl for portability");
+# endif
+#endif
+
+
+/* Definitions of function-like macros come here, after the function
+ declarations. */
+
+
+#if @GNULIB_ISFINITE@
+# if @REPLACE_ISFINITE@
+_GL_EXTERN_C int gl_isfinitef (float x);
+_GL_EXTERN_C int gl_isfinited (double x);
+_GL_EXTERN_C int gl_isfinitel (long double x);
+# undef isfinite
+# define isfinite(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
+ sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
+ gl_isfinitef (x))
+# endif
+# ifdef __cplusplus
+# ifdef isfinite
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
+# undef isfinite
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite)
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isfinite
+_GL_WARN_REAL_FLOATING_DECL (isfinite);
+# undef isfinite
+# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISINF@
+# if @REPLACE_ISINF@
+_GL_EXTERN_C int gl_isinff (float x);
+_GL_EXTERN_C int gl_isinfd (double x);
+_GL_EXTERN_C int gl_isinfl (long double x);
+# undef isinf
+# define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
+ sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
+ gl_isinff (x))
+# endif
+# ifdef __cplusplus
+# ifdef isinf
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
+# undef isinf
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf)
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isinf
+_GL_WARN_REAL_FLOATING_DECL (isinf);
+# undef isinf
+# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
+# endif
+#endif
+
+
+#if @GNULIB_ISNANF@
+/* Test for NaN for 'float' numbers. */
+# if @HAVE_ISNANF@
+/* The original <math.h> included above provides a declaration of isnan macro
+ or (older) isnanf function. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanf
+# define isnanf(x) __builtin_isnanf ((float)(x))
+# elif defined isnan
+# undef isnanf
+# define isnanf(x) isnan ((float)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanf
+# define isnanf rpl_isnanf
+_GL_EXTERN_C int isnanf (float x);
+# endif
+#endif
+
+#if @GNULIB_ISNAND@
+/* Test for NaN for 'double' numbers.
+ This function is a gnulib extension, unlike isnan() which applied only
+ to 'double' numbers earlier but now is a type-generic macro. */
+# if @HAVE_ISNAND@
+/* The original <math.h> included above provides a declaration of isnan
+ macro. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnand
+# define isnand(x) __builtin_isnan ((double)(x))
+# else
+# undef isnand
+# define isnand(x) isnan ((double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnand
+# define isnand rpl_isnand
+_GL_EXTERN_C int isnand (double x);
+# endif
+#endif
+
+#if @GNULIB_ISNANL@
+/* Test for NaN for 'long double' numbers. */
+# if @HAVE_ISNANL@
+/* The original <math.h> included above provides a declaration of isnan
+ macro or (older) isnanl function. */
+# if __GNUC__ >= 4
+ /* GCC 4.0 and newer provides three built-ins for isnan. */
+# undef isnanl
+# define isnanl(x) __builtin_isnanl ((long double)(x))
+# elif defined isnan
+# undef isnanl
+# define isnanl(x) isnan ((long double)(x))
+# endif
+# else
+/* Test whether X is a NaN. */
+# undef isnanl
+# define isnanl rpl_isnanl
+_GL_EXTERN_C int isnanl (long double x) _GL_ATTRIBUTE_CONST;
+# endif
+#endif
+
+/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */
+#if @GNULIB_ISNAN@
+# if @REPLACE_ISNAN@
+/* We can't just use the isnanf macro (e.g.) as exposed by
+ isnanf.h (e.g.) here, because those may end up being macros
+ that recursively expand back to isnan. So use the gnulib
+ replacements for them directly. */
+# if @HAVE_ISNANF@ && __GNUC__ >= 4
+# define gl_isnan_f(x) __builtin_isnanf ((float)(x))
+# else
+_GL_EXTERN_C int rpl_isnanf (float x);
+# define gl_isnan_f(x) rpl_isnanf (x)
+# endif
+# if @HAVE_ISNAND@ && __GNUC__ >= 4
+# define gl_isnan_d(x) __builtin_isnan ((double)(x))
+# else
+_GL_EXTERN_C int rpl_isnand (double x);
+# define gl_isnan_d(x) rpl_isnand (x)
+# endif
+# if @HAVE_ISNANL@ && __GNUC__ >= 4
+# define gl_isnan_l(x) __builtin_isnanl ((long double)(x))
+# else
+_GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
+# define gl_isnan_l(x) rpl_isnanl (x)
+# endif
+# undef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
+ sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
+ gl_isnan_f (x))
+# elif __GNUC__ >= 4
+# undef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \
+ sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
+ __builtin_isnanf ((float)(x)))
+# endif
+# ifdef __cplusplus
+# ifdef isnan
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
+# undef isnan
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan)
+# endif
+# else
+/* Ensure isnan is a macro. */
+# ifndef isnan
+# define isnan isnan
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined isnan
+_GL_WARN_REAL_FLOATING_DECL (isnan);
+# undef isnan
+# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
+# endif
+#endif
+
+
+#if @GNULIB_SIGNBIT@
+# if @REPLACE_SIGNBIT_USING_GCC@
+# undef signbit
+ /* GCC 4.0 and newer provides three built-ins for signbit. */
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
+ __builtin_signbitf (x))
+# endif
+# if @REPLACE_SIGNBIT@
+# undef signbit
+_GL_EXTERN_C int gl_signbitf (float arg);
+_GL_EXTERN_C int gl_signbitd (double arg);
+_GL_EXTERN_C int gl_signbitl (long double arg);
+# if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+# define _GL_NUM_UINT_WORDS(type) \
+ ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
+# define gl_signbitf_OPTIMIZED_MACRO
+# define gl_signbitf(arg) \
+ ({ union { float _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (float)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
+# define gl_signbitd_OPTIMIZED_MACRO
+# define gl_signbitd(arg) \
+ ({ union { double _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (double)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
+# define gl_signbitl_OPTIMIZED_MACRO
+# define gl_signbitl(arg) \
+ ({ union { long double _value; \
+ unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \
+ } _m; \
+ _m._value = (arg); \
+ (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \
+ })
+# endif
+# endif
+# define signbit(x) \
+ (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
+ sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
+ gl_signbitf (x))
+# endif
+# ifdef __cplusplus
+# ifdef signbit
+_GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
+# undef signbit
+_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit)
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if defined signbit
+_GL_WARN_REAL_FLOATING_DECL (signbit);
+# undef signbit
+# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_MATH_H */
+#endif /* _@GUARD_PREFIX@_MATH_H */
diff --git a/gnulib/lib/mbchar.c b/gnulib/lib/mbchar.c
new file mode 100644
index 0000000..c9b0dcd
--- /dev/null
+++ b/gnulib/lib/mbchar.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 2001, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+#include <limits.h>
+
+#include "mbchar.h"
+
+#if IS_BASIC_ASCII
+
+/* Bit table of characters in the ISO C "basic character set". */
+const unsigned int is_basic_table [UCHAR_MAX / 32 + 1] =
+{
+ 0x00001a00, /* '\t' '\v' '\f' */
+ 0xffffffef, /* ' '...'#' '%'...'?' */
+ 0xfffffffe, /* 'A'...'Z' '[' '\\' ']' '^' '_' */
+ 0x7ffffffe /* 'a'...'z' '{' '|' '}' '~' */
+ /* The remaining bits are 0. */
+};
+
+#endif /* IS_BASIC_ASCII */
diff --git a/gnulib/lib/mbchar.h b/gnulib/lib/mbchar.h
new file mode 100644
index 0000000..6dcb6cf
--- /dev/null
+++ b/gnulib/lib/mbchar.h
@@ -0,0 +1,350 @@
+/* Multibyte character data type.
+ Copyright (C) 2001, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* A multibyte character is a short subsequence of a char* string,
+ representing a single wide character.
+
+ We use multibyte characters instead of wide characters because of
+ the following goals:
+ 1) correct multibyte handling, i.e. operate according to the LC_CTYPE
+ locale,
+ 2) ease of maintenance, i.e. the maintainer needs not know all details
+ of the ISO C 99 standard,
+ 3) don't fail grossly if the input is not in the encoding set by the
+ locale, because often different encodings are in use in the same
+ countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...),
+ 4) fast in the case of ASCII characters,
+ 5) portability, i.e. don't make unportable assumptions about wchar_t.
+
+ Multibyte characters are only accessed through the mb* macros.
+
+ mb_ptr (mbc)
+ return a pointer to the beginning of the multibyte sequence.
+
+ mb_len (mbc)
+ returns the number of bytes occupied by the multibyte sequence.
+ Always > 0.
+
+ mb_iseq (mbc, sc)
+ returns true if mbc is the standard ASCII character sc.
+
+ mb_isnul (mbc)
+ returns true if mbc is the nul character.
+
+ mb_cmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2.
+
+ mb_casecmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2, modulo upper/lowercase conversion.
+
+ mb_equal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal.
+
+ mb_caseequal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion.
+
+ mb_isalnum (mbc)
+ returns true if mbc is alphanumeric.
+
+ mb_isalpha (mbc)
+ returns true if mbc is alphabetic.
+
+ mb_isascii(mbc)
+ returns true if mbc is plain ASCII.
+
+ mb_isblank (mbc)
+ returns true if mbc is a blank.
+
+ mb_iscntrl (mbc)
+ returns true if mbc is a control character.
+
+ mb_isdigit (mbc)
+ returns true if mbc is a decimal digit.
+
+ mb_isgraph (mbc)
+ returns true if mbc is a graphic character.
+
+ mb_islower (mbc)
+ returns true if mbc is lowercase.
+
+ mb_isprint (mbc)
+ returns true if mbc is a printable character.
+
+ mb_ispunct (mbc)
+ returns true if mbc is a punctuation character.
+
+ mb_isspace (mbc)
+ returns true if mbc is a space character.
+
+ mb_isupper (mbc)
+ returns true if mbc is uppercase.
+
+ mb_isxdigit (mbc)
+ returns true if mbc is a hexadecimal digit.
+
+ mb_width (mbc)
+ returns the number of columns on the output device occupied by mbc.
+ Always >= 0.
+
+ mb_putc (mbc, stream)
+ outputs mbc on stream, a byte oriented FILE stream opened for output.
+
+ mb_setascii (&mbc, sc)
+ assigns the standard ASCII character sc to mbc.
+
+ mb_copy (&destmbc, &srcmbc)
+ copies srcmbc to destmbc.
+
+ Here are the function prototypes of the macros.
+
+ extern const char * mb_ptr (const mbchar_t mbc);
+ extern size_t mb_len (const mbchar_t mbc);
+ extern bool mb_iseq (const mbchar_t mbc, char sc);
+ extern bool mb_isnul (const mbchar_t mbc);
+ extern int mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern int mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_equal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_isalnum (const mbchar_t mbc);
+ extern bool mb_isalpha (const mbchar_t mbc);
+ extern bool mb_isascii (const mbchar_t mbc);
+ extern bool mb_isblank (const mbchar_t mbc);
+ extern bool mb_iscntrl (const mbchar_t mbc);
+ extern bool mb_isdigit (const mbchar_t mbc);
+ extern bool mb_isgraph (const mbchar_t mbc);
+ extern bool mb_islower (const mbchar_t mbc);
+ extern bool mb_isprint (const mbchar_t mbc);
+ extern bool mb_ispunct (const mbchar_t mbc);
+ extern bool mb_isspace (const mbchar_t mbc);
+ extern bool mb_isupper (const mbchar_t mbc);
+ extern bool mb_isxdigit (const mbchar_t mbc);
+ extern int mb_width (const mbchar_t mbc);
+ extern void mb_putc (const mbchar_t mbc, FILE *stream);
+ extern void mb_setascii (mbchar_t *new, char sc);
+ extern void mb_copy (mbchar_t *new, const mbchar_t *old);
+ */
+
+#ifndef _MBCHAR_H
+#define _MBCHAR_H 1
+
+#include <stdbool.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#define MBCHAR_BUF_SIZE 24
+
+struct mbchar
+{
+ const char *ptr; /* pointer to current character */
+ size_t bytes; /* number of bytes of current character, > 0 */
+ bool wc_valid; /* true if wc is a valid wide character */
+ wchar_t wc; /* if wc_valid: the current character */
+ char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */
+};
+
+/* EOF (not a real character) is represented with bytes = 0 and
+ wc_valid = false. */
+
+typedef struct mbchar mbchar_t;
+
+/* Access the current character. */
+#define mb_ptr(mbc) ((mbc).ptr)
+#define mb_len(mbc) ((mbc).bytes)
+
+/* Comparison of characters. */
+#define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
+#define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
+#define mb_cmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) (mbc1).wc - (int) (mbc2).wc \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_casecmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_equal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? (mbc1).wc == (mbc2).wc \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+#define mb_caseequal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+
+/* <ctype.h>, <wctype.h> classification. */
+#define mb_isascii(mbc) \
+ ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
+#define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
+#define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
+#define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
+#define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
+#define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
+#define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
+#define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
+#define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
+#define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
+#define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
+#define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
+#define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
+
+/* Extra <wchar.h> function. */
+
+/* Unprintable characters appear as a small box of width 1. */
+#define MB_UNPRINTABLE_WIDTH 1
+
+static inline int
+mb_width_aux (wint_t wc)
+{
+ int w = wcwidth (wc);
+ /* For unprintable characters, arbitrarily return 0 for control characters
+ and MB_UNPRINTABLE_WIDTH otherwise. */
+ return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
+}
+
+#define mb_width(mbc) \
+ ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
+
+/* Output. */
+#define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
+
+/* Assignment. */
+#define mb_setascii(mbc, sc) \
+ ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
+ (mbc)->wc = (mbc)->buf[0] = (sc))
+
+/* Copying a character. */
+static inline void
+mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
+{
+ if (old_mbc->ptr == &old_mbc->buf[0])
+ {
+ memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
+ new_mbc->ptr = &new_mbc->buf[0];
+ }
+ else
+ new_mbc->ptr = old_mbc->ptr;
+ new_mbc->bytes = old_mbc->bytes;
+ if ((new_mbc->wc_valid = old_mbc->wc_valid))
+ new_mbc->wc = old_mbc->wc;
+}
+
+
+/* is_basic(c) tests whether the single-byte character c is in the
+ ISO C "basic character set".
+ This is a convenience function, and is in this file only to share code
+ between mbiter_multi.h and mbfile_multi.h. */
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ISO-646, not EBCDIC. */
+# define IS_BASIC_ASCII 1
+
+extern const unsigned int is_basic_table[];
+
+static inline bool
+is_basic (char c)
+{
+ return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
+ & 1;
+}
+
+#else
+
+static inline bool
+is_basic (char c)
+{
+ switch (c)
+ {
+ case '\t': case '\v': case '\f':
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+#endif
+
+#endif /* _MBCHAR_H */
diff --git a/gnulib/lib/mbfile.h b/gnulib/lib/mbfile.h
new file mode 100644
index 0000000..8ef387d
--- /dev/null
+++ b/gnulib/lib/mbfile.h
@@ -0,0 +1,242 @@
+/* Multibyte character I/O: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Mitsuru Chinen <mchinen@yamato.ibm.com>
+ and Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement multi-byte character input from a
+ stream.
+
+ mb_file_t
+ is the type for multibyte character input stream, usable for variable
+ declarations.
+
+ mbf_char_t
+ is the type for multibyte character or EOF, usable for variable
+ declarations.
+
+ mbf_init (mbf, stream)
+ initializes the MB_FILE for reading from stream.
+
+ mbf_getc (mbc, mbf)
+ reads the next multibyte character from mbf and stores it in mbc.
+
+ mb_iseof (mbc)
+ returns true if mbc represents the EOF value.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbf_init (mb_file_t mbf, FILE *stream);
+ extern void mbf_getc (mbf_char_t mbc, mb_file_t mbf);
+ extern bool mb_iseof (const mbf_char_t mbc);
+ */
+
+#ifndef _MBFILE_H
+#define _MBFILE_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+
+struct mbfile_multi {
+ FILE *fp;
+ bool eof_seen;
+ bool have_pushback;
+ mbstate_t state;
+ unsigned int bufcount;
+ char buf[MBCHAR_BUF_SIZE];
+ struct mbchar pushback;
+};
+
+static inline void
+mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf)
+{
+ size_t bytes;
+
+ /* If EOF has already been seen, don't use getc. This matters if
+ mbf->fp is connected to an interactive tty. */
+ if (mbf->eof_seen)
+ goto eof;
+
+ /* Return character pushed back, if there is one. */
+ if (mbf->have_pushback)
+ {
+ mb_copy (mbc, &mbf->pushback);
+ mbf->have_pushback = false;
+ return;
+ }
+
+ /* Before using mbrtowc, we need at least one byte. */
+ if (mbf->bufcount == 0)
+ {
+ int c = getc (mbf->fp);
+ if (c == EOF)
+ {
+ mbf->eof_seen = true;
+ goto eof;
+ }
+ mbf->buf[0] = (unsigned char) c;
+ mbf->bufcount++;
+ }
+
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (mbf->bufcount == 1 && mbsinit (&mbf->state) && is_basic (mbf->buf[0]))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ mbc->wc = mbc->buf[0] = mbf->buf[0];
+ mbc->wc_valid = true;
+ mbc->ptr = &mbc->buf[0];
+ mbc->bytes = 1;
+ mbf->bufcount = 0;
+ return;
+ }
+
+ /* Use mbrtowc on an increasing number of bytes. Read only as many bytes
+ from mbf->fp as needed. This is needed to give reasonable interactive
+ behaviour when mbf->fp is connected to an interactive tty. */
+ for (;;)
+ {
+ /* We don't know whether the 'mbrtowc' function updates the state when
+ it returns -2, - this is the ISO C 99 and glibc-2.2 behaviour - or
+ not - amended ANSI C, glibc-2.1 and Solaris 2.7 behaviour. We
+ don't have an autoconf test for this, yet.
+ The new behaviour would allow us to feed the bytes one by one into
+ mbrtowc. But the old behaviour forces us to feed all bytes since
+ the end of the last character into mbrtowc. Since we want to retry
+ with more bytes when mbrtowc returns -2, we must backup the state
+ before calling mbrtowc, because implementations with the new
+ behaviour will clobber it. */
+ mbstate_t backup_state = mbf->state;
+
+ bytes = mbrtowc (&mbc->wc, &mbf->buf[0], mbf->bufcount, &mbf->state);
+
+ if (bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ /* Return a single byte. */
+ bytes = 1;
+ mbc->wc_valid = false;
+ break;
+ }
+ else if (bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character. */
+ mbf->state = backup_state;
+ if (mbf->bufcount == MBCHAR_BUF_SIZE)
+ {
+ /* An overlong incomplete multibyte sequence was encountered. */
+ /* Return a single byte. */
+ bytes = 1;
+ mbc->wc_valid = false;
+ break;
+ }
+ else
+ {
+ /* Read one more byte and retry mbrtowc. */
+ int c = getc (mbf->fp);
+ if (c == EOF)
+ {
+ /* An incomplete multibyte character at the end. */
+ mbf->eof_seen = true;
+ bytes = mbf->bufcount;
+ mbc->wc_valid = false;
+ break;
+ }
+ mbf->buf[mbf->bufcount] = (unsigned char) c;
+ mbf->bufcount++;
+ }
+ }
+ else
+ {
+ if (bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ bytes = 1;
+ assert (mbf->buf[0] == '\0');
+ assert (mbc->wc == 0);
+ }
+ mbc->wc_valid = true;
+ break;
+ }
+ }
+
+ /* Return the multibyte sequence mbf->buf[0..bytes-1]. */
+ mbc->ptr = &mbc->buf[0];
+ memcpy (&mbc->buf[0], &mbf->buf[0], bytes);
+ mbc->bytes = bytes;
+
+ mbf->bufcount -= bytes;
+ if (mbf->bufcount > 0)
+ {
+ /* It's not worth calling memmove() for so few bytes. */
+ unsigned int count = mbf->bufcount;
+ char *p = &mbf->buf[0];
+
+ do
+ {
+ *p = *(p + bytes);
+ p++;
+ }
+ while (--count > 0);
+ }
+ return;
+
+eof:
+ /* An mbchar_t with bytes == 0 is used to indicate EOF. */
+ mbc->ptr = NULL;
+ mbc->bytes = 0;
+ mbc->wc_valid = false;
+ return;
+}
+
+static inline void
+mbfile_multi_ungetc (const struct mbchar *mbc, struct mbfile_multi *mbf)
+{
+ mb_copy (&mbf->pushback, mbc);
+ mbf->have_pushback = true;
+}
+
+typedef struct mbfile_multi mb_file_t;
+
+typedef mbchar_t mbf_char_t;
+
+#define mbf_init(mbf, stream) \
+ ((mbf).fp = (stream), \
+ (mbf).eof_seen = false, \
+ (mbf).have_pushback = false, \
+ memset (&(mbf).state, '\0', sizeof (mbstate_t)), \
+ (mbf).bufcount = 0)
+
+#define mbf_getc(mbc, mbf) mbfile_multi_getc (&(mbc), &(mbf))
+
+#define mbf_ungetc(mbc, mbf) mbfile_multi_ungetc (&(mbc), &(mbf))
+
+#define mb_iseof(mbc) ((mbc).bytes == 0)
+
+#endif /* _MBFILE_H */
diff --git a/gnulib/lib/mbiter.h b/gnulib/lib/mbiter.h
new file mode 100644
index 0000000..38cf6b1
--- /dev/null
+++ b/gnulib/lib/mbiter.h
@@ -0,0 +1,215 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; iter < buf + buflen; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbi_iterator_t iter;
+ for (mbi_init (iter, buf, buflen); mbi_avail (iter); mbi_advance (iter))
+ {
+ do_something (mbi_cur_ptr (iter), mb_len (mbi_cur (iter)));
+ }
+
+ The benefit of these macros over plain use of mbrtowc is:
+ - Handling of invalid multibyte sequences is possible without
+ making the code more complicated, while still preserving the
+ invalid multibyte sequences.
+
+ mbi_iterator_t
+ is a type usable for variable declarations.
+
+ mbi_init (iter, startptr, length)
+ initializes the iterator, starting at startptr and crossing length bytes.
+
+ mbi_avail (iter)
+ returns true if there are more multibyte chracters available before
+ the end of string is reached. In this case, mbi_cur (iter) is
+ initialized to the next multibyte chracter.
+
+ mbi_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbi_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbi_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbi_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbi_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbi_init (mbi_iterator_t iter,
+ const char *startptr, size_t length);
+ extern bool mbi_avail (mbi_iterator_t iter);
+ extern void mbi_advance (mbi_iterator_t iter);
+ extern mbchar_t mbi_cur (mbi_iterator_t iter);
+ extern const char * mbi_cur_ptr (mbi_iterator_t iter);
+ extern void mbi_reloc (mbi_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbi_copy (mbi_iterator_t *new, const mbi_iterator_t *old);
+ */
+
+#ifndef _MBITER_H
+#define _MBITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+
+struct mbiter_multi
+{
+ const char *limit; /* pointer to end of string */
+ bool in_shift; /* true if next byte may not be interpreted as ASCII */
+ mbstate_t state; /* if in_shift: current shift state */
+ bool next_done; /* true if mbi_avail has already filled the following */
+ struct mbchar cur; /* the current character:
+ const char *cur.ptr pointer to current character
+ The following are only valid after mbi_avail.
+ size_t cur.bytes number of bytes of current character
+ bool cur.wc_valid true if wc is a valid wide character
+ wchar_t cur.wc if wc_valid: the current character
+ */
+};
+
+static inline void
+mbiter_multi_next (struct mbiter_multi *iter)
+{
+ if (iter->next_done)
+ return;
+ if (iter->in_shift)
+ goto with_shift;
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (is_basic (*iter->cur.ptr))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ iter->cur.bytes = 1;
+ iter->cur.wc = *iter->cur.ptr;
+ iter->cur.wc_valid = true;
+ }
+ else
+ {
+ assert (mbsinit (&iter->state));
+ iter->in_shift = true;
+ with_shift:
+ iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr,
+ iter->limit - iter->cur.ptr, &iter->state);
+ if (iter->cur.bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ iter->cur.bytes = 1;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not very important; the string is bogus anyway. */
+ }
+ else if (iter->cur.bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character at the end. */
+ iter->cur.bytes = iter->limit - iter->cur.ptr;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not important; the string end is reached anyway. */
+ }
+ else
+ {
+ if (iter->cur.bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ iter->cur.bytes = 1;
+ assert (*iter->cur.ptr == '\0');
+ assert (iter->cur.wc == 0);
+ }
+ iter->cur.wc_valid = true;
+
+ /* When in the initial state, we can go back treating ASCII
+ characters more quickly. */
+ if (mbsinit (&iter->state))
+ iter->in_shift = false;
+ }
+ }
+ iter->next_done = true;
+}
+
+static inline void
+mbiter_multi_reloc (struct mbiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+ iter->limit += ptrdiff;
+}
+
+static inline void
+mbiter_multi_copy (struct mbiter_multi *new_iter, const struct mbiter_multi *old_iter)
+{
+ new_iter->limit = old_iter->limit;
+ if ((new_iter->in_shift = old_iter->in_shift))
+ memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t));
+ else
+ memset (&new_iter->state, 0, sizeof (mbstate_t));
+ new_iter->next_done = old_iter->next_done;
+ mb_copy (&new_iter->cur, &old_iter->cur);
+}
+
+/* Iteration macros. */
+typedef struct mbiter_multi mbi_iterator_t;
+#define mbi_init(iter, startptr, length) \
+ ((iter).cur.ptr = (startptr), (iter).limit = (iter).cur.ptr + (length), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbi_avail(iter) \
+ ((iter).cur.ptr < (iter).limit && (mbiter_multi_next (&(iter)), true))
+#define mbi_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbi_cur(iter) (iter).cur
+#define mbi_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbi_reloc(iter, ptrdiff) mbiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbi_copy mbiter_multi_copy
+
+#endif /* _MBITER_H */
diff --git a/gnulib/lib/mbmemcasecmp.c b/gnulib/lib/mbmemcasecmp.c
new file mode 100644
index 0000000..9f5d083
--- /dev/null
+++ b/gnulib/lib/mbmemcasecmp.c
@@ -0,0 +1,96 @@
+/* Compare two memory areas with possibly different lengths, case-insensitive.
+ Copyright (C) 1998-1999, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009,
+ based on earlier glibc code.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbmemcasecmp.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "mbiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+int
+mbmemcasecmp (const char *s1, size_t n1, const char *s2, size_t n2)
+{
+ if (s1 == s2)
+ return (n1 < n2 ? -1 : n1 > n2 ? 1 : 0);
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbi_iterator_t iter1;
+ mbi_iterator_t iter2;
+
+ mbi_init (iter1, s1, n1);
+ mbi_init (iter2, s2, n2);
+
+ while (mbi_avail (iter1) && mbi_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbi_cur (iter1), mbi_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ mbi_advance (iter1);
+ mbi_advance (iter2);
+ }
+ if (mbi_avail (iter1))
+ /* s2 terminated before s1. */
+ return 1;
+ if (mbi_avail (iter2))
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *s1_end = (const unsigned char *) (s1 + n1);
+ const unsigned char *s2_end = (const unsigned char *) (s2 + n2);
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+
+ while (p1 < s1_end && p2 < s2_end)
+ {
+ unsigned char c1 = TOLOWER (*p1);
+ unsigned char c2 = TOLOWER (*p2);
+ if (c1 != c2)
+ {
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same
+ size, the difference of two 'unsigned char' values
+ - including the sign bit - doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+ ++p1;
+ ++p2;
+ }
+ if (p1 < s1_end)
+ /* s2 terminated before s1. */
+ return 1;
+ if (p2 < s2_end)
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+}
diff --git a/gnulib/lib/mbmemcasecmp.h b/gnulib/lib/mbmemcasecmp.h
new file mode 100644
index 0000000..52b7166
--- /dev/null
+++ b/gnulib/lib/mbmemcasecmp.h
@@ -0,0 +1,45 @@
+/* Compare two memory areas with possibly different lengths, case-insensitive.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MBMEMCASECMP_H
+#define MBMEMCASECMP_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+N1-1], S2 = [s2..s2+n2-1], that
+ contain character sequences, lexicographically, ignoring case.
+ This function's result is locale dependent. Unlike memcasecmp(), it works
+ correctly in multibyte locales and also handles Turkish i / dotless i.
+ Unlike ulc_casecmp(), it does not handle the German sharp s and the Greek
+ final sigma. Unlike memcoll() and ulc_casecoll(), it ignores collation
+ order.
+ Return a negative number if S1 < S2, a positive number if S1 > S2, or
+ 0 if S1 and S2 have the same contents.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+extern int mbmemcasecmp (const char *s1, size_t n1, const char *s2, size_t n2);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MBMEMCASECMP_H */
diff --git a/gnulib/lib/mbmemcasecoll.c b/gnulib/lib/mbmemcasecoll.c
new file mode 100644
index 0000000..76694cb
--- /dev/null
+++ b/gnulib/lib/mbmemcasecoll.c
@@ -0,0 +1,190 @@
+/* Locale-specific case-ignoring memory comparison.
+ Copyright (C) 2001, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbmemcasecoll.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Get tolower(). */
+#include <ctype.h>
+
+/* Get mbstate_t, mbrtowc(), wcrtomb(). */
+#include <wchar.h>
+
+/* Get towlower(). */
+#include <wctype.h>
+
+#include "malloca.h"
+#include "memcmp2.h"
+#include "memcoll.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Apply towlower() to the multibyte character sequence in INBUF, storing the
+ result as a multibyte character sequence in OUTBUF. */
+static size_t
+apply_towlower (const char *inbuf, size_t inbufsize,
+ char *outbuf, size_t outbufsize)
+{
+ char *outbuf_orig = outbuf;
+ size_t remaining;
+
+ remaining = inbufsize;
+ while (remaining > 0)
+ {
+ wchar_t wc1;
+ size_t n1;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ n1 = mbrtowc (&wc1, inbuf, remaining, &state);
+ if (n1 == (size_t)(-2))
+ break;
+ if (n1 != (size_t)(-1))
+ {
+ wint_t wc2;
+
+ if (n1 == 0) /* NUL character? */
+ n1 = 1;
+
+ wc2 = towlower (wc1);
+ if (wc2 != wc1)
+ {
+ size_t n2;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ n2 = wcrtomb (outbuf, wc2, &state);
+ if (n2 != (size_t)(-1))
+ {
+ /* Store the translated multibyte character. */
+ inbuf += n1;
+ remaining -= n1;
+ outbuf += n2;
+ continue;
+ }
+ }
+
+ /* Nothing to translate. */
+ memcpy (outbuf, inbuf, n1);
+ inbuf += n1;
+ remaining -= n1;
+ outbuf += n1;
+ continue;
+ }
+
+ /* Invalid multibyte character on input.
+ Copy one byte without modification. */
+ *outbuf++ = *inbuf++;
+ remaining -= 1;
+ }
+ /* Incomplete multibyte sequence on input.
+ Pass it through unmodified. */
+ while (remaining > 0)
+ {
+ *outbuf++ = *inbuf++;
+ remaining -= 1;
+ }
+
+ /* Verify the output buffer was large enough. */
+ if (outbuf - outbuf_orig > outbufsize)
+ abort ();
+
+ /* Return the number of written output bytes. */
+ return outbuf - outbuf_orig;
+}
+
+/* Apply tolower() to the unibyte character sequence in INBUF, storing the
+ result as a unibyte character sequence in OUTBUF. */
+static void
+apply_tolower (const char *inbuf, char *outbuf, size_t bufsize)
+{
+ for (; bufsize > 0; bufsize--)
+ {
+ *outbuf = TOLOWER ((unsigned char) *inbuf);
+ inbuf++;
+ outbuf++;
+ }
+}
+
+int
+mbmemcasecoll (const char *s1, size_t s1len, const char *s2, size_t s2len,
+ bool hard_LC_COLLATE)
+{
+ char *t1;
+ size_t t1len;
+ char *t2;
+ size_t t2len;
+ char *memory;
+ int cmp;
+
+ if (MB_CUR_MAX > 1)
+ {
+ /* Application of towlower grows each character by a factor 2
+ at most. */
+ t1len = 2 * s1len;
+ t2len = 2 * s2len;
+ }
+ else
+ {
+ /* Application of tolower doesn't change the size. */
+ t1len = s1len;
+ t2len = s2len;
+ }
+ /* Allocate memory for t1 and t2. */
+ memory = (char *) malloca (t1len + 1 + t2len + 1);
+ if (memory == NULL)
+ {
+ errno = ENOMEM;
+ return 0;
+ }
+ t1 = memory;
+ t2 = memory + t1len + 1;
+
+ /* Csae-fold the two argument strings. */
+ if (MB_CUR_MAX > 1)
+ {
+ t1len = apply_towlower (s1, s1len, t1, t1len);
+ t2len = apply_towlower (s2, s2len, t2, t2len);
+ }
+ else
+ {
+ apply_tolower (s1, t1, s1len);
+ apply_tolower (s2, t2, s2len);
+ }
+
+ /* Compare the two case-folded strings. */
+ if (hard_LC_COLLATE)
+ cmp = memcoll (t1, t1len, t2, t2len);
+ else
+ {
+ cmp = memcmp2 (t1, t1len, t2, t2len);
+ errno = 0;
+ }
+
+ {
+ int saved_errno = errno;
+ freea (memory);
+ errno = saved_errno;
+ }
+
+ return cmp;
+}
diff --git a/gnulib/lib/mbmemcasecoll.h b/gnulib/lib/mbmemcasecoll.h
new file mode 100644
index 0000000..5fbb7da
--- /dev/null
+++ b/gnulib/lib/mbmemcasecoll.h
@@ -0,0 +1,58 @@
+/* Locale-specific case-ignoring memory comparison.
+ Copyright (C) 2001, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2001. */
+
+#ifndef MBMEMCASECOLL_H
+#define MBMEMCASECOLL_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+s1len-1], S2 = [s2..s2+s2len-1],
+ that contain character sequences, using the rules of the current locale,
+ ignoring case.
+ HARD_LC_COLLATE is false if the LC_COLLATE category of the current locale
+ is equivalent to the "C" locale.
+
+ This function's result is locale dependent. Unlike memcasecmp(), it works
+ correctly in multibyte locales and also handles Turkish i / dotless i.
+ Unlike ulc_casecmp(), it does not handle the German sharp s and the Greek
+ final sigma. Like memcoll() and ulc_casecoll(), it uses collation order.
+
+ Return a negative number if S1 < S2, a positive number if S1 > S2, 0 if
+ S1 and S2 have the same contents, or an unspecified value if there is an
+ error.
+ Set errno to an error number if there is an error, and to zero otherwise.
+
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+
+extern int mbmemcasecoll (const char *s1, size_t s1len,
+ const char *s2, size_t s2len,
+ bool hard_LC_COLLATE);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MBMEMCASECOLL_H */
diff --git a/gnulib/lib/mbrlen.c b/gnulib/lib/mbrlen.c
new file mode 100644
index 0000000..54d2c88
--- /dev/null
+++ b/gnulib/lib/mbrlen.c
@@ -0,0 +1,32 @@
+/* Recognize multibyte character.
+ Copyright (C) 1999-2000, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+
+static mbstate_t internal_state;
+
+size_t
+mbrlen (const char *s, size_t n, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &internal_state;
+ return mbrtowc (NULL, s, n, ps);
+}
diff --git a/gnulib/lib/mbrtowc.c b/gnulib/lib/mbrtowc.c
new file mode 100644
index 0000000..7a8e599
--- /dev/null
+++ b/gnulib/lib/mbrtowc.c
@@ -0,0 +1,396 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 1999-2002, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#if GNULIB_defined_mbstate_t
+/* Implement mbrtowc() on top of mbtowc(). */
+
+# include <errno.h>
+# include <stdlib.h>
+
+# include "localcharset.h"
+# include "streq.h"
+# include "verify.h"
+
+
+verify (sizeof (mbstate_t) >= 4);
+
+static char internal_state[4];
+
+size_t
+mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+ char *pstate = (char *)ps;
+
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+
+ if (n == 0)
+ return (size_t)(-2);
+
+ /* Here n > 0. */
+
+ if (pstate == NULL)
+ pstate = internal_state;
+
+ {
+ size_t nstate = pstate[0];
+ char buf[4];
+ const char *p;
+ size_t m;
+
+ switch (nstate)
+ {
+ case 0:
+ p = s;
+ m = n;
+ break;
+ case 3:
+ buf[2] = pstate[3];
+ /*FALLTHROUGH*/
+ case 2:
+ buf[1] = pstate[2];
+ /*FALLTHROUGH*/
+ case 1:
+ buf[0] = pstate[1];
+ p = buf;
+ m = nstate;
+ buf[m++] = s[0];
+ if (n >= 2 && m < 4)
+ {
+ buf[m++] = s[1];
+ if (n >= 3 && m < 4)
+ buf[m++] = s[2];
+ }
+ break;
+ default:
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+ /* Here m > 0. */
+
+# if __GLIBC__ || defined __UCLIBC__
+ /* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */
+ mbtowc (NULL, NULL, 0);
+# endif
+ {
+ int res = mbtowc (pwc, p, m);
+
+ if (res >= 0)
+ {
+ if (pwc != NULL && ((*pwc == 0) != (res == 0)))
+ abort ();
+ if (nstate >= (res > 0 ? res : 1))
+ abort ();
+ res -= nstate;
+ pstate[0] = 0;
+ return res;
+ }
+
+ /* mbtowc does not distinguish between invalid and incomplete multibyte
+ sequences. But mbrtowc needs to make this distinction.
+ There are two possible approaches:
+ - Use iconv() and its return value.
+ - Use built-in knowledge about the possible encodings.
+ Given the low quality of implementation of iconv() on the systems that
+ lack mbrtowc(), we use the second approach.
+ The possible encodings are:
+ - 8-bit encodings,
+ - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
+ - UTF-8.
+ Use specialized code for each. */
+ if (m >= 4 || m >= MB_CUR_MAX)
+ goto invalid;
+ /* Here MB_CUR_MAX > 1 and 0 < m < 4. */
+ {
+ const char *encoding = locale_charset ();
+
+ if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ {
+ /* Cf. unistr/u8-mblen.c. */
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (m == 1)
+ goto incomplete;
+ }
+ else if (c < 0xf0)
+ {
+ if (m == 1)
+ goto incomplete;
+ if (m == 2)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xe1 || c2 >= 0xa0)
+ && (c != 0xed || c2 < 0xa0))
+ goto incomplete;
+ }
+ }
+ else if (c <= 0xf4)
+ {
+ if (m == 1)
+ goto incomplete;
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xf1 || c2 >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && c2 < 0x90)))
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m == 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if ((c3 ^ 0x80) < 0x40)
+ goto incomplete;
+ }
+ }
+ }
+ }
+ }
+ goto invalid;
+ }
+
+ /* As a reference for this code, you can use the GNU libiconv
+ implementation. Look for uses of the RET_TOOFEW macro. */
+
+ if (STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f)
+ goto incomplete;
+ }
+ if (m == 2)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8f)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0xa1 && c2 < 0xff)
+ goto incomplete;
+ }
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0xa1 && c < 0xff)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e)
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8e)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0x90 && c <= 0xe3)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0x30 && c2 <= 0x39)
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m == 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if (c3 >= 0x81 && c3 <= 0xfe)
+ goto incomplete;
+ }
+ }
+ }
+ }
+ goto invalid;
+ }
+ if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)
+ || (c >= 0xf0 && c <= 0xf9))
+ goto incomplete;
+ }
+ goto invalid;
+ }
+
+ /* An unknown multibyte encoding. */
+ goto incomplete;
+ }
+
+ incomplete:
+ {
+ size_t k = nstate;
+ /* Here 0 <= k < m < 4. */
+ pstate[++k] = s[0];
+ if (k < m)
+ {
+ pstate[++k] = s[1];
+ if (k < m)
+ pstate[++k] = s[2];
+ }
+ if (k != m)
+ abort ();
+ }
+ pstate[0] = m;
+ return (size_t)(-2);
+
+ invalid:
+ errno = EILSEQ;
+ /* The conversion state is undefined, says POSIX. */
+ return (size_t)(-1);
+ }
+ }
+}
+
+#else
+/* Override the system's mbrtowc() function. */
+
+# undef mbrtowc
+
+size_t
+rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+# if MBRTOWC_NULL_ARG2_BUG || MBRTOWC_RETVAL_BUG
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+# endif
+
+# if MBRTOWC_RETVAL_BUG
+ {
+ static mbstate_t internal_state;
+
+ /* Override mbrtowc's internal state. We cannot call mbsinit() on the
+ hidden internal state, but we can call it on our variable. */
+ if (ps == NULL)
+ ps = &internal_state;
+
+ if (!mbsinit (ps))
+ {
+ /* Parse the rest of the multibyte character byte for byte. */
+ size_t count = 0;
+ for (; n > 0; s++, n--)
+ {
+ wchar_t wc;
+ size_t ret = mbrtowc (&wc, s, 1, ps);
+
+ if (ret == (size_t)(-1))
+ return (size_t)(-1);
+ count++;
+ if (ret != (size_t)(-2))
+ {
+ /* The multibyte character has been completed. */
+ if (pwc != NULL)
+ *pwc = wc;
+ return (wc == 0 ? 0 : count);
+ }
+ }
+ return (size_t)(-2);
+ }
+ }
+# endif
+
+# if MBRTOWC_NUL_RETVAL_BUG
+ {
+ wchar_t wc;
+ size_t ret = mbrtowc (&wc, s, n, ps);
+
+ if (ret != (size_t)(-1) && ret != (size_t)(-2))
+ {
+ if (pwc != NULL)
+ *pwc = wc;
+ if (wc == 0)
+ ret = 0;
+ }
+ return ret;
+ }
+# else
+ {
+# if MBRTOWC_NULL_ARG1_BUG
+ wchar_t dummy;
+
+ if (pwc == NULL)
+ pwc = &dummy;
+# endif
+
+ return mbrtowc (pwc, s, n, ps);
+ }
+# endif
+}
+
+#endif
diff --git a/gnulib/lib/mbscasecmp.c b/gnulib/lib/mbscasecmp.c
new file mode 100644
index 0000000..dfff49c
--- /dev/null
+++ b/gnulib/lib/mbscasecmp.c
@@ -0,0 +1,98 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005,
+ based on earlier glibc code.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths! */
+int
+mbscasecmp (const char *s1, const char *s2)
+{
+ if (s1 == s2)
+ return 0;
+
+ /* Be careful not to look at the entire extent of s1 or s2 until needed.
+ This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, s1);
+ mbui_init (iter2, s2);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (mbui_avail (iter1))
+ /* s2 terminated before s1. */
+ return 1;
+ if (mbui_avail (iter2))
+ /* s1 terminated before s2. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+}
diff --git a/gnulib/lib/mbscasestr.c b/gnulib/lib/mbscasestr.c
new file mode 100644
index 0000000..f013808
--- /dev/null
+++ b/gnulib/lib/mbscasestr.c
@@ -0,0 +1,412 @@
+/* Case-insensitive searching in a string.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stddef.h> /* for NULL, in case a nonstandard string.h lacks it */
+
+#include "malloca.h"
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Knuth-Morris-Pratt algorithm. */
+#define UNIT unsigned char
+#define CANON_ELEMENT(c) TOLOWER (c)
+#include "str-kmp.h"
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt_multibyte (const char *haystack, const char *needle,
+ const char **resultp)
+{
+ size_t m = mbslen (needle);
+ mbchar_t *needle_mbchars;
+ size_t *table;
+
+ /* Allocate room for needle_mbchars and the table. */
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
+ if (memory == NULL)
+ return false;
+ needle_mbchars = (mbchar_t *) memory;
+ table = (size_t *) (memory + m * sizeof (mbchar_t));
+
+ /* Fill needle_mbchars. */
+ {
+ mbui_iterator_t iter;
+ size_t j;
+
+ j = 0;
+ for (mbui_init (iter, needle); mbui_avail (iter); mbui_advance (iter), j++)
+ {
+ mb_copy (&needle_mbchars[j], &mbui_cur (iter));
+ if (needle_mbchars[j].wc_valid)
+ needle_mbchars[j].wc = towlower (needle_mbchars[j].wc);
+ }
+ }
+
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ mbchar_t *b = &needle_mbchars[i - 1];
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (mb_equal (*b, needle_mbchars[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ mbui_init (rhaystack, haystack);
+ mbui_init (phaystack, haystack);
+ /* Invariant: phaystack = rhaystack + j. */
+ while (mbui_avail (phaystack))
+ {
+ mbchar_t c;
+
+ mb_copy (&c, &mbui_cur (phaystack));
+ if (c.wc_valid)
+ c.wc = towlower (c.wc);
+ if (mb_equal (needle_mbchars[j], c))
+ {
+ j++;
+ mbui_advance (phaystack);
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = mbui_cur_ptr (rhaystack);
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ size_t count = table[j];
+ j -= count;
+ for (; count > 0; count--)
+ {
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ }
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ mbui_advance (phaystack);
+ }
+ }
+ }
+
+ freea (memory);
+ return true;
+}
+
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) ! */
+char *
+mbscasestr (const char *haystack, const char *needle)
+{
+ /* Be careful not to look at the entire extent of haystack or needle
+ until needed. This is useful because of these two cases:
+ - haystack may be very long, and a match of needle found early,
+ - needle may be very long, and not even a short initial segment of
+ needle may be found in haystack. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter_needle;
+
+ mbui_init (iter_needle, needle);
+ if (mbui_avail (iter_needle))
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = mbslen(haystack), m = mbslen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ mbui_iterator_t iter_needle_last_ccount; /* = needle + last_ccount */
+
+ mbchar_t b;
+ mbui_iterator_t iter_haystack;
+
+ mbui_init (iter_needle_last_ccount, needle);
+
+ mb_copy (&b, &mbui_cur (iter_needle));
+ if (b.wc_valid)
+ b.wc = towlower (b.wc);
+
+ mbui_init (iter_haystack, haystack);
+ for (;; mbui_advance (iter_haystack))
+ {
+ mbchar_t c;
+
+ if (!mbui_avail (iter_haystack))
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ size_t count = comparison_count - last_ccount;
+ for (;
+ count > 0 && mbui_avail (iter_needle_last_ccount);
+ count--)
+ mbui_advance (iter_needle_last_ccount);
+ last_ccount = comparison_count;
+ if (!mbui_avail (iter_needle_last_ccount))
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_multibyte (haystack, needle,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ mb_copy (&c, &mbui_cur (iter_haystack));
+ if (c.wc_valid)
+ c.wc = towlower (c.wc);
+ if (mb_equal (c, b))
+ /* The first character matches. */
+ {
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t rneedle;
+
+ memcpy (&rhaystack, &iter_haystack, sizeof (mbui_iterator_t));
+ mbui_advance (rhaystack);
+
+ mbui_init (rneedle, needle);
+ if (!mbui_avail (rneedle))
+ abort ();
+ mbui_advance (rneedle);
+
+ for (;; mbui_advance (rhaystack), mbui_advance (rneedle))
+ {
+ if (!mbui_avail (rneedle))
+ /* Found a match. */
+ return (char *) mbui_cur_ptr (iter_haystack);
+ if (!mbui_avail (rhaystack))
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (!mb_caseequal (mbui_cur (rhaystack),
+ mbui_cur (rneedle)))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+ else
+ {
+ if (*needle != '\0')
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = strlen(haystack), m = strlen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ const char *needle_last_ccount = needle; /* = needle + last_ccount */
+
+ /* Speed up the following searches of needle by caching its first
+ character. */
+ unsigned char b = TOLOWER ((unsigned char) *needle);
+
+ needle++;
+ for (;; haystack++)
+ {
+ if (*haystack == '\0')
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ if (needle_last_ccount != NULL)
+ {
+ needle_last_ccount +=
+ strnlen (needle_last_ccount,
+ comparison_count - last_ccount);
+ if (*needle_last_ccount == '\0')
+ needle_last_ccount = NULL;
+ last_ccount = comparison_count;
+ }
+ if (needle_last_ccount == NULL)
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const unsigned char *result;
+ bool success =
+ knuth_morris_pratt ((const unsigned char *) haystack,
+ (const unsigned char *) (needle - 1),
+ strlen (needle - 1),
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (TOLOWER ((unsigned char) *haystack) == b)
+ /* The first character matches. */
+ {
+ const char *rhaystack = haystack + 1;
+ const char *rneedle = needle;
+
+ for (;; rhaystack++, rneedle++)
+ {
+ if (*rneedle == '\0')
+ /* Found a match. */
+ return (char *) haystack;
+ if (*rhaystack == '\0')
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (TOLOWER ((unsigned char) *rhaystack)
+ != TOLOWER ((unsigned char) *rneedle))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+}
diff --git a/gnulib/lib/mbschr.c b/gnulib/lib/mbschr.c
new file mode 100644
index 0000000..c43ac66
--- /dev/null
+++ b/gnulib/lib/mbschr.c
@@ -0,0 +1,52 @@
+/* Searching a string for a character.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING. */
+char *
+mbschr (const char *string, int c)
+{
+ if (MB_CUR_MAX > 1
+ /* Optimization: We know that ASCII characters < 0x30 don't occur as
+ part of multibyte characters longer than 1 byte. Hence, if c < 0x30,
+ the faster unibyte loop can be used. */
+ && (unsigned char) c >= 0x30)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string);; mbui_advance (iter))
+ {
+ if (!mbui_avail (iter))
+ goto notfound;
+ if (mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == (unsigned char) c)
+ break;
+ }
+ return (char *) mbui_cur_ptr (iter);
+ notfound:
+ return NULL;
+ }
+ else
+ return strchr (string, c);
+}
diff --git a/gnulib/lib/mbscspn.c b/gnulib/lib/mbscspn.c
new file mode 100644
index 0000000..68ac1c7
--- /dev/null
+++ b/gnulib/lib/mbscspn.c
@@ -0,0 +1,68 @@
+/* Searching a string for a character among a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists. */
+size_t
+mbscspn (const char *string, const char *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == '\0')
+ return strlen (string);
+ if (accept[1] == '\0')
+ {
+ const char *ptr = mbschr (string, accept[0]);
+ return (ptr != NULL ? ptr - string : strlen (string));
+ }
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (accept, * mbui_cur_ptr (iter)))
+ goto found;
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, accept);
+ mbui_avail (aiter);
+ mbui_advance (aiter))
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ goto found;
+ }
+ }
+ found:
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ return strcspn (string, accept);
+}
diff --git a/gnulib/lib/mbsinit.c b/gnulib/lib/mbsinit.c
new file mode 100644
index 0000000..8ac2137
--- /dev/null
+++ b/gnulib/lib/mbsinit.c
@@ -0,0 +1,61 @@
+/* Test for initial conversion state.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "verify.h"
+
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+
+/* On native Windows, 'mbstate_t' is defined as 'int'. */
+
+int
+mbsinit (const mbstate_t *ps)
+{
+ return ps == NULL || *ps == 0;
+}
+
+#else
+
+/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
+ and wcrtomb(), wcsrtombs().
+ We assume that
+ - sizeof (mbstate_t) >= 4,
+ - only stateless encodings are supported (such as UTF-8 and EUC-JP, but
+ not ISO-2022 variants),
+ - for each encoding, the number of bytes for a wide character is <= 4.
+ (This maximum is attained for UTF-8, GB18030, EUC-TW.)
+ We define the meaning of mbstate_t as follows:
+ - In mb -> wc direction, mbstate_t's first byte contains the number of
+ buffered bytes (in the range 0..3), followed by up to 3 buffered bytes.
+ - In wc -> mb direction, mbstate_t contains no information. In other
+ words, it is always in the initial state. */
+
+verify (sizeof (mbstate_t) >= 4);
+
+int
+mbsinit (const mbstate_t *ps)
+{
+ const char *pstate = (const char *)ps;
+
+ return pstate == NULL || pstate[0] == 0;
+}
+
+#endif
diff --git a/gnulib/lib/mbslen.c b/gnulib/lib/mbslen.c
new file mode 100644
index 0000000..efddd52
--- /dev/null
+++ b/gnulib/lib/mbslen.c
@@ -0,0 +1,44 @@
+/* Counting the multibyte characters in a string.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "mbuiter.h"
+
+/* Return the number of multibyte characters in the character string STRING. */
+size_t
+mbslen (const char *string)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ size_t count;
+ mbui_iterator_t iter;
+
+ count = 0;
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ count++;
+
+ return count;
+ }
+ else
+ return strlen (string);
+}
diff --git a/gnulib/lib/mbsncasecmp.c b/gnulib/lib/mbsncasecmp.c
new file mode 100644
index 0000000..3a05dd8
--- /dev/null
+++ b/gnulib/lib/mbsncasecmp.c
@@ -0,0 +1,99 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005,
+ based on earlier glibc code.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths! */
+int
+mbsncasecmp (const char *s1, const char *s2, size_t n)
+{
+ if (s1 == s2 || n == 0)
+ return 0;
+
+ /* Be careful not to look at the entire extent of s1 or s2 until needed.
+ This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, s1);
+ mbui_init (iter2, s2);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return cmp;
+
+ if (--n == 0)
+ return 0;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (mbui_avail (iter1))
+ /* s2 terminated before s1 and n. */
+ return 1;
+ if (mbui_avail (iter2))
+ /* s1 terminated before s2 and n. */
+ return -1;
+ return 0;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ for (; ; p1++, p2++)
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0' || c1 != c2)
+ break;
+ }
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+ }
+}
diff --git a/gnulib/lib/mbsnlen.c b/gnulib/lib/mbsnlen.c
new file mode 100644
index 0000000..e597d5a
--- /dev/null
+++ b/gnulib/lib/mbsnlen.c
@@ -0,0 +1,45 @@
+/* Counting the multibyte characters in a string.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#include "mbiter.h"
+
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+size_t
+mbsnlen (const char *string, size_t len)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ size_t count;
+ mbi_iterator_t iter;
+
+ count = 0;
+ for (mbi_init (iter, string, len); mbi_avail (iter); mbi_advance (iter))
+ count++;
+
+ return count;
+ }
+ else
+ return len;
+}
diff --git a/gnulib/lib/mbsnrtowcs-impl.h b/gnulib/lib/mbsnrtowcs-impl.h
new file mode 100644
index 0000000..719f56b
--- /dev/null
+++ b/gnulib/lib/mbsnrtowcs-impl.h
@@ -0,0 +1,124 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+mbsnrtowcs (wchar_t *dest, const char **srcp, size_t srclen, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_mbsrtowcs_state;
+ {
+ const char *src = *srcp;
+
+ if (dest != NULL)
+ {
+ wchar_t *destptr = dest;
+
+ for (; srclen > 0 && len > 0; destptr++, len--)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MIN (srclen, MB_LEN_MAX)); */
+ if (srclen == 1 || src[0] == '\0')
+ src_avail = 1;
+ else if (srclen == 2 || src[1] == '\0')
+ src_avail = 2;
+ else if (srclen == 3 || src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || srclen == 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MIN (srclen, MB_LEN_MAX) - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (destptr, src, src_avail, ps);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (ret == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ src += ret;
+ srclen -= ret;
+ }
+
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (; srclen > 0; totalcount++)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MIN (srclen, MB_LEN_MAX)); */
+ if (srclen == 1 || src[0] == '\0')
+ src_avail = 1;
+ else if (srclen == 2 || src[1] == '\0')
+ src_avail = 2;
+ else if (srclen == 3 || src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || srclen == 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MIN (srclen, MB_LEN_MAX) - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (NULL, src, src_avail, &state);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (ret == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ src += ret;
+ srclen -= ret;
+ }
+
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/mbsnrtowcs.c b/gnulib/lib/mbsnrtowcs.c
new file mode 100644
index 0000000..c37c8f7
--- /dev/null
+++ b/gnulib/lib/mbsnrtowcs.c
@@ -0,0 +1,33 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "strnlen1.h"
+
+
+extern mbstate_t _gl_mbsrtowcs_state;
+
+#include "mbsnrtowcs-impl.h"
diff --git a/gnulib/lib/mbspbrk.c b/gnulib/lib/mbspbrk.c
new file mode 100644
index 0000000..e61ea9e
--- /dev/null
+++ b/gnulib/lib/mbspbrk.c
@@ -0,0 +1,63 @@
+/* Searching a string for a character among a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists. */
+char *
+mbspbrk (const char *string, const char *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == '\0')
+ return NULL;
+ if (accept[1] == '\0')
+ return mbschr (string, accept[0]);
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (accept, * mbui_cur_ptr (iter)))
+ return (char *) mbui_cur_ptr (iter);
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, accept);
+ mbui_avail (aiter);
+ mbui_advance (aiter))
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ return (char *) mbui_cur_ptr (iter);
+ }
+ }
+ return NULL;
+ }
+ else
+ return strpbrk (string, accept);
+}
diff --git a/gnulib/lib/mbspcasecmp.c b/gnulib/lib/mbspcasecmp.c
new file mode 100644
index 0000000..f331c2b
--- /dev/null
+++ b/gnulib/lib/mbspcasecmp.c
@@ -0,0 +1,94 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+
+#include "mbuiter.h"
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case. If the two match, return a pointer to the first byte
+ after this prefix in STRING. Otherwise, return NULL.
+ Note: This function may, in multibyte locales, return non-NULL if STRING
+ is of smaller length than PREFIX! */
+char *
+mbspcasecmp (const char *string, const char *prefix)
+{
+ /* This is essentially the same as
+ mbsncasecmp (string, prefix, mbslen (prefix))
+ just with small optimizations. */
+ if (string == prefix)
+ return (char *) (string + strlen (string));
+
+ /* Be careful not to look at the entire extent of STRING or PREFIX until
+ needed. This is useful because when two strings differ, the difference is
+ most often already in the very few first characters. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter1;
+ mbui_iterator_t iter2;
+
+ mbui_init (iter1, string);
+ mbui_init (iter2, prefix);
+
+ while (mbui_avail (iter1) && mbui_avail (iter2))
+ {
+ int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
+
+ if (cmp != 0)
+ return NULL;
+
+ mbui_advance (iter1);
+ mbui_advance (iter2);
+ }
+ if (!mbui_avail (iter2))
+ /* PREFIX equals STRING or is terminated before STRING. */
+ return (char *) mbui_cur_ptr (iter1);
+ else
+ /* STRING terminated before PREFIX. */
+ return NULL;
+ }
+ else
+ {
+ const unsigned char *p1 = (const unsigned char *) string;
+ const unsigned char *p2 = (const unsigned char *) prefix;
+ unsigned char c1, c2;
+
+ for (; ; p1++, p2++)
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c2 == '\0' || c1 != c2)
+ break;
+ }
+
+ if (c2 == '\0')
+ /* PREFIX equals STRING or is terminated before STRING. */
+ return (char *) p1;
+ else
+ /* STRING terminated before PREFIX. */
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/mbsrchr.c b/gnulib/lib/mbsrchr.c
new file mode 100644
index 0000000..c505c68
--- /dev/null
+++ b/gnulib/lib/mbsrchr.c
@@ -0,0 +1,49 @@
+/* Searching a string for the last occurrence of a character.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING. */
+char *
+mbsrchr (const char *string, int c)
+{
+ if (MB_CUR_MAX > 1
+ /* Optimization: We know that ASCII characters < 0x30 don't occur as
+ part of multibyte characters longer than 1 byte. Hence, if c < 0x30,
+ the faster unibyte loop can be used. */
+ && (unsigned char) c >= 0x30)
+ {
+ const char *result = NULL;
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == (unsigned char) c)
+ result = mbui_cur_ptr (iter);
+ }
+ return (char *) result;
+ }
+ else
+ return strrchr (string, c);
+}
diff --git a/gnulib/lib/mbsrtowcs-impl.h b/gnulib/lib/mbsrtowcs-impl.h
new file mode 100644
index 0000000..e78bbfb
--- /dev/null
+++ b/gnulib/lib/mbsrtowcs-impl.h
@@ -0,0 +1,122 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_mbsrtowcs_state;
+ {
+ const char *src = *srcp;
+
+ if (dest != NULL)
+ {
+ wchar_t *destptr = dest;
+
+ for (; len > 0; destptr++, len--)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (destptr, src, src_avail, ps);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (ret == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ src += ret;
+ }
+
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (;; totalcount++)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = mbrtowc (NULL, src, src_avail, &state);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (ret == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ src += ret;
+ }
+
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/mbsrtowcs-state.c b/gnulib/lib/mbsrtowcs-state.c
new file mode 100644
index 0000000..91073b5
--- /dev/null
+++ b/gnulib/lib/mbsrtowcs-state.c
@@ -0,0 +1,37 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+/* Internal state used by the functions mbsrtowcs() and mbsnrtowcs(). */
+mbstate_t _gl_mbsrtowcs_state
+/* The state must initially be in the "initial state"; so, zero-initialize it.
+ On most systems, putting it into BSS is sufficient. Not so on MacOS X 10.3,
+ see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
+ When it needs an initializer, use 0 or {0} as initializer? 0 only works
+ when mbstate_t is a scalar type (such as when gnulib defines it, or on
+ AIX, IRIX, mingw). {0} works as an initializer in all cases: for a struct
+ or union type, but also for a scalar type (ISO C 99, 6.7.8.(11)). */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ /* Use braces, to be on the safe side. */
+ = { 0 }
+#endif
+ ;
diff --git a/gnulib/lib/mbsrtowcs.c b/gnulib/lib/mbsrtowcs.c
new file mode 100644
index 0000000..69e6dff
--- /dev/null
+++ b/gnulib/lib/mbsrtowcs.c
@@ -0,0 +1,32 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "strnlen1.h"
+
+
+extern mbstate_t _gl_mbsrtowcs_state;
+
+#include "mbsrtowcs-impl.h"
diff --git a/gnulib/lib/mbssep.c b/gnulib/lib/mbssep.c
new file mode 100644
index 0000000..42e791e
--- /dev/null
+++ b/gnulib/lib/mbssep.c
@@ -0,0 +1,61 @@
+/* Tokenizing a string.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+char *
+mbssep (char **stringp, const char *delim)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ char *start = *stringp;
+ char *ptr;
+
+ if (start == NULL)
+ return NULL;
+
+ /* No need to optimize the cases of 0 or 1 delimiters specially,
+ since mbspbrk already optimizes them. */
+
+ ptr = mbspbrk (start, delim);
+
+ if (ptr == NULL)
+ {
+ *stringp = NULL;
+ return start;
+ }
+ else
+ {
+ mbui_iterator_t iter;
+
+ mbui_init (iter, ptr);
+ if (!mbui_avail (iter))
+ abort ();
+ mbui_advance (iter);
+ *ptr = '\0';
+ *stringp = (char *) mbui_cur_ptr (iter);
+ return start;
+ }
+ }
+ else
+ return strsep (stringp, delim);
+}
diff --git a/gnulib/lib/mbsspn.c b/gnulib/lib/mbsspn.c
new file mode 100644
index 0000000..ec8d7fa
--- /dev/null
+++ b/gnulib/lib/mbsspn.c
@@ -0,0 +1,89 @@
+/* Searching a string for a character outside a given set of characters.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists. */
+size_t
+mbsspn (const char *string, const char *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == '\0')
+ return 0;
+ if (reject[1] == '\0')
+ {
+ unsigned char uc = (unsigned char) reject[0];
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ if (!(mb_len (mbui_cur (iter)) == 1
+ && (unsigned char) * mbui_cur_ptr (iter) == uc))
+ break;
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ {
+ const char *ptr;
+
+ for (ptr = string; *ptr != '\0'; ptr++)
+ if ((unsigned char) *ptr != uc)
+ break;
+ return ptr - string;
+ }
+ }
+ /* General case. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ if (mb_len (mbui_cur (iter)) == 1)
+ {
+ if (mbschr (reject, * mbui_cur_ptr (iter)) == NULL)
+ goto found;
+ }
+ else
+ {
+ mbui_iterator_t aiter;
+
+ for (mbui_init (aiter, reject);; mbui_advance (aiter))
+ {
+ if (!mbui_avail (aiter))
+ goto found;
+ if (mb_equal (mbui_cur (aiter), mbui_cur (iter)))
+ break;
+ }
+ }
+ }
+ found:
+ return mbui_cur_ptr (iter) - string;
+ }
+ else
+ return strspn (string, reject);
+}
diff --git a/gnulib/lib/mbsstr.c b/gnulib/lib/mbsstr.c
new file mode 100644
index 0000000..611000e
--- /dev/null
+++ b/gnulib/lib/mbsstr.c
@@ -0,0 +1,382 @@
+/* Searching in a string.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <stdbool.h>
+#include <stddef.h> /* for NULL, in case a nonstandard string.h lacks it */
+
+#include "malloca.h"
+#include "mbuiter.h"
+
+/* Knuth-Morris-Pratt algorithm. */
+#define UNIT unsigned char
+#define CANON_ELEMENT(c) c
+#include "str-kmp.h"
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt_multibyte (const char *haystack, const char *needle,
+ const char **resultp)
+{
+ size_t m = mbslen (needle);
+ mbchar_t *needle_mbchars;
+ size_t *table;
+
+ /* Allocate room for needle_mbchars and the table. */
+ char *memory = (char *) nmalloca (m, sizeof (mbchar_t) + sizeof (size_t));
+ if (memory == NULL)
+ return false;
+ needle_mbchars = (mbchar_t *) memory;
+ table = (size_t *) (memory + m * sizeof (mbchar_t));
+
+ /* Fill needle_mbchars. */
+ {
+ mbui_iterator_t iter;
+ size_t j;
+
+ j = 0;
+ for (mbui_init (iter, needle); mbui_avail (iter); mbui_advance (iter), j++)
+ mb_copy (&needle_mbchars[j], &mbui_cur (iter));
+ }
+
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ mbchar_t *b = &needle_mbchars[i - 1];
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (mb_equal (*b, needle_mbchars[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ mbui_init (rhaystack, haystack);
+ mbui_init (phaystack, haystack);
+ /* Invariant: phaystack = rhaystack + j. */
+ while (mbui_avail (phaystack))
+ if (mb_equal (needle_mbchars[j], mbui_cur (phaystack)))
+ {
+ j++;
+ mbui_advance (phaystack);
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = mbui_cur_ptr (rhaystack);
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ size_t count = table[j];
+ j -= count;
+ for (; count > 0; count--)
+ {
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ }
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ if (!mbui_avail (rhaystack))
+ abort ();
+ mbui_advance (rhaystack);
+ mbui_advance (phaystack);
+ }
+ }
+
+ freea (memory);
+ return true;
+}
+
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK. */
+char *
+mbsstr (const char *haystack, const char *needle)
+{
+ /* Be careful not to look at the entire extent of haystack or needle
+ until needed. This is useful because of these two cases:
+ - haystack may be very long, and a match of needle found early,
+ - needle may be very long, and not even a short initial segment of
+ needle may be found in haystack. */
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t iter_needle;
+
+ mbui_init (iter_needle, needle);
+ if (mbui_avail (iter_needle))
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = mbslen(haystack), m = mbslen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ mbui_iterator_t iter_needle_last_ccount; /* = needle + last_ccount */
+
+ mbui_iterator_t iter_haystack;
+
+ mbui_init (iter_needle_last_ccount, needle);
+ mbui_init (iter_haystack, haystack);
+ for (;; mbui_advance (iter_haystack))
+ {
+ if (!mbui_avail (iter_haystack))
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ size_t count = comparison_count - last_ccount;
+ for (;
+ count > 0 && mbui_avail (iter_needle_last_ccount);
+ count--)
+ mbui_advance (iter_needle_last_ccount);
+ last_ccount = comparison_count;
+ if (!mbui_avail (iter_needle_last_ccount))
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const char *result;
+ bool success =
+ knuth_morris_pratt_multibyte (haystack, needle,
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (mb_equal (mbui_cur (iter_haystack), mbui_cur (iter_needle)))
+ /* The first character matches. */
+ {
+ mbui_iterator_t rhaystack;
+ mbui_iterator_t rneedle;
+
+ memcpy (&rhaystack, &iter_haystack, sizeof (mbui_iterator_t));
+ mbui_advance (rhaystack);
+
+ mbui_init (rneedle, needle);
+ if (!mbui_avail (rneedle))
+ abort ();
+ mbui_advance (rneedle);
+
+ for (;; mbui_advance (rhaystack), mbui_advance (rneedle))
+ {
+ if (!mbui_avail (rneedle))
+ /* Found a match. */
+ return (char *) mbui_cur_ptr (iter_haystack);
+ if (!mbui_avail (rhaystack))
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (!mb_equal (mbui_cur (rhaystack), mbui_cur (rneedle)))
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+ else
+ {
+ if (*needle != '\0')
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = strlen(haystack), m = strlen(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ const char *needle_last_ccount = needle; /* = needle + last_ccount */
+
+ /* Speed up the following searches of needle by caching its first
+ character. */
+ char b = *needle++;
+
+ for (;; haystack++)
+ {
+ if (*haystack == '\0')
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ if (needle_last_ccount != NULL)
+ {
+ needle_last_ccount +=
+ strnlen (needle_last_ccount,
+ comparison_count - last_ccount);
+ if (*needle_last_ccount == '\0')
+ needle_last_ccount = NULL;
+ last_ccount = comparison_count;
+ }
+ if (needle_last_ccount == NULL)
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const unsigned char *result;
+ bool success =
+ knuth_morris_pratt ((const unsigned char *) haystack,
+ (const unsigned char *) (needle - 1),
+ strlen (needle - 1),
+ &result);
+ if (success)
+ return (char *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (*haystack == b)
+ /* The first character matches. */
+ {
+ const char *rhaystack = haystack + 1;
+ const char *rneedle = needle;
+
+ for (;; rhaystack++, rneedle++)
+ {
+ if (*rneedle == '\0')
+ /* Found a match. */
+ return (char *) haystack;
+ if (*rhaystack == '\0')
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (*rhaystack != *rneedle)
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+ else
+ return (char *) haystack;
+ }
+}
diff --git a/gnulib/lib/mbstok_r.c b/gnulib/lib/mbstok_r.c
new file mode 100644
index 0000000..89a92e5
--- /dev/null
+++ b/gnulib/lib/mbstok_r.c
@@ -0,0 +1,66 @@
+/* Tokenizing a string.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include "mbuiter.h"
+
+char *
+mbstok_r (char *string, const char *delim, char **save_ptr)
+{
+ if (MB_CUR_MAX > 1)
+ {
+ if (string == NULL)
+ {
+ string = *save_ptr;
+ if (string == NULL)
+ return NULL; /* reminder that end of token sequence has been
+ reached */
+ }
+
+ /* Skip leading delimiters. */
+ string += mbsspn (string, delim);
+
+ /* Found a token? */
+ if (*string == '\0')
+ {
+ *save_ptr = NULL;
+ return NULL;
+ }
+
+ /* Move past the token. */
+ {
+ char *token_end = mbspbrk (string, delim);
+
+ if (token_end != NULL)
+ {
+ /* NUL-terminate the token. */
+ *token_end = '\0';
+ *save_ptr = token_end + 1;
+ }
+ else
+ *save_ptr = NULL;
+ }
+
+ return string;
+ }
+ else
+ return strtok_r (string, delim, save_ptr);
+}
diff --git a/gnulib/lib/mbswidth.c b/gnulib/lib/mbswidth.c
new file mode 100644
index 0000000..ad0eae0
--- /dev/null
+++ b/gnulib/lib/mbswidth.c
@@ -0,0 +1,193 @@
+/* Determine the number of screen columns needed for a string.
+ Copyright (C) 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "mbswidth.h"
+
+/* Get MB_CUR_MAX. */
+#include <stdlib.h>
+
+#include <string.h>
+
+/* Get isprint(). */
+#include <ctype.h>
+
+/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */
+#include <wchar.h>
+
+/* Get iswcntrl(). */
+#include <wctype.h>
+
+/* Get INT_MAX. */
+#include <limits.h>
+
+/* Returns the number of columns needed to represent the multibyte
+ character string pointed to by STRING. If a non-printable character
+ occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned.
+ With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is
+ the multibyte analogue of the wcswidth function. */
+int
+mbswidth (const char *string, int flags)
+{
+ return mbsnwidth (string, strlen (string), flags);
+}
+
+/* Returns the number of columns needed to represent the multibyte
+ character string pointed to by STRING of length NBYTES. If a
+ non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is
+ specified, -1 is returned. */
+int
+mbsnwidth (const char *string, size_t nbytes, int flags)
+{
+ const char *p = string;
+ const char *plimit = p + nbytes;
+ int width;
+
+ width = 0;
+ if (MB_CUR_MAX > 1)
+ {
+ while (p < plimit)
+ switch (*p)
+ {
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ /* These characters are printable ASCII characters. */
+ p++;
+ width++;
+ break;
+ default:
+ /* If we have a multibyte sequence, scan it up to its end. */
+ {
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof mbstate);
+ do
+ {
+ wchar_t wc;
+ size_t bytes;
+ int w;
+
+ bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
+
+ if (bytes == (size_t) -1)
+ /* An invalid multibyte sequence was encountered. */
+ {
+ if (!(flags & MBSW_REJECT_INVALID))
+ {
+ p++;
+ width++;
+ break;
+ }
+ else
+ return -1;
+ }
+
+ if (bytes == (size_t) -2)
+ /* An incomplete multibyte character at the end. */
+ {
+ if (!(flags & MBSW_REJECT_INVALID))
+ {
+ p = plimit;
+ width++;
+ break;
+ }
+ else
+ return -1;
+ }
+
+ if (bytes == 0)
+ /* A null wide character was encountered. */
+ bytes = 1;
+
+ w = wcwidth (wc);
+ if (w >= 0)
+ /* A printable multibyte character. */
+ {
+ if (w > INT_MAX - width)
+ goto overflow;
+ width += w;
+ }
+ else
+ /* An unprintable multibyte character. */
+ if (!(flags & MBSW_REJECT_UNPRINTABLE))
+ {
+ if (!iswcntrl (wc))
+ {
+ if (width == INT_MAX)
+ goto overflow;
+ width++;
+ }
+ }
+ else
+ return -1;
+
+ p += bytes;
+ }
+ while (! mbsinit (&mbstate));
+ }
+ break;
+ }
+ return width;
+ }
+
+ while (p < plimit)
+ {
+ unsigned char c = (unsigned char) *p++;
+
+ if (isprint (c))
+ {
+ if (width == INT_MAX)
+ goto overflow;
+ width++;
+ }
+ else if (!(flags & MBSW_REJECT_UNPRINTABLE))
+ {
+ if (!iscntrl (c))
+ {
+ if (width == INT_MAX)
+ goto overflow;
+ width++;
+ }
+ }
+ else
+ return -1;
+ }
+ return width;
+
+ overflow:
+ return INT_MAX;
+}
diff --git a/gnulib/lib/mbswidth.h b/gnulib/lib/mbswidth.h
new file mode 100644
index 0000000..9e0e886
--- /dev/null
+++ b/gnulib/lib/mbswidth.h
@@ -0,0 +1,60 @@
+/* Determine the number of screen columns needed for a string.
+ Copyright (C) 2000-2004, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+/* Avoid a clash of our mbswidth() with a function of the same name defined
+ in UnixWare 7.1.1 <wchar.h>. We need this #include before the #define
+ below.
+ However, we don't want to #include <wchar.h> on all platforms because
+ - Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ - BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
+# include <wchar.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Optional flags to influence mbswidth/mbsnwidth behavior. */
+
+/* If this bit is set, return -1 upon finding an invalid or incomplete
+ character. Otherwise, assume invalid characters have width 1. */
+#define MBSW_REJECT_INVALID 1
+
+/* If this bit is set, return -1 upon finding a non-printable character.
+ Otherwise, assume unprintable characters have width 0 if they are
+ control characters and 1 otherwise. */
+#define MBSW_REJECT_UNPRINTABLE 2
+
+
+/* Returns the number of screen columns needed for STRING. */
+#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */
+extern int mbswidth (const char *string, int flags);
+
+/* Returns the number of screen columns needed for the NBYTES bytes
+ starting at BUF. */
+extern int mbsnwidth (const char *buf, size_t nbytes, int flags);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/mbtowc-impl.h b/gnulib/lib/mbtowc-impl.h
new file mode 100644
index 0000000..1645eb5
--- /dev/null
+++ b/gnulib/lib/mbtowc-impl.h
@@ -0,0 +1,44 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* We don't need a static internal state, because the encoding is not state
+ dependent, and when mbrtowc returns (size_t)(-2). we throw the result
+ away. */
+
+int
+mbtowc (wchar_t *pwc, const char *s, size_t n)
+{
+ if (s == NULL)
+ return 0;
+ else
+ {
+ mbstate_t state;
+ wchar_t wc;
+ size_t result;
+
+ memset (&state, 0, sizeof (mbstate_t));
+ result = mbrtowc (&wc, s, n, &state);
+ if (result == (size_t)-1 || result == (size_t)-2)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+ if (pwc != NULL)
+ *pwc = wc;
+ return (wc == 0 ? 0 : result);
+ }
+}
diff --git a/gnulib/lib/mbtowc.c b/gnulib/lib/mbtowc.c
new file mode 100644
index 0000000..b3848a1
--- /dev/null
+++ b/gnulib/lib/mbtowc.c
@@ -0,0 +1,26 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <errno.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "mbtowc-impl.h"
diff --git a/gnulib/lib/mbuiter.h b/gnulib/lib/mbuiter.h
new file mode 100644
index 0000000..178f36e
--- /dev/null
+++ b/gnulib/lib/mbuiter.h
@@ -0,0 +1,222 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string, without knowing its length a-priori.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; *iter != '\0'; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbui_iterator_t iter;
+ for (mbui_init (iter, buf); mbui_avail (iter); mbui_advance (iter))
+ {
+ do_something (mbui_cur_ptr (iter), mb_len (mbui_cur (iter)));
+ }
+
+ The benefit of these macros over plain use of mbrtowc is:
+ - Handling of invalid multibyte sequences is possible without
+ making the code more complicated, while still preserving the
+ invalid multibyte sequences.
+
+ Compared to mbiter.h, the macros here don't need to know the string's
+ length a-priori. The downside is that at each step, the look-ahead
+ that guards against overrunning the terminating '\0' is more expensive.
+ The mbui_* macros are therefore suitable when there is a high probability
+ that only the first few multibyte characters need to be inspected.
+ Whereas the mbi_* macros are better if usually the iteration runs
+ through the entire string.
+
+ mbui_iterator_t
+ is a type usable for variable declarations.
+
+ mbui_init (iter, startptr)
+ initializes the iterator, starting at startptr.
+
+ mbui_avail (iter)
+ returns true if there are more multibyte chracters available before
+ the end of string is reached. In this case, mbui_cur (iter) is
+ initialized to the next multibyte chracter.
+
+ mbui_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbui_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbui_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbui_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbui_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbui_init (mbui_iterator_t iter, const char *startptr);
+ extern bool mbui_avail (mbui_iterator_t iter);
+ extern void mbui_advance (mbui_iterator_t iter);
+ extern mbchar_t mbui_cur (mbui_iterator_t iter);
+ extern const char * mbui_cur_ptr (mbui_iterator_t iter);
+ extern void mbui_reloc (mbui_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbui_copy (mbui_iterator_t *new, const mbui_iterator_t *old);
+ */
+
+#ifndef _MBUITER_H
+#define _MBUITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
+ <wchar.h>. */
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+#include "strnlen1.h"
+
+struct mbuiter_multi
+{
+ bool in_shift; /* true if next byte may not be interpreted as ASCII */
+ mbstate_t state; /* if in_shift: current shift state */
+ bool next_done; /* true if mbui_avail has already filled the following */
+ struct mbchar cur; /* the current character:
+ const char *cur.ptr pointer to current character
+ The following are only valid after mbui_avail.
+ size_t cur.bytes number of bytes of current character
+ bool cur.wc_valid true if wc is a valid wide character
+ wchar_t cur.wc if wc_valid: the current character
+ */
+};
+
+static inline void
+mbuiter_multi_next (struct mbuiter_multi *iter)
+{
+ if (iter->next_done)
+ return;
+ if (iter->in_shift)
+ goto with_shift;
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (is_basic (*iter->cur.ptr))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ iter->cur.bytes = 1;
+ iter->cur.wc = *iter->cur.ptr;
+ iter->cur.wc_valid = true;
+ }
+ else
+ {
+ assert (mbsinit (&iter->state));
+ iter->in_shift = true;
+ with_shift:
+ iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr,
+ strnlen1 (iter->cur.ptr, MB_CUR_MAX),
+ &iter->state);
+ if (iter->cur.bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ iter->cur.bytes = 1;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not very important; the string is bogus anyway. */
+ }
+ else if (iter->cur.bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character at the end. */
+ iter->cur.bytes = strlen (iter->cur.ptr);
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not important; the string end is reached anyway. */
+ }
+ else
+ {
+ if (iter->cur.bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ iter->cur.bytes = 1;
+ assert (*iter->cur.ptr == '\0');
+ assert (iter->cur.wc == 0);
+ }
+ iter->cur.wc_valid = true;
+
+ /* When in the initial state, we can go back treating ASCII
+ characters more quickly. */
+ if (mbsinit (&iter->state))
+ iter->in_shift = false;
+ }
+ }
+ iter->next_done = true;
+}
+
+static inline void
+mbuiter_multi_reloc (struct mbuiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+}
+
+static inline void
+mbuiter_multi_copy (struct mbuiter_multi *new_iter, const struct mbuiter_multi *old_iter)
+{
+ if ((new_iter->in_shift = old_iter->in_shift))
+ memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t));
+ else
+ memset (&new_iter->state, 0, sizeof (mbstate_t));
+ new_iter->next_done = old_iter->next_done;
+ mb_copy (&new_iter->cur, &old_iter->cur);
+}
+
+/* Iteration macros. */
+typedef struct mbuiter_multi mbui_iterator_t;
+#define mbui_init(iter, startptr) \
+ ((iter).cur.ptr = (startptr), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbui_avail(iter) \
+ (mbuiter_multi_next (&(iter)), !mb_isnul ((iter).cur))
+#define mbui_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbui_cur(iter) (iter).cur
+#define mbui_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbui_reloc(iter, ptrdiff) mbuiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbui_copy mbuiter_multi_copy
+
+#endif /* _MBUITER_H */
diff --git a/gnulib/lib/md2.c b/gnulib/lib/md2.c
new file mode 100644
index 0000000..5ce1be8
--- /dev/null
+++ b/gnulib/lib/md2.c
@@ -0,0 +1,275 @@
+/* Functions to compute MD2 message digest of files or memory blocks.
+ according to the definition of MD2 in RFC 1319 from April 1992.
+ Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by
+ Tom St Denis. */
+
+#include <config.h>
+
+#include "md2.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <minmax.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+static void md2_update_chksum (struct md2_ctx *md);
+static void md2_compress (struct md2_ctx *md);
+
+/* Initialize structure containing state of computation.
+ (RFC 1319, 3.3: Step 3) */
+void
+md2_init_ctx (struct md2_ctx *ctx)
+{
+ memset (ctx->X, 0, sizeof (ctx->X));
+ memset (ctx->chksum, 0, sizeof (ctx->chksum));
+ memset (ctx->buf, 0, sizeof (ctx->buf));
+ ctx->curlen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md2_read_ctx (const struct md2_ctx *ctx, void *resbuf)
+{
+ memcpy (resbuf, ctx->X, 16);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md2_finish_ctx (struct md2_ctx *ctx, void *resbuf)
+{
+ unsigned long i, k;
+
+ /* pad the message */
+ k = 16 - ctx->curlen;
+ for (i = ctx->curlen; i < 16; i++)
+ {
+ ctx->buf[i] = (unsigned char) k;
+ }
+
+ /* hash and update */
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+
+ /* hash checksum */
+ memcpy (ctx->buf, ctx->chksum, 16);
+ md2_compress (ctx);
+
+ return md2_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md2_stream (FILE *stream, void *resblock)
+{
+ struct md2_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md2_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md2_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md2_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md2_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md2_ctx ctx;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md2_process_block (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md2_finish_ctx (&ctx, resblock);
+}
+
+void
+md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ const char *in = buffer;
+ unsigned long n;
+
+ while (len > 0)
+ {
+ n = MIN (len, (16 - ctx->curlen));
+ memcpy (ctx->buf + ctx->curlen, in, (size_t) n);
+ ctx->curlen += n;
+ in += n;
+ len -= n;
+
+ /* is 16 bytes full? */
+ if (ctx->curlen == 16)
+ {
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+ ctx->curlen = 0;
+ }
+ }
+}
+
+static const unsigned char PI_SUBST[256] = {
+ 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
+ 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
+ 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
+ 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
+ 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
+ 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
+ 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
+ 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
+ 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
+ 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
+ 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
+ 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
+ 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
+ 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
+ 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
+ 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
+ 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
+ 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
+};
+
+/* adds 16 bytes to the checksum */
+static void
+md2_update_chksum (struct md2_ctx *ctx)
+{
+ int j;
+ unsigned char L;
+
+ L = ctx->chksum[15];
+ for (j = 0; j < 16; j++)
+ {
+ /* caution, the RFC says its "C[j] = S[M[i*16+j] xor L]" but the
+ reference source code [and test vectors] say otherwise. */
+ L = (ctx->chksum[j] ^= PI_SUBST[(int) (ctx->buf[j] ^ L)] & 255);
+ }
+}
+
+static void
+md2_compress (struct md2_ctx *ctx)
+{
+ size_t j, k;
+ unsigned char t;
+
+ /* copy block */
+ for (j = 0; j < 16; j++)
+ {
+ ctx->X[16 + j] = ctx->buf[j];
+ ctx->X[32 + j] = ctx->X[j] ^ ctx->X[16 + j];
+ }
+
+ t = (unsigned char) 0;
+
+ /* do 18 rounds */
+ for (j = 0; j < 18; j++)
+ {
+ for (k = 0; k < 48; k++)
+ {
+ t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]);
+ }
+ t = (t + (unsigned char) j) & 255;
+ }
+}
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX. */
+void
+md2_process_block (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ md2_process_bytes (buffer, len, ctx);
+}
diff --git a/gnulib/lib/md2.h b/gnulib/lib/md2.h
new file mode 100644
index 0000000..555aef7
--- /dev/null
+++ b/gnulib/lib/md2.h
@@ -0,0 +1,85 @@
+/* Declarations of functions and data types used for MD2 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005, 2008-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef MD2_H
+# define MD2_H 1
+
+# include <stdio.h>
+# include <stddef.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD2_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md2_ctx
+{
+ unsigned char chksum[16], X[48], buf[16];
+ size_t curlen;
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md2_init_ctx (struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_block (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_bytes (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md2_finish_ctx (struct md2_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md2_read_ctx (const struct md2_ctx *ctx, void *resbuf);
+
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md2_stream (FILE *stream, void *resblock);
+
+/* Compute MD2 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md2_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/md4.c b/gnulib/lib/md4.c
new file mode 100644
index 0000000..6807a83
--- /dev/null
+++ b/gnulib/lib/md4.c
@@ -0,0 +1,383 @@
+/* Functions to compute MD4 message digest of files or memory blocks.
+ according to the definition of MD4 in RFC 1320 from April 1992.
+ Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt
+ cipher/md4.c . */
+
+#include <config.h>
+
+#include "md4.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1320, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1320, 3.3: Step 3) */
+void
+md4_init_ctx (struct md4_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md4_read_ctx (const struct md4_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md4_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md4_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md4_stream (FILE * stream, void *resblock)
+{
+ struct md4_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md4_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md4_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md4_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md4_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md4_ctx ctx;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md4_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md4_finish_ctx (&ctx, resblock);
+}
+
+void
+md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md4_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md4_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and md4.c --- */
+
+/* MD4 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+
+/* Round functions. */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+#define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s);
+#define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s);
+#define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s);
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+
+ /* First increment the byte count. RFC 1320 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ /* Round 1. */
+ R1 (A, B, C, D, 0, 3);
+ R1 (D, A, B, C, 1, 7);
+ R1 (C, D, A, B, 2, 11);
+ R1 (B, C, D, A, 3, 19);
+ R1 (A, B, C, D, 4, 3);
+ R1 (D, A, B, C, 5, 7);
+ R1 (C, D, A, B, 6, 11);
+ R1 (B, C, D, A, 7, 19);
+ R1 (A, B, C, D, 8, 3);
+ R1 (D, A, B, C, 9, 7);
+ R1 (C, D, A, B, 10, 11);
+ R1 (B, C, D, A, 11, 19);
+ R1 (A, B, C, D, 12, 3);
+ R1 (D, A, B, C, 13, 7);
+ R1 (C, D, A, B, 14, 11);
+ R1 (B, C, D, A, 15, 19);
+
+ /* Round 2. */
+ R2 (A, B, C, D, 0, 3);
+ R2 (D, A, B, C, 4, 5);
+ R2 (C, D, A, B, 8, 9);
+ R2 (B, C, D, A, 12, 13);
+ R2 (A, B, C, D, 1, 3);
+ R2 (D, A, B, C, 5, 5);
+ R2 (C, D, A, B, 9, 9);
+ R2 (B, C, D, A, 13, 13);
+ R2 (A, B, C, D, 2, 3);
+ R2 (D, A, B, C, 6, 5);
+ R2 (C, D, A, B, 10, 9);
+ R2 (B, C, D, A, 14, 13);
+ R2 (A, B, C, D, 3, 3);
+ R2 (D, A, B, C, 7, 5);
+ R2 (C, D, A, B, 11, 9);
+ R2 (B, C, D, A, 15, 13);
+
+ /* Round 3. */
+ R3 (A, B, C, D, 0, 3);
+ R3 (D, A, B, C, 8, 9);
+ R3 (C, D, A, B, 4, 11);
+ R3 (B, C, D, A, 12, 15);
+ R3 (A, B, C, D, 2, 3);
+ R3 (D, A, B, C, 10, 9);
+ R3 (C, D, A, B, 6, 11);
+ R3 (B, C, D, A, 14, 15);
+ R3 (A, B, C, D, 1, 3);
+ R3 (D, A, B, C, 9, 9);
+ R3 (C, D, A, B, 5, 11);
+ R3 (B, C, D, A, 13, 15);
+ R3 (A, B, C, D, 3, 3);
+ R3 (D, A, B, C, 11, 9);
+ R3 (C, D, A, B, 7, 11);
+ R3 (B, C, D, A, 15, 15);
+
+ A = ctx->A += A;
+ B = ctx->B += B;
+ C = ctx->C += C;
+ D = ctx->D += D;
+ }
+}
diff --git a/gnulib/lib/md4.h b/gnulib/lib/md4.h
new file mode 100644
index 0000000..5377eb5
--- /dev/null
+++ b/gnulib/lib/md4.h
@@ -0,0 +1,91 @@
+/* Declarations of functions and data types used for MD4 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005, 2008-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef MD4_H
+# define MD4_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD4_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md4_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md4_init_ctx (struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void md4_process_block (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md4_process_bytes (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md4_read_ctx (const struct md4_ctx *ctx, void *resbuf);
+
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md4_stream (FILE * stream, void *resblock);
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md4_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/md5.c b/gnulib/lib/md5.c
new file mode 100644
index 0000000..7d575ac
--- /dev/null
+++ b/gnulib/lib/md5.c
@@ -0,0 +1,462 @@
+/* Functions to compute MD5 message digest of files or memory blocks.
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+
+#include <config.h>
+
+#include "md5.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef _LIBC
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+/* We need to keep the namespace clean so define the MD5 function
+ protected using leading __ . */
+# define md5_init_ctx __md5_init_ctx
+# define md5_process_block __md5_process_block
+# define md5_process_bytes __md5_process_bytes
+# define md5_finish_ctx __md5_finish_ctx
+# define md5_read_ctx __md5_read_ctx
+# define md5_stream __md5_stream
+# define md5_buffer __md5_buffer
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (struct md5_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, size * 4, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (FILE *stream, void *resblock)
+{
+ struct md5_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+
+
+void
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md5_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ uint32_t correct_words[16];
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ uint32_t *cwp = correct_words;
+ uint32_t A_save = A;
+ uint32_t B_save = B;
+ uint32_t C_save = C;
+ uint32_t D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+
+ Here is an equivalent invocation using Perl:
+
+ perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
diff --git a/gnulib/lib/md5.h b/gnulib/lib/md5.h
new file mode 100644
index 0000000..8b06466
--- /dev/null
+++ b/gnulib/lib/md5.h
@@ -0,0 +1,126 @@
+/* Declaration of functions and data types used for MD5 sum computing
+ library functions.
+ Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <stdio.h>
+#include <stdint.h>
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_BLOCK_SIZE 64
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __THROW
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifndef _LIBC
+# define __md5_buffer md5_buffer
+# define __md5_finish_ctx md5_finish_ctx
+# define __md5_init_ctx md5_init_ctx
+# define __md5_process_block md5_process_block
+# define __md5_process_bytes md5_process_bytes
+# define __md5_read_ctx md5_read_ctx
+# define __md5_stream md5_stream
+#endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void __md5_process_block (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void __md5_process_bytes (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int __md5_stream (FILE *stream, void *resblock) __THROW;
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *__md5_buffer (const char *buffer, size_t len,
+ void *resblock) __THROW;
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* md5.h */
diff --git a/gnulib/lib/memcasecmp.c b/gnulib/lib/memcasecmp.c
new file mode 100644
index 0000000..6ae7c4f
--- /dev/null
+++ b/gnulib/lib/memcasecmp.c
@@ -0,0 +1,49 @@
+/* Case-insensitive buffer comparator.
+ Copyright (C) 1996-1997, 2000, 2003, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "memcasecmp.h"
+
+#include <ctype.h>
+#include <limits.h>
+
+/* Like memcmp, but ignore differences in case.
+ Convert to upper case (not lower) before comparing so that
+ join -i works with sort -f. */
+
+int
+memcasecmp (const void *vs1, const void *vs2, size_t n)
+{
+ size_t i;
+ char const *s1 = vs1;
+ char const *s2 = vs2;
+ for (i = 0; i < n; i++)
+ {
+ unsigned char u1 = s1[i];
+ unsigned char u2 = s2[i];
+ int U1 = toupper (u1);
+ int U2 = toupper (u2);
+ int diff = (UCHAR_MAX <= INT_MAX ? U1 - U2
+ : U1 < U2 ? -1 : U2 < U1);
+ if (diff)
+ return diff;
+ }
+ return 0;
+}
diff --git a/gnulib/lib/memcasecmp.h b/gnulib/lib/memcasecmp.h
new file mode 100644
index 0000000..502b856
--- /dev/null
+++ b/gnulib/lib/memcasecmp.h
@@ -0,0 +1,22 @@
+/* Case-insensitive buffer comparator.
+
+ Copyright (C) 1996, 1998, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <stddef.h>
+
+int memcasecmp (const void *vs1, const void *vs2, size_t n) _GL_ATTRIBUTE_PURE;
diff --git a/gnulib/lib/memchr.c b/gnulib/lib/memchr.c
new file mode 100644
index 0000000..6d903b1
--- /dev/null
+++ b/gnulib/lib/memchr.c
@@ -0,0 +1,172 @@
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2011
+ Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stddef.h>
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# define reg_char char
+#endif
+
+#include <limits.h>
+
+#if HAVE_BP_SYM_H || defined _LIBC
+# include <bp-sym.h>
+#else
+# define BP_SYM(sym) sym
+#endif
+
+#undef __memchr
+#ifdef _LIBC
+# undef memchr
+#endif
+
+#ifndef weak_alias
+# define __memchr memchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memchr, BP_SYM (memchr))
+#endif
diff --git a/gnulib/lib/memchr.valgrind b/gnulib/lib/memchr.valgrind
new file mode 100644
index 0000000..60f247e
--- /dev/null
+++ b/gnulib/lib/memchr.valgrind
@@ -0,0 +1,14 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr().
+# POSIX states that when the character is found, memchr must not read extra
+# bytes in an overestimated length (for example, where memchr is used to
+# implement strnlen). However, we use a safe word read to provide a speedup.
+{
+ memchr-value4
+ Memcheck:Value4
+ fun:rpl_memchr
+}
+{
+ memchr-value8
+ Memcheck:Value8
+ fun:rpl_memchr
+}
diff --git a/gnulib/lib/memchr2.c b/gnulib/lib/memchr2.c
new file mode 100644
index 0000000..2e3c7cd
--- /dev/null
+++ b/gnulib/lib/memchr2.c
@@ -0,0 +1,164 @@
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2011
+ Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented in glibc by Roland McGrath (roland@ai.mit.edu).
+ Extension to memchr2 implemented by Eric Blake (ebb9@byu.net).
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "memchr2.h"
+
+#include <limits.h>
+#include <stdint.h>
+#include <string.h>
+
+/* Return the first address of either C1 or C2 (treated as unsigned
+ char) that occurs within N bytes of the memory region S. If
+ neither byte appears, return NULL. */
+void *
+memchr2 (void const *s, int c1_in, int c2_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c1;
+ longword repeated_c2;
+ unsigned char c1;
+ unsigned char c2;
+
+ c1 = (unsigned char) c1_in;
+ c2 = (unsigned char) c2_in;
+
+ if (c1 == c2)
+ return memchr (s, c1, n);
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c1 || *char_ptr == c2)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c1 has c1 in every byte.
+ repeated_c2 has c2 in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c1 = c1 | (c1 << 8);
+ repeated_c2 = c2 | (c2 << 8);
+ repeated_c1 |= repeated_c1 << 16;
+ repeated_c2 |= repeated_c2 << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c1 |= repeated_c1 << 31 << 1;
+ repeated_c2 |= repeated_c2 << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c1 |= repeated_c1 << i;
+ repeated_c2 |= repeated_c2 << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c1 or c2. We first use
+ an xor with repeated_c1 and repeated_c2, respectively. This reduces
+ the task to testing whether *any of the four* bytes in longword1 or
+ longword2 is zero.
+
+ Let's consider longword1. We compute tmp1 =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp1 is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ Similary, we compute tmp2 =
+ ((longword2 - repeated_one) & ~longword2) & (repeated_one << 7).
+
+ The test whether any byte in longword1 or longword2 is zero is equivalent
+ to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
+ this into a single test, whether (tmp1 | tmp2) is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c1;
+ longword longword2 = *longword_ptr ^ repeated_c2;
+
+ if (((((longword1 - repeated_one) & ~longword1)
+ | ((longword2 - repeated_one) & ~longword2))
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c1 or == c2. On
+ little-endian machines, we could determine the first such byte without
+ any further memory accesses, just by looking at the (tmp1 | tmp2) result
+ from the last loop iteration. But this does not work on big-endian
+ machines. Choose code that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c1 || *char_ptr == c2)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/memchr2.h b/gnulib/lib/memchr2.h
new file mode 100644
index 0000000..c34acbd
--- /dev/null
+++ b/gnulib/lib/memchr2.h
@@ -0,0 +1,32 @@
+/* Scan memory for the first of two bytes.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the first address of either C1 or C2 (treated as unsigned
+ char) that occurs within N bytes of the memory region S. If
+ neither byte appears, return NULL. */
+
+extern void *memchr2 (void const *s, int c1, int c2, size_t n)
+ _GL_ATTRIBUTE_PURE;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/memchr2.valgrind b/gnulib/lib/memchr2.valgrind
new file mode 100644
index 0000000..778fe86
--- /dev/null
+++ b/gnulib/lib/memchr2.valgrind
@@ -0,0 +1,14 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr2().
+# Like memchr, it is safe to overestimate the length when the terminator
+# is guaranteed to be found. In this case, we may end up reading a word
+# that is partially uninitialized, but this use is OK for a speedup.
+{
+ memchr2-value4
+ Memcheck:Value4
+ fun:memchr2
+}
+{
+ memchr2-value8
+ Memcheck:Value8
+ fun:memchr2
+}
diff --git a/gnulib/lib/memcmp.c b/gnulib/lib/memcmp.c
new file mode 100644
index 0000000..72fb81d
--- /dev/null
+++ b/gnulib/lib/memcmp.c
@@ -0,0 +1,363 @@
+/* Copyright (C) 1991, 1993, 1995, 1997-1998, 2003, 2006, 2009-2011 Free
+ Software Foundation, Inc.
+
+ Contributed by Torbjorn Granlund (tege@sics.se).
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stdint.h>
+
+#undef memcmp
+
+#ifdef _LIBC
+
+# include <memcopy.h>
+# include <endian.h>
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN
+# endif
+
+#else /* Not in the GNU C library. */
+
+# include <sys/types.h>
+
+/* Type to use for aligned memory operations.
+ This should normally be the biggest type supported by a single load
+ and store. Must be an unsigned type. */
+# define op_t unsigned long int
+# define OPSIZ (sizeof(op_t))
+
+/* Threshold value for when to enter the unrolled loops. */
+# define OP_T_THRES 16
+
+/* Type to use for unaligned operations. */
+typedef unsigned char byte;
+
+# ifndef WORDS_BIGENDIAN
+# define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2)))
+# else
+# define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2)))
+# endif
+
+#endif /* In the GNU C library. */
+
+#ifdef WORDS_BIGENDIAN
+# define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1)
+#else
+# define CMP_LT_OR_GT(a, b) memcmp_bytes (a, b)
+#endif
+
+/* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */
+
+/* The strategy of this memcmp is:
+
+ 1. Compare bytes until one of the block pointers is aligned.
+
+ 2. Compare using memcmp_common_alignment or
+ memcmp_not_common_alignment, regarding the alignment of the other
+ block after the initial byte operations. The maximum number of
+ full words (of type op_t) are compared in this way.
+
+ 3. Compare the few remaining bytes. */
+
+#ifndef WORDS_BIGENDIAN
+/* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine.
+ A and B are known to be different.
+ This is needed only on little-endian machines. */
+
+# ifdef __GNUC__
+__inline
+# endif
+static int
+memcmp_bytes (op_t a, op_t b)
+{
+ const byte *srcp1 = (const byte *) &a;
+ const byte *srcp2 = (const byte *) &b;
+ op_t a0, b0;
+
+ do
+ {
+ a0 = srcp1[0];
+ b0 = srcp2[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ }
+ while (a0 == b0);
+ return a0 - b0;
+}
+#endif
+
+/* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t'
+ objects (not LEN bytes!). Both SRCP1 and SRCP2 should be aligned for
+ memory operations on `op_t's. */
+#ifdef __GNUC__
+__inline
+#endif
+static int
+memcmp_common_alignment (uintptr_t srcp1, uintptr_t srcp2, size_t len)
+{
+ op_t a0, a1;
+ op_t b0, b1;
+
+ switch (len % 4)
+ {
+ default: /* Avoid warning about uninitialized local variables. */
+ case 2:
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ srcp1 -= 2 * OPSIZ;
+ srcp2 -= 2 * OPSIZ;
+ len += 2;
+ goto do1;
+ case 3:
+ a1 = ((op_t *) srcp1)[0];
+ b1 = ((op_t *) srcp2)[0];
+ srcp1 -= OPSIZ;
+ srcp2 -= OPSIZ;
+ len += 1;
+ goto do2;
+ case 0:
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ return 0;
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ goto do3;
+ case 1:
+ a1 = ((op_t *) srcp1)[0];
+ b1 = ((op_t *) srcp2)[0];
+ srcp1 += OPSIZ;
+ srcp2 += OPSIZ;
+ len -= 1;
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ goto do0;
+ /* Fall through. */
+ }
+
+ do
+ {
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+
+ do3:
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[1];
+ if (a0 != b0)
+ return CMP_LT_OR_GT (a0, b0);
+
+ do2:
+ a0 = ((op_t *) srcp1)[2];
+ b0 = ((op_t *) srcp2)[2];
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+
+ do1:
+ a1 = ((op_t *) srcp1)[3];
+ b1 = ((op_t *) srcp2)[3];
+ if (a0 != b0)
+ return CMP_LT_OR_GT (a0, b0);
+
+ srcp1 += 4 * OPSIZ;
+ srcp2 += 4 * OPSIZ;
+ len -= 4;
+ }
+ while (len != 0);
+
+ /* This is the right position for do0. Please don't move
+ it into the loop. */
+ do0:
+ if (a1 != b1)
+ return CMP_LT_OR_GT (a1, b1);
+ return 0;
+}
+
+/* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN
+ `op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory
+ operations on `op_t', but SRCP1 *should be unaligned*. */
+#ifdef __GNUC__
+__inline
+#endif
+static int
+memcmp_not_common_alignment (uintptr_t srcp1, uintptr_t srcp2, size_t len)
+{
+ op_t a0, a1, a2, a3;
+ op_t b0, b1, b2, b3;
+ op_t x;
+ int shl, shr;
+
+ /* Calculate how to shift a word read at the memory operation
+ aligned srcp1 to make it aligned for comparison. */
+
+ shl = 8 * (srcp1 % OPSIZ);
+ shr = 8 * OPSIZ - shl;
+
+ /* Make SRCP1 aligned by rounding it down to the beginning of the `op_t'
+ it points in the middle of. */
+ srcp1 &= -OPSIZ;
+
+ switch (len % 4)
+ {
+ default: /* Avoid warning about uninitialized local variables. */
+ case 2:
+ a1 = ((op_t *) srcp1)[0];
+ a2 = ((op_t *) srcp1)[1];
+ b2 = ((op_t *) srcp2)[0];
+ srcp1 -= 1 * OPSIZ;
+ srcp2 -= 2 * OPSIZ;
+ len += 2;
+ goto do1;
+ case 3:
+ a0 = ((op_t *) srcp1)[0];
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[0];
+ srcp2 -= 1 * OPSIZ;
+ len += 1;
+ goto do2;
+ case 0:
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ return 0;
+ a3 = ((op_t *) srcp1)[0];
+ a0 = ((op_t *) srcp1)[1];
+ b0 = ((op_t *) srcp2)[0];
+ srcp1 += 1 * OPSIZ;
+ goto do3;
+ case 1:
+ a2 = ((op_t *) srcp1)[0];
+ a3 = ((op_t *) srcp1)[1];
+ b3 = ((op_t *) srcp2)[0];
+ srcp1 += 2 * OPSIZ;
+ srcp2 += 1 * OPSIZ;
+ len -= 1;
+ if (OP_T_THRES <= 3 * OPSIZ && len == 0)
+ goto do0;
+ /* Fall through. */
+ }
+
+ do
+ {
+ a0 = ((op_t *) srcp1)[0];
+ b0 = ((op_t *) srcp2)[0];
+ x = MERGE (a2, shl, a3, shr);
+ if (x != b3)
+ return CMP_LT_OR_GT (x, b3);
+
+ do3:
+ a1 = ((op_t *) srcp1)[1];
+ b1 = ((op_t *) srcp2)[1];
+ x = MERGE (a3, shl, a0, shr);
+ if (x != b0)
+ return CMP_LT_OR_GT (x, b0);
+
+ do2:
+ a2 = ((op_t *) srcp1)[2];
+ b2 = ((op_t *) srcp2)[2];
+ x = MERGE (a0, shl, a1, shr);
+ if (x != b1)
+ return CMP_LT_OR_GT (x, b1);
+
+ do1:
+ a3 = ((op_t *) srcp1)[3];
+ b3 = ((op_t *) srcp2)[3];
+ x = MERGE (a1, shl, a2, shr);
+ if (x != b2)
+ return CMP_LT_OR_GT (x, b2);
+
+ srcp1 += 4 * OPSIZ;
+ srcp2 += 4 * OPSIZ;
+ len -= 4;
+ }
+ while (len != 0);
+
+ /* This is the right position for do0. Please don't move
+ it into the loop. */
+ do0:
+ x = MERGE (a2, shl, a3, shr);
+ if (x != b3)
+ return CMP_LT_OR_GT (x, b3);
+ return 0;
+}
+
+int
+rpl_memcmp (const void *s1, const void *s2, size_t len)
+{
+ op_t a0;
+ op_t b0;
+ uintptr_t srcp1 = (uintptr_t) s1;
+ uintptr_t srcp2 = (uintptr_t) s2;
+ op_t res;
+
+ if (len >= OP_T_THRES)
+ {
+ /* There are at least some bytes to compare. No need to test
+ for LEN == 0 in this alignment loop. */
+ while (srcp2 % OPSIZ != 0)
+ {
+ a0 = ((byte *) srcp1)[0];
+ b0 = ((byte *) srcp2)[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ res = a0 - b0;
+ if (res != 0)
+ return res;
+ len -= 1;
+ }
+
+ /* SRCP2 is now aligned for memory operations on `op_t'.
+ SRCP1 alignment determines if we can do a simple,
+ aligned compare or need to shuffle bits. */
+
+ if (srcp1 % OPSIZ == 0)
+ res = memcmp_common_alignment (srcp1, srcp2, len / OPSIZ);
+ else
+ res = memcmp_not_common_alignment (srcp1, srcp2, len / OPSIZ);
+ if (res != 0)
+ return res;
+
+ /* Number of bytes remaining in the interval [0..OPSIZ-1]. */
+ srcp1 += len & -OPSIZ;
+ srcp2 += len & -OPSIZ;
+ len %= OPSIZ;
+ }
+
+ /* There are just a few bytes to compare. Use byte memory operations. */
+ while (len != 0)
+ {
+ a0 = ((byte *) srcp1)[0];
+ b0 = ((byte *) srcp2)[0];
+ srcp1 += 1;
+ srcp2 += 1;
+ res = a0 - b0;
+ if (res != 0)
+ return res;
+ len -= 1;
+ }
+
+ return 0;
+}
+
+#ifdef weak_alias
+# undef bcmp
+weak_alias (memcmp, bcmp)
+#endif
diff --git a/gnulib/lib/memcmp2.c b/gnulib/lib/memcmp2.c
new file mode 100644
index 0000000..14ab666
--- /dev/null
+++ b/gnulib/lib/memcmp2.c
@@ -0,0 +1,36 @@
+/* Compare two memory areas with possibly different lengths.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "memcmp2.h"
+
+#include <string.h>
+
+int
+memcmp2 (const char *s1, size_t n1, const char *s2, size_t n2)
+{
+ int cmp = memcmp (s1, s2, n1 <= n2 ? n1 : n2);
+ if (cmp == 0)
+ {
+ if (n1 < n2)
+ cmp = -1;
+ else if (n1 > n2)
+ cmp = 1;
+ }
+ return cmp;
+}
diff --git a/gnulib/lib/memcmp2.h b/gnulib/lib/memcmp2.h
new file mode 100644
index 0000000..21552b2
--- /dev/null
+++ b/gnulib/lib/memcmp2.h
@@ -0,0 +1,40 @@
+/* Compare two memory areas with possibly different lengths.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MEMCMP2_H
+#define MEMCMP2_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare the memory regions S1 = [s1..s1+N1-1], S2 = [s2..s2+n2-1],
+ lexicographically.
+ This function's result is locale independent, unlike memcoll()'s.
+ Return a negative number if S1 < S2, a positive number if S1 > S2, or
+ 0 if S1 and S2 have the same contents. */
+extern int memcmp2 (const char *s1, size_t n1, const char *s2, size_t n2)
+ _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MEMCMP2_H */
diff --git a/gnulib/lib/memcoll.c b/gnulib/lib/memcoll.c
new file mode 100644
index 0000000..23f6f79
--- /dev/null
+++ b/gnulib/lib/memcoll.c
@@ -0,0 +1,111 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 1999, 2002-2004, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#include <config.h>
+
+#include "memcoll.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Compare S1 (with size S1SIZE) and S2 (with length S2SIZE) according
+ to the LC_COLLATE locale. S1 and S2 are both blocks of memory with
+ nonzero sizes, and the last byte in each block must be a null byte.
+ Set errno to an error number if there is an error, and to zero
+ otherwise. */
+static inline int
+strcoll_loop (char const *s1, size_t s1size, char const *s2, size_t s2size)
+{
+ int diff;
+
+ while (! (errno = 0, (diff = strcoll (s1, s2)) || errno))
+ {
+ /* strcoll found no difference, but perhaps it was fooled by NUL
+ characters in the data. Work around this problem by advancing
+ past the NUL chars. */
+ size_t size1 = strlen (s1) + 1;
+ size_t size2 = strlen (s2) + 1;
+ s1 += size1;
+ s2 += size2;
+ s1size -= size1;
+ s2size -= size2;
+
+ if (s1size == 0)
+ return - (s2size != 0);
+ if (s2size == 0)
+ return 1;
+ }
+
+ return diff;
+}
+
+/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
+ to the LC_COLLATE locale. S1 and S2 do not overlap, and are not
+ adjacent. Perhaps temporarily modify the bytes after S1 and S2,
+ but restore their original contents before returning. Set errno to an
+ error number if there is an error, and to zero otherwise. */
+int
+memcoll (char *s1, size_t s1len, char *s2, size_t s2len)
+{
+ int diff;
+
+ /* strcoll is slow on many platforms, so check for the common case
+ where the arguments are bytewise equal. Otherwise, walk through
+ the buffers using strcoll on each substring. */
+
+ if (s1len == s2len && memcmp (s1, s2, s1len) == 0)
+ {
+ errno = 0;
+ diff = 0;
+ }
+ else
+ {
+ char n1 = s1[s1len];
+ char n2 = s2[s2len];
+
+ s1[s1len] = '\0';
+ s2[s2len] = '\0';
+
+ diff = strcoll_loop (s1, s1len + 1, s2, s2len + 1);
+
+ s1[s1len] = n1;
+ s2[s2len] = n2;
+ }
+
+ return diff;
+}
+
+/* Compare S1 (a memory block of size S1SIZE, with a NUL as last byte)
+ and S2 (a memory block of size S2SIZE, with a NUL as last byte)
+ according to the LC_COLLATE locale. S1SIZE and S2SIZE must be > 0.
+ Set errno to an error number if there is an error, and to zero
+ otherwise. */
+int
+memcoll0 (char const *s1, size_t s1size, char const *s2, size_t s2size)
+{
+ if (s1size == s2size && memcmp (s1, s2, s1size) == 0)
+ {
+ errno = 0;
+ return 0;
+ }
+ else
+ return strcoll_loop (s1, s1size, s2, s2size);
+}
diff --git a/gnulib/lib/memcoll.h b/gnulib/lib/memcoll.h
new file mode 100644
index 0000000..449907a
--- /dev/null
+++ b/gnulib/lib/memcoll.h
@@ -0,0 +1,28 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 1999, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#ifndef MEMCOLL_H_
+# define MEMCOLL_H_ 1
+
+# include <stddef.h>
+
+int memcoll (char *, size_t, char *, size_t);
+int memcoll0 (char const *, size_t, char const *, size_t);
+
+#endif /* MEMCOLL_H_ */
diff --git a/gnulib/lib/memcpy.c b/gnulib/lib/memcpy.c
new file mode 100644
index 0000000..8d014fe
--- /dev/null
+++ b/gnulib/lib/memcpy.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1995, 1997, 2000, 2003, 2006, 2009-2011 Free Software
+ * Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <meyering@na-net.ornl.gov>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
+ if the source overlaps with the destination.
+ Return DESTADDR. */
+
+void *
+memcpy (void *destaddr, void const *srcaddr, size_t len)
+{
+ char *dest = destaddr;
+ char const *src = srcaddr;
+
+ while (len-- > 0)
+ *dest++ = *src++;
+ return destaddr;
+}
diff --git a/gnulib/lib/memmem.c b/gnulib/lib/memmem.c
new file mode 100644
index 0000000..06b2dfe
--- /dev/null
+++ b/gnulib/lib/memmem.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This particular implementation was written by Eric Blake, 2008. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification of memmem. */
+#include <string.h>
+
+#ifndef _LIBC
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#define RETURN_TYPE void *
+#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
+#include "str-two-way.h"
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
+void *
+memmem (const void *haystack_start, size_t haystack_len,
+ const void *needle_start, size_t needle_len)
+{
+ /* Abstract memory is considered to be an array of 'unsigned char' values,
+ not an array of 'char' values. See ISO C 99 section 6.2.6.1. */
+ const unsigned char *haystack = (const unsigned char *) haystack_start;
+ const unsigned char *needle = (const unsigned char *) needle_start;
+
+ if (needle_len == 0)
+ /* The first occurrence of the empty string is deemed to occur at
+ the beginning of the string. */
+ return (void *) haystack;
+
+ /* Sanity check, otherwise the loop might search through the whole
+ memory. */
+ if (__builtin_expect (haystack_len < needle_len, 0))
+ return NULL;
+
+ /* Use optimizations in memchr when possible, to reduce the search
+ size of haystack using a linear algorithm with a smaller
+ coefficient. However, avoid memchr for long needles, since we
+ can often achieve sublinear performance. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ {
+ haystack = memchr (haystack, *needle, haystack_len);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (void *) haystack;
+ haystack_len -= haystack - (const unsigned char *) haystack_start;
+ if (haystack_len < needle_len)
+ return NULL;
+ return two_way_short_needle (haystack, haystack_len, needle, needle_len);
+ }
+ else
+ return two_way_long_needle (haystack, haystack_len, needle, needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/memmove.c b/gnulib/lib/memmove.c
new file mode 100644
index 0000000..0f04054
--- /dev/null
+++ b/gnulib/lib/memmove.c
@@ -0,0 +1,26 @@
+/* memmove.c -- copy memory.
+ Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate.
+ In the public domain.
+ By David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+void *
+memmove (void *dest0, void const *source0, size_t length)
+{
+ char *dest = dest0;
+ char const *source = source0;
+ if (source < dest)
+ /* Moving from low mem to hi mem; start at end. */
+ for (source += length, dest += length; length; --length)
+ *--dest = *--source;
+ else if (source != dest)
+ {
+ /* Moving from hi mem to low mem; start at beginning. */
+ for (; length; --length)
+ *dest++ = *source++;
+ }
+ return dest0;
+}
diff --git a/gnulib/lib/mempcpy.c b/gnulib/lib/mempcpy.c
new file mode 100644
index 0000000..feedf57
--- /dev/null
+++ b/gnulib/lib/mempcpy.c
@@ -0,0 +1,29 @@
+/* Copy memory area and return pointer after last written byte.
+ Copyright (C) 2003, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+ return (char *) memcpy (dest, src, n) + n;
+}
diff --git a/gnulib/lib/memrchr.c b/gnulib/lib/memrchr.c
new file mode 100644
index 0000000..d7144d0
--- /dev/null
+++ b/gnulib/lib/memrchr.c
@@ -0,0 +1,161 @@
+/* memrchr -- find the last occurrence of a byte in a memory block
+
+ Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2011 Free Software
+ Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# include <config.h>
+# define reg_char char
+#endif
+
+#include <string.h>
+#include <limits.h>
+
+#undef __memrchr
+#ifdef _LIBC
+# undef memrchr
+#endif
+
+#ifndef weak_alias
+# define __memrchr memrchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memrchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the last few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s + n;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n)
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *--longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ {
+ longword_ptr++;
+ break;
+ }
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ while (n-- > 0)
+ {
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memrchr, memrchr)
+#endif
diff --git a/gnulib/lib/memset.c b/gnulib/lib/memset.c
new file mode 100644
index 0000000..f16bf2e
--- /dev/null
+++ b/gnulib/lib/memset.c
@@ -0,0 +1,30 @@
+/* memset.c -- set an area of memory to a given value
+ Copyright (C) 1991, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stddef.h>
+
+void *
+memset (void *str, int c, size_t len)
+{
+ register char *st = str;
+
+ while (len-- > 0)
+ *st++ = c;
+ return str;
+}
diff --git a/gnulib/lib/memxor.c b/gnulib/lib/memxor.c
new file mode 100644
index 0000000..199bccd
--- /dev/null
+++ b/gnulib/lib/memxor.c
@@ -0,0 +1,35 @@
+/* memxor.c -- perform binary exclusive OR operation of two memory blocks.
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. The interface was inspired by memxor
+ in Niels Möller's Nettle. */
+
+#include <config.h>
+
+#include "memxor.h"
+
+void *
+memxor (void *restrict dest, const void *restrict src, size_t n)
+{
+ char const *s = src;
+ char *d = dest;
+
+ for (; n > 0; n--)
+ *d++ ^= *s++;
+
+ return dest;
+}
diff --git a/gnulib/lib/memxor.h b/gnulib/lib/memxor.h
new file mode 100644
index 0000000..cec9e7e
--- /dev/null
+++ b/gnulib/lib/memxor.h
@@ -0,0 +1,31 @@
+/* memxor.h -- perform binary exclusive OR operation on memory blocks.
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson. The interface was inspired by memxor
+ in Niels Möller's Nettle. */
+
+#ifndef MEMXOR_H
+# define MEMXOR_H
+
+#include <stddef.h>
+
+/* Compute binary exclusive OR of memory areas DEST and SRC, putting
+ the result in DEST, of length N bytes. Returns a pointer to
+ DEST. */
+void *memxor (void *restrict dest, const void *restrict src, size_t n);
+
+#endif /* MEMXOR_H */
diff --git a/gnulib/lib/mgetgroups.c b/gnulib/lib/mgetgroups.c
new file mode 100644
index 0000000..e0aa250
--- /dev/null
+++ b/gnulib/lib/mgetgroups.c
@@ -0,0 +1,195 @@
+/* mgetgroups.c -- return a list of the groups a user or current process is in
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Extracted from coreutils' src/id.c. */
+
+#include <config.h>
+
+#include "mgetgroups.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#if HAVE_GETGROUPLIST
+# include <grp.h>
+#endif
+
+#include "getugroups.h"
+#include "xalloc-oversized.h"
+
+static gid_t *
+realloc_groupbuf (gid_t *g, size_t num)
+{
+ if (xalloc_oversized (num, sizeof *g))
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ return realloc (g, num * sizeof *g);
+}
+
+/* Like getugroups, but store the result in malloc'd storage.
+ Set *GROUPS to the malloc'd list of all group IDs of which USERNAME
+ is a member. If GID is not -1, store it first. GID should be the
+ group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
+ listed in the groups database (e.g., /etc/groups). If USERNAME is
+ NULL, store the supplementary groups of the current process, and GID
+ should be -1 or the effective group ID (getegid). Upon failure,
+ don't modify *GROUPS, set errno, and return -1. Otherwise, return
+ the number of groups. The resulting list may contain duplicates,
+ but adjacent members will be distinct. */
+
+int
+mgetgroups (char const *username, gid_t gid, gid_t **groups)
+{
+ int max_n_groups;
+ int ng;
+ gid_t *g;
+
+#if HAVE_GETGROUPLIST
+ /* We prefer to use getgrouplist if available, because it has better
+ performance characteristics.
+
+ In glibc 2.3.2, getgrouplist is buggy. If you pass a zero as the
+ length of the output buffer, getgrouplist will still write to the
+ buffer. Contrary to what some versions of the getgrouplist
+ manpage say, this doesn't happen with nonzero buffer sizes.
+ Therefore our usage here just avoids a zero sized buffer. */
+ if (username)
+ {
+ enum { N_GROUPS_INIT = 10 };
+ max_n_groups = N_GROUPS_INIT;
+
+ g = realloc_groupbuf (NULL, max_n_groups);
+ if (g == NULL)
+ return -1;
+
+ while (1)
+ {
+ gid_t *h;
+ int last_n_groups = max_n_groups;
+
+ /* getgrouplist updates max_n_groups to num required. */
+ ng = getgrouplist (username, gid, g, &max_n_groups);
+
+ /* Some systems (like Darwin) have a bug where they
+ never increase max_n_groups. */
+ if (ng < 0 && last_n_groups == max_n_groups)
+ max_n_groups *= 2;
+
+ if ((h = realloc_groupbuf (g, max_n_groups)) == NULL)
+ {
+ int saved_errno = errno;
+ free (g);
+ errno = saved_errno;
+ return -1;
+ }
+ g = h;
+
+ if (0 <= ng)
+ {
+ *groups = g;
+ /* On success some systems just return 0 from getgrouplist,
+ so return max_n_groups rather than ng. */
+ return max_n_groups;
+ }
+ }
+ }
+ /* else no username, so fall through and use getgroups. */
+#endif
+
+ max_n_groups = (username
+ ? getugroups (0, NULL, username, gid)
+ : getgroups (0, NULL));
+
+ /* If we failed to count groups because there is no supplemental
+ group support, then return an array containing just GID.
+ Otherwise, we fail for the same reason. */
+ if (max_n_groups < 0)
+ {
+ if (errno == ENOSYS && (g = realloc_groupbuf (NULL, 1)))
+ {
+ *groups = g;
+ *g = gid;
+ return gid != (gid_t) -1;
+ }
+ return -1;
+ }
+
+ if (!username && gid != (gid_t) -1)
+ max_n_groups++;
+ g = realloc_groupbuf (NULL, max_n_groups);
+ if (g == NULL)
+ return -1;
+
+ ng = (username
+ ? getugroups (max_n_groups, g, username, gid)
+ : getgroups (max_n_groups - (gid != (gid_t) -1),
+ g + (gid != (gid_t) -1)));
+
+ if (ng < 0)
+ {
+ /* Failure is unexpected, but handle it anyway. */
+ int saved_errno = errno;
+ free (g);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (!username && gid != (gid_t) -1)
+ {
+ *g = gid;
+ ng++;
+ }
+ *groups = g;
+
+ /* Reduce the number of duplicates. On some systems, getgroups
+ returns the effective gid twice: once as the first element, and
+ once in its position within the supplementary groups. On other
+ systems, getgroups does not return the effective gid at all,
+ which is why we provide a GID argument. Meanwhile, the GID
+ argument, if provided, is typically any member of the
+ supplementary groups, and not necessarily the effective gid. So,
+ the most likely duplicates are the first element with an
+ arbitrary other element, or pair-wise duplication between the
+ first and second elements returned by getgroups. It is possible
+ that this O(n) pass will not remove all duplicates, but it is not
+ worth the effort to slow down to an O(n log n) algorithm that
+ sorts the array in place, nor the extra memory needed for
+ duplicate removal via an O(n) hash-table. Hence, this function
+ is only documented as guaranteeing no pair-wise duplicates,
+ rather than returning the minimal set. */
+ if (1 < ng)
+ {
+ gid_t first = *g;
+ gid_t *next;
+ gid_t *groups_end = g + ng;
+
+ for (next = g + 1; next < groups_end; next++)
+ {
+ if (*next == first || *next == *g)
+ ng--;
+ else
+ *++g = *next;
+ }
+ }
+
+ return ng;
+}
diff --git a/gnulib/lib/mgetgroups.h b/gnulib/lib/mgetgroups.h
new file mode 100644
index 0000000..7a572bc
--- /dev/null
+++ b/gnulib/lib/mgetgroups.h
@@ -0,0 +1,22 @@
+/* Get a list of all group IDs associated with a specified user ID.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+
+int mgetgroups (const char *username, gid_t gid, gid_t **groups);
+#if GNULIB_XGETGROUPS
+int xgetgroups (const char *username, gid_t gid, gid_t **groups);
+#endif
diff --git a/gnulib/lib/minmax.h b/gnulib/lib/minmax.h
new file mode 100644
index 0000000..83650f2
--- /dev/null
+++ b/gnulib/lib/minmax.h
@@ -0,0 +1,61 @@
+/* MIN, MAX macros.
+ Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MINMAX_H
+#define _MINMAX_H
+
+/* Note: MIN, MAX are also defined in <sys/param.h> on some systems
+ (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about
+ MIN, MAX macro redefinitions on some systems; the workaround is to
+ #include this file as the last one among the #include list. */
+
+/* Before we define the following symbols we get the <limits.h> file
+ since otherwise we get redefinitions on some systems if <limits.h> is
+ included after this file. Likewise for <sys/param.h>.
+ If more than one of these system headers define MIN and MAX, pick just
+ one of the headers (because the definitions most likely are the same). */
+#if HAVE_MINMAX_IN_LIMITS_H
+# include <limits.h>
+#elif HAVE_MINMAX_IN_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+/* Note: MIN and MAX should be used with two arguments of the
+ same type. They might not return the minimum and maximum of their two
+ arguments, if the arguments have different types or have unusual
+ floating-point values. For example, on a typical host with 32-bit 'int',
+ 64-bit 'long long', and 64-bit IEEE 754 'double' types:
+
+ MAX (-1, 2147483648) returns 4294967295.
+ MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0.
+ MAX (NaN, 0.0) returns 0.0.
+ MAX (+0.0, -0.0) returns -0.0.
+
+ and in each case the answer is in some sense bogus. */
+
+/* MAX(a,b) returns the maximum of A and B. */
+#ifndef MAX
+# define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+/* MIN(a,b) returns the minimum of A and B. */
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#endif /* _MINMAX_H */
diff --git a/gnulib/lib/mkancesdirs.c b/gnulib/lib/mkancesdirs.c
new file mode 100644
index 0000000..2d5bb0e
--- /dev/null
+++ b/gnulib/lib/mkancesdirs.c
@@ -0,0 +1,153 @@
+/* Make a file's ancestor directories.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "mkancesdirs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "dirname.h"
+#include "savewd.h"
+
+/* Ensure that the ancestor directories of FILE exist, using an
+ algorithm that should work even if two processes execute this
+ function in parallel. Modify FILE as necessary to access the
+ ancestor directories, but restore FILE to an equivalent value
+ if successful.
+
+ WD points to the working directory, using the conventions of
+ savewd.
+
+ Create any ancestor directories that don't already exist, by
+ invoking MAKE_DIR (FILE, COMPONENT, MAKE_DIR_ARG). This function
+ should return 0 if successful and the resulting directory is
+ readable, 1 if successful but the resulting directory might not be
+ readable, -1 (setting errno) otherwise. If COMPONENT is relative,
+ it is relative to the temporary working directory, which may differ
+ from *WD.
+
+ Ordinarily MAKE_DIR is executed with the working directory changed
+ to reflect the already-made prefix, and mkancesdirs returns with
+ the working directory changed a prefix of FILE. However, if the
+ initial working directory cannot be saved in a file descriptor,
+ MAKE_DIR is invoked in a subprocess and this function returns in
+ both the parent and child process, so the caller should not assume
+ any changed state survives other than the EXITMAX component of WD,
+ and the caller should take care that the parent does not attempt to
+ do the work that the child is doing.
+
+ If successful and if this process can go ahead and create FILE,
+ return the length of the prefix of FILE that has already been made.
+ If successful so far but a child process is doing the actual work,
+ return -2. If unsuccessful, return -1 and set errno. */
+
+ptrdiff_t
+mkancesdirs (char *file, struct savewd *wd,
+ int (*make_dir) (char const *, char const *, void *),
+ void *make_dir_arg)
+{
+ /* Address of the previous directory separator that follows an
+ ordinary byte in a file name in the left-to-right scan, or NULL
+ if no such separator precedes the current location P. */
+ char *sep = NULL;
+
+ /* Address of the leftmost file name component that has not yet
+ been processed. */
+ char *component = file;
+
+ char *p = file + FILE_SYSTEM_PREFIX_LEN (file);
+ char c;
+ bool made_dir = false;
+
+ /* Scan forward through FILE, creating and chdiring into directories
+ along the way. Try MAKE_DIR before chdir, so that the procedure
+ works even when two or more processes are executing it in
+ parallel. Isolate each file name component by having COMPONENT
+ point to its start and SEP point just after its end. */
+
+ while ((c = *p++))
+ if (ISSLASH (*p))
+ {
+ if (! ISSLASH (c))
+ sep = p;
+ }
+ else if (ISSLASH (c) && *p && sep)
+ {
+ /* Don't bother to make or test for "." since it does not
+ affect the algorithm. */
+ if (! (sep - component == 1 && component[0] == '.'))
+ {
+ int make_dir_errno = 0;
+ int savewd_chdir_options = 0;
+ int chdir_result;
+
+ /* Temporarily modify FILE to isolate this file name
+ component. */
+ *sep = '\0';
+
+ /* Invoke MAKE_DIR on this component, except don't bother
+ with ".." since it must exist if its "parent" does. */
+ if (sep - component == 2
+ && component[0] == '.' && component[1] == '.')
+ made_dir = false;
+ else
+ switch (make_dir (file, component, make_dir_arg))
+ {
+ case -1:
+ make_dir_errno = errno;
+ break;
+
+ case 0:
+ savewd_chdir_options |= SAVEWD_CHDIR_READABLE;
+ /* Fall through. */
+ case 1:
+ made_dir = true;
+ break;
+ }
+
+ if (made_dir)
+ savewd_chdir_options |= SAVEWD_CHDIR_NOFOLLOW;
+
+ chdir_result =
+ savewd_chdir (wd, component, savewd_chdir_options, NULL);
+
+ /* Undo the temporary modification to FILE, unless there
+ was a failure. */
+ if (chdir_result != -1)
+ *sep = '/';
+
+ if (chdir_result != 0)
+ {
+ if (make_dir_errno != 0 && errno == ENOENT)
+ errno = make_dir_errno;
+ return chdir_result;
+ }
+ }
+
+ component = p;
+ }
+
+ return component - file;
+}
diff --git a/gnulib/lib/mkancesdirs.h b/gnulib/lib/mkancesdirs.h
new file mode 100644
index 0000000..5f7b2d6
--- /dev/null
+++ b/gnulib/lib/mkancesdirs.h
@@ -0,0 +1,4 @@
+#include <stddef.h>
+struct savewd;
+ptrdiff_t mkancesdirs (char *, struct savewd *,
+ int (*) (char const *, char const *, void *), void *);
diff --git a/gnulib/lib/mkdir-p.c b/gnulib/lib/mkdir-p.c
new file mode 100644
index 0000000..566aadb
--- /dev/null
+++ b/gnulib/lib/mkdir-p.c
@@ -0,0 +1,208 @@
+/* mkdir-p.c -- Ensure that a directory and its parents exist.
+
+ Copyright (C) 1990, 1997-2000, 2002-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */
+
+#include <config.h>
+
+#include "mkdir-p.h"
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "dirchownmod.h"
+#include "dirname.h"
+#include "error.h"
+#include "quote.h"
+#include "mkancesdirs.h"
+#include "savewd.h"
+
+#ifndef HAVE_FCHMOD
+# define HAVE_FCHMOD false
+#endif
+
+/* Ensure that the directory DIR exists.
+
+ WD is the working directory, as in savewd.c.
+
+ If MAKE_ANCESTOR is not null, create any ancestor directories that
+ don't already exist, by invoking MAKE_ANCESTOR (DIR, ANCESTOR, OPTIONS).
+ This function should return zero if successful, -1 (setting errno)
+ otherwise. In this case, DIR may be modified by storing '\0' bytes
+ into it, to access the ancestor directories, and this modification
+ is retained on return if the ancestor directories could not be
+ created.
+
+ Create DIR as a new directory with using mkdir with permissions
+ MODE. It is also OK if MAKE_ANCESTOR is not null and a
+ directory DIR already exists.
+
+ Call ANNOUNCE (DIR, OPTIONS) just after successfully making DIR,
+ even if some of the following actions fail.
+
+ Set DIR's owner to OWNER and group to GROUP, but leave the owner
+ alone if OWNER is (uid_t) -1, and similarly for GROUP.
+
+ Set DIR's mode bits to MODE, except preserve any of the bits that
+ correspond to zero bits in MODE_BITS. In other words, MODE_BITS is
+ a mask that specifies which of DIR's mode bits should be set or
+ cleared. MODE should be a subset of MODE_BITS, which in turn
+ should be a subset of CHMOD_MODE_BITS. Changing the mode in this
+ way is necessary if DIR already existed or if MODE and MODE_BITS
+ specify non-permissions bits like S_ISUID.
+
+ However, if PRESERVE_EXISTING is true and DIR already exists,
+ do not attempt to set DIR's ownership and file mode bits.
+
+ This implementation assumes the current umask is zero.
+
+ Return true if DIR exists as a directory with the proper ownership
+ and file mode bits when done, or if a child process has been
+ dispatched to do the real work (though the child process may not
+ have finished yet -- it is the caller's responsibility to handle
+ this). Report a diagnostic and return false on failure, storing
+ '\0' into *DIR if an ancestor directory had problems. */
+
+bool
+make_dir_parents (char *dir,
+ struct savewd *wd,
+ int (*make_ancestor) (char const *, char const *, void *),
+ void *options,
+ mode_t mode,
+ void (*announce) (char const *, void *),
+ mode_t mode_bits,
+ uid_t owner,
+ gid_t group,
+ bool preserve_existing)
+{
+ int mkdir_errno = (IS_ABSOLUTE_FILE_NAME (dir) ? 0 : savewd_errno (wd));
+
+ if (mkdir_errno == 0)
+ {
+ ptrdiff_t prefix_len = 0;
+ int savewd_chdir_options = (HAVE_FCHMOD ? SAVEWD_CHDIR_SKIP_READABLE : 0);
+
+ if (make_ancestor)
+ {
+ prefix_len = mkancesdirs (dir, wd, make_ancestor, options);
+ if (prefix_len < 0)
+ {
+ if (prefix_len < -1)
+ return true;
+ mkdir_errno = errno;
+ }
+ }
+
+ if (0 <= prefix_len)
+ {
+ /* If the ownership might change, or if the directory will be
+ writeable to other users and its special mode bits may
+ change after the directory is created, create it with
+ more restrictive permissions at first, so unauthorized
+ users cannot nip in before the directory is ready. */
+ bool keep_owner = owner == (uid_t) -1 && group == (gid_t) -1;
+ bool keep_special_mode_bits =
+ ((mode_bits & (S_ISUID | S_ISGID)) | (mode & S_ISVTX)) == 0;
+ mode_t mkdir_mode = mode;
+ if (! keep_owner)
+ mkdir_mode &= ~ (S_IRWXG | S_IRWXO);
+ else if (! keep_special_mode_bits)
+ mkdir_mode &= ~ (S_IWGRP | S_IWOTH);
+
+ if (mkdir (dir + prefix_len, mkdir_mode) == 0)
+ {
+ announce (dir, options);
+ preserve_existing = keep_owner & keep_special_mode_bits;
+ savewd_chdir_options |=
+ (SAVEWD_CHDIR_NOFOLLOW
+ | (mode & S_IRUSR ? SAVEWD_CHDIR_READABLE : 0));
+ }
+ else
+ {
+ mkdir_errno = errno;
+ mkdir_mode = -1;
+ }
+
+ if (preserve_existing)
+ {
+ struct stat st;
+ if (mkdir_errno == 0
+ || (mkdir_errno != ENOENT && make_ancestor
+ && stat (dir + prefix_len, &st) == 0
+ && S_ISDIR (st.st_mode)))
+ return true;
+ }
+ else
+ {
+ int open_result[2];
+ int chdir_result =
+ savewd_chdir (wd, dir + prefix_len,
+ savewd_chdir_options, open_result);
+ if (chdir_result < -1)
+ return true;
+ else
+ {
+ bool chdir_ok = (chdir_result == 0);
+ int chdir_errno = errno;
+ int fd = open_result[0];
+ bool chdir_failed_unexpectedly =
+ (mkdir_errno == 0
+ && ((! chdir_ok && (mode & S_IXUSR))
+ || (fd < 0 && (mode & S_IRUSR))));
+
+ if (chdir_failed_unexpectedly)
+ {
+ /* No need to save errno here; it's irrelevant. */
+ if (0 <= fd)
+ close (fd);
+ }
+ else
+ {
+ char const *subdir = (chdir_ok ? "." : dir + prefix_len);
+ if (dirchownmod (fd, subdir, mkdir_mode, owner, group,
+ mode, mode_bits)
+ == 0)
+ return true;
+ }
+
+ if (mkdir_errno == 0
+ || (mkdir_errno != ENOENT && make_ancestor
+ && errno != ENOTDIR))
+ {
+ error (0,
+ (! chdir_failed_unexpectedly ? errno
+ : ! chdir_ok && (mode & S_IXUSR) ? chdir_errno
+ : open_result[1]),
+ _(keep_owner
+ ? "cannot change permissions of %s"
+ : "cannot change owner and permissions of %s"),
+ quote (dir));
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ error (0, mkdir_errno, _("cannot create directory %s"), quote (dir));
+ return false;
+}
diff --git a/gnulib/lib/mkdir-p.h b/gnulib/lib/mkdir-p.h
new file mode 100644
index 0000000..1766d4f
--- /dev/null
+++ b/gnulib/lib/mkdir-p.h
@@ -0,0 +1,35 @@
+/* mkdir-p.h -- Ensure that a directory and its parents exist.
+
+ Copyright (C) 1994-1997, 2000, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, David MacKenzie, and Jim Meyering. */
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+struct savewd;
+bool make_dir_parents (char *dir,
+ struct savewd *wd,
+ int (*make_ancestor) (char const *, char const *,
+ void *),
+ void *options,
+ mode_t mode,
+ void (*announce) (char const *, void *),
+ mode_t mode_bits,
+ uid_t owner,
+ gid_t group,
+ bool preserve_existing);
diff --git a/gnulib/lib/mkdir.c b/gnulib/lib/mkdir.c
new file mode 100644
index 0000000..07f97b9
--- /dev/null
+++ b/gnulib/lib/mkdir.c
@@ -0,0 +1,93 @@
+/* On some systems, mkdir ("foo/", 0700) fails because of the trailing
+ slash. On those systems, this wrapper removes the trailing slash.
+
+ Copyright (C) 2001, 2003, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirname.h"
+
+/* Disable the definition of mkdir to rpl_mkdir (from the <sys/stat.h>
+ substitute) in this file. Otherwise, we'd get an endless recursion. */
+#undef mkdir
+
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
+ which are included in the <sys/stat.h> override. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define mkdir(name,mode) _mkdir (name)
+# define maybe_unused _GL_UNUSED
+#else
+# define maybe_unused /* empty */
+#endif
+
+/* This function is required at least for NetBSD 1.5.2. */
+
+int
+rpl_mkdir (char const *dir, mode_t mode maybe_unused)
+{
+ int ret_val;
+ char *tmp_dir;
+ size_t len = strlen (dir);
+
+ if (len && dir[len - 1] == '/')
+ {
+ tmp_dir = strdup (dir);
+ if (!tmp_dir)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ errno = ENOMEM;
+ return -1;
+ }
+ strip_trailing_slashes (tmp_dir);
+ }
+ else
+ {
+ tmp_dir = (char *) dir;
+ }
+#if FUNC_MKDIR_DOT_BUG
+ /* Additionally, cygwin 1.5 mistakenly creates a directory "d/./". */
+ {
+ char *last = last_component (tmp_dir);
+ if (*last == '.' && (last[1] == '\0'
+ || (last[1] == '.' && last[2] == '\0')))
+ {
+ struct stat st;
+ if (stat (tmp_dir, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ }
+#endif /* FUNC_MKDIR_DOT_BUG */
+
+ ret_val = mkdir (tmp_dir, mode);
+
+ if (tmp_dir != dir)
+ free (tmp_dir);
+
+ return ret_val;
+}
diff --git a/gnulib/lib/mkdirat.c b/gnulib/lib/mkdirat.c
new file mode 100644
index 0000000..ed7998d
--- /dev/null
+++ b/gnulib/lib/mkdirat.c
@@ -0,0 +1,34 @@
+/* fd-relative mkdir
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+/* Solaris 10 has no function like this.
+ Create a subdirectory, FILE, with mode MODE, in the directory
+ open on descriptor FD. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME mkdirat
+#define AT_FUNC_F1 mkdir
+#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode
+#define AT_FUNC_POST_FILE_ARGS , mode
+#include "at-func.c"
diff --git a/gnulib/lib/mkdtemp.c b/gnulib/lib/mkdtemp.c
new file mode 100644
index 0000000..ac38c25
--- /dev/null
+++ b/gnulib/lib/mkdtemp.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 1999, 2001-2003, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Extracted from misc/mkdtemp.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include "tempname.h"
+
+/* Generate a unique temporary directory from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the filename unique.
+ The directory is created, mode 700, and its name is returned.
+ (This function comes from OpenBSD.) */
+char *
+mkdtemp (char *xtemplate)
+{
+ if (gen_tempname (xtemplate, 0, 0, GT_DIR))
+ return NULL;
+ else
+ return xtemplate;
+}
diff --git a/gnulib/lib/mkfifo.c b/gnulib/lib/mkfifo.c
new file mode 100644
index 0000000..45b8931
--- /dev/null
+++ b/gnulib/lib/mkfifo.c
@@ -0,0 +1,58 @@
+/* Create a named fifo.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if !HAVE_MKFIFO
+/* Mingw lacks mkfifo; always fail with ENOSYS. */
+
+int
+mkfifo (char const *name _GL_UNUSED, mode_t mode _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+# undef mkfifo
+
+/* Create a named fifo FILE, with access permissions in MODE. Work
+around trailing slash bugs. */
+
+int
+rpl_mkfifo (char const *name, mode_t mode)
+{
+# if MKFIFO_TRAILING_SLASH_BUG
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+# endif
+ return mkfifo (name, mode);
+}
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mkfifoat.c b/gnulib/lib/mkfifoat.c
new file mode 100644
index 0000000..0f2342f
--- /dev/null
+++ b/gnulib/lib/mkfifoat.c
@@ -0,0 +1,55 @@
+/* Create a named fifo relative to an open directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#if !HAVE_MKFIFO
+
+# include <errno.h>
+
+/* Mingw lacks mkfifo, so this wrapper is trivial. */
+
+int
+mkfifoat (int fd _GL_UNUSED, char const *path _GL_UNUSED,
+ mode_t mode _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+/* Create a named fifo FILE relative to directory FD, with access
+ permissions in MODE. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mkfifo/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME mkfifoat
+# define AT_FUNC_F1 mkfifo
+# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode
+# define AT_FUNC_POST_FILE_ARGS , mode
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mknod.c b/gnulib/lib/mknod.c
new file mode 100644
index 0000000..5bbf62f
--- /dev/null
+++ b/gnulib/lib/mknod.c
@@ -0,0 +1,74 @@
+/* Create a device inode.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <string.h>
+
+#if !HAVE_MKNOD
+/* Mingw lacks mknod; always fail with ENOSYS. */
+
+int
+mknod (char const *name _GL_UNUSED, mode_t mode _GL_UNUSED,
+ dev_t dev _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKNOD */
+
+# undef mknod
+
+/* Create a file system node FILE, with access permissions and file
+ type in MODE, and device type in DEV. Usually, non-root
+ applications can only create named fifos (mode includes S_IFIFO),
+ with DEV set to 0. Also work around trailing slash bugs. */
+
+int
+rpl_mknod (char const *name, mode_t mode, dev_t dev)
+{
+# if MKFIFO_TRAILING_SLASH_BUG
+ /* Trailing slash only makes sense for directories. Of course,
+ using mknod to create a directory is not very portable, so it may
+ still fail later on. */
+ if (!S_ISDIR (mode))
+ {
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ }
+# endif
+# if MKNOD_FIFO_BUG
+ /* POSIX requires mknod to create fifos for non-privileged
+ processes, but BSD implementations fail with EPERM. */
+ if (S_ISFIFO (mode) && dev == 0)
+ return mkfifo (name, mode & ~S_IFIFO);
+# endif
+ return mknod (name, mode, dev);
+}
+
+#endif /* HAVE_MKNOD */
diff --git a/gnulib/lib/mknodat.c b/gnulib/lib/mknodat.c
new file mode 100644
index 0000000..e078837
--- /dev/null
+++ b/gnulib/lib/mknodat.c
@@ -0,0 +1,57 @@
+/* Create an inode relative to an open directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#if !HAVE_MKNOD
+
+# include <errno.h>
+
+/* Mingw lacks mknod, so this wrapper is trivial. */
+
+int
+mknodat (int fd _GL_UNUSED, char const *path _GL_UNUSED,
+ mode_t mode _GL_UNUSED, dev_t dev _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_MKFIFO */
+
+/* Create a file system node FILE relative to directory FD, with
+ access permissions and file type in MODE, and device type in DEV.
+ Usually, non-root applications can only create named fifos, with
+ DEV set to 0. If possible, create the node without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then mknod/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+# define AT_FUNC_NAME mknodat
+# define AT_FUNC_F1 mknod
+# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, dev_t dev
+# define AT_FUNC_POST_FILE_ARGS , mode, dev
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* HAVE_MKFIFO */
diff --git a/gnulib/lib/mkostemp.c b/gnulib/lib/mkostemp.c
new file mode 100644
index 0000000..3882ab1
--- /dev/null
+++ b/gnulib/lib/mkostemp.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GTFILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd. */
+int
+mkostemp (char *xtemplate, int flags)
+{
+ return __gen_tempname (xtemplate, 0, flags, __GT_FILE);
+}
diff --git a/gnulib/lib/mkostemps.c b/gnulib/lib/mkostemps.c
new file mode 100644
index 0000000..f8ff67c
--- /dev/null
+++ b/gnulib/lib/mkostemps.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include <errno.h>
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+# define __set_errno(x) errno = x;
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE. The last six
+ characters before a suffix of length SUFFIXLEN of XTEMPLATE must be
+ "XXXXXX"; they are replaced with a string that makes the filename
+ unique. Then open the file and return a fd. */
+int
+mkostemps (char *xtemplate, int suffixlen, int flags)
+{
+ if (suffixlen < 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __gen_tempname (xtemplate, suffixlen, flags, __GT_FILE);
+}
diff --git a/gnulib/lib/mkstemp-safer.c b/gnulib/lib/mkstemp-safer.c
new file mode 100644
index 0000000..b0380e8
--- /dev/null
+++ b/gnulib/lib/mkstemp-safer.c
@@ -0,0 +1,63 @@
+/* Invoke mkstemp, but avoid some glitches.
+
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "stdlib-safer.h"
+
+#include <stdlib.h>
+#include "unistd-safer.h"
+
+/* Like mkstemp, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+mkstemp_safer (char *templ)
+{
+ return fd_safer (mkstemp (templ));
+}
+
+#if GNULIB_MKOSTEMP
+/* Like mkostemp, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int
+mkostemp_safer (char *templ, int flags)
+{
+ return fd_safer_flag (mkostemp (templ, flags), flags);
+}
+#endif
+
+#if GNULIB_MKOSTEMPS
+/* Like mkostemps, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int
+mkostemps_safer (char *templ, int suffixlen, int flags)
+{
+ return fd_safer_flag (mkostemps (templ, suffixlen, flags), flags);
+}
+#endif
+
+#if GNULIB_MKSTEMPS
+/* Like mkstemps, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+int mkstemps_safer (char *templ, int suffixlen)
+{
+ return fd_safer (mkstemps (templ, suffixlen));
+}
+#endif
diff --git a/gnulib/lib/mkstemp.c b/gnulib/lib/mkstemp.c
new file mode 100644
index 0000000..3c8437e
--- /dev/null
+++ b/gnulib/lib/mkstemp.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd.
+
+ If you are creating temporary files which will later be removed,
+ consider using the clean-temp module, which avoids several pitfalls
+ of using mkstemp directly. */
+int
+mkstemp (char *xtemplate)
+{
+ return __gen_tempname (xtemplate, 0, 0, __GT_FILE);
+}
diff --git a/gnulib/lib/mkstemps.c b/gnulib/lib/mkstemps.c
new file mode 100644
index 0000000..16f703e
--- /dev/null
+++ b/gnulib/lib/mkstemps.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include <errno.h>
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+# define __set_errno(x) errno = x;
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE. The last six
+ characters before a suffix of length SUFFIXLEN of XTEMPLATE must be
+ "XXXXXX"; they are replaced with a string that makes the filename
+ unique. Then open the file and return a fd. */
+int
+mkstemps (char *xtemplate, int suffixlen)
+{
+ if (suffixlen < 0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __gen_tempname (xtemplate, suffixlen, 0, __GT_FILE);
+}
diff --git a/gnulib/lib/mktime-internal.h b/gnulib/lib/mktime-internal.h
new file mode 100644
index 0000000..4287acf
--- /dev/null
+++ b/gnulib/lib/mktime-internal.h
@@ -0,0 +1,4 @@
+#include <time.h>
+time_t mktime_internal (struct tm *,
+ struct tm * (*) (time_t const *, struct tm *),
+ time_t *);
diff --git a/gnulib/lib/mktime.c b/gnulib/lib/mktime.c
new file mode 100644
index 0000000..cba2b8b
--- /dev/null
+++ b/gnulib/lib/mktime.c
@@ -0,0 +1,737 @@
+/* Convert a `struct tm' to a time_t value.
+ Copyright (C) 1993-1999, 2002-2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Paul Eggert <eggert@twinsun.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Define this to have a standalone program to test this implementation of
+ mktime. */
+/* #define DEBUG 1 */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Some of the code in this file assumes that signed integer overflow
+ silently wraps around. This assumption can't easily be programmed
+ around, nor can it be checked for portably at compile-time or
+ easily eliminated at run-time.
+
+ Define WRAPV to 1 if the assumption is valid. Otherwise, define it
+ to 0; this forces the use of slower code that, while not guaranteed
+ by the C Standard, works on all production platforms that we know
+ about. */
+#ifndef WRAPV
+# if (__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC optimize ("wrapv")
+# define WRAPV 1
+# else
+# define WRAPV 0
+# endif
+#endif
+
+/* Assume that leap seconds are possible, unless told otherwise.
+ If the host has a `zic' command with a `-L leapsecondfilename' option,
+ then it supports leap seconds; otherwise it probably doesn't. */
+#ifndef LEAP_SECONDS_POSSIBLE
+# define LEAP_SECONDS_POSSIBLE 1
+#endif
+
+#include <time.h>
+
+#include <limits.h>
+
+#include <string.h> /* For the real memcpy prototype. */
+
+#if DEBUG
+# include <stdio.h>
+# include <stdlib.h>
+/* Make it work even if the system's libc has its own mktime routine. */
+# undef mktime
+# define mktime my_mktime
+#endif /* DEBUG */
+
+/* Verify a requirement at compile-time (unlike assert, which is runtime). */
+#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
+
+/* A signed type that is at least one bit wider than int. */
+#if INT_MAX <= LONG_MAX / 2
+typedef long int long_int;
+#else
+typedef long long int long_int;
+#endif
+verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2);
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ ((-1 >> 1 == -1 \
+ && (long_int) -1 >> 1 == -1 \
+ && ((time_t) -1 >> 1 == -1 || ! TYPE_SIGNED (time_t))) \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if the arithmetic type T is an integer type. bool counts as
+ an integer. */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if negative values of the signed integer type T use two's
+ complement, or if T is an unsigned integer type. */
+#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+
+/* True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+#define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+
+#ifndef TIME_T_MIN
+# define TIME_T_MIN TYPE_MINIMUM (time_t)
+#endif
+#ifndef TIME_T_MAX
+# define TIME_T_MAX TYPE_MAXIMUM (time_t)
+#endif
+#define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1)
+
+verify (time_t_is_integer, TYPE_IS_INTEGER (time_t));
+verify (twos_complement_arithmetic,
+ (TYPE_TWOS_COMPLEMENT (int)
+ && TYPE_TWOS_COMPLEMENT (long_int)
+ && TYPE_TWOS_COMPLEMENT (time_t)));
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+verify (base_year_is_a_multiple_of_100, TM_YEAR_BASE % 100 == 0);
+
+/* Return 1 if YEAR + TM_YEAR_BASE is a leap year. */
+static inline int
+leapyear (long_int year)
+{
+ /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
+ Also, work even if YEAR is negative. */
+ return
+ ((year & 3) == 0
+ && (year % 100 != 0
+ || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
+}
+
+/* How many days come before each month (0-12). */
+#ifndef _LIBC
+static
+#endif
+const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+
+
+#ifndef _LIBC
+/* Portable standalone applications should supply a <time.h> that
+ declares a POSIX-compliant localtime_r, for the benefit of older
+ implementations that lack localtime_r or have a nonstandard one.
+ See the gnulib time_r module for one way to implement this. */
+# undef __localtime_r
+# define __localtime_r localtime_r
+# define __mktime_internal mktime_internal
+# include "mktime-internal.h"
+#endif
+
+/* Return 1 if the values A and B differ according to the rules for
+ tm_isdst: A and B differ if one is zero and the other positive. */
+static int
+isdst_differ (int a, int b)
+{
+ return (!a != !b) & (0 <= a) & (0 <= b);
+}
+
+/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
+ (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
+ were not adjusted between the time stamps.
+
+ The YEAR values uses the same numbering as TP->tm_year. Values
+ need not be in the usual range. However, YEAR1 must not be less
+ than 2 * INT_MIN or greater than 2 * INT_MAX.
+
+ The result may overflow. It is the caller's responsibility to
+ detect overflow. */
+
+static inline time_t
+ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1,
+ int year0, int yday0, int hour0, int min0, int sec0)
+{
+ verify (C99_integer_division, -1 / 2 == 0);
+
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid integer overflow here. */
+ int a4 = SHR (year1, 2) + SHR (TM_YEAR_BASE, 2) - ! (year1 & 3);
+ int b4 = SHR (year0, 2) + SHR (TM_YEAR_BASE, 2) - ! (year0 & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+
+ /* Compute the desired time in time_t precision. Overflow might
+ occur here. */
+ time_t tyear1 = year1;
+ time_t years = tyear1 - year0;
+ time_t days = 365 * years + yday1 - yday0 + intervening_leap_days;
+ time_t hours = 24 * days + hour1 - hour0;
+ time_t minutes = 60 * hours + min1 - min0;
+ time_t seconds = 60 * minutes + sec1 - sec0;
+ return seconds;
+}
+
+/* Return the average of A and B, even if A + B would overflow. */
+static time_t
+time_t_avg (time_t a, time_t b)
+{
+ return SHR (a, 1) + SHR (b, 1) + (a & b & 1);
+}
+
+/* Return 1 if A + B does not overflow. If time_t is unsigned and if
+ B's top bit is set, assume that the sum represents A - -B, and
+ return 1 if the subtraction does not wrap around. */
+static int
+time_t_add_ok (time_t a, time_t b)
+{
+ if (! TYPE_SIGNED (time_t))
+ {
+ time_t sum = a + b;
+ return (sum < a) == (TIME_T_MIDPOINT <= b);
+ }
+ else if (WRAPV)
+ {
+ time_t sum = a + b;
+ return (sum < a) == (b < 0);
+ }
+ else
+ {
+ time_t avg = time_t_avg (a, b);
+ return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2;
+ }
+}
+
+/* Return 1 if A + B does not overflow. */
+static int
+time_t_int_add_ok (time_t a, int b)
+{
+ verify (int_no_wider_than_time_t, INT_MAX <= TIME_T_MAX);
+ if (WRAPV)
+ {
+ time_t sum = a + b;
+ return (sum < a) == (b < 0);
+ }
+ else
+ {
+ int a_odd = a & 1;
+ time_t avg = SHR (a, 1) + (SHR (b, 1) + (a_odd & b));
+ return TIME_T_MIN / 2 <= avg && avg <= TIME_T_MAX / 2;
+ }
+}
+
+/* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC),
+ assuming that *T corresponds to *TP and that no clock adjustments
+ occurred between *TP and the desired time.
+ If TP is null, return a value not equal to *T; this avoids false matches.
+ If overflow occurs, yield the minimal or maximal value, except do not
+ yield a value equal to *T. */
+static time_t
+guess_time_tm (long_int year, long_int yday, int hour, int min, int sec,
+ const time_t *t, const struct tm *tp)
+{
+ if (tp)
+ {
+ time_t d = ydhms_diff (year, yday, hour, min, sec,
+ tp->tm_year, tp->tm_yday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec);
+ if (time_t_add_ok (*t, d))
+ return *t + d;
+ }
+
+ /* Overflow occurred one way or another. Return the nearest result
+ that is actually in range, except don't report a zero difference
+ if the actual difference is nonzero, as that would cause a false
+ match; and don't oscillate between two values, as that would
+ confuse the spring-forward gap detector. */
+ return (*t < TIME_T_MIDPOINT
+ ? (*t <= TIME_T_MIN + 1 ? *t + 1 : TIME_T_MIN)
+ : (TIME_T_MAX - 1 <= *t ? *t - 1 : TIME_T_MAX));
+}
+
+/* Use CONVERT to convert *T to a broken down time in *TP.
+ If *T is out of range for conversion, adjust it so that
+ it is the nearest in-range value and then convert that. */
+static struct tm *
+ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *t, struct tm *tp)
+{
+ struct tm *r = convert (t, tp);
+
+ if (!r && *t)
+ {
+ time_t bad = *t;
+ time_t ok = 0;
+
+ /* BAD is a known unconvertible time_t, and OK is a known good one.
+ Use binary search to narrow the range between BAD and OK until
+ they differ by 1. */
+ while (bad != ok + (bad < 0 ? -1 : 1))
+ {
+ time_t mid = *t = time_t_avg (ok, bad);
+ r = convert (t, tp);
+ if (r)
+ ok = mid;
+ else
+ bad = mid;
+ }
+
+ if (!r && ok)
+ {
+ /* The last conversion attempt failed;
+ revert to the most recent successful attempt. */
+ *t = ok;
+ r = convert (t, tp);
+ }
+ }
+
+ return r;
+}
+
+
+/* Convert *TP to a time_t value, inverting
+ the monotonic and mostly-unit-linear conversion function CONVERT.
+ Use *OFFSET to keep track of a guess at the offset of the result,
+ compared to what the result would be for UTC without leap seconds.
+ If *OFFSET's guess is correct, only one CONVERT call is needed.
+ This function is external because it is used also by timegm.c. */
+time_t
+__mktime_internal (struct tm *tp,
+ struct tm *(*convert) (const time_t *, struct tm *),
+ time_t *offset)
+{
+ time_t t, gt, t0, t1, t2;
+ struct tm tm;
+
+ /* The maximum number of probes (calls to CONVERT) should be enough
+ to handle any combinations of time zone rule changes, solar time,
+ leap seconds, and oscillations around a spring-forward gap.
+ POSIX.1 prohibits leap seconds, but some hosts have them anyway. */
+ int remaining_probes = 6;
+
+ /* Time requested. Copy it in case CONVERT modifies *TP; this can
+ occur if TP is localtime's returned value and CONVERT is localtime. */
+ int sec = tp->tm_sec;
+ int min = tp->tm_min;
+ int hour = tp->tm_hour;
+ int mday = tp->tm_mday;
+ int mon = tp->tm_mon;
+ int year_requested = tp->tm_year;
+ int isdst = tp->tm_isdst;
+
+ /* 1 if the previous probe was DST. */
+ int dst2;
+
+ /* Ensure that mon is in range, and set year accordingly. */
+ int mon_remainder = mon % 12;
+ int negative_mon_remainder = mon_remainder < 0;
+ int mon_years = mon / 12 - negative_mon_remainder;
+ long_int lyear_requested = year_requested;
+ long_int year = lyear_requested + mon_years;
+
+ /* The other values need not be in range:
+ the remaining code handles minor overflows correctly,
+ assuming int and time_t arithmetic wraps around.
+ Major overflows are caught at the end. */
+
+ /* Calculate day of year from year, month, and day of month.
+ The result need not be in range. */
+ int mon_yday = ((__mon_yday[leapyear (year)]
+ [mon_remainder + 12 * negative_mon_remainder])
+ - 1);
+ long_int lmday = mday;
+ long_int yday = mon_yday + lmday;
+
+ time_t guessed_offset = *offset;
+
+ int sec_requested = sec;
+
+ if (LEAP_SECONDS_POSSIBLE)
+ {
+ /* Handle out-of-range seconds specially,
+ since ydhms_tm_diff assumes every minute has 60 seconds. */
+ if (sec < 0)
+ sec = 0;
+ if (59 < sec)
+ sec = 59;
+ }
+
+ /* Invert CONVERT by probing. First assume the same offset as last
+ time. */
+
+ t0 = ydhms_diff (year, yday, hour, min, sec,
+ EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, - guessed_offset);
+
+ if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
+ {
+ /* time_t isn't large enough to rule out overflows, so check
+ for major overflows. A gross check suffices, since if t0
+ has overflowed, it is off by a multiple of TIME_T_MAX -
+ TIME_T_MIN + 1. So ignore any component of the difference
+ that is bounded by a small value. */
+
+ /* Approximate log base 2 of the number of time units per
+ biennium. A biennium is 2 years; use this unit instead of
+ years to avoid integer overflow. For example, 2 average
+ Gregorian years are 2 * 365.2425 * 24 * 60 * 60 seconds,
+ which is 63113904 seconds, and rint (log2 (63113904)) is
+ 26. */
+ int ALOG2_SECONDS_PER_BIENNIUM = 26;
+ int ALOG2_MINUTES_PER_BIENNIUM = 20;
+ int ALOG2_HOURS_PER_BIENNIUM = 14;
+ int ALOG2_DAYS_PER_BIENNIUM = 10;
+ int LOG2_YEARS_PER_BIENNIUM = 1;
+
+ int approx_requested_biennia =
+ (SHR (year_requested, LOG2_YEARS_PER_BIENNIUM)
+ - SHR (EPOCH_YEAR - TM_YEAR_BASE, LOG2_YEARS_PER_BIENNIUM)
+ + SHR (mday, ALOG2_DAYS_PER_BIENNIUM)
+ + SHR (hour, ALOG2_HOURS_PER_BIENNIUM)
+ + SHR (min, ALOG2_MINUTES_PER_BIENNIUM)
+ + (LEAP_SECONDS_POSSIBLE
+ ? 0
+ : SHR (sec, ALOG2_SECONDS_PER_BIENNIUM)));
+
+ int approx_biennia = SHR (t0, ALOG2_SECONDS_PER_BIENNIUM);
+ int diff = approx_biennia - approx_requested_biennia;
+ int abs_diff = diff < 0 ? -1 - diff : diff;
+
+ /* IRIX 4.0.5 cc miscalculates TIME_T_MIN / 3: it erroneously
+ gives a positive value of 715827882. Setting a variable
+ first then doing math on it seems to work.
+ (ghazi@caip.rutgers.edu) */
+ time_t time_t_max = TIME_T_MAX;
+ time_t time_t_min = TIME_T_MIN;
+ time_t overflow_threshold =
+ (time_t_max / 3 - time_t_min / 3) >> ALOG2_SECONDS_PER_BIENNIUM;
+
+ if (overflow_threshold < abs_diff)
+ {
+ /* Overflow occurred. Try repairing it; this might work if
+ the time zone offset is enough to undo the overflow. */
+ time_t repaired_t0 = -1 - t0;
+ approx_biennia = SHR (repaired_t0, ALOG2_SECONDS_PER_BIENNIUM);
+ diff = approx_biennia - approx_requested_biennia;
+ abs_diff = diff < 0 ? -1 - diff : diff;
+ if (overflow_threshold < abs_diff)
+ return -1;
+ guessed_offset += repaired_t0 - t0;
+ t0 = repaired_t0;
+ }
+ }
+
+ /* Repeatedly use the error to improve the guess. */
+
+ for (t = t1 = t2 = t0, dst2 = 0;
+ (gt = guess_time_tm (year, yday, hour, min, sec, &t,
+ ranged_convert (convert, &t, &tm)),
+ t != gt);
+ t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0)
+ if (t == t1 && t != t2
+ && (tm.tm_isdst < 0
+ || (isdst < 0
+ ? dst2 <= (tm.tm_isdst != 0)
+ : (isdst != 0) != (tm.tm_isdst != 0))))
+ /* We can't possibly find a match, as we are oscillating
+ between two values. The requested time probably falls
+ within a spring-forward gap of size GT - T. Follow the common
+ practice in this case, which is to return a time that is GT - T
+ away from the requested time, preferring a time whose
+ tm_isdst differs from the requested value. (If no tm_isdst
+ was requested and only one of the two values has a nonzero
+ tm_isdst, prefer that value.) In practice, this is more
+ useful than returning -1. */
+ goto offset_found;
+ else if (--remaining_probes == 0)
+ return -1;
+
+ /* We have a match. Check whether tm.tm_isdst has the requested
+ value, if any. */
+ if (isdst_differ (isdst, tm.tm_isdst))
+ {
+ /* tm.tm_isdst has the wrong value. Look for a neighboring
+ time with the right value, and use its UTC offset.
+
+ Heuristic: probe the adjacent timestamps in both directions,
+ looking for the desired isdst. This should work for all real
+ time zone histories in the tz database. */
+
+ /* Distance between probes when looking for a DST boundary. In
+ tzdata2003a, the shortest period of DST is 601200 seconds
+ (e.g., America/Recife starting 2000-10-08 01:00), and the
+ shortest period of non-DST surrounded by DST is 694800
+ seconds (Africa/Tunis starting 1943-04-17 01:00). Use the
+ minimum of these two values, so we don't miss these short
+ periods when probing. */
+ int stride = 601200;
+
+ /* The longest period of DST in tzdata2003a is 536454000 seconds
+ (e.g., America/Jujuy starting 1946-10-01 01:00). The longest
+ period of non-DST is much longer, but it makes no real sense
+ to search for more than a year of non-DST, so use the DST
+ max. */
+ int duration_max = 536454000;
+
+ /* Search in both directions, so the maximum distance is half
+ the duration; add the stride to avoid off-by-1 problems. */
+ int delta_bound = duration_max / 2 + stride;
+
+ int delta, direction;
+
+ for (delta = stride; delta < delta_bound; delta += stride)
+ for (direction = -1; direction <= 1; direction += 2)
+ if (time_t_int_add_ok (t, delta * direction))
+ {
+ time_t ot = t + delta * direction;
+ struct tm otm;
+ ranged_convert (convert, &ot, &otm);
+ if (! isdst_differ (isdst, otm.tm_isdst))
+ {
+ /* We found the desired tm_isdst.
+ Extrapolate back to the desired time. */
+ t = guess_time_tm (year, yday, hour, min, sec, &ot, &otm);
+ ranged_convert (convert, &t, &tm);
+ goto offset_found;
+ }
+ }
+ }
+
+ offset_found:
+ *offset = guessed_offset + t - t0;
+
+ if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
+ {
+ /* Adjust time to reflect the tm_sec requested, not the normalized value.
+ Also, repair any damage from a false match due to a leap second. */
+ int sec_adjustment = (sec == 0 && tm.tm_sec == 60) - sec;
+ if (! time_t_int_add_ok (t, sec_requested))
+ return -1;
+ t1 = t + sec_requested;
+ if (! time_t_int_add_ok (t1, sec_adjustment))
+ return -1;
+ t2 = t1 + sec_adjustment;
+ if (! convert (&t2, &tm))
+ return -1;
+ t = t2;
+ }
+
+ *tp = tm;
+ return t;
+}
+
+
+/* FIXME: This should use a signed type wide enough to hold any UTC
+ offset in seconds. 'int' should be good enough for GNU code. We
+ can't fix this unilaterally though, as other modules invoke
+ __mktime_internal. */
+static time_t localtime_offset;
+
+/* Convert *TP to a time_t value. */
+time_t
+mktime (struct tm *tp)
+{
+#ifdef _LIBC
+ /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
+ time zone names contained in the external variable `tzname' shall
+ be set as if the tzset() function had been called. */
+ __tzset ();
+#endif
+
+ return __mktime_internal (tp, __localtime_r, &localtime_offset);
+}
+
+#ifdef weak_alias
+weak_alias (mktime, timelocal)
+#endif
+
+#ifdef _LIBC
+libc_hidden_def (mktime)
+libc_hidden_weak (timelocal)
+#endif
+
+#if DEBUG
+
+static int
+not_equal_tm (const struct tm *a, const struct tm *b)
+{
+ return ((a->tm_sec ^ b->tm_sec)
+ | (a->tm_min ^ b->tm_min)
+ | (a->tm_hour ^ b->tm_hour)
+ | (a->tm_mday ^ b->tm_mday)
+ | (a->tm_mon ^ b->tm_mon)
+ | (a->tm_year ^ b->tm_year)
+ | (a->tm_yday ^ b->tm_yday)
+ | isdst_differ (a->tm_isdst, b->tm_isdst));
+}
+
+static void
+print_tm (const struct tm *tp)
+{
+ if (tp)
+ printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
+ tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec,
+ tp->tm_yday, tp->tm_wday, tp->tm_isdst);
+ else
+ printf ("0");
+}
+
+static int
+check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt)
+{
+ if (tk != tl || !lt || not_equal_tm (&tmk, lt))
+ {
+ printf ("mktime (");
+ print_tm (lt);
+ printf (")\nyields (");
+ print_tm (&tmk);
+ printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl);
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+ int status = 0;
+ struct tm tm, tmk, tml;
+ struct tm *lt;
+ time_t tk, tl, tl1;
+ char trailer;
+
+ if ((argc == 3 || argc == 4)
+ && (sscanf (argv[1], "%d-%d-%d%c",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
+ == 3)
+ && (sscanf (argv[2], "%d:%d:%d%c",
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
+ == 3))
+ {
+ tm.tm_year -= TM_YEAR_BASE;
+ tm.tm_mon--;
+ tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
+ tmk = tm;
+ tl = mktime (&tmk);
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tml = *lt;
+ lt = &tml;
+ }
+ printf ("mktime returns %ld == ", (long int) tl);
+ print_tm (&tmk);
+ printf ("\n");
+ status = check_result (tl, tmk, tl, lt);
+ }
+ else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
+ {
+ time_t from = atol (argv[1]);
+ time_t by = atol (argv[2]);
+ time_t to = atol (argv[3]);
+
+ if (argc == 4)
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = mktime (&tmk);
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ else
+ for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+ {
+ /* Null benchmark. */
+ lt = localtime (&tl);
+ if (lt)
+ {
+ tmk = tml = *lt;
+ tk = tl;
+ status |= check_result (tk, tmk, tl, &tml);
+ }
+ else
+ {
+ printf ("localtime (%ld) yields 0\n", (long int) tl);
+ status = 1;
+ }
+ tl1 = tl + by;
+ if ((tl1 < tl) != (by < 0))
+ break;
+ }
+ }
+ else
+ printf ("Usage:\
+\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
+\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
+\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
+ argv[0], argv[0], argv[0]);
+
+ return status;
+}
+
+#endif /* DEBUG */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG -I. -Wall -W -O2 -g mktime.c -o mktime"
+End:
+*/
diff --git a/gnulib/lib/modechange.c b/gnulib/lib/modechange.c
new file mode 100644
index 0000000..580a460
--- /dev/null
+++ b/gnulib/lib/modechange.c
@@ -0,0 +1,385 @@
+/* modechange.c -- file mode manipulation
+
+ Copyright (C) 1989-1990, 1997-1999, 2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@ai.mit.edu> */
+
+/* The ASCII mode string is compiled into an array of `struct
+ modechange', which can then be applied to each file to be changed.
+ We do this instead of re-parsing the ASCII string for each file
+ because the compiled form requires less computation to use; when
+ changing the mode of many files, this probably results in a
+ performance gain. */
+
+#include <config.h>
+
+#include "modechange.h"
+#include <sys/stat.h>
+#include "stat-macros.h"
+#include "xalloc.h"
+#include <stdlib.h>
+
+/* The traditional octal values corresponding to each mode bit. */
+#define SUID 04000
+#define SGID 02000
+#define SVTX 01000
+#define RUSR 00400
+#define WUSR 00200
+#define XUSR 00100
+#define RGRP 00040
+#define WGRP 00020
+#define XGRP 00010
+#define ROTH 00004
+#define WOTH 00002
+#define XOTH 00001
+#define ALLM 07777 /* all octal mode bits */
+
+/* Convert OCTAL, which uses one of the traditional octal values, to
+ an internal mode_t value. */
+static mode_t
+octal_to_mode (unsigned int octal)
+{
+ /* Help the compiler optimize the usual case where mode_t uses
+ the traditional octal representation. */
+ return ((S_ISUID == SUID && S_ISGID == SGID && S_ISVTX == SVTX
+ && S_IRUSR == RUSR && S_IWUSR == WUSR && S_IXUSR == XUSR
+ && S_IRGRP == RGRP && S_IWGRP == WGRP && S_IXGRP == XGRP
+ && S_IROTH == ROTH && S_IWOTH == WOTH && S_IXOTH == XOTH)
+ ? octal
+ : (mode_t) ((octal & SUID ? S_ISUID : 0)
+ | (octal & SGID ? S_ISGID : 0)
+ | (octal & SVTX ? S_ISVTX : 0)
+ | (octal & RUSR ? S_IRUSR : 0)
+ | (octal & WUSR ? S_IWUSR : 0)
+ | (octal & XUSR ? S_IXUSR : 0)
+ | (octal & RGRP ? S_IRGRP : 0)
+ | (octal & WGRP ? S_IWGRP : 0)
+ | (octal & XGRP ? S_IXGRP : 0)
+ | (octal & ROTH ? S_IROTH : 0)
+ | (octal & WOTH ? S_IWOTH : 0)
+ | (octal & XOTH ? S_IXOTH : 0)));
+}
+
+/* Special operations flags. */
+enum
+ {
+ /* For the sentinel at the end of the mode changes array. */
+ MODE_DONE,
+
+ /* The typical case. */
+ MODE_ORDINARY_CHANGE,
+
+ /* In addition to the typical case, affect the execute bits if at
+ least one execute bit is set already, or if the file is a
+ directory. */
+ MODE_X_IF_ANY_X,
+
+ /* Instead of the typical case, copy some existing permissions for
+ u, g, or o onto the other two. Which of u, g, or o is copied
+ is determined by which bits are set in the `value' field. */
+ MODE_COPY_EXISTING
+ };
+
+/* Description of a mode change. */
+struct mode_change
+{
+ char op; /* One of "=+-". */
+ char flag; /* Special operations flag. */
+ mode_t affected; /* Set for u, g, o, or a. */
+ mode_t value; /* Bits to add/remove. */
+ mode_t mentioned; /* Bits explicitly mentioned. */
+};
+
+/* Return a mode_change array with the specified `=ddd'-style
+ mode change operation, where NEW_MODE is `ddd' and MENTIONED
+ contains the bits explicitly mentioned in the mode are MENTIONED. */
+
+static struct mode_change *
+make_node_op_equals (mode_t new_mode, mode_t mentioned)
+{
+ struct mode_change *p = xmalloc (2 * sizeof *p);
+ p->op = '=';
+ p->flag = MODE_ORDINARY_CHANGE;
+ p->affected = CHMOD_MODE_BITS;
+ p->value = new_mode;
+ p->mentioned = mentioned;
+ p[1].flag = MODE_DONE;
+ return p;
+}
+
+/* Return a pointer to an array of file mode change operations created from
+ MODE_STRING, an ASCII string that contains either an octal number
+ specifying an absolute mode, or symbolic mode change operations with
+ the form:
+ [ugoa...][[+-=][rwxXstugo...]...][,...]
+
+ Return NULL if `mode_string' does not contain a valid
+ representation of file mode change operations. */
+
+struct mode_change *
+mode_compile (char const *mode_string)
+{
+ /* The array of mode-change directives to be returned. */
+ struct mode_change *mc;
+ size_t used = 0;
+
+ if ('0' <= *mode_string && *mode_string < '8')
+ {
+ unsigned int octal_mode = 0;
+ mode_t mode;
+ mode_t mentioned;
+
+ do
+ {
+ octal_mode = 8 * octal_mode + *mode_string++ - '0';
+ if (ALLM < octal_mode)
+ return NULL;
+ }
+ while ('0' <= *mode_string && *mode_string < '8');
+
+ if (*mode_string)
+ return NULL;
+
+ mode = octal_to_mode (octal_mode);
+ mentioned = (mode & (S_ISUID | S_ISGID)) | S_ISVTX | S_IRWXUGO;
+ return make_node_op_equals (mode, mentioned);
+ }
+
+ /* Allocate enough space to hold the result. */
+ {
+ size_t needed = 1;
+ char const *p;
+ for (p = mode_string; *p; p++)
+ needed += (*p == '=' || *p == '+' || *p == '-');
+ mc = xnmalloc (needed, sizeof *mc);
+ }
+
+ /* One loop iteration for each `[ugoa]*([-+=]([rwxXst]*|[ugo]))+'. */
+ for (;; mode_string++)
+ {
+ /* Which bits in the mode are operated on. */
+ mode_t affected = 0;
+
+ /* Turn on all the bits in `affected' for each group given. */
+ for (;; mode_string++)
+ switch (*mode_string)
+ {
+ default:
+ goto invalid;
+ case 'u':
+ affected |= S_ISUID | S_IRWXU;
+ break;
+ case 'g':
+ affected |= S_ISGID | S_IRWXG;
+ break;
+ case 'o':
+ affected |= S_ISVTX | S_IRWXO;
+ break;
+ case 'a':
+ affected |= CHMOD_MODE_BITS;
+ break;
+ case '=': case '+': case '-':
+ goto no_more_affected;
+ }
+ no_more_affected:;
+
+ do
+ {
+ char op = *mode_string++;
+ mode_t value;
+ char flag = MODE_COPY_EXISTING;
+ struct mode_change *change;
+
+ switch (*mode_string++)
+ {
+ case 'u':
+ /* Set the affected bits to the value of the `u' bits
+ on the same file. */
+ value = S_IRWXU;
+ break;
+ case 'g':
+ /* Set the affected bits to the value of the `g' bits
+ on the same file. */
+ value = S_IRWXG;
+ break;
+ case 'o':
+ /* Set the affected bits to the value of the `o' bits
+ on the same file. */
+ value = S_IRWXO;
+ break;
+
+ default:
+ value = 0;
+ flag = MODE_ORDINARY_CHANGE;
+
+ for (mode_string--;; mode_string++)
+ switch (*mode_string)
+ {
+ case 'r':
+ value |= S_IRUSR | S_IRGRP | S_IROTH;
+ break;
+ case 'w':
+ value |= S_IWUSR | S_IWGRP | S_IWOTH;
+ break;
+ case 'x':
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ case 'X':
+ flag = MODE_X_IF_ANY_X;
+ break;
+ case 's':
+ /* Set the setuid/gid bits if `u' or `g' is selected. */
+ value |= S_ISUID | S_ISGID;
+ break;
+ case 't':
+ /* Set the "save text image" bit if `o' is selected. */
+ value |= S_ISVTX;
+ break;
+ default:
+ goto no_more_values;
+ }
+ no_more_values:;
+ }
+
+ change = &mc[used++];
+ change->op = op;
+ change->flag = flag;
+ change->affected = affected;
+ change->value = value;
+ change->mentioned = (affected ? affected & value : value);
+ }
+ while (*mode_string == '=' || *mode_string == '+'
+ || *mode_string == '-');
+
+ if (*mode_string != ',')
+ break;
+ }
+
+ if (*mode_string == 0)
+ {
+ mc[used].flag = MODE_DONE;
+ return mc;
+ }
+
+invalid:
+ free (mc);
+ return NULL;
+}
+
+/* Return a file mode change operation that sets permissions to match those
+ of REF_FILE. Return NULL (setting errno) if REF_FILE can't be accessed. */
+
+struct mode_change *
+mode_create_from_ref (const char *ref_file)
+{
+ struct stat ref_stats;
+
+ if (stat (ref_file, &ref_stats) != 0)
+ return NULL;
+ return make_node_op_equals (ref_stats.st_mode, CHMOD_MODE_BITS);
+}
+
+/* Return the file mode bits of OLDMODE (which is the mode of a
+ directory if DIR), assuming the umask is UMASK_VALUE, adjusted as
+ indicated by the list of change operations CHANGES. If DIR, the
+ type 'X' change affects the returned value even if no execute bits
+ were set in OLDMODE, and set user and group ID bits are preserved
+ unless CHANGES mentioned them. If PMODE_BITS is not null, store into
+ *PMODE_BITS a mask denoting file mode bits that are affected by
+ CHANGES.
+
+ The returned value and *PMODE_BITS contain only file mode bits.
+ For example, they have the S_IFMT bits cleared on a standard
+ Unix-like host. */
+
+mode_t
+mode_adjust (mode_t oldmode, bool dir, mode_t umask_value,
+ struct mode_change const *changes, mode_t *pmode_bits)
+{
+ /* The adjusted mode. */
+ mode_t newmode = oldmode & CHMOD_MODE_BITS;
+
+ /* File mode bits that CHANGES cares about. */
+ mode_t mode_bits = 0;
+
+ for (; changes->flag != MODE_DONE; changes++)
+ {
+ mode_t affected = changes->affected;
+ mode_t omit_change =
+ (dir ? S_ISUID | S_ISGID : 0) & ~ changes->mentioned;
+ mode_t value = changes->value;
+
+ switch (changes->flag)
+ {
+ case MODE_ORDINARY_CHANGE:
+ break;
+
+ case MODE_COPY_EXISTING:
+ /* Isolate in `value' the bits in `newmode' to copy. */
+ value &= newmode;
+
+ /* Copy the isolated bits to the other two parts. */
+ value |= ((value & (S_IRUSR | S_IRGRP | S_IROTH)
+ ? S_IRUSR | S_IRGRP | S_IROTH : 0)
+ | (value & (S_IWUSR | S_IWGRP | S_IWOTH)
+ ? S_IWUSR | S_IWGRP | S_IWOTH : 0)
+ | (value & (S_IXUSR | S_IXGRP | S_IXOTH)
+ ? S_IXUSR | S_IXGRP | S_IXOTH : 0));
+ break;
+
+ case MODE_X_IF_ANY_X:
+ /* Affect the execute bits if execute bits are already set
+ or if the file is a directory. */
+ if ((newmode & (S_IXUSR | S_IXGRP | S_IXOTH)) | dir)
+ value |= S_IXUSR | S_IXGRP | S_IXOTH;
+ break;
+ }
+
+ /* If WHO was specified, limit the change to the affected bits.
+ Otherwise, apply the umask. Either way, omit changes as
+ requested. */
+ value &= (affected ? affected : ~umask_value) & ~ omit_change;
+
+ switch (changes->op)
+ {
+ case '=':
+ /* If WHO was specified, preserve the previous values of
+ bits that are not affected by this change operation.
+ Otherwise, clear all the bits. */
+ {
+ mode_t preserved = (affected ? ~affected : 0) | omit_change;
+ mode_bits |= CHMOD_MODE_BITS & ~preserved;
+ newmode = (newmode & preserved) | value;
+ break;
+ }
+
+ case '+':
+ mode_bits |= value;
+ newmode |= value;
+ break;
+
+ case '-':
+ mode_bits |= value;
+ newmode &= ~value;
+ break;
+ }
+ }
+
+ if (pmode_bits)
+ *pmode_bits = mode_bits;
+ return newmode;
+}
diff --git a/gnulib/lib/modechange.h b/gnulib/lib/modechange.h
new file mode 100644
index 0000000..a15aeca
--- /dev/null
+++ b/gnulib/lib/modechange.h
@@ -0,0 +1,30 @@
+/* modechange.h -- definitions for file mode manipulation
+
+ Copyright (C) 1989-1990, 1997, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if ! defined MODECHANGE_H_
+# define MODECHANGE_H_
+
+# include <stdbool.h>
+# include <sys/types.h>
+
+struct mode_change *mode_compile (const char *);
+struct mode_change *mode_create_from_ref (const char *);
+mode_t mode_adjust (mode_t, bool, mode_t, struct mode_change const *,
+ mode_t *);
+
+#endif
diff --git a/gnulib/lib/modff.c b/gnulib/lib/modff.c
new file mode 100644
index 0000000..1b2554c
--- /dev/null
+++ b/gnulib/lib/modff.c
@@ -0,0 +1,29 @@
+/* Get signed integer and fractional parts of a floating-point number.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+modff (float x, float *iptr)
+{
+ double i;
+ double frac = modf ((double) x, &i);
+ *iptr = (float) i;
+ return (float) frac;
+}
diff --git a/gnulib/lib/mountlist.c b/gnulib/lib/mountlist.c
new file mode 100644
index 0000000..23437bc
--- /dev/null
+++ b/gnulib/lib/mountlist.c
@@ -0,0 +1,951 @@
+/* mountlist.c -- return a list of mounted file systems
+
+ Copyright (C) 1991-1992, 1997-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "mountlist.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "xalloc.h"
+
+#include <errno.h>
+
+#include <fcntl.h>
+
+#include <unistd.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if defined MOUNTED_GETFSSTAT /* OSF_1 and Darwin1.3.x */
+# if HAVE_SYS_UCRED_H
+# include <grp.h> /* needed on OSF V4.0 for definition of NGROUPS,
+ NGROUPS is used as an array dimension in ucred.h */
+# include <sys/ucred.h> /* needed by powerpc-apple-darwin1.3.7 */
+# endif
+# if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+# endif
+# if HAVE_SYS_FS_TYPES_H
+# include <sys/fs_types.h> /* needed by powerpc-apple-darwin1.3.7 */
+# endif
+# if HAVE_STRUCT_FSSTAT_F_FSTYPENAME
+# define FS_TYPE(Ent) ((Ent).f_fstypename)
+# else
+# define FS_TYPE(Ent) mnt_names[(Ent).f_type]
+# endif
+#endif /* MOUNTED_GETFSSTAT */
+
+#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
+# include <mntent.h>
+# if !defined MOUNTED
+# if defined _PATH_MOUNTED /* GNU libc */
+# define MOUNTED _PATH_MOUNTED
+# endif
+# if defined MNT_MNTTAB /* HP-UX. */
+# define MOUNTED MNT_MNTTAB
+# endif
+# if defined MNTTABNAME /* Dynix. */
+# define MOUNTED MNTTABNAME
+# endif
+# endif
+#endif
+
+#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
+# include <sys/mount.h>
+#endif
+
+#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
+# include <sys/statvfs.h>
+#endif
+
+#ifdef MOUNTED_GETMNT /* Ultrix. */
+# include <sys/mount.h>
+# include <sys/fs_types.h>
+#endif
+
+#ifdef MOUNTED_FS_STAT_DEV /* BeOS. */
+# include <fs_info.h>
+# include <dirent.h>
+#endif
+
+#ifdef MOUNTED_FREAD /* SVR2. */
+# include <mnttab.h>
+#endif
+
+#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
+# include <mnttab.h>
+# include <sys/fstyp.h>
+# include <sys/statfs.h>
+#endif
+
+#ifdef MOUNTED_LISTMNTENT
+# include <mntent.h>
+#endif
+
+#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
+# include <sys/mnttab.h>
+#endif
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+# include <fshelp.h>
+# include <sys/vfs.h>
+#endif
+
+#ifdef MOUNTED_INTERIX_STATVFS /* Interix. */
+# include <sys/statvfs.h>
+# include <dirent.h>
+#endif
+
+#ifdef DOLPHIN
+/* So special that it's not worth putting this in autoconf. */
+# undef MOUNTED_FREAD_FSTYP
+# define MOUNTED_GETMNTTBL
+#endif
+
+#if HAVE_SYS_MNTENT_H
+/* This is to get MNTOPT_IGNORE on e.g. SVR4. */
+# include <sys/mntent.h>
+#endif
+
+#undef MNT_IGNORE
+#if defined MNTOPT_IGNORE && defined HAVE_HASMNTOPT
+# define MNT_IGNORE(M) hasmntopt (M, MNTOPT_IGNORE)
+#else
+# define MNT_IGNORE(M) 0
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef opendir
+#undef closedir
+
+#ifndef ME_DUMMY
+# define ME_DUMMY(Fs_name, Fs_type) \
+ (strcmp (Fs_type, "autofs") == 0 \
+ || strcmp (Fs_type, "none") == 0 \
+ || strcmp (Fs_type, "proc") == 0 \
+ || strcmp (Fs_type, "subfs") == 0 \
+ /* for NetBSD 3.0 */ \
+ || strcmp (Fs_type, "kernfs") == 0 \
+ /* for Irix 6.5 */ \
+ || strcmp (Fs_type, "ignore") == 0)
+#endif
+
+#ifdef __CYGWIN__
+# include <windows.h>
+# define ME_REMOTE me_remote
+/* All cygwin mount points include `:' or start with `//'; so it
+ requires a native Windows call to determine remote disks. */
+static bool
+me_remote (char const *fs_name, char const *fs_type _GL_UNUSED)
+{
+ if (fs_name[0] && fs_name[1] == ':')
+ {
+ char drive[4];
+ sprintf (drive, "%c:\\", fs_name[0]);
+ switch (GetDriveType (drive))
+ {
+ case DRIVE_REMOVABLE:
+ case DRIVE_FIXED:
+ case DRIVE_CDROM:
+ case DRIVE_RAMDISK:
+ return false;
+ }
+ }
+ return true;
+}
+#endif
+
+#ifndef ME_REMOTE
+/* A file system is `remote' if its Fs_name contains a `:'
+ or if (it is of type (smbfs or cifs) and its Fs_name starts with `//'). */
+# define ME_REMOTE(Fs_name, Fs_type) \
+ (strchr (Fs_name, ':') != NULL \
+ || ((Fs_name)[0] == '/' \
+ && (Fs_name)[1] == '/' \
+ && (strcmp (Fs_type, "smbfs") == 0 \
+ || strcmp (Fs_type, "cifs") == 0)))
+#endif
+
+#if MOUNTED_GETMNTINFO
+
+# if ! HAVE_STRUCT_STATFS_F_FSTYPENAME
+static char *
+fstype_to_string (short int t)
+{
+ switch (t)
+ {
+# ifdef MOUNT_PC
+ case MOUNT_PC:
+ return "pc";
+# endif
+# ifdef MOUNT_MFS
+ case MOUNT_MFS:
+ return "mfs";
+# endif
+# ifdef MOUNT_LO
+ case MOUNT_LO:
+ return "lo";
+# endif
+# ifdef MOUNT_TFS
+ case MOUNT_TFS:
+ return "tfs";
+# endif
+# ifdef MOUNT_TMP
+ case MOUNT_TMP:
+ return "tmp";
+# endif
+# ifdef MOUNT_UFS
+ case MOUNT_UFS:
+ return "ufs" ;
+# endif
+# ifdef MOUNT_NFS
+ case MOUNT_NFS:
+ return "nfs" ;
+# endif
+# ifdef MOUNT_MSDOS
+ case MOUNT_MSDOS:
+ return "msdos" ;
+# endif
+# ifdef MOUNT_LFS
+ case MOUNT_LFS:
+ return "lfs" ;
+# endif
+# ifdef MOUNT_LOFS
+ case MOUNT_LOFS:
+ return "lofs" ;
+# endif
+# ifdef MOUNT_FDESC
+ case MOUNT_FDESC:
+ return "fdesc" ;
+# endif
+# ifdef MOUNT_PORTAL
+ case MOUNT_PORTAL:
+ return "portal" ;
+# endif
+# ifdef MOUNT_NULL
+ case MOUNT_NULL:
+ return "null" ;
+# endif
+# ifdef MOUNT_UMAP
+ case MOUNT_UMAP:
+ return "umap" ;
+# endif
+# ifdef MOUNT_KERNFS
+ case MOUNT_KERNFS:
+ return "kernfs" ;
+# endif
+# ifdef MOUNT_PROCFS
+ case MOUNT_PROCFS:
+ return "procfs" ;
+# endif
+# ifdef MOUNT_AFS
+ case MOUNT_AFS:
+ return "afs" ;
+# endif
+# ifdef MOUNT_CD9660
+ case MOUNT_CD9660:
+ return "cd9660" ;
+# endif
+# ifdef MOUNT_UNION
+ case MOUNT_UNION:
+ return "union" ;
+# endif
+# ifdef MOUNT_DEVFS
+ case MOUNT_DEVFS:
+ return "devfs" ;
+# endif
+# ifdef MOUNT_EXT2FS
+ case MOUNT_EXT2FS:
+ return "ext2fs" ;
+# endif
+ default:
+ return "?";
+ }
+}
+# endif
+
+static char *
+fsp_to_string (const struct statfs *fsp)
+{
+# if HAVE_STRUCT_STATFS_F_FSTYPENAME
+ return (char *) (fsp->f_fstypename);
+# else
+ return fstype_to_string (fsp->f_type);
+# endif
+}
+
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+static char *
+fstype_to_string (int t)
+{
+ struct vfs_ent *e;
+
+ e = getvfsbytype (t);
+ if (!e || !e->vfsent_name)
+ return "none";
+ else
+ return e->vfsent_name;
+}
+#endif /* MOUNTED_VMOUNT */
+
+
+#if defined MOUNTED_GETMNTENT1 || defined MOUNTED_GETMNTENT2
+
+/* Return the device number from MOUNT_OPTIONS, if possible.
+ Otherwise return (dev_t) -1. */
+static dev_t
+dev_from_mount_options (char const *mount_options)
+{
+ /* GNU/Linux allows file system implementations to define their own
+ meaning for "dev=" mount options, so don't trust the meaning
+ here. */
+# ifndef __linux__
+
+ static char const dev_pattern[] = ",dev=";
+ char const *devopt = strstr (mount_options, dev_pattern);
+
+ if (devopt)
+ {
+ char const *optval = devopt + sizeof dev_pattern - 1;
+ char *optvalend;
+ unsigned long int dev;
+ errno = 0;
+ dev = strtoul (optval, &optvalend, 16);
+ if (optval != optvalend
+ && (*optvalend == '\0' || *optvalend == ',')
+ && ! (dev == ULONG_MAX && errno == ERANGE)
+ && dev == (dev_t) dev)
+ return dev;
+ }
+
+# endif
+ (void) mount_options;
+ return -1;
+}
+
+#endif
+
+/* Return a list of the currently mounted file systems, or NULL on error.
+ Add each entry to the tail of the list so that they stay in order.
+ If NEED_FS_TYPE is true, ensure that the file system type fields in
+ the returned list are valid. Otherwise, they might not be. */
+
+struct mount_entry *
+read_file_system_list (bool need_fs_type)
+{
+ struct mount_entry *mount_list;
+ struct mount_entry *me;
+ struct mount_entry **mtail = &mount_list;
+ (void) need_fs_type;
+
+#ifdef MOUNTED_LISTMNTENT
+ {
+ struct tabmntent *mntlist, *p;
+ struct mntent *mnt;
+ struct mount_entry *me;
+
+ /* the third and fourth arguments could be used to filter mounts,
+ but Crays doesn't seem to have any mounts that we want to
+ remove. Specifically, automount create normal NFS mounts.
+ */
+
+ if (listmntent (&mntlist, KMTAB, NULL, NULL) < 0)
+ return NULL;
+ for (p = mntlist; p; p = p->next)
+ {
+ mnt = p->ment;
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt->mnt_fsname);
+ me->me_mountdir = xstrdup (mnt->mnt_dir);
+ me->me_type = xstrdup (mnt->mnt_type);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = -1;
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ freemntlist (mntlist);
+ }
+#endif
+
+#ifdef MOUNTED_GETMNTENT1 /* GNU/Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
+ {
+ struct mntent *mnt;
+ char const *table = MOUNTED;
+ FILE *fp;
+
+ fp = setmntent (table, "r");
+ if (fp == NULL)
+ return NULL;
+
+ while ((mnt = getmntent (fp)))
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt->mnt_fsname);
+ me->me_mountdir = xstrdup (mnt->mnt_dir);
+ me->me_type = xstrdup (mnt->mnt_type);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = dev_from_mount_options (mnt->mnt_opts);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ if (endmntent (fp) == 0)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_GETMNTENT1. */
+
+#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
+ {
+ struct statfs *fsp;
+ int entries;
+
+ entries = getmntinfo (&fsp, MNT_NOWAIT);
+ if (entries < 0)
+ return NULL;
+ for (; entries-- > 0; fsp++)
+ {
+ char *fs_type = fsp_to_string (fsp);
+
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsp->f_mntfromname);
+ me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_type = fs_type;
+ me->me_type_malloced = 0;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ }
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_GETMNTINFO2 /* NetBSD 3.0. */
+ {
+ struct statvfs *fsp;
+ int entries;
+
+ entries = getmntinfo (&fsp, MNT_NOWAIT);
+ if (entries < 0)
+ return NULL;
+ for (; entries-- > 0; fsp++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsp->f_mntfromname);
+ me->me_mountdir = xstrdup (fsp->f_mntonname);
+ me->me_type = xstrdup (fsp->f_fstypename);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ }
+#endif /* MOUNTED_GETMNTINFO2 */
+
+#ifdef MOUNTED_GETMNT /* Ultrix. */
+ {
+ int offset = 0;
+ int val;
+ struct fs_data fsd;
+
+ while (errno = 0,
+ 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
+ (char *) 0)))
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fsd.fd_req.devname);
+ me->me_mountdir = xstrdup (fsd.fd_req.path);
+ me->me_type = gt_names[fsd.fd_req.fstype];
+ me->me_type_malloced = 0;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = fsd.fd_req.dev;
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ if (val < 0)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_GETMNT. */
+
+#if defined MOUNTED_FS_STAT_DEV /* BeOS */
+ {
+ /* The next_dev() and fs_stat_dev() system calls give the list of
+ all file systems, including the information returned by statvfs()
+ (fs type, total blocks, free blocks etc.), but without the mount
+ point. But on BeOS all file systems except / are mounted in the
+ rootfs, directly under /.
+ The directory name of the mount point is often, but not always,
+ identical to the volume name of the device.
+ We therefore get the list of subdirectories of /, and the list
+ of all file systems, and match the two lists. */
+
+ DIR *dirp;
+ struct rootdir_entry
+ {
+ char *name;
+ dev_t dev;
+ ino_t ino;
+ struct rootdir_entry *next;
+ };
+ struct rootdir_entry *rootdir_list;
+ struct rootdir_entry **rootdir_tail;
+ int32 pos;
+ dev_t dev;
+ fs_info fi;
+
+ /* All volumes are mounted in the rootfs, directly under /. */
+ rootdir_list = NULL;
+ rootdir_tail = &rootdir_list;
+ dirp = opendir ("/");
+ if (dirp)
+ {
+ struct dirent *d;
+
+ while ((d = readdir (dirp)) != NULL)
+ {
+ char *name;
+ struct stat statbuf;
+
+ if (strcmp (d->d_name, "..") == 0)
+ continue;
+
+ if (strcmp (d->d_name, ".") == 0)
+ name = xstrdup ("/");
+ else
+ {
+ name = xmalloc (1 + strlen (d->d_name) + 1);
+ name[0] = '/';
+ strcpy (name + 1, d->d_name);
+ }
+
+ if (lstat (name, &statbuf) >= 0 && S_ISDIR (statbuf.st_mode))
+ {
+ struct rootdir_entry *re = xmalloc (sizeof *re);
+ re->name = name;
+ re->dev = statbuf.st_dev;
+ re->ino = statbuf.st_ino;
+
+ /* Add to the linked list. */
+ *rootdir_tail = re;
+ rootdir_tail = &re->next;
+ }
+ else
+ free (name);
+ }
+ closedir (dirp);
+ }
+ *rootdir_tail = NULL;
+
+ for (pos = 0; (dev = next_dev (&pos)) >= 0; )
+ if (fs_stat_dev (dev, &fi) >= 0)
+ {
+ /* Note: fi.dev == dev. */
+ struct rootdir_entry *re;
+
+ for (re = rootdir_list; re; re = re->next)
+ if (re->dev == fi.dev && re->ino == fi.root)
+ break;
+
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (fi.device_name[0] != '\0'
+ ? fi.device_name : fi.fsh_name);
+ me->me_mountdir = xstrdup (re != NULL ? re->name : fi.fsh_name);
+ me->me_type = xstrdup (fi.fsh_name);
+ me->me_type_malloced = 1;
+ me->me_dev = fi.dev;
+ me->me_dummy = 0;
+ me->me_remote = (fi.flags & B_FS_IS_SHARED) != 0;
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ *mtail = NULL;
+
+ while (rootdir_list != NULL)
+ {
+ struct rootdir_entry *re = rootdir_list;
+ rootdir_list = re->next;
+ free (re->name);
+ free (re);
+ }
+ }
+#endif /* MOUNTED_FS_STAT_DEV */
+
+#if defined MOUNTED_GETFSSTAT /* __alpha running OSF_1 */
+ {
+ int numsys, counter;
+ size_t bufsize;
+ struct statfs *stats;
+
+ numsys = getfsstat (NULL, 0L, MNT_NOWAIT);
+ if (numsys < 0)
+ return NULL;
+ if (SIZE_MAX / sizeof *stats <= numsys)
+ xalloc_die ();
+
+ bufsize = (1 + numsys) * sizeof *stats;
+ stats = xmalloc (bufsize);
+ numsys = getfsstat (stats, bufsize, MNT_NOWAIT);
+
+ if (numsys < 0)
+ {
+ free (stats);
+ return NULL;
+ }
+
+ for (counter = 0; counter < numsys; counter++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (stats[counter].f_mntfromname);
+ me->me_mountdir = xstrdup (stats[counter].f_mntonname);
+ me->me_type = xstrdup (FS_TYPE (stats[counter]));
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ free (stats);
+ }
+#endif /* MOUNTED_GETFSSTAT */
+
+#if defined MOUNTED_FREAD || defined MOUNTED_FREAD_FSTYP /* SVR[23]. */
+ {
+ struct mnttab mnt;
+ char *table = "/etc/mnttab";
+ FILE *fp;
+
+ fp = fopen (table, "r");
+ if (fp == NULL)
+ return NULL;
+
+ while (fread (&mnt, sizeof mnt, 1, fp) > 0)
+ {
+ me = xmalloc (sizeof *me);
+# ifdef GETFSTYP /* SVR3. */
+ me->me_devname = xstrdup (mnt.mt_dev);
+# else
+ me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
+ strcpy (me->me_devname, "/dev/");
+ strcpy (me->me_devname + 5, mnt.mt_dev);
+# endif
+ me->me_mountdir = xstrdup (mnt.mt_filsys);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+ me->me_type = "";
+ me->me_type_malloced = 0;
+# ifdef GETFSTYP /* SVR3. */
+ if (need_fs_type)
+ {
+ struct statfs fsd;
+ char typebuf[FSTYPSZ];
+
+ if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
+ && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
+ {
+ me->me_type = xstrdup (typebuf);
+ me->me_type_malloced = 1;
+ }
+ }
+# endif
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ if (ferror (fp))
+ {
+ /* The last fread() call must have failed. */
+ int saved_errno = errno;
+ fclose (fp);
+ errno = saved_errno;
+ goto free_then_fail;
+ }
+
+ if (fclose (fp) == EOF)
+ goto free_then_fail;
+ }
+#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */
+
+#ifdef MOUNTED_GETMNTTBL /* DolphinOS goes its own way. */
+ {
+ struct mntent **mnttbl = getmnttbl (), **ent;
+ for (ent = mnttbl; *ent; ent++)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup ((*ent)->mt_resource);
+ me->me_mountdir = xstrdup ((*ent)->mt_directory);
+ me->me_type = xstrdup ((*ent)->mt_fstype);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ endmnttbl ();
+ }
+#endif
+
+#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
+ {
+ struct mnttab mnt;
+ char *table = MNTTAB;
+ FILE *fp;
+ int ret;
+ int lockfd = -1;
+
+# if defined F_RDLCK && defined F_SETLKW
+ /* MNTTAB_LOCK is a macro name of our own invention; it's not present in
+ e.g. Solaris 2.6. If the SVR4 folks ever define a macro
+ for this file name, we should use their macro name instead.
+ (Why not just lock MNTTAB directly? We don't know.) */
+# ifndef MNTTAB_LOCK
+# define MNTTAB_LOCK "/etc/.mnttab.lock"
+# endif
+ lockfd = open (MNTTAB_LOCK, O_RDONLY);
+ if (0 <= lockfd)
+ {
+ struct flock flock;
+ flock.l_type = F_RDLCK;
+ flock.l_whence = SEEK_SET;
+ flock.l_start = 0;
+ flock.l_len = 0;
+ while (fcntl (lockfd, F_SETLKW, &flock) == -1)
+ if (errno != EINTR)
+ {
+ int saved_errno = errno;
+ close (lockfd);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ else if (errno != ENOENT)
+ return NULL;
+# endif
+
+ errno = 0;
+ fp = fopen (table, "r");
+ if (fp == NULL)
+ ret = errno;
+ else
+ {
+ while ((ret = getmntent (fp, &mnt)) == 0)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (mnt.mnt_special);
+ me->me_mountdir = xstrdup (mnt.mnt_mountp);
+ me->me_type = xstrdup (mnt.mnt_fstype);
+ me->me_type_malloced = 1;
+ me->me_dummy = MNT_IGNORE (&mnt) != 0;
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = dev_from_mount_options (mnt.mnt_mntopts);
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+
+ ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1;
+ }
+
+ if (0 <= lockfd && close (lockfd) != 0)
+ ret = errno;
+
+ if (0 <= ret)
+ {
+ errno = ret;
+ goto free_then_fail;
+ }
+ }
+#endif /* MOUNTED_GETMNTENT2. */
+
+#ifdef MOUNTED_VMOUNT /* AIX. */
+ {
+ int bufsize;
+ char *entries, *thisent;
+ struct vmount *vmp;
+ int n_entries;
+ int i;
+
+ /* Ask how many bytes to allocate for the mounted file system info. */
+ if (mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize) != 0)
+ return NULL;
+ entries = xmalloc (bufsize);
+
+ /* Get the list of mounted file systems. */
+ n_entries = mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
+ if (n_entries < 0)
+ {
+ int saved_errno = errno;
+ free (entries);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ for (i = 0, thisent = entries;
+ i < n_entries;
+ i++, thisent += vmp->vmt_length)
+ {
+ char *options, *ignore;
+
+ vmp = (struct vmount *) thisent;
+ me = xmalloc (sizeof *me);
+ if (vmp->vmt_flags & MNT_REMOTE)
+ {
+ char *host, *dir;
+
+ me->me_remote = 1;
+ /* Prepend the remote dirname. */
+ host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off;
+ dir = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off;
+ me->me_devname = xmalloc (strlen (host) + strlen (dir) + 2);
+ strcpy (me->me_devname, host);
+ strcat (me->me_devname, ":");
+ strcat (me->me_devname, dir);
+ }
+ else
+ {
+ me->me_remote = 0;
+ me->me_devname = xstrdup (thisent +
+ vmp->vmt_data[VMT_OBJECT].vmt_off);
+ }
+ me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
+ me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype));
+ me->me_type_malloced = 1;
+ options = thisent + vmp->vmt_data[VMT_ARGS].vmt_off;
+ ignore = strstr (options, "ignore");
+ me->me_dummy = (ignore
+ && (ignore == options || ignore[-1] == ',')
+ && (ignore[sizeof "ignore" - 1] == ','
+ || ignore[sizeof "ignore" - 1] == '\0'));
+ me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ free (entries);
+ }
+#endif /* MOUNTED_VMOUNT. */
+
+#ifdef MOUNTED_INTERIX_STATVFS
+ {
+ DIR *dirp = opendir ("/dev/fs");
+ char node[9 + NAME_MAX];
+
+ if (!dirp)
+ goto free_then_fail;
+
+ while (1)
+ {
+ struct statvfs dev;
+ struct dirent entry;
+ struct dirent *result;
+
+ if (readdir_r (dirp, &entry, &result) || result == NULL)
+ break;
+
+ strcpy (node, "/dev/fs/");
+ strcat (node, entry.d_name);
+
+ if (statvfs (node, &dev) == 0)
+ {
+ me = xmalloc (sizeof *me);
+ me->me_devname = xstrdup (dev.f_mntfromname);
+ me->me_mountdir = xstrdup (dev.f_mntonname);
+ me->me_type = xstrdup (dev.f_fstypename);
+ me->me_type_malloced = 1;
+ me->me_dummy = ME_DUMMY (me->me_devname, me->me_type);
+ me->me_remote = ME_REMOTE (me->me_devname, me->me_type);
+ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
+
+ /* Add to the linked list. */
+ *mtail = me;
+ mtail = &me->me_next;
+ }
+ }
+ }
+#endif /* MOUNTED_INTERIX_STATVFS */
+
+ *mtail = NULL;
+ return mount_list;
+
+
+ free_then_fail:
+ {
+ int saved_errno = errno;
+ *mtail = NULL;
+
+ while (mount_list)
+ {
+ me = mount_list->me_next;
+ free (mount_list->me_devname);
+ free (mount_list->me_mountdir);
+ if (mount_list->me_type_malloced)
+ free (mount_list->me_type);
+ free (mount_list);
+ mount_list = me;
+ }
+
+ errno = saved_errno;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/mountlist.h b/gnulib/lib/mountlist.h
new file mode 100644
index 0000000..926bfdf
--- /dev/null
+++ b/gnulib/lib/mountlist.h
@@ -0,0 +1,40 @@
+/* mountlist.h -- declarations for list of mounted file systems
+
+ Copyright (C) 1991-1992, 1998, 2000-2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef MOUNTLIST_H_
+# define MOUNTLIST_H_
+
+# include <stdbool.h>
+# include <sys/types.h>
+
+/* A mount table entry. */
+struct mount_entry
+{
+ char *me_devname; /* Device node name, including "/dev/". */
+ char *me_mountdir; /* Mount point directory name. */
+ char *me_type; /* "nfs", "4.2", etc. */
+ dev_t me_dev; /* Device number of me_mountdir. */
+ unsigned int me_dummy : 1; /* Nonzero for dummy file systems. */
+ unsigned int me_remote : 1; /* Nonzero for remote fileystems. */
+ unsigned int me_type_malloced : 1; /* Nonzero if me_type was malloced. */
+ struct mount_entry *me_next;
+};
+
+struct mount_entry *read_file_system_list (bool need_fs_type);
+
+#endif
diff --git a/gnulib/lib/mpsort.c b/gnulib/lib/mpsort.c
new file mode 100644
index 0000000..92d3c22
--- /dev/null
+++ b/gnulib/lib/mpsort.c
@@ -0,0 +1,156 @@
+/* Sort a vector of pointers to data.
+
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "mpsort.h"
+
+#include <string.h>
+
+/* The type of qsort-style comparison functions. */
+
+typedef int (*comparison_function) (void const *, void const *);
+
+static void mpsort_with_tmp (void const **restrict, size_t,
+ void const **restrict, comparison_function);
+
+/* Sort a vector BASE containing N pointers, placing the sorted array
+ into TMP. Compare pointers with CMP. N must be at least 2. */
+
+static void
+mpsort_into_tmp (void const **restrict base, size_t n,
+ void const **restrict tmp,
+ comparison_function cmp)
+{
+ size_t n1 = n / 2;
+ size_t n2 = n - n1;
+ size_t a = 0;
+ size_t alim = n1;
+ size_t b = n1;
+ size_t blim = n;
+ void const *ba;
+ void const *bb;
+
+ mpsort_with_tmp (base + n1, n2, tmp, cmp);
+ mpsort_with_tmp (base, n1, tmp, cmp);
+
+ ba = base[a];
+ bb = base[b];
+
+ for (;;)
+ if (cmp (ba, bb) <= 0)
+ {
+ *tmp++ = ba;
+ a++;
+ if (a == alim)
+ {
+ a = b;
+ alim = blim;
+ break;
+ }
+ ba = base[a];
+ }
+ else
+ {
+ *tmp++ = bb;
+ b++;
+ if (b == blim)
+ break;
+ bb = base[b];
+ }
+
+ memcpy (tmp, base + a, (alim - a) * sizeof *base);
+}
+
+/* Sort a vector BASE containing N pointers, in place. Use TMP
+ (containing N / 2 pointers) for temporary storage. Compare
+ pointers with CMP. */
+
+static void
+mpsort_with_tmp (void const **restrict base, size_t n,
+ void const **restrict tmp,
+ comparison_function cmp)
+{
+ if (n <= 2)
+ {
+ if (n == 2)
+ {
+ void const *p0 = base[0];
+ void const *p1 = base[1];
+ if (! (cmp (p0, p1) <= 0))
+ {
+ base[0] = p1;
+ base[1] = p0;
+ }
+ }
+ }
+ else
+ {
+ size_t n1 = n / 2;
+ size_t n2 = n - n1;
+ size_t i;
+ size_t t = 0;
+ size_t tlim = n1;
+ size_t b = n1;
+ size_t blim = n;
+ void const *bb;
+ void const *tt;
+
+ mpsort_with_tmp (base + n1, n2, tmp, cmp);
+
+ if (n1 < 2)
+ tmp[0] = base[0];
+ else
+ mpsort_into_tmp (base, n1, tmp, cmp);
+
+ tt = tmp[t];
+ bb = base[b];
+
+ for (i = 0; ; )
+ if (cmp (tt, bb) <= 0)
+ {
+ base[i++] = tt;
+ t++;
+ if (t == tlim)
+ break;
+ tt = tmp[t];
+ }
+ else
+ {
+ base[i++] = bb;
+ b++;
+ if (b == blim)
+ {
+ memcpy (base + i, tmp + t, (tlim - t) * sizeof *base);
+ break;
+ }
+ bb = base[b];
+ }
+ }
+}
+
+/* Sort a vector BASE containing N pointers, in place. BASE must
+ contain enough storage to hold N + N / 2 vectors; the trailing
+ vectors are used for temporaries. Compare pointers with CMP. */
+
+void
+mpsort (void const **base, size_t n, comparison_function cmp)
+{
+ mpsort_with_tmp (base, n, base + n, cmp);
+}
diff --git a/gnulib/lib/mpsort.h b/gnulib/lib/mpsort.h
new file mode 100644
index 0000000..5e58811
--- /dev/null
+++ b/gnulib/lib/mpsort.h
@@ -0,0 +1,2 @@
+#include <stddef.h>
+void mpsort (void const **, size_t, int (*) (void const *, void const *));
diff --git a/gnulib/lib/msvc-inval.c b/gnulib/lib/msvc-inval.c
new file mode 100644
index 0000000..31dbeea
--- /dev/null
+++ b/gnulib/lib/msvc-inval.c
@@ -0,0 +1,130 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "msvc-inval.h"
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+
+/* Get _invalid_parameter_handler type and _set_invalid_parameter_handler
+ declaration. */
+# include <stdlib.h>
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+
+static void cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+}
+
+# else
+
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# if defined _MSC_VER
+
+static void cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+# else
+
+/* An index to thread-local storage. */
+static DWORD tls_index;
+static int tls_initialized /* = 0 */;
+
+/* Used as a fallback only. */
+static struct gl_msvc_inval_per_thread not_per_thread;
+
+struct gl_msvc_inval_per_thread *
+gl_msvc_inval_current (void)
+{
+ if (!tls_initialized)
+ {
+ tls_index = TlsAlloc ();
+ tls_initialized = 1;
+ }
+ if (tls_index == TLS_OUT_OF_INDEXES)
+ /* TlsAlloc had failed. */
+ return &not_per_thread;
+ else
+ {
+ struct gl_msvc_inval_per_thread *pointer =
+ (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index);
+ if (pointer == NULL)
+ {
+ /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */
+ pointer =
+ (struct gl_msvc_inval_per_thread *)
+ malloc (sizeof (struct gl_msvc_inval_per_thread));
+ if (pointer == NULL)
+ /* Could not allocate memory. Use the global storage. */
+ pointer = &not_per_thread;
+ TlsSetValue (tls_index, pointer);
+ }
+ return pointer;
+ }
+}
+
+static void cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+ struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current ();
+ if (current->restart_valid)
+ longjmp (current->restart, 1);
+ else
+ /* An invalid parameter notification from outside the gnulib code.
+ Give the caller a chance to intervene. */
+ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+# endif
+
+# endif
+
+static int gl_msvc_inval_initialized /* = 0 */;
+
+void
+gl_msvc_inval_ensure_handler (void)
+{
+ if (gl_msvc_inval_initialized == 0)
+ {
+ _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
+ gl_msvc_inval_initialized = 1;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/msvc-inval.h b/gnulib/lib/msvc-inval.h
new file mode 100644
index 0000000..5ebc29f
--- /dev/null
+++ b/gnulib/lib/msvc-inval.h
@@ -0,0 +1,223 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MSVC_INVAL_H
+#define _MSVC_INVAL_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+ functions like fprintf(), dup2(), or close() crash when the caller passes
+ an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
+ instead.
+ This file defines macros that turn such an invalid parameter notification
+ into a non-local exit. An error code can then be produced at the target
+ of this exit. You can thus write code like
+
+ TRY_MSVC_INVAL
+ {
+ <Code that can trigger an invalid parameter notification
+ but does not do 'return', 'break', 'continue', nor 'goto'.>
+ }
+ CATCH_MSVC_INVAL
+ {
+ <Code that handles an invalid parameter notification
+ but does not do 'return', 'break', 'continue', nor 'goto'.>
+ }
+ DONE_MSVC_INVAL;
+
+ This entire block expands to a single statement.
+
+ The handling of invalid parameters can be done in three ways:
+
+ * The default way, which is reasonable for programs (not libraries):
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING])
+
+ * The way for libraries that make "hairy" calls (like close(-1), or
+ fclose(fp) where fileno(fp) is closed, or simply getdtablesize()):
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING])
+
+ * The way for libraries that make no "hairy" calls:
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING])
+ */
+
+#define DEFAULT_HANDLING 0
+#define HAIRY_LIBRARY_HANDLING 1
+#define SANE_LIBRARY_HANDLING 2
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+/* A native Windows platform with the "invalid parameter handler" concept,
+ and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+/* Default handling. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Ensure that the invalid parameter handler in installed that just returns.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ gl_msvc_inval_ensure_handler (); \
+ if (1)
+# define CATCH_MSVC_INVAL \
+ else
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+# else
+/* Handling for hairy libraries. */
+
+# include <excpt.h>
+
+/* Gnulib can define its own status codes, as described in the page
+ "Raising Software Exceptions" on microsoft.com
+ <http://msdn.microsoft.com/en-us/library/het71c37.aspx>.
+ Our status codes are composed of
+ - 0xE0000000, mandatory for all user-defined status codes,
+ - 0x474E550, a API identifier ("GNU"),
+ - 0, 1, 2, ..., used to distinguish different status codes from the
+ same API. */
+# define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0)
+
+# if defined _MSC_VER
+/* A compiler that supports __try/__except, as described in the page
+ "try-except statement" on microsoft.com
+ <http://msdn.microsoft.com/en-us/library/s58ftw19.aspx>.
+ With __try/__except, we can use the multithread-safe exception handling. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Ensure that the invalid parameter handler in installed that raises a
+ software exception with code STATUS_GNULIB_INVALID_PARAMETER.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ gl_msvc_inval_ensure_handler (); \
+ __try
+# define CATCH_MSVC_INVAL \
+ __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \
+ ? EXCEPTION_EXECUTE_HANDLER \
+ : EXCEPTION_CONTINUE_SEARCH)
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+# else
+/* Any compiler.
+ We can only use setjmp/longjmp. */
+
+# include <setjmp.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+struct gl_msvc_inval_per_thread
+{
+ /* The restart that will resume execution at the code between
+ CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between
+ TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */
+ jmp_buf restart;
+
+ /* Tells whether the contents of restart is valid. */
+ int restart_valid;
+};
+
+/* Ensure that the invalid parameter handler in installed that passes
+ control to the gl_msvc_inval_restart if it is valid, or raises a
+ software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+/* Return a pointer to the per-thread data for the current thread. */
+extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ struct gl_msvc_inval_per_thread *msvc_inval_current; \
+ gl_msvc_inval_ensure_handler (); \
+ msvc_inval_current = gl_msvc_inval_current (); \
+ /* First, initialize gl_msvc_inval_restart. */ \
+ if (setjmp (msvc_inval_current->restart) == 0) \
+ { \
+ /* Then, mark it as valid. */ \
+ msvc_inval_current->restart_valid = 1;
+# define CATCH_MSVC_INVAL \
+ /* Execution completed. \
+ Mark gl_msvc_inval_restart as invalid. */ \
+ msvc_inval_current->restart_valid = 0; \
+ } \
+ else \
+ { \
+ /* Execution triggered an invalid parameter notification. \
+ Mark gl_msvc_inval_restart as invalid. */ \
+ msvc_inval_current->restart_valid = 0;
+# define DONE_MSVC_INVAL \
+ } \
+ } \
+ while (0)
+
+# endif
+
+# endif
+
+#else
+/* A platform that does not need to the invalid parameter handler,
+ or when SANE_LIBRARY_HANDLING is desired. */
+
+/* The braces here avoid GCC warnings like
+ "warning: suggest explicit braces to avoid ambiguous `else'". */
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ if (1)
+# define CATCH_MSVC_INVAL \
+ else
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+#endif
+
+#endif /* _MSVC_INVAL_H */
diff --git a/gnulib/lib/msvc-nothrow.c b/gnulib/lib/msvc-nothrow.c
new file mode 100644
index 0000000..0af17b2
--- /dev/null
+++ b/gnulib/lib/msvc-nothrow.c
@@ -0,0 +1,50 @@
+/* Wrappers that don't throw invalid parameter notifications
+ with MSVC runtime libraries.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "msvc-nothrow.h"
+
+/* Get declarations of the Win32 API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include "msvc-inval.h"
+
+#undef _get_osfhandle
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+intptr_t
+_gl_nothrow_get_osfhandle (int fd)
+{
+ intptr_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _get_osfhandle (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = (intptr_t) INVALID_HANDLE_VALUE;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#endif
diff --git a/gnulib/lib/msvc-nothrow.h b/gnulib/lib/msvc-nothrow.h
new file mode 100644
index 0000000..1ec2888
--- /dev/null
+++ b/gnulib/lib/msvc-nothrow.h
@@ -0,0 +1,44 @@
+/* Wrappers that don't throw invalid parameter notifications
+ with MSVC runtime libraries.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _MSVC_NOTHROW_H
+#define _MSVC_NOTHROW_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+ functions like fprintf(), dup2(), or close() crash when the caller passes
+ an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
+ instead.
+ This file defines wrappers that turn such an invalid parameter notification
+ into an error code. */
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Get original declaration of _get_osfhandle. */
+# include <io.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Override _get_osfhandle. */
+extern intptr_t _gl_nothrow_get_osfhandle (int fd);
+# define _get_osfhandle _gl_nothrow_get_osfhandle
+
+# endif
+
+#endif
+
+#endif /* _MSVC_NOTHROW_H */
diff --git a/gnulib/lib/nanosleep.c b/gnulib/lib/nanosleep.c
new file mode 100644
index 0000000..e08c002
--- /dev/null
+++ b/gnulib/lib/nanosleep.c
@@ -0,0 +1,274 @@
+/* Provide a replacement for the POSIX nanosleep function.
+
+ Copyright (C) 1999-2000, 2002, 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering
+ and Bruno Haible for the Woe32 part */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "intprops.h"
+#include "sig-handler.h"
+#include "verify.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <signal.h>
+
+#include <sys/time.h>
+#include <errno.h>
+
+#include <unistd.h>
+
+
+enum { BILLION = 1000 * 1000 * 1000 };
+
+#if HAVE_BUG_BIG_NANOSLEEP
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+# undef nanosleep
+{
+ /* nanosleep mishandles large sleeps due to internal overflow problems.
+ The worst known case of this is Linux 2.6.9 with glibc 2.3.4, which
+ can't sleep more than 24.85 days (2^31 milliseconds). Similarly,
+ cygwin 1.5.x, which can't sleep more than 49.7 days (2^32 milliseconds).
+ Solve this by breaking the sleep up into smaller chunks. */
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ {
+ /* Verify that time_t is large enough. */
+ verify (TYPE_MAXIMUM (time_t) / 24 / 24 / 60 / 60);
+ const time_t limit = 24 * 24 * 60 * 60;
+ time_t seconds = requested_delay->tv_sec;
+ struct timespec intermediate;
+ intermediate.tv_nsec = requested_delay->tv_nsec;
+
+ while (limit < seconds)
+ {
+ int result;
+ intermediate.tv_sec = limit;
+ result = nanosleep (&intermediate, remaining_delay);
+ seconds -= limit;
+ if (result)
+ {
+ if (remaining_delay)
+ remaining_delay->tv_sec += seconds;
+ return result;
+ }
+ intermediate.tv_nsec = 0;
+ }
+ intermediate.tv_sec = seconds;
+ return nanosleep (&intermediate, remaining_delay);
+ }
+}
+
+#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Windows platforms. */
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* The Win32 function Sleep() has a resolution of about 15 ms and takes
+ at least 5 ms to execute. We use this function for longer time periods.
+ Additionally, we use busy-looping over short time periods, to get a
+ resolution of about 0.01 ms. In order to measure such short timespans,
+ we use the QueryPerformanceCounter() function. */
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ static bool initialized;
+ /* Number of performance counter increments per nanosecond,
+ or zero if it could not be determined. */
+ static double ticks_per_nanosecond;
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* For requested delays of one second or more, 15ms resolution is
+ sufficient. */
+ if (requested_delay->tv_sec == 0)
+ {
+ if (!initialized)
+ {
+ /* Initialize ticks_per_nanosecond. */
+ LARGE_INTEGER ticks_per_second;
+
+ if (QueryPerformanceFrequency (&ticks_per_second))
+ ticks_per_nanosecond =
+ (double) ticks_per_second.QuadPart / 1000000000.0;
+
+ initialized = true;
+ }
+ if (ticks_per_nanosecond)
+ {
+ /* QueryPerformanceFrequency worked. We can use
+ QueryPerformanceCounter. Use a combination of Sleep and
+ busy-looping. */
+ /* Number of milliseconds to pass to the Sleep function.
+ Since Sleep can take up to 8 ms less or 8 ms more than requested
+ (or maybe more if the system is loaded), we subtract 10 ms. */
+ int sleep_millis = (int) requested_delay->tv_nsec / 1000000 - 10;
+ /* Determine how many ticks to delay. */
+ LONGLONG wait_ticks = requested_delay->tv_nsec * ticks_per_nanosecond;
+ /* Start. */
+ LARGE_INTEGER counter_before;
+ if (QueryPerformanceCounter (&counter_before))
+ {
+ /* Wait until the performance counter has reached this value.
+ We don't need to worry about overflow, because the performance
+ counter is reset at reboot, and with a frequency of 3.6E6
+ ticks per second 63 bits suffice for over 80000 years. */
+ LONGLONG wait_until = counter_before.QuadPart + wait_ticks;
+ /* Use Sleep for the longest part. */
+ if (sleep_millis > 0)
+ Sleep (sleep_millis);
+ /* Busy-loop for the rest. */
+ for (;;)
+ {
+ LARGE_INTEGER counter_after;
+ if (!QueryPerformanceCounter (&counter_after))
+ /* QueryPerformanceCounter failed, but succeeded earlier.
+ Should not happen. */
+ break;
+ if (counter_after.QuadPart >= wait_until)
+ /* The requested time has elapsed. */
+ break;
+ }
+ goto done;
+ }
+ }
+ }
+ /* Implementation for long delays and as fallback. */
+ Sleep (requested_delay->tv_sec * 1000 + requested_delay->tv_nsec / 1000000);
+
+ done:
+ /* Sleep is not interruptible. So there is no remaining delay. */
+ if (remaining_delay != NULL)
+ {
+ remaining_delay->tv_sec = 0;
+ remaining_delay->tv_nsec = 0;
+ }
+ return 0;
+}
+
+#else
+/* Unix platforms lacking nanosleep. */
+
+/* Some systems (MSDOS) don't have SIGCONT.
+ Using SIGTERM here turns the signal-handling code below
+ into a no-op on such systems. */
+# ifndef SIGCONT
+# define SIGCONT SIGTERM
+# endif
+
+static sig_atomic_t volatile suspended;
+
+/* Handle SIGCONT. */
+
+static void
+sighandler (int sig)
+{
+ suspended = 1;
+}
+
+/* Suspend execution for at least *TS_DELAY seconds. */
+
+static void
+my_usleep (const struct timespec *ts_delay)
+{
+ struct timeval tv_delay;
+ tv_delay.tv_sec = ts_delay->tv_sec;
+ tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000;
+ if (tv_delay.tv_usec == 1000000)
+ {
+ if (tv_delay.tv_sec == TYPE_MAXIMUM (time_t))
+ tv_delay.tv_usec = 1000000 - 1; /* close enough */
+ else
+ {
+ tv_delay.tv_sec++;
+ tv_delay.tv_usec = 0;
+ }
+ }
+ select (0, NULL, NULL, NULL, &tv_delay);
+}
+
+/* Suspend execution for at least *REQUESTED_DELAY seconds. The
+ *REMAINING_DELAY part isn't implemented yet. */
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ static bool initialized;
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* set up sig handler */
+ if (! initialized)
+ {
+ struct sigaction oldact;
+
+ sigaction (SIGCONT, NULL, &oldact);
+ if (get_handler (&oldact) != SIG_IGN)
+ {
+ struct sigaction newact;
+
+ newact.sa_handler = sighandler;
+ sigemptyset (&newact.sa_mask);
+ newact.sa_flags = 0;
+ sigaction (SIGCONT, &newact, NULL);
+ }
+ initialized = true;
+ }
+
+ suspended = 0;
+
+ my_usleep (requested_delay);
+
+ if (suspended)
+ {
+ /* Calculate time remaining. */
+ /* FIXME: the code in sleep doesn't use this, so there's no
+ rush to implement it. */
+
+ errno = EINTR;
+ }
+
+ /* FIXME: Restore sig handler? */
+
+ return suspended;
+}
+#endif
diff --git a/gnulib/lib/netdb.in.h b/gnulib/lib/netdb.in.h
new file mode 100644
index 0000000..1de1546
--- /dev/null
+++ b/gnulib/lib/netdb.in.h
@@ -0,0 +1,266 @@
+/* Provide a netdb.h header file for systems lacking it (read: MinGW).
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file is supposed to be used on platforms that lack <netdb.h>.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#ifndef _@GUARD_PREFIX@_NETDB_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_NETDB_H@
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETDB_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_NETDB_H
+#define _@GUARD_PREFIX@_NETDB_H
+
+/* Get <netdb.h> definitions such as 'socklen_t' on IRIX 6.5 and OSF/1 4.0 and
+ 'struct hostent' on MinGW. */
+#include <sys/socket.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Declarations for a platform that lacks <netdb.h>, or where it is
+ incomplete. */
+
+#if @GNULIB_GETADDRINFO@
+
+# if !@HAVE_STRUCT_ADDRINFO@
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_addrinfo
+/* Structure to contain information about address of a service provider. */
+struct addrinfo
+{
+ int ai_flags; /* Input flags. */
+ int ai_family; /* Protocol family for socket. */
+ int ai_socktype; /* Socket type. */
+ int ai_protocol; /* Protocol for socket. */
+ socklen_t ai_addrlen; /* Length of socket address. */
+ struct sockaddr *ai_addr; /* Socket address for socket. */
+ char *ai_canonname; /* Canonical name for service location. */
+ struct addrinfo *ai_next; /* Pointer to next in list. */
+};
+# define GNULIB_defined_struct_addrinfo 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# endif
+
+/* Possible values for `ai_flags' field in `addrinfo' structure. */
+# ifndef AI_PASSIVE
+# define AI_PASSIVE 0x0001 /* Socket address is intended for `bind'. */
+# endif
+# ifndef AI_CANONNAME
+# define AI_CANONNAME 0x0002 /* Request for canonical name. */
+# endif
+# ifndef AI_NUMERICSERV
+# define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */
+# endif
+
+# if 0
+# define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */
+# endif
+
+/* These symbolic constants are required to be present by POSIX, but
+ our getaddrinfo replacement doesn't use them (yet). Setting them
+ to 0 on systems that doesn't have them avoids causing problems for
+ system getaddrinfo implementations that would be confused by
+ unknown values. */
+# ifndef AI_V4MAPPED
+# define AI_V4MAPPED 0 /* 0x0008: IPv4 mapped addresses are acceptable. */
+# endif
+# ifndef AI_ALL
+# define AI_ALL 0 /* 0x0010: Return IPv4 mapped and IPv6 addresses. */
+# endif
+# ifndef AI_ADDRCONFIG
+# define AI_ADDRCONFIG 0 /* 0x0020: Use configuration of this host to choose
+ returned address type. */
+# endif
+
+/* Error values for `getaddrinfo' function. */
+# ifndef EAI_BADFLAGS
+# define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */
+# define EAI_NONAME -2 /* NAME or SERVICE is unknown. */
+# define EAI_AGAIN -3 /* Temporary failure in name resolution. */
+# define EAI_FAIL -4 /* Non-recoverable failure in name res. */
+# define EAI_NODATA -5 /* No address associated with NAME. */
+# define EAI_FAMILY -6 /* `ai_family' not supported. */
+# define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */
+# define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */
+# define EAI_MEMORY -10 /* Memory allocation failure. */
+# endif
+
+/* Since EAI_NODATA is deprecated by RFC3493, some systems (at least
+ FreeBSD, which does define EAI_BADFLAGS) have removed the definition
+ in favor of EAI_NONAME. */
+# if !defined EAI_NODATA && defined EAI_NONAME
+# define EAI_NODATA EAI_NONAME
+# endif
+
+# ifndef EAI_OVERFLOW
+/* Not defined on mingw32 and Haiku. */
+# define EAI_OVERFLOW -12 /* Argument buffer overflow. */
+# endif
+# ifndef EAI_ADDRFAMILY
+/* Not defined on mingw32. */
+# define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */
+# endif
+# ifndef EAI_SYSTEM
+/* Not defined on mingw32. */
+# define EAI_SYSTEM -11 /* System error returned in `errno'. */
+# endif
+
+# if 0
+/* The commented out definitions below are not yet implemented in the
+ GNULIB getaddrinfo() replacement, so are not yet needed.
+
+ If they are restored, be sure to protect the definitions with #ifndef. */
+# ifndef EAI_INPROGRESS
+# define EAI_INPROGRESS -100 /* Processing request in progress. */
+# define EAI_CANCELED -101 /* Request canceled. */
+# define EAI_NOTCANCELED -102 /* Request not canceled. */
+# define EAI_ALLDONE -103 /* All requests done. */
+# define EAI_INTR -104 /* Interrupted by a signal. */
+# define EAI_IDN_ENCODE -105 /* IDN encoding failed. */
+# endif
+# endif
+
+# if !@HAVE_DECL_GETADDRINFO@
+/* Translate name of a service location and/or a service name to set of
+ socket addresses.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */
+_GL_FUNCDECL_SYS (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+ _GL_ARG_NONNULL ((4)));
+# endif
+_GL_CXXALIAS_SYS (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res));
+_GL_CXXALIASWARN (getaddrinfo);
+
+# if !@HAVE_DECL_FREEADDRINFO@
+/* Free `addrinfo' structure AI including associated storage.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */
+_GL_FUNCDECL_SYS (freeaddrinfo, void, (struct addrinfo *ai)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (freeaddrinfo, void, (struct addrinfo *ai));
+_GL_CXXALIASWARN (freeaddrinfo);
+
+# if @REPLACE_GAI_STRERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gai_strerror
+# define gai_strerror rpl_gai_strerror
+# endif
+_GL_FUNCDECL_RPL (gai_strerror, const char *, (int ecode));
+_GL_CXXALIAS_RPL (gai_strerror, const char *, (int ecode));
+# else
+# if !@HAVE_DECL_GAI_STRERROR@
+/* Convert error return from getaddrinfo() to a string.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/gai_strerror.html>. */
+_GL_FUNCDECL_SYS (gai_strerror, const char *, (int ecode));
+# endif
+_GL_CXXALIAS_SYS (gai_strerror, const char *, (int ecode));
+# endif
+_GL_CXXALIASWARN (gai_strerror);
+
+# if !@HAVE_DECL_GETNAMEINFO@
+/* Convert socket address to printable node and service names.
+ For more details, see the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */
+_GL_FUNCDECL_SYS (getnameinfo, int,
+ (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on glibc systems, the seventh parameter is
+ unsigned int flags. */
+_GL_CXXALIAS_SYS_CAST (getnameinfo, int,
+ (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags));
+_GL_CXXALIASWARN (getnameinfo);
+
+/* Possible flags for getnameinfo. */
+# ifndef NI_NUMERICHOST
+# define NI_NUMERICHOST 1
+# endif
+# ifndef NI_NUMERICSERV
+# define NI_NUMERICSERV 2
+# endif
+
+#elif defined GNULIB_POSIXCHECK
+
+# undef getaddrinfo
+# if HAVE_RAW_DECL_GETADDRINFO
+_GL_WARN_ON_USE (getaddrinfo, "getaddrinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef freeaddrinfo
+# if HAVE_RAW_DECL_FREEADDRINFO
+_GL_WARN_ON_USE (freeaddrinfo, "freeaddrinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef gai_strerror
+# if HAVE_RAW_DECL_GAI_STRERROR
+_GL_WARN_ON_USE (gai_strerror, "gai_strerror is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef getnameinfo
+# if HAVE_RAW_DECL_GETNAMEINFO
+_GL_WARN_ON_USE (getnameinfo, "getnameinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_NETDB_H */
+#endif /* _@GUARD_PREFIX@_NETDB_H */
diff --git a/gnulib/lib/netinet_in.in.h b/gnulib/lib/netinet_in.in.h
new file mode 100644
index 0000000..467967c
--- /dev/null
+++ b/gnulib/lib/netinet_in.in.h
@@ -0,0 +1,48 @@
+/* Substitute for <netinet/in.h>.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_NETINET_IN_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_NETINET_IN_H@
+
+/* On many platforms, <netinet/in.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETINET_IN_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_NETINET_IN_H
+#define _@GUARD_PREFIX@_NETINET_IN_H
+
+#if !@HAVE_NETINET_IN_H@
+
+/* A platform that lacks <netinet/in.h>. */
+
+# include <sys/socket.h>
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_NETINET_IN_H */
+#endif /* _@GUARD_PREFIX@_NETINET_IN_H */
diff --git a/gnulib/lib/nl_langinfo.c b/gnulib/lib/nl_langinfo.c
new file mode 100644
index 0000000..8406ff1
--- /dev/null
+++ b/gnulib/lib/nl_langinfo.c
@@ -0,0 +1,270 @@
+/* nl_langinfo() replacement: query locale dependent information.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <langinfo.h>
+
+#if REPLACE_NL_LANGINFO
+
+/* Override nl_langinfo with support for added nl_item values. */
+
+# include <locale.h>
+# include <string.h>
+
+# undef nl_langinfo
+
+char *
+rpl_nl_langinfo (nl_item item)
+{
+ switch (item)
+ {
+# if GNULIB_defined_CODESET
+ case CODESET:
+ {
+ const char *locale;
+ static char buf[2 + 10 + 1];
+
+ locale = setlocale (LC_CTYPE, NULL);
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (buf))
+ {
+ memcpy (buf, dot, modifier - dot);
+ buf [modifier - dot] = '\0';
+ return buf;
+ }
+ }
+ }
+ return "";
+ }
+# endif
+# if GNULIB_defined_T_FMT_AMPM
+ case T_FMT_AMPM:
+ return "%I:%M:%S %p";
+# endif
+# if GNULIB_defined_ERA
+ case ERA:
+ /* The format is not standardized. In glibc it is a sequence of strings
+ of the form "direction:offset:start_date:end_date:era_name:era_format"
+ with an empty string at the end. */
+ return "";
+ case ERA_D_FMT:
+ /* The %Ex conversion in strftime behaves like %x if the locale does not
+ have an alternative time format. */
+ item = D_FMT;
+ break;
+ case ERA_D_T_FMT:
+ /* The %Ec conversion in strftime behaves like %c if the locale does not
+ have an alternative time format. */
+ item = D_T_FMT;
+ break;
+ case ERA_T_FMT:
+ /* The %EX conversion in strftime behaves like %X if the locale does not
+ have an alternative time format. */
+ item = T_FMT;
+ break;
+ case ALT_DIGITS:
+ /* The format is not standardized. In glibc it is a sequence of 10
+ strings, appended in memory. */
+ return "\0\0\0\0\0\0\0\0\0\0";
+# endif
+# if GNULIB_defined_YESEXPR || !FUNC_NL_LANGINFO_YESEXPR_WORKS
+ case YESEXPR:
+ return "^[yY]";
+ case NOEXPR:
+ return "^[nN]";
+# endif
+ default:
+ break;
+ }
+ return nl_langinfo (item);
+}
+
+#else
+
+/* Provide nl_langinfo from scratch. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Windows platforms. */
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include <stdio.h>
+
+# else
+
+/* An old Unix platform without locales, such as Linux libc5 or BeOS. */
+
+# endif
+
+# include <locale.h>
+
+char *
+nl_langinfo (nl_item item)
+{
+ switch (item)
+ {
+ /* nl_langinfo items of the LC_CTYPE category */
+ case CODESET:
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ {
+ static char buf[2 + 10 + 1];
+
+ /* Woe32 has a function returning the locale's codepage as a number. */
+ sprintf (buf, "CP%u", GetACP ());
+ return buf;
+ }
+# elif defined __BEOS__
+ return "UTF-8";
+# else
+ return "ISO-8859-1";
+# endif
+ /* nl_langinfo items of the LC_NUMERIC category */
+ case RADIXCHAR:
+ return localeconv () ->decimal_point;
+ case THOUSEP:
+ return localeconv () ->thousands_sep;
+ /* nl_langinfo items of the LC_TIME category.
+ TODO: Really use the locale. */
+ case D_T_FMT:
+ case ERA_D_T_FMT:
+ return "%a %b %e %H:%M:%S %Y";
+ case D_FMT:
+ case ERA_D_FMT:
+ return "%m/%d/%y";
+ case T_FMT:
+ case ERA_T_FMT:
+ return "%H:%M:%S";
+ case T_FMT_AMPM:
+ return "%I:%M:%S %p";
+ case AM_STR:
+ return "AM";
+ case PM_STR:
+ return "PM";
+ case DAY_1:
+ return "Sunday";
+ case DAY_2:
+ return "Monday";
+ case DAY_3:
+ return "Tuesday";
+ case DAY_4:
+ return "Wednesday";
+ case DAY_5:
+ return "Thursday";
+ case DAY_6:
+ return "Friday";
+ case DAY_7:
+ return "Saturday";
+ case ABDAY_1:
+ return "Sun";
+ case ABDAY_2:
+ return "Mon";
+ case ABDAY_3:
+ return "Tue";
+ case ABDAY_4:
+ return "Wed";
+ case ABDAY_5:
+ return "Thu";
+ case ABDAY_6:
+ return "Fri";
+ case ABDAY_7:
+ return "Sat";
+ case MON_1:
+ return "January";
+ case MON_2:
+ return "February";
+ case MON_3:
+ return "March";
+ case MON_4:
+ return "April";
+ case MON_5:
+ return "May";
+ case MON_6:
+ return "June";
+ case MON_7:
+ return "July";
+ case MON_8:
+ return "August";
+ case MON_9:
+ return "September";
+ case MON_10:
+ return "October";
+ case MON_11:
+ return "November";
+ case MON_12:
+ return "December";
+ case ABMON_1:
+ return "Jan";
+ case ABMON_2:
+ return "Feb";
+ case ABMON_3:
+ return "Mar";
+ case ABMON_4:
+ return "Apr";
+ case ABMON_5:
+ return "May";
+ case ABMON_6:
+ return "Jun";
+ case ABMON_7:
+ return "Jul";
+ case ABMON_8:
+ return "Aug";
+ case ABMON_9:
+ return "Sep";
+ case ABMON_10:
+ return "Oct";
+ case ABMON_11:
+ return "Nov";
+ case ABMON_12:
+ return "Dec";
+ case ERA:
+ return "";
+ case ALT_DIGITS:
+ return "\0\0\0\0\0\0\0\0\0\0";
+ /* nl_langinfo items of the LC_MONETARY category
+ TODO: Really use the locale. */
+ case CRNCYSTR:
+ return "-";
+ /* nl_langinfo items of the LC_MESSAGES category
+ TODO: Really use the locale. */
+ case YESEXPR:
+ return "^[yY]";
+ case NOEXPR:
+ return "^[nN]";
+ default:
+ return "";
+ }
+}
+
+#endif
diff --git a/gnulib/lib/nonblocking.c b/gnulib/lib/nonblocking.c
new file mode 100644
index 0000000..c356f36
--- /dev/null
+++ b/gnulib/lib/nonblocking.c
@@ -0,0 +1,153 @@
+/* Non-blocking I/O for pipe or socket descriptors.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "nonblocking.h"
+
+#include <errno.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+# include <sys/ioctl.h>
+# include <sys/socket.h>
+# include <unistd.h>
+
+/* Get declarations of the Win32 API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include "msvc-nothrow.h"
+
+int
+get_nonblocking_flag (int desc)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (desc);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (GetFileType (h) == FILE_TYPE_PIPE)
+ {
+ /* h is a pipe or socket. */
+ DWORD state;
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0))
+ /* h is a pipe. */
+ return (state & PIPE_NOWAIT) != 0;
+ else
+ /* h is a socket. */
+ errno = ENOSYS;
+ return -1;
+ }
+ else
+ /* Win32 does not support non-blocking on regular files. */
+ return 0;
+}
+
+int
+set_nonblocking_flag (int desc, bool value)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (desc);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (GetFileType (h) == FILE_TYPE_PIPE)
+ {
+ /* h is a pipe or socket. */
+ DWORD state;
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0))
+ {
+ /* h is a pipe. */
+ if ((state & PIPE_NOWAIT) != 0)
+ {
+ if (value)
+ return 0;
+ state &= ~PIPE_NOWAIT;
+ }
+ else
+ {
+ if (!value)
+ return 0;
+ state |= PIPE_NOWAIT;
+ }
+ if (SetNamedPipeHandleState (h, &state, NULL, NULL))
+ return 0;
+ errno = EINVAL;
+ return -1;
+ }
+ else
+ {
+ /* h is a socket. */
+ int v = value;
+ return ioctl (desc, FIONBIO, &v);
+ }
+ }
+ else
+ {
+ /* Win32 does not support non-blocking on regular files. */
+ if (!value)
+ return 0;
+ errno = ENOTSUP;
+ return -1;
+ }
+}
+
+#else
+/* Unix API. */
+
+# include <fcntl.h>
+
+# if GNULIB_defined_O_NONBLOCK
+# error Please port nonblocking to your platform
+# endif
+
+/* We don't need the gnulib replacement of fcntl() here. */
+# undef fcntl
+
+int
+get_nonblocking_flag (int desc)
+{
+ int fcntl_flags;
+
+ fcntl_flags = fcntl (desc, F_GETFL, 0);
+ if (fcntl_flags < 0)
+ return -1;
+ return (fcntl_flags & O_NONBLOCK) != 0;
+}
+
+int
+set_nonblocking_flag (int desc, bool value)
+{
+ int fcntl_flags;
+
+ fcntl_flags = fcntl (desc, F_GETFL, 0);
+ if (fcntl_flags < 0)
+ return -1;
+ if (((fcntl_flags & O_NONBLOCK) != 0) == value)
+ return 0;
+ if (value)
+ fcntl_flags |= O_NONBLOCK;
+ else
+ fcntl_flags &= ~O_NONBLOCK;
+ return fcntl (desc, F_SETFL, fcntl_flags);
+}
+
+#endif
diff --git a/gnulib/lib/nonblocking.h b/gnulib/lib/nonblocking.h
new file mode 100644
index 0000000..48a2da8
--- /dev/null
+++ b/gnulib/lib/nonblocking.h
@@ -0,0 +1,62 @@
+/* Non-blocking I/O for pipe or socket descriptors.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _NONBLOCKING_H
+#define _NONBLOCKING_H
+
+#include <stdbool.h>
+
+/* Non-blocking I/O is an I/O mode by which read(), write() calls avoid
+ blocking the current thread. When non-blocking is enabled:
+ - A read() call returns -1 with errno set to EAGAIN when no data or EOF
+ information is immediately available.
+ - A write() call returns -1 with errno set to EAGAIN when it cannot
+ transport the requested amount of data (but at most one pipe buffer)
+ without blocking.
+ Non-blocking I/O is most useful for character devices, pipes, and sockets.
+ Whether it also works on regular files and block devices is platform
+ dependent.
+
+ There are three modern alternatives to non-blocking I/O:
+ - use select() or poll() followed by read() or write() if the descriptor
+ is ready,
+ - call read() or write() in separate threads,
+ - use <aio.h> interfaces. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return 1 if I/O to the descriptor DESC is currently non-blocking, 0
+ it is blocking, or -1 with errno set if fd is invalid or blocking
+ status cannot be determined (such as with sockets on mingw). */
+extern int get_nonblocking_flag (int desc);
+
+/* Specify the non-blocking flag for the descriptor DESC.
+ Return 0 upon success, or -1 with errno set upon failure.
+ The default depends on the presence of the O_NONBLOCK flag for files
+ or pipes opened with open() or on the presence of the SOCK_NONBLOCK
+ flag for sockets. */
+extern int set_nonblocking_flag (int desc, bool value);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NONBLOCKING_H */
diff --git a/gnulib/lib/nproc.c b/gnulib/lib/nproc.c
new file mode 100644
index 0000000..7ebf497
--- /dev/null
+++ b/gnulib/lib/nproc.c
@@ -0,0 +1,358 @@
+/* Detect the number of processors.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Glen Lenker and Bruno Haible. */
+
+#include <config.h>
+#include "nproc.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if HAVE_PTHREAD_GETAFFINITY_NP && 0
+# include <pthread.h>
+# include <sched.h>
+#endif
+#if HAVE_SCHED_GETAFFINITY_LIKE_GLIBC || HAVE_SCHED_GETAFFINITY_NP
+# include <sched.h>
+#endif
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PSTAT_H
+# include <sys/pstat.h>
+#endif
+
+#if HAVE_SYS_SYSMP_H
+# include <sys/sysmp.h>
+#endif
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "c-ctype.h"
+
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
+/* Return the number of processors available to the current process, based
+ on a modern system call that returns the "affinity" between the current
+ process and each CPU. Return 0 if unknown or if such a system call does
+ not exist. */
+static unsigned long
+num_processors_via_affinity_mask (void)
+{
+ /* glibc >= 2.3.3 with NPTL and NetBSD 5 have pthread_getaffinity_np,
+ but with different APIs. Also it requires linking with -lpthread.
+ Therefore this code is not enabled.
+ glibc >= 2.3.4 has sched_getaffinity whereas NetBSD 5 has
+ sched_getaffinity_np. */
+#if HAVE_PTHREAD_GETAFFINITY_NP && defined __GLIBC__ && 0
+ {
+ cpu_set_t set;
+
+ if (pthread_getaffinity_np (pthread_self (), sizeof (set), &set) == 0)
+ {
+ unsigned long count;
+
+# ifdef CPU_COUNT
+ /* glibc >= 2.6 has the CPU_COUNT macro. */
+ count = CPU_COUNT (&set);
+# else
+ size_t i;
+
+ count = 0;
+ for (i = 0; i < CPU_SETSIZE; i++)
+ if (CPU_ISSET (i, &set))
+ count++;
+# endif
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_PTHREAD_GETAFFINITY_NP && defined __NetBSD__ && 0
+ {
+ cpuset_t *set;
+
+ set = cpuset_create ();
+ if (set != NULL)
+ {
+ unsigned long count = 0;
+
+ if (pthread_getaffinity_np (pthread_self (), cpuset_size (set), set)
+ == 0)
+ {
+ cpuid_t i;
+
+ for (i = 0;; i++)
+ {
+ int ret = cpuset_isset (i, set);
+ if (ret < 0)
+ break;
+ if (ret > 0)
+ count++;
+ }
+ }
+ cpuset_destroy (set);
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_SCHED_GETAFFINITY_LIKE_GLIBC /* glibc >= 2.3.4 */
+ {
+ cpu_set_t set;
+
+ if (sched_getaffinity (0, sizeof (set), &set) == 0)
+ {
+ unsigned long count;
+
+# ifdef CPU_COUNT
+ /* glibc >= 2.6 has the CPU_COUNT macro. */
+ count = CPU_COUNT (&set);
+# else
+ size_t i;
+
+ count = 0;
+ for (i = 0; i < CPU_SETSIZE; i++)
+ if (CPU_ISSET (i, &set))
+ count++;
+# endif
+ if (count > 0)
+ return count;
+ }
+ }
+#elif HAVE_SCHED_GETAFFINITY_NP /* NetBSD >= 5 */
+ {
+ cpuset_t *set;
+
+ set = cpuset_create ();
+ if (set != NULL)
+ {
+ unsigned long count = 0;
+
+ if (sched_getaffinity_np (getpid (), cpuset_size (set), set) == 0)
+ {
+ cpuid_t i;
+
+ for (i = 0;; i++)
+ {
+ int ret = cpuset_isset (i, set);
+ if (ret < 0)
+ break;
+ if (ret > 0)
+ count++;
+ }
+ }
+ cpuset_destroy (set);
+ if (count > 0)
+ return count;
+ }
+ }
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { /* This works on native Windows platforms. */
+ DWORD_PTR process_mask;
+ DWORD_PTR system_mask;
+
+ if (GetProcessAffinityMask (GetCurrentProcess (),
+ &process_mask, &system_mask))
+ {
+ DWORD_PTR mask = process_mask;
+ unsigned long count = 0;
+
+ for (; mask != 0; mask = mask >> 1)
+ if (mask & 1)
+ count++;
+ if (count > 0)
+ return count;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+unsigned long int
+num_processors (enum nproc_query query)
+{
+ if (query == NPROC_CURRENT_OVERRIDABLE)
+ {
+ /* Test the environment variable OMP_NUM_THREADS, recognized also by all
+ programs that are based on OpenMP. The OpenMP spec says that the
+ value assigned to the environment variable "may have leading and
+ trailing white space". */
+ const char *envvalue = getenv ("OMP_NUM_THREADS");
+
+ if (envvalue != NULL)
+ {
+ while (*envvalue != '\0' && c_isspace (*envvalue))
+ envvalue++;
+ /* Convert it from decimal to 'unsigned long'. */
+ if (c_isdigit (*envvalue))
+ {
+ char *endptr = NULL;
+ unsigned long int value = strtoul (envvalue, &endptr, 10);
+
+ if (endptr != NULL)
+ {
+ while (*endptr != '\0' && c_isspace (*endptr))
+ endptr++;
+ if (*endptr == '\0')
+ return (value > 0 ? value : 1);
+ }
+ }
+ }
+
+ query = NPROC_CURRENT;
+ }
+ /* Here query is one of NPROC_ALL, NPROC_CURRENT. */
+
+ /* On systems with a modern affinity mask system call, we have
+ sysconf (_SC_NPROCESSORS_CONF)
+ >= sysconf (_SC_NPROCESSORS_ONLN)
+ >= num_processors_via_affinity_mask ()
+ The first number is the number of CPUs configured in the system.
+ The second number is the number of CPUs available to the scheduler.
+ The third number is the number of CPUs available to the current process.
+
+ Note! On Linux systems with glibc, the first and second number come from
+ the /sys and /proc file systems (see
+ glibc/sysdeps/unix/sysv/linux/getsysstats.c).
+ In some situations these file systems are not mounted, and the sysconf
+ call returns 1, which does not reflect the reality. */
+
+ if (query == NPROC_CURRENT)
+ {
+ /* Try the modern affinity mask system call. */
+ {
+ unsigned long nprocs = num_processors_via_affinity_mask ();
+
+ if (nprocs > 0)
+ return nprocs;
+ }
+
+#if defined _SC_NPROCESSORS_ONLN
+ { /* This works on glibc, MacOS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
+ Cygwin, Haiku. */
+ long int nprocs = sysconf (_SC_NPROCESSORS_ONLN);
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+ }
+ else /* query == NPROC_ALL */
+ {
+#if defined _SC_NPROCESSORS_CONF
+ { /* This works on glibc, MacOS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
+ Cygwin, Haiku. */
+ long int nprocs = sysconf (_SC_NPROCESSORS_CONF);
+
+# if __GLIBC__ >= 2 && defined __linux__
+ /* On Linux systems with glibc, this information comes from the /sys and
+ /proc file systems (see glibc/sysdeps/unix/sysv/linux/getsysstats.c).
+ In some situations these file systems are not mounted, and the
+ sysconf call returns 1. But we wish to guarantee that
+ num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT). */
+ if (nprocs == 1)
+ {
+ unsigned long nprocs_current = num_processors_via_affinity_mask ();
+
+ if (nprocs_current > 0)
+ nprocs = nprocs_current;
+ }
+# endif
+
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+ }
+
+#if HAVE_PSTAT_GETDYNAMIC
+ { /* This works on HP-UX. */
+ struct pst_dynamic psd;
+ if (pstat_getdynamic (&psd, sizeof psd, 1, 0) >= 0)
+ {
+ /* The field psd_proc_cnt contains the number of active processors.
+ In newer releases of HP-UX 11, the field psd_max_proc_cnt includes
+ deactivated processors. */
+ if (query == NPROC_CURRENT)
+ {
+ if (psd.psd_proc_cnt > 0)
+ return psd.psd_proc_cnt;
+ }
+ else
+ {
+ if (psd.psd_max_proc_cnt > 0)
+ return psd.psd_max_proc_cnt;
+ }
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_NAPROCS && defined MP_NPROCS
+ { /* This works on IRIX. */
+ /* MP_NPROCS yields the number of installed processors.
+ MP_NAPROCS yields the number of processors available to unprivileged
+ processes. */
+ int nprocs =
+ sysmp (query == NPROC_CURRENT && getpid () != 0
+ ? MP_NAPROCS
+ : MP_NPROCS);
+ if (nprocs > 0)
+ return nprocs;
+ }
+#endif
+
+ /* Finally, as fallback, use the APIs that don't distinguish between
+ NPROC_CURRENT and NPROC_ALL. */
+
+#if HAVE_SYSCTL && defined HW_NCPU
+ { /* This works on MacOS X, FreeBSD, NetBSD, OpenBSD. */
+ int nprocs;
+ size_t len = sizeof (nprocs);
+ static int mib[2] = { CTL_HW, HW_NCPU };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &nprocs, &len, NULL, 0) == 0
+ && len == sizeof (nprocs)
+ && 0 < nprocs)
+ return nprocs;
+ }
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { /* This works on native Windows platforms. */
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ if (0 < system_info.dwNumberOfProcessors)
+ return system_info.dwNumberOfProcessors;
+ }
+#endif
+
+ return 1;
+}
diff --git a/gnulib/lib/nproc.h b/gnulib/lib/nproc.h
new file mode 100644
index 0000000..889bbcc
--- /dev/null
+++ b/gnulib/lib/nproc.h
@@ -0,0 +1,47 @@
+/* Detect the number of processors.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Glen Lenker and Bruno Haible. */
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A "processor" in this context means a thread execution unit, that is either
+ - an execution core in a (possibly multi-core) chip, in a (possibly multi-
+ chip) module, in a single computer, or
+ - a thread execution unit inside a core
+ (hyper-threading, see <http://en.wikipedia.org/wiki/Hyper-threading>).
+ Which of the two definitions is used, is unspecified. */
+
+enum nproc_query
+{
+ NPROC_ALL, /* total number of processors */
+ NPROC_CURRENT, /* processors available to the current process */
+ NPROC_CURRENT_OVERRIDABLE /* likewise, but overridable through the
+ OMP_NUM_THREADS environment variable */
+};
+
+/* Return the total number of processors. The result is guaranteed to
+ be at least 1. */
+extern unsigned long int num_processors (enum nproc_query query);
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
diff --git a/gnulib/lib/obstack.c b/gnulib/lib/obstack.c
new file mode 100644
index 0000000..47492cc
--- /dev/null
+++ b/gnulib/lib/obstack.c
@@ -0,0 +1,420 @@
+/* obstack.c - subroutines used implicitly by object stack macros
+
+ Copyright (C) 1988-1994, 1996-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# include <obstack.h>
+# include <shlib-compat.h>
+#else
+# include <config.h>
+# include "obstack.h"
+#endif
+
+/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
+ incremented whenever callers compiled using an old obstack.h can no
+ longer properly call the functions in this obstack.c. */
+#define OBSTACK_INTERFACE_VERSION 1
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself, and the installed library
+ supports the same library interface we do. This code is part of the GNU
+ C Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object
+ files, it is simpler to just do this in the source for each such file. */
+
+#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
+#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+# include <gnu-versions.h>
+# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
+# define ELIDE_CODE
+# endif
+#endif
+
+#include <stddef.h>
+
+#ifndef ELIDE_CODE
+
+# include <stdint.h>
+
+/* Determine default alignment. */
+union fooround
+{
+ uintmax_t i;
+ long double d;
+ void *p;
+};
+struct fooalign
+{
+ char c;
+ union fooround u;
+};
+/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
+ But in fact it might be less smart and round addresses to as much as
+ DEFAULT_ROUNDING. So we prepare for it to do that. */
+enum
+ {
+ DEFAULT_ALIGNMENT = offsetof (struct fooalign, u),
+ DEFAULT_ROUNDING = sizeof (union fooround)
+ };
+
+/* When we copy a long block of data, this is the unit to do it with.
+ On some machines, copying successive ints does not work;
+ in such a case, redefine COPYING_UNIT to `long' (if that works)
+ or `char' as a last resort. */
+# ifndef COPYING_UNIT
+# define COPYING_UNIT int
+# endif
+
+
+/* The functions allocating more room by calling `obstack_chunk_alloc'
+ jump to the handler pointed to by `obstack_alloc_failed_handler'.
+ This can be set to a user defined function which should either
+ abort gracefully or use longjump - but shouldn't return. This
+ variable by default points to the internal function
+ `print_and_abort'. */
+static _Noreturn void print_and_abort (void);
+void (*obstack_alloc_failed_handler) (void) = print_and_abort;
+
+/* Exit value used when `print_and_abort' is used. */
+# include <stdlib.h>
+# ifdef _LIBC
+int obstack_exit_failure = EXIT_FAILURE;
+# else
+# include "exitfail.h"
+# define obstack_exit_failure exit_failure
+# endif
+
+# ifdef _LIBC
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+/* A looong time ago (before 1994, anyway; we're not sure) this global variable
+ was used by non-GNU-C macros to avoid multiple evaluation. The GNU C
+ library still exports it because somebody might use it. */
+struct obstack *_obstack_compat;
+compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
+# endif
+# endif
+
+/* Define a macro that either calls functions with the traditional malloc/free
+ calling interface, or calls functions with the mmalloc/mfree interface
+ (that adds an extra first argument), based on the state of use_extra_arg.
+ For free, do not use ?:, since some compilers, like the MIPS compilers,
+ do not allow (expr) ? void : void. */
+
+# define CALL_CHUNKFUN(h, size) \
+ (((h) -> use_extra_arg) \
+ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
+ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
+
+# define CALL_FREEFUN(h, old_chunk) \
+ do { \
+ if ((h) -> use_extra_arg) \
+ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
+ else \
+ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
+ } while (0)
+
+
+/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
+ Objects start on multiples of ALIGNMENT (0 means use default).
+ CHUNKFUN is the function to use to allocate chunks,
+ and FREEFUN the function to free them.
+
+ Return nonzero if successful, calls obstack_alloc_failed_handler if
+ allocation fails. */
+
+int
+_obstack_begin (struct obstack *h,
+ int size, int alignment,
+ void *(*chunkfun) (long),
+ void (*freefun) (void *))
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->use_extra_arg = 0;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+int
+_obstack_begin_1 (struct obstack *h, int size, int alignment,
+ void *(*chunkfun) (void *, long),
+ void (*freefun) (void *, void *),
+ void *arg)
+{
+ register struct _obstack_chunk *chunk; /* points to new chunk */
+
+ if (alignment == 0)
+ alignment = DEFAULT_ALIGNMENT;
+ if (size == 0)
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ {
+ /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
+
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
+ int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
+ size = 4096 - extra;
+ }
+
+ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
+ h->chunk_size = size;
+ h->alignment_mask = alignment - 1;
+ h->extra_arg = arg;
+ h->use_extra_arg = 1;
+
+ chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
+ if (!chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
+ alignment - 1);
+ h->chunk_limit = chunk->limit
+ = (char *) chunk + h->chunk_size;
+ chunk->prev = 0;
+ /* The initial chunk now contains no empty object. */
+ h->maybe_empty_object = 0;
+ h->alloc_failed = 0;
+ return 1;
+}
+
+/* Allocate a new current chunk for the obstack *H
+ on the assumption that LENGTH bytes need to be added
+ to the current object, or a new object of length LENGTH allocated.
+ Copies any partial object from the end of the old chunk
+ to the beginning of the new one. */
+
+void
+_obstack_newchunk (struct obstack *h, int length)
+{
+ register struct _obstack_chunk *old_chunk = h->chunk;
+ register struct _obstack_chunk *new_chunk;
+ register long new_size;
+ register long obj_size = h->next_free - h->object_base;
+ register long i;
+ long already;
+ char *object_base;
+
+ /* Compute size for new chunk. */
+ new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100;
+ if (new_size < h->chunk_size)
+ new_size = h->chunk_size;
+
+ /* Allocate and initialize the new chunk. */
+ new_chunk = CALL_CHUNKFUN (h, new_size);
+ if (!new_chunk)
+ (*obstack_alloc_failed_handler) ();
+ h->chunk = new_chunk;
+ new_chunk->prev = old_chunk;
+ new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
+
+ /* Compute an aligned object_base in the new chunk */
+ object_base =
+ __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask);
+
+ /* Move the existing object to the new chunk.
+ Word at a time is fast and is safe if the object
+ is sufficiently aligned. */
+ if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
+ {
+ for (i = obj_size / sizeof (COPYING_UNIT) - 1;
+ i >= 0; i--)
+ ((COPYING_UNIT *)object_base)[i]
+ = ((COPYING_UNIT *)h->object_base)[i];
+ /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
+ but that can cross a page boundary on a machine
+ which does not do strict alignment for COPYING_UNITS. */
+ already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
+ }
+ else
+ already = 0;
+ /* Copy remaining bytes one by one. */
+ for (i = already; i < obj_size; i++)
+ object_base[i] = h->object_base[i];
+
+ /* If the object just copied was the only data in OLD_CHUNK,
+ free that chunk and remove it from the chain.
+ But not if that chunk might contain an empty object. */
+ if (! h->maybe_empty_object
+ && (h->object_base
+ == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+ h->alignment_mask)))
+ {
+ new_chunk->prev = old_chunk->prev;
+ CALL_FREEFUN (h, old_chunk);
+ }
+
+ h->object_base = object_base;
+ h->next_free = h->object_base + obj_size;
+ /* The new chunk certainly contains no empty object yet. */
+ h->maybe_empty_object = 0;
+}
+# ifdef _LIBC
+libc_hidden_def (_obstack_newchunk)
+# endif
+
+/* Return nonzero if object OBJ has been allocated from obstack H.
+ This is here for debugging.
+ If you use it in a program, you are probably losing. */
+
+/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
+ obstack.h because it is just for debugging. */
+int _obstack_allocated_p (struct obstack *h, void *obj);
+
+int
+_obstack_allocated_p (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = (h)->chunk;
+ /* We use >= rather than > since the object cannot be exactly at
+ the beginning of the chunk but might be an empty object exactly
+ at the end of an adjacent chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ lp = plp;
+ }
+ return lp != 0;
+}
+
+/* Free objects in obstack H, including OBJ and everything allocate
+ more recently than OBJ. If OBJ is zero, free everything in H. */
+
+# undef obstack_free
+
+void
+__obstack_free (struct obstack *h, void *obj)
+{
+ register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
+ register struct _obstack_chunk *plp; /* point to previous chunk if any */
+
+ lp = h->chunk;
+ /* We use >= because there cannot be an object at the beginning of a chunk.
+ But there can be an empty object at that address
+ at the end of another chunk. */
+ while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj))
+ {
+ plp = lp->prev;
+ CALL_FREEFUN (h, lp);
+ lp = plp;
+ /* If we switch chunks, we can't tell whether the new current
+ chunk contains an empty object, so assume that it may. */
+ h->maybe_empty_object = 1;
+ }
+ if (lp)
+ {
+ h->object_base = h->next_free = (char *) (obj);
+ h->chunk_limit = lp->limit;
+ h->chunk = lp;
+ }
+ else if (obj != 0)
+ /* obj is not in any of the chunks! */
+ abort ();
+}
+
+# ifdef _LIBC
+/* Older versions of libc used a function _obstack_free intended to be
+ called by non-GCC compilers. */
+strong_alias (obstack_free, _obstack_free)
+# endif
+
+int
+_obstack_memory_used (struct obstack *h)
+{
+ register struct _obstack_chunk* lp;
+ register int nbytes = 0;
+
+ for (lp = h->chunk; lp != 0; lp = lp->prev)
+ {
+ nbytes += lp->limit - (char *) lp;
+ }
+ return nbytes;
+}
+
+/* Define the error handler. */
+# ifdef _LIBC
+# include <libintl.h>
+# else
+# include "gettext.h"
+# endif
+# ifndef _
+# define _(msgid) gettext (msgid)
+# endif
+
+# ifdef _LIBC
+# include <libio/iolibio.h>
+# endif
+
+static _Noreturn void
+print_and_abort (void)
+{
+ /* Don't change any of these strings. Yes, it would be possible to add
+ the newline to the string and use fputs or so. But this must not
+ happen because the "memory exhausted" message appears in other places
+ like this and the translation should be reused instead of creating
+ a very similar string which requires a separate translation. */
+# ifdef _LIBC
+ (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
+# else
+ fprintf (stderr, "%s\n", _("memory exhausted"));
+# endif
+ exit (obstack_exit_failure);
+}
+
+#endif /* !ELIDE_CODE */
diff --git a/gnulib/lib/obstack.h b/gnulib/lib/obstack.h
new file mode 100644
index 0000000..8a8d44b
--- /dev/null
+++ b/gnulib/lib/obstack.h
@@ -0,0 +1,512 @@
+/* obstack.h - object stack macros
+ Copyright (C) 1988-1994, 1996-1999, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Summary:
+
+All the apparent functions defined here are macros. The idea
+is that you would use these pre-tested macros to solve a
+very specific set of problems, and they would run fast.
+Caution: no side-effects in arguments please!! They may be
+evaluated MANY times!!
+
+These macros operate a stack of objects. Each object starts life
+small, and may grow to maturity. (Consider building a word syllable
+by syllable.) An object can move while it is growing. Once it has
+been "finished" it never changes address again. So the "top of the
+stack" is typically an immature growing object, while the rest of the
+stack is of mature, fixed size and fixed address objects.
+
+These routines grab large chunks of memory, using a function you
+supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
+by calling `obstack_chunk_free'. You must define them and declare
+them before using any obstack macros.
+
+Each independent stack is represented by a `struct obstack'.
+Each of the obstack macros expects a pointer to such a structure
+as the first argument.
+
+One motivation for this package is the problem of growing char strings
+in symbol tables. Unless you are "fascist pig with a read-only mind"
+--Gosper's immortal quote from HAKMEM item 154, out of context--you
+would not like to put any arbitrary upper limit on the length of your
+symbols.
+
+In practice this often means you will build many short symbols and a
+few long symbols. At the time you are reading a symbol you don't know
+how long it is. One traditional method is to read a symbol into a
+buffer, realloc()ating the buffer every time you try to read a symbol
+that is longer than the buffer. This is beaut, but you still will
+want to copy the symbol from the buffer to a more permanent
+symbol-table entry say about half the time.
+
+With obstacks, you can work differently. Use one obstack for all symbol
+names. As you read a symbol, grow the name in the obstack gradually.
+When the name is complete, finalize it. Then, if the symbol exists already,
+free the newly read name.
+
+The way we do this is to take a large chunk, allocating memory from
+low addresses. When you want to build a symbol in the chunk you just
+add chars above the current "high water mark" in the chunk. When you
+have finished adding chars, because you got to the end of the symbol,
+you know how long the chars are, and you can create a new object.
+Mostly the chars will not burst over the highest address of the chunk,
+because you would typically expect a chunk to be (say) 100 times as
+long as an average object.
+
+In case that isn't clear, when we have enough chars to make up
+the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
+so we just point to it where it lies. No moving of chars is
+needed and this is the second win: potentially long strings need
+never be explicitly shuffled. Once an object is formed, it does not
+change its address during its lifetime.
+
+When the chars burst over a chunk boundary, we allocate a larger
+chunk, and then copy the partly formed object from the end of the old
+chunk to the beginning of the new larger chunk. We then carry on
+accreting characters to the end of the object as we normally would.
+
+A special macro is provided to add a single char at a time to a
+growing object. This allows the use of register variables, which
+break the ordinary 'growth' macro.
+
+Summary:
+ We allocate large chunks.
+ We carve out one object at a time from the current chunk.
+ Once carved, an object never moves.
+ We are free to append data of any size to the currently
+ growing object.
+ Exactly one object is growing in an obstack at any one time.
+ You can run one obstack per control block.
+ You may have as many control blocks as you dare.
+ Because of the way we do it, you can `unwind' an obstack
+ back to a previous state. (You may remove objects much
+ as you would with a stack.)
+*/
+
+
+/* Don't do the contents of this file more than once. */
+
+#ifndef _OBSTACK_H
+#define _OBSTACK_H 1
+
+/* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is
+ defined, as with GNU C, use that; that way we don't pollute the
+ namespace with <stddef.h>'s symbols. Otherwise, include <stddef.h>
+ and use ptrdiff_t. */
+
+#ifdef __PTRDIFF_TYPE__
+# define PTR_INT_TYPE __PTRDIFF_TYPE__
+#else
+# include <stddef.h>
+# define PTR_INT_TYPE ptrdiff_t
+#endif
+
+/* If B is the base of an object addressed by P, return the result of
+ aligning P to the next multiple of A + 1. B and P must be of type
+ char *. A + 1 must be a power of 2. */
+
+#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A)))
+
+/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case
+ where pointers can be converted to integers, aligned as integers,
+ and converted back again. If PTR_INT_TYPE is narrower than a
+ pointer (e.g., the AS/400), play it safe and compute the alignment
+ relative to B. Otherwise, use the faster strategy of computing the
+ alignment relative to 0. */
+
+#define __PTR_ALIGN(B, P, A) \
+ __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \
+ P, A)
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _obstack_chunk /* Lives at front of each chunk. */
+{
+ char *limit; /* 1 past end of this chunk */
+ struct _obstack_chunk *prev; /* address of prior chunk or NULL */
+ char contents[4]; /* objects begin here */
+};
+
+struct obstack /* control current object in current chunk */
+{
+ long chunk_size; /* preferred size to allocate chunks in */
+ struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
+ char *object_base; /* address of object we are building */
+ char *next_free; /* where to add next char to current object */
+ char *chunk_limit; /* address of char after current chunk */
+ union
+ {
+ PTR_INT_TYPE tempint;
+ void *tempptr;
+ } temp; /* Temporary for some macros. */
+ int alignment_mask; /* Mask of alignment for each object. */
+ /* These prototypes vary based on `use_extra_arg', and we use
+ casts to the prototypeless function type in all assignments,
+ but having prototypes here quiets -Wstrict-prototypes. */
+ struct _obstack_chunk *(*chunkfun) (void *, long);
+ void (*freefun) (void *, struct _obstack_chunk *);
+ void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
+ unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
+ unsigned maybe_empty_object:1;/* There is a possibility that the current
+ chunk contains a zero-length object. This
+ prevents freeing the chunk if we allocate
+ a bigger chunk to replace it. */
+ unsigned alloc_failed:1; /* No longer used, as we now call the failed
+ handler on error, but retained for binary
+ compatibility. */
+};
+
+/* Declare the external functions we use; they are in obstack.c. */
+
+extern void _obstack_newchunk (struct obstack *, int);
+extern int _obstack_begin (struct obstack *, int, int,
+ void *(*) (long), void (*) (void *));
+extern int _obstack_begin_1 (struct obstack *, int, int,
+ void *(*) (void *, long),
+ void (*) (void *, void *), void *);
+extern int _obstack_memory_used (struct obstack *);
+
+/* The default name of the function for freeing a chunk is 'obstack_free',
+ but gnulib users can override this by defining '__obstack_free'. */
+#ifndef __obstack_free
+# define __obstack_free obstack_free
+#endif
+extern void __obstack_free (struct obstack *obstack, void *block);
+
+
+/* Error handler called when `obstack_chunk_alloc' failed to allocate
+ more memory. This can be set to a user defined function which
+ should either abort gracefully or use longjump - but shouldn't
+ return. The default action is to print a message and abort. */
+extern void (*obstack_alloc_failed_handler) (void);
+
+/* Exit value used when `print_and_abort' is used. */
+extern int obstack_exit_failure;
+
+/* Pointer to beginning of object being allocated or to be allocated next.
+ Note that this might not be the final address of the object
+ because a new chunk might be needed to hold the final size. */
+
+#define obstack_base(h) ((void *) (h)->object_base)
+
+/* Size for allocating ordinary chunks. */
+
+#define obstack_chunk_size(h) ((h)->chunk_size)
+
+/* Pointer to next byte not yet allocated in current chunk. */
+
+#define obstack_next_free(h) ((h)->next_free)
+
+/* Mask specifying low bits that should be clear in address of an object. */
+
+#define obstack_alignment_mask(h) ((h)->alignment_mask)
+
+/* To prevent prototype warnings provide complete argument list. */
+#define obstack_init(h) \
+ _obstack_begin ((h), 0, 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_begin(h, size) \
+ _obstack_begin ((h), (size), 0, \
+ (void *(*) (long)) obstack_chunk_alloc, \
+ (void (*) (void *)) obstack_chunk_free)
+
+#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
+ _obstack_begin ((h), (size), (alignment), \
+ (void *(*) (long)) (chunkfun), \
+ (void (*) (void *)) (freefun))
+
+#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
+ _obstack_begin_1 ((h), (size), (alignment), \
+ (void *(*) (void *, long)) (chunkfun), \
+ (void (*) (void *, void *)) (freefun), (arg))
+
+#define obstack_chunkfun(h, newchunkfun) \
+ ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
+
+#define obstack_freefun(h, newfreefun) \
+ ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
+
+#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
+
+#define obstack_blank_fast(h,n) ((h)->next_free += (n))
+
+#define obstack_memory_used(h) _obstack_memory_used (h)
+
+#if defined __GNUC__ && defined __STDC__ && __STDC__
+/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
+ does not implement __extension__. But that compiler doesn't define
+ __GNUC_MINOR__. */
+# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
+# define __extension__
+# endif
+
+/* For GNU C, if not -traditional,
+ we can define these macros to compute all args only once
+ without using a global variable.
+ Also, we can avoid using the `temp' slot, to make faster code. */
+
+# define obstack_object_size(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->next_free - __o->object_base); })
+
+# define obstack_room(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (unsigned) (__o->chunk_limit - __o->next_free); })
+
+# define obstack_make_room(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ (void) 0; })
+
+# define obstack_empty_p(OBSTACK) \
+ __extension__ \
+ ({ struct obstack const *__o = (OBSTACK); \
+ (__o->chunk->prev == 0 \
+ && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \
+ __o->chunk->contents, \
+ __o->alignment_mask)); })
+
+# define obstack_grow(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ (void) 0; })
+
+# define obstack_grow0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->next_free + __len + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, __len + 1); \
+ memcpy (__o->next_free, where, __len); \
+ __o->next_free += __len; \
+ *(__o->next_free)++ = 0; \
+ (void) 0; })
+
+# define obstack_1grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + 1 > __o->chunk_limit) \
+ _obstack_newchunk (__o, 1); \
+ obstack_1grow_fast (__o, datum); \
+ (void) 0; })
+
+/* These assume that the obstack alignment is good enough for pointers
+ or ints, and that the data added so far to the current object
+ shares that much alignment. */
+
+# define obstack_ptr_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (void *)); \
+ obstack_ptr_grow_fast (__o, datum); }) \
+
+# define obstack_int_grow(OBSTACK,datum) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ if (__o->next_free + sizeof (int) > __o->chunk_limit) \
+ _obstack_newchunk (__o, sizeof (int)); \
+ obstack_int_grow_fast (__o, datum); })
+
+# define obstack_ptr_grow_fast(OBSTACK,aptr) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(const void **) __o1->next_free = (aptr); \
+ __o1->next_free += sizeof (const void *); \
+ (void) 0; })
+
+# define obstack_int_grow_fast(OBSTACK,aint) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ *(int *) __o1->next_free = (aint); \
+ __o1->next_free += sizeof (int); \
+ (void) 0; })
+
+# define obstack_blank(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ int __len = (length); \
+ if (__o->chunk_limit - __o->next_free < __len) \
+ _obstack_newchunk (__o, __len); \
+ obstack_blank_fast (__o, __len); \
+ (void) 0; })
+
+# define obstack_alloc(OBSTACK,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_blank (__h, (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+# define obstack_copy0(OBSTACK,where,length) \
+__extension__ \
+({ struct obstack *__h = (OBSTACK); \
+ obstack_grow0 (__h, (where), (length)); \
+ obstack_finish (__h); })
+
+/* The local variable is named __o1 to avoid a name conflict
+ when obstack_blank is called. */
+# define obstack_finish(OBSTACK) \
+__extension__ \
+({ struct obstack *__o1 = (OBSTACK); \
+ void *__value = (void *) __o1->object_base; \
+ if (__o1->next_free == __value) \
+ __o1->maybe_empty_object = 1; \
+ __o1->next_free \
+ = __PTR_ALIGN (__o1->object_base, __o1->next_free, \
+ __o1->alignment_mask); \
+ if (__o1->next_free - (char *)__o1->chunk \
+ > __o1->chunk_limit - (char *)__o1->chunk) \
+ __o1->next_free = __o1->chunk_limit; \
+ __o1->object_base = __o1->next_free; \
+ __value; })
+
+# define obstack_free(OBSTACK, OBJ) \
+__extension__ \
+({ struct obstack *__o = (OBSTACK); \
+ void *__obj = (OBJ); \
+ if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
+ __o->next_free = __o->object_base = (char *)__obj; \
+ else (__obstack_free) (__o, __obj); })
+
+#else /* not __GNUC__ or not __STDC__ */
+
+# define obstack_object_size(h) \
+ (unsigned) ((h)->next_free - (h)->object_base)
+
+# define obstack_room(h) \
+ (unsigned) ((h)->chunk_limit - (h)->next_free)
+
+# define obstack_empty_p(h) \
+ ((h)->chunk->prev == 0 \
+ && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \
+ (h)->chunk->contents, \
+ (h)->alignment_mask))
+
+/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
+ so that we can avoid having void expressions
+ in the arms of the conditional expression.
+ Casting the third operand to void was tried before,
+ but some compilers won't accept it. */
+
+# define obstack_make_room(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0))
+
+# define obstack_grow(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint)
+
+# define obstack_grow0(h,where,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \
+ memcpy ((h)->next_free, where, (h)->temp.tempint), \
+ (h)->next_free += (h)->temp.tempint, \
+ *((h)->next_free)++ = 0)
+
+# define obstack_1grow(h,datum) \
+( (((h)->next_free + 1 > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), 1), 0) : 0), \
+ obstack_1grow_fast (h, datum))
+
+# define obstack_ptr_grow(h,datum) \
+( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
+ obstack_ptr_grow_fast (h, datum))
+
+# define obstack_int_grow(h,datum) \
+( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
+ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
+ obstack_int_grow_fast (h, datum))
+
+# define obstack_ptr_grow_fast(h,aptr) \
+ (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
+
+# define obstack_int_grow_fast(h,aint) \
+ (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint))
+
+# define obstack_blank(h,length) \
+( (h)->temp.tempint = (length), \
+ (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \
+ ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \
+ obstack_blank_fast (h, (h)->temp.tempint))
+
+# define obstack_alloc(h,length) \
+ (obstack_blank ((h), (length)), obstack_finish ((h)))
+
+# define obstack_copy(h,where,length) \
+ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_copy0(h,where,length) \
+ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
+
+# define obstack_finish(h) \
+( ((h)->next_free == (h)->object_base \
+ ? (((h)->maybe_empty_object = 1), 0) \
+ : 0), \
+ (h)->temp.tempptr = (h)->object_base, \
+ (h)->next_free \
+ = __PTR_ALIGN ((h)->object_base, (h)->next_free, \
+ (h)->alignment_mask), \
+ (((h)->next_free - (char *) (h)->chunk \
+ > (h)->chunk_limit - (char *) (h)->chunk) \
+ ? ((h)->next_free = (h)->chunk_limit) : 0), \
+ (h)->object_base = (h)->next_free, \
+ (h)->temp.tempptr)
+
+# define obstack_free(h,obj) \
+( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \
+ ((((h)->temp.tempint > 0 \
+ && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \
+ ? (int) ((h)->next_free = (h)->object_base \
+ = (h)->temp.tempint + (char *) (h)->chunk) \
+ : (((__obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0)))
+
+#endif /* not __GNUC__ or not __STDC__ */
+
+#ifdef __cplusplus
+} /* C++ */
+#endif
+
+#endif /* obstack.h */
diff --git a/gnulib/lib/obstack_printf.c b/gnulib/lib/obstack_printf.c
new file mode 100644
index 0000000..93716c5
--- /dev/null
+++ b/gnulib/lib/obstack_printf.c
@@ -0,0 +1,92 @@
+/* Formatted output to obstacks.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include "obstack.h"
+#include "vasnprintf.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+/* Grow an obstack with formatted output. Return the number of bytes
+ added to OBS. No trailing nul byte is added, and the object should
+ be closed with obstack_finish before use.
+
+ Upon memory allocation error, call obstack_alloc_failed_handler.
+ Upon other error, return -1. */
+int
+obstack_printf (struct obstack *obs, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = obstack_vprintf (obs, format, args);
+ va_end (args);
+ return result;
+}
+
+/* Grow an obstack with formatted output. Return the number of bytes
+ added to OBS. No trailing nul byte is added, and the object should
+ be closed with obstack_finish before use.
+
+ Upon memory allocation error, call obstack_alloc_failed_handler.
+ Upon other error, return -1. */
+int
+obstack_vprintf (struct obstack *obs, const char *format, va_list args)
+{
+ /* If we are close to the end of the current obstack chunk, use a
+ stack-allocated buffer and copy, to reduce the likelihood of a
+ small-size malloc. Otherwise, print directly into the
+ obstack. */
+ enum { CUTOFF = 1024 };
+ char buf[CUTOFF];
+ char *base = obstack_next_free (obs);
+ size_t len = obstack_room (obs);
+ char *str;
+
+ if (len < CUTOFF)
+ {
+ base = buf;
+ len = CUTOFF;
+ }
+ str = vasnprintf (base, &len, format, args);
+ if (!str)
+ {
+ if (errno == ENOMEM)
+ obstack_alloc_failed_handler ();
+ return -1;
+ }
+ if (str == base && str != buf)
+ /* The output was already computed in place, but we need to
+ account for its size. */
+ obstack_blank_fast (obs, len);
+ else
+ {
+ /* The output exceeded available obstack space or we used buf;
+ copy the resulting string. */
+ obstack_grow (obs, str, len);
+ if (str != buf)
+ free (str);
+ }
+ return len;
+}
diff --git a/gnulib/lib/offtostr.c b/gnulib/lib/offtostr.c
new file mode 100644
index 0000000..96082aa
--- /dev/null
+++ b/gnulib/lib/offtostr.c
@@ -0,0 +1,3 @@
+#define anytostr offtostr
+#define inttype off_t
+#include "anytostr.c"
diff --git a/gnulib/lib/open-safer.c b/gnulib/lib/open-safer.c
new file mode 100644
index 0000000..e8c6a1f
--- /dev/null
+++ b/gnulib/lib/open-safer.c
@@ -0,0 +1,46 @@
+/* Invoke open, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include "unistd-safer.h"
+
+int
+open_safer (char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list ap;
+ va_start (ap, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (ap, PROMOTED_MODE_T);
+
+ va_end (ap);
+ }
+
+ return fd_safer (open (file, flags, mode));
+}
diff --git a/gnulib/lib/open.c b/gnulib/lib/open.c
new file mode 100644
index 0000000..8dc36ef
--- /dev/null
+++ b/gnulib/lib/open.c
@@ -0,0 +1,181 @@
+/* Open a descriptor to a file.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+ the system's <fcntl.h> here, so that orig_open doesn't recurse to
+ rpl_open. */
+#define __need_system_fcntl_h
+#include <config.h>
+
+/* Get the original definition of open. It might be defined as a macro. */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+static inline int
+orig_open (const char *filename, int flags, mode_t mode)
+{
+ return open (filename, flags, mode);
+}
+
+/* Specification. */
+/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <fcntl.h> above. */
+#include "fcntl.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+int
+open (const char *filename, int flags, ...)
+{
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+#if GNULIB_defined_O_NONBLOCK
+ /* The only known platform that lacks O_NONBLOCK is mingw, but it
+ also lacks named pipes and Unix sockets, which are the only two
+ file types that require non-blocking handling in open().
+ Therefore, it is safe to ignore O_NONBLOCK here. It is handy
+ that mingw also lacks openat(), so that is also covered here. */
+ flags &= ~O_NONBLOCK;
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and one of O_CREAT, O_WRONLY, O_RDWR
+ is specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/open.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+#endif
+
+ fd = orig_open (filename, flags, mode);
+
+#if REPLACE_FCHDIR
+ /* Implementing fchdir and fdopendir requires the ability to open a
+ directory file descriptor. If open doesn't support that (as on
+ mingw), we use a dummy file that behaves the same as directories
+ on Linux (ie. always reports EOF on attempts to read()), and
+ override fstat() in fchdir.c to hide the fact that we have a
+ dummy. */
+ if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES
+ && ((flags & O_ACCMODE) == O_RDONLY
+ || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH)))
+ {
+ struct stat statbuf;
+ if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
+ {
+ /* Maximum recursion depth of 1. */
+ fd = open ("/dev/null", flags, mode);
+ if (0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+ }
+ else
+ errno = EACCES;
+ }
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+#endif
+
+#if REPLACE_FCHDIR
+ if (!REPLACE_OPEN_DIRECTORY && 0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+#endif
+
+ return fd;
+}
diff --git a/gnulib/lib/openat-die.c b/gnulib/lib/openat-die.c
new file mode 100644
index 0000000..0d0643b
--- /dev/null
+++ b/gnulib/lib/openat-die.c
@@ -0,0 +1,62 @@
+/* Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdlib.h>
+
+#ifndef GNULIB_LIBPOSIX
+# include "error.h"
+#endif
+
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+openat_save_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+ error (exit_failure, errnum,
+ _("unable to record current working directory"));
+#endif
+ /* _Noreturn cannot be applied to error, since it returns
+ when its first argument is 0. To help compilers understand that this
+ function does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
+
+
+/* Exit with an error about failure to restore the working directory
+ during an openat emulation. The caller must ensure that fd 2 is
+ not a just-opened fd, even when openat_safer is not in use. */
+
+void
+openat_restore_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+ error (exit_failure, errnum,
+ _("failed to return to initial working directory"));
+#endif
+
+ /* As above. */
+ abort ();
+}
diff --git a/gnulib/lib/openat-priv.h b/gnulib/lib/openat-priv.h
new file mode 100644
index 0000000..948b220
--- /dev/null
+++ b/gnulib/lib/openat-priv.h
@@ -0,0 +1,64 @@
+/* Internals for openat-like functions.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT_PRIV
+#define _GL_HEADER_OPENAT_PRIV
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+/* Maximum number of bytes that it is safe to allocate as a single
+ array on the stack, and that is known as a compile-time constant.
+ The assumption is that we'll touch the array very quickly, or a
+ temporary very near the array, provoking an out-of-memory trap. On
+ some operating systems, there is only one guard page for the stack,
+ and a page size can be as small as 4096 bytes. Subtract 64 in the
+ hope that this will let the compiler touch a nearby temporary and
+ provoke a trap. */
+#define SAFER_ALLOCA_MAX (4096 - 64)
+
+#define SAFER_ALLOCA(m) ((m) < SAFER_ALLOCA_MAX ? (m) : SAFER_ALLOCA_MAX)
+
+#if defined PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (PATH_MAX)
+#elif defined _XOPEN_PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (_XOPEN_PATH_MAX)
+#else
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (1024)
+#endif
+
+char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
+
+/* Trying to access a BUILD_PROC_NAME file will fail on systems without
+ /proc support, and even on systems *with* ProcFS support. Return
+ nonzero if the failure may be legitimate, e.g., because /proc is not
+ readable, or the particular .../fd/N directory is not present. */
+#define EXPECTED_ERRNO(Errno) \
+ ((Errno) == ENOTDIR || (Errno) == ENOENT \
+ || (Errno) == EPERM || (Errno) == EACCES \
+ || (Errno) == ENOSYS /* Solaris 8 */ \
+ || (Errno) == EOPNOTSUPP /* FreeBSD */)
+
+/* Wrapper function shared among linkat and renameat. */
+int at_func2 (int fd1, char const *file1,
+ int fd2, char const *file2,
+ int (*func) (char const *file1, char const *file2));
+
+#endif /* _GL_HEADER_OPENAT_PRIV */
diff --git a/gnulib/lib/openat-proc.c b/gnulib/lib/openat-proc.c
new file mode 100644
index 0000000..2e2e966
--- /dev/null
+++ b/gnulib/lib/openat-proc.c
@@ -0,0 +1,110 @@
+/* Create /proc/self/fd-related names for subfiles of open directories.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "intprops.h"
+
+/* The results of open() in this file are not used with fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary work in fchdir.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use open_safer. */
+#undef open
+#undef close
+
+#define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/%s"
+
+#define PROC_SELF_FD_NAME_SIZE_BOUND(len) \
+ (sizeof PROC_SELF_FD_FORMAT - sizeof "%d%s" \
+ + INT_STRLEN_BOUND (int) + (len) + 1)
+
+
+/* Set BUF to the expansion of PROC_SELF_FD_FORMAT, using FD and FILE
+ respectively for %d and %s. If successful, return BUF if the
+ result fits in BUF, dynamically allocated memory otherwise. But
+ return NULL if /proc is not reliable, either because the operating
+ system support is lacking or because memory is low. */
+char *
+openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
+{
+ static int proc_status = 0;
+
+ /* Make sure the caller gets ENOENT when appropriate. */
+ if (!*file)
+ {
+ buf[0] = '\0';
+ return buf;
+ }
+
+ if (! proc_status)
+ {
+ /* Set PROC_STATUS to a positive value if /proc/self/fd is
+ reliable, and a negative value otherwise. Solaris 10
+ /proc/self/fd mishandles "..", and any file name might expand
+ to ".." after symbolic link expansion, so avoid /proc/self/fd
+ if it mishandles "..". Solaris 10 has openat, but this
+ problem is exhibited on code that built on Solaris 8 and
+ running on Solaris 10. */
+
+ int proc_self_fd = open ("/proc/self/fd",
+ O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+ if (proc_self_fd < 0)
+ proc_status = -1;
+ else
+ {
+ /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
+ number of a file descriptor open on /proc/self/fd. On Linux,
+ that name resolves to /proc/self/fd, which was opened above.
+ However, on Solaris, it may resolve to /proc/self/fd/fd, which
+ cannot exist, since all names in /proc/self/fd are numeric. */
+ char dotdot_buf[PROC_SELF_FD_NAME_SIZE_BOUND (sizeof "../fd" - 1)];
+ sprintf (dotdot_buf, PROC_SELF_FD_FORMAT, proc_self_fd, "../fd");
+ proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
+ close (proc_self_fd);
+ }
+ }
+
+ if (proc_status < 0)
+ return NULL;
+ else
+ {
+ size_t bufsize = PROC_SELF_FD_NAME_SIZE_BOUND (strlen (file));
+ char *result = buf;
+ if (OPENAT_BUFFER_SIZE < bufsize)
+ {
+ result = malloc (bufsize);
+ if (! result)
+ return NULL;
+ }
+ sprintf (result, PROC_SELF_FD_FORMAT, fd, file);
+ return result;
+ }
+}
diff --git a/gnulib/lib/openat-safer.c b/gnulib/lib/openat-safer.c
new file mode 100644
index 0000000..66f327b
--- /dev/null
+++ b/gnulib/lib/openat-safer.c
@@ -0,0 +1,46 @@
+/* Invoke openat, but avoid some glitches.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert for open, ported by Eric Blake for openat. */
+
+#include <config.h>
+
+#include "fcntl-safer.h"
+
+#include <fcntl.h>
+#include <stdarg.h>
+#include "unistd-safer.h"
+
+int
+openat_safer (int fd, char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list ap;
+ va_start (ap, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (ap, PROMOTED_MODE_T);
+
+ va_end (ap);
+ }
+
+ return fd_safer (openat (fd, file, flags, mode));
+}
diff --git a/gnulib/lib/openat.c b/gnulib/lib/openat.c
new file mode 100644
index 0000000..354ff80
--- /dev/null
+++ b/gnulib/lib/openat.c
@@ -0,0 +1,286 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+ the system's <fcntl.h> here, so that orig_openat doesn't recurse to
+ rpl_openat. */
+#define __need_system_fcntl_h
+#include <config.h>
+
+/* Get the original definition of open. It might be defined as a macro. */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+#if HAVE_OPENAT
+static inline int
+orig_openat (int fd, char const *filename, int flags, mode_t mode)
+{
+ return openat (fd, filename, flags, mode);
+}
+#endif
+
+/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <fcntl.h> above. */
+#include "fcntl.h"
+
+#include "openat.h"
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#if HAVE_OPENAT
+
+/* Like openat, but work around Solaris 9 bugs with trailing slash. */
+int
+rpl_openat (int dfd, char const *filename, int flags, ...)
+{
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+# if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and one of O_CREAT, O_WRONLY, O_RDWR
+ is specified, then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <http://www.opengroup.org/susv3/functions/open.html> says that it
+ fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+# endif
+
+ fd = orig_openat (dfd, filename, flags, mode);
+
+# if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html>
+ says that
+ "A pathname that contains at least one non-slash character and that
+ ends with one or more trailing slashes shall be resolved as if a
+ single dot character ( '.' ) were appended to the pathname."
+ and
+ "The special filename dot shall refer to the directory specified by
+ its predecessor."
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+# endif
+
+ return fd;
+}
+
+#else /* !HAVE_OPENAT */
+
+# include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+/* Replacement for Solaris' openat function.
+ <http://www.google.com/search?q=openat+site:docs.sun.com>
+ First, try to simulate it via open ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it by doing save_cwd/fchdir/open/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, upon failure, set errno and return -1, as openat does.
+ Upon successful completion, return a file descriptor. */
+int
+openat (int fd, char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+ return openat_permissive (fd, file, flags, mode, NULL);
+}
+
+/* Like openat (FD, FILE, FLAGS, MODE), but if CWD_ERRNO is
+ nonnull, set *CWD_ERRNO to an errno value if unable to save
+ or restore the initial working directory. This is needed only
+ the first time remove.c's remove_dir opens a command-line
+ directory argument.
+
+ If a previous attempt to restore the current working directory
+ failed, then we must not even try to access a `.'-relative name.
+ It is the caller's responsibility not to call this function
+ in that case. */
+
+int
+openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno)
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+ bool save_ok;
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return open (file, flags, mode);
+
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, file);
+ if (proc_file)
+ {
+ int open_result = open (proc_file, flags, mode);
+ int open_errno = errno;
+ if (proc_file != buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (0 <= open_result || ! EXPECTED_ERRNO (open_errno))
+ {
+ errno = open_errno;
+ return open_result;
+ }
+ }
+ }
+
+ save_ok = (save_cwd (&saved_cwd) == 0);
+ if (! save_ok)
+ {
+ if (! cwd_errno)
+ openat_save_fail (errno);
+ *cwd_errno = errno;
+ }
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return -1;
+ }
+
+ err = fchdir (fd);
+ saved_errno = errno;
+
+ if (! err)
+ {
+ err = open (file, flags, mode);
+ saved_errno = errno;
+ if (save_ok && restore_cwd (&saved_cwd) != 0)
+ {
+ if (! cwd_errno)
+ {
+ /* Don't write a message to just-created fd 2. */
+ saved_errno = errno;
+ if (err == STDERR_FILENO)
+ close (err);
+ openat_restore_fail (saved_errno);
+ }
+ *cwd_errno = errno;
+ }
+ }
+
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return err;
+}
+
+/* Return true if our openat implementation must resort to
+ using save_cwd and restore_cwd. */
+bool
+openat_needs_fchdir (void)
+{
+ bool needs_fchdir = true;
+ int fd = open ("/", O_SEARCH);
+
+ if (0 <= fd)
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ needs_fchdir = false;
+ if (proc_file != buf)
+ free (proc_file);
+ }
+ close (fd);
+ }
+
+ return needs_fchdir;
+}
+
+#endif /* !HAVE_OPENAT */
diff --git a/gnulib/lib/openat.h b/gnulib/lib/openat.h
new file mode 100644
index 0000000..eae86ce
--- /dev/null
+++ b/gnulib/lib/openat.h
@@ -0,0 +1,104 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT
+#define _GL_HEADER_OPENAT
+
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#if !HAVE_OPENAT
+
+int openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno);
+bool openat_needs_fchdir (void);
+
+#else
+
+# define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
+ openat (Fd, File, Flags, Mode)
+# define openat_needs_fchdir() false
+
+#endif
+
+_Noreturn void openat_restore_fail (int);
+_Noreturn void openat_save_fail (int);
+
+/* Using these function names makes application code
+ slightly more readable than it would be with
+ fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */
+
+#if GNULIB_FCHOWNAT
+
+static inline int
+chownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, 0);
+}
+
+static inline int
+lchownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_FCHMODAT
+
+static inline int
+chmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, 0);
+}
+
+static inline int
+lchmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_FSTATAT
+
+static inline int
+statat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, 0);
+}
+
+static inline int
+lstatat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+/* For now, there are no wrappers named laccessat or leuidaccessat,
+ since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
+ since access rights on symlinks are of limited utility. Likewise,
+ wrappers are not provided for accessat or euidaccessat, so as to
+ avoid dragging in -lgen on some platforms. */
+
+#endif /* _GL_HEADER_OPENAT */
diff --git a/gnulib/lib/opendir-safer.c b/gnulib/lib/opendir-safer.c
new file mode 100644
index 0000000..3726f88
--- /dev/null
+++ b/gnulib/lib/opendir-safer.c
@@ -0,0 +1,76 @@
+/* Invoke opendir, but avoid some glitches.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "dirent-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+/* Like opendir, but do not clobber stdin, stdout, or stderr. */
+
+DIR *
+opendir_safer (char const *name)
+{
+ DIR *dp = opendir (name);
+
+ if (dp)
+ {
+ int fd = dirfd (dp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ /* If fdopendir is native (as on Linux), then it is safe to
+ assume dirfd(fdopendir(n))==n. If we are using the
+ gnulib module fdopendir, then this guarantee is not met,
+ but fdopendir recursively calls opendir_safer up to 3
+ times to at least get a safe fd. If fdopendir is not
+ present but dirfd is accurate (as on cygwin 1.5.x), then
+ we recurse up to 3 times ourselves. Finally, if dirfd
+ always fails (as on mingw), then we are already safe. */
+ DIR *newdp;
+ int e;
+#if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
+ int f = dup_safer (fd);
+ if (f < 0)
+ {
+ e = errno;
+ newdp = NULL;
+ }
+ else
+ {
+ newdp = fdopendir (f);
+ e = errno;
+ if (! newdp)
+ close (f);
+ }
+#else /* !FDOPENDIR */
+ newdp = opendir_safer (name);
+ e = errno;
+#endif
+ closedir (dp);
+ errno = e;
+ dp = newdp;
+ }
+ }
+
+ return dp;
+}
diff --git a/gnulib/lib/opendir.c b/gnulib/lib/opendir.c
new file mode 100644
index 0000000..20ae75e
--- /dev/null
+++ b/gnulib/lib/opendir.c
@@ -0,0 +1,148 @@
+/* Start reading the entries of a directory.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#if HAVE_OPENDIR
+
+/* Override opendir(), to keep track of the open file descriptors.
+ Needed because there is a function dirfd(). */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+# include "filename.h"
+
+#endif
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+DIR *
+opendir (const char *dir_name)
+{
+#if HAVE_OPENDIR
+# undef opendir
+ DIR *dirp;
+
+ dirp = opendir (dir_name);
+ if (dirp == NULL)
+ return NULL;
+
+#else
+
+ char dir_name_mask[MAX_PATH + 1 + 1 + 1];
+ int status;
+ HANDLE current;
+ WIN32_FIND_DATA entry;
+ struct gl_directory *dirp;
+
+ if (dir_name[0] == '\0')
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ /* Make the dir_name absolute, so that we continue reading the same
+ directory if the current directory changed between this opendir()
+ call and a subsequent rewinddir() call. */
+ if (!GetFullPathName (dir_name, MAX_PATH, dir_name_mask, NULL))
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ /* Append the mask.
+ "*" and "*.*" appear to be equivalent. */
+ {
+ char *p;
+
+ p = dir_name_mask + strlen (dir_name_mask);
+ if (p > dir_name_mask && !ISSLASH (p[-1]))
+ *p++ = '\\';
+ *p++ = '*';
+ *p = '\0';
+ }
+
+ /* Start searching the directory. */
+ status = -1;
+ current = FindFirstFile (dir_name_mask, &entry);
+ if (current == INVALID_HANDLE_VALUE)
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_FILE_NOT_FOUND:
+ status = -2;
+ break;
+ case ERROR_PATH_NOT_FOUND:
+ errno = ENOENT;
+ return NULL;
+ case ERROR_DIRECTORY:
+ errno = ENOTDIR;
+ return NULL;
+ case ERROR_ACCESS_DENIED:
+ errno = EACCES;
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+
+ /* Allocate the result. */
+ dirp =
+ (struct gl_directory *)
+ malloc (offsetof (struct gl_directory, dir_name_mask[0])
+ + strlen (dir_name_mask) + 1);
+ if (dirp == NULL)
+ {
+ if (current != INVALID_HANDLE_VALUE)
+ FindClose (current);
+ errno = ENOMEM;
+ return NULL;
+ }
+ dirp->status = status;
+ dirp->current = current;
+ if (status == -1)
+ memcpy (&dirp->entry, &entry, sizeof (WIN32_FIND_DATA));
+ strcpy (dirp->dir_name_mask, dir_name_mask);
+
+#endif
+
+#if REPLACE_FCHDIR
+ {
+ int fd = dirfd (dirp);
+ if (0 <= fd && _gl_register_fd (fd, dir_name) != fd)
+ {
+ int saved_errno = errno;
+ closedir (dirp);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+#endif
+
+ return dirp;
+}
diff --git a/gnulib/lib/openpty.c b/gnulib/lib/openpty.c
new file mode 100644
index 0000000..d9d9773
--- /dev/null
+++ b/gnulib/lib/openpty.c
@@ -0,0 +1,136 @@
+/* Open a pseudo-terminal.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <pty.h>
+
+#if HAVE_OPENPTY
+
+/* Provide a wrapper with the prototype of glibc-2.8 and newer. */
+# undef openpty
+int
+rpl_openpty (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp)
+{
+ /* Cast away const, for implementations with weaker prototypes. */
+ return openpty (amaster, aslave, name, (struct termios *) termp,
+ (struct winsize *) winp);
+}
+
+#elif (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ /* mingw */
+
+# include <errno.h>
+
+int
+openpty (int *amaster _GL_UNUSED, int *aslave _GL_UNUSED,
+ char *name _GL_UNUSED,
+ struct termios const *termp _GL_UNUSED,
+ struct winsize const *winp _GL_UNUSED)
+{
+ /* Mingw lacks pseudo-terminals altogether. */
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10 */
+
+# include <fcntl.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/ioctl.h>
+# include <termios.h>
+# include <unistd.h>
+# if defined __sun || defined __hpux /* Solaris, HP-UX */
+# include <stropts.h>
+# endif
+
+int
+openpty (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp)
+{
+ int master;
+ char *slave_name;
+ int slave;
+
+# if HAVE__GETPTY /* IRIX */
+
+ slave_name = _getpty (&master, O_RDWR, 0622, 0);
+ if (slave_name == NULL)
+ return -1;
+
+# else /* AIX 5.1, HP-UX 11, Solaris 10, mingw */
+
+ /* This call uses the 'posix_openpt' module. */
+ master = posix_openpt (O_RDWR | O_NOCTTY);
+ if (master < 0)
+ return -1;
+
+# endif
+
+ /* This call does not require a dependency to the 'grantpt' module,
+ because AIX, HP-UX, IRIX, Solaris all have the grantpt() function. */
+ if (grantpt (master))
+ goto fail;
+
+ /* This call does not require a dependency to the 'unlockpt' module,
+ because AIX, HP-UX, IRIX, Solaris all have the unlockpt() function. */
+ if (unlockpt (master))
+ goto fail;
+
+# if !HAVE__GETPTY /* !IRIX */
+ slave_name = ptsname (master);
+ if (slave_name == NULL)
+ goto fail;
+# endif
+
+ slave = open (slave_name, O_RDWR | O_NOCTTY);
+ if (slave == -1)
+ goto fail;
+
+# if defined __sun || defined __hpux /* Solaris, HP-UX */
+ if (ioctl (slave, I_PUSH, "ptem") < 0
+ || ioctl (slave, I_PUSH, "ldterm") < 0
+# if defined __sun
+ || ioctl (slave, I_PUSH, "ttcompat") < 0
+# endif
+ )
+ {
+ close (slave);
+ goto fail;
+ }
+# endif
+
+ /* XXX Should we ignore errors here? */
+ if (termp)
+ tcsetattr (slave, TCSAFLUSH, termp);
+ if (winp)
+ ioctl (slave, TIOCSWINSZ, winp);
+
+ *amaster = master;
+ *aslave = slave;
+ if (name != NULL)
+ strcpy (name, slave_name);
+
+ return 0;
+
+ fail:
+ close (master);
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/pagealign_alloc.c b/gnulib/lib/pagealign_alloc.c
new file mode 100644
index 0000000..cfd301a
--- /dev/null
+++ b/gnulib/lib/pagealign_alloc.c
@@ -0,0 +1,197 @@
+/* Memory allocation aligned to system page boundaries.
+
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Derek R. Price <derek@ximbiot.com>. */
+
+#include <config.h>
+
+#include "pagealign_alloc.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#if HAVE_MMAP
+# include <sys/mman.h>
+#endif
+
+#include "error.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if HAVE_MMAP
+/* Define MAP_FILE when it isn't otherwise. */
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+/* Define MAP_FAILED for old systems which neglect to. */
+# ifndef MAP_FAILED
+# define MAP_FAILED ((void *)-1)
+# endif
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#if HAVE_MMAP || ! HAVE_POSIX_MEMALIGN
+
+# if HAVE_MMAP
+/* For each memory region, we store its size. */
+typedef size_t info_t;
+# else
+/* For each memory region, we store the original pointer returned by
+ malloc(). */
+typedef void * info_t;
+# endif
+
+/* A simple linked list of allocated memory regions. It is probably not the
+ most efficient way to store these, but anyway... */
+typedef struct memnode_s memnode_t;
+struct memnode_s
+{
+ void *aligned_ptr;
+ info_t info;
+ memnode_t *next;
+};
+
+/* The list of currently allocated memory regions. */
+static memnode_t *memnode_table = NULL;
+
+
+static void
+new_memnode (void *aligned_ptr, info_t info)
+{
+ memnode_t *new_node = XMALLOC (memnode_t);
+ new_node->aligned_ptr = aligned_ptr;
+ new_node->info = info;
+ new_node->next = memnode_table;
+ memnode_table = new_node;
+}
+
+
+/* Dispose of the memnode containing a map for the ALIGNED_PTR in question
+ and return the content of the node's INFO field. */
+static info_t
+get_memnode (void *aligned_ptr)
+{
+ info_t ret;
+ memnode_t *c;
+ memnode_t **p_next = &memnode_table;
+
+ for (c = *p_next; c != NULL; p_next = &c->next, c = c->next)
+ if (c->aligned_ptr == aligned_ptr)
+ break;
+
+ if (c == NULL)
+ /* An attempt to free untracked memory. A wrong pointer was passed
+ to pagealign_free(). */
+ abort ();
+
+ /* Remove this entry from the list, save the return value, and free it. */
+ *p_next = c->next;
+ ret = c->info;
+ free (c);
+
+ return ret;
+}
+
+#endif /* HAVE_MMAP || !HAVE_POSIX_MEMALIGN */
+
+
+void *
+pagealign_alloc (size_t size)
+{
+ void *ret;
+ /* We prefer the mmap() approach over the posix_memalign() or malloc()
+ based approaches, since the latter often waste an entire memory page
+ per call. */
+#if HAVE_MMAP
+# ifdef HAVE_MAP_ANONYMOUS
+ const int fd = -1;
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+# else /* !HAVE_MAP_ANONYMOUS */
+ static int fd = -1; /* Only open /dev/zero once in order to avoid limiting
+ the amount of memory we may allocate based on the
+ number of open file descriptors. */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ if (fd == -1)
+ {
+ fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd < 0)
+ error (EXIT_FAILURE, errno, _("Failed to open /dev/zero for read"));
+ }
+# endif /* HAVE_MAP_ANONYMOUS */
+ ret = mmap (NULL, size, PROT_READ | PROT_WRITE, flags, fd, 0);
+ if (ret == MAP_FAILED)
+ return NULL;
+ new_memnode (ret, size);
+#elif HAVE_POSIX_MEMALIGN
+ int status = posix_memalign (&ret, getpagesize (), size);
+ if (status)
+ {
+ errno = status;
+ return NULL;
+ }
+#else /* !HAVE_MMAP && !HAVE_POSIX_MEMALIGN */
+ size_t pagesize = getpagesize ();
+ void *unaligned_ptr = malloc (size + pagesize - 1);
+ if (unaligned_ptr == NULL)
+ {
+ /* Set errno. We don't know whether malloc already set errno: some
+ implementations of malloc do, some don't. */
+ errno = ENOMEM;
+ return NULL;
+ }
+ ret = (char *) unaligned_ptr
+ + ((- (unsigned long) unaligned_ptr) & (pagesize - 1));
+ new_memnode (ret, unaligned_ptr);
+#endif /* HAVE_MMAP && HAVE_POSIX_MEMALIGN */
+ return ret;
+}
+
+
+void *
+pagealign_xalloc (size_t size)
+{
+ void *ret;
+
+ ret = pagealign_alloc (size);
+ if (ret == NULL)
+ xalloc_die ();
+ return ret;
+}
+
+
+void
+pagealign_free (void *aligned_ptr)
+{
+#if HAVE_MMAP
+ if (munmap (aligned_ptr, get_memnode (aligned_ptr)) < 0)
+ error (EXIT_FAILURE, errno, "Failed to unmap memory");
+#elif HAVE_POSIX_MEMALIGN
+ free (aligned_ptr);
+#else
+ free (get_memnode (aligned_ptr));
+#endif
+}
diff --git a/gnulib/lib/pagealign_alloc.h b/gnulib/lib/pagealign_alloc.h
new file mode 100644
index 0000000..8d4b285
--- /dev/null
+++ b/gnulib/lib/pagealign_alloc.h
@@ -0,0 +1,54 @@
+/* Memory allocation aligned to system page boundaries.
+
+ Copyright (C) 2005, 2008, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _PAGEALIGN_ALLOC_H
+# define _PAGEALIGN_ALLOC_H
+
+# include <stddef.h>
+
+/* Allocate a block of memory of SIZE bytes, aligned on a system page
+ boundary.
+ If SIZE is not a multiple of the system page size, it will be rounded up
+ to the next multiple.
+ Return a pointer to the start of the memory block. Upon allocation failure,
+ return NULL and set errno. */
+extern void *pagealign_alloc (size_t size)
+# if __GNUC__ >= 3
+ __attribute__ ((__malloc__))
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ __attribute__ ((__alloc_size__ (1)))
+# endif
+# endif
+ ;
+
+/* Like pagealign_alloc, except it exits the program if the allocation
+ fails. */
+extern void *pagealign_xalloc (size_t size)
+# if __GNUC__ >= 3
+ __attribute__ ((__malloc__))
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ __attribute__ ((__alloc_size__ (1)))
+# endif
+# endif
+ ;
+
+/* Free a memory block.
+ PTR must be a non-NULL pointer returned by pagealign_alloc or
+ pagealign_xalloc. */
+extern void pagealign_free (void *ptr);
+
+#endif /* _PAGEALIGN_ALLOC_H */
diff --git a/gnulib/lib/parse-datetime.h b/gnulib/lib/parse-datetime.h
new file mode 100644
index 0000000..e1df247
--- /dev/null
+++ b/gnulib/lib/parse-datetime.h
@@ -0,0 +1,22 @@
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1995, 1997-1998, 2003-2004, 2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <time.h>
+
+bool parse_datetime (struct timespec *, char const *, struct timespec const *);
diff --git a/gnulib/lib/parse-datetime.y b/gnulib/lib/parse-datetime.y
new file mode 100644
index 0000000..5621adc
--- /dev/null
+++ b/gnulib/lib/parse-datetime.y
@@ -0,0 +1,1617 @@
+%{
+/* Parse a string into an internal time stamp.
+
+ Copyright (C) 1999-2000, 2002-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Originally written by Steven M. Bellovin <smb@research.att.com> while
+ at the University of North Carolina at Chapel Hill. Later tweaked by
+ a couple of people on Usenet. Completely overhauled by Rich $alz
+ <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+
+ Modified by Paul Eggert <eggert@twinsun.com> in August 1999 to do
+ the right thing about local DST. Also modified by Paul Eggert
+ <eggert@cs.ucla.edu> in February 2004 to support
+ nanosecond-resolution time stamps, and in October 2004 to support
+ TZ strings in dates. */
+
+/* FIXME: Check for arithmetic overflow in all cases, not just
+ some of them. */
+
+#include <config.h>
+
+#include "parse-datetime.h"
+
+#include "intprops.h"
+#include "timespec.h"
+#include "verify.h"
+
+/* There's no need to extend the stack, so there's no need to involve
+ alloca. */
+#define YYSTACK_USE_ALLOCA 0
+
+/* Tell Bison how much stack space is needed. 20 should be plenty for
+ this grammar, which is not right recursive. Beware setting it too
+ high, since that might cause problems on machines whose
+ implementations have lame stack-overflow checking. */
+#define YYMAXDEPTH 20
+#define YYINITDEPTH YYMAXDEPTH
+
+/* Since the code of parse-datetime.y is not included in the Emacs executable
+ itself, there is no need to #define static in this file. Even if
+ the code were included in the Emacs executable, it probably
+ wouldn't do any harm to #undef it here; this will only cause
+ problems if we try to write to a static variable, which I don't
+ think this code needs to do. */
+#ifdef emacs
+# undef static
+#endif
+
+#include <c-ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+/* Bison's skeleton tests _STDLIB_H, while some stdlib.h headers
+ use _STDLIB_H_ as witness. Map the latter to the one bison uses. */
+/* FIXME: this is temporary. Remove when we have a mechanism to ensure
+ that the version we're using is fixed, too. */
+#ifdef _STDLIB_H_
+# undef _STDLIB_H
+# define _STDLIB_H 1
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+
+#define HOUR(x) ((x) * 60)
+
+/* long_time_t is a signed integer type that contains all time_t values. */
+verify (TYPE_IS_INTEGER (time_t));
+#if TIME_T_FITS_IN_LONG_INT
+typedef long int long_time_t;
+#else
+typedef time_t long_time_t;
+#endif
+
+/* Lots of this code assumes time_t and time_t-like values fit into
+ long_time_t. */
+verify (TYPE_MINIMUM (long_time_t) <= TYPE_MINIMUM (time_t)
+ && TYPE_MAXIMUM (time_t) <= TYPE_MAXIMUM (long_time_t));
+
+/* FIXME: It also assumes that signed integer overflow silently wraps around,
+ but this is not true any more with recent versions of GCC 4. */
+
+/* An integer value, and the number of digits in its textual
+ representation. */
+typedef struct
+{
+ bool negative;
+ long int value;
+ size_t digits;
+} textint;
+
+/* An entry in the lexical lookup table. */
+typedef struct
+{
+ char const *name;
+ int type;
+ int value;
+} table;
+
+/* Meridian: am, pm, or 24-hour style. */
+enum { MERam, MERpm, MER24 };
+
+enum { BILLION = 1000000000, LOG10_BILLION = 9 };
+
+/* Relative times. */
+typedef struct
+{
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ long int year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ long_time_t seconds;
+ long int ns;
+} relative_time;
+
+#if HAVE_COMPOUND_LITERALS
+# define RELATIVE_TIME_0 ((relative_time) { 0, 0, 0, 0, 0, 0, 0 })
+#else
+static relative_time const RELATIVE_TIME_0;
+#endif
+
+/* Information passed to and from the parser. */
+typedef struct
+{
+ /* The input string remaining to be parsed. */
+ const char *input;
+
+ /* N, if this is the Nth Tuesday. */
+ long int day_ordinal;
+
+ /* Day of week; Sunday is 0. */
+ int day_number;
+
+ /* tm_isdst flag for the local zone. */
+ int local_isdst;
+
+ /* Time zone, in minutes east of UTC. */
+ long int time_zone;
+
+ /* Style used for time. */
+ int meridian;
+
+ /* Gregorian year, month, day, hour, minutes, seconds, and nanoseconds. */
+ textint year;
+ long int month;
+ long int day;
+ long int hour;
+ long int minutes;
+ struct timespec seconds; /* includes nanoseconds */
+
+ /* Relative year, month, day, hour, minutes, seconds, and nanoseconds. */
+ relative_time rel;
+
+ /* Presence or counts of nonterminals of various flavors parsed so far. */
+ bool timespec_seen;
+ bool rels_seen;
+ size_t dates_seen;
+ size_t days_seen;
+ size_t local_zones_seen;
+ size_t dsts_seen;
+ size_t times_seen;
+ size_t zones_seen;
+
+ /* Table of local time zone abbrevations, terminated by a null entry. */
+ table local_time_zone_table[3];
+} parser_control;
+
+union YYSTYPE;
+static int yylex (union YYSTYPE *, parser_control *);
+static int yyerror (parser_control const *, char const *);
+static long int time_zone_hhmm (parser_control *, textint, long int);
+
+/* Extract into *PC any date and time info from a string of digits
+ of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY,
+ YYYY, ...). */
+static void
+digits_to_date_time (parser_control *pc, textint text_int)
+{
+ if (pc->dates_seen && ! pc->year.digits
+ && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits))
+ pc->year = text_int;
+ else
+ {
+ if (4 < text_int.digits)
+ {
+ pc->dates_seen++;
+ pc->day = text_int.value % 100;
+ pc->month = (text_int.value / 100) % 100;
+ pc->year.value = text_int.value / 10000;
+ pc->year.digits = text_int.digits - 4;
+ }
+ else
+ {
+ pc->times_seen++;
+ if (text_int.digits <= 2)
+ {
+ pc->hour = text_int.value;
+ pc->minutes = 0;
+ }
+ else
+ {
+ pc->hour = text_int.value / 100;
+ pc->minutes = text_int.value % 100;
+ }
+ pc->seconds.tv_sec = 0;
+ pc->seconds.tv_nsec = 0;
+ pc->meridian = MER24;
+ }
+ }
+}
+
+/* Increment PC->rel by FACTOR * REL (FACTOR is 1 or -1). */
+static void
+apply_relative_time (parser_control *pc, relative_time rel, int factor)
+{
+ pc->rel.ns += factor * rel.ns;
+ pc->rel.seconds += factor * rel.seconds;
+ pc->rel.minutes += factor * rel.minutes;
+ pc->rel.hour += factor * rel.hour;
+ pc->rel.day += factor * rel.day;
+ pc->rel.month += factor * rel.month;
+ pc->rel.year += factor * rel.year;
+ pc->rels_seen = true;
+}
+
+/* Set PC-> hour, minutes, seconds and nanoseconds members from arguments. */
+static void
+set_hhmmss (parser_control *pc, long int hour, long int minutes,
+ time_t sec, long int nsec)
+{
+ pc->hour = hour;
+ pc->minutes = minutes;
+ pc->seconds.tv_sec = sec;
+ pc->seconds.tv_nsec = nsec;
+}
+
+%}
+
+/* We want a reentrant parser, even if the TZ manipulation and the calls to
+ localtime and gmtime are not reentrant. */
+%pure-parser
+%parse-param { parser_control *pc }
+%lex-param { parser_control *pc }
+
+/* This grammar has 31 shift/reduce conflicts. */
+%expect 31
+
+%union
+{
+ long int intval;
+ textint textintval;
+ struct timespec timespec;
+ relative_time rel;
+}
+
+%token <intval> tAGO
+%token tDST
+
+%token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT
+%token <intval> tDAY_UNIT tDAY_SHIFT
+
+%token <intval> tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN
+%token <intval> tMONTH tORDINAL tZONE
+
+%token <textintval> tSNUMBER tUNUMBER
+%token <timespec> tSDECIMAL_NUMBER tUDECIMAL_NUMBER
+
+%type <intval> o_colon_minutes
+%type <timespec> seconds signed_seconds unsigned_seconds
+
+%type <rel> relunit relunit_snumber dayshift
+
+%%
+
+spec:
+ timespec
+ | items
+ ;
+
+timespec:
+ '@' seconds
+ {
+ pc->seconds = $2;
+ pc->timespec_seen = true;
+ }
+ ;
+
+items:
+ /* empty */
+ | items item
+ ;
+
+item:
+ datetime
+ { pc->times_seen++; pc->dates_seen++; }
+ | time
+ { pc->times_seen++; }
+ | local_zone
+ { pc->local_zones_seen++; }
+ | zone
+ { pc->zones_seen++; }
+ | date
+ { pc->dates_seen++; }
+ | day
+ { pc->days_seen++; }
+ | rel
+ | number
+ | hybrid
+ ;
+
+datetime:
+ iso_8601_datetime
+ ;
+
+iso_8601_datetime:
+ iso_8601_date 'T' iso_8601_time
+ ;
+
+time:
+ tUNUMBER tMERIDIAN
+ {
+ set_hhmmss (pc, $1.value, 0, 0, 0);
+ pc->meridian = $2;
+ }
+ | tUNUMBER ':' tUNUMBER tMERIDIAN
+ {
+ set_hhmmss (pc, $1.value, $3.value, 0, 0);
+ pc->meridian = $4;
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tMERIDIAN
+ {
+ set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
+ pc->meridian = $6;
+ }
+ | iso_8601_time
+ ;
+
+iso_8601_time:
+ tUNUMBER zone_offset
+ {
+ set_hhmmss (pc, $1.value, 0, 0, 0);
+ pc->meridian = MER24;
+ }
+ | tUNUMBER ':' tUNUMBER o_zone_offset
+ {
+ set_hhmmss (pc, $1.value, $3.value, 0, 0);
+ pc->meridian = MER24;
+ }
+ | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_zone_offset
+ {
+ set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
+ pc->meridian = MER24;
+ }
+ ;
+
+o_zone_offset:
+ /* empty */
+ | zone_offset
+ ;
+
+zone_offset:
+ tSNUMBER o_colon_minutes
+ {
+ pc->zones_seen++;
+ pc->time_zone = time_zone_hhmm (pc, $1, $2);
+ }
+ ;
+
+local_zone:
+ tLOCAL_ZONE
+ {
+ pc->local_isdst = $1;
+ pc->dsts_seen += (0 < $1);
+ }
+ | tLOCAL_ZONE tDST
+ {
+ pc->local_isdst = 1;
+ pc->dsts_seen += (0 < $1) + 1;
+ }
+ ;
+
+/* Note 'T' is a special case, as it is used as the separator in ISO
+ 8601 date and time of day representation. */
+zone:
+ tZONE
+ { pc->time_zone = $1; }
+ | 'T'
+ { pc->time_zone = HOUR(7); }
+ | tZONE relunit_snumber
+ { pc->time_zone = $1;
+ apply_relative_time (pc, $2, 1); }
+ | 'T' relunit_snumber
+ { pc->time_zone = HOUR(7);
+ apply_relative_time (pc, $2, 1); }
+ | tZONE tSNUMBER o_colon_minutes
+ { pc->time_zone = $1 + time_zone_hhmm (pc, $2, $3); }
+ | tDAYZONE
+ { pc->time_zone = $1 + 60; }
+ | tZONE tDST
+ { pc->time_zone = $1 + 60; }
+ ;
+
+day:
+ tDAY
+ {
+ pc->day_ordinal = 0;
+ pc->day_number = $1;
+ }
+ | tDAY ','
+ {
+ pc->day_ordinal = 0;
+ pc->day_number = $1;
+ }
+ | tORDINAL tDAY
+ {
+ pc->day_ordinal = $1;
+ pc->day_number = $2;
+ }
+ | tUNUMBER tDAY
+ {
+ pc->day_ordinal = $1.value;
+ pc->day_number = $2;
+ }
+ ;
+
+date:
+ tUNUMBER '/' tUNUMBER
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ }
+ | tUNUMBER '/' tUNUMBER '/' tUNUMBER
+ {
+ /* Interpret as YYYY/MM/DD if the first value has 4 or more digits,
+ otherwise as MM/DD/YY.
+ The goal in recognizing YYYY/MM/DD is solely to support legacy
+ machine-generated dates like those in an RCS log listing. If
+ you want portability, use the ISO 8601 format. */
+ if (4 <= $1.digits)
+ {
+ pc->year = $1;
+ pc->month = $3.value;
+ pc->day = $5.value;
+ }
+ else
+ {
+ pc->month = $1.value;
+ pc->day = $3.value;
+ pc->year = $5;
+ }
+ }
+ | tUNUMBER tMONTH tSNUMBER
+ {
+ /* e.g. 17-JUN-1992. */
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tSNUMBER tSNUMBER
+ {
+ /* e.g. JUN-17-1992. */
+ pc->month = $1;
+ pc->day = -$2.value;
+ pc->year.value = -$3.value;
+ pc->year.digits = $3.digits;
+ }
+ | tMONTH tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ }
+ | tMONTH tUNUMBER ',' tUNUMBER
+ {
+ pc->month = $1;
+ pc->day = $2.value;
+ pc->year = $4;
+ }
+ | tUNUMBER tMONTH
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ }
+ | tUNUMBER tMONTH tUNUMBER
+ {
+ pc->day = $1.value;
+ pc->month = $2;
+ pc->year = $3;
+ }
+ | iso_8601_date
+ ;
+
+iso_8601_date:
+ tUNUMBER tSNUMBER tSNUMBER
+ {
+ /* ISO 8601 format. YYYY-MM-DD. */
+ pc->year = $1;
+ pc->month = -$2.value;
+ pc->day = -$3.value;
+ }
+ ;
+
+rel:
+ relunit tAGO
+ { apply_relative_time (pc, $1, $2); }
+ | relunit
+ { apply_relative_time (pc, $1, 1); }
+ | dayshift
+ { apply_relative_time (pc, $1, 1); }
+ ;
+
+relunit:
+ tORDINAL tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1; }
+ | tUNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = 1; }
+ | tORDINAL tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1; }
+ | tUNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = 1; }
+ | tORDINAL tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1 * $2; }
+ | tUNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1; }
+ | tORDINAL tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1; }
+ | tUNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = 1; }
+ | tORDINAL tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1; }
+ | tUNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = 1; }
+ | tORDINAL tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1; }
+ | tUNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ | tSDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tUDECIMAL_NUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.tv_sec; $$.ns = $1.tv_nsec; }
+ | tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = 1; }
+ | relunit_snumber
+ ;
+
+relunit_snumber:
+ tSNUMBER tYEAR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.year = $1.value; }
+ | tSNUMBER tMONTH_UNIT
+ { $$ = RELATIVE_TIME_0; $$.month = $1.value; }
+ | tSNUMBER tDAY_UNIT
+ { $$ = RELATIVE_TIME_0; $$.day = $1.value * $2; }
+ | tSNUMBER tHOUR_UNIT
+ { $$ = RELATIVE_TIME_0; $$.hour = $1.value; }
+ | tSNUMBER tMINUTE_UNIT
+ { $$ = RELATIVE_TIME_0; $$.minutes = $1.value; }
+ | tSNUMBER tSEC_UNIT
+ { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
+ ;
+
+dayshift:
+ tDAY_SHIFT
+ { $$ = RELATIVE_TIME_0; $$.day = $1; }
+ ;
+
+seconds: signed_seconds | unsigned_seconds;
+
+signed_seconds:
+ tSDECIMAL_NUMBER
+ | tSNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+unsigned_seconds:
+ tUDECIMAL_NUMBER
+ | tUNUMBER
+ { $$.tv_sec = $1.value; $$.tv_nsec = 0; }
+ ;
+
+number:
+ tUNUMBER
+ { digits_to_date_time (pc, $1); }
+ ;
+
+hybrid:
+ tUNUMBER relunit_snumber
+ {
+ /* Hybrid all-digit and relative offset, so that we accept e.g.,
+ "YYYYMMDD +N days" as well as "YYYYMMDD N days". */
+ digits_to_date_time (pc, $1);
+ apply_relative_time (pc, $2, 1);
+ }
+ ;
+
+o_colon_minutes:
+ /* empty */
+ { $$ = -1; }
+ | ':' tUNUMBER
+ { $$ = $2.value; }
+ ;
+
+%%
+
+static table const meridian_table[] =
+{
+ { "AM", tMERIDIAN, MERam },
+ { "A.M.", tMERIDIAN, MERam },
+ { "PM", tMERIDIAN, MERpm },
+ { "P.M.", tMERIDIAN, MERpm },
+ { NULL, 0, 0 }
+};
+
+static table const dst_table[] =
+{
+ { "DST", tDST, 0 }
+};
+
+static table const month_and_day_table[] =
+{
+ { "JANUARY", tMONTH, 1 },
+ { "FEBRUARY", tMONTH, 2 },
+ { "MARCH", tMONTH, 3 },
+ { "APRIL", tMONTH, 4 },
+ { "MAY", tMONTH, 5 },
+ { "JUNE", tMONTH, 6 },
+ { "JULY", tMONTH, 7 },
+ { "AUGUST", tMONTH, 8 },
+ { "SEPTEMBER",tMONTH, 9 },
+ { "SEPT", tMONTH, 9 },
+ { "OCTOBER", tMONTH, 10 },
+ { "NOVEMBER", tMONTH, 11 },
+ { "DECEMBER", tMONTH, 12 },
+ { "SUNDAY", tDAY, 0 },
+ { "MONDAY", tDAY, 1 },
+ { "TUESDAY", tDAY, 2 },
+ { "TUES", tDAY, 2 },
+ { "WEDNESDAY",tDAY, 3 },
+ { "WEDNES", tDAY, 3 },
+ { "THURSDAY", tDAY, 4 },
+ { "THUR", tDAY, 4 },
+ { "THURS", tDAY, 4 },
+ { "FRIDAY", tDAY, 5 },
+ { "SATURDAY", tDAY, 6 },
+ { NULL, 0, 0 }
+};
+
+static table const time_units_table[] =
+{
+ { "YEAR", tYEAR_UNIT, 1 },
+ { "MONTH", tMONTH_UNIT, 1 },
+ { "FORTNIGHT",tDAY_UNIT, 14 },
+ { "WEEK", tDAY_UNIT, 7 },
+ { "DAY", tDAY_UNIT, 1 },
+ { "HOUR", tHOUR_UNIT, 1 },
+ { "MINUTE", tMINUTE_UNIT, 1 },
+ { "MIN", tMINUTE_UNIT, 1 },
+ { "SECOND", tSEC_UNIT, 1 },
+ { "SEC", tSEC_UNIT, 1 },
+ { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static table const relative_time_table[] =
+{
+ { "TOMORROW", tDAY_SHIFT, 1 },
+ { "YESTERDAY",tDAY_SHIFT, -1 },
+ { "TODAY", tDAY_SHIFT, 0 },
+ { "NOW", tDAY_SHIFT, 0 },
+ { "LAST", tORDINAL, -1 },
+ { "THIS", tORDINAL, 0 },
+ { "NEXT", tORDINAL, 1 },
+ { "FIRST", tORDINAL, 1 },
+/*{ "SECOND", tORDINAL, 2 }, */
+ { "THIRD", tORDINAL, 3 },
+ { "FOURTH", tORDINAL, 4 },
+ { "FIFTH", tORDINAL, 5 },
+ { "SIXTH", tORDINAL, 6 },
+ { "SEVENTH", tORDINAL, 7 },
+ { "EIGHTH", tORDINAL, 8 },
+ { "NINTH", tORDINAL, 9 },
+ { "TENTH", tORDINAL, 10 },
+ { "ELEVENTH", tORDINAL, 11 },
+ { "TWELFTH", tORDINAL, 12 },
+ { "AGO", tAGO, -1 },
+ { "HENCE", tAGO, 1 },
+ { NULL, 0, 0 }
+};
+
+/* The universal time zone table. These labels can be used even for
+ time stamps that would not otherwise be valid, e.g., GMT time
+ stamps in London during summer. */
+static table const universal_time_zone_table[] =
+{
+ { "GMT", tZONE, HOUR ( 0) }, /* Greenwich Mean */
+ { "UT", tZONE, HOUR ( 0) }, /* Universal (Coordinated) */
+ { "UTC", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+/* The time zone table. This table is necessarily incomplete, as time
+ zone abbreviations are ambiguous; e.g. Australians interpret "EST"
+ as Eastern time in Australia, not as US Eastern Standard Time.
+ You cannot rely on parse_datetime to handle arbitrary time zone
+ abbreviations; use numeric abbreviations like `-0500' instead. */
+static table const time_zone_table[] =
+{
+ { "WET", tZONE, HOUR ( 0) }, /* Western European */
+ { "WEST", tDAYZONE, HOUR ( 0) }, /* Western European Summer */
+ { "BST", tDAYZONE, HOUR ( 0) }, /* British Summer */
+ { "ART", tZONE, -HOUR ( 3) }, /* Argentina */
+ { "BRT", tZONE, -HOUR ( 3) }, /* Brazil */
+ { "BRST", tDAYZONE, -HOUR ( 3) }, /* Brazil Summer */
+ { "NST", tZONE, -(HOUR ( 3) + 30) }, /* Newfoundland Standard */
+ { "NDT", tDAYZONE,-(HOUR ( 3) + 30) }, /* Newfoundland Daylight */
+ { "AST", tZONE, -HOUR ( 4) }, /* Atlantic Standard */
+ { "ADT", tDAYZONE, -HOUR ( 4) }, /* Atlantic Daylight */
+ { "CLT", tZONE, -HOUR ( 4) }, /* Chile */
+ { "CLST", tDAYZONE, -HOUR ( 4) }, /* Chile Summer */
+ { "EST", tZONE, -HOUR ( 5) }, /* Eastern Standard */
+ { "EDT", tDAYZONE, -HOUR ( 5) }, /* Eastern Daylight */
+ { "CST", tZONE, -HOUR ( 6) }, /* Central Standard */
+ { "CDT", tDAYZONE, -HOUR ( 6) }, /* Central Daylight */
+ { "MST", tZONE, -HOUR ( 7) }, /* Mountain Standard */
+ { "MDT", tDAYZONE, -HOUR ( 7) }, /* Mountain Daylight */
+ { "PST", tZONE, -HOUR ( 8) }, /* Pacific Standard */
+ { "PDT", tDAYZONE, -HOUR ( 8) }, /* Pacific Daylight */
+ { "AKST", tZONE, -HOUR ( 9) }, /* Alaska Standard */
+ { "AKDT", tDAYZONE, -HOUR ( 9) }, /* Alaska Daylight */
+ { "HST", tZONE, -HOUR (10) }, /* Hawaii Standard */
+ { "HAST", tZONE, -HOUR (10) }, /* Hawaii-Aleutian Standard */
+ { "HADT", tDAYZONE, -HOUR (10) }, /* Hawaii-Aleutian Daylight */
+ { "SST", tZONE, -HOUR (12) }, /* Samoa Standard */
+ { "WAT", tZONE, HOUR ( 1) }, /* West Africa */
+ { "CET", tZONE, HOUR ( 1) }, /* Central European */
+ { "CEST", tDAYZONE, HOUR ( 1) }, /* Central European Summer */
+ { "MET", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEZ", tZONE, HOUR ( 1) }, /* Middle European */
+ { "MEST", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "MESZ", tDAYZONE, HOUR ( 1) }, /* Middle European Summer */
+ { "EET", tZONE, HOUR ( 2) }, /* Eastern European */
+ { "EEST", tDAYZONE, HOUR ( 2) }, /* Eastern European Summer */
+ { "CAT", tZONE, HOUR ( 2) }, /* Central Africa */
+ { "SAST", tZONE, HOUR ( 2) }, /* South Africa Standard */
+ { "EAT", tZONE, HOUR ( 3) }, /* East Africa */
+ { "MSK", tZONE, HOUR ( 3) }, /* Moscow */
+ { "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */
+ { "IST", tZONE, (HOUR ( 5) + 30) }, /* India Standard */
+ { "SGT", tZONE, HOUR ( 8) }, /* Singapore */
+ { "KST", tZONE, HOUR ( 9) }, /* Korea Standard */
+ { "JST", tZONE, HOUR ( 9) }, /* Japan Standard */
+ { "GST", tZONE, HOUR (10) }, /* Guam Standard */
+ { "NZST", tZONE, HOUR (12) }, /* New Zealand Standard */
+ { "NZDT", tDAYZONE, HOUR (12) }, /* New Zealand Daylight */
+ { NULL, 0, 0 }
+};
+
+/* Military time zone table.
+
+ Note 'T' is a special case, as it is used as the separator in ISO
+ 8601 date and time of day representation. */
+static table const military_table[] =
+{
+ { "A", tZONE, -HOUR ( 1) },
+ { "B", tZONE, -HOUR ( 2) },
+ { "C", tZONE, -HOUR ( 3) },
+ { "D", tZONE, -HOUR ( 4) },
+ { "E", tZONE, -HOUR ( 5) },
+ { "F", tZONE, -HOUR ( 6) },
+ { "G", tZONE, -HOUR ( 7) },
+ { "H", tZONE, -HOUR ( 8) },
+ { "I", tZONE, -HOUR ( 9) },
+ { "K", tZONE, -HOUR (10) },
+ { "L", tZONE, -HOUR (11) },
+ { "M", tZONE, -HOUR (12) },
+ { "N", tZONE, HOUR ( 1) },
+ { "O", tZONE, HOUR ( 2) },
+ { "P", tZONE, HOUR ( 3) },
+ { "Q", tZONE, HOUR ( 4) },
+ { "R", tZONE, HOUR ( 5) },
+ { "S", tZONE, HOUR ( 6) },
+ { "T", 'T', 0 },
+ { "U", tZONE, HOUR ( 8) },
+ { "V", tZONE, HOUR ( 9) },
+ { "W", tZONE, HOUR (10) },
+ { "X", tZONE, HOUR (11) },
+ { "Y", tZONE, HOUR (12) },
+ { "Z", tZONE, HOUR ( 0) },
+ { NULL, 0, 0 }
+};
+
+
+
+/* Convert a time zone expressed as HH:MM into an integer count of
+ minutes. If MM is negative, then S is of the form HHMM and needs
+ to be picked apart; otherwise, S is of the form HH. As specified in
+ http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
+ only valid TZ range, and consider first two digits as hours, if no
+ minutes specified. */
+
+static long int
+time_zone_hhmm (parser_control *pc, textint s, long int mm)
+{
+ long int n_minutes;
+
+ /* If the length of S is 1 or 2 and no minutes are specified,
+ interpret it as a number of hours. */
+ if (s.digits <= 2 && mm < 0)
+ s.value *= 100;
+
+ if (mm < 0)
+ n_minutes = (s.value / 100) * 60 + s.value % 100;
+ else
+ n_minutes = s.value * 60 + (s.negative ? -mm : mm);
+
+ /* If the absolute number of minutes is larger than 24 hours,
+ arrange to reject it by incrementing pc->zones_seen. Thus,
+ we allow only values in the range UTC-24:00 to UTC+24:00. */
+ if (24 * 60 < abs (n_minutes))
+ pc->zones_seen++;
+
+ return n_minutes;
+}
+
+static int
+to_hour (long int hours, int meridian)
+{
+ switch (meridian)
+ {
+ default: /* Pacify GCC. */
+ case MER24:
+ return 0 <= hours && hours < 24 ? hours : -1;
+ case MERam:
+ return 0 < hours && hours < 12 ? hours : hours == 12 ? 0 : -1;
+ case MERpm:
+ return 0 < hours && hours < 12 ? hours + 12 : hours == 12 ? 12 : -1;
+ }
+}
+
+static long int
+to_year (textint textyear)
+{
+ long int year = textyear.value;
+
+ if (year < 0)
+ year = -year;
+
+ /* XPG4 suggests that years 00-68 map to 2000-2068, and
+ years 69-99 map to 1969-1999. */
+ else if (textyear.digits == 2)
+ year += year < 69 ? 2000 : 1900;
+
+ return year;
+}
+
+static table const * _GL_ATTRIBUTE_PURE
+lookup_zone (parser_control const *pc, char const *name)
+{
+ table const *tp;
+
+ for (tp = universal_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ /* Try local zone abbreviations before those in time_zone_table, as
+ the local ones are more likely to be right. */
+ for (tp = pc->local_time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ for (tp = time_zone_table; tp->name; tp++)
+ if (strcmp (name, tp->name) == 0)
+ return tp;
+
+ return NULL;
+}
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds.
+ The body of this function is taken directly from the GNU C Library;
+ see src/strftime.c. */
+static long int
+tm_diff (struct tm const *a, struct tm const *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ long int ayear = a->tm_year;
+ long int years = ayear - b->tm_year;
+ long int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+static table const *
+lookup_word (parser_control const *pc, char *word)
+{
+ char *p;
+ char *q;
+ size_t wordlen;
+ table const *tp;
+ bool period_found;
+ bool abbrev;
+
+ /* Make it uppercase. */
+ for (p = word; *p; p++)
+ {
+ unsigned char ch = *p;
+ *p = c_toupper (ch);
+ }
+
+ for (tp = meridian_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* See if we have an abbreviation for a month. */
+ wordlen = strlen (word);
+ abbrev = wordlen == 3 || (wordlen == 4 && word[3] == '.');
+
+ for (tp = month_and_day_table; tp->name; tp++)
+ if ((abbrev ? strncmp (word, tp->name, 3) : strcmp (word, tp->name)) == 0)
+ return tp;
+
+ if ((tp = lookup_zone (pc, word)))
+ return tp;
+
+ if (strcmp (word, dst_table[0].name) == 0)
+ return dst_table;
+
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Strip off any plural and try the units table again. */
+ if (word[wordlen - 1] == 'S')
+ {
+ word[wordlen - 1] = '\0';
+ for (tp = time_units_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+ word[wordlen - 1] = 'S'; /* For "this" in relative_time_table. */
+ }
+
+ for (tp = relative_time_table; tp->name; tp++)
+ if (strcmp (word, tp->name) == 0)
+ return tp;
+
+ /* Military time zones. */
+ if (wordlen == 1)
+ for (tp = military_table; tp->name; tp++)
+ if (word[0] == tp->name[0])
+ return tp;
+
+ /* Drop out any periods and try the time zone table again. */
+ for (period_found = false, p = q = word; (*p = *q); q++)
+ if (*q == '.')
+ period_found = true;
+ else
+ p++;
+ if (period_found && (tp = lookup_zone (pc, word)))
+ return tp;
+
+ return NULL;
+}
+
+static int
+yylex (YYSTYPE *lvalp, parser_control *pc)
+{
+ unsigned char c;
+ size_t count;
+
+ for (;;)
+ {
+ while (c = *pc->input, c_isspace (c))
+ pc->input++;
+
+ if (ISDIGIT (c) || c == '-' || c == '+')
+ {
+ char const *p;
+ int sign;
+ unsigned long int value;
+ if (c == '-' || c == '+')
+ {
+ sign = c == '-' ? -1 : 1;
+ while (c = *++pc->input, c_isspace (c))
+ continue;
+ if (! ISDIGIT (c))
+ /* skip the '-' sign */
+ continue;
+ }
+ else
+ sign = 0;
+ p = pc->input;
+ for (value = 0; ; value *= 10)
+ {
+ unsigned long int value1 = value + (c - '0');
+ if (value1 < value)
+ return '?';
+ value = value1;
+ c = *++p;
+ if (! ISDIGIT (c))
+ break;
+ if (ULONG_MAX / 10 < value)
+ return '?';
+ }
+ if ((c == '.' || c == ',') && ISDIGIT (p[1]))
+ {
+ time_t s;
+ int ns;
+ int digits;
+ unsigned long int value1;
+
+ /* Check for overflow when converting value to time_t. */
+ if (sign < 0)
+ {
+ s = - value;
+ if (0 < s)
+ return '?';
+ value1 = -s;
+ }
+ else
+ {
+ s = value;
+ if (s < 0)
+ return '?';
+ value1 = s;
+ }
+ if (value != value1)
+ return '?';
+
+ /* Accumulate fraction, to ns precision. */
+ p++;
+ ns = *p++ - '0';
+ for (digits = 2; digits <= LOG10_BILLION; digits++)
+ {
+ ns *= 10;
+ if (ISDIGIT (*p))
+ ns += *p++ - '0';
+ }
+
+ /* Skip excess digits, truncating toward -Infinity. */
+ if (sign < 0)
+ for (; ISDIGIT (*p); p++)
+ if (*p != '0')
+ {
+ ns++;
+ break;
+ }
+ while (ISDIGIT (*p))
+ p++;
+
+ /* Adjust to the timespec convention, which is that
+ tv_nsec is always a positive offset even if tv_sec is
+ negative. */
+ if (sign < 0 && ns)
+ {
+ s--;
+ if (! (s < 0))
+ return '?';
+ ns = BILLION - ns;
+ }
+
+ lvalp->timespec.tv_sec = s;
+ lvalp->timespec.tv_nsec = ns;
+ pc->input = p;
+ return sign ? tSDECIMAL_NUMBER : tUDECIMAL_NUMBER;
+ }
+ else
+ {
+ lvalp->textintval.negative = sign < 0;
+ if (sign < 0)
+ {
+ lvalp->textintval.value = - value;
+ if (0 < lvalp->textintval.value)
+ return '?';
+ }
+ else
+ {
+ lvalp->textintval.value = value;
+ if (lvalp->textintval.value < 0)
+ return '?';
+ }
+ lvalp->textintval.digits = p - pc->input;
+ pc->input = p;
+ return sign ? tSNUMBER : tUNUMBER;
+ }
+ }
+
+ if (c_isalpha (c))
+ {
+ char buff[20];
+ char *p = buff;
+ table const *tp;
+
+ do
+ {
+ if (p - buff < sizeof buff - 1)
+ *p++ = c;
+ c = *++pc->input;
+ }
+ while (c_isalpha (c) || c == '.');
+
+ *p = '\0';
+ tp = lookup_word (pc, buff);
+ if (! tp)
+ return '?';
+ lvalp->intval = tp->value;
+ return tp->type;
+ }
+
+ if (c != '(')
+ return *pc->input++;
+ count = 0;
+ do
+ {
+ c = *pc->input++;
+ if (c == '\0')
+ return c;
+ if (c == '(')
+ count++;
+ else if (c == ')')
+ count--;
+ }
+ while (count != 0);
+ }
+}
+
+/* Do nothing if the parser reports an error. */
+static int
+yyerror (parser_control const *pc _GL_UNUSED,
+ char const *s _GL_UNUSED)
+{
+ return 0;
+}
+
+/* If *TM0 is the old and *TM1 is the new value of a struct tm after
+ passing it to mktime, return true if it's OK that mktime returned T.
+ It's not OK if *TM0 has out-of-range members. */
+
+static bool
+mktime_ok (struct tm const *tm0, struct tm const *tm1, time_t t)
+{
+ if (t == (time_t) -1)
+ {
+ /* Guard against falsely reporting an error when parsing a time
+ stamp that happens to equal (time_t) -1, on a host that
+ supports such a time stamp. */
+ tm1 = localtime (&t);
+ if (!tm1)
+ return false;
+ }
+
+ return ! ((tm0->tm_sec ^ tm1->tm_sec)
+ | (tm0->tm_min ^ tm1->tm_min)
+ | (tm0->tm_hour ^ tm1->tm_hour)
+ | (tm0->tm_mday ^ tm1->tm_mday)
+ | (tm0->tm_mon ^ tm1->tm_mon)
+ | (tm0->tm_year ^ tm1->tm_year));
+}
+
+/* A reasonable upper bound for the size of ordinary TZ strings.
+ Use heap allocation if TZ's length exceeds this. */
+enum { TZBUFSIZE = 100 };
+
+/* Return a copy of TZ, stored in TZBUF if it fits, and heap-allocated
+ otherwise. */
+static char *
+get_tz (char tzbuf[TZBUFSIZE])
+{
+ char *tz = getenv ("TZ");
+ if (tz)
+ {
+ size_t tzsize = strlen (tz) + 1;
+ tz = (tzsize <= TZBUFSIZE
+ ? memcpy (tzbuf, tz, tzsize)
+ : xmemdup (tz, tzsize));
+ }
+ return tz;
+}
+
+/* Parse a date/time string, storing the resulting time value into *RESULT.
+ The string itself is pointed to by P. Return true if successful.
+ P can be an incomplete or relative time specification; if so, use
+ *NOW as the basis for the returned time. */
+bool
+parse_datetime (struct timespec *result, char const *p,
+ struct timespec const *now)
+{
+ time_t Start;
+ long int Start_ns;
+ struct tm const *tmp;
+ struct tm tm;
+ struct tm tm0;
+ parser_control pc;
+ struct timespec gettime_buffer;
+ unsigned char c;
+ bool tz_was_altered = false;
+ char *tz0 = NULL;
+ char tz0buf[TZBUFSIZE];
+ bool ok = true;
+
+ if (! now)
+ {
+ gettime (&gettime_buffer);
+ now = &gettime_buffer;
+ }
+
+ Start = now->tv_sec;
+ Start_ns = now->tv_nsec;
+
+ tmp = localtime (&now->tv_sec);
+ if (! tmp)
+ return false;
+
+ while (c = *p, c_isspace (c))
+ p++;
+
+ if (strncmp (p, "TZ=\"", 4) == 0)
+ {
+ char const *tzbase = p + 4;
+ size_t tzsize = 1;
+ char const *s;
+
+ for (s = tzbase; *s; s++, tzsize++)
+ if (*s == '\\')
+ {
+ s++;
+ if (! (*s == '\\' || *s == '"'))
+ break;
+ }
+ else if (*s == '"')
+ {
+ char *z;
+ char *tz1;
+ char tz1buf[TZBUFSIZE];
+ bool large_tz = TZBUFSIZE < tzsize;
+ bool setenv_ok;
+ /* Free tz0, in case this is the 2nd or subsequent time through. */
+ free (tz0);
+ tz0 = get_tz (tz0buf);
+ z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf;
+ for (s = tzbase; *s != '"'; s++)
+ *z++ = *(s += *s == '\\');
+ *z = '\0';
+ setenv_ok = setenv ("TZ", tz1, 1) == 0;
+ if (large_tz)
+ free (tz1);
+ if (!setenv_ok)
+ goto fail;
+ tz_was_altered = true;
+ p = s + 1;
+ }
+ }
+
+ /* As documented, be careful to treat the empty string just like
+ a date string of "0". Without this, an empty string would be
+ declared invalid when parsed during a DST transition. */
+ if (*p == '\0')
+ p = "0";
+
+ pc.input = p;
+ pc.year.value = tmp->tm_year;
+ pc.year.value += TM_YEAR_BASE;
+ pc.year.digits = 0;
+ pc.month = tmp->tm_mon + 1;
+ pc.day = tmp->tm_mday;
+ pc.hour = tmp->tm_hour;
+ pc.minutes = tmp->tm_min;
+ pc.seconds.tv_sec = tmp->tm_sec;
+ pc.seconds.tv_nsec = Start_ns;
+ tm.tm_isdst = tmp->tm_isdst;
+
+ pc.meridian = MER24;
+ pc.rel = RELATIVE_TIME_0;
+ pc.timespec_seen = false;
+ pc.rels_seen = false;
+ pc.dates_seen = 0;
+ pc.days_seen = 0;
+ pc.times_seen = 0;
+ pc.local_zones_seen = 0;
+ pc.dsts_seen = 0;
+ pc.zones_seen = 0;
+
+#if HAVE_STRUCT_TM_TM_ZONE
+ pc.local_time_zone_table[0].name = tmp->tm_zone;
+ pc.local_time_zone_table[0].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[0].value = tmp->tm_isdst;
+ pc.local_time_zone_table[1].name = NULL;
+
+ /* Probe the names used in the next three calendar quarters, looking
+ for a tm_isdst different from the one we already have. */
+ {
+ int quarter;
+ for (quarter = 1; quarter <= 3; quarter++)
+ {
+ time_t probe = Start + quarter * (90 * 24 * 60 * 60);
+ struct tm const *probe_tm = localtime (&probe);
+ if (probe_tm && probe_tm->tm_zone
+ && probe_tm->tm_isdst != pc.local_time_zone_table[0].value)
+ {
+ {
+ pc.local_time_zone_table[1].name = probe_tm->tm_zone;
+ pc.local_time_zone_table[1].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[1].value = probe_tm->tm_isdst;
+ pc.local_time_zone_table[2].name = NULL;
+ }
+ break;
+ }
+ }
+ }
+#else
+#if HAVE_TZNAME
+ {
+# if !HAVE_DECL_TZNAME
+ extern char *tzname[];
+# endif
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ pc.local_time_zone_table[i].name = tzname[i];
+ pc.local_time_zone_table[i].type = tLOCAL_ZONE;
+ pc.local_time_zone_table[i].value = i;
+ }
+ pc.local_time_zone_table[i].name = NULL;
+ }
+#else
+ pc.local_time_zone_table[0].name = NULL;
+#endif
+#endif
+
+ if (pc.local_time_zone_table[0].name && pc.local_time_zone_table[1].name
+ && ! strcmp (pc.local_time_zone_table[0].name,
+ pc.local_time_zone_table[1].name))
+ {
+ /* This locale uses the same abbrevation for standard and
+ daylight times. So if we see that abbreviation, we don't
+ know whether it's daylight time. */
+ pc.local_time_zone_table[0].value = -1;
+ pc.local_time_zone_table[1].name = NULL;
+ }
+
+ if (yyparse (&pc) != 0)
+ goto fail;
+
+ if (pc.timespec_seen)
+ *result = pc.seconds;
+ else
+ {
+ if (1 < (pc.times_seen | pc.dates_seen | pc.days_seen | pc.dsts_seen
+ | (pc.local_zones_seen + pc.zones_seen)))
+ goto fail;
+
+ tm.tm_year = to_year (pc.year) - TM_YEAR_BASE;
+ tm.tm_mon = pc.month - 1;
+ tm.tm_mday = pc.day;
+ if (pc.times_seen || (pc.rels_seen && ! pc.dates_seen && ! pc.days_seen))
+ {
+ tm.tm_hour = to_hour (pc.hour, pc.meridian);
+ if (tm.tm_hour < 0)
+ goto fail;
+ tm.tm_min = pc.minutes;
+ tm.tm_sec = pc.seconds.tv_sec;
+ }
+ else
+ {
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ pc.seconds.tv_nsec = 0;
+ }
+
+ /* Let mktime deduce tm_isdst if we have an absolute time stamp. */
+ if (pc.dates_seen | pc.days_seen | pc.times_seen)
+ tm.tm_isdst = -1;
+
+ /* But if the input explicitly specifies local time with or without
+ DST, give mktime that information. */
+ if (pc.local_zones_seen)
+ tm.tm_isdst = pc.local_isdst;
+
+ tm0 = tm;
+
+ Start = mktime (&tm);
+
+ if (! mktime_ok (&tm0, &tm, Start))
+ {
+ if (! pc.zones_seen)
+ goto fail;
+ else
+ {
+ /* Guard against falsely reporting errors near the time_t
+ boundaries when parsing times in other time zones. For
+ example, suppose the input string "1969-12-31 23:00:00 -0100",
+ the current time zone is 8 hours ahead of UTC, and the min
+ time_t value is 1970-01-01 00:00:00 UTC. Then the min
+ localtime value is 1970-01-01 08:00:00, and mktime will
+ therefore fail on 1969-12-31 23:00:00. To work around the
+ problem, set the time zone to 1 hour behind UTC temporarily
+ by setting TZ="XXX1:00" and try mktime again. */
+
+ long int time_zone = pc.time_zone;
+ long int abs_time_zone = time_zone < 0 ? - time_zone : time_zone;
+ long int abs_time_zone_hour = abs_time_zone / 60;
+ int abs_time_zone_min = abs_time_zone % 60;
+ char tz1buf[sizeof "XXX+0:00"
+ + sizeof pc.time_zone * CHAR_BIT / 3];
+ if (!tz_was_altered)
+ tz0 = get_tz (tz0buf);
+ sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0),
+ abs_time_zone_hour, abs_time_zone_min);
+ if (setenv ("TZ", tz1buf, 1) != 0)
+ goto fail;
+ tz_was_altered = true;
+ tm = tm0;
+ Start = mktime (&tm);
+ if (! mktime_ok (&tm0, &tm, Start))
+ goto fail;
+ }
+ }
+
+ if (pc.days_seen && ! pc.dates_seen)
+ {
+ tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7
+ + 7 * (pc.day_ordinal
+ - (0 < pc.day_ordinal
+ && tm.tm_wday != pc.day_number)));
+ tm.tm_isdst = -1;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* Add relative date. */
+ if (pc.rel.year | pc.rel.month | pc.rel.day)
+ {
+ int year = tm.tm_year + pc.rel.year;
+ int month = tm.tm_mon + pc.rel.month;
+ int day = tm.tm_mday + pc.rel.day;
+ if (((year < tm.tm_year) ^ (pc.rel.year < 0))
+ | ((month < tm.tm_mon) ^ (pc.rel.month < 0))
+ | ((day < tm.tm_mday) ^ (pc.rel.day < 0)))
+ goto fail;
+ tm.tm_year = year;
+ tm.tm_mon = month;
+ tm.tm_mday = day;
+ tm.tm_hour = tm0.tm_hour;
+ tm.tm_min = tm0.tm_min;
+ tm.tm_sec = tm0.tm_sec;
+ tm.tm_isdst = tm0.tm_isdst;
+ Start = mktime (&tm);
+ if (Start == (time_t) -1)
+ goto fail;
+ }
+
+ /* The only "output" of this if-block is an updated Start value,
+ so this block must follow others that clobber Start. */
+ if (pc.zones_seen)
+ {
+ long int delta = pc.time_zone * 60;
+ time_t t1;
+#ifdef HAVE_TM_GMTOFF
+ delta -= tm.tm_gmtoff;
+#else
+ time_t t = Start;
+ struct tm const *gmt = gmtime (&t);
+ if (! gmt)
+ goto fail;
+ delta -= tm_diff (&tm, gmt);
+#endif
+ t1 = Start - delta;
+ if ((Start < t1) != (delta < 0))
+ goto fail; /* time_t overflow */
+ Start = t1;
+ }
+
+ /* Add relative hours, minutes, and seconds. On hosts that support
+ leap seconds, ignore the possibility of leap seconds; e.g.,
+ "+ 10 minutes" adds 600 seconds, even if one of them is a
+ leap second. Typically this is not what the user wants, but it's
+ too hard to do it the other way, because the time zone indicator
+ must be applied before relative times, and if mktime is applied
+ again the time zone will be lost. */
+ {
+ long int sum_ns = pc.seconds.tv_nsec + pc.rel.ns;
+ long int normalized_ns = (sum_ns % BILLION + BILLION) % BILLION;
+ time_t t0 = Start;
+ long int d1 = 60 * 60 * pc.rel.hour;
+ time_t t1 = t0 + d1;
+ long int d2 = 60 * pc.rel.minutes;
+ time_t t2 = t1 + d2;
+ long_time_t d3 = pc.rel.seconds;
+ long_time_t t3 = t2 + d3;
+ long int d4 = (sum_ns - normalized_ns) / BILLION;
+ long_time_t t4 = t3 + d4;
+ time_t t5 = t4;
+
+ if ((d1 / (60 * 60) ^ pc.rel.hour)
+ | (d2 / 60 ^ pc.rel.minutes)
+ | ((t1 < t0) ^ (d1 < 0))
+ | ((t2 < t1) ^ (d2 < 0))
+ | ((t3 < t2) ^ (d3 < 0))
+ | ((t4 < t3) ^ (d4 < 0))
+ | (t5 != t4))
+ goto fail;
+
+ result->tv_sec = t5;
+ result->tv_nsec = normalized_ns;
+ }
+ }
+
+ goto done;
+
+ fail:
+ ok = false;
+ done:
+ if (tz_was_altered)
+ ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0;
+ if (tz0 != tz0buf)
+ free (tz0);
+ return ok;
+}
+
+#if TEST
+
+int
+main (int ac, char **av)
+{
+ char buff[BUFSIZ];
+
+ printf ("Enter date, or blank line to exit.\n\t> ");
+ fflush (stdout);
+
+ buff[BUFSIZ - 1] = '\0';
+ while (fgets (buff, BUFSIZ - 1, stdin) && buff[0])
+ {
+ struct timespec d;
+ struct tm const *tm;
+ if (! parse_datetime (&d, buff, NULL))
+ printf ("Bad format - couldn't convert.\n");
+ else if (! (tm = localtime (&d.tv_sec)))
+ {
+ long int sec = d.tv_sec;
+ printf ("localtime (%ld) failed\n", sec);
+ }
+ else
+ {
+ int ns = d.tv_nsec;
+ printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
+ tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec, ns);
+ }
+ printf ("\t> ");
+ fflush (stdout);
+ }
+ return 0;
+}
+#endif /* TEST */
diff --git a/gnulib/lib/parse-duration.c b/gnulib/lib/parse-duration.c
new file mode 100644
index 0000000..0a8c4ad
--- /dev/null
+++ b/gnulib/lib/parse-duration.c
@@ -0,0 +1,601 @@
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "parse-duration.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#define cch_t char const
+
+typedef enum {
+ NOTHING_IS_DONE,
+ YEAR_IS_DONE,
+ MONTH_IS_DONE,
+ WEEK_IS_DONE,
+ DAY_IS_DONE,
+ HOUR_IS_DONE,
+ MINUTE_IS_DONE,
+ SECOND_IS_DONE
+} whats_done_t;
+
+#define SEC_PER_MIN 60
+#define SEC_PER_HR (SEC_PER_MIN * 60)
+#define SEC_PER_DAY (SEC_PER_HR * 24)
+#define SEC_PER_WEEK (SEC_PER_DAY * 7)
+#define SEC_PER_MONTH (SEC_PER_DAY * 30)
+#define SEC_PER_YEAR (SEC_PER_DAY * 365)
+
+#define TIME_MAX 0x7FFFFFFF
+
+/* Wrapper around strtoul that does not require a cast. */
+static unsigned long inline
+str_const_to_ul (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtoul (str, (char **)ppz, base);
+}
+
+/* Wrapper around strtol that does not require a cast. */
+static long inline
+str_const_to_l (cch_t * str, cch_t ** ppz, int base)
+{
+ return strtol (str, (char **)ppz, base);
+}
+
+/* Returns BASE + VAL * SCALE, interpreting BASE = BAD_TIME
+ with errno set as an error situation, and returning BAD_TIME
+ with errno set in an error situation. */
+static time_t inline
+scale_n_add (time_t base, time_t val, int scale)
+{
+ if (base == BAD_TIME)
+ {
+ if (errno == 0)
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ if (val > TIME_MAX / scale)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ val *= scale;
+ if (base > TIME_MAX - val)
+ {
+ errno = ERANGE;
+ return BAD_TIME;
+ }
+
+ return base + val;
+}
+
+/* After a number HH has been parsed, parse subsequent :MM or :MM:SS. */
+static time_t
+parse_hr_min_sec (time_t start, cch_t * pz)
+{
+ int lpct = 0;
+
+ errno = 0;
+
+ /* For as long as our scanner pointer points to a colon *AND*
+ we've not looped before, then keep looping. (two iterations max) */
+ while ((*pz == ':') && (lpct++ <= 1))
+ {
+ unsigned long v = str_const_to_ul (pz+1, &pz, 10);
+
+ if (errno != 0)
+ return BAD_TIME;
+
+ start = scale_n_add (v, start, 60);
+
+ if (errno != 0)
+ return BAD_TIME;
+ }
+
+ /* allow for trailing spaces */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return start;
+}
+
+/* Parses a value and returns BASE + value * SCALE, interpreting
+ BASE = BAD_TIME with errno set as an error situation, and returning
+ BAD_TIME with errno set in an error situation. */
+static time_t
+parse_scaled_value (time_t base, cch_t ** ppz, cch_t * endp, int scale)
+{
+ cch_t * pz = *ppz;
+ time_t val;
+
+ if (base == BAD_TIME)
+ return base;
+
+ errno = 0;
+ val = str_const_to_ul (pz, &pz, 10);
+ if (errno != 0)
+ return BAD_TIME;
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (pz != endp)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ *ppz = pz;
+ return scale_n_add (base, val, scale);
+}
+
+/* Parses the syntax YEAR-MONTH-DAY.
+ PS points into the string, after "YEAR", before "-MONTH-DAY". */
+static time_t
+parse_year_month_day (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+
+ pz++; /* over the first '-' */
+ ps = strchr (pz, '-');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+
+ pz++; /* over the second '-' */
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+}
+
+/* Parses the syntax YYYYMMDD. */
+static time_t
+parse_yearmonthday (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[8];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 8)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 4);
+ buf[4] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 4, SEC_PER_YEAR);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MONTH);
+
+ memcpy (buf, in_pz + 6, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, SEC_PER_DAY);
+}
+
+/* Parses the syntax yy Y mm M ww W dd D. */
+static time_t
+parse_YMWD (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'Y');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_YEAR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MONTH);
+ pz++;
+ }
+
+ ps = strchr (pz, 'W');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_WEEK);
+ pz++;
+ }
+
+ ps = strchr (pz, 'D');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_DAY);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+/* Parses the syntax HH:MM:SS.
+ PS points into the string, after "HH", before ":MM:SS". */
+static time_t
+parse_hour_minute_second (cch_t * pz, cch_t * ps)
+{
+ time_t res = 0;
+
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+
+ pz++;
+ ps = strchr (pz, ':');
+ if (ps == NULL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+
+ pz++;
+ ps = pz + strlen (pz);
+ return parse_scaled_value (res, &pz, ps, 1);
+}
+
+/* Parses the syntax HHMMSS. */
+static time_t
+parse_hourminutesecond (cch_t * in_pz)
+{
+ time_t res = 0;
+ char buf[4];
+ cch_t * pz;
+
+ if (strlen (in_pz) != 6)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ memcpy (buf, in_pz, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (0, &pz, buf + 2, SEC_PER_HR);
+
+ memcpy (buf, in_pz + 2, 2);
+ buf[2] = NUL;
+ pz = buf;
+ res = parse_scaled_value (res, &pz, buf + 2, SEC_PER_MIN);
+
+ memcpy (buf, in_pz + 4, 2);
+ buf[2] = NUL;
+ pz = buf;
+ return parse_scaled_value (res, &pz, buf + 2, 1);
+}
+
+/* Parses the syntax hh H mm M ss S. */
+static time_t
+parse_HMS (cch_t * pz)
+{
+ time_t res = 0;
+ cch_t * ps = strchr (pz, 'H');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (0, &pz, ps, SEC_PER_HR);
+ pz++;
+ }
+
+ ps = strchr (pz, 'M');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, SEC_PER_MIN);
+ pz++;
+ }
+
+ ps = strchr (pz, 'S');
+ if (ps != NULL)
+ {
+ res = parse_scaled_value (res, &pz, ps, 1);
+ pz++;
+ }
+
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz != NUL)
+ {
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+
+ return res;
+}
+
+/* Parses a time (hours, minutes, seconds) specification in either syntax. */
+static time_t
+parse_time (cch_t * pz)
+{
+ cch_t * ps;
+ time_t res = 0;
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, ':');
+ if (ps != NULL)
+ {
+ res = parse_hour_minute_second (pz, ps);
+ }
+
+ /*
+ * Try for a 'H', 'M' or 'S' suffix
+ */
+ else if (ps = strpbrk (pz, "HMS"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_hourminutesecond (pz);
+ }
+
+ else
+ res = parse_HMS (pz);
+
+ return res;
+}
+
+/* Returns a substring of the given string, with spaces at the beginning and at
+ the end destructively removed, per SNOBOL. */
+static char *
+trim (char * pz)
+{
+ /* trim leading white space */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ /* trim trailing white space */
+ {
+ char * pe = pz + strlen (pz);
+ while ((pe > pz) && isspace ((unsigned char)pe[-1]))
+ pe--;
+ *pe = NUL;
+ }
+
+ return pz;
+}
+
+/*
+ * Parse the year/months/days of a time period
+ */
+static time_t
+parse_period (cch_t * in_pz)
+{
+ char * pT;
+ char * ps;
+ char * pz = strdup (in_pz);
+ void * fptr = pz;
+ time_t res = 0;
+
+ if (pz == NULL)
+ {
+ errno = ENOMEM;
+ return BAD_TIME;
+ }
+
+ pT = strchr (pz, 'T');
+ if (pT != NULL)
+ {
+ *(pT++) = NUL;
+ pz = trim (pz);
+ pT = trim (pT);
+ }
+
+ /*
+ * Scan for a hyphen
+ */
+ ps = strchr (pz, '-');
+ if (ps != NULL)
+ {
+ res = parse_year_month_day (pz, ps);
+ }
+
+ /*
+ * Try for a 'Y', 'M' or 'D' suffix
+ */
+ else if (ps = strpbrk (pz, "YMWD"),
+ ps == NULL)
+ {
+ /* Its a YYYYMMDD format: */
+ res = parse_yearmonthday (pz);
+ }
+
+ else
+ res = parse_YMWD (pz);
+
+ if ((errno == 0) && (pT != NULL))
+ {
+ time_t val = parse_time (pT);
+ res = scale_n_add (res, val, 1);
+ }
+
+ free (fptr);
+ return res;
+}
+
+static time_t
+parse_non_iso8601 (cch_t * pz)
+{
+ whats_done_t whatd_we_do = NOTHING_IS_DONE;
+
+ time_t res = 0;
+
+ do {
+ time_t val;
+
+ errno = 0;
+ val = str_const_to_l (pz, &pz, 10);
+ if (errno != 0)
+ goto bad_time;
+
+ /* IF we find a colon, then we're going to have a seconds value.
+ We will not loop here any more. We cannot already have parsed
+ a minute value and if we've parsed an hour value, then the result
+ value has to be less than an hour. */
+ if (*pz == ':')
+ {
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ break;
+
+ val = parse_hr_min_sec (val, pz);
+
+ if ((whatd_we_do == HOUR_IS_DONE) && (val >= SEC_PER_HR))
+ break;
+
+ return scale_n_add (res, val, 1);
+ }
+
+ {
+ unsigned int mult;
+
+ /* Skip over white space following the number we just parsed. */
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ switch (*pz)
+ {
+ default: goto bad_time;
+ case NUL:
+ return scale_n_add (res, val, 1);
+
+ case 'y': case 'Y':
+ if (whatd_we_do >= YEAR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_YEAR;
+ whatd_we_do = YEAR_IS_DONE;
+ break;
+
+ case 'M':
+ if (whatd_we_do >= MONTH_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MONTH;
+ whatd_we_do = MONTH_IS_DONE;
+ break;
+
+ case 'W':
+ if (whatd_we_do >= WEEK_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_WEEK;
+ whatd_we_do = WEEK_IS_DONE;
+ break;
+
+ case 'd': case 'D':
+ if (whatd_we_do >= DAY_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_DAY;
+ whatd_we_do = DAY_IS_DONE;
+ break;
+
+ case 'h':
+ if (whatd_we_do >= HOUR_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_HR;
+ whatd_we_do = HOUR_IS_DONE;
+ break;
+
+ case 'm':
+ if (whatd_we_do >= MINUTE_IS_DONE)
+ goto bad_time;
+ mult = SEC_PER_MIN;
+ whatd_we_do = MINUTE_IS_DONE;
+ break;
+
+ case 's':
+ mult = 1;
+ whatd_we_do = SECOND_IS_DONE;
+ break;
+ }
+
+ res = scale_n_add (res, val, mult);
+
+ pz++;
+ while (isspace ((unsigned char)*pz))
+ pz++;
+ if (*pz == NUL)
+ return res;
+
+ if (! isdigit ((unsigned char)*pz))
+ break;
+ }
+
+ } while (whatd_we_do < SECOND_IS_DONE);
+
+ bad_time:
+ errno = EINVAL;
+ return BAD_TIME;
+}
+
+time_t
+parse_duration (char const * pz)
+{
+ while (isspace ((unsigned char)*pz))
+ pz++;
+
+ switch (*pz)
+ {
+ case 'P':
+ return parse_period (pz + 1);
+
+ case 'T':
+ return parse_time (pz + 1);
+
+ default:
+ if (isdigit ((unsigned char)*pz))
+ return parse_non_iso8601 (pz);
+
+ errno = EINVAL;
+ return BAD_TIME;
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-file-style: "gnu"
+ * indent-tabs-mode: nil
+ * End:
+ * end of parse-duration.c */
diff --git a/gnulib/lib/parse-duration.h b/gnulib/lib/parse-duration.h
new file mode 100644
index 0000000..9fd2a36
--- /dev/null
+++ b/gnulib/lib/parse-duration.h
@@ -0,0 +1,90 @@
+/* Parse a time duration and return a seconds count
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruce Korb <bkorb@gnu.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+
+ Readers and users of this function are referred to the ISO-8601
+ specification, with particular attention to "Durations".
+
+ At the time of writing, this worked:
+
+ http://en.wikipedia.org/wiki/ISO_8601#Durations
+
+ The string must start with a 'P', 'T' or a digit.
+
+ ==== if it is a digit
+
+ the string may contain: NNN Y NNN M NNN W NNN d NNN h NNN m NNN s
+ This represents NNN years, NNN months, NNN weeks, NNN days, NNN hours,
+ NNN minutes and NNN seconds.
+ The embeded white space is optional.
+ These terms must appear in this order.
+ Case is significant: 'M' is months and 'm' is minutes.
+ The final "s" is optional.
+ All of the terms ("NNN" plus designator) are optional.
+ Minutes and seconds may optionally be represented as NNN:NNN.
+ Also, hours, minute and seconds may be represented as NNN:NNN:NNN.
+ There is no limitation on the value of any of the terms, except
+ that the final result must fit in a time_t value.
+
+ ==== if it is a 'P' or 'T', please see ISO-8601 for a rigorous definition.
+
+ The 'P' term may be followed by any of three formats:
+ yyyymmdd
+ yy-mm-dd
+ yy Y mm M ww W dd D
+
+ or it may be empty and followed by a 'T'. The "yyyymmdd" must be eight
+ digits long.
+
+ NOTE! Months are always 30 days and years are always 365 days long.
+ 5 years is always 1825 days, not 1826 or 1827 depending on leap year
+ considerations. 3 months is always 90 days. There is no consideration
+ for how many days are in the current, next or previous months.
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The meanings are yy years, mm months, ww weeks and dd days.
+ * The terms must appear in this order.
+
+ ==== The 'T' term may be followed by any of these formats:
+
+ hhmmss
+ hh:mm:ss
+ hh H mm M ss S
+
+ For the final format:
+ * Embedded white space is allowed, but it is optional.
+ * All of the terms are optional. Any or all-but-one may be omitted.
+ * The terms must appear in this order.
+
+ */
+#ifndef GNULIB_PARSE_DURATION_H
+#define GNULIB_PARSE_DURATION_H
+
+#include <time.h>
+
+/* Return value when a valid duration cannot be parsed. */
+#define BAD_TIME ((time_t)~0)
+
+/* Parses the given string. If it has the syntax of a valid duration,
+ this duration is returned. Otherwise, the return value is BAD_TIME,
+ and errno is set to either EINVAL (bad syntax) or ERANGE (out of range). */
+extern time_t parse_duration (char const * in_pz);
+
+#endif /* GNULIB_PARSE_DURATION_H */
diff --git a/gnulib/lib/passfd.c b/gnulib/lib/passfd.c
new file mode 100644
index 0000000..9458820
--- /dev/null
+++ b/gnulib/lib/passfd.c
@@ -0,0 +1,202 @@
+/* Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "passfd.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <sys/socket.h>
+
+#include "cloexec.h"
+
+/* The code that uses CMSG_FIRSTHDR is enabled on
+ Linux, MacOS X, FreeBSD, OpenBSD, NetBSD, AIX, OSF/1, Cygwin.
+ The code that uses HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS is enabled on
+ HP-UX, IRIX, Solaris. */
+
+/* MSG_CMSG_CLOEXEC is defined only on Linux, as of 2011. */
+#ifndef MSG_CMSG_CLOEXEC
+# define MSG_CMSG_CLOEXEC 0
+#endif
+
+#if HAVE_SENDMSG
+/* sendfd sends the file descriptor fd along the socket
+ to a process calling recvfd on the other end.
+
+ Return 0 on success, or -1 with errno set in case of error.
+*/
+int
+sendfd (int sock, int fd)
+{
+ char byte = 0;
+ struct iovec iov;
+ struct msghdr msg;
+# ifdef CMSG_FIRSTHDR
+ struct cmsghdr *cmsg;
+ char buf[CMSG_SPACE (sizeof fd)];
+# endif
+
+ /* send at least one char */
+ memset (&msg, 0, sizeof msg);
+ iov.iov_base = &byte;
+ iov.iov_len = 1;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+
+# ifdef CMSG_FIRSTHDR
+ msg.msg_control = buf;
+ msg.msg_controllen = sizeof buf;
+ cmsg = CMSG_FIRSTHDR (&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN (sizeof fd);
+ /* Initialize the payload: */
+ memcpy (CMSG_DATA (cmsg), &fd, sizeof fd);
+# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
+ msg.msg_accrights = &fd;
+ msg.msg_accrightslen = sizeof fd;
+# else
+ errno = ENOSYS;
+ return -1;
+# endif
+
+ if (sendmsg (sock, &msg, 0) != iov.iov_len)
+ return -1;
+ return 0;
+}
+#else
+int
+sendfd (int sock _GL_UNUSED, int fd _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#endif
+
+
+#if HAVE_RECVMSG
+/* recvfd receives a file descriptor through the socket.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>).
+
+ Return 0 on success, or -1 with errno set in case of error.
+*/
+int
+recvfd (int sock, int flags)
+{
+ char byte = 0;
+ struct iovec iov;
+ struct msghdr msg;
+ int fd = -1;
+# ifdef CMSG_FIRSTHDR
+ struct cmsghdr *cmsg;
+ char buf[CMSG_SPACE (sizeof fd)];
+ int flags_recvmsg = flags & O_CLOEXEC ? MSG_CMSG_CLOEXEC : 0;
+# endif
+
+ if ((flags & ~O_CLOEXEC) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* send at least one char */
+ memset (&msg, 0, sizeof msg);
+ iov.iov_base = &byte;
+ iov.iov_len = 1;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+
+# ifdef CMSG_FIRSTHDR
+ msg.msg_control = buf;
+ msg.msg_controllen = sizeof buf;
+ cmsg = CMSG_FIRSTHDR (&msg);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN (sizeof fd);
+ /* Initialize the payload: */
+ memcpy (CMSG_DATA (cmsg), &fd, sizeof fd);
+ msg.msg_controllen = cmsg->cmsg_len;
+
+ if (recvmsg (sock, &msg, flags_recvmsg) < 0)
+ return -1;
+
+ cmsg = CMSG_FIRSTHDR (&msg);
+ /* be paranoiac */
+ if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd)
+ || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS)
+ {
+ /* fake errno: at end the file is not available */
+ errno = EACCES;
+ return -1;
+ }
+
+ memcpy (&fd, CMSG_DATA (cmsg), sizeof fd);
+
+ /* set close-on-exec flag */
+ if (!MSG_CMSG_CLOEXEC && (flags & O_CLOEXEC))
+ {
+ if (set_cloexec_flag (fd, true) < 0)
+ {
+ int saved_errno = errno;
+ (void) close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
+ msg.msg_accrights = &fd;
+ msg.msg_accrightslen = sizeof fd;
+ if (recvmsg (sock, &msg, 0) < 0)
+ return -1;
+
+ /* set close-on-exec flag */
+ if (flags & O_CLOEXEC)
+ {
+ if (set_cloexec_flag (fd, true) < 0)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+# else
+ errno = ENOSYS;
+# endif
+
+ return fd;
+}
+#else
+int
+recvfd (int sock _GL_UNUSED, int flags _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#endif
diff --git a/gnulib/lib/passfd.h b/gnulib/lib/passfd.h
new file mode 100644
index 0000000..048d9c8
--- /dev/null
+++ b/gnulib/lib/passfd.h
@@ -0,0 +1,32 @@
+/* passfd.h -- definitions and prototypes for passfd.c
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef PASSFD_H_
+#define PASSFD_H_ 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int sendfd (int sock, int fd);
+extern int recvfd (int sock, int flags);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gnulib/lib/pathmax.h b/gnulib/lib/pathmax.h
new file mode 100644
index 0000000..9c30995
--- /dev/null
+++ b/gnulib/lib/pathmax.h
@@ -0,0 +1,84 @@
+/* Define PATH_MAX somehow. Requires sys/types.h.
+ Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PATHMAX_H
+# define _PATHMAX_H
+
+/* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename,
+ including the terminating NUL byte.
+ <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html>
+ PATH_MAX is not defined on systems which have no limit on filename length,
+ such as GNU/Hurd.
+
+ This file does *not* define PATH_MAX always. Programs that use this file
+ can handle the GNU/Hurd case in several ways:
+ - Either with a package-wide handling, or with a per-file handling,
+ - Either through a
+ #ifdef PATH_MAX
+ or through a fallback like
+ #ifndef PATH_MAX
+ # define PATH_MAX 8192
+ #endif
+ or through a fallback like
+ #ifndef PATH_MAX
+ # define PATH_MAX pathconf ("/", _PC_PATH_MAX)
+ #endif
+ */
+
+# include <unistd.h>
+
+# include <limits.h>
+
+# ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 256
+# endif
+
+/* Don't include sys/param.h if it already has been. */
+# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+# endif
+
+# if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+
+# ifdef __hpux
+/* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename,
+ *not* including the terminating NUL byte, and is set to 1023.
+ Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is
+ not defined at all any more. */
+# undef PATH_MAX
+# define PATH_MAX 1024
+# endif
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com,
+ section "Maximum Path Length Limitation",
+ <http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#maxpath>
+ explains that the maximum size of a filename, including the terminating
+ NUL byte, is 260 = 3 + 256 + 1.
+ This is the same value as
+ - FILENAME_MAX in <stdio.h>,
+ - _MAX_PATH in <stdlib.h>,
+ - MAX_PATH in <windef.h>.
+ Undefine the original value, because mingw's <limits.h> gets it wrong. */
+# undef PATH_MAX
+# define PATH_MAX 260
+# endif
+
+#endif /* _PATHMAX_H */
diff --git a/gnulib/lib/pclose.c b/gnulib/lib/pclose.c
new file mode 100644
index 0000000..b171c21
--- /dev/null
+++ b/gnulib/lib/pclose.c
@@ -0,0 +1,28 @@
+/* Close a stream to a sub-process.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Native Woe32 API. */
+
+int
+pclose (FILE *stream)
+{
+ return _pclose (stream);
+}
diff --git a/gnulib/lib/perror.c b/gnulib/lib/perror.c
new file mode 100644
index 0000000..af4b56c
--- /dev/null
+++ b/gnulib/lib/perror.c
@@ -0,0 +1,49 @@
+/* Print a message describing error code.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "strerror-override.h"
+
+/* Use the system functions, not the gnulib overrides in this file. */
+#undef fprintf
+
+void
+perror (const char *string)
+{
+ char stackbuf[STACKBUF_LEN];
+ int ret;
+
+ /* Our implementation guarantees that this will be a non-empty
+ string, even if it returns EINVAL; and stackbuf should be sized
+ large enough to avoid ERANGE. */
+ ret = strerror_r (errno, stackbuf, sizeof stackbuf);
+ if (ret == ERANGE)
+ abort ();
+
+ if (string != NULL && *string != '\0')
+ fprintf (stderr, "%s: %s\n", string, stackbuf);
+ else
+ fprintf (stderr, "%s\n", stackbuf);
+}
diff --git a/gnulib/lib/physmem.c b/gnulib/lib/physmem.c
new file mode 100644
index 0000000..58ef158
--- /dev/null
+++ b/gnulib/lib/physmem.c
@@ -0,0 +1,304 @@
+/* Calculate the size of physical memory.
+
+ Copyright (C) 2000-2001, 2003, 2005-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "physmem.h"
+
+#include <unistd.h>
+
+#if HAVE_SYS_PSTAT_H
+# include <sys/pstat.h>
+#endif
+
+#if HAVE_SYS_SYSMP_H
+# include <sys/sysmp.h>
+#endif
+
+#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H
+# include <sys/sysinfo.h>
+# include <machine/hal_sysinfo.h>
+#endif
+
+#if HAVE_SYS_TABLE_H
+# include <sys/table.h>
+#endif
+
+#include <sys/types.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#if HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
+
+#if HAVE_SYS_SYSTEMCFG_H
+# include <sys/systemcfg.h>
+#endif
+
+#ifdef _WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* MEMORYSTATUSEX is missing from older windows headers, so define
+ a local replacement. */
+typedef struct
+{
+ DWORD dwLength;
+ DWORD dwMemoryLoad;
+ DWORDLONG ullTotalPhys;
+ DWORDLONG ullAvailPhys;
+ DWORDLONG ullTotalPageFile;
+ DWORDLONG ullAvailPageFile;
+ DWORDLONG ullTotalVirtual;
+ DWORDLONG ullAvailVirtual;
+ DWORDLONG ullAvailExtendedVirtual;
+} lMEMORYSTATUSEX;
+typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*);
+#endif
+
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
+/* Return the total amount of physical memory. */
+double
+physmem_total (void)
+{
+#if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE
+ { /* This works on linux-gnu, solaris2 and cygwin. */
+ double pages = sysconf (_SC_PHYS_PAGES);
+ double pagesize = sysconf (_SC_PAGESIZE);
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC
+ { /* This works on hpux11. */
+ struct pst_static pss;
+ if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0))
+ {
+ double pages = pss.physical_memory;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE
+ { /* This works on irix6. */
+ struct rminfo realmem;
+ if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
+ {
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.physmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_GETSYSINFO && defined GSI_PHYSMEM
+ { /* This works on Tru64 UNIX V4/5. */
+ int physmem;
+
+ if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
+ NULL, NULL, NULL) == 1)
+ {
+ double kbytes = physmem;
+
+ if (0 <= kbytes)
+ return kbytes * 1024.0;
+ }
+ }
+#endif
+
+#if HAVE_SYSCTL && defined HW_PHYSMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int physmem;
+ size_t len = sizeof physmem;
+ static int mib[2] = { CTL_HW, HW_PHYSMEM };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0
+ && len == sizeof (physmem))
+ return (double) physmem;
+ }
+#endif
+
+#if HAVE__SYSTEM_CONFIGURATION
+ /* This works on AIX. */
+ return _system_configuration.physmem;
+#endif
+
+#if defined _WIN32
+ { /* this works on windows */
+ PFN_MS_EX pfnex;
+ HMODULE h = GetModuleHandle ("kernel32.dll");
+
+ if (!h)
+ return 0.0;
+
+ /* Use GlobalMemoryStatusEx if available. */
+ if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
+ {
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullTotalPhys;
+ }
+
+ /* Fall back to GlobalMemoryStatus which is always available.
+ but returns wrong results for physical memory > 4GB. */
+ else
+ {
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwTotalPhys;
+ }
+ }
+#endif
+
+ /* Guess 64 MB. It's probably an older host, so guess small. */
+ return 64 * 1024 * 1024;
+}
+
+/* Return the amount of physical memory available. */
+double
+physmem_available (void)
+{
+#if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE
+ { /* This works on linux-gnu, solaris2 and cygwin. */
+ double pages = sysconf (_SC_AVPHYS_PAGES);
+ double pagesize = sysconf (_SC_PAGESIZE);
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+#endif
+
+#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC
+ { /* This works on hpux11. */
+ struct pst_static pss;
+ struct pst_dynamic psd;
+ if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)
+ && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0))
+ {
+ double pages = psd.psd_free;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE
+ { /* This works on irix6. */
+ struct rminfo realmem;
+ if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
+ {
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.availrmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_TABLE && defined TBL_VMSTATS
+ { /* This works on Tru64 UNIX V4/5. */
+ struct tbl_vmstats vmstats;
+
+ if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
+ {
+ double pages = vmstats.free_count;
+ double pagesize = vmstats.pagesize;
+
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
+ }
+ }
+#endif
+
+#if HAVE_SYSCTL && defined HW_USERMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int usermem;
+ size_t len = sizeof usermem;
+ static int mib[2] = { CTL_HW, HW_USERMEM };
+
+ if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0
+ && len == sizeof (usermem))
+ return (double) usermem;
+ }
+#endif
+
+#if defined _WIN32
+ { /* this works on windows */
+ PFN_MS_EX pfnex;
+ HMODULE h = GetModuleHandle ("kernel32.dll");
+
+ if (!h)
+ return 0.0;
+
+ /* Use GlobalMemoryStatusEx if available. */
+ if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
+ {
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullAvailPhys;
+ }
+
+ /* Fall back to GlobalMemoryStatus which is always available.
+ but returns wrong results for physical memory > 4GB */
+ else
+ {
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwAvailPhys;
+ }
+ }
+#endif
+
+ /* Guess 25% of physical memory. */
+ return physmem_total () / 4;
+}
+
+
+#if DEBUG
+
+# include <stdio.h>
+# include <stdlib.h>
+
+int
+main (void)
+{
+ printf ("%12.f %12.f\n", physmem_total (), physmem_available ());
+ exit (0);
+}
+
+#endif /* DEBUG */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG -g -O -Wall -W physmem.c"
+End:
+*/
diff --git a/gnulib/lib/physmem.h b/gnulib/lib/physmem.h
new file mode 100644
index 0000000..f4f94cc
--- /dev/null
+++ b/gnulib/lib/physmem.h
@@ -0,0 +1,26 @@
+/* Calculate the size of physical memory.
+
+ Copyright (C) 2000, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef PHYSMEM_H_
+# define PHYSMEM_H_ 1
+
+double physmem_total (void);
+double physmem_available (void);
+
+#endif /* PHYSMEM_H_ */
diff --git a/gnulib/lib/pipe-filter-aux.h b/gnulib/lib/pipe-filter-aux.h
new file mode 100644
index 0000000..8c6cb74
--- /dev/null
+++ b/gnulib/lib/pipe-filter-aux.h
@@ -0,0 +1,113 @@
+/* Auxiliary code for filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* We use a child process, and communicate through a bidirectional pipe.
+ To avoid deadlocks, let the child process decide when it wants to read
+ or to write, and let the parent behave accordingly. The parent uses
+ select() to know whether it must write or read. On platforms without
+ select(), we use non-blocking I/O. (This means the parent is busy
+ looping while waiting for the child. Not good. But hardly any platform
+ lacks select() nowadays.) */
+
+/* On BeOS select() works only on sockets, not on normal file descriptors. */
+#ifdef __BEOS__
+# undef HAVE_SELECT
+#endif
+
+#ifdef EINTR
+
+/* EINTR handling for close(), read(), write(), select().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef close /* avoid warning related to gnulib module unistd */
+#define close nonintr_close
+
+static inline ssize_t
+nonintr_read (int fd, void *buf, size_t count)
+{
+ ssize_t retval;
+
+ do
+ retval = read (fd, buf, count);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define read nonintr_read
+
+static inline ssize_t
+nonintr_write (int fd, const void *buf, size_t count)
+{
+ ssize_t retval;
+
+ do
+ retval = write (fd, buf, count);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef write /* avoid warning on VMS */
+#define write nonintr_write
+
+# if HAVE_SELECT
+
+static inline int
+nonintr_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ struct timeval *timeout)
+{
+ int retval;
+
+ do
+ retval = select (n, readfds, writefds, exceptfds, timeout);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+# undef select /* avoid warning on VMS */
+# define select nonintr_select
+
+# endif
+
+#endif
+
+/* Non-blocking I/O. */
+#if HAVE_SELECT
+# define IS_EAGAIN(errcode) 0
+#else
+# ifdef EWOULDBLOCK
+# define IS_EAGAIN(errcode) ((errcode) == EAGAIN || (errcode) == EWOULDBLOCK)
+# else
+# define IS_EAGAIN(errcode) ((errcode) == EAGAIN)
+# endif
+#endif
diff --git a/gnulib/lib/pipe-filter-gi.c b/gnulib/lib/pipe-filter-gi.c
new file mode 100644
index 0000000..8f25124
--- /dev/null
+++ b/gnulib/lib/pipe-filter-gi.c
@@ -0,0 +1,558 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc.
+ Written by Paolo Bonzini <bonzini@gnu.org>, 2009,
+ and Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+#else
+# include <signal.h>
+# include <sys/select.h>
+#endif
+
+#include "error.h"
+#include "spawn-pipe.h"
+#include "wait-process.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#include "pipe-filter-aux.h"
+
+struct pipe_filter_gi
+{
+ /* Arguments passed to pipe_filter_gi_create. */
+ const char *progname;
+ bool null_stderr;
+ bool exit_on_error;
+ prepare_read_fn prepare_read;
+ done_read_fn done_read;
+ void *private_data;
+
+ /* Management of the subprocess. */
+ pid_t child;
+ int fd[2];
+ bool exited;
+ int exitstatus;
+
+ /* Status of the writer part. */
+ volatile bool writer_terminated;
+ int writer_errno;
+ /* Status of the reader part. */
+ volatile bool reader_terminated;
+ volatile int reader_errno;
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ CRITICAL_SECTION lock; /* protects the volatile fields */
+ HANDLE reader_thread_handle;
+#else
+ struct sigaction orig_sigpipe_action;
+ fd_set readfds; /* All bits except fd[0] are always cleared. */
+ fd_set writefds; /* All bits except fd[1] are always cleared. */
+#endif
+};
+
+
+/* Platform dependent functions. */
+
+/* Perform additional initializations.
+ Return 0 if successful, -1 upon failure. */
+static inline int filter_init (struct pipe_filter_gi *filter);
+
+/* Write count bytes starting at buf, while at the same time invoking the
+ read iterator (the functions prepare_read/done_read) when needed. */
+static void filter_loop (struct pipe_filter_gi *filter,
+ const char *wbuf, size_t count);
+
+/* Perform cleanup actions at the end.
+ finish_reading is true if there was no error, or false if some error
+ occurred already. */
+static inline void filter_cleanup (struct pipe_filter_gi *filter,
+ bool finish_reading);
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+static unsigned int WINAPI
+reader_thread_func (void *thread_arg)
+{
+ struct pipe_filter_gi *filter = (struct pipe_filter_gi *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ void *buf = filter->prepare_read (&bufsize, filter->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (filter->fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ EnterCriticalSection (&filter->lock);
+ /* If the writer already encountered an error, terminate. */
+ if (filter->writer_terminated)
+ break;
+ if (nread < 0)
+ {
+ filter->reader_errno = errno;
+ break;
+ }
+ else if (nread > 0)
+ filter->done_read (buf, nread, filter->private_data);
+ else /* nread == 0 */
+ break;
+ LeaveCriticalSection (&filter->lock);
+ }
+ }
+
+ filter->reader_terminated = true;
+ LeaveCriticalSection (&filter->lock);
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+static inline int
+filter_init (struct pipe_filter_gi *filter)
+{
+ InitializeCriticalSection (&filter->lock);
+ EnterCriticalSection (&filter->lock);
+
+ filter->reader_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, reader_thread_func, filter,
+ 0, NULL);
+
+ if (filter->reader_thread_handle == NULL)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, 0, _("creation of reading thread failed"));
+ return -1;
+ }
+ else
+ return 0;
+}
+
+static void
+filter_loop (struct pipe_filter_gi *filter, const char *wbuf, size_t count)
+{
+ if (!filter->writer_terminated)
+ {
+ for (;;)
+ {
+ ssize_t nwritten;
+
+ /* Allow the reader thread to continue. */
+ LeaveCriticalSection (&filter->lock);
+
+ nwritten =
+ write (filter->fd[1], wbuf, count > SSIZE_MAX ? SSIZE_MAX : count);
+
+ /* Get the lock back from the reader thread. */
+ EnterCriticalSection (&filter->lock);
+
+ if (nwritten < 0)
+ {
+ /* Don't assume that the gnulib modules 'write' and 'sigpipe' are
+ used. */
+ if (GetLastError () == ERROR_NO_DATA)
+ errno = EPIPE;
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+ else if (nwritten > 0)
+ {
+ count -= nwritten;
+ if (count == 0)
+ break;
+ wbuf += nwritten;
+ }
+ else /* nwritten == 0 */
+ {
+ filter->writer_terminated = true;
+ break;
+ }
+ }
+ }
+}
+
+static inline void
+filter_cleanup (struct pipe_filter_gi *filter, bool finish_reading)
+{
+ if (finish_reading)
+ {
+ LeaveCriticalSection (&filter->lock);
+ WaitForSingleObject (filter->reader_thread_handle, INFINITE);
+ }
+ else
+ TerminateThread (filter->reader_thread_handle, 1);
+
+ CloseHandle (filter->reader_thread_handle);
+ DeleteCriticalSection (&filter->lock);
+}
+
+#else
+/* Unix API. */
+
+static inline int
+filter_init (struct pipe_filter_gi *filter)
+{
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ /* When we write to the child process and it has just terminated,
+ we don't want to die from a SIGPIPE signal. So set the SIGPIPE
+ handler to SIG_IGN, and handle EPIPE error codes in write(). */
+ {
+ struct sigaction sigpipe_action;
+
+ sigpipe_action.sa_handler = SIG_IGN;
+ sigpipe_action.sa_flags = 0;
+ sigemptyset (&sigpipe_action.sa_mask);
+ if (sigaction (SIGPIPE, &sigpipe_action, &filter->orig_sigpipe_action) < 0)
+ abort ();
+ }
+#endif
+
+ /* Enable non-blocking I/O. This permits the read() and write() calls
+ to return -1/EAGAIN without blocking; this is important for polling
+ if HAVE_SELECT is not defined. It also permits the read() and write()
+ calls to return after partial reads/writes; this is important if
+ HAVE_SELECT is defined, because select() only says that some data
+ can be read or written, not how many. Without non-blocking I/O,
+ Linux 2.2.17 and BSD systems prefer to block instead of returning
+ with partial results. */
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (filter->fd[1], F_GETFL, 0)) < 0
+ || fcntl (filter->fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (filter->fd[0], F_GETFL, 0)) < 0
+ || fcntl (filter->fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("cannot set up nonblocking I/O to %s subprocess"),
+ filter->progname);
+ return -1;
+ }
+ }
+
+ FD_ZERO (&filter->readfds);
+ FD_ZERO (&filter->writefds);
+
+ return 0;
+}
+
+static void
+filter_loop (struct pipe_filter_gi *filter, const char *wbuf, size_t count)
+{
+ /* This function is used in two situations:
+ - in order to write some data to the subprocess
+ [done_writing = false],
+ - in order to read the remaining data after everything was written
+ [done_writing = true]. In this case buf is NULL and count is
+ ignored. */
+ bool done_writing = (wbuf == NULL);
+
+ if (!done_writing)
+ {
+ if (filter->writer_terminated || filter->reader_terminated)
+ /* pipe_filter_gi_write was called when it should not be. */
+ abort ();
+ }
+ else
+ {
+ if (filter->reader_terminated)
+ return;
+ }
+
+ /* Loop, trying to write the given buffer or reading, whichever is
+ possible. */
+ for (;;)
+ {
+ /* Here filter->writer_terminated is false. When it becomes true, this
+ loop is terminated. */
+ /* Whereas filter->reader_terminated is initially false but may become
+ true during this loop. */
+ /* Here, if !done_writing, count > 0. When count becomes 0, this loop
+ is terminated. */
+ /* Here, if done_writing, filter->reader_terminated is false. When
+ filter->reader_terminated becomes true, this loop is terminated. */
+# if HAVE_SELECT
+ int n;
+
+ /* See whether reading or writing is possible. */
+ n = 1;
+ if (!filter->reader_terminated)
+ {
+ FD_SET (filter->fd[0], &filter->readfds);
+ n = filter->fd[0] + 1;
+ }
+ if (!done_writing)
+ {
+ FD_SET (filter->fd[1], &filter->writefds);
+ if (n <= filter->fd[1])
+ n = filter->fd[1] + 1;
+ }
+ n = select (n,
+ (!filter->reader_terminated ? &filter->readfds : NULL),
+ (!done_writing ? &filter->writefds : NULL),
+ NULL, NULL);
+
+ if (n < 0)
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("communication with %s subprocess failed"),
+ filter->progname);
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+
+ if (!done_writing && FD_ISSET (filter->fd[1], &filter->writefds))
+ goto try_write;
+ if (!filter->reader_terminated
+ && FD_ISSET (filter->fd[0], &filter->readfds))
+ goto try_read;
+ /* How could select() return if none of the two descriptors is ready? */
+ abort ();
+# endif
+
+ /* Attempt to write. */
+# if HAVE_SELECT
+ try_write:
+# endif
+ if (!done_writing)
+ {
+ ssize_t nwritten =
+ write (filter->fd[1], wbuf, count > SSIZE_MAX ? SSIZE_MAX : count);
+ if (nwritten < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("write to %s subprocess failed"),
+ filter->progname);
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ break;
+ }
+ }
+ else if (nwritten > 0)
+ {
+ count -= nwritten;
+ if (count == 0)
+ break;
+ wbuf += nwritten;
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+
+ /* Attempt to read. */
+# if HAVE_SELECT
+ try_read:
+# endif
+ if (!filter->reader_terminated)
+ {
+ size_t bufsize;
+ void *buf = filter->prepare_read (&bufsize, filter->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (filter->fd[0], buf,
+ bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (filter->exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("read from %s subprocess failed"),
+ filter->progname);
+ filter->reader_errno = errno;
+ filter->reader_terminated = true;
+ break;
+ }
+ }
+ else if (nread > 0)
+ filter->done_read (buf, nread, filter->private_data);
+ else /* nread == 0 */
+ {
+ filter->reader_terminated = true;
+ if (done_writing)
+ break;
+ }
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+ }
+}
+
+static void
+filter_cleanup (struct pipe_filter_gi *filter, bool finish_reading)
+{
+ if (finish_reading)
+ /* A select loop, with done_writing = true. */
+ filter_loop (filter, NULL, 0);
+
+ if (sigaction (SIGPIPE, &filter->orig_sigpipe_action, NULL) < 0)
+ abort ();
+}
+
+#endif
+
+
+/* Terminate the child process. Do nothing if it already exited. */
+static void
+filter_terminate (struct pipe_filter_gi *filter)
+{
+ if (!filter->exited)
+ {
+ /* Tell the child there is nothing more the parent will send. */
+ close (filter->fd[1]);
+ filter_cleanup (filter, !filter->reader_terminated);
+ close (filter->fd[0]);
+ filter->exitstatus =
+ wait_subprocess (filter->child, filter->progname, true,
+ filter->null_stderr, true, filter->exit_on_error,
+ NULL);
+ if (filter->exitstatus != 0 && filter->exit_on_error)
+ error (EXIT_FAILURE, 0,
+ _("subprocess %s terminated with exit code %d"),
+ filter->progname, filter->exitstatus);
+ filter->exited = true;
+ }
+}
+
+/* After filter_terminate:
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+static inline int
+filter_retcode (struct pipe_filter_gi *filter)
+{
+ if (filter->writer_errno != 0)
+ {
+ errno = filter->writer_errno;
+ return -1;
+ }
+ else if (filter->reader_errno != 0)
+ {
+ errno = filter->reader_errno;
+ return -1;
+ }
+ else
+ return filter->exitstatus;
+}
+
+struct pipe_filter_gi *
+pipe_filter_gi_create (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data)
+{
+ struct pipe_filter_gi *filter;
+
+ filter =
+ (struct pipe_filter_gi *) xmalloc (sizeof (struct pipe_filter_gi));
+
+ /* Open a bidirectional pipe to a subprocess. */
+ filter->child = create_pipe_bidi (progname, prog_path, (char **) prog_argv,
+ null_stderr, true, exit_on_error,
+ filter->fd);
+ filter->progname = progname;
+ filter->null_stderr = null_stderr;
+ filter->exit_on_error = exit_on_error;
+ filter->prepare_read = prepare_read;
+ filter->done_read = done_read;
+ filter->private_data = private_data;
+ filter->exited = false;
+ filter->exitstatus = 0;
+ filter->writer_terminated = false;
+ filter->writer_errno = 0;
+ filter->reader_terminated = false;
+ filter->reader_errno = 0;
+
+ if (filter->child == -1)
+ {
+ /* Child process could not be created.
+ Arrange for filter_retcode (filter) to be the current errno. */
+ filter->writer_errno = errno;
+ filter->writer_terminated = true;
+ filter->exited = true;
+ }
+ else if (filter_init (filter) < 0)
+ filter_terminate (filter);
+
+ return filter;
+}
+
+int
+pipe_filter_gi_write (struct pipe_filter_gi *filter,
+ const void *buf, size_t size)
+{
+ if (buf == NULL)
+ /* Invalid argument. */
+ abort ();
+
+ if (filter->exited)
+ return filter_retcode (filter);
+
+ if (size > 0)
+ {
+ filter_loop (filter, buf, size);
+ if (filter->writer_terminated || filter->reader_terminated)
+ {
+ filter_terminate (filter);
+ return filter_retcode (filter);
+ }
+ }
+ return 0;
+}
+
+int
+pipe_filter_gi_close (struct pipe_filter_gi *filter)
+{
+ int ret;
+ int saved_errno;
+
+ filter_terminate (filter);
+ ret = filter_retcode (filter);
+ saved_errno = errno;
+ free (filter);
+ errno = saved_errno;
+ return ret;
+}
diff --git a/gnulib/lib/pipe-filter-ii.c b/gnulib/lib/pipe-filter-ii.c
new file mode 100644
index 0000000..d0eb86b
--- /dev/null
+++ b/gnulib/lib/pipe-filter-ii.c
@@ -0,0 +1,467 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2001-2003, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "pipe-filter.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <windows.h>
+#else
+# include <signal.h>
+# include <sys/select.h>
+#endif
+
+#include "error.h"
+#include "spawn-pipe.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#include "pipe-filter-aux.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+struct locals
+{
+ /* Arguments passed to pipe_filter_ii_execute. */
+ prepare_write_fn prepare_write;
+ done_write_fn done_write;
+ prepare_read_fn prepare_read;
+ done_read_fn done_read;
+
+ /* Management of the subprocess. */
+ void *private_data;
+ int fd[2];
+
+ /* Status of the writer part. */
+ volatile bool writer_terminated;
+ volatile int writer_errno;
+ /* Status of the reader part. */
+ volatile bool reader_terminated;
+ volatile int reader_errno;
+};
+
+static unsigned int WINAPI
+writer_thread_func (void *thread_arg)
+{
+ struct locals *l = (struct locals *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ const void *buf = l->prepare_write (&bufsize, l->private_data);
+ if (buf != NULL)
+ {
+ ssize_t nwritten =
+ write (l->fd[1], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nwritten < 0)
+ {
+ /* Don't assume that the gnulib modules 'write' and 'sigpipe' are
+ used. */
+ if (GetLastError () == ERROR_NO_DATA)
+ errno = EPIPE;
+ l->writer_errno = errno;
+ break;
+ }
+ else if (nwritten > 0)
+ l->done_write ((void *) buf, nwritten, l->private_data);
+ }
+ else
+ break;
+ }
+
+ l->writer_terminated = true;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+static unsigned int WINAPI
+reader_thread_func (void *thread_arg)
+{
+ struct locals *l = (struct locals *) thread_arg;
+
+ for (;;)
+ {
+ size_t bufsize;
+ void *buf = l->prepare_read (&bufsize, l->private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (l->fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ l->reader_errno = errno;
+ break;
+ }
+ else if (nread > 0)
+ l->done_read (buf, nread, l->private_data);
+ else /* nread == 0 */
+ break;
+ }
+ }
+
+ l->reader_terminated = true;
+ _endthreadex (0); /* calls ExitThread (0) */
+ abort ();
+}
+
+#endif
+
+int
+pipe_filter_ii_execute (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_write_fn prepare_write,
+ done_write_fn done_write,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data)
+{
+ pid_t child;
+ int fd[2];
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ struct sigaction orig_sigpipe_action;
+#endif
+
+ /* Open a bidirectional pipe to a subprocess. */
+ child = create_pipe_bidi (progname, prog_path, (char **) prog_argv,
+ null_stderr, true, exit_on_error,
+ fd);
+ if (child == -1)
+ return -1;
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Native Woe32 API. */
+ /* Pipes have a non-blocking mode, see function SetNamedPipeHandleState and
+ the article "Named Pipe Type, Read, and Wait Modes", but Microsoft's
+ documentation discourages its use. So don't use it.
+ Asynchronous I/O is also not suitable because it notifies the caller only
+ about completion of the I/O request, not about intermediate progress.
+ So do the writing and the reading in separate threads. */
+ {
+ struct locals l;
+ HANDLE handles[2];
+ #define writer_thread_handle handles[0]
+ #define reader_thread_handle handles[1]
+ bool writer_cleaned_up;
+ bool reader_cleaned_up;
+
+ l.prepare_write = prepare_write;
+ l.done_write = done_write;
+ l.prepare_read = prepare_read;
+ l.done_read = done_read;
+ l.private_data = private_data;
+ l.fd[0] = fd[0];
+ l.fd[1] = fd[1];
+ l.writer_terminated = false;
+ l.writer_errno = 0;
+ l.reader_terminated = false;
+ l.reader_errno = 0;
+
+ writer_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, writer_thread_func, &l, 0, NULL);
+ reader_thread_handle =
+ (HANDLE) _beginthreadex (NULL, 100000, reader_thread_func, &l, 0, NULL);
+ if (writer_thread_handle == NULL || reader_thread_handle == NULL)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, 0, _("creation of threads failed"));
+ if (reader_thread_handle != NULL)
+ CloseHandle (reader_thread_handle);
+ if (writer_thread_handle != NULL)
+ CloseHandle (writer_thread_handle);
+ goto fail;
+ }
+ writer_cleaned_up = false;
+ reader_cleaned_up = false;
+ for (;;)
+ {
+ DWORD ret;
+
+ /* Here !(writer_cleaned_up && reader_cleaned_up). */
+ if (writer_cleaned_up)
+ ret = WaitForSingleObject (reader_thread_handle, INFINITE);
+ else if (reader_cleaned_up)
+ ret = WaitForSingleObject (writer_thread_handle, INFINITE);
+ else
+ ret = WaitForMultipleObjects (2, handles, FALSE, INFINITE);
+ if (!(ret == WAIT_OBJECT_0 + 0 || ret == WAIT_OBJECT_0 + 1))
+ abort ();
+
+ if (l.writer_terminated)
+ {
+ /* The writer thread has just terminated. */
+ l.writer_terminated = false;
+ CloseHandle (writer_thread_handle);
+ if (l.writer_errno)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, l.writer_errno,
+ _("write to %s subprocess failed"), progname);
+ if (!reader_cleaned_up)
+ {
+ TerminateThread (reader_thread_handle, 1);
+ CloseHandle (reader_thread_handle);
+ }
+ goto fail;
+ }
+ /* Tell the child there is nothing more the parent will send. */
+ close (fd[1]);
+ writer_cleaned_up = true;
+ }
+ if (l.reader_terminated)
+ {
+ /* The reader thread has just terminated. */
+ l.reader_terminated = false;
+ CloseHandle (reader_thread_handle);
+ if (l.reader_errno)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, l.reader_errno,
+ _("read from %s subprocess failed"), progname);
+ if (!writer_cleaned_up)
+ {
+ TerminateThread (writer_thread_handle, 1);
+ CloseHandle (writer_thread_handle);
+ }
+ goto fail;
+ }
+ reader_cleaned_up = true;
+ }
+ if (writer_cleaned_up && reader_cleaned_up)
+ break;
+ }
+ }
+#else
+ /* When we write to the child process and it has just terminated,
+ we don't want to die from a SIGPIPE signal. So set the SIGPIPE
+ handler to SIG_IGN, and handle EPIPE error codes in write(). */
+ {
+ struct sigaction sigpipe_action;
+
+ sigpipe_action.sa_handler = SIG_IGN;
+ sigpipe_action.sa_flags = 0;
+ sigemptyset (&sigpipe_action.sa_mask);
+ if (sigaction (SIGPIPE, &sigpipe_action, &orig_sigpipe_action) < 0)
+ abort ();
+ }
+
+ {
+# if HAVE_SELECT
+ fd_set readfds; /* All bits except fd[0] are always cleared. */
+ fd_set writefds; /* All bits except fd[1] are always cleared. */
+# endif
+ bool done_writing;
+
+ /* Enable non-blocking I/O. This permits the read() and write() calls
+ to return -1/EAGAIN without blocking; this is important for polling
+ if HAVE_SELECT is not defined. It also permits the read() and write()
+ calls to return after partial reads/writes; this is important if
+ HAVE_SELECT is defined, because select() only says that some data
+ can be read or written, not how many. Without non-blocking I/O,
+ Linux 2.2.17 and BSD systems prefer to block instead of returning
+ with partial results. */
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
+ || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
+ || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("cannot set up nonblocking I/O to %s subprocess"),
+ progname);
+ goto fail;
+ }
+ }
+
+# if HAVE_SELECT
+ FD_ZERO (&readfds);
+ FD_ZERO (&writefds);
+# endif
+ done_writing = false;
+ for (;;)
+ {
+# if HAVE_SELECT
+ int n;
+
+ FD_SET (fd[0], &readfds);
+ n = fd[0] + 1;
+ if (!done_writing)
+ {
+ FD_SET (fd[1], &writefds);
+ if (n <= fd[1])
+ n = fd[1] + 1;
+ }
+
+ n = select (n, &readfds, (!done_writing ? &writefds : NULL), NULL,
+ NULL);
+ if (n < 0)
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("communication with %s subprocess failed"), progname);
+ goto fail;
+ }
+ if (!done_writing && FD_ISSET (fd[1], &writefds))
+ goto try_write;
+ if (FD_ISSET (fd[0], &readfds))
+ goto try_read;
+ /* How could select() return if none of the two descriptors is ready? */
+ abort ();
+# endif
+
+ /* Attempt to write. */
+# if HAVE_SELECT
+ try_write:
+# endif
+ if (!done_writing)
+ {
+ size_t bufsize;
+ const void *buf = prepare_write (&bufsize, private_data);
+ if (buf != NULL)
+ {
+ /* Writing to a pipe in non-blocking mode is tricky: The
+ write() call may fail with EAGAIN, simply because suffcient
+ space is not available in the pipe. See POSIX:2008
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>.
+ This happens actually on AIX and IRIX, when bufsize >= 8192
+ (even though PIPE_BUF and pathconf ("/", _PC_PIPE_BUF) are
+ both 32768). */
+ size_t attempt_to_write =
+ (bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ for (;;)
+ {
+ ssize_t nwritten = write (fd[1], buf, attempt_to_write);
+ if (nwritten < 0)
+ {
+ if (errno == EAGAIN)
+ {
+ attempt_to_write = attempt_to_write / 2;
+ if (attempt_to_write == 0)
+ break;
+ }
+ else if (!IS_EAGAIN (errno))
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("write to %s subprocess failed"),
+ progname);
+ goto fail;
+ }
+ }
+ else
+ {
+ if (nwritten > 0)
+ done_write ((void *) buf, nwritten, private_data);
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* Tell the child there is nothing more the parent will send. */
+ close (fd[1]);
+ done_writing = true;
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+
+ /* Attempt to read. */
+# if HAVE_SELECT
+ try_read:
+# endif
+ {
+ size_t bufsize;
+ void *buf = prepare_read (&bufsize, private_data);
+ if (!(buf != NULL && bufsize > 0))
+ /* prepare_read returned wrong values. */
+ abort ();
+ {
+ ssize_t nread =
+ read (fd[0], buf, bufsize > SSIZE_MAX ? SSIZE_MAX : bufsize);
+ if (nread < 0)
+ {
+ if (!IS_EAGAIN (errno))
+ {
+ if (exit_on_error)
+ error (EXIT_FAILURE, errno,
+ _("read from %s subprocess failed"), progname);
+ goto fail;
+ }
+ }
+ else if (nread > 0)
+ done_read (buf, nread, private_data);
+ else /* nread == 0 */
+ {
+ if (done_writing)
+ break;
+ }
+ }
+ }
+# if HAVE_SELECT
+ continue;
+# endif
+ }
+ }
+
+ /* Restore SIGPIPE signal handler. */
+ if (sigaction (SIGPIPE, &orig_sigpipe_action, NULL) < 0)
+ abort ();
+#endif
+
+ close (fd[0]);
+
+ /* Remove zombie process from process list. */
+ {
+ int exitstatus =
+ wait_subprocess (child, progname, false, null_stderr,
+ true, exit_on_error, NULL);
+ if (exitstatus != 0 && exit_on_error)
+ error (EXIT_FAILURE, 0, _("%s subprocess terminated with exit code %d"),
+ progname, exitstatus);
+ return exitstatus;
+ }
+
+ fail:
+ {
+ int saved_errno = errno;
+ close (fd[1]);
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ if (sigaction (SIGPIPE, &orig_sigpipe_action, NULL) < 0)
+ abort ();
+#endif
+ close (fd[0]);
+ wait_subprocess (child, progname, true, true, true, false, NULL);
+ errno = saved_errno;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/pipe-filter.h b/gnulib/lib/pipe-filter.h
new file mode 100644
index 0000000..546d5ca
--- /dev/null
+++ b/gnulib/lib/pipe-filter.h
@@ -0,0 +1,237 @@
+/* Filtering of data through a subprocess.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2009,
+ and Paolo Bonzini <bonzini@gnu.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _PIPE_FILTER_H
+#define _PIPE_FILTER_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Piping data through a subprocess in the naïve way - write data to the
+ subprocess and read from the subprocess when you expect it to have
+ produced results - is subject to two kinds of deadlocks:
+ 1) If you write more than PIPE_MAX bytes or, more generally, if you write
+ more bytes than the subprocess can handle at once, the subprocess
+ may write its data and wait on you to read it, but you are currently
+ busy writing.
+ 2) When you don't know ahead of time how many bytes the subprocess
+ will produce, the usual technique of calling read (fd, buf, BUFSIZ)
+ with a fixed BUFSIZ will, on Linux 2.2.17 and on BSD systems, cause
+ the read() call to block until *all* of the buffer has been filled.
+ But the subprocess cannot produce more data until you gave it more
+ input. But you are currently busy reading from it.
+
+ This header file declares four set of functions that pipes data through
+ the subprocess, without risking these deadlocks.
+
+ The side that writes data to the subprocess can be seen as a "generator",
+ that is, as a subroutine that produces and writes a piece of data here and
+ there, see <http://en.wikipedia.org/wiki/Generator_(computer_science)>.
+ But often, it can be written in the form of an "iterator", that is, as a
+ function that, each time it is invoked, produces and writes one more piece
+ of data.
+
+ Similarly, the side that reads data from the subprocess can be seen as
+ a "generator", that is, as a subroutine that consumes a piece of data here
+ and there. Often, it can be written in the form of an "iterator", that
+ is, as a function that, each time it is invoked, consumes one more piece
+ of data.
+
+ This header file declares four set of functions:
+
+ | writer | reader |
+ ----------------+------------+------------+
+ pipe_filter_ii | iterator | iterator |
+ pipe_filter_ig | iterator | generator |
+ pipe_filter_gi | generator | iterator |
+ pipe_filter_gg | generator | generator |
+ ----------------+------------+------------+
+
+ The last one uses threads in order to implement two generators running at
+ the same time. (For the relation between generators, coroutines, and
+ threads, see <http://en.wikipedia.org/wiki/Generator_(computer_science)>
+ and <http://en.wikipedia.org/wiki/Coroutine>.) It is therefore only
+ portable to platforms with kernel-based POSIX threads. */
+
+/* These two functions together describe the side that writes data to the
+ subprocess when it has the form of an iterator.
+ - prepare_write (&num_bytes, p) must either return a pointer to data that
+ is ready to be written and set num_bytes to the number of bytes ready to
+ be written, or return NULL when no more bytes are to be written.
+ - done_write (data_written, num_bytes_written) is called after
+ num_bytes_written bytes were written. It is guaranteed that
+ num_bytes_written > 0.
+ Here p is always the private_data argument passed to the main function. */
+typedef const void * (*prepare_write_fn) (size_t *num_bytes_p,
+ void *private_data);
+typedef void (*done_write_fn) (void *data_written, size_t num_bytes_written,
+ void *private_data);
+
+/* These two functions together describe the side that reads data from the
+ subprocess when it has the form of an iterator.
+ - prepare_read (&num_bytes, p) must return a pointer to a buffer for data
+ that can be read and set num_bytes to the size of that buffer
+ (must be > 0).
+ - done_read (data_read, num_bytes_read, p) is called after num_bytes_read
+ bytes were read into the buffer.
+ Here p is always the private_data argument passed to the main function. */
+typedef void * (*prepare_read_fn) (size_t *num_bytes_p,
+ void *private_data);
+typedef void (*done_read_fn) (void *data_read, size_t num_bytes_read,
+ void *private_data);
+
+
+/* ============================ pipe_filter_ii ============================ */
+
+/* Create a subprocess and pipe some data through it.
+ Arguments:
+ - progname is the program name used in error messages.
+ - prog_path is the file name of the program to invoke.
+ - prog_argv is a NULL terminated argument list, starting with prog_path as
+ first element.
+ - If null_stderr is true, the subprocess' stderr will be redirected to
+ /dev/null, and the usual error message to stderr will be omitted.
+ This is suitable when the subprocess does not fulfill an important task.
+ - If exit_on_error is true, any error will cause the main process to exit
+ with an error status.
+ If the subprocess does not terminate correctly, exit if exit_on_error is
+ true, otherwise return 127.
+ Callback arguments are as described above.
+
+ Data is alternatingly written to the subprocess, through the functions
+ prepare_write and done_write, and read from the subprocess, through the
+ functions prepare_read and done_read.
+
+ Note that the prepare_write/done_write functions and the
+ prepare_read/done_read functions may be called in different threads than
+ the current thread (depending on the platform). But they will not be
+ called after the pipe_filter_ii_execute function has returned.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_ii_execute (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_write_fn prepare_write,
+ done_write_fn done_write,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data);
+
+
+/* ============================ pipe_filter_ig ============================ */
+
+struct pipe_filter_ig;
+
+
+/* ============================ pipe_filter_gi ============================ */
+
+struct pipe_filter_gi;
+
+/* Create a subprocess and pipe some data through it.
+ Arguments:
+ - progname is the program name used in error messages.
+ - prog_path is the file name of the program to invoke.
+ - prog_argv is a NULL terminated argument list, starting with
+ prog_path as first element.
+ - If null_stderr is true, the subprocess' stderr will be redirected
+ to /dev/null, and the usual error message to stderr will be
+ omitted. This is suitable when the subprocess does not fulfill an
+ important task.
+ - If exit_on_error is true, any error will cause the main process to
+ exit with an error status.
+ If the subprocess does not start correctly, exit if exit_on_error is
+ true, otherwise return NULL and set errno.
+
+ The caller will write to the subprocess through pipe_filter_gi_write
+ and finally call pipe_filter_gi_write. During such calls, the
+ prepare_read and done_read function may be called to process any data
+ that the subprocess has written.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ But they will not be called after the pipe_filter_gi_close function has
+ returned.
+
+ Return the freshly created 'struct pipe_filter_gi'. */
+extern struct pipe_filter_gi *
+ pipe_filter_gi_create (const char *progname,
+ const char *prog_path, const char **prog_argv,
+ bool null_stderr, bool exit_on_error,
+ prepare_read_fn prepare_read,
+ done_read_fn done_read,
+ void *private_data);
+
+/* Write size bytes starting at buf into the pipe and in the meanwhile
+ possibly call the prepare_read and done_read functions specified to
+ pipe_filter_gi_create.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ However, they will always be called before pipe_filter_gi_write has
+ returned, or otherwise not sooner than the next call to
+ pipe_filter_gi_write or pipe_filter_gi_close.
+
+ Return only after all the entire buffer has been written to the pipe or
+ the subprocess has exited.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_gi_write (struct pipe_filter_gi *filter,
+ const void *buf, size_t size);
+
+/* Finish reading the output via the prepare_read/done_read functions
+ specified to pipe_filter_gi_create.
+
+ Note that the prepare_read/done_read functions may be called in a
+ different thread than the current thread (depending on the platform).
+ However, they will always be called before pipe_filter_gi_close has
+ returned.
+
+ The write side of the pipe is closed as soon as pipe_filter_gi_close
+ starts, while the read side will be closed just before it finishes.
+
+ Return 0 upon success, or (only if exit_on_error is false):
+ - -1 with errno set upon failure,
+ - the positive exit code of the subprocess if that failed. */
+extern int
+ pipe_filter_gi_close (struct pipe_filter_gi *filter);
+
+
+/* ============================ pipe_filter_gg ============================ */
+
+
+/* ======================================================================== */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PIPE_FILTER_H */
diff --git a/gnulib/lib/pipe-safer.c b/gnulib/lib/pipe-safer.c
new file mode 100644
index 0000000..928312b
--- /dev/null
+++ b/gnulib/lib/pipe-safer.c
@@ -0,0 +1,56 @@
+/* Invoke pipe, but avoid some glitches.
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. Fail with ENOSYS on
+ platforms that lack pipe. */
+
+int
+pipe_safer (int fd[2])
+{
+#if HAVE_PIPE
+ if (pipe (fd) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer (fd[i]);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+#else
+ errno = ENOSYS;
+#endif
+
+ return -1;
+}
diff --git a/gnulib/lib/pipe.c b/gnulib/lib/pipe.c
new file mode 100644
index 0000000..b68a555
--- /dev/null
+++ b/gnulib/lib/pipe.c
@@ -0,0 +1,51 @@
+/* Create a pipe.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+/* Get _pipe(). */
+# include <io.h>
+
+/* Get _O_BINARY. */
+# include <fcntl.h>
+
+int
+pipe (int fd[2])
+{
+ /* Mingw changes fd to {-1,-1} on failure, but this violates
+ http://austingroupbugs.net/view.php?id=467 */
+ int tmp[2];
+ int result = _pipe (tmp, 4096, _O_BINARY);
+ if (!result)
+ {
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ }
+ return result;
+}
+
+#else
+
+# error "This platform lacks a pipe function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif
diff --git a/gnulib/lib/pipe.h b/gnulib/lib/pipe.h
new file mode 100644
index 0000000..3c1b4b8
--- /dev/null
+++ b/gnulib/lib/pipe.h
@@ -0,0 +1,2 @@
+/* Obsolete; consider using spawn-pipe.h instead. */
+#include "spawn-pipe.h"
diff --git a/gnulib/lib/pipe2-safer.c b/gnulib/lib/pipe2-safer.c
new file mode 100644
index 0000000..4249c03
--- /dev/null
+++ b/gnulib/lib/pipe2-safer.c
@@ -0,0 +1,52 @@
+/* Invoke pipe2, but avoid some glitches.
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe2, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */
+
+int
+pipe2_safer (int fd[2], int flags)
+{
+ /* This is a generalization of the pipe_safer implementation. */
+ if (pipe2 (fd, flags) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer_flag (fd[i], flags);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+ return -1;
+}
diff --git a/gnulib/lib/pipe2.c b/gnulib/lib/pipe2.c
new file mode 100644
index 0000000..cd1fe56
--- /dev/null
+++ b/gnulib/lib/pipe2.c
@@ -0,0 +1,169 @@
+/* Create a pipe, with specific opening flags.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "binary-io.h"
+#include "verify.h"
+
+#if GNULIB_defined_O_NONBLOCK
+# include "nonblocking.h"
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+# include <io.h>
+
+#endif
+
+int
+pipe2 (int fd[2], int flags)
+{
+ /* Mingw _pipe() corrupts fd on failure; also, if we succeed at
+ creating the pipe but later fail at changing fcntl, we want
+ to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */
+ int tmp[2];
+ tmp[0] = fd[0];
+ tmp[1] = fd[1];
+
+#if HAVE_PIPE2
+# undef pipe2
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_pipe2_really >= 0)
+ {
+ int result = pipe2 (fd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_pipe2_really = 1;
+ return result;
+ }
+ have_pipe2_really = -1;
+ }
+ }
+#endif
+
+ /* Check the supported flags. */
+ if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+
+ if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0)
+ {
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ return -1;
+ }
+
+ /* O_NONBLOCK handling.
+ On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the
+ functions defined by the gnulib module 'nonblocking'. */
+# if GNULIB_defined_O_NONBLOCK
+ if (flags & O_NONBLOCK)
+ {
+ if (set_nonblocking_flag (fd[0], true) != 0
+ || set_nonblocking_flag (fd[1], true) != 0)
+ goto fail;
+ }
+# else
+ {
+ verify (O_NONBLOCK == 0);
+ }
+# endif
+
+ return 0;
+
+#else
+/* Unix API. */
+
+ if (pipe (fd) < 0)
+ return -1;
+
+ /* POSIX <http://www.opengroup.org/onlinepubs/9699919799/functions/pipe.html>
+ says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on
+ both fd[0] and fd[1]. */
+
+ /* O_NONBLOCK handling.
+ On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */
+ if (flags & O_NONBLOCK)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
+ || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
+ || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ goto fail;
+ }
+
+ if (flags & O_CLOEXEC)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFD, 0)) < 0
+ || fcntl (fd[1], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFD, 0)) < 0
+ || fcntl (fd[0], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
+ goto fail;
+ }
+
+# if O_BINARY
+ if (flags & O_BINARY)
+ {
+ setmode (fd[1], O_BINARY);
+ setmode (fd[0], O_BINARY);
+ }
+ else if (flags & O_TEXT)
+ {
+ setmode (fd[1], O_TEXT);
+ setmode (fd[0], O_TEXT);
+ }
+# endif
+
+ return 0;
+
+#endif
+
+#if GNULIB_defined_O_NONBLOCK || \
+ !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+ fail:
+ {
+ int saved_errno = errno;
+ close (fd[0]);
+ close (fd[1]);
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ errno = saved_errno;
+ return -1;
+ }
+#endif
+}
diff --git a/gnulib/lib/poll.c b/gnulib/lib/poll.c
new file mode 100644
index 0000000..b012ba0
--- /dev/null
+++ b/gnulib/lib/poll.c
@@ -0,0 +1,605 @@
+/* Emulation for poll(2)
+ Contributed by Paolo Bonzini.
+
+ Copyright 2001-2003, 2006-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Tell gcc not to warn about the (nfd < 0) tests, below. */
+#if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wtype-limits"
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+#include <sys/types.h>
+
+/* Specification. */
+#include <poll.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <assert.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_NATIVE
+# include <winsock2.h>
+# include <windows.h>
+# include <io.h>
+# include <stdio.h>
+# include <conio.h>
+# include "msvc-nothrow.h"
+#else
+# include <sys/time.h>
+# include <sys/socket.h>
+# include <sys/select.h>
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_SYS_FILIO_H
+# include <sys/filio.h>
+#endif
+
+#include <time.h>
+
+#ifndef INFTIM
+# define INFTIM (-1)
+#endif
+
+/* BeOS does not have MSG_PEEK. */
+#ifndef MSG_PEEK
+# define MSG_PEEK 0
+#endif
+
+#ifdef WIN32_NATIVE
+
+#define IsConsoleHandle(h) (((long) (h) & 3) == 3)
+
+static BOOL
+IsSocketHandle (HANDLE h)
+{
+ WSANETWORKEVENTS ev;
+
+ if (IsConsoleHandle (h))
+ return FALSE;
+
+ /* Under Wine, it seems that getsockopt returns 0 for pipes too.
+ WSAEnumNetworkEvents instead distinguishes the two correctly. */
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ return ev.lNetworkEvents != 0xDEADBEEF;
+}
+
+/* Declare data structures for ntdll functions. */
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _IO_STATUS_BLOCK
+{
+ union {
+ DWORD Status;
+ PVOID Pointer;
+ } u;
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef enum _FILE_INFORMATION_CLASS {
+ FilePipeLocalInformation = 24
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef DWORD (WINAPI *PNtQueryInformationFile)
+ (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
+
+# ifndef PIPE_BUF
+# define PIPE_BUF 512
+# endif
+
+/* Compute revents values for file handle H. If some events cannot happen
+ for the handle, eliminate them from *P_SOUGHT. */
+
+static int
+win32_compute_revents (HANDLE h, int *p_sought)
+{
+ int i, ret, happened;
+ INPUT_RECORD *irbuffer;
+ DWORD avail, nbuffer;
+ BOOL bRet;
+ IO_STATUS_BLOCK iosb;
+ FILE_PIPE_LOCAL_INFORMATION fpli;
+ static PNtQueryInformationFile NtQueryInformationFile;
+ static BOOL once_only;
+
+ switch (GetFileType (h))
+ {
+ case FILE_TYPE_PIPE:
+ if (!once_only)
+ {
+ NtQueryInformationFile = (PNtQueryInformationFile)
+ GetProcAddress (GetModuleHandle ("ntdll.dll"),
+ "NtQueryInformationFile");
+ once_only = TRUE;
+ }
+
+ happened = 0;
+ if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
+ {
+ if (avail)
+ happened |= *p_sought & (POLLIN | POLLRDNORM);
+ }
+ else if (GetLastError () == ERROR_BROKEN_PIPE)
+ happened |= POLLHUP;
+
+ else
+ {
+ /* It was the write-end of the pipe. Check if it is writable.
+ If NtQueryInformationFile fails, optimistically assume the pipe is
+ writable. This could happen on Win9x, where NtQueryInformationFile
+ is not available, or if we inherit a pipe that doesn't permit
+ FILE_READ_ATTRIBUTES access on the write end (I think this should
+ not happen since WinXP SP2; WINE seems fine too). Otherwise,
+ ensure that enough space is available for atomic writes. */
+ memset (&iosb, 0, sizeof (iosb));
+ memset (&fpli, 0, sizeof (fpli));
+
+ if (!NtQueryInformationFile
+ || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation)
+ || fpli.WriteQuotaAvailable >= PIPE_BUF
+ || (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota))
+ happened |= *p_sought & (POLLOUT | POLLWRNORM | POLLWRBAND);
+ }
+ return happened;
+
+ case FILE_TYPE_CHAR:
+ ret = WaitForSingleObject (h, 0);
+ if (!IsConsoleHandle (h))
+ return ret == WAIT_OBJECT_0 ? *p_sought & ~(POLLPRI | POLLRDBAND) : 0;
+
+ nbuffer = avail = 0;
+ bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
+ if (bRet)
+ {
+ /* Input buffer. */
+ *p_sought &= POLLIN | POLLRDNORM;
+ if (nbuffer == 0)
+ return POLLHUP;
+ if (!*p_sought)
+ return 0;
+
+ irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
+ bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
+ if (!bRet || avail == 0)
+ return POLLHUP;
+
+ for (i = 0; i < avail; i++)
+ if (irbuffer[i].EventType == KEY_EVENT)
+ return *p_sought;
+ return 0;
+ }
+ else
+ {
+ /* Screen buffer. */
+ *p_sought &= POLLOUT | POLLWRNORM | POLLWRBAND;
+ return *p_sought;
+ }
+
+ default:
+ ret = WaitForSingleObject (h, 0);
+ if (ret == WAIT_OBJECT_0)
+ return *p_sought & ~(POLLPRI | POLLRDBAND);
+
+ return *p_sought & (POLLOUT | POLLWRNORM | POLLWRBAND);
+ }
+}
+
+/* Convert fd_sets returned by select into revents values. */
+
+static int
+win32_compute_revents_socket (SOCKET h, int sought, long lNetworkEvents)
+{
+ int happened = 0;
+
+ if ((lNetworkEvents & (FD_READ | FD_ACCEPT | FD_CLOSE)) == FD_ACCEPT)
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ else if (lNetworkEvents & (FD_READ | FD_ACCEPT | FD_CLOSE))
+ {
+ int r, error;
+
+ char data[64];
+ WSASetLastError (0);
+ r = recv (h, data, sizeof (data), MSG_PEEK);
+ error = WSAGetLastError ();
+ WSASetLastError (0);
+
+ if (r > 0 || error == WSAENOTCONN)
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ /* Distinguish hung-up sockets from other errors. */
+ else if (r == 0 || error == WSAESHUTDOWN || error == WSAECONNRESET
+ || error == WSAECONNABORTED || error == WSAENETRESET)
+ happened |= POLLHUP;
+
+ else
+ happened |= POLLERR;
+ }
+
+ if (lNetworkEvents & (FD_WRITE | FD_CONNECT))
+ happened |= (POLLOUT | POLLWRNORM | POLLWRBAND) & sought;
+
+ if (lNetworkEvents & FD_OOB)
+ happened |= (POLLPRI | POLLRDBAND) & sought;
+
+ return happened;
+}
+
+#else /* !MinGW */
+
+/* Convert select(2) returned fd_sets into poll(2) revents values. */
+static int
+compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
+{
+ int happened = 0;
+ if (FD_ISSET (fd, rfds))
+ {
+ int r;
+ int socket_errno;
+
+# if defined __MACH__ && defined __APPLE__
+ /* There is a bug in Mac OS X that causes it to ignore MSG_PEEK
+ for some kinds of descriptors. Detect if this descriptor is a
+ connected socket, a server socket, or something else using a
+ 0-byte recv, and use ioctl(2) to detect POLLHUP. */
+ r = recv (fd, NULL, 0, MSG_PEEK);
+ socket_errno = (r < 0) ? errno : 0;
+ if (r == 0 || socket_errno == ENOTSOCK)
+ ioctl (fd, FIONREAD, &r);
+# else
+ char data[64];
+ r = recv (fd, data, sizeof (data), MSG_PEEK);
+ socket_errno = (r < 0) ? errno : 0;
+# endif
+ if (r == 0)
+ happened |= POLLHUP;
+
+ /* If the event happened on an unconnected server socket,
+ that's fine. */
+ else if (r > 0 || ( /* (r == -1) && */ socket_errno == ENOTCONN))
+ happened |= (POLLIN | POLLRDNORM) & sought;
+
+ /* Distinguish hung-up sockets from other errors. */
+ else if (socket_errno == ESHUTDOWN || socket_errno == ECONNRESET
+ || socket_errno == ECONNABORTED || socket_errno == ENETRESET)
+ happened |= POLLHUP;
+
+ else
+ happened |= POLLERR;
+ }
+
+ if (FD_ISSET (fd, wfds))
+ happened |= (POLLOUT | POLLWRNORM | POLLWRBAND) & sought;
+
+ if (FD_ISSET (fd, efds))
+ happened |= (POLLPRI | POLLRDBAND) & sought;
+
+ return happened;
+}
+#endif /* !MinGW */
+
+int
+poll (struct pollfd *pfd, nfds_t nfd, int timeout)
+{
+#ifndef WIN32_NATIVE
+ fd_set rfds, wfds, efds;
+ struct timeval tv;
+ struct timeval *ptv;
+ int maxfd, rc;
+ nfds_t i;
+
+# ifdef _SC_OPEN_MAX
+ static int sc_open_max = -1;
+
+ if (nfd < 0
+ || (nfd > sc_open_max
+ && (sc_open_max != -1
+ || nfd > (sc_open_max = sysconf (_SC_OPEN_MAX)))))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# else /* !_SC_OPEN_MAX */
+# ifdef OPEN_MAX
+ if (nfd < 0 || nfd > OPEN_MAX)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# endif /* OPEN_MAX -- else, no check is needed */
+# endif /* !_SC_OPEN_MAX */
+
+ /* EFAULT is not necessary to implement, but let's do it in the
+ simplest case. */
+ if (!pfd)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* convert timeout number into a timeval structure */
+ if (timeout == 0)
+ {
+ ptv = &tv;
+ ptv->tv_sec = 0;
+ ptv->tv_usec = 0;
+ }
+ else if (timeout > 0)
+ {
+ ptv = &tv;
+ ptv->tv_sec = timeout / 1000;
+ ptv->tv_usec = (timeout % 1000) * 1000;
+ }
+ else if (timeout == INFTIM)
+ /* wait forever */
+ ptv = NULL;
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* create fd sets and determine max fd */
+ maxfd = -1;
+ FD_ZERO (&rfds);
+ FD_ZERO (&wfds);
+ FD_ZERO (&efds);
+ for (i = 0; i < nfd; i++)
+ {
+ if (pfd[i].fd < 0)
+ continue;
+
+ if (pfd[i].events & (POLLIN | POLLRDNORM))
+ FD_SET (pfd[i].fd, &rfds);
+
+ /* see select(2): "the only exceptional condition detectable
+ is out-of-band data received on a socket", hence we push
+ POLLWRBAND events onto wfds instead of efds. */
+ if (pfd[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND))
+ FD_SET (pfd[i].fd, &wfds);
+ if (pfd[i].events & (POLLPRI | POLLRDBAND))
+ FD_SET (pfd[i].fd, &efds);
+ if (pfd[i].fd >= maxfd
+ && (pfd[i].events & (POLLIN | POLLOUT | POLLPRI
+ | POLLRDNORM | POLLRDBAND
+ | POLLWRNORM | POLLWRBAND)))
+ {
+ maxfd = pfd[i].fd;
+ if (maxfd > FD_SETSIZE)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ }
+ }
+
+ /* examine fd sets */
+ rc = select (maxfd + 1, &rfds, &wfds, &efds, ptv);
+ if (rc < 0)
+ return rc;
+
+ /* establish results */
+ rc = 0;
+ for (i = 0; i < nfd; i++)
+ if (pfd[i].fd < 0)
+ pfd[i].revents = 0;
+ else
+ {
+ int happened = compute_revents (pfd[i].fd, pfd[i].events,
+ &rfds, &wfds, &efds);
+ if (happened)
+ {
+ pfd[i].revents = happened;
+ rc++;
+ }
+ }
+
+ return rc;
+#else
+ static struct timeval tv0;
+ static HANDLE hEvent;
+ WSANETWORKEVENTS ev;
+ HANDLE h, handle_array[FD_SETSIZE + 2];
+ DWORD ret, wait_timeout, nhandles;
+ fd_set rfds, wfds, xfds;
+ BOOL poll_again;
+ MSG msg;
+ int rc = 0;
+ nfds_t i;
+
+ if (nfd < 0 || timeout < -1)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (!hEvent)
+ hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+
+restart:
+ handle_array[0] = hEvent;
+ nhandles = 1;
+ FD_ZERO (&rfds);
+ FD_ZERO (&wfds);
+ FD_ZERO (&xfds);
+
+ /* Classify socket handles and create fd sets. */
+ for (i = 0; i < nfd; i++)
+ {
+ int sought = pfd[i].events;
+ pfd[i].revents = 0;
+ if (pfd[i].fd < 0)
+ continue;
+ if (!(sought & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLWRBAND
+ | POLLPRI | POLLRDBAND)))
+ continue;
+
+ h = (HANDLE) _get_osfhandle (pfd[i].fd);
+ assert (h != NULL);
+ if (IsSocketHandle (h))
+ {
+ int requested = FD_CLOSE;
+
+ /* see above; socket handles are mapped onto select. */
+ if (sought & (POLLIN | POLLRDNORM))
+ {
+ requested |= FD_READ | FD_ACCEPT;
+ FD_SET ((SOCKET) h, &rfds);
+ }
+ if (sought & (POLLOUT | POLLWRNORM | POLLWRBAND))
+ {
+ requested |= FD_WRITE | FD_CONNECT;
+ FD_SET ((SOCKET) h, &wfds);
+ }
+ if (sought & (POLLPRI | POLLRDBAND))
+ {
+ requested |= FD_OOB;
+ FD_SET ((SOCKET) h, &xfds);
+ }
+
+ if (requested)
+ WSAEventSelect ((SOCKET) h, hEvent, requested);
+ }
+ else
+ {
+ /* Poll now. If we get an event, do not poll again. Also,
+ screen buffer handles are waitable, and they'll block until
+ a character is available. win32_compute_revents eliminates
+ bits for the "wrong" direction. */
+ pfd[i].revents = win32_compute_revents (h, &sought);
+ if (sought)
+ handle_array[nhandles++] = h;
+ if (pfd[i].revents)
+ timeout = 0;
+ }
+ }
+
+ if (select (0, &rfds, &wfds, &xfds, &tv0) > 0)
+ {
+ /* Do MsgWaitForMultipleObjects anyway to dispatch messages, but
+ no need to call select again. */
+ poll_again = FALSE;
+ wait_timeout = 0;
+ }
+ else
+ {
+ poll_again = TRUE;
+ if (timeout == INFTIM)
+ wait_timeout = INFINITE;
+ else
+ wait_timeout = timeout;
+ }
+
+ for (;;)
+ {
+ ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
+ wait_timeout, QS_ALLINPUT);
+
+ if (ret == WAIT_OBJECT_0 + nhandles)
+ {
+ /* new input of some other kind */
+ BOOL bRet;
+ while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ else
+ break;
+ }
+
+ if (poll_again)
+ select (0, &rfds, &wfds, &xfds, &tv0);
+
+ /* Place a sentinel at the end of the array. */
+ handle_array[nhandles] = NULL;
+ nhandles = 1;
+ for (i = 0; i < nfd; i++)
+ {
+ int happened;
+
+ if (pfd[i].fd < 0)
+ continue;
+ if (!(pfd[i].events & (POLLIN | POLLRDNORM |
+ POLLOUT | POLLWRNORM | POLLWRBAND)))
+ continue;
+
+ h = (HANDLE) _get_osfhandle (pfd[i].fd);
+ if (h != handle_array[nhandles])
+ {
+ /* It's a socket. */
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ WSAEventSelect ((SOCKET) h, 0, 0);
+
+ /* If we're lucky, WSAEnumNetworkEvents already provided a way
+ to distinguish FD_READ and FD_ACCEPT; this saves a recv later. */
+ if (FD_ISSET ((SOCKET) h, &rfds)
+ && !(ev.lNetworkEvents & (FD_READ | FD_ACCEPT)))
+ ev.lNetworkEvents |= FD_READ | FD_ACCEPT;
+ if (FD_ISSET ((SOCKET) h, &wfds))
+ ev.lNetworkEvents |= FD_WRITE | FD_CONNECT;
+ if (FD_ISSET ((SOCKET) h, &xfds))
+ ev.lNetworkEvents |= FD_OOB;
+
+ happened = win32_compute_revents_socket ((SOCKET) h, pfd[i].events,
+ ev.lNetworkEvents);
+ }
+ else
+ {
+ /* Not a socket. */
+ int sought = pfd[i].events;
+ happened = win32_compute_revents (h, &sought);
+ nhandles++;
+ }
+
+ if ((pfd[i].revents |= happened) != 0)
+ rc++;
+ }
+
+ if (!rc && timeout == INFTIM)
+ {
+ SwitchToThread();
+ goto restart;
+ }
+
+ return rc;
+#endif
+}
diff --git a/gnulib/lib/poll.in.h b/gnulib/lib/poll.in.h
new file mode 100644
index 0000000..722eff1
--- /dev/null
+++ b/gnulib/lib/poll.in.h
@@ -0,0 +1,104 @@
+/* Header for poll(2) emulation
+ Contributed by Paolo Bonzini.
+
+ Copyright 2001-2003, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_POLL_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_POLL_H@
+# @INCLUDE_NEXT@ @NEXT_POLL_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_POLL_H
+#define _@GUARD_PREFIX@_POLL_H
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if !@HAVE_POLL_H@
+
+/* fake a poll(2) environment */
+# define POLLIN 0x0001 /* any readable data available */
+# define POLLPRI 0x0002 /* OOB/Urgent readable data */
+# define POLLOUT 0x0004 /* file descriptor is writeable */
+# define POLLERR 0x0008 /* some poll error occurred */
+# define POLLHUP 0x0010 /* file descriptor was "hung up" */
+# define POLLNVAL 0x0020 /* requested events "invalid" */
+# define POLLRDNORM 0x0040
+# define POLLRDBAND 0x0080
+# define POLLWRNORM 0x0100
+# define POLLWRBAND 0x0200
+
+# if !GNULIB_defined_poll_types
+
+struct pollfd
+{
+ int fd; /* which file descriptor to poll */
+ short events; /* events we are interested in */
+ short revents; /* events found on return */
+};
+
+typedef unsigned long nfds_t;
+
+# define GNULIB_defined_poll_types 1
+# endif
+
+/* Define INFTIM only if doing so conforms to POSIX. */
+# if !defined (_POSIX_C_SOURCE) && !defined (_XOPEN_SOURCE)
+# define INFTIM (-1)
+# endif
+
+#endif
+
+
+#if @GNULIB_POLL@
+# if @REPLACE_POLL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef poll
+# define poll rpl_poll
+# endif
+_GL_FUNCDECL_RPL (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout));
+_GL_CXXALIAS_RPL (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout));
+# else
+# if !@HAVE_POLL@
+_GL_FUNCDECL_SYS (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout));
+# endif
+_GL_CXXALIAS_SYS (poll, int, (struct pollfd *pfd, nfds_t nfd, int timeout));
+# endif
+_GL_CXXALIASWARN (poll);
+#elif defined GNULIB_POSIXCHECK
+# undef poll
+# if HAVE_RAW_DECL_POLL
+_GL_WARN_ON_USE (poll, "poll is unportable - "
+ "use gnulib module poll for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_POLL_H */
+#endif /* _@GUARD_PREFIX@_POLL_H */
diff --git a/gnulib/lib/popen-safer.c b/gnulib/lib/popen-safer.c
new file mode 100644
index 0000000..07bfb1d
--- /dev/null
+++ b/gnulib/lib/popen-safer.c
@@ -0,0 +1,93 @@
+/* Invoke popen, but avoid some glitches.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "cloexec.h"
+
+/* Like open (name, flags | O_CLOEXEC), although not necessarily
+ atomic. FLAGS must not include O_CREAT. */
+
+static int
+open_noinherit (char const *name, int flags)
+{
+ int fd;
+#if O_CLOEXEC
+ /* 0 = unknown, 1 = yes, -1 = no. */
+ static int have_cloexec;
+ if (have_cloexec >= 0)
+ {
+ fd = open (name, flags | O_CLOEXEC);
+ if (have_cloexec == 0 && (0 <= fd || errno == EINVAL))
+ have_cloexec = (0 <= fd ? 1 : -1);
+ if (have_cloexec == 1)
+ return fd;
+ }
+#endif
+
+ fd = open (name, flags);
+ if (0 <= fd && set_cloexec_flag (fd, true) != 0)
+ {
+ int saved_errno = errno;
+ close (fd);
+ fd = -1;
+ errno = saved_errno;
+ }
+ return fd;
+}
+
+/* Like popen, but do not return stdin, stdout, or stderr. */
+
+FILE *
+popen_safer (char const *cmd, char const *mode)
+{
+ /* Unfortunately, we cannot use the fopen_safer approach of using
+ fdopen (dup_safer (fileno (popen (cmd, mode)))), because stdio
+ libraries maintain hidden state tying the original fd to the pid
+ to wait on when using pclose (this hidden state is also used to
+ avoid fd leaks in subsequent popen calls). So, we instead
+ guarantee that all standard streams are open prior to the popen
+ call (even though this puts more pressure on open fds), so that
+ the original fd created by popen is safe. */
+ FILE *fp;
+ int fd = open_noinherit ("/dev/null", O_RDONLY);
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ /* Maximum recursion depth is 3. */
+ int saved_errno;
+ fp = popen_safer (cmd, mode);
+ saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ else
+ {
+ /* Either all fd's are tied up, or fd is safe and the real popen
+ will reuse it. */
+ close (fd);
+ fp = popen (cmd, mode);
+ }
+ return fp;
+}
diff --git a/gnulib/lib/popen.c b/gnulib/lib/popen.c
new file mode 100644
index 0000000..4330479
--- /dev/null
+++ b/gnulib/lib/popen.c
@@ -0,0 +1,103 @@
+/* Open a stream to a sub-process.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>, 2009. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#if HAVE_POPEN
+
+# include <errno.h>
+# include <fcntl.h>
+# include <stdlib.h>
+# include <unistd.h>
+
+# undef popen
+
+FILE *
+rpl_popen (const char *filename, const char *mode)
+{
+ /* The mingw popen works fine, and all other platforms have fcntl.
+ The bug of the child clobbering its own file descriptors if stdin
+ or stdout was closed in the parent can be worked around by
+ opening those two fds as close-on-exec to begin with. */
+ /* Cygwin 1.5.x also has a bug where the popen fd is improperly
+ marked close-on-exec, and if the application undoes this, then
+ the fd leaks into subsequent popen calls. We could work around
+ this by maintaining a list of all fd's opened by popen, and
+ temporarily marking them cloexec around the real popen call, but
+ we would also have to override pclose, and the bookkeepping seems
+ extreme given that cygwin 1.7 no longer has the bug. */
+ FILE *result;
+ int cloexec0 = fcntl (STDIN_FILENO, F_GETFD);
+ int cloexec1 = fcntl (STDOUT_FILENO, F_GETFD);
+ int saved_errno;
+
+ /* If either stdin or stdout was closed (that is, fcntl failed),
+ then we open a dummy close-on-exec fd to occupy that slot. That
+ way, popen's internal use of pipe() will not contain either fd 0
+ or 1, overcoming the fact that the child process blindly calls
+ close() on the parent's end of the pipe without first checking
+ whether it is clobbering the fd just placed there via dup2(); the
+ exec will get rid of the dummy fd's in the child. Fortunately,
+ closed stderr in the parent does not cause problems in the
+ child. */
+ if (cloexec0 < 0)
+ {
+ if (open ("/dev/null", O_RDONLY) != STDIN_FILENO
+ || fcntl (STDIN_FILENO, F_SETFD,
+ fcntl (STDIN_FILENO, F_GETFD) | FD_CLOEXEC) == -1)
+ abort ();
+ }
+ if (cloexec1 < 0)
+ {
+ if (open ("/dev/null", O_RDONLY) != STDOUT_FILENO
+ || fcntl (STDOUT_FILENO, F_SETFD,
+ fcntl (STDOUT_FILENO, F_GETFD) | FD_CLOEXEC) == -1)
+ abort ();
+ }
+ result = popen (filename, mode);
+ /* Now, close any dummy fd's created in the parent. */
+ saved_errno = errno;
+ if (cloexec0 < 0)
+ close (STDIN_FILENO);
+ if (cloexec1 < 0)
+ close (STDOUT_FILENO);
+ errno = saved_errno;
+ return result;
+}
+
+#else
+/* Native Woe32 API. */
+
+# include <string.h>
+
+FILE *
+popen (const char *filename, const char *mode)
+{
+ /* Use binary mode by default. */
+ if (strcmp (mode, "r") == 0)
+ mode = "rb";
+ else if (strcmp (mode, "w") == 0)
+ mode = "wb";
+
+ return _popen (filename, mode);
+}
+
+#endif
diff --git a/gnulib/lib/posix_openpt.c b/gnulib/lib/posix_openpt.c
new file mode 100644
index 0000000..137db71
--- /dev/null
+++ b/gnulib/lib/posix_openpt.c
@@ -0,0 +1,108 @@
+/* Open the master side of a pseudo-terminal.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#if defined __OpenBSD__
+# include <sys/ioctl.h>
+# include <sys/tty.h>
+#endif
+
+/* posix_openpt() is already provided on
+ glibc >= 2.2.1 (but is a stub on GNU/Hurd),
+ MacOS X >= 10.4,
+ FreeBSD >= 5.1 (lived in src/lib/libc/stdlib/grantpt.c before 8.0),
+ NetBSD >= 3.0,
+ AIX >= 5.2, HP-UX >= 11.31, Solaris >= 10, Cygwin >= 1.7.
+ Thus, this replacement function is compiled on
+ MacOS X 10.3, OpenBSD 4.9, Minix 3.1.8,
+ AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9,
+ Cygwin 1.5.x, mingw, MSVC 9, Interix 3.5, BeOS.
+ Among these:
+ - AIX has /dev/ptc.
+ - HP-UX 10..11, IRIX 6.5, OSF/1 5.1, Solaris 2.6..9, Cygwin 1.5
+ have /dev/ptmx.
+ - HP-UX 10..11 also has /dev/ptym/clone, but this should not be needed.
+ - OpenBSD 4.9 has /dev/ptm and the PTMGET ioctl.
+ - Minix 3.1.8 have a list of pseudo-terminal devices in /dev.
+ - On native Windows, there are no ttys at all. */
+
+int
+posix_openpt (int flags)
+{
+ int master;
+
+#ifdef _AIX /* AIX */
+
+ master = open ("/dev/ptc", flags);
+
+#elif (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ /* mingw */
+
+ /* Mingw lacks pseudo-terminals altogether. */
+ master = -1;
+ errno = ENOSYS;
+
+#elif defined __OpenBSD__
+
+ /* On OpenBSD, master and slave of a pseudo-terminal are allocated together,
+ by opening /dev/ptm and applying the PTMGET ioctl to it. */
+ int fd;
+ struct ptmget data;
+
+ fd = open (PATH_PTMDEV, O_RDWR);
+ if (fd >= 0)
+ {
+ if (ioctl (fd, PTMGET, &data) >= 0)
+ {
+ master = data.cfd;
+ close (data.sfd);
+ close (fd);
+ }
+ else
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ master = -1;
+ }
+ }
+ else
+ master = -1;
+
+#else /* MacOS X, Minix, HP-UX, IRIX, OSF/1, Solaris 9, Cygwin 1.5 */
+
+ /* Most systems that lack posix_openpt() have /dev/ptmx. */
+ master = open ("/dev/ptmx", flags);
+
+ /* If all this does not work, we could try to open, one by one:
+ - On MacOS X: /dev/pty[p-w][0-9a-f]
+ - On *BSD: /dev/pty[p-sP-S][0-9a-v]
+ - On Minix: /dev/pty[p-q][0-9a-f]
+ - On AIX: /dev/ptyp[0-9a-f]
+ - On HP-UX: /dev/pty[p-r][0-9a-f]
+ - On OSF/1: /dev/pty[p-q][0-9a-f]
+ - On Solaris: /dev/pty[p-r][0-9a-f]
+ */
+
+#endif
+
+ return master;
+}
diff --git a/gnulib/lib/posixtm.c b/gnulib/lib/posixtm.c
new file mode 100644
index 0000000..16e333f
--- /dev/null
+++ b/gnulib/lib/posixtm.c
@@ -0,0 +1,235 @@
+/* Parse dates for touch and date.
+
+ Copyright (C) 1989-1991, 1998, 2000-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Yacc-based version written by Jim Kingdon and David MacKenzie.
+ Rewritten by Jim Meyering. */
+
+#include <config.h>
+
+#include "posixtm.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/*
+ POSIX requires:
+
+ touch -t [[CC]YY]mmddhhmm[.ss] FILE...
+ 8, 10, or 12 digits, followed by optional .ss
+ (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)
+
+ touch mmddhhmm[YY] FILE... (obsoleted by POSIX 1003.1-2001)
+ 8 or 10 digits, YY (if present) must be in the range 69-99
+ (PDS_TRAILING_YEAR | PDS_PRE_2000)
+
+ date mmddhhmm[[CC]YY]
+ 8, 10, or 12 digits
+ (PDS_TRAILING_YEAR | PDS_CENTURY)
+
+*/
+
+static int
+year (struct tm *tm, const int *digit_pair, size_t n, unsigned int syntax_bits)
+{
+ switch (n)
+ {
+ case 1:
+ tm->tm_year = *digit_pair;
+ /* Deduce the century based on the year.
+ POSIX requires that 00-68 be interpreted as 2000-2068,
+ and that 69-99 be interpreted as 1969-1999. */
+ if (digit_pair[0] <= 68)
+ {
+ if (syntax_bits & PDS_PRE_2000)
+ return 1;
+ tm->tm_year += 100;
+ }
+ break;
+
+ case 2:
+ if (! (syntax_bits & PDS_CENTURY))
+ return 1;
+ tm->tm_year = digit_pair[0] * 100 + digit_pair[1] - 1900;
+ break;
+
+ case 0:
+ {
+ time_t now;
+ struct tm *tmp;
+
+ /* Use current year. */
+ time (&now);
+ tmp = localtime (&now);
+ if (! tmp)
+ return 1;
+ tm->tm_year = tmp->tm_year;
+ }
+ break;
+
+ default:
+ abort ();
+ }
+
+ return 0;
+}
+
+static int
+posix_time_parse (struct tm *tm, const char *s, unsigned int syntax_bits)
+{
+ const char *dot = NULL;
+ int pair[6];
+ int *p;
+ size_t i;
+
+ size_t s_len = strlen (s);
+ size_t len = (((syntax_bits & PDS_SECONDS) && (dot = strchr (s, '.')))
+ ? (size_t) (dot - s)
+ : s_len);
+
+ if (len != 8 && len != 10 && len != 12)
+ return 1;
+
+ if (dot)
+ {
+ if (!(syntax_bits & PDS_SECONDS))
+ return 1;
+
+ if (s_len - len != 3)
+ return 1;
+ }
+
+ for (i = 0; i < len; i++)
+ if (!ISDIGIT (s[i]))
+ return 1;
+
+ len /= 2;
+ for (i = 0; i < len; i++)
+ pair[i] = 10 * (s[2*i] - '0') + s[2*i + 1] - '0';
+
+ p = pair;
+ if (syntax_bits & PDS_LEADING_YEAR)
+ {
+ if (year (tm, p, len - 4, syntax_bits))
+ return 1;
+ p += len - 4;
+ len = 4;
+ }
+
+ /* Handle 8 digits worth of `MMDDhhmm'. */
+ tm->tm_mon = *p++ - 1;
+ tm->tm_mday = *p++;
+ tm->tm_hour = *p++;
+ tm->tm_min = *p++;
+ len -= 4;
+
+ /* Handle any trailing year. */
+ if (syntax_bits & PDS_TRAILING_YEAR)
+ {
+ if (year (tm, p, len, syntax_bits))
+ return 1;
+ }
+
+ /* Handle seconds. */
+ if (!dot)
+ {
+ tm->tm_sec = 0;
+ }
+ else
+ {
+ int seconds;
+
+ ++dot;
+ if (!ISDIGIT (dot[0]) || !ISDIGIT (dot[1]))
+ return 1;
+ seconds = 10 * (dot[0] - '0') + dot[1] - '0';
+
+ tm->tm_sec = seconds;
+ }
+
+ return 0;
+}
+
+/* Parse a POSIX-style date, returning true if successful. */
+
+bool
+posixtime (time_t *p, const char *s, unsigned int syntax_bits)
+{
+ struct tm tm0;
+ struct tm tm1;
+ struct tm const *tm;
+ time_t t;
+
+ if (posix_time_parse (&tm0, s, syntax_bits))
+ return false;
+
+ tm1 = tm0;
+ tm1.tm_isdst = -1;
+ t = mktime (&tm1);
+
+ if (t != (time_t) -1)
+ tm = &tm1;
+ else
+ {
+ /* mktime returns -1 for errors, but -1 is also a valid time_t
+ value. Check whether an error really occurred. */
+ tm = localtime (&t);
+ if (! tm)
+ return false;
+ }
+
+ /* Reject dates like "September 31" and times like "25:61".
+ Do not reject times that specify "60" as the number of seconds. */
+ if ((tm0.tm_year ^ tm->tm_year)
+ | (tm0.tm_mon ^ tm->tm_mon)
+ | (tm0.tm_mday ^ tm->tm_mday)
+ | (tm0.tm_hour ^ tm->tm_hour)
+ | (tm0.tm_min ^ tm->tm_min)
+ | (tm0.tm_sec ^ tm->tm_sec))
+ {
+ /* Any mismatch without 60 in the tm_sec field is invalid. */
+ if (tm0.tm_sec != 60)
+ return false;
+
+ {
+ /* Allow times like 01:35:60 or 23:59:60. */
+ time_t dummy;
+ char buf[16];
+ char *b = stpcpy (buf, s);
+ strcpy (b - 2, "59");
+ if (!posixtime (&dummy, buf, syntax_bits))
+ return false;
+ }
+ }
+
+ *p = t;
+ return true;
+}
diff --git a/gnulib/lib/posixtm.h b/gnulib/lib/posixtm.h
new file mode 100644
index 0000000..48aef6a
--- /dev/null
+++ b/gnulib/lib/posixtm.h
@@ -0,0 +1,36 @@
+/* Parse dates for touch and date.
+
+ Copyright (C) 1998, 2003, 2005, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Yacc-based version written by Jim Kingdon and David MacKenzie.
+ Rewritten by Jim Meyering. */
+
+#ifndef POSIXTM_H_
+# define POSIXTM_H_
+
+# include <stdbool.h>
+# include <time.h>
+
+/* POSIX Date Syntax flags. */
+# define PDS_LEADING_YEAR 1
+# define PDS_TRAILING_YEAR 2
+# define PDS_CENTURY 4
+# define PDS_SECONDS 8
+# define PDS_PRE_2000 16
+
+bool posixtime (time_t *p, const char *s, unsigned int syntax_bits);
+
+#endif
diff --git a/gnulib/lib/posixver.c b/gnulib/lib/posixver.c
new file mode 100644
index 0000000..d2b88d4
--- /dev/null
+++ b/gnulib/lib/posixver.c
@@ -0,0 +1,54 @@
+/* Which POSIX version to conform to, for utilities.
+
+ Copyright (C) 2002-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "posixver.h"
+
+#include <limits.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+#ifndef _POSIX2_VERSION
+# define _POSIX2_VERSION 0
+#endif
+
+#ifndef DEFAULT_POSIX2_VERSION
+# define DEFAULT_POSIX2_VERSION _POSIX2_VERSION
+#endif
+
+/* The POSIX version that utilities should conform to. The default is
+ specified by the system. */
+
+int
+posix2_version (void)
+{
+ long int v = DEFAULT_POSIX2_VERSION;
+ char const *s = getenv ("_POSIX2_VERSION");
+
+ if (s && *s)
+ {
+ char *e;
+ long int i = strtol (s, &e, 10);
+ if (! *e)
+ v = i;
+ }
+
+ return v < INT_MIN ? INT_MIN : v < INT_MAX ? v : INT_MAX;
+}
diff --git a/gnulib/lib/posixver.h b/gnulib/lib/posixver.h
new file mode 100644
index 0000000..b64f6a2
--- /dev/null
+++ b/gnulib/lib/posixver.h
@@ -0,0 +1 @@
+int posix2_version (void);
diff --git a/gnulib/lib/powf.c b/gnulib/lib/powf.c
new file mode 100644
index 0000000..d5a81b9
--- /dev/null
+++ b/gnulib/lib/powf.c
@@ -0,0 +1,26 @@
+/* Power function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+powf (float x, float y)
+{
+ return (float) pow ((double) x, (double) y);
+}
diff --git a/gnulib/lib/pread.c b/gnulib/lib/pread.c
new file mode 100644
index 0000000..6ff753e
--- /dev/null
+++ b/gnulib/lib/pread.c
@@ -0,0 +1,65 @@
+/* replacement pread function
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#define __libc_lseek(f,o,w) lseek (f, o, w)
+#define __set_errno(Val) errno = (Val)
+#define __libc_read(f,b,n) read (f, b, n)
+
+/* pread substitute for systems that the function, such as mingw32 and BeOS. */
+/* The following is identical to the function from glibc's
+ sysdeps/posix/pread.c */
+
+/* Note: This implementation of pread is not multithread-safe. */
+
+ssize_t
+pread (int fd, void *buf, size_t nbyte, off_t offset)
+{
+ /* Since we must not change the file pointer preserve the value so that
+ we can restore it later. */
+ int save_errno;
+ ssize_t result;
+ off_t old_offset = __libc_lseek (fd, 0, SEEK_CUR);
+ if (old_offset == (off_t) -1)
+ return -1;
+
+ /* Set to wanted position. */
+ if (__libc_lseek (fd, offset, SEEK_SET) == (off_t) -1)
+ return -1;
+
+ /* Write out the data. */
+ result = __libc_read (fd, buf, nbyte);
+
+ /* Now we have to restore the position. If this fails we have to
+ return this as an error. But if the writing also failed we
+ return this error. */
+ save_errno = errno;
+ if (__libc_lseek (fd, old_offset, SEEK_SET) == (off_t) -1)
+ {
+ if (result == -1)
+ __set_errno (save_errno);
+ return -1;
+ }
+ __set_errno (save_errno);
+
+ return result;
+}
diff --git a/gnulib/lib/printf-args.c b/gnulib/lib/printf-args.c
new file mode 100644
index 0000000..5210a91
--- /dev/null
+++ b/gnulib/lib/printf-args.c
@@ -0,0 +1,188 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be defined.
+ STATIC Set to 'static' to declare the function static. */
+
+#ifndef PRINTF_FETCHARGS
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_FETCHARGS
+# include "printf-args.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_FETCHARGS (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+#endif
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+ default argument promotions", this is not the case in mingw32,
+ where wint_t is 'unsigned short'. */
+ ap->a.a_wide_char =
+ (sizeof (wint_t) < sizeof (int)
+ ? (wint_t) va_arg (args, int)
+ : va_arg (args, wint_t));
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case TYPE_U8_STRING:
+ ap->a.a_u8_string = va_arg (args, const uint8_t *);
+ /* A null pointer is an invalid argument for "%U", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u8_string == NULL)
+ {
+ static const uint8_t u8_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u8_string = u8_null_string;
+ }
+ break;
+ case TYPE_U16_STRING:
+ ap->a.a_u16_string = va_arg (args, const uint16_t *);
+ /* A null pointer is an invalid argument for "%lU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u16_string == NULL)
+ {
+ static const uint16_t u16_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u16_string = u16_null_string;
+ }
+ break;
+ case TYPE_U32_STRING:
+ ap->a.a_u32_string = va_arg (args, const uint32_t *);
+ /* A null pointer is an invalid argument for "%llU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u32_string == NULL)
+ {
+ static const uint32_t u32_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u32_string = u32_null_string;
+ }
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/gnulib/lib/printf-args.h b/gnulib/lib/printf-args.h
new file mode 100644
index 0000000..e03eb6e
--- /dev/null
+++ b/gnulib/lib/printf-args.h
@@ -0,0 +1,159 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2006-2007, 2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be declared.
+ STATIC Set to 'static' to declare the function static. */
+
+/* Default parameters. */
+#ifndef PRINTF_FETCHARGS
+# define PRINTF_FETCHARGS printf_fetchargs
+#endif
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+#if HAVE_LONG_LONG_INT
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+#endif
+ TYPE_DOUBLE,
+ TYPE_LONGDOUBLE,
+ TYPE_CHAR,
+#if HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#if HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER
+#if HAVE_LONG_LONG_INT
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+, TYPE_U8_STRING
+, TYPE_U16_STRING
+, TYPE_U32_STRING
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+#if HAVE_LONG_LONG_INT
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+#endif
+ float a_float;
+ double a_double;
+ long double a_longdouble;
+ int a_char;
+#if HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#if HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+#if HAVE_LONG_LONG_INT
+ long long int * a_count_longlongint_pointer;
+#endif
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ const uint8_t * a_u8_string;
+ const uint16_t * a_u16_string;
+ const uint32_t * a_u32_string;
+#endif
+ }
+ a;
+}
+argument;
+
+/* Number of directly allocated arguments (no malloc() needed). */
+#define N_DIRECT_ALLOC_ARGUMENTS 7
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+ argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int PRINTF_FETCHARGS (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/gnulib/lib/printf-frexp.c b/gnulib/lib/printf-frexp.c
new file mode 100644
index 0000000..267081c
--- /dev/null
+++ b/gnulib/lib/printf-frexp.c
@@ -0,0 +1,190 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifdef USE_LONG_DOUBLE
+# include "printf-frexpl.h"
+#else
+# include "printf-frexp.h"
+#endif
+
+#include <float.h>
+#include <math.h>
+#ifdef USE_LONG_DOUBLE
+# include "fpucw.h"
+#endif
+
+/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
+ than 2, or not even a power of 2, some rounding errors can occur, so that
+ then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC printf_frexpl
+# define DOUBLE long double
+# define MIN_EXP LDBL_MIN_EXP
+# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexpl
+# define LDEXP ldexpl
+# endif
+# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
+# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
+# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
+# define L_(literal) literal##L
+#else
+# define FUNC printf_frexp
+# define DOUBLE double
+# define MIN_EXP DBL_MIN_EXP
+# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC
+# define USE_FREXP_LDEXP
+# define FREXP frexp
+# define LDEXP ldexp
+# endif
+# define DECL_ROUNDING
+# define BEGIN_ROUNDING()
+# define END_ROUNDING()
+# define L_(literal) literal
+#endif
+
+DOUBLE
+FUNC (DOUBLE x, int *expptr)
+{
+ int exponent;
+ DECL_ROUNDING
+
+ BEGIN_ROUNDING ();
+
+#ifdef USE_FREXP_LDEXP
+ /* frexp and ldexp are usually faster than the loop below. */
+ x = FREXP (x, &exponent);
+
+ x = x + x;
+ exponent -= 1;
+
+ if (exponent < MIN_EXP - 1)
+ {
+ x = LDEXP (x, exponent - (MIN_EXP - 1));
+ exponent = MIN_EXP - 1;
+ }
+#else
+ {
+ /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
+ loops are executed no more than 64 times. */
+ DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
+ DOUBLE powh[64]; /* powh[i] = 2^-2^i */
+ int i;
+
+ exponent = 0;
+ if (x >= L_(1.0))
+ {
+ /* A nonnegative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x >= 1.0. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (x >= pow2_i)
+ {
+ exponent += (1 << i);
+ x *= powh_i;
+ }
+ else
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here 1.0 <= x < 2^2^i. */
+ }
+ else
+ {
+ /* A negative exponent. */
+ {
+ DOUBLE pow2_i; /* = pow2[i] */
+ DOUBLE powh_i; /* = powh[i] */
+
+ /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
+ x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */
+ for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
+ ;
+ i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
+ {
+ if (exponent - (1 << i) < MIN_EXP - 1)
+ break;
+
+ exponent -= (1 << i);
+ x *= pow2_i;
+ if (x >= L_(1.0))
+ break;
+
+ pow2[i] = pow2_i;
+ powh[i] = powh_i;
+ }
+ }
+ /* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+
+ if (x < L_(1.0))
+ /* Invariants: x * 2^exponent = argument, x < 1.0 and
+ exponent - 2^i < MIN_EXP - 1 <= exponent. */
+ while (i > 0)
+ {
+ i--;
+ if (exponent - (1 << i) >= MIN_EXP - 1)
+ {
+ exponent -= (1 << i);
+ x *= pow2[i];
+ if (x >= L_(1.0))
+ break;
+ }
+ }
+
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ }
+
+ /* Invariants: x * 2^exponent = argument, and
+ either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
+ while (i > 0)
+ {
+ i--;
+ if (x >= pow2[i])
+ {
+ exponent += (1 << i);
+ x *= powh[i];
+ }
+ }
+ /* Here either x < 1.0 and exponent = MIN_EXP - 1,
+ or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */
+ }
+#endif
+
+ END_ROUNDING ();
+
+ *expptr = exponent;
+ return x;
+}
diff --git a/gnulib/lib/printf-frexp.h b/gnulib/lib/printf-frexp.h
new file mode 100644
index 0000000..10dd371
--- /dev/null
+++ b/gnulib/lib/printf-frexp.h
@@ -0,0 +1,23 @@
+/* Split a double into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= DBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern double printf_frexp (double x, int *expptr);
diff --git a/gnulib/lib/printf-frexpl.c b/gnulib/lib/printf-frexpl.c
new file mode 100644
index 0000000..2de6528
--- /dev/null
+++ b/gnulib/lib/printf-frexpl.c
@@ -0,0 +1,37 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include "printf-frexpl.h"
+
+# include "printf-frexp.h"
+
+long double
+printf_frexpl (long double x, int *expptr)
+{
+ return printf_frexp (x, expptr);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "printf-frexp.c"
+
+#endif
diff --git a/gnulib/lib/printf-frexpl.h b/gnulib/lib/printf-frexpl.h
new file mode 100644
index 0000000..a8cbcbf
--- /dev/null
+++ b/gnulib/lib/printf-frexpl.h
@@ -0,0 +1,23 @@
+/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Write a finite, positive number x as
+ x = mantissa * 2^exp
+ where exp >= LDBL_MIN_EXP - 1,
+ mantissa < 2.0,
+ if x is not a denormalized number then mantissa >= 1.0.
+ Store exp in *EXPPTR and return mantissa. */
+extern long double printf_frexpl (long double x, int *expptr);
diff --git a/gnulib/lib/printf-parse.c b/gnulib/lib/printf-parse.c
new file mode 100644
index 0000000..c4e1d37
--- /dev/null
+++ b/gnulib/lib/printf-parse.c
@@ -0,0 +1,639 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ CHAR_T The element type of the format string.
+ CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on CHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on CHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on CHAR_T.
+ STATIC Set to 'static' to declare the function static.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_PARSE
+# include "printf-parse.h"
+#endif
+
+/* Default parameters. */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if defined IN_LIBINTL || defined IN_LIBASPRINTF
+# if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+# endif
+# if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+# endif
+#else
+# include <stdint.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+/* memcpy(). */
+#include <string.h>
+
+/* errno. */
+#include <errno.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if CHAR_T_ONLY_ASCII
+/* c_isascii(). */
+# include "c-ctype.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
+ d->dir = d->direct_alloc_dir;
+
+ a->count = 0;
+ a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
+ a->arg = a->direct_alloc_arg;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated = xtimes (a_allocated, 2); \
+ if (a_allocated <= n) \
+ a_allocated = xsum (n, 1); \
+ memory_size = xtimes (a_allocated, sizeof (argument)); \
+ if (size_overflow_p (memory_size)) \
+ /* Overflow, would lead to out of memory. */ \
+ goto out_of_memory; \
+ memory = (argument *) (a->arg != a->direct_alloc_arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto out_of_memory; \
+ if (a->arg == a->direct_alloc_arg) \
+ memcpy (memory, a->arg, a->count * sizeof (argument)); \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_T c = *cp++;
+ if (c == '%')
+ {
+ size_t arg_index = ARG_NONE;
+ DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = ARG_NONE;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = ARG_NONE;
+ dp->arg_index = ARG_NONE;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ else if (*cp == 'I')
+ {
+ dp->flags |= FLAG_LOCALIZED;
+ cp++;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index == ARG_NONE)
+ {
+ dp->width_arg_index = arg_posn++;
+ if (dp->width_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ size_t width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory
+ later. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index == ARG_NONE)
+ {
+ dp->precision_arg_index = arg_posn++;
+ if (dp->precision_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ size_t precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#if defined __APPLE__ && defined __MACH__
+ /* On MacOS X 10.3, PRIdMAX is defined as "qd".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'q')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* int64_t = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* int64_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On native Win32, PRIdMAX is defined as "I64d".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* __int64 = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* __int64 = long */
+ flags += 8;
+ }
+ cp += 3;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+#endif
+ /* If 'long long' exists and is the same as 'long', we parse
+ "lld" into TYPE_LONGINT. */
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+#endif
+ /* If 'unsigned long long' exists and is the same as
+ 'unsigned long', we parse "llu" into TYPE_ULONGINT. */
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#if HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#if HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#if HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#if HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+#if HAVE_LONG_LONG_INT
+ /* If 'long long' exists and is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+#endif
+ /* If 'long long' exists and is the same as 'long', we parse
+ "lln" into TYPE_COUNT_LONGINT_POINTER. */
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case 'U':
+ if (flags >= 16)
+ type = TYPE_U32_STRING;
+ else if (flags >= 8)
+ type = TYPE_U16_STRING;
+ else
+ type = TYPE_U8_STRING;
+ break;
+#endif
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == ARG_NONE)
+ {
+ dp->arg_index = arg_posn++;
+ if (dp->arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ size_t memory_size;
+ DIRECTIVE *memory;
+
+ d_allocated = xtimes (d_allocated, 2);
+ memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
+ ? realloc (d->dir, memory_size)
+ : malloc (memory_size));
+ if (memory == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ if (d->dir == d->direct_alloc_dir)
+ memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
+ d->dir = memory;
+ }
+ }
+#if CHAR_T_ONLY_ASCII
+ else if (!c_isascii (c))
+ {
+ /* Non-ASCII character. Not supported. */
+ goto error;
+ }
+#endif
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = EINVAL;
+ return -1;
+
+out_of_memory:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = ENOMEM;
+ return -1;
+}
+
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
+#undef CHAR_T
diff --git a/gnulib/lib/printf-parse.h b/gnulib/lib/printf-parse.h
new file mode 100644
index 0000000..c819f94
--- /dev/null
+++ b/gnulib/lib/printf-parse.h
@@ -0,0 +1,194 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ STATIC Set to 'static' to declare the function static. */
+
+#if HAVE_FEATURES_H
+# include <features.h> /* for __GLIBC__, __UCLIBC__ */
+#endif
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
+#endif
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* xxx_directive: A parsed directive.
+ xxx_directives: A parsed format string. */
+
+/* Number of directly allocated directives (no malloc() needed). */
+#define N_DIRECT_ALLOC_DIRECTIVES 7
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+char_directives;
+
+#if ENABLE_UNISTDIO
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint8_t* dir_start;
+ const uint8_t* dir_end;
+ int flags;
+ const uint8_t* width_start;
+ const uint8_t* width_end;
+ size_t width_arg_index;
+ const uint8_t* precision_start;
+ const uint8_t* precision_end;
+ size_t precision_arg_index;
+ uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u8_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u8_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u8_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint16_t* dir_start;
+ const uint16_t* dir_end;
+ int flags;
+ const uint16_t* width_start;
+ const uint16_t* width_end;
+ size_t width_arg_index;
+ const uint16_t* precision_start;
+ const uint16_t* precision_end;
+ size_t precision_arg_index;
+ uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u16_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u16_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u16_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint32_t* dir_start;
+ const uint32_t* dir_end;
+ int flags;
+ const uint32_t* width_start;
+ const uint32_t* width_end;
+ size_t width_arg_index;
+ const uint32_t* precision_start;
+ const uint32_t* precision_end;
+ size_t precision_arg_index;
+ uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u32_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u32_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u32_directives;
+
+#endif
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#if ENABLE_UNISTDIO
+extern int
+ ulc_printf_parse (const char *format, char_directives *d, arguments *a);
+extern int
+ u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
+extern int
+ u16_printf_parse (const uint16_t *format, u16_directives *d,
+ arguments *a);
+extern int
+ u32_printf_parse (const uint32_t *format, u32_directives *d,
+ arguments *a);
+#else
+# ifdef STATIC
+STATIC
+# else
+extern
+# endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+#endif
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/gnulib/lib/printf.c b/gnulib/lib/printf.c
new file mode 100644
index 0000000..d49b392
--- /dev/null
+++ b/gnulib/lib/printf.c
@@ -0,0 +1,40 @@
+/* Formatted output to a stream.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <stdarg.h>
+
+/* Print formatted output to standard output.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
diff --git a/gnulib/lib/priv-set.c b/gnulib/lib/priv-set.c
new file mode 100644
index 0000000..1b5429e
--- /dev/null
+++ b/gnulib/lib/priv-set.c
@@ -0,0 +1,142 @@
+/* Query, remove, or restore a Solaris privilege.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by David Bartley. */
+
+#include <config.h>
+#include "priv-set.h"
+
+#if HAVE_GETPPRIV && HAVE_PRIV_H
+
+# include <errno.h>
+# include <stdbool.h>
+# include <priv.h>
+
+/* Holds a (cached) copy of the effective set. */
+static priv_set_t *eff_set;
+
+/* Holds a set of privileges that we have removed. */
+static priv_set_t *rem_set;
+
+static bool initialized;
+
+static int
+priv_set_initialize (void)
+{
+ if (! initialized)
+ {
+ eff_set = priv_allocset ();
+ if (!eff_set)
+ {
+ return -1;
+ }
+ rem_set = priv_allocset ();
+ if (!rem_set)
+ {
+ priv_freeset (eff_set);
+ return -1;
+ }
+ if (getppriv (PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_freeset (eff_set);
+ priv_freeset (rem_set);
+ return -1;
+ }
+ priv_emptyset (rem_set);
+ initialized = true;
+ }
+
+ return 0;
+}
+
+
+/* Check if priv is in the effective set.
+ Returns 1 if priv is a member and 0 if not.
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_ismember (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ return priv_ismember (eff_set, priv);
+}
+
+
+/* Try to remove priv from the effective set.
+ Returns 0 if priv was removed.
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_remove (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ if (priv_ismember (eff_set, priv))
+ {
+ /* priv_addset/priv_delset can only fail if priv is invalid, which is
+ checked above by the priv_ismember call. */
+ priv_delset (eff_set, priv);
+ if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_addset (eff_set, priv);
+ return -1;
+ }
+ priv_addset (rem_set, priv);
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* Try to restore priv to the effective set.
+ Returns 0 if priv was re-added to the effective set (after being previously
+ removed by a call to priv_set_remove).
+ Returns -1 on error with errno set appropriately. */
+int
+priv_set_restore (const char *priv)
+{
+ if (! initialized && priv_set_initialize () != 0)
+ return -1;
+
+ if (priv_ismember (rem_set, priv))
+ {
+ /* priv_addset/priv_delset can only fail if priv is invalid, which is
+ checked above by the priv_ismember call. */
+ priv_addset (eff_set, priv);
+ if (setppriv (PRIV_SET, PRIV_EFFECTIVE, eff_set) != 0)
+ {
+ priv_delset (eff_set, priv);
+ return -1;
+ }
+ priv_delset (rem_set, priv);
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/priv-set.h b/gnulib/lib/priv-set.h
new file mode 100644
index 0000000..dfdb2ca
--- /dev/null
+++ b/gnulib/lib/priv-set.h
@@ -0,0 +1,50 @@
+/* Query, remove, or restore a Solaris privilege.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by David Bartley. */
+
+#if HAVE_GETPPRIV && HAVE_PRIV_H
+
+# include <priv.h>
+
+int priv_set_ismember (const char *priv);
+int priv_set_remove (const char *priv);
+int priv_set_restore (const char *priv);
+
+static inline int priv_set_remove_linkdir (void)
+{
+ return priv_set_remove (PRIV_SYS_LINKDIR);
+}
+
+static inline int priv_set_restore_linkdir (void)
+{
+ return priv_set_restore (PRIV_SYS_LINKDIR);
+}
+
+#else
+
+static inline int priv_set_remove_linkdir (void)
+{
+ return -1;
+}
+
+static inline int priv_set_restore_linkdir (void)
+{
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/progname.c b/gnulib/lib/progname.c
new file mode 100644
index 0000000..2465748
--- /dev/null
+++ b/gnulib/lib/progname.c
@@ -0,0 +1,92 @@
+/* Program name management.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */
+#include "progname.h"
+
+#include <errno.h> /* get program_invocation_name declaration */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* String containing name the program is called with.
+ To be initialized by main(). */
+const char *program_name = NULL;
+
+/* Set program_name, based on argv[0].
+ argv0 must be a string allocated with indefinite extent, and must not be
+ modified after this call. */
+void
+set_program_name (const char *argv0)
+{
+ /* libtool creates a temporary executable whose name is sometimes prefixed
+ with "lt-" (depends on the platform). It also makes argv[0] absolute.
+ But the name of the temporary executable is a detail that should not be
+ visible to the end user and to the test suite.
+ Remove this "<dirname>/.libs/" or "<dirname>/.libs/lt-" prefix here. */
+ const char *slash;
+ const char *base;
+
+ /* Sanity check. POSIX requires the invoking process to pass a non-NULL
+ argv[0]. */
+ if (argv0 == NULL)
+ {
+ /* It's a bug in the invoking program. Help diagnosing it. */
+ fputs ("A NULL argv[0] was passed through an exec system call.\n",
+ stderr);
+ abort ();
+ }
+
+ slash = strrchr (argv0, '/');
+ base = (slash != NULL ? slash + 1 : argv0);
+ if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0)
+ {
+ argv0 = base;
+ if (strncmp (base, "lt-", 3) == 0)
+ {
+ argv0 = base + 3;
+ /* On glibc systems, remove the "lt-" prefix from the variable
+ program_invocation_short_name. */
+#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+ program_invocation_short_name = (char *) argv0;
+#endif
+ }
+ }
+
+ /* But don't strip off a leading <dirname>/ in general, because when the user
+ runs
+ /some/hidden/place/bin/cp foo foo
+ he should get the error message
+ /some/hidden/place/bin/cp: `foo' and `foo' are the same file
+ not
+ cp: `foo' and `foo' are the same file
+ */
+
+ program_name = argv0;
+
+ /* On glibc systems, the error() function comes from libc and uses the
+ variable program_invocation_name, not program_name. So set this variable
+ as well. */
+#if HAVE_DECL_PROGRAM_INVOCATION_NAME
+ program_invocation_name = (char *) argv0;
+#endif
+}
diff --git a/gnulib/lib/progname.h b/gnulib/lib/progname.h
new file mode 100644
index 0000000..0844066
--- /dev/null
+++ b/gnulib/lib/progname.h
@@ -0,0 +1,62 @@
+/* Program name management.
+ Copyright (C) 2001-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _PROGNAME_H
+#define _PROGNAME_H
+
+/* Programs using this file should do the following in main():
+ set_program_name (argv[0]);
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* String containing name the program is called with. */
+extern const char *program_name;
+
+/* Set program_name, based on argv[0].
+ argv0 must be a string allocated with indefinite extent, and must not be
+ modified after this call. */
+extern void set_program_name (const char *argv0);
+
+#if ENABLE_RELOCATABLE
+
+/* Set program_name, based on argv[0], and original installation prefix and
+ directory, for relocatability. */
+extern void set_program_name_and_installdir (const char *argv0,
+ const char *orig_installprefix,
+ const char *orig_installdir);
+#undef set_program_name
+#define set_program_name(ARG0) \
+ set_program_name_and_installdir (ARG0, INSTALLPREFIX, INSTALLDIR)
+
+/* Return the full pathname of the current executable, based on the earlier
+ call to set_program_name_and_installdir. Return NULL if unknown. */
+extern char *get_full_program_name (void);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PROGNAME_H */
diff --git a/gnulib/lib/progreloc.c b/gnulib/lib/progreloc.c
new file mode 100644
index 0000000..4a3fa48
--- /dev/null
+++ b/gnulib/lib/progreloc.c
@@ -0,0 +1,377 @@
+/* Provide relocatable programs.
+ Copyright (C) 2003-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Specification. */
+#include "progname.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+/* Get declaration of _NSGetExecutablePath on MacOS X 10.2 or newer. */
+#if HAVE_MACH_O_DYLD_H
+# include <mach-o/dyld.h>
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "relocatable.h"
+
+#ifdef NO_XMALLOC
+# include "areadlink.h"
+# define xreadlink areadlink
+#else
+# include "xreadlink.h"
+#endif
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+# define xstrdup strdup
+#else
+# include "xalloc.h"
+#endif
+
+#ifndef O_EXEC
+# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
+#endif
+
+/* Declare canonicalize_file_name.
+ The <stdlib.h> included above may be the system's one, not the gnulib
+ one. */
+extern char * canonicalize_file_name (const char *name);
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+/* Use the system functions, not the gnulib overrides in this file. */
+#undef sprintf
+
+#undef set_program_name
+
+
+#if ENABLE_RELOCATABLE
+
+#if defined __linux__ || defined __CYGWIN__
+/* File descriptor of the executable.
+ (Only used to verify that we find the correct executable.) */
+static int executable_fd = -1;
+#endif
+
+/* Tests whether a given pathname may belong to the executable. */
+static bool
+maybe_executable (const char *filename)
+{
+ /* Woe32 lacks the access() function. */
+#if !defined WIN32_NATIVE
+ if (access (filename, X_OK) < 0)
+ return false;
+#endif
+
+#if defined __linux__ || defined __CYGWIN__
+ if (executable_fd >= 0)
+ {
+ /* If we already have an executable_fd, check that filename points to
+ the same inode. */
+ struct stat statexe;
+ struct stat statfile;
+
+ if (fstat (executable_fd, &statexe) >= 0)
+ {
+ if (stat (filename, &statfile) < 0)
+ return false;
+ if (!(statfile.st_dev
+ && statfile.st_dev == statexe.st_dev
+ && statfile.st_ino == statexe.st_ino))
+ return false;
+ }
+ }
+#endif
+
+ return true;
+}
+
+/* Determine the full pathname of the current executable, freshly allocated.
+ Return NULL if unknown.
+ Guaranteed to work on Linux and Woe32. Likely to work on the other
+ Unixes (maybe except BeOS), under most conditions. */
+static char *
+find_executable (const char *argv0)
+{
+#if defined WIN32_NATIVE
+ /* Native Win32 only.
+ On Cygwin, it is better to use the Cygwin provided /proc interface, than
+ to use native Win32 API and cygwin_conv_to_posix_path, because it supports
+ longer file names
+ (see <http://cygwin.com/ml/cygwin/2011-01/msg00410.html>). */
+ char location[MAX_PATH];
+ int length = GetModuleFileName (NULL, location, sizeof (location));
+ if (length < 0)
+ return NULL;
+ if (!IS_PATH_WITH_DIR (location))
+ /* Shouldn't happen. */
+ return NULL;
+ return xstrdup (location);
+#else /* Unix */
+# ifdef __linux__
+ /* The executable is accessible as /proc/<pid>/exe. In newer Linux
+ versions, also as /proc/self/exe. Linux >= 2.1 provides a symlink
+ to the true pathname; older Linux versions give only device and ino,
+ enclosed in brackets, which we cannot use here. */
+ {
+ char *link;
+
+ link = xreadlink ("/proc/self/exe");
+ if (link != NULL && link[0] != '[')
+ return link;
+ if (executable_fd < 0)
+ executable_fd = open ("/proc/self/exe", O_EXEC, 0);
+
+ {
+ char buf[6+10+5];
+ sprintf (buf, "/proc/%d/exe", getpid ());
+ link = xreadlink (buf);
+ if (link != NULL && link[0] != '[')
+ return link;
+ if (executable_fd < 0)
+ executable_fd = open (buf, O_EXEC, 0);
+ }
+ }
+# endif
+# ifdef __CYGWIN__
+ /* The executable is accessible as /proc/<pid>/exe, at least in
+ Cygwin >= 1.5. */
+ {
+ char *link;
+
+ link = xreadlink ("/proc/self/exe");
+ if (link != NULL)
+ return link;
+ if (executable_fd < 0)
+ executable_fd = open ("/proc/self/exe", O_EXEC, 0);
+ }
+# endif
+# if HAVE_MACH_O_DYLD_H && HAVE__NSGETEXECUTABLEPATH
+ /* On MacOS X 10.2 or newer, the function
+ int _NSGetExecutablePath (char *buf, uint32_t *bufsize);
+ can be used to retrieve the executable's full path. */
+ char location[4096];
+ unsigned int length = sizeof (location);
+ if (_NSGetExecutablePath (location, &length) == 0
+ && location[0] == '/')
+ return canonicalize_file_name (location);
+# endif
+ /* Guess the executable's full path. We assume the executable has been
+ called via execlp() or execvp() with properly set up argv[0]. The
+ login(1) convention to add a '-' prefix to argv[0] is not supported. */
+ {
+ bool has_slash = false;
+ {
+ const char *p;
+ for (p = argv0; *p; p++)
+ if (*p == '/')
+ {
+ has_slash = true;
+ break;
+ }
+ }
+ if (!has_slash)
+ {
+ /* exec searches paths without slashes in the directory list given
+ by $PATH. */
+ const char *path = getenv ("PATH");
+
+ if (path != NULL)
+ {
+ const char *p;
+ const char *p_next;
+
+ for (p = path; *p; p = p_next)
+ {
+ const char *q;
+ size_t p_len;
+ char *concat_name;
+
+ for (q = p; *q; q++)
+ if (*q == ':')
+ break;
+ p_len = q - p;
+ p_next = (*q == '\0' ? q : q + 1);
+
+ /* We have a path item at p, of length p_len.
+ Now concatenate the path item and argv0. */
+ concat_name = (char *) xmalloc (p_len + strlen (argv0) + 2);
+# ifdef NO_XMALLOC
+ if (concat_name == NULL)
+ return NULL;
+# endif
+ if (p_len == 0)
+ /* An empty PATH element designates the current directory. */
+ strcpy (concat_name, argv0);
+ else
+ {
+ memcpy (concat_name, p, p_len);
+ concat_name[p_len] = '/';
+ strcpy (concat_name + p_len + 1, argv0);
+ }
+ if (maybe_executable (concat_name))
+ return canonicalize_file_name (concat_name);
+ free (concat_name);
+ }
+ }
+ /* Not found in the PATH, assume the current directory. */
+ }
+ /* exec treats paths containing slashes as relative to the current
+ directory. */
+ if (maybe_executable (argv0))
+ return canonicalize_file_name (argv0);
+ }
+ /* No way to find the executable. */
+ return NULL;
+#endif
+}
+
+/* Full pathname of executable, or NULL. */
+static char *executable_fullname;
+
+static void
+prepare_relocate (const char *orig_installprefix, const char *orig_installdir,
+ const char *argv0)
+{
+ char *curr_prefix;
+
+ /* Determine the full pathname of the current executable. */
+ executable_fullname = find_executable (argv0);
+
+ /* Determine the current installation prefix from it. */
+ curr_prefix = compute_curr_prefix (orig_installprefix, orig_installdir,
+ executable_fullname);
+ if (curr_prefix != NULL)
+ {
+ /* Now pass this prefix to all copies of the relocate.c source file. */
+ set_relocation_prefix (orig_installprefix, curr_prefix);
+
+ free (curr_prefix);
+ }
+}
+
+/* Set program_name, based on argv[0], and original installation prefix and
+ directory, for relocatability. */
+void
+set_program_name_and_installdir (const char *argv0,
+ const char *orig_installprefix,
+ const char *orig_installdir)
+{
+ const char *argv0_stripped = argv0;
+
+ /* Relocatable programs are renamed to .bin by install-reloc. Or, more
+ generally, their suffix is changed from $exeext to .bin$exeext.
+ Remove the ".bin" here. */
+ {
+ size_t argv0_len = strlen (argv0);
+ const size_t exeext_len = sizeof (EXEEXT) - sizeof ("");
+ if (argv0_len > 4 + exeext_len)
+ if (memcmp (argv0 + argv0_len - exeext_len - 4, ".bin", 4) == 0)
+ {
+ if (sizeof (EXEEXT) > sizeof (""))
+ {
+ /* Compare using an inlined copy of c_strncasecmp(), because
+ the filenames may have undergone a case conversion since
+ they were packaged. In other words, EXEEXT may be ".exe"
+ on one system and ".EXE" on another. */
+ static const char exeext[] = EXEEXT;
+ const char *s1 = argv0 + argv0_len - exeext_len;
+ const char *s2 = exeext;
+ for (; *s1 != '\0'; s1++, s2++)
+ {
+ unsigned char c1 = *s1;
+ unsigned char c2 = *s2;
+ if ((c1 >= 'A' && c1 <= 'Z' ? c1 - 'A' + 'a' : c1)
+ != (c2 >= 'A' && c2 <= 'Z' ? c2 - 'A' + 'a' : c2))
+ goto done_stripping;
+ }
+ }
+ /* Remove ".bin" before EXEEXT or its equivalent. */
+ {
+ char *shorter = (char *) xmalloc (argv0_len - 4 + 1);
+#ifdef NO_XMALLOC
+ if (shorter != NULL)
+#endif
+ {
+ memcpy (shorter, argv0, argv0_len - exeext_len - 4);
+ if (sizeof (EXEEXT) > sizeof (""))
+ memcpy (shorter + argv0_len - exeext_len - 4,
+ argv0 + argv0_len - exeext_len - 4,
+ exeext_len);
+ shorter[argv0_len - 4] = '\0';
+ argv0_stripped = shorter;
+ }
+ }
+ done_stripping: ;
+ }
+ }
+
+ set_program_name (argv0_stripped);
+
+ prepare_relocate (orig_installprefix, orig_installdir, argv0);
+}
+
+/* Return the full pathname of the current executable, based on the earlier
+ call to set_program_name_and_installdir. Return NULL if unknown. */
+char *
+get_full_program_name (void)
+{
+ return executable_fullname;
+}
+
+#endif
diff --git a/gnulib/lib/propername.c b/gnulib/lib/propername.c
new file mode 100644
index 0000000..31fc96a
--- /dev/null
+++ b/gnulib/lib/propername.c
@@ -0,0 +1,318 @@
+/* Localization of proper names.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that
+ the proper_name function might be candidate for attribute 'const' */
+#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "propername.h"
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include "trim.h"
+#include "mbchar.h"
+#include "mbuiter.h"
+#include "localcharset.h"
+#include "c-strcase.h"
+#include "xstriconv.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+
+/* Tests whether STRING contains trim (SUB), starting and ending at word
+ boundaries.
+ Here, instead of implementing Unicode Standard Annex #29 for determining
+ word boundaries, we assume that trim (SUB) starts and ends with words and
+ only test whether the part before it ends with a non-word and the part
+ after it starts with a non-word. */
+static bool
+mbsstr_trimmed_wordbounded (const char *string, const char *sub)
+{
+ char *tsub = trim (sub);
+ bool found = false;
+
+ for (; *string != '\0';)
+ {
+ const char *tsub_in_string = mbsstr (string, tsub);
+ if (tsub_in_string == NULL)
+ break;
+ else
+ {
+ if (MB_CUR_MAX > 1)
+ {
+ mbui_iterator_t string_iter;
+ bool word_boundary_before;
+ bool word_boundary_after;
+
+ mbui_init (string_iter, string);
+ word_boundary_before = true;
+ if (mbui_cur_ptr (string_iter) < tsub_in_string)
+ {
+ mbchar_t last_char_before_tsub;
+ do
+ {
+ if (!mbui_avail (string_iter))
+ abort ();
+ last_char_before_tsub = mbui_cur (string_iter);
+ mbui_advance (string_iter);
+ }
+ while (mbui_cur_ptr (string_iter) < tsub_in_string);
+ if (mb_isalnum (last_char_before_tsub))
+ word_boundary_before = false;
+ }
+
+ mbui_init (string_iter, tsub_in_string);
+ {
+ mbui_iterator_t tsub_iter;
+
+ for (mbui_init (tsub_iter, tsub);
+ mbui_avail (tsub_iter);
+ mbui_advance (tsub_iter))
+ {
+ if (!mbui_avail (string_iter))
+ abort ();
+ mbui_advance (string_iter);
+ }
+ }
+ word_boundary_after = true;
+ if (mbui_avail (string_iter))
+ {
+ mbchar_t first_char_after_tsub = mbui_cur (string_iter);
+ if (mb_isalnum (first_char_after_tsub))
+ word_boundary_after = false;
+ }
+
+ if (word_boundary_before && word_boundary_after)
+ {
+ found = true;
+ break;
+ }
+
+ mbui_init (string_iter, tsub_in_string);
+ if (!mbui_avail (string_iter))
+ break;
+ string = tsub_in_string + mb_len (mbui_cur (string_iter));
+ }
+ else
+ {
+ bool word_boundary_before;
+ const char *p;
+ bool word_boundary_after;
+
+ word_boundary_before = true;
+ if (string < tsub_in_string)
+ if (isalnum ((unsigned char) tsub_in_string[-1]))
+ word_boundary_before = false;
+
+ p = tsub_in_string + strlen (tsub);
+ word_boundary_after = true;
+ if (*p != '\0')
+ if (isalnum ((unsigned char) *p))
+ word_boundary_after = false;
+
+ if (word_boundary_before && word_boundary_after)
+ {
+ found = true;
+ break;
+ }
+
+ if (*tsub_in_string == '\0')
+ break;
+ string = tsub_in_string + 1;
+ }
+ }
+ }
+ free (tsub);
+ return found;
+}
+
+/* Return the localization of NAME. NAME is written in ASCII. */
+
+const char *
+proper_name (const char *name)
+{
+ /* See whether there is a translation. */
+ const char *translation = gettext (name);
+
+ if (translation != name)
+ {
+ /* See whether the translation contains the original name. */
+ if (mbsstr_trimmed_wordbounded (translation, name))
+ return translation;
+ else
+ {
+ /* Return "TRANSLATION (NAME)". */
+ char *result =
+ XNMALLOC (strlen (translation) + 2 + strlen (name) + 1 + 1, char);
+
+ sprintf (result, "%s (%s)", translation, name);
+ return result;
+ }
+ }
+ else
+ return name;
+}
+
+/* Return the localization of a name whose original writing is not ASCII.
+ NAME_UTF8 is the real name, written in UTF-8 with octal or hexadecimal
+ escape sequences. NAME_ASCII is a fallback written only with ASCII
+ characters. */
+
+const char *
+proper_name_utf8 (const char *name_ascii, const char *name_utf8)
+{
+ /* See whether there is a translation. */
+ const char *translation = gettext (name_ascii);
+
+ /* Try to convert NAME_UTF8 to the locale encoding. */
+ const char *locale_code = locale_charset ();
+ char *alloc_name_converted = NULL;
+ char *alloc_name_converted_translit = NULL;
+ const char *name_converted = NULL;
+ const char *name_converted_translit = NULL;
+ const char *name;
+
+ if (c_strcasecmp (locale_code, "UTF-8") != 0)
+ {
+#if HAVE_ICONV
+ name_converted = alloc_name_converted =
+ xstr_iconv (name_utf8, "UTF-8", locale_code);
+
+# if (((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2) \
+ && !defined __UCLIBC__) \
+ || _LIBICONV_VERSION >= 0x0105
+ {
+ char *converted_translit;
+
+ size_t len = strlen (locale_code);
+ char *locale_code_translit = XNMALLOC (len + 10 + 1, char);
+ memcpy (locale_code_translit, locale_code, len);
+ memcpy (locale_code_translit + len, "//TRANSLIT", 10 + 1);
+
+ converted_translit =
+ xstr_iconv (name_utf8, "UTF-8", locale_code_translit);
+
+ free (locale_code_translit);
+
+ if (converted_translit != NULL)
+ {
+# if !_LIBICONV_VERSION
+ /* Don't use the transliteration if it added question marks.
+ glibc's transliteration falls back to question marks; libiconv's
+ transliteration does not.
+ mbschr is equivalent to strchr in this case. */
+ if (strchr (converted_translit, '?') != NULL)
+ free (converted_translit);
+ else
+# endif
+ name_converted_translit = alloc_name_converted_translit =
+ converted_translit;
+ }
+ }
+# endif
+#endif
+ }
+ else
+ {
+ name_converted = name_utf8;
+ name_converted_translit = name_utf8;
+ }
+
+ /* The name in locale encoding. */
+ name = (name_converted != NULL ? name_converted :
+ name_converted_translit != NULL ? name_converted_translit :
+ name_ascii);
+
+ /* See whether we have a translation. Some translators have not understood
+ that they should use the UTF-8 form of the name, if possible. So if the
+ translator provided a no-op translation, we ignore it. */
+ if (strcmp (translation, name_ascii) != 0)
+ {
+ /* See whether the translation contains the original name. */
+ if (mbsstr_trimmed_wordbounded (translation, name_ascii)
+ || (name_converted != NULL
+ && mbsstr_trimmed_wordbounded (translation, name_converted))
+ || (name_converted_translit != NULL
+ && mbsstr_trimmed_wordbounded (translation, name_converted_translit)))
+ {
+ if (alloc_name_converted != NULL)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL)
+ free (alloc_name_converted_translit);
+ return translation;
+ }
+ else
+ {
+ /* Return "TRANSLATION (NAME)". */
+ char *result =
+ XNMALLOC (strlen (translation) + 2 + strlen (name) + 1 + 1, char);
+
+ sprintf (result, "%s (%s)", translation, name);
+
+ if (alloc_name_converted != NULL)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL)
+ free (alloc_name_converted_translit);
+ return result;
+ }
+ }
+ else
+ {
+ if (alloc_name_converted != NULL && alloc_name_converted != name)
+ free (alloc_name_converted);
+ if (alloc_name_converted_translit != NULL
+ && alloc_name_converted_translit != name)
+ free (alloc_name_converted_translit);
+ return name;
+ }
+}
+
+#ifdef TEST1
+# include <locale.h>
+int
+main (int argc, char *argv[])
+{
+ setlocale (LC_ALL, "");
+ if (mbsstr_trimmed_wordbounded (argv[1], argv[2]))
+ printf("found\n");
+ return 0;
+}
+#endif
+
+#ifdef TEST2
+# include <locale.h>
+# include <stdio.h>
+int
+main (int argc, char *argv[])
+{
+ setlocale (LC_ALL, "");
+ printf ("%s\n", proper_name_utf8 ("Franc,ois Pinard", "Fran\303\247ois Pinard"));
+ return 0;
+}
+#endif
diff --git a/gnulib/lib/propername.h b/gnulib/lib/propername.h
new file mode 100644
index 0000000..997c57b
--- /dev/null
+++ b/gnulib/lib/propername.h
@@ -0,0 +1,106 @@
+/* Localization of proper names.
+ Copyright (C) 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* INTRODUCTION
+
+ What do
+
+ Torbjörn Granlund (coreutils)
+ François Pinard (coreutils)
+ Danilo Šegan (gettext)
+
+ have in common?
+
+ A non-ASCII name. This causes trouble in the --version output. The simple
+ "solution", unfortunately mutilates the name.
+
+ $ du --version| grep Granlund
+ Écrit par Torbjorn Granlund, David MacKenzie, Paul Eggert et Jim Meyering.
+
+ $ ptx --version| grep Pinard
+ Écrit par F. Pinard.
+
+ What is desirable, is to print the full name if the output character set
+ allows it, and the ASCIIfied name only as a fallback.
+
+ $ recode-sr-latin --version
+ ...
+ Written by Danilo Šegan and Bruno Haible.
+
+ $ LC_ALL=C recode-sr-latin --version
+ ...
+ Written by Danilo Segan and Bruno Haible.
+
+ The 'propername' module does exactly this. Plus, for languages that use
+ a different writing system than the Latin alphabet, it allows a translator
+ to write the name using that different writing system. In that case the
+ output will look like this:
+ <translated name> (<original name in English>)
+
+ To use the 'propername' module is done in three simple steps:
+
+ 1) Add it to the list of gnulib modules to import,
+
+ 2) Change the arguments of version_etc, from
+
+ from "Paul Eggert"
+ to proper_name ("Paul Eggert")
+
+ from "Torbjorn Granlund"
+ to proper_name_utf8 ("Torbjorn Granlund", "Torbj\303\266rn Granlund")
+
+ from "F. Pinard"
+ to proper_name_utf8 ("Franc,ois Pinard", "Fran\303\247ois Pinard")
+
+ (Optionally, here you can also add / * TRANSLATORS: ... * / comments
+ explaining how the name is written or pronounced.)
+
+ 3) If you are using GNU gettext version 0.16.1 or older, in po/Makevars,
+ in the definition of the XGETTEXT_OPTIONS variable, add:
+
+ --keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."'
+ --keyword='proper_name_utf8:1,"This is a proper name. See the gettext manual, section Names."'
+
+ This specifies automatic comments for the translator. (Requires
+ xgettext >= 0.15. The double-quotes inside the quoted string are on
+ purpose: they are part of the --keyword argument syntax.)
+ */
+
+#ifndef _PROPERNAME_H
+#define _PROPERNAME_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the localization of NAME. NAME is written in ASCII. */
+extern const char * proper_name (const char *name) /* NOT attribute const */;
+
+/* Return the localization of a name whose original writing is not ASCII.
+ NAME_UTF8 is the real name, written in UTF-8 with octal or hexadecimal
+ escape sequences. NAME_ASCII is a fallback written only with ASCII
+ characters. */
+extern const char * proper_name_utf8 (const char *name_ascii,
+ const char *name_utf8);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _PROPERNAME_H */
diff --git a/gnulib/lib/pselect.c b/gnulib/lib/pselect.c
new file mode 100644
index 0000000..5b709a2
--- /dev/null
+++ b/gnulib/lib/pselect.c
@@ -0,0 +1,77 @@
+/* pselect - synchronous I/O multiplexing
+
+ Copyright 2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+#include <sys/select.h>
+
+#include <errno.h>
+#include <signal.h>
+
+/* Examine the size-NFDS file descriptor sets in RFDS, WFDS, and XFDS
+ to see whether some of their descriptors are ready for reading,
+ ready for writing, or have exceptions pending. Wait for at most
+ TIMEOUT seconds, and use signal mask SIGMASK while waiting. A null
+ pointer parameter stands for no descriptors, an infinite timeout,
+ or an unaffected signal mask. */
+
+int
+pselect (int nfds, fd_set *restrict rfds,
+ fd_set *restrict wfds, fd_set *restrict xfds,
+ struct timespec const *restrict timeout,
+ sigset_t const *restrict sigmask)
+{
+ int select_result;
+ sigset_t origmask;
+ struct timeval tv, *tvp;
+
+ if (timeout)
+ {
+ if (! (0 <= timeout->tv_nsec && timeout->tv_nsec < 1000000000))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ tv.tv_sec = timeout->tv_sec;
+ tv.tv_usec = (timeout->tv_nsec + 999) / 1000;
+ tvp = &tv;
+ }
+ else
+ tvp = NULL;
+
+ /* Signal mask munging should be atomic, but this is the best we can
+ do in this emulation. */
+ if (sigmask)
+ pthread_sigmask (SIG_SETMASK, sigmask, &origmask);
+
+ select_result = select (nfds, rfds, wfds, xfds, tvp);
+
+ if (sigmask)
+ {
+ int select_errno = errno;
+ pthread_sigmask (SIG_SETMASK, &origmask, NULL);
+ errno = select_errno;
+ }
+
+ return select_result;
+}
diff --git a/gnulib/lib/pt_chown.c b/gnulib/lib/pt_chown.c
new file mode 100644
index 0000000..ccc04fd
--- /dev/null
+++ b/gnulib/lib/pt_chown.c
@@ -0,0 +1,162 @@
+/* pt_chown - helper program for `grantpt'.
+ Copyright (C) 1998-1999, 2009-2011 Free Software Foundation, Inc.
+ Contributed by C. Scott Ananian <cananian@alumni.princeton.edu>, 1998.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <errno.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "pty-private.h"
+
+/* For security reasons, we try to minimize the dependencies on libraries
+ outside libc. This means, in particular:
+ - No use of gettext(), since it's usually implemented in libintl.
+ - No use of error() or argp, since they rely on gettext by default. */
+
+
+static int
+do_pt_chown (void)
+{
+ char *pty;
+ struct stat st;
+ struct group *p;
+ gid_t gid;
+
+ /* Check that PTY_FILENO is a valid master pseudo terminal. */
+ pty = ptsname (PTY_FILENO);
+ if (pty == NULL)
+ return errno == EBADF ? FAIL_EBADF : FAIL_EINVAL;
+
+ /* Check that the returned slave pseudo terminal is a
+ character device. */
+ if (stat (pty, &st) < 0 || !S_ISCHR (st.st_mode))
+ return FAIL_EINVAL;
+
+ /* Get the group ID of the special `tty' group. */
+ p = getgrnam (TTY_GROUP);
+ gid = p ? p->gr_gid : getgid ();
+
+ /* Set the owner to the real user ID, and the group to that special
+ group ID. */
+ if (st.st_gid != gid && chown (pty, getuid (), gid) < 0)
+ return FAIL_EACCES;
+
+ /* Set the permission mode to readable and writable by the owner,
+ and writable by the group. */
+ if ((st.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO)) != (S_IRUSR|S_IWUSR|S_IWGRP)
+ && chmod (pty, S_IRUSR|S_IWUSR|S_IWGRP) < 0)
+ return FAIL_EACCES;
+
+ return 0;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ uid_t euid = geteuid ();
+
+ if (argc == 1 && euid == 0)
+ {
+ /* Normal invocation of this program is with no arguments and
+ with privileges. */
+ return do_pt_chown ();
+ }
+
+ /* It would be possible to drop setuid/setgid privileges here. But it is not
+ really needed, since the code below only calls strcmp and [f]printf. */
+
+ {
+ int do_help = 0;
+ int do_version = 0;
+ int remaining;
+
+ for (remaining = 1; remaining < argc; remaining++)
+ {
+ const char *arg = argv[remaining];
+
+ if (arg[0] == '-')
+ {
+ if (strcmp (arg, "--") == 0)
+ {
+ remaining++;
+ break;
+ }
+ else if (strcmp (arg, "--help") == 0)
+ do_help = 1;
+ else if (strcmp (arg, "--version") == 0)
+ do_version = 1;
+ else
+ {
+ fprintf (stderr, "pt_chown: invalid option: %s\n", arg);
+ return EXIT_FAILURE;
+ }
+ }
+ else
+ break;
+ }
+
+ if (remaining < argc)
+ {
+ fprintf (stderr, "pt_chown: too many arguments\n");
+ return EXIT_FAILURE;
+ }
+
+ if (do_help)
+ {
+ printf ("Usage: pt_chown [OPTION...]\n");
+ printf ("Set the owner, group and access permission of the slave pseudo terminal\n"
+ "corresponding to the master pseudo terminal passed on file descriptor %d.\n"
+ "This is the helper program for the 'grantpt' function. It is not intended\n"
+ "to be run directly from the command line.\n",
+ PTY_FILENO);
+ printf ("\n");
+ printf (" --help Give this help list\n");
+ printf (" --version Print program version\n");
+ printf ("\n");
+ printf ("The owner is set to the current user, the group is set to '%s', and the\n"
+ "access permission is set to '%o'.\n",
+ TTY_GROUP, S_IRUSR|S_IWUSR|S_IWGRP);
+ printf ("Please report bugs to <bug-gnulib@gnu.org>.\n");
+ return EXIT_SUCCESS;
+ }
+
+ if (do_version)
+ {
+ printf ("pt_chown (GNU %s) %s\n", "libc", "2.11");
+ printf ("Copyright (C) %s Free Software Foundation, Inc.\n"
+ "This is free software; see the source for copying conditions. There is NO\n"
+ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
+ "1999");
+ return EXIT_SUCCESS;
+ }
+ }
+
+ /* Check if we are properly installed. */
+ if (euid != 0)
+ {
+ fprintf (stderr, "pt_chown: needs to be installed setuid 'root'\n");
+ return FAIL_EXEC;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/gnulib/lib/pthread.in.h b/gnulib/lib/pthread.in.h
new file mode 100644
index 0000000..c05c7c9
--- /dev/null
+++ b/gnulib/lib/pthread.in.h
@@ -0,0 +1,274 @@
+/* Implement a trivial subset of POSIX 1003.1-2008 pthread.h.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Glen Lenker. */
+
+#ifndef _@GUARD_PREFIX@_PTHREAD_H_
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_PTHREAD_H@
+# @INCLUDE_NEXT@ @NEXT_PTHREAD_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_PTHREAD_H_
+#define _@GUARD_PREFIX@_PTHREAD_H_
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sched.h>
+#include <sys/types.h>
+#include <time.h>
+
+#if ! @HAVE_PTHREAD_T@
+# if !GNULIB_defined_pthread_types
+ typedef int pthread_t;
+ typedef int pthread_attr_t;
+ typedef int pthread_barrier_t;
+ typedef int pthread_barrierattr_t;
+ typedef int pthread_cond_t;
+ typedef int pthread_condattr_t;
+ typedef int pthread_key_t;
+ typedef int pthread_mutex_t;
+ typedef int pthread_mutexattr_t;
+ typedef int pthread_once_t;
+ typedef int pthread_rwlock_t;
+ typedef int pthread_rwlockattr_t;
+# define GNULIB_defined_pthread_types 1
+# endif
+#endif
+
+#ifndef PTHREAD_COND_INITIALIZER
+#define PTHREAD_COND_INITIALIZER { 0 }
+#define PTHREAD_MUTEX_INITIALIZER { 0 }
+#define PTHREAD_ONCE_INIT { 0 }
+#define PTHREAD_RWLOCK_INITIALIZER { 0 }
+
+#define PTHREAD_BARRIER_SERIAL_THREAD (-1)
+
+#define PTHREAD_CANCEL_DEFERRED 0
+#define PTHREAD_CANCEL_ASYNCHRONOUS 1
+
+#define PTHREAD_CANCEL_ENABLE 0
+#define PTHREAD_CANCEL_DISABLE 1
+
+#define PTHREAD_CANCELED ((void *) -1)
+
+#define PTHREAD_CREATE_JOINABLE 0
+#define PTHREAD_CREATE_DETACHED 1
+
+#define PTHREAD_INHERIT_SCHED 0
+#define PTHREAD_EXPLICIT_SCHED 1
+
+#define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL
+#define PTHREAD_MUTEX_NORMAL 0
+#define PTHREAD_MUTEX_ERRORCHECK 1
+#define PTHREAD_MUTEX_RECURSIVE 2
+
+#define PTHREAD_MUTEX_STALLED 0
+#define PTHREAD_MUTEX_ROBUST 1
+
+#define PTHREAD_PRIO_NONE 0
+#define PTHREAD_PRIO_INHERIT 1
+#define PTHREAD_PRIO_PROTECT 2
+
+#define PTHREAD_PROCESS_PRIVATE 0
+#define PTHREAD_PROCESS_SHARED 1
+
+#define PTHREAD_SCOPE_SYSTEM 0
+#define PTHREAD_SCOPE_PROCESS 1
+#endif
+
+#if ! @HAVE_PTHREAD_T@
+
+# if !GNULIB_defined_pthread_functions
+
+/* Provide substitutes for the thread functions that should work
+ adequately on a single-threaded implementation, where
+ pthread_create always fails. The goal is to let programs compile
+ on non-pthread hosts with minimal runtime overhead.
+
+ Omit interfaces that have not been analyzed and for which we do not
+ know what to do, so that they elicit a compile-time error for
+ now. */
+
+static inline int
+pthread_cond_destroy (pthread_cond_t *cond)
+{
+ /* COND is never seriously used. */
+ return 0;
+}
+
+static inline int
+pthread_cond_init (pthread_cond_t *restrict cond,
+ pthread_condattr_t const *restrict attr)
+{
+ /* COND is never seriously used. */
+ return 0;
+}
+
+static inline int
+pthread_cond_signal (pthread_cond_t *cond)
+{
+ /* No threads can currently be blocked on COND. */
+ return 0;
+}
+
+static inline int
+pthread_cond_wait (pthread_cond_t *restrict cond,
+ pthread_mutex_t *restrict mutex)
+{
+ /* Properly-written applications never come here. */
+ abort ();
+ return 0;
+}
+
+static inline int
+pthread_create (pthread_t *restrict thread,
+ pthread_attr_t const *restrict attr,
+ void * (*start_routine) (void*), void *restrict arg)
+{
+ /* Do not create a thread. */
+ return EAGAIN;
+}
+
+static inline void
+pthread_exit (void *value)
+{
+ /* There is just one thread, so the process exits. */
+ exit (0);
+}
+
+static inline int
+pthread_join (pthread_t thread, void **pvalue)
+{
+ /* Properly-written applications never come here. */
+ abort ();
+ return 0;
+}
+
+static inline int
+pthread_mutexattr_destroy (pthread_mutexattr_t *attr)
+{
+ return 0;
+}
+
+static inline int
+pthread_mutexattr_init (pthread_mutexattr_t *attr)
+{
+ return 0;
+}
+
+static inline int
+pthread_mutexattr_settype (pthread_mutexattr_t *attr, int attr_type)
+{
+ return 0;
+}
+
+static inline int
+pthread_mutex_destroy (pthread_mutex_t *mutex)
+{
+ /* MUTEX is never seriously used. */
+ return 0;
+}
+
+static inline int
+pthread_mutex_init (pthread_mutex_t *restrict mutex,
+ pthread_mutexattr_t const *restrict attr)
+{
+ /* MUTEX is never seriously used. */
+ return 0;
+}
+
+static inline int
+pthread_mutex_lock (pthread_mutex_t *mutex)
+{
+ /* There is only one thread, so it always gets the lock. This
+ implementation does not support PTHREAD_MUTEX_ERRORCHECK. */
+ return 0;
+}
+
+static inline int
+pthread_mutex_trylock (pthread_mutex_t *mutex)
+{
+ return pthread_mutex_lock (mutex);
+}
+
+static inline int
+pthread_mutex_unlock (pthread_mutex_t *mutex)
+{
+ /* There is only one thread, so it always unlocks successfully.
+ This implementation does not support robust mutexes or
+ PTHREAD_MUTEX_ERRORCHECK. */
+ return 0;
+}
+
+# define GNULIB_defined_pthread_functions 1
+# endif
+
+#endif
+
+#if ! @HAVE_PTHREAD_SPINLOCK_T@
+
+# if !GNULIB_defined_pthread_spinlock_t
+
+/* Approximate spinlocks with mutexes. */
+
+typedef pthread_mutex_t pthread_spinlock_t;
+
+static inline int
+pthread_spin_init (pthread_spinlock_t *lock, int pshared)
+{
+ return pthread_mutex_init (lock, NULL);
+}
+
+static inline int
+pthread_spin_destroy (pthread_spinlock_t *lock)
+{
+ return pthread_mutex_destroy (lock);
+}
+
+static inline int
+pthread_spin_lock (pthread_spinlock_t *lock)
+{
+ return pthread_mutex_lock (lock);
+}
+
+static inline int
+pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+ return pthread_mutex_trylock (lock);
+}
+
+static inline int
+pthread_spin_unlock (pthread_spinlock_t *lock)
+{
+ return pthread_mutex_unlock (lock);
+}
+
+# define GNULIB_defined_pthread_spinlock_t 1
+# endif
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_PTHREAD_H_ */
+#endif /* _@GUARD_PREFIX@_PTHREAD_H_ */
diff --git a/gnulib/lib/pthread_sigmask.c b/gnulib/lib/pthread_sigmask.c
new file mode 100644
index 0000000..11d549c
--- /dev/null
+++ b/gnulib/lib/pthread_sigmask.c
@@ -0,0 +1,69 @@
+/* POSIX compatible signal blocking for threads.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#if PTHREAD_SIGMASK_UNBLOCK_BUG
+# include <unistd.h>
+#endif
+
+int
+pthread_sigmask (int how, const sigset_t *new_mask, sigset_t *old_mask)
+#undef pthread_sigmask
+{
+#if HAVE_PTHREAD_SIGMASK
+ int ret = pthread_sigmask (how, new_mask, old_mask);
+# if PTHREAD_SIGMASK_INEFFECTIVE
+ if (ret == 0)
+ {
+ /* Detect whether pthread_sigmask is currently ineffective.
+ Don't cache the information: libpthread.so could be dynamically
+ loaded after the program started and after pthread_sigmask was
+ called for the first time. */
+ if (pthread_sigmask (1729, NULL, NULL) == 0)
+ {
+ /* pthread_sigmask is currently ineffective. The program is not
+ linked to -lpthread. So use sigprocmask instead. */
+ return (sigprocmask (how, new_mask, old_mask) < 0 ? errno : 0);
+ }
+ }
+# endif
+# if PTHREAD_SIGMASK_FAILS_WITH_ERRNO
+ if (ret == -1)
+ return errno;
+# endif
+# if PTHREAD_SIGMASK_UNBLOCK_BUG
+ if (ret == 0
+ && new_mask != NULL
+ && (how == SIG_UNBLOCK || how == SIG_SETMASK))
+ {
+ /* Give the OS the opportunity to raise signals that were pending before
+ the pthread_sigmask call and have now been unblocked. */
+ usleep (1);
+ }
+# endif
+ return ret;
+#else
+ int ret = sigprocmask (how, new_mask, old_mask);
+ return (ret < 0 ? errno : 0);
+#endif
+}
diff --git a/gnulib/lib/ptsname.c b/gnulib/lib/ptsname.c
new file mode 100644
index 0000000..102a65c
--- /dev/null
+++ b/gnulib/lib/ptsname.c
@@ -0,0 +1,32 @@
+/* Determine name of the slave side of a pseudo-terminal.
+ Copyright (C) 1998, 2002, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+/* Static buffer for `ptsname'. */
+static char buffer[64];
+
+
+/* Return the pathname of the pseudo terminal slave associated with
+ the master FD is open on, or NULL on errors.
+ The returned storage is good until the next call to this function. */
+char *
+ptsname (int fd)
+{
+ return ptsname_r (fd, buffer, sizeof (buffer)) != 0 ? NULL : buffer;
+}
diff --git a/gnulib/lib/ptsname_r.c b/gnulib/lib/ptsname_r.c
new file mode 100644
index 0000000..e7f2d5b
--- /dev/null
+++ b/gnulib/lib/ptsname_r.c
@@ -0,0 +1,85 @@
+/* Determine name of the slave side of a pseudo-terminal.
+ Copyright (C) 1998, 2002, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef _LIBC
+# include <paths.h>
+#else
+# ifndef _PATH_TTY
+# define _PATH_TTY "/dev/tty"
+# endif
+# ifndef _PATH_DEV
+# define _PATH_DEV "/dev/"
+# endif
+
+# define __set_errno(e) errno = (e)
+# define __isatty isatty
+# define __stat stat
+# define __ttyname_r ttyname_r
+# define __ptsname_r ptsname_r
+
+#endif
+
+
+/* Store at most BUFLEN characters of the pathname of the slave pseudo
+ terminal associated with the master FD is open on in BUF.
+ Return 0 on success, otherwise an error number. */
+int
+__ptsname_r (int fd, char *buf, size_t buflen)
+{
+ int save_errno = errno;
+ int err;
+ struct stat st;
+
+ if (buf == NULL)
+ {
+ __set_errno (EINVAL);
+ return EINVAL;
+ }
+
+ if (!__isatty (fd))
+ /* We rely on isatty to set errno properly (i.e. EBADF or ENOTTY). */
+ return errno;
+
+ if (buflen < strlen (_PATH_TTY) + 3)
+ {
+ __set_errno (ERANGE);
+ return ERANGE;
+ }
+
+ err = __ttyname_r (fd, buf, buflen);
+ if (err != 0)
+ {
+ __set_errno (err);
+ return errno;
+ }
+
+ buf[sizeof (_PATH_DEV) - 1] = 't';
+
+ if (__stat (buf, &st) < 0)
+ return errno;
+
+ __set_errno (save_errno);
+ return 0;
+}
diff --git a/gnulib/lib/pty-private.h b/gnulib/lib/pty-private.h
new file mode 100644
index 0000000..dcd94d7
--- /dev/null
+++ b/gnulib/lib/pty-private.h
@@ -0,0 +1,46 @@
+/* Interface to the pt_chown program.
+ Copyright (C) 1998-1999, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _PTY_PRIVATE_H
+#define _PTY_PRIVATE_H 1
+
+/* The group slave pseudo terminals belong to. */
+#define TTY_GROUP "tty"
+
+/* The file descriptor connected to the master pseudo terminal. */
+#define PTY_FILENO 3
+
+/* Path to the helper program that implements `grantpt' in user space. */
+#define _PATH_PT_CHOWN PKGLIBEXECDIR "/pt_chown"
+
+/* Test whether given TTY is really a Unix98 pseudo terminal. */
+/* #define unix98_pseudo_p(Dev) ... */
+
+/* Exit codes for the helper program. */
+enum /* failure modes */
+{
+ FAIL_EBADF = 1,
+ FAIL_EINVAL,
+ FAIL_EACCES,
+ FAIL_EXEC,
+ FAIL_ENOMEM
+};
+
+#endif /* pty-private.h */
diff --git a/gnulib/lib/pty.in.h b/gnulib/lib/pty.in.h
new file mode 100644
index 0000000..b24dd10
--- /dev/null
+++ b/gnulib/lib/pty.in.h
@@ -0,0 +1,132 @@
+/* Substitute for and wrapper around <pty.h>.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_PTY_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_PTY_H@
+# @INCLUDE_NEXT@ @NEXT_PTY_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_PTY_H
+#define _@GUARD_PREFIX@_PTY_H
+
+/* Some platforms declare this in a different header than glibc. */
+#if @HAVE_UTIL_H@
+# include <util.h>
+#endif
+#if @HAVE_LIBUTIL_H@
+/* <sys/types.h> is a prerequisite of <libutil.h> on FreeBSD 8.0. */
+# include <sys/types.h>
+# include <libutil.h>
+#endif
+
+/* Get 'struct termios' and 'struct winsize'. */
+#include <termios.h>
+#if defined _AIX
+# include <sys/ioctl.h>
+#endif
+/* Mingw lacks 'struct termios' and 'struct winsize', but a forward
+ declaration of an opaque type is sufficient to allow compilation of
+ a stub openpty(). */
+struct termios;
+struct winsize;
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_FORKPTY@
+/* Create pseudo tty master slave pair and set terminal attributes
+ according to TERMP and WINP. Fork a child process attached to the
+ slave end. Return a handle for the master end in *AMASTER, and
+ return the name of the slave end in NAME. */
+# if @REPLACE_FORKPTY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef forkpty
+# define forkpty rpl_forkpty
+# endif
+_GL_FUNCDECL_RPL (forkpty, int,
+ (int *amaster, char *name,
+ struct termios const *termp, struct winsize const *winp));
+_GL_CXXALIAS_RPL (forkpty, int,
+ (int *amaster, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# else
+# if !@HAVE_FORKPTY@
+_GL_FUNCDECL_SYS (forkpty, int,
+ (int *amaster, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# endif
+_GL_CXXALIAS_SYS (forkpty, int,
+ (int *amaster, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# endif
+_GL_CXXALIASWARN (forkpty);
+#elif defined GNULIB_POSIXCHECK
+# undef forkpty
+# if HAVE_RAW_DECL_FORKPTY
+_GL_WARN_ON_USE (forkpty, "forkpty is not declared consistently - "
+ "use gnulib module forkpty for portability");
+# endif
+#endif
+
+#if @GNULIB_OPENPTY@
+/* Create pseudo tty master slave pair and set terminal attributes
+ according to TERMP and WINP. Return handles for both ends in
+ *AMASTER and *ASLAVE, and return the name of the slave end in NAME. */
+# if @REPLACE_OPENPTY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef openpty
+# define openpty rpl_openpty
+# endif
+_GL_FUNCDECL_RPL (openpty, int,
+ (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp));
+_GL_CXXALIAS_RPL (openpty, int,
+ (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# else
+# if !@HAVE_OPENPTY@
+_GL_FUNCDECL_SYS (openpty, int,
+ (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# endif
+_GL_CXXALIAS_SYS (openpty, int,
+ (int *amaster, int *aslave, char *name,
+ struct termios const *termp, struct winsize const *winp));
+# endif
+_GL_CXXALIASWARN (openpty);
+#elif defined GNULIB_POSIXCHECK
+# undef openpty
+# if HAVE_RAW_DECL_OPENPTY
+_GL_WARN_ON_USE (openpty, "openpty is not declared consistently - "
+ "use gnulib module openpty for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_PTY_H */
+#endif /* _@GUARD_PREFIX@_PTY_H */
diff --git a/gnulib/lib/putenv.c b/gnulib/lib/putenv.c
new file mode 100644
index 0000000..2da3376
--- /dev/null
+++ b/gnulib/lib/putenv.c
@@ -0,0 +1,134 @@
+/* Copyright (C) 1991, 1994, 1997-1998, 2000, 2003-2011 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <stddef.h>
+
+/* Include errno.h *after* sys/types.h to work around header problems
+ on AIX 3.2.5. */
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if _LIBC
+# if HAVE_GNU_LD
+# define environ __environ
+# else
+extern char **environ;
+# endif
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+static int
+_unsetenv (const char *name)
+{
+ size_t len;
+ char **ep;
+
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ len = strlen (name);
+
+ LOCK;
+
+ ep = environ;
+ while (*ep != NULL)
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+
+ UNLOCK;
+
+ return 0;
+}
+
+
+/* Put STRING, which is of the form "NAME=VALUE", in the environment.
+ If STRING contains no `=', then remove STRING from the environment. */
+int
+putenv (char *string)
+{
+ const char *const name_end = strchr (string, '=');
+ register size_t size;
+ register char **ep;
+
+ if (name_end == NULL)
+ {
+ /* Remove the variable from the environment. */
+ return _unsetenv (string);
+ }
+
+ size = 0;
+ for (ep = environ; *ep != NULL; ++ep)
+ if (!strncmp (*ep, string, name_end - string) &&
+ (*ep)[name_end - string] == '=')
+ break;
+ else
+ ++size;
+
+ if (*ep == NULL)
+ {
+ static char **last_environ = NULL;
+ char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
+ if (new_environ == NULL)
+ return -1;
+ (void) memcpy ((void *) new_environ, (void *) environ,
+ size * sizeof (char *));
+ new_environ[size] = (char *) string;
+ new_environ[size + 1] = NULL;
+ free (last_environ);
+ last_environ = new_environ;
+ environ = new_environ;
+ }
+ else
+ *ep = string;
+
+ return 0;
+}
diff --git a/gnulib/lib/pwrite.c b/gnulib/lib/pwrite.c
new file mode 100644
index 0000000..f8ef3b6
--- /dev/null
+++ b/gnulib/lib/pwrite.c
@@ -0,0 +1,64 @@
+/* Write block to given position in file without changing file pointer.
+ POSIX version.
+ Copyright (C) 1997-1999, 2002, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#define __libc_lseek(f,o,w) lseek (f, o, w)
+#define __set_errno(Val) errno = (Val)
+#define __libc_write(f,b,n) write (f, b, n)
+
+/* Note: This implementation of pwrite is not multithread-safe. */
+
+ssize_t
+pwrite (int fd, const void *buf, size_t nbyte, off_t offset)
+{
+ /* Since we must not change the file pointer preserve the value so that
+ we can restore it later. */
+ int save_errno;
+ ssize_t result;
+ off_t old_offset = __libc_lseek (fd, 0, SEEK_CUR);
+ if (old_offset == (off_t) -1)
+ return -1;
+
+ /* Set to wanted position. */
+ if (__libc_lseek (fd, offset, SEEK_SET) == (off_t) -1)
+ return -1;
+
+ /* Write out the data. */
+ result = __libc_write (fd, buf, nbyte);
+
+ /* Now we have to restore the position. If this fails we have to
+ return this as an error. But if the writing also failed we
+ return this error. */
+ save_errno = errno;
+ if (__libc_lseek (fd, old_offset, SEEK_SET) == (off_t) -1)
+ {
+ if (result == -1)
+ __set_errno (save_errno);
+ return -1;
+ }
+ __set_errno (save_errno);
+
+ return result;
+}
diff --git a/gnulib/lib/quote.c b/gnulib/lib/quote.c
new file mode 100644
index 0000000..1989c8c
--- /dev/null
+++ b/gnulib/lib/quote.c
@@ -0,0 +1,40 @@
+/* quote.c - quote arguments for output
+
+ Copyright (C) 1998-2001, 2003, 2005-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#include <config.h>
+
+#include "quotearg.h"
+#include "quote.h"
+
+/* Return an unambiguous printable representation of NAME,
+ allocated in slot N, suitable for diagnostics. */
+char const *
+quote_n (int n, char const *name)
+{
+ return quotearg_n_style (n, locale_quoting_style, name);
+}
+
+/* Return an unambiguous printable representation of NAME,
+ suitable for diagnostics. */
+char const *
+quote (char const *name)
+{
+ return quote_n (0, name);
+}
diff --git a/gnulib/lib/quote.h b/gnulib/lib/quote.h
new file mode 100644
index 0000000..d0acb51
--- /dev/null
+++ b/gnulib/lib/quote.h
@@ -0,0 +1,20 @@
+/* quote.h - prototypes for quote.c
+
+ Copyright (C) 1998-2001, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+char const *quote_n (int n, char const *name);
+char const *quote (char const *name);
diff --git a/gnulib/lib/quotearg.c b/gnulib/lib/quotearg.c
new file mode 100644
index 0000000..03fbfe7
--- /dev/null
+++ b/gnulib/lib/quotearg.c
@@ -0,0 +1,895 @@
+/* quotearg.c - quote arguments for output
+
+ Copyright (C) 1998-2002, 2004-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+/* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that
+ the quoting_options_from_style function might be candidate for
+ attribute 'pure' */
+#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+#endif
+
+#include <config.h>
+
+#include "quotearg.h"
+
+#include "xalloc.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define INT_BITS (sizeof (int) * CHAR_BIT)
+
+struct quoting_options
+{
+ /* Basic quoting style. */
+ enum quoting_style style;
+
+ /* Additional flags. Bitwise combination of enum quoting_flags. */
+ int flags;
+
+ /* Quote the characters indicated by this bit vector even if the
+ quoting style would not normally require them to be quoted. */
+ unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
+
+ /* The left quote for custom_quoting_style. */
+ char const *left_quote;
+
+ /* The right quote for custom_quoting_style. */
+ char const *right_quote;
+};
+
+/* Names of quoting styles. */
+char const *const quoting_style_args[] =
+{
+ "literal",
+ "shell",
+ "shell-always",
+ "c",
+ "c-maybe",
+ "escape",
+ "locale",
+ "clocale",
+ 0
+};
+
+/* Correspondences to quoting style names. */
+enum quoting_style const quoting_style_vals[] =
+{
+ literal_quoting_style,
+ shell_quoting_style,
+ shell_always_quoting_style,
+ c_quoting_style,
+ c_maybe_quoting_style,
+ escape_quoting_style,
+ locale_quoting_style,
+ clocale_quoting_style
+};
+
+/* The default quoting options. */
+static struct quoting_options default_quoting_options;
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *
+clone_quoting_options (struct quoting_options *o)
+{
+ int e = errno;
+ struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
+ sizeof *o);
+ errno = e;
+ return p;
+}
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style
+get_quoting_style (struct quoting_options *o)
+{
+ return (o ? o : &default_quoting_options)->style;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void
+set_quoting_style (struct quoting_options *o, enum quoting_style s)
+{
+ (o ? o : &default_quoting_options)->style = s;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). */
+int
+set_char_quoting (struct quoting_options *o, char c, int i)
+{
+ unsigned char uc = c;
+ unsigned int *p =
+ (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
+ int shift = uc % INT_BITS;
+ int r = (*p >> shift) & 1;
+ *p ^= ((i & 1) ^ r) << shift;
+ return r;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int
+set_quoting_flags (struct quoting_options *o, int i)
+{
+ int r;
+ if (!o)
+ o = &default_quoting_options;
+ r = o->flags;
+ o->flags = i;
+ return r;
+}
+
+void
+set_custom_quoting (struct quoting_options *o,
+ char const *left_quote, char const *right_quote)
+{
+ if (!o)
+ o = &default_quoting_options;
+ o->style = custom_quoting_style;
+ if (!left_quote || !right_quote)
+ abort ();
+ o->left_quote = left_quote;
+ o->right_quote = right_quote;
+}
+
+/* Return quoting options for STYLE, with no extra quoting. */
+static struct quoting_options /* NOT PURE!! */
+quoting_options_from_style (enum quoting_style style)
+{
+ struct quoting_options o = { 0 };
+ if (style == custom_quoting_style)
+ abort ();
+ o.style = style;
+ return o;
+}
+
+/* MSGID approximates a quotation mark. Return its translation if it
+ has one; otherwise, return either it or "\"", depending on S. */
+static char const *
+gettext_quote (char const *msgid, enum quoting_style s)
+{
+ char const *translation = _(msgid);
+ if (translation == msgid && s == clocale_quoting_style)
+ translation = "\"";
+ return translation;
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
+ QUOTE_THESE_TOO to control quoting.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
+
+ This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
+ ARGSIZE, O), except it breaks O into its component pieces and is
+ not careful about errno. */
+
+static size_t
+quotearg_buffer_restyled (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ enum quoting_style quoting_style, int flags,
+ unsigned int const *quote_these_too,
+ char const *left_quote,
+ char const *right_quote)
+{
+ size_t i;
+ size_t len = 0;
+ char const *quote_string = 0;
+ size_t quote_string_len = 0;
+ bool backslash_escapes = false;
+ bool unibyte_locale = MB_CUR_MAX == 1;
+ bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
+
+#define STORE(c) \
+ do \
+ { \
+ if (len < buffersize) \
+ buffer[len] = (c); \
+ len++; \
+ } \
+ while (0)
+
+ switch (quoting_style)
+ {
+ case c_maybe_quoting_style:
+ quoting_style = c_quoting_style;
+ elide_outer_quotes = true;
+ /* Fall through. */
+ case c_quoting_style:
+ if (!elide_outer_quotes)
+ STORE ('"');
+ backslash_escapes = true;
+ quote_string = "\"";
+ quote_string_len = 1;
+ break;
+
+ case escape_quoting_style:
+ backslash_escapes = true;
+ elide_outer_quotes = false;
+ break;
+
+ case locale_quoting_style:
+ case clocale_quoting_style:
+ case custom_quoting_style:
+ {
+ if (quoting_style != custom_quoting_style)
+ {
+ /* TRANSLATORS:
+ Get translations for open and closing quotation marks.
+
+ The message catalog should translate "`" to a left
+ quotation mark suitable for the locale, and similarly for
+ "'". If the catalog has no translation,
+ locale_quoting_style quotes `like this', and
+ clocale_quoting_style quotes "like this".
+
+ For example, an American English Unicode locale should
+ translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+ should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+ MARK). A British English Unicode locale should instead
+ translate these to U+2018 (LEFT SINGLE QUOTATION MARK)
+ and U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
+
+ If you don't know what to put here, please see
+ <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
+ and use glyphs suitable for your language. */
+ left_quote = gettext_quote (N_("`"), quoting_style);
+ right_quote = gettext_quote (N_("'"), quoting_style);
+ }
+ if (!elide_outer_quotes)
+ for (quote_string = left_quote; *quote_string; quote_string++)
+ STORE (*quote_string);
+ backslash_escapes = true;
+ quote_string = right_quote;
+ quote_string_len = strlen (quote_string);
+ }
+ break;
+
+ case shell_quoting_style:
+ quoting_style = shell_always_quoting_style;
+ elide_outer_quotes = true;
+ /* Fall through. */
+ case shell_always_quoting_style:
+ if (!elide_outer_quotes)
+ STORE ('\'');
+ quote_string = "'";
+ quote_string_len = 1;
+ break;
+
+ case literal_quoting_style:
+ elide_outer_quotes = false;
+ break;
+
+ default:
+ abort ();
+ }
+
+ for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
+ {
+ unsigned char c;
+ unsigned char esc;
+ bool is_right_quote = false;
+
+ if (backslash_escapes
+ && quote_string_len
+ && i + quote_string_len <= argsize
+ && memcmp (arg + i, quote_string, quote_string_len) == 0)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ is_right_quote = true;
+ }
+
+ c = arg[i];
+ switch (c)
+ {
+ case '\0':
+ if (backslash_escapes)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+ /* If quote_string were to begin with digits, we'd need to
+ test for the end of the arg as well. However, it's
+ hard to imagine any locale that would use digits in
+ quotes, and set_custom_quoting is documented not to
+ accept them. */
+ if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
+ {
+ STORE ('0');
+ STORE ('0');
+ }
+ c = '0';
+ /* We don't have to worry that this last '0' will be
+ backslash-escaped because, again, quote_string should
+ not start with it and because quote_these_too is
+ documented as not accepting it. */
+ }
+ else if (flags & QA_ELIDE_NULL_BYTES)
+ continue;
+ break;
+
+ case '?':
+ switch (quoting_style)
+ {
+ case shell_always_quoting_style:
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case c_quoting_style:
+ if ((flags & QA_SPLIT_TRIGRAPHS)
+ && i + 2 < argsize && arg[i + 1] == '?')
+ switch (arg[i + 2])
+ {
+ case '!': case '\'':
+ case '(': case ')': case '-': case '/':
+ case '<': case '=': case '>':
+ /* Escape the second '?' in what would otherwise be
+ a trigraph. */
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ c = arg[i + 2];
+ i += 2;
+ STORE ('?');
+ STORE ('"');
+ STORE ('"');
+ STORE ('?');
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case '\a': esc = 'a'; goto c_escape;
+ case '\b': esc = 'b'; goto c_escape;
+ case '\f': esc = 'f'; goto c_escape;
+ case '\n': esc = 'n'; goto c_and_shell_escape;
+ case '\r': esc = 'r'; goto c_and_shell_escape;
+ case '\t': esc = 't'; goto c_and_shell_escape;
+ case '\v': esc = 'v'; goto c_escape;
+ case '\\': esc = c;
+ /* No need to escape the escape if we are trying to elide
+ outer quotes and nothing else is problematic. */
+ if (backslash_escapes && elide_outer_quotes && quote_string_len)
+ goto store_c;
+
+ c_and_shell_escape:
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ /* Fall through. */
+ c_escape:
+ if (backslash_escapes)
+ {
+ c = esc;
+ goto store_escape;
+ }
+ break;
+
+ case '{': case '}': /* sometimes special if isolated */
+ if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
+ break;
+ /* Fall through. */
+ case '#': case '~':
+ if (i != 0)
+ break;
+ /* Fall through. */
+ case ' ':
+ case '!': /* special in bash */
+ case '"': case '$': case '&':
+ case '(': case ')': case '*': case ';':
+ case '<':
+ case '=': /* sometimes special in 0th or (with "set -k") later args */
+ case '>': case '[':
+ case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
+ case '`': case '|':
+ /* A shell special character. In theory, '$' and '`' could
+ be the first bytes of multibyte characters, which means
+ we should check them with mbrtowc, but in practice this
+ doesn't happen so it's not worth worrying about. */
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case '\'':
+ if (quoting_style == shell_always_quoting_style)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\'');
+ STORE ('\\');
+ STORE ('\'');
+ }
+ break;
+
+ case '%': case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9': case ':':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
+ case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
+ case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
+ case 'o': case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
+ /* These characters don't cause problems, no matter what the
+ quoting style is. They cannot start multibyte sequences.
+ A digit or a special letter would cause trouble if it
+ appeared at the beginning of quote_string because we'd then
+ escape by prepending a backslash. However, it's hard to
+ imagine any locale that would use digits or letters as
+ quotes, and set_custom_quoting is documented not to accept
+ them. Also, a digit or a special letter would cause
+ trouble if it appeared in quote_these_too, but that's also
+ documented as not accepting them. */
+ break;
+
+ default:
+ /* If we have a multibyte sequence, copy it until we reach
+ its end, find an error, or come back to the initial shift
+ state. For C-like styles, if the sequence has
+ unprintable characters, escape the whole sequence, since
+ we can't easily escape single characters within it. */
+ {
+ /* Length of multibyte sequence found so far. */
+ size_t m;
+
+ bool printable;
+
+ if (unibyte_locale)
+ {
+ m = 1;
+ printable = isprint (c) != 0;
+ }
+ else
+ {
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof mbstate);
+
+ m = 0;
+ printable = true;
+ if (argsize == SIZE_MAX)
+ argsize = strlen (arg);
+
+ do
+ {
+ wchar_t w;
+ size_t bytes = mbrtowc (&w, &arg[i + m],
+ argsize - (i + m), &mbstate);
+ if (bytes == 0)
+ break;
+ else if (bytes == (size_t) -1)
+ {
+ printable = false;
+ break;
+ }
+ else if (bytes == (size_t) -2)
+ {
+ printable = false;
+ while (i + m < argsize && arg[i + m])
+ m++;
+ break;
+ }
+ else
+ {
+ /* Work around a bug with older shells that "see" a '\'
+ that is really the 2nd byte of a multibyte character.
+ In practice the problem is limited to ASCII
+ chars >= '@' that are shell special chars. */
+ if ('[' == 0x5b && elide_outer_quotes
+ && quoting_style == shell_always_quoting_style)
+ {
+ size_t j;
+ for (j = 1; j < bytes; j++)
+ switch (arg[i + m + j])
+ {
+ case '[': case '\\': case '^':
+ case '`': case '|':
+ goto force_outer_quoting_style;
+
+ default:
+ break;
+ }
+ }
+
+ if (! iswprint (w))
+ printable = false;
+ m += bytes;
+ }
+ }
+ while (! mbsinit (&mbstate));
+ }
+
+ if (1 < m || (backslash_escapes && ! printable))
+ {
+ /* Output a multibyte sequence, or an escaped
+ unprintable unibyte character. */
+ size_t ilim = i + m;
+
+ for (;;)
+ {
+ if (backslash_escapes && ! printable)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+ STORE ('0' + (c >> 6));
+ STORE ('0' + ((c >> 3) & 7));
+ c = '0' + (c & 7);
+ }
+ else if (is_right_quote)
+ {
+ STORE ('\\');
+ is_right_quote = false;
+ }
+ if (ilim <= i + 1)
+ break;
+ STORE (c);
+ c = arg[++i];
+ }
+
+ goto store_c;
+ }
+ }
+ }
+
+ if (! ((backslash_escapes || elide_outer_quotes)
+ && quote_these_too
+ && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
+ && !is_right_quote)
+ goto store_c;
+
+ store_escape:
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ STORE ('\\');
+
+ store_c:
+ STORE (c);
+ }
+
+ if (len == 0 && quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+
+ if (quote_string && !elide_outer_quotes)
+ for (; *quote_string; quote_string++)
+ STORE (*quote_string);
+
+ if (len < buffersize)
+ buffer[len] = '\0';
+ return len;
+
+ force_outer_quoting_style:
+ /* Don't reuse quote_these_too, since the addition of outer quotes
+ sufficiently quotes the specified characters. */
+ return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ quoting_style,
+ flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
+ left_quote, right_quote);
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for
+ ARGSIZE. */
+size_t
+quotearg_buffer (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ p->style, p->flags, p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ return r;
+}
+
+/* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */
+char *
+quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ return quotearg_alloc_mem (arg, argsize, NULL, o);
+}
+
+/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
+ allocated storage containing the quoted string, and store the
+ resulting size into *SIZE, if non-NULL. The result can contain
+ embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
+ NULL, and set_quoting_flags has not set the null byte elision
+ flag. */
+char *
+quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ /* Elide embedded null bytes if we can't return a size. */
+ int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
+ size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
+ flags, p->quote_these_too,
+ p->left_quote,
+ p->right_quote) + 1;
+ char *buf = xcharalloc (bufsize);
+ quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
+ p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ if (size)
+ *size = bufsize - 1;
+ return buf;
+}
+
+/* A storage slot with size and pointer to a value. */
+struct slotvec
+{
+ size_t size;
+ char *val;
+};
+
+/* Preallocate a slot 0 buffer, so that the caller can always quote
+ one small component of a "memory exhausted" message in slot 0. */
+static char slot0[256];
+static unsigned int nslots = 1;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+ struct slotvec *sv = slotvec;
+ unsigned int i;
+ for (i = 1; i < nslots; i++)
+ free (sv[i].val);
+ if (sv[0].val != slot0)
+ {
+ free (sv[0].val);
+ slotvec0.size = sizeof slot0;
+ slotvec0.val = slot0;
+ }
+ if (sv != &slotvec0)
+ {
+ free (sv);
+ slotvec = &slotvec0;
+ }
+ nslots = 1;
+}
+
+/* Use storage slot N to return a quoted version of argument ARG.
+ ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
+ null-terminated string.
+ OPTIONS specifies the quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. N is deliberately declared with type "int"
+ to allow for future extensions (using negative values). */
+static char *
+quotearg_n_options (int n, char const *arg, size_t argsize,
+ struct quoting_options const *options)
+{
+ int e = errno;
+
+ unsigned int n0 = n;
+ struct slotvec *sv = slotvec;
+
+ if (n < 0)
+ abort ();
+
+ if (nslots <= n0)
+ {
+ /* FIXME: technically, the type of n1 should be `unsigned int',
+ but that evokes an unsuppressible warning from gcc-4.0.1 and
+ older. If gcc ever provides an option to suppress that warning,
+ revert to the original type, so that the test in xalloc_oversized
+ is once again performed only at compile time. */
+ size_t n1 = n0 + 1;
+ bool preallocated = (sv == &slotvec0);
+
+ if (xalloc_oversized (n1, sizeof *sv))
+ xalloc_die ();
+
+ slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
+ if (preallocated)
+ *sv = slotvec0;
+ memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
+ nslots = n1;
+ }
+
+ {
+ size_t size = sv[n].size;
+ char *val = sv[n].val;
+ /* Elide embedded null bytes since we don't return a size. */
+ int flags = options->flags | QA_ELIDE_NULL_BYTES;
+ size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
+ options->style, flags,
+ options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+
+ if (size <= qsize)
+ {
+ sv[n].size = size = qsize + 1;
+ if (val != slot0)
+ free (val);
+ sv[n].val = val = xcharalloc (size);
+ quotearg_buffer_restyled (val, size, arg, argsize, options->style,
+ flags, options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+ }
+
+ errno = e;
+ return val;
+ }
+}
+
+char *
+quotearg_n (int n, char const *arg)
+{
+ return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
+}
+
+char *
+quotearg_n_mem (int n, char const *arg, size_t argsize)
+{
+ return quotearg_n_options (n, arg, argsize, &default_quoting_options);
+}
+
+char *
+quotearg (char const *arg)
+{
+ return quotearg_n (0, arg);
+}
+
+char *
+quotearg_mem (char const *arg, size_t argsize)
+{
+ return quotearg_n_mem (0, arg, argsize);
+}
+
+char *
+quotearg_n_style (int n, enum quoting_style s, char const *arg)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, SIZE_MAX, &o);
+}
+
+char *
+quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_style (enum quoting_style s, char const *arg)
+{
+ return quotearg_n_style (0, s, arg);
+}
+
+char *
+quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
+{
+ return quotearg_n_style_mem (0, s, arg, argsize);
+}
+
+char *
+quotearg_char_mem (char const *arg, size_t argsize, char ch)
+{
+ struct quoting_options options;
+ options = default_quoting_options;
+ set_char_quoting (&options, ch, 1);
+ return quotearg_n_options (0, arg, argsize, &options);
+}
+
+char *
+quotearg_char (char const *arg, char ch)
+{
+ return quotearg_char_mem (arg, SIZE_MAX, ch);
+}
+
+char *
+quotearg_colon (char const *arg)
+{
+ return quotearg_char (arg, ':');
+}
+
+char *
+quotearg_colon_mem (char const *arg, size_t argsize)
+{
+ return quotearg_char_mem (arg, argsize, ':');
+}
+
+char *
+quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg)
+{
+ return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
+ SIZE_MAX);
+}
+
+char *
+quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options o = default_quoting_options;
+ set_custom_quoting (&o, left_quote, right_quote);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg)
+{
+ return quotearg_n_custom (0, left_quote, right_quote, arg);
+}
+
+char *
+quotearg_custom_mem (char const *left_quote, char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
+ argsize);
+}
diff --git a/gnulib/lib/quotearg.h b/gnulib/lib/quotearg.h
new file mode 100644
index 0000000..2756d76
--- /dev/null
+++ b/gnulib/lib/quotearg.h
@@ -0,0 +1,389 @@
+/* quotearg.h - quote arguments for output
+
+ Copyright (C) 1998-2002, 2004, 2006, 2008-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#ifndef QUOTEARG_H_
+# define QUOTEARG_H_ 1
+
+# include <stddef.h>
+
+/* Basic quoting styles. For each style, an example is given on the
+ input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using
+ quotearg_buffer, quotearg_mem, and quotearg_colon_mem with that
+ style and the default flags and quoted characters. Note that the
+ examples are shown here as valid C strings rather than what
+ displays on a terminal (with "??/" as a trigraph for "\\"). */
+enum quoting_style
+ {
+ /* Output names as-is (ls --quoting-style=literal). Can result in
+ embedded null bytes if QA_ELIDE_NULL_BYTES is not in
+ effect.
+
+ quotearg_buffer:
+ "simple", "\0 \t\n'\"\033??/\\", "a:b"
+ quotearg:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ quotearg_colon:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ */
+ literal_quoting_style,
+
+ /* Quote names for the shell if they contain shell metacharacters
+ or would cause ambiguous output (ls --quoting-style=shell).
+ Can result in embedded null bytes if QA_ELIDE_NULL_BYTES is not
+ in effect.
+
+ quotearg_buffer:
+ "simple", "'\0 \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg:
+ "simple", "' \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg_colon:
+ "simple", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_quoting_style,
+
+ /* Quote names for the shell, even if they would normally not
+ require quoting (ls --quoting-style=shell-always). Can result
+ in embedded null bytes if QA_ELIDE_NULL_BYTES is not in effect.
+ Behaves like shell_quoting_style if QA_ELIDE_OUTER_QUOTES is in
+ effect.
+
+ quotearg_buffer:
+ "'simple'", "'\0 \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_always_quoting_style,
+
+ /* Quote names as for a C language string (ls --quoting-style=c).
+ Behaves like c_maybe_quoting_style if QA_ELIDE_OUTER_QUOTES is
+ in effect. Split into consecutive strings if
+ QA_SPLIT_TRIGRAPHS.
+
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+ */
+ c_quoting_style,
+
+ /* Like c_quoting_style except omit the surrounding double-quote
+ characters if no quoted characters are encountered.
+
+ quotearg_buffer:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg_colon:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ */
+ c_maybe_quoting_style,
+
+ /* Like c_quoting_style except always omit the surrounding
+ double-quote characters and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=escape).
+
+ quotearg_buffer:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg_colon:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a\\:b"
+ */
+ escape_quoting_style,
+
+ /* Like clocale_quoting_style, but quote `like this' instead of
+ "like this" in the default C locale (ls --quoting-style=locale).
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg_colon:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a\\:b'"
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ locale_quoting_style,
+
+ /* Like c_quoting_style except use quotation marks appropriate for
+ the locale and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=clocale).
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ clocale_quoting_style,
+
+ /* Like clocale_quoting_style except use the custom quotation marks
+ set by set_custom_quoting. If custom quotation marks are not
+ set, the behavior is undefined.
+
+ left_quote = right_quote = "'"
+ quotearg_buffer:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a\\:b'"
+
+ left_quote = "(" and right_quote = ")"
+ quotearg_buffer:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg_colon:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a\\:b)"
+
+ left_quote = ":" and right_quote = " "
+ quotearg_buffer:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg_colon:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a\\:b "
+
+ left_quote = "\"'" and right_quote = "'\""
+ Notice that this is treated as a single level of quotes or two
+ levels where the outer quote need not be escaped within the inner
+ quotes. For two levels where the outer quote must be escaped
+ within the inner quotes, you must use separate quotearg
+ invocations.
+ quotearg_buffer:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg_colon:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a\\:b'\""
+ */
+ custom_quoting_style
+ };
+
+/* Flags for use in set_quoting_flags. */
+enum quoting_flags
+ {
+ /* Always elide null bytes from styles that do not quote them,
+ even when the length of the result is available to the
+ caller. */
+ QA_ELIDE_NULL_BYTES = 0x01,
+
+ /* Omit the surrounding quote characters if no escaped characters
+ are encountered. Note that if no other character needs
+ escaping, then neither does the escape character. */
+ QA_ELIDE_OUTER_QUOTES = 0x02,
+
+ /* In the c_quoting_style and c_maybe_quoting_style, split ANSI
+ trigraph sequences into concatenated strings (for example,
+ "?""?/" rather than "??/", which could be confused with
+ "\\"). */
+ QA_SPLIT_TRIGRAPHS = 0x04
+ };
+
+/* For now, --quoting-style=literal is the default, but this may change. */
+# ifndef DEFAULT_QUOTING_STYLE
+# define DEFAULT_QUOTING_STYLE literal_quoting_style
+# endif
+
+/* Names of quoting styles and their corresponding values. */
+extern char const *const quoting_style_args[];
+extern enum quoting_style const quoting_style_vals[];
+
+struct quoting_options;
+
+/* The functions listed below set and use a hidden variable
+ that contains the default quoting style options. */
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *clone_quoting_options (struct quoting_options *o);
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style get_quoting_style (struct quoting_options *o);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void set_quoting_style (struct quoting_options *o, enum quoting_style s);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). C must never be a digit or a
+ letter that has special meaning after a backslash (for example, "\t"
+ for tab). */
+int set_char_quoting (struct quoting_options *o, char c, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int set_quoting_flags (struct quoting_options *o, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to custom_quoting_style,
+ set the left quote to LEFT_QUOTE, and set the right quote to
+ RIGHT_QUOTE. Each of LEFT_QUOTE and RIGHT_QUOTE must be
+ null-terminated and can be the empty string. Because backslashes are
+ used for escaping, it does not make sense for RIGHT_QUOTE to contain
+ a backslash. RIGHT_QUOTE must not begin with a digit or a letter
+ that has special meaning after a backslash (for example, "\t" for
+ tab). */
+void set_custom_quoting (struct quoting_options *o,
+ char const *left_quote,
+ char const *right_quote);
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
+ On output, BUFFER might contain embedded null bytes if ARGSIZE was
+ not -1, the style of O does not use backslash escapes, and the
+ flags of O do not request elision of null bytes.*/
+size_t quotearg_buffer (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_buffer, except return the result in a newly allocated
+ buffer. It is the caller's responsibility to free the result. The
+ result will not contain embedded null bytes. */
+char *quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_alloc, except that the length of the result,
+ excluding the terminating null byte, is stored into SIZE if it is
+ non-NULL. The result might contain embedded null bytes if ARGSIZE
+ was not -1, SIZE was not NULL, the style of O does not use
+ backslash escapes, and the flags of O do not request elision of
+ null bytes.*/
+char *quotearg_alloc_mem (char const *arg, size_t argsize,
+ size_t *size, struct quoting_options const *o);
+
+/* Use storage slot N to return a quoted version of the string ARG.
+ Use the default quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. The output of all functions in the
+ quotearg_n family are guaranteed to not contain embedded null
+ bytes.*/
+char *quotearg_n (int n, char const *arg);
+
+/* Equivalent to quotearg_n (0, ARG). */
+char *quotearg (char const *arg);
+
+/* Use storage slot N to return a quoted version of the argument ARG
+ of size ARGSIZE. This is like quotearg_n (N, ARG), except it can
+ quote null bytes. */
+char *quotearg_n_mem (int n, char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_mem (0, ARG, ARGSIZE). */
+char *quotearg_mem (char const *arg, size_t argsize);
+
+/* Use style S and storage slot N to return a quoted version of the string ARG.
+ This is like quotearg_n (N, ARG), except that it uses S with no other
+ options to specify the quoting method. */
+char *quotearg_n_style (int n, enum quoting_style s, char const *arg);
+
+/* Use style S and storage slot N to return a quoted version of the
+ argument ARG of size ARGSIZE. This is like quotearg_n_style
+ (N, S, ARG), except it can quote null bytes. */
+char *quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_style (0, S, ARG). */
+char *quotearg_style (enum quoting_style s, char const *arg);
+
+/* Equivalent to quotearg_n_style_mem (0, S, ARG, ARGSIZE). */
+char *quotearg_style_mem (enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Like quotearg (ARG), except also quote any instances of CH.
+ See set_char_quoting for a description of acceptable CH values. */
+char *quotearg_char (char const *arg, char ch);
+
+/* Like quotearg_char (ARG, CH), except it can quote null bytes. */
+char *quotearg_char_mem (char const *arg, size_t argsize, char ch);
+
+/* Equivalent to quotearg_char (ARG, ':'). */
+char *quotearg_colon (char const *arg);
+
+/* Like quotearg_colon (ARG), except it can quote null bytes. */
+char *quotearg_colon_mem (char const *arg, size_t argsize);
+
+/* Like quotearg_n_style (N, S, ARG) but with S as custom_quoting_style
+ with left quote as LEFT_QUOTE and right quote as RIGHT_QUOTE. See
+ set_custom_quoting for a description of acceptable LEFT_QUOTE and
+ RIGHT_QUOTE values. */
+char *quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg);
+
+/* Like quotearg_n_custom (N, LEFT_QUOTE, RIGHT_QUOTE, ARG) except it
+ can quote null bytes. */
+char *quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_custom (0, LEFT_QUOTE, RIGHT_QUOTE, ARG). */
+char *quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg);
+
+/* Equivalent to quotearg_n_custom_mem (0, LEFT_QUOTE, RIGHT_QUOTE, ARG,
+ ARGSIZE). */
+char *quotearg_custom_mem (char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Free any dynamically allocated memory. */
+void quotearg_free (void);
+
+#endif /* !QUOTEARG_H_ */
diff --git a/gnulib/lib/raise.c b/gnulib/lib/raise.c
new file mode 100644
index 0000000..aee33e8
--- /dev/null
+++ b/gnulib/lib/raise.c
@@ -0,0 +1,79 @@
+/* Provide a non-threads replacement for the POSIX raise function.
+
+ Copyright (C) 2002-2003, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#if HAVE_RAISE
+/* Native Windows platform. */
+
+# include <errno.h>
+
+# include "msvc-inval.h"
+
+# undef raise
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline int
+raise_nothrow (int sig)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = raise (sig);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EINVAL;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define raise_nothrow raise
+# endif
+
+#else
+/* An old Unix platform. */
+
+# include <unistd.h>
+
+# define rpl_raise raise
+
+#endif
+
+int
+rpl_raise (int sig)
+{
+#if GNULIB_defined_signal_blocking && GNULIB_defined_SIGPIPE
+ if (sig == SIGPIPE)
+ return _gl_raise_SIGPIPE ();
+#endif
+
+#if HAVE_RAISE
+ return raise_nothrow (sig);
+#else
+ return kill (getpid (), sig);
+#endif
+}
diff --git a/gnulib/lib/random_r.c b/gnulib/lib/random_r.c
new file mode 100644
index 0000000..288a72c
--- /dev/null
+++ b/gnulib/lib/random_r.c
@@ -0,0 +1,423 @@
+/*
+ Copyright (C) 1995, 2005, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/*
+ Copyright (C) 1983 Regents of the University of California.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 4. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.*/
+
+/*
+ * This is derived from the Berkeley source:
+ * @(#)random.c 5.5 (Berkeley) 7/6/88
+ * It was reworked for the GNU C Library by Roland McGrath.
+ * Rewritten to be reentrant by Ulrich Drepper, 1995
+ */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the buf == NULL, arg_state == NULL, result == NULL tests
+ below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <errno.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+
+/* An improved random number generation package. In addition to the standard
+ rand()/srand() like interface, this package also has a special state info
+ interface. The initstate() routine is called with a seed, an array of
+ bytes, and a count of how many bytes are being passed in; this array is
+ then initialized to contain information for random number generation with
+ that much state information. Good sizes for the amount of state
+ information are 32, 64, 128, and 256 bytes. The state can be switched by
+ calling the setstate() function with the same array as was initialized
+ with initstate(). By default, the package runs with 128 bytes of state
+ information and generates far better random numbers than a linear
+ congruential generator. If the amount of state information is less than
+ 32 bytes, a simple linear congruential R.N.G. is used. Internally, the
+ state information is treated as an array of longs; the zeroth element of
+ the array is the type of R.N.G. being used (small integer); the remainder
+ of the array is the state information for the R.N.G. Thus, 32 bytes of
+ state information will give 7 longs worth of state information, which will
+ allow a degree seven polynomial. (Note: The zeroth word of state
+ information also has some other information stored in it; see setstate
+ for details). The random number generation technique is a linear feedback
+ shift register approach, employing trinomials (since there are fewer terms
+ to sum up that way). In this approach, the least significant bit of all
+ the numbers in the state table will act as a linear feedback shift register,
+ and will have period 2^deg - 1 (where deg is the degree of the polynomial
+ being used, assuming that the polynomial is irreducible and primitive).
+ The higher order bits will have longer periods, since their values are
+ also influenced by pseudo-random carries out of the lower bits. The
+ total period of the generator is approximately deg*(2**deg - 1); thus
+ doubling the amount of state information has a vast influence on the
+ period of the generator. Note: The deg*(2**deg - 1) is an approximation
+ only good for large deg, when the period of the shift register is the
+ dominant factor. With deg equal to seven, the period is actually much
+ longer than the 7*(2**7 - 1) predicted by this formula. */
+
+
+
+/* For each of the currently supported random number generators, we have a
+ break value on the amount of state information (you need at least this many
+ bytes of state info to support this random number generator), a degree for
+ the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ separation between the two lower order coefficients of the trinomial. */
+
+/* Linear congruential. */
+#define TYPE_0 0
+#define BREAK_0 8
+#define DEG_0 0
+#define SEP_0 0
+
+/* x**7 + x**3 + 1. */
+#define TYPE_1 1
+#define BREAK_1 32
+#define DEG_1 7
+#define SEP_1 3
+
+/* x**15 + x + 1. */
+#define TYPE_2 2
+#define BREAK_2 64
+#define DEG_2 15
+#define SEP_2 1
+
+/* x**31 + x**3 + 1. */
+#define TYPE_3 3
+#define BREAK_3 128
+#define DEG_3 31
+#define SEP_3 3
+
+/* x**63 + x + 1. */
+#define TYPE_4 4
+#define BREAK_4 256
+#define DEG_4 63
+#define SEP_4 1
+
+
+/* Array versions of the above information to make code run faster.
+ Relies on fact that TYPE_i == i. */
+
+#define MAX_TYPES 5 /* Max number of types above. */
+
+struct random_poly_info
+{
+ int seps[MAX_TYPES];
+ int degrees[MAX_TYPES];
+};
+
+static const struct random_poly_info random_poly_info =
+{
+ { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 },
+ { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }
+};
+
+#ifndef _LIBC
+# define weak_alias(local, symbol)
+# define __set_errno(e) errno = (e)
+# define __srandom_r srandom_r
+# define __initstate_r initstate_r
+# define __setstate_r setstate_r
+# define __random_r random_r
+#endif
+
+
+
+/* Initialize the random number generator based on the given seed. If the
+ type is the trivial no-state-information type, just remember the seed.
+ Otherwise, initializes state[] based on the given "seed" via a linear
+ congruential generator. Then, the pointers are set to known locations
+ that are exactly rand_sep places apart. Lastly, it cycles the state
+ information a given number of times to get rid of any initial dependencies
+ introduced by the L.C.R.N.G. Note that the initialization of randtbl[]
+ for default usage relies on values produced by this routine. */
+int
+__srandom_r (unsigned int seed, struct random_data *buf)
+{
+ int type;
+ int32_t *state;
+ long int i;
+ long int word;
+ int32_t *dst;
+ int kc;
+
+ if (buf == NULL)
+ goto fail;
+ type = buf->rand_type;
+ if ((unsigned int) type >= MAX_TYPES)
+ goto fail;
+
+ state = buf->state;
+ /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
+ if (seed == 0)
+ seed = 1;
+ state[0] = seed;
+ if (type == TYPE_0)
+ goto done;
+
+ dst = state;
+ word = seed;
+ kc = buf->rand_deg;
+ for (i = 1; i < kc; ++i)
+ {
+ /* This does:
+ state[i] = (16807 * state[i - 1]) % 2147483647;
+ but avoids overflowing 31 bits. */
+ long int hi = word / 127773;
+ long int lo = word % 127773;
+ word = 16807 * lo - 2836 * hi;
+ if (word < 0)
+ word += 2147483647;
+ *++dst = word;
+ }
+
+ buf->fptr = &state[buf->rand_sep];
+ buf->rptr = &state[0];
+ kc *= 10;
+ while (--kc >= 0)
+ {
+ int32_t discard;
+ (void) __random_r (buf, &discard);
+ }
+
+ done:
+ return 0;
+
+ fail:
+ return -1;
+}
+
+weak_alias (__srandom_r, srandom_r)
+
+/* Initialize the state information in the given array of N bytes for
+ future random number generation. Based on the number of bytes we
+ are given, and the break values for the different R.N.G.'s, we choose
+ the best (largest) one we can and set things up for it. srandom is
+ then called to initialize the state information. Note that on return
+ from srandom, we set state[-1] to be the type multiplexed with the current
+ value of the rear pointer; this is so successive calls to initstate won't
+ lose this information and will be able to restart with setstate.
+ Note: The first thing we do is save the current state, if any, just like
+ setstate so that it doesn't matter when initstate is called.
+ Returns a pointer to the old state. */
+int
+__initstate_r (unsigned int seed, char *arg_state, size_t n,
+ struct random_data *buf)
+{
+ int32_t *old_state;
+ int32_t *state;
+ int type;
+ int degree;
+ int separation;
+
+ if (buf == NULL)
+ goto fail;
+
+ old_state = buf->state;
+ if (old_state != NULL)
+ {
+ int old_type = buf->rand_type;
+ if (old_type == TYPE_0)
+ old_state[-1] = TYPE_0;
+ else
+ old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+ }
+
+ if (n >= BREAK_3)
+ type = n < BREAK_4 ? TYPE_3 : TYPE_4;
+ else if (n < BREAK_1)
+ {
+ if (n < BREAK_0)
+ {
+ __set_errno (EINVAL);
+ goto fail;
+ }
+ type = TYPE_0;
+ }
+ else
+ type = n < BREAK_2 ? TYPE_1 : TYPE_2;
+
+ degree = random_poly_info.degrees[type];
+ separation = random_poly_info.seps[type];
+
+ buf->rand_type = type;
+ buf->rand_sep = separation;
+ buf->rand_deg = degree;
+ state = &((int32_t *) arg_state)[1]; /* First location. */
+ /* Must set END_PTR before srandom. */
+ buf->end_ptr = &state[degree];
+
+ buf->state = state;
+
+ __srandom_r (seed, buf);
+
+ state[-1] = TYPE_0;
+ if (type != TYPE_0)
+ state[-1] = (buf->rptr - state) * MAX_TYPES + type;
+
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__initstate_r, initstate_r)
+
+/* Restore the state from the given state array.
+ Note: It is important that we also remember the locations of the pointers
+ in the current state information, and restore the locations of the pointers
+ from the old state information. This is done by multiplexing the pointer
+ location into the zeroth word of the state information. Note that due
+ to the order in which things are done, it is OK to call setstate with the
+ same state as the current state
+ Returns a pointer to the old state information. */
+int
+__setstate_r (char *arg_state, struct random_data *buf)
+{
+ int32_t *new_state = 1 + (int32_t *) arg_state;
+ int type;
+ int old_type;
+ int32_t *old_state;
+ int degree;
+ int separation;
+
+ if (arg_state == NULL || buf == NULL)
+ goto fail;
+
+ old_type = buf->rand_type;
+ old_state = buf->state;
+ if (old_type == TYPE_0)
+ old_state[-1] = TYPE_0;
+ else
+ old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+
+ type = new_state[-1] % MAX_TYPES;
+ if (type < TYPE_0 || type > TYPE_4)
+ goto fail;
+
+ buf->rand_deg = degree = random_poly_info.degrees[type];
+ buf->rand_sep = separation = random_poly_info.seps[type];
+ buf->rand_type = type;
+
+ if (type != TYPE_0)
+ {
+ int rear = new_state[-1] / MAX_TYPES;
+ buf->rptr = &new_state[rear];
+ buf->fptr = &new_state[(rear + separation) % degree];
+ }
+ buf->state = new_state;
+ /* Set end_ptr too. */
+ buf->end_ptr = &new_state[degree];
+
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__setstate_r, setstate_r)
+
+/* If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ congruential bit. Otherwise, we do our fancy trinomial stuff, which is the
+ same in all the other cases due to all the global variables that have been
+ set up. The basic operation is to add the number at the rear pointer into
+ the one at the front pointer. Then both pointers are advanced to the next
+ location cyclically in the table. The value returned is the sum generated,
+ reduced to 31 bits by throwing away the "least random" low bit.
+ Note: The code takes advantage of the fact that both the front and
+ rear pointers can't wrap on the same call by not testing the rear
+ pointer if the front one has wrapped. Returns a 31-bit random number. */
+
+int
+__random_r (struct random_data *buf, int32_t *result)
+{
+ int32_t *state;
+
+ if (buf == NULL || result == NULL)
+ goto fail;
+
+ state = buf->state;
+
+ if (buf->rand_type == TYPE_0)
+ {
+ int32_t val = state[0];
+ val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
+ state[0] = val;
+ *result = val;
+ }
+ else
+ {
+ int32_t *fptr = buf->fptr;
+ int32_t *rptr = buf->rptr;
+ int32_t *end_ptr = buf->end_ptr;
+ int32_t val;
+
+ val = *fptr += *rptr;
+ /* Chucking least random bit. */
+ *result = (val >> 1) & 0x7fffffff;
+ ++fptr;
+ if (fptr >= end_ptr)
+ {
+ fptr = state;
+ ++rptr;
+ }
+ else
+ {
+ ++rptr;
+ if (rptr >= end_ptr)
+ rptr = state;
+ }
+ buf->fptr = fptr;
+ buf->rptr = rptr;
+ }
+ return 0;
+
+ fail:
+ __set_errno (EINVAL);
+ return -1;
+}
+
+weak_alias (__random_r, random_r)
diff --git a/gnulib/lib/rawmemchr.c b/gnulib/lib/rawmemchr.c
new file mode 100644
index 0000000..095a50a
--- /dev/null
+++ b/gnulib/lib/rawmemchr.c
@@ -0,0 +1,136 @@
+/* Searching in a string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S. */
+void *
+rawmemchr (const void *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 is zero is equivalent
+ to testing whether tmp is nonzero.
+
+ This test can read beyond the end of a string, depending on where
+ C_IN is encountered. However, this is considered safe since the
+ initialization phase ensured that the read will be aligned,
+ therefore, the read will not cross page boundaries and will not
+ cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == c. On little-endian machines, we
+ could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr != c)
+ char_ptr++;
+ return (void *) char_ptr;
+}
diff --git a/gnulib/lib/rawmemchr.valgrind b/gnulib/lib/rawmemchr.valgrind
new file mode 100644
index 0000000..6363923
--- /dev/null
+++ b/gnulib/lib/rawmemchr.valgrind
@@ -0,0 +1,12 @@
+# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
+# This use is OK because it provides only a speedup.
+{
+ rawmemchr-value4
+ Memcheck:Value4
+ fun:rawmemchr
+}
+{
+ rawmemchr-value8
+ Memcheck:Value8
+ fun:rawmemchr
+}
diff --git a/gnulib/lib/read-file.c b/gnulib/lib/read-file.c
new file mode 100644
index 0000000..3bf9b84
--- /dev/null
+++ b/gnulib/lib/read-file.c
@@ -0,0 +1,189 @@
+/* read-file.c -- read file contents into a string
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Bruno Haible.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include "read-file.h"
+
+/* Get fstat. */
+#include <sys/stat.h>
+
+/* Get ftello. */
+#include <stdio.h>
+
+/* Get SIZE_MAX. */
+#include <stdint.h>
+
+/* Get malloc, realloc, free. */
+#include <stdlib.h>
+
+/* Get errno. */
+#include <errno.h>
+
+/* Read a STREAM and return a newly allocated string with the content,
+ and set *LENGTH to the length of the string. The string is
+ zero-terminated, but the terminating zero byte is not counted in
+ *LENGTH. On errors, *LENGTH is undefined, errno preserves the
+ values set by system functions (if any), and NULL is returned. */
+char *
+fread_file (FILE *stream, size_t *length)
+{
+ char *buf = NULL;
+ size_t alloc = BUFSIZ;
+
+ /* For a regular file, allocate a buffer that has exactly the right
+ size. This avoids the need to do dynamic reallocations later. */
+ {
+ struct stat st;
+
+ if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode))
+ {
+ off_t pos = ftello (stream);
+
+ if (pos >= 0 && pos < st.st_size)
+ {
+ off_t alloc_off = st.st_size - pos;
+
+ /* '1' below, accounts for the trailing NUL. */
+ if (SIZE_MAX - 1 < alloc_off)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ alloc = alloc_off + 1;
+ }
+ }
+ }
+
+ if (!(buf = malloc (alloc)))
+ return NULL; /* errno is ENOMEM. */
+
+ {
+ size_t size = 0; /* number of bytes read so far */
+ int save_errno;
+
+ for (;;)
+ {
+ /* This reads 1 more than the size of a regular file
+ so that we get eof immediately. */
+ size_t requested = alloc - size;
+ size_t count = fread (buf + size, 1, requested, stream);
+ size += count;
+
+ if (count != requested)
+ {
+ save_errno = errno;
+ if (ferror (stream))
+ break;
+
+ /* Shrink the allocated memory if possible. */
+ if (size < alloc - 1)
+ {
+ char *smaller_buf = realloc (buf, size + 1);
+ if (smaller_buf != NULL)
+ buf = smaller_buf;
+ }
+
+ buf[size] = '\0';
+ *length = size;
+ return buf;
+ }
+
+ {
+ char *new_buf;
+
+ if (alloc == SIZE_MAX)
+ {
+ save_errno = ENOMEM;
+ break;
+ }
+
+ if (alloc < SIZE_MAX - alloc / 2)
+ alloc = alloc + alloc / 2;
+ else
+ alloc = SIZE_MAX;
+
+ if (!(new_buf = realloc (buf, alloc)))
+ {
+ save_errno = errno;
+ break;
+ }
+
+ buf = new_buf;
+ }
+ }
+
+ free (buf);
+ errno = save_errno;
+ return NULL;
+ }
+}
+
+static char *
+internal_read_file (const char *filename, size_t *length, const char *mode)
+{
+ FILE *stream = fopen (filename, mode);
+ char *out;
+ int save_errno;
+
+ if (!stream)
+ return NULL;
+
+ out = fread_file (stream, length);
+
+ save_errno = errno;
+
+ if (fclose (stream) != 0)
+ {
+ if (out)
+ {
+ save_errno = errno;
+ free (out);
+ }
+ errno = save_errno;
+ return NULL;
+ }
+
+ return out;
+}
+
+/* Open and read the contents of FILENAME, and return a newly
+ allocated string with the content, and set *LENGTH to the length of
+ the string. The string is zero-terminated, but the terminating
+ zero byte is not counted in *LENGTH. On errors, *LENGTH is
+ undefined, errno preserves the values set by system functions (if
+ any), and NULL is returned. */
+char *
+read_file (const char *filename, size_t *length)
+{
+ return internal_read_file (filename, length, "r");
+}
+
+/* Open (on non-POSIX systems, in binary mode) and read the contents
+ of FILENAME, and return a newly allocated string with the content,
+ and set LENGTH to the length of the string. The string is
+ zero-terminated, but the terminating zero byte is not counted in
+ the LENGTH variable. On errors, *LENGTH is undefined, errno
+ preserves the values set by system functions (if any), and NULL is
+ returned. */
+char *
+read_binary_file (const char *filename, size_t *length)
+{
+ return internal_read_file (filename, length, "rb");
+}
diff --git a/gnulib/lib/read-file.h b/gnulib/lib/read-file.h
new file mode 100644
index 0000000..60f3ab1
--- /dev/null
+++ b/gnulib/lib/read-file.h
@@ -0,0 +1,34 @@
+/* read-file.h -- read file contents into a string
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef READ_FILE_H
+#define READ_FILE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get FILE. */
+#include <stdio.h>
+
+extern char *fread_file (FILE * stream, size_t * length);
+
+extern char *read_file (const char *filename, size_t * length);
+
+extern char *read_binary_file (const char *filename, size_t * length);
+
+#endif /* READ_FILE_H */
diff --git a/gnulib/lib/read.c b/gnulib/lib/read.c
new file mode 100644
index 0000000..1bae389
--- /dev/null
+++ b/gnulib/lib/read.c
@@ -0,0 +1,85 @@
+/* POSIX compatible read() function.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "msvc-inval.h"
+# include "msvc-nothrow.h"
+
+# undef read
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline ssize_t
+read_nothrow (int fd, void *buf, size_t count)
+{
+ ssize_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = read (fd, buf, count);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define read_nothrow read
+# endif
+
+ssize_t
+rpl_read (int fd, void *buf, size_t count)
+{
+ ssize_t ret = read_nothrow (fd, buf, count);
+
+# if GNULIB_NONBLOCKING
+ if (ret < 0
+ && GetLastError () == ERROR_NO_DATA)
+ {
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (GetFileType (h) == FILE_TYPE_PIPE)
+ {
+ /* h is a pipe or socket. */
+ DWORD state;
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL, NULL, 0)
+ && (state & PIPE_NOWAIT) != 0)
+ /* h is a pipe in non-blocking mode.
+ Change errno from EINVAL to EAGAIN. */
+ errno = EAGAIN;
+ }
+ }
+# endif
+
+ return ret;
+}
+
+#endif
diff --git a/gnulib/lib/readdir.c b/gnulib/lib/readdir.c
new file mode 100644
index 0000000..04858b0
--- /dev/null
+++ b/gnulib/lib/readdir.c
@@ -0,0 +1,98 @@
+/* Read the next entry of a directory.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#include "dirent-private.h"
+
+struct dirent *
+readdir (DIR *dirp)
+{
+ char type;
+ struct dirent *result;
+
+ /* There is no need to add code to produce entries for "." and "..".
+ According to the POSIX:2008 section "4.12 Pathname Resolution"
+ <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html>
+ "." and ".." are syntactic entities.
+ POSIX also says:
+ "If entries for dot or dot-dot exist, one entry shall be returned
+ for dot and one entry shall be returned for dot-dot; otherwise,
+ they shall not be returned." */
+
+ switch (dirp->status)
+ {
+ case -2:
+ /* End of directory already reached. */
+ return NULL;
+ case -1:
+ break;
+ case 0:
+ if (!FindNextFile (dirp->current, &dirp->entry))
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_NO_MORE_FILES:
+ dirp->status = -2;
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ break;
+ default:
+ errno = dirp->status;
+ return NULL;
+ }
+
+ dirp->status = 0;
+
+ if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ type = DT_DIR;
+ else if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+ type = DT_LNK;
+ else if ((dirp->entry.dwFileAttributes
+ & ~(FILE_ATTRIBUTE_READONLY
+ | FILE_ATTRIBUTE_HIDDEN
+ | FILE_ATTRIBUTE_SYSTEM
+ | FILE_ATTRIBUTE_ARCHIVE
+ | FILE_ATTRIBUTE_NORMAL
+ | FILE_ATTRIBUTE_TEMPORARY
+ | FILE_ATTRIBUTE_SPARSE_FILE
+ | FILE_ATTRIBUTE_COMPRESSED
+ | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
+ | FILE_ATTRIBUTE_ENCRYPTED)) == 0)
+ /* Devices like COM1, LPT1, NUL would also have the attributes 0x20 but
+ they cannot occur here. */
+ type = DT_REG;
+ else
+ type = DT_UNKNOWN;
+
+ /* Reuse the memory of dirp->entry for the result. */
+ result =
+ (struct dirent *)
+ ((char *) dirp->entry.cFileName - offsetof (struct dirent, d_name[0]));
+ result->d_type = type;
+
+ return result;
+}
diff --git a/gnulib/lib/readline.c b/gnulib/lib/readline.c
new file mode 100644
index 0000000..72a93c3
--- /dev/null
+++ b/gnulib/lib/readline.c
@@ -0,0 +1,55 @@
+/* readline.c --- Simple implementation of readline.
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* This module is intended to be used when the application only needs
+ the readline interface. If you need more functions from the
+ readline library, it is recommended to require the readline library
+ (or improve this module) rather than #if-protect part of your
+ application (doing so would add assumptions of this module into
+ your application). The application should use #include
+ "readline.h", that header file will include <readline/readline.h>
+ if the real library is present on the system. */
+
+/* Get specification. */
+#include "readline.h"
+
+#include <stdio.h>
+#include <string.h>
+
+char *
+readline (const char *prompt)
+{
+ char *out = NULL;
+ size_t size = 0;
+
+ if (prompt)
+ {
+ fputs (prompt, stdout);
+ fflush (stdout);
+ }
+
+ if (getline (&out, &size, stdin) < 0)
+ return NULL;
+
+ while (*out && (out[strlen (out) - 1] == '\r'
+ || out[strlen (out) - 1] == '\n'))
+ out[strlen (out) - 1] = '\0';
+
+ return out;
+}
diff --git a/gnulib/lib/readline.h b/gnulib/lib/readline.h
new file mode 100644
index 0000000..ac77b53
--- /dev/null
+++ b/gnulib/lib/readline.h
@@ -0,0 +1,34 @@
+/* readline.h --- Simple implementation of readline.
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef GL_READLINE_H
+#define GL_READLINE_H
+
+#if HAVE_READLINE_READLINE_H
+/* <readline/readline.h> makes use of the FILE type without including
+ <stdio.h> itself. */
+# include <stdio.h>
+# include <readline/readline.h>
+#else
+/* Prints a prompt PROMPT and then reads and returns a single line of
+ text from the user. If PROMPT is NULL or the empty string, no
+ prompt is displayed. The returned line is allocated with malloc;
+ the caller should free the line when it has finished with it. */
+extern char *readline (const char *prompt);
+#endif
+
+#endif /* GL_READLINE_H */
diff --git a/gnulib/lib/readlink.c b/gnulib/lib/readlink.c
new file mode 100644
index 0000000..35d045b
--- /dev/null
+++ b/gnulib/lib/readlink.c
@@ -0,0 +1,74 @@
+/* Stub for readlink().
+ Copyright (C) 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_READLINK
+
+/* readlink() substitute for systems that don't have a readlink() function,
+ such as DJGPP 2.03 and mingw32. */
+
+ssize_t
+readlink (const char *name, char *buf _GL_UNUSED,
+ size_t bufsize _GL_UNUSED)
+{
+ struct stat statbuf;
+
+ /* In general we should use lstat() here, not stat(). But on platforms
+ without symbolic links, lstat() - if it exists - would be equivalent to
+ stat(), therefore we can use stat(). This saves us a configure check. */
+ if (stat (name, &statbuf) >= 0)
+ errno = EINVAL;
+ return -1;
+}
+
+#else /* HAVE_READLINK */
+
+# undef readlink
+
+/* readlink() wrapper that uses correct types, for systems like cygwin
+ 1.5.x where readlink returns int, and which rejects trailing slash,
+ for Solaris 9. */
+
+ssize_t
+rpl_readlink (const char *name, char *buf, size_t bufsize)
+{
+# if READLINK_TRAILING_SLASH_BUG
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ /* Even if name without the slash is a symlink to a directory,
+ both lstat() and stat() must resolve the trailing slash to
+ the directory rather than the symlink. We can therefore
+ safely use stat() to distinguish between EINVAL and
+ ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */
+ struct stat st;
+ if (stat (name, &st) == 0)
+ errno = EINVAL;
+ return -1;
+ }
+# endif /* READLINK_TRAILING_SLASH_BUG */
+ return readlink (name, buf, bufsize);
+}
+
+#endif /* HAVE_READLINK */
diff --git a/gnulib/lib/readlinkat.c b/gnulib/lib/readlinkat.c
new file mode 100644
index 0000000..63d0378
--- /dev/null
+++ b/gnulib/lib/readlinkat.c
@@ -0,0 +1,47 @@
+/* Read a symlink relative to an open directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+/* Gnulib provides a readlink stub for mingw; use it for distinction
+ between EINVAL and ENOENT, rather than always failing with ENOSYS. */
+
+/* POSIX 2008 says that unlike readlink, readlinkat returns 0 for
+ success instead of the buffer length. But this would render
+ readlinkat worthless since readlink does not guarantee a
+ NUL-terminated buffer. Assume this was a bug in POSIX. */
+
+/* Read the contents of symlink FILE into buffer BUF of size LEN, in the
+ directory open on descriptor FD. If possible, do it without changing
+ the working directory. Otherwise, resort to using save_cwd/fchdir,
+ then readlink/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+#define AT_FUNC_NAME readlinkat
+#define AT_FUNC_F1 readlink
+#define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t len
+#define AT_FUNC_POST_FILE_ARGS , buf, len
+#define AT_FUNC_RESULT ssize_t
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+#undef AT_FUNC_RESULT
diff --git a/gnulib/lib/readtokens.c b/gnulib/lib/readtokens.c
new file mode 100644
index 0000000..672bc8f
--- /dev/null
+++ b/gnulib/lib/readtokens.c
@@ -0,0 +1,203 @@
+/* readtokens.c -- Functions for reading tokens from an input stream.
+
+ Copyright (C) 1990-1991, 1999-2004, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Jim Meyering. */
+
+/* This almost supercedes xreadline stuff -- using delim="\n"
+ gives the same functionality, except that these functions
+ would never return empty lines. */
+
+#include <config.h>
+
+#include "readtokens.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Initialize a tokenbuffer. */
+
+void
+init_tokenbuffer (token_buffer *tokenbuffer)
+{
+ tokenbuffer->size = 0;
+ tokenbuffer->buffer = NULL;
+}
+
+/* Read a token from STREAM into TOKENBUFFER.
+ A token is delimited by any of the N_DELIM bytes in DELIM.
+ Upon return, the token is in tokenbuffer->buffer and
+ has a trailing '\0' instead of any original delimiter.
+ The function value is the length of the token not including
+ the final '\0'. Upon EOF (i.e. on the call after the last
+ token is read) or error, return -1 without modifying tokenbuffer.
+ The EOF and error conditions may be distinguished in the caller
+ by testing ferror (STREAM).
+
+ This function works properly on lines containing NUL bytes
+ and on files do not end with a delimiter. */
+
+size_t
+readtoken (FILE *stream,
+ const char *delim,
+ size_t n_delim,
+ token_buffer *tokenbuffer)
+{
+ char *p;
+ int c;
+ size_t i, n;
+ static const char *saved_delim = NULL;
+ static char isdelim[256];
+ bool same_delimiters;
+
+ if (delim == NULL && saved_delim == NULL)
+ abort ();
+
+ same_delimiters = false;
+ if (delim != saved_delim && saved_delim != NULL)
+ {
+ same_delimiters = true;
+ for (i = 0; i < n_delim; i++)
+ {
+ if (delim[i] != saved_delim[i])
+ {
+ same_delimiters = false;
+ break;
+ }
+ }
+ }
+
+ if (!same_delimiters)
+ {
+ size_t j;
+ saved_delim = delim;
+ memset (isdelim, 0, sizeof isdelim);
+ for (j = 0; j < n_delim; j++)
+ {
+ unsigned char ch = delim[j];
+ isdelim[ch] = 1;
+ }
+ }
+
+ /* FIXME: don't fool with this caching. Use strchr instead. */
+ /* skip over any leading delimiters */
+ for (c = getc (stream); c >= 0 && isdelim[c]; c = getc (stream))
+ {
+ /* empty */
+ }
+
+ p = tokenbuffer->buffer;
+ n = tokenbuffer->size;
+ i = 0;
+ for (;;)
+ {
+ if (c < 0 && i == 0)
+ return -1;
+
+ if (i == n)
+ p = x2nrealloc (p, &n, sizeof *p);
+
+ if (c < 0)
+ {
+ p[i] = 0;
+ break;
+ }
+ if (isdelim[c])
+ {
+ p[i] = 0;
+ break;
+ }
+ p[i++] = c;
+ c = getc (stream);
+ }
+
+ tokenbuffer->buffer = p;
+ tokenbuffer->size = n;
+ return i;
+}
+
+/* Build a NULL-terminated array of pointers to tokens
+ read from STREAM. Return the number of tokens read.
+ All storage is obtained through calls to xmalloc-like functions.
+
+ %%% Question: is it worth it to do a single
+ %%% realloc() of `tokens' just before returning? */
+
+size_t
+readtokens (FILE *stream,
+ size_t projected_n_tokens,
+ const char *delim,
+ size_t n_delim,
+ char ***tokens_out,
+ size_t **token_lengths)
+{
+ token_buffer tb, *token = &tb;
+ char **tokens;
+ size_t *lengths;
+ size_t sz;
+ size_t n_tokens;
+
+ if (projected_n_tokens == 0)
+ projected_n_tokens = 64;
+ else
+ projected_n_tokens++; /* add one for trailing NULL pointer */
+
+ sz = projected_n_tokens;
+ tokens = xnmalloc (sz, sizeof *tokens);
+ lengths = xnmalloc (sz, sizeof *lengths);
+
+ n_tokens = 0;
+ init_tokenbuffer (token);
+ for (;;)
+ {
+ char *tmp;
+ size_t token_length = readtoken (stream, delim, n_delim, token);
+ if (n_tokens >= sz)
+ {
+ tokens = x2nrealloc (tokens, &sz, sizeof *tokens);
+ lengths = xnrealloc (lengths, sz, sizeof *lengths);
+ }
+
+ if (token_length == (size_t) -1)
+ {
+ /* don't increment n_tokens for NULL entry */
+ tokens[n_tokens] = NULL;
+ lengths[n_tokens] = 0;
+ break;
+ }
+ tmp = xnmalloc (token_length + 1, sizeof *tmp);
+ lengths[n_tokens] = token_length;
+ tokens[n_tokens] = memcpy (tmp, token->buffer, token_length + 1);
+ n_tokens++;
+ }
+
+ free (token->buffer);
+ *tokens_out = tokens;
+ if (token_lengths != NULL)
+ *token_lengths = lengths;
+ else
+ free (lengths);
+ return n_tokens;
+}
diff --git a/gnulib/lib/readtokens.h b/gnulib/lib/readtokens.h
new file mode 100644
index 0000000..a98979b
--- /dev/null
+++ b/gnulib/lib/readtokens.h
@@ -0,0 +1,43 @@
+/* readtokens.h -- Functions for reading tokens from an input stream.
+
+ Copyright (C) 1990-1991, 1999, 2001-2004, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Jim Meyering. */
+
+#ifndef READTOKENS_H
+# define READTOKENS_H
+
+# include <stdio.h>
+
+struct tokenbuffer
+{
+ size_t size;
+ char *buffer;
+};
+typedef struct tokenbuffer token_buffer;
+
+void init_tokenbuffer (token_buffer *tokenbuffer);
+
+size_t
+ readtoken (FILE *stream, const char *delim, size_t n_delim,
+ token_buffer *tokenbuffer);
+size_t
+ readtokens (FILE *stream, size_t projected_n_tokens,
+ const char *delim, size_t n_delim,
+ char ***tokens_out, size_t **token_lengths);
+
+#endif /* not READTOKENS_H */
diff --git a/gnulib/lib/readtokens0.c b/gnulib/lib/readtokens0.c
new file mode 100644
index 0000000..26feaf7
--- /dev/null
+++ b/gnulib/lib/readtokens0.c
@@ -0,0 +1,99 @@
+/* readtokens0.c -- Read NUL-separated tokens from an input stream.
+
+ Copyright (C) 2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include "readtokens0.h"
+
+#define obstack_chunk_alloc malloc
+#define obstack_chunk_free free
+
+void
+readtokens0_init (struct Tokens *t)
+{
+ t->n_tok = 0;
+ t->tok = NULL;
+ t->tok_len = NULL;
+ obstack_init (&t->o_data);
+ obstack_init (&t->o_tok);
+ obstack_init (&t->o_tok_len);
+}
+
+void
+readtokens0_free (struct Tokens *t)
+{
+ obstack_free (&t->o_data, NULL);
+ obstack_free (&t->o_tok, NULL);
+ obstack_free (&t->o_tok_len, NULL);
+}
+
+/* Finalize (in the obstack_finish sense) the current token
+ and record its pointer and length. */
+static void
+save_token (struct Tokens *t)
+{
+ /* Don't count the trailing NUL byte in the length. */
+ size_t len = obstack_object_size (&t->o_data) - 1;
+ char const *s = obstack_finish (&t->o_data);
+ obstack_ptr_grow (&t->o_tok, s);
+ obstack_grow (&t->o_tok_len, &len, sizeof len);
+ t->n_tok++;
+}
+
+/* Read NUL-separated tokens from stream IN into T until EOF or error.
+ The final NUL is optional. Always append a NULL pointer to the
+ resulting list of token pointers, but that pointer isn't counted
+ via t->n_tok. Return true if successful. */
+bool
+readtokens0 (FILE *in, struct Tokens *t)
+{
+
+ while (1)
+ {
+ int c = fgetc (in);
+ if (c == EOF)
+ {
+ size_t len = obstack_object_size (&t->o_data);
+ /* If the current object has nonzero length, then there
+ was no NUL byte at EOF -- or maybe there was an error,
+ in which case, we need to append a NUL byte to our buffer. */
+ if (len)
+ {
+ obstack_1grow (&t->o_data, '\0');
+ save_token (t);
+ }
+
+ break;
+ }
+
+ obstack_1grow (&t->o_data, c);
+ if (c == '\0')
+ save_token (t);
+ }
+
+ /* Add a NULL pointer at the end, in case the caller (like du)
+ requires an argv-style array of strings. */
+ obstack_ptr_grow (&t->o_tok, NULL);
+
+ t->tok = obstack_finish (&t->o_tok);
+ t->tok_len = obstack_finish (&t->o_tok_len);
+ return ! ferror (in);
+}
diff --git a/gnulib/lib/readtokens0.h b/gnulib/lib/readtokens0.h
new file mode 100644
index 0000000..5e9a6ab
--- /dev/null
+++ b/gnulib/lib/readtokens0.h
@@ -0,0 +1,42 @@
+/* readtokens0.h -- read NUL-separated tokens from an input stream.
+
+ Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Jim Meyering. */
+
+#ifndef READTOKENS0_H
+# define READTOKENS0_H 1
+
+# include <stdio.h>
+# include <sys/types.h>
+# include <stdbool.h>
+# include "obstack.h"
+
+struct Tokens
+{
+ size_t n_tok;
+ char **tok;
+ size_t *tok_len;
+ struct obstack o_data; /* Contains data pointed to by each tok[i]. */
+ struct obstack o_tok; /* array of pointers to tokens */
+ struct obstack o_tok_len; /* array of token lengths */
+};
+
+void readtokens0_init (struct Tokens *t);
+void readtokens0_free (struct Tokens *t);
+bool readtokens0 (FILE *in, struct Tokens *t);
+
+#endif
diff --git a/gnulib/lib/readutmp.c b/gnulib/lib/readutmp.c
new file mode 100644
index 0000000..38453eb
--- /dev/null
+++ b/gnulib/lib/readutmp.c
@@ -0,0 +1,161 @@
+/* GNU's read utmp module.
+
+ Copyright (C) 1992-2001, 2003-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by jla; revised by djm */
+
+#include <config.h>
+
+#include "readutmp.h"
+
+#include <errno.h>
+#include <stdio.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "xalloc.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+/* Copy UT->ut_name into storage obtained from malloc. Then remove any
+ trailing spaces from the copy, NUL terminate it, and return the copy. */
+
+char *
+extract_trimmed_name (const STRUCT_UTMP *ut)
+{
+ char *p, *trimmed_name;
+
+ trimmed_name = xmalloc (sizeof (UT_USER (ut)) + 1);
+ strncpy (trimmed_name, UT_USER (ut), sizeof (UT_USER (ut)));
+ /* Append a trailing NUL. Some systems pad names shorter than the
+ maximum with spaces, others pad with NULs. Remove any trailing
+ spaces. */
+ trimmed_name[sizeof (UT_USER (ut))] = '\0';
+ for (p = trimmed_name + strlen (trimmed_name);
+ trimmed_name < p && p[-1] == ' ';
+ *--p = '\0')
+ continue;
+ return trimmed_name;
+}
+
+/* Is the utmp entry U desired by the user who asked for OPTIONS? */
+
+static inline bool
+desirable_utmp_entry (STRUCT_UTMP const *u, int options)
+{
+ bool user_proc = IS_USER_PROCESS (u);
+ if ((options & READ_UTMP_USER_PROCESS) && !user_proc)
+ return false;
+ if ((options & READ_UTMP_CHECK_PIDS)
+ && user_proc
+ && (UT_PID (u) <= 0
+ || (kill (UT_PID (u), 0) < 0 && errno == ESRCH)))
+ return false;
+ return true;
+}
+
+/* Read the utmp entries corresponding to file FILE into freshly-
+ malloc'd storage, set *UTMP_BUF to that pointer, set *N_ENTRIES to
+ the number of entries, and return zero. If there is any error,
+ return -1, setting errno, and don't modify the parameters.
+ If OPTIONS & READ_UTMP_CHECK_PIDS is nonzero, omit entries whose
+ process-IDs do not currently exist. */
+
+#ifdef UTMP_NAME_FUNCTION
+
+int
+read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options)
+{
+ size_t n_read = 0;
+ size_t n_alloc = 0;
+ STRUCT_UTMP *utmp = NULL;
+ STRUCT_UTMP *u;
+
+ /* Ignore the return value for now.
+ Solaris' utmpname returns 1 upon success -- which is contrary
+ to what the GNU libc version does. In addition, older GNU libc
+ versions are actually void. */
+ UTMP_NAME_FUNCTION (file);
+
+ SET_UTMP_ENT ();
+
+ while ((u = GET_UTMP_ENT ()) != NULL)
+ if (desirable_utmp_entry (u, options))
+ {
+ if (n_read == n_alloc)
+ utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp);
+
+ utmp[n_read++] = *u;
+ }
+
+ END_UTMP_ENT ();
+
+ *n_entries = n_read;
+ *utmp_buf = utmp;
+
+ return 0;
+}
+
+#else
+
+int
+read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options)
+{
+ size_t n_read = 0;
+ size_t n_alloc = 0;
+ STRUCT_UTMP *utmp = NULL;
+ int saved_errno;
+ FILE *f = fopen (file, "r");
+
+ if (! f)
+ return -1;
+
+ for (;;)
+ {
+ if (n_read == n_alloc)
+ utmp = x2nrealloc (utmp, &n_alloc, sizeof *utmp);
+ if (fread (&utmp[n_read], sizeof utmp[n_read], 1, f) == 0)
+ break;
+ n_read += desirable_utmp_entry (&utmp[n_read], options);
+ }
+
+ saved_errno = ferror (f) ? errno : 0;
+ if (fclose (f) != 0)
+ saved_errno = errno;
+ if (saved_errno != 0)
+ {
+ free (utmp);
+ errno = saved_errno;
+ return -1;
+ }
+
+ *n_entries = n_read;
+ *utmp_buf = utmp;
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/readutmp.h b/gnulib/lib/readutmp.h
new file mode 100644
index 0000000..2c0e34d
--- /dev/null
+++ b/gnulib/lib/readutmp.h
@@ -0,0 +1,216 @@
+/* Declarations for GNU's read utmp module.
+
+ Copyright (C) 1992-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by jla; revised by djm */
+
+#ifndef __READUTMP_H__
+# define __READUTMP_H__
+
+# include <sys/types.h>
+
+/* AIX 4.3.3 has both utmp.h and utmpx.h, but only struct utmp
+ has the ut_exit member. */
+# if (HAVE_UTMPX_H && HAVE_UTMP_H && HAVE_STRUCT_UTMP_UT_EXIT \
+ && ! HAVE_STRUCT_UTMPX_UT_EXIT)
+# undef HAVE_UTMPX_H
+# endif
+
+# if HAVE_UTMPX_H
+# if HAVE_UTMP_H
+ /* HPUX 10.20 needs utmp.h, for the definition of e.g., UTMP_FILE. */
+# include <utmp.h>
+# endif
+# if defined _THREAD_SAFE && defined UTMP_DATA_INIT
+ /* When including both utmp.h and utmpx.h on AIX 4.3, with _THREAD_SAFE
+ defined, work around the duplicate struct utmp_data declaration. */
+# define utmp_data gl_aix_4_3_workaround_utmp_data
+# endif
+# include <utmpx.h>
+# define UTMP_STRUCT_NAME utmpx
+# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
+# define SET_UTMP_ENT setutxent
+# define GET_UTMP_ENT getutxent
+# define END_UTMP_ENT endutxent
+# ifdef HAVE_UTMPXNAME
+# define UTMP_NAME_FUNCTION utmpxname
+# endif
+
+# if HAVE_STRUCT_UTMPX_UT_EXIT_E_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
+# else
+# if HAVE_STRUCT_UTMPX_UT_EXIT_UT_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
+# else
+# define UT_EXIT_E_TERMINATION(U) 0
+# endif
+# endif
+
+# if HAVE_STRUCT_UTMPX_UT_EXIT_E_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
+# else
+# if HAVE_STRUCT_UTMPX_UT_EXIT_UT_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
+# else
+# define UT_EXIT_E_EXIT(U) 0
+# endif
+# endif
+
+# elif HAVE_UTMP_H
+
+# include <utmp.h>
+# if !HAVE_DECL_GETUTENT
+ struct utmp *getutent (void);
+# endif
+# define UTMP_STRUCT_NAME utmp
+# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
+# define SET_UTMP_ENT setutent
+# define GET_UTMP_ENT getutent
+# define END_UTMP_ENT endutent
+# ifdef HAVE_UTMPNAME
+# define UTMP_NAME_FUNCTION utmpname
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_EXIT_E_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.e_termination)
+# else
+# if HAVE_STRUCT_UTMP_UT_EXIT_UT_TERMINATION
+# define UT_EXIT_E_TERMINATION(U) ((U)->ut_exit.ut_termination)
+# else
+# define UT_EXIT_E_TERMINATION(U) 0
+# endif
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_EXIT_E_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.e_exit)
+# else
+# if HAVE_STRUCT_UTMP_UT_EXIT_UT_EXIT
+# define UT_EXIT_E_EXIT(U) ((U)->ut_exit.ut_exit)
+# else
+# define UT_EXIT_E_EXIT(U) 0
+# endif
+# endif
+
+# endif
+
+/* Accessor macro for the member named ut_user or ut_name. */
+# if HAVE_UTMPX_H
+
+# if HAVE_STRUCT_UTMPX_UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_user)
+# endif
+# if HAVE_STRUCT_UTMPX_UT_NAME
+# undef UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_name)
+# endif
+
+# elif HAVE_UTMP_H
+
+# if HAVE_STRUCT_UTMP_UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_user)
+# endif
+# if HAVE_STRUCT_UTMP_UT_NAME
+# undef UT_USER
+# define UT_USER(Utmp) ((Utmp)->ut_name)
+# endif
+
+# endif
+
+# define HAVE_STRUCT_XTMP_UT_EXIT \
+ (HAVE_STRUCT_UTMP_UT_EXIT \
+ || HAVE_STRUCT_UTMPX_UT_EXIT)
+
+# define HAVE_STRUCT_XTMP_UT_ID \
+ (HAVE_STRUCT_UTMP_UT_ID \
+ || HAVE_STRUCT_UTMPX_UT_ID)
+
+# define HAVE_STRUCT_XTMP_UT_PID \
+ (HAVE_STRUCT_UTMP_UT_PID \
+ || HAVE_STRUCT_UTMPX_UT_PID)
+
+typedef struct UTMP_STRUCT_NAME STRUCT_UTMP;
+
+enum { UT_USER_SIZE = sizeof UT_USER ((STRUCT_UTMP *) 0) };
+
+# if !defined UTMP_FILE && defined _PATH_UTMP
+# define UTMP_FILE _PATH_UTMP
+# endif
+
+# if !defined WTMP_FILE && defined _PATH_WTMP
+# define WTMP_FILE _PATH_WTMP
+# endif
+
+# ifdef UTMPX_FILE /* Solaris, SysVr4 */
+# undef UTMP_FILE
+# define UTMP_FILE UTMPX_FILE
+# endif
+
+# ifdef WTMPX_FILE /* Solaris, SysVr4 */
+# undef WTMP_FILE
+# define WTMP_FILE WTMPX_FILE
+# endif
+
+# ifndef UTMP_FILE
+# define UTMP_FILE "/etc/utmp"
+# endif
+
+# ifndef WTMP_FILE
+# define WTMP_FILE "/etc/wtmp"
+# endif
+
+# if HAVE_STRUCT_XTMP_UT_PID
+# define UT_PID(U) ((U)->ut_pid)
+# else
+# define UT_PID(U) 0
+# endif
+
+# if HAVE_STRUCT_UTMP_UT_TYPE || HAVE_STRUCT_UTMPX_UT_TYPE
+# define UT_TYPE_EQ(U, V) ((U)->ut_type == (V))
+# define UT_TYPE_NOT_DEFINED 0
+# else
+# define UT_TYPE_EQ(U, V) 0
+# define UT_TYPE_NOT_DEFINED 1
+# endif
+
+# ifdef BOOT_TIME
+# define UT_TYPE_BOOT_TIME(U) UT_TYPE_EQ (U, BOOT_TIME)
+# else
+# define UT_TYPE_BOOT_TIME(U) 0
+# endif
+
+# ifdef USER_PROCESS
+# define UT_TYPE_USER_PROCESS(U) UT_TYPE_EQ (U, USER_PROCESS)
+# else
+# define UT_TYPE_USER_PROCESS(U) 0
+# endif
+
+# define IS_USER_PROCESS(U) \
+ (UT_USER (U)[0] \
+ && (UT_TYPE_USER_PROCESS (U) \
+ || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0)))
+
+/* Options for read_utmp. */
+enum
+ {
+ READ_UTMP_CHECK_PIDS = 1,
+ READ_UTMP_USER_PROCESS = 2
+ };
+
+char *extract_trimmed_name (const STRUCT_UTMP *ut);
+int read_utmp (char const *file, size_t *n_entries, STRUCT_UTMP **utmp_buf,
+ int options);
+
+#endif /* __READUTMP_H__ */
diff --git a/gnulib/lib/realloc.c b/gnulib/lib/realloc.c
new file mode 100644
index 0000000..0c96ffa
--- /dev/null
+++ b/gnulib/lib/realloc.c
@@ -0,0 +1,79 @@
+/* realloc() function that is glibc compatible.
+
+ Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */
+#ifdef realloc
+# define NEED_REALLOC_GNU 1
+/* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU. */
+#elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU
+# define NEED_REALLOC_GNU 1
+#endif
+
+/* Infer the properties of the system's malloc function.
+ The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */
+#if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. If N is zero, change it to 1. If P is NULL,
+ use malloc. */
+
+void *
+rpl_realloc (void *p, size_t n)
+{
+ void *result;
+
+#if NEED_REALLOC_GNU
+ if (n == 0)
+ {
+ n = 1;
+
+ /* In theory realloc might fail, so don't rely on it to free. */
+ free (p);
+ p = NULL;
+ }
+#endif
+
+ if (p == NULL)
+ {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+ if (n == 0)
+ n = 1;
+#endif
+ result = malloc (n);
+ }
+ else
+ result = realloc (p, n);
+
+#if !HAVE_REALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/gnulib/lib/recv.c b/gnulib/lib/recv.c
new file mode 100644
index 0000000..4755f63
--- /dev/null
+++ b/gnulib/lib/recv.c
@@ -0,0 +1,49 @@
+/* recv.c --- wrappers for Windows recv function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recv
+
+ssize_t
+rpl_recv (int fd, void *buf, size_t len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = recv (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/recvfrom.c b/gnulib/lib/recvfrom.c
new file mode 100644
index 0000000..5ce2b12
--- /dev/null
+++ b/gnulib/lib/recvfrom.c
@@ -0,0 +1,58 @@
+/* recvfrom.c --- wrappers for Windows recvfrom function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recvfrom
+
+ssize_t
+rpl_recvfrom (int fd, void *buf, size_t len, int flags, struct sockaddr *from,
+ socklen_t *fromlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int frombufsize = (from != NULL ? *fromlen : 0);
+ int r = recvfrom (sock, buf, len, flags, from, fromlen);
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ /* Winsock recvfrom() only returns a valid 'from' when the socket is
+ connectionless. POSIX gives a valid 'from' for all types of
+ sockets. */
+ else if (from != NULL && *fromlen == frombufsize)
+ rpl_getpeername (fd, from, fromlen);
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/ref-add.sin b/gnulib/lib/ref-add.sin
new file mode 100644
index 0000000..528f96f
--- /dev/null
+++ b/gnulib/lib/ref-add.sin
@@ -0,0 +1,30 @@
+# Add this package to a list of references stored in a text file.
+#
+# Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ ta
+ :a
+ s/ @PACKAGE@ / @PACKAGE@ /
+ tb
+ s/ $/ @PACKAGE@ /
+ :b
+ s/^/# Packages using this file:/
+}
diff --git a/gnulib/lib/ref-del.sin b/gnulib/lib/ref-del.sin
new file mode 100644
index 0000000..5d98665
--- /dev/null
+++ b/gnulib/lib/ref-del.sin
@@ -0,0 +1,25 @@
+# Remove this package from a list of references stored in a text file.
+#
+# Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+ s/# Packages using this file://
+ s/ @PACKAGE@ / /
+ s/^/# Packages using this file:/
+}
diff --git a/gnulib/lib/regcomp.c b/gnulib/lib/regcomp.c
new file mode 100644
index 0000000..81c5d4a
--- /dev/null
+++ b/gnulib/lib/regcomp.c
@@ -0,0 +1,3876 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
+ size_t length, reg_syntax_t syntax);
+static void re_compile_fastmap_iter (regex_t *bufp,
+ const re_dfastate_t *init_state,
+ char *fastmap);
+static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
+#ifdef RE_ENABLE_I18N
+static void free_charset (re_charset_t *cset);
+#endif /* RE_ENABLE_I18N */
+static void free_workarea_compile (regex_t *preg);
+static reg_errcode_t create_initial_state (re_dfa_t *dfa);
+#ifdef RE_ENABLE_I18N
+static void optimize_utf8 (re_dfa_t *dfa);
+#endif
+static reg_errcode_t analyze (regex_t *preg);
+static reg_errcode_t preorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t postorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
+static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
+static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
+ bin_tree_t *node);
+static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
+static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
+static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
+static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint);
+static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint);
+static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
+static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
+ Idx node, bool root);
+static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
+static Idx fetch_number (re_string_t *input, re_token_t *token,
+ reg_syntax_t syntax);
+static int peek_token (re_token_t *token, re_string_t *input,
+ reg_syntax_t syntax) internal_function;
+static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
+ re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax,
+ reg_errcode_t *err);
+static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token, int token_len,
+ re_dfa_t *dfa,
+ reg_syntax_t syntax,
+ bool accept_hyphen);
+static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token);
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *equiv_class_alloc,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *char_class_alloc,
+ const unsigned char *class_name,
+ reg_syntax_t syntax);
+#else /* not RE_ENABLE_I18N */
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ const unsigned char *class_name,
+ reg_syntax_t syntax);
+#endif /* not RE_ENABLE_I18N */
+static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
+ RE_TRANSLATE_TYPE trans,
+ const unsigned char *class_name,
+ const unsigned char *extra,
+ bool non_match, reg_errcode_t *err);
+static bin_tree_t *create_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type);
+static bin_tree_t *create_token_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token);
+static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
+static void free_token (re_token_t *node);
+static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
+static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
+
+/* This table gives an error message for each of the error codes listed
+ in regex.h. Obviously the order here has to be same as there.
+ POSIX doesn't require that we do anything for REG_NOERROR,
+ but why not be nice? */
+
+static const char __re_error_msgid[] =
+ {
+#define REG_NOERROR_IDX 0
+ gettext_noop ("Success") /* REG_NOERROR */
+ "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+ gettext_noop ("No match") /* REG_NOMATCH */
+ "\0"
+#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
+ gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+ "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+ gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+ "\0"
+#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+ gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+ "\0"
+#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
+ gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+ "\0"
+#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
+ gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+ "\0"
+#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
+ gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */
+ "\0"
+#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
+ gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+ "\0"
+#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+ gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+ "\0"
+#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{")
+ gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+ "\0"
+#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+ gettext_noop ("Invalid range end") /* REG_ERANGE */
+ "\0"
+#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
+ gettext_noop ("Memory exhausted") /* REG_ESPACE */
+ "\0"
+#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
+ gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+ "\0"
+#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+ gettext_noop ("Premature end of regular expression") /* REG_EEND */
+ "\0"
+#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression")
+ gettext_noop ("Regular expression too big") /* REG_ESIZE */
+ "\0"
+#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
+ gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+ };
+
+static const size_t __re_error_msgid_idx[] =
+ {
+ REG_NOERROR_IDX,
+ REG_NOMATCH_IDX,
+ REG_BADPAT_IDX,
+ REG_ECOLLATE_IDX,
+ REG_ECTYPE_IDX,
+ REG_EESCAPE_IDX,
+ REG_ESUBREG_IDX,
+ REG_EBRACK_IDX,
+ REG_EPAREN_IDX,
+ REG_EBRACE_IDX,
+ REG_BADBR_IDX,
+ REG_ERANGE_IDX,
+ REG_ESPACE_IDX,
+ REG_BADRPT_IDX,
+ REG_EEND_IDX,
+ REG_ESIZE_IDX,
+ REG_ERPAREN_IDX
+ };
+
+/* Entry points for GNU code. */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+ compiles PATTERN (of length LENGTH) and puts the result in BUFP.
+ Returns 0 if the pattern was valid, otherwise an error string.
+
+ Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+ are set in BUFP on entry. */
+
+#ifdef _LIBC
+const char *
+re_compile_pattern (pattern, length, bufp)
+ const char *pattern;
+ size_t length;
+ struct re_pattern_buffer *bufp;
+#else /* size_t might promote */
+const char *
+re_compile_pattern (const char *pattern, size_t length,
+ struct re_pattern_buffer *bufp)
+#endif
+{
+ reg_errcode_t ret;
+
+ /* And GNU code determines whether or not to get register information
+ by passing null for the REGS argument to re_match, etc., not by
+ setting no_sub, unless RE_NO_SUB is set. */
+ bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
+
+ /* Match anchors at newline. */
+ bufp->newline_anchor = 1;
+
+ ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
+
+ if (!ret)
+ return NULL;
+ return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+#ifdef _LIBC
+weak_alias (__re_compile_pattern, re_compile_pattern)
+#endif
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
+ also be assigned to arbitrarily: each pattern buffer stores its own
+ syntax, so it can be changed between regex compilations. */
+/* This has no initializer because initialized variables in Emacs
+ become read-only after dumping. */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation. This provides
+ for compatibility for various utilities which historically have
+ different, incompatible syntaxes.
+
+ The argument SYNTAX is a bit mask comprised of the various bits
+ defined in regex.h. We return the old syntax. */
+
+reg_syntax_t
+re_set_syntax (syntax)
+ reg_syntax_t syntax;
+{
+ reg_syntax_t ret = re_syntax_options;
+
+ re_syntax_options = syntax;
+ return ret;
+}
+#ifdef _LIBC
+weak_alias (__re_set_syntax, re_set_syntax)
+#endif
+
+int
+re_compile_fastmap (bufp)
+ struct re_pattern_buffer *bufp;
+{
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+ char *fastmap = bufp->fastmap;
+
+ memset (fastmap, '\0', sizeof (char) * SBC_MAX);
+ re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
+ if (dfa->init_state != dfa->init_state_word)
+ re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
+ if (dfa->init_state != dfa->init_state_nl)
+ re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
+ if (dfa->init_state != dfa->init_state_begbuf)
+ re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
+ bufp->fastmap_accurate = 1;
+ return 0;
+}
+#ifdef _LIBC
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+#endif
+
+static inline void
+__attribute ((always_inline))
+re_set_fastmap (char *fastmap, bool icase, int ch)
+{
+ fastmap[ch] = 1;
+ if (icase)
+ fastmap[tolower (ch)] = 1;
+}
+
+/* Helper function for re_compile_fastmap.
+ Compile fastmap for the initial_state INIT_STATE. */
+
+static void
+re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
+ char *fastmap)
+{
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+ Idx node_cnt;
+ bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
+ for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
+ {
+ Idx node = init_state->nodes.elems[node_cnt];
+ re_token_type_t type = dfa->nodes[node].type;
+
+ if (type == CHARACTER)
+ {
+ re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
+#ifdef RE_ENABLE_I18N
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ unsigned char buf[MB_LEN_MAX];
+ unsigned char *p;
+ wchar_t wc;
+ mbstate_t state;
+
+ p = buf;
+ *p++ = dfa->nodes[node].opr.c;
+ while (++node < dfa->nodes_len
+ && dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].mb_partial)
+ *p++ = dfa->nodes[node].opr.c;
+ memset (&state, '\0', sizeof (state));
+ if (__mbrtowc (&wc, (const char *) buf, p - buf,
+ &state) == p - buf
+ && (__wcrtomb ((char *) buf, towlower (wc), &state)
+ != (size_t) -1))
+ re_set_fastmap (fastmap, false, buf[0]);
+ }
+#endif
+ }
+ else if (type == SIMPLE_BRACKET)
+ {
+ int i, ch;
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ {
+ int j;
+ bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (w & ((bitset_word_t) 1 << j))
+ re_set_fastmap (fastmap, icase, ch);
+ }
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == COMPLEX_BRACKET)
+ {
+ re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+ Idx i;
+
+# ifdef _LIBC
+ /* See if we have to try all bytes which start multiple collation
+ elements.
+ e.g. In da_DK, we want to catch 'a' since "aa" is a valid
+ collation element, and don't catch 'b' since 'b' is
+ the only collation element which starts from 'b' (and
+ it is caught by SIMPLE_BRACKET). */
+ if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
+ && (cset->ncoll_syms || cset->nranges))
+ {
+ const int32_t *table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ for (i = 0; i < SBC_MAX; ++i)
+ if (table[i] < 0)
+ re_set_fastmap (fastmap, icase, i);
+ }
+# endif /* _LIBC */
+
+ /* See if we have to start the match at all multibyte characters,
+ i.e. where we would not find an invalid sequence. This only
+ applies to multibyte character sets; for single byte character
+ sets, the SIMPLE_BRACKET again suffices. */
+ if (dfa->mb_cur_max > 1
+ && (cset->nchar_classes || cset->non_match || cset->nranges
+# ifdef _LIBC
+ || cset->nequiv_classes
+# endif /* _LIBC */
+ ))
+ {
+ unsigned char c = 0;
+ do
+ {
+ mbstate_t mbs;
+ memset (&mbs, 0, sizeof (mbs));
+ if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
+ re_set_fastmap (fastmap, false, (int) c);
+ }
+ while (++c != 0);
+ }
+
+ else
+ {
+ /* ... Else catch all bytes which can start the mbchars. */
+ for (i = 0; i < cset->nmbchars; ++i)
+ {
+ char buf[256];
+ mbstate_t state;
+ memset (&state, '\0', sizeof (state));
+ if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
+ re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
+ != (size_t) -1)
+ re_set_fastmap (fastmap, false, *(unsigned char *) buf);
+ }
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ else if (type == OP_PERIOD
+#ifdef RE_ENABLE_I18N
+ || type == OP_UTF8_PERIOD
+#endif /* RE_ENABLE_I18N */
+ || type == END_OF_RE)
+ {
+ memset (fastmap, '\1', sizeof (char) * SBC_MAX);
+ if (type == END_OF_RE)
+ bufp->can_be_null = 1;
+ return;
+ }
+ }
+}
+
+/* Entry point for POSIX code. */
+/* regcomp takes a regular expression as a string and compiles it.
+
+ PREG is a regex_t *. We do not expect any fields to be initialized,
+ since POSIX says we shouldn't. Thus, we set
+
+ `buffer' to the compiled pattern;
+ `used' to the length of the compiled pattern;
+ `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+ REG_EXTENDED bit in CFLAGS is set; otherwise, to
+ RE_SYNTAX_POSIX_BASIC;
+ `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+ `fastmap' to an allocated space for the fastmap;
+ `fastmap_accurate' to zero;
+ `re_nsub' to the number of subexpressions in PATTERN.
+
+ PATTERN is the address of the pattern string.
+
+ CFLAGS is a series of bits which affect compilation.
+
+ If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+ use POSIX basic syntax.
+
+ If REG_NEWLINE is set, then . and [^...] don't match newline.
+ Also, regexec will try a match beginning after every newline.
+
+ If REG_ICASE is set, then we considers upper- and lowercase
+ versions of letters to be equivalent when matching.
+
+ If REG_NOSUB is set, then when PREG is passed to regexec, that
+ routine will report only success or failure, and nothing about the
+ registers.
+
+ It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
+ the return codes and their meanings.) */
+
+int
+regcomp (preg, pattern, cflags)
+ regex_t *_Restrict_ preg;
+ const char *_Restrict_ pattern;
+ int cflags;
+{
+ reg_errcode_t ret;
+ reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
+ : RE_SYNTAX_POSIX_BASIC);
+
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ preg->used = 0;
+
+ /* Try to allocate space for the fastmap. */
+ preg->fastmap = re_malloc (char, SBC_MAX);
+ if (BE (preg->fastmap == NULL, 0))
+ return REG_ESPACE;
+
+ syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
+
+ /* If REG_NEWLINE is set, newlines are treated differently. */
+ if (cflags & REG_NEWLINE)
+ { /* REG_NEWLINE implies neither . nor [^...] match newline. */
+ syntax &= ~RE_DOT_NEWLINE;
+ syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+ /* It also changes the matching behavior. */
+ preg->newline_anchor = 1;
+ }
+ else
+ preg->newline_anchor = 0;
+ preg->no_sub = !!(cflags & REG_NOSUB);
+ preg->translate = NULL;
+
+ ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
+
+ /* POSIX doesn't distinguish between an unmatched open-group and an
+ unmatched close-group: both are REG_EPAREN. */
+ if (ret == REG_ERPAREN)
+ ret = REG_EPAREN;
+
+ /* We have already checked preg->fastmap != NULL. */
+ if (BE (ret == REG_NOERROR, 1))
+ /* Compute the fastmap now, since regexec cannot modify the pattern
+ buffer. This function never fails in this implementation. */
+ (void) re_compile_fastmap (preg);
+ else
+ {
+ /* Some error occurred while compiling the expression. */
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+ }
+
+ return (int) ret;
+}
+#ifdef _LIBC
+weak_alias (__regcomp, regcomp)
+#endif
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+ from either regcomp or regexec. We don't use PREG here. */
+
+#ifdef _LIBC
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+ int errcode;
+ const regex_t *_Restrict_ preg;
+ char *_Restrict_ errbuf;
+ size_t errbuf_size;
+#else /* size_t might promote */
+size_t
+regerror (int errcode, const regex_t *_Restrict_ preg,
+ char *_Restrict_ errbuf, size_t errbuf_size)
+#endif
+{
+ const char *msg;
+ size_t msg_size;
+
+ if (BE (errcode < 0
+ || errcode >= (int) (sizeof (__re_error_msgid_idx)
+ / sizeof (__re_error_msgid_idx[0])), 0))
+ /* Only error codes returned by the rest of the code should be passed
+ to this routine. If we are given anything else, or if other regex
+ code generates an invalid error code, then the program has a bug.
+ Dump core so we can fix it. */
+ abort ();
+
+ msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
+
+ msg_size = strlen (msg) + 1; /* Includes the null. */
+
+ if (BE (errbuf_size != 0, 1))
+ {
+ size_t cpy_size = msg_size;
+ if (BE (msg_size > errbuf_size, 0))
+ {
+ cpy_size = errbuf_size - 1;
+ errbuf[cpy_size] = '\0';
+ }
+ memcpy (errbuf, msg, cpy_size);
+ }
+
+ return msg_size;
+}
+#ifdef _LIBC
+weak_alias (__regerror, regerror)
+#endif
+
+
+#ifdef RE_ENABLE_I18N
+/* This static array is used for the map to single-byte characters when
+ UTF-8 is used. Otherwise we would allocate memory just to initialize
+ it the same all the time. UTF-8 is the preferred encoding so this is
+ a worthwhile optimization. */
+static const bitset_t utf8_sb_map =
+{
+ /* Set the first 128 bits. */
+# if 4 * BITSET_WORD_BITS < ASCII_CHARS
+# error "bitset_word_t is narrower than 32 bits"
+# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX,
+# endif
+ (BITSET_WORD_MAX
+ >> (SBC_MAX % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
+};
+#endif
+
+
+static void
+free_dfa_content (re_dfa_t *dfa)
+{
+ Idx i, j;
+
+ if (dfa->nodes)
+ for (i = 0; i < dfa->nodes_len; ++i)
+ free_token (dfa->nodes + i);
+ re_free (dfa->nexts);
+ for (i = 0; i < dfa->nodes_len; ++i)
+ {
+ if (dfa->eclosures != NULL)
+ re_node_set_free (dfa->eclosures + i);
+ if (dfa->inveclosures != NULL)
+ re_node_set_free (dfa->inveclosures + i);
+ if (dfa->edests != NULL)
+ re_node_set_free (dfa->edests + i);
+ }
+ re_free (dfa->edests);
+ re_free (dfa->eclosures);
+ re_free (dfa->inveclosures);
+ re_free (dfa->nodes);
+
+ if (dfa->state_table)
+ for (i = 0; i <= dfa->state_hash_mask; ++i)
+ {
+ struct re_state_table_entry *entry = dfa->state_table + i;
+ for (j = 0; j < entry->num; ++j)
+ {
+ re_dfastate_t *state = entry->array[j];
+ free_state (state);
+ }
+ re_free (entry->array);
+ }
+ re_free (dfa->state_table);
+#ifdef RE_ENABLE_I18N
+ if (dfa->sb_char != utf8_sb_map)
+ re_free (dfa->sb_char);
+#endif
+ re_free (dfa->subexp_map);
+#ifdef DEBUG
+ re_free (dfa->re_str);
+#endif
+
+ re_free (dfa);
+}
+
+
+/* Free dynamically allocated space used by PREG. */
+
+void
+regfree (preg)
+ regex_t *preg;
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ if (BE (dfa != NULL, 1))
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+
+ re_free (preg->translate);
+ preg->translate = NULL;
+}
+#ifdef _LIBC
+weak_alias (__regfree, regfree)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer. */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+# ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+ these names if they don't use our functions, and still use
+ regcomp/regexec above without link errors. */
+weak_function
+# endif
+re_comp (s)
+ const char *s;
+{
+ reg_errcode_t ret;
+ char *fastmap;
+
+ if (!s)
+ {
+ if (!re_comp_buf.buffer)
+ return gettext ("No previous regular expression");
+ return 0;
+ }
+
+ if (re_comp_buf.buffer)
+ {
+ fastmap = re_comp_buf.fastmap;
+ re_comp_buf.fastmap = NULL;
+ __regfree (&re_comp_buf);
+ memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
+ re_comp_buf.fastmap = fastmap;
+ }
+
+ if (re_comp_buf.fastmap == NULL)
+ {
+ re_comp_buf.fastmap = (char *) malloc (SBC_MAX);
+ if (re_comp_buf.fastmap == NULL)
+ return (char *) gettext (__re_error_msgid
+ + __re_error_msgid_idx[(int) REG_ESPACE]);
+ }
+
+ /* Since `re_exec' always passes NULL for the `regs' argument, we
+ don't need to initialize the pattern buffer fields which affect it. */
+
+ /* Match anchors at newlines. */
+ re_comp_buf.newline_anchor = 1;
+
+ ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
+
+ if (!ret)
+ return NULL;
+
+ /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
+ return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+ __regfree (&re_comp_buf);
+}
+#endif
+
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point.
+ Compile the regular expression PATTERN, whose length is LENGTH.
+ SYNTAX indicate regular expression's syntax. */
+
+static reg_errcode_t
+re_compile_internal (regex_t *preg, const char * pattern, size_t length,
+ reg_syntax_t syntax)
+{
+ reg_errcode_t err = REG_NOERROR;
+ re_dfa_t *dfa;
+ re_string_t regexp;
+
+ /* Initialize the pattern buffer. */
+ preg->fastmap_accurate = 0;
+ preg->syntax = syntax;
+ preg->not_bol = preg->not_eol = 0;
+ preg->used = 0;
+ preg->re_nsub = 0;
+ preg->can_be_null = 0;
+ preg->regs_allocated = REGS_UNALLOCATED;
+
+ /* Initialize the dfa. */
+ dfa = (re_dfa_t *) preg->buffer;
+ if (BE (preg->allocated < sizeof (re_dfa_t), 0))
+ {
+ /* If zero allocated, but buffer is non-null, try to realloc
+ enough space. This loses if buffer's address is bogus, but
+ that is the user's responsibility. If ->buffer is NULL this
+ is a simple allocation. */
+ dfa = re_realloc (preg->buffer, re_dfa_t, 1);
+ if (dfa == NULL)
+ return REG_ESPACE;
+ preg->allocated = sizeof (re_dfa_t);
+ preg->buffer = (unsigned char *) dfa;
+ }
+ preg->used = sizeof (re_dfa_t);
+
+ err = init_dfa (dfa, length);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+#ifdef DEBUG
+ /* Note: length+1 will not overflow since it is checked in init_dfa. */
+ dfa->re_str = re_malloc (char, length + 1);
+ strncpy (dfa->re_str, pattern, length + 1);
+#endif
+
+ __libc_lock_init (dfa->lock);
+
+ err = re_string_construct (&regexp, pattern, length, preg->translate,
+ (syntax & RE_ICASE) != 0, dfa);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_compile_internal_free_return:
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+
+ /* Parse the regular expression, and build a structure tree. */
+ preg->re_nsub = 0;
+ dfa->str_tree = parse (&regexp, preg, syntax, &err);
+ if (BE (dfa->str_tree == NULL, 0))
+ goto re_compile_internal_free_return;
+
+ /* Analyze the tree and create the nfa. */
+ err = analyze (preg);
+ if (BE (err != REG_NOERROR, 0))
+ goto re_compile_internal_free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* If possible, do searching in single byte encoding to speed things up. */
+ if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
+ optimize_utf8 (dfa);
+#endif
+
+ /* Then create the initial state of the dfa. */
+ err = create_initial_state (dfa);
+
+ /* Release work areas. */
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ }
+
+ return err;
+}
+
+/* Initialize DFA. We use the length of the regular expression PAT_LEN
+ as the initial length of some arrays. */
+
+static reg_errcode_t
+init_dfa (re_dfa_t *dfa, size_t pat_len)
+{
+ __re_size_t table_size;
+#ifndef _LIBC
+ char *codeset_name;
+#endif
+#ifdef RE_ENABLE_I18N
+ size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
+#else
+ size_t max_i18n_object_size = 0;
+#endif
+ size_t max_object_size =
+ MAX (sizeof (struct re_state_table_entry),
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ MAX (sizeof (regmatch_t),
+ max_i18n_object_size))));
+
+ memset (dfa, '\0', sizeof (re_dfa_t));
+
+ /* Force allocation of str_tree_storage the first time. */
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+
+ /* Avoid overflows. The extra "/ 2" is for the table_size doubling
+ calculation below, and for similar doubling calculations
+ elsewhere. And it's <= rather than <, because some of the
+ doubling calculations add 1 afterwards. */
+ if (BE (SIZE_MAX / max_object_size / 2 <= pat_len, 0))
+ return REG_ESPACE;
+
+ dfa->nodes_alloc = pat_len + 1;
+ dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
+
+ /* table_size = 2 ^ ceil(log pat_len) */
+ for (table_size = 1; ; table_size <<= 1)
+ if (table_size > pat_len)
+ break;
+
+ dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
+ dfa->state_hash_mask = table_size - 1;
+
+ dfa->mb_cur_max = MB_CUR_MAX;
+#ifdef _LIBC
+ if (dfa->mb_cur_max == 6
+ && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
+ dfa->is_utf8 = 1;
+ dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
+ != 0);
+#else
+ codeset_name = nl_langinfo (CODESET);
+ if (strcasecmp (codeset_name, "UTF-8") == 0
+ || strcasecmp (codeset_name, "UTF8") == 0)
+ dfa->is_utf8 = 1;
+
+ /* We check exhaustively in the loop below if this charset is a
+ superset of ASCII. */
+ dfa->map_notascii = 0;
+#endif
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ if (dfa->is_utf8)
+ dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
+ else
+ {
+ int i, j, ch;
+
+ dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+ if (BE (dfa->sb_char == NULL, 0))
+ return REG_ESPACE;
+
+ /* Set the bits corresponding to single byte chars. */
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ {
+ wint_t wch = __btowc (ch);
+ if (wch != WEOF)
+ dfa->sb_char[i] |= (bitset_word_t) 1 << j;
+# ifndef _LIBC
+ if (isascii (ch) && wch != ch)
+ dfa->map_notascii = 1;
+# endif
+ }
+ }
+ }
+#endif
+
+ if (BE (dfa->nodes == NULL || dfa->state_table == NULL, 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+/* Initialize WORD_CHAR table, which indicate which character is
+ "word". In this case "word" means that it is the word construction
+ character used by some operators like "\<", "\>", etc. */
+
+static void
+internal_function
+init_word_char (re_dfa_t *dfa)
+{
+ int i, j, ch;
+ dfa->word_ops_used = 1;
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (isalnum (ch) || ch == '_')
+ dfa->word_char[i] |= (bitset_word_t) 1 << j;
+}
+
+/* Free the work area which are only used while compiling. */
+
+static void
+free_workarea_compile (regex_t *preg)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_storage_t *storage, *next;
+ for (storage = dfa->str_tree_storage; storage; storage = next)
+ {
+ next = storage->next;
+ re_free (storage);
+ }
+ dfa->str_tree_storage = NULL;
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+ dfa->str_tree = NULL;
+ re_free (dfa->org_indices);
+ dfa->org_indices = NULL;
+}
+
+/* Create initial states for all contexts. */
+
+static reg_errcode_t
+create_initial_state (re_dfa_t *dfa)
+{
+ Idx first, i;
+ reg_errcode_t err;
+ re_node_set init_nodes;
+
+ /* Initial states have the epsilon closure of the node which is
+ the first node of the regular expression. */
+ first = dfa->str_tree->first->node_idx;
+ dfa->init_node = first;
+ err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* The back-references which are in initial states can epsilon transit,
+ since in this case all of the subexpressions can be null.
+ Then we add epsilon closures of the nodes which are the next nodes of
+ the back-references. */
+ if (dfa->nbackref > 0)
+ for (i = 0; i < init_nodes.nelem; ++i)
+ {
+ Idx node_idx = init_nodes.elems[i];
+ re_token_type_t type = dfa->nodes[node_idx].type;
+
+ Idx clexp_idx;
+ if (type != OP_BACK_REF)
+ continue;
+ for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
+ {
+ re_token_t *clexp_node;
+ clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
+ if (clexp_node->type == OP_CLOSE_SUBEXP
+ && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
+ break;
+ }
+ if (clexp_idx == init_nodes.nelem)
+ continue;
+
+ if (type == OP_BACK_REF)
+ {
+ Idx dest_idx = dfa->edests[node_idx].elems[0];
+ if (!re_node_set_contains (&init_nodes, dest_idx))
+ {
+ reg_errcode_t merge_err
+ = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
+ if (merge_err != REG_NOERROR)
+ return merge_err;
+ i = 0;
+ }
+ }
+ }
+
+ /* It must be the first time to invoke acquire_state. */
+ dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
+ /* We don't check ERR here, since the initial state must not be NULL. */
+ if (BE (dfa->init_state == NULL, 0))
+ return err;
+ if (dfa->init_state->has_constraint)
+ {
+ dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_WORD);
+ dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_NEWLINE);
+ dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
+ &init_nodes,
+ CONTEXT_NEWLINE
+ | CONTEXT_BEGBUF);
+ if (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ return err;
+ }
+ else
+ dfa->init_state_word = dfa->init_state_nl
+ = dfa->init_state_begbuf = dfa->init_state;
+
+ re_node_set_free (&init_nodes);
+ return REG_NOERROR;
+}
+
+#ifdef RE_ENABLE_I18N
+/* If it is possible to do searching in single byte encoding instead of UTF-8
+ to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
+ DFA nodes where needed. */
+
+static void
+optimize_utf8 (re_dfa_t *dfa)
+{
+ Idx node;
+ int i;
+ bool mb_chars = false;
+ bool has_period = false;
+
+ for (node = 0; node < dfa->nodes_len; ++node)
+ switch (dfa->nodes[node].type)
+ {
+ case CHARACTER:
+ if (dfa->nodes[node].opr.c >= ASCII_CHARS)
+ mb_chars = true;
+ break;
+ case ANCHOR:
+ switch (dfa->nodes[node].opr.ctx_type)
+ {
+ case LINE_FIRST:
+ case LINE_LAST:
+ case BUF_FIRST:
+ case BUF_LAST:
+ break;
+ default:
+ /* Word anchors etc. cannot be handled. It's okay to test
+ opr.ctx_type since constraints (for all DFA nodes) are
+ created by ORing one or more opr.ctx_type values. */
+ return;
+ }
+ break;
+ case OP_PERIOD:
+ has_period = true;
+ break;
+ case OP_BACK_REF:
+ case OP_ALT:
+ case END_OF_RE:
+ case OP_DUP_ASTERISK:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ break;
+ case COMPLEX_BRACKET:
+ return;
+ case SIMPLE_BRACKET:
+ /* Just double check. */
+ {
+ int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS);
+ for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
+ {
+ if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0)
+ return;
+ rshift = 0;
+ }
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ if (mb_chars || has_period)
+ for (node = 0; node < dfa->nodes_len; ++node)
+ {
+ if (dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].opr.c >= ASCII_CHARS)
+ dfa->nodes[node].mb_partial = 0;
+ else if (dfa->nodes[node].type == OP_PERIOD)
+ dfa->nodes[node].type = OP_UTF8_PERIOD;
+ }
+
+ /* The search can be in single byte locale. */
+ dfa->mb_cur_max = 1;
+ dfa->is_utf8 = 0;
+ dfa->has_mb_node = dfa->nbackref > 0 || has_period;
+}
+#endif
+
+/* Analyze the structure tree, and calculate "first", "next", "edest",
+ "eclosure", and "inveclosure". */
+
+static reg_errcode_t
+analyze (regex_t *preg)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ reg_errcode_t ret;
+
+ /* Allocate arrays. */
+ dfa->nexts = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
+ dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+ if (BE (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL
+ || dfa->eclosures == NULL, 0))
+ return REG_ESPACE;
+
+ dfa->subexp_map = re_malloc (Idx, preg->re_nsub);
+ if (dfa->subexp_map != NULL)
+ {
+ Idx i;
+ for (i = 0; i < preg->re_nsub; i++)
+ dfa->subexp_map[i] = i;
+ preorder (dfa->str_tree, optimize_subexps, dfa);
+ for (i = 0; i < preg->re_nsub; i++)
+ if (dfa->subexp_map[i] != i)
+ break;
+ if (i == preg->re_nsub)
+ {
+ free (dfa->subexp_map);
+ dfa->subexp_map = NULL;
+ }
+ }
+
+ ret = postorder (dfa->str_tree, lower_subexps, preg);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = postorder (dfa->str_tree, calc_first, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ preorder (dfa->str_tree, calc_next, dfa);
+ ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ ret = calc_eclosure (dfa);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ /* We only need this during the prune_impossible_nodes pass in regexec.c;
+ skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */
+ if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
+ if (BE (dfa->inveclosures == NULL, 0))
+ return REG_ESPACE;
+ ret = calc_inveclosure (dfa);
+ }
+
+ return ret;
+}
+
+/* Our parse trees are very unbalanced, so we cannot use a stack to
+ implement parse tree visits. Instead, we use parent pointers and
+ some hairy code in these two functions. */
+static reg_errcode_t
+postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node, *prev;
+
+ for (node = root; ; )
+ {
+ /* Descend down the tree, preferably to the left (or to the right
+ if that's the only child). */
+ while (node->left || node->right)
+ if (node->left)
+ node = node->left;
+ else
+ node = node->right;
+
+ do
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ if (node->parent == NULL)
+ return REG_NOERROR;
+ prev = node;
+ node = node->parent;
+ }
+ /* Go up while we have a node that is reached from the right. */
+ while (node->right == prev || node->right == NULL);
+ node = node->right;
+ }
+}
+
+static reg_errcode_t
+preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node;
+
+ for (node = root; ; )
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ node = node->left;
+ else
+ {
+ bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ if (!node)
+ return REG_NOERROR;
+ }
+ node = node->right;
+ }
+ }
+}
+
+/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
+ re_search_internal to map the inner one's opr.idx to this one's. Adjust
+ backreferences as well. Requires a preorder visit. */
+static reg_errcode_t
+optimize_subexps (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+
+ if (node->token.type == OP_BACK_REF && dfa->subexp_map)
+ {
+ int idx = node->token.opr.idx;
+ node->token.opr.idx = dfa->subexp_map[idx];
+ dfa->used_bkref_map |= 1 << node->token.opr.idx;
+ }
+
+ else if (node->token.type == SUBEXP
+ && node->left && node->left->token.type == SUBEXP)
+ {
+ Idx other_idx = node->left->token.opr.idx;
+
+ node->left = node->left->left;
+ if (node->left)
+ node->left->parent = node;
+
+ dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
+ if (other_idx < BITSET_WORD_BITS)
+ dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
+ }
+
+ return REG_NOERROR;
+}
+
+/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
+ of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */
+static reg_errcode_t
+lower_subexps (void *extra, bin_tree_t *node)
+{
+ regex_t *preg = (regex_t *) extra;
+ reg_errcode_t err = REG_NOERROR;
+
+ if (node->left && node->left->token.type == SUBEXP)
+ {
+ node->left = lower_subexp (&err, preg, node->left);
+ if (node->left)
+ node->left->parent = node;
+ }
+ if (node->right && node->right->token.type == SUBEXP)
+ {
+ node->right = lower_subexp (&err, preg, node->right);
+ if (node->right)
+ node->right->parent = node;
+ }
+
+ return err;
+}
+
+static bin_tree_t *
+lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *body = node->left;
+ bin_tree_t *op, *cls, *tree1, *tree;
+
+ if (preg->no_sub
+ /* We do not optimize empty subexpressions, because otherwise we may
+ have bad CONCAT nodes with NULL children. This is obviously not
+ very common, so we do not lose much. An example that triggers
+ this case is the sed "script" /\(\)/x. */
+ && node->left != NULL
+ && (node->token.opr.idx >= BITSET_WORD_BITS
+ || !(dfa->used_bkref_map
+ & ((bitset_word_t) 1 << node->token.opr.idx))))
+ return node->left;
+
+ /* Convert the SUBEXP node to the concatenation of an
+ OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */
+ op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
+ cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
+ tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
+ tree = create_tree (dfa, op, tree1, CONCAT);
+ if (BE (tree == NULL || tree1 == NULL || op == NULL || cls == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
+ op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
+ return tree;
+}
+
+/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
+ nodes. Requires a postorder visit. */
+static reg_errcode_t
+calc_first (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ if (node->token.type == CONCAT)
+ {
+ node->first = node->left->first;
+ node->node_idx = node->left->node_idx;
+ }
+ else
+ {
+ node->first = node;
+ node->node_idx = re_dfa_add_node (dfa, node->token);
+ if (BE (node->node_idx == REG_MISSING, 0))
+ return REG_ESPACE;
+ if (node->token.type == ANCHOR)
+ dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 2: compute NEXT on the tree. Preorder visit. */
+static reg_errcode_t
+calc_next (void *extra, bin_tree_t *node)
+{
+ switch (node->token.type)
+ {
+ case OP_DUP_ASTERISK:
+ node->left->next = node;
+ break;
+ case CONCAT:
+ node->left->next = node->right->first;
+ node->right->next = node->next;
+ break;
+ default:
+ if (node->left)
+ node->left->next = node->next;
+ if (node->right)
+ node->right->next = node->next;
+ break;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 3: link all DFA nodes to their NEXT node (any order will do). */
+static reg_errcode_t
+link_nfa_nodes (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ Idx idx = node->node_idx;
+ reg_errcode_t err = REG_NOERROR;
+
+ switch (node->token.type)
+ {
+ case CONCAT:
+ break;
+
+ case END_OF_RE:
+ assert (node->next == NULL);
+ break;
+
+ case OP_DUP_ASTERISK:
+ case OP_ALT:
+ {
+ Idx left, right;
+ dfa->has_plural_match = 1;
+ if (node->left != NULL)
+ left = node->left->first->node_idx;
+ else
+ left = node->next->node_idx;
+ if (node->right != NULL)
+ right = node->right->first->node_idx;
+ else
+ right = node->next->node_idx;
+ assert (REG_VALID_INDEX (left));
+ assert (REG_VALID_INDEX (right));
+ err = re_node_set_init_2 (dfa->edests + idx, left, right);
+ }
+ break;
+
+ case ANCHOR:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
+ break;
+
+ case OP_BACK_REF:
+ dfa->nexts[idx] = node->next->node_idx;
+ if (node->token.type == OP_BACK_REF)
+ err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
+ break;
+
+ default:
+ assert (!IS_EPSILON_NODE (node->token.type));
+ dfa->nexts[idx] = node->next->node_idx;
+ break;
+ }
+
+ return err;
+}
+
+/* Duplicate the epsilon closure of the node ROOT_NODE.
+ Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
+ to their own constraint. */
+
+static reg_errcode_t
+internal_function
+duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node,
+ Idx root_node, unsigned int init_constraint)
+{
+ Idx org_node, clone_node;
+ bool ok;
+ unsigned int constraint = init_constraint;
+ for (org_node = top_org_node, clone_node = top_clone_node;;)
+ {
+ Idx org_dest, clone_dest;
+ if (dfa->nodes[org_node].type == OP_BACK_REF)
+ {
+ /* If the back reference epsilon-transit, its destination must
+ also have the constraint. Then duplicate the epsilon closure
+ of the destination of the back reference, and store it in
+ edests of the back reference. */
+ org_dest = dfa->nexts[org_node];
+ re_node_set_empty (dfa->edests + clone_node);
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ else if (dfa->edests[org_node].nelem == 0)
+ {
+ /* In case of the node can't epsilon-transit, don't duplicate the
+ destination and store the original destination as the
+ destination of the node. */
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ break;
+ }
+ else if (dfa->edests[org_node].nelem == 1)
+ {
+ /* In case of the node can epsilon-transit, and it has only one
+ destination. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* If the node is root_node itself, it means the epsilon closure
+ has a loop. Then tie it to the destination of the root_node. */
+ if (org_node == root_node && clone_node != org_node)
+ {
+ ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ break;
+ }
+ /* In case the node has another constraint, append it. */
+ constraint |= dfa->nodes[org_node].constraint;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ else /* dfa->edests[org_node].nelem == 2 */
+ {
+ /* In case of the node can epsilon-transit, and it has two
+ destinations. In the bin_tree_t and DFA, that's '|' and '*'. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* Search for a duplicated node which satisfies the constraint. */
+ clone_dest = search_duplicated_node (dfa, org_dest, constraint);
+ if (clone_dest == REG_MISSING)
+ {
+ /* There is no such duplicated node, create a new one. */
+ reg_errcode_t err;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ err = duplicate_node_closure (dfa, org_dest, clone_dest,
+ root_node, constraint);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ {
+ /* There is a duplicated node which satisfies the constraint,
+ use it to avoid infinite loop. */
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ org_dest = dfa->edests[org_node].elems[1];
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (BE (clone_dest == REG_MISSING, 0))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ org_node = org_dest;
+ clone_node = clone_dest;
+ }
+ return REG_NOERROR;
+}
+
+/* Search for a node which is duplicated from the node ORG_NODE, and
+ satisfies the constraint CONSTRAINT. */
+
+static Idx
+search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint)
+{
+ Idx idx;
+ for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
+ {
+ if (org_node == dfa->org_indices[idx]
+ && constraint == dfa->nodes[idx].constraint)
+ return idx; /* Found. */
+ }
+ return REG_MISSING; /* Not found. */
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+ Return the index of the new node, or REG_MISSING if insufficient storage is
+ available. */
+
+static Idx
+duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint)
+{
+ Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
+ if (BE (dup_idx != REG_MISSING, 1))
+ {
+ dfa->nodes[dup_idx].constraint = constraint;
+ dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
+ dfa->nodes[dup_idx].duplicated = 1;
+
+ /* Store the index of the original node. */
+ dfa->org_indices[dup_idx] = org_idx;
+ }
+ return dup_idx;
+}
+
+static reg_errcode_t
+calc_inveclosure (re_dfa_t *dfa)
+{
+ Idx src, idx;
+ bool ok;
+ for (idx = 0; idx < dfa->nodes_len; ++idx)
+ re_node_set_init_empty (dfa->inveclosures + idx);
+
+ for (src = 0; src < dfa->nodes_len; ++src)
+ {
+ Idx *elems = dfa->eclosures[src].elems;
+ for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
+ {
+ ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Calculate "eclosure" for all the node in DFA. */
+
+static reg_errcode_t
+calc_eclosure (re_dfa_t *dfa)
+{
+ Idx node_idx;
+ bool incomplete;
+#ifdef DEBUG
+ assert (dfa->nodes_len > 0);
+#endif
+ incomplete = false;
+ /* For each nodes, calculate epsilon closure. */
+ for (node_idx = 0; ; ++node_idx)
+ {
+ reg_errcode_t err;
+ re_node_set eclosure_elem;
+ if (node_idx == dfa->nodes_len)
+ {
+ if (!incomplete)
+ break;
+ incomplete = false;
+ node_idx = 0;
+ }
+
+#ifdef DEBUG
+ assert (dfa->eclosures[node_idx].nelem != REG_MISSING);
+#endif
+
+ /* If we have already calculated, skip it. */
+ if (dfa->eclosures[node_idx].nelem != 0)
+ continue;
+ /* Calculate epsilon closure of `node_idx'. */
+ err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (dfa->eclosures[node_idx].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Calculate epsilon closure of NODE. */
+
+static reg_errcode_t
+calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
+{
+ reg_errcode_t err;
+ Idx i;
+ re_node_set eclosure;
+ bool ok;
+ bool incomplete = false;
+ err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* This indicates that we are calculating this node now.
+ We reference this value to avoid infinite loop. */
+ dfa->eclosures[node].nelem = REG_MISSING;
+
+ /* If the current node has constraints, duplicate all nodes
+ since they must inherit the constraints. */
+ if (dfa->nodes[node].constraint
+ && dfa->edests[node].nelem
+ && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
+ {
+ err = duplicate_node_closure (dfa, node, node, node,
+ dfa->nodes[node].constraint);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ /* Expand each epsilon destination nodes. */
+ if (IS_EPSILON_NODE(dfa->nodes[node].type))
+ for (i = 0; i < dfa->edests[node].nelem; ++i)
+ {
+ re_node_set eclosure_elem;
+ Idx edest = dfa->edests[node].elems[i];
+ /* If calculating the epsilon closure of `edest' is in progress,
+ return intermediate result. */
+ if (dfa->eclosures[edest].nelem == REG_MISSING)
+ {
+ incomplete = true;
+ continue;
+ }
+ /* If we haven't calculated the epsilon closure of `edest' yet,
+ calculate now. Otherwise use calculated epsilon closure. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ eclosure_elem = dfa->eclosures[edest];
+ /* Merge the epsilon closure of `edest'. */
+ err = re_node_set_merge (&eclosure, &eclosure_elem);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ /* If the epsilon closure of `edest' is incomplete,
+ the epsilon closure of this node is also incomplete. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+
+ /* An epsilon closure includes itself. */
+ ok = re_node_set_insert (&eclosure, node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ if (incomplete && !root)
+ dfa->eclosures[node].nelem = 0;
+ else
+ dfa->eclosures[node] = eclosure;
+ *new_set = eclosure;
+ return REG_NOERROR;
+}
+
+/* Functions for token which are used in the parser. */
+
+/* Fetch a token from INPUT.
+ We must not use this function inside bracket expressions. */
+
+static void
+internal_function
+fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
+{
+ re_string_skip_bytes (input, peek_token (result, input, syntax));
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function inside bracket expressions. */
+
+static int
+internal_function
+peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+ token->word_char = 0;
+#ifdef RE_ENABLE_I18N
+ token->mb_partial = 0;
+ if (input->mb_cur_max > 1 &&
+ !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ token->mb_partial = 1;
+ return 1;
+ }
+#endif
+ if (c == '\\')
+ {
+ unsigned char c2;
+ if (re_string_cur_idx (input) + 1 >= re_string_length (input))
+ {
+ token->type = BACK_SLASH;
+ return 1;
+ }
+
+ c2 = re_string_peek_byte_case (input, 1);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input,
+ re_string_cur_idx (input) + 1);
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (c2) != 0;
+
+ switch (c2)
+ {
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ if (!(syntax & RE_NO_BK_REFS))
+ {
+ token->type = OP_BACK_REF;
+ token->opr.idx = c2 - '1';
+ }
+ break;
+ case '<':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_FIRST;
+ }
+ break;
+ case '>':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_LAST;
+ }
+ break;
+ case 'b':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_DELIM;
+ }
+ break;
+ case 'B':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = NOT_WORD_DELIM;
+ }
+ break;
+ case 'w':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_WORD;
+ break;
+ case 'W':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTWORD;
+ break;
+ case 's':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_SPACE;
+ break;
+ case 'S':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTSPACE;
+ break;
+ case '`':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_FIRST;
+ }
+ break;
+ case '\'':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_LAST;
+ }
+ break;
+ case '(':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ default:
+ break;
+ }
+ return 2;
+ }
+
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (token->opr.c);
+
+ switch (c)
+ {
+ case '\n':
+ if (syntax & RE_NEWLINE_ALT)
+ token->type = OP_ALT;
+ break;
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '*':
+ token->type = OP_DUP_ASTERISK;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ case '(':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '[':
+ token->type = OP_OPEN_BRACKET;
+ break;
+ case '.':
+ token->type = OP_PERIOD;
+ break;
+ case '^':
+ if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE)) &&
+ re_string_cur_idx (input) != 0)
+ {
+ char prev = re_string_peek_byte (input, -1);
+ if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_FIRST;
+ break;
+ case '$':
+ if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) &&
+ re_string_cur_idx (input) + 1 != re_string_length (input))
+ {
+ re_token_t next;
+ re_string_skip_bytes (input, 1);
+ peek_token (&next, input, syntax);
+ re_string_skip_bytes (input, -1);
+ if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_LAST;
+ break;
+ default:
+ break;
+ }
+ return 1;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function out of bracket expressions. */
+
+static int
+internal_function
+peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1 &&
+ !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ return 1;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
+ && re_string_cur_idx (input) + 1 < re_string_length (input))
+ {
+ /* In this case, '\' escape a character. */
+ unsigned char c2;
+ re_string_skip_bytes (input, 1);
+ c2 = re_string_peek_byte (input, 0);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+ return 1;
+ }
+ if (c == '[') /* '[' is a special char in a bracket exps. */
+ {
+ unsigned char c2;
+ int token_len;
+ if (re_string_cur_idx (input) + 1 < re_string_length (input))
+ c2 = re_string_peek_byte (input, 1);
+ else
+ c2 = 0;
+ token->opr.c = c2;
+ token_len = 2;
+ switch (c2)
+ {
+ case '.':
+ token->type = OP_OPEN_COLL_ELEM;
+ break;
+ case '=':
+ token->type = OP_OPEN_EQUIV_CLASS;
+ break;
+ case ':':
+ if (syntax & RE_CHAR_CLASSES)
+ {
+ token->type = OP_OPEN_CHAR_CLASS;
+ break;
+ }
+ /* else fall through. */
+ default:
+ token->type = CHARACTER;
+ token->opr.c = c;
+ token_len = 1;
+ break;
+ }
+ return token_len;
+ }
+ switch (c)
+ {
+ case '-':
+ token->type = OP_CHARSET_RANGE;
+ break;
+ case ']':
+ token->type = OP_CLOSE_BRACKET;
+ break;
+ case '^':
+ token->type = OP_NON_MATCH_LIST;
+ break;
+ default:
+ token->type = CHARACTER;
+ }
+ return 1;
+}
+
+/* Functions for parser. */
+
+/* Entry point of the parser.
+ Parse the regular expression REGEXP and return the structure tree.
+ If an error is occured, ERR is set by error code, and return NULL.
+ This function build the following tree, from regular expression <reg_exp>:
+ CAT
+ / \
+ / \
+ <reg_exp> EOR
+
+ CAT means concatenation.
+ EOR means end of regular expression. */
+
+static bin_tree_t *
+parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
+ reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree, *eor, *root;
+ re_token_t current_token;
+ dfa->syntax = syntax;
+ fetch_token (&current_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ eor = create_tree (dfa, NULL, NULL, END_OF_RE);
+ if (tree != NULL)
+ root = create_tree (dfa, tree, eor, CONCAT);
+ else
+ root = eor;
+ if (BE (eor == NULL || root == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ return root;
+}
+
+/* This function build the following tree, from regular expression
+ <branch1>|<branch2>:
+ ALT
+ / \
+ / \
+ <branch1> <branch2>
+
+ ALT means alternative, which represents the operator `|'. */
+
+static bin_tree_t *
+parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree, *branch = NULL;
+ tree = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+
+ while (token->type == OP_ALT)
+ {
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ if (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ branch = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && branch == NULL, 0))
+ return NULL;
+ }
+ else
+ branch = NULL;
+ tree = create_tree (dfa, tree, branch, OP_ALT);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ <exp1><exp2>:
+ CAT
+ / \
+ / \
+ <exp1> <exp2>
+
+ CAT means concatenation. */
+
+static bin_tree_t *
+parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ bin_tree_t *tree, *expr;
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ tree = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+
+ while (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ expr = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (BE (*err != REG_NOERROR && expr == NULL, 0))
+ {
+ return NULL;
+ }
+ if (tree != NULL && expr != NULL)
+ {
+ tree = create_tree (dfa, tree, expr, CONCAT);
+ if (tree == NULL)
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else if (tree == NULL)
+ tree = expr;
+ /* Otherwise expr == NULL, we don't need to create new tree. */
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression a*:
+ *
+ |
+ a
+*/
+
+static bin_tree_t *
+parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree;
+ switch (token->type)
+ {
+ case CHARACTER:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (!re_string_eoi (regexp)
+ && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
+ {
+ bin_tree_t *mbc_remain;
+ fetch_token (token, regexp, syntax);
+ mbc_remain = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree, mbc_remain, CONCAT);
+ if (BE (mbc_remain == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ }
+#endif
+ break;
+ case OP_OPEN_SUBEXP:
+ tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_OPEN_BRACKET:
+ tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_BACK_REF:
+ if (!BE (dfa->completed_bkref_map & (1 << token->opr.idx), 1))
+ {
+ *err = REG_ESUBREG;
+ return NULL;
+ }
+ dfa->used_bkref_map |= 1 << token->opr.idx;
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ ++dfa->nbackref;
+ dfa->has_mb_node = 1;
+ break;
+ case OP_OPEN_DUP_NUM:
+ if (syntax & RE_CONTEXT_INVALID_DUP)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ /* FALLTHROUGH */
+ case OP_DUP_ASTERISK:
+ case OP_DUP_PLUS:
+ case OP_DUP_QUESTION:
+ if (syntax & RE_CONTEXT_INVALID_OPS)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ else if (syntax & RE_CONTEXT_INDEP_OPS)
+ {
+ fetch_token (token, regexp, syntax);
+ return parse_expression (regexp, preg, token, syntax, nest, err);
+ }
+ /* else fall through */
+ case OP_CLOSE_SUBEXP:
+ if ((token->type == OP_CLOSE_SUBEXP) &&
+ !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+ {
+ *err = REG_ERPAREN;
+ return NULL;
+ }
+ /* else fall through */
+ case OP_CLOSE_DUP_NUM:
+ /* We treat it as a normal character. */
+
+ /* Then we can these characters as normal characters. */
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be initialized already
+ by peek_token. */
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ break;
+ case ANCHOR:
+ if ((token->opr.ctx_type
+ & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
+ && dfa->word_ops_used == 0)
+ init_word_char (dfa);
+ if (token->opr.ctx_type == WORD_DELIM
+ || token->opr.ctx_type == NOT_WORD_DELIM)
+ {
+ bin_tree_t *tree_first, *tree_last;
+ if (token->opr.ctx_type == WORD_DELIM)
+ {
+ token->opr.ctx_type = WORD_FIRST;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = WORD_LAST;
+ }
+ else
+ {
+ token->opr.ctx_type = INSIDE_WORD;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = INSIDE_NOTWORD;
+ }
+ tree_last = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
+ if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else
+ {
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ /* We must return here, since ANCHORs can't be followed
+ by repetition operators.
+ eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
+ it must not be "<ANCHOR(^)><REPEAT(*)>". */
+ fetch_token (token, regexp, syntax);
+ return tree;
+ case OP_PERIOD:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ if (dfa->mb_cur_max > 1)
+ dfa->has_mb_node = 1;
+ break;
+ case OP_WORD:
+ case OP_NOTWORD:
+ tree = build_charclass_op (dfa, regexp->trans,
+ (const unsigned char *) "alnum",
+ (const unsigned char *) "_",
+ token->type == OP_NOTWORD, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_SPACE:
+ case OP_NOTSPACE:
+ tree = build_charclass_op (dfa, regexp->trans,
+ (const unsigned char *) "space",
+ (const unsigned char *) "",
+ token->type == OP_NOTSPACE, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ break;
+ case OP_ALT:
+ case END_OF_RE:
+ return NULL;
+ case BACK_SLASH:
+ *err = REG_EESCAPE;
+ return NULL;
+ default:
+ /* Must not happen? */
+#ifdef DEBUG
+ assert (0);
+#endif
+ return NULL;
+ }
+ fetch_token (token, regexp, syntax);
+
+ while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
+ || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
+ {
+ tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
+ if (BE (*err != REG_NOERROR && tree == NULL, 0))
+ return NULL;
+ /* In BRE consecutive duplications are not allowed. */
+ if ((syntax & RE_CONTEXT_INVALID_DUP)
+ && (token->type == OP_DUP_ASTERISK
+ || token->type == OP_OPEN_DUP_NUM))
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ }
+
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ (<reg_exp>):
+ SUBEXP
+ |
+ <reg_exp>
+*/
+
+static bin_tree_t *
+parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+ bin_tree_t *tree;
+ size_t cur_nsub;
+ cur_nsub = preg->re_nsub++;
+
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+
+ /* The subexpression may be a null string. */
+ if (token->type == OP_CLOSE_SUBEXP)
+ tree = NULL;
+ else
+ {
+ tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
+ if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
+ *err = REG_EPAREN;
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+
+ if (cur_nsub <= '9' - '1')
+ dfa->completed_bkref_map |= 1 << cur_nsub;
+
+ tree = create_tree (dfa, tree, NULL, SUBEXP);
+ if (BE (tree == NULL, 0))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ tree->token.opr.idx = cur_nsub;
+ return tree;
+}
+
+/* This function parse repetition operators like "*", "+", "{1,3}" etc. */
+
+static bin_tree_t *
+parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
+{
+ bin_tree_t *tree = NULL, *old_tree = NULL;
+ Idx i, start, end, start_idx = re_string_cur_idx (regexp);
+ re_token_t start_token = *token;
+
+ if (token->type == OP_OPEN_DUP_NUM)
+ {
+ end = 0;
+ start = fetch_number (regexp, token, syntax);
+ if (start == REG_MISSING)
+ {
+ if (token->type == CHARACTER && token->opr.c == ',')
+ start = 0; /* We treat "{,m}" as "{0,m}". */
+ else
+ {
+ *err = REG_BADBR; /* <re>{} is invalid. */
+ return NULL;
+ }
+ }
+ if (BE (start != REG_ERROR, 1))
+ {
+ /* We treat "{n}" as "{n,n}". */
+ end = ((token->type == OP_CLOSE_DUP_NUM) ? start
+ : ((token->type == CHARACTER && token->opr.c == ',')
+ ? fetch_number (regexp, token, syntax) : REG_ERROR));
+ }
+ if (BE (start == REG_ERROR || end == REG_ERROR, 0))
+ {
+ /* Invalid sequence. */
+ if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
+ {
+ if (token->type == END_OF_RE)
+ *err = REG_EBRACE;
+ else
+ *err = REG_BADBR;
+
+ return NULL;
+ }
+
+ /* If the syntax bit is set, rollback. */
+ re_string_set_index (regexp, start_idx);
+ *token = start_token;
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be already initialized by
+ peek_token. */
+ return elem;
+ }
+
+ if (BE ((end != REG_MISSING && start > end)
+ || token->type != OP_CLOSE_DUP_NUM, 0))
+ {
+ /* First number greater than second. */
+ *err = REG_BADBR;
+ return NULL;
+ }
+ }
+ else
+ {
+ start = (token->type == OP_DUP_PLUS) ? 1 : 0;
+ end = (token->type == OP_DUP_QUESTION) ? 1 : REG_MISSING;
+ }
+
+ fetch_token (token, regexp, syntax);
+
+ if (BE (elem == NULL, 0))
+ return NULL;
+ if (BE (start == 0 && end == 0, 0))
+ {
+ postorder (elem, free_tree, NULL);
+ return NULL;
+ }
+
+ /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}". */
+ if (BE (start > 0, 0))
+ {
+ tree = elem;
+ for (i = 2; i <= start; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+ }
+
+ if (start == end)
+ return tree;
+
+ /* Duplicate ELEM before it is marked optional. */
+ elem = duplicate_tree (elem, dfa);
+ old_tree = tree;
+ }
+ else
+ old_tree = NULL;
+
+ if (elem->token.type == SUBEXP)
+ postorder (elem, mark_opt_subexp, (void *) (long) elem->token.opr.idx);
+
+ tree = create_tree (dfa, elem, NULL,
+ (end == REG_MISSING ? OP_DUP_ASTERISK : OP_ALT));
+ if (BE (tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+/* From gnulib's "intprops.h":
+ True if the arithmetic type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+ /* This loop is actually executed only when end != REG_MISSING,
+ to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have
+ already created the start+1-th copy. */
+ if (TYPE_SIGNED (Idx) || end != REG_MISSING)
+ for (i = start + 2; i <= end; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (BE (elem == NULL || tree == NULL, 0))
+ goto parse_dup_op_espace;
+
+ tree = create_tree (dfa, tree, NULL, OP_ALT);
+ if (BE (tree == NULL, 0))
+ goto parse_dup_op_espace;
+ }
+
+ if (old_tree)
+ tree = create_tree (dfa, old_tree, tree, CONCAT);
+
+ return tree;
+
+ parse_dup_op_espace:
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* Size of the names for collating symbol/equivalence_class/character_class.
+ I'm not sure, but maybe enough. */
+#define BRACKET_NAME_BUF_SIZE 32
+
+#ifndef _LIBC
+ /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument sinse we may
+ update it. */
+
+static reg_errcode_t
+internal_function
+# ifdef RE_ENABLE_I18N
+build_range_exp (const reg_syntax_t syntax,
+ bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *range_alloc,
+ const bracket_elem_t *start_elem,
+ const bracket_elem_t *end_elem)
+# else /* not RE_ENABLE_I18N */
+build_range_exp (const reg_syntax_t syntax,
+ bitset_t sbcset,
+ const bracket_elem_t *start_elem,
+ const bracket_elem_t *end_elem)
+# endif /* not RE_ENABLE_I18N */
+{
+ unsigned int start_ch, end_ch;
+ /* Equivalence Classes and Character Classes can't be a range start/end. */
+ if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ /* We can handle no multi character collating elements without libc
+ support. */
+ if (BE ((start_elem->type == COLL_SYM
+ && strlen ((char *) start_elem->opr.name) > 1)
+ || (end_elem->type == COLL_SYM
+ && strlen ((char *) end_elem->opr.name) > 1), 0))
+ return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+ {
+ wchar_t wc;
+ wint_t start_wc;
+ wint_t end_wc;
+ wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+
+ start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
+ ? __btowc (start_ch) : start_elem->opr.wch);
+ end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+ ? __btowc (end_ch) : end_elem->opr.wch);
+ if (start_wc == WEOF || end_wc == WEOF)
+ return REG_ECOLLATE;
+ cmp_buf[0] = start_wc;
+ cmp_buf[4] = end_wc;
+
+ if (BE ((syntax & RE_NO_EMPTY_RANGES)
+ && wcscoll (cmp_buf, cmp_buf + 4) > 0, 0))
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, for !_LIBC we have no collation elements: if the
+ character set is single byte, the single byte character set
+ that we build below suffices. parse_bracket_exp passes
+ no MBCSET if dfa->mb_cur_max == 1. */
+ if (mbcset)
+ {
+ /* Check the space of the arrays. */
+ if (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* There is not enough space, need realloc. */
+ wchar_t *new_array_start, *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ /* Use realloc since mbcset->range_starts and mbcset->range_ends
+ are NULL if *range_alloc == 0. */
+ new_array_start = re_realloc (mbcset->range_starts, wchar_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, wchar_t,
+ new_nranges);
+
+ if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ return REG_ESPACE;
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_wc;
+ mbcset->range_ends[mbcset->nranges++] = end_wc;
+ }
+
+ /* Build the table for single byte characters. */
+ for (wc = 0; wc < SBC_MAX; ++wc)
+ {
+ cmp_buf[2] = wc;
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ bitset_set (sbcset, wc);
+ }
+ }
+# else /* not RE_ENABLE_I18N */
+ {
+ unsigned int ch;
+ start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ if (start_ch > end_ch)
+ return REG_ERANGE;
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ if (start_ch <= ch && ch <= end_ch)
+ bitset_set (sbcset, ch);
+ }
+# endif /* not RE_ENABLE_I18N */
+ return REG_NOERROR;
+}
+#endif /* not _LIBC */
+
+#ifndef _LIBC
+/* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument since we may update it. */
+
+static reg_errcode_t
+internal_function
+build_collating_symbol (bitset_t sbcset,
+# ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset, Idx *coll_sym_alloc,
+# endif
+ const unsigned char *name)
+{
+ size_t name_len = strlen ((const char *) name);
+ if (BE (name_len != 1, 0))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+}
+#endif /* not _LIBC */
+
+/* This function parse bracket expression like "[abc]", "[a-c]",
+ "[[.a-a.]]" etc. */
+
+static bin_tree_t *
+parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err)
+{
+#ifdef _LIBC
+ const unsigned char *collseqmb;
+ const char *collseqwc;
+ uint32_t nrules;
+ int32_t table_size;
+ const int32_t *symb_table;
+ const unsigned char *extra;
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Seek the collating symbol entry correspondings to NAME.
+ Return the index of the symbol in the SYMB_TABLE. */
+
+ auto inline int32_t
+ __attribute ((always_inline))
+ seek_collating_symbol_entry (name, name_len)
+ const unsigned char *name;
+ size_t name_len;
+ {
+ int32_t hash = elem_hash ((const char *) name, name_len);
+ int32_t elem = hash % table_size;
+ if (symb_table[2 * elem] != 0)
+ {
+ int32_t second = hash % (table_size - 2) + 1;
+
+ do
+ {
+ /* First compare the hashing value. */
+ if (symb_table[2 * elem] == hash
+ /* Compare the length of the name. */
+ && name_len == extra[symb_table[2 * elem + 1]]
+ /* Compare the name. */
+ && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
+ name_len) == 0)
+ {
+ /* Yep, this is the entry. */
+ break;
+ }
+
+ /* Next entry. */
+ elem += second;
+ }
+ while (symb_table[2 * elem] != 0);
+ }
+ return elem;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Look up the collation sequence value of BR_ELEM.
+ Return the value if succeeded, UINT_MAX otherwise. */
+
+ auto inline unsigned int
+ __attribute ((always_inline))
+ lookup_collation_sequence_value (br_elem)
+ bracket_elem_t *br_elem;
+ {
+ if (br_elem->type == SB_CHAR)
+ {
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ return collseqmb[br_elem->opr.ch];
+ else
+ {
+ wint_t wc = __btowc (br_elem->opr.ch);
+ return __collseq_table_lookup (collseqwc, wc);
+ }
+ }
+ else if (br_elem->type == MB_CHAR)
+ {
+ if (nrules != 0)
+ return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
+ }
+ else if (br_elem->type == COLL_SYM)
+ {
+ size_t sym_name_len = strlen ((char *) br_elem->opr.name);
+ if (nrules != 0)
+ {
+ int32_t elem, idx;
+ elem = seek_collating_symbol_entry (br_elem->opr.name,
+ sym_name_len);
+ if (symb_table[2 * elem] != 0)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ /* Skip the byte sequence of the collating element. */
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the multibyte collation sequence value. */
+ idx += sizeof (unsigned int);
+ /* Skip the wide char sequence of the collating element. */
+ idx += sizeof (unsigned int) *
+ (1 + *(unsigned int *) (extra + idx));
+ /* Return the collation sequence value. */
+ return *(unsigned int *) (extra + idx);
+ }
+ else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
+ {
+ /* No valid character. Match it as a single byte
+ character. */
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ }
+ else if (sym_name_len == 1)
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ return UINT_MAX;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument sinse we may
+ update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+ re_charset_t *mbcset;
+ Idx *range_alloc;
+ bitset_t sbcset;
+ bracket_elem_t *start_elem, *end_elem;
+ {
+ unsigned int ch;
+ uint32_t start_collseq;
+ uint32_t end_collseq;
+
+ /* Equivalence Classes and Character Classes can't be a range
+ start/end. */
+ if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+ 0))
+ return REG_ERANGE;
+
+ start_collseq = lookup_collation_sequence_value (start_elem);
+ end_collseq = lookup_collation_sequence_value (end_elem);
+ /* Check start/end collation sequence values. */
+ if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0))
+ return REG_ECOLLATE;
+ if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0))
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, if we have no collation elements, and the character set
+ is single byte, the single byte character set that we
+ build below suffices. */
+ if (nrules > 0 || dfa->mb_cur_max > 1)
+ {
+ /* Check the space of the arrays. */
+ if (BE (*range_alloc == mbcset->nranges, 0))
+ {
+ /* There is not enough space, need realloc. */
+ uint32_t *new_array_start;
+ uint32_t *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ new_array_start = re_realloc (mbcset->range_starts, uint32_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, uint32_t,
+ new_nranges);
+
+ if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+ return REG_ESPACE;
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_collseq;
+ mbcset->range_ends[mbcset->nranges++] = end_collseq;
+ }
+
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ch++)
+ {
+ uint32_t ch_collseq;
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ ch_collseq = collseqmb[ch];
+ else
+ ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
+ if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
+ bitset_set (sbcset, ch);
+ }
+ return REG_NOERROR;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environement.
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument sinse we may update it. */
+
+ auto inline reg_errcode_t
+ __attribute ((always_inline))
+ build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
+ re_charset_t *mbcset;
+ Idx *coll_sym_alloc;
+ bitset_t sbcset;
+ const unsigned char *name;
+ {
+ int32_t elem, idx;
+ size_t name_len = strlen ((const char *) name);
+ if (nrules != 0)
+ {
+ elem = seek_collating_symbol_entry (name, name_len);
+ if (symb_table[2 * elem] != 0)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ }
+ else if (symb_table[2 * elem] == 0 && name_len == 1)
+ {
+ /* No valid character, treat it as a normal
+ character. */
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ else
+ return REG_ECOLLATE;
+
+ /* Got valid collation sequence, add it as a new entry. */
+ /* Check the space of the arrays. */
+ if (BE (*coll_sym_alloc == mbcset->ncoll_syms, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->ncoll_syms is 0. */
+ Idx new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
+ /* Use realloc since mbcset->coll_syms is NULL
+ if *alloc == 0. */
+ int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
+ new_coll_sym_alloc);
+ if (BE (new_coll_syms == NULL, 0))
+ return REG_ESPACE;
+ mbcset->coll_syms = new_coll_syms;
+ *coll_sym_alloc = new_coll_sym_alloc;
+ }
+ mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
+ return REG_NOERROR;
+ }
+ else
+ {
+ if (BE (name_len != 1, 0))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ }
+ }
+#endif
+
+ re_token_t br_token;
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
+ Idx equiv_class_alloc = 0, char_class_alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ bool non_match = false;
+ bin_tree_t *work_tree;
+ int token_len;
+ bool first_round = true;
+#ifdef _LIBC
+ collseqmb = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules)
+ {
+ /*
+ if (MB_CUR_MAX > 1)
+ */
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+ }
+#endif
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+#ifdef RE_ENABLE_I18N
+ if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else
+ if (BE (sbcset == NULL, 0))
+#endif /* RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_NON_MATCH_LIST)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+ non_match = true;
+ if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+ bitset_set (sbcset, '\n');
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ }
+
+ /* We treat the first ']' as a normal character. */
+ if (token->type == OP_CLOSE_BRACKET)
+ token->type = CHARACTER;
+
+ while (1)
+ {
+ bracket_elem_t start_elem, end_elem;
+ unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
+ unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
+ reg_errcode_t ret;
+ int token_len2 = 0;
+ bool is_range_exp = false;
+ re_token_t token2;
+
+ start_elem.opr.name = start_name_buf;
+ ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+ syntax, first_round);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+ first_round = false;
+
+ /* Get information about the next token. We need it in any case. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+ /* Do not check for ranges if we know they are not allowed. */
+ if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
+ {
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CHARSET_RANGE)
+ {
+ re_string_skip_bytes (regexp, token_len); /* Skip '-'. */
+ token_len2 = peek_token_bracket (&token2, regexp, syntax);
+ if (BE (token2.type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token2.type == OP_CLOSE_BRACKET)
+ {
+ /* We treat the last '-' as a normal character. */
+ re_string_skip_bytes (regexp, -token_len);
+ token->type = CHARACTER;
+ }
+ else
+ is_range_exp = true;
+ }
+ }
+
+ if (is_range_exp == true)
+ {
+ end_elem.opr.name = end_name_buf;
+ ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+ dfa, syntax, true);
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+#ifdef _LIBC
+ *err = build_range_exp (sbcset, mbcset, &range_alloc,
+ &start_elem, &end_elem);
+#else
+# ifdef RE_ENABLE_I18N
+ *err = build_range_exp (syntax, sbcset,
+ dfa->mb_cur_max > 1 ? mbcset : NULL,
+ &range_alloc, &start_elem, &end_elem);
+# else
+ *err = build_range_exp (syntax, sbcset, &start_elem, &end_elem);
+# endif
+#endif /* RE_ENABLE_I18N */
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ }
+ else
+ {
+ switch (start_elem.type)
+ {
+ case SB_CHAR:
+ bitset_set (sbcset, start_elem.opr.ch);
+ break;
+#ifdef RE_ENABLE_I18N
+ case MB_CHAR:
+ /* Check whether the array has enough space. */
+ if (BE (mbchar_alloc == mbcset->nmbchars, 0))
+ {
+ wchar_t *new_mbchars;
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nmbchars is 0. */
+ mbchar_alloc = 2 * mbcset->nmbchars + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
+ mbchar_alloc);
+ if (BE (new_mbchars == NULL, 0))
+ goto parse_bracket_exp_espace;
+ mbcset->mbchars = new_mbchars;
+ }
+ mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
+ break;
+#endif /* RE_ENABLE_I18N */
+ case EQUIV_CLASS:
+ *err = build_equiv_class (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &equiv_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ case COLL_SYM:
+ *err = build_collating_symbol (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &coll_sym_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ case CHAR_CLASS:
+ *err = build_charclass (regexp->trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &char_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name, syntax);
+ if (BE (*err != REG_NOERROR, 0))
+ goto parse_bracket_exp_free_return;
+ break;
+ default:
+ assert (0);
+ break;
+ }
+ }
+ if (BE (token->type == END_OF_RE, 0))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CLOSE_BRACKET)
+ break;
+ }
+
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+
+ if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
+ || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
+ || mbcset->non_match)))
+ {
+ bin_tree_t *mbc_tree;
+ int sbc_idx;
+ /* Build a tree for complex bracket. */
+ dfa->has_mb_node = 1;
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (mbc_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
+ if (sbcset[sbc_idx])
+ break;
+ /* If there are no bits set in sbcset, there is no point
+ of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */
+ if (sbc_idx < BITSET_WORDS)
+ {
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+
+ /* Then join them by ALT node. */
+ work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ }
+ else
+ {
+ re_free (sbcset);
+ work_tree = mbc_tree;
+ }
+ }
+ else
+#endif /* not RE_ENABLE_I18N */
+ {
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (work_tree == NULL, 0))
+ goto parse_bracket_exp_espace;
+ }
+ return work_tree;
+
+ parse_bracket_exp_espace:
+ *err = REG_ESPACE;
+ parse_bracket_exp_free_return:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ return NULL;
+}
+
+/* Parse an element in the bracket expression. */
+
+static reg_errcode_t
+parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token, int token_len, re_dfa_t *dfa,
+ reg_syntax_t syntax, bool accept_hyphen)
+{
+#ifdef RE_ENABLE_I18N
+ int cur_char_size;
+ cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
+ if (cur_char_size > 1)
+ {
+ elem->type = MB_CHAR;
+ elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
+ re_string_skip_bytes (regexp, cur_char_size);
+ return REG_NOERROR;
+ }
+#endif /* RE_ENABLE_I18N */
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
+ || token->type == OP_OPEN_EQUIV_CLASS)
+ return parse_bracket_symbol (elem, regexp, token);
+ if (BE (token->type == OP_CHARSET_RANGE, 0) && !accept_hyphen)
+ {
+ /* A '-' must only appear as anything but a range indicator before
+ the closing bracket. Everything else is an error. */
+ re_token_t token2;
+ (void) peek_token_bracket (&token2, regexp, syntax);
+ if (token2.type != OP_CLOSE_BRACKET)
+ /* The actual error value is not standardized since this whole
+ case is undefined. But ERANGE makes good sense. */
+ return REG_ERANGE;
+ }
+ elem->type = SB_CHAR;
+ elem->opr.ch = token->opr.c;
+ return REG_NOERROR;
+}
+
+/* Parse a bracket symbol in the bracket expression. Bracket symbols are
+ such as [:<character_class>:], [.<collating_element>.], and
+ [=<equivalent_class>=]. */
+
+static reg_errcode_t
+parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token)
+{
+ unsigned char ch, delim = token->opr.c;
+ int i = 0;
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ for (;; ++i)
+ {
+ if (i >= BRACKET_NAME_BUF_SIZE)
+ return REG_EBRACK;
+ if (token->type == OP_OPEN_CHAR_CLASS)
+ ch = re_string_fetch_byte_case (regexp);
+ else
+ ch = re_string_fetch_byte (regexp);
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
+ break;
+ elem->opr.name[i] = ch;
+ }
+ re_string_skip_bytes (regexp, 1);
+ elem->opr.name[i] = '\0';
+ switch (token->type)
+ {
+ case OP_OPEN_COLL_ELEM:
+ elem->type = COLL_SYM;
+ break;
+ case OP_OPEN_EQUIV_CLASS:
+ elem->type = EQUIV_CLASS;
+ break;
+ case OP_OPEN_CHAR_CLASS:
+ elem->type = CHAR_CLASS;
+ break;
+ default:
+ break;
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the equivalence class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
+ is a pointer argument sinse we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
+ Idx *equiv_class_alloc, const unsigned char *name)
+#else /* not RE_ENABLE_I18N */
+build_equiv_class (bitset_t sbcset, const unsigned char *name)
+#endif /* not RE_ENABLE_I18N */
+{
+#ifdef _LIBC
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra, *cp;
+ unsigned char char_buf[2];
+ int32_t idx1, idx2;
+ unsigned int ch;
+ size_t len;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+ /* Calculate the index for equivalence class. */
+ cp = name;
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ idx1 = findidx (&cp);
+ if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
+ /* This isn't a valid character. */
+ return REG_ECOLLATE;
+
+ /* Build single byte matcing table for this equivalence class. */
+ char_buf[1] = (unsigned char) '\0';
+ len = weights[idx1 & 0xffffff];
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ {
+ char_buf[0] = ch;
+ cp = char_buf;
+ idx2 = findidx (&cp);
+/*
+ idx2 = table[ch];
+*/
+ if (idx2 == 0)
+ /* This isn't a valid character. */
+ continue;
+ /* Compare only if the length matches and the collation rule
+ index is the same. */
+ if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24))
+ {
+ int cnt = 0;
+
+ while (cnt <= len &&
+ weights[(idx1 & 0xffffff) + 1 + cnt]
+ == weights[(idx2 & 0xffffff) + 1 + cnt])
+ ++cnt;
+
+ if (cnt > len)
+ bitset_set (sbcset, ch);
+ }
+ }
+ /* Check whether the array has enough space. */
+ if (BE (*equiv_class_alloc == mbcset->nequiv_classes, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nequiv_classes is 0. */
+ Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
+ /* Use realloc since the array is NULL if *alloc == 0. */
+ int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
+ int32_t,
+ new_equiv_class_alloc);
+ if (BE (new_equiv_classes == NULL, 0))
+ return REG_ESPACE;
+ mbcset->equiv_classes = new_equiv_classes;
+ *equiv_class_alloc = new_equiv_class_alloc;
+ }
+ mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
+ }
+ else
+#endif /* _LIBC */
+ {
+ if (BE (strlen ((const char *) name) != 1, 0))
+ return REG_ECOLLATE;
+ bitset_set (sbcset, *name);
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the character class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
+ is a pointer argument sinse we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ re_charset_t *mbcset, Idx *char_class_alloc,
+ const unsigned char *class_name, reg_syntax_t syntax)
+#else /* not RE_ENABLE_I18N */
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ const unsigned char *class_name, reg_syntax_t syntax)
+#endif /* not RE_ENABLE_I18N */
+{
+ int i;
+ const char *name = (const char *) class_name;
+
+ /* In case of REG_ICASE "upper" and "lower" match the both of
+ upper and lower cases. */
+ if ((syntax & RE_ICASE)
+ && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
+ name = "alpha";
+
+#ifdef RE_ENABLE_I18N
+ /* Check the space of the arrays. */
+ if (BE (*char_class_alloc == mbcset->nchar_classes, 0))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nchar_classes is 0. */
+ Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
+ new_char_class_alloc);
+ if (BE (new_char_classes == NULL, 0))
+ return REG_ESPACE;
+ mbcset->char_classes = new_char_classes;
+ *char_class_alloc = new_char_class_alloc;
+ }
+ mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
+#endif /* RE_ENABLE_I18N */
+
+#define BUILD_CHARCLASS_LOOP(ctype_func) \
+ do { \
+ if (BE (trans != NULL, 0)) \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, trans[i]); \
+ } \
+ else \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, i); \
+ } \
+ } while (0)
+
+ if (strcmp (name, "alnum") == 0)
+ BUILD_CHARCLASS_LOOP (isalnum);
+ else if (strcmp (name, "cntrl") == 0)
+ BUILD_CHARCLASS_LOOP (iscntrl);
+ else if (strcmp (name, "lower") == 0)
+ BUILD_CHARCLASS_LOOP (islower);
+ else if (strcmp (name, "space") == 0)
+ BUILD_CHARCLASS_LOOP (isspace);
+ else if (strcmp (name, "alpha") == 0)
+ BUILD_CHARCLASS_LOOP (isalpha);
+ else if (strcmp (name, "digit") == 0)
+ BUILD_CHARCLASS_LOOP (isdigit);
+ else if (strcmp (name, "print") == 0)
+ BUILD_CHARCLASS_LOOP (isprint);
+ else if (strcmp (name, "upper") == 0)
+ BUILD_CHARCLASS_LOOP (isupper);
+ else if (strcmp (name, "blank") == 0)
+ BUILD_CHARCLASS_LOOP (isblank);
+ else if (strcmp (name, "graph") == 0)
+ BUILD_CHARCLASS_LOOP (isgraph);
+ else if (strcmp (name, "punct") == 0)
+ BUILD_CHARCLASS_LOOP (ispunct);
+ else if (strcmp (name, "xdigit") == 0)
+ BUILD_CHARCLASS_LOOP (isxdigit);
+ else
+ return REG_ECTYPE;
+
+ return REG_NOERROR;
+}
+
+static bin_tree_t *
+build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
+ const unsigned char *class_name,
+ const unsigned char *extra, bool non_match,
+ reg_errcode_t *err)
+{
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ reg_errcode_t ret;
+ re_token_t br_token;
+ bin_tree_t *tree;
+
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+
+#ifdef RE_ENABLE_I18N
+ if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else /* not RE_ENABLE_I18N */
+ if (BE (sbcset == NULL, 0))
+#endif /* not RE_ENABLE_I18N */
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ if (non_match)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+ }
+
+ /* We don't care the syntax in this case. */
+ ret = build_charclass (trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &alloc,
+#endif /* RE_ENABLE_I18N */
+ class_name, 0);
+
+ if (BE (ret != REG_NOERROR, 0))
+ {
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = ret;
+ return NULL;
+ }
+ /* \w match '_' also. */
+ for (; *extra; extra++)
+ bitset_set (sbcset, *extra);
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+#endif
+
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (tree == NULL, 0))
+ goto build_word_op_espace;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ bin_tree_t *mbc_tree;
+ /* Build a tree for complex bracket. */
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ dfa->has_mb_node = 1;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (BE (mbc_tree == NULL, 0))
+ goto build_word_op_espace;
+ /* Then join them by ALT node. */
+ tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
+ if (BE (mbc_tree != NULL, 1))
+ return tree;
+ }
+ else
+ {
+ free_charset (mbcset);
+ return tree;
+ }
+#else /* not RE_ENABLE_I18N */
+ return tree;
+#endif /* not RE_ENABLE_I18N */
+
+ build_word_op_espace:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* This is intended for the expressions like "a{1,3}".
+ Fetch a number from `input', and return the number.
+ Return REG_MISSING if the number field is empty like "{,1}".
+ Return REG_ERROR if an error occurred. */
+
+static Idx
+fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
+{
+ Idx num = REG_MISSING;
+ unsigned char c;
+ while (1)
+ {
+ fetch_token (token, input, syntax);
+ c = token->opr.c;
+ if (BE (token->type == END_OF_RE, 0))
+ return REG_ERROR;
+ if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+ break;
+ num = ((token->type != CHARACTER || c < '0' || '9' < c
+ || num == REG_ERROR)
+ ? REG_ERROR
+ : ((num == REG_MISSING) ? c - '0' : num * 10 + c - '0'));
+ num = (num > RE_DUP_MAX) ? REG_ERROR : num;
+ }
+ return num;
+}
+
+#ifdef RE_ENABLE_I18N
+static void
+free_charset (re_charset_t *cset)
+{
+ re_free (cset->mbchars);
+# ifdef _LIBC
+ re_free (cset->coll_syms);
+ re_free (cset->equiv_classes);
+ re_free (cset->range_starts);
+ re_free (cset->range_ends);
+# endif
+ re_free (cset->char_classes);
+ re_free (cset);
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Functions for binary tree operation. */
+
+/* Create a tree node. */
+
+static bin_tree_t *
+create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type)
+{
+ re_token_t t;
+ t.type = type;
+ return create_token_tree (dfa, left, right, &t);
+}
+
+static bin_tree_t *
+create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token)
+{
+ bin_tree_t *tree;
+ if (BE (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE, 0))
+ {
+ bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
+
+ if (storage == NULL)
+ return NULL;
+ storage->next = dfa->str_tree_storage;
+ dfa->str_tree_storage = storage;
+ dfa->str_tree_storage_idx = 0;
+ }
+ tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
+
+ tree->parent = NULL;
+ tree->left = left;
+ tree->right = right;
+ tree->token = *token;
+ tree->token.duplicated = 0;
+ tree->token.opt_subexp = 0;
+ tree->first = NULL;
+ tree->next = NULL;
+ tree->node_idx = REG_MISSING;
+
+ if (left != NULL)
+ left->parent = tree;
+ if (right != NULL)
+ right->parent = tree;
+ return tree;
+}
+
+/* Mark the tree SRC as an optional subexpression.
+ To be called from preorder or postorder. */
+
+static reg_errcode_t
+mark_opt_subexp (void *extra, bin_tree_t *node)
+{
+ Idx idx = (Idx) (long) extra;
+ if (node->token.type == SUBEXP && node->token.opr.idx == idx)
+ node->token.opt_subexp = 1;
+
+ return REG_NOERROR;
+}
+
+/* Free the allocated memory inside NODE. */
+
+static void
+free_token (re_token_t *node)
+{
+#ifdef RE_ENABLE_I18N
+ if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
+ free_charset (node->opr.mbcset);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
+ re_free (node->opr.sbcset);
+}
+
+/* Worker function for tree walking. Free the allocated memory inside NODE
+ and its children. */
+
+static reg_errcode_t
+free_tree (void *extra, bin_tree_t *node)
+{
+ free_token (&node->token);
+ return REG_NOERROR;
+}
+
+
+/* Duplicate the node SRC, and return new node. This is a preorder
+ visit similar to the one implemented by the generic visitor, but
+ we need more infrastructure to maintain two parallel trees --- so,
+ it's easier to duplicate. */
+
+static bin_tree_t *
+duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
+{
+ const bin_tree_t *node;
+ bin_tree_t *dup_root;
+ bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
+
+ for (node = root; ; )
+ {
+ /* Create a new tree and link it back to the current parent. */
+ *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
+ if (*p_new == NULL)
+ return NULL;
+ (*p_new)->parent = dup_node;
+ (*p_new)->token.duplicated = 1;
+ dup_node = *p_new;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ {
+ node = node->left;
+ p_new = &dup_node->left;
+ }
+ else
+ {
+ const bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ dup_node = dup_node->parent;
+ if (!node)
+ return dup_root;
+ }
+ node = node->right;
+ p_new = &dup_node->right;
+ }
+ }
+}
diff --git a/gnulib/lib/regex-quote.c b/gnulib/lib/regex-quote.c
new file mode 100644
index 0000000..8b4cdb7
--- /dev/null
+++ b/gnulib/lib/regex-quote.c
@@ -0,0 +1,216 @@
+/* Construct a regular expression from a literal string.
+ Copyright (C) 1995, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2010.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "regex-quote.h"
+
+#include <string.h>
+
+#include "mbuiter.h"
+#include "xalloc.h"
+
+/* Characters that are special in a BRE. */
+static const char bre_special[] = "$^.*[]\\";
+
+/* Characters that are special in an ERE. */
+static const char ere_special[] = "$^.*[]\\+?{}()|";
+
+struct regex_quote_spec
+regex_quote_spec_posix (int cflags, bool anchored)
+{
+ struct regex_quote_spec result;
+
+ strcpy (result.special, cflags != 0 ? ere_special : bre_special);
+ result.multibyte = true;
+ result.anchored = anchored;
+
+ return result;
+}
+
+/* Syntax bit values, defined in GNU <regex.h>. We don't include it here,
+ otherwise this module would need to depend on gnulib module 'regex'. */
+#define RE_BK_PLUS_QM 0x00000002
+#define RE_INTERVALS 0x00000200
+#define RE_LIMITED_OPS 0x00000400
+#define RE_NEWLINE_ALT 0x00000800
+#define RE_NO_BK_BRACES 0x00001000
+#define RE_NO_BK_PARENS 0x00002000
+#define RE_NO_BK_VBAR 0x00008000
+
+struct regex_quote_spec
+regex_quote_spec_gnu (unsigned long /*reg_syntax_t*/ syntax, bool anchored)
+{
+ struct regex_quote_spec result;
+ char *p;
+
+ p = result.special;
+ memcpy (p, bre_special, sizeof (bre_special) - 1);
+ p += sizeof (bre_special) - 1;
+ if ((syntax & RE_LIMITED_OPS) == 0 && (syntax & RE_BK_PLUS_QM) == 0)
+ {
+ *p++ = '+';
+ *p++ = '?';
+ }
+ if ((syntax & RE_INTERVALS) != 0 && (syntax & RE_NO_BK_BRACES) != 0)
+ {
+ *p++ = '{';
+ *p++ = '}';
+ }
+ if ((syntax & RE_NO_BK_PARENS) != 0)
+ {
+ *p++ = '(';
+ *p++ = ')';
+ }
+ if ((syntax & RE_LIMITED_OPS) == 0 && (syntax & RE_NO_BK_VBAR) != 0)
+ *p++ = '|';
+ if ((syntax & RE_NEWLINE_ALT) != 0)
+ *p++ = '\n';
+ *p = '\0';
+
+ result.multibyte = true;
+ result.anchored = anchored;
+
+ return result;
+}
+
+/* Characters that are special in a PCRE. */
+static const char pcre_special[] = "$^.*[]\\+?{}()|";
+
+/* Options bit values, defined in <pcre.h>. We don't include it here, because
+ it is not a standard header. */
+#define PCRE_ANCHORED 0x00000010
+#define PCRE_EXTENDED 0x00000008
+
+struct regex_quote_spec
+regex_quote_spec_pcre (int options, bool anchored)
+{
+ struct regex_quote_spec result;
+ char *p;
+
+ p = result.special;
+ memcpy (p, bre_special, sizeof (pcre_special) - 1);
+ p += sizeof (pcre_special) - 1;
+ if (options & PCRE_EXTENDED)
+ {
+ *p++ = ' ';
+ *p++ = '\t';
+ *p++ = '\n';
+ *p++ = '\v';
+ *p++ = '\f';
+ *p++ = '\r';
+ *p++ = '#';
+ }
+ *p = '\0';
+
+ /* PCRE regular expressions consist of UTF-8 characters of options contains
+ PCRE_UTF8 and of single bytes otherwise. */
+ result.multibyte = false;
+ /* If options contains PCRE_ANCHORED, the anchoring is implicit. */
+ result.anchored = (options & PCRE_ANCHORED ? 0 : anchored);
+
+ return result;
+}
+
+size_t
+regex_quote_length (const char *string, const struct regex_quote_spec *spec)
+{
+ const char *special = spec->special;
+ size_t length;
+
+ length = 0;
+ if (spec->anchored)
+ length += 2; /* for '^' at the beginning and '$' at the end */
+ if (spec->multibyte)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ /* We know that special contains only ASCII characters. */
+ if (mb_len (mbui_cur (iter)) == 1
+ && strchr (special, * mbui_cur_ptr (iter)))
+ length += 1;
+ length += mb_len (mbui_cur (iter));
+ }
+ }
+ else
+ {
+ const char *iter;
+
+ for (iter = string; *iter != '\0'; iter++)
+ {
+ if (strchr (special, *iter))
+ length += 1;
+ length += 1;
+ }
+ }
+
+ return length;
+}
+
+char *
+regex_quote_copy (char *p, const char *string, const struct regex_quote_spec *spec)
+{
+ const char *special = spec->special;
+
+ if (spec->anchored)
+ *p++ = '^';
+ if (spec->multibyte)
+ {
+ mbui_iterator_t iter;
+
+ for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter))
+ {
+ /* We know that special contains only ASCII characters. */
+ if (mb_len (mbui_cur (iter)) == 1
+ && strchr (special, * mbui_cur_ptr (iter)))
+ *p++ = '\\';
+ memcpy (p, mbui_cur_ptr (iter), mb_len (mbui_cur (iter)));
+ p += mb_len (mbui_cur (iter));
+ }
+ }
+ else
+ {
+ const char *iter;
+
+ for (iter = string; *iter != '\0'; iter++)
+ {
+ if (strchr (special, *iter))
+ *p++ = '\\';
+ *p++ = *iter++;
+ }
+ }
+ if (spec->anchored)
+ *p++ = '$';
+
+ return p;
+}
+
+char *
+regex_quote (const char *string, const struct regex_quote_spec *spec)
+{
+ size_t length = regex_quote_length (string, spec);
+ char *result = XNMALLOC (length + 1, char);
+ char *p;
+
+ p = result;
+ p = regex_quote_copy (p, string, spec);
+ *p = '\0';
+ return result;
+}
diff --git a/gnulib/lib/regex-quote.h b/gnulib/lib/regex-quote.h
new file mode 100644
index 0000000..402dfaa
--- /dev/null
+++ b/gnulib/lib/regex-quote.h
@@ -0,0 +1,88 @@
+/* Construct a regular expression from a literal string.
+ Copyright (C) 1995, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2010.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _REGEX_QUOTE_H
+#define _REGEX_QUOTE_H
+
+#include <stddef.h>
+#include <stdbool.h>
+
+
+/* Specifies a quotation task for converting a fixed string to a regular
+ expression pattern. */
+struct regex_quote_spec
+{
+ /* True if the regular expression pattern consists of multibyte characters
+ (in the encoding given by the LC_CTYPE category of the locale),
+ false if it consists of single bytes or UTF-8 characters. */
+ unsigned int /*bool*/ multibyte : 1;
+ /* True if the regular expression pattern shall match only entire lines. */
+ unsigned int /*bool*/ anchored : 1;
+ /* Set of characters that need to be escaped (all ASCII), as a
+ NUL-terminated string. */
+ char special[30 + 1];
+};
+
+
+/* Creates a quotation task that produces a POSIX regular expression, that is,
+ a pattern that can be compiled with regcomp().
+ CFLAGS can be 0 or REG_EXTENDED.
+ If it is 0, the result is a Basic Regular Expression (BRE)
+ <http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03>.
+ If it is REG_EXTENDED, the result is an Extended Regular Expression (ERE)
+ <http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04>.
+ If ANCHORED is false, the regular expression will match substrings of lines.
+ If ANCHORED is true, it will match only complete lines, */
+extern struct regex_quote_spec
+ regex_quote_spec_posix (int cflags, bool anchored);
+
+/* Creates a quotation task that produces a regular expression that can be
+ compiled with the GNU API function re_compile_pattern().
+ SYNTAX describes the syntax of the regular expression (such as
+ RE_SYNTAX_POSIX_BASIC, RE_SYNTAX_POSIX_EXTENDED, RE_SYNTAX_EMACS, all
+ defined in <regex.h>). It must be the same value as 're_syntax_options'
+ at the moment of the re_compile_pattern() call.
+ If ANCHORED is false, the regular expression will match substrings of lines.
+ If ANCHORED is true, it will match only complete lines, */
+extern struct regex_quote_spec
+ regex_quote_spec_gnu (unsigned long /*reg_syntax_t*/ syntax, bool anchored);
+
+/* Creates a quotation task that produces a PCRE regular expression, that is,
+ a pattern that can be compiled with pcre_compile().
+ OPTIONS is the same value as the second argument passed to pcre_compile().
+ If ANCHORED is false, the regular expression will match substrings of lines.
+ If ANCHORED is true, it will match only complete lines, */
+extern struct regex_quote_spec
+ regex_quote_spec_pcre (int options, bool anchored);
+
+
+/* Returns the number of bytes needed for the quoted string. */
+extern size_t
+ regex_quote_length (const char *string, const struct regex_quote_spec *spec);
+
+/* Copies the quoted string to p and returns the incremented p.
+ There must be room for regex_quote_length (string, spec) + 1 bytes at p. */
+extern char *
+ regex_quote_copy (char *p,
+ const char *string, const struct regex_quote_spec *spec);
+
+/* Returns the freshly allocated quoted string. */
+extern char *
+ regex_quote (const char *string, const struct regex_quote_spec *spec);
+
+
+#endif /* _REGEX_QUOTE_H */
diff --git a/gnulib/lib/regex.c b/gnulib/lib/regex.c
new file mode 100644
index 0000000..af47056
--- /dev/null
+++ b/gnulib/lib/regex.c
@@ -0,0 +1,72 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2003, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Make sure noone compiles this code with a C++ compiler. */
+#if defined __cplusplus && defined _LIBC
+# error "This is C code, use a C compiler"
+#endif
+
+#ifdef _LIBC
+/* We have to keep the namespace clean. */
+# define regfree(preg) __regfree (preg)
+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+# define regerror(errcode, preg, errbuf, errbuf_size) \
+ __regerror(errcode, preg, errbuf, errbuf_size)
+# define re_set_registers(bu, re, nu, st, en) \
+ __re_set_registers (bu, re, nu, st, en)
+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+# define re_match(bufp, string, size, pos, regs) \
+ __re_match (bufp, string, size, pos, regs)
+# define re_search(bufp, string, size, startpos, range, regs) \
+ __re_search (bufp, string, size, startpos, range, regs)
+# define re_compile_pattern(pattern, length, bufp) \
+ __re_compile_pattern (pattern, length, bufp)
+# define re_set_syntax(syntax) __re_set_syntax (syntax)
+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+
+# include "../locale/localeinfo.h"
+#endif
+
+/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
+ GNU regex allows. Include it before <regex.h>, which correctly
+ #undefs RE_DUP_MAX and sets it to the right value. */
+#include <limits.h>
+#include <strings.h>
+
+#include <regex.h>
+#include "regex_internal.h"
+
+#include "regex_internal.c"
+#include "regcomp.c"
+#include "regexec.c"
+
+/* Binary backward compatibility. */
+#if _LIBC
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
+int re_max_failures = 2000;
+# endif
+#endif
diff --git a/gnulib/lib/regex.h b/gnulib/lib/regex.h
new file mode 100644
index 0000000..2a17ff3
--- /dev/null
+++ b/gnulib/lib/regex.h
@@ -0,0 +1,675 @@
+/* Definitions for data structures and routines for the regular
+ expression library.
+ Copyright (C) 1985, 1989-1993, 1995-1998, 2000-2003, 2005-2006, 2009-2011
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+#include <sys/types.h>
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define __USE_GNU_REGEX to declare GNU extensions that violate the
+ POSIX name space rules. */
+#undef __USE_GNU_REGEX
+#if (defined _GNU_SOURCE \
+ || (!defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE \
+ && !defined _XOPEN_SOURCE))
+# define __USE_GNU_REGEX 1
+#endif
+
+#ifdef _REGEX_LARGE_OFFSETS
+
+/* Use types and values that are wide enough to represent signed and
+ unsigned byte offsets in memory. This currently works only when
+ the regex code is used outside of the GNU C library; it is not yet
+ supported within glibc itself, and glibc users should not define
+ _REGEX_LARGE_OFFSETS. */
+
+/* The type of the offset of a byte within a string.
+ For historical reasons POSIX 1003.1-2004 requires that regoff_t be
+ at least as wide as off_t. However, many common POSIX platforms set
+ regoff_t to the more-sensible ssize_t and the Open Group has
+ signalled its intention to change the requirement to be that
+ regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
+ 60 (2005-08-25). We don't know of any hosts where ssize_t or
+ ptrdiff_t is wider than ssize_t, so ssize_t is safe. */
+typedef ssize_t regoff_t;
+
+/* The type of nonnegative object indexes. Traditionally, GNU regex
+ uses 'int' for these. Code that uses __re_idx_t should work
+ regardless of whether the type is signed. */
+typedef size_t __re_idx_t;
+
+/* The type of object sizes. */
+typedef size_t __re_size_t;
+
+/* The type of object sizes, in places where the traditional code
+ uses unsigned long int. */
+typedef size_t __re_long_size_t;
+
+#else
+
+/* Use types that are binary-compatible with the traditional GNU regex
+ implementation, which mishandles strings longer than INT_MAX. */
+
+typedef int regoff_t;
+typedef int __re_idx_t;
+typedef unsigned int __re_size_t;
+typedef unsigned long int __re_long_size_t;
+
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+ wide enough to hold a value of a pointer. For most ANSI compilers
+ ptrdiff_t and size_t should be likely OK. Still size of these two
+ types is 2 for Microsoft C. Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+ recognize. The set/not-set meanings are chosen so that Emacs syntax
+ remains the value 0. The bits are given in alphabetical order, and
+ the definitions shifted by one from the previous bit; thus, when we
+ add or remove a bit, only one other definition need change. */
+typedef unsigned long int reg_syntax_t;
+
+#ifdef __USE_GNU_REGEX
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+ If set, then such a \ quotes the following character. */
+# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+ literals.
+ If set, then \+ and \? are operators and + and ? are literals. */
+# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported. They are:
+ [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
+ [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+ If not set, then character classes are not supported. */
+# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+ expressions, of course).
+ If this bit is not set, then it depends:
+ ^ is an anchor if it is at the beginning of a regular
+ expression or after an open-group or an alternation operator;
+ $ is an anchor if it is at the end of a regular expression, or
+ before a close-group or an alternation operator.
+
+ This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+ POSIX draft 11.2 says that * etc. in leading positions is undefined.
+ We already implemented a previous draft which made those constructs
+ invalid, though, so we haven't changed the code back. */
+# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+ regardless of where they are in the pattern.
+ If this bit is not set, then special characters are special only in
+ some contexts; otherwise they are ordinary. Specifically,
+ * + ? and intervals are only special when not after the beginning,
+ open-group, or alternation operator. */
+# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+ immediately after an alternation or begin-group operator. */
+# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+ If not set, then it doesn't. */
+# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+ If not set, then it does. */
+# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+ If not set, they do. */
+# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+ interval, depending on RE_NO_BK_BRACES.
+ If not set, \{, \}, {, and } are literals. */
+# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+ If not set, they are. */
+# define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+ If not set, newline is literal. */
+# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+ are literals.
+ If not set, then `\{...\}' defines an interval. */
+# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+ If not set, \(...\) defines a group, and ( and ) are literals. */
+# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+ If not set, then \<digit> is a back-reference. */
+# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+ If not set, then \| is an alternation operator, and | is literal. */
+# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+ than the starting range point, as in [z-a], is invalid.
+ If not set, then when ending range point collates higher than the
+ starting range point, the range is ignored. */
+# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+ If not set, then an unmatched ) is invalid. */
+# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+ without further backtracking. */
+# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+ If not set, then the GNU regex operators are recognized. */
+# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+ If not set, and debugging was on, turn it off.
+ This only works if regex.c is compiled -DDEBUG.
+ We define this bit always, so that all that's needed to turn on
+ debugging is to recompile regex.c; the calling code can always have
+ this bit set, and it won't affect anything in the normal case. */
+# define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, a syntactically invalid interval is treated as
+ a string of ordinary characters. For example, the ERE 'a{1' is
+ treated as 'a\{1'. */
+# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
+
+/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
+ for ^, because it is difficult to scan the regex backwards to find
+ whether ^ should be special. */
+# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
+
+/* If this bit is set, then \{ cannot be first in a regex or
+ immediately after an alternation, open-group or \} operator. */
+# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
+
+/* If this bit is set, then no_sub will be set to 1 during
+ re_compile_pattern. */
+# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
+
+#endif /* defined __USE_GNU_REGEX */
+
+/* This global variable defines the particular regexp syntax to use (for
+ some interfaces). When a regexp is compiled, the syntax used is
+ stored in the pattern buffer, so changing this does not affect
+ already-compiled regexps. */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef __USE_GNU_REGEX
+/* Define combinations of the above bits for the standard possibilities.
+ (The [[[ comments delimit what gets put into the Texinfo file, so
+ don't delete them!) */
+/* [[[begin syntaxes]]] */
+# define RE_SYNTAX_EMACS 0
+
+# define RE_SYNTAX_AWK \
+ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
+ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GNU_AWK \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
+ & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS \
+ | RE_CONTEXT_INVALID_OPS ))
+
+# define RE_SYNTAX_POSIX_AWK \
+ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
+ | RE_INTERVALS | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GREP \
+ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \
+ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
+ | RE_NEWLINE_ALT)
+
+# define RE_SYNTAX_EGREP \
+ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
+ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \
+ | RE_NO_BK_VBAR)
+
+# define RE_SYNTAX_POSIX_EGREP \
+ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \
+ | RE_INVALID_INTERVAL_ORD)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax. */
+# define _RE_SYNTAX_POSIX_COMMON \
+ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
+ | RE_INTERVALS | RE_NO_EMPTY_RANGES)
+
+# define RE_SYNTAX_POSIX_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+ RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
+ isn't minimal, since other operators, such as \`, aren't disabled. */
+# define RE_SYNTAX_POSIX_MINIMAL_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+# define RE_SYNTAX_POSIX_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \
+ | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+ removed and RE_NO_BK_REFS is added. */
+# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+#endif /* defined __USE_GNU_REGEX */
+
+#ifdef __USE_GNU_REGEX
+
+/* Maximum number of duplicates an interval can allow. POSIX-conforming
+ systems might define this in <limits.h>, but we want our
+ value, so remove any previous define. */
+# ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+# endif
+
+/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
+ the counter as a 2-byte signed integer. This is no longer true, so
+ RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
+ ((SIZE_MAX - 2) / 10 - 1) if _REGEX_LARGE_OFFSETS is defined.
+ However, there would be a huge performance problem if someone
+ actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
+ its historical value. */
+# define RE_DUP_MAX (0x7fff)
+
+#endif /* defined __USE_GNU_REGEX */
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp'). */
+
+/* If this bit is set, then use extended regular expression syntax.
+ If not set, then use basic regular expression syntax. */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+#define REG_ICASE (1 << 1)
+
+/* If this bit is set, then anchors do not match at newline
+ characters in the string.
+ If not set, then anchors do match at newlines. */
+#define REG_NEWLINE (1 << 2)
+
+/* If this bit is set, then report only success or fail in regexec.
+ If not set, then returns differ between not matching and errors. */
+#define REG_NOSUB (1 << 3)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec). */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+ the beginning of the string (presumably because it's not the
+ beginning of a line).
+ If not set, then the beginning-of-line operator does match the
+ beginning of the string. */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line. */
+#define REG_NOTEOL (1 << 1)
+
+/* Use PMATCH[0] to delimit the start and end of the search in the
+ buffer. */
+#define REG_STARTEND (1 << 2)
+
+
+/* If any error codes are removed, changed, or added, update the
+ `__re_error_msgid' table in regcomp.c. */
+
+typedef enum
+{
+ _REG_ENOSYS = -1, /* This will never happen for this implementation. */
+ _REG_NOERROR = 0, /* Success. */
+ _REG_NOMATCH, /* Didn't find a match (for regexec). */
+
+ /* POSIX regcomp return error codes. (In the order listed in the
+ standard.) */
+ _REG_BADPAT, /* Invalid pattern. */
+ _REG_ECOLLATE, /* Invalid collating element. */
+ _REG_ECTYPE, /* Invalid character class name. */
+ _REG_EESCAPE, /* Trailing backslash. */
+ _REG_ESUBREG, /* Invalid back reference. */
+ _REG_EBRACK, /* Unmatched left bracket. */
+ _REG_EPAREN, /* Parenthesis imbalance. */
+ _REG_EBRACE, /* Unmatched \{. */
+ _REG_BADBR, /* Invalid contents of \{\}. */
+ _REG_ERANGE, /* Invalid range end. */
+ _REG_ESPACE, /* Ran out of memory. */
+ _REG_BADRPT, /* No preceding re for repetition op. */
+
+ /* Error codes we've added. */
+ _REG_EEND, /* Premature end. */
+ _REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
+ _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
+} reg_errcode_t;
+
+#ifdef _XOPEN_SOURCE
+# define REG_ENOSYS _REG_ENOSYS
+#endif
+#define REG_NOERROR _REG_NOERROR
+#define REG_NOMATCH _REG_NOMATCH
+#define REG_BADPAT _REG_BADPAT
+#define REG_ECOLLATE _REG_ECOLLATE
+#define REG_ECTYPE _REG_ECTYPE
+#define REG_EESCAPE _REG_EESCAPE
+#define REG_ESUBREG _REG_ESUBREG
+#define REG_EBRACK _REG_EBRACK
+#define REG_EPAREN _REG_EPAREN
+#define REG_EBRACE _REG_EBRACE
+#define REG_BADBR _REG_BADBR
+#define REG_ERANGE _REG_ERANGE
+#define REG_ESPACE _REG_ESPACE
+#define REG_BADRPT _REG_BADRPT
+#define REG_EEND _REG_EEND
+#define REG_ESIZE _REG_ESIZE
+#define REG_ERPAREN _REG_ERPAREN
+
+/* struct re_pattern_buffer normally uses member names like `buffer'
+ that POSIX does not allow. In POSIX mode these members have names
+ with leading `re_' (e.g., `re_buffer'). */
+#ifdef __USE_GNU_REGEX
+# define _REG_RE_NAME(id) id
+# define _REG_RM_NAME(id) id
+#else
+# define _REG_RE_NAME(id) re_##id
+# define _REG_RM_NAME(id) rm_##id
+#endif
+
+/* The user can specify the type of the re_translate member by
+ defining the macro RE_TRANSLATE_TYPE, which defaults to unsigned
+ char *. This pollutes the POSIX name space, so in POSIX mode just
+ use unsigned char *. */
+#ifdef __USE_GNU_REGEX
+# ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE unsigned char *
+# endif
+# define REG_TRANSLATE_TYPE RE_TRANSLATE_TYPE
+#else
+# define REG_TRANSLATE_TYPE unsigned char *
+#endif
+
+/* This data structure represents a compiled pattern. Before calling
+ the pattern compiler, the fields `buffer', `allocated', `fastmap',
+ `translate', and `no_sub' can be set. After the pattern has been
+ compiled, the `re_nsub' field is available. All other fields are
+ private to the regex routines. */
+
+struct re_pattern_buffer
+{
+ /* Space that holds the compiled pattern. It is declared as
+ `unsigned char *' because its elements are sometimes used as
+ array indexes. */
+ unsigned char *_REG_RE_NAME (buffer);
+
+ /* Number of bytes to which `buffer' points. */
+ __re_long_size_t _REG_RE_NAME (allocated);
+
+ /* Number of bytes actually used in `buffer'. */
+ __re_long_size_t _REG_RE_NAME (used);
+
+ /* Syntax setting with which the pattern was compiled. */
+ reg_syntax_t _REG_RE_NAME (syntax);
+
+ /* Pointer to a fastmap, if any, otherwise zero. re_search uses the
+ fastmap, if there is one, to skip over impossible starting points
+ for matches. */
+ char *_REG_RE_NAME (fastmap);
+
+ /* Either a translate table to apply to all characters before
+ comparing them, or zero for no translation. The translation is
+ applied to a pattern when it is compiled and to a string when it
+ is matched. */
+ REG_TRANSLATE_TYPE _REG_RE_NAME (translate);
+
+ /* Number of subexpressions found by the compiler. */
+ size_t re_nsub;
+
+ /* Zero if this pattern cannot match the empty string, one else.
+ Well, in truth it's used only in `re_search_2', to see whether or
+ not we should use the fastmap, so we don't set this absolutely
+ perfectly; see `re_compile_fastmap' (the `duplicate' case). */
+ unsigned int _REG_RE_NAME (can_be_null) : 1;
+
+ /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+ for `max (RE_NREGS, re_nsub + 1)' groups.
+ If REGS_REALLOCATE, reallocate space if necessary.
+ If REGS_FIXED, use what's there. */
+#ifdef __USE_GNU_REGEX
+# define REGS_UNALLOCATED 0
+# define REGS_REALLOCATE 1
+# define REGS_FIXED 2
+#endif
+ unsigned int _REG_RE_NAME (regs_allocated) : 2;
+
+ /* Set to zero when `re_compile_pattern' compiles a pattern; set to
+ one by `re_compile_fastmap' if it updates the fastmap. */
+ unsigned int _REG_RE_NAME (fastmap_accurate) : 1;
+
+ /* If set, `re_match_2' does not return information about
+ subexpressions. */
+ unsigned int _REG_RE_NAME (no_sub) : 1;
+
+ /* If set, a beginning-of-line anchor doesn't match at the beginning
+ of the string. */
+ unsigned int _REG_RE_NAME (not_bol) : 1;
+
+ /* Similarly for an end-of-line anchor. */
+ unsigned int _REG_RE_NAME (not_eol) : 1;
+
+ /* If true, an anchor at a newline matches. */
+ unsigned int _REG_RE_NAME (newline_anchor) : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* This is the structure we store register match data in. See
+ regex.texinfo for a full description of what registers match. */
+struct re_registers
+{
+ __re_size_t _REG_RM_NAME (num_regs);
+ regoff_t *_REG_RM_NAME (start);
+ regoff_t *_REG_RM_NAME (end);
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+ `re_match_2' returns information about at least this many registers
+ the first time a `regs' structure is passed. */
+#if !defined RE_NREGS && defined __USE_GNU_REGEX
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers. Aside from the different names than
+ `re_registers', POSIX uses an array of structures, instead of a
+ structure of arrays. */
+typedef struct
+{
+ regoff_t rm_so; /* Byte offset from string's start to substring's start. */
+ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
+} regmatch_t;
+
+/* Declarations for routines. */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+ You can also simply assign to the `re_syntax_options' variable. */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+ and syntax given by the global `re_syntax_options', into the buffer
+ BUFFER. Return NULL if successful, and an error string if not. */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+ struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+ accelerate searches. Return 0 if successful and -2 if was an
+ internal error. */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+ compiled into BUFFER. Start searching at position START, for RANGE
+ characters. Return the starting position of the match, -1 for no
+ match, or -2 for an internal error. Also return register
+ information in REGS (if REGS and BUFFER->no_sub are nonzero). */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+ const char *__string, __re_idx_t __length,
+ __re_idx_t __start, regoff_t __range,
+ struct re_registers *__regs);
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+ STRING2. Also, stop searching at index START + STOP. */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, regoff_t __range,
+ struct re_registers *__regs,
+ __re_idx_t __stop);
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+ in BUFFER matched, starting at position START. */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+ const char *__string, __re_idx_t __length,
+ __re_idx_t __start, struct re_registers *__regs);
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, __re_idx_t __length1,
+ const char *__string2, __re_idx_t __length2,
+ __re_idx_t __start, struct re_registers *__regs,
+ __re_idx_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using BUFFER and REGS will use this memory
+ for recording register information. STARTS and ENDS must be
+ allocated with malloc, and must each be at least `NUM_REGS * sizeof
+ (regoff_t)' bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ BUFFER will allocate its own register data, without freeing the old
+ data. */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+ struct re_registers *__regs,
+ __re_size_t __num_regs,
+ regoff_t *__starts, regoff_t *__ends);
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility. */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !defined __STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility. */
+extern int regcomp (regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __pattern,
+ int __cflags);
+
+extern int regexec (const regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __string, size_t __nmatch,
+ regmatch_t __pmatch[_Restrict_arr_],
+ int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
+ char *_Restrict_ __errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+#endif /* regex.h */
diff --git a/gnulib/lib/regex_internal.c b/gnulib/lib/regex_internal.c
new file mode 100644
index 0000000..26c5dc6
--- /dev/null
+++ b/gnulib/lib/regex_internal.c
@@ -0,0 +1,1741 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static void re_string_construct_common (const char *str, Idx len,
+ re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa) internal_function;
+static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ re_hashval_t hash) internal_function;
+static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ unsigned int context,
+ re_hashval_t hash) internal_function;
+
+/* Functions for string operation. */
+
+/* This function allocate the buffers. It is necessary to call
+ re_string_reconstruct before using the object. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ Idx init_buf_len;
+
+ /* Ensure at least one character fits into the buffers. */
+ if (init_len < dfa->mb_cur_max)
+ init_len = dfa->mb_cur_max;
+ init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ ret = re_string_realloc_buffers (pstr, init_buf_len);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ pstr->word_char = dfa->word_char;
+ pstr->word_ops_used = dfa->word_ops_used;
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+ pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len;
+ pstr->valid_raw_len = pstr->valid_len;
+ return REG_NOERROR;
+}
+
+/* This function allocate the buffers, and initialize them. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_construct (re_string_t *pstr, const char *str, Idx len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ memset (pstr, '\0', sizeof (re_string_t));
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ if (len > 0)
+ {
+ ret = re_string_realloc_buffers (pstr, len + 1);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+
+ if (icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ if (pstr->valid_raw_len >= len)
+ break;
+ if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max)
+ break;
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (trans != NULL)
+ re_string_translate_buffer (pstr);
+ else
+ {
+ pstr->valid_len = pstr->bufs_len;
+ pstr->valid_raw_len = pstr->bufs_len;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions for re_string_allocate, and re_string_construct. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
+{
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ wint_t *new_wcs;
+
+ /* Avoid overflow. */
+ size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
+ if (BE (SIZE_MAX / max_object_size < new_buf_len, 0))
+ return REG_ESPACE;
+
+ new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+ if (BE (new_wcs == NULL, 0))
+ return REG_ESPACE;
+ pstr->wcs = new_wcs;
+ if (pstr->offsets != NULL)
+ {
+ Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
+ if (BE (new_offsets == NULL, 0))
+ return REG_ESPACE;
+ pstr->offsets = new_offsets;
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ {
+ unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char,
+ new_buf_len);
+ if (BE (new_mbs == NULL, 0))
+ return REG_ESPACE;
+ pstr->mbs = new_mbs;
+ }
+ pstr->bufs_len = new_buf_len;
+ return REG_NOERROR;
+}
+
+
+static void
+internal_function
+re_string_construct_common (const char *str, Idx len, re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa)
+{
+ pstr->raw_mbs = (const unsigned char *) str;
+ pstr->len = len;
+ pstr->raw_len = len;
+ pstr->trans = trans;
+ pstr->icase = icase;
+ pstr->mbs_allocated = (trans != NULL || icase);
+ pstr->mb_cur_max = dfa->mb_cur_max;
+ pstr->is_utf8 = dfa->is_utf8;
+ pstr->map_notascii = dfa->map_notascii;
+ pstr->stop = pstr->len;
+ pstr->raw_stop = pstr->stop;
+}
+
+#ifdef RE_ENABLE_I18N
+
+/* Build wide character buffer PSTR->WCS.
+ If the byte sequence of the string are:
+ <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
+ Then wide character buffer will be:
+ <wc1> , WEOF , <wc2> , WEOF , <wc3>
+ We use WEOF for padding, they indicate that the position isn't
+ a first byte of a multibyte character.
+
+ Note that this function assumes PSTR->VALID_LEN elements are already
+ built and starts from PSTR->VALID_LEN. */
+
+static void
+internal_function
+build_wcs_buffer (re_string_t *pstr)
+{
+#ifdef _LIBC
+ unsigned char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+ unsigned char buf[64];
+#endif
+ mbstate_t prev_st;
+ Idx byte_idx, end_idx, remain_len;
+ size_t mbclen;
+
+ /* Build the buffers from pstr->valid_len to either pstr->len or
+ pstr->bufs_len. */
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+ for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ /* Apply the translation if we need. */
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i];
+ buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (BE (mbclen == (size_t) -2, 0))
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
+ {
+ /* We treat these cases as a singlebyte character. */
+ mbclen = 1;
+ wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ if (BE (pstr->trans != NULL, 0))
+ wc = pstr->trans[wc];
+ pstr->cur_state = prev_st;
+ }
+
+ /* Write wide character and padding. */
+ pstr->wcs[byte_idx++] = wc;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+}
+
+/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
+ but for REG_ICASE. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+build_wcs_upper_buffer (re_string_t *pstr)
+{
+ mbstate_t prev_st;
+ Idx src_idx, byte_idx, end_idx, remain_len;
+ size_t mbclen;
+#ifdef _LIBC
+ char buf[MB_LEN_MAX];
+ assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+ char buf[64];
+#endif
+
+ byte_idx = pstr->valid_len;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ /* The following optimization assumes that ASCII characters can be
+ mapped to wide characters with a simple cast. */
+ if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed)
+ {
+ while (byte_idx < end_idx)
+ {
+ wchar_t wc;
+
+ if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx])
+ && mbsinit (&pstr->cur_state))
+ {
+ /* In case of a singlebyte character. */
+ pstr->mbs[byte_idx]
+ = toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]);
+ /* The next step uses the assumption that wchar_t is encoded
+ ASCII-safe: all ASCII values can be converted like this. */
+ pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx];
+ ++byte_idx;
+ continue;
+ }
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc,
+ ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+ + byte_idx), remain_len, &pstr->cur_state);
+ if (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb (buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else
+ {
+ src_idx = byte_idx;
+ goto offsets_needed;
+ }
+ }
+ else
+ memcpy (pstr->mbs + byte_idx,
+ pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ pstr->mbs[byte_idx] = ch;
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+ return REG_NOERROR;
+ }
+ else
+ for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+ offsets_needed:
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i];
+ buf[i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (BE (mbclen < (size_t) -2, 1))
+ {
+ wchar_t wcu = wc;
+ if (iswlower (wc))
+ {
+ size_t mbcdlen;
+
+ wcu = towupper (wc);
+ mbcdlen = wcrtomb ((char *) buf, wcu, &prev_st);
+ if (BE (mbclen == mbcdlen, 1))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else if (mbcdlen != (size_t) -1)
+ {
+ size_t i;
+
+ if (byte_idx + mbcdlen > pstr->bufs_len)
+ {
+ pstr->cur_state = prev_st;
+ break;
+ }
+
+ if (pstr->offsets == NULL)
+ {
+ pstr->offsets = re_malloc (Idx, pstr->bufs_len);
+
+ if (pstr->offsets == NULL)
+ return REG_ESPACE;
+ }
+ if (!pstr->offsets_needed)
+ {
+ for (i = 0; i < (size_t) byte_idx; ++i)
+ pstr->offsets[i] = i;
+ pstr->offsets_needed = 1;
+ }
+
+ memcpy (pstr->mbs + byte_idx, buf, mbcdlen);
+ pstr->wcs[byte_idx] = wcu;
+ pstr->offsets[byte_idx] = src_idx;
+ for (i = 1; i < mbcdlen; ++i)
+ {
+ pstr->offsets[byte_idx + i]
+ = src_idx + (i < mbclen ? i : mbclen - 1);
+ pstr->wcs[byte_idx + i] = WEOF;
+ }
+ pstr->len += mbcdlen - mbclen;
+ if (pstr->raw_stop > src_idx)
+ pstr->stop += mbcdlen - mbclen;
+ end_idx = (pstr->bufs_len > pstr->len)
+ ? pstr->len : pstr->bufs_len;
+ byte_idx += mbcdlen;
+ src_idx += mbclen;
+ continue;
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+
+ if (BE (pstr->offsets_needed != 0, 0))
+ {
+ size_t i;
+ for (i = 0; i < mbclen; ++i)
+ pstr->offsets[byte_idx + i] = src_idx + i;
+ }
+ src_idx += mbclen;
+
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0)
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+
+ if (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans [ch];
+ pstr->mbs[byte_idx] = ch;
+
+ if (BE (pstr->offsets_needed != 0, 0))
+ pstr->offsets[byte_idx] = src_idx;
+ ++src_idx;
+
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (BE (mbclen == (size_t) -1, 0))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = src_idx;
+ return REG_NOERROR;
+}
+
+/* Skip characters until the index becomes greater than NEW_RAW_IDX.
+ Return the index. */
+
+static Idx
+internal_function
+re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
+{
+ mbstate_t prev_st;
+ Idx rawbuf_idx;
+ size_t mbclen;
+ wint_t wc = WEOF;
+
+ /* Skip the characters which are not necessary to check. */
+ for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len;
+ rawbuf_idx < new_raw_idx;)
+ {
+ wchar_t wc2;
+ Idx remain_len;
+ remain_len = pstr->len - rawbuf_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
+ remain_len, &pstr->cur_state);
+ if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 0))
+ {
+ /* We treat these cases as a single byte character. */
+ if (mbclen == 0 || remain_len == 0)
+ wc = L'\0';
+ else
+ wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx);
+ mbclen = 1;
+ pstr->cur_state = prev_st;
+ }
+ else
+ wc = wc2;
+ /* Then proceed the next character. */
+ rawbuf_idx += mbclen;
+ }
+ *last_wc = wc;
+ return rawbuf_idx;
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Build the buffer PSTR->MBS, and apply the translation if we need.
+ This function is used in case of REG_ICASE. */
+
+static void
+internal_function
+build_upper_buffer (re_string_t *pstr)
+{
+ Idx char_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
+ if (BE (pstr->trans != NULL, 0))
+ ch = pstr->trans[ch];
+ if (islower (ch))
+ pstr->mbs[char_idx] = toupper (ch);
+ else
+ pstr->mbs[char_idx] = ch;
+ }
+ pstr->valid_len = char_idx;
+ pstr->valid_raw_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR. */
+
+static void
+internal_function
+re_string_translate_buffer (re_string_t *pstr)
+{
+ Idx buf_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
+ pstr->mbs[buf_idx] = pstr->trans[ch];
+ }
+
+ pstr->valid_len = buf_idx;
+ pstr->valid_raw_len = buf_idx;
+}
+
+/* This function re-construct the buffers.
+ Concretely, convert to wide character in case of pstr->mb_cur_max > 1,
+ convert to upper case in case of REG_ICASE, apply translation. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
+{
+ Idx offset;
+
+ if (BE (pstr->raw_mbs_idx <= idx, 0))
+ offset = idx - pstr->raw_mbs_idx;
+ else
+ {
+ /* Reset buffer. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+#endif /* RE_ENABLE_I18N */
+ pstr->len = pstr->raw_len;
+ pstr->stop = pstr->raw_stop;
+ pstr->valid_len = 0;
+ pstr->raw_mbs_idx = 0;
+ pstr->valid_raw_len = 0;
+ pstr->offsets_needed = 0;
+ pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+ if (!pstr->mbs_allocated)
+ pstr->mbs = (unsigned char *) pstr->raw_mbs;
+ offset = idx;
+ }
+
+ if (BE (offset != 0, 1))
+ {
+ /* Should the already checked characters be kept? */
+ if (BE (offset < pstr->valid_raw_len, 1))
+ {
+ /* Yes, move them to the front of the buffer. */
+#ifdef RE_ENABLE_I18N
+ if (BE (pstr->offsets_needed, 0))
+ {
+ Idx low = 0, high = pstr->valid_len, mid;
+ do
+ {
+ mid = (high + low) / 2;
+ if (pstr->offsets[mid] > offset)
+ high = mid;
+ else if (pstr->offsets[mid] < offset)
+ low = mid + 1;
+ else
+ break;
+ }
+ while (low < high);
+ if (pstr->offsets[mid] < offset)
+ ++mid;
+ pstr->tip_context = re_string_context_at (pstr, mid - 1,
+ eflags);
+ /* This can be quite complicated, so handle specially
+ only the common and easy case where the character with
+ different length representation of lower and upper
+ case is present at or after offset. */
+ if (pstr->valid_len > offset
+ && mid == offset && pstr->offsets[mid] == offset)
+ {
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+ memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+ for (low = 0; low < pstr->valid_len; low++)
+ pstr->offsets[low] = pstr->offsets[low + offset] - offset;
+ }
+ else
+ {
+ /* Otherwise, just find out how long the partial multibyte
+ character at offset is and fill it with WEOF/255. */
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ while (mid > 0 && pstr->offsets[mid - 1] == offset)
+ --mid;
+ while (mid < pstr->valid_len)
+ if (pstr->wcs[mid] != WEOF)
+ break;
+ else
+ ++mid;
+ if (mid == pstr->valid_len)
+ pstr->valid_len = 0;
+ else
+ {
+ pstr->valid_len = pstr->offsets[mid] - offset;
+ if (pstr->valid_len)
+ {
+ for (low = 0; low < pstr->valid_len; ++low)
+ pstr->wcs[low] = WEOF;
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ }
+ else
+#endif
+ {
+ pstr->tip_context = re_string_context_at (pstr, offset - 1,
+ eflags);
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+#endif /* RE_ENABLE_I18N */
+ if (BE (pstr->mbs_allocated, 0))
+ memmove (pstr->mbs, pstr->mbs + offset,
+ pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+#if DEBUG
+ assert (pstr->valid_len > 0);
+#endif
+ }
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ /* No, skip all characters until IDX. */
+ Idx prev_valid_len = pstr->valid_len;
+
+ if (BE (pstr->offsets_needed, 0))
+ {
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ }
+#endif
+ pstr->valid_len = 0;
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ Idx wcs_idx;
+ wint_t wc = WEOF;
+
+ if (pstr->is_utf8)
+ {
+ const unsigned char *raw, *p, *end;
+
+ /* Special case UTF-8. Multi-byte chars start with any
+ byte other than 0x80 - 0xbf. */
+ raw = pstr->raw_mbs + pstr->raw_mbs_idx;
+ end = raw + (offset - pstr->mb_cur_max);
+ if (end < pstr->raw_mbs)
+ end = pstr->raw_mbs;
+ p = raw + offset - 1;
+#ifdef _LIBC
+ /* We know the wchar_t encoding is UCS4, so for the simple
+ case, ASCII characters, skip the conversion step. */
+ if (isascii (*p) && BE (pstr->trans == NULL, 1))
+ {
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+ /* pstr->valid_len = 0; */
+ wc = (wchar_t) *p;
+ }
+ else
+#endif
+ for (; p >= end; --p)
+ if ((*p & 0xc0) != 0x80)
+ {
+ mbstate_t cur_state;
+ wchar_t wc2;
+ Idx mlen = raw + pstr->len - p;
+ size_t mbclen;
+
+#if 0 /* dead code: buf is set but never used */
+ unsigned char buf[6];
+ if (BE (pstr->trans != NULL, 0))
+ {
+ int i = mlen < 6 ? mlen : 6;
+ while (--i >= 0)
+ buf[i] = pstr->trans[p[i]];
+ }
+#endif
+ /* XXX Don't use mbrtowc, we know which conversion
+ to use (UTF-8 -> UCS4). */
+ memset (&cur_state, 0, sizeof (cur_state));
+ mbclen = __mbrtowc (&wc2, (const char *) p, mlen,
+ &cur_state);
+ if (raw + offset - p <= mbclen
+ && mbclen < (size_t) -2)
+ {
+ memset (&pstr->cur_state, '\0',
+ sizeof (mbstate_t));
+ pstr->valid_len = mbclen - (raw + offset - p);
+ wc = wc2;
+ }
+ break;
+ }
+ }
+
+ if (wc == WEOF)
+ pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx;
+ if (wc == WEOF)
+ pstr->tip_context
+ = re_string_context_at (pstr, prev_valid_len - 1, eflags);
+ else
+ pstr->tip_context = ((BE (pstr->word_ops_used != 0, 0)
+ && IS_WIDE_WORD_CHAR (wc))
+ ? CONTEXT_WORD
+ : ((IS_WIDE_NEWLINE (wc)
+ && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ if (BE (pstr->valid_len, 0))
+ {
+ for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
+ pstr->wcs[wcs_idx] = WEOF;
+ if (pstr->mbs_allocated)
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1];
+ pstr->valid_raw_len = 0;
+ if (pstr->trans)
+ c = pstr->trans[c];
+ pstr->tip_context = (bitset_contain (pstr->word_char, c)
+ ? CONTEXT_WORD
+ : ((IS_NEWLINE (c) && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ }
+ }
+ if (!BE (pstr->mbs_allocated, 0))
+ pstr->mbs += offset;
+ }
+ pstr->raw_mbs_idx = idx;
+ pstr->len -= offset;
+ pstr->stop -= offset;
+
+ /* Then build the buffers. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ if (pstr->icase)
+ {
+ reg_errcode_t ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ else
+ build_wcs_buffer (pstr);
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ if (BE (pstr->mbs_allocated, 0))
+ {
+ if (pstr->icase)
+ build_upper_buffer (pstr);
+ else if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ else
+ pstr->valid_len = pstr->len;
+
+ pstr->cur_idx = 0;
+ return REG_NOERROR;
+}
+
+static unsigned char
+internal_function __attribute ((pure))
+re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
+{
+ int ch;
+ Idx off;
+
+ /* Handle the common (easiest) cases first. */
+ if (BE (!pstr->mbs_allocated, 1))
+ return re_string_peek_byte (pstr, idx);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1
+ && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ off = pstr->cur_idx + idx;
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ off = pstr->offsets[off];
+#endif
+
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I
+ this function returns CAPITAL LETTER I instead of first byte of
+ DOTLESS SMALL LETTER I. The latter would confuse the parser,
+ since peek_byte_case doesn't advance cur_idx in any way. */
+ if (pstr->offsets_needed && !isascii (ch))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ return ch;
+}
+
+static unsigned char
+internal_function __attribute ((pure))
+re_string_fetch_byte_case (re_string_t *pstr)
+{
+ if (BE (!pstr->mbs_allocated, 1))
+ return re_string_fetch_byte (pstr);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ {
+ Idx off;
+ int ch;
+
+ /* For tr_TR.UTF-8 [[:islower:]] there is
+ [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip
+ in that case the whole multi-byte character and return
+ the original letter. On the other side, with
+ [[: DOTLESS SMALL LETTER I return [[:I, as doing
+ anything else would complicate things too much. */
+
+ if (!re_string_first_byte (pstr, pstr->cur_idx))
+ return re_string_fetch_byte (pstr);
+
+ off = pstr->offsets[pstr->cur_idx];
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+ if (! isascii (ch))
+ return re_string_fetch_byte (pstr);
+
+ re_string_skip_bytes (pstr,
+ re_string_char_size_at (pstr, pstr->cur_idx));
+ return ch;
+ }
+#endif
+
+ return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++];
+}
+
+static void
+internal_function
+re_string_destruct (re_string_t *pstr)
+{
+#ifdef RE_ENABLE_I18N
+ re_free (pstr->wcs);
+ re_free (pstr->offsets);
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ re_free (pstr->mbs);
+}
+
+/* Return the context at IDX in INPUT. */
+
+static unsigned int
+internal_function
+re_string_context_at (const re_string_t *input, Idx idx, int eflags)
+{
+ int c;
+ if (BE (! REG_VALID_INDEX (idx), 0))
+ /* In this case, we use the value stored in input->tip_context,
+ since we can't know the character in input->mbs[-1] here. */
+ return input->tip_context;
+ if (BE (idx == input->len, 0))
+ return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
+ : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc;
+ Idx wc_idx = idx;
+ while(input->wcs[wc_idx] == WEOF)
+ {
+#ifdef DEBUG
+ /* It must not happen. */
+ assert (REG_VALID_INDEX (wc_idx));
+#endif
+ --wc_idx;
+ if (! REG_VALID_INDEX (wc_idx))
+ return input->tip_context;
+ }
+ wc = input->wcs[wc_idx];
+ if (BE (input->word_ops_used != 0, 0) && IS_WIDE_WORD_CHAR (wc))
+ return CONTEXT_WORD;
+ return (IS_WIDE_NEWLINE (wc) && input->newline_anchor
+ ? CONTEXT_NEWLINE : 0);
+ }
+ else
+#endif
+ {
+ c = re_string_byte_at (input, idx);
+ if (bitset_contain (input->word_char, c))
+ return CONTEXT_WORD;
+ return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0;
+ }
+}
+
+/* Functions for set operation. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_alloc (re_node_set *set, Idx size)
+{
+ set->alloc = size;
+ set->nelem = 0;
+ set->elems = re_malloc (Idx, size);
+ if (BE (set->elems == NULL, 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_1 (re_node_set *set, Idx elem)
+{
+ set->alloc = 1;
+ set->nelem = 1;
+ set->elems = re_malloc (Idx, 1);
+ if (BE (set->elems == NULL, 0))
+ {
+ set->alloc = set->nelem = 0;
+ return REG_ESPACE;
+ }
+ set->elems[0] = elem;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
+{
+ set->alloc = 2;
+ set->elems = re_malloc (Idx, 2);
+ if (BE (set->elems == NULL, 0))
+ return REG_ESPACE;
+ if (elem1 == elem2)
+ {
+ set->nelem = 1;
+ set->elems[0] = elem1;
+ }
+ else
+ {
+ set->nelem = 2;
+ if (elem1 < elem2)
+ {
+ set->elems[0] = elem1;
+ set->elems[1] = elem2;
+ }
+ else
+ {
+ set->elems[0] = elem2;
+ set->elems[1] = elem1;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
+{
+ dest->nelem = src->nelem;
+ if (src->nelem > 0)
+ {
+ dest->alloc = dest->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (BE (dest->elems == NULL, 0))
+ {
+ dest->alloc = dest->nelem = 0;
+ return REG_ESPACE;
+ }
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ }
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+}
+
+/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded.
+ Note: We assume dest->elems is NULL, when dest->alloc is 0. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, is, id, delta, sbase;
+ if (src1->nelem == 0 || src2->nelem == 0)
+ return REG_NOERROR;
+
+ /* We need dest->nelem + 2 * elems_in_intersection; this is a
+ conservative estimate. */
+ if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
+ {
+ Idx new_alloc = src1->nelem + src2->nelem + dest->alloc;
+ Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc);
+ if (BE (new_elems == NULL, 0))
+ return REG_ESPACE;
+ dest->elems = new_elems;
+ dest->alloc = new_alloc;
+ }
+
+ /* Find the items in the intersection of SRC1 and SRC2, and copy
+ into the top of DEST those that are not already in DEST itself. */
+ sbase = dest->nelem + src1->nelem + src2->nelem;
+ i1 = src1->nelem - 1;
+ i2 = src2->nelem - 1;
+ id = dest->nelem - 1;
+ for (;;)
+ {
+ if (src1->elems[i1] == src2->elems[i2])
+ {
+ /* Try to find the item in DEST. Maybe we could binary search? */
+ while (REG_VALID_INDEX (id) && dest->elems[id] > src1->elems[i1])
+ --id;
+
+ if (! REG_VALID_INDEX (id) || dest->elems[id] != src1->elems[i1])
+ dest->elems[--sbase] = src1->elems[i1];
+
+ if (! REG_VALID_INDEX (--i1) || ! REG_VALID_INDEX (--i2))
+ break;
+ }
+
+ /* Lower the highest of the two items. */
+ else if (src1->elems[i1] < src2->elems[i2])
+ {
+ if (! REG_VALID_INDEX (--i2))
+ break;
+ }
+ else
+ {
+ if (! REG_VALID_INDEX (--i1))
+ break;
+ }
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + src1->nelem + src2->nelem - 1;
+ delta = is - sbase + 1;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place; this is more or
+ less the same loop that is in re_node_set_merge. */
+ dest->nelem += delta;
+ if (delta > 0 && REG_VALID_INDEX (id))
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (! REG_VALID_INDEX (--id))
+ break;
+ }
+ }
+
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx));
+
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets SRC1 and SRC2. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, id;
+ if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
+ {
+ dest->alloc = src1->nelem + src2->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (BE (dest->elems == NULL, 0))
+ return REG_ESPACE;
+ }
+ else
+ {
+ if (src1 != NULL && src1->nelem > 0)
+ return re_node_set_init_copy (dest, src1);
+ else if (src2 != NULL && src2->nelem > 0)
+ return re_node_set_init_copy (dest, src2);
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+ }
+ for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+ {
+ if (src1->elems[i1] > src2->elems[i2])
+ {
+ dest->elems[id++] = src2->elems[i2++];
+ continue;
+ }
+ if (src1->elems[i1] == src2->elems[i2])
+ ++i2;
+ dest->elems[id++] = src1->elems[i1++];
+ }
+ if (i1 < src1->nelem)
+ {
+ memcpy (dest->elems + id, src1->elems + i1,
+ (src1->nelem - i1) * sizeof (Idx));
+ id += src1->nelem - i1;
+ }
+ else if (i2 < src2->nelem)
+ {
+ memcpy (dest->elems + id, src2->elems + i2,
+ (src2->nelem - i2) * sizeof (Idx));
+ id += src2->nelem - i2;
+ }
+ dest->nelem = id;
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets DEST and SRC. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_node_set_merge (re_node_set *dest, const re_node_set *src)
+{
+ Idx is, id, sbase, delta;
+ if (src == NULL || src->nelem == 0)
+ return REG_NOERROR;
+ if (dest->alloc < 2 * src->nelem + dest->nelem)
+ {
+ Idx new_alloc = 2 * (src->nelem + dest->alloc);
+ Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc);
+ if (BE (new_buffer == NULL, 0))
+ return REG_ESPACE;
+ dest->elems = new_buffer;
+ dest->alloc = new_alloc;
+ }
+
+ if (BE (dest->nelem == 0, 0))
+ {
+ dest->nelem = src->nelem;
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ return REG_NOERROR;
+ }
+
+ /* Copy into the top of DEST the items of SRC that are not
+ found in DEST. Maybe we could binary search in DEST? */
+ for (sbase = dest->nelem + 2 * src->nelem,
+ is = src->nelem - 1, id = dest->nelem - 1;
+ REG_VALID_INDEX (is) && REG_VALID_INDEX (id); )
+ {
+ if (dest->elems[id] == src->elems[is])
+ is--, id--;
+ else if (dest->elems[id] < src->elems[is])
+ dest->elems[--sbase] = src->elems[is--];
+ else /* if (dest->elems[id] > src->elems[is]) */
+ --id;
+ }
+
+ if (REG_VALID_INDEX (is))
+ {
+ /* If DEST is exhausted, the remaining items of SRC must be unique. */
+ sbase -= is + 1;
+ memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx));
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + 2 * src->nelem - 1;
+ delta = is - sbase + 1;
+ if (delta == 0)
+ return REG_NOERROR;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place. */
+ dest->nelem += delta;
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (! REG_VALID_INDEX (--id))
+ {
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase,
+ delta * sizeof (Idx));
+ break;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have ELEM.
+ Return true if successful. */
+
+static bool
+internal_function __attribute_warn_unused_result__
+re_node_set_insert (re_node_set *set, Idx elem)
+{
+ Idx idx;
+ /* In case the set is empty. */
+ if (set->alloc == 0)
+ return BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1);
+
+ if (BE (set->nelem, 0) == 0)
+ {
+ /* We already guaranteed above that set->alloc != 0. */
+ set->elems[0] = elem;
+ ++set->nelem;
+ return true;
+ }
+
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = set->alloc * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (BE (new_elems == NULL, 0))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Move the elements which follows the new element. Test the
+ first element separately to skip a check in the inner loop. */
+ if (elem < set->elems[0])
+ {
+ idx = 0;
+ for (idx = set->nelem; idx > 0; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+ else
+ {
+ for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+
+ /* Insert the new element. */
+ set->elems[idx] = elem;
+ ++set->nelem;
+ return true;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have any element greater than or equal to ELEM.
+ Return true if successful. */
+
+static bool
+internal_function __attribute_warn_unused_result__
+re_node_set_insert_last (re_node_set *set, Idx elem)
+{
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = (set->alloc + 1) * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (BE (new_elems == NULL, 0))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Insert the new element. */
+ set->elems[set->nelem++] = elem;
+ return true;
+}
+
+/* Compare two node sets SET1 and SET2.
+ Return true if SET1 and SET2 are equivalent. */
+
+static bool
+internal_function __attribute ((pure))
+re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
+{
+ Idx i;
+ if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
+ return false;
+ for (i = set1->nelem ; REG_VALID_INDEX (--i) ; )
+ if (set1->elems[i] != set2->elems[i])
+ return false;
+ return true;
+}
+
+/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
+
+static Idx
+internal_function __attribute ((pure))
+re_node_set_contains (const re_node_set *set, Idx elem)
+{
+ __re_size_t idx, right, mid;
+ if (! REG_VALID_NONZERO_INDEX (set->nelem))
+ return 0;
+
+ /* Binary search the element. */
+ idx = 0;
+ right = set->nelem - 1;
+ while (idx < right)
+ {
+ mid = (idx + right) / 2;
+ if (set->elems[mid] < elem)
+ idx = mid + 1;
+ else
+ right = mid;
+ }
+ return set->elems[idx] == elem ? idx + 1 : 0;
+}
+
+static void
+internal_function
+re_node_set_remove_at (re_node_set *set, Idx idx)
+{
+ if (idx < 0 || idx >= set->nelem)
+ return;
+ --set->nelem;
+ for (; idx < set->nelem; idx++)
+ set->elems[idx] = set->elems[idx + 1];
+}
+
+
+/* Add the token TOKEN to dfa->nodes, and return the index of the token.
+ Or return REG_MISSING if an error occurred. */
+
+static Idx
+internal_function
+re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
+{
+ if (BE (dfa->nodes_len >= dfa->nodes_alloc, 0))
+ {
+ size_t new_nodes_alloc = dfa->nodes_alloc * 2;
+ Idx *new_nexts, *new_indices;
+ re_node_set *new_edests, *new_eclosures;
+ re_token_t *new_nodes;
+ size_t max_object_size =
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ sizeof (Idx)));
+
+ /* Avoid overflows. */
+ if (BE (SIZE_MAX / 2 / max_object_size < dfa->nodes_alloc, 0))
+ return REG_MISSING;
+
+ new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
+ if (BE (new_nodes == NULL, 0))
+ return REG_MISSING;
+ dfa->nodes = new_nodes;
+ new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc);
+ new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc);
+ new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc);
+ new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc);
+ if (BE (new_nexts == NULL || new_indices == NULL
+ || new_edests == NULL || new_eclosures == NULL, 0))
+ return REG_MISSING;
+ dfa->nexts = new_nexts;
+ dfa->org_indices = new_indices;
+ dfa->edests = new_edests;
+ dfa->eclosures = new_eclosures;
+ dfa->nodes_alloc = new_nodes_alloc;
+ }
+ dfa->nodes[dfa->nodes_len] = token;
+ dfa->nodes[dfa->nodes_len].constraint = 0;
+#ifdef RE_ENABLE_I18N
+ {
+ int type = token.type;
+ dfa->nodes[dfa->nodes_len].accept_mb =
+ (type == OP_PERIOD && dfa->mb_cur_max > 1) || type == COMPLEX_BRACKET;
+ }
+#endif
+ dfa->nexts[dfa->nodes_len] = REG_MISSING;
+ re_node_set_init_empty (dfa->edests + dfa->nodes_len);
+ re_node_set_init_empty (dfa->eclosures + dfa->nodes_len);
+ return dfa->nodes_len++;
+}
+
+static inline re_hashval_t
+internal_function
+calc_state_hash (const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash = nodes->nelem + context;
+ Idx i;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ hash += nodes->elems[i];
+ return hash;
+}
+
+/* Search for the state whose node_set is equivalent to NODES.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#ifdef lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (BE (nodes->nelem == 0, 0))
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, 0);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (hash != state->hash)
+ continue;
+ if (re_node_set_compare (&state->nodes, nodes))
+ return state;
+ }
+
+ /* There are no appropriate state in the dfa, create the new one. */
+ new_state = create_ci_newstate (dfa, nodes, hash);
+ if (BE (new_state == NULL, 0))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Search for the state whose node_set is equivalent to NODES and
+ whose context is equivalent to CONTEXT.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#ifdef lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (nodes->nelem == 0)
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, context);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (state->hash == hash
+ && state->context == context
+ && re_node_set_compare (state->entrance_nodes, nodes))
+ return state;
+ }
+ /* There are no appropriate state in `dfa', create the new one. */
+ new_state = create_cd_newstate (dfa, nodes, context, hash);
+ if (BE (new_state == NULL, 0))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Finish initialization of the new state NEWSTATE, and using its hash value
+ HASH put in the appropriate bucket of DFA's state table. Return value
+ indicates the error code if failed. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
+ re_hashval_t hash)
+{
+ struct re_state_table_entry *spot;
+ reg_errcode_t err;
+ Idx i;
+
+ newstate->hash = hash;
+ err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ for (i = 0; i < newstate->nodes.nelem; i++)
+ {
+ Idx elem = newstate->nodes.elems[i];
+ if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
+ if (BE (! re_node_set_insert_last (&newstate->non_eps_nodes, elem), 0))
+ return REG_ESPACE;
+ }
+
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+ if (BE (spot->alloc <= spot->num, 0))
+ {
+ Idx new_alloc = 2 * spot->num + 2;
+ re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
+ new_alloc);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ spot->array = new_array;
+ spot->alloc = new_alloc;
+ }
+ spot->array[spot->num++] = newstate;
+ return REG_NOERROR;
+}
+
+static void
+free_state (re_dfastate_t *state)
+{
+ re_node_set_free (&state->non_eps_nodes);
+ re_node_set_free (&state->inveclosure);
+ if (state->entrance_nodes != &state->nodes)
+ {
+ re_node_set_free (state->entrance_nodes);
+ re_free (state->entrance_nodes);
+ }
+ re_node_set_free (&state->nodes);
+ re_free (state->word_trtable);
+ re_free (state->trtable);
+ re_free (state);
+}
+
+/* Create the new state which is independ of contexts.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ re_hashval_t hash)
+{
+ Idx i;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->entrance_nodes = &newstate->nodes;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ if (type == CHARACTER && !node->constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+ else if (type == ANCHOR || node->constraint)
+ newstate->has_constraint = 1;
+ }
+ err = register_state (dfa, newstate, hash);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
+
+/* Create the new state which is depend on the context CONTEXT.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ unsigned int context, re_hashval_t hash)
+{
+ Idx i, nctx_nodes = 0;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (BE (newstate == NULL, 0))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->context = context;
+ newstate->entrance_nodes = &newstate->nodes;
+
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ if (type == CHARACTER && !constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+
+ if (constraint)
+ {
+ if (newstate->entrance_nodes == &newstate->nodes)
+ {
+ newstate->entrance_nodes = re_malloc (re_node_set, 1);
+ if (BE (newstate->entrance_nodes == NULL, 0))
+ {
+ free_state (newstate);
+ return NULL;
+ }
+ if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
+ != REG_NOERROR)
+ return NULL;
+ nctx_nodes = 0;
+ newstate->has_constraint = 1;
+ }
+
+ if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
+ {
+ re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
+ ++nctx_nodes;
+ }
+ }
+ }
+ err = register_state (dfa, newstate, hash);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
diff --git a/gnulib/lib/regex_internal.h b/gnulib/lib/regex_internal.h
new file mode 100644
index 0000000..20cc833
--- /dev/null
+++ b/gnulib/lib/regex_internal.h
@@ -0,0 +1,866 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <langinfo.h>
+#ifndef _LIBC
+# include "localcharset.h"
+#endif
+#include <locale.h>
+
+#include <wchar.h>
+#include <wctype.h>
+#include <stdint.h>
+#if defined _LIBC
+# include <bits/libc-lock.h>
+#else
+# define __libc_lock_init(NAME) do { } while (0)
+# define __libc_lock_lock(NAME) do { } while (0)
+# define __libc_lock_unlock(NAME) do { } while (0)
+#endif
+
+/* In case that the system doesn't have isblank(). */
+#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+# define _RE_DEFINE_LOCALE_FUNCTIONS 1
+# include <locale/localeinfo.h>
+# include <locale/elem-hash.h>
+# include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages. */
+#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+# undef gettext
+# define gettext(msgid) \
+ INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+ strings. */
+# define gettext_noop(String) String
+#endif
+
+/* For loser systems without the definition. */
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#if (defined MB_CUR_MAX && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC
+# define RE_ENABLE_I18N
+#endif
+
+#if __GNUC__ >= 3
+# define BE(expr, val) __builtin_expect (expr, val)
+#else
+# define BE(expr, val) (expr)
+# ifdef _LIBC
+# define inline
+# endif
+#endif
+
+/* Number of ASCII characters. */
+#define ASCII_CHARS 0x80
+
+/* Number of single byte characters. */
+#define SBC_MAX (UCHAR_MAX + 1)
+
+#define COLL_ELEM_LEN_MAX 8
+
+/* The character which represents newline. */
+#define NEWLINE_CHAR '\n'
+#define WIDE_NEWLINE_CHAR L'\n'
+
+/* Rename to standard API for using out of glibc. */
+#ifndef _LIBC
+# define __wctype wctype
+# define __iswctype iswctype
+# define __btowc btowc
+# define __wcrtomb wcrtomb
+# define __mbrtowc mbrtowc
+# define __regfree regfree
+# define attribute_hidden
+#endif /* not _LIBC */
+
+#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
+# define __attribute(arg) __attribute__ (arg)
+#else
+# define __attribute(arg)
+#endif
+
+typedef __re_idx_t Idx;
+
+/* Special return value for failure to match. */
+#define REG_MISSING ((Idx) -1)
+
+/* Special return value for internal error. */
+#define REG_ERROR ((Idx) -2)
+
+/* Test whether N is a valid index, and is not one of the above. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_INDEX(n) ((Idx) (n) < REG_ERROR)
+#else
+# define REG_VALID_INDEX(n) (0 <= (n))
+#endif
+
+/* Test whether N is a valid nonzero index. */
+#ifdef _REGEX_LARGE_OFFSETS
+# define REG_VALID_NONZERO_INDEX(n) ((Idx) ((n) - 1) < (Idx) (REG_ERROR - 1))
+#else
+# define REG_VALID_NONZERO_INDEX(n) (0 < (n))
+#endif
+
+/* A hash value, suitable for computing hash tables. */
+typedef __re_size_t re_hashval_t;
+
+/* An integer used to represent a set of bits. It must be unsigned,
+ and must be at least as wide as unsigned int. */
+typedef unsigned long int bitset_word_t;
+/* All bits set in a bitset_word_t. */
+#define BITSET_WORD_MAX ULONG_MAX
+
+/* Number of bits in a bitset_word_t. For portability to hosts with
+ padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)';
+ instead, deduce it directly from BITSET_WORD_MAX. Avoid
+ greater-than-32-bit integers and unconditional shifts by more than
+ 31 bits, as they're not portable. */
+#if BITSET_WORD_MAX == 0xffffffffUL
+# define BITSET_WORD_BITS 32
+#elif BITSET_WORD_MAX >> 31 >> 4 == 1
+# define BITSET_WORD_BITS 36
+#elif BITSET_WORD_MAX >> 31 >> 16 == 1
+# define BITSET_WORD_BITS 48
+#elif BITSET_WORD_MAX >> 31 >> 28 == 1
+# define BITSET_WORD_BITS 60
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
+# define BITSET_WORD_BITS 64
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
+# define BITSET_WORD_BITS 72
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
+# define BITSET_WORD_BITS 128
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
+# define BITSET_WORD_BITS 256
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
+# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
+# if BITSET_WORD_BITS <= SBC_MAX
+# error "Invalid SBC_MAX"
+# endif
+#else
+# error "Add case for new bitset_word_t size"
+#endif
+
+/* Number of bitset_word_t values in a bitset_t. */
+#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
+
+typedef bitset_word_t bitset_t[BITSET_WORDS];
+typedef bitset_word_t *re_bitset_ptr_t;
+typedef const bitset_word_t *re_const_bitset_ptr_t;
+
+#define PREV_WORD_CONSTRAINT 0x0001
+#define PREV_NOTWORD_CONSTRAINT 0x0002
+#define NEXT_WORD_CONSTRAINT 0x0004
+#define NEXT_NOTWORD_CONSTRAINT 0x0008
+#define PREV_NEWLINE_CONSTRAINT 0x0010
+#define NEXT_NEWLINE_CONSTRAINT 0x0020
+#define PREV_BEGBUF_CONSTRAINT 0x0040
+#define NEXT_ENDBUF_CONSTRAINT 0x0080
+#define WORD_DELIM_CONSTRAINT 0x0100
+#define NOT_WORD_DELIM_CONSTRAINT 0x0200
+
+typedef enum
+{
+ INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
+ LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
+ BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
+ BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
+ WORD_DELIM = WORD_DELIM_CONSTRAINT,
+ NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
+} re_context_type;
+
+typedef struct
+{
+ Idx alloc;
+ Idx nelem;
+ Idx *elems;
+} re_node_set;
+
+typedef enum
+{
+ NON_TYPE = 0,
+
+ /* Node type, These are used by token, node, tree. */
+ CHARACTER = 1,
+ END_OF_RE = 2,
+ SIMPLE_BRACKET = 3,
+ OP_BACK_REF = 4,
+ OP_PERIOD = 5,
+#ifdef RE_ENABLE_I18N
+ COMPLEX_BRACKET = 6,
+ OP_UTF8_PERIOD = 7,
+#endif /* RE_ENABLE_I18N */
+
+ /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
+ when the debugger shows values of this enum type. */
+#define EPSILON_BIT 8
+ OP_OPEN_SUBEXP = EPSILON_BIT | 0,
+ OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
+ OP_ALT = EPSILON_BIT | 2,
+ OP_DUP_ASTERISK = EPSILON_BIT | 3,
+ ANCHOR = EPSILON_BIT | 4,
+
+ /* Tree type, these are used only by tree. */
+ CONCAT = 16,
+ SUBEXP = 17,
+
+ /* Token type, these are used only by token. */
+ OP_DUP_PLUS = 18,
+ OP_DUP_QUESTION,
+ OP_OPEN_BRACKET,
+ OP_CLOSE_BRACKET,
+ OP_CHARSET_RANGE,
+ OP_OPEN_DUP_NUM,
+ OP_CLOSE_DUP_NUM,
+ OP_NON_MATCH_LIST,
+ OP_OPEN_COLL_ELEM,
+ OP_CLOSE_COLL_ELEM,
+ OP_OPEN_EQUIV_CLASS,
+ OP_CLOSE_EQUIV_CLASS,
+ OP_OPEN_CHAR_CLASS,
+ OP_CLOSE_CHAR_CLASS,
+ OP_WORD,
+ OP_NOTWORD,
+ OP_SPACE,
+ OP_NOTSPACE,
+ BACK_SLASH
+
+} re_token_type_t;
+
+#ifdef RE_ENABLE_I18N
+typedef struct
+{
+ /* Multibyte characters. */
+ wchar_t *mbchars;
+
+ /* Collating symbols. */
+# ifdef _LIBC
+ int32_t *coll_syms;
+# endif
+
+ /* Equivalence classes. */
+# ifdef _LIBC
+ int32_t *equiv_classes;
+# endif
+
+ /* Range expressions. */
+# ifdef _LIBC
+ uint32_t *range_starts;
+ uint32_t *range_ends;
+# else /* not _LIBC */
+ wchar_t *range_starts;
+ wchar_t *range_ends;
+# endif /* not _LIBC */
+
+ /* Character classes. */
+ wctype_t *char_classes;
+
+ /* If this character set is the non-matching list. */
+ unsigned int non_match : 1;
+
+ /* # of multibyte characters. */
+ Idx nmbchars;
+
+ /* # of collating symbols. */
+ Idx ncoll_syms;
+
+ /* # of equivalence classes. */
+ Idx nequiv_classes;
+
+ /* # of range expressions. */
+ Idx nranges;
+
+ /* # of character classes. */
+ Idx nchar_classes;
+} re_charset_t;
+#endif /* RE_ENABLE_I18N */
+
+typedef struct
+{
+ union
+ {
+ unsigned char c; /* for CHARACTER */
+ re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset; /* for COMPLEX_BRACKET */
+#endif /* RE_ENABLE_I18N */
+ Idx idx; /* for BACK_REF */
+ re_context_type ctx_type; /* for ANCHOR */
+ } opr;
+#if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+ re_token_type_t type : 8;
+#else
+ re_token_type_t type;
+#endif
+ unsigned int constraint : 10; /* context constraint */
+ unsigned int duplicated : 1;
+ unsigned int opt_subexp : 1;
+#ifdef RE_ENABLE_I18N
+ unsigned int accept_mb : 1;
+ /* These 2 bits can be moved into the union if needed (e.g. if running out
+ of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */
+ unsigned int mb_partial : 1;
+#endif
+ unsigned int word_char : 1;
+} re_token_t;
+
+#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
+
+struct re_string_t
+{
+ /* Indicate the raw buffer which is the original string passed as an
+ argument of regexec(), re_search(), etc.. */
+ const unsigned char *raw_mbs;
+ /* Store the multibyte string. In case of "case insensitive mode" like
+ REG_ICASE, upper cases of the string are stored, otherwise MBS points
+ the same address that RAW_MBS points. */
+ unsigned char *mbs;
+#ifdef RE_ENABLE_I18N
+ /* Store the wide character string which is corresponding to MBS. */
+ wint_t *wcs;
+ Idx *offsets;
+ mbstate_t cur_state;
+#endif
+ /* Index in RAW_MBS. Each character mbs[i] corresponds to
+ raw_mbs[raw_mbs_idx + i]. */
+ Idx raw_mbs_idx;
+ /* The length of the valid characters in the buffers. */
+ Idx valid_len;
+ /* The corresponding number of bytes in raw_mbs array. */
+ Idx valid_raw_len;
+ /* The length of the buffers MBS and WCS. */
+ Idx bufs_len;
+ /* The index in MBS, which is updated by re_string_fetch_byte. */
+ Idx cur_idx;
+ /* length of RAW_MBS array. */
+ Idx raw_len;
+ /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */
+ Idx len;
+ /* End of the buffer may be shorter than its length in the cases such
+ as re_match_2, re_search_2. Then, we use STOP for end of the buffer
+ instead of LEN. */
+ Idx raw_stop;
+ /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */
+ Idx stop;
+
+ /* The context of mbs[0]. We store the context independently, since
+ the context of mbs[0] may be different from raw_mbs[0], which is
+ the beginning of the input string. */
+ unsigned int tip_context;
+ /* The translation passed as a part of an argument of re_compile_pattern. */
+ RE_TRANSLATE_TYPE trans;
+ /* Copy of re_dfa_t's word_char. */
+ re_const_bitset_ptr_t word_char;
+ /* true if REG_ICASE. */
+ unsigned char icase;
+ unsigned char is_utf8;
+ unsigned char map_notascii;
+ unsigned char mbs_allocated;
+ unsigned char offsets_needed;
+ unsigned char newline_anchor;
+ unsigned char word_ops_used;
+ int mb_cur_max;
+};
+typedef struct re_string_t re_string_t;
+
+
+struct re_dfa_t;
+typedef struct re_dfa_t re_dfa_t;
+
+#ifndef _LIBC
+# define internal_function
+#endif
+
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+ Idx new_buf_len)
+ internal_function;
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr) internal_function;
+static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr) internal_function;
+static void re_string_translate_buffer (re_string_t *pstr) internal_function;
+static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
+ int eflags)
+ internal_function __attribute ((pure));
+#define re_string_peek_byte(pstr, offset) \
+ ((pstr)->mbs[(pstr)->cur_idx + offset])
+#define re_string_fetch_byte(pstr) \
+ ((pstr)->mbs[(pstr)->cur_idx++])
+#define re_string_first_byte(pstr, idx) \
+ ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
+#define re_string_is_single_byte_char(pstr, idx) \
+ ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
+ || (pstr)->wcs[(idx) + 1] != WEOF))
+#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
+#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
+#define re_string_get_buffer(pstr) ((pstr)->mbs)
+#define re_string_length(pstr) ((pstr)->len)
+#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
+#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
+#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
+
+#include <alloca.h>
+
+#ifndef _LIBC
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc. */
+# define __libc_use_alloca(n) 0
+# undef alloca
+# define alloca(n) malloc (n)
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+
+#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
+#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
+#define re_free(p) free (p)
+
+struct bin_tree_t
+{
+ struct bin_tree_t *parent;
+ struct bin_tree_t *left;
+ struct bin_tree_t *right;
+ struct bin_tree_t *first;
+ struct bin_tree_t *next;
+
+ re_token_t token;
+
+ /* `node_idx' is the index in dfa->nodes, if `type' == 0.
+ Otherwise `type' indicate the type of this node. */
+ Idx node_idx;
+};
+typedef struct bin_tree_t bin_tree_t;
+
+#define BIN_TREE_STORAGE_SIZE \
+ ((1024 - sizeof (void *)) / sizeof (bin_tree_t))
+
+struct bin_tree_storage_t
+{
+ struct bin_tree_storage_t *next;
+ bin_tree_t data[BIN_TREE_STORAGE_SIZE];
+};
+typedef struct bin_tree_storage_t bin_tree_storage_t;
+
+#define CONTEXT_WORD 1
+#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
+#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
+#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
+
+#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
+#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
+#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
+#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
+#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
+
+#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
+#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
+#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_')
+#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
+
+#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
+ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
+ || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
+
+#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
+ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
+ || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
+
+struct re_dfastate_t
+{
+ re_hashval_t hash;
+ re_node_set nodes;
+ re_node_set non_eps_nodes;
+ re_node_set inveclosure;
+ re_node_set *entrance_nodes;
+ struct re_dfastate_t **trtable, **word_trtable;
+ unsigned int context : 4;
+ unsigned int halt : 1;
+ /* If this state can accept `multi byte'.
+ Note that we refer to multibyte characters, and multi character
+ collating elements as `multi byte'. */
+ unsigned int accept_mb : 1;
+ /* If this state has backreference node(s). */
+ unsigned int has_backref : 1;
+ unsigned int has_constraint : 1;
+};
+typedef struct re_dfastate_t re_dfastate_t;
+
+struct re_state_table_entry
+{
+ Idx num;
+ Idx alloc;
+ re_dfastate_t **array;
+};
+
+/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */
+
+typedef struct
+{
+ Idx next_idx;
+ Idx alloc;
+ re_dfastate_t **array;
+} state_array_t;
+
+/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */
+
+typedef struct
+{
+ Idx node;
+ Idx str_idx; /* The position NODE match at. */
+ state_array_t path;
+} re_sub_match_last_t;
+
+/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
+ And information about the node, whose type is OP_CLOSE_SUBEXP,
+ corresponding to NODE is stored in LASTS. */
+
+typedef struct
+{
+ Idx str_idx;
+ Idx node;
+ state_array_t *path;
+ Idx alasts; /* Allocation size of LASTS. */
+ Idx nlasts; /* The number of LASTS. */
+ re_sub_match_last_t **lasts;
+} re_sub_match_top_t;
+
+struct re_backref_cache_entry
+{
+ Idx node;
+ Idx str_idx;
+ Idx subexp_from;
+ Idx subexp_to;
+ char more;
+ char unused;
+ unsigned short int eps_reachable_subexps_map;
+};
+
+typedef struct
+{
+ /* The string object corresponding to the input string. */
+ re_string_t input;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ const re_dfa_t *const dfa;
+#else
+ const re_dfa_t *dfa;
+#endif
+ /* EFLAGS of the argument of regexec. */
+ int eflags;
+ /* Where the matching ends. */
+ Idx match_last;
+ Idx last_node;
+ /* The state log used by the matcher. */
+ re_dfastate_t **state_log;
+ Idx state_log_top;
+ /* Back reference cache. */
+ Idx nbkref_ents;
+ Idx abkref_ents;
+ struct re_backref_cache_entry *bkref_ents;
+ int max_mb_elem_len;
+ Idx nsub_tops;
+ Idx asub_tops;
+ re_sub_match_top_t **sub_tops;
+} re_match_context_t;
+
+typedef struct
+{
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **limited_states;
+ Idx last_node;
+ Idx last_str_idx;
+ re_node_set limits;
+} re_sift_context_t;
+
+struct re_fail_stack_ent_t
+{
+ Idx idx;
+ Idx node;
+ regmatch_t *regs;
+ re_node_set eps_via_nodes;
+};
+
+struct re_fail_stack_t
+{
+ Idx num;
+ Idx alloc;
+ struct re_fail_stack_ent_t *stack;
+};
+
+struct re_dfa_t
+{
+ re_token_t *nodes;
+ size_t nodes_alloc;
+ size_t nodes_len;
+ Idx *nexts;
+ Idx *org_indices;
+ re_node_set *edests;
+ re_node_set *eclosures;
+ re_node_set *inveclosures;
+ struct re_state_table_entry *state_table;
+ re_dfastate_t *init_state;
+ re_dfastate_t *init_state_word;
+ re_dfastate_t *init_state_nl;
+ re_dfastate_t *init_state_begbuf;
+ bin_tree_t *str_tree;
+ bin_tree_storage_t *str_tree_storage;
+ re_bitset_ptr_t sb_char;
+ int str_tree_storage_idx;
+
+ /* number of subexpressions `re_nsub' is in regex_t. */
+ re_hashval_t state_hash_mask;
+ Idx init_node;
+ Idx nbackref; /* The number of backreference in this dfa. */
+
+ /* Bitmap expressing which backreference is used. */
+ bitset_word_t used_bkref_map;
+ bitset_word_t completed_bkref_map;
+
+ unsigned int has_plural_match : 1;
+ /* If this dfa has "multibyte node", which is a backreference or
+ a node which can accept multibyte character or multi character
+ collating element. */
+ unsigned int has_mb_node : 1;
+ unsigned int is_utf8 : 1;
+ unsigned int map_notascii : 1;
+ unsigned int word_ops_used : 1;
+ int mb_cur_max;
+ bitset_t word_char;
+ reg_syntax_t syntax;
+ Idx *subexp_map;
+#ifdef DEBUG
+ char* re_str;
+#endif
+#ifdef _LIBC
+ __libc_lock_define (, lock)
+#endif
+};
+
+#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
+#define re_node_set_remove(set,id) \
+ (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
+#define re_node_set_empty(p) ((p)->nelem = 0)
+#define re_node_set_free(set) re_free ((set)->elems)
+
+
+typedef enum
+{
+ SB_CHAR,
+ MB_CHAR,
+ EQUIV_CLASS,
+ COLL_SYM,
+ CHAR_CLASS
+} bracket_elem_type;
+
+typedef struct
+{
+ bracket_elem_type type;
+ union
+ {
+ unsigned char ch;
+ unsigned char *name;
+ wchar_t wch;
+ } opr;
+} bracket_elem_t;
+
+
+/* Inline functions for bitset_t operation. */
+
+static inline void
+bitset_set (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
+}
+
+static inline void
+bitset_clear (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
+}
+
+static inline bool
+bitset_contain (const bitset_t set, Idx i)
+{
+ return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
+}
+
+static inline void
+bitset_empty (bitset_t set)
+{
+ memset (set, '\0', sizeof (bitset_t));
+}
+
+static inline void
+bitset_set_all (bitset_t set)
+{
+ memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
+}
+
+static inline void
+bitset_copy (bitset_t dest, const bitset_t src)
+{
+ memcpy (dest, src, sizeof (bitset_t));
+}
+
+static inline void
+bitset_not (bitset_t set)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
+ set[bitset_i] = ~set[bitset_i];
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
+ & ~set[BITSET_WORDS - 1]);
+}
+
+static inline void
+bitset_merge (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] |= src[bitset_i];
+}
+
+static inline void
+bitset_mask (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] &= src[bitset_i];
+}
+
+#ifdef RE_ENABLE_I18N
+/* Inline functions for re_string. */
+static inline int
+internal_function __attribute ((pure))
+re_string_char_size_at (const re_string_t *pstr, Idx idx)
+{
+ int byte_idx;
+ if (pstr->mb_cur_max == 1)
+ return 1;
+ for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
+ if (pstr->wcs[idx + byte_idx] != WEOF)
+ break;
+ return byte_idx;
+}
+
+static inline wint_t
+internal_function __attribute ((pure))
+re_string_wchar_at (const re_string_t *pstr, Idx idx)
+{
+ if (pstr->mb_cur_max == 1)
+ return (wint_t) pstr->mbs[idx];
+ return (wint_t) pstr->wcs[idx];
+}
+
+static int
+internal_function __attribute ((pure))
+re_string_elem_size_at (const re_string_t *pstr, Idx idx)
+{
+# ifdef _LIBC
+ const unsigned char *p, *extra;
+ const int32_t *table, *indirect;
+ int32_t tmp;
+# include <locale/weight.h>
+ uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+
+ if (nrules != 0)
+ {
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ p = pstr->mbs + idx;
+ tmp = findidx (&p);
+ return p - pstr->mbs - idx;
+ }
+ else
+# endif /* _LIBC */
+ return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#if __GNUC_PREREQ (3,4)
+# undef __attribute_warn_unused_result__
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+
+#endif /* _REGEX_INTERNAL_H */
diff --git a/gnulib/lib/regexec.c b/gnulib/lib/regexec.c
new file mode 100644
index 0000000..7776f9b
--- /dev/null
+++ b/gnulib/lib/regexec.c
@@ -0,0 +1,4417 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+ Idx n) internal_function;
+static void match_ctx_clean (re_match_context_t *mctx) internal_function;
+static void match_ctx_free (re_match_context_t *cache) internal_function;
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
+ Idx str_idx, Idx from, Idx to)
+ internal_function;
+static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+ internal_function;
+static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
+ Idx str_idx) internal_function;
+static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
+ Idx node, Idx str_idx)
+ internal_function;
+static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node,
+ Idx last_str_idx)
+ internal_function;
+static reg_errcode_t re_search_internal (const regex_t *preg,
+ const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop,
+ size_t nmatch, regmatch_t pmatch[],
+ int eflags) internal_function;
+static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,
+ const char *string1, Idx length1,
+ const char *string2, Idx length2,
+ Idx start, regoff_t range,
+ struct re_registers *regs,
+ Idx stop, bool ret_len) internal_function;
+static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
+ const char *string, Idx length, Idx start,
+ regoff_t range, Idx stop,
+ struct re_registers *regs,
+ bool ret_len) internal_function;
+static unsigned int re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+ Idx nregs, int regs_allocated)
+ internal_function;
+static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)
+ internal_function;
+static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first) internal_function;
+static Idx check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+ internal_function;
+static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node,
+ Idx cur_idx, Idx nmatch) internal_function;
+static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
+ Idx str_idx, Idx dest_node, Idx nregs,
+ regmatch_t *regs,
+ re_node_set *eps_via_nodes)
+ internal_function;
+static reg_errcode_t set_regs (const regex_t *preg,
+ const re_match_context_t *mctx,
+ size_t nmatch, regmatch_t *pmatch,
+ bool fl_backtrack) internal_function;
+static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs)
+ internal_function;
+
+#ifdef RE_ENABLE_I18N
+static int sift_states_iter_mb (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
+ re_sift_context_t *sctx)
+ internal_function;
+static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *cur_dest)
+ internal_function;
+static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx,
+ re_node_set *dest_nodes)
+ internal_function;
+static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates)
+ internal_function;
+static bool check_dst_limits (const re_match_context_t *mctx,
+ const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node,
+ Idx src_idx) internal_function;
+static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
+ int boundaries, Idx subexp_idx,
+ Idx from_node, Idx bkref_idx)
+ internal_function;
+static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
+ Idx limit, Idx subexp_idx,
+ Idx node, Idx str_idx,
+ Idx bkref_idx) internal_function;
+static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates,
+ re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents,
+ Idx str_idx) internal_function;
+static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates)
+ internal_function;
+static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
+ re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+ internal_function;
+static re_dfastate_t *find_recover_state (reg_errcode_t *err,
+ re_match_context_t *mctx) internal_function;
+static re_dfastate_t *transit_state (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *state) internal_function;
+static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+ internal_function;
+static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
+ re_node_set *cur_nodes,
+ Idx str_idx) internal_function;
+#if 0
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
+ re_dfastate_t *pstate)
+ internal_function;
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
+ const re_node_set *nodes)
+ internal_function;
+static reg_errcode_t get_subexp (re_match_context_t *mctx,
+ Idx bkref_node, Idx bkref_str_idx)
+ internal_function;
+static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
+ const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last,
+ Idx bkref_node, Idx bkref_str)
+ internal_function;
+static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type) internal_function;
+static reg_errcode_t check_arrival (re_match_context_t *mctx,
+ state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str,
+ int type) internal_function;
+static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
+ Idx str_idx,
+ re_node_set *cur_nodes,
+ re_node_set *next_nodes)
+ internal_function;
+static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
+ re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+ internal_function;
+static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,
+ re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp,
+ int type) internal_function;
+static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
+ re_node_set *cur_nodes, Idx cur_str,
+ Idx subexp_num, int type)
+ internal_function;
+static bool build_trtable (const re_dfa_t *dfa,
+ re_dfastate_t *state) internal_function;
+#ifdef RE_ENABLE_I18N
+static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx idx)
+ internal_function;
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+ size_t name_len)
+ internal_function;
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
+ const re_dfastate_t *state,
+ re_node_set *states_node,
+ bitset_t *states_ch) internal_function;
+static bool check_node_accept (const re_match_context_t *mctx,
+ const re_token_t *node, Idx idx)
+ internal_function;
+static reg_errcode_t extend_buffers (re_match_context_t *mctx)
+ internal_function;
+
+/* Entry point for POSIX code. */
+
+/* regexec searches for a given pattern, specified by PREG, in the
+ string STRING.
+
+ If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+ `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
+ least NMATCH elements, and we set them to the offsets of the
+ corresponding matched substrings.
+
+ EFLAGS specifies `execution flags' which affect matching: if
+ REG_NOTBOL is set, then ^ does not match at the beginning of the
+ string; if REG_NOTEOL is set, then $ does not match at the end.
+
+ We return 0 if we find a match and REG_NOMATCH if not. */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+ const regex_t *_Restrict_ preg;
+ const char *_Restrict_ string;
+ size_t nmatch;
+ regmatch_t pmatch[_Restrict_arr_];
+ int eflags;
+{
+ reg_errcode_t err;
+ Idx start, length;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+#endif
+
+ if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
+ return REG_BADPAT;
+
+ if (eflags & REG_STARTEND)
+ {
+ start = pmatch[0].rm_so;
+ length = pmatch[0].rm_eo;
+ }
+ else
+ {
+ start = 0;
+ length = strlen (string);
+ }
+
+ __libc_lock_lock (dfa->lock);
+ if (preg->no_sub)
+ err = re_search_internal (preg, string, length, start, length,
+ length, 0, NULL, eflags);
+ else
+ err = re_search_internal (preg, string, length, start, length,
+ length, nmatch, pmatch, eflags);
+ __libc_lock_unlock (dfa->lock);
+ return err != REG_NOERROR;
+}
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+__typeof__ (__regexec) __compat_regexec;
+
+int
+attribute_compat_text_section
+__compat_regexec (const regex_t *_Restrict_ preg,
+ const char *_Restrict_ string, size_t nmatch,
+ regmatch_t pmatch[], int eflags)
+{
+ return regexec (preg, string, nmatch, pmatch,
+ eflags & (REG_NOTBOL | REG_NOTEOL));
+}
+compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);
+# endif
+#endif
+
+/* Entry points for GNU code. */
+
+/* re_match, re_search, re_match_2, re_search_2
+
+ The former two functions operate on STRING with length LENGTH,
+ while the later two operate on concatenation of STRING1 and STRING2
+ with lengths LENGTH1 and LENGTH2, respectively.
+
+ re_match() matches the compiled pattern in BUFP against the string,
+ starting at index START.
+
+ re_search() first tries matching at index START, then it tries to match
+ starting from index START + 1, and so on. The last start position tried
+ is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same
+ way as re_match().)
+
+ The parameter STOP of re_{match,search}_2 specifies that no match exceeding
+ the first STOP characters of the concatenation of the strings should be
+ concerned.
+
+ If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
+ and all groups is stored in REGS. (For the "_2" variants, the offsets are
+ computed relative to the concatenation, not relative to the individual
+ strings.)
+
+ On success, re_match* functions return the length of the match, re_search*
+ return the position of the start of the match. Return value -1 means no
+ match was found and -2 indicates an internal error. */
+
+regoff_t
+re_match (bufp, string, length, start, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, start;
+ struct re_registers *regs;
+{
+ return re_search_stub (bufp, string, length, start, 0, length, regs, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match, re_match)
+#endif
+
+regoff_t
+re_search (bufp, string, length, start, range, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string;
+ Idx length, start;
+ regoff_t range;
+ struct re_registers *regs;
+{
+ return re_search_stub (bufp, string, length, start, range, length, regs,
+ false);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+regoff_t
+re_match_2 (bufp, string1, length1, string2, length2, start, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ struct re_registers *regs;
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, 0, regs, stop, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+regoff_t
+re_search_2 (bufp, string1, length1, string2, length2, start, range, regs, stop)
+ struct re_pattern_buffer *bufp;
+ const char *string1, *string2;
+ Idx length1, length2, start, stop;
+ regoff_t range;
+ struct re_registers *regs;
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, range, regs, stop, false);
+}
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+static regoff_t
+internal_function
+re_search_2_stub (struct re_pattern_buffer *bufp,
+ const char *string1, Idx length1,
+ const char *string2, Idx length2,
+ Idx start, regoff_t range, struct re_registers *regs,
+ Idx stop, bool ret_len)
+{
+ const char *str;
+ regoff_t rval;
+ Idx len = length1 + length2;
+ char *s = NULL;
+
+ if (BE (length1 < 0 || length2 < 0 || stop < 0 || len < length1, 0))
+ return -2;
+
+ /* Concatenate the strings. */
+ if (length2 > 0)
+ if (length1 > 0)
+ {
+ s = re_malloc (char, len);
+
+ if (BE (s == NULL, 0))
+ return -2;
+#ifdef _LIBC
+ memcpy (__mempcpy (s, string1, length1), string2, length2);
+#else
+ memcpy (s, string1, length1);
+ memcpy (s + length1, string2, length2);
+#endif
+ str = s;
+ }
+ else
+ str = string2;
+ else
+ str = string1;
+
+ rval = re_search_stub (bufp, str, len, start, range, stop, regs,
+ ret_len);
+ re_free (s);
+ return rval;
+}
+
+/* The parameters have the same meaning as those of re_search.
+ Additional parameters:
+ If RET_LEN is true the length of the match is returned (re_match style);
+ otherwise the position of the match is returned. */
+
+static regoff_t
+internal_function
+re_search_stub (struct re_pattern_buffer *bufp,
+ const char *string, Idx length,
+ Idx start, regoff_t range, Idx stop, struct re_registers *regs,
+ bool ret_len)
+{
+ reg_errcode_t result;
+ regmatch_t *pmatch;
+ Idx nregs;
+ regoff_t rval;
+ int eflags = 0;
+#ifdef _LIBC
+ re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+#endif
+ Idx last_start = start + range;
+
+ /* Check for out-of-range. */
+ if (BE (start < 0 || start > length, 0))
+ return -1;
+ if (BE (length < last_start || (0 <= range && last_start < start), 0))
+ last_start = length;
+ else if (BE (last_start < 0 || (range < 0 && start <= last_start), 0))
+ last_start = 0;
+
+ __libc_lock_lock (dfa->lock);
+
+ eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
+ eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
+
+ /* Compile fastmap if we haven't yet. */
+ if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate)
+ re_compile_fastmap (bufp);
+
+ if (BE (bufp->no_sub, 0))
+ regs = NULL;
+
+ /* We need at least 1 register. */
+ if (regs == NULL)
+ nregs = 1;
+ else if (BE (bufp->regs_allocated == REGS_FIXED
+ && regs->num_regs <= bufp->re_nsub, 0))
+ {
+ nregs = regs->num_regs;
+ if (BE (nregs < 1, 0))
+ {
+ /* Nothing can be copied to regs. */
+ regs = NULL;
+ nregs = 1;
+ }
+ }
+ else
+ nregs = bufp->re_nsub + 1;
+ pmatch = re_malloc (regmatch_t, nregs);
+ if (BE (pmatch == NULL, 0))
+ {
+ rval = -2;
+ goto out;
+ }
+
+ result = re_search_internal (bufp, string, length, start, last_start, stop,
+ nregs, pmatch, eflags);
+
+ rval = 0;
+
+ /* I hope we needn't fill ther regs with -1's when no match was found. */
+ if (result != REG_NOERROR)
+ rval = -1;
+ else if (regs != NULL)
+ {
+ /* If caller wants register contents data back, copy them. */
+ bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
+ bufp->regs_allocated);
+ if (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0))
+ rval = -2;
+ }
+
+ if (BE (rval == 0, 1))
+ {
+ if (ret_len)
+ {
+ assert (pmatch[0].rm_so == start);
+ rval = pmatch[0].rm_eo - start;
+ }
+ else
+ rval = pmatch[0].rm_so;
+ }
+ re_free (pmatch);
+ out:
+ __libc_lock_unlock (dfa->lock);
+ return rval;
+}
+
+static unsigned int
+internal_function
+re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
+ int regs_allocated)
+{
+ int rval = REGS_REALLOCATE;
+ Idx i;
+ Idx need_regs = nregs + 1;
+ /* We need one extra element beyond `num_regs' for the `-1' marker GNU code
+ uses. */
+
+ /* Have the register data arrays been allocated? */
+ if (regs_allocated == REGS_UNALLOCATED)
+ { /* No. So allocate them with malloc. */
+ regs->start = re_malloc (regoff_t, need_regs);
+ if (BE (regs->start == NULL, 0))
+ return REGS_UNALLOCATED;
+ regs->end = re_malloc (regoff_t, need_regs);
+ if (BE (regs->end == NULL, 0))
+ {
+ re_free (regs->start);
+ return REGS_UNALLOCATED;
+ }
+ regs->num_regs = need_regs;
+ }
+ else if (regs_allocated == REGS_REALLOCATE)
+ { /* Yes. If we need more elements than were already
+ allocated, reallocate them. If we need fewer, just
+ leave it alone. */
+ if (BE (need_regs > regs->num_regs, 0))
+ {
+ regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
+ regoff_t *new_end;
+ if (BE (new_start == NULL, 0))
+ return REGS_UNALLOCATED;
+ new_end = re_realloc (regs->end, regoff_t, need_regs);
+ if (BE (new_end == NULL, 0))
+ {
+ re_free (new_start);
+ return REGS_UNALLOCATED;
+ }
+ regs->start = new_start;
+ regs->end = new_end;
+ regs->num_regs = need_regs;
+ }
+ }
+ else
+ {
+ assert (regs_allocated == REGS_FIXED);
+ /* This function may not be called with REGS_FIXED and nregs too big. */
+ assert (regs->num_regs >= nregs);
+ rval = REGS_FIXED;
+ }
+
+ /* Copy the regs. */
+ for (i = 0; i < nregs; ++i)
+ {
+ regs->start[i] = pmatch[i].rm_so;
+ regs->end[i] = pmatch[i].rm_eo;
+ }
+ for ( ; i < regs->num_regs; ++i)
+ regs->start[i] = regs->end[i] = -1;
+
+ return rval;
+}
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
+ this memory for recording register information. STARTS and ENDS
+ must be allocated using the malloc library routine, and must each
+ be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ PATTERN_BUFFER will allocate its own register data, without
+ freeing the old data. */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+ struct re_pattern_buffer *bufp;
+ struct re_registers *regs;
+ __re_size_t num_regs;
+ regoff_t *starts, *ends;
+{
+ if (num_regs)
+ {
+ bufp->regs_allocated = REGS_REALLOCATE;
+ regs->num_regs = num_regs;
+ regs->start = starts;
+ regs->end = ends;
+ }
+ else
+ {
+ bufp->regs_allocated = REGS_UNALLOCATED;
+ regs->num_regs = 0;
+ regs->start = regs->end = NULL;
+ }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+int
+# ifdef _LIBC
+weak_function
+# endif
+re_exec (s)
+ const char *s;
+{
+ return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
+}
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point. */
+
+/* Searches for a compiled pattern PREG in the string STRING, whose
+ length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same
+ meaning as with regexec. LAST_START is START + RANGE, where
+ START and RANGE have the same meaning as with re_search.
+ Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
+ otherwise return the error code.
+ Note: We assume front end functions already check ranges.
+ (0 <= LAST_START && LAST_START <= LENGTH) */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+re_search_internal (const regex_t *preg,
+ const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop,
+ size_t nmatch, regmatch_t pmatch[],
+ int eflags)
+{
+ reg_errcode_t err;
+ const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
+ Idx left_lim, right_lim;
+ int incr;
+ bool fl_longest_match;
+ int match_kind;
+ Idx match_first;
+ Idx match_last = REG_MISSING;
+ Idx extra_nmatch;
+ bool sb;
+ int ch;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+ re_match_context_t mctx = { .dfa = dfa };
+#else
+ re_match_context_t mctx;
+#endif
+ char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
+ && start != last_start && !preg->can_be_null)
+ ? preg->fastmap : NULL);
+ RE_TRANSLATE_TYPE t = preg->translate;
+
+#if !(defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+ memset (&mctx, '\0', sizeof (re_match_context_t));
+ mctx.dfa = dfa;
+#endif
+
+ extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
+ nmatch -= extra_nmatch;
+
+ /* Check if the DFA haven't been compiled. */
+ if (BE (preg->used == 0 || dfa->init_state == NULL
+ || dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL, 0))
+ return REG_NOMATCH;
+
+#ifdef DEBUG
+ /* We assume front-end functions already check them. */
+ assert (0 <= last_start && last_start <= length);
+#endif
+
+ /* If initial states with non-begbuf contexts have no elements,
+ the regex must be anchored. If preg->newline_anchor is set,
+ we'll never use init_state_nl, so do not check it. */
+ if (dfa->init_state->nodes.nelem == 0
+ && dfa->init_state_word->nodes.nelem == 0
+ && (dfa->init_state_nl->nodes.nelem == 0
+ || !preg->newline_anchor))
+ {
+ if (start != 0 && last_start != 0)
+ return REG_NOMATCH;
+ start = last_start = 0;
+ }
+
+ /* We must check the longest matching, if nmatch > 0. */
+ fl_longest_match = (nmatch != 0 || dfa->nbackref);
+
+ err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1,
+ preg->translate, (preg->syntax & RE_ICASE) != 0,
+ dfa);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ mctx.input.stop = stop;
+ mctx.input.raw_stop = stop;
+ mctx.input.newline_anchor = preg->newline_anchor;
+
+ err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* We will log all the DFA states through which the dfa pass,
+ if nmatch > 1, or this dfa has "multibyte node", which is a
+ back-reference or a node which can accept multibyte character or
+ multi character collating element. */
+ if (nmatch > 1 || dfa->has_mb_node)
+ {
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= mctx.input.bufs_len, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+
+ mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
+ if (BE (mctx.state_log == NULL, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ }
+ else
+ mctx.state_log = NULL;
+
+ match_first = start;
+ mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
+
+ /* Check incrementally whether of not the input string match. */
+ incr = (last_start < start) ? -1 : 1;
+ left_lim = (last_start < start) ? last_start : start;
+ right_lim = (last_start < start) ? start : last_start;
+ sb = dfa->mb_cur_max == 1;
+ match_kind =
+ (fastmap
+ ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0)
+ | (start <= last_start ? 2 : 0)
+ | (t != NULL ? 1 : 0))
+ : 8);
+
+ for (;; match_first += incr)
+ {
+ err = REG_NOMATCH;
+ if (match_first < left_lim || right_lim < match_first)
+ goto free_return;
+
+ /* Advance as rapidly as possible through the string, until we
+ find a plausible place to start matching. This may be done
+ with varying efficiency, so there are various possibilities:
+ only the most common of them are specialized, in order to
+ save on code size. We use a switch statement for speed. */
+ switch (match_kind)
+ {
+ case 8:
+ /* No fastmap. */
+ break;
+
+ case 7:
+ /* Fastmap with single-byte translation, match forward. */
+ while (BE (match_first < right_lim, 1)
+ && !fastmap[t[(unsigned char) string[match_first]]])
+ ++match_first;
+ goto forward_match_found_start_or_reached_end;
+
+ case 6:
+ /* Fastmap without translation, match forward. */
+ while (BE (match_first < right_lim, 1)
+ && !fastmap[(unsigned char) string[match_first]])
+ ++match_first;
+
+ forward_match_found_start_or_reached_end:
+ if (BE (match_first == right_lim, 0))
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (!fastmap[t ? t[ch] : ch])
+ goto free_return;
+ }
+ break;
+
+ case 4:
+ case 5:
+ /* Fastmap without multi-byte translation, match backwards. */
+ while (match_first >= left_lim)
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (fastmap[t ? t[ch] : ch])
+ break;
+ --match_first;
+ }
+ if (match_first < left_lim)
+ goto free_return;
+ break;
+
+ default:
+ /* In this case, we can't determine easily the current byte,
+ since it might be a component byte of a multibyte
+ character. Then we use the constructed buffer instead. */
+ for (;;)
+ {
+ /* If MATCH_FIRST is out of the valid range, reconstruct the
+ buffers. */
+ __re_size_t offset = match_first - mctx.input.raw_mbs_idx;
+ if (BE (offset >= (__re_size_t) mctx.input.valid_raw_len, 0))
+ {
+ err = re_string_reconstruct (&mctx.input, match_first,
+ eflags);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ offset = match_first - mctx.input.raw_mbs_idx;
+ }
+ /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+ Note that MATCH_FIRST must not be smaller than 0. */
+ ch = (match_first >= length
+ ? 0 : re_string_byte_at (&mctx.input, offset));
+ if (fastmap[ch])
+ break;
+ match_first += incr;
+ if (match_first < left_lim || match_first > right_lim)
+ {
+ err = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ break;
+ }
+
+ /* Reconstruct the buffers so that the matcher can assume that
+ the matching starts from the beginning of the buffer. */
+ err = re_string_reconstruct (&mctx.input, match_first, eflags);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* Don't consider this char as a possible match start if it part,
+ yet isn't the head, of a multibyte character. */
+ if (!sb && !re_string_first_byte (&mctx.input, 0))
+ continue;
+#endif
+
+ /* It seems to be appropriate one, then use the matcher. */
+ /* We assume that the matching starts from 0. */
+ mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
+ match_last = check_matching (&mctx, fl_longest_match,
+ start <= last_start ? &match_first : NULL);
+ if (match_last != REG_MISSING)
+ {
+ if (BE (match_last == REG_ERROR, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ else
+ {
+ mctx.match_last = match_last;
+ if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
+ {
+ re_dfastate_t *pstate = mctx.state_log[match_last];
+ mctx.last_node = check_halt_state_context (&mctx, pstate,
+ match_last);
+ }
+ if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ err = prune_impossible_nodes (&mctx);
+ if (err == REG_NOERROR)
+ break;
+ if (BE (err != REG_NOMATCH, 0))
+ goto free_return;
+ match_last = REG_MISSING;
+ }
+ else
+ break; /* We found a match. */
+ }
+ }
+
+ match_ctx_clean (&mctx);
+ }
+
+#ifdef DEBUG
+ assert (match_last != REG_MISSING);
+ assert (err == REG_NOERROR);
+#endif
+
+ /* Set pmatch[] if we need. */
+ if (nmatch > 0)
+ {
+ Idx reg_idx;
+
+ /* Initialize registers. */
+ for (reg_idx = 1; reg_idx < nmatch; ++reg_idx)
+ pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
+
+ /* Set the points where matching start/end. */
+ pmatch[0].rm_so = 0;
+ pmatch[0].rm_eo = mctx.match_last;
+ /* FIXME: This function should fail if mctx.match_last exceeds
+ the maximum possible regoff_t value. We need a new error
+ code REG_OVERFLOW. */
+
+ if (!preg->no_sub && nmatch > 1)
+ {
+ err = set_regs (preg, &mctx, nmatch, pmatch,
+ dfa->has_plural_match && dfa->nbackref > 0);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+
+ /* At last, add the offset to the each registers, since we slided
+ the buffers so that we could assume that the matching starts
+ from 0. */
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so != -1)
+ {
+#ifdef RE_ENABLE_I18N
+ if (BE (mctx.input.offsets_needed != 0, 0))
+ {
+ pmatch[reg_idx].rm_so =
+ (pmatch[reg_idx].rm_so == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_so]);
+ pmatch[reg_idx].rm_eo =
+ (pmatch[reg_idx].rm_eo == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_eo]);
+ }
+#else
+ assert (mctx.input.offsets_needed == 0);
+#endif
+ pmatch[reg_idx].rm_so += match_first;
+ pmatch[reg_idx].rm_eo += match_first;
+ }
+ for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx)
+ {
+ pmatch[nmatch + reg_idx].rm_so = -1;
+ pmatch[nmatch + reg_idx].rm_eo = -1;
+ }
+
+ if (dfa->subexp_map)
+ for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
+ if (dfa->subexp_map[reg_idx] != reg_idx)
+ {
+ pmatch[reg_idx + 1].rm_so
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
+ pmatch[reg_idx + 1].rm_eo
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
+ }
+ }
+
+ free_return:
+ re_free (mctx.state_log);
+ if (dfa->nbackref)
+ match_ctx_free (&mctx);
+ re_string_destruct (&mctx.input);
+ return err;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+prune_impossible_nodes (re_match_context_t *mctx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx halt_node, match_last;
+ reg_errcode_t ret;
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **lim_states = NULL;
+ re_sift_context_t sctx;
+#ifdef DEBUG
+ assert (mctx->state_log != NULL);
+#endif
+ match_last = mctx->match_last;
+ halt_node = mctx->last_node;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= match_last, 0))
+ return REG_ESPACE;
+
+ sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (sifted_states == NULL, 0))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ if (dfa->nbackref)
+ {
+ lim_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (BE (lim_states == NULL, 0))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ while (1)
+ {
+ memset (lim_states, '\0',
+ sizeof (re_dfastate_t *) * (match_last + 1));
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
+ match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ if (sifted_states[0] != NULL || lim_states[0] != NULL)
+ break;
+ do
+ {
+ --match_last;
+ if (! REG_VALID_INDEX (match_last))
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ } while (mctx->state_log[match_last] == NULL
+ || !mctx->state_log[match_last]->halt);
+ halt_node = check_halt_state_context (mctx,
+ mctx->state_log[match_last],
+ match_last);
+ }
+ ret = merge_state_array (dfa, sifted_states, lim_states,
+ match_last + 1);
+ re_free (lim_states);
+ lim_states = NULL;
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ }
+ else
+ {
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (BE (ret != REG_NOERROR, 0))
+ goto free_return;
+ if (sifted_states[0] == NULL)
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ re_free (mctx->state_log);
+ mctx->state_log = sifted_states;
+ sifted_states = NULL;
+ mctx->last_node = halt_node;
+ mctx->match_last = match_last;
+ ret = REG_NOERROR;
+ free_return:
+ re_free (sifted_states);
+ re_free (lim_states);
+ return ret;
+}
+
+/* Acquire an initial state and return it.
+ We must select appropriate initial state depending on the context,
+ since initial states may have constraints like "\<", "^", etc.. */
+
+static inline re_dfastate_t *
+__attribute ((always_inline)) internal_function
+acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
+ Idx idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ if (dfa->init_state->has_constraint)
+ {
+ unsigned int context;
+ context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return dfa->init_state_word;
+ else if (IS_ORDINARY_CONTEXT (context))
+ return dfa->init_state;
+ else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_begbuf;
+ else if (IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_nl;
+ else if (IS_BEGBUF_CONTEXT (context))
+ {
+ /* It is relatively rare case, then calculate on demand. */
+ return re_acquire_state_context (err, dfa,
+ dfa->init_state->entrance_nodes,
+ context);
+ }
+ else
+ /* Must not happen? */
+ return dfa->init_state;
+ }
+ else
+ return dfa->init_state;
+}
+
+/* Check whether the regular expression match input string INPUT or not,
+ and return the index where the matching end. Return REG_MISSING if
+ there is no match, and return REG_ERROR in case of an error.
+ FL_LONGEST_MATCH means we want the POSIX longest matching.
+ If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
+ next place where we may want to try matching.
+ Note that the matcher assume that the maching starts from the current
+ index of the buffer. */
+
+static Idx
+internal_function __attribute_warn_unused_result__
+check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx match = 0;
+ Idx match_last = REG_MISSING;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+ re_dfastate_t *cur_state;
+ bool at_init_state = p_match_first != NULL;
+ Idx next_start_idx = cur_str_idx;
+
+ err = REG_NOERROR;
+ cur_state = acquire_init_state_context (&err, mctx, cur_str_idx);
+ /* An initial state must not be NULL (invalid). */
+ if (BE (cur_state == NULL, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+
+ if (mctx->state_log != NULL)
+ {
+ mctx->state_log[cur_str_idx] = cur_state;
+
+ /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
+ later. E.g. Processing back references. */
+ if (BE (dfa->nbackref, 0))
+ {
+ at_init_state = false;
+ err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (cur_state->has_backref)
+ {
+ err = transit_state_bkref (mctx, &cur_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+
+ /* If the RE accepts NULL string. */
+ if (BE (cur_state->halt, 0))
+ {
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state, cur_str_idx))
+ {
+ if (!fl_longest_match)
+ return cur_str_idx;
+ else
+ {
+ match_last = cur_str_idx;
+ match = 1;
+ }
+ }
+ }
+
+ while (!re_string_eoi (&mctx->input))
+ {
+ re_dfastate_t *old_state = cur_state;
+ Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
+
+ if (BE (next_char_idx >= mctx->input.bufs_len, 0)
+ || (BE (next_char_idx >= mctx->input.valid_len, 0)
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ assert (err == REG_ESPACE);
+ return REG_ERROR;
+ }
+ }
+
+ cur_state = transit_state (&err, mctx, cur_state);
+ if (mctx->state_log != NULL)
+ cur_state = merge_state_with_log (&err, mctx, cur_state);
+
+ if (cur_state == NULL)
+ {
+ /* Reached the invalid state or an error. Try to recover a valid
+ state using the state log, if available and if we have not
+ already found a valid (even if not the longest) match. */
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ERROR;
+
+ if (mctx->state_log == NULL
+ || (match && !fl_longest_match)
+ || (cur_state = find_recover_state (&err, mctx)) == NULL)
+ break;
+ }
+
+ if (BE (at_init_state, 0))
+ {
+ if (old_state == cur_state)
+ next_start_idx = next_char_idx;
+ else
+ at_init_state = false;
+ }
+
+ if (cur_state->halt)
+ {
+ /* Reached a halt state.
+ Check the halt state can satisfy the current context. */
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state,
+ re_string_cur_idx (&mctx->input)))
+ {
+ /* We found an appropriate halt state. */
+ match_last = re_string_cur_idx (&mctx->input);
+ match = 1;
+
+ /* We found a match, do not modify match_first below. */
+ p_match_first = NULL;
+ if (!fl_longest_match)
+ break;
+ }
+ }
+ }
+
+ if (p_match_first)
+ *p_match_first += next_start_idx;
+
+ return match_last;
+}
+
+/* Check NODE match the current context. */
+
+static bool
+internal_function
+check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context)
+{
+ re_token_type_t type = dfa->nodes[node].type;
+ unsigned int constraint = dfa->nodes[node].constraint;
+ if (type != END_OF_RE)
+ return false;
+ if (!constraint)
+ return true;
+ if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
+ return false;
+ return true;
+}
+
+/* Check the halt state STATE match the current context.
+ Return 0 if not match, if the node, STATE has, is a halt node and
+ match the context, return the node. */
+
+static Idx
+internal_function
+check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+{
+ Idx i;
+ unsigned int context;
+#ifdef DEBUG
+ assert (state->halt);
+#endif
+ context = re_string_context_at (&mctx->input, idx, mctx->eflags);
+ for (i = 0; i < state->nodes.nelem; ++i)
+ if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context))
+ return state->nodes.elems[i];
+ return 0;
+}
+
+/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
+ corresponding to the DFA).
+ Return the destination node, and update EPS_VIA_NODES;
+ return REG_MISSING in case of errors. */
+
+static Idx
+internal_function
+proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs,
+ Idx *pidx, Idx node, re_node_set *eps_via_nodes,
+ struct re_fail_stack_t *fs)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx i;
+ bool ok;
+ if (IS_EPSILON_NODE (dfa->nodes[node].type))
+ {
+ re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
+ re_node_set *edests = &dfa->edests[node];
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (BE (! ok, 0))
+ return REG_ERROR;
+ /* Pick up a valid destination, or return REG_MISSING if none
+ is found. */
+ for (dest_node = REG_MISSING, i = 0; i < edests->nelem; ++i)
+ {
+ Idx candidate = edests->elems[i];
+ if (!re_node_set_contains (cur_nodes, candidate))
+ continue;
+ if (dest_node == REG_MISSING)
+ dest_node = candidate;
+
+ else
+ {
+ /* In order to avoid infinite loop like "(a*)*", return the second
+ epsilon-transition if the first was already considered. */
+ if (re_node_set_contains (eps_via_nodes, dest_node))
+ return candidate;
+
+ /* Otherwise, push the second epsilon-transition on the fail stack. */
+ else if (fs != NULL
+ && push_fail_stack (fs, *pidx, candidate, nregs, regs,
+ eps_via_nodes))
+ return REG_ERROR;
+
+ /* We know we are going to exit. */
+ break;
+ }
+ }
+ return dest_node;
+ }
+ else
+ {
+ Idx naccepted = 0;
+ re_token_type_t type = dfa->nodes[node].type;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->nodes[node].accept_mb)
+ naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (type == OP_BACK_REF)
+ {
+ Idx subexp_idx = dfa->nodes[node].opr.idx + 1;
+ naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+ if (fs != NULL)
+ {
+ if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
+ return REG_MISSING;
+ else if (naccepted)
+ {
+ char *buf = (char *) re_string_get_buffer (&mctx->input);
+ if (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+ naccepted) != 0)
+ return REG_MISSING;
+ }
+ }
+
+ if (naccepted == 0)
+ {
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (BE (! ok, 0))
+ return REG_ERROR;
+ dest_node = dfa->edests[node].elems[0];
+ if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node))
+ return dest_node;
+ }
+ }
+
+ if (naccepted != 0
+ || check_node_accept (mctx, dfa->nodes + node, *pidx))
+ {
+ Idx dest_node = dfa->nexts[node];
+ *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
+ if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
+ || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node)))
+ return REG_MISSING;
+ re_node_set_empty (eps_via_nodes);
+ return dest_node;
+ }
+ }
+ return REG_MISSING;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
+ Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ reg_errcode_t err;
+ Idx num = fs->num++;
+ if (fs->num == fs->alloc)
+ {
+ struct re_fail_stack_ent_t *new_array;
+ new_array = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t)
+ * fs->alloc * 2));
+ if (new_array == NULL)
+ return REG_ESPACE;
+ fs->alloc *= 2;
+ fs->stack = new_array;
+ }
+ fs->stack[num].idx = str_idx;
+ fs->stack[num].node = dest_node;
+ fs->stack[num].regs = re_malloc (regmatch_t, nregs);
+ if (fs->stack[num].regs == NULL)
+ return REG_ESPACE;
+ memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
+ err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
+ return err;
+}
+
+static Idx
+internal_function
+pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs,
+ regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ Idx num = --fs->num;
+ assert (REG_VALID_INDEX (num));
+ *pidx = fs->stack[num].idx;
+ memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
+ re_node_set_free (eps_via_nodes);
+ re_free (fs->stack[num].regs);
+ *eps_via_nodes = fs->stack[num].eps_via_nodes;
+ return fs->stack[num].node;
+}
+
+/* Set the positions where the subexpressions are starts/ends to registers
+ PMATCH.
+ Note: We assume that pmatch[0] is already set, and
+ pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
+ regmatch_t *pmatch, bool fl_backtrack)
+{
+ const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
+ Idx idx, cur_node;
+ re_node_set eps_via_nodes;
+ struct re_fail_stack_t *fs;
+ struct re_fail_stack_t fs_body = { 0, 2, NULL };
+ regmatch_t *prev_idx_match;
+ bool prev_idx_match_malloced = false;
+
+#ifdef DEBUG
+ assert (nmatch > 1);
+ assert (mctx->state_log != NULL);
+#endif
+ if (fl_backtrack)
+ {
+ fs = &fs_body;
+ fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
+ if (fs->stack == NULL)
+ return REG_ESPACE;
+ }
+ else
+ fs = NULL;
+
+ cur_node = dfa->init_node;
+ re_node_set_init_empty (&eps_via_nodes);
+
+ if (__libc_use_alloca (nmatch * sizeof (regmatch_t)))
+ prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t));
+ else
+ {
+ prev_idx_match = re_malloc (regmatch_t, nmatch);
+ if (prev_idx_match == NULL)
+ {
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ prev_idx_match_malloced = true;
+ }
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+
+ for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
+ {
+ update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch);
+
+ if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
+ {
+ Idx reg_idx;
+ if (fs)
+ {
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
+ break;
+ if (reg_idx == nmatch)
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+ }
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ }
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOERROR;
+ }
+ }
+
+ /* Proceed to next node. */
+ cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node,
+ &eps_via_nodes, fs);
+
+ if (BE (! REG_VALID_INDEX (cur_node), 0))
+ {
+ if (BE (cur_node == REG_ERROR, 0))
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ if (fs)
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOMATCH;
+ }
+ }
+ }
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+}
+
+static reg_errcode_t
+internal_function
+free_fail_stack_return (struct re_fail_stack_t *fs)
+{
+ if (fs)
+ {
+ Idx fs_idx;
+ for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
+ {
+ re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
+ re_free (fs->stack[fs_idx].regs);
+ }
+ re_free (fs->stack);
+ }
+ return REG_NOERROR;
+}
+
+static void
+internal_function
+update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch)
+{
+ int type = dfa->nodes[cur_node].type;
+ if (type == OP_OPEN_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+
+ /* We are at the first node of this sub expression. */
+ if (reg_num < nmatch)
+ {
+ pmatch[reg_num].rm_so = cur_idx;
+ pmatch[reg_num].rm_eo = -1;
+ }
+ }
+ else if (type == OP_CLOSE_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+ if (reg_num < nmatch)
+ {
+ /* We are at the last node of this sub expression. */
+ if (pmatch[reg_num].rm_so < cur_idx)
+ {
+ pmatch[reg_num].rm_eo = cur_idx;
+ /* This is a non-empty match or we are not inside an optional
+ subexpression. Accept this right away. */
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+ }
+ else
+ {
+ if (dfa->nodes[cur_node].opt_subexp
+ && prev_idx_match[reg_num].rm_so != -1)
+ /* We transited through an empty match for an optional
+ subexpression, like (a?)*, and this is not the subexp's
+ first match. Copy back the old content of the registers
+ so that matches of an inner subexpression are undone as
+ well, like in ((a?))*. */
+ memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch);
+ else
+ /* We completed a subexpression, but it may be part of
+ an optional one, so do not update PREV_IDX_MATCH. */
+ pmatch[reg_num].rm_eo = cur_idx;
+ }
+ }
+ }
+}
+
+/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
+ and sift the nodes in each states according to the following rules.
+ Updated state_log will be wrote to STATE_LOG.
+
+ Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if...
+ 1. When STR_IDX == MATCH_LAST(the last index in the state_log):
+ If `a' isn't the LAST_NODE and `a' can't epsilon transit to
+ the LAST_NODE, we throw away the node `a'.
+ 2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts
+ string `s' and transit to `b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
+ away the node `a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
+ thrown away, we throw away the node `a'.
+ 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
+ node `a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
+ we throw away the node `a'. */
+
+#define STATE_NODE_CONTAINS(state,node) \
+ ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
+
+static reg_errcode_t
+internal_function
+sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
+{
+ reg_errcode_t err;
+ int null_cnt = 0;
+ Idx str_idx = sctx->last_str_idx;
+ re_node_set cur_dest;
+
+#ifdef DEBUG
+ assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+#endif
+
+ /* Build sifted state_log[str_idx]. It has the nodes which can epsilon
+ transit to the last_node and the last_node itself. */
+ err = re_node_set_init_1 (&cur_dest, sctx->last_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* Then check each states in the state_log. */
+ while (str_idx > 0)
+ {
+ /* Update counters. */
+ null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
+ if (null_cnt > mctx->max_mb_elem_len)
+ {
+ memset (sctx->sifted_states, '\0',
+ sizeof (re_dfastate_t *) * str_idx);
+ re_node_set_free (&cur_dest);
+ return REG_NOERROR;
+ }
+ re_node_set_empty (&cur_dest);
+ --str_idx;
+
+ if (mctx->state_log[str_idx])
+ {
+ err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+
+ /* Add all the nodes which satisfy the following conditions:
+ - It can epsilon transit to a node in CUR_DEST.
+ - It is in CUR_SRC.
+ And update state_log. */
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ err = REG_NOERROR;
+ free_return:
+ re_node_set_free (&cur_dest);
+ return err;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, re_node_set *cur_dest)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes;
+ Idx i;
+
+ /* Then build the next sifted state.
+ We build the next sifted state on `cur_dest', and update
+ `sifted_states[str_idx]' with `cur_dest'.
+ Note:
+ `cur_dest' is the sifted state from `state_log[str_idx + 1]'.
+ `cur_src' points the node_set of the old `state_log[str_idx]'
+ (with the epsilon nodes pre-filtered out). */
+ for (i = 0; i < cur_src->nelem; i++)
+ {
+ Idx prev_node = cur_src->elems[i];
+ int naccepted = 0;
+ bool ok;
+
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[prev_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept `multi byte'. */
+ if (dfa->nodes[prev_node].accept_mb)
+ naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
+ str_idx, sctx->last_str_idx);
+#endif /* RE_ENABLE_I18N */
+
+ /* We don't check backreferences here.
+ See update_cur_sifted_state(). */
+ if (!naccepted
+ && check_node_accept (mctx, dfa->nodes + prev_node, str_idx)
+ && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
+ dfa->nexts[prev_node]))
+ naccepted = 1;
+
+ if (naccepted == 0)
+ continue;
+
+ if (sctx->limits.nelem)
+ {
+ Idx to_idx = str_idx + naccepted;
+ if (check_dst_limits (mctx, &sctx->limits,
+ dfa->nexts[prev_node], to_idx,
+ prev_node, str_idx))
+ continue;
+ }
+ ok = re_node_set_insert (cur_dest, prev_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions. */
+
+static reg_errcode_t
+internal_function
+clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
+{
+ Idx top = mctx->state_log_top;
+
+ if (next_state_log_idx >= mctx->input.bufs_len
+ || (next_state_log_idx >= mctx->input.valid_len
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ reg_errcode_t err;
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (top < next_state_log_idx)
+ {
+ memset (mctx->state_log + top + 1, '\0',
+ sizeof (re_dfastate_t *) * (next_state_log_idx - top));
+ mctx->state_log_top = next_state_log_idx;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+{
+ Idx st_idx;
+ reg_errcode_t err;
+ for (st_idx = 0; st_idx < num; ++st_idx)
+ {
+ if (dst[st_idx] == NULL)
+ dst[st_idx] = src[st_idx];
+ else if (src[st_idx] != NULL)
+ {
+ re_node_set merged_set;
+ err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
+ &src[st_idx]->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+ re_node_set_free (&merged_set);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function
+update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *dest_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ const re_node_set *candidates;
+ candidates = ((mctx->state_log[str_idx] == NULL) ? NULL
+ : &mctx->state_log[str_idx]->nodes);
+
+ if (dest_nodes->nelem == 0)
+ sctx->sifted_states[str_idx] = NULL;
+ else
+ {
+ if (candidates)
+ {
+ /* At first, add the nodes which can epsilon transit to a node in
+ DEST_NODE. */
+ err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ /* Then, check the limitations in the current sift_context. */
+ if (sctx->limits.nelem)
+ {
+ err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
+ mctx->bkref_ents, str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+
+ sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (candidates && mctx->state_log[str_idx]->has_backref)
+ {
+ err = sift_states_bkref (mctx, sctx, str_idx, candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ reg_errcode_t err = REG_NOERROR;
+ Idx i;
+
+ re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ if (!state->inveclosure.alloc)
+ {
+ err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ for (i = 0; i < dest_nodes->nelem; i++)
+ {
+ err = re_node_set_merge (&state->inveclosure,
+ dfa->inveclosures + dest_nodes->elems[i]);
+ if (BE (err != REG_NOERROR, 0))
+ return REG_ESPACE;
+ }
+ }
+ return re_node_set_add_intersect (dest_nodes, candidates,
+ &state->inveclosure);
+}
+
+static reg_errcode_t
+internal_function
+sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ Idx ecl_idx;
+ reg_errcode_t err;
+ re_node_set *inv_eclosure = dfa->inveclosures + node;
+ re_node_set except_nodes;
+ re_node_set_init_empty (&except_nodes);
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (cur_node == node)
+ continue;
+ if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
+ {
+ Idx edst1 = dfa->edests[cur_node].elems[0];
+ Idx edst2 = ((dfa->edests[cur_node].nelem > 1)
+ ? dfa->edests[cur_node].elems[1] : REG_MISSING);
+ if ((!re_node_set_contains (inv_eclosure, edst1)
+ && re_node_set_contains (dest_nodes, edst1))
+ || (REG_VALID_NONZERO_INDEX (edst2)
+ && !re_node_set_contains (inv_eclosure, edst2)
+ && re_node_set_contains (dest_nodes, edst2)))
+ {
+ err = re_node_set_add_intersect (&except_nodes, candidates,
+ dfa->inveclosures + cur_node);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&except_nodes);
+ return err;
+ }
+ }
+ }
+ }
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (!re_node_set_contains (&except_nodes, cur_node))
+ {
+ Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1;
+ re_node_set_remove_at (dest_nodes, idx);
+ }
+ }
+ re_node_set_free (&except_nodes);
+ return REG_NOERROR;
+}
+
+static bool
+internal_function
+check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx lim_idx, src_pos, dst_pos;
+
+ Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx);
+ Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx);
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = mctx->bkref_ents + limits->elems[lim_idx];
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+
+ dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, dst_node, dst_idx,
+ dst_bkref_idx);
+ src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, src_node, src_idx,
+ src_bkref_idx);
+
+ /* In case of:
+ <src> <dst> ( <subexp> )
+ ( <subexp> ) <src> <dst>
+ ( <subexp1> <src> <subexp2> <dst> <subexp3> ) */
+ if (src_pos == dst_pos)
+ continue; /* This is unrelated limitation. */
+ else
+ return true;
+ }
+ return false;
+}
+
+static int
+internal_function
+check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
+ Idx subexp_idx, Idx from_node, Idx bkref_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *eclosures = dfa->eclosures + from_node;
+ Idx node_idx;
+
+ /* Else, we are on the boundary: examine the nodes on the epsilon
+ closure. */
+ for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
+ {
+ Idx node = eclosures->elems[node_idx];
+ switch (dfa->nodes[node].type)
+ {
+ case OP_BACK_REF:
+ if (bkref_idx != REG_MISSING)
+ {
+ struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
+ do
+ {
+ Idx dst;
+ int cpos;
+
+ if (ent->node != node)
+ continue;
+
+ if (subexp_idx < BITSET_WORD_BITS
+ && !(ent->eps_reachable_subexps_map
+ & ((bitset_word_t) 1 << subexp_idx)))
+ continue;
+
+ /* Recurse trying to reach the OP_OPEN_SUBEXP and
+ OP_CLOSE_SUBEXP cases below. But, if the
+ destination node is the same node as the source
+ node, don't recurse because it would cause an
+ infinite loop: a regex that exhibits this behavior
+ is ()\1*\1* */
+ dst = dfa->edests[node].elems[0];
+ if (dst == from_node)
+ {
+ if (boundaries & 1)
+ return -1;
+ else /* if (boundaries & 2) */
+ return 0;
+ }
+
+ cpos =
+ check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ dst, bkref_idx);
+ if (cpos == -1 /* && (boundaries & 1) */)
+ return -1;
+ if (cpos == 0 && (boundaries & 2))
+ return 0;
+
+ if (subexp_idx < BITSET_WORD_BITS)
+ ent->eps_reachable_subexps_map
+ &= ~((bitset_word_t) 1 << subexp_idx);
+ }
+ while (ent++->more);
+ }
+ break;
+
+ case OP_OPEN_SUBEXP:
+ if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx)
+ return -1;
+ break;
+
+ case OP_CLOSE_SUBEXP:
+ if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx)
+ return 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return (boundaries & 2) ? 1 : 0;
+}
+
+static int
+internal_function
+check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit,
+ Idx subexp_idx, Idx from_node, Idx str_idx,
+ Idx bkref_idx)
+{
+ struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
+ int boundaries;
+
+ /* If we are outside the range of the subexpression, return -1 or 1. */
+ if (str_idx < lim->subexp_from)
+ return -1;
+
+ if (lim->subexp_to < str_idx)
+ return 1;
+
+ /* If we are within the subexpression, return 0. */
+ boundaries = (str_idx == lim->subexp_from);
+ boundaries |= (str_idx == lim->subexp_to) << 1;
+ if (boundaries == 0)
+ return 0;
+
+ /* Else, examine epsilon closure. */
+ return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ from_node, bkref_idx);
+}
+
+/* Check the limitations of sub expressions LIMITS, and remove the nodes
+ which are against limitations from DEST_NODES. */
+
+static reg_errcode_t
+internal_function
+check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates, re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents, Idx str_idx)
+{
+ reg_errcode_t err;
+ Idx node_idx, lim_idx;
+
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = bkref_ents + limits->elems[lim_idx];
+
+ if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
+ continue; /* This is unrelated limitation. */
+
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+ if (ent->subexp_to == str_idx)
+ {
+ Idx ops_node = REG_MISSING;
+ Idx cls_node = REG_MISSING;
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_OPEN_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ ops_node = node;
+ else if (type == OP_CLOSE_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ cls_node = node;
+ }
+
+ /* Check the limitation of the open subexpression. */
+ /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */
+ if (REG_VALID_INDEX (ops_node))
+ {
+ err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ /* Check the limitation of the close subexpression. */
+ if (REG_VALID_INDEX (cls_node))
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ if (!re_node_set_contains (dfa->inveclosures + node,
+ cls_node)
+ && !re_node_set_contains (dfa->eclosures + node,
+ cls_node))
+ {
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ --node_idx;
+ }
+ }
+ }
+ else /* (ent->subexp_to != str_idx) */
+ {
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
+ {
+ if (subexp_idx != dfa->nodes[node].opr.idx)
+ continue;
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx node_idx, node;
+ re_sift_context_t local_sctx;
+ Idx first_idx = search_cur_bkref_entry (mctx, str_idx);
+
+ if (first_idx == REG_MISSING)
+ return REG_NOERROR;
+
+ local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */
+
+ for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
+ {
+ Idx enabled_idx;
+ re_token_type_t type;
+ struct re_backref_cache_entry *entry;
+ node = candidates->elems[node_idx];
+ type = dfa->nodes[node].type;
+ /* Avoid infinite loop for the REs like "()\1+". */
+ if (node == sctx->last_node && str_idx == sctx->last_str_idx)
+ continue;
+ if (type != OP_BACK_REF)
+ continue;
+
+ entry = mctx->bkref_ents + first_idx;
+ enabled_idx = first_idx;
+ do
+ {
+ Idx subexp_len;
+ Idx to_idx;
+ Idx dst_node;
+ bool ok;
+ re_dfastate_t *cur_state;
+
+ if (entry->node != node)
+ continue;
+ subexp_len = entry->subexp_to - entry->subexp_from;
+ to_idx = str_idx + subexp_len;
+ dst_node = (subexp_len ? dfa->nexts[node]
+ : dfa->edests[node].elems[0]);
+
+ if (to_idx > sctx->last_str_idx
+ || sctx->sifted_states[to_idx] == NULL
+ || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node)
+ || check_dst_limits (mctx, &sctx->limits, node,
+ str_idx, dst_node, to_idx))
+ continue;
+
+ if (local_sctx.sifted_states == NULL)
+ {
+ local_sctx = *sctx;
+ err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ local_sctx.last_node = node;
+ local_sctx.last_str_idx = str_idx;
+ ok = re_node_set_insert (&local_sctx.limits, enabled_idx);
+ if (BE (! ok, 0))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ cur_state = local_sctx.sifted_states[str_idx];
+ err = sift_states_backward (mctx, &local_sctx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ if (sctx->limited_states != NULL)
+ {
+ err = merge_state_array (dfa, sctx->limited_states,
+ local_sctx.sifted_states,
+ str_idx + 1);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ local_sctx.sifted_states[str_idx] = cur_state;
+ re_node_set_remove (&local_sctx.limits, enabled_idx);
+
+ /* mctx->bkref_ents may have changed, reload the pointer. */
+ entry = mctx->bkref_ents + enabled_idx;
+ }
+ while (enabled_idx++, entry++->more);
+ }
+ err = REG_NOERROR;
+ free_return:
+ if (local_sctx.sifted_states != NULL)
+ {
+ re_node_set_free (&local_sctx.limits);
+ }
+
+ return err;
+}
+
+
+#ifdef RE_ENABLE_I18N
+static int
+internal_function
+sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ int naccepted;
+ /* Check the node can accept `multi byte'. */
+ naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
+ if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
+ !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
+ dfa->nexts[node_idx]))
+ /* The node can't accept the `multi byte', or the
+ destination was already thrown away, then the node
+ could't accept the current input `multi byte'. */
+ naccepted = 0;
+ /* Otherwise, it is sure that the node could accept
+ `naccepted' bytes input. */
+ return naccepted;
+}
+#endif /* RE_ENABLE_I18N */
+
+
+/* Functions for state transition. */
+
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte, and update STATE_LOG if necessary.
+ If STATE can accept a multibyte char/collating element/back reference
+ update the destination of STATE_LOG. */
+
+static re_dfastate_t *
+internal_function __attribute_warn_unused_result__
+transit_state (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ re_dfastate_t **trtable;
+ unsigned char ch;
+
+#ifdef RE_ENABLE_I18N
+ /* If the current state can accept multibyte. */
+ if (BE (state->accept_mb, 0))
+ {
+ *err = transit_state_mb (mctx, state);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ /* Then decide the next state with the single byte. */
+#if 0
+ if (0)
+ /* don't use transition table */
+ return transit_state_sb (err, mctx, state);
+#endif
+
+ /* Use transition table */
+ ch = re_string_fetch_byte (&mctx->input);
+ for (;;)
+ {
+ trtable = state->trtable;
+ if (BE (trtable != NULL, 1))
+ return trtable[ch];
+
+ trtable = state->word_trtable;
+ if (BE (trtable != NULL, 1))
+ {
+ unsigned int context;
+ context
+ = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return trtable[ch + SBC_MAX];
+ else
+ return trtable[ch];
+ }
+
+ if (!build_trtable (mctx->dfa, state))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ /* Retry, we now have a transition table. */
+ }
+}
+
+/* Update the state_log if we need */
+static re_dfastate_t *
+internal_function
+merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx cur_idx = re_string_cur_idx (&mctx->input);
+
+ if (cur_idx > mctx->state_log_top)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ mctx->state_log_top = cur_idx;
+ }
+ else if (mctx->state_log[cur_idx] == 0)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ }
+ else
+ {
+ re_dfastate_t *pstate;
+ unsigned int context;
+ re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
+ /* If (state_log[cur_idx] != 0), it implies that cur_idx is
+ the destination of a multibyte char/collating element/
+ back reference. Then the next state is the union set of
+ these destinations and the results of the transition table. */
+ pstate = mctx->state_log[cur_idx];
+ log_nodes = pstate->entrance_nodes;
+ if (next_state != NULL)
+ {
+ table_nodes = next_state->entrance_nodes;
+ *err = re_node_set_init_union (&next_nodes, table_nodes,
+ log_nodes);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ }
+ else
+ next_nodes = *log_nodes;
+ /* Note: We already add the nodes of the initial state,
+ then we don't need to add them here. */
+
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ next_state = mctx->state_log[cur_idx]
+ = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ if (table_nodes != NULL)
+ re_node_set_free (&next_nodes);
+ }
+
+ if (BE (dfa->nbackref, 0) && next_state != NULL)
+ {
+ /* Check OP_OPEN_SUBEXP in the current state in case that we use them
+ later. We must check them here, since the back references in the
+ next state might use them. */
+ *err = check_subexp_matching_top (mctx, &next_state->nodes,
+ cur_idx);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+
+ /* If the next state has back references. */
+ if (next_state->has_backref)
+ {
+ *err = transit_state_bkref (mctx, &next_state->nodes);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ next_state = mctx->state_log[cur_idx];
+ }
+ }
+
+ return next_state;
+}
+
+/* Skip bytes in the input that correspond to part of a
+ multi-byte match, then look in the log for a state
+ from which to restart matching. */
+static re_dfastate_t *
+internal_function
+find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
+{
+ re_dfastate_t *cur_state;
+ do
+ {
+ Idx max = mctx->state_log_top;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ do
+ {
+ if (++cur_str_idx > max)
+ return NULL;
+ re_string_skip_bytes (&mctx->input, 1);
+ }
+ while (mctx->state_log[cur_str_idx] == NULL);
+
+ cur_state = merge_state_with_log (err, mctx, NULL);
+ }
+ while (*err == REG_NOERROR && cur_state == NULL);
+ return cur_state;
+}
+
+/* Helper functions for transit_state. */
+
+/* From the node set CUR_NODES, pick up the nodes whose types are
+ OP_OPEN_SUBEXP and which have corresponding back references in the regular
+ expression. And register them to use them later for evaluating the
+ correspoding back references. */
+
+static reg_errcode_t
+internal_function
+check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx node_idx;
+ reg_errcode_t err;
+
+ /* TODO: This isn't efficient.
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+ for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
+ {
+ Idx node = cur_nodes->elems[node_idx];
+ if (dfa->nodes[node].type == OP_OPEN_SUBEXP
+ && dfa->nodes[node].opr.idx < BITSET_WORD_BITS
+ && (dfa->used_bkref_map
+ & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx)))
+ {
+ err = match_ctx_add_subtop (mctx, node, str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+#if 0
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte. */
+
+static re_dfastate_t *
+transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ re_node_set next_nodes;
+ re_dfastate_t *next_state;
+ Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
+ unsigned int context;
+
+ *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
+ if (BE (*err != REG_NOERROR, 0))
+ return NULL;
+ for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
+ {
+ Idx cur_node = state->nodes.elems[node_cnt];
+ if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
+ {
+ *err = re_node_set_merge (&next_nodes,
+ dfa->eclosures + dfa->nexts[cur_node]);
+ if (BE (*err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return NULL;
+ }
+ }
+ }
+ context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
+ next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ re_node_set_free (&next_nodes);
+ re_string_skip_bytes (&mctx->input, 1);
+ return next_state;
+}
+#endif
+
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t
+internal_function
+transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+
+ for (i = 0; i < pstate->nodes.nelem; ++i)
+ {
+ re_node_set dest_nodes, *new_nodes;
+ Idx cur_node_idx = pstate->nodes.elems[i];
+ int naccepted;
+ Idx dest_idx;
+ unsigned int context;
+ re_dfastate_t *dest_state;
+
+ if (!dfa->nodes[cur_node_idx].accept_mb)
+ continue;
+
+ if (dfa->nodes[cur_node_idx].constraint)
+ {
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input),
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
+ context))
+ continue;
+ }
+
+ /* How many bytes the node can accept? */
+ naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input,
+ re_string_cur_idx (&mctx->input));
+ if (naccepted == 0)
+ continue;
+
+ /* The node can accepts `naccepted' bytes. */
+ dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
+ mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
+ : mctx->max_mb_elem_len);
+ err = clean_state_log_if_needed (mctx, dest_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+#ifdef DEBUG
+ assert (dfa->nexts[cur_node_idx] != REG_MISSING);
+#endif
+ new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx];
+
+ dest_state = mctx->state_log[dest_idx];
+ if (dest_state == NULL)
+ dest_nodes = *new_nodes;
+ else
+ {
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes, new_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ context = re_string_context_at (&mctx->input, dest_idx - 1,
+ mctx->eflags);
+ mctx->state_log[dest_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ if (dest_state != NULL)
+ re_node_set_free (&dest_nodes);
+ if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0))
+ return err;
+ }
+ return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+internal_function
+transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ for (i = 0; i < nodes->nelem; ++i)
+ {
+ Idx dest_str_idx, prev_nelem, bkc_idx;
+ Idx node_idx = nodes->elems[i];
+ unsigned int context;
+ const re_token_t *node = dfa->nodes + node_idx;
+ re_node_set *new_dest_nodes;
+
+ /* Check whether `node' is a backreference or not. */
+ if (node->type != OP_BACK_REF)
+ continue;
+
+ if (node->constraint)
+ {
+ context = re_string_context_at (&mctx->input, cur_str_idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ continue;
+ }
+
+ /* `node' is a backreference.
+ Check the substring which the substring matched. */
+ bkc_idx = mctx->nbkref_ents;
+ err = get_subexp (mctx, node_idx, cur_str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+
+ /* And add the epsilon closures (which is `new_dest_nodes') of
+ the backreference to appropriate state_log. */
+#ifdef DEBUG
+ assert (dfa->nexts[node_idx] != REG_MISSING);
+#endif
+ for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
+ {
+ Idx subexp_len;
+ re_dfastate_t *dest_state;
+ struct re_backref_cache_entry *bkref_ent;
+ bkref_ent = mctx->bkref_ents + bkc_idx;
+ if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
+ continue;
+ subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
+ new_dest_nodes = (subexp_len == 0
+ ? dfa->eclosures + dfa->edests[node_idx].elems[0]
+ : dfa->eclosures + dfa->nexts[node_idx]);
+ dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
+ - bkref_ent->subexp_from);
+ context = re_string_context_at (&mctx->input, dest_str_idx - 1,
+ mctx->eflags);
+ dest_state = mctx->state_log[dest_str_idx];
+ prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
+ : mctx->state_log[cur_str_idx]->nodes.nelem);
+ /* Add `new_dest_node' to state_log. */
+ if (dest_state == NULL)
+ {
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, new_dest_nodes,
+ context);
+ if (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ else
+ {
+ re_node_set dest_nodes;
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes,
+ new_dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&dest_nodes);
+ goto free_return;
+ }
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ re_node_set_free (&dest_nodes);
+ if (BE (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ /* We need to check recursively if the backreference can epsilon
+ transit. */
+ if (subexp_len == 0
+ && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
+ {
+ err = check_subexp_matching_top (mctx, new_dest_nodes,
+ cur_str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ err = transit_state_bkref (mctx, new_dest_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ goto free_return;
+ }
+ }
+ }
+ err = REG_NOERROR;
+ free_return:
+ return err;
+}
+
+/* Enumerate all the candidates which the backreference BKREF_NODE can match
+ at BKREF_STR_IDX, and register them by match_ctx_add_entry().
+ Note that we might collect inappropriate candidates here.
+ However, the cost of checking them strictly here is too high, then we
+ delay these checking for prune_impossible_nodes(). */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx subexp_num, sub_top_idx;
+ const char *buf = (const char *) re_string_get_buffer (&mctx->input);
+ /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */
+ Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
+ if (cache_idx != REG_MISSING)
+ {
+ const struct re_backref_cache_entry *entry
+ = mctx->bkref_ents + cache_idx;
+ do
+ if (entry->node == bkref_node)
+ return REG_NOERROR; /* We already checked it. */
+ while (entry++->more);
+ }
+
+ subexp_num = dfa->nodes[bkref_node].opr.idx;
+
+ /* For each sub expression */
+ for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
+ {
+ reg_errcode_t err;
+ re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
+ re_sub_match_last_t *sub_last;
+ Idx sub_last_idx, sl_str, bkref_str_off;
+
+ if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
+ continue; /* It isn't related. */
+
+ sl_str = sub_top->str_idx;
+ bkref_str_off = bkref_str_idx;
+ /* At first, check the last node of sub expressions we already
+ evaluated. */
+ for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
+ {
+ regoff_t sl_str_diff;
+ sub_last = sub_top->lasts[sub_last_idx];
+ sl_str_diff = sub_last->str_idx - sl_str;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_diff > 0)
+ {
+ if (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0))
+ {
+ /* Not enough chars for a successful match. */
+ if (bkref_str_off + sl_str_diff > mctx->input.len)
+ break;
+
+ err = clean_state_log_if_needed (mctx,
+ bkref_str_off
+ + sl_str_diff);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
+ /* We don't need to search this sub expression any more. */
+ break;
+ }
+ bkref_str_off += sl_str_diff;
+ sl_str += sl_str_diff;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+
+ /* Reload buf, since the preceding call might have reallocated
+ the buffer. */
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+
+ if (err == REG_NOMATCH)
+ continue;
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+
+ if (sub_last_idx < sub_top->nlasts)
+ continue;
+ if (sub_last_idx > 0)
+ ++sl_str;
+ /* Then, search for the other last nodes of the sub expression. */
+ for (; sl_str <= bkref_str_idx; ++sl_str)
+ {
+ Idx cls_node;
+ regoff_t sl_str_off;
+ const re_node_set *nodes;
+ sl_str_off = sl_str - sub_top->str_idx;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_off > 0)
+ {
+ if (BE (bkref_str_off >= mctx->input.valid_len, 0))
+ {
+ /* If we are at the end of the input, we cannot match. */
+ if (bkref_str_off >= mctx->input.len)
+ break;
+
+ err = extend_buffers (mctx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (buf [bkref_str_off++] != buf[sl_str - 1])
+ break; /* We don't need to search this sub expression
+ any more. */
+ }
+ if (mctx->state_log[sl_str] == NULL)
+ continue;
+ /* Does this state have a ')' of the sub expression? */
+ nodes = &mctx->state_log[sl_str]->nodes;
+ cls_node = find_subexp_node (dfa, nodes, subexp_num,
+ OP_CLOSE_SUBEXP);
+ if (cls_node == REG_MISSING)
+ continue; /* No. */
+ if (sub_top->path == NULL)
+ {
+ sub_top->path = calloc (sizeof (state_array_t),
+ sl_str - sub_top->str_idx + 1);
+ if (sub_top->path == NULL)
+ return REG_ESPACE;
+ }
+ /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
+ in the current context? */
+ err = check_arrival (mctx, sub_top->path, sub_top->node,
+ sub_top->str_idx, cls_node, sl_str,
+ OP_CLOSE_SUBEXP);
+ if (err == REG_NOMATCH)
+ continue;
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
+ if (BE (sub_last == NULL, 0))
+ return REG_ESPACE;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+ if (err == REG_NOMATCH)
+ continue;
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Helper functions for get_subexp(). */
+
+/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
+ If it can arrive, register the sub expression expressed with SUB_TOP
+ and SUB_LAST. */
+
+static reg_errcode_t
+internal_function
+get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str)
+{
+ reg_errcode_t err;
+ Idx to_idx;
+ /* Can the subexpression arrive the back reference? */
+ err = check_arrival (mctx, &sub_last->path, sub_last->node,
+ sub_last->str_idx, bkref_node, bkref_str,
+ OP_OPEN_SUBEXP);
+ if (err != REG_NOERROR)
+ return err;
+ err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
+ sub_last->str_idx);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
+ return clean_state_log_if_needed (mctx, to_idx);
+}
+
+/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
+ Search '(' if FL_OPEN, or search ')' otherwise.
+ TODO: This function isn't efficient...
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+
+static Idx
+internal_function
+find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type)
+{
+ Idx cls_idx;
+ for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
+ {
+ Idx cls_node = nodes->elems[cls_idx];
+ const re_token_t *node = dfa->nodes + cls_node;
+ if (node->type == type
+ && node->opr.idx == subexp_idx)
+ return cls_node;
+ }
+ return REG_MISSING;
+}
+
+/* Check whether the node TOP_NODE at TOP_STR can arrive to the node
+ LAST_NODE at LAST_STR. We record the path onto PATH since it will be
+ heavily reused.
+ Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ Idx subexp_num, backup_cur_idx, str_idx, null_cnt;
+ re_dfastate_t *cur_state = NULL;
+ re_node_set *cur_nodes, next_nodes;
+ re_dfastate_t **backup_state_log;
+ unsigned int context;
+
+ subexp_num = dfa->nodes[top_node].opr.idx;
+ /* Extend the buffer if we need. */
+ if (BE (path->alloc < last_str + mctx->max_mb_elem_len + 1, 0))
+ {
+ re_dfastate_t **new_array;
+ Idx old_alloc = path->alloc;
+ Idx new_alloc = old_alloc + last_str + mctx->max_mb_elem_len + 1;
+ if (BE (new_alloc < old_alloc, 0)
+ || BE (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc, 0))
+ return REG_ESPACE;
+ new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ path->array = new_array;
+ path->alloc = new_alloc;
+ memset (new_array + old_alloc, '\0',
+ sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
+ }
+
+ str_idx = path->next_idx ? path->next_idx : top_str;
+
+ /* Temporary modify MCTX. */
+ backup_state_log = mctx->state_log;
+ backup_cur_idx = mctx->input.cur_idx;
+ mctx->state_log = path->array;
+ mctx->input.cur_idx = str_idx;
+
+ /* Setup initial node set. */
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ if (str_idx == top_str)
+ {
+ err = re_node_set_init_1 (&next_nodes, top_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ cur_state = mctx->state_log[str_idx];
+ if (cur_state && cur_state->has_backref)
+ {
+ err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ else
+ re_node_set_init_empty (&next_nodes);
+ }
+ if (str_idx == top_str || (cur_state && cur_state->has_backref))
+ {
+ if (next_nodes.nelem)
+ {
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ }
+
+ for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
+ {
+ re_node_set_empty (&next_nodes);
+ if (mctx->state_log[str_idx + 1])
+ {
+ err = re_node_set_merge (&next_nodes,
+ &mctx->state_log[str_idx + 1]->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ if (cur_state)
+ {
+ err = check_arrival_add_next_nodes (mctx, str_idx,
+ &cur_state->non_eps_nodes,
+ &next_nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ ++str_idx;
+ if (next_nodes.nelem)
+ {
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
+ }
+ re_node_set_free (&next_nodes);
+ cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
+ : &mctx->state_log[last_str]->nodes);
+ path->next_idx = str_idx;
+
+ /* Fix MCTX. */
+ mctx->state_log = backup_state_log;
+ mctx->input.cur_idx = backup_cur_idx;
+
+ /* Then check the current node set has the node LAST_NODE. */
+ if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node))
+ return REG_NOERROR;
+
+ return REG_NOMATCH;
+}
+
+/* Helper functions for check_arrival. */
+
+/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
+ to NEXT_NODES.
+ TODO: This function is similar to the functions transit_state*(),
+ however this function has many additional works.
+ Can't we unify them? */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
+ re_node_set *cur_nodes, re_node_set *next_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ bool ok;
+ Idx cur_idx;
+#ifdef RE_ENABLE_I18N
+ reg_errcode_t err = REG_NOERROR;
+#endif
+ re_node_set union_set;
+ re_node_set_init_empty (&union_set);
+ for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
+ {
+ int naccepted = 0;
+ Idx cur_node = cur_nodes->elems[cur_idx];
+#ifdef DEBUG
+ re_token_type_t type = dfa->nodes[cur_node].type;
+ assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept `multi byte'. */
+ if (dfa->nodes[cur_node].accept_mb)
+ {
+ naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
+ str_idx);
+ if (naccepted > 1)
+ {
+ re_dfastate_t *dest_state;
+ Idx next_node = dfa->nexts[cur_node];
+ Idx next_idx = str_idx + naccepted;
+ dest_state = mctx->state_log[next_idx];
+ re_node_set_empty (&union_set);
+ if (dest_state)
+ {
+ err = re_node_set_merge (&union_set, &dest_state->nodes);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ ok = re_node_set_insert (&union_set, next_node);
+ if (BE (! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
+ &union_set);
+ if (BE (mctx->state_log[next_idx] == NULL
+ && err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (naccepted
+ || check_node_accept (mctx, dfa->nodes + cur_node, str_idx))
+ {
+ ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
+ if (BE (! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ }
+ }
+ re_node_set_free (&union_set);
+ return REG_NOERROR;
+}
+
+/* For all the nodes in CUR_NODES, add the epsilon closures of them to
+ CUR_NODES, however exclude the nodes which are:
+ - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
+ - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
+*/
+
+static reg_errcode_t
+internal_function
+check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+{
+ reg_errcode_t err;
+ Idx idx, outside_node;
+ re_node_set new_nodes;
+#ifdef DEBUG
+ assert (cur_nodes->nelem);
+#endif
+ err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ /* Create a new node set NEW_NODES with the nodes which are epsilon
+ closures of the node in CUR_NODES. */
+
+ for (idx = 0; idx < cur_nodes->nelem; ++idx)
+ {
+ Idx cur_node = cur_nodes->elems[idx];
+ const re_node_set *eclosure = dfa->eclosures + cur_node;
+ outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type);
+ if (outside_node == REG_MISSING)
+ {
+ /* There are no problematic nodes, just merge them. */
+ err = re_node_set_merge (&new_nodes, eclosure);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ /* There are problematic nodes, re-calculate incrementally. */
+ err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
+ ex_subexp, type);
+ if (BE (err != REG_NOERROR, 0))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ }
+ re_node_set_free (cur_nodes);
+ *cur_nodes = new_nodes;
+ return REG_NOERROR;
+}
+
+/* Helper function for check_arrival_expand_ecl.
+ Check incrementally the epsilon closure of TARGET, and if it isn't
+ problematic append it to DST_NODES. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp, int type)
+{
+ Idx cur_node;
+ for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
+ {
+ bool ok;
+
+ if (dfa->nodes[cur_node].type == type
+ && dfa->nodes[cur_node].opr.idx == ex_subexp)
+ {
+ if (type == OP_CLOSE_SUBEXP)
+ {
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ }
+ break;
+ }
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (BE (! ok, 0))
+ return REG_ESPACE;
+ if (dfa->edests[cur_node].nelem == 0)
+ break;
+ if (dfa->edests[cur_node].nelem == 2)
+ {
+ reg_errcode_t err;
+ err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
+ dfa->edests[cur_node].elems[1],
+ ex_subexp, type);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ cur_node = dfa->edests[cur_node].elems[0];
+ }
+ return REG_NOERROR;
+}
+
+
+/* For all the back references in the current state, calculate the
+ destination of the back references by the appropriate entry
+ in MCTX->BKREF_ENTS. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx cur_str, Idx subexp_num, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
+ struct re_backref_cache_entry *ent;
+
+ if (cache_idx_start == REG_MISSING)
+ return REG_NOERROR;
+
+ restart:
+ ent = mctx->bkref_ents + cache_idx_start;
+ do
+ {
+ Idx to_idx, next_node;
+
+ /* Is this entry ENT is appropriate? */
+ if (!re_node_set_contains (cur_nodes, ent->node))
+ continue; /* No. */
+
+ to_idx = cur_str + ent->subexp_to - ent->subexp_from;
+ /* Calculate the destination of the back reference, and append it
+ to MCTX->STATE_LOG. */
+ if (to_idx == cur_str)
+ {
+ /* The backreference did epsilon transit, we must re-check all the
+ node in the current state. */
+ re_node_set new_dests;
+ reg_errcode_t err2, err3;
+ next_node = dfa->edests[ent->node].elems[0];
+ if (re_node_set_contains (cur_nodes, next_node))
+ continue;
+ err = re_node_set_init_1 (&new_dests, next_node);
+ err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type);
+ err3 = re_node_set_merge (cur_nodes, &new_dests);
+ re_node_set_free (&new_dests);
+ if (BE (err != REG_NOERROR || err2 != REG_NOERROR
+ || err3 != REG_NOERROR, 0))
+ {
+ err = (err != REG_NOERROR ? err
+ : (err2 != REG_NOERROR ? err2 : err3));
+ return err;
+ }
+ /* TODO: It is still inefficient... */
+ goto restart;
+ }
+ else
+ {
+ re_node_set union_set;
+ next_node = dfa->nexts[ent->node];
+ if (mctx->state_log[to_idx])
+ {
+ bool ok;
+ if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
+ next_node))
+ continue;
+ err = re_node_set_init_copy (&union_set,
+ &mctx->state_log[to_idx]->nodes);
+ ok = re_node_set_insert (&union_set, next_node);
+ if (BE (err != REG_NOERROR || ! ok, 0))
+ {
+ re_node_set_free (&union_set);
+ err = err != REG_NOERROR ? err : REG_ESPACE;
+ return err;
+ }
+ }
+ else
+ {
+ err = re_node_set_init_1 (&union_set, next_node);
+ if (BE (err != REG_NOERROR, 0))
+ return err;
+ }
+ mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
+ re_node_set_free (&union_set);
+ if (BE (mctx->state_log[to_idx] == NULL
+ && err != REG_NOERROR, 0))
+ return err;
+ }
+ }
+ while (ent++->more);
+ return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+ Return true if successful. */
+
+static bool
+internal_function
+build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
+{
+ reg_errcode_t err;
+ Idx i, j;
+ int ch;
+ bool need_word_trtable = false;
+ bitset_word_t elem, mask;
+ bool dests_node_malloced = false;
+ bool dest_states_malloced = false;
+ Idx ndests; /* Number of the destination states from `state'. */
+ re_dfastate_t **trtable;
+ re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
+ re_node_set follows, *dests_node;
+ bitset_t *dests_ch;
+ bitset_t acceptable;
+
+ struct dests_alloc
+ {
+ re_node_set dests_node[SBC_MAX];
+ bitset_t dests_ch[SBC_MAX];
+ } *dests_alloc;
+
+ /* We build DFA states which corresponds to the destination nodes
+ from `state'. `dests_node[i]' represents the nodes which i-th
+ destination state contains, and `dests_ch[i]' represents the
+ characters which i-th destination state accepts. */
+ if (__libc_use_alloca (sizeof (struct dests_alloc)))
+ dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
+ else
+ {
+ dests_alloc = re_malloc (struct dests_alloc, 1);
+ if (BE (dests_alloc == NULL, 0))
+ return false;
+ dests_node_malloced = true;
+ }
+ dests_node = dests_alloc->dests_node;
+ dests_ch = dests_alloc->dests_ch;
+
+ /* Initialize transiton table. */
+ state->word_trtable = state->trtable = NULL;
+
+ /* At first, group all nodes belonging to `state' into several
+ destinations. */
+ ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
+ if (BE (! REG_VALID_NONZERO_INDEX (ndests), 0))
+ {
+ if (dests_node_malloced)
+ free (dests_alloc);
+ if (ndests == 0)
+ {
+ state->trtable = (re_dfastate_t **)
+ calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ if (BE (state->trtable == NULL, 0))
+ return false;
+ return true;
+ }
+ return false;
+ }
+
+ err = re_node_set_alloc (&follows, ndests + 1);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+
+ /* Avoid arithmetic overflow in size calculation. */
+ if (BE ((((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX)
+ / (3 * sizeof (re_dfastate_t *)))
+ < ndests),
+ 0))
+ goto out_free;
+
+ if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX
+ + ndests * 3 * sizeof (re_dfastate_t *)))
+ dest_states = (re_dfastate_t **)
+ alloca (ndests * 3 * sizeof (re_dfastate_t *));
+ else
+ {
+ dest_states = (re_dfastate_t **)
+ malloc (ndests * 3 * sizeof (re_dfastate_t *));
+ if (BE (dest_states == NULL, 0))
+ {
+out_free:
+ if (dest_states_malloced)
+ free (dest_states);
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+ if (dests_node_malloced)
+ free (dests_alloc);
+ return false;
+ }
+ dest_states_malloced = true;
+ }
+ dest_states_word = dest_states + ndests;
+ dest_states_nl = dest_states_word + ndests;
+ bitset_empty (acceptable);
+
+ /* Then build the states for all destinations. */
+ for (i = 0; i < ndests; ++i)
+ {
+ Idx next_node;
+ re_node_set_empty (&follows);
+ /* Merge the follows of this destination states. */
+ for (j = 0; j < dests_node[i].nelem; ++j)
+ {
+ next_node = dfa->nexts[dests_node[i].elems[j]];
+ if (next_node != REG_MISSING)
+ {
+ err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+ if (BE (err != REG_NOERROR, 0))
+ goto out_free;
+ }
+ }
+ dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+ if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+ /* If the new state has context constraint,
+ build appropriate states for these contexts. */
+ if (dest_states[i]->has_constraint)
+ {
+ dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_WORD);
+ if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+
+ if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1)
+ need_word_trtable = true;
+
+ dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_NEWLINE);
+ if (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0))
+ goto out_free;
+ }
+ else
+ {
+ dest_states_word[i] = dest_states[i];
+ dest_states_nl[i] = dest_states[i];
+ }
+ bitset_merge (acceptable, dests_ch[i]);
+ }
+
+ if (!BE (need_word_trtable, 0))
+ {
+ /* We don't care about whether the following character is a word
+ character, or we are in a single-byte character set so we can
+ discern by looking at the character code: allocate a
+ 256-entry transition table. */
+ trtable = state->trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ if (BE (trtable == NULL, 0))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (BE (elem & 1, 0))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ if (dfa->word_char[i] & mask)
+ trtable[ch] = dest_states_word[j];
+ else
+ trtable[ch] = dest_states[j];
+ }
+ }
+ else
+ {
+ /* We care about whether the following character is a word
+ character, and we are in a multi-byte character set: discern
+ by looking at the character code: build two 256-entry
+ transition tables, one starting at trtable[0] and one
+ starting at trtable[SBC_MAX]. */
+ trtable = state->word_trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX);
+ if (BE (trtable == NULL, 0))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (BE (elem & 1, 0))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ trtable[ch] = dest_states[j];
+ trtable[ch + SBC_MAX] = dest_states_word[j];
+ }
+ }
+
+ /* new line */
+ if (bitset_contain (acceptable, NEWLINE_CHAR))
+ {
+ /* The current state accepts newline character. */
+ for (j = 0; j < ndests; ++j)
+ if (bitset_contain (dests_ch[j], NEWLINE_CHAR))
+ {
+ /* k-th destination accepts newline character. */
+ trtable[NEWLINE_CHAR] = dest_states_nl[j];
+ if (need_word_trtable)
+ trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j];
+ /* There must be only one destination which accepts
+ newline. See group_nodes_into_DFAstates. */
+ break;
+ }
+ }
+
+ if (dest_states_malloced)
+ free (dest_states);
+
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+
+ if (dests_node_malloced)
+ free (dests_alloc);
+
+ return true;
+}
+
+/* Group all nodes belonging to STATE into several destinations.
+ Then for all destinations, set the nodes belonging to the destination
+ to DESTS_NODE[i] and set the characters accepted by the destination
+ to DEST_CH[i]. This function return the number of destinations. */
+
+static Idx
+internal_function
+group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
+ re_node_set *dests_node, bitset_t *dests_ch)
+{
+ reg_errcode_t err;
+ bool ok;
+ Idx i, j, k;
+ Idx ndests; /* Number of the destinations from `state'. */
+ bitset_t accepts; /* Characters a node can accept. */
+ const re_node_set *cur_nodes = &state->nodes;
+ bitset_empty (accepts);
+ ndests = 0;
+
+ /* For all the nodes belonging to `state', */
+ for (i = 0; i < cur_nodes->nelem; ++i)
+ {
+ re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ /* Enumerate all single byte character this node can accept. */
+ if (type == CHARACTER)
+ bitset_set (accepts, node->opr.c);
+ else if (type == SIMPLE_BRACKET)
+ {
+ bitset_merge (accepts, node->opr.sbcset);
+ }
+ else if (type == OP_PERIOD)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ bitset_merge (accepts, dfa->sb_char);
+ else
+#endif
+ bitset_set_all (accepts);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == OP_UTF8_PERIOD)
+ {
+ if (ASCII_CHARS % BITSET_WORD_BITS == 0)
+ memset (accepts, -1, ASCII_CHARS / CHAR_BIT);
+ else
+ bitset_merge (accepts, utf8_sb_map);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#endif
+ else
+ continue;
+
+ /* Check the `accepts' and sift the characters which are not
+ match it the context. */
+ if (constraint)
+ {
+ if (constraint & NEXT_NEWLINE_CONSTRAINT)
+ {
+ bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
+ bitset_empty (accepts);
+ if (accepts_newline)
+ bitset_set (accepts, NEWLINE_CHAR);
+ else
+ continue;
+ }
+ if (constraint & NEXT_ENDBUF_CONSTRAINT)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+
+ if (constraint & NEXT_WORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && !node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ if (constraint & NEXT_NOTWORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ }
+
+ /* Then divide `accepts' into DFA states, or create a new
+ state. Above, we make sure that accepts is not empty. */
+ for (j = 0; j < ndests; ++j)
+ {
+ bitset_t intersec; /* Intersection sets, see below. */
+ bitset_t remains;
+ /* Flags, see below. */
+ bitset_word_t has_intersec, not_subset, not_consumed;
+
+ /* Optimization, skip if this state doesn't accept the character. */
+ if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
+ continue;
+
+ /* Enumerate the intersection set of this state and `accepts'. */
+ has_intersec = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
+ /* And skip if the intersection set is empty. */
+ if (!has_intersec)
+ continue;
+
+ /* Then check if this state is a subset of `accepts'. */
+ not_subset = not_consumed = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ {
+ not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
+ not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
+ }
+
+ /* If this state isn't a subset of `accepts', create a
+ new group state, which has the `remains'. */
+ if (not_subset)
+ {
+ bitset_copy (dests_ch[ndests], remains);
+ bitset_copy (dests_ch[j], intersec);
+ err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
+ if (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ }
+
+ /* Put the position in the current group. */
+ ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+ if (BE (! ok, 0))
+ goto error_return;
+
+ /* If all characters are consumed, go to next node. */
+ if (!not_consumed)
+ break;
+ }
+ /* Some characters remain, create a new group. */
+ if (j == ndests)
+ {
+ bitset_copy (dests_ch[ndests], accepts);
+ err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
+ if (BE (err != REG_NOERROR, 0))
+ goto error_return;
+ ++ndests;
+ bitset_empty (accepts);
+ }
+ }
+ return ndests;
+ error_return:
+ for (j = 0; j < ndests; ++j)
+ re_node_set_free (dests_node + j);
+ return REG_MISSING;
+}
+
+#ifdef RE_ENABLE_I18N
+/* Check how many bytes the node `dfa->nodes[node_idx]' accepts.
+ Return the number of the bytes the node accepts.
+ STR_IDX is the current index of the input string.
+
+ This function handles the nodes which can accept one character, or
+ one collating element like '.', '[a-z]', opposite to the other nodes
+ can only accept one byte. */
+
+static int
+internal_function
+check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx str_idx)
+{
+ const re_token_t *node = dfa->nodes + node_idx;
+ int char_len, elem_len;
+ Idx i;
+
+ if (BE (node->type == OP_UTF8_PERIOD, 0))
+ {
+ unsigned char c = re_string_byte_at (input, str_idx), d;
+ if (BE (c < 0xc2, 1))
+ return 0;
+
+ if (str_idx + 2 > input->len)
+ return 0;
+
+ d = re_string_byte_at (input, str_idx + 1);
+ if (c < 0xe0)
+ return (d < 0x80 || d > 0xbf) ? 0 : 2;
+ else if (c < 0xf0)
+ {
+ char_len = 3;
+ if (c == 0xe0 && d < 0xa0)
+ return 0;
+ }
+ else if (c < 0xf8)
+ {
+ char_len = 4;
+ if (c == 0xf0 && d < 0x90)
+ return 0;
+ }
+ else if (c < 0xfc)
+ {
+ char_len = 5;
+ if (c == 0xf8 && d < 0x88)
+ return 0;
+ }
+ else if (c < 0xfe)
+ {
+ char_len = 6;
+ if (c == 0xfc && d < 0x84)
+ return 0;
+ }
+ else
+ return 0;
+
+ if (str_idx + char_len > input->len)
+ return 0;
+
+ for (i = 1; i < char_len; ++i)
+ {
+ d = re_string_byte_at (input, str_idx + i);
+ if (d < 0x80 || d > 0xbf)
+ return 0;
+ }
+ return char_len;
+ }
+
+ char_len = re_string_char_size_at (input, str_idx);
+ if (node->type == OP_PERIOD)
+ {
+ if (char_len <= 1)
+ return 0;
+ /* FIXME: I don't think this if is needed, as both '\n'
+ and '\0' are char_len == 1. */
+ /* '.' accepts any one character except the following two cases. */
+ if ((!(dfa->syntax & RE_DOT_NEWLINE) &&
+ re_string_byte_at (input, str_idx) == '\n') ||
+ ((dfa->syntax & RE_DOT_NOT_NULL) &&
+ re_string_byte_at (input, str_idx) == '\0'))
+ return 0;
+ return char_len;
+ }
+
+ elem_len = re_string_elem_size_at (input, str_idx);
+ if ((elem_len <= 1 && char_len <= 1) || char_len == 0)
+ return 0;
+
+ if (node->type == COMPLEX_BRACKET)
+ {
+ const re_charset_t *cset = node->opr.mbcset;
+# ifdef _LIBC
+ const unsigned char *pin
+ = ((const unsigned char *) re_string_get_buffer (input) + str_idx);
+ Idx j;
+ uint32_t nrules;
+# endif /* _LIBC */
+ int match_len = 0;
+ wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
+ ? re_string_wchar_at (input, str_idx) : 0);
+
+ /* match with multibyte character? */
+ for (i = 0; i < cset->nmbchars; ++i)
+ if (wc == cset->mbchars[i])
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ /* match with character_class? */
+ for (i = 0; i < cset->nchar_classes; ++i)
+ {
+ wctype_t wt = cset->char_classes[i];
+ if (__iswctype (wc, wt))
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+# ifdef _LIBC
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ unsigned int in_collseq = 0;
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra;
+ const char *collseqwc;
+ int32_t idx;
+ /* This #include defines a local function! */
+# include <locale/weight.h>
+
+ /* match with collating_symbol? */
+ if (cset->ncoll_syms)
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ for (i = 0; i < cset->ncoll_syms; ++i)
+ {
+ const unsigned char *coll_sym = extra + cset->coll_syms[i];
+ /* Compare the length of input collating element and
+ the length of current collating element. */
+ if (*coll_sym != elem_len)
+ continue;
+ /* Compare each bytes. */
+ for (j = 0; j < *coll_sym; j++)
+ if (pin[j] != coll_sym[1 + j])
+ break;
+ if (j == *coll_sym)
+ {
+ /* Match if every bytes is equal. */
+ match_len = j;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+ if (cset->nranges)
+ {
+ if (elem_len <= char_len)
+ {
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ in_collseq = __collseq_table_lookup (collseqwc, wc);
+ }
+ else
+ in_collseq = find_collation_sequence_value (pin, elem_len);
+ }
+ /* match with range expression? */
+ for (i = 0; i < cset->nranges; ++i)
+ if (cset->range_starts[i] <= in_collseq
+ && in_collseq <= cset->range_ends[i])
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+
+ /* match with equivalence_class? */
+ if (cset->nequiv_classes)
+ {
+ const unsigned char *cp = pin;
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+ int32_t idx = findidx (&cp);
+ if (idx > 0)
+ for (i = 0; i < cset->nequiv_classes; ++i)
+ {
+ int32_t equiv_class_idx = cset->equiv_classes[i];
+ size_t weight_len = weights[idx & 0xffffff];
+ if (weight_len == weights[equiv_class_idx & 0xffffff]
+ && (idx >> 24) == (equiv_class_idx >> 24))
+ {
+ Idx cnt = 0;
+
+ idx &= 0xffffff;
+ equiv_class_idx &= 0xffffff;
+
+ while (cnt <= weight_len
+ && (weights[equiv_class_idx + 1 + cnt]
+ == weights[idx + 1 + cnt]))
+ ++cnt;
+ if (cnt > weight_len)
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ }
+ }
+ else
+# endif /* _LIBC */
+ {
+ /* match with range expression? */
+#if __GNUC__ >= 2 && ! (__STDC_VERSION__ < 199901L && defined __STRICT_ANSI__)
+ wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
+#else
+ wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+ cmp_buf[2] = wc;
+#endif
+ for (i = 0; i < cset->nranges; ++i)
+ {
+ cmp_buf[0] = cset->range_starts[i];
+ cmp_buf[4] = cset->range_ends[i];
+ if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+ && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ check_node_accept_bytes_match:
+ if (!cset->non_match)
+ return match_len;
+ else
+ {
+ if (match_len > 0)
+ return 0;
+ else
+ return (elem_len > char_len) ? elem_len : char_len;
+ }
+ }
+ return 0;
+}
+
+# ifdef _LIBC
+static unsigned int
+internal_function
+find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
+{
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules == 0)
+ {
+ if (mbs_len == 1)
+ {
+ /* No valid character. Match it as a single byte character. */
+ const unsigned char *collseq = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ return collseq[mbs[0]];
+ }
+ return UINT_MAX;
+ }
+ else
+ {
+ int32_t idx;
+ const unsigned char *extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ int32_t extrasize = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra;
+
+ for (idx = 0; idx < extrasize;)
+ {
+ int mbs_cnt;
+ bool found = false;
+ int32_t elem_mbs_len;
+ /* Skip the name of collating element name. */
+ idx = idx + extra[idx] + 1;
+ elem_mbs_len = extra[idx++];
+ if (mbs_len == elem_mbs_len)
+ {
+ for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
+ if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
+ break;
+ if (mbs_cnt == elem_mbs_len)
+ /* Found the entry. */
+ found = true;
+ }
+ /* Skip the byte sequence of the collating element. */
+ idx += elem_mbs_len;
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ /* Skip the wide char sequence of the collating element. */
+ idx = idx + sizeof (uint32_t) * (extra[idx] + 1);
+ /* If we found the entry, return the sequence value. */
+ if (found)
+ return *(uint32_t *) (extra + idx);
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ }
+ return UINT_MAX;
+ }
+}
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+
+/* Check whether the node accepts the byte which is IDX-th
+ byte of the INPUT. */
+
+static bool
+internal_function
+check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
+ Idx idx)
+{
+ unsigned char ch;
+ ch = re_string_byte_at (&mctx->input, idx);
+ switch (node->type)
+ {
+ case CHARACTER:
+ if (node->opr.c != ch)
+ return false;
+ break;
+
+ case SIMPLE_BRACKET:
+ if (!bitset_contain (node->opr.sbcset, ch))
+ return false;
+ break;
+
+#ifdef RE_ENABLE_I18N
+ case OP_UTF8_PERIOD:
+ if (ch >= ASCII_CHARS)
+ return false;
+ /* FALLTHROUGH */
+#endif
+ case OP_PERIOD:
+ if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE))
+ || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL)))
+ return false;
+ break;
+
+ default:
+ return false;
+ }
+
+ if (node->constraint)
+ {
+ /* The node has constraints. Check whether the current context
+ satisfies the constraints. */
+ unsigned int context = re_string_context_at (&mctx->input, idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ return false;
+ }
+
+ return true;
+}
+
+/* Extend the buffers, if the buffers have run out. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+extend_buffers (re_match_context_t *mctx)
+{
+ reg_errcode_t ret;
+ re_string_t *pstr = &mctx->input;
+
+ /* Avoid overflow. */
+ if (BE (SIZE_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
+ return REG_ESPACE;
+
+ /* Double the lengthes of the buffers. */
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+
+ if (mctx->state_log != NULL)
+ {
+ /* And double the length of state_log. */
+ /* XXX We have no indication of the size of this buffer. If this
+ allocation fail we have no indication that the state_log array
+ does not have the right size. */
+ re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *,
+ pstr->bufs_len + 1);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ mctx->state_log = new_array;
+ }
+
+ /* Then reconstruct the buffers. */
+ if (pstr->icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (BE (ret != REG_NOERROR, 0))
+ return ret;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ }
+ return REG_NOERROR;
+}
+
+
+/* Functions for matching context. */
+
+/* Initialize MCTX. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
+{
+ mctx->eflags = eflags;
+ mctx->match_last = REG_MISSING;
+ if (n > 0)
+ {
+ /* Avoid overflow. */
+ size_t max_object_size =
+ MAX (sizeof (struct re_backref_cache_entry),
+ sizeof (re_sub_match_top_t *));
+ if (BE (SIZE_MAX / max_object_size < n, 0))
+ return REG_ESPACE;
+
+ mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
+ mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
+ if (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0))
+ return REG_ESPACE;
+ }
+ /* Already zero-ed by the caller.
+ else
+ mctx->bkref_ents = NULL;
+ mctx->nbkref_ents = 0;
+ mctx->nsub_tops = 0; */
+ mctx->abkref_ents = n;
+ mctx->max_mb_elem_len = 1;
+ mctx->asub_tops = n;
+ return REG_NOERROR;
+}
+
+/* Clean the entries which depend on the current input in MCTX.
+ This function must be invoked when the matcher changes the start index
+ of the input, or changes the input string. */
+
+static void
+internal_function
+match_ctx_clean (re_match_context_t *mctx)
+{
+ Idx st_idx;
+ for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
+ {
+ Idx sl_idx;
+ re_sub_match_top_t *top = mctx->sub_tops[st_idx];
+ for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
+ {
+ re_sub_match_last_t *last = top->lasts[sl_idx];
+ re_free (last->path.array);
+ re_free (last);
+ }
+ re_free (top->lasts);
+ if (top->path)
+ {
+ re_free (top->path->array);
+ re_free (top->path);
+ }
+ free (top);
+ }
+
+ mctx->nsub_tops = 0;
+ mctx->nbkref_ents = 0;
+}
+
+/* Free all the memory associated with MCTX. */
+
+static void
+internal_function
+match_ctx_free (re_match_context_t *mctx)
+{
+ /* First, free all the memory associated with MCTX->SUB_TOPS. */
+ match_ctx_clean (mctx);
+ re_free (mctx->sub_tops);
+ re_free (mctx->bkref_ents);
+}
+
+/* Add a new backreference entry to MCTX.
+ Note that we assume that caller never call this function with duplicate
+ entry, and call with STR_IDX which isn't smaller than any existing entry.
+*/
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from,
+ Idx to)
+{
+ if (mctx->nbkref_ents >= mctx->abkref_ents)
+ {
+ struct re_backref_cache_entry* new_entry;
+ new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
+ mctx->abkref_ents * 2);
+ if (BE (new_entry == NULL, 0))
+ {
+ re_free (mctx->bkref_ents);
+ return REG_ESPACE;
+ }
+ mctx->bkref_ents = new_entry;
+ memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
+ sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
+ mctx->abkref_ents *= 2;
+ }
+ if (mctx->nbkref_ents > 0
+ && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx)
+ mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1;
+
+ mctx->bkref_ents[mctx->nbkref_ents].node = node;
+ mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
+
+ /* This is a cache that saves negative results of check_dst_limits_calc_pos.
+ If bit N is clear, means that this entry won't epsilon-transition to
+ an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If
+ it is set, check_dst_limits_calc_pos_1 will recurse and try to find one
+ such node.
+
+ A backreference does not epsilon-transition unless it is empty, so set
+ to all zeros if FROM != TO. */
+ mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map
+ = (from == to ? -1 : 0);
+
+ mctx->bkref_ents[mctx->nbkref_ents++].more = 0;
+ if (mctx->max_mb_elem_len < to - from)
+ mctx->max_mb_elem_len = to - from;
+ return REG_NOERROR;
+}
+
+/* Return the first entry with the same str_idx, or REG_MISSING if none is
+ found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */
+
+static Idx
+internal_function
+search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+{
+ Idx left, right, mid, last;
+ last = right = mctx->nbkref_ents;
+ for (left = 0; left < right;)
+ {
+ mid = (left + right) / 2;
+ if (mctx->bkref_ents[mid].str_idx < str_idx)
+ left = mid + 1;
+ else
+ right = mid;
+ }
+ if (left < last && mctx->bkref_ents[left].str_idx == str_idx)
+ return left;
+ else
+ return REG_MISSING;
+}
+
+/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
+ at STR_IDX. */
+
+static reg_errcode_t
+internal_function __attribute_warn_unused_result__
+match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
+{
+#ifdef DEBUG
+ assert (mctx->sub_tops != NULL);
+ assert (mctx->asub_tops > 0);
+#endif
+ if (BE (mctx->nsub_tops == mctx->asub_tops, 0))
+ {
+ Idx new_asub_tops = mctx->asub_tops * 2;
+ re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops,
+ re_sub_match_top_t *,
+ new_asub_tops);
+ if (BE (new_array == NULL, 0))
+ return REG_ESPACE;
+ mctx->sub_tops = new_array;
+ mctx->asub_tops = new_asub_tops;
+ }
+ mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
+ if (BE (mctx->sub_tops[mctx->nsub_tops] == NULL, 0))
+ return REG_ESPACE;
+ mctx->sub_tops[mctx->nsub_tops]->node = node;
+ mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
+ return REG_NOERROR;
+}
+
+/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
+ at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP. */
+
+static re_sub_match_last_t *
+internal_function
+match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
+{
+ re_sub_match_last_t *new_entry;
+ if (BE (subtop->nlasts == subtop->alasts, 0))
+ {
+ Idx new_alasts = 2 * subtop->alasts + 1;
+ re_sub_match_last_t **new_array = re_realloc (subtop->lasts,
+ re_sub_match_last_t *,
+ new_alasts);
+ if (BE (new_array == NULL, 0))
+ return NULL;
+ subtop->lasts = new_array;
+ subtop->alasts = new_alasts;
+ }
+ new_entry = calloc (1, sizeof (re_sub_match_last_t));
+ if (BE (new_entry != NULL, 1))
+ {
+ subtop->lasts[subtop->nlasts] = new_entry;
+ new_entry->node = node;
+ new_entry->str_idx = str_idx;
+ ++subtop->nlasts;
+ }
+ return new_entry;
+}
+
+static void
+internal_function
+sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx)
+{
+ sctx->sifted_states = sifted_sts;
+ sctx->limited_states = limited_sts;
+ sctx->last_node = last_node;
+ sctx->last_str_idx = last_str_idx;
+ re_node_set_init_empty (&sctx->limits);
+}
diff --git a/gnulib/lib/relocatable.c b/gnulib/lib/relocatable.c
new file mode 100644
index 0000000..68ceb71
--- /dev/null
+++ b/gnulib/lib/relocatable.c
@@ -0,0 +1,496 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Specification. */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xalloc.h"
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'. */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ IS_PATH_WITH_DIR(P) tests whether P contains a directory specification.
+ */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+ && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Whether to enable the more costly support for relocatable libraries.
+ It allows libraries to be have been installed with a different original
+ prefix than the program. But it is quite costly, especially on Cygwin
+ platforms, see below. Therefore we enable it by default only on native
+ Win32 platforms. */
+#ifndef ENABLE_COSTLY_RELOCATABLE
+# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+# define ENABLE_COSTLY_RELOCATABLE 1
+# else
+# define ENABLE_COSTLY_RELOCATABLE 0
+# endif
+#endif
+
+/* Original installation prefix. */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix. */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash. Anything that will be concatenated
+ to them must start with a slash. */
+
+/* Sets the original and the current installation prefix of this module.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+ const char *curr_prefix_arg)
+{
+ if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+ /* Optimization: if orig_prefix and curr_prefix are equal, the
+ relocation is a nop. */
+ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+ {
+ /* Duplicate the argument strings. */
+ char *memory;
+
+ orig_prefix_len = strlen (orig_prefix_arg);
+ curr_prefix_len = strlen (curr_prefix_arg);
+ memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (memory != NULL)
+#endif
+ {
+ memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+ orig_prefix = memory;
+ memory += orig_prefix_len + 1;
+ memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+ curr_prefix = memory;
+ return;
+ }
+ }
+ orig_prefix = NULL;
+ curr_prefix = NULL;
+ /* Don't worry about wasted memory here - this function is usually only
+ called once. */
+}
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+ set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+ /* Now notify all dependent libraries. */
+#if DEPENDS_ON_LIBCHARSET
+ libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+ libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+ libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE)
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+char *
+compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname)
+{
+ char *curr_installdir;
+ const char *rel_installdir;
+
+ if (curr_pathname == NULL)
+ return NULL;
+
+ /* Determine the relative installation directory, relative to the prefix.
+ This is simply the difference between orig_installprefix and
+ orig_installdir. */
+ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+ != 0)
+ /* Shouldn't happen - nothing should be installed outside $(prefix). */
+ return NULL;
+ rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+ /* Determine the current installation directory. */
+ {
+ const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname);
+ const char *p = curr_pathname + strlen (curr_pathname);
+ char *q;
+
+ while (p > p_base)
+ {
+ p--;
+ if (ISSLASH (*p))
+ break;
+ }
+
+ q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+ if (q == NULL)
+ return NULL;
+#endif
+ memcpy (q, curr_pathname, p - curr_pathname);
+ q[p - curr_pathname] = '\0';
+ curr_installdir = q;
+ }
+
+ /* Compute the current installation prefix by removing the trailing
+ rel_installdir from it. */
+ {
+ const char *rp = rel_installdir + strlen (rel_installdir);
+ const char *cp = curr_installdir + strlen (curr_installdir);
+ const char *cp_base =
+ curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir);
+
+ while (rp > rel_installdir && cp > cp_base)
+ {
+ bool same = false;
+ const char *rpi = rp;
+ const char *cpi = cp;
+
+ while (rpi > rel_installdir && cpi > cp_base)
+ {
+ rpi--;
+ cpi--;
+ if (ISSLASH (*rpi) || ISSLASH (*cpi))
+ {
+ if (ISSLASH (*rpi) && ISSLASH (*cpi))
+ same = true;
+ break;
+ }
+ /* Do case-insensitive comparison if the file system is always or
+ often case-insensitive. It's better to accept the comparison
+ if the difference is only in case, rather than to fail. */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS - case insignificant file system */
+ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+ != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+ break;
+#else
+ if (*rpi != *cpi)
+ break;
+#endif
+ }
+ if (!same)
+ break;
+ /* The last pathname component was the same. opi and cpi now point
+ to the slash before it. */
+ rp = rpi;
+ cp = cpi;
+ }
+
+ if (rp > rel_installdir)
+ {
+ /* Unexpected: The curr_installdir does not end with rel_installdir. */
+ free (curr_installdir);
+ return NULL;
+ }
+
+ {
+ size_t curr_prefix_len = cp - curr_installdir;
+ char *curr_prefix;
+
+ curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+ if (curr_prefix == NULL)
+ {
+ free (curr_installdir);
+ return NULL;
+ }
+#endif
+ memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+ curr_prefix[curr_prefix_len] = '\0';
+
+ free (curr_installdir);
+
+ return curr_prefix;
+ }
+ }
+}
+
+#endif /* !IN_LIBRARY || PIC */
+
+#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+
+/* Full pathname of shared library, or NULL. */
+static char *shared_library_fullname;
+
+#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
+/* Native Win32 only.
+ On Cygwin, it is better to use the Cygwin provided /proc interface, than
+ to use native Win32 API and cygwin_conv_to_posix_path, because it supports
+ longer file names
+ (see <http://cygwin.com/ml/cygwin/2011-01/msg00410.html>). */
+
+/* Determine the full pathname of the shared library when it is loaded. */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+ (void) reserved;
+
+ if (event == DLL_PROCESS_ATTACH)
+ {
+ /* The DLL is being loaded into an application's address range. */
+ static char location[MAX_PATH];
+
+ if (!GetModuleFileName (module_handle, location, sizeof (location)))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ if (!IS_PATH_WITH_DIR (location))
+ /* Shouldn't happen. */
+ return FALSE;
+
+ shared_library_fullname = strdup (location);
+ }
+
+ return TRUE;
+}
+
+#else /* Unix */
+
+static void
+find_shared_library_fullname ()
+{
+#if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+ /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+ function.
+ Cygwin >= 1.5 has /proc/self/maps and the getline() function too.
+ But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on
+ Cygwin 1.7. */
+ FILE *fp;
+
+ /* Open the current process' maps file. It describes one VMA per line. */
+ fp = fopen ("/proc/self/maps", "r");
+ if (fp)
+ {
+ unsigned long address = (unsigned long) &find_shared_library_fullname;
+ for (;;)
+ {
+ unsigned long start, end;
+ int c;
+
+ if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+ break;
+ if (address >= start && address <= end - 1)
+ {
+ /* Found it. Now see if this line contains a filename. */
+ while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+ continue;
+ if (c == '/')
+ {
+ size_t size;
+ int len;
+
+ ungetc (c, fp);
+ shared_library_fullname = NULL; size = 0;
+ len = getline (&shared_library_fullname, &size, fp);
+ if (len >= 0)
+ {
+ /* Success: filled shared_library_fullname. */
+ if (len > 0 && shared_library_fullname[len - 1] == '\n')
+ shared_library_fullname[len - 1] = '\0';
+ }
+ }
+ break;
+ }
+ while (c = getc (fp), c != EOF && c != '\n')
+ continue;
+ }
+ fclose (fp);
+ }
+#endif
+}
+
+#endif /* WIN32 / Unix */
+
+/* Return the full pathname of the current shared library.
+ Return NULL if unknown.
+ Guaranteed to work only on Linux, Cygwin and Woe32. */
+static char *
+get_shared_library_fullname ()
+{
+#if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+ static bool tried_find_shared_library_fullname;
+ if (!tried_find_shared_library_fullname)
+ {
+ find_shared_library_fullname ();
+ tried_find_shared_library_fullname = true;
+ }
+#endif
+ return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+ static int initialized;
+
+ /* Initialization code for a shared library. */
+ if (!initialized)
+ {
+ /* At this point, orig_prefix and curr_prefix likely have already been
+ set through the main program's set_program_name_and_installdir
+ function. This is sufficient in the case that the library has
+ initially been installed in the same orig_prefix. But we can do
+ better, to also cover the cases that 1. it has been installed
+ in a different prefix before being moved to orig_prefix and (later)
+ to curr_prefix, 2. unlike the program, it has not moved away from
+ orig_prefix. */
+ const char *orig_installprefix = INSTALLPREFIX;
+ const char *orig_installdir = INSTALLDIR;
+ char *curr_prefix_better;
+
+ curr_prefix_better =
+ compute_curr_prefix (orig_installprefix, orig_installdir,
+ get_shared_library_fullname ());
+
+ set_relocation_prefix (orig_installprefix,
+ curr_prefix_better != NULL
+ ? curr_prefix_better
+ : curr_prefix);
+
+ if (curr_prefix_better != NULL)
+ free (curr_prefix_better);
+
+ initialized = 1;
+ }
+#endif
+
+ /* Note: It is not necessary to perform case insensitive comparison here,
+ even for DOS-like file systems, because the pathname argument was
+ typically created from the same Makefile variable as orig_prefix came
+ from. */
+ if (orig_prefix != NULL && curr_prefix != NULL
+ && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+ {
+ if (pathname[orig_prefix_len] == '\0')
+ {
+ /* pathname equals orig_prefix. */
+ char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ strcpy (result, curr_prefix);
+ return result;
+ }
+ }
+ else if (ISSLASH (pathname[orig_prefix_len]))
+ {
+ /* pathname starts with orig_prefix. */
+ const char *pathname_tail = &pathname[orig_prefix_len];
+ char *result =
+ (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+ if (result != NULL)
+#endif
+ {
+ memcpy (result, curr_prefix, curr_prefix_len);
+ strcpy (result + curr_prefix_len, pathname_tail);
+ return result;
+ }
+ }
+ }
+ /* Nothing to relocate. */
+ return pathname;
+}
+
+#endif
diff --git a/gnulib/lib/relocatable.h b/gnulib/lib/relocatable.h
new file mode 100644
index 0000000..80c43e6
--- /dev/null
+++ b/gnulib/lib/relocatable.h
@@ -0,0 +1,81 @@
+/* Provide relocatable packages.
+ Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This can be enabled through the configure --enable-relocatable option. */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions. Note that because
+ this is a private .h file, we don't need to use __declspec(dllimport)
+ in any case. */
+#if HAVE_VISIBILITY && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default")))
+#elif defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+ Relocation simply replaces a pathname starting with the original prefix
+ by the corresponding pathname with the current prefix instead. Both
+ prefixes should be directory names without trailing slash (i.e. use ""
+ instead of "/"). */
+extern RELOCATABLE_DLL_EXPORTED void
+ set_relocation_prefix (const char *orig_prefix,
+ const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+ directory.
+ The returned string is either PATHNAME unmodified or a freshly allocated
+ string that you can free with free() after casting it to 'char *'. */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() potentially allocates memory, because it has
+ to construct a fresh pathname. If this is a problem because your program
+ calls relocate() frequently, think about caching the result. Or free the
+ return value if it was different from the argument pathname. */
+
+/* Convenience function:
+ Computes the current installation prefix, based on the original
+ installation prefix, the original installation directory of a particular
+ file, and the current pathname of this file.
+ Returns it, freshly allocated. Returns NULL upon failure. */
+extern char * compute_curr_prefix (const char *orig_installprefix,
+ const char *orig_installdir,
+ const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames. */
+#define relocate(pathname) (pathname)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RELOCATABLE_H */
diff --git a/gnulib/lib/relocwrapper.c b/gnulib/lib/relocwrapper.c
new file mode 100644
index 0000000..5422896
--- /dev/null
+++ b/gnulib/lib/relocwrapper.c
@@ -0,0 +1,198 @@
+/* Relocating wrapper program.
+ Copyright (C) 2003, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Dependencies:
+ relocwrapper
+ -> progname
+ -> progreloc
+ -> areadlink
+ -> careadlinkat
+ -> allocator
+ -> readlink
+ -> canonicalize-lgpl
+ -> malloca
+ -> readlink
+ -> relocatable
+ -> setenv
+ -> malloca
+ -> c-ctype
+
+ Macros that need to be set while compiling this file:
+ - ENABLE_RELOCATABLE 1
+ - INSTALLPREFIX the base installation directory
+ - INSTALLDIR the directory into which this program is installed
+ - LIBPATHVAR the platform dependent runtime library path variable
+ - LIBDIRS a comma-terminated list of strings representing the list of
+ directories that contain the libraries at installation time
+
+ We don't want to internationalize this wrapper because then it would
+ depend on libintl and therefore need relocation itself. So use only
+ libc functions, no gettext(), no error(), no xmalloc(), no xsetenv().
+ */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "progname.h"
+#include "relocatable.h"
+#include "c-ctype.h"
+#include "verify.h"
+
+/* Use the system functions, not the gnulib overrides in this file. */
+#undef fprintf
+
+/* Return a copy of the filename, with an extra ".bin" at the end.
+ More generally, it replaces "${EXEEXT}" at the end with ".bin${EXEEXT}". */
+static char *
+add_dotbin (const char *filename)
+{
+ size_t filename_len = strlen (filename);
+ char *result = (char *) malloc (filename_len + 4 + 1);
+
+ if (result != NULL)
+ {
+ if (sizeof (EXEEXT) > sizeof (""))
+ {
+ /* EXEEXT handling. */
+ const size_t exeext_len = sizeof (EXEEXT) - sizeof ("");
+ static const char exeext[] = EXEEXT;
+ if (filename_len > exeext_len)
+ {
+ /* Compare using an inlined copy of c_strncasecmp(), because
+ the filenames may have undergone a case conversion since
+ they were packaged. In other words, EXEEXT may be ".exe"
+ on one system and ".EXE" on another. */
+ const char *s1 = filename + filename_len - exeext_len;
+ const char *s2 = exeext;
+ for (; *s1 != '\0'; s1++, s2++)
+ {
+ unsigned char c1 = *s1;
+ unsigned char c2 = *s2;
+ if (c_tolower (c1) != c_tolower (c2))
+ goto simple_append;
+ }
+ /* Insert ".bin" before EXEEXT or its equivalent. */
+ memcpy (result, filename, filename_len - exeext_len);
+ memcpy (result + filename_len - exeext_len, ".bin", 4);
+ memcpy (result + filename_len - exeext_len + 4,
+ filename + filename_len - exeext_len,
+ exeext_len + 1);
+ return result;
+ }
+ }
+ simple_append:
+ /* Simply append ".bin". */
+ memcpy (result, filename, filename_len);
+ memcpy (result + filename_len, ".bin", 4 + 1);
+ return result;
+ }
+ else
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+}
+
+/* List of directories that contain the libraries. */
+static const char *libdirs[] = { LIBDIRS NULL };
+/* Verify that at least one directory is given. */
+verify (sizeof (libdirs) / sizeof (libdirs[0]) > 1);
+
+/* Relocate the list of directories that contain the libraries. */
+static void
+relocate_libdirs ()
+{
+ size_t i;
+
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ libdirs[i] = relocate (libdirs[i]);
+}
+
+/* Activate the list of directories in the LIBPATHVAR. */
+static void
+activate_libdirs ()
+{
+ const char *old_value;
+ size_t total;
+ size_t i;
+ char *value;
+ char *p;
+
+ old_value = getenv (LIBPATHVAR);
+ if (old_value == NULL)
+ old_value = "";
+
+ total = 0;
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ total += strlen (libdirs[i]) + 1;
+ total += strlen (old_value) + 1;
+
+ value = (char *) malloc (total);
+ if (value == NULL)
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+ p = value;
+ for (i = 0; i < sizeof (libdirs) / sizeof (libdirs[0]) - 1; i++)
+ {
+ size_t len = strlen (libdirs[i]);
+ memcpy (p, libdirs[i], len);
+ p += len;
+ *p++ = ':';
+ }
+ if (old_value[0] != '\0')
+ strcpy (p, old_value);
+ else
+ p[-1] = '\0';
+
+ if (setenv (LIBPATHVAR, value, 1) < 0)
+ {
+ fprintf (stderr, "%s: %s\n", program_name, "memory exhausted");
+ exit (1);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ char *full_program_name;
+
+ /* Set the program name and perform preparations for
+ get_full_program_name() and relocate(). */
+ set_program_name_and_installdir (argv[0], INSTALLPREFIX, INSTALLDIR);
+
+ /* Get the full program path. (Important if accessed through a symlink.) */
+ full_program_name = get_full_program_name ();
+ if (full_program_name == NULL)
+ full_program_name = argv[0];
+
+ /* Invoke the real program, with suffix ".bin". */
+ argv[0] = add_dotbin (full_program_name);
+ relocate_libdirs ();
+ activate_libdirs ();
+ execv (argv[0], argv);
+ fprintf (stderr, "%s: could not execute %s: %s\n",
+ program_name, argv[0], strerror (errno));
+ exit (127);
+}
diff --git a/gnulib/lib/remove.c b/gnulib/lib/remove.c
new file mode 100644
index 0000000..0fb5b32
--- /dev/null
+++ b/gnulib/lib/remove.c
@@ -0,0 +1,43 @@
+/* Remove a file or directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#undef remove
+
+/* Remove NAME from the file system. This works around C89 platforms
+ that don't handle directories like POSIX requires; it also works
+ around Solaris 9 bugs with trailing slash. */
+int
+rpl_remove (char const *name)
+{
+ /* It is faster to just try rmdir, and fall back on unlink, than it
+ is to use lstat to see what we are about to remove. Technically,
+ it is more likely that we want unlink, not rmdir, but we cannot
+ guarantee the safety of unlink on directories. Trailing slash
+ bugs are handled by our rmdir and unlink wrappers. */
+ int result = rmdir (name);
+ if (result && errno == ENOTDIR)
+ result = unlink (name);
+ return result;
+}
diff --git a/gnulib/lib/rename.c b/gnulib/lib/rename.c
new file mode 100644
index 0000000..e498f65
--- /dev/null
+++ b/gnulib/lib/rename.c
@@ -0,0 +1,473 @@
+/* Work around rename bugs in some systems.
+
+ Copyright (C) 2001-2003, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Volker Borchert, Eric Blake. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#undef rename
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* The mingw rename has problems with trailing slashes; it also
+ requires use of native Windows calls to allow atomic renames over
+ existing files. */
+
+# include <errno.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include "dirname.h"
+
+/* Rename the file SRC to DST. This replacement is necessary on
+ Windows, on which the system rename function will not replace
+ an existing DST. */
+int
+rpl_rename (char const *src, char const *dst)
+{
+ int error;
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_base = last_component (src);
+ char *dst_base = last_component (dst);
+ bool src_slash;
+ bool dst_slash;
+ bool dst_exists;
+ struct stat src_st;
+ struct stat dst_st;
+
+ /* Filter out dot as last component. */
+ if (!src_len || !dst_len)
+ {
+ errno = ENOENT;
+ return -1;
+ }
+ if (*src_base == '.')
+ {
+ size_t len = base_len (src_base);
+ if (len == 1 || (len == 2 && src_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ if (*dst_base == '.')
+ {
+ size_t len = base_len (dst_base);
+ if (len == 1 || (len == 2 && dst_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. There are no symlinks on mingw, so stat
+ works instead of lstat. */
+ src_slash = ISSLASH (src[src_len - 1]);
+ dst_slash = ISSLASH (dst[dst_len - 1]);
+ if (stat (src, &src_st))
+ return -1;
+ if (stat (dst, &dst_st))
+ {
+ if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash))
+ return -1;
+ dst_exists = false;
+ }
+ else
+ {
+ if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode))
+ {
+ errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR;
+ return -1;
+ }
+ dst_exists = true;
+ }
+
+ /* There are no symlinks, so if a file existed with a trailing
+ slash, it must be a directory, and we don't have to worry about
+ stripping strip trailing slash. However, mingw refuses to
+ replace an existing empty directory, so we have to help it out.
+ And canonicalize_file_name is not yet ported to mingw; however,
+ for directories, getcwd works as a viable alternative. Ensure
+ that we can get back to where we started before using it; later
+ attempts to return are fatal. Note that we can end up losing a
+ directory if rename then fails, but it was empty, so not much
+ damage was done. */
+ if (dst_exists && S_ISDIR (dst_st.st_mode))
+ {
+ char *cwd = getcwd (NULL, 0);
+ char *src_temp;
+ char *dst_temp;
+ if (!cwd || chdir (cwd))
+ return -1;
+ if (IS_ABSOLUTE_FILE_NAME (src))
+ {
+ dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0);
+ src_temp = chdir (src) ? NULL : getcwd (NULL, 0);
+ }
+ else
+ {
+ src_temp = chdir (src) ? NULL : getcwd (NULL, 0);
+ if (!IS_ABSOLUTE_FILE_NAME (dst) && chdir (cwd))
+ abort ();
+ dst_temp = chdir (dst) ? NULL : getcwd (NULL, 0);
+ }
+ if (chdir (cwd))
+ abort ();
+ free (cwd);
+ if (!src_temp || !dst_temp)
+ {
+ free (src_temp);
+ free (dst_temp);
+ errno = ENOMEM;
+ return -1;
+ }
+ src_len = strlen (src_temp);
+ if (strncmp (src_temp, dst_temp, src_len) == 0
+ && (ISSLASH (dst_temp[src_len]) || dst_temp[src_len] == '\0'))
+ {
+ error = dst_temp[src_len];
+ free (src_temp);
+ free (dst_temp);
+ if (error)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+ }
+ if (rmdir (dst))
+ {
+ error = errno;
+ free (src_temp);
+ free (dst_temp);
+ errno = error;
+ return -1;
+ }
+ free (src_temp);
+ free (dst_temp);
+ }
+
+ /* MoveFileEx works if SRC is a directory without any flags, but
+ fails with MOVEFILE_REPLACE_EXISTING, so try without flags first.
+ Thankfully, MoveFileEx handles hard links correctly, even though
+ rename() does not. */
+ if (MoveFileEx (src, dst, 0))
+ return 0;
+
+ /* Retry with MOVEFILE_REPLACE_EXISTING if the move failed
+ due to the destination already existing. */
+ error = GetLastError ();
+ if (error == ERROR_FILE_EXISTS || error == ERROR_ALREADY_EXISTS)
+ {
+ if (MoveFileEx (src, dst, MOVEFILE_REPLACE_EXISTING))
+ return 0;
+
+ error = GetLastError ();
+ }
+
+ switch (error)
+ {
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_DIRECTORY:
+ errno = ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ errno = EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_CURRENT_DIRECTORY:
+ errno = EBUSY;
+ break;
+
+ case ERROR_NOT_SAME_DEVICE:
+ errno = EXDEV;
+ break;
+
+ case ERROR_WRITE_PROTECT:
+ errno = EROFS;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ case ERROR_HANDLE_DISK_FULL:
+ case ERROR_DISK_FULL:
+ case ERROR_DISK_TOO_FRAGMENTED:
+ errno = ENOSPC;
+ break;
+
+ case ERROR_FILE_EXISTS:
+ case ERROR_ALREADY_EXISTS:
+ errno = EEXIST;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_INVALID_NAME:
+ case ERROR_DELETE_PENDING:
+ errno = EPERM; /* ? */
+ break;
+
+# ifndef ERROR_FILE_TOO_LARGE
+/* This value is documented but not defined in all versions of windows.h. */
+# define ERROR_FILE_TOO_LARGE 223
+# endif
+ case ERROR_FILE_TOO_LARGE:
+ errno = EFBIG;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ return -1;
+}
+
+#else /* ! W32 platform */
+
+# include <errno.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/stat.h>
+# include <unistd.h>
+
+# include "dirname.h"
+# include "same-inode.h"
+
+/* Rename the file SRC to DST, fixing any trailing slash bugs. */
+
+int
+rpl_rename (char const *src, char const *dst)
+{
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_temp = (char *) src;
+ char *dst_temp = (char *) dst;
+ bool src_slash;
+ bool dst_slash;
+ bool dst_exists;
+ int ret_val = -1;
+ int rename_errno = ENOTDIR;
+ struct stat src_st;
+ struct stat dst_st;
+
+ if (!src_len || !dst_len)
+ return rename (src, dst); /* Let strace see the ENOENT failure. */
+
+# if RENAME_DEST_EXISTS_BUG
+ {
+ char *src_base = last_component (src);
+ char *dst_base = last_component (dst);
+ if (*src_base == '.')
+ {
+ size_t len = base_len (src_base);
+ if (len == 1 || (len == 2 && src_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ if (*dst_base == '.')
+ {
+ size_t len = base_len (dst_base);
+ if (len == 1 || (len == 2 && dst_base[1] == '.'))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ }
+ }
+# endif /* RENAME_DEST_EXISTS_BUG */
+
+ src_slash = src[src_len - 1] == '/';
+ dst_slash = dst[dst_len - 1] == '/';
+
+# if !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG
+ /* If there are no trailing slashes, then trust the native
+ implementation unless we also suspect issues with hard link
+ detection or file/directory conflicts. */
+ if (!src_slash && !dst_slash)
+ return rename (src, dst);
+# endif /* !RENAME_HARD_LINK_BUG && !RENAME_DEST_EXISTS_BUG */
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. */
+ if (lstat (src, &src_st))
+ return -1;
+ if (lstat (dst, &dst_st))
+ {
+ if (errno != ENOENT || (!S_ISDIR (src_st.st_mode) && dst_slash))
+ return -1;
+ dst_exists = false;
+ }
+ else
+ {
+ if (S_ISDIR (dst_st.st_mode) != S_ISDIR (src_st.st_mode))
+ {
+ errno = S_ISDIR (dst_st.st_mode) ? EISDIR : ENOTDIR;
+ return -1;
+ }
+# if RENAME_HARD_LINK_BUG
+ if (SAME_INODE (src_st, dst_st))
+ return 0;
+# endif /* RENAME_HARD_LINK_BUG */
+ dst_exists = true;
+ }
+
+# if (RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG \
+ || RENAME_HARD_LINK_BUG)
+ /* If the only bug was that a trailing slash was allowed on a
+ non-existing file destination, as in Solaris 10, then we've
+ already covered that situation. But if there is any problem with
+ a trailing slash on an existing source or destination, as in
+ Solaris 9, or if a directory can overwrite a symlink, as on
+ Cygwin 1.5, or if directories cannot be created with trailing
+ slash, as on NetBSD 1.6, then we must strip the offending slash
+ and check that we have not encountered a symlink instead of a
+ directory.
+
+ Stripping a trailing slash interferes with POSIX semantics, where
+ rename behavior on a symlink with a trailing slash operates on
+ the corresponding target directory. We prefer the GNU semantics
+ of rejecting any use of a symlink with trailing slash, but do not
+ enforce them, since Solaris 10 is able to obey POSIX semantics
+ and there might be clients expecting it, as counter-intuitive as
+ those semantics are.
+
+ Technically, we could also follow the POSIX behavior by chasing a
+ readlink trail, but that is harder to implement. */
+ if (src_slash)
+ {
+ src_temp = strdup (src);
+ if (!src_temp)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (src_temp);
+ if (lstat (src_temp, &src_st))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ if (S_ISLNK (src_st.st_mode))
+ goto out;
+ }
+ if (dst_slash)
+ {
+ dst_temp = strdup (dst);
+ if (!dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (dst_temp);
+ if (lstat (dst_temp, &dst_st))
+ {
+ if (errno != ENOENT)
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+ else if (S_ISLNK (dst_st.st_mode))
+ goto out;
+ }
+# endif /* RENAME_TRAILING_SLASH_SOURCE_BUG || RENAME_DEST_EXISTS_BUG
+ || RENAME_HARD_LINK_BUG */
+
+# if RENAME_DEST_EXISTS_BUG
+ /* Cygwin 1.5 sometimes behaves oddly when moving a non-empty
+ directory on top of an empty one (the old directory name can
+ reappear if the new directory tree is removed). Work around this
+ by removing the target first, but don't remove the target if it
+ is a subdirectory of the source. Note that we can end up losing
+ a directory if rename then fails, but it was empty, so not much
+ damage was done. */
+ if (dst_exists && S_ISDIR (dst_st.st_mode))
+ {
+ if (src_st.st_dev != dst_st.st_dev)
+ {
+ rename_errno = EXDEV;
+ goto out;
+ }
+ if (src_temp != src)
+ free (src_temp);
+ src_temp = canonicalize_file_name (src);
+ if (dst_temp != dst)
+ free (dst_temp);
+ dst_temp = canonicalize_file_name (dst);
+ if (!src_temp || !dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ src_len = strlen (src_temp);
+ if (strncmp (src_temp, dst_temp, src_len) == 0
+ && dst_temp[src_len] == '/')
+ {
+ rename_errno = EINVAL;
+ goto out;
+ }
+ if (rmdir (dst))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+# endif /* RENAME_DEST_EXISTS_BUG */
+
+ ret_val = rename (src_temp, dst_temp);
+ rename_errno = errno;
+ out:
+ if (src_temp != src)
+ free (src_temp);
+ if (dst_temp != dst)
+ free (dst_temp);
+ errno = rename_errno;
+ return ret_val;
+}
+#endif /* ! W32 platform */
diff --git a/gnulib/lib/renameat.c b/gnulib/lib/renameat.c
new file mode 100644
index 0000000..bcb5f1e
--- /dev/null
+++ b/gnulib/lib/renameat.c
@@ -0,0 +1,157 @@
+/* Rename a file relative to open directories.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <stdio.h>
+
+#if HAVE_RENAMEAT
+
+# include <errno.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/stat.h>
+
+# include "dirname.h"
+# include "openat.h"
+
+# undef renameat
+
+/* renameat does not honor trailing / on Solaris 10. Solve it in a
+ similar manner to rename. No need to worry about bugs not present
+ on Solaris, since all other systems either lack renameat or honor
+ trailing slash correctly. */
+
+int
+rpl_renameat (int fd1, char const *src, int fd2, char const *dst)
+{
+ size_t src_len = strlen (src);
+ size_t dst_len = strlen (dst);
+ char *src_temp = (char *) src;
+ char *dst_temp = (char *) dst;
+ bool src_slash;
+ bool dst_slash;
+ int ret_val = -1;
+ int rename_errno = ENOTDIR;
+ struct stat src_st;
+ struct stat dst_st;
+
+ /* Let strace see any ENOENT failure. */
+ if (!src_len || !dst_len)
+ return renameat (fd1, src, fd2, dst);
+
+ src_slash = src[src_len - 1] == '/';
+ dst_slash = dst[dst_len - 1] == '/';
+ if (!src_slash && !dst_slash)
+ return renameat (fd1, src, fd2, dst);
+
+ /* Presence of a trailing slash requires directory semantics. If
+ the source does not exist, or if the destination cannot be turned
+ into a directory, give up now. Otherwise, strip trailing slashes
+ before calling rename. */
+ if (lstatat (fd1, src, &src_st))
+ return -1;
+ if (lstatat (fd2, dst, &dst_st))
+ {
+ if (errno != ENOENT || !S_ISDIR (src_st.st_mode))
+ return -1;
+ }
+ else if (!S_ISDIR (dst_st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ else if (!S_ISDIR (src_st.st_mode))
+ {
+ errno = EISDIR;
+ return -1;
+ }
+
+# if RENAME_TRAILING_SLASH_SOURCE_BUG
+ /* See the lengthy comment in rename.c why Solaris 9 is forced to
+ GNU behavior, while Solaris 10 is left with POSIX behavior,
+ regarding symlinks with trailing slash. */
+ if (src_slash)
+ {
+ src_temp = strdup (src);
+ if (!src_temp)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (src_temp);
+ if (lstatat (fd1, src_temp, &src_st))
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ if (S_ISLNK (src_st.st_mode))
+ goto out;
+ }
+ if (dst_slash)
+ {
+ dst_temp = strdup (dst);
+ if (!dst_temp)
+ {
+ rename_errno = ENOMEM;
+ goto out;
+ }
+ strip_trailing_slashes (dst_temp);
+ if (lstatat (fd2, dst_temp, &dst_st))
+ {
+ if (errno != ENOENT)
+ {
+ rename_errno = errno;
+ goto out;
+ }
+ }
+ else if (S_ISLNK (dst_st.st_mode))
+ goto out;
+ }
+# endif /* RENAME_TRAILING_SLASH_SOURCE_BUG */
+
+ ret_val = renameat (fd1, src_temp, fd2, dst_temp);
+ rename_errno = errno;
+ out:
+ if (src_temp != src)
+ free (src_temp);
+ if (dst_temp != dst)
+ free (dst_temp);
+ errno = rename_errno;
+ return ret_val;
+}
+
+#else /* !HAVE_RENAMEAT */
+
+# include "openat-priv.h"
+
+/* Rename FILE1, in the directory open on descriptor FD1, to FILE2, in
+ the directory open on descriptor FD2. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then rename/restore_cwd. If either the save_cwd or
+ the restore_cwd fails, then give a diagnostic and exit nonzero. */
+
+int
+renameat (int fd1, char const *file1, int fd2, char const *file2)
+{
+ return at_func2 (fd1, file1, fd2, file2, rename);
+}
+
+#endif /* !HAVE_RENAMEAT */
diff --git a/gnulib/lib/resource-ext.h b/gnulib/lib/resource-ext.h
new file mode 100644
index 0000000..145ce25
--- /dev/null
+++ b/gnulib/lib/resource-ext.h
@@ -0,0 +1,47 @@
+/* Extra functions for resource usage.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _RESOURCE_EXT_H
+#define _RESOURCE_EXT_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Returns the amount of address space currently in use by the current
+ process, or zero if unknown.
+ This is the quantity which is limited by setrlimit(RLIMIT_AS,...).
+ Note: This function always returns zero on AIX. */
+extern uintptr_t get_rusage_as (void);
+
+/* Returns the size of the data segment, or zero if unknown.
+ This is the quantity which is limited by setrlimit(RLIMIT_DATA,...).
+ Note: This function always returns zero on HP-UX 11.00.
+ Note: The total size of all malloc()ed memory is bounded by the size of
+ the data segment only on the following platforms:
+ FreeBSD, AIX, HP-UX 11.23 and newer, IRIX, OSF/1, Solaris, BeOS, Haiku. */
+extern uintptr_t get_rusage_data (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RESOURCE_EXT_H */
diff --git a/gnulib/lib/rewinddir.c b/gnulib/lib/rewinddir.c
new file mode 100644
index 0000000..bfb9108
--- /dev/null
+++ b/gnulib/lib/rewinddir.c
@@ -0,0 +1,49 @@
+/* Restart reading the entries of a directory from the beginning.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+
+#include "dirent-private.h"
+
+void
+rewinddir (DIR *dirp)
+{
+ /* Like in closedir(). */
+ if (dirp->current != INVALID_HANDLE_VALUE)
+ FindClose (dirp->current);
+
+ /* Like in opendir(). */
+ dirp->status = -1;
+ dirp->current = FindFirstFile (dirp->dir_name_mask, &dirp->entry);
+ if (dirp->current == INVALID_HANDLE_VALUE)
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_FILE_NOT_FOUND:
+ dirp->status = -2;
+ break;
+ default:
+ /* Save the error code for the next readdir() call. */
+ dirp->status = ENOENT;
+ break;
+ }
+ }
+}
diff --git a/gnulib/lib/rijndael-alg-fst.c b/gnulib/lib/rijndael-alg-fst.c
new file mode 100644
index 0000000..a24c80f
--- /dev/null
+++ b/gnulib/lib/rijndael-alg-fst.c
@@ -0,0 +1,1083 @@
+/* rijndael-alg-fst.c --- Rijndael cipher implementation.
+ * Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson.
+ *
+ * Based on public domain "Optimised C code" retrieved from (SHA1
+ * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
+ * http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
+ */
+
+#include <config.h>
+
+/**
+ * rijndael-alg-fst.c
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
+ */
+
+#include "rijndael-alg-fst.h"
+
+/*
+Te0[x] = S [x].[02, 01, 01, 03];
+Te1[x] = S [x].[03, 02, 01, 01];
+Te2[x] = S [x].[01, 03, 02, 01];
+Te3[x] = S [x].[01, 01, 03, 02];
+Te4[x] = S [x].[01, 01, 01, 01];
+
+Td0[x] = Si[x].[0e, 09, 0d, 0b];
+Td1[x] = Si[x].[0b, 0e, 09, 0d];
+Td2[x] = Si[x].[0d, 0b, 0e, 09];
+Td3[x] = Si[x].[09, 0d, 0b, 0e];
+Td4[x] = Si[x].[01, 01, 01, 01];
+*/
+
+static const uint32_t Te0[256] = {
+ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
+ 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
+ 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
+ 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
+ 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
+ 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
+ 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
+ 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
+ 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
+ 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
+ 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
+ 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
+ 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
+ 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
+ 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
+ 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
+ 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
+ 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
+ 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
+ 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
+ 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
+ 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
+ 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
+ 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
+ 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
+ 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
+ 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
+ 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
+ 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
+ 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
+ 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
+ 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
+ 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
+ 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
+ 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
+ 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
+ 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
+ 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
+ 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
+ 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
+ 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
+ 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
+ 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
+ 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
+ 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
+ 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
+ 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
+ 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
+ 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
+ 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
+ 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
+ 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
+ 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
+ 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
+ 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
+ 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
+ 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
+ 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
+ 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
+ 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
+ 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
+ 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
+ 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
+ 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
+};
+static const uint32_t Te1[256] = {
+ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
+ 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
+ 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
+ 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
+ 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
+ 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
+ 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
+ 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
+ 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
+ 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
+ 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
+ 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
+ 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
+ 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
+ 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
+ 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
+ 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
+ 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
+ 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
+ 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
+ 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
+ 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
+ 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
+ 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
+ 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
+ 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
+ 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
+ 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
+ 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
+ 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
+ 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
+ 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
+ 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
+ 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
+ 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
+ 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
+ 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
+ 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
+ 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
+ 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
+ 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
+ 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
+ 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
+ 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
+ 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
+ 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
+ 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
+ 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
+ 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
+ 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
+ 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
+ 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
+ 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
+ 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
+ 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
+ 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
+ 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
+ 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
+ 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
+ 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
+ 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
+ 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
+ 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
+ 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
+};
+static const uint32_t Te2[256] = {
+ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
+ 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
+ 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
+ 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
+ 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
+ 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
+ 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
+ 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
+ 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
+ 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
+ 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
+ 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
+ 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
+ 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
+ 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
+ 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
+ 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
+ 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
+ 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
+ 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
+ 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
+ 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
+ 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
+ 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
+ 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
+ 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
+ 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
+ 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
+ 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
+ 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
+ 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
+ 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
+ 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
+ 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
+ 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
+ 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
+ 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
+ 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
+ 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
+ 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
+ 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
+ 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
+ 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
+ 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
+ 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
+ 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
+ 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
+ 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
+ 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
+ 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
+ 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
+ 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
+ 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
+ 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
+ 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
+ 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
+ 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
+ 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
+ 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
+ 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
+ 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
+ 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
+ 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
+ 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
+};
+static const uint32_t Te3[256] = {
+ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
+ 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
+ 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
+ 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
+ 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
+ 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
+ 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
+ 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
+ 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
+ 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
+ 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
+ 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
+ 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
+ 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
+ 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
+ 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
+ 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
+ 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
+ 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
+ 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
+ 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
+ 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
+ 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
+ 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
+ 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
+ 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
+ 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
+ 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
+ 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
+ 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
+ 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
+ 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
+ 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
+ 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
+ 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
+ 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
+ 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
+ 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
+ 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
+ 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
+ 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
+ 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
+ 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
+ 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
+ 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
+ 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
+ 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
+ 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
+ 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
+ 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
+ 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
+ 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
+ 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
+ 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
+ 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
+ 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
+ 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
+ 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
+ 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
+ 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
+ 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
+ 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
+ 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
+ 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
+};
+static const uint32_t Te4[256] = {
+ 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
+ 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
+ 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
+ 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
+ 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
+ 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
+ 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
+ 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
+ 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
+ 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
+ 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
+ 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
+ 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
+ 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
+ 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
+ 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
+ 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
+ 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
+ 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
+ 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
+ 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
+ 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
+ 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
+ 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
+ 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
+ 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
+ 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
+ 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
+ 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
+ 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
+ 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
+ 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
+ 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
+ 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
+ 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
+ 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
+ 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
+ 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
+ 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
+ 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
+ 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
+ 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
+ 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
+ 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
+ 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
+ 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
+ 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
+ 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
+ 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
+ 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
+ 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
+ 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
+ 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
+ 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
+ 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
+ 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
+ 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
+ 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
+ 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
+ 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
+ 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
+ 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
+ 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
+ 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
+};
+static const uint32_t Td0[256] = {
+ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
+ 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
+ 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
+ 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
+ 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
+ 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
+ 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
+ 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
+ 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
+ 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
+ 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
+ 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
+ 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
+ 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
+ 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
+ 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
+ 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
+ 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
+ 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
+ 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
+ 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
+ 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
+ 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
+ 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
+ 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
+ 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
+ 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
+ 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
+ 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
+ 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
+ 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
+ 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
+ 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
+ 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
+ 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
+ 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
+ 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
+ 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
+ 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
+ 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
+ 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
+ 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
+ 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
+ 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
+ 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
+ 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
+ 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
+ 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
+ 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
+ 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
+ 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
+ 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
+ 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
+ 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
+ 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
+ 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
+ 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
+ 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
+ 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
+ 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
+ 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
+ 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
+ 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
+ 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
+};
+static const uint32_t Td1[256] = {
+ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
+ 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
+ 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
+ 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
+ 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
+ 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
+ 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
+ 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
+ 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
+ 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
+ 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
+ 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
+ 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
+ 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
+ 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
+ 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
+ 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
+ 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
+ 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
+ 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
+ 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
+ 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
+ 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
+ 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
+ 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
+ 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
+ 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
+ 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
+ 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
+ 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
+ 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
+ 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
+ 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
+ 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
+ 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
+ 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
+ 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
+ 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
+ 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
+ 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
+ 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
+ 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
+ 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
+ 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
+ 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
+ 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
+ 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
+ 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
+ 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
+ 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
+ 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
+ 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
+ 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
+ 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
+ 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
+ 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
+ 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
+ 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
+ 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
+ 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
+ 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
+ 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
+ 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
+ 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
+};
+static const uint32_t Td2[256] = {
+ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
+ 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
+ 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
+ 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
+ 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
+ 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
+ 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
+ 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
+ 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
+ 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
+ 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
+ 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
+ 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
+ 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
+ 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
+ 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
+ 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
+ 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
+ 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
+ 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
+ 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
+ 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
+ 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
+ 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
+ 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
+ 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
+ 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
+ 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
+ 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
+ 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
+ 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
+ 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
+ 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
+ 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
+ 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
+ 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
+ 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
+ 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
+ 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
+ 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
+ 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
+ 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
+ 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
+ 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
+ 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
+ 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
+ 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
+ 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
+ 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
+ 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
+ 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
+ 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
+ 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
+ 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
+ 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
+ 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
+ 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
+ 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
+ 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
+ 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
+ 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
+ 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
+ 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
+ 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
+};
+static const uint32_t Td3[256] = {
+ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
+ 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
+ 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
+ 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
+ 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
+ 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
+ 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
+ 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
+ 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
+ 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
+ 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
+ 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
+ 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
+ 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
+ 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
+ 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
+ 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
+ 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
+ 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
+ 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
+ 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
+ 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
+ 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
+ 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
+ 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
+ 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
+ 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
+ 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
+ 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
+ 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
+ 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
+ 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
+ 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
+ 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
+ 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
+ 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
+ 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
+ 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
+ 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
+ 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
+ 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
+ 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
+ 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
+ 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
+ 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
+ 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
+ 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
+ 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
+ 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
+ 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
+ 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
+ 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
+ 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
+ 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
+ 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
+ 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
+ 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
+ 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
+ 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
+ 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
+ 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
+ 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
+ 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
+ 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
+};
+static const uint32_t Td4[256] = {
+ 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
+ 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
+ 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
+ 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
+ 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
+ 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
+ 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
+ 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
+ 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
+ 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
+ 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
+ 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
+ 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
+ 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
+ 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
+ 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
+ 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
+ 0x86868686, 0x68686868, 0x98989898, 0x16161616,
+ 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
+ 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
+ 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
+ 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
+ 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
+ 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
+ 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
+ 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
+ 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
+ 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
+ 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
+ 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
+ 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
+ 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
+ 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
+ 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
+ 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
+ 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
+ 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
+ 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
+ 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
+ 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
+ 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
+ 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
+ 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
+ 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
+ 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
+ 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
+ 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
+ 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
+ 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
+ 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
+ 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
+ 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
+ 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
+ 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
+ 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
+ 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
+ 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
+ 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
+ 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
+ 0x83838383, 0x53535353, 0x99999999, 0x61616161,
+ 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
+ 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
+ 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
+ 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
+};
+static const uint32_t rcon[] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+ /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+#define GETU32(pt) (((uint32_t)((pt)[0] & 0xFF) << 24) ^ \
+ ((uint32_t)((pt)[1] & 0xFF) << 16) ^ \
+ ((uint32_t)((pt)[2] & 0xFF) << 8) ^ \
+ ((uint32_t)((pt)[3] & 0xFF)))
+#define PUTU32(ct, st) { \
+ (ct)[0] = (char)((st) >> 24); \
+ (ct)[1] = (char)((st) >> 16); \
+ (ct)[2] = (char)((st) >> 8); \
+ (ct)[3] = (char)(st); }
+
+/**
+ * Expand the cipher key into the encryption key schedule.
+ *
+ * @return the number of rounds for the given cipher key size.
+ */
+int
+rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits)
+{
+ size_t i = 0;
+ uint32_t temp;
+
+ rk[0] = GETU32 (cipherKey);
+ rk[1] = GETU32 (cipherKey + 4);
+ rk[2] = GETU32 (cipherKey + 8);
+ rk[3] = GETU32 (cipherKey + 12);
+ if (keyBits == 128)
+ {
+ for (;;)
+ {
+ temp = rk[3];
+ rk[4] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[5] = rk[1] ^ rk[4];
+ rk[6] = rk[2] ^ rk[5];
+ rk[7] = rk[3] ^ rk[6];
+ if (++i == 10)
+ {
+ return 10;
+ }
+ rk += 4;
+ }
+ }
+ rk[4] = GETU32 (cipherKey + 16);
+ rk[5] = GETU32 (cipherKey + 20);
+ if (keyBits == 192)
+ {
+ for (;;)
+ {
+ temp = rk[5];
+ rk[6] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[7] = rk[1] ^ rk[6];
+ rk[8] = rk[2] ^ rk[7];
+ rk[9] = rk[3] ^ rk[8];
+ if (++i == 8)
+ {
+ return 12;
+ }
+ rk[10] = rk[4] ^ rk[9];
+ rk[11] = rk[5] ^ rk[10];
+ rk += 6;
+ }
+ }
+ rk[6] = GETU32 (cipherKey + 24);
+ rk[7] = GETU32 (cipherKey + 28);
+ if (keyBits == 256)
+ {
+ for (;;)
+ {
+ temp = rk[7];
+ rk[8] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
+ rk[9] = rk[1] ^ rk[8];
+ rk[10] = rk[2] ^ rk[9];
+ rk[11] = rk[3] ^ rk[10];
+ if (++i == 7)
+ {
+ return 14;
+ }
+ temp = rk[11];
+ rk[12] = rk[4] ^
+ (Te4[(temp >> 24)] & 0xff000000) ^
+ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp) & 0xff] & 0x000000ff);
+ rk[13] = rk[5] ^ rk[12];
+ rk[14] = rk[6] ^ rk[13];
+ rk[15] = rk[7] ^ rk[14];
+
+ rk += 8;
+ }
+ }
+ return 0;
+}
+
+/**
+ * Expand the cipher key into the decryption key schedule.
+ *
+ * @return the number of rounds for the given cipher key size.
+ */
+int
+rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits)
+{
+ size_t Nr, i, j;
+ uint32_t temp;
+
+ /* expand the cipher key: */
+ Nr = rijndaelKeySetupEnc (rk, cipherKey, keyBits);
+ /* invert the order of the round keys: */
+ for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4)
+ {
+ temp = rk[i];
+ rk[i] = rk[j];
+ rk[j] = temp;
+ temp = rk[i + 1];
+ rk[i + 1] = rk[j + 1];
+ rk[j + 1] = temp;
+ temp = rk[i + 2];
+ rk[i + 2] = rk[j + 2];
+ rk[j + 2] = temp;
+ temp = rk[i + 3];
+ rk[i + 3] = rk[j + 3];
+ rk[j + 3] = temp;
+ }
+ /* apply the inverse MixColumn transform to all round keys but the
+ first and the last: */
+ for (i = 1; i < Nr; i++)
+ {
+ rk += 4;
+ rk[0] =
+ Td0[Te4[(rk[0] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[0]) & 0xff] & 0xff];
+ rk[1] =
+ Td0[Te4[(rk[1] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[1]) & 0xff] & 0xff];
+ rk[2] =
+ Td0[Te4[(rk[2] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[2]) & 0xff] & 0xff];
+ rk[3] =
+ Td0[Te4[(rk[3] >> 24)] & 0xff] ^
+ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[3]) & 0xff] & 0xff];
+ }
+ return Nr;
+}
+
+void
+rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char pt[16], char ct[16])
+{
+ uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+ size_t r;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32 (pt) ^ rk[0];
+ s1 = GETU32 (pt + 4) ^ rk[1];
+ s2 = GETU32 (pt + 8) ^ rk[2];
+ s3 = GETU32 (pt + 12) ^ rk[3];
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = Nr >> 1;
+ for (;;)
+ {
+ t0 =
+ Te0[(s0 >> 24)] ^
+ Te1[(s1 >> 16) & 0xff] ^
+ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4];
+ t1 =
+ Te0[(s1 >> 24)] ^
+ Te1[(s2 >> 16) & 0xff] ^
+ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5];
+ t2 =
+ Te0[(s2 >> 24)] ^
+ Te1[(s3 >> 16) & 0xff] ^
+ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6];
+ t3 =
+ Te0[(s3 >> 24)] ^
+ Te1[(s0 >> 16) & 0xff] ^
+ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7];
+
+ rk += 8;
+ if (--r == 0)
+ {
+ break;
+ }
+
+ s0 =
+ Te0[(t0 >> 24)] ^
+ Te1[(t1 >> 16) & 0xff] ^
+ Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0];
+ s1 =
+ Te0[(t1 >> 24)] ^
+ Te1[(t2 >> 16) & 0xff] ^
+ Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1];
+ s2 =
+ Te0[(t2 >> 24)] ^
+ Te1[(t3 >> 16) & 0xff] ^
+ Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2];
+ s3 =
+ Te0[(t3 >> 24)] ^
+ Te1[(t0 >> 16) & 0xff] ^
+ Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3];
+ }
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Te4[(t0 >> 24)] & 0xff000000) ^
+ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0];
+ PUTU32 (ct, s0);
+ s1 =
+ (Te4[(t1 >> 24)] & 0xff000000) ^
+ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1];
+ PUTU32 (ct + 4, s1);
+ s2 =
+ (Te4[(t2 >> 24)] & 0xff000000) ^
+ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2];
+ PUTU32 (ct + 8, s2);
+ s3 =
+ (Te4[(t3 >> 24)] & 0xff000000) ^
+ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3];
+ PUTU32 (ct + 12, s3);
+}
+
+void
+rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char ct[16], char pt[16])
+{
+ uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
+ size_t r;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32 (ct) ^ rk[0];
+ s1 = GETU32 (ct + 4) ^ rk[1];
+ s2 = GETU32 (ct + 8) ^ rk[2];
+ s3 = GETU32 (ct + 12) ^ rk[3];
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = Nr >> 1;
+ for (;;)
+ {
+ t0 =
+ Td0[(s0 >> 24)] ^
+ Td1[(s3 >> 16) & 0xff] ^
+ Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4];
+ t1 =
+ Td0[(s1 >> 24)] ^
+ Td1[(s0 >> 16) & 0xff] ^
+ Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5];
+ t2 =
+ Td0[(s2 >> 24)] ^
+ Td1[(s1 >> 16) & 0xff] ^
+ Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6];
+ t3 =
+ Td0[(s3 >> 24)] ^
+ Td1[(s2 >> 16) & 0xff] ^
+ Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7];
+
+ rk += 8;
+ if (--r == 0)
+ {
+ break;
+ }
+
+ s0 =
+ Td0[(t0 >> 24)] ^
+ Td1[(t3 >> 16) & 0xff] ^
+ Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0];
+ s1 =
+ Td0[(t1 >> 24)] ^
+ Td1[(t0 >> 16) & 0xff] ^
+ Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1];
+ s2 =
+ Td0[(t2 >> 24)] ^
+ Td1[(t1 >> 16) & 0xff] ^
+ Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2];
+ s3 =
+ Td0[(t3 >> 24)] ^
+ Td1[(t2 >> 16) & 0xff] ^
+ Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3];
+ }
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Td4[(t0 >> 24)] & 0xff000000) ^
+ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0];
+ PUTU32 (pt, s0);
+ s1 =
+ (Td4[(t1 >> 24)] & 0xff000000) ^
+ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1];
+ PUTU32 (pt + 4, s1);
+ s2 =
+ (Td4[(t2 >> 24)] & 0xff000000) ^
+ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2];
+ PUTU32 (pt + 8, s2);
+ s3 =
+ (Td4[(t3 >> 24)] & 0xff000000) ^
+ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3];
+ PUTU32 (pt + 12, s3);
+}
diff --git a/gnulib/lib/rijndael-alg-fst.h b/gnulib/lib/rijndael-alg-fst.h
new file mode 100644
index 0000000..2cfe1fc
--- /dev/null
+++ b/gnulib/lib/rijndael-alg-fst.h
@@ -0,0 +1,67 @@
+/* rijndael-alg-fst.h --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson. */
+
+/**
+ * rijndael-alg-fst.h
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __RIJNDAEL_ALG_FST_H
+#define __RIJNDAEL_ALG_FST_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#define RIJNDAEL_MAXKC (256/32)
+#define RIJNDAEL_MAXKB (256/8)
+#define RIJNDAEL_MAXNR 14
+
+int rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits);
+int rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
+ const char cipherKey[], size_t keyBits);
+void rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char pt[16], char ct[16]);
+void rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
+ const char ct[16], char pt[16]);
+
+#endif /* __RIJNDAEL_ALG_FST_H */
diff --git a/gnulib/lib/rijndael-api-fst.c b/gnulib/lib/rijndael-api-fst.c
new file mode 100644
index 0000000..3da0d5b
--- /dev/null
+++ b/gnulib/lib/rijndael-api-fst.c
@@ -0,0 +1,521 @@
+/* rijndael-api-fst.c --- Rijndael cipher implementation.
+ * Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson.
+ *
+ * Based on public domain "Optimised C code" retrieved from (SHA1
+ * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
+ * http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
+ */
+
+#include <config.h>
+
+/**
+ * rijndael-api-fst.c
+ *
+ * @version 2.9 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
+ *
+ * Acknowledgements:
+ *
+ * We are deeply indebted to the following people for their bug reports,
+ * fixes, and improvement suggestions to this implementation. Though we
+ * tried to list all contributions, we apologise in advance for any
+ * missing reference.
+ *
+ * Andrew Bales <Andrew.Bales@Honeywell.com>
+ * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
+ * John Skodon <skodonj@webquill.com>
+ */
+
+#include "rijndael-alg-fst.h"
+#include "rijndael-api-fst.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+rijndael_rc
+rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction,
+ size_t keyLen, const char *keyMaterial)
+{
+ size_t i;
+ char *keyMat;
+ char cipherKey[RIJNDAEL_MAXKB];
+
+ if (key == NULL)
+ {
+ return RIJNDAEL_BAD_KEY_INSTANCE;
+ }
+
+ if ((direction == RIJNDAEL_DIR_ENCRYPT)
+ || (direction == RIJNDAEL_DIR_DECRYPT))
+ {
+ key->direction = direction;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_KEY_DIR;
+ }
+
+ if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256))
+ {
+ key->keyLen = keyLen;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_KEY_MAT;
+ }
+
+ if (keyMaterial != NULL)
+ {
+ strncpy (key->keyMaterial, keyMaterial, keyLen / 4);
+ }
+
+ /* initialize key schedule: */
+ keyMat = key->keyMaterial;
+ for (i = 0; i < key->keyLen / 8; i++)
+ {
+ char t, v;
+
+ t = *keyMat++;
+ if ((t >= '0') && (t <= '9'))
+ v = (t - '0') << 4;
+ else if ((t >= 'a') && (t <= 'f'))
+ v = (t - 'a' + 10) << 4;
+ else if ((t >= 'A') && (t <= 'F'))
+ v = (t - 'A' + 10) << 4;
+ else
+ return RIJNDAEL_BAD_KEY_MAT;
+
+ t = *keyMat++;
+ if ((t >= '0') && (t <= '9'))
+ v ^= (t - '0');
+ else if ((t >= 'a') && (t <= 'f'))
+ v ^= (t - 'a' + 10);
+ else if ((t >= 'A') && (t <= 'F'))
+ v ^= (t - 'A' + 10);
+ else
+ return RIJNDAEL_BAD_KEY_MAT;
+
+ cipherKey[i] = v;
+ }
+ if (direction == RIJNDAEL_DIR_ENCRYPT)
+ {
+ key->Nr = rijndaelKeySetupEnc (key->rk, cipherKey, keyLen);
+ }
+ else
+ {
+ key->Nr = rijndaelKeySetupDec (key->rk, cipherKey, keyLen);
+ }
+ rijndaelKeySetupEnc (key->ek, cipherKey, keyLen);
+ return 0;
+}
+
+rijndael_rc
+rijndaelCipherInit (rijndaelCipherInstance *cipher, rijndael_mode mode,
+ const char *IV)
+{
+ if ((mode == RIJNDAEL_MODE_ECB) || (mode == RIJNDAEL_MODE_CBC)
+ || (mode == RIJNDAEL_MODE_CFB1))
+ {
+ cipher->mode = mode;
+ }
+ else
+ {
+ return RIJNDAEL_BAD_CIPHER_MODE;
+ }
+ if (IV != NULL)
+ {
+ int i;
+ for (i = 0; i < RIJNDAEL_MAX_IV_SIZE; i++)
+ {
+ int t, j;
+
+ t = IV[2 * i];
+ if ((t >= '0') && (t <= '9'))
+ j = (t - '0') << 4;
+ else if ((t >= 'a') && (t <= 'f'))
+ j = (t - 'a' + 10) << 4;
+ else if ((t >= 'A') && (t <= 'F'))
+ j = (t - 'A' + 10) << 4;
+ else
+ return RIJNDAEL_BAD_CIPHER_INSTANCE;
+
+ t = IV[2 * i + 1];
+ if ((t >= '0') && (t <= '9'))
+ j ^= (t - '0');
+ else if ((t >= 'a') && (t <= 'f'))
+ j ^= (t - 'a' + 10);
+ else if ((t >= 'A') && (t <= 'F'))
+ j ^= (t - 'A' + 10);
+ else
+ return RIJNDAEL_BAD_CIPHER_INSTANCE;
+
+ cipher->IV[i] = (uint8_t) j;
+ }
+ }
+ else
+ {
+ memset (cipher->IV, 0, RIJNDAEL_MAX_IV_SIZE);
+ }
+ return 0;
+}
+
+int
+rijndaelBlockEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputLen, char *outBuffer)
+{
+ size_t i, k, t, numBlocks;
+ char block[16], *iv;
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputLen <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputLen / 128;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelEncrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ ((uint32_t *) block)[0] = ((uint32_t *) input)[0] ^
+ ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] = ((uint32_t *) input)[1] ^
+ ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] = ((uint32_t *) input)[2] ^
+ ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] = ((uint32_t *) input)[3] ^
+ ((uint32_t *) iv)[3];
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CFB1:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ memcpy (outBuffer, input, 16);
+ for (k = 0; k < 128; k++)
+ {
+ rijndaelEncrypt (key->ek, key->Nr, iv, block);
+ outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
+ for (t = 0; t < 15; t++)
+ {
+ iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
+ }
+ iv[15] = (iv[15] << 1) |
+ ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1);
+ }
+ outBuffer += 16;
+ input += 16;
+ }
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 128 * numBlocks;
+}
+
+int
+rijndaelPadEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputOctets, char *outBuffer)
+{
+ size_t i, numBlocks, padLen;
+ char block[16], *iv;
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_DECRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputOctets <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputOctets / 16;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelEncrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ padLen = 16 - (inputOctets - 16 * numBlocks);
+ assert (padLen > 0 && padLen <= 16);
+ memcpy (block, input, 16 - padLen);
+ memset (block + 16 - padLen, padLen, padLen);
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ ((uint32_t *) block)[0] = ((uint32_t *) input)[0] ^
+ ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] = ((uint32_t *) input)[1] ^
+ ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] = ((uint32_t *) input)[2] ^
+ ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] = ((uint32_t *) input)[3] ^
+ ((uint32_t *) iv)[3];
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ padLen = 16 - (inputOctets - 16 * numBlocks);
+ assert (padLen > 0 && padLen <= 16);
+ for (i = 0; i < 16 - padLen; i++)
+ {
+ block[i] = input[i] ^ iv[i];
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ block[i] = (char) padLen ^ iv[i];
+ }
+ rijndaelEncrypt (key->rk, key->Nr, block, outBuffer);
+ memcpy (cipher->IV, outBuffer, 16);
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 16 * (numBlocks + 1);
+}
+
+int
+rijndaelBlockDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputLen, char *outBuffer)
+{
+ size_t i, k, t, numBlocks;
+ char block[16], *iv;
+
+ if (cipher == NULL
+ || key == NULL
+ || (cipher->mode != RIJNDAEL_MODE_CFB1
+ && key->direction == RIJNDAEL_DIR_ENCRYPT))
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputLen <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+
+ numBlocks = inputLen / 128;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) iv)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) iv)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) iv)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) iv)[3];
+ memcpy (cipher->IV, input, 16);
+ memcpy (outBuffer, block, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ break;
+
+ case RIJNDAEL_MODE_CFB1:
+ iv = cipher->IV;
+ for (i = numBlocks; i > 0; i--)
+ {
+ memcpy (outBuffer, input, 16);
+ for (k = 0; k < 128; k++)
+ {
+ rijndaelEncrypt (key->ek, key->Nr, iv, block);
+ for (t = 0; t < 15; t++)
+ {
+ iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
+ }
+ iv[15] = (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1);
+ outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
+ }
+ outBuffer += 16;
+ input += 16;
+ }
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 128 * numBlocks;
+}
+
+int
+rijndaelPadDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input,
+ size_t inputOctets, char *outBuffer)
+{
+ size_t i, numBlocks, padLen;
+ char block[16];
+
+ if (cipher == NULL || key == NULL || key->direction == RIJNDAEL_DIR_ENCRYPT)
+ {
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+ if (input == NULL || inputOctets <= 0)
+ {
+ return 0; /* nothing to do */
+ }
+ if (inputOctets % 16 != 0)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+
+ numBlocks = inputOctets / 16;
+
+ switch (cipher->mode)
+ {
+ case RIJNDAEL_MODE_ECB:
+ /* all blocks but last */
+ for (i = numBlocks - 1; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, outBuffer);
+ input += 16;
+ outBuffer += 16;
+ }
+ /* last block */
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ padLen = block[15];
+ if (padLen >= 16)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ if (block[i] != padLen)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ }
+ memcpy (outBuffer, block, 16 - padLen);
+ break;
+
+ case RIJNDAEL_MODE_CBC:
+ /* all blocks but last */
+ for (i = numBlocks - 1; i > 0; i--)
+ {
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) cipher->IV)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) cipher->IV)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) cipher->IV)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) cipher->IV)[3];
+ memcpy (cipher->IV, input, 16);
+ memcpy (outBuffer, block, 16);
+ input += 16;
+ outBuffer += 16;
+ }
+ /* last block */
+ rijndaelDecrypt (key->rk, key->Nr, input, block);
+ ((uint32_t *) block)[0] ^= ((uint32_t *) cipher->IV)[0];
+ ((uint32_t *) block)[1] ^= ((uint32_t *) cipher->IV)[1];
+ ((uint32_t *) block)[2] ^= ((uint32_t *) cipher->IV)[2];
+ ((uint32_t *) block)[3] ^= ((uint32_t *) cipher->IV)[3];
+ padLen = block[15];
+ if (padLen <= 0 || padLen > 16)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ for (i = 16 - padLen; i < 16; i++)
+ {
+ if (block[i] != padLen)
+ {
+ return RIJNDAEL_BAD_DATA;
+ }
+ }
+ memcpy (outBuffer, block, 16 - padLen);
+ break;
+
+ default:
+ return RIJNDAEL_BAD_CIPHER_STATE;
+ }
+
+ return 16 * numBlocks - padLen;
+}
diff --git a/gnulib/lib/rijndael-api-fst.h b/gnulib/lib/rijndael-api-fst.h
new file mode 100644
index 0000000..f024a4b
--- /dev/null
+++ b/gnulib/lib/rijndael-api-fst.h
@@ -0,0 +1,207 @@
+/* rijndael-api-fst.h --- Rijndael cipher implementation.
+ * Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ */
+
+/* Adapted for gnulib by Simon Josefsson. */
+
+/**
+ * rijndael-api-fst.h
+ *
+ * @version 2.9 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto@terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
+ *
+ * Acknowledgements:
+ *
+ * We are deeply indebted to the following people for their bug reports,
+ * fixes, and improvement suggestions to this implementation. Though we
+ * tried to list all contributions, we apologise in advance for any
+ * missing reference.
+ *
+ * Andrew Bales <Andrew.Bales@Honeywell.com>
+ * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
+ * John Skodon <skodonj@webquill.com>
+ */
+
+#ifndef __RIJNDAEL_API_FST_H
+#define __RIJNDAEL_API_FST_H
+
+#include "rijndael-alg-fst.h"
+
+#include <stdio.h>
+
+/* Default number of bits in a cipher block */
+#define RIJNDAEL_BITSPERBLOCK 128
+
+/* Number of ASCII char's needed to represent a key */
+#define RIJNDAEL_MAX_KEY_SIZE 64
+
+/* Number bytes needed to represent an IV */
+#define RIJNDAEL_MAX_IV_SIZE 16
+
+typedef enum
+{
+ /* Key direction is invalid, e.g., unknown value */
+ RIJNDAEL_BAD_KEY_DIR = -1,
+ /* Key material not of correct length */
+ RIJNDAEL_BAD_KEY_MAT = -2,
+ /* Key passed is not valid */
+ RIJNDAEL_BAD_KEY_INSTANCE = -3,
+ /* Params struct passed to cipherInit invalid */
+ RIJNDAEL_BAD_CIPHER_MODE = -4,
+ /* Cipher in wrong state (e.g., not initialized) */
+ RIJNDAEL_BAD_CIPHER_STATE = -5,
+ RIJNDAEL_BAD_BLOCK_LENGTH = -6,
+ RIJNDAEL_BAD_CIPHER_INSTANCE = -7,
+ /* Data contents are invalid, e.g., invalid padding */
+ RIJNDAEL_BAD_DATA = -8,
+ /* Unknown error */
+ RIJNDAEL_BAD_OTHER = -9
+} rijndael_rc;
+
+typedef enum
+{
+ RIJNDAEL_DIR_ENCRYPT = 0, /* Are we encrypting? */
+ RIJNDAEL_DIR_DECRYPT = 1 /* Are we decrypting? */
+} rijndael_direction;
+
+typedef enum
+{
+ RIJNDAEL_MODE_ECB = 1, /* Are we ciphering in ECB mode? */
+ RIJNDAEL_MODE_CBC = 2, /* Are we ciphering in CBC mode? */
+ RIJNDAEL_MODE_CFB1 = 3 /* Are we ciphering in 1-bit CFB mode? */
+} rijndael_mode;
+
+/* The structure for key information */
+typedef struct
+{
+ /* Key used for encrypting or decrypting? */
+ rijndael_direction direction;
+ /* Length of the key */
+ size_t keyLen;
+ /* Raw key data in ASCII, e.g., user input or KAT values */
+ char keyMaterial[RIJNDAEL_MAX_KEY_SIZE + 1];
+ /* key-length-dependent number of rounds */
+ int Nr;
+ /* key schedule */
+ uint32_t rk[4 * (RIJNDAEL_MAXNR + 1)];
+ /* CFB1 key schedule (encryption only) */
+ uint32_t ek[4 * (RIJNDAEL_MAXNR + 1)];
+} rijndaelKeyInstance;
+
+/* The structure for cipher information */
+typedef struct
+{ /* changed order of the components */
+ rijndael_mode mode; /* MODE_ECB, MODE_CBC, or MODE_CFB1 */
+ /* A possible Initialization Vector for ciphering */
+ char IV[RIJNDAEL_MAX_IV_SIZE];
+} rijndaelCipherInstance;
+
+/* Function prototypes */
+
+/* Create KEY, for encryption or decryption depending on DIRECTION,
+ from KEYMATERIAL, a hex string, of KEYLEN size. KEYLEN should be
+ 128, 192 or 256. Returns 0 on success, or an error code. */
+extern rijndael_rc
+rijndaelMakeKey (rijndaelKeyInstance *key, rijndael_direction direction,
+ size_t keyLen, const char *keyMaterial);
+
+/* Initialize cipher state CIPHER for encryption MODE (e.g.,
+ RIJNDAEL_MODE_CBC) with initialization vector IV, a hex string of
+ 2*RIJNDAEL_MAX_IV_SIZE length. IV may be NULL for modes that do
+ not need an IV (i.e., RIJNDAEL_MODE_ECB). */
+extern rijndael_rc
+rijndaelCipherInit (rijndaelCipherInstance *cipher,
+ rijndael_mode mode, const char *IV);
+
+/* Encrypt data in INPUT, of INPUTLEN/8 bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelBlockEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputLen,
+ char *outBuffer);
+
+/* Encrypt data in INPUT, of INPUTOCTETS bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTOCTETS aligned to the next block size boundary.
+ Ciphertext-Stealing as described in RFC 2040 is used to encrypt
+ partial blocks. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelPadEncrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputOctets,
+ char *outBuffer);
+
+/* Decrypt data in INPUT, of INPUTLEN/8 bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTLEN/8 bytes of data. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelBlockDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputLen,
+ char *outBuffer);
+
+/* Decrypt data in INPUT, of INPUTOCTETS bytes length, placing the
+ output in the pre-allocated OUTBUFFER which must hold at least
+ INPUTOCTETS aligned to the next block size boundary.
+ Ciphertext-Stealing as described in RFC 2040 is used to encrypt
+ partial blocks. The CIPHER is used as state, and must be
+ initialized with rijndaelCipherInit before calling this function.
+ The encryption KEY must be initialized with rijndaelMakeKey before
+ calling this function. Return the number of bits written, or a
+ negative rijndael_rc error code. */
+extern int
+rijndaelPadDecrypt (rijndaelCipherInstance *cipher,
+ const rijndaelKeyInstance *key,
+ const char *input, size_t inputOctets,
+ char *outBuffer);
+
+#endif /* __RIJNDAEL_API_FST_H */
diff --git a/gnulib/lib/rint.c b/gnulib/lib/rint.c
new file mode 100644
index 0000000..7eefe7a
--- /dev/null
+++ b/gnulib/lib/rint.c
@@ -0,0 +1,112 @@
+/* Round according to the current rounding mode.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+#include <stdlib.h>
+
+#undef MIN
+
+#ifdef USE_LONG_DOUBLE
+# define RINT rintl
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define MIN LDBL_MIN
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define RINT rint
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define MIN DBL_MIN
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define RINT rintf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define MIN FLT_MIN
+# define L_(literal) literal##f
+#endif
+
+/* -0.0. See minus-zero.h. */
+#if defined __hpux || defined __sgi || defined __ICC
+# define MINUS_ZERO (-MIN * MIN)
+#else
+# define MINUS_ZERO L_(-0.0)
+#endif
+
+DOUBLE
+RINT (DOUBLE x)
+{
+ /* 2^(MANT_DIG-1). */
+ static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+ /* The use of 'volatile' guarantees that excess precision bits are dropped at
+ each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and
+ compiler option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE z = x;
+
+ /* Consider the current rounding mode, cf.
+ <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/float.h.html>.
+ This implementation supports only rounds-to-nearest. */
+ if (FLT_ROUNDS != 1)
+ abort ();
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding error for x = 0.5 - 2^(-MANT_DIG-1). */
+ if (z < L_(0.5))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ else if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer. */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding error for x = -(0.5 - 2^(-MANT_DIG-1)). */
+ if (z > - L_(0.5))
+ z = MINUS_ZERO;
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ else if (z > -TWO_MANT_DIG)
+ {
+ /* Round to the next integer. */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/rintf.c b/gnulib/lib/rintf.c
new file mode 100644
index 0000000..948b679
--- /dev/null
+++ b/gnulib/lib/rintf.c
@@ -0,0 +1,19 @@
+/* Round according to the current rounding mode.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define USE_FLOAT
+#include "rint.c"
diff --git a/gnulib/lib/rintl.c b/gnulib/lib/rintl.c
new file mode 100644
index 0000000..d26935e
--- /dev/null
+++ b/gnulib/lib/rintl.c
@@ -0,0 +1,36 @@
+/* Round according to the current rounding mode.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+rintl (long double x)
+{
+ return rint (x);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "rint.c"
+
+#endif
diff --git a/gnulib/lib/rmdir.c b/gnulib/lib/rmdir.c
new file mode 100644
index 0000000..d7395a5
--- /dev/null
+++ b/gnulib/lib/rmdir.c
@@ -0,0 +1,53 @@
+/* Work around rmdir bugs.
+
+ Copyright (C) 1988, 1990, 1999, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+
+#include "dosname.h"
+
+#undef rmdir
+
+/* Remove directory DIR.
+ Return 0 if successful, -1 if not. */
+
+int
+rpl_rmdir (char const *dir)
+{
+ /* Work around cygwin 1.5.x bug where rmdir("dir/./") succeeds. */
+ size_t len = strlen (dir);
+ int result;
+ while (len && ISSLASH (dir[len - 1]))
+ len--;
+ if (len && dir[len - 1] == '.' && (1 == len || ISSLASH (dir[len - 2])))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ result = rmdir (dir);
+ /* Work around mingw bug, where rmdir("file/") fails with EINVAL
+ instead of ENOTDIR. We've already filtered out trailing ., the
+ only reason allowed by POSIX for EINVAL. */
+ if (result == -1 && errno == EINVAL)
+ errno = ENOTDIR;
+ return result;
+}
diff --git a/gnulib/lib/round.c b/gnulib/lib/round.c
new file mode 100644
index 0000000..a6c778e
--- /dev/null
+++ b/gnulib/lib/round.c
@@ -0,0 +1,170 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Ben Pfaff <blp@gnu.org>, 2007.
+ Based heavily on code by Bruno Haible. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#undef MIN
+
+#ifdef USE_LONG_DOUBLE
+# define ROUND roundl
+# define FLOOR floorl
+# define CEIL ceill
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define MIN LDBL_MIN
+# define L_(literal) literal##L
+# define HAVE_FLOOR_AND_CEIL HAVE_FLOORL_AND_CEILL
+#elif ! defined USE_FLOAT
+# define ROUND round
+# define FLOOR floor
+# define CEIL ceil
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define MIN DBL_MIN
+# define L_(literal) literal
+# define HAVE_FLOOR_AND_CEIL 1
+#else /* defined USE_FLOAT */
+# define ROUND roundf
+# define FLOOR floorf
+# define CEIL ceilf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define MIN FLT_MIN
+# define L_(literal) literal##f
+# define HAVE_FLOOR_AND_CEIL HAVE_FLOORF_AND_CEILF
+#endif
+
+/* -0.0. See minus-zero.h. */
+#if defined __hpux || defined __sgi || defined __ICC
+# define MINUS_ZERO (-MIN * MIN)
+#else
+# define MINUS_ZERO L_(-0.0)
+#endif
+
+/* If we're being included from test-round2[f].c, it already defined names for
+ our round implementations. Otherwise, pick the preferred implementation for
+ this machine. */
+#if !defined FLOOR_BASED_ROUND && !defined FLOOR_FREE_ROUND
+# if HAVE_FLOOR_AND_CEIL
+# define FLOOR_BASED_ROUND ROUND
+# else
+# define FLOOR_FREE_ROUND ROUND
+# endif
+#endif
+
+#ifdef FLOOR_BASED_ROUND
+/* An implementation of the C99 round function based on floor and ceil. We use
+ this when floor and ceil are available, on the assumption that they are
+ faster than the open-coded versions below. */
+DOUBLE
+FLOOR_BASED_ROUND (DOUBLE x)
+{
+ if (x >= L_(0.0))
+ {
+ DOUBLE y = FLOOR (x);
+ if (x - y >= L_(0.5))
+ y += L_(1.0);
+ return y;
+ }
+ else
+ {
+ DOUBLE y = CEIL (x);
+ if (y - x >= L_(0.5))
+ y -= L_(1.0);
+ return y;
+ }
+}
+#endif /* FLOOR_BASED_ROUND */
+
+#ifdef FLOOR_FREE_ROUND
+/* An implementation of the C99 round function without floor or ceil.
+ We use this when floor or ceil is missing. */
+DOUBLE
+FLOOR_FREE_ROUND (DOUBLE x)
+{
+ /* 2^(MANT_DIG-1). */
+ static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+ /* The use of 'volatile' guarantees that excess precision bits are dropped at
+ each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and
+ compiler option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* Avoid rounding error for x = 0.5 - 2^(-MANT_DIG-1). */
+ if (z < L_(0.5))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ else if (z < TWO_MANT_DIG)
+ {
+ /* Add 0.5 to the absolute value. */
+ y = z += L_(0.5);
+ /* Round to the next integer (nearest or up or down, doesn't
+ matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* Avoid rounding error for x = -(0.5 - 2^(-MANT_DIG-1)). */
+ if (z > - L_(0.5))
+ z = MINUS_ZERO;
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ else if (z > -TWO_MANT_DIG)
+ {
+ /* Add 0.5 to the absolute value. */
+ y = z -= L_(0.5);
+ /* Round to the next integer (nearest or up or down, doesn't
+ matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
+#endif /* FLOOR_FREE_ROUND */
+
diff --git a/gnulib/lib/roundf.c b/gnulib/lib/roundf.c
new file mode 100644
index 0000000..a9b9be7
--- /dev/null
+++ b/gnulib/lib/roundf.c
@@ -0,0 +1,19 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#define USE_FLOAT
+#include "round.c"
diff --git a/gnulib/lib/roundl.c b/gnulib/lib/roundl.c
new file mode 100644
index 0000000..9cf81db
--- /dev/null
+++ b/gnulib/lib/roundl.c
@@ -0,0 +1,36 @@
+/* Round toward nearest, breaking ties away from zero.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+roundl (long double x)
+{
+ return round (x);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "round.c"
+
+#endif
diff --git a/gnulib/lib/rpmatch.c b/gnulib/lib/rpmatch.c
new file mode 100644
index 0000000..ecc7917
--- /dev/null
+++ b/gnulib/lib/rpmatch.c
@@ -0,0 +1,173 @@
+/* Determine whether string value is affirmation or negative response
+ according to current locale's data.
+
+ Copyright (C) 1996, 1998, 2000, 2002-2003, 2006-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#if ENABLE_NLS
+# include <sys/types.h>
+# include <limits.h>
+# include <string.h>
+# if HAVE_LANGINFO_YESEXPR
+# include <langinfo.h>
+# endif
+# include <regex.h>
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+# define N_(msgid) gettext_noop (msgid)
+
+# if HAVE_LANGINFO_YESEXPR
+/* Return the localized regular expression pattern corresponding to
+ ENGLISH_PATTERN. NL_INDEX can be used with nl_langinfo.
+ The resulting string may only be used until the next nl_langinfo call. */
+static const char *
+localized_pattern (const char *english_pattern, nl_item nl_index,
+ bool posixly_correct)
+{
+ const char *translated_pattern;
+
+ /* We prefer to get the patterns from a PO file. It would be possible to
+ always use nl_langinfo (YESEXPR) instead of _("^[yY]"), and
+ nl_langinfo (NOEXPR) instead of _("^[nN]"), if we could assume that the
+ system's locale support is good. But this is not the case e.g. on Cygwin.
+ The localizations of gnulib.pot are of better quality in general.
+ Also, if we use locale info from non-free systems that don't have a
+ 'localedef' command, we deprive the users of the freedom to localize
+ this pattern for their preferred language.
+ But some programs, such as 'cp', 'mv', 'rm', 'find', 'xargs', are
+ specified by POSIX to use nl_langinfo (YESEXPR). We implement this
+ behaviour if POSIXLY_CORRECT is set, for the sake of these programs. */
+
+ /* If the user wants strict POSIX compliance, use nl_langinfo. */
+ if (posixly_correct)
+ {
+ translated_pattern = nl_langinfo (nl_index);
+ /* Check against a broken system return value. */
+ if (translated_pattern != NULL && translated_pattern[0] != '\0')
+ return translated_pattern;
+ }
+
+ /* Look in the gnulib message catalog. */
+ translated_pattern = _(english_pattern);
+ if (translated_pattern == english_pattern)
+ {
+ /* The gnulib message catalog provides no translation.
+ Try the system's message catalog. */
+ translated_pattern = nl_langinfo (nl_index);
+ /* Check against a broken system return value. */
+ if (translated_pattern != NULL && translated_pattern[0] != '\0')
+ return translated_pattern;
+ /* Fall back to English. */
+ translated_pattern = english_pattern;
+ }
+ return translated_pattern;
+}
+# else
+# define localized_pattern(english_pattern,nl_index,posixly_correct) \
+ _(english_pattern)
+# endif
+
+static int
+try (const char *response, const char *pattern, char **lastp, regex_t *re)
+{
+ if (*lastp == NULL || strcmp (pattern, *lastp) != 0)
+ {
+ char *safe_pattern;
+
+ /* The pattern has changed. */
+ if (*lastp != NULL)
+ {
+ /* Free the old compiled pattern. */
+ regfree (re);
+ free (*lastp);
+ *lastp = NULL;
+ }
+ /* Put the PATTERN into safe memory before calling regcomp.
+ (regcomp may call nl_langinfo, overwriting PATTERN's storage. */
+ safe_pattern = strdup (pattern);
+ if (safe_pattern == NULL)
+ return -1;
+ /* Compile the pattern and cache it for future runs. */
+ if (regcomp (re, safe_pattern, REG_EXTENDED) != 0)
+ return -1;
+ *lastp = safe_pattern;
+ }
+
+ /* See if the regular expression matches RESPONSE. */
+ return regexec (re, response, 0, NULL, 0) == 0;
+}
+#endif
+
+
+int
+rpmatch (const char *response)
+{
+#if ENABLE_NLS
+ /* Match against one of the response patterns, compiling the pattern
+ first if necessary. */
+
+ /* We cache the response patterns and compiled regexps here. */
+ static char *last_yesexpr, *last_noexpr;
+ static regex_t cached_yesre, cached_nore;
+
+# if HAVE_LANGINFO_YESEXPR
+ bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
+# endif
+
+ const char *yesexpr, *noexpr;
+ int result;
+
+ /* TRANSLATORS: A regular expression testing for an affirmative answer
+ (english: "yes"). Testing the first character may be sufficient.
+ Take care to consider upper and lower case.
+ To enquire the regular expression that your system uses for this
+ purpose, you can use the command
+ locale -k LC_MESSAGES | grep '^yesexpr=' */
+ yesexpr = localized_pattern (N_("^[yY]"), YESEXPR, posixly_correct);
+ result = try (response, yesexpr, &last_yesexpr, &cached_yesre);
+ if (result < 0)
+ return -1;
+ if (result)
+ return 1;
+
+ /* TRANSLATORS: A regular expression testing for a negative answer
+ (english: "no"). Testing the first character may be sufficient.
+ Take care to consider upper and lower case.
+ To enquire the regular expression that your system uses for this
+ purpose, you can use the command
+ locale -k LC_MESSAGES | grep '^noexpr=' */
+ noexpr = localized_pattern (N_("^[nN]"), NOEXPR, posixly_correct);
+ result = try (response, noexpr, &last_noexpr, &cached_nore);
+ if (result < 0)
+ return -1;
+ if (result)
+ return 0;
+
+ return -1;
+#else
+ /* Test against "^[yY]" and "^[nN]", hardcoded to avoid requiring regex */
+ return (*response == 'y' || *response == 'Y' ? 1
+ : *response == 'n' || *response == 'N' ? 0 : -1);
+#endif
+}
diff --git a/gnulib/lib/safe-alloc.c b/gnulib/lib/safe-alloc.c
new file mode 100644
index 0000000..482a59a
--- /dev/null
+++ b/gnulib/lib/safe-alloc.c
@@ -0,0 +1,121 @@
+/* safe-alloc.c: safer memory allocation
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Daniel Berrange <berrange@redhat.com>, 2008 */
+
+#include <config.h>
+
+/* Specification. */
+#include "safe-alloc.h"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <errno.h>
+
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1.
+
+ This is the same as xalloc_oversized from xalloc.h
+*/
+#define safe_alloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+
+/**
+ * safe_alloc_alloc_n:
+ * @ptrptr: pointer to pointer for address of allocated memory
+ * @size: number of bytes to allocate
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of memory 'count' elements long,
+ * each with 'size' bytes. Return the address of the
+ * allocated memory in 'ptrptr'. The newly allocated
+ * memory is filled with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+int
+safe_alloc_alloc_n (void *ptrptr, size_t size, size_t count, int zeroed)
+{
+ if (size == 0 || count == 0)
+ {
+ *(void **) ptrptr = NULL;
+ return 0;
+ }
+
+ if (safe_alloc_oversized (count, size))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ if (zeroed)
+ *(void **) ptrptr = calloc (count, size);
+ else
+ *(void **) ptrptr = malloc (count * size);
+
+ if (*(void **) ptrptr == NULL)
+ return -1;
+ return 0;
+}
+
+/**
+ * safe_alloc_realloc_n:
+ * @ptrptr: pointer to pointer for address of allocated memory
+ * @size: number of bytes to allocate
+ * @count: number of elements in array
+ *
+ * Resize the block of memory in 'ptrptr' to be an array of
+ * 'count' elements, each 'size' bytes in length. Update 'ptrptr'
+ * with the address of the newly allocated memory. On failure,
+ * 'ptrptr' is not changed and still points to the original memory
+ * block. The newly allocated memory is filled with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+int
+safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count)
+{
+ void *tmp;
+ if (size == 0 || count == 0)
+ {
+ free (*(void **) ptrptr);
+ *(void **) ptrptr = NULL;
+ return 0;
+ }
+ if (safe_alloc_oversized (count, size))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ tmp = realloc (*(void **) ptrptr, size * count);
+ if (!tmp)
+ return -1;
+ *(void **) ptrptr = tmp;
+ return 0;
+}
diff --git a/gnulib/lib/safe-alloc.h b/gnulib/lib/safe-alloc.h
new file mode 100644
index 0000000..269d1bf
--- /dev/null
+++ b/gnulib/lib/safe-alloc.h
@@ -0,0 +1,121 @@
+/* safe-alloc.h: safer memory allocation
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Daniel Berrange <berrange@redhat.com>, 2008 */
+
+#ifndef SAFE_ALLOC_H_
+# define SAFE_ALLOC_H_
+
+# include <stdlib.h>
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+# ifndef _GL_ATTRIBUTE_RETURN_CHECK
+# if __GNUC_PREREQ (3, 4)
+# define _GL_ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
+# else
+# define _GL_ATTRIBUTE_RETURN_CHECK
+# endif
+# endif
+
+/* Don't call these directly - use the macros below */
+int
+safe_alloc_alloc_n (void *ptrptr, size_t size, size_t count, int zeroed)
+ _GL_ATTRIBUTE_RETURN_CHECK;
+
+int
+safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count)
+ _GL_ATTRIBUTE_RETURN_CHECK;
+
+/**
+ * ALLOC:
+ * @ptr: pointer to hold address of allocated memory
+ *
+ * Allocate sizeof(*ptr) bytes of memory and store
+ * the address of allocated memory in 'ptr'. Fill the
+ * newly allocated memory with zeros.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+# define ALLOC(ptr) \
+ safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), 1, 1)
+
+/**
+ * ALLOC_N:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Fill the newly allocated memory with zeros.
+ *
+ * Return -1 on failure, 0 on success
+ */
+# define ALLOC_N(ptr, count) \
+ safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), (count), 1)
+
+/**
+ * ALLOC_N_UNINITIALIZED:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Do not initialize the new memory at all.
+ *
+ * Return -1 on failure to allocate, zero on success
+ */
+# define ALLOC_N_UNINITIALIZED(ptr, count) \
+ safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), (count), 0)
+
+/**
+ * REALLOC_N:
+ * @ptr: pointer to hold address of allocated memory
+ * @count: number of elements to allocate
+ *
+ * Re-allocate an array of 'count' elements, each sizeof(*ptr)
+ * bytes long and store the address of allocated memory in
+ * 'ptr'. Fill the newly allocated memory with zeros
+ *
+ * Return -1 on failure to reallocate, zero on success
+ */
+# define REALLOC_N(ptr, count) \
+ safe_alloc_realloc_n (&(ptr), sizeof (*(ptr)), (count))
+
+/**
+ * FREE:
+ * @ptr: pointer holding address to be freed
+ *
+ * Free the memory stored in 'ptr' and update to point
+ * to NULL.
+ */
+# define FREE(ptr) \
+ do \
+ { \
+ free (ptr); \
+ (ptr) = NULL; \
+ } \
+ while (0)
+
+#endif /* SAFE_ALLOC_H_ */
diff --git a/gnulib/lib/safe-read.c b/gnulib/lib/safe-read.c
new file mode 100644
index 0000000..d9cb330
--- /dev/null
+++ b/gnulib/lib/safe-read.c
@@ -0,0 +1,77 @@
+/* An interface to read and write that retries after interrupts.
+
+ Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef SAFE_WRITE
+# include "safe-write.h"
+#else
+# include "safe-read.h"
+#endif
+
+/* Get ssize_t. */
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <errno.h>
+
+#ifdef EINTR
+# define IS_EINTR(x) ((x) == EINTR)
+#else
+# define IS_EINTR(x) 0
+#endif
+
+#include <limits.h>
+
+#ifdef SAFE_WRITE
+# define safe_rw safe_write
+# define rw write
+#else
+# define safe_rw safe_read
+# define rw read
+# undef const
+# define const /* empty */
+#endif
+
+/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
+ interrupted. Return the actual number of bytes read(written), zero for EOF,
+ or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */
+size_t
+safe_rw (int fd, void const *buf, size_t count)
+{
+ /* Work around a bug in Tru64 5.1. Attempting to read more than
+ INT_MAX bytes fails with errno == EINVAL. See
+ <http://lists.gnu.org/archive/html/bug-gnu-utils/2002-04/msg00010.html>.
+ When decreasing COUNT, keep it block-aligned. */
+ enum { BUGGY_READ_MAXIMUM = INT_MAX & ~8191 };
+
+ for (;;)
+ {
+ ssize_t result = rw (fd, buf, count);
+
+ if (0 <= result)
+ return result;
+ else if (IS_EINTR (errno))
+ continue;
+ else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count)
+ count = BUGGY_READ_MAXIMUM;
+ else
+ return result;
+ }
+}
diff --git a/gnulib/lib/safe-read.h b/gnulib/lib/safe-read.h
new file mode 100644
index 0000000..7174de7
--- /dev/null
+++ b/gnulib/lib/safe-read.h
@@ -0,0 +1,47 @@
+/* An interface to read() that retries after interrupts.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Some system calls may be interrupted and fail with errno = EINTR in the
+ following situations:
+ - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user
+ types Ctrl-Z) on some platforms: MacOS X.
+ - The process receives a signal for which a signal handler was installed
+ with sigaction() with an sa_flags field that does not contain
+ SA_RESTART.
+ - The process receives a signal for which a signal handler was installed
+ with signal() and for which no call to siginterrupt(sig,0) was done,
+ on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris.
+
+ This module provides a wrapper around read() that handles EINTR. */
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define SAFE_READ_ERROR ((size_t) -1)
+
+/* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted.
+ Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR
+ upon error. */
+extern size_t safe_read (int fd, void *buf, size_t count);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/safe-write.c b/gnulib/lib/safe-write.c
new file mode 100644
index 0000000..94f9e91
--- /dev/null
+++ b/gnulib/lib/safe-write.c
@@ -0,0 +1,18 @@
+/* An interface to write that retries after interrupts.
+ Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define SAFE_WRITE
+#include "safe-read.c"
diff --git a/gnulib/lib/safe-write.h b/gnulib/lib/safe-write.h
new file mode 100644
index 0000000..07c84ee
--- /dev/null
+++ b/gnulib/lib/safe-write.h
@@ -0,0 +1,37 @@
+/* An interface to write() that retries after interrupts.
+ Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Some system calls may be interrupted and fail with errno = EINTR in the
+ following situations:
+ - The process is stopped and restarted (signal SIGSTOP and SIGCONT, user
+ types Ctrl-Z) on some platforms: MacOS X.
+ - The process receives a signal for which a signal handler was installed
+ with sigaction() with an sa_flags field that does not contain
+ SA_RESTART.
+ - The process receives a signal for which a signal handler was installed
+ with signal() and for which no call to siginterrupt(sig,0) was done,
+ on some platforms: AIX, HP-UX, IRIX, OSF/1, Solaris.
+
+ This module provides a wrapper around write() that handles EINTR. */
+
+#include <stddef.h>
+
+#define SAFE_WRITE_ERROR ((size_t) -1)
+
+/* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted.
+ Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR
+ upon error. */
+extern size_t safe_write (int fd, const void *buf, size_t count);
diff --git a/gnulib/lib/same-inode.h b/gnulib/lib/same-inode.h
new file mode 100644
index 0000000..d434b94
--- /dev/null
+++ b/gnulib/lib/same-inode.h
@@ -0,0 +1,25 @@
+/* Determine whether two stat buffers refer to the same file.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SAME_INODE_H
+# define SAME_INODE_H 1
+
+# define SAME_INODE(Stat_buf_1, Stat_buf_2) \
+ ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \
+ && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev)
+
+#endif
diff --git a/gnulib/lib/same.c b/gnulib/lib/same.c
new file mode 100644
index 0000000..3debcbf
--- /dev/null
+++ b/gnulib/lib/same.c
@@ -0,0 +1,123 @@
+/* Determine whether two file names refer to the same file.
+
+ Copyright (C) 1997-2000, 2002-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <string.h>
+
+#include <limits.h>
+#ifndef _POSIX_NAME_MAX
+# define _POSIX_NAME_MAX 14
+#endif
+
+#include "same.h"
+#include "dirname.h"
+#include "error.h"
+#include "same-inode.h"
+
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* Return nonzero if SOURCE and DEST point to the same name in the same
+ directory. */
+
+bool
+same_name (const char *source, const char *dest)
+{
+ /* Compare the basenames. */
+ char const *source_basename = last_component (source);
+ char const *dest_basename = last_component (dest);
+ size_t source_baselen = base_len (source_basename);
+ size_t dest_baselen = base_len (dest_basename);
+ bool identical_basenames =
+ (source_baselen == dest_baselen
+ && memcmp (source_basename, dest_basename, dest_baselen) == 0);
+ bool compare_dirs = identical_basenames;
+ bool same = false;
+
+#if ! _POSIX_NO_TRUNC && HAVE_PATHCONF && defined _PC_NAME_MAX
+ /* This implementation silently truncates components of file names. If
+ the base names might be truncated, check whether the truncated
+ base names are the same, while checking the directories. */
+ size_t slen_max = HAVE_LONG_FILE_NAMES ? 255 : _POSIX_NAME_MAX;
+ size_t min_baselen = MIN (source_baselen, dest_baselen);
+ if (slen_max <= min_baselen
+ && memcmp (source_basename, dest_basename, slen_max) == 0)
+ compare_dirs = true;
+#endif
+
+ if (compare_dirs)
+ {
+ struct stat source_dir_stats;
+ struct stat dest_dir_stats;
+ char *source_dirname, *dest_dirname;
+
+ /* Compare the parent directories (via the device and inode numbers). */
+ source_dirname = dir_name (source);
+ dest_dirname = dir_name (dest);
+
+ if (stat (source_dirname, &source_dir_stats))
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", source_dirname);
+ }
+
+ if (stat (dest_dirname, &dest_dir_stats))
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", dest_dirname);
+ }
+
+ same = SAME_INODE (source_dir_stats, dest_dir_stats);
+
+#if ! _POSIX_NO_TRUNC && HAVE_PATHCONF && defined _PC_NAME_MAX
+ if (same && ! identical_basenames)
+ {
+ long name_max = (errno = 0, pathconf (dest_dirname, _PC_NAME_MAX));
+ if (name_max < 0)
+ {
+ if (errno)
+ {
+ /* Shouldn't happen. */
+ error (1, errno, "%s", dest_dirname);
+ }
+ same = false;
+ }
+ else
+ same = (name_max <= min_baselen
+ && memcmp (source_basename, dest_basename, name_max) == 0);
+ }
+#endif
+
+ free (source_dirname);
+ free (dest_dirname);
+ }
+
+ return same;
+}
diff --git a/gnulib/lib/same.h b/gnulib/lib/same.h
new file mode 100644
index 0000000..6206cba
--- /dev/null
+++ b/gnulib/lib/same.h
@@ -0,0 +1,25 @@
+/* Determine whether two file names refer to the same file.
+
+ Copyright (C) 1997-2000, 2003-2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SAME_H_
+# define SAME_H_ 1
+
+# include <stdbool.h>
+
+bool same_name (const char *source, const char *dest);
+
+#endif /* SAME_H_ */
diff --git a/gnulib/lib/save-cwd.c b/gnulib/lib/save-cwd.c
new file mode 100644
index 0000000..5f8eb7c
--- /dev/null
+++ b/gnulib/lib/save-cwd.c
@@ -0,0 +1,99 @@
+/* save-cwd.c -- Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "save-cwd.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "chdir-long.h"
+#include "unistd--.h"
+#include "cloexec.h"
+
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#else
+# define GNULIB_FCNTL_SAFER 0
+#endif
+
+/* Record the location of the current working directory in CWD so that
+ the program may change to other directories and later use restore_cwd
+ to return to the recorded location. This function may allocate
+ space using malloc (via getcwd) or leave a file descriptor open;
+ use free_cwd to perform the necessary free or close. Upon failure,
+ no memory is allocated, any locally opened file descriptors are
+ closed; return non-zero -- in that case, free_cwd need not be
+ called, but doing so is ok. Otherwise, return zero.
+
+ The `raison d'etre' for this interface is that the working directory
+ is sometimes inaccessible, and getcwd is not robust or as efficient.
+ So, we prefer to use the open/fchdir approach, but fall back on
+ getcwd if necessary. This module works for most cases with just
+ the getcwd-lgpl module, but to be truly robust, use the getcwd module.
+
+ Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin,
+ SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it
+ doesn't work for partitions on which auditing is enabled. If
+ you're still using an obsolete system with these problems, please
+ send email to the maintainer of this code. */
+
+int
+save_cwd (struct saved_cwd *cwd)
+{
+ cwd->name = NULL;
+
+ cwd->desc = open (".", O_SEARCH);
+ if (!GNULIB_FCNTL_SAFER)
+ cwd->desc = fd_safer (cwd->desc);
+ if (cwd->desc < 0)
+ {
+ cwd->name = getcwd (NULL, 0);
+ return cwd->name ? 0 : -1;
+ }
+
+ set_cloexec_flag (cwd->desc, true);
+ return 0;
+}
+
+/* Change to recorded location, CWD, in directory hierarchy.
+ Upon failure, return -1 (errno is set by chdir or fchdir).
+ Upon success, return zero. */
+
+int
+restore_cwd (const struct saved_cwd *cwd)
+{
+ if (0 <= cwd->desc)
+ return fchdir (cwd->desc);
+ else
+ return chdir_long (cwd->name);
+}
+
+void
+free_cwd (struct saved_cwd *cwd)
+{
+ if (cwd->desc >= 0)
+ close (cwd->desc);
+ free (cwd->name);
+}
diff --git a/gnulib/lib/save-cwd.h b/gnulib/lib/save-cwd.h
new file mode 100644
index 0000000..983f890
--- /dev/null
+++ b/gnulib/lib/save-cwd.h
@@ -0,0 +1,34 @@
+/* Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef SAVE_CWD_H
+# define SAVE_CWD_H 1
+
+struct saved_cwd
+ {
+ int desc;
+ char *name;
+ };
+
+int save_cwd (struct saved_cwd *cwd);
+int restore_cwd (const struct saved_cwd *cwd);
+void free_cwd (struct saved_cwd *cwd);
+
+#endif /* SAVE_CWD_H */
diff --git a/gnulib/lib/savedir.c b/gnulib/lib/savedir.c
new file mode 100644
index 0000000..3e8762a
--- /dev/null
+++ b/gnulib/lib/savedir.c
@@ -0,0 +1,145 @@
+/* savedir.c -- save the list of files in a directory in a string
+
+ Copyright (C) 1990, 1997-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+#include "savedir.h"
+
+#include <sys/types.h>
+
+#include <errno.h>
+
+#include "dirent--.h"
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xalloc.h"
+
+#ifndef NAME_SIZE_DEFAULT
+# define NAME_SIZE_DEFAULT 512
+#endif
+
+/* Return a freshly allocated string containing the file names
+ in directory DIRP, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIRP cannot be read.
+ If DIRP is NULL, return NULL without affecting errno. */
+
+char *
+streamsavedir (DIR *dirp)
+{
+ char *name_space;
+ size_t allocated = NAME_SIZE_DEFAULT;
+ size_t used = 0;
+ int save_errno;
+
+ if (dirp == NULL)
+ return NULL;
+
+ name_space = xmalloc (allocated);
+
+ for (;;)
+ {
+ struct dirent const *dp;
+ char const *entry;
+
+ errno = 0;
+ dp = readdir (dirp);
+ if (! dp)
+ break;
+
+ /* Skip "", ".", and "..". "" is returned by at least one buggy
+ implementation: Solaris 2.4 readdir on NFS file systems. */
+ entry = dp->d_name;
+ if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0')
+ {
+ size_t entry_size = _D_EXACT_NAMLEN (dp) + 1;
+ if (used + entry_size < used)
+ xalloc_die ();
+ if (allocated <= used + entry_size)
+ {
+ do
+ {
+ if (2 * allocated < allocated)
+ xalloc_die ();
+ allocated *= 2;
+ }
+ while (allocated <= used + entry_size);
+
+ name_space = xrealloc (name_space, allocated);
+ }
+ memcpy (name_space + used, entry, entry_size);
+ used += entry_size;
+ }
+ }
+ name_space[used] = '\0';
+ save_errno = errno;
+ if (save_errno != 0)
+ {
+ free (name_space);
+ errno = save_errno;
+ return NULL;
+ }
+ return name_space;
+}
+
+/* Like savedirstreamp (DIRP), except also close DIRP. */
+
+static char *
+savedirstream (DIR *dirp)
+{
+ char *name_space = streamsavedir (dirp);
+ if (dirp && closedir (dirp) != 0)
+ {
+ int save_errno = errno;
+ free (name_space);
+ errno = save_errno;
+ return NULL;
+ }
+ return name_space;
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory DIR, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if DIR cannot be opened, read, or closed. */
+
+char *
+savedir (char const *dir)
+{
+ return savedirstream (opendir (dir));
+}
+
+/* Return a freshly allocated string containing the file names
+ in directory FD, separated by '\0' characters;
+ the end is marked by two '\0' characters in a row.
+ Return NULL (setting errno) if FD cannot be read or closed. */
+
+/* deprecated */
+char *
+fdsavedir (int fd)
+{
+ return savedirstream (fdopendir (fd));
+}
diff --git a/gnulib/lib/savedir.h b/gnulib/lib/savedir.h
new file mode 100644
index 0000000..d935b16
--- /dev/null
+++ b/gnulib/lib/savedir.h
@@ -0,0 +1,29 @@
+/* Save the list of files in a directory in a string.
+
+ Copyright (C) 1997, 1999, 2001, 2003, 2005, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#ifndef _GL_SAVEDIR_H
+#define _GL_SAVEDIR_H
+
+#include <dirent.h>
+char *streamsavedir (DIR *dirp);
+char *savedir (char const *dir);
+char *fdsavedir (int fd); /* deprecated */
+
+#endif
diff --git a/gnulib/lib/savewd.c b/gnulib/lib/savewd.c
new file mode 100644
index 0000000..f19e98e
--- /dev/null
+++ b/gnulib/lib/savewd.c
@@ -0,0 +1,305 @@
+/* Save and restore the working directory, possibly using a child process.
+
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "savewd.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "dosname.h"
+#include "fcntl-safer.h"
+
+/* Save the working directory into *WD, if it hasn't been saved
+ already. Return true if a child has been forked to do the real
+ work. */
+static bool
+savewd_save (struct savewd *wd)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ /* Save the working directory, or prepare to fall back if possible. */
+ {
+ int fd = open_safer (".", O_SEARCH);
+ if (0 <= fd)
+ {
+ wd->state = FD_STATE;
+ wd->val.fd = fd;
+ break;
+ }
+ if (errno != EACCES && errno != ESTALE)
+ {
+ wd->state = ERROR_STATE;
+ wd->val.errnum = errno;
+ break;
+ }
+ }
+ wd->state = FORKING_STATE;
+ wd->val.child = -1;
+ /* Fall through. */
+ case FORKING_STATE:
+ if (wd->val.child < 0)
+ {
+ /* "Save" the initial working directory by forking a new
+ subprocess that will attempt all the work from the chdir
+ until until the next savewd_restore. */
+ wd->val.child = fork ();
+ if (wd->val.child != 0)
+ {
+ if (0 < wd->val.child)
+ return true;
+ wd->state = ERROR_STATE;
+ wd->val.errnum = errno;
+ }
+ }
+ break;
+
+ case FD_STATE:
+ case FD_POST_CHDIR_STATE:
+ case ERROR_STATE:
+ case FINAL_STATE:
+ break;
+
+ default:
+ assert (false);
+ }
+
+ return false;
+}
+
+int
+savewd_chdir (struct savewd *wd, char const *dir, int options,
+ int open_result[2])
+{
+ int fd = -1;
+ int result = 0;
+
+ /* Open the directory if requested, or if avoiding a race condition
+ is requested and possible. */
+ if (open_result
+ || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0)))
+ {
+ fd = open (dir,
+ (O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+ | (options & SAVEWD_CHDIR_NOFOLLOW ? O_NOFOLLOW : 0)));
+
+ if (open_result)
+ {
+ open_result[0] = fd;
+ open_result[1] = errno;
+ }
+
+ if (fd < 0 && (errno != EACCES || (options & SAVEWD_CHDIR_READABLE)))
+ result = -1;
+ }
+
+ if (result == 0 && ! (0 <= fd && options & SAVEWD_CHDIR_SKIP_READABLE))
+ {
+ if (savewd_save (wd))
+ {
+ open_result = NULL;
+ result = -2;
+ }
+ else
+ {
+ result = (fd < 0 ? chdir (dir) : fchdir (fd));
+
+ if (result == 0)
+ switch (wd->state)
+ {
+ case FD_STATE:
+ wd->state = FD_POST_CHDIR_STATE;
+ break;
+
+ case ERROR_STATE:
+ case FD_POST_CHDIR_STATE:
+ case FINAL_STATE:
+ break;
+
+ case FORKING_STATE:
+ assert (wd->val.child == 0);
+ break;
+
+ default:
+ assert (false);
+ }
+ }
+ }
+
+ if (0 <= fd && ! open_result)
+ {
+ int e = errno;
+ close (fd);
+ errno = e;
+ }
+
+ return result;
+}
+
+int
+savewd_restore (struct savewd *wd, int status)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ case FD_STATE:
+ /* The working directory is the desired directory, so there's no
+ work to do. */
+ break;
+
+ case FD_POST_CHDIR_STATE:
+ /* Restore the working directory using fchdir. */
+ if (fchdir (wd->val.fd) == 0)
+ {
+ wd->state = FD_STATE;
+ break;
+ }
+ else
+ {
+ int chdir_errno = errno;
+ close (wd->val.fd);
+ wd->state = ERROR_STATE;
+ wd->val.errnum = chdir_errno;
+ }
+ /* Fall through. */
+ case ERROR_STATE:
+ /* Report an error if asked to restore the working directory. */
+ errno = wd->val.errnum;
+ return -1;
+
+ case FORKING_STATE:
+ /* "Restore" the working directory by waiting for the subprocess
+ to finish. */
+ {
+ pid_t child = wd->val.child;
+ if (child == 0)
+ _exit (status);
+ if (0 < child)
+ {
+ int child_status;
+ while (waitpid (child, &child_status, 0) < 0)
+ assert (errno == EINTR);
+ wd->val.child = -1;
+ if (! WIFEXITED (child_status))
+ raise (WTERMSIG (child_status));
+ return WEXITSTATUS (child_status);
+ }
+ }
+ break;
+
+ default:
+ assert (false);
+ }
+
+ return 0;
+}
+
+void
+savewd_finish (struct savewd *wd)
+{
+ switch (wd->state)
+ {
+ case INITIAL_STATE:
+ case ERROR_STATE:
+ break;
+
+ case FD_STATE:
+ case FD_POST_CHDIR_STATE:
+ close (wd->val.fd);
+ break;
+
+ case FORKING_STATE:
+ assert (wd->val.child < 0);
+ break;
+
+ default:
+ assert (false);
+ }
+
+ wd->state = FINAL_STATE;
+}
+
+/* Return true if the actual work is currently being done by a
+ subprocess.
+
+ A true return means that the caller and the subprocess should
+ resynchronize later with savewd_restore, using only their own
+ memory to decide when to resynchronize; they should not consult the
+ file system to decide, because that might lead to race conditions.
+ This is why savewd_chdir is broken out into another function;
+ savewd_chdir's callers _can_ inspect the file system to decide
+ whether to call savewd_chdir. */
+static inline bool
+savewd_delegating (struct savewd const *wd)
+{
+ return wd->state == FORKING_STATE && 0 < wd->val.child;
+}
+
+int
+savewd_process_files (int n_files, char **file,
+ int (*act) (char *, struct savewd *, void *),
+ void *options)
+{
+ int i = 0;
+ int last_relative;
+ int exit_status = EXIT_SUCCESS;
+ struct savewd wd;
+ savewd_init (&wd);
+
+ for (last_relative = n_files - 1; 0 <= last_relative; last_relative--)
+ if (! IS_ABSOLUTE_FILE_NAME (file[last_relative]))
+ break;
+
+ for (; i < last_relative; i++)
+ {
+ if (! savewd_delegating (&wd))
+ {
+ int s = act (file[i], &wd, options);
+ if (exit_status < s)
+ exit_status = s;
+ }
+
+ if (! IS_ABSOLUTE_FILE_NAME (file[i + 1]))
+ {
+ int r = savewd_restore (&wd, exit_status);
+ if (exit_status < r)
+ exit_status = r;
+ }
+ }
+
+ savewd_finish (&wd);
+
+ for (; i < n_files; i++)
+ {
+ int s = act (file[i], &wd, options);
+ if (exit_status < s)
+ exit_status = s;
+ }
+
+ return exit_status;
+}
diff --git a/gnulib/lib/savewd.h b/gnulib/lib/savewd.h
new file mode 100644
index 0000000..96c8c52
--- /dev/null
+++ b/gnulib/lib/savewd.h
@@ -0,0 +1,148 @@
+/* Save and restore the working directory, possibly using a subprocess.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef SAVEWD_H
+# define SAVEWD_H 1
+
+#include <stdbool.h>
+#include <sys/types.h>
+
+/* A saved working directory. The member names and constants defined
+ by this structure are private to the savewd module. */
+struct savewd
+{
+ /* The state of this object. */
+ enum
+ {
+ /* This object has been created but does not yet represent
+ the working directory. */
+ INITIAL_STATE,
+
+ /* val.fd is the original working directory's file descriptor.
+ It is still the working directory. */
+ FD_STATE,
+
+ /* Like FD_STATE, but the working directory has changed, so
+ restoring it will require a fchdir. */
+ FD_POST_CHDIR_STATE,
+
+ /* Fork and let the subprocess do the work. val.child is 0 in a
+ child, negative in a childless parent, and the child process
+ ID in a parent with a child. */
+ FORKING_STATE,
+
+ /* A serious problem argues against further efforts. val.errnum
+ contains the error number (e.g., EIO). */
+ ERROR_STATE,
+
+ /* savewd_finish has been called, so the application no longer
+ cares whether the working directory is saved, and there is no
+ more work to do. */
+ FINAL_STATE
+ } state;
+
+ /* The object's value. */
+ union
+ {
+ int fd;
+ int errnum;
+ pid_t child;
+ } val;
+};
+
+/* Initialize a saved working directory object. */
+static inline void
+savewd_init (struct savewd *wd)
+{
+ wd->state = INITIAL_STATE;
+}
+
+
+/* Options for savewd_chdir. */
+enum
+ {
+ /* Do not follow symbolic links, if supported. */
+ SAVEWD_CHDIR_NOFOLLOW = 1,
+
+ /* The directory should be readable, so fail if it happens to be
+ discovered that the directory is not readable. (Unreadable
+ directories are not necessarily diagnosed, though.) */
+ SAVEWD_CHDIR_READABLE = 2,
+
+ /* Do not chdir if the directory is readable; simply succeed
+ without invoking chdir if the directory was opened. */
+ SAVEWD_CHDIR_SKIP_READABLE = 4
+ };
+
+/* Change the directory, and if successful, record into *WD the fact
+ that the process chdired into DIR. A process using this module
+ should use savewd_chdir rather than chdir or fchdir. Obey the
+ options specified in OPTIONS.
+
+ If OPEN_RESULT is not null, store into OPEN_RESULT[0] a file
+ descriptor that accesses DIR if a file descriptor is successfully
+ obtained. Store -1 otherwise, setting OPEN_RESULT[1] to the error
+ number. Store through OPEN_RESULT regardless of whether the chdir
+ is successful. However, when -2 is returned, the contents of
+ OPEN_RESULT are indeterminate since the file descriptor is closed
+ in the parent.
+
+ Return -2 if a subprocess was spun off to do the real work, -1
+ (setting errno) if unsuccessful, 0 if successful. */
+int savewd_chdir (struct savewd *wd, char const *dir, int options,
+ int open_result[2]);
+
+/* Restore the working directory from *WD. STATUS indicates the exit
+ status corresponding to the work done since the last save; this is
+ used when the caller is in a subprocess. Return 0 if successful,
+ -1 (setting errno) on our failure, a positive subprocess exit
+ status if the working directory was restored in the parent but the
+ subprocess failed. */
+int savewd_restore (struct savewd *wd, int status);
+
+/* Return WD's error number, or 0 if WD is not in an error state. */
+static inline int
+savewd_errno (struct savewd const *wd)
+{
+ return (wd->state == ERROR_STATE ? wd->val.errnum : 0);
+}
+
+/* Deallocate any resources associated with WD. A program that chdirs
+ should restore before finishing. */
+void savewd_finish (struct savewd *wd);
+
+/* Process N_FILES file names, FILE[0] through FILE[N_FILES - 1].
+ For each file name F, call ACT (F, WD, OPTIONS); ACT should invoke
+ savewd_chdir as needed, and should return an exit status. WD
+ represents the working directory; it may be in an error state when
+ ACT is called.
+
+ Save and restore the working directory as needed by the file name
+ vector; assume that ACT does not require access to any relative
+ file names other than its first argument, and that it is OK if the
+ working directory is changed when this function returns. Some
+ actions may be applied in a subprocess.
+
+ Return the maximum exit status that any call to ACT returned, or
+ EXIT_SUCCESS (i.e., 0) if no calls were made. */
+int savewd_process_files (int n_files, char **file,
+ int (*act) (char *, struct savewd *, void *),
+ void *options);
+
+#endif
diff --git a/gnulib/lib/scandir.c b/gnulib/lib/scandir.c
new file mode 100644
index 0000000..824fe17
--- /dev/null
+++ b/gnulib/lib/scandir.c
@@ -0,0 +1,188 @@
+/* Copyright (C) 1992-1998, 2000, 2002-2003, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#if _LIBC
+# include <bits/libc-lock.h>
+#endif
+
+#if ! defined __builtin_expect && __GNUC__ < 3
+# define __builtin_expect(expr, expected) (expr)
+#endif
+
+#undef select
+
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) strlen ((d)->d_name)
+#endif
+#ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#endif
+
+#if _LIBC
+# ifndef SCANDIR
+# define SCANDIR scandir
+# define READDIR __readdir
+# define DIRENT_TYPE struct dirent
+# endif
+#else
+# define SCANDIR scandir
+# define READDIR readdir
+# define DIRENT_TYPE struct dirent
+# define __opendir opendir
+# define __closedir closedir
+# define __set_errno(val) errno = (val)
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c and opendir_safer.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer. */
+# undef opendir
+# undef closedir
+#endif
+
+#ifndef SCANDIR_CANCEL
+# define SCANDIR_CANCEL
+struct scandir_cancel_struct
+{
+ DIR *dp;
+ void *v;
+ size_t cnt;
+};
+
+# if _LIBC
+static void
+cancel_handler (void *arg)
+{
+ struct scandir_cancel_struct *cp = arg;
+ size_t i;
+ void **v = cp->v;
+
+ for (i = 0; i < cp->cnt; ++i)
+ free (v[i]);
+ free (v);
+ (void) __closedir (cp->dp);
+}
+# endif
+#endif
+
+
+int
+SCANDIR (const char *dir,
+ DIRENT_TYPE ***namelist,
+ int (*select) (const DIRENT_TYPE *),
+ int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **))
+{
+ DIR *dp = __opendir (dir);
+ DIRENT_TYPE **v = NULL;
+ size_t vsize = 0;
+ struct scandir_cancel_struct c;
+ DIRENT_TYPE *d;
+ int save;
+
+ if (dp == NULL)
+ return -1;
+
+ save = errno;
+ __set_errno (0);
+
+ c.dp = dp;
+ c.v = NULL;
+ c.cnt = 0;
+#if _LIBC
+ __libc_cleanup_push (cancel_handler, &c);
+#endif
+
+ while ((d = READDIR (dp)) != NULL)
+ {
+ int use_it = select == NULL;
+
+ if (! use_it)
+ {
+ use_it = select (d);
+ /* The select function might have changed errno. It was
+ zero before and it need to be again to make the latter
+ tests work. */
+ __set_errno (0);
+ }
+
+ if (use_it)
+ {
+ DIRENT_TYPE *vnew;
+ size_t dsize;
+
+ /* Ignore errors from select or readdir */
+ __set_errno (0);
+
+ if (__builtin_expect (c.cnt == vsize, 0))
+ {
+ DIRENT_TYPE **new;
+ if (vsize == 0)
+ vsize = 10;
+ else
+ vsize *= 2;
+ new = (DIRENT_TYPE **) realloc (v, vsize * sizeof (*v));
+ if (new == NULL)
+ break;
+ v = new;
+ c.v = (void *) v;
+ }
+
+ dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+ vnew = (DIRENT_TYPE *) malloc (dsize);
+ if (vnew == NULL)
+ break;
+
+ v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize);
+ }
+ }
+
+ if (__builtin_expect (errno, 0) != 0)
+ {
+ save = errno;
+
+ while (c.cnt > 0)
+ free (v[--c.cnt]);
+ free (v);
+ c.cnt = -1;
+ }
+ else
+ {
+ /* Sort the list if we have a comparison function to sort with. */
+ if (cmp != NULL)
+ qsort (v, c.cnt, sizeof (*v), (int (*) (const void *, const void *)) cmp);
+
+ *namelist = v;
+ }
+
+#if _LIBC
+ __libc_cleanup_pop (0);
+#endif
+
+ (void) __closedir (dp);
+ __set_errno (save);
+
+ return c.cnt;
+}
diff --git a/gnulib/lib/sched.in.h b/gnulib/lib/sched.in.h
new file mode 100644
index 0000000..fc2e171
--- /dev/null
+++ b/gnulib/lib/sched.in.h
@@ -0,0 +1,57 @@
+/* Replacement <sched.h> for platforms that lack it.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_SCHED_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SCHED_H@
+# @INCLUDE_NEXT@ @NEXT_SCHED_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SCHED_H
+#define _@GUARD_PREFIX@_SCHED_H
+
+/* Get pid_t.
+ This is needed on glibc 2.11 (see
+ glibc bug <http://sourceware.org/bugzilla/show_bug.cgi?id=13198>)
+ and MacOS X 10.5. */
+#include <sys/types.h>
+
+#if !@HAVE_STRUCT_SCHED_PARAM@
+
+# if !GNULIB_defined_struct_sched_param
+struct sched_param
+{
+ int sched_priority;
+};
+# define GNULIB_defined_struct_sched_param 1
+# endif
+
+#endif
+
+#if !(defined SCHED_FIFO && defined SCHED_RR && defined SCHED_OTHER)
+# define SCHED_FIFO 1
+# define SCHED_RR 2
+# define SCHED_OTHER 0
+#endif
+
+#endif /* _@GUARD_PREFIX@_SCHED_H */
+#endif /* _@GUARD_PREFIX@_SCHED_H */
diff --git a/gnulib/lib/se-context.in.h b/gnulib/lib/se-context.in.h
new file mode 100644
index 0000000..cb7419a
--- /dev/null
+++ b/gnulib/lib/se-context.in.h
@@ -0,0 +1,28 @@
+#ifndef SELINUX_CONTEXT_H
+# define SELINUX_CONTEXT_H
+
+# include <errno.h>
+
+/* The definition of _GL_UNUSED_PARAMETER is copied here. */
+
+typedef int context_t;
+static inline context_t context_new (char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return 0; }
+static inline char *context_str (context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return (void *) 0; }
+static inline void context_free (context_t c _GL_UNUSED_PARAMETER) {}
+
+static inline int context_user_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_role_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_range_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int context_type_set (context_t sc _GL_UNUSED_PARAMETER,
+ char const *s _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+#endif
diff --git a/gnulib/lib/se-selinux.in.h b/gnulib/lib/se-selinux.in.h
new file mode 100644
index 0000000..aa871f5
--- /dev/null
+++ b/gnulib/lib/se-selinux.in.h
@@ -0,0 +1,97 @@
+/* Replacement <selinux/selinux.h> for platforms that lack it.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_SELINUX_SELINUX_H
+# define _@GUARD_PREFIX@_SELINUX_SELINUX_H
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+# if HAVE_SELINUX_SELINUX_H
+
+#@INCLUDE_NEXT@ @NEXT_SELINUX_SELINUX_H@
+
+# else
+
+# include <sys/types.h>
+# include <errno.h>
+
+/* The definition of _GL_UNUSED_PARAMETER is copied here. */
+
+# if !GNULIB_defined_security_types
+
+typedef unsigned short security_class_t;
+# define security_context_t char*
+# define is_selinux_enabled() 0
+
+static inline int getcon (security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline void freecon (security_context_t con _GL_UNUSED_PARAMETER) {}
+
+
+static inline int getfscreatecon (security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setfscreatecon (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int matchpathcon (char const *file _GL_UNUSED_PARAMETER,
+ mode_t m _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int getfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int lgetfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int fgetfilecon (int fd,
+ security_context_t *con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int lsetfilecon (char const *file _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int fsetfilecon (int fd _GL_UNUSED_PARAMETER,
+ security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+static inline int security_check_context
+ (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int security_check_context_raw
+ (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int setexeccon (security_context_t con _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int security_compute_create
+ (security_context_t scon _GL_UNUSED_PARAMETER,
+ security_context_t tcon _GL_UNUSED_PARAMETER,
+ security_class_t tclass _GL_UNUSED_PARAMETER,
+ security_context_t *newcon _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+static inline int matchpathcon_init_prefix
+ (char const *path _GL_UNUSED_PARAMETER,
+ char const *prefix _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+# define GNULIB_defined_security_types 1
+# endif
+
+# endif
+#endif /* _@GUARD_PREFIX@_SELINUX_SELINUX_H */
diff --git a/gnulib/lib/search.in.h b/gnulib/lib/search.in.h
new file mode 100644
index 0000000..332cccc
--- /dev/null
+++ b/gnulib/lib/search.in.h
@@ -0,0 +1,207 @@
+/* A GNU-like <search.h>.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_SEARCH_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SEARCH_H@
+# @INCLUDE_NEXT@ @NEXT_SEARCH_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SEARCH_H
+#define _@GUARD_PREFIX@_SEARCH_H
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if @GNULIB_TSEARCH@
+# if @REPLACE_TSEARCH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define tsearch rpl_tsearch
+# define tfind rpl_tfind
+# define tdelete rpl_tdelete
+# define twalk rpl_twalk
+# endif
+# endif
+
+/* See <http://www.opengroup.org/susv3xbd/search.h.html>,
+ <http://www.opengroup.org/susv3xsh/tsearch.html>
+ for details. */
+
+# if !@HAVE_TSEARCH@
+# if !GNULIB_defined_search_types
+typedef enum
+{
+ preorder,
+ postorder,
+ endorder,
+ leaf
+}
+VISIT;
+# define GNULIB_defined_search_types 1
+# endif
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_search_fn_types
+typedef int (*_gl_search_compar_fn) (const void *, const void *);
+typedef void (*_gl_search_action_fn) (const void *, VISIT, int);
+# define GNULIB_defined_search_fn_types 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is returned. Otherwise, a new element equal to KEY
+ is inserted in the tree and is returned. */
+# if @REPLACE_TSEARCH@
+_GL_FUNCDECL_RPL (tsearch, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (tsearch, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar));
+# else
+# if !@HAVE_TSEARCH@
+_GL_FUNCDECL_SYS (tsearch, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (tsearch, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar));
+# endif
+_GL_CXXALIASWARN (tsearch);
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is returned. Otherwise, NULL is returned. */
+# if @REPLACE_TSEARCH@
+_GL_FUNCDECL_RPL (tfind, void *,
+ (const void *key, void *const *vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (tfind, void *,
+ (const void *key, void *const *vrootp,
+ _gl_search_compar_fn compar));
+# else
+# if !@HAVE_TSEARCH@
+_GL_FUNCDECL_SYS (tfind, void *,
+ (const void *key, void *const *vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the second parameter is
+ void **vrootp. */
+_GL_CXXALIAS_SYS_CAST (tfind, void *,
+ (const void *key, void *const *vrootp,
+ _gl_search_compar_fn compar));
+# endif
+_GL_CXXALIASWARN (tfind);
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+ If one is found, it is removed from the tree, and its parent node is
+ returned. Otherwise, NULL is returned. */
+# if @REPLACE_TSEARCH@
+_GL_FUNCDECL_RPL (tdelete, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (tdelete, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar));
+# else
+# if !@HAVE_TSEARCH@
+_GL_FUNCDECL_SYS (tdelete, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (tdelete, void *,
+ (const void *key, void **vrootp,
+ _gl_search_compar_fn compar));
+# endif
+_GL_CXXALIASWARN (tdelete);
+
+/* Perform a depth-first, left-to-right traversal of the tree VROOT.
+ The ACTION function is called:
+ - for non-leaf nodes: 3 times, before the left subtree traversal,
+ after the left subtree traversal but before the right subtree traversal,
+ and after the right subtree traversal,
+ - for leaf nodes: once.
+ The arguments passed to ACTION are:
+ 1. the node; it can be casted to a 'const void * const *', i.e. into a
+ pointer to the key,
+ 2. an indicator which visit of the node this is,
+ 3. the level of the node in the tree (0 for the root). */
+# if @REPLACE_TSEARCH@
+_GL_FUNCDECL_RPL (twalk, void,
+ (const void *vroot, _gl_search_action_fn action)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (twalk, void,
+ (const void *vroot, _gl_search_action_fn action));
+# else
+# if !@HAVE_TSEARCH@
+_GL_FUNCDECL_SYS (twalk, void,
+ (const void *vroot, _gl_search_action_fn action)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (twalk, void,
+ (const void *vroot, _gl_search_action_fn action));
+# endif
+_GL_CXXALIASWARN (twalk);
+
+#elif defined GNULIB_POSIXCHECK
+# undef tsearch
+# if HAVE_RAW_DECL_TSEARCH
+_GL_WARN_ON_USE (tsearch, "tsearch is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef tfind
+# if HAVE_RAW_DECL_TFIND
+_GL_WARN_ON_USE (tfind, "tfind is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef tdelete
+# if HAVE_RAW_DECL_TDELETE
+_GL_WARN_ON_USE (tdelete, "tdelete is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+# undef twalk
+# if HAVE_RAW_DECL_TWALK
+_GL_WARN_ON_USE (twalk, "twalk is unportable - "
+ "use gnulib module tsearch for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SEARCH_H */
+#endif /* _@GUARD_PREFIX@_SEARCH_H */
diff --git a/gnulib/lib/select.c b/gnulib/lib/select.c
new file mode 100644
index 0000000..aee0ac2
--- /dev/null
+++ b/gnulib/lib/select.c
@@ -0,0 +1,492 @@
+/* Emulation for select(2)
+ Contributed by Paolo Bonzini.
+
+ Copyright 2008-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+#include <alloca.h>
+#include <assert.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Win32. */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <limits.h>
+
+#include <winsock2.h>
+#include <windows.h>
+#include <io.h>
+#include <stdio.h>
+#include <conio.h>
+#include <time.h>
+
+#include "msvc-nothrow.h"
+
+struct bitset {
+ unsigned char in[FD_SETSIZE / CHAR_BIT];
+ unsigned char out[FD_SETSIZE / CHAR_BIT];
+};
+
+/* Declare data structures for ntdll functions. */
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _IO_STATUS_BLOCK
+{
+ union {
+ DWORD Status;
+ PVOID Pointer;
+ } u;
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef enum _FILE_INFORMATION_CLASS {
+ FilePipeLocalInformation = 24
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef DWORD (WINAPI *PNtQueryInformationFile)
+ (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
+
+#ifndef PIPE_BUF
+#define PIPE_BUF 512
+#endif
+
+#define IsConsoleHandle(h) (((long) (h) & 3) == 3)
+
+static BOOL
+IsSocketHandle (HANDLE h)
+{
+ WSANETWORKEVENTS ev;
+
+ if (IsConsoleHandle (h))
+ return FALSE;
+
+ /* Under Wine, it seems that getsockopt returns 0 for pipes too.
+ WSAEnumNetworkEvents instead distinguishes the two correctly. */
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ return ev.lNetworkEvents != 0xDEADBEEF;
+}
+
+/* Compute output fd_sets for libc descriptor FD (whose Win32 handle is H). */
+
+static int
+win32_poll_handle (HANDLE h, int fd, struct bitset *rbits, struct bitset *wbits,
+ struct bitset *xbits)
+{
+ BOOL read, write, except;
+ int i, ret;
+ INPUT_RECORD *irbuffer;
+ DWORD avail, nbuffer;
+ BOOL bRet;
+ IO_STATUS_BLOCK iosb;
+ FILE_PIPE_LOCAL_INFORMATION fpli;
+ static PNtQueryInformationFile NtQueryInformationFile;
+ static BOOL once_only;
+
+ read = write = except = FALSE;
+ switch (GetFileType (h))
+ {
+ case FILE_TYPE_DISK:
+ read = TRUE;
+ write = TRUE;
+ break;
+
+ case FILE_TYPE_PIPE:
+ if (!once_only)
+ {
+ NtQueryInformationFile = (PNtQueryInformationFile)
+ GetProcAddress (GetModuleHandle ("ntdll.dll"),
+ "NtQueryInformationFile");
+ once_only = TRUE;
+ }
+
+ if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
+ {
+ if (avail)
+ read = TRUE;
+ }
+ else if (GetLastError () == ERROR_BROKEN_PIPE)
+ ;
+
+ else
+ {
+ /* It was the write-end of the pipe. Check if it is writable.
+ If NtQueryInformationFile fails, optimistically assume the pipe is
+ writable. This could happen on Win9x, where NtQueryInformationFile
+ is not available, or if we inherit a pipe that doesn't permit
+ FILE_READ_ATTRIBUTES access on the write end (I think this should
+ not happen since WinXP SP2; WINE seems fine too). Otherwise,
+ ensure that enough space is available for atomic writes. */
+ memset (&iosb, 0, sizeof (iosb));
+ memset (&fpli, 0, sizeof (fpli));
+
+ if (!NtQueryInformationFile
+ || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation)
+ || fpli.WriteQuotaAvailable >= PIPE_BUF
+ || (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota))
+ write = TRUE;
+ }
+ break;
+
+ case FILE_TYPE_CHAR:
+ write = TRUE;
+ if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ break;
+
+ ret = WaitForSingleObject (h, 0);
+ if (ret == WAIT_OBJECT_0)
+ {
+ if (!IsConsoleHandle (h))
+ {
+ read = TRUE;
+ break;
+ }
+
+ nbuffer = avail = 0;
+ bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
+
+ /* Screen buffers handles are filtered earlier. */
+ assert (bRet);
+ if (nbuffer == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
+ bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
+ if (!bRet || avail == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ for (i = 0; i < avail; i++)
+ if (irbuffer[i].EventType == KEY_EVENT)
+ read = TRUE;
+ }
+ break;
+
+ default:
+ ret = WaitForSingleObject (h, 0);
+ write = TRUE;
+ if (ret == WAIT_OBJECT_0)
+ read = TRUE;
+
+ break;
+ }
+
+ ret = 0;
+ if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ return ret;
+}
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+{
+ static struct timeval tv0;
+ static HANDLE hEvent;
+ HANDLE h, handle_array[FD_SETSIZE + 2];
+ fd_set handle_rfds, handle_wfds, handle_xfds;
+ struct bitset rbits, wbits, xbits;
+ unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT];
+ DWORD ret, wait_timeout, nhandles, nsock, nbuffer;
+ MSG msg;
+ int i, fd, rc;
+
+ if (nfds > FD_SETSIZE)
+ nfds = FD_SETSIZE;
+
+ if (!timeout)
+ wait_timeout = INFINITE;
+ else
+ {
+ wait_timeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
+
+ /* select is also used as a portable usleep. */
+ if (!rfds && !wfds && !xfds)
+ {
+ Sleep (wait_timeout);
+ return 0;
+ }
+ }
+
+ if (!hEvent)
+ hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+
+ handle_array[0] = hEvent;
+ nhandles = 1;
+ nsock = 0;
+
+ /* Copy descriptors to bitsets. At the same time, eliminate
+ bits in the "wrong" direction for console input buffers
+ and screen buffers, because screen buffers are waitable
+ and they will block until a character is available. */
+ memset (&rbits, 0, sizeof (rbits));
+ memset (&wbits, 0, sizeof (wbits));
+ memset (&xbits, 0, sizeof (xbits));
+ memset (anyfds_in, 0, sizeof (anyfds_in));
+ if (rfds)
+ for (i = 0; i < rfds->fd_count; i++)
+ {
+ fd = rfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && !GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ rfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (wfds)
+ for (i = 0; i < wfds->fd_count; i++)
+ {
+ fd = wfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ wfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (xfds)
+ for (i = 0; i < xfds->fd_count; i++)
+ {
+ fd = xfds->fd_array[i];
+ xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ xfds = (fd_set *) alloca (sizeof (fd_set));
+
+ /* Zero all the fd_sets, including the application's. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+ FD_ZERO (&handle_rfds);
+ FD_ZERO (&handle_wfds);
+ FD_ZERO (&handle_xfds);
+
+ /* Classify handles. Create fd sets for sockets, poll the others. */
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (!h)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (IsSocketHandle (h))
+ {
+ int requested = FD_CLOSE;
+
+ /* See above; socket handles are mapped onto select, but we
+ need to map descriptors to handles. */
+ if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_READ | FD_ACCEPT;
+ FD_SET ((SOCKET) h, rfds);
+ FD_SET ((SOCKET) h, &handle_rfds);
+ }
+ if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_WRITE | FD_CONNECT;
+ FD_SET ((SOCKET) h, wfds);
+ FD_SET ((SOCKET) h, &handle_wfds);
+ }
+ if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_OOB;
+ FD_SET ((SOCKET) h, xfds);
+ FD_SET ((SOCKET) h, &handle_xfds);
+ }
+
+ WSAEventSelect ((SOCKET) h, hEvent, requested);
+ nsock++;
+ }
+ else
+ {
+ handle_array[nhandles++] = h;
+
+ /* Poll now. If we get an event, do not wait below. */
+ if (wait_timeout != 0
+ && win32_poll_handle (h, i, &rbits, &wbits, &xbits))
+ wait_timeout = 0;
+ }
+ }
+
+ if (wait_timeout == 0 || nsock == 0)
+ rc = 0;
+ else
+ {
+ /* See if we need to wait in the loop below. If any select is ready,
+ do MsgWaitForMultipleObjects anyway to dispatch messages, but
+ no need to call select again. */
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+ if (rc == 0)
+ {
+ /* Restore the fd_sets for the other select we do below. */
+ memcpy (&handle_rfds, rfds, sizeof (fd_set));
+ memcpy (&handle_wfds, wfds, sizeof (fd_set));
+ memcpy (&handle_xfds, xfds, sizeof (fd_set));
+ }
+ else
+ wait_timeout = 0;
+ }
+
+ for (;;)
+ {
+ ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
+ wait_timeout, QS_ALLINPUT);
+
+ if (ret == WAIT_OBJECT_0 + nhandles)
+ {
+ /* new input of some other kind */
+ BOOL bRet;
+ while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ else
+ break;
+ }
+
+ /* If we haven't done it yet, check the status of the sockets. */
+ if (rc == 0 && nsock > 0)
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+
+ /* Now fill in the results. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+
+ /* Place a sentinel at the end of the array. */
+ handle_array[nhandles] = NULL;
+ nhandles = 1;
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (h != handle_array[nhandles])
+ {
+ /* Perform handle->descriptor mapping. Don't update rc, as these
+ results are counted in the return value of Winsock's select. */
+ WSAEventSelect ((SOCKET) h, NULL, 0);
+ if (FD_ISSET (h, &handle_rfds))
+ FD_SET (i, rfds);
+ if (FD_ISSET (h, &handle_wfds))
+ FD_SET (i, wfds);
+ if (FD_ISSET (h, &handle_xfds))
+ FD_SET (i, xfds);
+ }
+ else
+ {
+ /* Not a socket. */
+ nhandles++;
+ win32_poll_handle (h, i, &rbits, &wbits, &xbits);
+ if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, rfds);
+ }
+ if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, wfds);
+ }
+ if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ rc++;
+ FD_SET (i, xfds);
+ }
+ }
+ }
+
+ return rc;
+}
+
+#else /* ! Native Win32. */
+
+#include <sys/select.h>
+
+#undef select
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+{
+ /* Interix 3.5 has a bug: it does not support nfds == 0. */
+ if (nfds == 0)
+ {
+ nfds = 1;
+ rfds = NULL;
+ wfds = NULL;
+ xfds = NULL;
+ }
+ return select (nfds, rfds, wfds, xfds, timeout);
+}
+
+#endif
diff --git a/gnulib/lib/selinux-at.c b/gnulib/lib/selinux-at.c
new file mode 100644
index 0000000..0aa918f
--- /dev/null
+++ b/gnulib/lib/selinux-at.c
@@ -0,0 +1,72 @@
+/* openat-style fd-relative functions for SE Linux
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "selinux-at.h"
+#include "openat.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+#include "save-cwd.h"
+
+#include "openat-priv.h"
+
+#define AT_FUNC_NAME getfileconat
+#define AT_FUNC_F1 getfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t *con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME lgetfileconat
+#define AT_FUNC_F1 lgetfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t *con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME setfileconat
+#define AT_FUNC_F1 setfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
+
+#define AT_FUNC_NAME lsetfileconat
+#define AT_FUNC_F1 lsetfilecon
+#define AT_FUNC_POST_FILE_PARAM_DECLS , security_context_t con
+#define AT_FUNC_POST_FILE_ARGS , con
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
diff --git a/gnulib/lib/selinux-at.h b/gnulib/lib/selinux-at.h
new file mode 100644
index 0000000..5fa3333
--- /dev/null
+++ b/gnulib/lib/selinux-at.h
@@ -0,0 +1,52 @@
+/* Prototypes for openat-style fd-relative SELinux functions
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <selinux/selinux.h>
+#include <selinux/context.h>
+
+/* These are the dir-fd-relative variants of the functions without the
+ "at" suffix. For example, getfileconat (AT_FDCWD, file, &c) is usually
+ equivalent to getfilecon (file, &c). The emulation is accomplished
+ by first attempting getfilecon ("/proc/self/fd/DIR_FD/FILE", &c).
+ Failing that, simulate it via save_cwd/fchdir/getfilecon/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero. */
+
+/* dir-fd-relative getfilecon. Set *CON to the SELinux security context
+ of the file specified by DIR_FD and FILE and return the length of *CON.
+ DIR_FD and FILE are interpreted as for fstatat[*]. A non-NULL *CON
+ must be freed with freecon. Upon error, set *CON to NULL, set errno
+ and return -1.
+ [*] with flags=0 here, with flags=AT_SYMLINK_NOFOLLOW for lgetfileconat */
+int getfileconat (int dir_fd, char const *file, security_context_t *con);
+
+/* dir-fd-relative lgetfilecon. This function is just like getfileconat,
+ except when DIR_FD and FILE specify a symlink: lgetfileconat operates on
+ the symlink, while getfileconat operates on the referent of the symlink. */
+int lgetfileconat (int dir_fd, char const *file, security_context_t *con);
+
+/* dir-fd-relative setfilecon. Set the SELinux security context of
+ the file specified by DIR_FD and FILE to CON. DIR_FD and FILE are
+ interpreted as for fstatat[*]. Upon success, return 0.
+ Otherwise, return -1 and set errno. */
+int setfileconat (int dir_fd, char const *file, security_context_t con);
+
+/* dir-fd-relative lsetfilecon. This function is just like setfileconat,
+ except that rather than dereferencing a symlink, this function affects it. */
+/* dir-fd-relative lsetfilecon. This function is just like setfileconat,
+ except when DIR_FD and FILE specify a symlink: lsetfileconat operates on
+ the symlink, while setfileconat operates on the referent of the symlink. */
+int lsetfileconat (int dir_fd, char const *file, security_context_t con);
diff --git a/gnulib/lib/send.c b/gnulib/lib/send.c
new file mode 100644
index 0000000..cd21482
--- /dev/null
+++ b/gnulib/lib/send.c
@@ -0,0 +1,49 @@
+/* send.c --- wrappers for Windows send function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef send
+
+ssize_t
+rpl_send (int fd, const void *buf, size_t len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = send (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/sendto.c b/gnulib/lib/sendto.c
new file mode 100644
index 0000000..95efab8
--- /dev/null
+++ b/gnulib/lib/sendto.c
@@ -0,0 +1,50 @@
+/* sendto.c --- wrappers for Windows sendto function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef sendto
+
+ssize_t
+rpl_sendto (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = sendto (sock, buf, len, flags, to, tolen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/set-mode-acl.c b/gnulib/lib/set-mode-acl.c
new file mode 100644
index 0000000..d0fc6f8
--- /dev/null
+++ b/gnulib/lib/set-mode-acl.c
@@ -0,0 +1,684 @@
+/* set-mode-acl.c - set access control list equivalent to a mode
+
+ Copyright (C) 2002-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert and Andreas Gruenbacher, and Bruno Haible. */
+
+#include <config.h>
+
+#include "acl.h"
+
+#include "acl-internal.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+
+/* If DESC is a valid file descriptor use fchmod to change the
+ file's mode to MODE on systems that have fchown. On systems
+ that don't have fchown and if DESC is invalid, use chown on
+ NAME instead.
+ Return 0 if successful. Return -1 and set errno upon failure. */
+
+int
+chmod_or_fchmod (const char *name, int desc, mode_t mode)
+{
+ if (HAVE_FCHMOD && desc != -1)
+ return fchmod (desc, mode);
+ else
+ return chmod (name, mode);
+}
+
+/* Set the access control lists of a file. If DESC is a valid file
+ descriptor, use file descriptor operations where available, else use
+ filename based operations on NAME. If access control lists are not
+ available, fchmod the target file to MODE. Also sets the
+ non-permission bits of the destination file (S_ISUID, S_ISGID, S_ISVTX)
+ to those from MODE if any are set.
+ Return 0 if successful. Return -1 and set errno upon failure. */
+
+int
+qset_acl (char const *name, int desc, mode_t mode)
+{
+#if USE_ACL
+# if HAVE_ACL_GET_FILE
+ /* POSIX 1003.1e draft 17 (abandoned) specific version. */
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+# if !HAVE_ACL_TYPE_EXTENDED
+ /* Linux, FreeBSD, IRIX, Tru64 */
+
+ /* We must also have acl_from_text and acl_delete_def_file.
+ (acl_delete_def_file could be emulated with acl_init followed
+ by acl_set_file, but acl_set_file with an empty acl is
+ unspecified.) */
+
+# ifndef HAVE_ACL_FROM_TEXT
+# error Must have acl_from_text (see POSIX 1003.1e draft 17).
+# endif
+# ifndef HAVE_ACL_DELETE_DEF_FILE
+# error Must have acl_delete_def_file (see POSIX 1003.1e draft 17).
+# endif
+
+ acl_t acl;
+ int ret;
+
+ if (HAVE_ACL_FROM_MODE) /* Linux */
+ {
+ acl = acl_from_mode (mode);
+ if (!acl)
+ return -1;
+ }
+ else /* FreeBSD, IRIX, Tru64 */
+ {
+ /* If we were to create the ACL using the functions acl_init(),
+ acl_create_entry(), acl_set_tag_type(), acl_set_qualifier(),
+ acl_get_permset(), acl_clear_perm[s](), acl_add_perm(), we
+ would need to create a qualifier. I don't know how to do this.
+ So create it using acl_from_text(). */
+
+# if HAVE_ACL_FREE_TEXT /* Tru64 */
+ char acl_text[] = "u::---,g::---,o::---,";
+# else /* FreeBSD, IRIX */
+ char acl_text[] = "u::---,g::---,o::---";
+# endif
+
+ if (mode & S_IRUSR) acl_text[ 3] = 'r';
+ if (mode & S_IWUSR) acl_text[ 4] = 'w';
+ if (mode & S_IXUSR) acl_text[ 5] = 'x';
+ if (mode & S_IRGRP) acl_text[10] = 'r';
+ if (mode & S_IWGRP) acl_text[11] = 'w';
+ if (mode & S_IXGRP) acl_text[12] = 'x';
+ if (mode & S_IROTH) acl_text[17] = 'r';
+ if (mode & S_IWOTH) acl_text[18] = 'w';
+ if (mode & S_IXOTH) acl_text[19] = 'x';
+
+ acl = acl_from_text (acl_text);
+ if (!acl)
+ return -1;
+ }
+ if (HAVE_ACL_SET_FD && desc != -1)
+ ret = acl_set_fd (desc, acl);
+ else
+ ret = acl_set_file (name, ACL_TYPE_ACCESS, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+ acl_free (acl);
+
+ if (ACL_NOT_WELL_SUPPORTED (errno))
+ return chmod_or_fchmod (name, desc, mode);
+ else
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ else
+ acl_free (acl);
+
+ if (S_ISDIR (mode) && acl_delete_def_file (name))
+ return -1;
+
+ if (!MODE_INSIDE_ACL || (mode & (S_ISUID | S_ISGID | S_ISVTX)))
+ {
+ /* We did not call chmod so far, and either the mode and the ACL are
+ separate or special bits are to be set which don't fit into ACLs. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# else /* HAVE_ACL_TYPE_EXTENDED */
+ /* MacOS X */
+
+ /* On MacOS X, acl_get_file (name, ACL_TYPE_ACCESS)
+ and acl_get_file (name, ACL_TYPE_DEFAULT)
+ always return NULL / EINVAL. You have to use
+ acl_get_file (name, ACL_TYPE_EXTENDED)
+ or acl_get_fd (open (name, ...))
+ to retrieve an ACL.
+ On the other hand,
+ acl_set_file (name, ACL_TYPE_ACCESS, acl)
+ and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
+ have the same effect as
+ acl_set_file (name, ACL_TYPE_EXTENDED, acl):
+ Each of these calls sets the file's ACL. */
+
+ acl_t acl;
+ int ret;
+
+ /* Remove the ACL if the file has ACLs. */
+ if (HAVE_ACL_GET_FD && desc != -1)
+ acl = acl_get_fd (desc);
+ else
+ acl = acl_get_file (name, ACL_TYPE_EXTENDED);
+ if (acl)
+ {
+ acl_free (acl);
+
+ acl = acl_init (0);
+ if (acl)
+ {
+ if (HAVE_ACL_SET_FD && desc != -1)
+ ret = acl_set_fd (desc, acl);
+ else
+ ret = acl_set_file (name, ACL_TYPE_EXTENDED, acl);
+ if (ret != 0)
+ {
+ int saved_errno = errno;
+
+ acl_free (acl);
+
+ if (ACL_NOT_WELL_SUPPORTED (saved_errno))
+ return chmod_or_fchmod (name, desc, mode);
+ else
+ {
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ acl_free (acl);
+ }
+ }
+
+ /* Since !MODE_INSIDE_ACL, we have to call chmod explicitly. */
+ return chmod_or_fchmod (name, desc, mode);
+# endif
+
+# elif HAVE_FACL && defined GETACLCNT /* Solaris, Cygwin, not HP-UX */
+
+ int done_setacl = 0;
+
+# ifdef ACE_GETACL
+ /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
+ file systems (whereas the other ones are used in UFS file systems). */
+
+ /* The flags in the ace_t structure changed in a binary incompatible way
+ when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
+ How to distinguish the two conventions at runtime?
+ We fetch the existing ACL. In the old convention, usually three ACEs have
+ a_flags = ACE_OWNER / ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400.
+ In the new convention, these values are not used. */
+ int convention;
+
+ {
+ int count;
+ ace_t *entries;
+
+ for (;;)
+ {
+ if (desc != -1)
+ count = facl (desc, ACE_GETACLCNT, 0, NULL);
+ else
+ count = acl (name, ACE_GETACLCNT, 0, NULL);
+ if (count <= 0)
+ {
+ convention = -1;
+ break;
+ }
+ entries = (ace_t *) malloc (count * sizeof (ace_t));
+ if (entries == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ if ((desc != -1
+ ? facl (desc, ACE_GETACL, count, entries)
+ : acl (name, ACE_GETACL, count, entries))
+ == count)
+ {
+ int i;
+
+ convention = 0;
+ for (i = 0; i < count; i++)
+ if (entries[i].a_flags & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_ACE_OTHER))
+ {
+ convention = 1;
+ break;
+ }
+ free (entries);
+ break;
+ }
+ /* Huh? The number of ACL entries changed since the last call.
+ Repeat. */
+ free (entries);
+ }
+ }
+
+ if (convention >= 0)
+ {
+ ace_t entries[6];
+ int count;
+ int ret;
+
+ if (convention)
+ {
+ /* Running on Solaris 10. */
+ entries[0].a_type = OLD_ALLOW;
+ entries[0].a_flags = OLD_ACE_OWNER;
+ entries[0].a_who = 0; /* irrelevant */
+ entries[0].a_access_mask = (mode >> 6) & 7;
+ entries[1].a_type = OLD_ALLOW;
+ entries[1].a_flags = OLD_ACE_GROUP;
+ entries[1].a_who = 0; /* irrelevant */
+ entries[1].a_access_mask = (mode >> 3) & 7;
+ entries[2].a_type = OLD_ALLOW;
+ entries[2].a_flags = OLD_ACE_OTHER;
+ entries[2].a_who = 0;
+ entries[2].a_access_mask = mode & 7;
+ count = 3;
+ }
+ else
+ {
+ /* Running on Solaris 10 (newer version) or Solaris 11.
+ The details here were found through "/bin/ls -lvd somefiles". */
+ entries[0].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
+ entries[0].a_flags = NEW_ACE_OWNER;
+ entries[0].a_who = 0; /* irrelevant */
+ entries[0].a_access_mask = 0;
+ entries[1].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[1].a_flags = NEW_ACE_OWNER;
+ entries[1].a_who = 0; /* irrelevant */
+ entries[1].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER;
+ if (mode & 0400)
+ entries[1].a_access_mask |= NEW_ACE_READ_DATA;
+ else
+ entries[0].a_access_mask |= NEW_ACE_READ_DATA;
+ if (mode & 0200)
+ entries[1].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ else
+ entries[0].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ if (mode & 0100)
+ entries[1].a_access_mask |= NEW_ACE_EXECUTE;
+ else
+ entries[0].a_access_mask |= NEW_ACE_EXECUTE;
+ entries[2].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
+ entries[2].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP;
+ entries[2].a_who = 0; /* irrelevant */
+ entries[2].a_access_mask = 0;
+ entries[3].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[3].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP;
+ entries[3].a_who = 0; /* irrelevant */
+ entries[3].a_access_mask = 0;
+ if (mode & 0040)
+ entries[3].a_access_mask |= NEW_ACE_READ_DATA;
+ else
+ entries[2].a_access_mask |= NEW_ACE_READ_DATA;
+ if (mode & 0020)
+ entries[3].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ else
+ entries[2].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ if (mode & 0010)
+ entries[3].a_access_mask |= NEW_ACE_EXECUTE;
+ else
+ entries[2].a_access_mask |= NEW_ACE_EXECUTE;
+ entries[4].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
+ entries[4].a_flags = NEW_ACE_EVERYONE;
+ entries[4].a_who = 0;
+ entries[4].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS
+ | NEW_ACE_WRITE_ATTRIBUTES
+ | NEW_ACE_WRITE_ACL
+ | NEW_ACE_WRITE_OWNER;
+ entries[5].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
+ entries[5].a_flags = NEW_ACE_EVERYONE;
+ entries[5].a_who = 0;
+ entries[5].a_access_mask = NEW_ACE_READ_NAMED_ATTRS
+ | NEW_ACE_READ_ATTRIBUTES
+ | NEW_ACE_READ_ACL
+ | NEW_ACE_SYNCHRONIZE;
+ if (mode & 0004)
+ entries[5].a_access_mask |= NEW_ACE_READ_DATA;
+ else
+ entries[4].a_access_mask |= NEW_ACE_READ_DATA;
+ if (mode & 0002)
+ entries[5].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ else
+ entries[4].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
+ if (mode & 0001)
+ entries[5].a_access_mask |= NEW_ACE_EXECUTE;
+ else
+ entries[4].a_access_mask |= NEW_ACE_EXECUTE;
+ count = 6;
+ }
+ if (desc != -1)
+ ret = facl (desc, ACE_SETACL, count, entries);
+ else
+ ret = acl (name, ACE_SETACL, count, entries);
+ if (ret < 0 && errno != EINVAL && errno != ENOTSUP)
+ {
+ if (errno == ENOSYS)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+ if (ret == 0)
+ done_setacl = 1;
+ }
+# endif
+
+ if (!done_setacl)
+ {
+ aclent_t entries[3];
+ int ret;
+
+ entries[0].a_type = USER_OBJ;
+ entries[0].a_id = 0; /* irrelevant */
+ entries[0].a_perm = (mode >> 6) & 7;
+ entries[1].a_type = GROUP_OBJ;
+ entries[1].a_id = 0; /* irrelevant */
+ entries[1].a_perm = (mode >> 3) & 7;
+ entries[2].a_type = OTHER_OBJ;
+ entries[2].a_id = 0;
+ entries[2].a_perm = mode & 7;
+
+ if (desc != -1)
+ ret = facl (desc, SETACL,
+ sizeof (entries) / sizeof (aclent_t), entries);
+ else
+ ret = acl (name, SETACL,
+ sizeof (entries) / sizeof (aclent_t), entries);
+ if (ret < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+ }
+
+ if (!MODE_INSIDE_ACL || (mode & (S_ISUID | S_ISGID | S_ISVTX)))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# elif HAVE_GETACL /* HP-UX */
+
+ struct stat statbuf;
+ int ret;
+
+ if (desc != -1)
+ ret = fstat (desc, &statbuf);
+ else
+ ret = stat (name, &statbuf);
+ if (ret < 0)
+ return -1;
+
+ {
+ struct acl_entry entries[3];
+
+ entries[0].uid = statbuf.st_uid;
+ entries[0].gid = ACL_NSGROUP;
+ entries[0].mode = (mode >> 6) & 7;
+ entries[1].uid = ACL_NSUSER;
+ entries[1].gid = statbuf.st_gid;
+ entries[1].mode = (mode >> 3) & 7;
+ entries[2].uid = ACL_NSUSER;
+ entries[2].gid = ACL_NSGROUP;
+ entries[2].mode = mode & 7;
+
+ if (desc != -1)
+ ret = fsetacl (desc, sizeof (entries) / sizeof (struct acl_entry), entries);
+ else
+ ret = setacl (name, sizeof (entries) / sizeof (struct acl_entry), entries);
+ }
+ if (ret < 0)
+ {
+ if (!(errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP))
+ return -1;
+
+# if HAVE_ACLV_H /* HP-UX >= 11.11 */
+ {
+ struct acl entries[4];
+
+ entries[0].a_type = USER_OBJ;
+ entries[0].a_id = 0; /* irrelevant */
+ entries[0].a_perm = (mode >> 6) & 7;
+ entries[1].a_type = GROUP_OBJ;
+ entries[1].a_id = 0; /* irrelevant */
+ entries[1].a_perm = (mode >> 3) & 7;
+ entries[2].a_type = CLASS_OBJ;
+ entries[2].a_id = 0;
+ entries[2].a_perm = (mode >> 3) & 7;
+ entries[3].a_type = OTHER_OBJ;
+ entries[3].a_id = 0;
+ entries[3].a_perm = mode & 7;
+
+ ret = aclsort (sizeof (entries) / sizeof (struct acl), 1, entries);
+ if (ret > 0)
+ abort ();
+ if (ret < 0)
+ {
+ if (0)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+
+ ret = acl ((char *) name, ACL_SET,
+ sizeof (entries) / sizeof (struct acl), entries);
+ if (ret < 0)
+ {
+ if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+ }
+# else
+ return chmod_or_fchmod (name, desc, mode);
+# endif
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
+
+ acl_type_list_t types;
+ size_t types_size = sizeof (types);
+ acl_type_t type;
+
+ if (aclx_gettypes (name, &types, &types_size) < 0
+ || types.num_entries == 0)
+ return chmod_or_fchmod (name, desc, mode);
+
+ /* XXX Do we need to clear all types of ACLs for the given file, or is it
+ sufficient to clear the first one? */
+ type = types.entries[0];
+ if (type.u64 == ACL_AIXC)
+ {
+ union { struct acl a; char room[128]; } u;
+ int ret;
+
+ u.a.acl_len = (char *) &u.a.acl_ext[0] - (char *) &u.a; /* no entries */
+ u.a.acl_mode = mode & ~(S_IXACL | 0777);
+ u.a.u_access = (mode >> 6) & 7;
+ u.a.g_access = (mode >> 3) & 7;
+ u.a.o_access = mode & 7;
+
+ if (desc != -1)
+ ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.acl_len, mode);
+ else
+ ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.acl_len, mode);
+ if (!(ret < 0 && errno == ENOSYS))
+ return ret;
+ }
+ else if (type.u64 == ACL_NFS4)
+ {
+ union { nfs4_acl_int_t a; char room[128]; } u;
+ nfs4_ace_int_t *ace;
+ int ret;
+
+ u.a.aclVersion = NFS4_ACL_INT_STRUCT_VERSION;
+ u.a.aclEntryN = 0;
+ ace = &u.a.aclEntry[0];
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_OWNER;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0400 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0200
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0100 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_GROUP;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0040 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0020
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0010 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ {
+ ace->flags = ACE4_ID_SPECIAL;
+ ace->aceWho.special_whoid = ACE4_WHO_EVERYONE;
+ ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
+ ace->aceFlags = 0;
+ ace->aceMask =
+ (mode & 0004 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
+ | (mode & 0002
+ ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
+ | ACE4_ADD_SUBDIRECTORY
+ : 0)
+ | (mode & 0001 ? ACE4_EXECUTE : 0);
+ ace->aceWhoString[0] = '\0';
+ ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
+ ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
+ u.a.aclEntryN++;
+ }
+ u.a.aclLength = (char *) ace - (char *) &u.a;
+
+ if (desc != -1)
+ ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.aclLength, mode);
+ else
+ ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
+ type, &u.a, u.a.aclLength, mode);
+ if (!(ret < 0 && errno == ENOSYS))
+ return ret;
+ }
+
+ return chmod_or_fchmod (name, desc, mode);
+
+# elif HAVE_STATACL /* older AIX */
+
+ union { struct acl a; char room[128]; } u;
+ int ret;
+
+ u.a.acl_len = (char *) &u.a.acl_ext[0] - (char *) &u.a; /* no entries */
+ u.a.acl_mode = mode & ~(S_IXACL | 0777);
+ u.a.u_access = (mode >> 6) & 7;
+ u.a.g_access = (mode >> 3) & 7;
+ u.a.o_access = mode & 7;
+
+ if (desc != -1)
+ ret = fchacl (desc, &u.a, u.a.acl_len);
+ else
+ ret = chacl (name, &u.a, u.a.acl_len);
+
+ if (ret < 0 && errno == ENOSYS)
+ return chmod_or_fchmod (name, desc, mode);
+
+ return ret;
+
+# elif HAVE_ACLSORT /* NonStop Kernel */
+
+ struct acl entries[4];
+ int ret;
+
+ entries[0].a_type = USER_OBJ;
+ entries[0].a_id = 0; /* irrelevant */
+ entries[0].a_perm = (mode >> 6) & 7;
+ entries[1].a_type = GROUP_OBJ;
+ entries[1].a_id = 0; /* irrelevant */
+ entries[1].a_perm = (mode >> 3) & 7;
+ entries[2].a_type = CLASS_OBJ;
+ entries[2].a_id = 0;
+ entries[2].a_perm = (mode >> 3) & 7;
+ entries[3].a_type = OTHER_OBJ;
+ entries[3].a_id = 0;
+ entries[3].a_perm = mode & 7;
+
+ ret = aclsort (sizeof (entries) / sizeof (struct acl), 1, entries);
+ if (ret > 0)
+ abort ();
+ if (ret < 0)
+ {
+ if (0)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+
+ ret = acl ((char *) name, ACL_SET,
+ sizeof (entries) / sizeof (struct acl), entries);
+ if (ret < 0)
+ {
+ if (0)
+ return chmod_or_fchmod (name, desc, mode);
+ return -1;
+ }
+
+ if (mode & (S_ISUID | S_ISGID | S_ISVTX))
+ {
+ /* We did not call chmod so far, so the special bits have not yet
+ been set. */
+ return chmod_or_fchmod (name, desc, mode);
+ }
+ return 0;
+
+# else /* Unknown flavor of ACLs */
+ return chmod_or_fchmod (name, desc, mode);
+# endif
+#else /* !USE_ACL */
+ return chmod_or_fchmod (name, desc, mode);
+#endif
+}
+
+/* As with qset_acl, but also output a diagnostic on failure. */
+
+int
+set_acl (char const *name, int desc, mode_t mode)
+{
+ int r = qset_acl (name, desc, mode);
+ if (r != 0)
+ error (0, errno, _("setting permissions for %s"), quote (name));
+ return r;
+}
diff --git a/gnulib/lib/setenv.c b/gnulib/lib/setenv.c
new file mode 100644
index 0000000..0a5f67d
--- /dev/null
+++ b/gnulib/lib/setenv.c
@@ -0,0 +1,390 @@
+/* Copyright (C) 1992, 1995-2003, 2005-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# define _GL_USE_STDLIB_ALLOC 1
+# include <config.h>
+#endif
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <alloca.h>
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#if _LIBC || HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if !_LIBC
+# include "malloca.h"
+#endif
+
+#if _LIBC || !HAVE_SETENV
+
+#if !_LIBC
+# define __environ environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define setenv __setenv
+# define clearenv __clearenv
+# define tfind __tfind
+# define tsearch __tsearch
+#endif
+
+/* In the GNU C library implementation we try to be more clever and
+ allow arbitrarily many changes of the environment given that the used
+ values are from a small set. Outside glibc this will eat up all
+ memory after a while. */
+#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
+ && defined __GNUC__)
+# define USE_TSEARCH 1
+# include <search.h>
+typedef int (*compar_fn_t) (const void *, const void *);
+
+/* This is a pointer to the root of the search tree with the known
+ values. */
+static void *known_values;
+
+# define KNOWN_VALUE(Str) \
+ ({ \
+ void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \
+ value != NULL ? *(char **) value : NULL; \
+ })
+# define STORE_VALUE(Str) \
+ tsearch (Str, &known_values, (compar_fn_t) strcmp)
+
+#else
+# undef USE_TSEARCH
+
+# define KNOWN_VALUE(Str) NULL
+# define STORE_VALUE(Str) do { } while (0)
+
+#endif
+
+
+/* If this variable is not a null pointer we allocated the current
+ environment. */
+static char **last_environ;
+
+
+/* This function is used by `setenv' and `putenv'. The difference between
+ the two functions is that for the former must create a new string which
+ is then placed in the environment, while the argument of `putenv'
+ must be used directly. This is all complicated by the fact that we try
+ to reuse values once generated for a `setenv' call since we can never
+ free the strings. */
+int
+__add_to_environ (const char *name, const char *value, const char *combined,
+ int replace)
+{
+ char **ep;
+ size_t size;
+ const size_t namelen = strlen (name);
+ const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
+
+ LOCK;
+
+ /* We have to get the pointer now that we have the lock and not earlier
+ since another thread might have created a new environment. */
+ ep = __environ;
+
+ size = 0;
+ if (ep != NULL)
+ {
+ for (; *ep != NULL; ++ep)
+ if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
+ break;
+ else
+ ++size;
+ }
+
+ if (ep == NULL || *ep == NULL)
+ {
+ char **new_environ;
+#ifdef USE_TSEARCH
+ char *new_value;
+#endif
+
+ /* We allocated this space; we can extend it. */
+ new_environ =
+ (char **) (last_environ == NULL
+ ? malloc ((size + 2) * sizeof (char *))
+ : realloc (last_environ, (size + 2) * sizeof (char *)));
+ if (new_environ == NULL)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'malloc-posix' and 'realloc-posix' gnulib modules. */
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+ /* If the whole entry is given add it. */
+ if (combined != NULL)
+ /* We must not add the string to the search tree since it belongs
+ to the user. */
+ new_environ[size] = (char *) combined;
+ else
+ {
+ /* See whether the value is already known. */
+#ifdef USE_TSEARCH
+# ifdef _LIBC
+ new_value = (char *) alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = (char *) malloca (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ new_environ[size] = KNOWN_VALUE (new_value);
+ if (new_environ[size] == NULL)
+#endif
+ {
+ new_environ[size] = (char *) malloc (namelen + 1 + vallen);
+ if (new_environ[size] == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (new_environ[size], new_value, namelen + 1 + vallen);
+#else
+ memcpy (new_environ[size], name, namelen);
+ new_environ[size][namelen] = '=';
+ memcpy (&new_environ[size][namelen + 1], value, vallen);
+#endif
+ /* And save the value now. We cannot do this when we remove
+ the string since then we cannot decide whether it is a
+ user string or not. */
+ STORE_VALUE (new_environ[size]);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ }
+
+ if (__environ != last_environ)
+ memcpy ((char *) new_environ, (char *) __environ,
+ size * sizeof (char *));
+
+ new_environ[size + 1] = NULL;
+
+ last_environ = __environ = new_environ;
+ }
+ else if (replace)
+ {
+ char *np;
+
+ /* Use the user string if given. */
+ if (combined != NULL)
+ np = (char *) combined;
+ else
+ {
+#ifdef USE_TSEARCH
+ char *new_value;
+# ifdef _LIBC
+ new_value = alloca (namelen + 1 + vallen);
+ __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
+ value, vallen);
+# else
+ new_value = malloca (namelen + 1 + vallen);
+ if (new_value == NULL)
+ {
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+ memcpy (new_value, name, namelen);
+ new_value[namelen] = '=';
+ memcpy (&new_value[namelen + 1], value, vallen);
+# endif
+
+ np = KNOWN_VALUE (new_value);
+ if (np == NULL)
+#endif
+ {
+ np = (char *) malloc (namelen + 1 + vallen);
+ if (np == NULL)
+ {
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ __set_errno (ENOMEM);
+ UNLOCK;
+ return -1;
+ }
+
+#ifdef USE_TSEARCH
+ memcpy (np, new_value, namelen + 1 + vallen);
+#else
+ memcpy (np, name, namelen);
+ np[namelen] = '=';
+ memcpy (&np[namelen + 1], value, vallen);
+#endif
+ /* And remember the value. */
+ STORE_VALUE (np);
+ }
+#if defined USE_TSEARCH && !defined _LIBC
+ freea (new_value);
+#endif
+ }
+
+ *ep = np;
+ }
+
+ UNLOCK;
+
+ return 0;
+}
+
+int
+setenv (const char *name, const char *value, int replace)
+{
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ return __add_to_environ (name, value, NULL, replace);
+}
+
+/* The `clearenv' was planned to be added to POSIX.1 but probably
+ never made it. Nevertheless the POSIX.9 standard (POSIX bindings
+ for Fortran 77) requires this function. */
+int
+clearenv (void)
+{
+ LOCK;
+
+ if (__environ == last_environ && __environ != NULL)
+ {
+ /* We allocated this environment so we can free it. */
+ free (__environ);
+ last_environ = NULL;
+ }
+
+ /* Clear the environment pointer removes the whole environment. */
+ __environ = NULL;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+static void
+free_mem (void)
+{
+ /* Remove all traces. */
+ clearenv ();
+
+ /* Now remove the search tree. */
+ __tdestroy (known_values, free);
+ known_values = NULL;
+}
+text_set_element (__libc_subfreeres, free_mem);
+
+
+# undef setenv
+# undef clearenv
+weak_alias (__setenv, setenv)
+weak_alias (__clearenv, clearenv)
+#endif
+
+#endif /* _LIBC || !HAVE_SETENV */
+
+/* The rest of this file is called into use when replacing an existing
+ but buggy setenv. Known bugs include failure to diagnose invalid
+ name, and consuming a leading '=' from value. */
+#if HAVE_SETENV
+
+# undef setenv
+# if !HAVE_DECL_SETENV
+extern int setenv (const char *, const char *, int);
+# endif
+# define STREQ(a, b) (strcmp (a, b) == 0)
+
+int
+rpl_setenv (const char *name, const char *value, int replace)
+{
+ int result;
+ if (!name || !*name || strchr (name, '='))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ /* Call the real setenv even if replace is 0, in case implementation
+ has underlying data to update, such as when environ changes. */
+ result = setenv (name, value, replace);
+ if (result == 0 && replace && *value == '=')
+ {
+ char *tmp = getenv (name);
+ if (!STREQ (tmp, value))
+ {
+ int saved_errno;
+ size_t len = strlen (value);
+ tmp = malloca (len + 2);
+ /* Since leading '=' is eaten, double it up. */
+ *tmp = '=';
+ memcpy (tmp + 1, value, len + 1);
+ result = setenv (name, tmp, replace);
+ saved_errno = errno;
+ freea (tmp);
+ errno = saved_errno;
+ }
+ }
+ return result;
+}
+
+#endif /* HAVE_SETENV */
diff --git a/gnulib/lib/sethostname.c b/gnulib/lib/sethostname.c
new file mode 100644
index 0000000..6555921
--- /dev/null
+++ b/gnulib/lib/sethostname.c
@@ -0,0 +1,162 @@
+/* sethostname emulation for glibc compliance.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ben Walton <bwalton@artsci.utoronto.ca> */
+
+#include <config.h>
+
+#if !((defined _WIN32 || defined __WIN32__) || defined __CYGWIN__)
+/* Unix API. */
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <limits.h>
+
+/* Set up to LEN chars of NAME as system hostname.
+ Return 0 if ok, set errno and return -1 on error. */
+
+int
+sethostname (const char *name, size_t len)
+{
+ /* Ensure the string isn't too long. glibc does allow setting an
+ empty hostname so no point in enforcing a lower bound. */
+ if (len > HOST_NAME_MAX)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+#ifdef __minix /* Minix */
+ {
+ FILE *hostf;
+ int r = 0;
+
+ /* glibc returns EFAULT, EINVAL, and EPERM on error. None of
+ these are appropriate for us to set, even if they may match the
+ situation, during failed open/write/close operations, so we
+ leave errno alone and rely on what the system sets up. */
+ hostf = fopen ("/etc/hostname.file", "w");
+ if (hostf == NULL)
+ r = -1;
+ else
+ {
+ fprintf (hostf, "%.*s\n", (int) len, name);
+ if (ferror (hostf))
+ {
+ /* Close hostf, preserving the errno from the fprintf call. */
+ int saved_errno = errno;
+ fclose (hostf);
+ errno = saved_errno;
+ r = -1;
+ }
+ else
+ {
+ if (fclose (hostf))
+ /* fclose sets errno on failure. */
+ r = -1;
+ }
+ }
+
+ return r;
+ }
+#else
+ /* For platforms that we don't have a better option for, simply bail
+ out. */
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+#else
+/* Native Windows API. Also used on Cygwin. */
+
+/* Ensure that <windows.h> declares SetComputerNameEx. */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x500
+
+#define WIN32_LEAN_AND_MEAN
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+
+#include <windows.h>
+/* The mingw header files don't define GetComputerNameEx, SetComputerNameEx. */
+#ifndef GetComputerNameEx
+# define GetComputerNameEx GetComputerNameExA
+#endif
+#ifndef SetComputerNameEx
+# define SetComputerNameEx SetComputerNameExA
+#endif
+
+/* Set up to LEN chars of NAME as system hostname.
+ Return 0 if ok, set errno and return -1 on error. */
+
+int
+sethostname (const char *name, size_t len)
+{
+ char name_asciz[HOST_NAME_MAX + 1];
+ char old_name[HOST_NAME_MAX + 1];
+ DWORD old_name_len;
+
+ /* Ensure the string isn't too long. glibc does allow setting an
+ empty hostname so no point in enforcing a lower bound. */
+ if (len > HOST_NAME_MAX)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Prepare a NUL-terminated copy of name. */
+ memcpy (name_asciz, name, len);
+ name_asciz[len] = '\0';
+
+ /* Save the old NetBIOS name. */
+ old_name_len = sizeof (old_name) - 1;
+ if (! GetComputerNameEx (ComputerNamePhysicalNetBIOS,
+ old_name, &old_name_len))
+ old_name_len = 0;
+
+ /* Set both the NetBIOS and the first part of the IP / DNS name. */
+ if (! SetComputerNameEx (ComputerNamePhysicalNetBIOS, name_asciz))
+ {
+ errno = (GetLastError () == ERROR_ACCESS_DENIED ? EPERM : EINVAL);
+ return -1;
+ }
+ if (! SetComputerNameEx (ComputerNamePhysicalDnsHostname, name_asciz))
+ {
+ errno = (GetLastError () == ERROR_ACCESS_DENIED ? EPERM : EINVAL);
+ /* Restore the old NetBIOS name. */
+ if (old_name_len > 0)
+ {
+ old_name[old_name_len] = '\0';
+ SetComputerNameEx (ComputerNamePhysicalNetBIOS, old_name);
+ }
+ return -1;
+ }
+
+ /* Note that the new host name becomes effective only after a reboot! */
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/setlocale.c b/gnulib/lib/setlocale.c
new file mode 100644
index 0000000..0cef00f
--- /dev/null
+++ b/gnulib/lib/setlocale.c
@@ -0,0 +1,938 @@
+/* Set the current locale.
+ Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2009. */
+
+#include <config.h>
+
+/* Override setlocale() so that when the default locale is requested
+ (locale = ""), the environment variables LC_ALL, LC_*, and LANG are
+ considered.
+ Also include all the functionality from libintl's setlocale() override. */
+
+/* Please keep this file in sync with
+ gettext/gettext-runtime/intl/setlocale.c ! */
+
+/* Specification. */
+#include <locale.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "localename.h"
+
+#if 1
+
+# undef setlocale
+
+/* Return string representation of locale category CATEGORY. */
+static const char *
+category_to_name (int category)
+{
+ const char *retval;
+
+ switch (category)
+ {
+ case LC_COLLATE:
+ retval = "LC_COLLATE";
+ break;
+ case LC_CTYPE:
+ retval = "LC_CTYPE";
+ break;
+ case LC_MONETARY:
+ retval = "LC_MONETARY";
+ break;
+ case LC_NUMERIC:
+ retval = "LC_NUMERIC";
+ break;
+ case LC_TIME:
+ retval = "LC_TIME";
+ break;
+ case LC_MESSAGES:
+ retval = "LC_MESSAGES";
+ break;
+ default:
+ /* If you have a better idea for a default value let me know. */
+ retval = "LC_XXX";
+ }
+
+ return retval;
+}
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* The native Win32 setlocale() function expects locale names of the form
+ "German" or "German_Germany" or "DEU", but not "de" or "de_DE". We need
+ to convert the names from the form with ISO 639 language code and ISO 3166
+ country code to the form with English names or with three-letter identifier.
+ The three-letter identifiers known by a Windows XP SP2 or SP3 are:
+ AFK Afrikaans_South Africa.1252
+ ARA Arabic_Saudi Arabia.1256
+ ARB Arabic_Lebanon.1256
+ ARE Arabic_Egypt.1256
+ ARG Arabic_Algeria.1256
+ ARH Arabic_Bahrain.1256
+ ARI Arabic_Iraq.1256
+ ARJ Arabic_Jordan.1256
+ ARK Arabic_Kuwait.1256
+ ARL Arabic_Libya.1256
+ ARM Arabic_Morocco.1256
+ ARO Arabic_Oman.1256
+ ARQ Arabic_Qatar.1256
+ ARS Arabic_Syria.1256
+ ART Arabic_Tunisia.1256
+ ARU Arabic_U.A.E..1256
+ ARY Arabic_Yemen.1256
+ AZE Azeri (Latin)_Azerbaijan.1254
+ BEL Belarusian_Belarus.1251
+ BGR Bulgarian_Bulgaria.1251
+ BSB Bosnian_Bosnia and Herzegovina.1250
+ BSC Bosnian (Cyrillic)_Bosnia and Herzegovina.1250 (wrong encoding!)
+ CAT Catalan_Spain.1252
+ CHH Chinese_Hong Kong S.A.R..950
+ CHI Chinese_Singapore.936
+ CHS Chinese_People's Republic of China.936
+ CHT Chinese_Taiwan.950
+ CSY Czech_Czech Republic.1250
+ CYM Welsh_United Kingdom.1252
+ DAN Danish_Denmark.1252
+ DEA German_Austria.1252
+ DEC German_Liechtenstein.1252
+ DEL German_Luxembourg.1252
+ DES German_Switzerland.1252
+ DEU German_Germany.1252
+ ELL Greek_Greece.1253
+ ENA English_Australia.1252
+ ENB English_Caribbean.1252
+ ENC English_Canada.1252
+ ENG English_United Kingdom.1252
+ ENI English_Ireland.1252
+ ENJ English_Jamaica.1252
+ ENL English_Belize.1252
+ ENP English_Republic of the Philippines.1252
+ ENS English_South Africa.1252
+ ENT English_Trinidad and Tobago.1252
+ ENU English_United States.1252
+ ENW English_Zimbabwe.1252
+ ENZ English_New Zealand.1252
+ ESA Spanish_Panama.1252
+ ESB Spanish_Bolivia.1252
+ ESC Spanish_Costa Rica.1252
+ ESD Spanish_Dominican Republic.1252
+ ESE Spanish_El Salvador.1252
+ ESF Spanish_Ecuador.1252
+ ESG Spanish_Guatemala.1252
+ ESH Spanish_Honduras.1252
+ ESI Spanish_Nicaragua.1252
+ ESL Spanish_Chile.1252
+ ESM Spanish_Mexico.1252
+ ESN Spanish_Spain.1252
+ ESO Spanish_Colombia.1252
+ ESP Spanish_Spain.1252
+ ESR Spanish_Peru.1252
+ ESS Spanish_Argentina.1252
+ ESU Spanish_Puerto Rico.1252
+ ESV Spanish_Venezuela.1252
+ ESY Spanish_Uruguay.1252
+ ESZ Spanish_Paraguay.1252
+ ETI Estonian_Estonia.1257
+ EUQ Basque_Spain.1252
+ FAR Farsi_Iran.1256
+ FIN Finnish_Finland.1252
+ FOS Faroese_Faroe Islands.1252
+ FPO Filipino_Philippines.1252
+ FRA French_France.1252
+ FRB French_Belgium.1252
+ FRC French_Canada.1252
+ FRL French_Luxembourg.1252
+ FRM French_Principality of Monaco.1252
+ FRS French_Switzerland.1252
+ FYN Frisian_Netherlands.1252
+ GLC Galician_Spain.1252
+ HEB Hebrew_Israel.1255
+ HRB Croatian_Bosnia and Herzegovina.1250
+ HRV Croatian_Croatia.1250
+ HUN Hungarian_Hungary.1250
+ IND Indonesian_Indonesia.1252
+ IRE Irish_Ireland.1252
+ ISL Icelandic_Iceland.1252
+ ITA Italian_Italy.1252
+ ITS Italian_Switzerland.1252
+ IUK Inuktitut (Latin)_Canada.1252
+ JPN Japanese_Japan.932
+ KKZ Kazakh_Kazakhstan.1251
+ KOR Korean_Korea.949
+ KYR Kyrgyz_Kyrgyzstan.1251
+ LBX Luxembourgish_Luxembourg.1252
+ LTH Lithuanian_Lithuania.1257
+ LVI Latvian_Latvia.1257
+ MKI FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251
+ MON Mongolian_Mongolia.1251
+ MPD Mapudungun_Chile.1252
+ MSB Malay_Brunei Darussalam.1252
+ MSL Malay_Malaysia.1252
+ MWK Mohawk_Canada.1252
+ NLB Dutch_Belgium.1252
+ NLD Dutch_Netherlands.1252
+ NON Norwegian-Nynorsk_Norway.1252
+ NOR Norwegian (Bokmål)_Norway.1252
+ NSO Northern Sotho_South Africa.1252
+ PLK Polish_Poland.1250
+ PTB Portuguese_Brazil.1252
+ PTG Portuguese_Portugal.1252
+ QUB Quechua_Bolivia.1252
+ QUE Quechua_Ecuador.1252
+ QUP Quechua_Peru.1252
+ RMC Romansh_Switzerland.1252
+ ROM Romanian_Romania.1250
+ RUS Russian_Russia.1251
+ SKY Slovak_Slovakia.1250
+ SLV Slovenian_Slovenia.1250
+ SMA Sami (Southern)_Norway.1252
+ SMB Sami (Southern)_Sweden.1252
+ SME Sami (Northern)_Norway.1252
+ SMF Sami (Northern)_Sweden.1252
+ SMG Sami (Northern)_Finland.1252
+ SMJ Sami (Lule)_Norway.1252
+ SMK Sami (Lule)_Sweden.1252
+ SMN Sami (Inari)_Finland.1252
+ SMS Sami (Skolt)_Finland.1252
+ SQI Albanian_Albania.1250
+ SRB Serbian (Cyrillic)_Serbia and Montenegro.1251
+ SRL Serbian (Latin)_Serbia and Montenegro.1250
+ SRN Serbian (Cyrillic)_Bosnia and Herzegovina.1251
+ SRS Serbian (Latin)_Bosnia and Herzegovina.1250
+ SVE Swedish_Sweden.1252
+ SVF Swedish_Finland.1252
+ SWK Swahili_Kenya.1252
+ THA Thai_Thailand.874
+ TRK Turkish_Turkey.1254
+ TSN Tswana_South Africa.1252
+ TTT Tatar_Russia.1251
+ UKR Ukrainian_Ukraine.1251
+ URD Urdu_Islamic Republic of Pakistan.1256
+ USA English_United States.1252
+ UZB Uzbek (Latin)_Uzbekistan.1254
+ VIT Vietnamese_Viet Nam.1258
+ XHO Xhosa_South Africa.1252
+ ZHH Chinese_Hong Kong S.A.R..950
+ ZHI Chinese_Singapore.936
+ ZHM Chinese_Macau S.A.R..950
+ ZUL Zulu_South Africa.1252
+ */
+
+/* Table from ISO 639 language code, optionally with country or script suffix,
+ to English name.
+ Keep in sync with the gl_locale_name_from_win32_LANGID function in
+ localename.c! */
+struct table_entry
+{
+ const char *code;
+ const char *english;
+};
+static const struct table_entry language_table[] =
+ {
+ { "af", "Afrikaans" },
+ { "am", "Amharic" },
+ { "ar", "Arabic" },
+ { "arn", "Mapudungun" },
+ { "as", "Assamese" },
+ { "az@cyrillic", "Azeri (Cyrillic)" },
+ { "az@latin", "Azeri (Latin)" },
+ { "ba", "Bashkir" },
+ { "be", "Belarusian" },
+ { "ber", "Tamazight" },
+ { "ber@arabic", "Tamazight (Arabic)" },
+ { "ber@latin", "Tamazight (Latin)" },
+ { "bg", "Bulgarian" },
+ { "bin", "Edo" },
+ { "bn", "Bengali" },
+ { "bn_BD", "Bengali (Bangladesh)" },
+ { "bn_IN", "Bengali (India)" },
+ { "bnt", "Sutu" },
+ { "bo", "Tibetan" },
+ { "br", "Breton" },
+ { "bs", "BSB" }, /* "Bosnian (Latin)" */
+ { "bs@cyrillic", "BSC" }, /* Bosnian (Cyrillic) */
+ { "ca", "Catalan" },
+ { "chr", "Cherokee" },
+ { "co", "Corsican" },
+ { "cpe", "Hawaiian" },
+ { "cs", "Czech" },
+ { "cy", "Welsh" },
+ { "da", "Danish" },
+ { "de", "German" },
+ { "dsb", "Lower Sorbian" },
+ { "dv", "Divehi" },
+ { "el", "Greek" },
+ { "en", "English" },
+ { "es", "Spanish" },
+ { "et", "Estonian" },
+ { "eu", "Basque" },
+ { "fa", "Farsi" },
+ { "ff", "Fulfulde" },
+ { "fi", "Finnish" },
+ { "fo", "Faroese" }, /* "Faeroese" does not work */
+ { "fr", "French" },
+ { "fy", "Frisian" },
+ { "ga", "IRE" }, /* Gaelic (Ireland) */
+ { "gd", "Gaelic (Scotland)" },
+ { "gd", "Scottish Gaelic" },
+ { "gl", "Galician" },
+ { "gn", "Guarani" },
+ { "gsw", "Alsatian" },
+ { "gu", "Gujarati" },
+ { "ha", "Hausa" },
+ { "he", "Hebrew" },
+ { "hi", "Hindi" },
+ { "hr", "Croatian" },
+ { "hsb", "Upper Sorbian" },
+ { "hu", "Hungarian" },
+ { "hy", "Armenian" },
+ { "id", "Indonesian" },
+ { "ig", "Igbo" },
+ { "ii", "Yi" },
+ { "is", "Icelandic" },
+ { "it", "Italian" },
+ { "iu", "IUK" }, /* Inuktitut */
+ { "ja", "Japanese" },
+ { "ka", "Georgian" },
+ { "kk", "Kazakh" },
+ { "kl", "Greenlandic" },
+ { "km", "Cambodian" },
+ { "km", "Khmer" },
+ { "kn", "Kannada" },
+ { "ko", "Korean" },
+ { "kok", "Konkani" },
+ { "kr", "Kanuri" },
+ { "ks", "Kashmiri" },
+ { "ks_IN", "Kashmiri_India" },
+ { "ks_PK", "Kashmiri (Arabic)_Pakistan" },
+ { "ky", "Kyrgyz" },
+ { "la", "Latin" },
+ { "lb", "Luxembourgish" },
+ { "lo", "Lao" },
+ { "lt", "Lithuanian" },
+ { "lv", "Latvian" },
+ { "mi", "Maori" },
+ { "mk", "FYRO Macedonian" },
+ { "mk", "Macedonian" },
+ { "ml", "Malayalam" },
+ { "mn", "Mongolian" },
+ { "mni", "Manipuri" },
+ { "moh", "Mohawk" },
+ { "mr", "Marathi" },
+ { "ms", "Malay" },
+ { "mt", "Maltese" },
+ { "my", "Burmese" },
+ { "nb", "NOR" }, /* Norwegian Bokmål */
+ { "ne", "Nepali" },
+ { "nic", "Ibibio" },
+ { "nl", "Dutch" },
+ { "nn", "NON" }, /* Norwegian Nynorsk */
+ { "no", "Norwegian" },
+ { "nso", "Northern Sotho" },
+ { "nso", "Sepedi" },
+ { "oc", "Occitan" },
+ { "om", "Oromo" },
+ { "or", "Oriya" },
+ { "pa", "Punjabi" },
+ { "pap", "Papiamentu" },
+ { "pl", "Polish" },
+ { "prs", "Dari" },
+ { "ps", "Pashto" },
+ { "pt", "Portuguese" },
+ { "qu", "Quechua" },
+ { "qut", "K'iche'" },
+ { "rm", "Romansh" },
+ { "ro", "Romanian" },
+ { "ru", "Russian" },
+ { "rw", "Kinyarwanda" },
+ { "sa", "Sanskrit" },
+ { "sah", "Yakut" },
+ { "sd", "Sindhi" },
+ { "se", "Sami (Northern)" },
+ { "se", "Northern Sami" },
+ { "si", "Sinhalese" },
+ { "sk", "Slovak" },
+ { "sl", "Slovenian" },
+ { "sma", "Sami (Southern)" },
+ { "sma", "Southern Sami" },
+ { "smj", "Sami (Lule)" },
+ { "smj", "Lule Sami" },
+ { "smn", "Sami (Inari)" },
+ { "smn", "Inari Sami" },
+ { "sms", "Sami (Skolt)" },
+ { "sms", "Skolt Sami" },
+ { "so", "Somali" },
+ { "sq", "Albanian" },
+ { "sr", "Serbian (Latin)" },
+ { "sr@cyrillic", "SRB" }, /* Serbian (Cyrillic) */
+ { "sw", "Swahili" },
+ { "syr", "Syriac" },
+ { "ta", "Tamil" },
+ { "te", "Telugu" },
+ { "tg", "Tajik" },
+ { "th", "Thai" },
+ { "ti", "Tigrinya" },
+ { "tk", "Turkmen" },
+ { "tl", "Filipino" },
+ { "tn", "Tswana" },
+ { "tr", "Turkish" },
+ { "ts", "Tsonga" },
+ { "tt", "Tatar" },
+ { "ug", "Uighur" },
+ { "uk", "Ukrainian" },
+ { "ur", "Urdu" },
+ { "uz", "Uzbek" },
+ { "uz", "Uzbek (Latin)" },
+ { "uz@cyrillic", "Uzbek (Cyrillic)" },
+ { "ve", "Venda" },
+ { "vi", "Vietnamese" },
+ { "wen", "Sorbian" },
+ { "wo", "Wolof" },
+ { "xh", "Xhosa" },
+ { "yi", "Yiddish" },
+ { "yo", "Yoruba" },
+ { "zh", "Chinese" },
+ { "zu", "Zulu" }
+ };
+
+/* Table from ISO 3166 country code to English name.
+ Keep in sync with the gl_locale_name_from_win32_LANGID function in
+ localename.c! */
+static const struct table_entry country_table[] =
+ {
+ { "AE", "U.A.E." },
+ { "AF", "Afghanistan" },
+ { "AL", "Albania" },
+ { "AM", "Armenia" },
+ { "AN", "Netherlands Antilles" },
+ { "AR", "Argentina" },
+ { "AT", "Austria" },
+ { "AU", "Australia" },
+ { "AZ", "Azerbaijan" },
+ { "BA", "Bosnia and Herzegovina" },
+ { "BD", "Bangladesh" },
+ { "BE", "Belgium" },
+ { "BG", "Bulgaria" },
+ { "BH", "Bahrain" },
+ { "BN", "Brunei Darussalam" },
+ { "BO", "Bolivia" },
+ { "BR", "Brazil" },
+ { "BT", "Bhutan" },
+ { "BY", "Belarus" },
+ { "BZ", "Belize" },
+ { "CA", "Canada" },
+ { "CG", "Congo" },
+ { "CH", "Switzerland" },
+ { "CI", "Cote d'Ivoire" },
+ { "CL", "Chile" },
+ { "CM", "Cameroon" },
+ { "CN", "People's Republic of China" },
+ { "CO", "Colombia" },
+ { "CR", "Costa Rica" },
+ { "CS", "Serbia and Montenegro" },
+ { "CZ", "Czech Republic" },
+ { "DE", "Germany" },
+ { "DK", "Denmark" },
+ { "DO", "Dominican Republic" },
+ { "DZ", "Algeria" },
+ { "EC", "Ecuador" },
+ { "EE", "Estonia" },
+ { "EG", "Egypt" },
+ { "ER", "Eritrea" },
+ { "ES", "Spain" },
+ { "ET", "Ethiopia" },
+ { "FI", "Finland" },
+ { "FO", "Faroe Islands" },
+ { "FR", "France" },
+ { "GB", "United Kingdom" },
+ { "GD", "Caribbean" },
+ { "GE", "Georgia" },
+ { "GL", "Greenland" },
+ { "GR", "Greece" },
+ { "GT", "Guatemala" },
+ { "HK", "Hong Kong" },
+ { "HK", "Hong Kong S.A.R." },
+ { "HN", "Honduras" },
+ { "HR", "Croatia" },
+ { "HT", "Haiti" },
+ { "HU", "Hungary" },
+ { "ID", "Indonesia" },
+ { "IE", "Ireland" },
+ { "IL", "Israel" },
+ { "IN", "India" },
+ { "IQ", "Iraq" },
+ { "IR", "Iran" },
+ { "IS", "Iceland" },
+ { "IT", "Italy" },
+ { "JM", "Jamaica" },
+ { "JO", "Jordan" },
+ { "JP", "Japan" },
+ { "KE", "Kenya" },
+ { "KG", "Kyrgyzstan" },
+ { "KH", "Cambodia" },
+ { "KR", "South Korea" },
+ { "KW", "Kuwait" },
+ { "KZ", "Kazakhstan" },
+ { "LA", "Laos" },
+ { "LB", "Lebanon" },
+ { "LI", "Liechtenstein" },
+ { "LK", "Sri Lanka" },
+ { "LT", "Lithuania" },
+ { "LU", "Luxembourg" },
+ { "LV", "Latvia" },
+ { "LY", "Libya" },
+ { "MA", "Morocco" },
+ { "MC", "Principality of Monaco" },
+ { "MD", "Moldava" },
+ { "MD", "Moldova" },
+ { "ME", "Montenegro" },
+ { "MK", "Former Yugoslav Republic of Macedonia" },
+ { "ML", "Mali" },
+ { "MM", "Myanmar" },
+ { "MN", "Mongolia" },
+ { "MO", "Macau S.A.R." },
+ { "MT", "Malta" },
+ { "MV", "Maldives" },
+ { "MX", "Mexico" },
+ { "MY", "Malaysia" },
+ { "NG", "Nigeria" },
+ { "NI", "Nicaragua" },
+ { "NL", "Netherlands" },
+ { "NO", "Norway" },
+ { "NP", "Nepal" },
+ { "NZ", "New Zealand" },
+ { "OM", "Oman" },
+ { "PA", "Panama" },
+ { "PE", "Peru" },
+ { "PH", "Philippines" },
+ { "PK", "Islamic Republic of Pakistan" },
+ { "PL", "Poland" },
+ { "PR", "Puerto Rico" },
+ { "PT", "Portugal" },
+ { "PY", "Paraguay" },
+ { "QA", "Qatar" },
+ { "RE", "Reunion" },
+ { "RO", "Romania" },
+ { "RS", "Serbia" },
+ { "RU", "Russia" },
+ { "RW", "Rwanda" },
+ { "SA", "Saudi Arabia" },
+ { "SE", "Sweden" },
+ { "SG", "Singapore" },
+ { "SI", "Slovenia" },
+ { "SK", "Slovak" },
+ { "SN", "Senegal" },
+ { "SO", "Somalia" },
+ { "SR", "Suriname" },
+ { "SV", "El Salvador" },
+ { "SY", "Syria" },
+ { "TH", "Thailand" },
+ { "TJ", "Tajikistan" },
+ { "TM", "Turkmenistan" },
+ { "TN", "Tunisia" },
+ { "TR", "Turkey" },
+ { "TT", "Trinidad and Tobago" },
+ { "TW", "Taiwan" },
+ { "TZ", "Tanzania" },
+ { "UA", "Ukraine" },
+ { "US", "United States" },
+ { "UY", "Uruguay" },
+ { "VA", "Vatican" },
+ { "VE", "Venezuela" },
+ { "VN", "Viet Nam" },
+ { "YE", "Yemen" },
+ { "ZA", "South Africa" },
+ { "ZW", "Zimbabwe" }
+ };
+
+/* Given a string STRING, find the set of indices i such that TABLE[i].code is
+ the given STRING. It is a range [lo,hi-1]. */
+typedef struct { size_t lo; size_t hi; } range_t;
+static void
+search (const struct table_entry *table, size_t table_size, const char *string,
+ range_t *result)
+{
+ /* The table is sorted. Perform a binary search. */
+ size_t hi = table_size;
+ size_t lo = 0;
+ while (lo < hi)
+ {
+ /* Invariant:
+ for i < lo, strcmp (table[i].code, string) < 0,
+ for i >= hi, strcmp (table[i].code, string) > 0. */
+ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
+ int cmp = strcmp (table[mid].code, string);
+ if (cmp < 0)
+ lo = mid + 1;
+ else if (cmp > 0)
+ hi = mid;
+ else
+ {
+ /* Found an i with
+ strcmp (language_table[i].code, string) == 0.
+ Find the entire interval of such i. */
+ {
+ size_t i;
+
+ for (i = mid; i > lo; )
+ {
+ i--;
+ if (strcmp (table[i].code, string) < 0)
+ {
+ lo = i + 1;
+ break;
+ }
+ }
+ }
+ {
+ size_t i;
+
+ for (i = mid; i < hi; i++)
+ {
+ if (strcmp (table[i].code, string) > 0)
+ {
+ hi = i;
+ break;
+ }
+ }
+ }
+ /* The set of i with
+ strcmp (language_table[i].code, string) == 0
+ is the interval [lo, hi-1]. */
+ break;
+ }
+ }
+ result->lo = lo;
+ result->hi = hi;
+}
+
+/* Like setlocale, but accept also locale names in the form ll or ll_CC,
+ where ll is an ISO 639 language code and CC is an ISO 3166 country code. */
+static char *
+setlocale_unixlike (int category, const char *locale)
+{
+ char *result;
+ char llCC_buf[64];
+ char ll_buf[64];
+ char CC_buf[64];
+
+ /* First, try setlocale with the original argument unchanged. */
+ result = setlocale (category, locale);
+ if (result != NULL)
+ return result;
+
+ /* Otherwise, assume the argument is in the form
+ language[_territory][.codeset][@modifier]
+ and try to map it using the tables. */
+ if (strlen (locale) < sizeof (llCC_buf))
+ {
+ /* Second try: Remove the codeset part. */
+ {
+ const char *p = locale;
+ char *q = llCC_buf;
+
+ /* Copy the part before the dot. */
+ for (; *p != '\0' && *p != '.'; p++, q++)
+ *q = *p;
+ if (*p == '.')
+ /* Skip the part up to the '@', if any. */
+ for (; *p != '\0' && *p != '@'; p++)
+ ;
+ /* Copy the part starting with '@', if any. */
+ for (; *p != '\0'; p++, q++)
+ *q = *p;
+ *q = '\0';
+ }
+ /* llCC_buf now contains
+ language[_territory][@modifier]
+ */
+ if (strcmp (llCC_buf, locale) != 0)
+ {
+ result = setlocale (category, llCC_buf);
+ if (result != NULL)
+ return result;
+ }
+ /* Look it up in language_table. */
+ {
+ range_t range;
+ size_t i;
+
+ search (language_table,
+ sizeof (language_table) / sizeof (language_table[0]),
+ llCC_buf,
+ &range);
+
+ for (i = range.lo; i < range.hi; i++)
+ {
+ /* Try the replacement in language_table[i]. */
+ result = setlocale (category, language_table[i].english);
+ if (result != NULL)
+ return result;
+ }
+ }
+ /* Split language[_territory][@modifier]
+ into ll_buf = language[@modifier]
+ and CC_buf = territory
+ */
+ {
+ const char *underscore = strchr (llCC_buf, '_');
+ if (underscore != NULL)
+ {
+ const char *territory_start = underscore + 1;
+ const char *territory_end = strchr (territory_start, '@');
+ if (territory_end == NULL)
+ territory_end = territory_start + strlen (territory_start);
+
+ memcpy (ll_buf, llCC_buf, underscore - llCC_buf);
+ strcpy (ll_buf + (underscore - llCC_buf), territory_end);
+
+ memcpy (CC_buf, territory_start, territory_end - territory_start);
+ CC_buf[territory_end - territory_start] = '\0';
+
+ {
+ /* Look up ll_buf in language_table
+ and CC_buf in country_table. */
+ range_t language_range;
+
+ search (language_table,
+ sizeof (language_table) / sizeof (language_table[0]),
+ ll_buf,
+ &language_range);
+ if (language_range.lo < language_range.hi)
+ {
+ range_t country_range;
+
+ search (country_table,
+ sizeof (country_table) / sizeof (country_table[0]),
+ CC_buf,
+ &country_range);
+ if (country_range.lo < country_range.hi)
+ {
+ size_t i;
+ size_t j;
+
+ for (i = language_range.lo; i < language_range.hi; i++)
+ for (j = country_range.lo; j < country_range.hi; j++)
+ {
+ /* Concatenate the replacements. */
+ const char *part1 = language_table[i].english;
+ size_t part1_len = strlen (part1);
+ const char *part2 = country_table[j].english;
+ size_t part2_len = strlen (part2) + 1;
+ char buf[64+64];
+
+ if (!(part1_len + 1 + part2_len <= sizeof (buf)))
+ abort ();
+ memcpy (buf, part1, part1_len);
+ buf[part1_len] = '_';
+ memcpy (buf + part1_len + 1, part2, part2_len);
+
+ /* Try the concatenated replacements. */
+ result = setlocale (category, buf);
+ if (result != NULL)
+ return result;
+ }
+ }
+
+ /* Try omitting the country entirely. This may set a locale
+ corresponding to the wrong country, but is better than
+ failing entirely. */
+ {
+ size_t i;
+
+ for (i = language_range.lo; i < language_range.hi; i++)
+ {
+ /* Try only the language replacement. */
+ result =
+ setlocale (category, language_table[i].english);
+ if (result != NULL)
+ return result;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Failed. */
+ return NULL;
+}
+
+# else
+# define setlocale_unixlike setlocale
+# endif
+
+# if LC_MESSAGES == 1729
+
+/* The system does not store an LC_MESSAGES locale category. Do it here. */
+static char lc_messages_name[64] = "C";
+
+/* Like setlocale, but support also LC_MESSAGES. */
+static char *
+setlocale_single (int category, const char *locale)
+{
+ if (category == LC_MESSAGES)
+ {
+ if (locale != NULL)
+ {
+ lc_messages_name[sizeof (lc_messages_name) - 1] = '\0';
+ strncpy (lc_messages_name, locale, sizeof (lc_messages_name) - 1);
+ }
+ return lc_messages_name;
+ }
+ else
+ return setlocale_unixlike (category, locale);
+}
+
+# else
+# define setlocale_single setlocale_unixlike
+# endif
+
+char *
+rpl_setlocale (int category, const char *locale)
+{
+ if (locale != NULL && locale[0] == '\0')
+ {
+ /* A request to the set the current locale to the default locale. */
+ if (category == LC_ALL)
+ {
+ /* Set LC_CTYPE first. Then the other categories. */
+ static int const categories[] =
+ {
+ LC_NUMERIC,
+ LC_TIME,
+ LC_COLLATE,
+ LC_MONETARY,
+ LC_MESSAGES
+ };
+ char *saved_locale;
+ const char *base_name;
+ unsigned int i;
+
+ /* Back up the old locale, in case one of the steps fails. */
+ saved_locale = setlocale (LC_ALL, NULL);
+ if (saved_locale == NULL)
+ return NULL;
+ saved_locale = strdup (saved_locale);
+ if (saved_locale == NULL)
+ return NULL;
+
+ /* Set LC_CTYPE category. Set all other categories (except possibly
+ LC_MESSAGES) to the same value in the same call; this is likely to
+ save calls. */
+ base_name =
+ gl_locale_name_environ (LC_CTYPE, category_to_name (LC_CTYPE));
+ if (base_name == NULL)
+ base_name = gl_locale_name_default ();
+
+ if (setlocale_unixlike (LC_ALL, base_name) == NULL)
+ goto fail;
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* On native Windows, setlocale(LC_ALL,...) may succeed but set the
+ LC_CTYPE category to an invalid value ("C") when it does not
+ support the specified encoding. Report a failure instead. */
+ if (strchr (base_name, '.') != NULL
+ && strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ goto fail;
+# endif
+
+ for (i = 0; i < sizeof (categories) / sizeof (categories[0]); i++)
+ {
+ int cat = categories[i];
+ const char *name;
+
+ name = gl_locale_name_environ (cat, category_to_name (cat));
+ if (name == NULL)
+ name = gl_locale_name_default ();
+
+ /* If name is the same as base_name, it has already been set
+ through the setlocale call before the loop. */
+ if (strcmp (name, base_name) != 0
+# if LC_MESSAGES == 1729
+ || cat == LC_MESSAGES
+# endif
+ )
+ if (setlocale_single (cat, name) == NULL)
+ goto fail;
+ }
+
+ /* All steps were successful. */
+ free (saved_locale);
+ return setlocale (LC_ALL, NULL);
+
+ fail:
+ if (saved_locale[0] != '\0') /* don't risk an endless recursion */
+ setlocale (LC_ALL, saved_locale);
+ free (saved_locale);
+ return NULL;
+ }
+ else
+ {
+ const char *name =
+ gl_locale_name_environ (category, category_to_name (category));
+ if (name == NULL)
+ name = gl_locale_name_default ();
+
+ return setlocale_single (category, name);
+ }
+ }
+ else
+ {
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ if (category == LC_ALL && locale != NULL && strchr (locale, '.') != NULL)
+ {
+ char *saved_locale;
+
+ /* Back up the old locale. */
+ saved_locale = setlocale (LC_ALL, NULL);
+ if (saved_locale == NULL)
+ return NULL;
+ saved_locale = strdup (saved_locale);
+ if (saved_locale == NULL)
+ return NULL;
+
+ if (setlocale_unixlike (LC_ALL, locale) == NULL)
+ {
+ free (saved_locale);
+ return NULL;
+ }
+
+ /* On native Windows, setlocale(LC_ALL,...) may succeed but set the
+ LC_CTYPE category to an invalid value ("C") when it does not
+ support the specified encoding. Report a failure instead. */
+ if (strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ {
+ if (saved_locale[0] != '\0') /* don't risk an endless recursion */
+ setlocale (LC_ALL, saved_locale);
+ free (saved_locale);
+ return NULL;
+ }
+
+ /* It was really successful. */
+ free (saved_locale);
+ return setlocale (LC_ALL, NULL);
+ }
+ else
+# endif
+ return setlocale_single (category, locale);
+ }
+}
+
+#endif
diff --git a/gnulib/lib/setsockopt.c b/gnulib/lib/setsockopt.c
new file mode 100644
index 0000000..6a7ca5e
--- /dev/null
+++ b/gnulib/lib/setsockopt.c
@@ -0,0 +1,65 @@
+/* setsockopt.c --- wrappers for Windows setsockopt function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get struct timeval. */
+#include <sys/time.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef setsockopt
+
+int
+rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r;
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ if (level == SOL_SOCKET
+ && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
+ {
+ const struct timeval *tv = optval;
+ int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000;
+ optval = &milliseconds;
+ r = setsockopt (sock, level, optname, optval, sizeof (int));
+ }
+ else
+ {
+ r = setsockopt (sock, level, optname, optval, optlen);
+ }
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/settime.c b/gnulib/lib/settime.c
new file mode 100644
index 0000000..bd8f10f
--- /dev/null
+++ b/gnulib/lib/settime.c
@@ -0,0 +1,59 @@
+/* settime -- set the system clock
+
+ Copyright (C) 2002, 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#include <errno.h>
+
+/* Set the system time. */
+
+int
+settime (struct timespec const *ts)
+{
+#if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME
+ {
+ int r = clock_settime (CLOCK_REALTIME, ts);
+ if (r == 0 || errno == EPERM)
+ return r;
+ }
+#endif
+
+#if HAVE_SETTIMEOFDAY
+ {
+ struct timeval tv;
+
+ tv.tv_sec = ts->tv_sec;
+ tv.tv_usec = ts->tv_nsec / 1000;
+ return settimeofday (&tv, 0);
+ }
+#elif HAVE_STIME
+ /* This fails to compile on OSF1 V5.1, due to stime requiring
+ a `long int*' and tv_sec is `int'. But that system does provide
+ settimeofday. */
+ return stime (&ts->tv_sec);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/sh-quote.c b/gnulib/lib/sh-quote.c
new file mode 100644
index 0000000..2efd926
--- /dev/null
+++ b/gnulib/lib/sh-quote.c
@@ -0,0 +1,107 @@
+/* Shell quoting.
+ Copyright (C) 2001-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "sh-quote.h"
+
+#include <string.h>
+
+#include "quotearg.h"
+#include "xalloc.h"
+
+/* Describes quoting for sh compatible shells. */
+static struct quoting_options *sh_quoting_options;
+
+/* Initializes the sh_quoting_options variable. */
+static void
+init_sh_quoting_options ()
+{
+ sh_quoting_options = clone_quoting_options (NULL);
+ set_quoting_style (sh_quoting_options, shell_quoting_style);
+}
+
+/* Returns the number of bytes needed for the quoted string. */
+size_t
+shell_quote_length (const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return quotearg_buffer (NULL, 0, string, strlen (string),
+ sh_quoting_options);
+}
+
+/* Copies the quoted string to p and returns the incremented p.
+ There must be room for shell_quote_length (string) + 1 bytes at p. */
+char *
+shell_quote_copy (char *p, const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return p + quotearg_buffer (p, (size_t)(-1), string, strlen (string),
+ sh_quoting_options);
+}
+
+/* Returns the freshly allocated quoted string. */
+char *
+shell_quote (const char *string)
+{
+ if (sh_quoting_options == NULL)
+ init_sh_quoting_options ();
+ return quotearg_alloc (string, strlen (string), sh_quoting_options);
+}
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+ separated through spaces. */
+char *
+shell_quote_argv (char **argv)
+{
+ if (*argv != NULL)
+ {
+ char **argp;
+ size_t length;
+ char *command;
+ char *p;
+
+ length = 0;
+ for (argp = argv; ; )
+ {
+ length += shell_quote_length (*argp) + 1;
+ argp++;
+ if (*argp == NULL)
+ break;
+ }
+
+ command = XNMALLOC (length, char);
+
+ p = command;
+ for (argp = argv; ; )
+ {
+ p = shell_quote_copy (p, *argp);
+ argp++;
+ if (*argp == NULL)
+ break;
+ *p++ = ' ';
+ }
+ *p = '\0';
+
+ return command;
+ }
+ else
+ return xstrdup ("");
+}
diff --git a/gnulib/lib/sh-quote.h b/gnulib/lib/sh-quote.h
new file mode 100644
index 0000000..339a7c6
--- /dev/null
+++ b/gnulib/lib/sh-quote.h
@@ -0,0 +1,36 @@
+/* Shell quoting.
+ Copyright (C) 2001-2002, 2004, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* When passing a command to a shell, we must quote the program name and
+ arguments, since Unix shells interpret characters like " ", "'", "<", ">",
+ "$" etc. in a special way. */
+
+#include <stddef.h>
+
+/* Returns the number of bytes needed for the quoted string. */
+extern size_t shell_quote_length (const char *string);
+
+/* Copies the quoted string to p and returns the incremented p.
+ There must be room for shell_quote_length (string) + 1 bytes at p. */
+extern char * shell_quote_copy (char *p, const char *string);
+
+/* Returns the freshly allocated quoted string. */
+extern char * shell_quote (const char *string);
+
+/* Returns a freshly allocated string containing all argument strings, quoted,
+ separated through spaces. */
+extern char * shell_quote_argv (char **argv);
diff --git a/gnulib/lib/sha1.c b/gnulib/lib/sha1.c
new file mode 100644
index 0000000..828810b
--- /dev/null
+++ b/gnulib/lib/sha1.c
@@ -0,0 +1,427 @@
+/* sha1.c - Functions to compute SHA1 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-1.
+
+ Copyright (C) 2000-2001, 2003-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Scott G. Miller
+ Credits:
+ Robert Klep <robert@ilse.nl> -- Expansion function fix
+*/
+
+#include <config.h>
+
+#include "sha1.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
+ initialize it to the start constants of the SHA1 algorithm. This
+ must be called before using hash in the call to sha1_hash. */
+void
+sha1_init_ctx (struct sha1_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+ ctx->E = 0xc3d2e1f0;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+ set_uint32 (r + 4 * sizeof ctx->E, SWAP (ctx->E));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+ ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha1_process_block (ctx->buffer, size * 4, ctx);
+
+ return sha1_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA1 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+sha1_stream (FILE *stream, void *resblock)
+{
+ struct sha1_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha1_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha1_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha1_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha1_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha1_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha1_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha1_finish_ctx (&ctx, resblock);
+}
+
+void
+sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha1_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha1_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and sha1.c --- */
+
+/* SHA1 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+#define K3 0x8f1bbcdc
+#define K4 0xca62c1d6
+
+/* Round functions. Note that F2 is the same as F4. */
+#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
+#define F2(B,C,D) (B ^ C ^ D)
+#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
+#define F4(B,C,D) (B ^ C ^ D)
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->A;
+ uint32_t b = ctx->B;
+ uint32_t c = ctx->C;
+ uint32_t d = ctx->D;
+ uint32_t e = ctx->E;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+
+#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \
+ ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
+ , (x[I&0x0f] = rol(tm, 1)) )
+
+#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \
+ + F( B, C, D ) \
+ + K \
+ + M; \
+ B = rol( B, 30 ); \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, F1, K1, x[ 0] );
+ R( e, a, b, c, d, F1, K1, x[ 1] );
+ R( d, e, a, b, c, F1, K1, x[ 2] );
+ R( c, d, e, a, b, F1, K1, x[ 3] );
+ R( b, c, d, e, a, F1, K1, x[ 4] );
+ R( a, b, c, d, e, F1, K1, x[ 5] );
+ R( e, a, b, c, d, F1, K1, x[ 6] );
+ R( d, e, a, b, c, F1, K1, x[ 7] );
+ R( c, d, e, a, b, F1, K1, x[ 8] );
+ R( b, c, d, e, a, F1, K1, x[ 9] );
+ R( a, b, c, d, e, F1, K1, x[10] );
+ R( e, a, b, c, d, F1, K1, x[11] );
+ R( d, e, a, b, c, F1, K1, x[12] );
+ R( c, d, e, a, b, F1, K1, x[13] );
+ R( b, c, d, e, a, F1, K1, x[14] );
+ R( a, b, c, d, e, F1, K1, x[15] );
+ R( e, a, b, c, d, F1, K1, M(16) );
+ R( d, e, a, b, c, F1, K1, M(17) );
+ R( c, d, e, a, b, F1, K1, M(18) );
+ R( b, c, d, e, a, F1, K1, M(19) );
+ R( a, b, c, d, e, F2, K2, M(20) );
+ R( e, a, b, c, d, F2, K2, M(21) );
+ R( d, e, a, b, c, F2, K2, M(22) );
+ R( c, d, e, a, b, F2, K2, M(23) );
+ R( b, c, d, e, a, F2, K2, M(24) );
+ R( a, b, c, d, e, F2, K2, M(25) );
+ R( e, a, b, c, d, F2, K2, M(26) );
+ R( d, e, a, b, c, F2, K2, M(27) );
+ R( c, d, e, a, b, F2, K2, M(28) );
+ R( b, c, d, e, a, F2, K2, M(29) );
+ R( a, b, c, d, e, F2, K2, M(30) );
+ R( e, a, b, c, d, F2, K2, M(31) );
+ R( d, e, a, b, c, F2, K2, M(32) );
+ R( c, d, e, a, b, F2, K2, M(33) );
+ R( b, c, d, e, a, F2, K2, M(34) );
+ R( a, b, c, d, e, F2, K2, M(35) );
+ R( e, a, b, c, d, F2, K2, M(36) );
+ R( d, e, a, b, c, F2, K2, M(37) );
+ R( c, d, e, a, b, F2, K2, M(38) );
+ R( b, c, d, e, a, F2, K2, M(39) );
+ R( a, b, c, d, e, F3, K3, M(40) );
+ R( e, a, b, c, d, F3, K3, M(41) );
+ R( d, e, a, b, c, F3, K3, M(42) );
+ R( c, d, e, a, b, F3, K3, M(43) );
+ R( b, c, d, e, a, F3, K3, M(44) );
+ R( a, b, c, d, e, F3, K3, M(45) );
+ R( e, a, b, c, d, F3, K3, M(46) );
+ R( d, e, a, b, c, F3, K3, M(47) );
+ R( c, d, e, a, b, F3, K3, M(48) );
+ R( b, c, d, e, a, F3, K3, M(49) );
+ R( a, b, c, d, e, F3, K3, M(50) );
+ R( e, a, b, c, d, F3, K3, M(51) );
+ R( d, e, a, b, c, F3, K3, M(52) );
+ R( c, d, e, a, b, F3, K3, M(53) );
+ R( b, c, d, e, a, F3, K3, M(54) );
+ R( a, b, c, d, e, F3, K3, M(55) );
+ R( e, a, b, c, d, F3, K3, M(56) );
+ R( d, e, a, b, c, F3, K3, M(57) );
+ R( c, d, e, a, b, F3, K3, M(58) );
+ R( b, c, d, e, a, F3, K3, M(59) );
+ R( a, b, c, d, e, F4, K4, M(60) );
+ R( e, a, b, c, d, F4, K4, M(61) );
+ R( d, e, a, b, c, F4, K4, M(62) );
+ R( c, d, e, a, b, F4, K4, M(63) );
+ R( b, c, d, e, a, F4, K4, M(64) );
+ R( a, b, c, d, e, F4, K4, M(65) );
+ R( e, a, b, c, d, F4, K4, M(66) );
+ R( d, e, a, b, c, F4, K4, M(67) );
+ R( c, d, e, a, b, F4, K4, M(68) );
+ R( b, c, d, e, a, F4, K4, M(69) );
+ R( a, b, c, d, e, F4, K4, M(70) );
+ R( e, a, b, c, d, F4, K4, M(71) );
+ R( d, e, a, b, c, F4, K4, M(72) );
+ R( c, d, e, a, b, F4, K4, M(73) );
+ R( b, c, d, e, a, F4, K4, M(74) );
+ R( a, b, c, d, e, F4, K4, M(75) );
+ R( e, a, b, c, d, F4, K4, M(76) );
+ R( d, e, a, b, c, F4, K4, M(77) );
+ R( c, d, e, a, b, F4, K4, M(78) );
+ R( b, c, d, e, a, F4, K4, M(79) );
+
+ a = ctx->A += a;
+ b = ctx->B += b;
+ c = ctx->C += c;
+ d = ctx->D += d;
+ e = ctx->E += e;
+ }
+}
diff --git a/gnulib/lib/sha1.h b/gnulib/lib/sha1.h
new file mode 100644
index 0000000..d3fedbf
--- /dev/null
+++ b/gnulib/lib/sha1.h
@@ -0,0 +1,92 @@
+/* Declarations of functions and data types used for SHA1 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005-2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef SHA1_H
+# define SHA1_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+#define SHA1_DIGEST_SIZE 20
+
+/* Structure to save state of computation between the single steps. */
+struct sha1_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+ uint32_t E;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void sha1_init_ctx (struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha1_process_block (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha1_process_bytes (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 20 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA1 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 20 bytes
+ beginning at RESBLOCK. */
+extern int sha1_stream (FILE *stream, void *resblock);
+
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha1_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/sha256.c b/gnulib/lib/sha256.c
new file mode 100644
index 0000000..aa529c6
--- /dev/null
+++ b/gnulib/lib/sha256.c
@@ -0,0 +1,569 @@
+/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#include "sha256.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
+ intializes it to the start constants of the SHA256 algorithm. This
+ must be called before using hash in the call to sha256_hash
+*/
+void
+sha256_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0x6a09e667UL;
+ ctx->state[1] = 0xbb67ae85UL;
+ ctx->state[2] = 0x3c6ef372UL;
+ ctx->state[3] = 0xa54ff53aUL;
+ ctx->state[4] = 0x510e527fUL;
+ ctx->state[5] = 0x9b05688cUL;
+ ctx->state[6] = 0x1f83d9abUL;
+ ctx->state[7] = 0x5be0cd19UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+void
+sha224_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0xc1059ed8UL;
+ ctx->state[1] = 0x367cd507UL;
+ ctx->state[2] = 0x3070dd17UL;
+ ctx->state[3] = 0xf70e5939UL;
+ ctx->state[4] = 0xffc00b31UL;
+ ctx->state[5] = 0x68581511UL;
+ ctx->state[6] = 0x64f98fa7UL;
+ ctx->state[7] = 0xbefa4fa4UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static inline void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 32 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 7; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha256_conclude_ctx (struct sha256_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer.
+ Use set_uint32 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint32 ((char *) &ctx->buffer[size - 2],
+ SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
+ set_uint32 ((char *) &ctx->buffer[size - 1],
+ SWAP (ctx->total[0] << 3));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha256_process_block (ctx->buffer, size * 4, ctx);
+}
+
+void *
+sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha256_read_ctx (ctx, resbuf);
+}
+
+void *
+sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha224_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA256 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 32 bytes
+ beginning at RESBLOCK. */
+int
+sha256_stream (FILE *stream, void *resblock)
+{
+ struct sha256_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha256_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha256_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha256_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha256_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* FIXME: Avoid code duplication */
+int
+sha224_stream (FILE *stream, void *resblock)
+{
+ struct sha256_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha224_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha256_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha256_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha224_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha256_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha256_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha256_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha224_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha224_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha224_finish_ctx (&ctx, resblock);
+}
+
+void
+sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha256_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha256_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha256.c --- */
+
+/* SHA256 round constants */
+#define K(I) sha256_round_constants[I]
+static const uint32_t sha256_round_constants[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
+};
+
+/* Round functions. */
+#define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
+#define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->state[0];
+ uint32_t b = ctx->state[1];
+ uint32_t c = ctx->state[2];
+ uint32_t d = ctx->state[3];
+ uint32_t e = ctx->state[4];
+ uint32_t f = ctx->state[5];
+ uint32_t g = ctx->state[6];
+ uint32_t h = ctx->state[7];
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+#define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+#define S0(x) (rol(x,25)^rol(x,14)^(x>>3))
+#define S1(x) (rol(x,15)^rol(x,13)^(x>>10))
+#define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10))
+#define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7))
+
+#define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
+ + S0(x[(I-15)&0x0f]) + x[I&0x0f] \
+ , x[I&0x0f] = tm )
+
+#define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \
+ t1 = H + SS1(E) \
+ + F1(E,F,G) \
+ + K \
+ + M; \
+ D += t1; H = t0 + t1; \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ uint32_t t0, t1;
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+
+ a = ctx->state[0] += a;
+ b = ctx->state[1] += b;
+ c = ctx->state[2] += c;
+ d = ctx->state[3] += d;
+ e = ctx->state[4] += e;
+ f = ctx->state[5] += f;
+ g = ctx->state[6] += g;
+ h = ctx->state[7] += h;
+ }
+}
diff --git a/gnulib/lib/sha256.h b/gnulib/lib/sha256.h
new file mode 100644
index 0000000..9f6bf14
--- /dev/null
+++ b/gnulib/lib/sha256.h
@@ -0,0 +1,91 @@
+/* Declarations of functions and data types used for SHA256 and SHA224 sum
+ library functions.
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SHA256_H
+# define SHA256_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct sha256_ctx
+{
+ uint32_t state[8];
+
+ uint32_t total[2];
+ size_t buflen;
+ uint32_t buffer[32];
+};
+
+enum { SHA224_DIGEST_SIZE = 224 / 8 };
+enum { SHA256_DIGEST_SIZE = 256 / 8 };
+
+/* Initialize structure containing state of computation. */
+extern void sha256_init_ctx (struct sha256_ctx *ctx);
+extern void sha224_init_ctx (struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha256_process_block (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha256_process_bytes (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 32 (28) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf);
+extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 32 (28) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf);
+extern void *sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA256 (SHA224) message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 32 (28) bytes
+ beginning at RESBLOCK. */
+extern int sha256_stream (FILE *stream, void *resblock);
+extern int sha224_stream (FILE *stream, void *resblock);
+
+/* Compute SHA256 (SHA224) message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha256_buffer (const char *buffer, size_t len, void *resblock);
+extern void *sha224_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/sha512.c b/gnulib/lib/sha512.c
new file mode 100644
index 0000000..1c5117f
--- /dev/null
+++ b/gnulib/lib/sha512.c
@@ -0,0 +1,619 @@
+/* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#include "sha512.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) \
+ u64or (u64or (u64or (u64shl (n, 56), \
+ u64shl (u64and (n, u64lo (0x0000ff00)), 40)), \
+ u64or (u64shl (u64and (n, u64lo (0x00ff0000)), 24), \
+ u64shl (u64and (n, u64lo (0xff000000)), 8))), \
+ u64or (u64or (u64and (u64shr (n, 8), u64lo (0xff000000)), \
+ u64and (u64shr (n, 24), u64lo (0x00ff0000))), \
+ u64or (u64and (u64shr (n, 40), u64lo (0x0000ff00)), \
+ u64shr (n, 56))))
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 128 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 128-byte boundary. */
+static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
+ intializes it to the start constants of the SHA512 algorithm. This
+ must be called before using hash in the call to sha512_hash
+*/
+void
+sha512_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
+ ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
+ ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
+ ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
+ ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
+ ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
+ ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
+ ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+void
+sha384_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
+ ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
+ ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
+ ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
+ ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
+ ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
+ ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
+ ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+/* Copy the value from V into the memory location pointed to by *CP,
+ If your architecture allows unaligned access, this is equivalent to
+ * (__typeof__ (v) *) cp = v */
+static inline void
+set_uint64 (char *cp, u64 v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 64 bytes following RESBUF.
+ The result must be in little endian byte order. */
+void *
+sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 6; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha512_conclude_ctx (struct sha512_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
+ if (u64lt (ctx->total[0], u64lo (bytes)))
+ ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
+
+ /* Put the 128-bit file length in *bits* at the end of the buffer.
+ Use set_uint64 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint64 ((char *) &ctx->buffer[size - 2],
+ SWAP (u64or (u64shl (ctx->total[1], 3),
+ u64shr (ctx->total[0], 61))));
+ set_uint64 ((char *) &ctx->buffer[size - 1],
+ SWAP (u64shl (ctx->total[0], 3)));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
+
+ /* Process last bytes. */
+ sha512_process_block (ctx->buffer, size * 8, ctx);
+}
+
+void *
+sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha512_read_ctx (ctx, resbuf);
+}
+
+void *
+sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha384_read_ctx (ctx, resbuf);
+}
+
+/* Compute SHA512 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 64 bytes
+ beginning at RESBLOCK. */
+int
+sha512_stream (FILE *stream, void *resblock)
+{
+ struct sha512_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha512_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 128 == 0
+ */
+ sha512_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha512_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha512_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* FIXME: Avoid code duplication */
+int
+sha384_stream (FILE *stream, void *resblock)
+{
+ struct sha512_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ sha384_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 128 == 0
+ */
+ sha512_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha512_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha384_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha512_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha512_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha512_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha384_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha384_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha384_finish_ctx (&ctx, resblock);
+}
+
+void
+sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 256 - left_over > len ? len : 256 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 128)
+ {
+ sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
+
+ ctx->buflen &= 127;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~127],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 128)
+ {
+#if !_STRING_ARCH_unaligned
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (u64) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 128)
+ {
+ sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx);
+ buffer = (const char *) buffer + 128;
+ len -= 128;
+ }
+ else
+#endif
+ {
+ sha512_process_block (buffer, len & ~127, ctx);
+ buffer = (const char *) buffer + (len & ~127);
+ len &= 127;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 128)
+ {
+ sha512_process_block (ctx->buffer, 128, ctx);
+ left_over -= 128;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha512.c --- */
+
+/* SHA512 round constants */
+#define K(I) sha512_round_constants[I]
+static u64 const sha512_round_constants[80] = {
+ u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
+ u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
+ u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
+ u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
+ u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
+ u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
+ u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
+ u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
+ u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
+ u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
+ u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
+ u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
+ u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
+ u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
+ u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
+ u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
+ u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
+ u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
+ u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
+ u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
+ u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
+ u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
+ u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
+ u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
+ u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
+ u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
+ u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
+ u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
+ u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
+ u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
+ u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
+ u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
+ u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
+ u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
+ u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
+ u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
+ u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
+ u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
+ u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
+ u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
+};
+
+/* Round functions. */
+#define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
+#define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 128 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ u64 const *words = buffer;
+ u64 const *endp = words + len / sizeof (u64);
+ u64 x[16];
+ u64 a = ctx->state[0];
+ u64 b = ctx->state[1];
+ u64 c = ctx->state[2];
+ u64 d = ctx->state[3];
+ u64 e = ctx->state[4];
+ u64 f = ctx->state[5];
+ u64 g = ctx->state[6];
+ u64 h = ctx->state[7];
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^128 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] = u64plus (ctx->total[0], u64lo (len));
+ if (u64lt (ctx->total[0], u64lo (len)))
+ ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
+
+#define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
+#define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
+#define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
+#define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
+
+#define M(I) (x[(I) & 15] \
+ = u64plus (x[(I) & 15], \
+ u64plus (S1 (x[((I) - 2) & 15]), \
+ u64plus (x[((I) - 7) & 15], \
+ S0 (x[((I) - 15) & 15])))))
+
+#define R(A, B, C, D, E, F, G, H, K, M) \
+ do \
+ { \
+ u64 t0 = u64plus (SS0 (A), F2 (A, B, C)); \
+ u64 t1 = \
+ u64plus (H, u64plus (SS1 (E), \
+ u64plus (F1 (E, F, G), u64plus (K, M)))); \
+ D = u64plus (D, t1); \
+ H = u64plus (t0, t1); \
+ } \
+ while (0)
+
+ while (words < endp)
+ {
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+ R( a, b, c, d, e, f, g, h, K(64), M(64) );
+ R( h, a, b, c, d, e, f, g, K(65), M(65) );
+ R( g, h, a, b, c, d, e, f, K(66), M(66) );
+ R( f, g, h, a, b, c, d, e, K(67), M(67) );
+ R( e, f, g, h, a, b, c, d, K(68), M(68) );
+ R( d, e, f, g, h, a, b, c, K(69), M(69) );
+ R( c, d, e, f, g, h, a, b, K(70), M(70) );
+ R( b, c, d, e, f, g, h, a, K(71), M(71) );
+ R( a, b, c, d, e, f, g, h, K(72), M(72) );
+ R( h, a, b, c, d, e, f, g, K(73), M(73) );
+ R( g, h, a, b, c, d, e, f, K(74), M(74) );
+ R( f, g, h, a, b, c, d, e, K(75), M(75) );
+ R( e, f, g, h, a, b, c, d, K(76), M(76) );
+ R( d, e, f, g, h, a, b, c, K(77), M(77) );
+ R( c, d, e, f, g, h, a, b, K(78), M(78) );
+ R( b, c, d, e, f, g, h, a, K(79), M(79) );
+
+ a = ctx->state[0] = u64plus (ctx->state[0], a);
+ b = ctx->state[1] = u64plus (ctx->state[1], b);
+ c = ctx->state[2] = u64plus (ctx->state[2], c);
+ d = ctx->state[3] = u64plus (ctx->state[3], d);
+ e = ctx->state[4] = u64plus (ctx->state[4], e);
+ f = ctx->state[5] = u64plus (ctx->state[5], f);
+ g = ctx->state[6] = u64plus (ctx->state[6], g);
+ h = ctx->state[7] = u64plus (ctx->state[7], h);
+ }
+}
diff --git a/gnulib/lib/sha512.h b/gnulib/lib/sha512.h
new file mode 100644
index 0000000..af8b354
--- /dev/null
+++ b/gnulib/lib/sha512.h
@@ -0,0 +1,95 @@
+/* Declarations of functions and data types used for SHA512 and SHA384 sum
+ library functions.
+ Copyright (C) 2005-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SHA512_H
+# define SHA512_H 1
+
+# include <stdio.h>
+
+# include "u64.h"
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Structure to save state of computation between the single steps. */
+struct sha512_ctx
+{
+ u64 state[8];
+
+ u64 total[2];
+ size_t buflen;
+ u64 buffer[32];
+};
+
+enum { SHA384_DIGEST_SIZE = 384 / 8 };
+enum { SHA512_DIGEST_SIZE = 512 / 8 };
+
+/* Initialize structure containing state of computation. */
+extern void sha512_init_ctx (struct sha512_ctx *ctx);
+extern void sha384_init_ctx (struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 128!!! */
+extern void sha512_process_block (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 128. */
+extern void sha512_process_bytes (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 64 (48) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+extern void *sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 64 (48) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf);
+extern void *sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf);
+
+
+/* Compute SHA512 (SHA384) message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 64 (48) bytes
+ beginning at RESBLOCK. */
+extern int sha512_stream (FILE *stream, void *resblock);
+extern int sha384_stream (FILE *stream, void *resblock);
+
+/* Compute SHA512 (SHA384) message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha512_buffer (const char *buffer, size_t len, void *resblock);
+extern void *sha384_buffer (const char *buffer, size_t len, void *resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/gnulib/lib/shutdown.c b/gnulib/lib/shutdown.c
new file mode 100644
index 0000000..1c302a2
--- /dev/null
+++ b/gnulib/lib/shutdown.c
@@ -0,0 +1,49 @@
+/* shutdown.c --- wrappers for Windows shutdown function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef shutdown
+
+int
+rpl_shutdown (int fd, int how)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = shutdown (sock, how);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/gnulib/lib/sig-handler.h b/gnulib/lib/sig-handler.h
new file mode 100644
index 0000000..abb660c
--- /dev/null
+++ b/gnulib/lib/sig-handler.h
@@ -0,0 +1,44 @@
+/* Convenience declarations when working with <signal.h>.
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_SIG_HANDLER_H
+#define _GL_SIG_HANDLER_H
+
+#include <signal.h>
+
+/* Convenience type when working with signal handlers. */
+typedef void (*sa_handler_t) (int);
+
+/* Return the handler of a signal, as a sa_handler_t value regardless
+ of its true type. The resulting function can be compared to
+ special values like SIG_IGN but it is not portable to call it. */
+static inline sa_handler_t
+get_handler (struct sigaction const *a)
+{
+#ifdef SA_SIGINFO
+ /* POSIX says that special values like SIG_IGN can only occur when
+ action.sa_flags does not contain SA_SIGINFO. But in Linux 2.4,
+ for example, sa_sigaction and sa_handler are aliases and a signal
+ is ignored if sa_sigaction (after casting) equals SIG_IGN. So
+ use (and cast) sa_sigaction in that case. */
+ if (a->sa_flags & SA_SIGINFO)
+ return (sa_handler_t) a->sa_sigaction;
+#endif
+ return a->sa_handler;
+}
+
+#endif /* _GL_SIG_HANDLER_H */
diff --git a/gnulib/lib/sig2str.c b/gnulib/lib/sig2str.c
new file mode 100644
index 0000000..70faa66
--- /dev/null
+++ b/gnulib/lib/sig2str.c
@@ -0,0 +1,345 @@
+/* sig2str.c -- convert between signal names and numbers
+
+ Copyright (C) 2002, 2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <limits.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "sig2str.h"
+
+#ifndef SIGRTMIN
+# define SIGRTMIN 0
+# undef SIGRTMAX
+#endif
+#ifndef SIGRTMAX
+# define SIGRTMAX (SIGRTMIN - 1)
+#endif
+
+#define NUMNAME(name) { SIG##name, #name }
+
+/* Signal names and numbers. Put the preferred name first. */
+static struct numname { int num; char const name[8]; } numname_table[] =
+ {
+ /* Signals required by POSIX 1003.1-2001 base, listed in
+ traditional numeric order where possible. */
+#ifdef SIGHUP
+ NUMNAME (HUP),
+#endif
+#ifdef SIGINT
+ NUMNAME (INT),
+#endif
+#ifdef SIGQUIT
+ NUMNAME (QUIT),
+#endif
+#ifdef SIGILL
+ NUMNAME (ILL),
+#endif
+#ifdef SIGTRAP
+ NUMNAME (TRAP),
+#endif
+#ifdef SIGABRT
+ NUMNAME (ABRT),
+#endif
+#ifdef SIGFPE
+ NUMNAME (FPE),
+#endif
+#ifdef SIGKILL
+ NUMNAME (KILL),
+#endif
+#ifdef SIGSEGV
+ NUMNAME (SEGV),
+#endif
+ /* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match
+ strsignal.c output, so SIGBUS must be listed second. */
+#ifdef SIGBUS
+ NUMNAME (BUS),
+#endif
+#ifdef SIGPIPE
+ NUMNAME (PIPE),
+#endif
+#ifdef SIGALRM
+ NUMNAME (ALRM),
+#endif
+#ifdef SIGTERM
+ NUMNAME (TERM),
+#endif
+#ifdef SIGUSR1
+ NUMNAME (USR1),
+#endif
+#ifdef SIGUSR2
+ NUMNAME (USR2),
+#endif
+#ifdef SIGCHLD
+ NUMNAME (CHLD),
+#endif
+#ifdef SIGURG
+ NUMNAME (URG),
+#endif
+#ifdef SIGSTOP
+ NUMNAME (STOP),
+#endif
+#ifdef SIGTSTP
+ NUMNAME (TSTP),
+#endif
+#ifdef SIGCONT
+ NUMNAME (CONT),
+#endif
+#ifdef SIGTTIN
+ NUMNAME (TTIN),
+#endif
+#ifdef SIGTTOU
+ NUMNAME (TTOU),
+#endif
+
+ /* Signals required by POSIX 1003.1-2001 with the XSI extension. */
+#ifdef SIGSYS
+ NUMNAME (SYS),
+#endif
+#ifdef SIGPOLL
+ NUMNAME (POLL),
+#endif
+#ifdef SIGVTALRM
+ NUMNAME (VTALRM),
+#endif
+#ifdef SIGPROF
+ NUMNAME (PROF),
+#endif
+#ifdef SIGXCPU
+ NUMNAME (XCPU),
+#endif
+#ifdef SIGXFSZ
+ NUMNAME (XFSZ),
+#endif
+
+ /* Unix Version 7. */
+#ifdef SIGIOT
+ NUMNAME (IOT), /* Older name for ABRT. */
+#endif
+#ifdef SIGEMT
+ NUMNAME (EMT),
+#endif
+
+ /* USG Unix. */
+#ifdef SIGPHONE
+ NUMNAME (PHONE),
+#endif
+#ifdef SIGWIND
+ NUMNAME (WIND),
+#endif
+
+ /* Unix System V. */
+#ifdef SIGCLD
+ NUMNAME (CLD),
+#endif
+#ifdef SIGPWR
+ NUMNAME (PWR),
+#endif
+
+ /* GNU/Linux 2.2 and Solaris 8. */
+#ifdef SIGCANCEL
+ NUMNAME (CANCEL),
+#endif
+#ifdef SIGLWP
+ NUMNAME (LWP),
+#endif
+#ifdef SIGWAITING
+ NUMNAME (WAITING),
+#endif
+#ifdef SIGFREEZE
+ NUMNAME (FREEZE),
+#endif
+#ifdef SIGTHAW
+ NUMNAME (THAW),
+#endif
+#ifdef SIGLOST
+ NUMNAME (LOST),
+#endif
+#ifdef SIGWINCH
+ NUMNAME (WINCH),
+#endif
+
+ /* GNU/Linux 2.2. */
+#ifdef SIGINFO
+ NUMNAME (INFO),
+#endif
+#ifdef SIGIO
+ NUMNAME (IO),
+#endif
+#ifdef SIGSTKFLT
+ NUMNAME (STKFLT),
+#endif
+
+ /* AIX 5L. */
+#ifdef SIGDANGER
+ NUMNAME (DANGER),
+#endif
+#ifdef SIGGRANT
+ NUMNAME (GRANT),
+#endif
+#ifdef SIGMIGRATE
+ NUMNAME (MIGRATE),
+#endif
+#ifdef SIGMSG
+ NUMNAME (MSG),
+#endif
+#ifdef SIGPRE
+ NUMNAME (PRE),
+#endif
+#ifdef SIGRETRACT
+ NUMNAME (RETRACT),
+#endif
+#ifdef SIGSAK
+ NUMNAME (SAK),
+#endif
+#ifdef SIGSOUND
+ NUMNAME (SOUND),
+#endif
+
+ /* Older AIX versions. */
+#ifdef SIGALRM1
+ NUMNAME (ALRM1), /* unknown; taken from Bash 2.05 */
+#endif
+#ifdef SIGKAP
+ NUMNAME (KAP), /* Older name for SIGGRANT. */
+#endif
+#ifdef SIGVIRT
+ NUMNAME (VIRT), /* unknown; taken from Bash 2.05 */
+#endif
+#ifdef SIGWINDOW
+ NUMNAME (WINDOW), /* Older name for SIGWINCH. */
+#endif
+
+ /* BeOS */
+#ifdef SIGKILLTHR
+ NUMNAME (KILLTHR),
+#endif
+
+ /* Older HP-UX versions. */
+#ifdef SIGDIL
+ NUMNAME (DIL),
+#endif
+
+ /* Korn shell and Bash, of uncertain vintage. */
+ { 0, "EXIT" }
+ };
+
+#define NUMNAME_ENTRIES (sizeof numname_table / sizeof numname_table[0])
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Convert the signal name SIGNAME to a signal number. Return the
+ signal number if successful, -1 otherwise. */
+
+static int
+str2signum (char const *signame)
+{
+ if (ISDIGIT (*signame))
+ {
+ char *endp;
+ long int n = strtol (signame, &endp, 10);
+ if (! *endp && n <= SIGNUM_BOUND)
+ return n;
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i < NUMNAME_ENTRIES; i++)
+ if (strcmp (numname_table[i].name, signame) == 0)
+ return numname_table[i].num;
+
+ {
+ char *endp;
+ int rtmin = SIGRTMIN;
+ int rtmax = SIGRTMAX;
+
+ if (0 < rtmin && strncmp (signame, "RTMIN", 5) == 0)
+ {
+ long int n = strtol (signame + 5, &endp, 10);
+ if (! *endp && 0 <= n && n <= rtmax - rtmin)
+ return rtmin + n;
+ }
+ else if (0 < rtmax && strncmp (signame, "RTMAX", 5) == 0)
+ {
+ long int n = strtol (signame + 5, &endp, 10);
+ if (! *endp && rtmin - rtmax <= n && n <= 0)
+ return rtmax + n;
+ }
+ }
+ }
+
+ return -1;
+}
+
+/* Convert the signal name SIGNAME to the signal number *SIGNUM.
+ Return 0 if successful, -1 otherwise. */
+
+int
+str2sig (char const *signame, int *signum)
+{
+ *signum = str2signum (signame);
+ return *signum < 0 ? -1 : 0;
+}
+
+/* Convert SIGNUM to a signal name in SIGNAME. SIGNAME must point to
+ a buffer of at least SIG2STR_MAX bytes. Return 0 if successful, -1
+ otherwise. */
+
+int
+sig2str (int signum, char *signame)
+{
+ unsigned int i;
+ for (i = 0; i < NUMNAME_ENTRIES; i++)
+ if (numname_table[i].num == signum)
+ {
+ strcpy (signame, numname_table[i].name);
+ return 0;
+ }
+
+ {
+ int rtmin = SIGRTMIN;
+ int rtmax = SIGRTMAX;
+
+ if (! (rtmin <= signum && signum <= rtmax))
+ return -1;
+
+ if (signum <= rtmin + (rtmax - rtmin) / 2)
+ {
+ int delta = signum - rtmin;
+ sprintf (signame, delta ? "RTMIN+%d" : "RTMIN", delta);
+ }
+ else
+ {
+ int delta = rtmax - signum;
+ sprintf (signame, delta ? "RTMAX-%d" : "RTMAX", delta);
+ }
+
+ return 0;
+ }
+}
diff --git a/gnulib/lib/sig2str.h b/gnulib/lib/sig2str.h
new file mode 100644
index 0000000..03ff1e0
--- /dev/null
+++ b/gnulib/lib/sig2str.h
@@ -0,0 +1,43 @@
+/* sig2str.h -- convert between signal names and numbers
+
+ Copyright (C) 2002, 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <signal.h>
+
+/* Don't override system declarations of SIG2STR_MAX, sig2str, str2sig. */
+#ifndef SIG2STR_MAX
+
+# include "intprops.h"
+
+/* Size of a buffer needed to hold a signal name like "HUP". */
+# define SIG2STR_MAX (sizeof "SIGRTMAX" + INT_STRLEN_BOUND (int) - 1)
+
+int sig2str (int, char *);
+int str2sig (char const *, int *);
+
+#endif
+
+/* An upper bound on signal numbers allowed by the system. */
+
+#if defined _sys_nsig
+# define SIGNUM_BOUND (_sys_nsig - 1)
+#elif defined NSIG
+# define SIGNUM_BOUND (NSIG - 1)
+#else
+# define SIGNUM_BOUND 64
+#endif
diff --git a/gnulib/lib/sigaction.c b/gnulib/lib/sigaction.c
new file mode 100644
index 0000000..e6a55da
--- /dev/null
+++ b/gnulib/lib/sigaction.c
@@ -0,0 +1,204 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* This implementation of sigaction is tailored to Woe32 behavior:
+ signal() has SysV semantics (ie. the handler is uninstalled before
+ it is invoked). This is an inherent data race if an asynchronous
+ signal is sent twice in a row before we can reinstall our handler,
+ but there's nothing we can do about it. Meanwhile, sigprocmask()
+ is not present, and while we can use the gnulib replacement to
+ provide critical sections, it too suffers from potential data races
+ in the face of an ill-timed asynchronous signal. And we compound
+ the situation by reading static storage in a signal handler, which
+ POSIX warns is not generically async-signal-safe. Oh well.
+
+ Additionally:
+ - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD
+ is not defined.
+ - We don't implement SA_ONSTACK, because sigaltstack() is not present.
+ - We ignore SA_RESTART, because blocking Win32 calls are not interrupted
+ anyway when an asynchronous signal occurs, and the MSVCRT runtime
+ never sets errno to EINTR.
+ - We don't implement SA_SIGINFO because it is impossible to do so
+ portably.
+
+ POSIX states that an application should not mix signal() and
+ sigaction(). We support the use of signal() within the gnulib
+ sigprocmask() substitute, but all other application code linked
+ with this module should stick with only sigaction(). */
+
+/* Check some of our assumptions. */
+#if defined SIGCHLD || defined HAVE_SIGALTSTACK || defined HAVE_SIGINTERRUPT
+# error "Revisit the assumptions made in the sigaction module"
+#endif
+
+/* Out-of-range substitutes make a good fallback for uncatchable
+ signals. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+
+/* A signal handler. */
+typedef void (*handler_t) (int signal);
+
+/* Set of current actions. If sa_handler for an entry is NULL, then
+ that signal is not currently handled by the sigaction handler. */
+static struct sigaction volatile action_array[NSIG] /* = 0 */;
+
+/* Signal handler that is installed for signals. */
+static void
+sigaction_handler (int sig)
+{
+ handler_t handler;
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno = errno;
+ if (sig < 0 || NSIG <= sig || !action_array[sig].sa_handler)
+ {
+ /* Unexpected situation; be careful to avoid recursive abort. */
+ if (sig == SIGABRT)
+ signal (SIGABRT, SIG_DFL);
+ abort ();
+ }
+
+ /* Reinstall the signal handler when required; otherwise update the
+ bookkeeping so that the user's handler may call sigaction and get
+ accurate results. We know the signal isn't currently blocked, or
+ we wouldn't be in its handler, therefore we know that we are not
+ interrupting a sigaction() call. There is a race where any
+ asynchronous instance of the same signal occurring before we
+ reinstall the handler will trigger the default handler; oh
+ well. */
+ handler = action_array[sig].sa_handler;
+ if ((action_array[sig].sa_flags & SA_RESETHAND) == 0)
+ signal (sig, sigaction_handler);
+ else
+ action_array[sig].sa_handler = NULL;
+
+ /* Block appropriate signals. */
+ mask = action_array[sig].sa_mask;
+ if ((action_array[sig].sa_flags & SA_NODEFER) == 0)
+ sigaddset (&mask, sig);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+
+ /* Invoke the user's handler, then restore prior mask. */
+ errno = saved_errno;
+ handler (sig);
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+}
+
+/* Change and/or query the action that will be taken on delivery of
+ signal SIG. If not NULL, ACT describes the new behavior. If not
+ NULL, OACT is set to the prior behavior. Return 0 on success, or
+ set errno and return -1 on failure. */
+int
+sigaction (int sig, const struct sigaction *restrict act,
+ struct sigaction *restrict oact)
+{
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno;
+
+ if (sig < 0 || NSIG <= sig || sig == SIGKILL || sig == SIGSTOP
+ || (act && act->sa_handler == SIG_ERR))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+#ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+#endif
+
+ /* POSIX requires sigaction() to be async-signal-safe. In other
+ words, if an asynchronous signal can occur while we are anywhere
+ inside this function, the user's handler could then call
+ sigaction() recursively and expect consistent results. We meet
+ this rule by using sigprocmask to block all signals before
+ modifying any data structure that could be read from a signal
+ handler; this works since we know that the gnulib sigprocmask
+ replacement does not try to use sigaction() from its handler. */
+ if (!act && !oact)
+ return 0;
+ sigfillset (&mask);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+ if (oact)
+ {
+ if (action_array[sig].sa_handler)
+ *oact = action_array[sig];
+ else
+ {
+ /* Safe to change the handler at will here, since all
+ signals are currently blocked. */
+ oact->sa_handler = signal (sig, SIG_DFL);
+ if (oact->sa_handler == SIG_ERR)
+ goto failure;
+ signal (sig, oact->sa_handler);
+ oact->sa_flags = SA_RESETHAND | SA_NODEFER;
+ sigemptyset (&oact->sa_mask);
+ }
+ }
+
+ if (act)
+ {
+ /* Safe to install the handler before updating action_array,
+ since all signals are currently blocked. */
+ if (act->sa_handler == SIG_DFL || act->sa_handler == SIG_IGN)
+ {
+ if (signal (sig, act->sa_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig].sa_handler = NULL;
+ }
+ else
+ {
+ if (signal (sig, sigaction_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig] = *act;
+ }
+ }
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ return 0;
+
+ failure:
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+ return -1;
+}
diff --git a/gnulib/lib/siglist.h b/gnulib/lib/siglist.h
new file mode 100644
index 0000000..104bc68
--- /dev/null
+++ b/gnulib/lib/siglist.h
@@ -0,0 +1,132 @@
+/* Canonical list of all signal names.
+ Copyright (C) 1996-1999, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file should be usable for any platform, since it just associates
+ the SIG* macros with text names and descriptions. The actual values
+ come from <bits/signum.h> (via <signal.h>). For any signal macros do not
+ exist on every platform, we can use #ifdef tests here and still use
+ this single common file for all platforms. */
+
+/* This file is included multiple times. */
+
+/* Duplicate values (such as SIGBUS==SIGSEGV on Haiku) favor the last
+ list entry. */
+
+/* Standard signals */
+#ifdef SIGHUP
+ init_sig (SIGHUP, "HUP", N_("Hangup"))
+#endif
+#ifdef SIGINT
+ init_sig (SIGINT, "INT", N_("Interrupt"))
+#endif
+#ifdef SIGQUIT
+ init_sig (SIGQUIT, "QUIT", N_("Quit"))
+#endif
+#ifdef SIGILL
+ init_sig (SIGILL, "ILL", N_("Illegal instruction"))
+#endif
+#ifdef SIGTRAP
+ init_sig (SIGTRAP, "TRAP", N_("Trace/breakpoint trap"))
+#endif
+#ifdef SIGABRT
+ init_sig (SIGABRT, "ABRT", N_("Aborted"))
+#endif
+#ifdef SIGFPE
+ init_sig (SIGFPE, "FPE", N_("Floating point exception"))
+#endif
+#ifdef SIGKILL
+ init_sig (SIGKILL, "KILL", N_("Killed"))
+#endif
+#ifdef SIGBUS
+ init_sig (SIGBUS, "BUS", N_("Bus error"))
+#endif
+#ifdef SIGSEGV
+ init_sig (SIGSEGV, "SEGV", N_("Segmentation fault"))
+#endif
+#ifdef SIGPIPE
+ init_sig (SIGPIPE, "PIPE", N_("Broken pipe"))
+#endif
+#ifdef SIGALRM
+ init_sig (SIGALRM, "ALRM", N_("Alarm clock"))
+#endif
+#ifdef SIGTERM
+ init_sig (SIGTERM, "TERM", N_("Terminated"))
+#endif
+#ifdef SIGURG
+ init_sig (SIGURG, "URG", N_("Urgent I/O condition"))
+#endif
+#ifdef SIGSTOP
+ init_sig (SIGSTOP, "STOP", N_("Stopped (signal)"))
+#endif
+#ifdef SIGTSTP
+ init_sig (SIGTSTP, "TSTP", N_("Stopped"))
+#endif
+#ifdef SIGCONT
+ init_sig (SIGCONT, "CONT", N_("Continued"))
+#endif
+#ifdef SIGCHLD
+ init_sig (SIGCHLD, "CHLD", N_("Child exited"))
+#endif
+#ifdef SIGTTIN
+ init_sig (SIGTTIN, "TTIN", N_("Stopped (tty input)"))
+#endif
+#ifdef SIGTTOU
+ init_sig (SIGTTOU, "TTOU", N_("Stopped (tty output)"))
+#endif
+#ifdef SIGIO
+ init_sig (SIGIO, "IO", N_("I/O possible"))
+#endif
+#ifdef SIGXCPU
+ init_sig (SIGXCPU, "XCPU", N_("CPU time limit exceeded"))
+#endif
+#ifdef SIGXFSZ
+ init_sig (SIGXFSZ, "XFSZ", N_("File size limit exceeded"))
+#endif
+#ifdef SIGVTALRM
+ init_sig (SIGVTALRM, "VTALRM", N_("Virtual timer expired"))
+#endif
+#ifdef SIGPROF
+ init_sig (SIGPROF, "PROF", N_("Profiling timer expired"))
+#endif
+#ifdef SIGWINCH
+ init_sig (SIGWINCH, "WINCH", N_("Window changed"))
+#endif
+#ifdef SIGUSR1
+ init_sig (SIGUSR1, "USR1", N_("User defined signal 1"))
+#endif
+#ifdef SIGUSR2
+ init_sig (SIGUSR2, "USR2", N_("User defined signal 2"))
+#endif
+
+/* Variations */
+#ifdef SIGEMT
+ init_sig (SIGEMT, "EMT", N_("EMT trap"))
+#endif
+#ifdef SIGSYS
+ init_sig (SIGSYS, "SYS", N_("Bad system call"))
+#endif
+#ifdef SIGSTKFLT
+ init_sig (SIGSTKFLT, "STKFLT", N_("Stack fault"))
+#endif
+#ifdef SIGINFO
+ init_sig (SIGINFO, "INFO", N_("Information request"))
+#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR != SIGLOST))
+ init_sig (SIGPWR, "PWR", N_("Power failure"))
+#endif
+#ifdef SIGLOST
+ init_sig (SIGLOST, "LOST", N_("Resource lost"))
+#endif
diff --git a/gnulib/lib/signal.in.h b/gnulib/lib/signal.in.h
new file mode 100644
index 0000000..e18e0b2
--- /dev/null
+++ b/gnulib/lib/signal.in.h
@@ -0,0 +1,447 @@
+/* A GNU-like <signal.h>.
+
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T)
+/* Special invocation convention:
+ - Inside glibc header files.
+ - On glibc systems we have a sequence of nested includes
+ <signal.h> -> <ucontext.h> -> <signal.h>.
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases.
+ - On glibc systems with GCC 4.3 we have a sequence of nested includes
+ <csignal> -> </usr/include/signal.h> -> <sys/ucontext.h> -> <signal.h>.
+ In this situation, some of the functions are not yet declared, therefore
+ we cannot provide the C++ aliases. */
+
+# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SIGNAL_H
+
+#define _GL_ALREADY_INCLUDING_SIGNAL_H
+
+/* Define pid_t, uid_t.
+ Also, mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.
+ On Solaris 10, <signal.h> includes <sys/types.h>, which eventually includes
+ us; so include <sys/types.h> now, before the second inclusion guard. */
+#include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#undef _GL_ALREADY_INCLUDING_SIGNAL_H
+
+#ifndef _@GUARD_PREFIX@_SIGNAL_H
+#define _@GUARD_PREFIX@_SIGNAL_H
+
+/* MacOS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6 declare
+ pthread_sigmask in <pthread.h>, not in <signal.h>.
+ But avoid namespace pollution on glibc systems.*/
+#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
+ && ((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ || defined __sun) \
+ && ! defined __GLIBC__
+# include <pthread.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* On AIX, sig_atomic_t already includes volatile. C99 requires that
+ 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not.
+ Hence, redefine this to a non-volatile type as needed. */
+#if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+# if !GNULIB_defined_sig_atomic_t
+typedef int rpl_sig_atomic_t;
+# undef sig_atomic_t
+# define sig_atomic_t rpl_sig_atomic_t
+# define GNULIB_defined_sig_atomic_t 1
+# endif
+#endif
+
+/* A set or mask of signals. */
+#if !@HAVE_SIGSET_T@
+# if !GNULIB_defined_sigset_t
+typedef unsigned int sigset_t;
+# define GNULIB_defined_sigset_t 1
+# endif
+#endif
+
+/* Define sighandler_t, the type of signal handlers. A GNU extension. */
+#if !@HAVE_SIGHANDLER_T@
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_sighandler_t
+typedef void (*sighandler_t) (int);
+# define GNULIB_defined_sighandler_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+#endif
+
+
+#if @GNULIB_SIGNAL_H_SIGPIPE@
+# ifndef SIGPIPE
+/* Define SIGPIPE to a value that does not overlap with other signals. */
+# define SIGPIPE 13
+# define GNULIB_defined_SIGPIPE 1
+/* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
+ 'write', 'stdio'. */
+# endif
+#endif
+
+
+/* Maximum signal number + 1. */
+#ifndef NSIG
+# if defined __TANDEM
+# define NSIG 32
+# endif
+#endif
+
+
+#if @GNULIB_PTHREAD_SIGMASK@
+# if @REPLACE_PTHREAD_SIGMASK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pthread_sigmask
+# define pthread_sigmask rpl_pthread_sigmask
+# endif
+_GL_FUNCDECL_RPL (pthread_sigmask, int,
+ (int how, const sigset_t *new_mask, sigset_t *old_mask));
+_GL_CXXALIAS_RPL (pthread_sigmask, int,
+ (int how, const sigset_t *new_mask, sigset_t *old_mask));
+# else
+# if !@HAVE_PTHREAD_SIGMASK@
+_GL_FUNCDECL_SYS (pthread_sigmask, int,
+ (int how, const sigset_t *new_mask, sigset_t *old_mask));
+# endif
+_GL_CXXALIAS_SYS (pthread_sigmask, int,
+ (int how, const sigset_t *new_mask, sigset_t *old_mask));
+# endif
+_GL_CXXALIASWARN (pthread_sigmask);
+#elif defined GNULIB_POSIXCHECK
+# undef pthread_sigmask
+# if HAVE_RAW_DECL_PTHREAD_SIGMASK
+_GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - "
+ "use gnulib module pthread_sigmask for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RAISE@
+# if @REPLACE_RAISE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef raise
+# define raise rpl_raise
+# endif
+_GL_FUNCDECL_RPL (raise, int, (int sig));
+_GL_CXXALIAS_RPL (raise, int, (int sig));
+# else
+# if !@HAVE_RAISE@
+_GL_FUNCDECL_SYS (raise, int, (int sig));
+# endif
+_GL_CXXALIAS_SYS (raise, int, (int sig));
+# endif
+_GL_CXXALIASWARN (raise);
+#elif defined GNULIB_POSIXCHECK
+# undef raise
+/* Assume raise is always declared. */
+_GL_WARN_ON_USE (raise, "raise can crash on native Windows - "
+ "use gnulib module raise for portability");
+#endif
+
+
+#if @GNULIB_SIGPROCMASK@
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+
+# ifndef GNULIB_defined_signal_blocking
+# define GNULIB_defined_signal_blocking 1
+# endif
+
+/* Maximum signal number + 1. */
+# ifndef NSIG
+# define NSIG 32
+# endif
+
+/* This code supports only 32 signals. */
+# if !GNULIB_defined_verify_NSIG_constraint
+typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1];
+# define GNULIB_defined_verify_NSIG_constraint 1
+# endif
+
+# endif
+
+/* Test whether a given signal is contained in a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigismember
+# endif
+# else
+_GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigismember);
+
+/* Initialize a signal set to the empty set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigemptyset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigemptyset);
+
+/* Add a signal to a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigaddset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigaddset);
+
+/* Remove a signal from a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigdelset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigdelset);
+
+/* Fill a signal set with all possible signals. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on MacOS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigfillset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigfillset);
+
+/* Return the set of those blocked signals that are pending. */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+_GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigpending);
+
+/* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET.
+ Then, if SET is not NULL, affect the current set of blocked signals by
+ combining it with *SET as indicated in OPERATION.
+ In this implementation, you are not allowed to change a signal handler
+ while the signal is blocked. */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+# define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */
+# define SIG_SETMASK 1 /* blocked_set = *set; */
+# define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */
+_GL_FUNCDECL_SYS (sigprocmask, int,
+ (int operation, const sigset_t *set, sigset_t *old_set));
+# endif
+_GL_CXXALIAS_SYS (sigprocmask, int,
+ (int operation, const sigset_t *set, sigset_t *old_set));
+_GL_CXXALIASWARN (sigprocmask);
+
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_function_taking_int_returning_void_t
+typedef void (*_gl_function_taking_int_returning_void_t) (int);
+# define GNULIB_defined_function_taking_int_returning_void_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define signal rpl_signal
+# endif
+_GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+_GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+# else
+_GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+# endif
+_GL_CXXALIASWARN (signal);
+
+# if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE
+/* Raise signal SIGPIPE. */
+_GL_EXTERN_C int _gl_raise_SIGPIPE (void);
+# endif
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaddset
+# if HAVE_RAW_DECL_SIGADDSET
+_GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigdelset
+# if HAVE_RAW_DECL_SIGDELSET
+_GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigemptyset
+# if HAVE_RAW_DECL_SIGEMPTYSET
+_GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigfillset
+# if HAVE_RAW_DECL_SIGFILLSET
+_GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigismember
+# if HAVE_RAW_DECL_SIGISMEMBER
+_GL_WARN_ON_USE (sigismember, "sigismember is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigpending
+# if HAVE_RAW_DECL_SIGPENDING
+_GL_WARN_ON_USE (sigpending, "sigpending is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigprocmask
+# if HAVE_RAW_DECL_SIGPROCMASK
+_GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+#endif /* @GNULIB_SIGPROCMASK@ */
+
+
+#if @GNULIB_SIGACTION@
+# if !@HAVE_SIGACTION@
+
+# if !@HAVE_SIGINFO_T@
+
+# if !GNULIB_defined_siginfo_types
+
+/* Present to allow compilation, but unsupported by gnulib. */
+union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+};
+
+/* Present to allow compilation, but unsupported by gnulib. */
+struct siginfo_t
+{
+ int si_signo;
+ int si_code;
+ int si_errno;
+ pid_t si_pid;
+ uid_t si_uid;
+ void *si_addr;
+ int si_status;
+ long si_band;
+ union sigval si_value;
+};
+typedef struct siginfo_t siginfo_t;
+
+# define GNULIB_defined_siginfo_types 1
+# endif
+
+# endif /* !@HAVE_SIGINFO_T@ */
+
+/* We assume that platforms which lack the sigaction() function also lack
+ the 'struct sigaction' type, and vice versa. */
+
+# if !GNULIB_defined_struct_sigaction
+
+struct sigaction
+{
+ union
+ {
+ void (*_sa_handler) (int);
+ /* Present to allow compilation, but unsupported by gnulib. POSIX
+ says that implementations may, but not must, make sa_sigaction
+ overlap with sa_handler, but we know of no implementation where
+ they do not overlap. */
+ void (*_sa_sigaction) (int, siginfo_t *, void *);
+ } _sa_func;
+ sigset_t sa_mask;
+ /* Not all POSIX flags are supported. */
+ int sa_flags;
+};
+# define sa_handler _sa_func._sa_handler
+# define sa_sigaction _sa_func._sa_sigaction
+/* Unsupported flags are not present. */
+# define SA_RESETHAND 1
+# define SA_NODEFER 2
+# define SA_RESTART 4
+
+# define GNULIB_defined_struct_sigaction 1
+# endif
+
+_GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict,
+ struct sigaction *restrict));
+
+# elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+
+# define sa_sigaction sa_handler
+
+# endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */
+
+_GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict,
+ struct sigaction *restrict));
+_GL_CXXALIASWARN (sigaction);
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaction
+# if HAVE_RAW_DECL_SIGACTION
+_GL_WARN_ON_USE (sigaction, "sigaction is unportable - "
+ "use the gnulib module sigaction for portability");
+# endif
+#endif
+
+/* Some systems don't have SA_NODEFER. */
+#ifndef SA_NODEFER
+# define SA_NODEFER 0
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SIGNAL_H */
+#endif /* _@GUARD_PREFIX@_SIGNAL_H */
+#endif
diff --git a/gnulib/lib/signbitd.c b/gnulib/lib/signbitd.c
new file mode 100644
index 0000000..4042349
--- /dev/null
+++ b/gnulib/lib/signbitd.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnand-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitd_OPTIMIZED_MACRO
+# undef gl_signbitd
+#endif
+
+int
+gl_signbitd (double arg)
+{
+#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGN_IN_LIBC
+ return copysign (1.0, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnand (arg))
+ return 0;
+ if (arg < 0.0)
+ return 1;
+ else if (arg == 0.0)
+ {
+ /* Distinguish 0.0 and -0.0. */
+ static double plus_zero = 0.0;
+ double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/signbitf.c b/gnulib/lib/signbitf.c
new file mode 100644
index 0000000..3ec472f
--- /dev/null
+++ b/gnulib/lib/signbitf.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanf-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitf_OPTIMIZED_MACRO
+# undef gl_signbitf
+#endif
+
+int
+gl_signbitf (float arg)
+{
+#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { float value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNF_IN_LIBC
+ return copysignf (1.0f, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanf (arg))
+ return 0;
+ if (arg < 0.0f)
+ return 1;
+ else if (arg == 0.0f)
+ {
+ /* Distinguish 0.0f and -0.0f. */
+ static float plus_zero = 0.0f;
+ float arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/signbitl.c b/gnulib/lib/signbitl.c
new file mode 100644
index 0000000..4453d8f
--- /dev/null
+++ b/gnulib/lib/signbitl.c
@@ -0,0 +1,64 @@
+/* signbit() macro: Determine the sign bit of a floating-point number.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#include <string.h>
+#include "isnanl-nolibm.h"
+#include "float+.h"
+
+#ifdef gl_signbitl_OPTIMIZED_MACRO
+# undef gl_signbitl
+#endif
+
+int
+gl_signbitl (long double arg)
+{
+#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
+ /* The use of a union to extract the bits of the representation of a
+ 'long double' is safe in practice, despite of the "aliasing rules" of
+ C99, because the GCC docs say
+ "Even with '-fstrict-aliasing', type-punning is allowed, provided the
+ memory is accessed through the union type."
+ and similarly for other compilers. */
+# define NWORDS \
+ ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { long double value; unsigned int word[NWORDS]; } m;
+ m.value = arg;
+ return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
+#elif HAVE_COPYSIGNL_IN_LIBC
+ return copysignl (1.0L, arg) < 0;
+#else
+ /* This does not do the right thing for NaN, but this is irrelevant for
+ most use cases. */
+ if (isnanl (arg))
+ return 0;
+ if (arg < 0.0L)
+ return 1;
+ else if (arg == 0.0L)
+ {
+ /* Distinguish 0.0L and -0.0L. */
+ static long double plus_zero = 0.0L;
+ long double arg_mem = arg;
+ return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
+ }
+ else
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/sigpipe-die.c b/gnulib/lib/sigpipe-die.c
new file mode 100644
index 0000000..43cf870
--- /dev/null
+++ b/gnulib/lib/sigpipe-die.c
@@ -0,0 +1,82 @@
+/* Report a SIGPIPE signal and exit.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+#include <config.h>
+
+/* Specification. */
+#include "sigpipe-die.h"
+
+#include <signal.h>
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+sigpipe_die (void)
+{
+ error (exit_failure, 0, "%s",
+ _("error writing to a closed pipe or socket"));
+
+ /* Ensure that this function really does not return. */
+ abort ();
+}
+
+static void (*prepare_die_hook) (void);
+
+/* This is the signal handler for SIGPIPE. It is invoked synchronously,
+ therefore it can make library calls to malloc(), gettext(), exit() etc. -
+ although in general it is undefined behaviour to do such calls from
+ within signal handlers. */
+static void
+sigpipe_die_handler (int sig)
+{
+ if (prepare_die_hook != NULL)
+ (*prepare_die_hook) ();
+ sigpipe_die ();
+}
+
+void
+install_sigpipe_die_handler (void (*prepare_die) (void))
+{
+ prepare_die_hook = prepare_die;
+
+ /* Install the handler. */
+ {
+ struct sigaction action;
+
+ action.sa_handler = sigpipe_die_handler;
+ action.sa_flags = 0;
+ sigemptyset (&action.sa_mask);
+ if (sigaction (SIGPIPE, &action, NULL) >= 0)
+ {
+ /* Unblock the signal (just in case). This is needed because if the
+ signal was blocked in the parent process, it is also blocked in
+ this process: the mask of blocked signals is inherited across
+ fork/exec (except for SIGCHLD). */
+ sigset_t sigpipe_set;
+
+ sigemptyset (&sigpipe_set);
+ sigaddset (&sigpipe_set, SIGPIPE);
+ sigprocmask (SIG_UNBLOCK, &sigpipe_set, NULL);
+ }
+ }
+}
diff --git a/gnulib/lib/sigpipe-die.h b/gnulib/lib/sigpipe-die.h
new file mode 100644
index 0000000..2e1ac27
--- /dev/null
+++ b/gnulib/lib/sigpipe-die.h
@@ -0,0 +1,63 @@
+/* Report a SIGPIPE signal and exit.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+/* SIGPIPE is the signal sent to a process calling write() on a pipe with no
+ readers. Together with the signal, the write() call is terminated with
+ return value -1, errno = EPIPE. Note that SIGPIPE is a *synchronous*
+ signal: it occurs only during write(), without delay (unless blocked).
+
+ The default reaction on SIGPIPE, namely terminating the process without
+ an error message, is suitable for programs which only produce output to
+ standard output and don't have side effects.
+
+ When a program has side effects, other than writing to standard output, the
+ suitable behaviour is either
+ (a) to exit with an error message
+ or - in certain cases, for example when writing to subprocesses -
+ (b) to continue the operation without writing to the pipe/socket with
+ no readers.
+
+ This file provides support for (a).
+ For (b), the program needs to know which of the output file descriptors
+ has no readers. This is usually implemented by blocking the SIGPIPE signal
+ and handling an EPIPE error indicator in all affected library calls
+ (write(), send(), fwrite(), fflush(), fclose(), etc.). */
+
+#ifndef _SIGPIPE_DIE_H
+#define _SIGPIPE_DIE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Emit an error message indicating a SIGPIPE signal, and terminate the
+ process with an error code. */
+extern _Noreturn void sigpipe_die (void);
+
+/* Install a SIGPIPE handler that invokes PREPARE_DIE and then emits an
+ error message and exits. PREPARE_DIE may be NULL, meaning a no-op. */
+extern void install_sigpipe_die_handler (void (*prepare_die) (void));
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SIGPIPE_DIE_H */
diff --git a/gnulib/lib/sigprocmask.c b/gnulib/lib/sigprocmask.c
new file mode 100644
index 0000000..d696189
--- /dev/null
+++ b/gnulib/lib/sigprocmask.c
@@ -0,0 +1,349 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+/* We assume that a platform without POSIX signal blocking functions
+ also does not have the POSIX sigaction() function, only the
+ signal() function. We also assume signal() has SysV semantics,
+ where any handler is uninstalled prior to being invoked. This is
+ true for Woe32 platforms. */
+
+/* We use raw signal(), but also provide a wrapper rpl_signal() so
+ that applications can query or change a blocked signal. */
+#undef signal
+
+/* Provide invalid signal numbers as fallbacks if the uncatchable
+ signals are not defined. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+#ifdef SIGABRT_COMPAT
+# define SIGABRT_COMPAT_MASK (1U << SIGABRT_COMPAT)
+#else
+# define SIGABRT_COMPAT_MASK 0
+#endif
+
+typedef void (*handler_t) (int);
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline handler_t
+signal_nothrow (int sig, handler_t handler)
+{
+ handler_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = signal (sig, handler);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = SIG_ERR;
+ errno = EINVAL;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# define signal signal_nothrow
+#endif
+
+/* Handling of gnulib defined signals. */
+
+#if GNULIB_defined_SIGPIPE
+static handler_t SIGPIPE_handler = SIG_DFL;
+#endif
+
+#if GNULIB_defined_SIGPIPE
+static handler_t
+ext_signal (int sig, handler_t handler)
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ {
+ handler_t old_handler = SIGPIPE_handler;
+ SIGPIPE_handler = handler;
+ return old_handler;
+ }
+ default: /* System defined signal */
+ return signal (sig, handler);
+ }
+}
+# undef signal
+# define signal ext_signal
+#endif
+
+int
+sigismember (const sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ return (*set >> sig) & 1;
+ }
+ else
+ return 0;
+}
+
+int
+sigemptyset (sigset_t *set)
+{
+ *set = 0;
+ return 0;
+}
+
+int
+sigaddset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set |= 1U << sig;
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+int
+sigdelset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set &= ~(1U << sig);
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+
+int
+sigfillset (sigset_t *set)
+{
+ *set = ((2U << (NSIG - 1)) - 1) & ~ SIGABRT_COMPAT_MASK;
+ return 0;
+}
+
+/* Set of currently blocked signals. */
+static volatile sigset_t blocked_set /* = 0 */;
+
+/* Set of currently blocked and pending signals. */
+static volatile sig_atomic_t pending_array[NSIG] /* = { 0 } */;
+
+/* Signal handler that is installed for blocked signals. */
+static void
+blocked_handler (int sig)
+{
+ /* Reinstall the handler, in case the signal occurs multiple times
+ while blocked. There is an inherent race where an asynchronous
+ signal in between when the kernel uninstalled the handler and
+ when we reinstall it will trigger the default handler; oh
+ well. */
+ signal (sig, blocked_handler);
+ if (sig >= 0 && sig < NSIG)
+ pending_array[sig] = 1;
+}
+
+int
+sigpending (sigset_t *set)
+{
+ sigset_t pending = 0;
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (pending_array[sig])
+ pending |= 1U << sig;
+ *set = pending;
+ return 0;
+}
+
+/* The previous signal handlers.
+ Only the array elements corresponding to blocked signals are relevant. */
+static volatile handler_t old_handlers[NSIG];
+
+int
+sigprocmask (int operation, const sigset_t *set, sigset_t *old_set)
+{
+ if (old_set != NULL)
+ *old_set = blocked_set;
+
+ if (set != NULL)
+ {
+ sigset_t new_blocked_set;
+ sigset_t to_unblock;
+ sigset_t to_block;
+
+ switch (operation)
+ {
+ case SIG_BLOCK:
+ new_blocked_set = blocked_set | *set;
+ break;
+ case SIG_SETMASK:
+ new_blocked_set = *set;
+ break;
+ case SIG_UNBLOCK:
+ new_blocked_set = blocked_set & ~*set;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ to_unblock = blocked_set & ~new_blocked_set;
+ to_block = new_blocked_set & ~blocked_set;
+
+ if (to_block != 0)
+ {
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_block >> sig) & 1)
+ {
+ pending_array[sig] = 0;
+ if ((old_handlers[sig] = signal (sig, blocked_handler)) != SIG_ERR)
+ blocked_set |= 1U << sig;
+ }
+ }
+
+ if (to_unblock != 0)
+ {
+ sig_atomic_t received[NSIG];
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_unblock >> sig) & 1)
+ {
+ if (signal (sig, old_handlers[sig]) != blocked_handler)
+ /* The application changed a signal handler while the signal
+ was blocked, bypassing our rpl_signal replacement.
+ We don't support this. */
+ abort ();
+ received[sig] = pending_array[sig];
+ blocked_set &= ~(1U << sig);
+ pending_array[sig] = 0;
+ }
+ else
+ received[sig] = 0;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (received[sig])
+ raise (sig);
+ }
+ }
+ return 0;
+}
+
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+handler_t
+rpl_signal (int sig, handler_t handler)
+{
+ /* We must provide a wrapper, so that a user can query what handler
+ they installed even if that signal is currently blocked. */
+ if (sig >= 0 && sig < NSIG && sig != SIGKILL && sig != SIGSTOP
+ && handler != SIG_ERR)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ if (blocked_set & (1U << sig))
+ {
+ /* POSIX states that sigprocmask and signal are both
+ async-signal-safe. This is not true of our
+ implementation - there is a slight data race where an
+ asynchronous interrupt on signal A can occur after we
+ install blocked_handler but before we have updated
+ old_handlers for signal B, such that handler A can see
+ stale information if it calls signal(B). Oh well -
+ signal handlers really shouldn't try to manipulate the
+ installed handlers of unrelated signals. */
+ handler_t result = old_handlers[sig];
+ old_handlers[sig] = handler;
+ return result;
+ }
+ else
+ return signal (sig, handler);
+ }
+ else
+ {
+ errno = EINVAL;
+ return SIG_ERR;
+ }
+}
+
+#if GNULIB_defined_SIGPIPE
+/* Raise the signal SIGPIPE. */
+int
+_gl_raise_SIGPIPE (void)
+{
+ if (blocked_set & (1U << SIGPIPE))
+ pending_array[SIGPIPE] = 1;
+ else
+ {
+ handler_t handler = SIGPIPE_handler;
+ if (handler == SIG_DFL)
+ exit (128 + SIGPIPE);
+ else if (handler != SIG_IGN)
+ (*handler) (SIGPIPE);
+ }
+ return 0;
+}
+#endif
diff --git a/gnulib/lib/sincosl.c b/gnulib/lib/sincosl.c
new file mode 100644
index 0000000..44f489c
--- /dev/null
+++ b/gnulib/lib/sincosl.c
@@ -0,0 +1,907 @@
+/* Quad-precision floating point trigonometric functions on <-pi/4,pi/4>.
+ Copyright (C) 1999, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jj@ultra.linux.cz>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "trigl.h"
+
+#include <float.h>
+#include <math.h>
+
+static const long double sin_c[] = {
+#define ONE sin_c[0]
+ 1.00000000000000000000000000000000000E+00L, /* 3fff0000000000000000000000000000 */
+
+/* cos x ~ ONE + x^2 ( SCOS1 + SCOS2 * x^2 + ... + SCOS4 * x^6 + SCOS5 * x^8 )
+ x in <0,1/256> */
+#define SCOS1 sin_c[1]
+#define SCOS2 sin_c[2]
+#define SCOS3 sin_c[3]
+#define SCOS4 sin_c[4]
+#define SCOS5 sin_c[5]
+ -5.00000000000000000000000000000000000E-01L, /* bffe0000000000000000000000000000 */
+ 4.16666666666666666666666666556146073E-02L, /* 3ffa5555555555555555555555395023 */
+ -1.38888888888888888888309442601939728E-03L, /* bff56c16c16c16c16c16a566e42c0375 */
+ 2.48015873015862382987049502531095061E-05L, /* 3fefa01a01a019ee02dcf7da2d6d5444 */
+ -2.75573112601362126593516899592158083E-07L, /* bfe927e4f5dce637cb0b54908754bde0 */
+
+/* sin x ~ ONE * x + x^3 ( SIN1 + SIN2 * x^2 + ... + SIN7 * x^12 + SIN8 * x^14 )
+ x in <0,0.1484375> */
+#define SIN1 sin_c[6]
+#define SIN2 sin_c[7]
+#define SIN3 sin_c[8]
+#define SIN4 sin_c[9]
+#define SIN5 sin_c[10]
+#define SIN6 sin_c[11]
+#define SIN7 sin_c[12]
+#define SIN8 sin_c[13]
+ -1.66666666666666666666666666666666538e-01L, /* bffc5555555555555555555555555550 */
+ 8.33333333333333333333333333307532934e-03L, /* 3ff811111111111111111111110e7340 */
+ -1.98412698412698412698412534478712057e-04L, /* bff2a01a01a01a01a01a019e7a626296 */
+ 2.75573192239858906520896496653095890e-06L, /* 3fec71de3a556c7338fa38527474b8f5 */
+ -2.50521083854417116999224301266655662e-08L, /* bfe5ae64567f544e16c7de65c2ea551f */
+ 1.60590438367608957516841576404938118e-10L, /* 3fde6124613a811480538a9a41957115 */
+ -7.64716343504264506714019494041582610e-13L, /* bfd6ae7f3d5aef30c7bc660b060ef365 */
+ 2.81068754939739570236322404393398135e-15L, /* 3fce9510115aabf87aceb2022a9a9180 */
+
+/* sin x ~ ONE * x + x^3 ( SSIN1 + SSIN2 * x^2 + ... + SSIN4 * x^6 + SSIN5 * x^8 )
+ x in <0,1/256> */
+#define SSIN1 sin_c[14]
+#define SSIN2 sin_c[15]
+#define SSIN3 sin_c[16]
+#define SSIN4 sin_c[17]
+#define SSIN5 sin_c[18]
+ -1.66666666666666666666666666666666659E-01L, /* bffc5555555555555555555555555555 */
+ 8.33333333333333333333333333146298442E-03L, /* 3ff81111111111111111111110fe195d */
+ -1.98412698412698412697726277416810661E-04L, /* bff2a01a01a01a01a019e7121e080d88 */
+ 2.75573192239848624174178393552189149E-06L, /* 3fec71de3a556c640c6aaa51aa02ab41 */
+ -2.50521016467996193495359189395805639E-08L, /* bfe5ae644ee90c47dc71839de75b2787 */
+};
+
+static const long double cos_c[] = {
+/* cos x ~ ONE + x^2 ( COS1 + COS2 * x^2 + ... + COS7 * x^12 + COS8 * x^14 )
+ x in <0,0.1484375> */
+#define COS1 cos_c[0]
+#define COS2 cos_c[1]
+#define COS3 cos_c[2]
+#define COS4 cos_c[3]
+#define COS5 cos_c[4]
+#define COS6 cos_c[5]
+#define COS7 cos_c[6]
+#define COS8 cos_c[7]
+ -4.99999999999999999999999999999999759E-01L, /* bffdfffffffffffffffffffffffffffb */
+ 4.16666666666666666666666666651287795E-02L, /* 3ffa5555555555555555555555516f30 */
+ -1.38888888888888888888888742314300284E-03L, /* bff56c16c16c16c16c16c16a463dfd0d */
+ 2.48015873015873015867694002851118210E-05L, /* 3fefa01a01a01a01a0195cebe6f3d3a5 */
+ -2.75573192239858811636614709689300351E-07L, /* bfe927e4fb7789f5aa8142a22044b51f */
+ 2.08767569877762248667431926878073669E-09L, /* 3fe21eed8eff881d1e9262d7adff4373 */
+ -1.14707451049343817400420280514614892E-11L, /* bfda9397496922a9601ed3d4ca48944b */
+ 4.77810092804389587579843296923533297E-14L, /* 3fd2ae5f8197cbcdcaf7c3fb4523414c */
+
+};
+
+#define SINCOSL_COS_HI 0
+#define SINCOSL_COS_LO 1
+#define SINCOSL_SIN_HI 2
+#define SINCOSL_SIN_LO 3
+static const long double sincosl_table[];
+
+long double
+kernel_sinl (long double x, long double y, int iy)
+{
+ long double h, l, z, sin_l, cos_l_m1;
+ int index, sign;
+
+ sign = 1;
+ if (x < 0)
+ {
+ x = -x;
+ sign = -1;
+ }
+
+ if (x < 0.1484375L) /* |x| < 0.1484375 */
+ {
+ /* Argument is small enough to approximate it by a Chebyshev
+ polynomial of degree 17. */
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2^-57 */
+ if (!((int) x))
+ return x; /* generate inexact */
+
+ z = x * x;
+ return x + (x * (z * (SIN1 + z * (SIN2 + z * (SIN3 + z * (SIN4 +
+ z * (SIN5 +
+ z *
+ (SIN6 +
+ z *
+ (SIN7 +
+ z *
+ SIN8)))))))));
+ }
+ else
+ {
+ /* So that we don't have to use too large polynomial, we find
+ k and l such that x = k + l, where fabsl(l) <= 1.0/256 with 83
+ possible values for k. We look up cosl(k) and sinl(k) in
+ pre-computed tables, compute cosl(l) and sinl(l) using a
+ Chebyshev polynomial of degree 10(11) and compute
+ sinl(k+l) = sinl(k)cosl(l) + cosl(k)sinl(l).
+ Furthermore write k = 0.1484375 + h. */
+ x -= 0.1484375L;
+ index = (int) (x * 128L + 0.5L);
+ h = index / 128.0L;
+ if (iy)
+ l = y - (h - x);
+ else
+ l = x - h;
+
+ z = l * l;
+ sin_l =
+ l * (ONE +
+ z * (SSIN1 +
+ z * (SSIN2 + z * (SSIN3 + z * (SSIN4 + z * SSIN5)))));
+ cos_l_m1 =
+ z * (SCOS1 + z * (SCOS2 + z * (SCOS3 + z * (SCOS4 + z * SCOS5))));
+
+ index *= 4;
+ /* We rely on this expression not being "contracted" by the compiler
+ (cf. ISO C 99 section 6.5 paragraph 8). */
+ z =
+ sincosl_table[index + SINCOSL_SIN_HI]
+ + (sincosl_table[index + SINCOSL_COS_HI] * sin_l
+ + (sincosl_table[index + SINCOSL_SIN_HI] * cos_l_m1
+ + (sincosl_table[index + SINCOSL_SIN_LO] * (1 + cos_l_m1)
+ + sincosl_table[index + SINCOSL_COS_LO] * sin_l)));
+ return z * sign;
+ }
+}
+
+long double
+kernel_cosl (long double x, long double y)
+{
+ long double h, l, z, sin_l, cos_l_m1;
+ int index;
+
+ if (x < 0)
+ x = -x;
+
+ if (x < 0.1484375L) /* |x| < 0.1484375 */
+ {
+ /* Argument is small enough to approximate it by a Chebyshev
+ polynomial of degree 16. */
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2^-57 */
+ if (!((int) x))
+ return ONE; /* generate inexact */
+ z = x * x;
+ return ONE + (z * (COS1 + z * (COS2 + z * (COS3 + z * (COS4 +
+ z * (COS5 +
+ z * (COS6 +
+ z *
+ (COS7 +
+ z *
+ COS8))))))));
+ }
+ else
+ {
+ /* So that we don't have to use too large polynomial, we find
+ k and l such that x = k + l, where fabsl(l) <= 1.0/256 with 83
+ possible values for k. We look up cosl(k) and sinl(k) in
+ pre-computed tables, compute cosl(l) and sinl(l) using a
+ Chebyshev polynomial of degree 10(11) and compute
+ cosl(k+l) = cosl(k)cosl(l) - sinl(k)sinl(l).
+ Furthermore write k = 0.1484375 + h. */
+ x -= 0.1484375L;
+ index = (int) (x * 128L + 0.5L);
+ h = index / 128.0L;
+ l = y - (h - x);
+ z = l * l;
+ sin_l =
+ l * (ONE +
+ z * (SSIN1 +
+ z * (SSIN2 + z * (SSIN3 + z * (SSIN4 + z * SSIN5)))));
+ cos_l_m1 =
+ z * (SCOS1 + z * (SCOS2 + z * (SCOS3 + z * (SCOS4 + z * SCOS5))));
+
+ index *= 4;
+ /* We rely on this expression not being "contracted" by the compiler
+ (cf. ISO C 99 section 6.5 paragraph 8). */
+ z =
+ sincosl_table [index + SINCOSL_COS_HI]
+ - (sincosl_table [index + SINCOSL_SIN_HI] * sin_l
+ - (sincosl_table [index + SINCOSL_COS_HI] * cos_l_m1
+ + (sincosl_table [index + SINCOSL_COS_LO] * (1 + cos_l_m1)
+ - sincosl_table [index + SINCOSL_SIN_LO] * sin_l)));
+ return z;
+ }
+}
+
+
+/* For 0.1484375 + n/128.0, n=0..82 this table contains
+ first 113 bits of cosine, then at least 113 additional
+ bits and the same for sine.
+ 0.1484375+82.0/128.0 is the smallest number among above defined numbers
+ larger than pi/4.
+ Computed using gmp.
+ */
+
+static const long double sincosl_table[] = {
+
+/* x = 1.48437500000000000000000000000000000e-01L 3ffc3000000000000000000000000000 */
+/* cos(x) = 0.fd2f5320e1b790209b4dda2f98f79caaa7b873aff1014b0fbc5243766d03cb006bc837c4358 */
+ 9.89003367927322909016887196069562069e-01L, /* 3ffefa5ea641c36f2041369bb45f31ef */
+ 2.15663692029265697782289400027743703e-35L, /* 3f8bcaaa7b873aff1014b0fbc5243767 */
+/* sin(x) = 0.25dc50bc95711d0d9787d108fd438cf5959ee0bfb7a1e36e8b1a112968f356657420e9cc9ea */
+ 1.47892995873409608580026675734609314e-01L, /* 3ffc2ee285e4ab88e86cbc3e8847ea1c */
+ 9.74950446464233268291647449768590886e-36L, /* 3f8a9eb2b3dc17f6f43c6dd16342252d */
+
+/* x = 1.56250000000000000000000000000000000e-01 3ffc4000000000000000000000000000 */
+/* cos(x) = 0.fce1a053e621438b6d60c76e8c45bf0a9dc71aa16f922acc10e95144ec796a249813c9cb649 */
+ 9.87817783816471944100503034363211317e-01L, /* 3ffef9c340a7cc428716dac18edd188b */
+ 4.74271307836705897892468107620526395e-35L, /* 3f8cf854ee38d50b7c915660874a8a27 */
+/* sin(x) = 0.27d66258bacd96a3eb335b365c87d59438c5142bb56a489e9b8db9d36234ffdebb6bdc22d8e */
+ 1.55614992773556041209920643203516258e-01L, /* 3ffc3eb312c5d66cb51f599ad9b2e43f */
+ -7.83989563419287980121718050629497270e-36L, /* bf8a4d78e75d7a8952b6ec2c8e48c594 */
+
+/* x = 1.64062500000000000000000000000000000e-01 3ffc5000000000000000000000000000 */
+/* cos(x) = 0.fc8ffa01ba6807417e05962b0d9fdf1fddb0cc4c07d22e19e08019bffa50a6c7acdb40307a3 */
+ 9.86571908399497588757337407495308409e-01L, /* 3ffef91ff40374d00e82fc0b2c561b40 */
+ -2.47327949936985362476252401212720725e-35L, /* bf8c070112799d9fc16e8f30fbff3200 */
+/* sin(x) = 0.29cfd49b8be4f665276cab01cbf0426934906c3dd105473b226e410b1450f62e53ff7c6cce1 */
+ 1.63327491736612850846866172454354370e-01L, /* 3ffc4e7ea4dc5f27b3293b65580e5f82 */
+ 1.81380344301155485770367902300754350e-36L, /* 3f88349a48361ee882a39d913720858a */
+
+/* x = 1.71875000000000000000000000000000000e-01 3ffc6000000000000000000000000000 */
+/* cos(x) = 0.fc3a6170f767ac735d63d99a9d439e1db5e59d3ef153a4265d5855850ed82b536bf361b80e3 */
+ 9.85265817718213816204294709759578994e-01L, /* 3ffef874c2e1eecf58e6bac7b3353a87 */
+ 2.26568029505818066141517497778527952e-35L, /* 3f8be1db5e59d3ef153a4265d5855851 */
+/* sin(x) = 0.2bc89f9f424de5485de7ce03b2514952b9faf5648c3244d4736feb95dbb9da49f3b58a9253b */
+ 1.71030022031395019281347969239834331e-01L, /* 3ffc5e44fcfa126f2a42ef3e701d928a */
+ 7.01395875187487608875416030203241317e-36L, /* 3f8a2a573f5eac9186489a8e6dfd72bb */
+
+/* x = 1.79687500000000000000000000000000000e-01 3ffc7000000000000000000000000000 */
+/* cos(x) = 0.fbe0d7f7fef11e70aa43b8abf4f6a457cea20c8f3f676b47781f9821bbe9ce04b3c7b981c0b */
+ 9.83899591489663972178309351416487245e-01L, /* 3ffef7c1afeffde23ce154877157e9ed */
+ 2.73414318948066207810486330723761265e-35L, /* 3f8c22be75106479fb3b5a3bc0fcc10e */
+/* sin(x) = 0.2dc0bb80b49a97ffb34e8dd1f8db9df7af47ed2dcf58b12c8e7827e048cae929da02c04ecac */
+ 1.78722113535153659375356241864180724e-01L, /* 3ffc6e05dc05a4d4bffd9a746e8fc6dd */
+ -1.52906926517265103202547561260594148e-36L, /* bf8804285c09691853a769b8c3ec0fdc */
+
+/* x = 1.87500000000000000000000000000000000e-01 3ffc8000000000000000000000000000 */
+/* cos(x) = 0.fb835efcf670dd2ce6fe7924697eea13ea358867e9cdb3899b783f4f9f43aa5626e8b67b3bc */
+ 9.82473313101255257487327683243622495e-01L, /* 3ffef706bdf9ece1ba59cdfcf248d2fe */
+ -1.64924358891557584625463868014230342e-35L, /* bf8b5ec15ca779816324c766487c0b06 */
+/* sin(x) = 0.2fb8205f75e56a2b56a1c4792f856258769af396e0189ef72c05e4df59a6b00e4b44a6ea515 */
+ 1.86403296762269884552379983103205261e-01L, /* 3ffc7dc102fbaf2b515ab50e23c97c2b */
+ 1.76460304806826780010586715975331753e-36L, /* 3f882c3b4d79cb700c4f7b9602f26fad */
+
+/* x = 1.95312500000000000000000000000000000e-01 3ffc9000000000000000000000000000 */
+/* cos(x) = 0.fb21f7f5c156696b00ac1fe28ac5fd76674a92b4df80d9c8a46c684399005deccc41386257c */
+ 9.80987069605669190469329896435309665e-01L, /* 3ffef643efeb82acd2d601583fc5158c */
+ -1.90899259410096419886996331536278461e-36L, /* bf8844cc5ab6a5903f931badc9cbde34 */
+/* sin(x) = 0.31aec65df552876f82ece9a2356713246eba6799983d7011b0b3698d6e1da919c15d57c30c1 */
+ 1.94073102892909791156055200214145404e-01L, /* 3ffc8d7632efaa943b7c17674d11ab39 */
+ -9.67304741051998267208945242944928999e-36L, /* bf8a9b7228b30cccf851fdc9e992ce52 */
+
+/* x = 2.03125000000000000000000000000000000e-01 3ffca000000000000000000000000000 */
+/* cos(x) = 0.fabca467fb3cb8f1d069f01d8ea33ade5bfd68296ecd1cc9f7b7609bbcf3676e726c3301334 */
+ 9.79440951715548359998530954502987493e-01L, /* 3ffef57948cff67971e3a0d3e03b1d46 */
+ 4.42878056591560757066844797290067990e-35L, /* 3f8cd6f2dfeb414b7668e64fbdbb04de */
+/* sin(x) = 0.33a4a5a19d86246710f602c44df4fa513f4639ce938477aeeabb82e8e0a7ed583a188879fd4 */
+ 2.01731063801638804725038151164000971e-01L, /* 3ffc9d252d0cec31233887b016226fa8 */
+ -4.27513434754966978435151290617384120e-36L, /* bf896bb02e718c5b1ee21445511f45c8 */
+
+/* x = 2.10937500000000000000000000000000000e-01 3ffcb000000000000000000000000000 */
+/* cos(x) = 0.fa5365e8f1d3ca27be1db5d76ae64d983d7470a4ab0f4ccf65a2b8c67a380df949953a09bc1 */
+ 9.77835053797959793331971572944454549e-01L, /* 3ffef4a6cbd1e3a7944f7c3b6baed5cd */
+ -3.79207422905180416937210853779192702e-35L, /* bf8c933e145c7adaa7859984d2ea39cc */
+/* sin(x) = 0.3599b652f40ec999df12a0a4c8561de159c98d4e54555de518b97f48886f715d8df5f4f093e */
+ 2.09376712085993643711890752724881652e-01L, /* 3ffcaccdb297a0764ccef895052642b1 */
+ -1.59470287344329449965314638482515925e-36L, /* bf880f531b3958d5d5510d73a3405bbc */
+
+/* x = 2.18750000000000000000000000000000000e-01 3ffcc000000000000000000000000000 */
+/* cos(x) = 0.f9e63e1d9e8b6f6f2e296bae5b5ed9c11fd7fa2fe11e09fc7bde901abed24b6365e72f7db4e */
+ 9.76169473868635276723989035435135534e-01L, /* 3ffef3cc7c3b3d16dede5c52d75cb6be */
+ -2.87727974249481583047944860626985460e-35L, /* bf8c31f701402e80f70fb01c210b7f2a */
+/* sin(x) = 0.378df09db8c332ce0d2b53d865582e4526ea336c768f68c32b496c6d11c1cd241bb9f1da523 */
+ 2.17009581095010156760578095826055396e-01L, /* 3ffcbc6f84edc6199670695a9ec32ac1 */
+ 1.07356488794216831812829549198201194e-35L, /* 3f8ac8a4dd466d8ed1ed1865692d8da2 */
+
+/* x = 2.26562500000000000000000000000000000e-01 3ffcd000000000000000000000000000 */
+/* cos(x) = 0.f9752eba9fff6b98842beadab054a932fb0f8d5b875ae63d6b2288d09b148921aeb6e52f61b */
+ 9.74444313585988980349711056045434344e-01L, /* 3ffef2ea5d753ffed7310857d5b560a9 */
+ 3.09947905955053419304514538592548333e-35L, /* 3f8c4997d87c6adc3ad731eb59144685 */
+/* sin(x) = 0.39814cb10513453cb97b21bc1ca6a337b150c21a675ab85503bc09a436a10ab1473934e20c8 */
+ 2.24629204957705292350428549796424820e-01L, /* 3ffccc0a6588289a29e5cbd90de0e535 */
+ 2.42061510849297469844695751870058679e-36L, /* 3f889bd8a8610d33ad5c2a81de04d21b */
+
+/* x = 2.34375000000000000000000000000000000e-01 3ffce000000000000000000000000000 */
+/* cos(x) = 0.f90039843324f9b940416c1984b6cbed1fc733d97354d4265788a86150493ce657cae032674 */
+ 9.72659678244912752670913058267565260e-01L, /* 3ffef20073086649f3728082d833096e */
+ -3.91759231819314904966076958560252735e-35L, /* bf8ca09701c6613465595ecd43babcf5 */
+/* sin(x) = 0.3b73c2bf6b4b9f668ef9499c81f0d965087f1753fa64b086e58cb8470515c18c1412f8c2e02 */
+ 2.32235118611511462413930877746235872e-01L, /* 3ffcdb9e15fb5a5cfb3477ca4ce40f87 */
+ -4.96930483364191020075024624332928910e-36L, /* bf89a6bde03a2b0166d3de469cd1ee3f */
+
+/* x = 2.42187500000000000000000000000000000e-01 3ffcf000000000000000000000000000 */
+/* cos(x) = 0.f887604e2c39dbb20e4ec5825059a789ffc95b275ad9954078ba8a28d3fcfe9cc2c1d49697b */
+ 9.70815676770349462947490545785046027e-01L, /* 3ffef10ec09c5873b7641c9d8b04a0b3 */
+ 2.97458820972393859125277682021202860e-35L, /* 3f8c3c4ffe4ad93ad6ccaa03c5d45147 */
+/* sin(x) = 0.3d654aff15cb457a0fca854698aba33039a8a40626609204472d9d40309b626eccc6dff0ffa */
+ 2.39826857830661564441369251810886574e-01L, /* 3ffceb2a57f8ae5a2bd07e542a34c55d */
+ 2.39867036569896287240938444445071448e-36L, /* 3f88981cd45203133049022396cea018 */
+
+/* x = 2.50000000000000000000000000000000000e-01 3ffd0000000000000000000000000000 */
+/* cos(x) = 0.f80aa4fbef750ba783d33cb95f94f8a41426dbe79edc4a023ef9ec13c944551c0795b84fee1 */
+ 9.68912421710644784144595449494189205e-01L, /* 3ffef01549f7deea174f07a67972bf2a */
+ -5.53634706113461989398873287749326500e-36L, /* bf89d6faf649061848ed7f704184fb0e */
+/* sin(x) = 0.3f55dda9e62aed7513bd7b8e6a3d1635dd5676648d7db525898d7086af9330f03c7f285442a */
+ 2.47403959254522929596848704849389203e-01L, /* 3ffcfaaeed4f31576ba89debdc7351e9 */
+ -7.36487001108599532943597115275811618e-36L, /* bf8a39445531336e50495b4ece51ef2a */
+
+/* x = 2.57812500000000000000000000000000000e-01 3ffd0800000000000000000000000000 */
+/* cos(x) = 0.f78a098069792daabc9ee42591b7c5a68cb1ab822aeb446b3311b4ba5371b8970e2c1547ad7 */
+ 9.66950029230677822008341623610531503e-01L, /* 3ffeef141300d2f25b55793dc84b2370 */
+ -4.38972214432792412062088059990480514e-35L, /* bf8cd2cb9a72a3eea8a5dca667725a2d */
+/* sin(x) = 0.414572fd94556e6473d620271388dd47c0ba050cdb5270112e3e370e8c4705ae006426fb5d5 */
+ 2.54965960415878467487556574864872628e-01L, /* 3ffd0515cbf65155b991cf58809c4e23 */
+ 2.20280377918534721005071688328074154e-35L, /* 3f8bd47c0ba050cdb5270112e3e370e9 */
+
+/* x = 2.65625000000000000000000000000000000e-01 3ffd1000000000000000000000000000 */
+/* cos(x) = 0.f7058fde0788dfc805b8fe88789e4f4253e3c50afe8b22f41159620ab5940ff7df9557c0d1f */
+ 9.64928619104771009581074665315748371e-01L, /* 3ffeee0b1fbc0f11bf900b71fd10f13d */
+ -3.66685832670820775002475545602761113e-35L, /* bf8c85ed60e1d7a80ba6e85f7534efaa */
+/* sin(x) = 0.4334033bcd90d6604f5f36c1d4b84451a87150438275b77470b50e5b968fa7962b5ffb379b7 */
+ 2.62512399769153281450949626395692931e-01L, /* 3ffd0cd00cef364359813d7cdb0752e1 */
+ 3.24923677072031064673177178571821843e-36L, /* 3f89146a1c5410e09d6ddd1c2d4396e6 */
+
+/* x = 2.73437500000000000000000000000000000e-01 3ffd1800000000000000000000000000 */
+/* cos(x) = 0.f67d3a26af7d07aa4bd6d42af8c0067fefb96d5b46c031eff53627f215ea3242edc3f2e13eb */
+ 9.62848314709379699899701093480214365e-01L, /* 3ffeecfa744d5efa0f5497ada855f180 */
+ 4.88986966383343450799422013051821394e-36L, /* 3f899ffbee5b56d1b00c7bfd4d89fc85 */
+/* sin(x) = 0.452186aa5377ab20bbf2524f52e3a06a969f47166ab88cf88c111ad12c55941021ef3317a1a */
+ 2.70042816718585031552755063618827102e-01L, /* 3ffd14861aa94ddeac82efc9493d4b8f */
+ -2.37608892440611310321138680065803162e-35L, /* bf8bf956960b8e99547730773eee52ed */
+
+/* x = 2.81250000000000000000000000000000000e-01 3ffd2000000000000000000000000000 */
+/* cos(x) = 0.f5f10a7bb77d3dfa0c1da8b57842783280d01ce3c0f82bae3b9d623c168d2e7c29977994451 */
+ 9.60709243015561903066659350581313472e-01L, /* 3ffeebe214f76efa7bf4183b516af085 */
+ -5.87011558231583960712013351601221840e-36L, /* bf89f35fcbf8c70fc1f5147118a770fa */
+/* sin(x) = 0.470df5931ae1d946076fe0dcff47fe31bb2ede618ebc607821f8462b639e1f4298b5ae87fd3 */
+ 2.77556751646336325922023446828128568e-01L, /* 3ffd1c37d64c6b8765181dbf8373fd20 */
+ -1.35848595468998128214344668770082997e-36L, /* bf87ce44d1219e71439f87de07b9d49c */
+
+/* x = 2.89062500000000000000000000000000000e-01 3ffd2800000000000000000000000000 */
+/* cos(x) = 0.f561030ddd7a78960ea9f4a32c6521554995667f5547bafee9ec48b3155cdb0f7fd00509713 */
+ 9.58511534581228627301969408154919822e-01L, /* 3ffeeac2061bbaf4f12c1d53e94658ca */
+ 2.50770779371636481145735089393154404e-35L, /* 3f8c0aaa4cab33faaa3dd7f74f624599 */
+/* sin(x) = 0.48f948446abcd6b0f7fccb100e7a1b26eccad880b0d24b59948c7cdd49514d44b933e6985c2 */
+ 2.85053745940547424587763033323252561e-01L, /* 3ffd23e52111aaf35ac3dff32c4039e8 */
+ 2.04269325885902918802700123680403749e-35L, /* 3f8bb26eccad880b0d24b59948c7cdd5 */
+
+/* x = 2.96875000000000000000000000000000000e-01 3ffd3000000000000000000000000000 */
+/* cos(x) = 0.f4cd261d3e6c15bb369c8758630d2ac00b7ace2a51c0631bfeb39ed158ba924cc91e259c195 */
+ 9.56255323543175296975599942263028361e-01L, /* 3ffee99a4c3a7cd82b766d390eb0c61a */
+ 3.21616572190865997051103645135837207e-35L, /* 3f8c56005bd671528e0318dff59cf68b */
+/* sin(x) = 0.4ae37710fad27c8aa9c4cf96c03519b9ce07dc08a1471775499f05c29f86190aaebaeb9716e */
+ 2.92533342023327543624702326493913423e-01L, /* 3ffd2b8ddc43eb49f22aa7133e5b00d4 */
+ 1.93539408668704450308003687950685128e-35L, /* 3f8b9b9ce07dc08a1471775499f05c2a */
+
+/* x = 3.04687500000000000000000000000000000e-01 3ffd3800000000000000000000000000 */
+/* cos(x) = 0.f43575f94d4f6b272f5fb76b14d2a64ab52df1ee8ddf7c651034e5b2889305a9ea9015d758a */
+ 9.53940747608894733981324795987611623e-01L, /* 3ffee86aebf29a9ed64e5ebf6ed629a5 */
+ 2.88075689052478602008395972924657164e-35L, /* 3f8c3255a96f8f746efbe32881a72d94 */
+/* sin(x) = 0.4ccc7a50127e1de0cb6b40c302c651f7bded4f9e7702b0471ae0288d091a37391950907202f */
+ 2.99995083378683051163248282011699944e-01L, /* 3ffd3331e94049f877832dad030c0b19 */
+ 1.35174265535697850139283361475571050e-35L, /* 3f8b1f7bded4f9e7702b0471ae0288d1 */
+
+/* x = 3.12500000000000000000000000000000000e-01 3ffd4000000000000000000000000000 */
+/* cos(x) = 0.f399f500c9e9fd37ae9957263dab8877102beb569f101ee4495350868e5847d181d50d3cca2 */
+ 9.51567948048172202145488217364270962e-01L, /* 3ffee733ea0193d3fa6f5d32ae4c7b57 */
+ 6.36842628598115658308749288799884606e-36L, /* 3f8a0ee2057d6ad3e203dc892a6a10d2 */
+/* sin(x) = 0.4eb44a5da74f600207aaa090f0734e288603ffadb3eb2542a46977b105f8547128036dcf7f0 */
+ 3.07438514580380850670502958201982091e-01L, /* 3ffd3ad129769d3d80081eaa8243c1cd */
+ 1.06515172423204645839241099453417152e-35L, /* 3f8ac510c07ff5b67d64a8548d2ef621 */
+
+/* x = 3.20312500000000000000000000000000000e-01 3ffd4800000000000000000000000000 */
+/* cos(x) = 0.f2faa5a1b74e82fd61fa05f9177380e8e69b7b15a945e8e5ae1124bf3d12b0617e03af4fab5 */
+ 9.49137069684463027665847421762105623e-01L, /* 3ffee5f54b436e9d05fac3f40bf22ee7 */
+ 6.84433965991637152250309190468859701e-37L, /* 3f86d1cd36f62b528bd1cb5c22497e7a */
+/* sin(x) = 0.509adf9a7b9a5a0f638a8fa3a60a199418859f18b37169a644fdb986c21ecb00133853bc35b */
+ 3.14863181319745250865036315126939016e-01L, /* 3ffd426b7e69ee69683d8e2a3e8e9828 */
+ 1.92431240212432926993057705062834160e-35L, /* 3f8b99418859f18b37169a644fdb986c */
+
+/* x = 3.28125000000000000000000000000000000e-01 3ffd5000000000000000000000000000 */
+/* cos(x) = 0.f2578a595224dd2e6bfa2eb2f99cc674f5ea6f479eae2eb580186897ae3f893df1113ca06b8 */
+ 9.46648260886053321846099507295532976e-01L, /* 3ffee4af14b2a449ba5cd7f45d65f33a */
+ -4.32906339663000890941529420498824645e-35L, /* bf8ccc5850ac85c30a8e8a53ff3cbb43 */
+/* sin(x) = 0.5280326c3cf481823ba6bb08eac82c2093f2bce3c4eb4ee3dec7df41c92c8a4226098616075 */
+ 3.22268630433386625687745919893188031e-01L, /* 3ffd4a00c9b0f3d20608ee9aec23ab21 */
+ -1.49505897804759263483853908335500228e-35L, /* bf8b3df6c0d431c3b14b11c213820be3 */
+
+/* x = 3.35937500000000000000000000000000000e-01 3ffd5800000000000000000000000000 */
+/* cos(x) = 0.f1b0a5b406b526d886c55feadc8d0dcc8eb9ae2ac707051771b48e05b25b000009660bdb3e3 */
+ 9.44101673557004345630017691253124860e-01L, /* 3ffee3614b680d6a4db10d8abfd5b91a */
+ 1.03812535240120229609822461172145584e-35L, /* 3f8ab991d735c558e0e0a2ee3691c0b6 */
+/* sin(x) = 0.54643b3da29de9b357155eef0f332fb3e66c83bf4dddd9491c5eb8e103ccd92d6175220ed51 */
+ 3.29654409930860171914317725126463176e-01L, /* 3ffd5190ecf68a77a6cd5c557bbc3ccd */
+ -1.22606996784743214973082192294232854e-35L, /* bf8b04c19937c40b22226b6e3a1471f0 */
+
+/* x = 3.43750000000000000000000000000000000e-01 3ffd6000000000000000000000000000 */
+/* cos(x) = 0.f105fa4d66b607a67d44e042725204435142ac8ad54dfb0907a4f6b56b06d98ee60f19e557a */
+ 9.41497463127881068644511236053670815e-01L, /* 3ffee20bf49acd6c0f4cfa89c084e4a4 */
+ 3.20709366603165602071590241054884900e-36L, /* 3f8910d450ab22b5537ec241e93dad5b */
+/* sin(x) = 0.5646f27e8bd65cbe3a5d61ff06572290ee826d9674a00246b05ae26753cdfc90d9ce81a7d02 */
+ 3.37020069022253076261281754173810024e-01L, /* 3ffd591bc9fa2f5972f8e97587fc195d */
+ -2.21435756148839473677777545049890664e-35L, /* bf8bd6f117d92698b5ffdb94fa51d98b */
+
+/* x = 3.51562500000000000000000000000000000e-01 3ffd6800000000000000000000000000 */
+/* cos(x) = 0.f0578ad01ede707fa39c09dc6b984afef74f3dc8d0efb0f4c5a6b13771145b3e0446fe33887 */
+ 9.38835788546265488632578305984712554e-01L, /* 3ffee0af15a03dbce0ff473813b8d731 */
+ -3.98758068773974031348585072752245458e-35L, /* bf8ca808458611b978827859d2ca7644 */
+/* sin(x) = 0.582850a41e1dd46c7f602ea244cdbbbfcdfa8f3189be794dda427ce090b5f85164f1f80ac13 */
+ 3.44365158145698408207172046472223747e-01L, /* 3ffd60a14290787751b1fd80ba891337 */
+ -3.19791885005480924937758467594051927e-36L, /* bf89100c815c339d9061ac896f60c7dc */
+
+/* x = 3.59375000000000000000000000000000000e-01 3ffd7000000000000000000000000000 */
+/* cos(x) = 0.efa559f5ec3aec3a4eb03319278a2d41fcf9189462261125fe6147b078f1daa0b06750a1654 */
+ 9.36116812267055290294237411019508588e-01L, /* 3ffedf4ab3ebd875d8749d6066324f14 */
+ 3.40481591236710658435409862439032162e-35L, /* 3f8c6a0fe7c8c4a31130892ff30a3d84 */
+/* sin(x) = 0.5a084e28e35fda2776dfdbbb5531d74ced2b5d17c0b1afc4647529d50c295e36d8ceec126c1 */
+ 3.51689228994814059222584896955547016e-01L, /* 3ffd682138a38d7f689ddb7f6eed54c7 */
+ 1.75293433418270210567525412802083294e-35L, /* 3f8b74ced2b5d17c0b1afc4647529d51 */
+
+/* x = 3.67187500000000000000000000000000000e-01 3ffd7800000000000000000000000000 */
+/* cos(x) = 0.eeef6a879146af0bf9b95ea2ea0ac0d3e2e4d7e15d93f48cbd41bf8e4fded40bef69e19eafa */
+ 9.33340700242548435655299229469995527e-01L, /* 3ffeddded50f228d5e17f372bd45d416 */
+ -4.75255707251679831124800898831382223e-35L, /* bf8cf960e8d940f513605b9a15f2038e */
+/* sin(x) = 0.5be6e38ce8095542bc14ee9da0d36483e6734bcab2e07624188af5653f114eeb46738fa899d */
+ 3.58991834546065053677710299152868941e-01L, /* 3ffd6f9b8e33a025550af053ba76834e */
+ -2.06772389262723368139416970257112089e-35L, /* bf8bb7c198cb4354d1f89dbe7750a9ac */
+
+/* x = 3.75000000000000000000000000000000000e-01 3ffd8000000000000000000000000000 */
+/* cos(x) = 0.ee35bf5ccac89052cd91ddb734d3a47e262e3b609db604e217053803be0091e76daf28a89b7 */
+ 9.30507621912314291149476792229555481e-01L, /* 3ffedc6b7eb9959120a59b23bb6e69a7 */
+ 2.74541088551732982573335285685416092e-35L, /* 3f8c23f13171db04edb02710b829c01e */
+/* sin(x) = 0.5dc40955d9084f48a94675a2498de5d851320ff5528a6afb3f2e24de240fce6cbed1ba0ccd6 */
+ 3.66272529086047561372909351716264177e-01L, /* 3ffd7710255764213d22a519d6892638 */
+ -1.96768433534936592675897818253108989e-35L, /* bf8ba27aecdf00aad759504c0d1db21e */
+
+/* x = 3.82812500000000000000000000000000000e-01 3ffd8800000000000000000000000000 */
+/* cos(x) = 0.ed785b5c44741b4493c56bcb9d338a151c6f6b85d8f8aca658b28572c162b199680eb9304da */
+ 9.27617750192851909628030798799961350e-01L, /* 3ffedaf0b6b888e83689278ad7973a67 */
+ 7.58520371916345756281201167126854712e-36L, /* 3f8a42a38ded70bb1f1594cb1650ae58 */
+/* sin(x) = 0.5f9fb80f21b53649c432540a50e22c53057ff42ae0fdf1307760dc0093f99c8efeb2fbd7073 */
+ 3.73530868238692946416839752660848112e-01L, /* 3ffd7e7ee03c86d4d92710c950294389 */
+ -1.48023494778986556048879113411517128e-35L, /* bf8b3acfa800bd51f020ecf889f23ff7 */
+
+/* x = 3.90625000000000000000000000000000000e-01 3ffd9000000000000000000000000000 */
+/* cos(x) = 0.ecb7417b8d4ee3fec37aba4073aa48f1f14666006fb431d9671303c8100d10190ec8179c41d */
+ 9.24671261467036098502113014560138771e-01L, /* 3ffed96e82f71a9dc7fd86f57480e755 */
+ -4.14187124860031825108649347251175815e-35L, /* bf8cb87075cccffc825e7134c767e1bf */
+/* sin(x) = 0.6179e84a09a5258a40e9b5face03e525f8b5753cd0105d93fe6298010c3458e84d75fe420e9 */
+ 3.80766408992390192057200703388896675e-01L, /* 3ffd85e7a1282694962903a6d7eb3810 */
+ -2.02009541175208636336924533372496107e-35L, /* bf8bada074a8ac32fefa26c019d67fef */
+
+/* x = 3.98437500000000000000000000000000000e-01 3ffd9800000000000000000000000000 */
+/* cos(x) = 0.ebf274bf0bda4f62447e56a093626798d3013b5942b1abfd155aacc9dc5c6d0806a20d6b9c1 */
+ 9.21668335573351918175411368202712714e-01L, /* 3ffed7e4e97e17b49ec488fcad4126c5 */
+ -1.83587995433957622948710263541479322e-35L, /* bf8b8672cfec4a6bd4e5402eaa553362 */
+/* sin(x) = 0.6352929dd264bd44a02ea766325d8aa8bd9695fc8def3caefba5b94c9a3c873f7b2d3776ead */
+ 3.87978709727025046051079690813741960e-01L, /* 3ffd8d4a4a774992f51280ba9d98c976 */
+ 8.01904783870935075844443278617586301e-36L, /* 3f8a5517b2d2bf91bde795df74b72993 */
+
+/* x = 4.06250000000000000000000000000000000e-01 3ffda000000000000000000000000000 */
+/* cos(x) = 0.eb29f839f201fd13b93796827916a78f15c85230a4e8ea4b21558265a14367e1abb4c30695a */
+ 9.18609155794918267837824977718549863e-01L, /* 3ffed653f073e403fa27726f2d04f22d */
+ 2.97608282778274433460057745798409849e-35L, /* 3f8c3c78ae429185274752590aac132d */
+/* sin(x) = 0.6529afa7d51b129631ec197c0a840a11d7dc5368b0a47956feb285caa8371c4637ef17ef01b */
+ 3.95167330240934236244832640419653657e-01L, /* 3ffd94a6be9f546c4a58c7b065f02a10 */
+ 7.57560031388312550940040194042627704e-36L, /* 3f8a423afb8a6d16148f2adfd650b955 */
+
+/* x = 4.14062500000000000000000000000000000e-01 3ffda800000000000000000000000000 */
+/* cos(x) = 0.ea5dcf0e30cf03e6976ef0b1ec26515fba47383855c3b4055a99b5e86824b2cd1a691fdca7b */
+ 9.15493908848301228563917732180221882e-01L, /* 3ffed4bb9e1c619e07cd2edde163d84d */
+ -3.50775517955306954815090901168305659e-35L, /* bf8c75022dc63e3d51e25fd52b3250bd */
+/* sin(x) = 0.66ff380ba0144109e39a320b0a3fa5fd65ea0585bcbf9b1a769a9b0334576c658139e1a1cbe */
+ 4.02331831777773111217105598880982387e-01L, /* 3ffd9bfce02e805104278e68c82c28ff */
+ -1.95678722882848174723569916504871563e-35L, /* bf8ba029a15fa7a434064e5896564fcd */
+
+/* x = 4.21875000000000000000000000000000000e-01 3ffdb000000000000000000000000000 */
+/* cos(x) = 0.e98dfc6c6be031e60dd3089cbdd18a75b1f6b2c1e97f79225202f03dbea45b07a5ec4efc062 */
+ 9.12322784872117846492029542047341734e-01L, /* 3ffed31bf8d8d7c063cc1ba611397ba3 */
+ 7.86903886556373674267948132178845568e-36L, /* 3f8a4eb63ed6583d2fef244a405e07b8 */
+/* sin(x) = 0.68d32473143327973bc712bcc4ccddc47630d755850c0655243b205934dc49ffed8eb76adcb */
+ 4.09471777053295066122694027011452236e-01L, /* 3ffda34c91cc50cc9e5cef1c4af31333 */
+ 2.23945241468457597921655785729821354e-35L, /* 3f8bdc47630d755850c0655243b20593 */
+
+/* x = 4.29687500000000000000000000000000000e-01 3ffdb800000000000000000000000000 */
+/* cos(x) = 0.e8ba8393eca7821aa563d83491b6101189b3b101c3677f73d7bad7c10f9ee02b7ab4009739a */
+ 9.09095977415431051650381735684476417e-01L, /* 3ffed1750727d94f04354ac7b069236c */
+ 1.20886014028444155733776025085677953e-35L, /* 3f8b01189b3b101c3677f73d7bad7c11 */
+/* sin(x) = 0.6aa56d8e8249db4eb60a761fe3f9e559be456b9e13349ca99b0bfb787f22b95db3b70179615 */
+ 4.16586730282041119259112448831069657e-01L, /* 3ffdaa95b63a09276d3ad829d87f8fe8 */
+ -2.00488106831998813675438269796963612e-35L, /* bf8baa641ba9461eccb635664f404878 */
+
+/* x = 4.37500000000000000000000000000000000e-01 3ffdc000000000000000000000000000 */
+/* cos(x) = 0.e7e367d2956cfb16b6aa11e5419cd0057f5c132a6455bf064297e6a76fe2b72bb630d6d50ff */
+ 9.05813683425936420744516660652700258e-01L, /* 3ffecfc6cfa52ad9f62d6d5423ca833a */
+ -3.60950307605941169775676563004467163e-35L, /* bf8c7fd4051f66acdd5207cdeb40cac5 */
+/* sin(x) = 0.6c760c14c8585a51dbd34660ae6c52ac7036a0b40887a0b63724f8b4414348c3063a637f457 */
+ 4.23676257203938010361683988031102480e-01L, /* 3ffdb1d83053216169476f4d1982b9b1 */
+ 1.40484456388654470329473096579312595e-35L, /* 3f8b2ac7036a0b40887a0b63724f8b44 */
+
+/* x = 4.45312500000000000000000000000000000e-01 3ffdc800000000000000000000000000 */
+/* cos(x) = 0.e708ac84d4172a3e2737662213429e14021074d7e702e77d72a8f1101a7e70410df8273e9aa */
+ 9.02476103237941504925183272675895999e-01L, /* 3ffece115909a82e547c4e6ecc442685 */
+ 2.26282899501344419018306295680210602e-35L, /* 3f8be14021074d7e702e77d72a8f1102 */
+/* sin(x) = 0.6e44f8c36eb10a1c752d093c00f4d47ba446ac4c215d26b0316442f168459e677d06e7249e3 */
+ 4.30739925110803197216321517850849190e-01L, /* 3ffdb913e30dbac42871d4b424f003d3 */
+ 1.54096780001629398850891218396761548e-35L, /* 3f8b47ba446ac4c215d26b0316442f17 */
+
+/* x = 4.53125000000000000000000000000000000e-01 3ffdd000000000000000000000000000 */
+/* cos(x) = 0.e62a551594b970a770b15d41d4c0e483e47aca550111df6966f9e7ac3a94ae49e6a71eb031e */
+ 8.99083440560138456216544929209379307e-01L, /* 3ffecc54aa2b2972e14ee162ba83a982 */
+ -2.06772615490904370666670275154751976e-35L, /* bf8bb7c1b8535aafeee209699061853c */
+/* sin(x) = 0.70122c5ec5028c8cff33abf4fd340ccc382e038379b09cf04f9a52692b10b72586060cbb001 */
+ 4.37777302872755132861618974702796680e-01L, /* 3ffdc048b17b140a3233fcceafd3f4d0 */
+ 9.62794364503442612477117426033922467e-36L, /* 3f8a998705c0706f36139e09f34a4d25 */
+
+/* x = 4.60937500000000000000000000000000000e-01 3ffdd800000000000000000000000000 */
+/* cos(x) = 0.e54864fe33e8575cabf5bd0e5cf1b1a8bc7c0d5f61702450fa6b6539735820dd2603ae355d5 */
+ 8.95635902463170698900570000446256350e-01L, /* 3ffeca90c9fc67d0aeb957eb7a1cb9e3 */
+ 3.73593741659866883088620495542311808e-35L, /* 3f8c8d45e3e06afb0b812287d35b29cc */
+/* sin(x) = 0.71dd9fb1ff4677853acb970a9f6729c6e3aac247b1c57cea66c77413f1f98e8b9e98e49d851 */
+ 4.44787960964527211433056012529525211e-01L, /* 3ffdc7767ec7fd19de14eb2e5c2a7d9d */
+ -1.67187936511493678007508371613954899e-35L, /* bf8b6391c553db84e3a831599388bec1 */
+
+/* x = 4.68750000000000000000000000000000000e-01 3ffde000000000000000000000000000 */
+/* cos(x) = 0.e462dfc670d421ab3d1a15901228f146a0547011202bf5ab01f914431859aef577966bc4fa4 */
+ 8.92133699366994404723900253723788575e-01L, /* 3ffec8c5bf8ce1a843567a342b202452 */
+ -1.10771937602567314732693079264692504e-35L, /* bf8ad72bf571fddbfa814a9fc0dd779d */
+/* sin(x) = 0.73a74b8f52947b681baf6928eb3fb021769bf4779bad0e3aa9b1cdb75ec60aad9fc63ff19d5 */
+ 4.51771471491683776581688750134062870e-01L, /* 3ffdce9d2e3d4a51eda06ebda4a3acff */
+ -1.19387223016472295893794387275284505e-35L, /* bf8afbd12c81710c8a5e38aac9c64914 */
+
+/* x = 4.76562500000000000000000000000000000e-01 3ffde800000000000000000000000000 */
+/* cos(x) = 0.e379c9045f29d517c4808aa497c2057b2b3d109e76c0dc302d4d0698b36e3f0bdbf33d8e952 */
+ 8.88577045028035543317609023116020980e-01L, /* 3ffec6f39208be53aa2f890115492f84 */
+ 4.12354278954664731443813655177022170e-36L, /* 3f895ecacf44279db0370c0b5341a62d */
+/* sin(x) = 0.756f28d011d98528a44a75fc29c779bd734ecdfb582fdb74b68a4c4c4be54cfd0b2d3ad292f */
+ 4.58727408216736592377295028972874773e-01L, /* 3ffdd5bca340476614a29129d7f0a71e */
+ -4.70946994194182908929251719575431779e-36L, /* bf8990a32c4c8129f40922d25d6ceced */
+
+/* x = 4.84375000000000000000000000000000000e-01 3ffdf000000000000000000000000000 */
+/* cos(x) = 0.e28d245c58baef72225e232abc003c4366acd9eb4fc2808c2ab7fe7676cf512ac7f945ae5fb */
+ 8.84966156526143291697296536966647926e-01L, /* 3ffec51a48b8b175dee444bc46557800 */
+ 4.53370570288325630442037826313462165e-35L, /* 3f8ce21b3566cf5a7e14046155bff3b4 */
+/* sin(x) = 0.77353054ca72690d4c6e171fd99e6b39fa8e1ede5f052fd2964534c75340970a3a9cd3c5c32 */
+ 4.65655346585160182681199512507546779e-01L, /* 3ffddcd4c15329c9a43531b85c7f667a */
+ -1.56282598978971872478619772155305961e-35L, /* bf8b4c60571e121a0fad02d69bacb38b */
+
+/* x = 4.92187500000000000000000000000000000e-01 3ffdf800000000000000000000000000 */
+/* cos(x) = 0.e19cf580eeec046aa1422fa74807ecefb2a1911c94e7b5f20a00f70022d940193691e5bd790 */
+ 8.81301254251340599140161908298100173e-01L, /* 3ffec339eb01ddd808d542845f4e9010 */
+ -1.43419192312116687783945619009629445e-35L, /* bf8b3104d5e6ee36b184a0df5ff08ffe */
+/* sin(x) = 0.78f95b0560a9a3bd6df7bd981dc38c61224d08bc20631ea932e605e53b579e9e0767dfcbbcb */
+ 4.72554863751304451146551317808516942e-01L, /* 3ffde3e56c1582a68ef5b7def660770e */
+ 9.31324774957768018850224267625371204e-36L, /* 3f8a8c2449a117840c63d5265cc0bca7 */
+
+/* x = 5.00000000000000000000000000000000000e-01 3ffe0000000000000000000000000000 */
+/* cos(x) = 0.e0a94032dbea7cedbddd9da2fafad98556566b3a89f43eabd72350af3e8b19e801204d8fe2e */
+ 8.77582561890372716116281582603829681e-01L, /* 3ffec1528065b7d4f9db7bbb3b45f5f6 */
+ -2.89484960181363924855192538540698851e-35L, /* bf8c33d54d4ca62bb05e0aa146e57a86 */
+/* sin(x) = 0.7abba1d12c17bfa1d92f0d93f60ded9992f45b4fcaf13cd58b303693d2a0db47db35ae8a3a9 */
+ 4.79425538604203000273287935215571402e-01L, /* 3ffdeaee8744b05efe8764bc364fd838 */
+ -1.38426977616718318950175848639381926e-35L, /* bf8b2666d0ba4b0350ec32a74cfc96c3 */
+
+/* x = 5.07812500000000000000000000000000000e-01 3ffe0400000000000000000000000000 */
+/* cos(x) = 0.dfb20840f3a9b36f7ae2c515342890b5ec583b8366cc2b55029e95094d31112383f2553498b */
+ 8.73810306413054508282556837071377159e-01L, /* 3ffebf641081e75366def5c58a2a6851 */
+ 1.25716864497849302237218128599994785e-35L, /* 3f8b0b5ec583b8366cc2b55029e95095 */
+/* sin(x) = 0.7c7bfdaf13e5ed17212f8a7525bfb113aba6c0741b5362bb8d59282a850b63716bca0c910f0 */
+ 4.86266951793275574311011306895834993e-01L, /* 3ffdf1eff6bc4f97b45c84be29d496ff */
+ -1.12269393250914752644352376448094271e-35L, /* bf8add8a8b27f17c9593a88e54dafaaf */
+
+/* x = 5.15625000000000000000000000000000000e-01 3ffe0800000000000000000000000000 */
+/* cos(x) = 0.deb7518814a7a931bbcc88c109cd41c50bf8bb48f20ae8c36628d1d3d57574f7dc58f27d91c */
+ 8.69984718058417388828915599901466243e-01L, /* 3ffebd6ea310294f526377991182139b */
+ -4.68168638300575626782741319792183837e-35L, /* bf8cf1d7a03a25b86fa8b9e4ceb97161 */
+/* sin(x) = 0.7e3a679daaf25c676542bcb4028d0964172961c921823a4ef0c3a9070d886dbd073f6283699 */
+ 4.93078685753923057265136552753487121e-01L, /* 3ffdf8e99e76abc9719d950af2d00a34 */
+ 7.06498693112535056352301101088624950e-36L, /* 3f8a2c82e52c3924304749de187520e2 */
+
+/* x = 5.23437500000000000000000000000000000e-01 3ffe0c00000000000000000000000000 */
+/* cos(x) = 0.ddb91ff318799172bd2452d0a3889f5169c64a0094bcf0b8aa7dcf0d7640a2eba68955a80be */
+ 8.66106030320656714696616831654267220e-01L, /* 3ffebb723fe630f322e57a48a5a14711 */
+ 2.35610597588322493119667003904687628e-35L, /* 3f8bf5169c64a0094bcf0b8aa7dcf0d7 */
+/* sin(x) = 0.7ff6d8a34bd5e8fa54c97482db5159df1f24e8038419c0b448b9eea8939b5d4dfcf40900257 */
+ 4.99860324733013463819556536946425724e-01L, /* 3ffdffdb628d2f57a3e95325d20b6d45 */
+ 1.94636052312235297538564591686645139e-35L, /* 3f8b9df1f24e8038419c0b448b9eea89 */
+
+/* x = 5.31250000000000000000000000000000000e-01 3ffe1000000000000000000000000000 */
+/* cos(x) = 0.dcb7777ac420705168f31e3eb780ce9c939ecada62843b54522f5407eb7f21e556059fcd734 */
+ 8.62174479934880504367162510253324274e-01L, /* 3ffeb96eeef58840e0a2d1e63c7d6f02 */
+ -3.71556818317533582234562471835771823e-35L, /* bf8c8b1b6309a92cebde255d6e855fc1 */
+/* sin(x) = 0.81b149ce34caa5a4e650f8d09fd4d6aa74206c32ca951a93074c83b2d294d25dbb0f7fdfad2 */
+ 5.06611454814257367642296000893867192e-01L, /* 3ffe0362939c69954b49cca1f1a13faa */
+ -3.10963699824274155702706043065967062e-35L, /* bf8c4aac5efc9e69ab572b67c59be269 */
+
+/* x = 5.39062500000000000000000000000000000e-01 3ffe1400000000000000000000000000 */
+/* cos(x) = 0.dbb25c25b8260c14f6e7bc98ec991b70c65335198b0ab628bad20cc7b229d4dd62183cfa055 */
+ 8.58190306862660347046629564970494649e-01L, /* 3ffeb764b84b704c1829edcf7931d932 */
+ 2.06439574601190798155563653000684861e-35L, /* 3f8bb70c65335198b0ab628bad20cc7b */
+/* sin(x) = 0.8369b434a372da7eb5c8a71fe36ce1e0b2b493f6f5cb2e38bcaec2a556b3678c401940d1c3c */
+ 5.13331663943471218288801270215706878e-01L, /* 3ffe06d3686946e5b4fd6b914e3fc6da */
+ -2.26614796466671970772244932848067224e-35L, /* bf8be1f4d4b6c090a34d1c743513d5ab */
+
+/* x = 5.46875000000000000000000000000000000e-01 3ffe1800000000000000000000000000 */
+/* cos(x) = 0.daa9d20860827063fde51c09e855e9932e1b17143e7244fd267a899d41ae1f3bc6a0ec42e27 */
+ 8.54153754277385385143451785105103176e-01L, /* 3ffeb553a410c104e0c7fbca3813d0ac */
+ -1.68707534013095152873222061722573172e-35L, /* bf8b66cd1e4e8ebc18dbb02d9857662c */
+/* sin(x) = 0.852010f4f0800521378bd8dd614753d080c2e9e0775ffc609947b9132f5357404f464f06a58 */
+ 5.20020541953727004760213699874674730e-01L, /* 3ffe0a4021e9e1000a426f17b1bac28f */
+ -3.32415021330884924833711842866896734e-35L, /* bf8c617bf9e8b0fc45001cfb35c23767 */
+
+/* x = 5.54687500000000000000000000000000000e-01 3ffe1c00000000000000000000000000 */
+/* cos(x) = 0.d99ddd44e44a43d4d4a3a3ed95204106fd54d78e8c7684545c0da0b7c2c72be7a89b7c182ad */
+ 8.50065068549420263957072899177793617e-01L, /* 3ffeb33bba89c89487a9a94747db2a41 */
+ -4.73753917078785974356016104842568442e-35L, /* bf8cf7c81559438b9c4bdd5d1f92fa42 */
+/* sin(x) = 0.86d45935ab396cb4e421e822dee54f3562dfcefeaa782184c23401d231f5ad981a1cc195b18 */
+ 5.26677680590386730710789410624833901e-01L, /* 3ffe0da8b26b5672d969c843d045bdcb */
+ -3.67066148195515214077582496518566735e-35L, /* bf8c8654e901880aac3ef3d9ee5ff16e */
+
+/* x = 5.62500000000000000000000000000000000e-01 3ffe2000000000000000000000000000 */
+/* cos(x) = 0.d88e820b1526311dd561efbc0c1a9a5375eb26f65d246c5744b13ca26a7e0fd42556da843c8 */
+ 8.45924499231067954459723078597493262e-01L, /* 3ffeb11d04162a4c623baac3df781835 */
+ 1.98054947141989878179164342925274053e-35L, /* 3f8ba5375eb26f65d246c5744b13ca27 */
+/* sin(x) = 0.88868625b4e1dbb2313310133022527200c143a5cb16637cb7daf8ade82459ff2e98511f40f */
+ 5.33302673536020173329131103308161529e-01L, /* 3ffe110d0c4b69c3b764626620266045 */
+ -3.42715291319551615996993795226755157e-35L, /* bf8c6c6ff9f5e2d1a74ce41a41283a91 */
+
+/* x = 5.70312500000000000000000000000000000e-01 3ffe2400000000000000000000000000 */
+/* cos(x) = 0.d77bc4985e93a607c9d868b906bbc6bbe3a04258814acb0358468b826fc91bd4d814827f65e */
+ 8.41732299041338366963111794309701085e-01L, /* 3ffeaef78930bd274c0f93b0d1720d78 */
+ -4.30821936750410026005408345400225948e-35L, /* bf8cca20e2fded3bf5a9a7e53dcba3ed */
+/* sin(x) = 0.8a3690fc5bfc11bf9535e2739a8512f448a41251514bbed7fc18d530f9b4650fcbb2861b0aa */
+ 5.39895116435204405041660709903993340e-01L, /* 3ffe146d21f8b7f8237f2a6bc4e7350a */
+ 1.42595803521626714477253741404712093e-35L, /* 3f8b2f448a41251514bbed7fc18d5310 */
+
+/* x = 5.78125000000000000000000000000000000e-01 3ffe2800000000000000000000000000 */
+/* cos(x) = 0.d665a937b4ef2b1f6d51bad6d988a4419c1d7051faf31a9efa151d7631117efac03713f950a */
+ 8.37488723850523685315353348917240617e-01L, /* 3ffeaccb526f69de563edaa375adb311 */
+ 2.72761997872084533045777718677326179e-35L, /* 3f8c220ce0eb828fd798d4f7d0a8ebb2 */
+/* sin(x) = 0.8be472f9776d809af2b88171243d63d66dfceeeb739cc894e023fbc165a0e3f26ff729c5d57 */
+ 5.46454606919203564403349553749411001e-01L, /* 3ffe17c8e5f2eedb0135e57102e2487b */
+ -2.11870230730160315420936523771864858e-35L, /* bf8bc29920311148c63376b1fdc043ea */
+
+/* x = 5.85937500000000000000000000000000000e-01 3ffe2c00000000000000000000000000 */
+/* cos(x) = 0.d54c3441844897fc8f853f0655f1ba695eba9fbfd7439dbb1171d862d9d9146ca5136f825ac */
+ 8.33194032664581363070224042208032321e-01L, /* 3ffeaa98688308912ff91f0a7e0cabe3 */
+ 4.39440050052045486567668031751259899e-35L, /* 3f8cd34af5d4fdfeba1cedd88b8ec317 */
+/* sin(x) = 0.8d902565817ee7839bce3cd128060119492cd36d42d82ada30d7f8bde91324808377ddbf5d4 */
+ 5.52980744630527369849695082681623667e-01L, /* 3ffe1b204acb02fdcf07379c79a2500c */
+ 8.26624790417342895897164123189984127e-37L, /* 3f8719492cd36d42d82ada30d7f8bde9 */
+
+/* x = 5.93750000000000000000000000000000000e-01 3ffe3000000000000000000000000000 */
+/* cos(x) = 0.d42f6a1b9f0168cdf031c2f63c8d9304d86f8d34cb1d5fccb68ca0f2241427fc18d1fd5bbdf */
+ 8.28848487609325734810171790119116638e-01L, /* 3ffea85ed4373e02d19be06385ec791b */
+ 1.43082508100496581719048175506239770e-35L, /* 3f8b304d86f8d34cb1d5fccb68ca0f22 */
+/* sin(x) = 0.8f39a191b2ba6122a3fa4f41d5a3ffd421417d46f19a22230a14f7fcc8fce5c75b4b28b29d1 */
+ 5.59473131247366877384844006003116688e-01L, /* 3ffe1e7343236574c24547f49e83ab48 */
+ -1.28922620524163922306886952100992796e-37L, /* bf845ef5f415c8732eeee7af584019b8 */
+
+/* x = 6.01562500000000000000000000000000000e-01 3ffe3400000000000000000000000000 */
+/* cos(x) = 0.d30f4f392c357ab0661c5fa8a7d9b26627846fef214b1d19a22379ff9eddba087cf410eb097 */
+ 8.24452353914429207485643598212356053e-01L, /* 3ffea61e9e72586af560cc38bf514fb3 */
+ 3.79160239225080026987031418939026741e-35L, /* 3f8c93313c237f790a58e8cd111bcffd */
+/* sin(x) = 0.90e0e0d81ca678796cc92c8ea8c2815bc72ca78abe571bfa8576aacc571e096a33237e0e830 */
+ 5.65931370507905990773159095689276114e-01L, /* 3ffe21c1c1b0394cf0f2d992591d5185 */
+ 1.02202775968053982310991962521535027e-36L, /* 3f875bc72ca78abe571bfa8576aacc57 */
+
+/* x = 6.09375000000000000000000000000000000e-01 3ffe3800000000000000000000000000 */
+/* cos(x) = 0.d1ebe81a95ee752e48a26bcd32d6e922d7eb44b8ad2232f6930795e84b56317269b9dd1dfa6 */
+ 8.20005899897234008255550633876556043e-01L, /* 3ffea3d7d0352bdcea5c9144d79a65ae */
+ -1.72008811955230823416724332297991247e-35L, /* bf8b6dd2814bb4752ddcd096cf86a17b */
+/* sin(x) = 0.9285dc9bc45dd9ea3d02457bcce59c4175aab6ff7929a8d287195525fdace200dba032874fb */
+ 5.72355068234507240384953706824503608e-01L, /* 3ffe250bb93788bbb3d47a048af799cb */
+ 2.12572273479933123944580199464514529e-35L, /* 3f8bc4175aab6ff7929a8d2871955260 */
+
+/* x = 6.17187500000000000000000000000000000e-01 3ffe3c00000000000000000000000000 */
+/* cos(x) = 0.d0c5394d772228195e25736c03574707de0af1ca344b13bd3914bfe27518e9e426f5deff1e1 */
+ 8.15509396946375476876345384201386217e-01L, /* 3ffea18a729aee445032bc4ae6d806af */
+ -4.28589138410712954051679139949341961e-35L, /* bf8cc7c10fa871ae5da76216375a00ec */
+/* sin(x) = 0.94288e48bd0335fc41c4cbd2920497a8f5d1d8185c99fa0081f90c27e2a53ffdd208a0dbe69 */
+ 5.78743832357770354521111378581385347e-01L, /* 3ffe28511c917a066bf8838997a52409 */
+ 1.77998063432551282609698670002456093e-35L, /* 3f8b7a8f5d1d8185c99fa0081f90c27e */
+
+/* x = 6.25000000000000000000000000000000000e-01 3ffe4000000000000000000000000000 */
+/* cos(x) = 0.cf9b476c897c25c5bfe750dd3f308eaf7bcc1ed00179a256870f4200445043dcdb1974b5878 */
+ 8.10963119505217902189534803941080724e-01L, /* 3ffe9f368ed912f84b8b7fcea1ba7e61 */
+ 1.10481292856794436426051402418804358e-35L, /* 3f8ad5ef7983da002f344ad0e1e84009 */
+/* sin(x) = 0.95c8ef544210ec0b91c49bd2aa09e8515fa61a156ebb10f5f8c232a6445b61ebf3c2ec268f9 */
+ 5.85097272940462154805399314150080459e-01L, /* 3ffe2b91dea88421d817238937a55414 */
+ -1.78164576278056195136525335403380464e-35L, /* bf8b7aea059e5ea9144ef0a073dcd59c */
+
+/* x = 6.32812500000000000000000000000000000e-01 3ffe4400000000000000000000000000 */
+/* cos(x) = 0.ce6e171f92f2e27f32225327ec440ddaefae248413efc0e58ceee1ae369aabe73f88c87ed1a */
+ 8.06367345055103913698795406077297399e-01L, /* 3ffe9cdc2e3f25e5c4fe6444a64fd888 */
+ 1.04235088143133625463876245029180850e-35L, /* 3f8abb5df5c490827df81cb19ddc35c7 */
+/* sin(x) = 0.9766f93cd18413a6aafc1cfc6fc28abb6817bf94ce349901ae3f48c3215d3eb60acc5f78903 */
+ 5.91415002201316315087000225758031236e-01L, /* 3ffe2ecdf279a308274d55f839f8df85 */
+ 8.07390238063560077355762466502569603e-36L, /* 3f8a576d02f7f299c6932035c7e91864 */
+
+/* x = 6.40625000000000000000000000000000000e-01 3ffe4800000000000000000000000000 */
+/* cos(x) = 0.cd3dad1b5328a2e459f993f4f5108819faccbc4eeba9604e81c7adad51cc8a2561631a06826 */
+ 8.01722354098418450607492605652964208e-01L, /* 3ffe9a7b5a36a65145c8b3f327e9ea21 */
+ 6.09487851305233089325627939458963741e-36L, /* 3f8a033f599789dd752c09d038f5b5aa */
+/* sin(x) = 0.9902a58a45e27bed68412b426b675ed503f54d14c8172e0d373f42cadf04daf67319a7f94be */
+ 5.97696634538701531238647618967334337e-01L, /* 3ffe32054b148bc4f7dad0825684d6cf */
+ -2.49527608940873714527427941350461554e-35L, /* bf8c0957e0559759bf468f964605e9a9 */
+
+/* x = 6.48437500000000000000000000000000000e-01 3ffe4c00000000000000000000000000 */
+/* cos(x) = 0.cc0a0e21709883a3ff00911e11a07ee3bd7ea2b04e081be99be0264791170761ae64b8b744a */
+ 7.97028430141468342004642741431945296e-01L, /* 3ffe98141c42e1310747fe01223c2341 */
+ -8.35364432831812599727083251866305534e-37L, /* bf871c42815d4fb1f7e416641fd9b86f */
+/* sin(x) = 0.9a9bedcdf01b38d993f3d7820781de292033ead73b89e28f39313dbe3a6e463f845b5fa8490 */
+ 6.03941786554156657267270287527367726e-01L, /* 3ffe3537db9be03671b327e7af040f04 */
+ -2.54578992328947177770363936132309779e-35L, /* bf8c0eb6fe60a94623b0eb863676120e */
+
+/* x = 6.56250000000000000000000000000000000e-01 3ffe5000000000000000000000000000 */
+/* cos(x) = 0.cad33f00658fe5e8204bbc0f3a66a0e6a773f87987a780b243d7be83b3db1448ca0e0e62787 */
+ 7.92285859677178543141501323781709399e-01L, /* 3ffe95a67e00cb1fcbd04097781e74cd */
+ 2.47519558228473167879248891673807645e-35L, /* 3f8c07353b9fc3cc3d3c05921ebdf41e */
+/* sin(x) = 0.9c32cba2b14156ef05256c4f857991ca6a547cd7ceb1ac8a8e62a282bd7b9183648a462bd04 */
+ 6.10150077075791371273742393566183220e-01L, /* 3ffe386597456282adde0a4ad89f0af3 */
+ 1.33842237929938963780969418369150532e-35L, /* 3f8b1ca6a547cd7ceb1ac8a8e62a282c */
+
+/* x = 6.64062500000000000000000000000000000e-01 3ffe5400000000000000000000000000 */
+/* cos(x) = 0.c99944936cf48c8911ff93fe64b3ddb7981e414bdaf6aae1203577de44878c62bc3bc9cf7b9 */
+ 7.87494932167606083931328295965533034e-01L, /* 3ffe93328926d9e9191223ff27fcc968 */
+ -2.57915385618070637156514241185180920e-35L, /* bf8c12433f0df5a1284aa8f6fe54410e */
+/* sin(x) = 0.9dc738ad14204e689ac582d0f85826590feece34886cfefe2e08cf2bb8488d55424dc9d3525 */
+ 6.16321127181550943005700433761731837e-01L, /* 3ffe3b8e715a28409cd1358b05a1f0b0 */
+ 2.88497530050197716298085892460478666e-35L, /* 3f8c32c87f7671a44367f7f17046795e */
+
+/* x = 6.71875000000000000000000000000000000e-01 3ffe5800000000000000000000000000 */
+/* cos(x) = 0.c85c23c26ed7b6f014ef546c47929682122876bfbf157de0aff3c4247d820c746e32cd4174f */
+ 7.82655940026272796930787447428139026e-01L, /* 3ffe90b84784ddaf6de029dea8d88f25 */
+ 1.69332045679237919427807771288506254e-35L, /* 3f8b682122876bfbf157de0aff3c4248 */
+/* sin(x) = 0.9f592e9b66a9cf906a3c7aa3c10199849040c45ec3f0a747597311038101780c5f266059dbf */
+ 6.22454560222343683041926705090443330e-01L, /* 3ffe3eb25d36cd539f20d478f5478203 */
+ 1.91974786921147072717621236192269859e-35L, /* 3f8b9849040c45ec3f0a747597311038 */
+
+/* x = 6.79687500000000000000000000000000000e-01 3ffe5c00000000000000000000000000 */
+/* cos(x) = 0.c71be181ecd6875ce2da5615a03cca207d9adcb9dfb0a1d6c40a4f0056437f1a59ccddd06ee */
+ 7.77769178600317903122203513685412863e-01L, /* 3ffe8e37c303d9ad0eb9c5b4ac2b407a */
+ -4.05296033424632846931240580239929672e-35L, /* bf8caefc13291a31027af149dfad87fd */
+/* sin(x) = 0.a0e8a725d33c828c11fa50fd9e9a15ffecfad43f3e534358076b9b0f6865694842b1e8c67dc */
+ 6.28550001845029662028004327939032867e-01L, /* 3ffe41d14e4ba679051823f4a1fb3d34 */
+ 1.65507421184028099672784511397428852e-35L, /* 3f8b5ffecfad43f3e534358076b9b0f7 */
+
+/* x = 6.87500000000000000000000000000000000e-01 3ffe6000000000000000000000000000 */
+/* cos(x) = 0.c5d882d2ee48030c7c07d28e981e34804f82ed4cf93655d2365389b716de6ad44676a1cc5da */
+ 7.72834946152471544810851845913425178e-01L, /* 3ffe8bb105a5dc900618f80fa51d303c */
+ 3.94975229341211664237241534741146939e-35L, /* 3f8ca4027c176a67c9b2ae91b29c4db9 */
+/* sin(x) = 0.a2759c0e79c35582527c32b55f5405c182c66160cb1d9eb7bb0b7cdf4ad66f317bda4332914 */
+ 6.34607080015269296850309914203671436e-01L, /* 3ffe44eb381cf386ab04a4f8656abea8 */
+ 4.33025916939968369326060156455927002e-36L, /* 3f897060b1985832c767adeec2df37d3 */
+
+/* x = 6.95312500000000000000000000000000000e-01 3ffe6400000000000000000000000000 */
+/* cos(x) = 0.c4920cc2ec38fb891b38827db08884fc66371ac4c2052ca8885b981bbcfd3bb7b093ee31515 */
+ 7.67853543842850365879920759114193964e-01L, /* 3ffe89241985d871f712367104fb6111 */
+ 3.75100035267325597157244776081706979e-36L, /* 3f893f198dc6b130814b2a2216e606ef */
+/* sin(x) = 0.a400072188acf49cd6b173825e038346f105e1301afe642bcc364cea455e21e506e3e927ed8 */
+ 6.40625425040230409188409779413961021e-01L, /* 3ffe48000e431159e939ad62e704bc07 */
+ 2.46542747294664049615806500747173281e-36L, /* 3f88a37882f0980d7f3215e61b267523 */
+
+/* x = 7.03125000000000000000000000000000000e-01 3ffe6800000000000000000000000000 */
+/* cos(x) = 0.c348846bbd3631338ffe2bfe9dd1381a35b4e9c0c51b4c13fe376bad1bf5caacc4542be0aa9 */
+ 7.62825275710576250507098753625429792e-01L, /* 3ffe869108d77a6c62671ffc57fd3ba2 */
+ 4.22067411888601505004748939382325080e-35L, /* 3f8cc0d1ada74e0628da609ff1bb5d69 */
+/* sin(x) = 0.a587e23555bb08086d02b9c662cdd29316c3e9bd08d93793634a21b1810cce73bdb97a99b9e */
+ 6.46604669591152370524042159882800763e-01L, /* 3ffe4b0fc46aab761010da05738cc59c */
+ -3.41742981816219412415674365946079826e-35L, /* bf8c6b6749e0b217b9364364e5aef274 */
+
+/* x = 7.10937500000000000000000000000000000e-01 3ffe6c00000000000000000000000000 */
+/* cos(x) = 0.c1fbeef380e4ffdd5a613ec8722f643ffe814ec2343e53adb549627224fdc9f2a7b77d3d69f */
+ 7.57750448655219342240234832230493361e-01L, /* 3ffe83f7dde701c9ffbab4c27d90e45f */
+ -2.08767968311222650582659938787920125e-35L, /* bf8bbc0017eb13dcbc1ac524ab69d8de */
+/* sin(x) = 0.a70d272a76a8d4b6da0ec90712bb748b96dabf88c3079246f3db7eea6e58ead4ed0e2843303 */
+ 6.52544448725765956407573982284767763e-01L, /* 3ffe4e1a4e54ed51a96db41d920e2577 */
+ -8.61758060284379660697102362141557170e-36L, /* bf8a6e8d24a80ee79f0db721849022b2 */
+
+/* x = 7.18750000000000000000000000000000000e-01 3ffe7000000000000000000000000000 */
+/* cos(x) = 0.c0ac518c8b6ae710ba37a3eeb90cb15aebcb8bed4356fb507a48a6e97de9aa6d9660116b436 */
+ 7.52629372418066476054541324847143116e-01L, /* 3ffe8158a31916d5ce21746f47dd7219 */
+ 3.71306958657663189665450864311104571e-35L, /* 3f8c8ad75e5c5f6a1ab7da83d245374c */
+/* sin(x) = 0.a88fcfebd9a8dd47e2f3c76ef9e2439920f7e7fbe735f8bcc985491ec6f12a2d4214f8cfa99 */
+ 6.58444399910567541589583954884041989e-01L, /* 3ffe511f9fd7b351ba8fc5e78eddf3c5 */
+ -4.54412944084300330523721391865787219e-35L, /* bf8ce336f840c020c6503a19b3d5b70a */
+
+/* x = 7.26562500000000000000000000000000000e-01 3ffe7400000000000000000000000000 */
+/* cos(x) = 0.bf59b17550a4406875969296567cf3e3b4e483061877c02811c6cae85fad5a6c3da58f49292 */
+ 7.47462359563216166669700384714767552e-01L, /* 3ffe7eb362eaa14880d0eb2d252cacfa */
+ -9.11094340926220027288083639048016945e-36L, /* bf8a8389636f9f3cf107fafdc726a2f4 */
+/* sin(x) = 0.aa0fd66eddb921232c28520d3911b8a03193b47f187f1471ac216fbcd5bb81029294d3a73f1 */
+ 6.64304163042946276515506587432846246e-01L, /* 3ffe541facddbb7242465850a41a7223 */
+ 4.26004843895378210155889028714676019e-35L, /* 3f8cc5018c9da3f8c3f8a38d610b7de7 */
+
+/* x = 7.34375000000000000000000000000000000e-01 3ffe7800000000000000000000000000 */
+/* cos(x) = 0.be0413f84f2a771c614946a88cbf4da1d75a5560243de8f2283fefa0ea4a48468a52d51d8b3 */
+ 7.42249725458501306991347253449610537e-01L, /* 3ffe7c0827f09e54ee38c2928d51197f */
+ -3.78925270049800913539923473871287550e-35L, /* bf8c92f1452d54fede10b86ebe0082f9 */
+/* sin(x) = 0.ab8d34b36acd987210ed343ec65d7e3adc2e7109fce43d55c8d57dfdf55b9e01d2cc1f1b9ec */
+ 6.70123380473162894654531583500648495e-01L, /* 3ffe571a6966d59b30e421da687d8cbb */
+ -1.33165852952743729897634069393684656e-36L, /* bf87c523d18ef6031bc2aa372a82020b */
+
+/* x = 7.42187500000000000000000000000000000e-01 3ffe7c00000000000000000000000000 */
+/* cos(x) = 0.bcab7e6bfb2a14a9b122c574a376bec98ab14808c64a4e731b34047e217611013ac99c0f25d */
+ 7.36991788256240741057089385586450844e-01L, /* 3ffe7956fcd7f654295362458ae946ed */
+ 4.72358938637974850573747497460125519e-35L, /* 3f8cf64c558a404632527398d9a023f1 */
+/* sin(x) = 0.ad07e4c409d08c4fa3a9057bb0ac24b8636e74e76f51e09bd6b2319707cbd9f5e254643897a */
+ 6.75901697026178809189642203142423973e-01L, /* 3ffe5a0fc98813a1189f47520af76158 */
+ 2.76252586616364878801928456702948857e-35L, /* 3f8c25c31b73a73b7a8f04deb5918cb8 */
+
+/* x = 7.50000000000000000000000000000000000e-01 3ffe8000000000000000000000000000 */
+/* cos(x) = 0.bb4ff632a908f73ec151839cb9d993b4e0bfb8f20e7e44e6e4aee845e35575c3106dbe6fd06 */
+ 7.31688868873820886311838753000084529e-01L, /* 3ffe769fec655211ee7d82a3073973b3 */
+ 1.48255637548931697184991710293198620e-35L, /* 3f8b3b4e0bfb8f20e7e44e6e4aee845e */
+/* sin(x) = 0.ae7fe0b5fc786b2d966e1d6af140a488476747c2646425fc7533f532cd044cb10a971a49a6a */
+ 6.81638760023334166733241952779893908e-01L, /* 3ffe5cffc16bf8f0d65b2cdc3ad5e281 */
+ 2.74838775935027549024224114338667371e-35L, /* 3f8c24423b3a3e1323212fe3a99fa996 */
+
+/* x = 7.57812500000000000000000000000000000e-01 3ffe8400000000000000000000000000 */
+/* cos(x) = 0.b9f180ba77dd0751628e135a9508299012230f14becacdd14c3f8862d122de5b56d55b53360 */
+ 7.26341290974108590410147630237598973e-01L, /* 3ffe73e30174efba0ea2c51c26b52a10 */
+ 3.12683579338351123545814364980658990e-35L, /* 3f8c4c80911878a5f6566e8a61fc4317 */
+/* sin(x) = 0.aff522a954f2ba16d9defdc416e33f5e9a5dfd5a6c228e0abc4d521327ff6e2517a7b3851dd */
+ 6.87334219303873534951703613035647220e-01L, /* 3ffe5fea4552a9e5742db3bdfb882dc6 */
+ 4.76739454455410744997012795035529128e-35L, /* 3f8cfaf4d2efead361147055e26a9099 */
+
+/* x = 7.65625000000000000000000000000000000e-01 3ffe8800000000000000000000000000 */
+/* cos(x) = 0.b890237d3bb3c284b614a0539016bfa1053730bbdf940fa895e185f8e58884d3dda15e63371 */
+ 7.20949380945696418043812784148447688e-01L, /* 3ffe712046fa776785096c2940a7202d */
+ 4.78691285733673379499536326050811832e-35L, /* 3f8cfd0829b985defca07d44af0c2fc7 */
+/* sin(x) = 0.b167a4c90d63c4244cf5493b7cc23bd3c3c1225e078baa0c53d6d400b926281f537a1a260e6 */
+ 6.92987727246317910281815490823048210e-01L, /* 3ffe62cf49921ac7884899ea9276f984 */
+ 4.50089871077663557180849219529189918e-35L, /* 3f8cde9e1e0912f03c5d50629eb6a006 */
+
+/* x = 7.73437500000000000000000000000000000e-01 3ffe8c00000000000000000000000000 */
+/* cos(x) = 0.b72be40067aaf2c050dbdb7a14c3d7d4f203f6b3f0224a4afe55d6ec8e92b508fd5c5984b3b */
+ 7.15513467882981573520620561289896903e-01L, /* 3ffe6e57c800cf55e580a1b7b6f42988 */
+ -3.02191815581445336509438104625489192e-35L, /* bf8c41586fe04a607eedada80d51489c */
+/* sin(x) = 0.b2d7614b1f3aaa24df2d6e20a77e1ca3e6d838c03e29c1bcb026e6733324815fadc9eb89674 */
+ 6.98598938789681741301929277107891591e-01L, /* 3ffe65aec2963e755449be5adc414efc */
+ 2.15465226809256290914423429408722521e-35L, /* 3f8bca3e6d838c03e29c1bcb026e6733 */
+
+/* x = 7.81250000000000000000000000000000000e-01 3ffe9000000000000000000000000000 */
+/* cos(x) = 0.b5c4c7d4f7dae915ac786ccf4b1a498d3e73b6e5e74fe7519d9c53ee6d6b90e881bddfc33e1 */
+ 7.10033883566079674974121643959490219e-01L, /* 3ffe6b898fa9efb5d22b58f0d99e9635 */
+ -4.09623224763692443220896752907902465e-35L, /* bf8cb3960c6248d0c580c573131d608d */
+/* sin(x) = 0.b44452709a59752905913765434a59d111f0433eb2b133f7d103207e2aeb4aae111ddc385b3 */
+ 7.04167511454533672780059509973942844e-01L, /* 3ffe6888a4e134b2ea520b226eca8695 */
+ -2.87259372740393348676633610275598640e-35L, /* bf8c3177707de60a6a76604177e6fc0f */
+
+/* x = 7.89062500000000000000000000000000000e-01 3ffe9400000000000000000000000000 */
+/* cos(x) = 0.b45ad4975b1294cadca4cf40ec8f22a68cd14b175835239a37e63acb85e8e9505215df18140 */
+ 7.04510962440574606164129481545916976e-01L, /* 3ffe68b5a92eb6252995b9499e81d91e */
+ 2.60682037357042658395360726992048803e-35L, /* 3f8c1534668a58bac1a91cd1bf31d65c */
+/* sin(x) = 0.b5ae7285bc10cf515753847e8f8b7a30e0a580d929d770103509880680f7b8b0e8ad23b65d8 */
+ 7.09693105363899724959669028139035515e-01L, /* 3ffe6b5ce50b78219ea2aea708fd1f17 */
+ -4.37026016974122945368562319136420097e-36L, /* bf8973c7d69fc9b58a23fbf2bd9dfe60 */
+};
diff --git a/gnulib/lib/sinf.c b/gnulib/lib/sinf.c
new file mode 100644
index 0000000..e6a1d55
--- /dev/null
+++ b/gnulib/lib/sinf.c
@@ -0,0 +1,26 @@
+/* Sine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+sinf (float x)
+{
+ return (float) sin ((double) x);
+}
diff --git a/gnulib/lib/sinhf.c b/gnulib/lib/sinhf.c
new file mode 100644
index 0000000..e44f30b
--- /dev/null
+++ b/gnulib/lib/sinhf.c
@@ -0,0 +1,26 @@
+/* Hyperbolic sine function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+sinhf (float x)
+{
+ return (float) sinh ((double) x);
+}
diff --git a/gnulib/lib/sinl.c b/gnulib/lib/sinl.c
new file mode 100644
index 0000000..3949e49
--- /dev/null
+++ b/gnulib/lib/sinl.c
@@ -0,0 +1,116 @@
+/* s_sinl.c -- long double version of s_sin.c.
+ * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+sinl (long double x)
+{
+ return sin (x);
+}
+
+#else
+
+/* sinl(x)
+ * Return sine function of x.
+ *
+ * kernel function:
+ * __kernel_sinl ... sine function on [-pi/4,pi/4]
+ * __kernel_cosl ... cose function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+# include "trigl.h"
+
+long double
+sinl (long double x)
+{
+ long double y[2], z = 0.0L;
+ int n;
+
+ /* sinl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if (x >= -0.7853981633974483096156608458198757210492
+ && x <= 0.7853981633974483096156608458198757210492)
+ return kernel_sinl (x, z, 0);
+
+ /* sinl(Inf) is NaN, sinl(0) is 0 */
+ else if (x + x == x)
+ return x - x; /* NaN */
+
+ /* argument reduction needed */
+ else
+ {
+ n = ieee754_rem_pio2l (x, y);
+ switch (n & 3)
+ {
+ case 0:
+ return kernel_sinl (y[0], y[1], 1);
+ case 1:
+ return kernel_cosl (y[0], y[1]);
+ case 2:
+ return -kernel_sinl (y[0], y[1], 1);
+ default:
+ return -kernel_cosl (y[0], y[1]);
+ }
+ }
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *29));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *2));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *30));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *4));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *32));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *2/3));
+ printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *4/3));
+}
+#endif
diff --git a/gnulib/lib/size_max.h b/gnulib/lib/size_max.h
new file mode 100644
index 0000000..6becfb1
--- /dev/null
+++ b/gnulib/lib/size_max.h
@@ -0,0 +1,31 @@
+/* size_max.h -- declare SIZE_MAX through system headers
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef GNULIB_SIZE_MAX_H
+#define GNULIB_SIZE_MAX_H
+
+/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
+# include <limits.h>
+/* Get SIZE_MAX declaration on systems like glibc 2. */
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+/* On systems where these include files don't define it, SIZE_MAX is defined
+ in config.h. */
+
+#endif /* GNULIB_SIZE_MAX_H */
diff --git a/gnulib/lib/sleep.c b/gnulib/lib/sleep.c
new file mode 100644
index 0000000..45b9d80
--- /dev/null
+++ b/gnulib/lib/sleep.c
@@ -0,0 +1,76 @@
+/* Pausing execution of the current thread.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <limits.h>
+
+#include "verify.h"
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+unsigned int
+sleep (unsigned int seconds)
+{
+ unsigned int remaining;
+
+ /* Sleep for 1 second many times, because
+ 1. Sleep is not interruptiple by Ctrl-C,
+ 2. we want to avoid arithmetic overflow while multiplying with 1000. */
+ for (remaining = seconds; remaining > 0; remaining--)
+ Sleep (1000);
+
+ return remaining;
+}
+
+#elif HAVE_SLEEP
+
+# undef sleep
+
+/* Guarantee unlimited sleep and a reasonable return value. Cygwin
+ 1.5.x rejects attempts to sleep more than 49.7 days (2**32
+ milliseconds), but uses uninitialized memory which results in a
+ garbage answer. Similarly, Linux 2.6.9 with glibc 2.3.4 has a too
+ small return value when asked to sleep more than 24.85 days. */
+unsigned int
+rpl_sleep (unsigned int seconds)
+{
+ /* This requires int larger than 16 bits. */
+ verify (UINT_MAX / 24 / 24 / 60 / 60);
+ const unsigned int limit = 24 * 24 * 60 * 60;
+ while (limit < seconds)
+ {
+ unsigned int result;
+ seconds -= limit;
+ result = sleep (limit);
+ if (result)
+ return seconds + result;
+ }
+ return sleep (seconds);
+}
+
+#else /* !HAVE_SLEEP */
+
+ #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
+
+#endif
diff --git a/gnulib/lib/snprintf.c b/gnulib/lib/snprintf.c
new file mode 100644
index 0000000..dc435a0
--- /dev/null
+++ b/gnulib/lib/snprintf.c
@@ -0,0 +1,72 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Paul Eggert.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to sprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+snprintf (char *str, size_t size, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (INT_MAX < len)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/socket.c b/gnulib/lib/socket.c
new file mode 100644
index 0000000..af6be25
--- /dev/null
+++ b/gnulib/lib/socket.c
@@ -0,0 +1,49 @@
+/* socket.c --- wrappers for Windows socket function
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#include "sockets.h"
+
+int
+rpl_socket (int domain, int type, int protocol)
+{
+ SOCKET fh;
+
+ gl_sockets_startup (SOCKETS_1_1);
+
+ /* We have to use WSASocket() to create non-overlapped IO sockets.
+ Overlapped IO sockets cannot be used with read/write. */
+ fh = WSASocket (domain, type, protocol, NULL, 0, 0);
+
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+}
diff --git a/gnulib/lib/sockets.c b/gnulib/lib/sockets.c
new file mode 100644
index 0000000..39939b0
--- /dev/null
+++ b/gnulib/lib/sockets.c
@@ -0,0 +1,154 @@
+/* sockets.c --- wrappers for Windows socket functions
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson */
+
+#include <config.h>
+
+/* Specification. */
+#include "sockets.h"
+
+#if WINDOWS_SOCKETS
+
+/* This includes winsock2.h on MinGW. */
+# include <sys/socket.h>
+
+# include "fd-hook.h"
+# include "msvc-nothrow.h"
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+# include "w32sock.h"
+
+static int
+close_fd_maybe_socket (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd)
+{
+ /* Note about multithread-safety: There is a race condition where, between
+ our calls to closesocket() and the primary close(), some other thread
+ could make system calls that allocate precisely the same HANDLE value
+ as sock; then the primary close() would call CloseHandle() on it. */
+ SOCKET sock;
+ WSANETWORKEVENTS ev;
+
+ /* Test whether fd refers to a socket. */
+ sock = FD_TO_SOCKET (fd);
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents (sock, NULL, &ev);
+ if (ev.lNetworkEvents != 0xDEADBEEF)
+ {
+ /* fd refers to a socket. */
+ /* FIXME: other applications, like squid, use an undocumented
+ _free_osfhnd free function. But this is not enough: The 'osfile'
+ flags for fd also needs to be cleared, but it is hard to access it.
+ Instead, here we just close twice the file descriptor. */
+ if (closesocket (sock))
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ {
+ /* This call frees the file descriptor and does a
+ CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */
+ _close (fd);
+ return 0;
+ }
+ }
+ else
+ /* Some other type of file descriptor. */
+ return execute_close_hooks (remaining_list, primary, fd);
+}
+
+static int
+ioctl_fd_maybe_socket (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ SOCKET sock;
+ WSANETWORKEVENTS ev;
+
+ /* Test whether fd refers to a socket. */
+ sock = FD_TO_SOCKET (fd);
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents (sock, NULL, &ev);
+ if (ev.lNetworkEvents != 0xDEADBEEF)
+ {
+ /* fd refers to a socket. */
+ if (ioctlsocket (sock, request, arg) < 0)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return 0;
+ }
+ else
+ /* Some other type of file descriptor. */
+ return execute_ioctl_hooks (remaining_list, primary, fd, request, arg);
+}
+
+static struct fd_hook fd_sockets_hook;
+
+static int initialized_sockets_version /* = 0 */;
+
+#endif /* WINDOWS_SOCKETS */
+
+int
+gl_sockets_startup (int version _GL_UNUSED)
+{
+#if WINDOWS_SOCKETS
+ if (version > initialized_sockets_version)
+ {
+ WSADATA data;
+ int err;
+
+ err = WSAStartup (version, &data);
+ if (err != 0)
+ return 1;
+
+ if (data.wVersion < version)
+ return 2;
+
+ if (initialized_sockets_version == 0)
+ register_fd_hook (close_fd_maybe_socket, ioctl_fd_maybe_socket,
+ &fd_sockets_hook);
+
+ initialized_sockets_version = version;
+ }
+#endif
+
+ return 0;
+}
+
+int
+gl_sockets_cleanup (void)
+{
+#if WINDOWS_SOCKETS
+ int err;
+
+ initialized_sockets_version = 0;
+
+ unregister_fd_hook (&fd_sockets_hook);
+
+ err = WSACleanup ();
+ if (err != 0)
+ return 1;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/sockets.h b/gnulib/lib/sockets.h
new file mode 100644
index 0000000..68bf731
--- /dev/null
+++ b/gnulib/lib/sockets.h
@@ -0,0 +1,62 @@
+/* sockets.h - wrappers for Windows socket functions
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson */
+
+#ifndef SOCKETS_H
+# define SOCKETS_H 1
+
+#define SOCKETS_1_0 0x100 /* don't use - does not work on Windows XP */
+#define SOCKETS_1_1 0x101
+#define SOCKETS_2_0 0x200 /* don't use - does not work on Windows XP */
+#define SOCKETS_2_1 0x201
+#define SOCKETS_2_2 0x202
+
+int gl_sockets_startup (int version)
+#if !WINDOWS_SOCKETS
+ _GL_ATTRIBUTE_CONST
+#endif
+ ;
+
+int gl_sockets_cleanup (void)
+#if !WINDOWS_SOCKETS
+ _GL_ATTRIBUTE_CONST
+#endif
+ ;
+
+/* This function is useful it you create a socket using gnulib's
+ Winsock wrappers but needs to pass on the socket handle to some
+ other library that only accepts sockets. */
+#if WINDOWS_SOCKETS
+
+#include <sys/socket.h>
+
+#include "msvc-nothrow.h"
+
+static inline SOCKET
+gl_fd_to_handle (int fd)
+{
+ return _get_osfhandle (fd);
+}
+
+#else
+
+#define gl_fd_to_handle(x) (x)
+
+#endif /* WINDOWS_SOCKETS */
+
+#endif /* SOCKETS_H */
diff --git a/gnulib/lib/spawn-pipe.c b/gnulib/lib/spawn-pipe.c
new file mode 100644
index 0000000..742987f
--- /dev/null
+++ b/gnulib/lib/spawn-pipe.c
@@ -0,0 +1,450 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "spawn-pipe.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "unistd-safer.h"
+#include "wait-process.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+# include <process.h>
+# include "w32spawn.h"
+
+#else
+
+/* Unix API. */
+# include <spawn.h>
+
+#endif
+
+/* The results of open() in this file are not used with fchdir,
+ therefore save some unnecessary work in fchdir.c. */
+#undef open
+#undef close
+
+
+#ifdef EINTR
+
+/* EINTR handling for close().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static inline int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#define close nonintr_close
+
+static inline int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+ int retval;
+
+ do
+ retval = open (pathname, oflag, mode);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef open /* avoid warning on VMS */
+#define open nonintr_open
+
+#endif
+
+
+/* Open a pipe connected to a child process.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child if pipe_stdin
+ * parent <- fd[0] <- STDOUT_FILENO <- child if pipe_stdout
+ * read system write
+ *
+ * At least one of pipe_stdin, pipe_stdout must be true.
+ * pipe_stdin and prog_stdin together determine the child's standard input.
+ * pipe_stdout and prog_stdout together determine the child's standard output.
+ * If pipe_stdin is true, prog_stdin is ignored.
+ * If pipe_stdout is true, prog_stdout is ignored.
+ */
+static pid_t
+create_pipe (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool pipe_stdin, bool pipe_stdout,
+ const char *prog_stdin, const char *prog_stdout,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+ /* Native Woe32 API.
+ This uses _pipe(), dup2(), and spawnv(). It could also be implemented
+ using the low-level functions CreatePipe(), DuplicateHandle(),
+ CreateProcess() and _open_osfhandle(); see the GNU make and GNU clisp
+ and cvs source code. */
+ int ifd[2];
+ int ofd[2];
+ int orig_stdin;
+ int orig_stdout;
+ int orig_stderr;
+ int child;
+ int nulloutfd;
+ int stdinfd;
+ int stdoutfd;
+ int saved_errno;
+
+ /* FIXME: Need to free memory allocated by prepare_spawn. */
+ prog_argv = prepare_spawn (prog_argv);
+
+ if (pipe_stdout)
+ if (pipe2_safer (ifd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe2_safer (ofd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ /* Save standard file handles of parent process. */
+ if (pipe_stdin || prog_stdin != NULL)
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
+ if (null_stderr)
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
+ child = -1;
+
+ /* Create standard file handles of child process. */
+ nulloutfd = -1;
+ stdinfd = -1;
+ stdoutfd = -1;
+ if ((!pipe_stdin || dup2 (ofd[0], STDIN_FILENO) >= 0)
+ && (!pipe_stdout || dup2 (ifd[1], STDOUT_FILENO) >= 0)
+ && (!null_stderr
+ || ((nulloutfd = open ("NUL", O_RDWR, 0)) >= 0
+ && (nulloutfd == STDERR_FILENO
+ || (dup2 (nulloutfd, STDERR_FILENO) >= 0
+ && close (nulloutfd) >= 0))))
+ && (pipe_stdin
+ || prog_stdin == NULL
+ || ((stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0
+ && (stdinfd == STDIN_FILENO
+ || (dup2 (stdinfd, STDIN_FILENO) >= 0
+ && close (stdinfd) >= 0))))
+ && (pipe_stdout
+ || prog_stdout == NULL
+ || ((stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0
+ && (stdoutfd == STDOUT_FILENO
+ || (dup2 (stdoutfd, STDOUT_FILENO) >= 0
+ && close (stdoutfd) >= 0)))))
+ /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
+ but it inherits all open()ed or dup2()ed file handles (which is what
+ we want in the case of STD*_FILENO). */
+ /* Use spawnvpe and pass the environment explicitly. This is needed if
+ the program has modified the environment using putenv() or [un]setenv().
+ On Windows, programs have two environments, one in the "environment
+ block" of the process and managed through SetEnvironmentVariable(), and
+ one inside the process, in the location retrieved by the 'environ'
+ macro. When using spawnvp() without 'e', the child process inherits a
+ copy of the environment block - ignoring the effects of putenv() and
+ [un]setenv(). */
+ {
+ child = spawnvpe (P_NOWAIT, prog_path, (const char **) prog_argv,
+ (const char **) environ);
+ if (child < 0 && errno == ENOEXEC)
+ {
+ /* prog is not a native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to prog_argv. */
+ --prog_argv;
+ child = spawnvpe (P_NOWAIT, prog_argv[0], (const char **) prog_argv,
+ (const char **) environ);
+ }
+ }
+ if (child == -1)
+ saved_errno = errno;
+ if (stdinfd >= 0)
+ close (stdinfd);
+ if (stdoutfd >= 0)
+ close (stdoutfd);
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+
+ /* Restore standard file handles of parent process. */
+ if (null_stderr)
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
+ if (pipe_stdin || prog_stdin != NULL)
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
+
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+ if (child == -1)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
+ _("%s subprocess failed"), progname);
+ if (pipe_stdout)
+ close (ifd[0]);
+ if (pipe_stdin)
+ close (ofd[1]);
+ errno = saved_errno;
+ return -1;
+ }
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#else
+
+ /* Unix API. */
+ int ifd[2];
+ int ofd[2];
+ sigset_t blocked_signals;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+
+ if (pipe_stdout)
+ if (pipe_safer (ifd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe_safer (ofd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ if (slave_process)
+ {
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ block_fatal_signals ();
+ }
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (pipe_stdin
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ofd[0], STDIN_FILENO))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ifd[1], STDOUT_FILENO))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[0]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[1]))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[1]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[0]))
+ != 0)
+ || (null_stderr
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDERR_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (!pipe_stdin
+ && prog_stdin != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDIN_FILENO,
+ prog_stdin, O_RDONLY,
+ 0))
+ != 0)
+ || (!pipe_stdout
+ && prog_stdout != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDOUT_FILENO,
+ prog_stdout, O_WRONLY,
+ 0))
+ != 0)
+ || (slave_process
+ && ((err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs,
+ &blocked_signals))
+ != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETSIGMASK))
+ != 0)))
+ || (err = posix_spawnp (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL, prog_argv,
+ environ))
+ != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ unblock_fatal_signals ();
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, err,
+ _("%s subprocess failed"), progname);
+ if (pipe_stdout)
+ {
+ close (ifd[0]);
+ close (ifd[1]);
+ }
+ if (pipe_stdin)
+ {
+ close (ofd[0]);
+ close (ofd[1]);
+ }
+ errno = err;
+ return -1;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ {
+ register_slave_subprocess (child);
+ unblock_fatal_signals ();
+ }
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#endif
+}
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ */
+pid_t
+create_pipe_bidi (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ true, true, NULL, NULL,
+ null_stderr, slave_process, exit_on_error,
+ fd);
+ return result;
+}
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+pid_t
+create_pipe_in (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ false, true, prog_stdin, NULL,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[0];
+ return result;
+}
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ */
+pid_t
+create_pipe_out (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv,
+ true, false, NULL, prog_stdout,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[1];
+ return result;
+}
diff --git a/gnulib/lib/spawn-pipe.h b/gnulib/lib/spawn-pipe.h
new file mode 100644
index 0000000..c69f87a
--- /dev/null
+++ b/gnulib/lib/spawn-pipe.h
@@ -0,0 +1,147 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2003, 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _SPAWN_PIPE_H
+#define _SPAWN_PIPE_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* All these functions create a subprocess and don't wait for its termination.
+ They return the process id of the subprocess. They also return in fd[]
+ one or two file descriptors for communication with the subprocess.
+ If the subprocess creation fails: if exit_on_error is true, the main
+ process exits with an error message; otherwise, an error message is given
+ if null_stderr is false, then -1 is returned, with errno set, and fd[]
+ remain uninitialized.
+
+ After finishing communication, the caller should call wait_subprocess()
+ to get rid of the subprocess in the process table.
+
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal or exits normally. If
+ slave_process is false, the child process will continue running in this
+ case, until it is lucky enough to attempt to communicate with its creator
+ and thus get a SIGPIPE signal.
+
+ If exit_on_error is false, a child process id of -1 should be treated the
+ same way as a subprocess which accepts no input, produces no output and
+ terminates with exit code 127. Why? Some errors during posix_spawnp()
+ cause the function posix_spawnp() to return an error code; some other
+ errors cause the subprocess to exit with return code 127. It is
+ implementation dependent which error is reported which way. The caller
+ must treat both cases as equivalent.
+
+ It is recommended that no signal is blocked or ignored (i.e. have a
+ signal handler with value SIG_IGN) while any of these functions is called.
+ The reason is that child processes inherit the mask of blocked signals
+ from their parent (both through posix_spawn() and fork()/exec());
+ likewise, signals ignored in the parent are also ignored in the child
+ (except possibly for SIGCHLD). And POSIX:2001 says [in the description
+ of exec()]:
+ "it should be noted that many existing applications wrongly
+ assume that they start with certain signals set to the default
+ action and/or unblocked. In particular, applications written
+ with a simpler signal model that does not include blocking of
+ signals, such as the one in the ISO C standard, may not behave
+ properly if invoked with some signals blocked. Therefore, it is
+ best not to block or ignore signals across execs without explicit
+ reason to do so, and especially not to block signals across execs
+ of arbitrary (not closely co-operating) programs." */
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ */
+extern pid_t create_pipe_out (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+extern pid_t create_pipe_in (const char *progname,
+ const char *prog_path, char **prog_argv,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ *
+ * Note: The parent process must be careful to avoid deadlock.
+ * 1) If you write more than PIPE_MAX bytes or, more generally, if you write
+ * more bytes than the subprocess can handle at once, the subprocess
+ * may write its data and wait on you to read it, but you are currently
+ * busy writing.
+ * 2) When you don't know ahead of time how many bytes the subprocess
+ * will produce, the usual technique of calling read (fd, buf, BUFSIZ)
+ * with a fixed BUFSIZ will, on Linux 2.2.17 and on BSD systems, cause
+ * the read() call to block until *all* of the buffer has been filled.
+ * But the subprocess cannot produce more data until you gave it more
+ * input. But you are currently busy reading from it.
+ */
+extern pid_t create_pipe_bidi (const char *progname,
+ const char *prog_path, char **prog_argv,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2]);
+
+/* The name of the "always silent" device. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Native Woe32 API. */
+# define DEV_NULL "NUL"
+#else
+/* Unix API. */
+# define DEV_NULL "/dev/null"
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SPAWN_PIPE_H */
diff --git a/gnulib/lib/spawn.c b/gnulib/lib/spawn.c
new file mode 100644
index 0000000..f72061a
--- /dev/null
+++ b/gnulib/lib/spawn.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawn (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, path, file_actions, attrp, argv, envp, 0);
+}
diff --git a/gnulib/lib/spawn.in.h b/gnulib/lib/spawn.in.h
new file mode 100644
index 0000000..5cc9acf
--- /dev/null
+++ b/gnulib/lib/spawn.in.h
@@ -0,0 +1,881 @@
+/* Definitions for POSIX spawn interface.
+ Copyright (C) 2000, 2003-2004, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_SPAWN_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SPAWN_H@
+# @INCLUDE_NEXT@ @NEXT_SPAWN_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SPAWN_H
+#define _@GUARD_PREFIX@_SPAWN_H
+
+/* Get definitions of 'struct sched_param' and 'sigset_t'.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <sched.h>
+# include <signal.h>
+#endif
+
+#include <sys/types.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !defined __STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Data structure to contain attributes for thread creation. */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawnattr_t rpl_posix_spawnattr_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWNATTR_T@
+# if !GNULIB_defined_posix_spawnattr_t
+typedef struct
+{
+ short int _flags;
+ pid_t _pgrp;
+ sigset_t _sd;
+ sigset_t _ss;
+ struct sched_param _sp;
+ int _policy;
+ int __pad[16];
+} posix_spawnattr_t;
+# define GNULIB_defined_posix_spawnattr_t 1
+# endif
+#endif
+
+
+/* Data structure to contain information about the actions to be
+ performed in the new process with respect to file descriptors. */
+#if @REPLACE_POSIX_SPAWN@
+# define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+# if !GNULIB_defined_posix_spawn_file_actions_t
+typedef struct
+{
+ int _allocated;
+ int _used;
+ struct __spawn_action *_actions;
+ int __pad[16];
+} posix_spawn_file_actions_t;
+# define GNULIB_defined_posix_spawn_file_actions_t 1
+# endif
+#endif
+
+
+/* Flags to be set in the `posix_spawnattr_t'. */
+#if @HAVE_POSIX_SPAWN@
+/* Use the values from the system, but provide the missing ones. */
+# ifndef POSIX_SPAWN_SETSCHEDPARAM
+# define POSIX_SPAWN_SETSCHEDPARAM 0
+# endif
+# ifndef POSIX_SPAWN_SETSCHEDULER
+# define POSIX_SPAWN_SETSCHEDULER 0
+# endif
+#else
+# if @REPLACE_POSIX_SPAWN@
+/* Use the values from the system, for better compatibility. */
+/* But this implementation does not support AIX extensions. */
+# undef POSIX_SPAWN_FORK_HANDLERS
+# else
+# define POSIX_SPAWN_RESETIDS 0x01
+# define POSIX_SPAWN_SETPGROUP 0x02
+# define POSIX_SPAWN_SETSIGDEF 0x04
+# define POSIX_SPAWN_SETSIGMASK 0x08
+# define POSIX_SPAWN_SETSCHEDPARAM 0x10
+# define POSIX_SPAWN_SETSCHEDULER 0x20
+# endif
+#endif
+/* A GNU extension. Use the next free bit position. */
+#define POSIX_SPAWN_USEVFORK \
+ ((POSIX_SPAWN_RESETIDS | (POSIX_SPAWN_RESETIDS - 1) \
+ | POSIX_SPAWN_SETPGROUP | (POSIX_SPAWN_SETPGROUP - 1) \
+ | POSIX_SPAWN_SETSIGDEF | (POSIX_SPAWN_SETSIGDEF - 1) \
+ | POSIX_SPAWN_SETSIGMASK | (POSIX_SPAWN_SETSIGMASK - 1) \
+ | POSIX_SPAWN_SETSCHEDPARAM \
+ | (POSIX_SPAWN_SETSCHEDPARAM > 0 ? POSIX_SPAWN_SETSCHEDPARAM - 1 : 0) \
+ | POSIX_SPAWN_SETSCHEDULER \
+ | (POSIX_SPAWN_SETSCHEDULER > 0 ? POSIX_SPAWN_SETSCHEDULER - 1 : 0)) \
+ + 1)
+#if !GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap
+typedef int verify_POSIX_SPAWN_USEVFORK_no_overlap
+ [(((POSIX_SPAWN_RESETIDS | POSIX_SPAWN_SETPGROUP
+ | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER)
+ & POSIX_SPAWN_USEVFORK)
+ == 0)
+ ? 1 : -1];
+# define GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap 1
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN@
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn rpl_posix_spawn
+# endif
+_GL_FUNCDECL_RPL (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+_GL_CXXALIAS_RPL (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_]));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_]));
+# endif
+_GL_CXXALIASWARN (posix_spawn);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn
+# if HAVE_RAW_DECL_POSIX_SPAWN
+_GL_WARN_ON_USE (posix_spawn, "posix_spawn is unportable - "
+ "use gnulib module posix_spawn for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNP@
+/* Similar to `posix_spawn' but search for FILE in the PATH.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnp rpl_posix_spawnp
+# endif
+_GL_FUNCDECL_RPL (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+_GL_CXXALIAS_RPL (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[]));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[]));
+# endif
+_GL_CXXALIASWARN (posix_spawnp);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnp
+# if HAVE_RAW_DECL_POSIX_SPAWNP
+_GL_WARN_ON_USE (posix_spawnp, "posix_spawnp is unportable - "
+ "use gnulib module posix_spawnp for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWNATTR_INIT@
+/* Initialize data structure with attributes for `spawn' to default values. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_init rpl_posix_spawnattr_init
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_init);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_init
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_INIT
+_GL_WARN_ON_USE (posix_spawnattr_init, "posix_spawnattr_init is unportable - "
+ "use gnulib module posix_spawnattr_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_DESTROY@
+/* Free resources associated with ATTR. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_DESTROY
+_GL_WARN_ON_USE (posix_spawnattr_destroy,
+ "posix_spawnattr_destroy is unportable - "
+ "use gnulib module posix_spawnattr_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+/* Store signal mask for signals with default handling from ATTR in
+ SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getsigdefault);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_getsigdefault,
+ "posix_spawnattr_getsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_getsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setsigdefault);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_setsigdefault,
+ "posix_spawnattr_setsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_setsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+/* Store signal mask for the new process from ATTR in SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getsigmask);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_getsigmask,
+ "posix_spawnattr_getsigmask is unportable - "
+ "use gnulib module posix_spawnattr_getsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setsigmask);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_setsigmask,
+ "posix_spawnattr_setsigmask is unportable - "
+ "use gnulib module posix_spawnattr_setsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+/* Get flag word from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getflags);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_getflags,
+ "posix_spawnattr_getflags is unportable - "
+ "use gnulib module posix_spawnattr_getflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+/* Store flags in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setflags);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_setflags,
+ "posix_spawnattr_setflags is unportable - "
+ "use gnulib module posix_spawnattr_setflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+/* Get process group ID from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getpgroup);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_getpgroup,
+ "posix_spawnattr_getpgroup is unportable - "
+ "use gnulib module posix_spawnattr_getpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+/* Store process group ID in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setpgroup);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_setpgroup,
+ "posix_spawnattr_setpgroup is unportable - "
+ "use gnulib module posix_spawnattr_setpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+/* Get scheduling policy from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_getschedpolicy,
+ "posix_spawnattr_getschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_getschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+/* Store scheduling policy in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_setschedpolicy,
+ "posix_spawnattr_setschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_setschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+/* Get scheduling parameters from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_getschedparam,
+ "posix_spawnattr_getschedparam is unportable - "
+ "use gnulib module posix_spawnattr_getschedparam for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+/* Store scheduling parameters in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_setschedparam,
+ "posix_spawnattr_setschedparam is unportable - "
+ "use gnulib module posix_spawnattr_setschedparam for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+/* Initialize data structure for file attribute for `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_init);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_init
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_INIT
+_GL_WARN_ON_USE (posix_spawn_file_actions_init,
+ "posix_spawn_file_actions_init is unportable - "
+ "use gnulib module posix_spawn_file_actions_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+/* Free resources associated with FILE-ACTIONS. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+_GL_WARN_ON_USE (posix_spawn_file_actions_destroy,
+ "posix_spawn_file_actions_destroy is unportable - "
+ "use gnulib module posix_spawn_file_actions_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `open' for the given file during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode)
+ __THROW _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode)
+ __THROW _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_addopen);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addopen
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+_GL_WARN_ON_USE (posix_spawn_file_actions_addopen,
+ "posix_spawn_file_actions_addopen is unportable - "
+ "use gnulib module posix_spawn_file_actions_addopen for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `close' for the given file descriptor during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_addclose);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addclose
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+_GL_WARN_ON_USE (posix_spawn_file_actions_addclose,
+ "posix_spawn_file_actions_addclose is unportable - "
+ "use gnulib module posix_spawn_file_actions_addclose for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `dup2' for the given file descriptors during the `spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_adddup2);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_adddup2
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+_GL_WARN_ON_USE (posix_spawn_file_actions_adddup2,
+ "posix_spawn_file_actions_adddup2 is unportable - "
+ "use gnulib module posix_spawn_file_actions_adddup2 for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SPAWN_H */
+#endif /* _@GUARD_PREFIX@_SPAWN_H */
diff --git a/gnulib/lib/spawn_faction_addclose.c b/gnulib/lib/spawn_faction_addclose.c
new file mode 100644
index 0000000..bd8c4db
--- /dev/null
+++ b/gnulib/lib/spawn_faction_addclose.c
@@ -0,0 +1,59 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `close' for the given file descriptor during the `spawn' call. */
+int
+posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
+ int fd)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_close;
+ rec->action.open_action.fd = fd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_adddup2.c b/gnulib/lib/spawn_faction_adddup2.c
new file mode 100644
index 0000000..1ebea4a
--- /dev/null
+++ b/gnulib/lib/spawn_faction_adddup2.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `dup2' for the given file descriptors during the `spawn' call. */
+int
+posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
+ int fd, int newfd)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || newfd < 0 || fd >= maxfd || newfd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_dup2;
+ rec->action.dup2_action.fd = fd;
+ rec->action.dup2_action.newfd = newfd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_addopen.c b/gnulib/lib/spawn_faction_addopen.c
new file mode 100644
index 0000000..ad72403
--- /dev/null
+++ b/gnulib/lib/spawn_faction_addopen.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#include "spawn_int.h"
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ `open' for the given file during the `spawn' call. */
+int
+posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
+ int fd, const char *path, int oflag,
+ mode_t mode)
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+ struct __spawn_action *rec;
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_open;
+ rec->action.open_action.fd = fd;
+ rec->action.open_action.path = path;
+ rec->action.open_action.oflag = oflag;
+ rec->action.open_action.mode = mode;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_destroy.c b/gnulib/lib/spawn_faction_destroy.c
new file mode 100644
index 0000000..884209f
--- /dev/null
+++ b/gnulib/lib/spawn_faction_destroy.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <stdlib.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
+{
+ /* Free the memory allocated. */
+ free (file_actions->_actions);
+ return 0;
+}
diff --git a/gnulib/lib/spawn_faction_init.c b/gnulib/lib/spawn_faction_init.c
new file mode 100644
index 0000000..f6ef0c9
--- /dev/null
+++ b/gnulib/lib/spawn_faction_init.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "spawn_int.h"
+
+
+/* Function used to increase the size of the allocated array. This
+ function is called from the `add'-functions. */
+int
+__posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *file_actions)
+{
+ int newalloc = file_actions->_allocated + 8;
+ void *newmem = realloc (file_actions->_actions,
+ newalloc * sizeof (struct __spawn_action));
+
+ if (newmem == NULL)
+ /* Not enough memory. */
+ return ENOMEM;
+
+ file_actions->_actions = (struct __spawn_action *) newmem;
+ file_actions->_allocated = newalloc;
+
+ return 0;
+}
+
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawn_file_actions_init (posix_spawn_file_actions_t *file_actions)
+{
+ /* Simply clear all the elements. */
+ memset (file_actions, '\0', sizeof (*file_actions));
+ return 0;
+}
diff --git a/gnulib/lib/spawn_int.h b/gnulib/lib/spawn_int.h
new file mode 100644
index 0000000..313af62
--- /dev/null
+++ b/gnulib/lib/spawn_int.h
@@ -0,0 +1,62 @@
+/* Copyright (C) 2000, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+
+/* Data structure to contain the action information. */
+struct __spawn_action
+{
+ enum
+ {
+ spawn_do_close,
+ spawn_do_dup2,
+ spawn_do_open
+ } tag;
+
+ union
+ {
+ struct
+ {
+ int fd;
+ } close_action;
+ struct
+ {
+ int fd;
+ int newfd;
+ } dup2_action;
+ struct
+ {
+ int fd;
+ const char *path;
+ int oflag;
+ mode_t mode;
+ } open_action;
+ } action;
+};
+
+#if !_LIBC
+# define __posix_spawn_file_actions_realloc gl_posix_spawn_file_actions_realloc
+#endif
+extern int __posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *
+ file_actions);
+
+#if !_LIBC
+# define __spawni gl_posix_spawn_internal
+#endif
+extern int __spawni (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path);
diff --git a/gnulib/lib/spawnattr_destroy.c b/gnulib/lib/spawnattr_destroy.c
new file mode 100644
index 0000000..5b498a0
--- /dev/null
+++ b/gnulib/lib/spawnattr_destroy.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawnattr_destroy (posix_spawnattr_t *attr)
+{
+ /* Nothing to do in the moment. */
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getdefault.c b/gnulib/lib/spawnattr_getdefault.c
new file mode 100644
index 0000000..88ce495
--- /dev/null
+++ b/gnulib/lib/spawnattr_getdefault.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store signal mask for signals with default handling from ATTR in
+ SIGDEFAULT. */
+int
+posix_spawnattr_getsigdefault (const posix_spawnattr_t *attr,
+ sigset_t *sigdefault)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (sigdefault, &attr->_sd, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getflags.c b/gnulib/lib/spawnattr_getflags.c
new file mode 100644
index 0000000..0e2ec5b
--- /dev/null
+++ b/gnulib/lib/spawnattr_getflags.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get flag word from the attribute structure. */
+int
+posix_spawnattr_getflags (const posix_spawnattr_t *attr, short int *flags)
+{
+ /* Copy the flag word. */
+ *flags = attr->_flags;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getpgroup.c b/gnulib/lib/spawnattr_getpgroup.c
new file mode 100644
index 0000000..e0cefa6
--- /dev/null
+++ b/gnulib/lib/spawnattr_getpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get process group ID from the attribute structure. */
+int
+posix_spawnattr_getpgroup (const posix_spawnattr_t *attr, pid_t *pgroup)
+{
+ /* Copy the process group ID. */
+ *pgroup = attr->_pgrp;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getschedparam.c b/gnulib/lib/spawnattr_getschedparam.c
new file mode 100644
index 0000000..69d7014
--- /dev/null
+++ b/gnulib/lib/spawnattr_getschedparam.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Get scheduling parameters from the attribute structure. */
+int
+posix_spawnattr_getschedparam (const posix_spawnattr_t *attr,
+ struct sched_param *schedparam)
+{
+ /* Do nothing if POSIX_SPAWN_SETSCHEDPARAM is unsupported. */
+#if POSIX_SPAWN_SETSCHEDPARAM != 0
+ /* Copy the scheduling parameters. */
+ *schedparam = attr->_sp;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getschedpolicy.c b/gnulib/lib/spawnattr_getschedpolicy.c
new file mode 100644
index 0000000..3415ca5
--- /dev/null
+++ b/gnulib/lib/spawnattr_getschedpolicy.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Get scheduling policy from the attribute structure. */
+int
+posix_spawnattr_getschedpolicy (const posix_spawnattr_t *attr,
+ int *schedpolicy)
+{
+ /* Do nothing if POSIX_SPAWN_SETSCHEDULER is unsupported. */
+#if POSIX_SPAWN_SETSCHEDULER != 0
+ /* Copy the scheduling policy. */
+ *schedpolicy = attr->_policy;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_getsigmask.c b/gnulib/lib/spawnattr_getsigmask.c
new file mode 100644
index 0000000..1fca4e2
--- /dev/null
+++ b/gnulib/lib/spawnattr_getsigmask.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store signal mask for the new process from ATTR in SIGMASK. */
+int
+posix_spawnattr_getsigmask (const posix_spawnattr_t *attr,
+ sigset_t *sigmask)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (sigmask, &attr->_ss, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_init.c b/gnulib/lib/spawnattr_init.c
new file mode 100644
index 0000000..0475080
--- /dev/null
+++ b/gnulib/lib/spawnattr_init.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Initialize data structure for file attribute for `spawn' call. */
+int
+posix_spawnattr_init (posix_spawnattr_t *attr)
+{
+ /* All elements have to be initialized to the default values which
+ is generally zero. */
+ memset (attr, '\0', sizeof (*attr));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setdefault.c b/gnulib/lib/spawnattr_setdefault.c
new file mode 100644
index 0000000..213c206
--- /dev/null
+++ b/gnulib/lib/spawnattr_setdefault.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
+int
+posix_spawnattr_setsigdefault (posix_spawnattr_t *attr,
+ const sigset_t *sigdefault)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (&attr->_sd, sigdefault, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setflags.c b/gnulib/lib/spawnattr_setflags.c
new file mode 100644
index 0000000..522d7c2
--- /dev/null
+++ b/gnulib/lib/spawnattr_setflags.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 2000, 2004, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <string.h>
+
+#define ALL_FLAGS (POSIX_SPAWN_RESETIDS \
+ | POSIX_SPAWN_SETPGROUP \
+ | POSIX_SPAWN_SETSIGDEF \
+ | POSIX_SPAWN_SETSIGMASK \
+ | POSIX_SPAWN_SETSCHEDPARAM \
+ | POSIX_SPAWN_SETSCHEDULER \
+ | POSIX_SPAWN_USEVFORK)
+
+/* Store flags in the attribute structure. */
+int
+posix_spawnattr_setflags (posix_spawnattr_t *attr, short int flags)
+{
+ /* Check no invalid bits are set. */
+ if (flags & ~ALL_FLAGS)
+ return EINVAL;
+
+ /* Store the flag word. */
+ attr->_flags = flags;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setpgroup.c b/gnulib/lib/spawnattr_setpgroup.c
new file mode 100644
index 0000000..406739b
--- /dev/null
+++ b/gnulib/lib/spawnattr_setpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store process group ID in the attribute structure. */
+int
+posix_spawnattr_setpgroup (posix_spawnattr_t *attr, pid_t pgroup)
+{
+ /* Store the process group ID. */
+ attr->_pgrp = pgroup;
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setschedparam.c b/gnulib/lib/spawnattr_setschedparam.c
new file mode 100644
index 0000000..4416a3b
--- /dev/null
+++ b/gnulib/lib/spawnattr_setschedparam.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Store scheduling parameters in the attribute structure. */
+int
+posix_spawnattr_setschedparam (posix_spawnattr_t *attr,
+ const struct sched_param *schedparam)
+{
+ /* Do nothing if POSIX_SPAWN_SETSCHEDPARAM is unsupported. */
+#if POSIX_SPAWN_SETSCHEDPARAM != 0
+ /* Store the scheduling parameters. */
+ attr->_sp = *schedparam;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setschedpolicy.c b/gnulib/lib/spawnattr_setschedpolicy.c
new file mode 100644
index 0000000..9eca36a
--- /dev/null
+++ b/gnulib/lib/spawnattr_setschedpolicy.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+
+/* Store scheduling policy in the attribute structure. */
+int
+posix_spawnattr_setschedpolicy (posix_spawnattr_t *attr, int schedpolicy)
+{
+ /* Do nothing if POSIX_SPAWN_SETSCHEDULER is unsupported. */
+#if POSIX_SPAWN_SETSCHEDULER != 0
+ if (schedpolicy != SCHED_OTHER && schedpolicy != SCHED_FIFO
+ && schedpolicy != SCHED_RR)
+ return EINVAL;
+
+ /* Store the policy. */
+ attr->_policy = schedpolicy;
+#endif
+
+ return 0;
+}
diff --git a/gnulib/lib/spawnattr_setsigmask.c b/gnulib/lib/spawnattr_setsigmask.c
new file mode 100644
index 0000000..875d2c9
--- /dev/null
+++ b/gnulib/lib/spawnattr_setsigmask.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+int
+posix_spawnattr_setsigmask (posix_spawnattr_t *attr,
+ const sigset_t *sigmask)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (&attr->_ss, sigmask, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/gnulib/lib/spawni.c b/gnulib/lib/spawni.c
new file mode 100644
index 0000000..9af2781
--- /dev/null
+++ b/gnulib/lib/spawni.c
@@ -0,0 +1,374 @@
+/* Guts of POSIX spawn interface. Generic POSIX.1 version.
+ Copyright (C) 2000-2006, 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+#include "spawn_int.h"
+
+#include <alloca.h>
+#include <errno.h>
+
+#include <fcntl.h>
+#ifndef O_LARGEFILE
+# define O_LARGEFILE 0
+#endif
+
+#if _LIBC || HAVE_PATHS_H
+# include <paths.h>
+#else
+# define _PATH_BSHELL "/bin/sh"
+#endif
+
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if _LIBC
+# include <not-cancel.h>
+#else
+# define close_not_cancel close
+# define open_not_cancel open
+#endif
+
+#if _LIBC
+# include <local-setxid.h>
+#else
+# if !HAVE_SETEUID
+# define seteuid(id) setresuid (-1, id, -1)
+# endif
+# if !HAVE_SETEGID
+# define setegid(id) setresgid (-1, id, -1)
+# endif
+# define local_seteuid(id) seteuid (id)
+# define local_setegid(id) setegid (id)
+#endif
+
+#if _LIBC
+# define alloca __alloca
+# define execve __execve
+# define dup2 __dup2
+# define fork __fork
+# define getgid __getgid
+# define getuid __getuid
+# define sched_setparam __sched_setparam
+# define sched_setscheduler __sched_setscheduler
+# define setpgid __setpgid
+# define sigaction __sigaction
+# define sigismember __sigismember
+# define sigprocmask __sigprocmask
+# define strchrnul __strchrnul
+# define vfork __vfork
+#else
+# undef internal_function
+# define internal_function /* empty */
+#endif
+
+
+/* The Unix standard contains a long explanation of the way to signal
+ an error after the fork() was successful. Since no new wait status
+ was wanted there is no way to signal an error using one of the
+ available methods. The committee chose to signal an error by a
+ normal program exit with the exit code 127. */
+#define SPAWN_ERROR 127
+
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+/* Native Woe32 API. */
+int
+__spawni (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path)
+{
+ /* Not yet implemented. */
+ return ENOSYS;
+}
+
+#else
+
+
+/* The file is accessible but it is not an executable file. Invoke
+ the shell to interpret it as a script. */
+static void
+internal_function
+script_execute (const char *file, char *const argv[], char *const envp[])
+{
+ /* Count the arguments. */
+ int argc = 0;
+ while (argv[argc++])
+ ;
+
+ /* Construct an argument list for the shell. */
+ {
+ char **new_argv = (char **) alloca ((argc + 1) * sizeof (char *));
+ new_argv[0] = (char *) _PATH_BSHELL;
+ new_argv[1] = (char *) file;
+ while (argc > 1)
+ {
+ new_argv[argc] = argv[argc - 1];
+ --argc;
+ }
+
+ /* Execute the shell. */
+ execve (new_argv[0], new_argv, envp);
+ }
+}
+
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+__spawni (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[], int use_path)
+{
+ pid_t new_pid;
+ char *path, *p, *name;
+ size_t len;
+ size_t pathlen;
+
+ /* Do this once. */
+ short int flags = attrp == NULL ? 0 : attrp->_flags;
+
+ /* Avoid gcc warning
+ "variable 'flags' might be clobbered by 'longjmp' or 'vfork'" */
+ (void) &flags;
+
+ /* Generate the new process. */
+#if HAVE_VFORK
+ if ((flags & POSIX_SPAWN_USEVFORK) != 0
+ /* If no major work is done, allow using vfork. Note that we
+ might perform the path searching. But this would be done by
+ a call to execvp(), too, and such a call must be OK according
+ to POSIX. */
+ || ((flags & (POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER
+ | POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_RESETIDS)) == 0
+ && file_actions == NULL))
+ new_pid = vfork ();
+ else
+#endif
+ new_pid = fork ();
+
+ if (new_pid != 0)
+ {
+ if (new_pid < 0)
+ return errno;
+
+ /* The call was successful. Store the PID if necessary. */
+ if (pid != NULL)
+ *pid = new_pid;
+
+ return 0;
+ }
+
+ /* Set signal mask. */
+ if ((flags & POSIX_SPAWN_SETSIGMASK) != 0
+ && sigprocmask (SIG_SETMASK, &attrp->_ss, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set signal default action. */
+ if ((flags & POSIX_SPAWN_SETSIGDEF) != 0)
+ {
+ /* We have to iterate over all signals. This could possibly be
+ done better but it requires system specific solutions since
+ the sigset_t data type can be very different on different
+ architectures. */
+ int sig;
+ struct sigaction sa;
+
+ memset (&sa, '\0', sizeof (sa));
+ sa.sa_handler = SIG_DFL;
+
+ for (sig = 1; sig <= NSIG; ++sig)
+ if (sigismember (&attrp->_sd, sig) != 0
+ && sigaction (sig, &sa, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ }
+
+#if (_LIBC ? defined _POSIX_PRIORITY_SCHEDULING : HAVE_SCHED_SETPARAM && HAVE_SCHED_SETSCHEDULER)
+ /* Set the scheduling algorithm and parameters. */
+ if ((flags & (POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER))
+ == POSIX_SPAWN_SETSCHEDPARAM)
+ {
+ if (sched_setparam (0, &attrp->_sp) == -1)
+ _exit (SPAWN_ERROR);
+ }
+ else if ((flags & POSIX_SPAWN_SETSCHEDULER) != 0)
+ {
+ if (sched_setscheduler (0, attrp->_policy,
+ (flags & POSIX_SPAWN_SETSCHEDPARAM) != 0
+ ? &attrp->_sp : NULL) == -1)
+ _exit (SPAWN_ERROR);
+ }
+#endif
+
+ /* Set the process group ID. */
+ if ((flags & POSIX_SPAWN_SETPGROUP) != 0
+ && setpgid (0, attrp->_pgrp) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set the effective user and group IDs. */
+ if ((flags & POSIX_SPAWN_RESETIDS) != 0
+ && (local_seteuid (getuid ()) != 0
+ || local_setegid (getgid ()) != 0))
+ _exit (SPAWN_ERROR);
+
+ /* Execute the file actions. */
+ if (file_actions != NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; cnt < file_actions->_used; ++cnt)
+ {
+ struct __spawn_action *action = &file_actions->_actions[cnt];
+
+ switch (action->tag)
+ {
+ case spawn_do_close:
+ if (close_not_cancel (action->action.close_action.fd) != 0)
+ /* Signal the error. */
+ _exit (SPAWN_ERROR);
+ break;
+
+ case spawn_do_open:
+ {
+ int new_fd = open_not_cancel (action->action.open_action.path,
+ action->action.open_action.oflag
+ | O_LARGEFILE,
+ action->action.open_action.mode);
+
+ if (new_fd == -1)
+ /* The `open' call failed. */
+ _exit (SPAWN_ERROR);
+
+ /* Make sure the desired file descriptor is used. */
+ if (new_fd != action->action.open_action.fd)
+ {
+ if (dup2 (new_fd, action->action.open_action.fd)
+ != action->action.open_action.fd)
+ /* The `dup2' call failed. */
+ _exit (SPAWN_ERROR);
+
+ if (close_not_cancel (new_fd) != 0)
+ /* The `close' call failed. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ break;
+
+ case spawn_do_dup2:
+ if (dup2 (action->action.dup2_action.fd,
+ action->action.dup2_action.newfd)
+ != action->action.dup2_action.newfd)
+ /* The `dup2' call failed. */
+ _exit (SPAWN_ERROR);
+ break;
+ }
+ }
+ }
+
+ if (! use_path || strchr (file, '/') != NULL)
+ {
+ /* The FILE parameter is actually a path. */
+ execve (file, argv, envp);
+
+ if (errno == ENOEXEC)
+ script_execute (file, argv, envp);
+
+ /* Oh, oh. `execve' returns. This is bad. */
+ _exit (SPAWN_ERROR);
+ }
+
+ /* We have to search for FILE on the path. */
+ path = getenv ("PATH");
+ if (path == NULL)
+ {
+#if HAVE_CONFSTR
+ /* There is no `PATH' in the environment.
+ The default search path is the current directory
+ followed by the path `confstr' returns for `_CS_PATH'. */
+ len = confstr (_CS_PATH, (char *) NULL, 0);
+ path = (char *) alloca (1 + len);
+ path[0] = ':';
+ (void) confstr (_CS_PATH, path + 1, len);
+#else
+ /* Pretend that the PATH contains only the current directory. */
+ path = "";
+#endif
+ }
+
+ len = strlen (file) + 1;
+ pathlen = strlen (path);
+ name = alloca (pathlen + len + 1);
+ /* Copy the file name at the top. */
+ name = (char *) memcpy (name + pathlen + 1, file, len);
+ /* And add the slash. */
+ *--name = '/';
+
+ p = path;
+ do
+ {
+ char *startp;
+
+ path = p;
+ p = strchrnul (path, ':');
+
+ if (p == path)
+ /* Two adjacent colons, or a colon at the beginning or the end
+ of `PATH' means to search the current directory. */
+ startp = name + 1;
+ else
+ startp = (char *) memcpy (name - (p - path), path, p - path);
+
+ /* Try to execute this name. If it works, execv will not return. */
+ execve (startp, argv, envp);
+
+ if (errno == ENOEXEC)
+ script_execute (startp, argv, envp);
+
+ switch (errno)
+ {
+ case EACCES:
+ case ENOENT:
+ case ESTALE:
+ case ENOTDIR:
+ /* Those errors indicate the file is missing or not executable
+ by us, in which case we want to just try the next path
+ directory. */
+ break;
+
+ default:
+ /* Some other error means we found an executable file, but
+ something went wrong executing it; return the error to our
+ caller. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ while (*p++ != '\0');
+
+ /* Return with an error. */
+ _exit (SPAWN_ERROR);
+}
+
+#endif
diff --git a/gnulib/lib/spawnp.c b/gnulib/lib/spawnp.c
new file mode 100644
index 0000000..5ca0fed
--- /dev/null
+++ b/gnulib/lib/spawnp.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing FILE with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawnp (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, file, file_actions, attrp, argv, envp, 1);
+}
diff --git a/gnulib/lib/sprintf.c b/gnulib/lib/sprintf.c
new file mode 100644
index 0000000..5fa78df
--- /dev/null
+++ b/gnulib/lib/sprintf.c
@@ -0,0 +1,80 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* Print formatted output to string STR.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+sprintf (char *str, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf;
+ va_list args;
+
+ /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger
+ than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that str + lenbuf wraps around, i.e.
+ (uintptr_t) (str + lenbuf) < (uintptr_t) str.
+ Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */
+ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (lenbuf > ~ (uintptr_t) str)
+ lenbuf = ~ (uintptr_t) str;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ /* len is near SIZE_MAX. */
+ free (output);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/sqrtf.c b/gnulib/lib/sqrtf.c
new file mode 100644
index 0000000..02ec7c2
--- /dev/null
+++ b/gnulib/lib/sqrtf.c
@@ -0,0 +1,26 @@
+/* Square root.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+sqrtf (float x)
+{
+ return (float) sqrt ((double) x);
+}
diff --git a/gnulib/lib/sqrtl.c b/gnulib/lib/sqrtl.c
new file mode 100644
index 0000000..6795d66
--- /dev/null
+++ b/gnulib/lib/sqrtl.c
@@ -0,0 +1,71 @@
+/* Emulation for sqrtl.
+ Contributed by Paolo Bonzini
+
+ Copyright 2002-2003, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+sqrtl (long double x)
+{
+ return sqrt (x);
+}
+
+#else
+
+# include <float.h>
+
+/* A simple Newton-Raphson method. */
+long double
+sqrtl (long double x)
+{
+ long double delta, y;
+ int exponent;
+
+ /* Check for NaN */
+ if (isnanl (x))
+ return x;
+
+ /* Check for negative numbers */
+ if (x < 0.0L)
+ return (long double) sqrt (-1);
+
+ /* Check for zero and infinites */
+ if (x + x == x)
+ return x;
+
+ frexpl (x, &exponent);
+ y = ldexpl (x, -exponent / 2);
+
+ do
+ {
+ delta = y;
+ y = (y + x / y) * 0.5L;
+ delta -= y;
+ }
+ while (delta != 0.0L);
+
+ return y;
+}
+
+#endif
diff --git a/gnulib/lib/stat-macros.h b/gnulib/lib/stat-macros.h
new file mode 100644
index 0000000..690216c
--- /dev/null
+++ b/gnulib/lib/stat-macros.h
@@ -0,0 +1,3 @@
+/* All the mode bits that can be affected by chmod. */
+#define CHMOD_MODE_BITS \
+ (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
diff --git a/gnulib/lib/stat-size.h b/gnulib/lib/stat-size.h
new file mode 100644
index 0000000..1e47500
--- /dev/null
+++ b/gnulib/lib/stat-size.h
@@ -0,0 +1,111 @@
+/* macros useful in interpreting size-related values in struct stat.
+ Copyright (C) 1989, 1991-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+/*
+ Macros defined by this file (s is an rvalue of type struct stat):
+
+ DEV_BSIZE: The device blocksize. But use ST_NBLOCKSIZE instead.
+ ST_BLKSIZE(s): Preferred (in the sense of best performance) I/O blocksize
+ for the file, in bytes.
+ ST_NBLOCKS(s): Number of blocks in the file, including indirect blocks.
+ ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS.
+ */
+#ifndef STAT_SIZE_H
+#define STAT_SIZE_H
+
+/* sys/param.h may define DEV_BSIZE */
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+
+/* Much of the remainder of this file is not indented consistently
+ with the above, in order to make it easier to see that the text
+ is almost identical to part of the system.h header in coreutils.
+*/
+/* Get or fake the disk device blocksize.
+ Usually defined by sys/param.h (if at all). */
+#if !defined DEV_BSIZE && defined BSIZE
+# define DEV_BSIZE BSIZE
+#endif
+#if !defined DEV_BSIZE && defined BBSIZE /* SGI sys/param.h */
+# define DEV_BSIZE BBSIZE
+#endif
+#ifndef DEV_BSIZE
+# define DEV_BSIZE 4096
+#endif
+
+
+
+/* Extract or fake data from a `struct stat'.
+ ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
+ ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
+ ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS. */
+#ifndef HAVE_STRUCT_STAT_ST_BLOCKS
+# define ST_BLKSIZE(statbuf) DEV_BSIZE
+ /* coreutils' fileblocks.c also uses BSIZE. */
+# if defined _POSIX_SOURCE || !defined BSIZE
+# define ST_NBLOCKS(statbuf) \
+ ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
+# else
+ /* This definition calls st_blocks, which is in the fileblocks module. */
+# define ST_NBLOCKS(statbuf) \
+ (S_ISREG ((statbuf).st_mode) || S_ISDIR ((statbuf).st_mode) ? \
+ st_blocks ((statbuf).st_size) : 0)
+# endif
+#else
+/* Some systems, like Sequents, return st_blksize of 0 on pipes.
+ Also, when running `rsh hpux11-system cat any-file', cat would
+ determine that the output stream had an st_blksize of 2147421096.
+ Conversely st_blksize can be 2 GiB (or maybe even larger) with XFS
+ on 64-bit hosts. Somewhat arbitrarily, limit the `optimal' block
+ size to SIZE_MAX / 8 + 1. (Dividing SIZE_MAX by only 4 wouldn't
+ suffice, since "cat" sometimes multiplies the result by 4.) If
+ anyone knows of a system for which this limit is too small, please
+ report it as a bug in this code. */
+# define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
+ && (statbuf).st_blksize <= ((size_t)-1) / 8 + 1) \
+ ? (statbuf).st_blksize : DEV_BSIZE)
+# if defined hpux || defined __hpux__ || defined __hpux
+ /* HP-UX counts st_blocks in 1024-byte units.
+ This loses when mixing HP-UX and BSD file systems with NFS. */
+# define ST_NBLOCKSIZE 1024
+# else /* !hpux */
+# if defined _AIX && defined _I386
+ /* AIX PS/2 counts st_blocks in 4K units. */
+# define ST_NBLOCKSIZE (4 * 1024)
+# else
+# if defined _CRAY
+# define ST_NBLOCKS(statbuf) \
+ (S_ISREG ((statbuf).st_mode) || S_ISDIR ((statbuf).st_mode) \
+ ? (statbuf).st_blocks * ST_BLKSIZE (statbuf) / ST_NBLOCKSIZE : 0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef ST_NBLOCKS
+# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
+#endif
+
+#ifndef ST_NBLOCKSIZE
+# ifdef S_BLKSIZE
+# define ST_NBLOCKSIZE S_BLKSIZE
+# else
+# define ST_NBLOCKSIZE 512
+# endif
+#endif
+
+#endif /* STAT_SIZE_H */
diff --git a/gnulib/lib/stat-time.h b/gnulib/lib/stat-time.h
new file mode 100644
index 0000000..86d9d4b
--- /dev/null
+++ b/gnulib/lib/stat-time.h
@@ -0,0 +1,189 @@
+/* stat-related time functions.
+
+ Copyright (C) 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef STAT_TIME_H
+#define STAT_TIME_H 1
+
+#include <sys/stat.h>
+#include <time.h>
+
+/* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
+ struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST,
+ ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
+ if available. ST_XTIM can be st_atim, st_ctim, st_mtim, or st_birthtim
+ for access, status change, data modification, or birth (creation)
+ time respectively.
+
+ These macros are private to stat-time.h. */
+#if defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+# ifdef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim)
+# else
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.tv_nsec)
+# endif
+#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim##espec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIMENSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim##ensec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.st__tim.tv_nsec)
+#endif
+
+/* Return the nanosecond component of *ST's access time. */
+static inline long int
+get_stat_atime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_atim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's status change time. */
+static inline long int
+get_stat_ctime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_ctim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's data modification time. */
+static inline long int
+get_stat_mtime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_mtim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's birth time. */
+static inline long int
+get_stat_birthtime_ns (struct stat const *st)
+{
+# if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
+ return STAT_TIMESPEC (st, st_birthtim).tv_nsec;
+# elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ return STAT_TIMESPEC_NS (st, st_birthtim);
+# else
+ /* Avoid a "parameter unused" warning. */
+ (void) st;
+ return 0;
+# endif
+}
+
+/* Return *ST's access time. */
+static inline struct timespec
+get_stat_atime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_atime;
+ t.tv_nsec = get_stat_atime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's status change time. */
+static inline struct timespec
+get_stat_ctime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = get_stat_ctime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's data modification time. */
+static inline struct timespec
+get_stat_mtime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_mtime;
+ t.tv_nsec = get_stat_mtime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's birth time, if available; otherwise return a value
+ with tv_sec and tv_nsec both equal to -1. */
+static inline struct timespec
+get_stat_birthtime (struct stat const *st)
+{
+ struct timespec t;
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
+ t = STAT_TIMESPEC (st, st_birthtim);
+#elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ t.tv_sec = st->st_birthtime;
+ t.tv_nsec = st->st_birthtimensec;
+#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ /* Woe32 native platforms (but not Cygwin) put the "file creation
+ time" in st_ctime (!). See
+ <http://msdn2.microsoft.com/de-de/library/14h5k7ff(VS.80).aspx>. */
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = 0;
+#else
+ /* Birth time is not supported. */
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+ /* Avoid a "parameter unused" warning. */
+ (void) st;
+#endif
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
+ /* FreeBSD and NetBSD sometimes signal the absence of knowledge by
+ using zero. Attempt to work around this problem. Alas, this can
+ report failure even for valid time stamps. Also, NetBSD
+ sometimes returns junk in the birth time fields; work around this
+ bug if it is detected. */
+ if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
+ {
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+ }
+#endif
+
+ return t;
+}
+
+#endif
diff --git a/gnulib/lib/stat.c b/gnulib/lib/stat.c
new file mode 100644
index 0000000..1397aa9
--- /dev/null
+++ b/gnulib/lib/stat.c
@@ -0,0 +1,123 @@
+/* Work around platform bugs in stat.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_stat doesn't recurse to
+ rpl_stat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of stat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+static inline int
+orig_stat (const char *filename, struct stat *buf)
+{
+ return stat (filename, buf);
+}
+
+/* Specification. */
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+#include "sys/stat.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+#include "dosname.h"
+#include "verify.h"
+
+#if REPLACE_FUNC_STAT_DIR
+# include "pathmax.h"
+ /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also
+ have a constant PATH_MAX. */
+# ifndef PATH_MAX
+# error "Please port this replacement to your platform"
+# endif
+#endif
+
+/* Store information about NAME into ST. Work around bugs with
+ trailing slashes. Mingw has other bugs (such as st_ino always
+ being 0 on success) which this wrapper does not work around. But
+ at least this implementation provides the ability to emulate fchdir
+ correctly. */
+
+int
+rpl_stat (char const *name, struct stat *st)
+{
+ int result = orig_stat (name, st);
+#if REPLACE_FUNC_STAT_FILE
+ /* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. */
+ if (result == 0 && !S_ISDIR (st->st_mode))
+ {
+ size_t len = strlen (name);
+ if (ISSLASH (name[len - 1]))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+#endif /* REPLACE_FUNC_STAT_FILE */
+#if REPLACE_FUNC_STAT_DIR
+
+ if (result == -1 && errno == ENOENT)
+ {
+ /* Due to mingw's oddities, there are some directories (like
+ c:\) where stat() only succeeds with a trailing slash, and
+ other directories (like c:\windows) where stat() only
+ succeeds without a trailing slash. But we want the two to be
+ synonymous, since chdir() manages either style. Likewise, Mingw also
+ reports ENOENT for names longer than PATH_MAX, when we want
+ ENAMETOOLONG, and for stat("file/"), when we want ENOTDIR.
+ Fortunately, mingw PATH_MAX is small enough for stack
+ allocation. */
+ char fixed_name[PATH_MAX + 1] = {0};
+ size_t len = strlen (name);
+ bool check_dir = false;
+ verify (PATH_MAX <= 4096);
+ if (PATH_MAX <= len)
+ errno = ENAMETOOLONG;
+ else if (len)
+ {
+ strcpy (fixed_name, name);
+ if (ISSLASH (fixed_name[len - 1]))
+ {
+ check_dir = true;
+ while (len && ISSLASH (fixed_name[len - 1]))
+ fixed_name[--len] = '\0';
+ if (!len)
+ fixed_name[0] = '/';
+ }
+ else
+ fixed_name[len++] = '/';
+ result = orig_stat (fixed_name, st);
+ if (result == 0 && check_dir && !S_ISDIR (st->st_mode))
+ {
+ result = -1;
+ errno = ENOTDIR;
+ }
+ }
+ }
+#endif /* REPLACE_FUNC_STAT_DIR */
+ return result;
+}
diff --git a/gnulib/lib/stdalign.in.h b/gnulib/lib/stdalign.in.h
new file mode 100644
index 0000000..37446a7
--- /dev/null
+++ b/gnulib/lib/stdalign.in.h
@@ -0,0 +1,89 @@
+/* A substitute for ISO C 1x <stdalign.h>.
+
+ Copyright 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Bruno Haible. */
+
+#ifndef _GL_STDALIGN_H
+#define _GL_STDALIGN_H
+
+/* ISO C1X <stdalign.h> for platforms that lack it.
+
+ References:
+ ISO C1X <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>
+ sections 6.5.3.4, 6.7.5, 7.15.
+ C++0X <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>
+ section 18.10. */
+
+/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
+ requirement of a structure member (i.e., slot or field) that is of
+ type TYPE, as an integer constant expression.
+
+ This differs from GCC's __alignof__ operator, which can yield a
+ better-performing alignment for an object of that type. For
+ example, on x86 with GCC, __alignof__ (double) and __alignof__
+ (long long) are 8, whereas alignof (double) and alignof (long long)
+ are 4 unless the option '-malign-double' is used.
+
+ The result cannot be used as a value for an 'enum' constant, if you
+ want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */
+#include <stddef.h>
+#if defined __cplusplus
+ template <class __t> struct __alignof_helper { char __a; __t __b; };
+# define _Alignof(type) offsetof (__alignof_helper<type>, __b)
+#else
+# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
+#endif
+#define alignof _Alignof
+#define __alignof_is_defined 1
+
+/* alignas (A), also known as _Alignas (A), aligns a variable or type
+ to the alignment A, where A is an integer constant expression. For
+ example:
+
+ int alignas (8) foo;
+ struct s { int a; int alignas (8) bar; };
+
+ aligns the address of FOO and the offset of BAR to be multiples of 8.
+
+ A should be a power of two that is at least the type's alignment
+ and at most the implementation's alignment limit. This limit is
+ 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
+ to MSVC through at least version 10.0, A should be an integer
+ constant, as MSVC does not support expressions such as 1 << 3.
+ To be portable to Sun C 5.11, do not align auto variables to
+ anything stricter than their default alignment.
+
+ The following draft C1X requirements are not supported here:
+
+ - If A is zero, alignas has no effect.
+ - alignas can be used multiple times; the strictest one wins.
+ - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
+
+ */
+
+#if __GNUC__ || __IBMC__ || __IBMCPP__ || 0x5110 <= __SUNPRO_C
+# define _Alignas(a) __attribute__ ((__aligned__ (a)))
+#elif 1300 <= _MSC_VER
+# define _Alignas(a) __declspec (align (a))
+#endif
+#ifdef _Alignas
+# define alignas _Alignas
+# define __alignas_is_defined 1
+#endif
+
+#endif /* _GL_STDALIGN_H */
diff --git a/gnulib/lib/stdarg.in.h b/gnulib/lib/stdarg.in.h
new file mode 100644
index 0000000..345e5f0
--- /dev/null
+++ b/gnulib/lib/stdarg.in.h
@@ -0,0 +1,36 @@
+/* Substitute for and wrapper around <stdarg.h>.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_STDARG_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDARG_H@
+
+#ifndef _@GUARD_PREFIX@_STDARG_H
+#define _@GUARD_PREFIX@_STDARG_H
+
+#ifndef va_copy
+# define va_copy(a,b) ((a) = (b))
+#endif
+
+#endif /* _@GUARD_PREFIX@_STDARG_H */
+#endif /* _@GUARD_PREFIX@_STDARG_H */
diff --git a/gnulib/lib/stdbool.in.h b/gnulib/lib/stdbool.in.h
new file mode 100644
index 0000000..5b371fd
--- /dev/null
+++ b/gnulib/lib/stdbool.in.h
@@ -0,0 +1,122 @@
+/* Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _GL_STDBOOL_H
+#define _GL_STDBOOL_H
+
+/* ISO C 99 <stdbool.h> for platforms that lack it. */
+
+/* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - Bit-fields of type 'bool' are not supported. Portable code
+ should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ - C99 allows the use of (_Bool)0.0 in constant expressions, but
+ this substitute cannot always provide this property.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
+/* 7.16. Boolean type and values */
+
+/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
+ definitions below, but temporarily we have to #undef them. */
+#if defined __BEOS__ && !defined __HAIKU__
+# include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
+#endif
+
+/* For the sake of symbolic names in gdb, we define true and false as
+ enum constants, not only as macros.
+ It is tempting to write
+ typedef enum { false = 0, true = 1 } _Bool;
+ so that gdb prints values of type 'bool' symbolically. But if we do
+ this, values of type '_Bool' may promote to 'int' or 'unsigned int'
+ (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+ (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
+#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__)
+ /* A compiler known to have 'bool'. */
+ /* If the compiler already has both 'bool' and '_Bool', we can assume they
+ are the same types. */
+# if !@HAVE__BOOL@
+typedef bool _Bool;
+# endif
+#else
+# if !defined __GNUC__
+ /* If @HAVE__BOOL@:
+ Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+ the built-in _Bool type is used. See
+ http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+ http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+ Similar bugs are likely with other compilers as well; this file
+ wouldn't be used if <stdbool.h> was working.
+ So we override the _Bool type.
+ If !@HAVE__BOOL@:
+ Need to define _Bool ourselves. As 'signed char' or as an enum type?
+ Use of a typedef, with SunPRO C, leads to a stupid
+ "warning: _Bool is a keyword in ISO C99".
+ Use of an enum type, with IRIX cc, leads to a stupid
+ "warning(1185): enumerated type mixed with another type".
+ Even the existence of an enum type, without a typedef,
+ "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
+ The only benefit of the enum, debuggability, is not important
+ with these compilers. So use 'signed char' and no enum. */
+# define _Bool signed char
+# else
+ /* With this compiler, trust the _Bool type if the compiler has it. */
+# if !@HAVE__BOOL@
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
+# endif
+#endif
+#define bool _Bool
+
+/* The other macros must be usable in preprocessor directives. */
+#define false 0
+#define true 1
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/gnulib/lib/stddef.in.h b/gnulib/lib/stddef.in.h
new file mode 100644
index 0000000..6ac06da
--- /dev/null
+++ b/gnulib/lib/stddef.in.h
@@ -0,0 +1,87 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_wchar_t || defined __need_size_t \
+ || defined __need_ptrdiff_t || defined __need_NULL \
+ || defined __need_wint_t
+/* Special invocation convention inside gcc header files. In
+ particular, gcc provides a version of <stddef.h> that blindly
+ redefines NULL even when __need_wint_t was defined, even though
+ wint_t is not normally provided by <stddef.h>. Hence, we must
+ remember if special invocation has ever been used to obtain wint_t,
+ in which case we need to clean up NULL yet again. */
+
+# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
+# ifdef __need_wint_t
+# undef _@GUARD_PREFIX@_STDDEF_H
+# define _GL_STDDEF_WINT_T
+# endif
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+# endif
+
+#else
+/* Normal invocation convention. */
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+
+/* The include_next requires a split double-inclusion guard. */
+
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+# define _@GUARD_PREFIX@_STDDEF_H
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
+#if @REPLACE_NULL@
+# undef NULL
+# ifdef __cplusplus
+ /* ISO C++ says that the macro NULL must expand to an integer constant
+ expression, hence '((void *) 0)' is not allowed in C++. */
+# if __GNUG__ >= 3
+ /* GNU C++ has a __null macro that behaves like an integer ('int' or
+ 'long') but has the same size as a pointer. Use that, to avoid
+ warnings. */
+# define NULL __null
+# else
+# define NULL 0L
+# endif
+# else
+# define NULL ((void *) 0)
+# endif
+#endif
+
+/* Some platforms lack wchar_t. */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/gnulib/lib/stdint.in.h b/gnulib/lib/stdint.in.h
new file mode 100644
index 0000000..7769582
--- /dev/null
+++ b/gnulib/lib/stdint.in.h
@@ -0,0 +1,609 @@
+/* Copyright (C) 2001-2002, 2004-2011 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+ This file is part of gnulib.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/stdint.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_STDINT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* When including a system file that in turn includes <inttypes.h>,
+ use the system <inttypes.h>, not our substitute. This avoids
+ problems with (for example) VMS, whose <sys/bitypes.h> includes
+ <inttypes.h>. */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Get those types that are already defined in other system include
+ files, so that we can "#define int8_t signed char" below without
+ worrying about a later system include file containing a "typedef
+ signed char int8_t;" that will get messed up by our macro. Our
+ macros should all be consistent with the system versions, except
+ for the "fast" types and macros, which we recommend against using
+ in public interfaces due to compiler differences. */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+ /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+ with "This header file is to be used only for c99 mode compilations"
+ diagnostics. */
+# define __STDINT_H__
+# endif
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# ifdef __cplusplus
+# ifndef __STDC_CONSTANT_MACROS
+# define __STDC_CONSTANT_MACROS 1
+# endif
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# endif
+
+ /* Other systems may have an incomplete or buggy <stdint.h>.
+ Include it before <inttypes.h>, since any "#include <stdint.h>"
+ in <inttypes.h> would reinclude us, skipping our contents because
+ _@GUARD_PREFIX@_STDINT_H is defined.
+ The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _@GUARD_PREFIX@_STDINT_H
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+ IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+ AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+ MacOS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+ relies on the system <stdint.h> definitions, so include
+ <sys/types.h> after @NEXT_STDINT_H@. */
+#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+# include <sys/types.h>
+#endif
+
+/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */
+#include <limits.h>
+
+#if @HAVE_INTTYPES_H@
+ /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+ int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+ <inttypes.h> also defines intptr_t and uintptr_t. */
+# include <inttypes.h>
+#elif @HAVE_SYS_INTTYPES_H@
+ /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+ the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
+# include <sys/inttypes.h>
+#endif
+
+#if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+ /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+ int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
+ included by <sys/types.h>. */
+# include <sys/bitypes.h>
+#endif
+
+#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for an integer type under the usual assumption.
+ Return an unspecified value if BITS == 0, adding a check to pacify
+ picky compilers. */
+
+#define _STDINT_MIN(signed, bits, zero) \
+ ((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero))
+
+#define _STDINT_MAX(signed, bits, zero) \
+ ((signed) \
+ ? ~ _STDINT_MIN (signed, bits, zero) \
+ : /* The expression for the unsigned case. The subtraction of (signed) \
+ is a nop in the unsigned case and avoids "signed integer overflow" \
+ warnings in the signed case. */ \
+ ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+#if !GNULIB_defined_stdint_types
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+#undef int8_t
+#undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+#define int8_t gl_int8_t
+#define uint8_t gl_uint8_t
+
+#undef int16_t
+#undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+#define int16_t gl_int16_t
+#define uint16_t gl_uint16_t
+
+#undef int32_t
+#undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+#define int32_t gl_int32_t
+#define uint32_t gl_uint32_t
+
+/* If the system defines INT64_MAX, assume int64_t works. That way,
+ if the underlying platform defines int64_t to be a 64-bit long long
+ int, the code below won't mistakenly define it to be a 64-bit long
+ int, which would mess up C++ name mangling. We must use #ifdef
+ rather than #if, to avoid an error with HP-UX 10.20 cc. */
+
+#ifdef INT64_MAX
+# define GL_INT64_T
+#else
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+ types, since otherwise it breaks platforms like Tandem/NSK. */
+# if LONG_MAX >> 31 >> 31 == 1
+# undef int64_t
+typedef long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# elif defined _MSC_VER
+# undef int64_t
+typedef __int64 gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# elif @HAVE_LONG_LONG_INT@
+# undef int64_t
+typedef long long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# endif
+#endif
+
+#ifdef UINT64_MAX
+# define GL_UINT64_T
+#else
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# undef uint64_t
+typedef unsigned long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# elif defined _MSC_VER
+# undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# endif
+#endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
+#define _UINT8_T
+#define _UINT32_T
+#define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+#undef int_least8_t
+#undef uint_least8_t
+#undef int_least16_t
+#undef uint_least16_t
+#undef int_least32_t
+#undef uint_least32_t
+#undef int_least64_t
+#undef uint_least64_t
+#define int_least8_t int8_t
+#define uint_least8_t uint8_t
+#define int_least16_t int16_t
+#define uint_least16_t uint16_t
+#define int_least32_t int32_t
+#define uint_least32_t uint32_t
+#ifdef GL_INT64_T
+# define int_least64_t int64_t
+#endif
+#ifdef GL_UINT64_T
+# define uint_least64_t uint64_t
+#endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+ It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. Assume that 'long int'
+ is fast enough for all narrower integers. */
+
+#undef int_fast8_t
+#undef uint_fast8_t
+#undef int_fast16_t
+#undef uint_fast16_t
+#undef int_fast32_t
+#undef uint_fast32_t
+#undef int_fast64_t
+#undef uint_fast64_t
+typedef long int gl_int_fast8_t;
+typedef unsigned long int gl_uint_fast8_t;
+typedef long int gl_int_fast16_t;
+typedef unsigned long int gl_uint_fast16_t;
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+#define int_fast8_t gl_int_fast8_t
+#define uint_fast8_t gl_uint_fast8_t
+#define int_fast16_t gl_int_fast16_t
+#define uint_fast16_t gl_uint_fast16_t
+#define int_fast32_t gl_int_fast32_t
+#define uint_fast32_t gl_uint_fast32_t
+#ifdef GL_INT64_T
+# define int_fast64_t int64_t
+#endif
+#ifdef GL_UINT64_T
+# define uint_fast64_t uint64_t
+#endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+#undef intptr_t
+#undef uintptr_t
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+#define intptr_t gl_intptr_t
+#define uintptr_t gl_uintptr_t
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+ public header files. */
+
+/* If the system defines INTMAX_MAX, assume that intmax_t works, and
+ similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
+ assuming one type where another is used by the system. */
+
+#ifndef INTMAX_MAX
+# undef INTMAX_C
+# undef intmax_t
+# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# elif defined GL_INT64_T
+# define intmax_t int64_t
+# else
+typedef long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# endif
+#endif
+
+#ifndef UINTMAX_MAX
+# undef UINTMAX_C
+# undef uintmax_t
+# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# elif defined GL_UINT64_T
+# define uintmax_t uint64_t
+# else
+typedef unsigned long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# endif
+#endif
+
+/* Verify that intmax_t and uintmax_t have the same size. Too much code
+ breaks if this is not the case. If this check fails, the reason is likely
+ to be found in the autoconf macros. */
+typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
+ ? 1 : -1];
+
+#define GNULIB_defined_stdint_types 1
+#endif /* !GNULIB_defined_stdint_types */
+
+/* 7.18.2. Limits of specified-width integer types */
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+#undef INT8_MIN
+#undef INT8_MAX
+#undef UINT8_MAX
+#define INT8_MIN (~ INT8_MAX)
+#define INT8_MAX 127
+#define UINT8_MAX 255
+
+#undef INT16_MIN
+#undef INT16_MAX
+#undef UINT16_MAX
+#define INT16_MIN (~ INT16_MAX)
+#define INT16_MAX 32767
+#define UINT16_MAX 65535
+
+#undef INT32_MIN
+#undef INT32_MAX
+#undef UINT32_MAX
+#define INT32_MIN (~ INT32_MAX)
+#define INT32_MAX 2147483647
+#define UINT32_MAX 4294967295U
+
+#if defined GL_INT64_T && ! defined INT64_MAX
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+ evaluates the latter incorrectly in preprocessor expressions. */
+# define INT64_MIN (- INTMAX_C (1) << 63)
+# define INT64_MAX INTMAX_C (9223372036854775807)
+#endif
+
+#if defined GL_UINT64_T && ! defined UINT64_MAX
+# define UINT64_MAX UINTMAX_C (18446744073709551615)
+#endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+#undef INT_LEAST8_MIN
+#undef INT_LEAST8_MAX
+#undef UINT_LEAST8_MAX
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+
+#undef INT_LEAST16_MIN
+#undef INT_LEAST16_MAX
+#undef UINT_LEAST16_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+
+#undef INT_LEAST32_MIN
+#undef INT_LEAST32_MAX
+#undef UINT_LEAST32_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+
+#undef INT_LEAST64_MIN
+#undef INT_LEAST64_MAX
+#ifdef GL_INT64_T
+# define INT_LEAST64_MIN INT64_MIN
+# define INT_LEAST64_MAX INT64_MAX
+#endif
+
+#undef UINT_LEAST64_MAX
+#ifdef GL_UINT64_T
+# define UINT_LEAST64_MAX UINT64_MAX
+#endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. */
+
+#undef INT_FAST8_MIN
+#undef INT_FAST8_MAX
+#undef UINT_FAST8_MAX
+#define INT_FAST8_MIN LONG_MIN
+#define INT_FAST8_MAX LONG_MAX
+#define UINT_FAST8_MAX ULONG_MAX
+
+#undef INT_FAST16_MIN
+#undef INT_FAST16_MAX
+#undef UINT_FAST16_MAX
+#define INT_FAST16_MIN LONG_MIN
+#define INT_FAST16_MAX LONG_MAX
+#define UINT_FAST16_MAX ULONG_MAX
+
+#undef INT_FAST32_MIN
+#undef INT_FAST32_MAX
+#undef UINT_FAST32_MAX
+#define INT_FAST32_MIN LONG_MIN
+#define INT_FAST32_MAX LONG_MAX
+#define UINT_FAST32_MAX ULONG_MAX
+
+#undef INT_FAST64_MIN
+#undef INT_FAST64_MAX
+#ifdef GL_INT64_T
+# define INT_FAST64_MIN INT64_MIN
+# define INT_FAST64_MAX INT64_MAX
+#endif
+
+#undef UINT_FAST64_MAX
+#ifdef GL_UINT64_T
+# define UINT_FAST64_MAX UINT64_MAX
+#endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+#undef INTPTR_MIN
+#undef INTPTR_MAX
+#undef UINTPTR_MAX
+#define INTPTR_MIN LONG_MIN
+#define INTPTR_MAX LONG_MAX
+#define UINTPTR_MAX ULONG_MAX
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+#ifndef INTMAX_MAX
+# undef INTMAX_MIN
+# ifdef INT64_MAX
+# define INTMAX_MIN INT64_MIN
+# define INTMAX_MAX INT64_MAX
+# else
+# define INTMAX_MIN INT32_MIN
+# define INTMAX_MAX INT32_MAX
+# endif
+#endif
+
+#ifndef UINTMAX_MAX
+# ifdef UINT64_MAX
+# define UINTMAX_MAX UINT64_MAX
+# else
+# define UINTMAX_MAX UINT32_MAX
+# endif
+#endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+#undef PTRDIFF_MIN
+#undef PTRDIFF_MAX
+#if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define PTRDIFF_MIN _STDINT_MIN (1, 64, 0l)
+# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
+# else
+# define PTRDIFF_MIN _STDINT_MIN (1, 32, 0)
+# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
+# endif
+#else
+# define PTRDIFF_MIN \
+ _STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# define PTRDIFF_MAX \
+ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+#endif
+
+/* sig_atomic_t limits */
+#undef SIG_ATOMIC_MIN
+#undef SIG_ATOMIC_MAX
+#define SIG_ATOMIC_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+#define SIG_ATOMIC_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+#undef SIZE_MAX
+#if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
+# else
+# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
+# endif
+#else
+# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+#endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+ This include is not on the top, above, because on OSF/1 4.0 we have a
+ sequence of nested includes
+ <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+ <stdint.h> and assumes its types are already defined. */
+#if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
+ /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# include <wchar.h>
+# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+#endif
+#undef WCHAR_MIN
+#undef WCHAR_MAX
+#define WCHAR_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+#define WCHAR_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+#undef WINT_MIN
+#undef WINT_MAX
+#define WINT_MIN \
+ _STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+#define WINT_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+
+/* 7.18.4. Macros for integer constants */
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
+
+#undef INT8_C
+#undef UINT8_C
+#define INT8_C(x) x
+#define UINT8_C(x) x
+
+#undef INT16_C
+#undef UINT16_C
+#define INT16_C(x) x
+#define UINT16_C(x) x
+
+#undef INT32_C
+#undef UINT32_C
+#define INT32_C(x) x
+#define UINT32_C(x) x ## U
+
+#undef INT64_C
+#undef UINT64_C
+#if LONG_MAX >> 31 >> 31 == 1
+# define INT64_C(x) x##L
+#elif defined _MSC_VER
+# define INT64_C(x) x##i64
+#elif @HAVE_LONG_LONG_INT@
+# define INT64_C(x) x##LL
+#endif
+#if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# define UINT64_C(x) x##UL
+#elif defined _MSC_VER
+# define UINT64_C(x) x##ui64
+#elif @HAVE_UNSIGNED_LONG_LONG_INT@
+# define UINT64_C(x) x##ULL
+#endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+#ifndef INTMAX_C
+# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
+# define INTMAX_C(x) x##LL
+# elif defined GL_INT64_T
+# define INTMAX_C(x) INT64_C(x)
+# else
+# define INTMAX_C(x) x##L
+# endif
+#endif
+
+#ifndef UINTMAX_C
+# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
+# define UINTMAX_C(x) x##ULL
+# elif defined GL_UINT64_T
+# define UINTMAX_C(x) UINT64_C(x)
+# else
+# define UINTMAX_C(x) x##UL
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_STDINT_H */
+#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/gnulib/lib/stdio--.h b/gnulib/lib/stdio--.h
new file mode 100644
index 0000000..adde0f9
--- /dev/null
+++ b/gnulib/lib/stdio--.h
@@ -0,0 +1,41 @@
+/* Like stdio.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdio.h>
+#include "stdio-safer.h"
+
+#if GNULIB_FOPEN_SAFER
+# undef fopen
+# define fopen fopen_safer
+#endif
+
+#if GNULIB_FREOPEN_SAFER
+# undef freopen
+# define freopen freopen_safer
+#endif
+
+#if GNULIB_TMPFILE_SAFER
+# undef tmpfile
+# define tmpfile tmpfile_safer
+#endif
+
+#if GNULIB_POPEN_SAFER
+# undef popen
+# define popen popen_safer
+#endif
diff --git a/gnulib/lib/stdio-impl.h b/gnulib/lib/stdio-impl.h
new file mode 100644
index 0000000..d41c32f
--- /dev/null
+++ b/gnulib/lib/stdio-impl.h
@@ -0,0 +1,110 @@
+/* Implementation details of FILE streams.
+ Copyright (C) 2007-2008, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Many stdio implementations have the same logic and therefore can share
+ the same implementation of stdio extension API, except that some fields
+ have different naming conventions, or their access requires some casts. */
+
+
+/* BSD stdio derived implementations. */
+
+#if defined __NetBSD__ /* NetBSD */
+/* Get __NetBSD_Version__. */
+# include <sys/param.h>
+#endif
+
+#if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, MacOS X, Cygwin */
+
+# if defined __DragonFly__ /* DragonFly */
+ /* See <http://www.dragonflybsd.org/cvsweb/src/lib/libc/stdio/priv_stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>. */
+# define fp_ ((struct { struct __FILE_public pub; \
+ struct { unsigned char *_base; int _size; } _bf; \
+ void *cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; int _size; } _ub; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; int _size; } _lb; \
+ int _blksize; \
+ fpos_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+ /* See <http://www.dragonflybsd.org/cvsweb/src/include/stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>. */
+# define _p pub._p
+# define _flags pub._flags
+# define _r pub._r
+# define _w pub._w
+# else
+# define fp_ fp
+# endif
+
+# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ /* NetBSD >= 1.5ZA, OpenBSD */
+ /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> */
+ struct __sfileext
+ {
+ struct __sbuf _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
+# else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, MacOS X, Cygwin */
+# define fp_ub fp_->_ub
+# endif
+
+# define HASUB(fp) (fp_ub._base != NULL)
+
+#endif
+
+
+/* SystemV derived implementations. */
+
+#ifdef __TANDEM /* NonStop Kernel */
+# ifndef _IOERR
+/* These values were determined by the program 'stdioext-flags' at
+ <http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>. */
+# define _IOERR 0x40
+# define _IOREAD 0x80
+# define _IOWRT 0x4
+# define _IORW 0x100
+# endif
+#endif
+
+#if defined _IOERR
+
+# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
+# define fp_ ((struct { unsigned char *_ptr; \
+ unsigned char *_base; \
+ unsigned char *_end; \
+ long _cnt; \
+ int _file; \
+ unsigned int _flag; \
+ } *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if defined _SCO_DS /* OpenServer */
+# define _cnt __cnt
+# define _ptr __ptr
+# define _base __base
+# define _flag __flag
+# endif
+
+#endif
diff --git a/gnulib/lib/stdio-read.c b/gnulib/lib/stdio-read.c
new file mode 100644
index 0000000..86b1d61
--- /dev/null
+++ b/gnulib/lib/stdio-read.c
@@ -0,0 +1,150 @@
+/* POSIX compatible FILE stream read function.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'nonblocking' is requested. */
+#if GNULIB_NONBLOCKING
+
+/* On native Windows platforms, when read() is called on a non-blocking pipe
+ with an empty buffer, ReadFile() fails with error GetLastError() =
+ ERROR_NO_DATA, and read() in consequence fails with error EINVAL. This
+ read() function is at the basis of the function which fills the buffer of
+ a FILE stream. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "msvc-nothrow.h"
+
+# define CALL_WITH_ERRNO_FIX(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ SetLastError (0); \
+ ret = (EXPRESSION); \
+ if (FAILED) \
+ { \
+ if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0) \
+ { \
+ HANDLE h = (HANDLE) _get_osfhandle (fd); \
+ if (GetFileType (h) == FILE_TYPE_PIPE) \
+ { \
+ /* h is a pipe or socket. */ \
+ DWORD state; \
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, \
+ NULL, NULL, 0) \
+ && (state & PIPE_NOWAIT) != 0) \
+ /* h is a pipe in non-blocking mode. \
+ Change errno from EINVAL to EAGAIN. */ \
+ errno = EAGAIN; \
+ } \
+ } \
+ } \
+ } \
+ return ret; \
+ }
+
+int
+scanf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfscanf (stdin, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int
+fscanf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfscanf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+int
+vscanf (const char *format, va_list args)
+{
+ return vfscanf (stdin, format, args);
+}
+
+int
+vfscanf (FILE *stream, const char *format, va_list args)
+#undef vfscanf
+{
+ CALL_WITH_ERRNO_FIX (int, vfscanf (stream, format, args), ret == EOF)
+}
+
+int
+getchar (void)
+{
+ return fgetc (stdin);
+}
+
+int
+fgetc (FILE *stream)
+#undef fgetc
+{
+ CALL_WITH_ERRNO_FIX (int, fgetc (stream), ret == EOF)
+}
+
+char *
+fgets (char *s, int n, FILE *stream)
+#undef fgets
+{
+ CALL_WITH_ERRNO_FIX (char *, fgets (s, n, stream), ret == NULL)
+}
+
+char *
+gets (char *s)
+#undef gets
+{
+ FILE *stream = stdin;
+ CALL_WITH_ERRNO_FIX (char *, gets (s), ret == NULL)
+}
+
+size_t
+fread (void *ptr, size_t s, size_t n, FILE *stream)
+#undef fread
+{
+ CALL_WITH_ERRNO_FIX (size_t, fread (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/gnulib/lib/stdio-safer.h b/gnulib/lib/stdio-safer.h
new file mode 100644
index 0000000..62fdf64
--- /dev/null
+++ b/gnulib/lib/stdio-safer.h
@@ -0,0 +1,36 @@
+/* Invoke stdio functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdio.h>
+
+#if GNULIB_FOPEN_SAFER
+FILE *fopen_safer (char const *, char const *);
+#endif
+
+#if GNULIB_FREOPEN_SAFER
+FILE *freopen_safer (char const *, char const *, FILE *);
+#endif
+
+#if GNULIB_POPEN_SAFER
+FILE *popen_safer (char const *, char const *);
+#endif
+
+#if GNULIB_TMPFILE_SAFER
+FILE *tmpfile_safer (void);
+#endif
diff --git a/gnulib/lib/stdio-write.c b/gnulib/lib/stdio-write.c
new file mode 100644
index 0000000..02aed45
--- /dev/null
+++ b/gnulib/lib/stdio-write.c
@@ -0,0 +1,198 @@
+/* POSIX compatible FILE stream write function.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'nonblocking' or module 'sigpipe' is
+ requested. */
+#if GNULIB_NONBLOCKING || GNULIB_SIGPIPE
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. This write() function is at the basis of the function
+ which flushes the buffer of a FILE stream. */
+
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "msvc-nothrow.h"
+
+# if GNULIB_NONBLOCKING
+# define CLEAR_ERRNO \
+ errno = 0;
+# define HANDLE_ENOSPC \
+ if (errno == ENOSPC && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0) \
+ { \
+ HANDLE h = (HANDLE) _get_osfhandle (fd); \
+ if (GetFileType (h) == FILE_TYPE_PIPE) \
+ { \
+ /* h is a pipe or socket. */ \
+ DWORD state; \
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, \
+ NULL, NULL, 0) \
+ && (state & PIPE_NOWAIT) != 0) \
+ /* h is a pipe in non-blocking mode. \
+ Change errno from ENOSPC to EAGAIN. */ \
+ errno = EAGAIN; \
+ } \
+ } \
+ } \
+ else
+# else
+# define CLEAR_ERRNO
+# define HANDLE_ENOSPC
+# endif
+
+# if GNULIB_SIGPIPE
+# define CLEAR_LastError \
+ SetLastError (0);
+# define HANDLE_ERROR_NO_DATA \
+ if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0 \
+ && GetFileType ((HANDLE) _get_osfhandle (fd)) \
+ == FILE_TYPE_PIPE) \
+ { \
+ /* Try to raise signal SIGPIPE. */ \
+ raise (SIGPIPE); \
+ /* If it is currently blocked or ignored, change errno from \
+ EINVAL to EPIPE. */ \
+ errno = EPIPE; \
+ } \
+ } \
+ else
+# else
+# define CLEAR_LastError
+# define HANDLE_ERROR_NO_DATA
+# endif
+
+# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ CLEAR_ERRNO \
+ CLEAR_LastError \
+ ret = (EXPRESSION); \
+ if (FAILED) \
+ { \
+ HANDLE_ENOSPC \
+ HANDLE_ERROR_NO_DATA \
+ ; \
+ } \
+ return ret; \
+ }
+
+# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
+int
+fprintf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
+# endif
+
+# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
+int
+vfprintf (FILE *stream, const char *format, va_list args)
+#undef vfprintf
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, vfprintf (stream, format, args), ret == EOF)
+}
+# endif
+
+int
+putchar (int c)
+{
+ return fputc (c, stdout);
+}
+
+int
+fputc (int c, FILE *stream)
+#undef fputc
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputc (c, stream), ret == EOF)
+}
+
+int
+fputs (const char *string, FILE *stream)
+#undef fputs
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputs (string, stream), ret == EOF)
+}
+
+int
+puts (const char *string)
+#undef puts
+{
+ FILE *stream = stdout;
+ CALL_WITH_SIGPIPE_EMULATION (int, puts (string), ret == EOF)
+}
+
+size_t
+fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+#undef fwrite
+{
+ CALL_WITH_SIGPIPE_EMULATION (size_t, fwrite (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/gnulib/lib/stdio.in.h b/gnulib/lib/stdio.in.h
new file mode 100644
index 0000000..ebbf801
--- /dev/null
+++ b/gnulib/lib/stdio.in.h
@@ -0,0 +1,1350 @@
+/* A GNU-like <stdio.h>.
+
+ Copyright (C) 2004, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
+/* Special invocation convention:
+ - Inside glibc header files.
+ - On OSF/1 5.1 we have a sequence of nested includes
+ <stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
+ <sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+
+#define _GL_ALREADY_INCLUDING_STDIO_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#undef _GL_ALREADY_INCLUDING_STDIO_H
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+#define _@GUARD_PREFIX@_STDIO_H
+
+/* Get va_list. Needed on many systems, including glibc 2.8. */
+#include <stdarg.h>
+
+#include <stddef.h>
+
+/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8
+ and eglibc 2.11.2. */
+#include <sys/types.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system printf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system scanf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
+/* Solaris 10 declares renameat in <unistd.h>, not in <stdio.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __sun \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Macros for stringification. */
+#define _GL_STDIO_STRINGIZE(token) #token
+#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token)
+
+
+#if @GNULIB_DPRINTF@
+# if @REPLACE_DPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dprintf rpl_dprintf
+# endif
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+# else
+# if !@HAVE_DPRINTF@
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (dprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef dprintf
+# if HAVE_RAW_DECL_DPRINTF
+_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
+ "use gnulib module dprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_FCLOSE@
+/* Close STREAM and its underlying file descriptor. */
+# if @REPLACE_FCLOSE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fclose rpl_fclose
+# endif
+_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fclose, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fclose, int, (FILE *stream));
+# endif
+_GL_CXXALIASWARN (fclose);
+#elif defined GNULIB_POSIXCHECK
+# undef fclose
+/* Assume fclose is always declared. */
+_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
+ "use gnulib module fclose for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FDOPEN@
+# if @REPLACE_FDOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen rpl_fdopen
+# endif
+_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopen
+/* Assume fdopen is always declared. */
+_GL_WARN_ON_USE (fdopen, "fdopen on Win32 platforms is not POSIX compatible - "
+ "use gnulib module fdopen for portability");
+#endif
+
+#if @GNULIB_FFLUSH@
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported.
+ Note! LOSS OF DATA can occur if fflush is applied on an input stream
+ that is _not_seekable_ or on an update stream that is _not_seekable_
+ and in which the most recent operation was input. Seekability can
+ be tested with lseek(fileno(fp),0,SEEK_CUR). */
+# if @REPLACE_FFLUSH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fflush rpl_fflush
+# endif
+_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream));
+_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream));
+# else
+_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream));
+# endif
+_GL_CXXALIASWARN (fflush);
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+/* Assume fflush is always declared. */
+_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
+ "use gnulib module fflush for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FGETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgetc
+# define fgetc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
+# endif
+_GL_CXXALIASWARN (fgetc);
+#endif
+
+#if @GNULIB_FGETS@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgets
+# define fgets rpl_fgets
+# endif
+_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+# endif
+_GL_CXXALIASWARN (fgets);
+#endif
+
+#if @GNULIB_FOPEN@
+# if @REPLACE_FOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fopen
+# define fopen rpl_fopen
+# endif
+_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+# endif
+_GL_CXXALIASWARN (fopen);
+#elif defined GNULIB_POSIXCHECK
+# undef fopen
+/* Assume fopen is always declared. */
+_GL_WARN_ON_USE (fopen, "fopen on Win32 platforms is not POSIX compatible - "
+ "use gnulib module fopen for portability");
+#endif
+
+#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
+# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
+ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fprintf rpl_fprintf
+# endif
+# define GNULIB_overrides_fprintf 1
+# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (fprintf);
+#endif
+#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_fprintf
+# undef fprintf
+# endif
+/* Assume fprintf is always declared. */
+_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
+ "use gnulib module fprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_FPURGE@
+/* Discard all pending buffered I/O data on STREAM.
+ STREAM must not be wide-character oriented.
+ When discarding pending output, the file position is set back to where it
+ was before the write calls. When discarding pending input, the file
+ position is advanced to match the end of the previously read input.
+ Return 0 if successful. Upon error, return -1 and set errno. */
+# if @REPLACE_FPURGE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fpurge rpl_fpurge
+# endif
+_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream));
+# else
+# if !@HAVE_DECL_FPURGE@
+_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream));
+# endif
+_GL_CXXALIASWARN (fpurge);
+#elif defined GNULIB_POSIXCHECK
+# undef fpurge
+# if HAVE_RAW_DECL_FPURGE
+_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
+ "use gnulib module fpurge for portability");
+# endif
+#endif
+
+#if @GNULIB_FPUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputc
+# define fputc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream));
+# endif
+_GL_CXXALIASWARN (fputc);
+#endif
+
+#if @GNULIB_FPUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputs
+# define fputs rpl_fputs
+# endif
+_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+# endif
+_GL_CXXALIASWARN (fputs);
+#endif
+
+#if @GNULIB_FREAD@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fread
+# define fread rpl_fread
+# endif
+_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+# endif
+_GL_CXXALIASWARN (fread);
+#endif
+
+#if @GNULIB_FREOPEN@
+# if @REPLACE_FREOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef freopen
+# define freopen rpl_freopen
+# endif
+_GL_FUNCDECL_RPL (freopen, FILE *,
+ (const char *filename, const char *mode, FILE *stream)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (freopen, FILE *,
+ (const char *filename, const char *mode, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (freopen, FILE *,
+ (const char *filename, const char *mode, FILE *stream));
+# endif
+_GL_CXXALIASWARN (freopen);
+#elif defined GNULIB_POSIXCHECK
+# undef freopen
+/* Assume freopen is always declared. */
+_GL_WARN_ON_USE (freopen,
+ "freopen on Win32 platforms is not POSIX compatible - "
+ "use gnulib module freopen for portability");
+#endif
+
+#if @GNULIB_FSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fscanf
+# define fscanf rpl_fscanf
+# endif
+_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (fscanf);
+#endif
+
+
+/* Set up the following warnings, based on which modules are in use.
+ GNU Coding Standards discourage the use of fseek, since it imposes
+ an arbitrary limitation on some 32-bit hosts. Remember that the
+ fseek module depends on the fseeko module, so we only have three
+ cases to consider:
+
+ 1. The developer is not using either module. Issue a warning under
+ GNULIB_POSIXCHECK for both functions, to remind them that both
+ functions have bugs on some systems. _GL_NO_LARGE_FILES has no
+ impact on this warning.
+
+ 2. The developer is using both modules. They may be unaware of the
+ arbitrary limitations of fseek, so issue a warning under
+ GNULIB_POSIXCHECK. On the other hand, they may be using both
+ modules intentionally, so the developer can define
+ _GL_NO_LARGE_FILES in the compilation units where the use of fseek
+ is safe, to silence the warning.
+
+ 3. The developer is using the fseeko module, but not fseek. Gnulib
+ guarantees that fseek will still work around platform bugs in that
+ case, but we presume that the developer is aware of the pitfalls of
+ fseek and was trying to avoid it, so issue a warning even when
+ GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be
+ defined to silence the warning in particular compilation units.
+ In C++ compilations with GNULIB_NAMESPACE, in order to avoid that
+ fseek gets defined as a macro, it is recommended that the developer
+ uses the fseek module, even if he is not calling the fseek function.
+
+ Most gnulib clients that perform stream operations should fall into
+ category 3. */
+
+#if @GNULIB_FSEEK@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 2, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseek
+# define fseek rpl_fseek
+# endif
+_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence));
+# endif
+_GL_CXXALIASWARN (fseek);
+#endif
+
+#if @GNULIB_FSEEKO@
+# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 3, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEKO@
+/* Provide an fseeko function that is aware of a preceding fflush(), and which
+ detects pipes. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseeko
+# define fseeko rpl_fseeko
+# endif
+_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
+# else
+# if ! @HAVE_DECL_FSEEKO@
+_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (fseeko);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FSEEK_WARN /* Category 1, above. */
+# undef fseek
+# undef fseeko
+# if HAVE_RAW_DECL_FSEEKO
+_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
+ "use gnulib module fseeko for portability");
+# endif
+#endif
+
+#ifdef _GL_FSEEK_WARN
+# undef _GL_FSEEK_WARN
+/* Here, either fseek is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_fseek (declared above). */
+_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use fseeko function for handling of large files");
+#endif
+
+
+/* ftell, ftello. See the comments on fseek/fseeko. */
+
+#if @GNULIB_FTELL@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 2, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftell
+# define ftell rpl_ftell
+# endif
+_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftell, long, (FILE *fp));
+# else
+_GL_CXXALIAS_SYS (ftell, long, (FILE *fp));
+# endif
+_GL_CXXALIASWARN (ftell);
+#endif
+
+#if @GNULIB_FTELLO@
+# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 3, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELLO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftello
+# define ftello rpl_ftello
+# endif
+_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
+# else
+# if ! @HAVE_DECL_FTELLO@
+_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
+# endif
+_GL_CXXALIASWARN (ftello);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FTELL_WARN /* Category 1, above. */
+# undef ftell
+# undef ftello
+# if HAVE_RAW_DECL_FTELLO
+_GL_WARN_ON_USE (ftello, "ftello is unportable - "
+ "use gnulib module ftello for portability");
+# endif
+#endif
+
+#ifdef _GL_FTELL_WARN
+# undef _GL_FTELL_WARN
+/* Here, either ftell is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_ftell (declared above). */
+_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use ftello function for handling of large files");
+#endif
+
+
+#if @GNULIB_FWRITE@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fwrite
+# define fwrite rpl_fwrite
+# endif
+_GL_FUNCDECL_RPL (fwrite, size_t,
+ (const void *ptr, size_t s, size_t n, FILE *stream)
+ _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (fwrite, size_t,
+ (const void *ptr, size_t s, size_t n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fwrite, size_t,
+ (const void *ptr, size_t s, size_t n, FILE *stream));
+
+/* Work around glibc bug 11959
+ <http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>,
+ which sometimes causes an unwanted diagnostic for fwrite calls.
+ This affects only function declaration attributes, so it's not
+ needed for C++. */
+# if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL
+static inline size_t _GL_ARG_NONNULL ((1, 4))
+rpl_fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+{
+ size_t r = fwrite (ptr, s, n, stream);
+ (void) r;
+ return r;
+}
+# undef fwrite
+# define fwrite rpl_fwrite
+# endif
+# endif
+_GL_CXXALIASWARN (fwrite);
+#endif
+
+#if @GNULIB_GETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getc
+# define getc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
+# endif
+_GL_CXXALIASWARN (getc);
+#endif
+
+#if @GNULIB_GETCHAR@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getchar
+# define getchar rpl_getchar
+# endif
+_GL_FUNCDECL_RPL (getchar, int, (void));
+_GL_CXXALIAS_RPL (getchar, int, (void));
+# else
+_GL_CXXALIAS_SYS (getchar, int, (void));
+# endif
+_GL_CXXALIASWARN (getchar);
+#endif
+
+#if @GNULIB_GETDELIM@
+/* Read input, up to (and including) the next occurrence of DELIMITER, from
+ STREAM, store it in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETDELIM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdelim
+# define getdelim rpl_getdelim
+# endif
+_GL_FUNCDECL_RPL (getdelim, ssize_t,
+ (char **lineptr, size_t *linesize, int delimiter,
+ FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+_GL_CXXALIAS_RPL (getdelim, ssize_t,
+ (char **lineptr, size_t *linesize, int delimiter,
+ FILE *stream));
+# else
+# if !@HAVE_DECL_GETDELIM@
+_GL_FUNCDECL_SYS (getdelim, ssize_t,
+ (char **lineptr, size_t *linesize, int delimiter,
+ FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+_GL_CXXALIAS_SYS (getdelim, ssize_t,
+ (char **lineptr, size_t *linesize, int delimiter,
+ FILE *stream));
+# endif
+_GL_CXXALIASWARN (getdelim);
+#elif defined GNULIB_POSIXCHECK
+# undef getdelim
+# if HAVE_RAW_DECL_GETDELIM
+_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
+ "use gnulib module getdelim for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLINE@
+/* Read a line, up to (and including) the next newline, from STREAM, store it
+ in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETLINE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getline
+# define getline rpl_getline
+# endif
+_GL_FUNCDECL_RPL (getline, ssize_t,
+ (char **lineptr, size_t *linesize, FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (getline, ssize_t,
+ (char **lineptr, size_t *linesize, FILE *stream));
+# else
+# if !@HAVE_DECL_GETLINE@
+_GL_FUNCDECL_SYS (getline, ssize_t,
+ (char **lineptr, size_t *linesize, FILE *stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getline, ssize_t,
+ (char **lineptr, size_t *linesize, FILE *stream));
+# endif
+# if @HAVE_DECL_GETLINE@
+_GL_CXXALIASWARN (getline);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getline
+# if HAVE_RAW_DECL_GETLINE
+_GL_WARN_ON_USE (getline, "getline is unportable - "
+ "use gnulib module getline for portability");
+# endif
+#endif
+
+#if @GNULIB_GETS@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gets
+# define gets rpl_gets
+# endif
+_GL_FUNCDECL_RPL (gets, char *, (char *s) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gets, char *, (char *s));
+# else
+_GL_CXXALIAS_SYS (gets, char *, (char *s));
+# undef gets
+# endif
+_GL_CXXALIASWARN (gets);
+/* It is very rare that the developer ever has full control of stdin,
+ so any use of gets warrants an unconditional warning. Assume it is
+ always declared, since it is required by C89. */
+_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif
+
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
+struct obstack;
+/* Grow an obstack with formatted output. Return the number of
+ bytes added to OBS. No trailing nul byte is added, and the
+ object should be closed with obstack_finish before use. Upon
+ memory allocation error, call obstack_alloc_failed_handler. Upon
+ other error, return -1. */
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_printf rpl_obstack_printf
+# endif
+_GL_FUNCDECL_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (obstack_printf);
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_vprintf rpl_obstack_vprintf
+# endif
+_GL_FUNCDECL_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (obstack_vprintf);
+#endif
+
+#if @GNULIB_PCLOSE@
+# if !@HAVE_PCLOSE@
+_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
+_GL_CXXALIASWARN (pclose);
+#elif defined GNULIB_POSIXCHECK
+# undef pclose
+# if HAVE_RAW_DECL_PCLOSE
+_GL_WARN_ON_USE (pclose, "popen is unportable - "
+ "use gnulib module pclose for more portability");
+# endif
+#endif
+
+#if @GNULIB_PERROR@
+/* Print a message to standard error, describing the value of ERRNO,
+ (if STRING is not NULL and not empty) prefixed with STRING and ": ",
+ and terminated with a newline. */
+# if @REPLACE_PERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define perror rpl_perror
+# endif
+_GL_FUNCDECL_RPL (perror, void, (const char *string));
+_GL_CXXALIAS_RPL (perror, void, (const char *string));
+# else
+_GL_CXXALIAS_SYS (perror, void, (const char *string));
+# endif
+_GL_CXXALIASWARN (perror);
+#elif defined GNULIB_POSIXCHECK
+# undef perror
+/* Assume perror is always declared. */
+_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
+ "use gnulib module perror for portability");
+#endif
+
+#if @GNULIB_POPEN@
+# if @REPLACE_POPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef popen
+# define popen rpl_popen
+# endif
+_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
+# else
+# if !@HAVE_POPEN@
+_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
+# endif
+_GL_CXXALIASWARN (popen);
+#elif defined GNULIB_POSIXCHECK
+# undef popen
+# if HAVE_RAW_DECL_POPEN
+_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
+ "use gnulib module popen or pipe for more portability");
+# endif
+#endif
+
+#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
+# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
+ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if defined __GNUC__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+/* Don't break __attribute__((format(printf,M,N))). */
+# define printf __printf__
+# endif
+# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define printf rpl_printf
+# endif
+_GL_FUNCDECL_RPL (printf, int,
+ (const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+# endif
+# define GNULIB_overrides_printf 1
+# else
+_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+# endif
+_GL_CXXALIASWARN (printf);
+#endif
+#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_printf
+# undef printf
+# endif
+/* Assume printf is always declared. */
+_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
+ "use gnulib module printf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_PUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putc
+# define putc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream));
+# endif
+_GL_CXXALIASWARN (putc);
+#endif
+
+#if @GNULIB_PUTCHAR@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putchar
+# define putchar rpl_putchar
+# endif
+_GL_FUNCDECL_RPL (putchar, int, (int c));
+_GL_CXXALIAS_RPL (putchar, int, (int c));
+# else
+_GL_CXXALIAS_SYS (putchar, int, (int c));
+# endif
+_GL_CXXALIASWARN (putchar);
+#endif
+
+#if @GNULIB_PUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef puts
+# define puts rpl_puts
+# endif
+_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (puts, int, (const char *string));
+# else
+_GL_CXXALIAS_SYS (puts, int, (const char *string));
+# endif
+_GL_CXXALIASWARN (puts);
+#endif
+
+#if @GNULIB_REMOVE@
+# if @REPLACE_REMOVE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remove
+# define remove rpl_remove
+# endif
+_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (remove, int, (const char *name));
+# else
+_GL_CXXALIAS_SYS (remove, int, (const char *name));
+# endif
+_GL_CXXALIASWARN (remove);
+#elif defined GNULIB_POSIXCHECK
+# undef remove
+/* Assume remove is always declared. */
+_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
+ "use gnulib module remove for more portability");
+#endif
+
+#if @GNULIB_RENAME@
+# if @REPLACE_RENAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rename
+# define rename rpl_rename
+# endif
+_GL_FUNCDECL_RPL (rename, int,
+ (const char *old_filename, const char *new_filename)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (rename, int,
+ (const char *old_filename, const char *new_filename));
+# else
+_GL_CXXALIAS_SYS (rename, int,
+ (const char *old_filename, const char *new_filename));
+# endif
+_GL_CXXALIASWARN (rename);
+#elif defined GNULIB_POSIXCHECK
+# undef rename
+/* Assume rename is always declared. */
+_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
+ "use gnulib module rename for more portability");
+#endif
+
+#if @GNULIB_RENAMEAT@
+# if @REPLACE_RENAMEAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef renameat
+# define renameat rpl_renameat
+# endif
+_GL_FUNCDECL_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# else
+# if !@HAVE_RENAMEAT@
+_GL_FUNCDECL_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# endif
+_GL_CXXALIASWARN (renameat);
+#elif defined GNULIB_POSIXCHECK
+# undef renameat
+# if HAVE_RAW_DECL_RENAMEAT
+_GL_WARN_ON_USE (renameat, "renameat is not portable - "
+ "use gnulib module renameat for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if defined __GNUC__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+/* Don't break __attribute__((format(scanf,M,N))). */
+# define scanf __scanf__
+# endif
+_GL_FUNCDECL_RPL_1 (__scanf__, int,
+ (const char *format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+# define scanf rpl_scanf
+# endif
+_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+# endif
+# else
+_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+# endif
+_GL_CXXALIASWARN (scanf);
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define snprintf rpl_snprintf
+# endif
+_GL_FUNCDECL_RPL (snprintf, int,
+ (char *str, size_t size, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (snprintf, int,
+ (char *str, size_t size, const char *format, ...));
+# else
+# if !@HAVE_DECL_SNPRINTF@
+_GL_FUNCDECL_SYS (snprintf, int,
+ (char *str, size_t size, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (snprintf, int,
+ (char *str, size_t size, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (snprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# if HAVE_RAW_DECL_SNPRINTF
+_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
+ "use gnulib module snprintf for portability");
+# endif
+#endif
+
+/* Some people would argue that sprintf should be handled like gets
+ (for example, OpenBSD issues a link warning for both functions),
+ since both can cause security holes due to buffer overruns.
+ However, we believe that sprintf can be used safely, and is more
+ efficient than snprintf in those safe cases; and as proof of our
+ belief, we use sprintf in several gnulib modules. So this header
+ intentionally avoids adding a warning to sprintf except when
+ GNULIB_POSIXCHECK is defined. */
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define sprintf rpl_sprintf
+# endif
+_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (sprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+/* Assume sprintf is always declared. */
+_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
+ "use gnulib module sprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_TMPFILE@
+# if @REPLACE_TMPFILE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define tmpfile rpl_tmpfile
+# endif
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
+# else
+_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
+# endif
+_GL_CXXALIASWARN (tmpfile);
+#elif defined GNULIB_POSIXCHECK
+# undef tmpfile
+# if HAVE_RAW_DECL_TMPFILE
+_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
+ "use gnulib module tmpfile for portability");
+# endif
+#endif
+
+#if @GNULIB_VASPRINTF@
+/* Write formatted output to a string dynamically allocated with malloc().
+ If the memory allocation succeeds, store the address of the string in
+ *RESULT and return the number of resulting bytes, excluding the trailing
+ NUL. Upon memory allocation error, or some other error, return -1. */
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define asprintf rpl_asprintf
+# endif
+_GL_FUNCDECL_RPL (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (asprintf, int,
+ (char **result, const char *format, ...));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (asprintf, int,
+ (char **result, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (asprintf);
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vasprintf rpl_vasprintf
+# endif
+_GL_FUNCDECL_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vasprintf);
+#endif
+
+#if @GNULIB_VDPRINTF@
+# if @REPLACE_VDPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vdprintf rpl_vdprintf
+# endif
+_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+# else
+# if !@HAVE_VDPRINTF@
+_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((2)));
+# endif
+/* Need to cast, because on Solaris, the third parameter will likely be
+ __va_list args. */
+_GL_CXXALIAS_SYS_CAST (vdprintf, int,
+ (int fd, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vdprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef vdprintf
+# if HAVE_RAW_DECL_VDPRINTF
+_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
+ "use gnulib module vdprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
+# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
+ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vfprintf rpl_vfprintf
+# endif
+# define GNULIB_overrides_vfprintf 1
+# if @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vfprintf, int,
+ (FILE *fp, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vfprintf);
+#endif
+#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vfprintf
+# undef vfprintf
+# endif
+/* Assume vfprintf is always declared. */
+_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
+ "use gnulib module vfprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VFSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vfscanf
+# define vfscanf rpl_vfscanf
+# endif
+_GL_FUNCDECL_RPL (vfscanf, int,
+ (FILE *stream, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vfscanf, int,
+ (FILE *stream, const char *format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vfscanf, int,
+ (FILE *stream, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vfscanf);
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
+# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
+ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vprintf rpl_vprintf
+# endif
+# define GNULIB_overrides_vprintf 1
+# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the second parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vprintf);
+#endif
+#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vprintf
+# undef vprintf
+# endif
+/* Assume vprintf is always declared. */
+_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
+ "use gnulib module vprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vscanf
+# define vscanf rpl_vscanf
+# endif
+_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vscanf);
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsnprintf rpl_vsnprintf
+# endif
+_GL_FUNCDECL_RPL (vsnprintf, int,
+ (char *str, size_t size, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (vsnprintf, int,
+ (char *str, size_t size, const char *format, va_list args));
+# else
+# if !@HAVE_DECL_VSNPRINTF@
+_GL_FUNCDECL_SYS (vsnprintf, int,
+ (char *str, size_t size, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (vsnprintf, int,
+ (char *str, size_t size, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vsnprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# if HAVE_RAW_DECL_VSNPRINTF
+_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
+ "use gnulib module vsnprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsprintf rpl_vsprintf
+# endif
+_GL_FUNCDECL_RPL (vsprintf, int,
+ (char *str, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vsprintf, int,
+ (char *str, const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vsprintf, int,
+ (char *str, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vsprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+/* Assume vsprintf is always declared. */
+_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
+ "use gnulib module vsprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif
diff --git a/gnulib/lib/stdlib--.h b/gnulib/lib/stdlib--.h
new file mode 100644
index 0000000..108456c
--- /dev/null
+++ b/gnulib/lib/stdlib--.h
@@ -0,0 +1,36 @@
+/* Like stdlib.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdlib.h>
+#include "stdlib-safer.h"
+
+#undef mkstemp
+#define mkstemp mkstemp_safer
+
+#if GNULIB_MKOSTEMP
+# define mkostemp mkostemp_safer
+#endif
+
+#if GNULIB_MKOSTEMPS
+# define mkostemps mkostemps_safer
+#endif
+
+#if GNULIB_MKSTEMPS
+# define mkstemps mkstemps_safer
+#endif
diff --git a/gnulib/lib/stdlib-safer.h b/gnulib/lib/stdlib-safer.h
new file mode 100644
index 0000000..dd8f1b3
--- /dev/null
+++ b/gnulib/lib/stdlib-safer.h
@@ -0,0 +1,32 @@
+/* Invoke stdlib.h functions, but avoid some glitches.
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+int mkstemp_safer (char *);
+
+#if GNULIB_MKOSTEMP
+int mkostemp_safer (char *, int);
+#endif
+
+#if GNULIB_MKOSTEMPS
+int mkostemps_safer (char *, int, int);
+#endif
+
+#if GNULIB_MKSTEMPS
+int mkstemps_safer (char *, int);
+#endif
diff --git a/gnulib/lib/stdlib.in.h b/gnulib/lib/stdlib.in.h
new file mode 100644
index 0000000..a59cb08
--- /dev/null
+++ b/gnulib/lib/stdlib.in.h
@@ -0,0 +1,804 @@
+/* A GNU-like <stdlib.h>.
+
+ Copyright (C) 1995, 2001-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_malloc_and_calloc
+/* Special invocation convention inside glibc header files. */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+#define _@GUARD_PREFIX@_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
+#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
+# include <sys/wait.h>
+#endif
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>. */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+# include <sys/loadavg.h>
+#endif
+
+#if @GNULIB_RANDOM_R@
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+ from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
+ 'struct random_data'. */
+# if @HAVE_RANDOM_H@
+# include <random.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@ || !@HAVE_RANDOM_R@
+# include <stdint.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@
+/* Define 'struct random_data'.
+ But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
+# if !GNULIB_defined_struct_random_data
+struct random_data
+{
+ int32_t *fptr; /* Front pointer. */
+ int32_t *rptr; /* Rear pointer. */
+ int32_t *state; /* Array of state values. */
+ int rand_type; /* Type of random number generator. */
+ int rand_deg; /* Degree of random number generator. */
+ int rand_sep; /* Distance between front and rear. */
+ int32_t *end_ptr; /* Pointer behind state table. */
+};
+# define GNULIB_defined_struct_random_data 1
+# endif
+# endif
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+/* On MacOS X 10.3, only <unistd.h> declares mkstemp. */
+/* On MacOS X 10.5, only <unistd.h> declares mkstemps. */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
+/* But avoid namespace pollution on glibc systems and native Windows. */
+# include <unistd.h>
+#endif
+
+/* The definition of _Noreturn is copied here. */
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+ with proper operation of xargs. */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#if @GNULIB__EXIT@
+/* Terminate the current process with the given return code, without running
+ the 'atexit' handlers. */
+# if !@HAVE__EXIT@
+_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
+# endif
+_GL_CXXALIAS_SYS (_Exit, void, (int status));
+_GL_CXXALIASWARN (_Exit);
+#elif defined GNULIB_POSIXCHECK
+# undef _Exit
+# if HAVE_RAW_DECL__EXIT
+_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
+ "use gnulib module _Exit for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATOLL@
+/* Parse a signed decimal integer.
+ Returns the value of the integer. Errors are not detected. */
+# if !@HAVE_ATOLL@
+_GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
+_GL_CXXALIASWARN (atoll);
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+ "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if @REPLACE_CALLOC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef calloc
+# define calloc rpl_calloc
+# endif
+_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
+# else
+_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
+# endif
+_GL_CXXALIASWARN (calloc);
+#elif defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared. */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+ "use gnulib module calloc-posix for portability");
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define canonicalize_file_name rpl_canonicalize_file_name
+# endif
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
+# else
+# if !@HAVE_CANONICALIZE_FILE_NAME@
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
+# endif
+_GL_CXXALIASWARN (canonicalize_file_name);
+#elif defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name,
+ "canonicalize_file_name is unportable - "
+ "use gnulib module canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+ The three numbers are the load average of the last 1 minute, the last 5
+ minutes, and the last 15 minutes, respectively.
+ LOADAVG is an array of NELEM numbers. */
+# if !@HAVE_DECL_GETLOADAVG@
+_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
+_GL_CXXALIASWARN (getloadavg);
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+ "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+ "token" or "token=value", getsubopt parses the first of these elements.
+ If the first element refers to a "token" that is member of the given
+ NULL-terminated array of tokens:
+ - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+ the first option and the comma, sets *VALUEP to the value of the
+ element (or NULL if it doesn't contain an "=" sign),
+ - It returns the index of the "token" in the given array of tokens.
+ Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+ For more details see the POSIX:2001 specification.
+ http://www.opengroup.org/susv3xsh/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+_GL_FUNCDECL_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep));
+_GL_CXXALIASWARN (getsubopt);
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+ "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_GRANTPT@
+/* Change the ownership and access permission of the slave side of the
+ pseudo-terminal whose master side is specified by FD. */
+# if !@HAVE_GRANTPT@
+_GL_FUNCDECL_SYS (grantpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (grantpt, int, (int fd));
+_GL_CXXALIASWARN (grantpt);
+#elif defined GNULIB_POSIXCHECK
+# undef grantpt
+# if HAVE_RAW_DECL_GRANTPT
+_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
+ "use gnulib module grantpt for portability");
+# endif
+#endif
+
+/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
+ rely on GNU or POSIX semantics for malloc and realloc (for example,
+ by never specifying a zero size), so it does not need malloc or
+ realloc to be redefined. */
+#if @GNULIB_MALLOC_POSIX@
+# if @REPLACE_MALLOC@
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef malloc
+# define malloc rpl_malloc
+# endif
+_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
+# else
+_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
+# endif
+_GL_CXXALIASWARN (malloc);
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef malloc
+/* Assume malloc is always declared. */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+ "use gnulib module malloc-posix for portability");
+#endif
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBTOWC@
+# if @REPLACE_MBTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbtowc
+# define mbtowc rpl_mbtowc
+# endif
+_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# else
+_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# endif
+_GL_CXXALIASWARN (mbtowc);
+#endif
+
+#if @GNULIB_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the directory name unique.
+ Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+ The directory is created mode 700. */
+# if !@HAVE_MKDTEMP@
+_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
+_GL_CXXALIASWARN (mkdtemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+ "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKOSTEMP@
+_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+ "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE before a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKOSTEMPS@
+_GL_FUNCDECL_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+ "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if @REPLACE_MKSTEMP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mkstemp rpl_mkstemp
+# endif
+_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
+# else
+# if ! @HAVE_MKSTEMP@
+_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mkstemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+ "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE prior to a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKSTEMPS@
+_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
+_GL_CXXALIASWARN (mkstemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+ "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_OPENPT@
+/* Return an FD open to the master side of a pseudo-terminal. Flags should
+ include O_RDWR, and may also include O_NOCTTY. */
+# if !@HAVE_POSIX_OPENPT@
+_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
+# endif
+_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
+_GL_CXXALIASWARN (posix_openpt);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_openpt
+# if HAVE_RAW_DECL_POSIX_OPENPT
+_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
+ "use gnulib module posix_openpt for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME@
+/* Return the pathname of the pseudo-terminal slave associated with
+ the master FD is open on, or NULL on errors. */
+# if !@HAVE_PTSNAME@
+_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+_GL_CXXALIASWARN (ptsname);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname
+# if HAVE_RAW_DECL_PTSNAME
+_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
+ "use gnulib module ptsname for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME_R@
+/* Set the pathname of the pseudo-terminal slave associated with
+ the master FD is open on and return 0, or set errno and return
+ non-zero on errors. */
+# if @REPLACE_PTSNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ptsname_r
+# define ptsname_r rpl_ptsname_r
+# endif
+_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+# else
+# if !@HAVE_PTSNAME_R@
+_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIASWARN (ptsname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname_r
+# if HAVE_RAW_DECL_PTSNAME_R
+_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
+ "use gnulib module ptsname_r for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv rpl_putenv
+# endif
+_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+# ifndef RAND_MAX
+# define RAND_MAX 2147483647
+# endif
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
+_GL_CXXALIASWARN (random_r);
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state));
+_GL_CXXALIASWARN (srandom_r);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state));
+_GL_CXXALIASWARN (initstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state));
+_GL_CXXALIASWARN (setstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOC_POSIX@
+# if @REPLACE_REALLOC@
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef realloc
+# define realloc rpl_realloc
+# endif
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
+# else
+_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
+# endif
+_GL_CXXALIASWARN (realloc);
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef realloc
+/* Assume realloc is always declared. */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+ "use gnulib module realloc-posix for portability");
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define realpath rpl_realpath
+# endif
+_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+# else
+# if !@HAVE_REALPATH@
+_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+# endif
+_GL_CXXALIASWARN (realpath);
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+ "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+/* Test a user response to a question.
+ Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
+# if !@HAVE_RPMATCH@
+_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
+_GL_CXXALIASWARN (rpmatch);
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+ "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value. */
+# if @REPLACE_SETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setenv
+# define setenv rpl_setenv
+# endif
+_GL_FUNCDECL_RPL (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setenv, int,
+ (const char *name, const char *value, int replace));
+# else
+# if !@HAVE_DECL_SETENV@
+_GL_FUNCDECL_SYS (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (setenv, int,
+ (const char *name, const char *value, int replace));
+# endif
+# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
+_GL_CXXALIASWARN (setenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+ "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate. */
+# if @REPLACE_STRTOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtod rpl_strtod
+# endif
+_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+# else
+# if !@HAVE_STRTOD@
+_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+# endif
+_GL_CXXALIASWARN (strtod);
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+ "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+ to ERANGE. */
+# if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+ (const char *string, char **endptr, int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoll, long long,
+ (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoll);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+ "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is ULLONG_MAX, and errno is set to
+ ERANGE. */
+# if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+ (const char *string, char **endptr, int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoull, unsigned long long,
+ (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoull);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+ "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNLOCKPT@
+/* Unlock the slave side of the pseudo-terminal whose master side is specified
+ by FD, so that it can be opened. */
+# if !@HAVE_UNLOCKPT@
+_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
+_GL_CXXALIASWARN (unlockpt);
+#elif defined GNULIB_POSIXCHECK
+# undef unlockpt
+# if HAVE_RAW_DECL_UNLOCKPT
+_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
+ "use gnulib module unlockpt for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+/* Remove the variable NAME from the environment. */
+# if @REPLACE_UNSETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unsetenv
+# define unsetenv rpl_unsetenv
+# endif
+_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
+# else
+# if !@HAVE_DECL_UNSETENV@
+_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
+# endif
+# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
+_GL_CXXALIASWARN (unsetenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+ "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCTOMB@
+# if @REPLACE_WCTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctomb
+# define wctomb rpl_wctomb
+# endif
+_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
+_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
+# else
+_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
+# endif
+_GL_CXXALIASWARN (wctomb);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif
diff --git a/gnulib/lib/stpcpy.c b/gnulib/lib/stpcpy.c
new file mode 100644
index 0000000..fa42af4
--- /dev/null
+++ b/gnulib/lib/stpcpy.c
@@ -0,0 +1,49 @@
+/* stpcpy.c -- copy a string and return pointer to end of new string
+ Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#undef __stpcpy
+#ifdef _LIBC
+# undef stpcpy
+#endif
+
+#ifndef weak_alias
+# define __stpcpy stpcpy
+#endif
+
+/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
+char *
+__stpcpy (char *dest, const char *src)
+{
+ register char *d = dest;
+ register const char *s = src;
+
+ do
+ *d++ = *s;
+ while (*s++ != '\0');
+
+ return d - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpcpy, stpcpy)
+#endif
diff --git a/gnulib/lib/stpncpy.c b/gnulib/lib/stpncpy.c
new file mode 100644
index 0000000..8cd49cc
--- /dev/null
+++ b/gnulib/lib/stpncpy.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 1993, 1995-1997, 2002-2003, 2005-2007, 2009-2011 Free Software
+ * Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#ifndef weak_alias
+# define __stpncpy stpncpy
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+char *
+__stpncpy (char *dest, const char *src, size_t n)
+{
+ char c;
+ char *s = dest;
+
+ if (n >= 4)
+ {
+ size_t n4 = n >> 2;
+
+ for (;;)
+ {
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ c = *src++;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ if (--n4 == 0)
+ goto last_chars;
+ }
+ n -= dest - s;
+ goto zero_fill;
+ }
+
+ last_chars:
+ n &= 3;
+ if (n == 0)
+ return dest;
+
+ for (;;)
+ {
+ c = *src++;
+ --n;
+ *dest++ = c;
+ if (c == '\0')
+ break;
+ if (n == 0)
+ return dest;
+ }
+
+ zero_fill:
+ while (n-- > 0)
+ dest[n] = '\0';
+
+ return dest - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpncpy, stpncpy)
+#endif
diff --git a/gnulib/lib/str-kmp.h b/gnulib/lib/str-kmp.h
new file mode 100644
index 0000000..d7e0a74
--- /dev/null
+++ b/gnulib/lib/str-kmp.h
@@ -0,0 +1,154 @@
+/* Substring search in a NUL terminated string of UNIT elements,
+ using the Knuth-Morris-Pratt algorithm.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Before including this file, you need to define:
+ UNIT The element type of the needle and haystack.
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from needle or haystack.
+ The argument is of type UNIT; the result must be
+ of type UNIT as well. */
+
+/* Knuth-Morris-Pratt algorithm.
+ See http://en.wikipedia.org/wiki/Knuth-Morris-Pratt_algorithm
+ HAYSTACK is the NUL terminated string in which to search for.
+ NEEDLE is the string to search for in HAYSTACK, consisting of NEEDLE_LEN
+ units.
+ Return a boolean indicating success:
+ Return true and set *RESULTP if the search was completed.
+ Return false if it was aborted because not enough memory was available. */
+static bool
+knuth_morris_pratt (const UNIT *haystack,
+ const UNIT *needle, size_t needle_len,
+ const UNIT **resultp)
+{
+ size_t m = needle_len;
+
+ /* Allocate the table. */
+ size_t *table = (size_t *) nmalloca (m, sizeof (size_t));
+ if (table == NULL)
+ return false;
+ /* Fill the table.
+ For 0 < i < m:
+ 0 < table[i] <= i is defined such that
+ forall 0 < x < table[i]: needle[x..i-1] != needle[0..i-1-x],
+ and table[i] is as large as possible with this property.
+ This implies:
+ 1) For 0 < i < m:
+ If table[i] < i,
+ needle[table[i]..i-1] = needle[0..i-1-table[i]].
+ 2) For 0 < i < m:
+ rhaystack[0..i-1] == needle[0..i-1]
+ and exists h, i <= h < m: rhaystack[h] != needle[h]
+ implies
+ forall 0 <= x < table[i]: rhaystack[x..x+m-1] != needle[0..m-1].
+ table[0] remains uninitialized. */
+ {
+ size_t i, j;
+
+ /* i = 1: Nothing to verify for x = 0. */
+ table[1] = 1;
+ j = 0;
+
+ for (i = 2; i < m; i++)
+ {
+ /* Here: j = i-1 - table[i-1].
+ The inequality needle[x..i-1] != needle[0..i-1-x] is known to hold
+ for x < table[i-1], by induction.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ UNIT b = CANON_ELEMENT (needle[i - 1]);
+
+ for (;;)
+ {
+ /* Invariants: The inequality needle[x..i-1] != needle[0..i-1-x]
+ is known to hold for x < i-1-j.
+ Furthermore, if j>0: needle[i-1-j..i-2] = needle[0..j-1]. */
+ if (b == CANON_ELEMENT (needle[j]))
+ {
+ /* Set table[i] := i-1-j. */
+ table[i] = i - ++j;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for x = i-1-j, because
+ needle[i-1] != needle[j] = needle[i-1-x]. */
+ if (j == 0)
+ {
+ /* The inequality holds for all possible x. */
+ table[i] = i;
+ break;
+ }
+ /* The inequality needle[x..i-1] != needle[0..i-1-x] also holds
+ for i-1-j < x < i-1-j+table[j], because for these x:
+ needle[x..i-2]
+ = needle[x-(i-1-j)..j-1]
+ != needle[0..j-1-(x-(i-1-j))] (by definition of table[j])
+ = needle[0..i-2-x],
+ hence needle[x..i-1] != needle[0..i-1-x].
+ Furthermore
+ needle[i-1-j+table[j]..i-2]
+ = needle[table[j]..j-1]
+ = needle[0..j-1-table[j]] (by definition of table[j]). */
+ j = j - table[j];
+ }
+ /* Here: j = i - table[i]. */
+ }
+ }
+
+ /* Search, using the table to accelerate the processing. */
+ {
+ size_t j;
+ const UNIT *rhaystack;
+ const UNIT *phaystack;
+
+ *resultp = NULL;
+ j = 0;
+ rhaystack = haystack;
+ phaystack = haystack;
+ /* Invariant: phaystack = rhaystack + j. */
+ while (*phaystack != 0)
+ if (CANON_ELEMENT (needle[j]) == CANON_ELEMENT (*phaystack))
+ {
+ j++;
+ phaystack++;
+ if (j == m)
+ {
+ /* The entire needle has been found. */
+ *resultp = rhaystack;
+ break;
+ }
+ }
+ else if (j > 0)
+ {
+ /* Found a match of needle[0..j-1], mismatch at needle[j]. */
+ rhaystack += table[j];
+ j -= table[j];
+ }
+ else
+ {
+ /* Found a mismatch at needle[0] already. */
+ rhaystack++;
+ phaystack++;
+ }
+ }
+
+ freea (table);
+ return true;
+}
+
+#undef CANON_ELEMENT
diff --git a/gnulib/lib/str-two-way.h b/gnulib/lib/str-two-way.h
new file mode 100644
index 0000000..7dcb387
--- /dev/null
+++ b/gnulib/lib/str-two-way.h
@@ -0,0 +1,453 @@
+/* Byte-wise substring search, using the Two-Way algorithm.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Before including this file, you need to include <config.h> and
+ <string.h>, and define:
+ RESULT_TYPE A macro that expands to the return type.
+ AVAILABLE(h, h_l, j, n_l)
+ A macro that returns nonzero if there are
+ at least N_L bytes left starting at H[J].
+ H is 'unsigned char *', H_L, J, and N_L
+ are 'size_t'; H_L is an lvalue. For
+ NUL-terminated searches, H_L can be
+ modified each iteration to avoid having
+ to compute the end of H up front.
+
+ For case-insensitivity, you may optionally define:
+ CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
+ characters of P1 and P2 are equal.
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from one of the two strings.
+ The argument is an 'unsigned char'; the result
+ must be an 'unsigned char' as well.
+
+ This file undefines the macros documented above, and defines
+ LONG_NEEDLE_THRESHOLD.
+*/
+
+#include <limits.h>
+#include <stdint.h>
+
+/* We use the Two-Way string matching algorithm (also known as
+ Chrochemore-Perrin), which guarantees linear complexity with
+ constant space. Additionally, for long needles, we also use a bad
+ character shift table similar to the Boyer-Moore algorithm to
+ achieve improved (potentially sub-linear) performance.
+
+ See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260,
+ http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm,
+ http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.6641&rep=rep1&type=pdf
+*/
+
+/* Point at which computing a bad-byte shift table is likely to be
+ worthwhile. Small needles should not compute a table, since it
+ adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
+ speedup no greater than a factor of NEEDLE_LEN. The larger the
+ needle, the better the potential performance gain. On the other
+ hand, on non-POSIX systems with CHAR_BIT larger than eight, the
+ memory required for the table is prohibitive. */
+#if CHAR_BIT < 10
+# define LONG_NEEDLE_THRESHOLD 32U
+#else
+# define LONG_NEEDLE_THRESHOLD SIZE_MAX
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a < b) ? (b) : (a))
+#endif
+
+#ifndef CANON_ELEMENT
+# define CANON_ELEMENT(c) c
+#endif
+#ifndef CMP_FUNC
+# define CMP_FUNC memcmp
+#endif
+
+/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
+ Return the index of the first byte in the right half, and set
+ *PERIOD to the global period of the right half.
+
+ The global period of a string is the smallest index (possibly its
+ length) at which all remaining bytes in the string are repetitions
+ of the prefix (the last repetition may be a subset of the prefix).
+
+ When NEEDLE is factored into two halves, a local period is the
+ length of the smallest word that shares a suffix with the left half
+ and shares a prefix with the right half. All factorizations of a
+ non-empty NEEDLE have a local period of at least 1 and no greater
+ than NEEDLE_LEN.
+
+ A critical factorization has the property that the local period
+ equals the global period. All strings have at least one critical
+ factorization with the left half smaller than the global period.
+ And while some strings have more than one critical factorization,
+ it is provable that with an ordered alphabet, at least one of the
+ critical factorizations corresponds to a maximal suffix.
+
+ Given an ordered alphabet, a critical factorization can be computed
+ in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
+ shorter of two ordered maximal suffixes. The ordered maximal
+ suffixes are determined by lexicographic comparison while tracking
+ periodicity. */
+static size_t
+critical_factorization (const unsigned char *needle, size_t needle_len,
+ size_t *period)
+{
+ /* Index of last byte of left half, or SIZE_MAX. */
+ size_t max_suffix, max_suffix_rev;
+ size_t j; /* Index into NEEDLE for current candidate suffix. */
+ size_t k; /* Offset into current period. */
+ size_t p; /* Intermediate period. */
+ unsigned char a, b; /* Current comparison bytes. */
+
+ /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered
+ out 0-length needles. */
+ if (needle_len < 3)
+ {
+ *period = 1;
+ return needle_len - 1;
+ }
+
+ /* Invariants:
+ 0 <= j < NEEDLE_LEN - 1
+ -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
+ min(max_suffix, max_suffix_rev) < global period of NEEDLE
+ 1 <= p <= global period of NEEDLE
+ p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
+ 1 <= k <= p
+ */
+
+ /* Perform lexicographic search. */
+ max_suffix = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix + k]);
+ if (a < b)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* b < a */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix = j++;
+ k = p = 1;
+ }
+ }
+ *period = p;
+
+ /* Perform reverse lexicographic search. */
+ max_suffix_rev = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix_rev + k]);
+ if (b < a)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix_rev;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* a < b */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix_rev = j++;
+ k = p = 1;
+ }
+ }
+
+ /* Choose the shorter suffix. Return the index of the first byte of
+ the right half, rather than the last byte of the left half.
+
+ For some examples, 'banana' has two critical factorizations, both
+ exposed by the two lexicographic extreme suffixes of 'anana' and
+ 'nana', where both suffixes have a period of 2. On the other
+ hand, with 'aab' and 'bba', both strings have a single critical
+ factorization of the last byte, with the suffix having a period
+ of 1. While the maximal lexicographic suffix of 'aab' is 'b',
+ the maximal lexicographic suffix of 'bba' is 'ba', which is not a
+ critical factorization. Conversely, the maximal reverse
+ lexicographic suffix of 'a' works for 'bba', but not 'ab' for
+ 'aab'. The shorter suffix of the two will always be a critical
+ factorization. */
+ if (max_suffix_rev + 1 < max_suffix + 1)
+ return max_suffix + 1;
+ *period = p;
+ return max_suffix_rev + 1;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 2 * NEEDLE_LEN comparisons.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
+static RETURN_TYPE
+two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch in the left half can
+ only advance by the period, so use memory to avoid rescanning
+ known occurrences of the period in the right half. */
+ size_t memory = 0;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = MAX (suffix, memory);
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = suffix;
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
+ and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
+ sublinear performance is not possible. */
+static RETURN_TYPE
+two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+ size_t shift_table[1U << CHAR_BIT]; /* See below. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Populate shift_table. For each possible byte value c,
+ shift_table[c] is the distance from the last occurrence of c to
+ the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
+ shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
+ for (i = 0; i < 1U << CHAR_BIT; i++)
+ shift_table[i] = needle_len;
+ for (i = 0; i < needle_len; i++)
+ shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch in the left half can
+ only advance by the period, so use memory to avoid rescanning
+ known occurrences of the period in the right half. */
+ size_t memory = 0;
+ size_t shift;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ if (memory && shift < period)
+ {
+ /* Since needle is periodic, but the last period has
+ a byte out of place, there can be no match until
+ after the mismatch. */
+ shift = needle_len - period;
+ }
+ memory = 0;
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = MAX (suffix, memory);
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ size_t shift;
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = suffix;
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+#undef AVAILABLE
+#undef CANON_ELEMENT
+#undef CMP_FUNC
+#undef MAX
+#undef RETURN_TYPE
diff --git a/gnulib/lib/strcasecmp.c b/gnulib/lib/strcasecmp.c
new file mode 100644
index 0000000..fb57d20
--- /dev/null
+++ b/gnulib/lib/strcasecmp.c
@@ -0,0 +1,63 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work with multibyte strings! */
+
+int
+strcasecmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/strcasestr.c b/gnulib/lib/strcasestr.c
new file mode 100644
index 0000000..a2a1043
--- /dev/null
+++ b/gnulib/lib/strcasestr.c
@@ -0,0 +1,83 @@
+/* Case-insensitive searching in a string.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <stdbool.h>
+#include <strings.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT(c) TOLOWER (c)
+#define CMP_FUNC(p1, p2, l) \
+ strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using
+ case-insensitive comparison. This function gives unspecified
+ results in multibyte locales. */
+char *
+strcasestr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ {
+ ok &= (TOLOWER ((unsigned char) *haystack)
+ == TOLOWER ((unsigned char) *needle));
+ haystack++;
+ needle++;
+ }
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/strchrnul.c b/gnulib/lib/strchrnul.c
new file mode 100644
index 0000000..61db4e8
--- /dev/null
+++ b/gnulib/lib/strchrnul.c
@@ -0,0 +1,142 @@
+/* Searching in a string.
+ Copyright (C) 2003, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+char *
+strchrnul (const char *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+ if (!c)
+ return rawmemchr (s, 0);
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (!*char_ptr || *char_ptr == c)
+ return (char *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 or
+ longword2 is zero.
+
+ Let's consider longword1. We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 or longword2 is zero is equivalent
+ to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
+ this into a single test, whether (tmp1 | tmp2) is nonzero.
+
+ This test can read more than one byte beyond the end of a string,
+ depending on where the terminating NUL is encountered. However,
+ this is considered safe since the initialization phase ensured
+ that the read will be aligned, therefore, the read will not cross
+ page boundaries and will not cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+ longword longword2 = *longword_ptr;
+
+ if (((((longword1 - repeated_one) & ~longword1)
+ | ((longword2 - repeated_one) & ~longword2))
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == 0 or == c. On little-endian machines,
+ we could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr && (*char_ptr != c))
+ char_ptr++;
+ return (char *) char_ptr;
+}
diff --git a/gnulib/lib/strchrnul.valgrind b/gnulib/lib/strchrnul.valgrind
new file mode 100644
index 0000000..b14fa13
--- /dev/null
+++ b/gnulib/lib/strchrnul.valgrind
@@ -0,0 +1,12 @@
+# Suppress a valgrind message about use of uninitialized memory in strchrnul().
+# This use is OK because it provides only a speedup.
+{
+ strchrnul-value4
+ Memcheck:Value4
+ fun:strchrnul
+}
+{
+ strchrnul-value8
+ Memcheck:Value8
+ fun:strchrnul
+}
diff --git a/gnulib/lib/strcspn.c b/gnulib/lib/strcspn.c
new file mode 100644
index 0000000..e4d780e
--- /dev/null
+++ b/gnulib/lib/strcspn.c
@@ -0,0 +1,41 @@
+/* Copyright (C) 1991, 1994, 1996-1997, 2002-2003, 2005-2006, 2009-2011 Free
+ * Software Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#undef strcspn
+
+/* Return the length of the maximum initial segment of S
+ which contains no characters from REJECT. */
+size_t
+strcspn (const char *s, const char *reject)
+{
+ size_t count = 0;
+
+ while (*s != '\0')
+ if (strchr (reject, *s++) == NULL)
+ ++count;
+ else
+ return count;
+
+ return count;
+}
diff --git a/gnulib/lib/strdup.c b/gnulib/lib/strdup.c
new file mode 100644
index 0000000..98a2655
--- /dev/null
+++ b/gnulib/lib/strdup.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Get specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#undef __strdup
+#ifdef _LIBC
+# undef strdup
+#endif
+
+#ifndef weak_alias
+# define __strdup strdup
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+char *
+__strdup (const char *s)
+{
+ size_t len = strlen (s) + 1;
+ void *new = malloc (len);
+
+ if (new == NULL)
+ return NULL;
+
+ return (char *) memcpy (new, s, len);
+}
+#ifdef libc_hidden_def
+libc_hidden_def (__strdup)
+#endif
+#ifdef weak_alias
+weak_alias (__strdup, strdup)
+#endif
diff --git a/gnulib/lib/streq.h b/gnulib/lib/streq.h
new file mode 100644
index 0000000..3b52893
--- /dev/null
+++ b/gnulib/lib/streq.h
@@ -0,0 +1,176 @@
+/* Optimized string comparison.
+ Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifndef _GL_STREQ_H
+#define _GL_STREQ_H
+
+#include <string.h>
+
+/* STREQ allows to optimize string comparison with a small literal string.
+ STREQ (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ is semantically equivalent to
+ strcmp (s, "EUC-KR") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if defined (__GNUC__) && defined (__OPTIMIZE__)
+
+static inline int
+streq9 (const char *s1, const char *s2)
+{
+ return strcmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+streq8 (const char *s1, const char *s2, char s28)
+{
+ if (s1[8] == s28)
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return streq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (s1[7] == s27)
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return streq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (s1[6] == s26)
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return streq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (s1[5] == s25)
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return streq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[4] == s24)
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return streq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[3] == s23)
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return streq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[2] == s22)
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[1] == s21)
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[0] == s20)
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (strcmp (s1, s2) == 0)
+
+#endif
+
+#endif /* _GL_STREQ_H */
diff --git a/gnulib/lib/strerror-override.c b/gnulib/lib/strerror-override.c
new file mode 100644
index 0000000..4e2c32b
--- /dev/null
+++ b/gnulib/lib/strerror-override.c
@@ -0,0 +1,289 @@
+/* strerror-override.c --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "strerror-override.h"
+
+#include <errno.h>
+
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+# if HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+#endif
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+ describing the error. Otherwise return NULL. */
+const char *
+strerror_override (int errnum)
+{
+ /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */
+ switch (errnum)
+ {
+#if REPLACE_STRERROR_0
+ case 0:
+ return "Success";
+#endif
+
+#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
+ case EINPROGRESS:
+ return "Operation now in progress";
+ case EALREADY:
+ return "Operation already in progress";
+ case ENOTSOCK:
+ return "Socket operation on non-socket";
+ case EDESTADDRREQ:
+ return "Destination address required";
+ case EMSGSIZE:
+ return "Message too long";
+ case EPROTOTYPE:
+ return "Protocol wrong type for socket";
+ case ENOPROTOOPT:
+ return "Protocol not available";
+ case EPROTONOSUPPORT:
+ return "Protocol not supported";
+ case EOPNOTSUPP:
+ return "Operation not supported";
+ case EAFNOSUPPORT:
+ return "Address family not supported by protocol";
+ case EADDRINUSE:
+ return "Address already in use";
+ case EADDRNOTAVAIL:
+ return "Cannot assign requested address";
+ case ENETDOWN:
+ return "Network is down";
+ case ENETUNREACH:
+ return "Network is unreachable";
+ case ECONNRESET:
+ return "Connection reset by peer";
+ case ENOBUFS:
+ return "No buffer space available";
+ case EISCONN:
+ return "Transport endpoint is already connected";
+ case ENOTCONN:
+ return "Transport endpoint is not connected";
+ case ETIMEDOUT:
+ return "Connection timed out";
+ case ECONNREFUSED:
+ return "Connection refused";
+ case ELOOP:
+ return "Too many levels of symbolic links";
+ case EHOSTUNREACH:
+ return "No route to host";
+ case EWOULDBLOCK:
+ return "Operation would block";
+ case ETXTBSY:
+ return "Text file busy";
+ case ENODATA:
+ return "No data available";
+ case ENOSR:
+ return "Out of streams resources";
+ case ENOSTR:
+ return "Device not a stream";
+ case ENOTRECOVERABLE:
+ return "State not recoverable";
+ case EOWNERDEAD:
+ return "Owner died";
+ case ETIME:
+ return "Timer expired";
+ case EOTHER:
+ return "Other error";
+#endif
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+ case ESOCKTNOSUPPORT:
+ return "Socket type not supported";
+ case EPFNOSUPPORT:
+ return "Protocol family not supported";
+ case ESHUTDOWN:
+ return "Cannot send after transport endpoint shutdown";
+ case ETOOMANYREFS:
+ return "Too many references: cannot splice";
+ case EHOSTDOWN:
+ return "Host is down";
+ case EPROCLIM:
+ return "Too many processes";
+ case EUSERS:
+ return "Too many users";
+ case EDQUOT:
+ return "Disk quota exceeded";
+ case ESTALE:
+ return "Stale NFS file handle";
+ case EREMOTE:
+ return "Object is remote";
+# if HAVE_WINSOCK2_H
+ /* WSA_INVALID_HANDLE maps to EBADF */
+ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
+ /* WSA_INVALID_PARAMETER maps to EINVAL */
+ case WSA_OPERATION_ABORTED:
+ return "Overlapped operation aborted";
+ case WSA_IO_INCOMPLETE:
+ return "Overlapped I/O event object not in signaled state";
+ case WSA_IO_PENDING:
+ return "Overlapped operations will complete later";
+ /* WSAEINTR maps to EINTR */
+ /* WSAEBADF maps to EBADF */
+ /* WSAEACCES maps to EACCES */
+ /* WSAEFAULT maps to EFAULT */
+ /* WSAEINVAL maps to EINVAL */
+ /* WSAEMFILE maps to EMFILE */
+ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */
+ /* WSAEINPROGRESS maps to EINPROGRESS */
+ /* WSAEALREADY maps to EALREADY */
+ /* WSAENOTSOCK maps to ENOTSOCK */
+ /* WSAEDESTADDRREQ maps to EDESTADDRREQ */
+ /* WSAEMSGSIZE maps to EMSGSIZE */
+ /* WSAEPROTOTYPE maps to EPROTOTYPE */
+ /* WSAENOPROTOOPT maps to ENOPROTOOPT */
+ /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */
+ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
+ /* WSAEOPNOTSUPP maps to EOPNOTSUPP */
+ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */
+ /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */
+ /* WSAEADDRINUSE maps to EADDRINUSE */
+ /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */
+ /* WSAENETDOWN maps to ENETDOWN */
+ /* WSAENETUNREACH maps to ENETUNREACH */
+ /* WSAENETRESET maps to ENETRESET */
+ /* WSAECONNABORTED maps to ECONNABORTED */
+ /* WSAECONNRESET maps to ECONNRESET */
+ /* WSAENOBUFS maps to ENOBUFS */
+ /* WSAEISCONN maps to EISCONN */
+ /* WSAENOTCONN maps to ENOTCONN */
+ /* WSAESHUTDOWN is ESHUTDOWN */
+ /* WSAETOOMANYREFS is ETOOMANYREFS */
+ /* WSAETIMEDOUT maps to ETIMEDOUT */
+ /* WSAECONNREFUSED maps to ECONNREFUSED */
+ /* WSAELOOP maps to ELOOP */
+ /* WSAENAMETOOLONG maps to ENAMETOOLONG */
+ /* WSAEHOSTDOWN is EHOSTDOWN */
+ /* WSAEHOSTUNREACH maps to EHOSTUNREACH */
+ /* WSAENOTEMPTY maps to ENOTEMPTY */
+ /* WSAEPROCLIM is EPROCLIM */
+ /* WSAEUSERS is EUSERS */
+ /* WSAEDQUOT is EDQUOT */
+ /* WSAESTALE is ESTALE */
+ /* WSAEREMOTE is EREMOTE */
+ case WSASYSNOTREADY:
+ return "Network subsystem is unavailable";
+ case WSAVERNOTSUPPORTED:
+ return "Winsock.dll version out of range";
+ case WSANOTINITIALISED:
+ return "Successful WSAStartup not yet performed";
+ case WSAEDISCON:
+ return "Graceful shutdown in progress";
+ case WSAENOMORE: case WSA_E_NO_MORE:
+ return "No more results";
+ case WSAECANCELLED: case WSA_E_CANCELLED:
+ return "Call was canceled";
+ case WSAEINVALIDPROCTABLE:
+ return "Procedure call table is invalid";
+ case WSAEINVALIDPROVIDER:
+ return "Service provider is invalid";
+ case WSAEPROVIDERFAILEDINIT:
+ return "Service provider failed to initialize";
+ case WSASYSCALLFAILURE:
+ return "System call failure";
+ case WSASERVICE_NOT_FOUND:
+ return "Service not found";
+ case WSATYPE_NOT_FOUND:
+ return "Class type not found";
+ case WSAEREFUSED:
+ return "Database query was refused";
+ case WSAHOST_NOT_FOUND:
+ return "Host not found";
+ case WSATRY_AGAIN:
+ return "Nonauthoritative host not found";
+ case WSANO_RECOVERY:
+ return "Nonrecoverable error";
+ case WSANO_DATA:
+ return "Valid name, no data record of requested type";
+ /* WSA_QOS_* omitted */
+# endif
+#endif
+
+#if GNULIB_defined_ENOMSG
+ case ENOMSG:
+ return "No message of desired type";
+#endif
+
+#if GNULIB_defined_EIDRM
+ case EIDRM:
+ return "Identifier removed";
+#endif
+
+#if GNULIB_defined_ENOLINK
+ case ENOLINK:
+ return "Link has been severed";
+#endif
+
+#if GNULIB_defined_EPROTO
+ case EPROTO:
+ return "Protocol error";
+#endif
+
+#if GNULIB_defined_EMULTIHOP
+ case EMULTIHOP:
+ return "Multihop attempted";
+#endif
+
+#if GNULIB_defined_EBADMSG
+ case EBADMSG:
+ return "Bad message";
+#endif
+
+#if GNULIB_defined_EOVERFLOW
+ case EOVERFLOW:
+ return "Value too large for defined data type";
+#endif
+
+#if GNULIB_defined_ENOTSUP
+ case ENOTSUP:
+ return "Not supported";
+#endif
+
+#if GNULIB_defined_ENETRESET
+ case ENETRESET:
+ return "Network dropped connection on reset";
+#endif
+
+#if GNULIB_defined_ECONNABORTED
+ case ECONNABORTED:
+ return "Software caused connection abort";
+#endif
+
+#if GNULIB_defined_ESTALE
+ case ESTALE:
+ return "Stale NFS file handle";
+#endif
+
+#if GNULIB_defined_EDQUOT
+ case EDQUOT:
+ return "Disk quota exceeded";
+#endif
+
+#if GNULIB_defined_ECANCELED
+ case ECANCELED:
+ return "Operation canceled";
+#endif
+
+ default:
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/strerror-override.h b/gnulib/lib/strerror-override.h
new file mode 100644
index 0000000..09540b9
--- /dev/null
+++ b/gnulib/lib/strerror-override.h
@@ -0,0 +1,52 @@
+/* strerror-override.h --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _GL_STRERROR_OVERRIDE_H
+# define _GL_STRERROR_OVERRIDE_H
+
+# include <errno.h>
+# include <stddef.h>
+
+/* Reasonable buffer size that should never trigger ERANGE; if this
+ proves too small, we intentionally abort(), to remind us to fix
+ this value. */
+# define STACKBUF_LEN 256
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+ describing the error. Otherwise return NULL. */
+# if REPLACE_STRERROR_0 \
+ || GNULIB_defined_ESOCK \
+ || GNULIB_defined_EWINSOCK \
+ || GNULIB_defined_ENOMSG \
+ || GNULIB_defined_EIDRM \
+ || GNULIB_defined_ENOLINK \
+ || GNULIB_defined_EPROTO \
+ || GNULIB_defined_EMULTIHOP \
+ || GNULIB_defined_EBADMSG \
+ || GNULIB_defined_EOVERFLOW \
+ || GNULIB_defined_ENOTSUP \
+ || GNULIB_defined_ENETRESET \
+ || GNULIB_defined_ECONNABORTED \
+ || GNULIB_defined_ESTALE \
+ || GNULIB_defined_EDQUOT \
+ || GNULIB_defined_ECANCELED
+extern const char *strerror_override (int errnum);
+# else
+# define strerror_override(ignored) NULL
+# endif
+
+#endif /* _GL_STRERROR_OVERRIDE_H */
diff --git a/gnulib/lib/strerror.c b/gnulib/lib/strerror.c
new file mode 100644
index 0000000..63899ca
--- /dev/null
+++ b/gnulib/lib/strerror.c
@@ -0,0 +1,70 @@
+/* strerror.c --- POSIX compatible system error routine
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+#include "strerror-override.h"
+#include "verify.h"
+
+/* Use the system functions, not the gnulib overrides in this file. */
+#undef sprintf
+
+char *
+strerror (int n)
+#undef strerror
+{
+ static char buf[STACKBUF_LEN];
+ size_t len;
+
+ /* Cast away const, due to the historical signature of strerror;
+ callers should not be modifying the string. */
+ const char *msg = strerror_override (n);
+ if (msg)
+ return (char *) msg;
+
+ msg = strerror (n);
+
+ /* Our strerror_r implementation might use the system's strerror
+ buffer, so all other clients of strerror have to see the error
+ copied into a buffer that we manage. This is not thread-safe,
+ even if the system strerror is, but portable programs shouldn't
+ be using strerror if they care about thread-safety. */
+ if (!msg || !*msg)
+ {
+ static char const fmt[] = "Unknown error %d";
+ verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
+ sprintf (buf, fmt, n);
+ errno = EINVAL;
+ return buf;
+ }
+
+ /* Fix STACKBUF_LEN if this ever aborts. */
+ len = strlen (msg);
+ if (sizeof buf <= len)
+ abort ();
+
+ return memcpy (buf, msg, len + 1);
+}
diff --git a/gnulib/lib/strerror_r.c b/gnulib/lib/strerror_r.c
new file mode 100644
index 0000000..e6cf99b
--- /dev/null
+++ b/gnulib/lib/strerror_r.c
@@ -0,0 +1,327 @@
+/* strerror_r.c --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+/* Enable declaration of sys_nerr and sys_errlist in <errno.h> on NetBSD. */
+#define _NETBSD_SOURCE 1
+
+/* Specification. */
+#include <string.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "strerror-override.h"
+
+#if (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) && HAVE___XPG_STRERROR_R /* glibc >= 2.3.4, cygwin >= 1.7.9 */
+
+# define USE_XPG_STRERROR_R 1
+
+#elif HAVE_DECL_STRERROR_R && !(__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__)
+
+/* The system's strerror_r function is OK, except that its third argument
+ is 'int', not 'size_t', or its return type is wrong. */
+
+# include <limits.h>
+
+# define USE_SYSTEM_STRERROR_R 1
+
+#else /* (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__ ? !HAVE___XPG_STRERROR_R : !HAVE_DECL_STRERROR_R) */
+
+/* Use the system's strerror(). Exclude glibc and cygwin because the
+ system strerror_r has the wrong return type, and cygwin 1.7.9
+ strerror_r clobbers strerror. */
+# undef strerror
+
+# define USE_SYSTEM_STRERROR 1
+
+# if defined __NetBSD__ || defined __hpux || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __sgi || (defined __sun && !defined _LP64) || defined __CYGWIN__
+
+/* No locking needed. */
+
+/* Get catgets internationalization functions. */
+# if HAVE_CATGETS
+# include <nl_types.h>
+# endif
+
+/* Get sys_nerr, sys_errlist on HP-UX (otherwise only declared in C++ mode).
+ Get sys_nerr, sys_errlist on IRIX (otherwise only declared with _SGIAPI). */
+# if defined __hpux || defined __sgi
+extern int sys_nerr;
+extern char *sys_errlist[];
+# endif
+
+/* Get sys_nerr on Solaris. */
+# if defined __sun && !defined _LP64
+extern int sys_nerr;
+# endif
+
+# else
+
+# include "glthread/lock.h"
+
+/* This lock protects the buffer returned by strerror(). We assume that
+ no other uses of strerror() exist in the program. */
+gl_lock_define_initialized(static, strerror_lock)
+
+# endif
+
+#endif
+
+/* On MSVC, there is no snprintf() function, just a _snprintf().
+ It is of lower quality, but sufficient for the simple use here.
+ We only have to make sure to NUL terminate the result (_snprintf
+ does not NUL terminate, like strncpy). */
+#if !HAVE_SNPRINTF
+static int
+local_snprintf (char *buf, size_t buflen, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = _vsnprintf (buf, buflen, format, args);
+ va_end (args);
+ if (buflen > 0 && (result < 0 || result >= buflen))
+ buf[buflen - 1] = '\0';
+ return result;
+}
+# define snprintf local_snprintf
+#endif
+
+/* Copy as much of MSG into BUF as possible, without corrupting errno.
+ Return 0 if MSG fit in BUFLEN, otherwise return ERANGE. */
+static int
+safe_copy (char *buf, size_t buflen, const char *msg)
+{
+ size_t len = strlen (msg);
+ int ret;
+
+ if (len < buflen)
+ {
+ /* Although POSIX allows memcpy() to corrupt errno, we don't
+ know of any implementation where this is a real problem. */
+ memcpy (buf, msg, len + 1);
+ ret = 0;
+ }
+ else
+ {
+ memcpy (buf, msg, buflen - 1);
+ buf[buflen - 1] = '\0';
+ ret = ERANGE;
+ }
+ return ret;
+}
+
+
+int
+strerror_r (int errnum, char *buf, size_t buflen)
+#undef strerror_r
+{
+ /* Filter this out now, so that rest of this replacement knows that
+ there is room for a non-empty message and trailing NUL. */
+ if (buflen <= 1)
+ {
+ if (buflen)
+ *buf = '\0';
+ return ERANGE;
+ }
+ *buf = '\0';
+
+ /* Check for gnulib overrides. */
+ {
+ char const *msg = strerror_override (errnum);
+
+ if (msg)
+ return safe_copy (buf, buflen, msg);
+ }
+
+ {
+ int ret;
+ int saved_errno = errno;
+
+#if USE_XPG_STRERROR_R
+
+ {
+ extern int __xpg_strerror_r (int errnum, char *buf, size_t buflen);
+
+ ret = __xpg_strerror_r (errnum, buf, buflen);
+ if (ret < 0)
+ ret = errno;
+ if (!*buf)
+ {
+ /* glibc 2.13 would not touch buf on err, so we have to fall
+ back to GNU strerror_r which always returns a thread-safe
+ untruncated string to (partially) copy into our buf. */
+ safe_copy (buf, buflen, strerror_r (errnum, buf, buflen));
+ }
+ }
+
+#elif USE_SYSTEM_STRERROR_R
+
+ if (buflen > INT_MAX)
+ buflen = INT_MAX;
+
+# ifdef __hpux
+ /* On HP-UX 11.31, strerror_r always fails when buflen < 80; it
+ also fails to change buf on EINVAL. */
+ {
+ char stackbuf[80];
+
+ if (buflen < sizeof stackbuf)
+ {
+ ret = strerror_r (errnum, stackbuf, sizeof stackbuf);
+ if (ret == 0)
+ ret = safe_copy (buf, buflen, stackbuf);
+ }
+ else
+ ret = strerror_r (errnum, buf, buflen);
+ }
+# else
+ ret = strerror_r (errnum, buf, buflen);
+
+ /* Some old implementations may return (-1, EINVAL) instead of EINVAL. */
+ if (ret < 0)
+ ret = errno;
+# endif
+
+# ifdef _AIX
+ /* AIX returns 0 rather than ERANGE when truncating strings; try
+ again until we are sure we got the entire string. */
+ if (!ret && strlen (buf) == buflen - 1)
+ {
+ char stackbuf[STACKBUF_LEN];
+ size_t len;
+ strerror_r (errnum, stackbuf, sizeof stackbuf);
+ len = strlen (stackbuf);
+ /* STACKBUF_LEN should have been large enough. */
+ if (len + 1 == sizeof stackbuf)
+ abort ();
+ if (buflen <= len)
+ ret = ERANGE;
+ }
+# else
+ /* Solaris 10 does not populate buf on ERANGE. OpenBSD 4.7
+ truncates early on ERANGE rather than return a partial integer.
+ We prefer the maximal string. We set buf[0] earlier, and we
+ know of no implementation that modifies buf to be an
+ unterminated string, so this strlen should be portable in
+ practice (rather than pulling in a safer strnlen). */
+ if (ret == ERANGE && strlen (buf) < buflen - 1)
+ {
+ char stackbuf[STACKBUF_LEN];
+
+ /* STACKBUF_LEN should have been large enough. */
+ if (strerror_r (errnum, stackbuf, sizeof stackbuf) == ERANGE)
+ abort ();
+ safe_copy (buf, buflen, stackbuf);
+ }
+# endif
+
+#else /* USE_SYSTEM_STRERROR */
+
+ /* Try to do what strerror (errnum) does, but without clobbering the
+ buffer used by strerror(). */
+
+# if defined __NetBSD__ || defined __hpux || ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __CYGWIN__ /* NetBSD, HP-UX, native Win32, Cygwin */
+
+ /* NetBSD: sys_nerr, sys_errlist are declared through _NETBSD_SOURCE
+ and <errno.h> above.
+ HP-UX: sys_nerr, sys_errlist are declared explicitly above.
+ native Win32: sys_nerr, sys_errlist are declared in <stdlib.h>.
+ Cygwin: sys_nerr, sys_errlist are declared in <errno.h>. */
+ if (errnum >= 0 && errnum < sys_nerr)
+ {
+# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux)
+# if defined __NetBSD__
+ nl_catd catd = catopen ("libc", NL_CAT_LOCALE);
+ const char *errmsg =
+ (catd != (nl_catd)-1
+ ? catgets (catd, 1, errnum, sys_errlist[errnum])
+ : sys_errlist[errnum]);
+# endif
+# if defined __hpux
+ nl_catd catd = catopen ("perror", NL_CAT_LOCALE);
+ const char *errmsg =
+ (catd != (nl_catd)-1
+ ? catgets (catd, 1, 1 + errnum, sys_errlist[errnum])
+ : sys_errlist[errnum]);
+# endif
+# else
+ const char *errmsg = sys_errlist[errnum];
+# endif
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux)
+ if (catd != (nl_catd)-1)
+ catclose (catd);
+# endif
+ }
+ else
+ ret = EINVAL;
+
+# elif defined __sgi || (defined __sun && !defined _LP64) /* IRIX, Solaris <= 9 32-bit */
+
+ /* For a valid error number, the system's strerror() function returns
+ a pointer to a not copied string, not to a buffer. */
+ if (errnum >= 0 && errnum < sys_nerr)
+ {
+ char *errmsg = strerror (errnum);
+
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+ }
+ else
+ ret = EINVAL;
+
+# else
+
+ gl_lock_lock (strerror_lock);
+
+ {
+ char *errmsg = strerror (errnum);
+
+ /* For invalid error numbers, strerror() on
+ - IRIX 6.5 returns NULL,
+ - HP-UX 11 returns an empty string. */
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+ }
+
+ gl_lock_unlock (strerror_lock);
+
+# endif
+
+#endif
+
+ if (ret == EINVAL && !*buf)
+ snprintf (buf, buflen, "Unknown error %d", errnum);
+
+ errno = saved_errno;
+ return ret;
+ }
+}
diff --git a/gnulib/lib/strftime.c b/gnulib/lib/strftime.c
new file mode 100644
index 0000000..acebc9a
--- /dev/null
+++ b/gnulib/lib/strftime.c
@@ -0,0 +1,1469 @@
+/* Copyright (C) 1991-2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# define HAVE_STRUCT_ERA_ENTRY 1
+# define HAVE_TM_GMTOFF 1
+# define HAVE_TM_ZONE 1
+# define HAVE_TZNAME 1
+# define HAVE_TZSET 1
+# include "../locale/localeinfo.h"
+#else
+# include <config.h>
+# if FPRINTFTIME
+# include "ignore-value.h"
+# include "fprintftime.h"
+# else
+# include "strftime.h"
+# endif
+#endif
+
+#include <ctype.h>
+#include <time.h>
+
+#if HAVE_TZNAME && !HAVE_DECL_TZNAME
+extern char *tzname[];
+#endif
+
+/* Do multibyte processing if multibytes are supported, unless
+ multibyte sequences are safe in formats. Multibyte sequences are
+ safe if they cannot contain byte sequences that look like format
+ conversion specifications. The multibyte encodings used by the
+ C library on the various platforms (UTF-8, GB2312, GBK, CP936,
+ GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949,
+ SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%'
+ cannot occur in a multibyte character except in the first byte.
+
+ The DEC-HANYU encoding used on OSF/1 is not safe for formats, but
+ this encoding has never been seen in real-life use, so we ignore
+ it. */
+#if !(defined __osf__ && 0)
+# define MULTIBYTE_IS_FORMAT_SAFE 1
+#endif
+#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE)
+
+#if DO_MULTIBYTE
+# include <wchar.h>
+ static const mbstate_t mbstate_zero;
+#endif
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef COMPILE_WIDE
+# include <endian.h>
+# define CHAR_T wchar_t
+# define UCHAR_T unsigned int
+# define L_(Str) L##Str
+# define NLW(Sym) _NL_W##Sym
+
+# define MEMCPY(d, s, n) __wmemcpy (d, s, n)
+# define STRLEN(s) __wcslen (s)
+
+#else
+# define CHAR_T char
+# define UCHAR_T unsigned char
+# define L_(Str) Str
+# define NLW(Sym) Sym
+
+# define MEMCPY(d, s, n) memcpy (d, s, n)
+# define STRLEN(s) strlen (s)
+
+#endif
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. A and B should be free of side
+ effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
+ INT_BITS is the number of useful bits in an int. GNU code can
+ assume that INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+#define SHR(a, b) \
+ (-1 >> 1 == -1 \
+ ? (a) >> (b) \
+ : (a) / (1 << (b)) - ((a) % (1 << (b)) < 0))
+
+/* Bound on length of the string representing an integer type or expression T.
+ Subtract 1 for the sign bit if t is signed; log10 (2.0) < 146/485;
+ add 1 for integer division truncation; add 1 more for a minus sign
+ if needed. */
+#define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - 1) * 146 / 485 + 2)
+
+#define TM_YEAR_BASE 1900
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+ except every 100th isn't, and every 400th is). */
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+
+#ifdef _LIBC
+# define tzname __tzname
+# define tzset __tzset
+#endif
+
+#if !HAVE_TM_GMTOFF
+/* Portable standalone applications should supply a "time.h" that
+ declares a POSIX-compliant localtime_r, for the benefit of older
+ implementations that lack localtime_r or have a nonstandard one.
+ See the gnulib time_r module for one way to implement this. */
+# undef __gmtime_r
+# undef __localtime_r
+# define __gmtime_r gmtime_r
+# define __localtime_r localtime_r
+#endif
+
+
+#ifndef FPRINTFTIME
+# define FPRINTFTIME 0
+#endif
+
+#if FPRINTFTIME
+# define STREAM_OR_CHAR_T FILE
+# define STRFTIME_ARG(x) /* empty */
+#else
+# define STREAM_OR_CHAR_T CHAR_T
+# define STRFTIME_ARG(x) x,
+#endif
+
+#if FPRINTFTIME
+# define memset_byte(P, Len, Byte) \
+ do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0)
+# define memset_space(P, Len) memset_byte (P, Len, ' ')
+# define memset_zero(P, Len) memset_byte (P, Len, '0')
+#elif defined COMPILE_WIDE
+# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len))
+# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len))
+#else
+# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len))
+# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len))
+#endif
+
+#if FPRINTFTIME
+# define advance(P, N)
+#else
+# define advance(P, N) ((P) += (N))
+#endif
+
+#define add(n, f) \
+ do \
+ { \
+ size_t _n = (n); \
+ size_t _w = (width < 0 ? 0 : width); \
+ size_t _incr = _n < _w ? _w : _n; \
+ if (_incr >= maxsize - i) \
+ return 0; \
+ if (p) \
+ { \
+ if (digits == 0 && _n < _w) \
+ { \
+ size_t _delta = width - _n; \
+ if (pad == L_('0')) \
+ memset_zero (p, _delta); \
+ else \
+ memset_space (p, _delta); \
+ } \
+ f; \
+ advance (p, _n); \
+ } \
+ i += _incr; \
+ } while (0)
+
+#if FPRINTFTIME
+# define add1(C) add (1, fputc (C, p))
+#else
+# define add1(C) add (1, *p = C)
+#endif
+
+#if FPRINTFTIME
+# define cpy(n, s) \
+ add ((n), \
+ do \
+ { \
+ if (to_lowcase) \
+ fwrite_lowcase (p, (s), _n); \
+ else if (to_uppcase) \
+ fwrite_uppcase (p, (s), _n); \
+ else \
+ { \
+ /* We are ignoring the value of fwrite here, in spite of the \
+ fact that technically, that may not be valid: the fwrite \
+ specification in POSIX 2008 defers to that of fputc, which \
+ is intended to be consistent with the one from ISO C, \
+ which permits failure due to ENOMEM *without* setting the \
+ stream's error indicator. */ \
+ ignore_value (fwrite ((s), _n, 1, p)); \
+ } \
+ } \
+ while (0) \
+ )
+#else
+# define cpy(n, s) \
+ add ((n), \
+ if (to_lowcase) \
+ memcpy_lowcase (p, (s), _n LOCALE_ARG); \
+ else if (to_uppcase) \
+ memcpy_uppcase (p, (s), _n LOCALE_ARG); \
+ else \
+ MEMCPY ((void *) p, (void const *) (s), _n))
+#endif
+
+#ifdef COMPILE_WIDE
+# ifndef USE_IN_EXTENDED_LOCALE_MODEL
+# undef __mbsrtowcs_l
+# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
+# endif
+# define widen(os, ws, l) \
+ { \
+ mbstate_t __st; \
+ const char *__s = os; \
+ memset (&__st, '\0', sizeof (__st)); \
+ l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \
+ ws = (wchar_t *) alloca ((l + 1) * sizeof (wchar_t)); \
+ (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \
+ }
+#endif
+
+
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+# define strftime __strftime_l
+# define wcsftime __wcsftime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_ARG , loc
+# define LOCALE_PARAM_PROTO , __locale_t loc
+# define HELPER_LOCALE_ARG , current
+#else
+# define LOCALE_PARAM_PROTO
+# define LOCALE_ARG
+# ifdef _LIBC
+# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
+# else
+# define HELPER_LOCALE_ARG
+# endif
+#endif
+
+#ifdef COMPILE_WIDE
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define TOUPPER(Ch, L) __towupper_l (Ch, L)
+# define TOLOWER(Ch, L) __towlower_l (Ch, L)
+# else
+# define TOUPPER(Ch, L) towupper (Ch)
+# define TOLOWER(Ch, L) towlower (Ch)
+# endif
+#else
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define TOUPPER(Ch, L) __toupper_l (Ch, L)
+# define TOLOWER(Ch, L) __tolower_l (Ch, L)
+# else
+# define TOUPPER(Ch, L) toupper (Ch)
+# define TOLOWER(Ch, L) tolower (Ch)
+# endif
+#endif
+/* We don't use `isdigit' here since the locale dependent
+ interpretation is not what we want here. We only need to accept
+ the arabic digits in the ASCII range. One day there is perhaps a
+ more reliable way to accept other sets of digits. */
+#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9)
+
+#if FPRINTFTIME
+static void
+fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len)
+{
+ while (len-- > 0)
+ {
+ fputc (TOLOWER ((UCHAR_T) *src, loc), fp);
+ ++src;
+ }
+}
+
+static void
+fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len)
+{
+ while (len-- > 0)
+ {
+ fputc (TOUPPER ((UCHAR_T) *src, loc), fp);
+ ++src;
+ }
+}
+#else
+static CHAR_T *
+memcpy_lowcase (CHAR_T *dest, const CHAR_T *src,
+ size_t len LOCALE_PARAM_PROTO)
+{
+ while (len-- > 0)
+ dest[len] = TOLOWER ((UCHAR_T) src[len], loc);
+ return dest;
+}
+
+static CHAR_T *
+memcpy_uppcase (CHAR_T *dest, const CHAR_T *src,
+ size_t len LOCALE_PARAM_PROTO)
+{
+ while (len-- > 0)
+ dest[len] = TOUPPER ((UCHAR_T) src[len], loc);
+ return dest;
+}
+#endif
+
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+ measured in seconds, ignoring leap seconds. */
+# define tm_diff ftime_tm_diff
+static int
+tm_diff (const struct tm *a, const struct tm *b)
+{
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid int overflow in leap day calculations,
+ but it's OK to assume that A and B are close to each other. */
+ int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
+ int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
+ int a100 = a4 / 25 - (a4 % 25 < 0);
+ int b100 = b4 / 25 - (b4 % 25 < 0);
+ int a400 = SHR (a100, 2);
+ int b400 = SHR (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+ int years = a->tm_year - b->tm_year;
+ int days = (365 * years + intervening_leap_days
+ + (a->tm_yday - b->tm_yday));
+ return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+
+
+/* The number of days from the first day of the first ISO week of this
+ year to the year day YDAY with week day WDAY. ISO weeks start on
+ Monday; the first ISO week has the year's first Thursday. YDAY may
+ be as small as YDAY_MINIMUM. */
+#define ISO_WEEK_START_WDAY 1 /* Monday */
+#define ISO_WEEK1_WDAY 4 /* Thursday */
+#define YDAY_MINIMUM (-366)
+#ifdef __GNUC__
+__inline__
+#endif
+static int
+iso_week_days (int yday, int wday)
+{
+ /* Add enough to the first operand of % to make it nonnegative. */
+ int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
+ return (yday
+ - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
+ + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
+}
+
+
+/* When compiling this file, GNU applications can #define my_strftime
+ to a symbol (typically nstrftime) to get an extended strftime with
+ extra arguments UT and NS. Emacs is a special case for now, but
+ this Emacs-specific code can be removed once Emacs's config.h
+ defines my_strftime. */
+#if defined emacs && !defined my_strftime
+# define my_strftime nstrftime
+#endif
+
+#if FPRINTFTIME
+# undef my_strftime
+# define my_strftime fprintftime
+#endif
+
+#ifdef my_strftime
+# define extra_args , ut, ns
+# define extra_args_spec , int ut, int ns
+#else
+# if defined COMPILE_WIDE
+# define my_strftime wcsftime
+# define nl_get_alt_digit _nl_get_walt_digit
+# else
+# define my_strftime strftime
+# define nl_get_alt_digit _nl_get_alt_digit
+# endif
+# define extra_args
+# define extra_args_spec
+/* We don't have this information in general. */
+# define ut 0
+# define ns 0
+#endif
+
+
+/* Just like my_strftime, below, but with one more parameter, UPCASE,
+ to indicate that the result should be converted to upper case. */
+static size_t
+strftime_case_ (bool upcase, STREAM_OR_CHAR_T *s,
+ STRFTIME_ARG (size_t maxsize)
+ const CHAR_T *format,
+ const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO)
+{
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+ struct locale_data *const current = loc->__locales[LC_TIME];
+#endif
+#if FPRINTFTIME
+ size_t maxsize = (size_t) -1;
+#endif
+
+ int hour12 = tp->tm_hour;
+#ifdef _NL_CURRENT
+ /* We cannot make the following values variables since we must delay
+ the evaluation of these values until really needed since some
+ expressions might not be valid in every situation. The `struct tm'
+ might be generated by a strptime() call that initialized
+ only a few elements. Dereference the pointers only if the format
+ requires this. Then it is ok to fail if the pointers are invalid. */
+# define a_wkday \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
+# define f_wkday \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
+# define a_month \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
+# define f_month \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
+# define ampm \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \
+ ? NLW(PM_STR) : NLW(AM_STR)))
+
+# define aw_len STRLEN (a_wkday)
+# define am_len STRLEN (a_month)
+# define ap_len STRLEN (ampm)
+#endif
+ const char *zone;
+ size_t i = 0;
+ STREAM_OR_CHAR_T *p = s;
+ const CHAR_T *f;
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+ const char *format_end = NULL;
+#endif
+
+#if ! defined _LIBC && ! HAVE_RUN_TZSET_TEST
+ /* Solaris 2.5.x and 2.6 tzset sometimes modify the storage returned
+ by localtime. On such systems, we must either use the tzset and
+ localtime wrappers to work around the bug (which sets
+ HAVE_RUN_TZSET_TEST) or make a copy of the structure. */
+ struct tm copy = *tp;
+ tp = &copy;
+#endif
+
+ zone = NULL;
+#if HAVE_TM_ZONE
+ /* The POSIX test suite assumes that setting
+ the environment variable TZ to a new value before calling strftime()
+ will influence the result (the %Z format) even if the information in
+ TP is computed with a totally different time zone.
+ This is bogus: though POSIX allows bad behavior like this,
+ POSIX does not require it. Do the right thing instead. */
+ zone = (const char *) tp->tm_zone;
+#endif
+#if HAVE_TZNAME
+ if (ut)
+ {
+ if (! (zone && *zone))
+ zone = "GMT";
+ }
+ else
+ {
+ /* POSIX.1 requires that local time zone information be used as
+ though strftime called tzset. */
+# if HAVE_TZSET
+ tzset ();
+# endif
+ }
+#endif
+
+ if (hour12 > 12)
+ hour12 -= 12;
+ else
+ if (hour12 == 0)
+ hour12 = 12;
+
+ for (f = format; *f != '\0'; ++f)
+ {
+ int pad = 0; /* Padding for number ('-', '_', or 0). */
+ int modifier; /* Field modifier ('E', 'O', or 0). */
+ int digits = 0; /* Max digits for numeric format. */
+ int number_value; /* Numeric value to be printed. */
+ unsigned int u_number_value; /* (unsigned int) number_value. */
+ bool negative_number; /* The number is negative. */
+ bool always_output_a_sign; /* +/- should always be output. */
+ int tz_colon_mask; /* Bitmask of where ':' should appear. */
+ const CHAR_T *subfmt;
+ CHAR_T sign_char;
+ CHAR_T *bufp;
+ CHAR_T buf[1
+ + 2 /* for the two colons in a %::z or %:::z time zone */
+ + (sizeof (int) < sizeof (time_t)
+ ? INT_STRLEN_BOUND (time_t)
+ : INT_STRLEN_BOUND (int))];
+ int width = -1;
+ bool to_lowcase = false;
+ bool to_uppcase = upcase;
+ size_t colons;
+ bool change_case = false;
+ int format_char;
+
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+ switch (*f)
+ {
+ case L_('%'):
+ break;
+
+ case L_('\b'): case L_('\t'): case L_('\n'):
+ case L_('\v'): case L_('\f'): case L_('\r'):
+ case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'):
+ case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'):
+ case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'):
+ case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'):
+ case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'):
+ case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'):
+ case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'):
+ case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'):
+ case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'):
+ case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'):
+ case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'):
+ case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'):
+ case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'):
+ case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'):
+ case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'):
+ case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'):
+ case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'):
+ case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'):
+ case L_('~'):
+ /* The C Standard requires these 98 characters (plus '%') to
+ be in the basic execution character set. None of these
+ characters can start a multibyte sequence, so they need
+ not be analyzed further. */
+ add1 (*f);
+ continue;
+
+ default:
+ /* Copy this multibyte sequence until we reach its end, find
+ an error, or come back to the initial shift state. */
+ {
+ mbstate_t mbstate = mbstate_zero;
+ size_t len = 0;
+ size_t fsize;
+
+ if (! format_end)
+ format_end = f + strlen (f) + 1;
+ fsize = format_end - f;
+
+ do
+ {
+ size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
+
+ if (bytes == 0)
+ break;
+
+ if (bytes == (size_t) -2)
+ {
+ len += strlen (f + len);
+ break;
+ }
+
+ if (bytes == (size_t) -1)
+ {
+ len++;
+ break;
+ }
+
+ len += bytes;
+ }
+ while (! mbsinit (&mbstate));
+
+ cpy (len, f);
+ f += len - 1;
+ continue;
+ }
+ }
+
+#else /* ! DO_MULTIBYTE */
+
+ /* Either multibyte encodings are not supported, they are
+ safe for formats, so any non-'%' byte can be copied through,
+ or this is the wide character version. */
+ if (*f != L_('%'))
+ {
+ add1 (*f);
+ continue;
+ }
+
+#endif /* ! DO_MULTIBYTE */
+
+ /* Check for flags that can modify a format. */
+ while (1)
+ {
+ switch (*++f)
+ {
+ /* This influences the number formats. */
+ case L_('_'):
+ case L_('-'):
+ case L_('0'):
+ pad = *f;
+ continue;
+
+ /* This changes textual output. */
+ case L_('^'):
+ to_uppcase = true;
+ continue;
+ case L_('#'):
+ change_case = true;
+ continue;
+
+ default:
+ break;
+ }
+ break;
+ }
+
+ /* As a GNU extension we allow to specify the field width. */
+ if (ISDIGIT (*f))
+ {
+ width = 0;
+ do
+ {
+ if (width > INT_MAX / 10
+ || (width == INT_MAX / 10 && *f - L_('0') > INT_MAX % 10))
+ /* Avoid overflow. */
+ width = INT_MAX;
+ else
+ {
+ width *= 10;
+ width += *f - L_('0');
+ }
+ ++f;
+ }
+ while (ISDIGIT (*f));
+ }
+
+ /* Check for modifiers. */
+ switch (*f)
+ {
+ case L_('E'):
+ case L_('O'):
+ modifier = *f++;
+ break;
+
+ default:
+ modifier = 0;
+ break;
+ }
+
+ /* Now do the specified format. */
+ format_char = *f;
+ switch (format_char)
+ {
+#define DO_NUMBER(d, v) \
+ digits = d; \
+ number_value = v; goto do_number
+#define DO_SIGNED_NUMBER(d, negative, v) \
+ digits = d; \
+ negative_number = negative; \
+ u_number_value = v; goto do_signed_number
+
+ /* The mask is not what you might think.
+ When the ordinal i'th bit is set, insert a colon
+ before the i'th digit of the time zone representation. */
+#define DO_TZ_OFFSET(d, negative, mask, v) \
+ digits = d; \
+ negative_number = negative; \
+ tz_colon_mask = mask; \
+ u_number_value = v; goto do_tz_offset
+#define DO_NUMBER_SPACEPAD(d, v) \
+ digits = d; \
+ number_value = v; goto do_number_spacepad
+
+ case L_('%'):
+ if (modifier != 0)
+ goto bad_format;
+ add1 (*f);
+ break;
+
+ case L_('a'):
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (aw_len, a_wkday);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case 'A':
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (STRLEN (f_wkday), f_wkday);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('b'):
+ case L_('h'):
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+ if (modifier != 0)
+ goto bad_format;
+#ifdef _NL_CURRENT
+ cpy (am_len, a_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('B'):
+ if (modifier != 0)
+ goto bad_format;
+ if (change_case)
+ {
+ to_uppcase = true;
+ to_lowcase = false;
+ }
+#ifdef _NL_CURRENT
+ cpy (STRLEN (f_month), f_month);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('c'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == 'E'
+ && (*(subfmt =
+ (const CHAR_T *) _NL_CURRENT (LC_TIME,
+ NLW(ERA_D_T_FMT)))
+ != '\0')))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT));
+#else
+ goto underlying_strftime;
+#endif
+
+ subformat:
+ {
+ size_t len = strftime_case_ (to_uppcase,
+ NULL, STRFTIME_ARG ((size_t) -1)
+ subfmt,
+ tp extra_args LOCALE_ARG);
+ add (len, strftime_case_ (to_uppcase, p,
+ STRFTIME_ARG (maxsize - i)
+ subfmt,
+ tp extra_args LOCALE_ARG));
+ }
+ break;
+
+#if !(defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
+ underlying_strftime:
+ {
+ /* The relevant information is available only via the
+ underlying strftime implementation, so use that. */
+ char ufmt[5];
+ char *u = ufmt;
+ char ubuf[1024]; /* enough for any single format in practice */
+ size_t len;
+ /* Make sure we're calling the actual underlying strftime.
+ In some cases, config.h contains something like
+ "#define strftime rpl_strftime". */
+# ifdef strftime
+# undef strftime
+ size_t strftime ();
+# endif
+
+ /* The space helps distinguish strftime failure from empty
+ output. */
+ *u++ = ' ';
+ *u++ = '%';
+ if (modifier != 0)
+ *u++ = modifier;
+ *u++ = format_char;
+ *u = '\0';
+ len = strftime (ubuf, sizeof ubuf, ufmt, tp);
+ if (len != 0)
+ cpy (len - 1, ubuf + 1);
+ }
+ break;
+#endif
+
+ case L_('C'):
+ if (modifier == L_('O'))
+ goto bad_format;
+ if (modifier == L_('E'))
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+# ifdef COMPILE_WIDE
+ size_t len = __wcslen (era->era_wname);
+ cpy (len, era->era_wname);
+# else
+ size_t len = strlen (era->era_name);
+ cpy (len, era->era_name);
+# endif
+ break;
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ {
+ int century = tp->tm_year / 100 + TM_YEAR_BASE / 100;
+ century -= tp->tm_year % 100 < 0 && 0 < century;
+ DO_SIGNED_NUMBER (2, tp->tm_year < - TM_YEAR_BASE, century);
+ }
+
+ case L_('x'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == L_('E')
+ && (*(subfmt =
+ (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
+ != L_('\0'))))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT));
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+ case L_('D'):
+ if (modifier != 0)
+ goto bad_format;
+ subfmt = L_("%m/%d/%y");
+ goto subformat;
+
+ case L_('d'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_mday);
+
+ case L_('e'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, tp->tm_mday);
+
+ /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE)
+ and then jump to one of these labels. */
+
+ do_tz_offset:
+ always_output_a_sign = true;
+ goto do_number_body;
+
+ do_number_spacepad:
+ /* Force `_' flag unless overridden by `0' or `-' flag. */
+ if (pad != L_('0') && pad != L_('-'))
+ pad = L_('_');
+
+ do_number:
+ /* Format NUMBER_VALUE according to the MODIFIER flag. */
+ negative_number = number_value < 0;
+ u_number_value = number_value;
+
+ do_signed_number:
+ always_output_a_sign = false;
+ tz_colon_mask = 0;
+
+ do_number_body:
+ /* Format U_NUMBER_VALUE according to the MODIFIER flag.
+ NEGATIVE_NUMBER is nonzero if the original number was
+ negative; in this case it was converted directly to
+ unsigned int (i.e., modulo (UINT_MAX + 1)) without
+ negating it. */
+ if (modifier == L_('O') && !negative_number)
+ {
+#ifdef _NL_CURRENT
+ /* Get the locale specific alternate representation of
+ the number. If none exist NULL is returned. */
+ const CHAR_T *cp = nl_get_alt_digit (u_number_value
+ HELPER_LOCALE_ARG);
+
+ if (cp != NULL)
+ {
+ size_t digitlen = STRLEN (cp);
+ if (digitlen != 0)
+ {
+ cpy (digitlen, cp);
+ break;
+ }
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ bufp = buf + sizeof (buf) / sizeof (buf[0]);
+
+ if (negative_number)
+ u_number_value = - u_number_value;
+
+ do
+ {
+ if (tz_colon_mask & 1)
+ *--bufp = ':';
+ tz_colon_mask >>= 1;
+ *--bufp = u_number_value % 10 + L_('0');
+ u_number_value /= 10;
+ }
+ while (u_number_value != 0 || tz_colon_mask != 0);
+
+ do_number_sign_and_padding:
+ if (digits < width)
+ digits = width;
+
+ sign_char = (negative_number ? L_('-')
+ : always_output_a_sign ? L_('+')
+ : 0);
+
+ if (pad == L_('-'))
+ {
+ if (sign_char)
+ add1 (sign_char);
+ }
+ else
+ {
+ int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0]))
+ - bufp) - !!sign_char;
+
+ if (padding > 0)
+ {
+ if (pad == L_('_'))
+ {
+ if ((size_t) padding >= maxsize - i)
+ return 0;
+
+ if (p)
+ memset_space (p, padding);
+ i += padding;
+ width = width > padding ? width - padding : 0;
+ if (sign_char)
+ add1 (sign_char);
+ }
+ else
+ {
+ if ((size_t) digits >= maxsize - i)
+ return 0;
+
+ if (sign_char)
+ add1 (sign_char);
+
+ if (p)
+ memset_zero (p, padding);
+ i += padding;
+ width = 0;
+ }
+ }
+ else
+ {
+ if (sign_char)
+ add1 (sign_char);
+ }
+ }
+
+ cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp);
+ break;
+
+ case L_('F'):
+ if (modifier != 0)
+ goto bad_format;
+ subfmt = L_("%Y-%m-%d");
+ goto subformat;
+
+ case L_('H'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_hour);
+
+ case L_('I'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, hour12);
+
+ case L_('k'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, tp->tm_hour);
+
+ case L_('l'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER_SPACEPAD (2, hour12);
+
+ case L_('j'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U);
+
+ case L_('M'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_min);
+
+ case L_('m'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U);
+
+#ifndef _LIBC
+ case L_('N'): /* GNU extension. */
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ number_value = ns;
+ if (width == -1)
+ width = 9;
+ else
+ {
+ /* Take an explicit width less than 9 as a precision. */
+ int j;
+ for (j = width; j < 9; j++)
+ number_value /= 10;
+ }
+
+ DO_NUMBER (width, number_value);
+#endif
+
+ case L_('n'):
+ add1 (L_('\n'));
+ break;
+
+ case L_('P'):
+ to_lowcase = true;
+#ifndef _NL_CURRENT
+ format_char = L_('p');
+#endif
+ /* FALLTHROUGH */
+
+ case L_('p'):
+ if (change_case)
+ {
+ to_uppcase = false;
+ to_lowcase = true;
+ }
+#ifdef _NL_CURRENT
+ cpy (ap_len, ampm);
+ break;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('R'):
+ subfmt = L_("%H:%M");
+ goto subformat;
+
+ case L_('r'):
+#ifdef _NL_CURRENT
+ if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME,
+ NLW(T_FMT_AMPM)))
+ == L_('\0'))
+ subfmt = L_("%I:%M:%S %p");
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+
+ case L_('S'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, tp->tm_sec);
+
+ case L_('s'): /* GNU extension. */
+ {
+ struct tm ltm;
+ time_t t;
+
+ ltm = *tp;
+ t = mktime (&ltm);
+
+ /* Generate string value for T using time_t arithmetic;
+ this works even if sizeof (long) < sizeof (time_t). */
+
+ bufp = buf + sizeof (buf) / sizeof (buf[0]);
+ negative_number = t < 0;
+
+ do
+ {
+ int d = t % 10;
+ t /= 10;
+ *--bufp = (negative_number ? -d : d) + L_('0');
+ }
+ while (t != 0);
+
+ digits = 1;
+ always_output_a_sign = false;
+ goto do_number_sign_and_padding;
+ }
+
+ case L_('X'):
+ if (modifier == L_('O'))
+ goto bad_format;
+#ifdef _NL_CURRENT
+ if (! (modifier == L_('E')
+ && (*(subfmt =
+ (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT)))
+ != L_('\0'))))
+ subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT));
+ goto subformat;
+#else
+ goto underlying_strftime;
+#endif
+ case L_('T'):
+ subfmt = L_("%H:%M:%S");
+ goto subformat;
+
+ case L_('t'):
+ add1 (L_('\t'));
+ break;
+
+ case L_('u'):
+ DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
+
+ case L_('U'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
+
+ case L_('V'):
+ case L_('g'):
+ case L_('G'):
+ if (modifier == L_('E'))
+ goto bad_format;
+ {
+ /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE)
+ is a leap year, except that YEAR and YEAR - 1 both work
+ correctly even when (tp->tm_year + TM_YEAR_BASE) would
+ overflow. */
+ int year = (tp->tm_year
+ + (tp->tm_year < 0
+ ? TM_YEAR_BASE % 400
+ : TM_YEAR_BASE % 400 - 400));
+ int year_adjust = 0;
+ int days = iso_week_days (tp->tm_yday, tp->tm_wday);
+
+ if (days < 0)
+ {
+ /* This ISO week belongs to the previous year. */
+ year_adjust = -1;
+ days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)),
+ tp->tm_wday);
+ }
+ else
+ {
+ int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
+ tp->tm_wday);
+ if (0 <= d)
+ {
+ /* This ISO week belongs to the next year. */
+ year_adjust = 1;
+ days = d;
+ }
+ }
+
+ switch (*f)
+ {
+ case L_('g'):
+ {
+ int yy = (tp->tm_year % 100 + year_adjust) % 100;
+ DO_NUMBER (2, (0 <= yy
+ ? yy
+ : tp->tm_year < -TM_YEAR_BASE - year_adjust
+ ? -yy
+ : yy + 100));
+ }
+
+ case L_('G'):
+ DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE - year_adjust,
+ (tp->tm_year + (unsigned int) TM_YEAR_BASE
+ + year_adjust));
+
+ default:
+ DO_NUMBER (2, days / 7 + 1);
+ }
+ }
+
+ case L_('W'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
+
+ case L_('w'):
+ if (modifier == L_('E'))
+ goto bad_format;
+
+ DO_NUMBER (1, tp->tm_wday);
+
+ case L_('Y'):
+ if (modifier == 'E')
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+# ifdef COMPILE_WIDE
+ subfmt = era->era_wformat;
+# else
+ subfmt = era->era_format;
+# endif
+ goto subformat;
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+ if (modifier == L_('O'))
+ goto bad_format;
+ else
+ DO_SIGNED_NUMBER (4, tp->tm_year < -TM_YEAR_BASE,
+ tp->tm_year + (unsigned int) TM_YEAR_BASE);
+
+ case L_('y'):
+ if (modifier == L_('E'))
+ {
+#if HAVE_STRUCT_ERA_ENTRY
+ struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+ if (era)
+ {
+ int delta = tp->tm_year - era->start_date[0];
+ DO_NUMBER (1, (era->offset
+ + delta * era->absolute_direction));
+ }
+#else
+ goto underlying_strftime;
+#endif
+ }
+
+ {
+ int yy = tp->tm_year % 100;
+ if (yy < 0)
+ yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100;
+ DO_NUMBER (2, yy);
+ }
+
+ case L_('Z'):
+ if (change_case)
+ {
+ to_uppcase = false;
+ to_lowcase = true;
+ }
+
+#if HAVE_TZNAME
+ /* The tzset() call might have changed the value. */
+ if (!(zone && *zone) && tp->tm_isdst >= 0)
+ zone = tzname[tp->tm_isdst != 0];
+#endif
+ if (! zone)
+ zone = "";
+
+#ifdef COMPILE_WIDE
+ {
+ /* The zone string is always given in multibyte form. We have
+ to transform it first. */
+ wchar_t *wczone;
+ size_t len;
+ widen (zone, wczone, len);
+ cpy (len, wczone);
+ }
+#else
+ cpy (strlen (zone), zone);
+#endif
+ break;
+
+ case L_(':'):
+ /* :, ::, and ::: are valid only just before 'z'.
+ :::: etc. are rejected later. */
+ for (colons = 1; f[colons] == L_(':'); colons++)
+ continue;
+ if (f[colons] != L_('z'))
+ goto bad_format;
+ f += colons;
+ goto do_z_conversion;
+
+ case L_('z'):
+ colons = 0;
+
+ do_z_conversion:
+ if (tp->tm_isdst < 0)
+ break;
+
+ {
+ int diff;
+ int hour_diff;
+ int min_diff;
+ int sec_diff;
+#if HAVE_TM_GMTOFF
+ diff = tp->tm_gmtoff;
+#else
+ if (ut)
+ diff = 0;
+ else
+ {
+ struct tm gtm;
+ struct tm ltm;
+ time_t lt;
+
+ ltm = *tp;
+ lt = mktime (&ltm);
+
+ if (lt == (time_t) -1)
+ {
+ /* mktime returns -1 for errors, but -1 is also a
+ valid time_t value. Check whether an error really
+ occurred. */
+ struct tm tm;
+
+ if (! __localtime_r (&lt, &tm)
+ || ((ltm.tm_sec ^ tm.tm_sec)
+ | (ltm.tm_min ^ tm.tm_min)
+ | (ltm.tm_hour ^ tm.tm_hour)
+ | (ltm.tm_mday ^ tm.tm_mday)
+ | (ltm.tm_mon ^ tm.tm_mon)
+ | (ltm.tm_year ^ tm.tm_year)))
+ break;
+ }
+
+ if (! __gmtime_r (&lt, &gtm))
+ break;
+
+ diff = tm_diff (&ltm, &gtm);
+ }
+#endif
+
+ hour_diff = diff / 60 / 60;
+ min_diff = diff / 60 % 60;
+ sec_diff = diff % 60;
+
+ switch (colons)
+ {
+ case 0: /* +hhmm */
+ DO_TZ_OFFSET (5, diff < 0, 0, hour_diff * 100 + min_diff);
+
+ case 1: tz_hh_mm: /* +hh:mm */
+ DO_TZ_OFFSET (6, diff < 0, 04, hour_diff * 100 + min_diff);
+
+ case 2: tz_hh_mm_ss: /* +hh:mm:ss */
+ DO_TZ_OFFSET (9, diff < 0, 024,
+ hour_diff * 10000 + min_diff * 100 + sec_diff);
+
+ case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */
+ if (sec_diff != 0)
+ goto tz_hh_mm_ss;
+ if (min_diff != 0)
+ goto tz_hh_mm;
+ DO_TZ_OFFSET (3, diff < 0, 0, hour_diff);
+
+ default:
+ goto bad_format;
+ }
+ }
+
+ case L_('\0'): /* GNU extension: % at end of format. */
+ --f;
+ /* Fall through. */
+ default:
+ /* Unknown format; output the format, including the '%',
+ since this is most likely the right thing to do if a
+ multibyte string has been misparsed. */
+ bad_format:
+ {
+ int flen;
+ for (flen = 1; f[1 - flen] != L_('%'); flen++)
+ continue;
+ cpy (flen, &f[1 - flen]);
+ }
+ break;
+ }
+ }
+
+#if ! FPRINTFTIME
+ if (p && maxsize != 0)
+ *p = L_('\0');
+#endif
+
+ return i;
+}
+
+/* Write information from TP into S according to the format
+ string FORMAT, writing no more that MAXSIZE characters
+ (including the terminating '\0') and returning number of
+ characters written. If S is NULL, nothing will be written
+ anywhere, so to determine how many characters would be
+ written, use NULL for S and (size_t) -1 for MAXSIZE. */
+size_t
+my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
+ const CHAR_T *format,
+ const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO)
+{
+ return strftime_case_ (false, s, STRFTIME_ARG (maxsize)
+ format, tp extra_args LOCALE_ARG);
+}
+
+#if defined _LIBC && ! FPRINTFTIME
+libc_hidden_def (my_strftime)
+#endif
+
+
+#if defined emacs && ! FPRINTFTIME
+/* For Emacs we have a separate interface which corresponds to the normal
+ strftime function plus the ut argument, but without the ns argument. */
+size_t
+emacs_strftimeu (char *s, size_t maxsize, const char *format,
+ const struct tm *tp, int ut)
+{
+ return my_strftime (s, maxsize, format, tp, ut, 0);
+}
+#endif
diff --git a/gnulib/lib/strftime.h b/gnulib/lib/strftime.h
new file mode 100644
index 0000000..3410568
--- /dev/null
+++ b/gnulib/lib/strftime.h
@@ -0,0 +1,34 @@
+/* declarations for strftime.c
+
+ Copyright (C) 2002, 2004, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Just like strftime, but with two more arguments:
+ POSIX requires that strftime use the local timezone information.
+ When __UTC is nonzero and tm->tm_zone is NULL or the empty string,
+ use UTC instead. Use __NS as the number of nanoseconds in the
+ %N directive. */
+size_t nstrftime (char *, size_t, char const *, struct tm const *,
+ int __utc, int __ns);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/striconv.c b/gnulib/lib/striconv.c
new file mode 100644
index 0000000..9bbed46
--- /dev/null
+++ b/gnulib/lib/striconv.c
@@ -0,0 +1,464 @@
+/* Charset conversion.
+ Copyright (C) 2001-2007, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+/* Get MB_LEN_MAX, CHAR_BIT. */
+# include <limits.h>
+#endif
+
+#include "c-strcase.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+
+#if HAVE_ICONV
+
+int
+mem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp)
+{
+# define tmpbufsize 4096
+ size_t length;
+ char *result;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Determine the length we need. */
+ {
+ size_t count = 0;
+ /* The alignment is needed when converting e.g. to glibc's WCHAR_T or
+ libiconv's UCS-4-INTERNAL encoding. */
+ union { unsigned int align; char buf[tmpbufsize]; } tmp;
+# define tmpbuf tmp.buf
+ const char *inptr = src;
+ size_t insize = srclen;
+
+ while (insize > 0)
+ {
+ char *outptr = tmpbuf;
+ size_t outsize = tmpbufsize;
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ ;
+ else if (errno == EINVAL)
+ break;
+ else
+ return -1;
+ }
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ else if (res > 0)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+# endif
+ count += outptr - tmpbuf;
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ {
+ char *outptr = tmpbuf;
+ size_t outsize = tmpbufsize;
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ return -1;
+ count += outptr - tmpbuf;
+ }
+# endif
+ length = count;
+# undef tmpbuf
+ }
+
+ if (length == 0)
+ {
+ *lengthp = 0;
+ return 0;
+ }
+ if (*resultp != NULL && *lengthp >= length)
+ result = *resultp;
+ else
+ {
+ result = (char *) malloc (length);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ /* Return to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Do the conversion for real. */
+ {
+ const char *inptr = src;
+ size_t insize = srclen;
+ char *outptr = result;
+ size_t outsize = length;
+
+ while (insize > 0)
+ {
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == EINVAL)
+ break;
+ else
+ goto fail;
+ }
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ else if (res > 0)
+ {
+ errno = EILSEQ;
+ goto fail;
+ }
+# endif
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ {
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outsize);
+
+ if (res == (size_t)(-1))
+ goto fail;
+ }
+# endif
+ if (outsize != 0)
+ abort ();
+ }
+
+ *resultp = result;
+ *lengthp = length;
+
+ return 0;
+
+ fail:
+ {
+ if (result != *resultp)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+# undef tmpbufsize
+}
+
+char *
+str_cd_iconv (const char *src, iconv_t cd)
+{
+ /* For most encodings, a trailing NUL byte in the input will be converted
+ to a trailing NUL byte in the output. But not for UTF-7. So that this
+ function is usable for UTF-7, we have to exclude the NUL byte from the
+ conversion and add it by hand afterwards. */
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. For other iconv() implementations,
+ we have to look at the number of irreversible conversions returned;
+ but this information is lost when iconv() returns for an E2BIG reason.
+ Therefore we cannot use the second, faster algorithm. */
+
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconv (src, strlen (src), cd, &result, &length);
+ char *final_result;
+
+ if (retval < 0)
+ {
+ if (result != NULL)
+ abort ();
+ return NULL;
+ }
+
+ /* Add the terminating NUL byte. */
+ final_result =
+ (result != NULL ? realloc (result, length + 1) : malloc (length + 1));
+ if (final_result == NULL)
+ {
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ final_result[length] = '\0';
+
+ return final_result;
+
+# else
+ /* This algorithm is likely faster than the one above. But it may produce
+ iconv() returns for an E2BIG reason, when the output size guess is too
+ small. Therefore it can only be used when we don't need the number of
+ irreversible conversions performed. */
+ char *result;
+ size_t result_size;
+ size_t length;
+ const char *inptr = src;
+ size_t inbytes_remaining = strlen (src);
+
+ /* Make a guess for the worst-case output size, in order to avoid a
+ realloc. It's OK if the guess is wrong as long as it is not zero and
+ doesn't lead to an integer overflow. */
+ result_size = inbytes_remaining;
+ {
+ size_t approx_sqrt_SIZE_MAX = SIZE_MAX >> (sizeof (size_t) * CHAR_BIT / 2);
+ if (result_size <= approx_sqrt_SIZE_MAX / MB_LEN_MAX)
+ result_size *= MB_LEN_MAX;
+ }
+ result_size += 1; /* for the terminating NUL */
+
+ result = (char *) malloc (result_size);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ /* Do the conversion. */
+ {
+ char *outptr = result;
+ size_t outbytes_remaining = result_size - 1;
+
+ for (;;)
+ {
+ /* Here inptr + inbytes_remaining = src + strlen (src),
+ outptr + outbytes_remaining = result + result_size - 1. */
+ size_t res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &inbytes_remaining,
+ &outptr, &outbytes_remaining);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == EINVAL)
+ break;
+ else if (errno == E2BIG)
+ {
+ size_t used = outptr - result;
+ size_t newsize = result_size * 2;
+ char *newresult;
+
+ if (!(newsize > result_size))
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ newresult = (char *) realloc (result, newsize);
+ if (newresult == NULL)
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ result = newresult;
+ result_size = newsize;
+ outptr = result + used;
+ outbytes_remaining = result_size - 1 - used;
+ }
+ else
+ goto failed;
+ }
+ else
+ break;
+ }
+ /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ for (;;)
+ {
+ /* Here outptr + outbytes_remaining = result + result_size - 1. */
+ size_t res = iconv (cd, NULL, NULL, &outptr, &outbytes_remaining);
+
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ {
+ size_t used = outptr - result;
+ size_t newsize = result_size * 2;
+ char *newresult;
+
+ if (!(newsize > result_size))
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ newresult = (char *) realloc (result, newsize);
+ if (newresult == NULL)
+ {
+ errno = ENOMEM;
+ goto failed;
+ }
+ result = newresult;
+ result_size = newsize;
+ outptr = result + used;
+ outbytes_remaining = result_size - 1 - used;
+ }
+ else
+ goto failed;
+ }
+ else
+ break;
+ }
+# endif
+
+ /* Add the terminating NUL byte. */
+ *outptr++ = '\0';
+
+ length = outptr - result;
+ }
+
+ /* Give away unused memory. */
+ if (length < result_size)
+ {
+ char *smaller_result = (char *) realloc (result, length);
+
+ if (smaller_result != NULL)
+ result = smaller_result;
+ }
+
+ return result;
+
+ failed:
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+
+# endif
+}
+
+#endif
+
+char *
+str_iconv (const char *src, const char *from_codeset, const char *to_codeset)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconv_t cd;
+ char *result;
+
+ /* Avoid glibc-2.1 bug with EUC-KR. */
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ && !defined _LIBICONV_VERSION
+ if (c_strcasecmp (from_codeset, "EUC-KR") == 0
+ || c_strcasecmp (to_codeset, "EUC-KR") == 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+# endif
+ cd = iconv_open (to_codeset, from_codeset);
+ if (cd == (iconv_t) -1)
+ return NULL;
+
+ result = str_cd_iconv (src, cd);
+
+ if (result == NULL)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconv_close (cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconv_close (cd) < 0)
+ {
+ /* Return NULL, but free the allocated memory, and while doing
+ that, preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ return result;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return NULL;
+#endif
+ }
+}
diff --git a/gnulib/lib/striconv.h b/gnulib/lib/striconv.h
new file mode 100644
index 0000000..4229b63
--- /dev/null
+++ b/gnulib/lib/striconv.h
@@ -0,0 +1,76 @@
+/* Charset conversion.
+ Copyright (C) 2001-2004, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _STRICONV_H
+#define _STRICONV_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The conversion descriptor is passed as CD.
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int mem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ The conversion descriptor is passed as CD. Both the "from" and the "to"
+ encoding must use a single NUL byte at the end of the string (i.e. not
+ UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * str_cd_iconv (const char *src, iconv_t cd);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * str_iconv (const char *src,
+ const char *from_codeset, const char *to_codeset);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONV_H */
diff --git a/gnulib/lib/striconveh.c b/gnulib/lib/striconveh.c
new file mode 100644
index 0000000..311dc77
--- /dev/null
+++ b/gnulib/lib/striconveh.c
@@ -0,0 +1,1199 @@
+/* Character set conversion with error handling.
+ Copyright (C) 2001-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconveh.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+# include "unistr.h"
+#endif
+
+#include "c-strcase.h"
+#include "c-strcaseeq.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+
+#if HAVE_ICONV
+
+/* The caller must provide an iconveh_t, not just an iconv_t, because when a
+ conversion error occurs, we may have to determine the Unicode representation
+ of the inconvertible character. */
+
+int
+iconveh_open (const char *to_codeset, const char *from_codeset, iconveh_t *cdp)
+{
+ iconv_t cd;
+ iconv_t cd1;
+ iconv_t cd2;
+
+ /* Avoid glibc-2.1 bug with EUC-KR. */
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ && !defined _LIBICONV_VERSION
+ if (c_strcasecmp (from_codeset, "EUC-KR") == 0
+ || c_strcasecmp (to_codeset, "EUC-KR") == 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# endif
+
+ cd = iconv_open (to_codeset, from_codeset);
+
+ if (STRCASEEQ (from_codeset, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ cd1 = (iconv_t)(-1);
+ else
+ {
+ cd1 = iconv_open ("UTF-8", from_codeset);
+ if (cd1 == (iconv_t)(-1))
+ {
+ int saved_errno = errno;
+ if (cd != (iconv_t)(-1))
+ iconv_close (cdp->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+ if (STRCASEEQ (to_codeset, "UTF-8", 'U','T','F','-','8',0,0,0,0)
+# if (((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2) \
+ && !defined __UCLIBC__) \
+ || _LIBICONV_VERSION >= 0x0105
+ || c_strcasecmp (to_codeset, "UTF-8//TRANSLIT") == 0
+# endif
+ )
+ cd2 = (iconv_t)(-1);
+ else
+ {
+ cd2 = iconv_open (to_codeset, "UTF-8");
+ if (cd2 == (iconv_t)(-1))
+ {
+ int saved_errno = errno;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd != (iconv_t)(-1))
+ iconv_close (cd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+ cdp->cd = cd;
+ cdp->cd1 = cd1;
+ cdp->cd2 = cd2;
+ return 0;
+}
+
+int
+iconveh_close (const iconveh_t *cd)
+{
+ if (cd->cd2 != (iconv_t)(-1) && iconv_close (cd->cd2) < 0)
+ {
+ /* Return -1, but preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ if (cd->cd1 != (iconv_t)(-1))
+ iconv_close (cd->cd1);
+ if (cd->cd != (iconv_t)(-1))
+ iconv_close (cd->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ if (cd->cd1 != (iconv_t)(-1) && iconv_close (cd->cd1) < 0)
+ {
+ /* Return -1, but preserve the errno from iconv_close. */
+ int saved_errno = errno;
+ if (cd->cd != (iconv_t)(-1))
+ iconv_close (cd->cd);
+ errno = saved_errno;
+ return -1;
+ }
+ if (cd->cd != (iconv_t)(-1) && iconv_close (cd->cd) < 0)
+ return -1;
+ return 0;
+}
+
+/* iconv_carefully is like iconv, except that it stops as soon as it encounters
+ a conversion error, and it returns in *INCREMENTED a boolean telling whether
+ it has incremented the input pointers past the error location. */
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+/* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+static size_t
+iconv_carefully (iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr = *inbuf;
+ const char *inptr_end = inptr + *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ const char *inptr_before;
+ size_t res;
+
+ do
+ {
+ size_t insize;
+
+ inptr_before = inptr;
+ res = (size_t)(-1);
+
+ for (insize = 1; inptr + insize <= inptr_end; insize++)
+ {
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+ if (!(res == (size_t)(-1) && errno == EINVAL))
+ break;
+ /* iconv can eat up a shift sequence but give EINVAL while attempting
+ to convert the first character. E.g. libiconv does this. */
+ if (inptr > inptr_before)
+ {
+ res = 0;
+ break;
+ }
+ }
+
+ if (res == 0)
+ {
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ }
+ }
+ while (res == 0 && inptr < inptr_end);
+
+ *inbuf = inptr;
+ *inbytesleft = inptr_end - inptr;
+ if (res != (size_t)(-1) && res > 0)
+ {
+ /* iconv() has already incremented INPTR. We cannot go back to a
+ previous INPTR, otherwise the state inside CD would become invalid,
+ if FROM_CODESET is a stateful encoding. So, tell the caller that
+ *INBUF has already been incremented. */
+ *incremented = (inptr > inptr_before);
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ else
+ {
+ *incremented = false;
+ return res;
+ }
+}
+# else
+# define iconv_carefully(cd, inbuf, inbytesleft, outbuf, outbytesleft, incremented) \
+ (*(incremented) = false, \
+ iconv (cd, (ICONV_CONST char **) (inbuf), inbytesleft, outbuf, outbytesleft))
+# endif
+
+/* iconv_carefully_1 is like iconv_carefully, except that it stops after
+ converting one character or one shift sequence. */
+static size_t
+iconv_carefully_1 (iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr_before = *inbuf;
+ const char *inptr = inptr_before;
+ const char *inptr_end = inptr_before + *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ size_t res = (size_t)(-1);
+ size_t insize;
+
+ for (insize = 1; inptr_before + insize <= inptr_end; insize++)
+ {
+ inptr = inptr_before;
+ res = iconv (cd,
+ (ICONV_CONST char **) &inptr, &insize,
+ &outptr, &outsize);
+ if (!(res == (size_t)(-1) && errno == EINVAL))
+ break;
+ /* iconv can eat up a shift sequence but give EINVAL while attempting
+ to convert the first character. E.g. libiconv does this. */
+ if (inptr > inptr_before)
+ {
+ res = 0;
+ break;
+ }
+ }
+
+ *inbuf = inptr;
+ *inbytesleft = inptr_end - inptr;
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot convert.
+ Only GNU libiconv and GNU libc are known to prefer to fail rather
+ than doing a lossy conversion. */
+ if (res != (size_t)(-1) && res > 0)
+ {
+ /* iconv() has already incremented INPTR. We cannot go back to a
+ previous INPTR, otherwise the state inside CD would become invalid,
+ if FROM_CODESET is a stateful encoding. So, tell the caller that
+ *INBUF has already been incremented. */
+ *incremented = (inptr > inptr_before);
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+# endif
+
+ if (res != (size_t)(-1))
+ {
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ }
+ *incremented = false;
+ return res;
+}
+
+/* utf8conv_carefully is like iconv, except that
+ - it converts from UTF-8 to UTF-8,
+ - it stops as soon as it encounters a conversion error, and it returns
+ in *INCREMENTED a boolean telling whether it has incremented the input
+ pointers past the error location,
+ - if one_character_only is true, it stops after converting one
+ character. */
+static size_t
+utf8conv_carefully (bool one_character_only,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft,
+ bool *incremented)
+{
+ const char *inptr = *inbuf;
+ size_t insize = *inbytesleft;
+ char *outptr = *outbuf;
+ size_t outsize = *outbytesleft;
+ size_t res;
+
+ res = 0;
+ do
+ {
+ ucs4_t uc;
+ int n;
+ int m;
+
+ n = u8_mbtoucr (&uc, (const uint8_t *) inptr, insize);
+ if (n < 0)
+ {
+ errno = (n == -2 ? EINVAL : EILSEQ);
+ n = u8_mbtouc (&uc, (const uint8_t *) inptr, insize);
+ inptr += n;
+ insize -= n;
+ res = (size_t)(-1);
+ *incremented = true;
+ break;
+ }
+ if (outsize == 0)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ *incremented = false;
+ break;
+ }
+ m = u8_uctomb ((uint8_t *) outptr, uc, outsize);
+ if (m == -2)
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ *incremented = false;
+ break;
+ }
+ inptr += n;
+ insize -= n;
+ if (m == -1)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ *incremented = true;
+ break;
+ }
+ outptr += m;
+ outsize -= m;
+ }
+ while (!one_character_only && insize > 0);
+
+ *inbuf = inptr;
+ *inbytesleft = insize;
+ *outbuf = outptr;
+ *outbytesleft = outsize;
+ return res;
+}
+
+static int
+mem_cd_iconveh_internal (const char *src, size_t srclen,
+ iconv_t cd, iconv_t cd1, iconv_t cd2,
+ enum iconv_ilseq_handler handler,
+ size_t extra_alloc,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ /* When a conversion error occurs, we cannot start using CD1 and CD2 at
+ this point: FROM_CODESET may be a stateful encoding like ISO-2022-KR.
+ Instead, we have to start afresh from the beginning of SRC. */
+ /* Use a temporary buffer, so that for small strings, a single malloc()
+ call will be sufficient. */
+# define tmpbufsize 4096
+ /* The alignment is needed when converting e.g. to glibc's WCHAR_T or
+ libiconv's UCS-4-INTERNAL encoding. */
+ union { unsigned int align; char buf[tmpbufsize]; } tmp;
+# define tmpbuf tmp.buf
+
+ char *initial_result;
+ char *result;
+ size_t allocated;
+ size_t length;
+ size_t last_length = (size_t)(-1); /* only needed if offsets != NULL */
+
+ if (*resultp != NULL && *lengthp >= sizeof (tmpbuf))
+ {
+ initial_result = *resultp;
+ allocated = *lengthp;
+ }
+ else
+ {
+ initial_result = tmpbuf;
+ allocated = sizeof (tmpbuf);
+ }
+ result = initial_result;
+
+ /* Test whether a direct conversion is possible at all. */
+ if (cd == (iconv_t)(-1))
+ goto indirectly;
+
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = (size_t)(-1);
+
+ last_length = (size_t)(-1);
+ }
+ length = 0;
+
+ /* First, try a direct conversion, and see whether a conversion error
+ occurs at all. */
+ {
+ const char *inptr = src;
+ size_t insize = srclen;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ /* Set to the initial state. */
+ iconv (cd, NULL, NULL, NULL, NULL);
+# endif
+
+ while (insize > 0)
+ {
+ char *outptr = result + length;
+ size_t outsize = allocated - extra_alloc - length;
+ bool incremented;
+ size_t res;
+ bool grow;
+
+ if (offsets != NULL)
+ {
+ if (length != last_length) /* ensure that offset[] be increasing */
+ {
+ offsets[inptr - src] = length;
+ last_length = length;
+ }
+ res = iconv_carefully_1 (cd,
+ &inptr, &insize,
+ &outptr, &outsize,
+ &incremented);
+ }
+ else
+ /* Use iconv_carefully instead of iconv here, because:
+ - If TO_CODESET is UTF-8, we can do the error handling in this
+ loop, no need for a second loop,
+ - With iconv() implementations other than GNU libiconv and GNU
+ libc, if we use iconv() in a big swoop, checking for an E2BIG
+ return, we lose the number of irreversible conversions. */
+ res = iconv_carefully (cd,
+ &inptr, &insize,
+ &outptr, &outsize,
+ &incremented);
+
+ length = outptr - result;
+ grow = (length + extra_alloc > allocated / 2);
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ grow = true;
+ else if (errno == EINVAL)
+ break;
+ else if (errno == EILSEQ && handler != iconveh_error)
+ {
+ if (cd2 == (iconv_t)(-1))
+ {
+ /* TO_CODESET is UTF-8. */
+ /* Error handling can produce up to 1 byte of output. */
+ if (length + 1 + extra_alloc > allocated)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (length + 1 + extra_alloc > allocated)
+ abort ();
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ grow = false;
+ }
+ /* The input is invalid in FROM_CODESET. Eat up one byte
+ and emit a question mark. */
+ if (!incremented)
+ {
+ if (insize == 0)
+ abort ();
+ inptr++;
+ insize--;
+ }
+ result[length] = '?';
+ length++;
+ }
+ else
+ goto indirectly;
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ if (insize == 0)
+ break;
+ if (grow)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ }
+ }
+
+ /* Now get the conversion state back to the initial state.
+ But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+#if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ for (;;)
+ {
+ char *outptr = result + length;
+ size_t outsize = allocated - extra_alloc - length;
+ size_t res;
+
+ res = iconv (cd, NULL, NULL, &outptr, &outsize);
+ length = outptr - result;
+ if (res == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ else
+ break;
+ }
+#endif
+
+ /* The direct conversion succeeded. */
+ goto done;
+
+ indirectly:
+ /* The direct conversion failed.
+ Use a conversion through UTF-8. */
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = (size_t)(-1);
+
+ last_length = (size_t)(-1);
+ }
+ length = 0;
+ {
+ const bool slowly = (offsets != NULL || handler == iconveh_error);
+# define utf8bufsize 4096 /* may also be smaller or larger than tmpbufsize */
+ char utf8buf[utf8bufsize + 1];
+ size_t utf8len = 0;
+ const char *in1ptr = src;
+ size_t in1size = srclen;
+ bool do_final_flush1 = true;
+ bool do_final_flush2 = true;
+
+ /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ /* Set to the initial state. */
+ if (cd1 != (iconv_t)(-1))
+ iconv (cd1, NULL, NULL, NULL, NULL);
+ if (cd2 != (iconv_t)(-1))
+ iconv (cd2, NULL, NULL, NULL, NULL);
+# endif
+
+ while (in1size > 0 || do_final_flush1 || utf8len > 0 || do_final_flush2)
+ {
+ char *out1ptr = utf8buf + utf8len;
+ size_t out1size = utf8bufsize - utf8len;
+ bool incremented1;
+ size_t res1;
+ int errno1;
+
+ /* Conversion step 1: from FROM_CODESET to UTF-8. */
+ if (in1size > 0)
+ {
+ if (offsets != NULL
+ && length != last_length) /* ensure that offset[] be increasing */
+ {
+ offsets[in1ptr - src] = length;
+ last_length = length;
+ }
+ if (cd1 != (iconv_t)(-1))
+ {
+ if (slowly)
+ res1 = iconv_carefully_1 (cd1,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ else
+ res1 = iconv_carefully (cd1,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ }
+ else
+ {
+ /* FROM_CODESET is UTF-8. */
+ res1 = utf8conv_carefully (slowly,
+ &in1ptr, &in1size,
+ &out1ptr, &out1size,
+ &incremented1);
+ }
+ }
+ else if (do_final_flush1)
+ {
+ /* Now get the conversion state of CD1 back to the initial state.
+ But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ if (cd1 != (iconv_t)(-1))
+ res1 = iconv (cd1, NULL, NULL, &out1ptr, &out1size);
+ else
+# endif
+ res1 = 0;
+ do_final_flush1 = false;
+ incremented1 = true;
+ }
+ else
+ {
+ res1 = 0;
+ incremented1 = true;
+ }
+ if (res1 == (size_t)(-1)
+ && !(errno == E2BIG || errno == EINVAL || errno == EILSEQ))
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ if (res1 == (size_t)(-1)
+ && errno == EILSEQ && handler != iconveh_error)
+ {
+ /* The input is invalid in FROM_CODESET. Eat up one byte and
+ emit a question mark. Room for the question mark was allocated
+ at the end of utf8buf. */
+ if (!incremented1)
+ {
+ if (in1size == 0)
+ abort ();
+ in1ptr++;
+ in1size--;
+ }
+ *out1ptr++ = '?';
+ res1 = 0;
+ }
+ errno1 = errno;
+ utf8len = out1ptr - utf8buf;
+
+ if (offsets != NULL
+ || in1size == 0
+ || utf8len > utf8bufsize / 2
+ || (res1 == (size_t)(-1) && errno1 == E2BIG))
+ {
+ /* Conversion step 2: from UTF-8 to TO_CODESET. */
+ const char *in2ptr = utf8buf;
+ size_t in2size = utf8len;
+
+ while (in2size > 0
+ || (in1size == 0 && !do_final_flush1 && do_final_flush2))
+ {
+ char *out2ptr = result + length;
+ size_t out2size = allocated - extra_alloc - length;
+ bool incremented2;
+ size_t res2;
+ bool grow;
+
+ if (in2size > 0)
+ {
+ if (cd2 != (iconv_t)(-1))
+ res2 = iconv_carefully (cd2,
+ &in2ptr, &in2size,
+ &out2ptr, &out2size,
+ &incremented2);
+ else
+ /* TO_CODESET is UTF-8. */
+ res2 = utf8conv_carefully (false,
+ &in2ptr, &in2size,
+ &out2ptr, &out2size,
+ &incremented2);
+ }
+ else /* in1size == 0 && !do_final_flush1
+ && in2size == 0 && do_final_flush2 */
+ {
+ /* Now get the conversion state of CD1 back to the initial
+ state. But avoid glibc-2.1 bug and Solaris 2.7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ == 2 && __GLIBC_MINOR__ <= 1) && !defined __UCLIBC__) \
+ || defined __sun)
+ if (cd2 != (iconv_t)(-1))
+ res2 = iconv (cd2, NULL, NULL, &out2ptr, &out2size);
+ else
+# endif
+ res2 = 0;
+ do_final_flush2 = false;
+ incremented2 = true;
+ }
+
+ length = out2ptr - result;
+ grow = (length + extra_alloc > allocated / 2);
+ if (res2 == (size_t)(-1))
+ {
+ if (errno == E2BIG)
+ grow = true;
+ else if (errno == EINVAL)
+ break;
+ else if (errno == EILSEQ && handler != iconveh_error)
+ {
+ /* Error handling can produce up to 10 bytes of ASCII
+ output. But TO_CODESET may be UCS-2, UTF-16 or
+ UCS-4, so use CD2 here as well. */
+ char scratchbuf[10];
+ size_t scratchlen;
+ ucs4_t uc;
+ const char *inptr;
+ size_t insize;
+ size_t res;
+
+ if (incremented2)
+ {
+ if (u8_prev (&uc, (const uint8_t *) in2ptr,
+ (const uint8_t *) utf8buf)
+ == NULL)
+ abort ();
+ }
+ else
+ {
+ int n;
+ if (in2size == 0)
+ abort ();
+ n = u8_mbtouc_unsafe (&uc, (const uint8_t *) in2ptr,
+ in2size);
+ in2ptr += n;
+ in2size -= n;
+ }
+
+ if (handler == iconveh_escape_sequence)
+ {
+ static char hex[16] = "0123456789ABCDEF";
+ scratchlen = 0;
+ scratchbuf[scratchlen++] = '\\';
+ if (uc < 0x10000)
+ scratchbuf[scratchlen++] = 'u';
+ else
+ {
+ scratchbuf[scratchlen++] = 'U';
+ scratchbuf[scratchlen++] = hex[(uc>>28) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>24) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>20) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>16) & 15];
+ }
+ scratchbuf[scratchlen++] = hex[(uc>>12) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>8) & 15];
+ scratchbuf[scratchlen++] = hex[(uc>>4) & 15];
+ scratchbuf[scratchlen++] = hex[uc & 15];
+ }
+ else
+ {
+ scratchbuf[0] = '?';
+ scratchlen = 1;
+ }
+
+ inptr = scratchbuf;
+ insize = scratchlen;
+ if (cd2 != (iconv_t)(-1))
+ res = iconv (cd2,
+ (ICONV_CONST char **) &inptr, &insize,
+ &out2ptr, &out2size);
+ else
+ {
+ /* TO_CODESET is UTF-8. */
+ if (out2size >= insize)
+ {
+ memcpy (out2ptr, inptr, insize);
+ out2ptr += insize;
+ out2size -= insize;
+ inptr += insize;
+ insize = 0;
+ res = 0;
+ }
+ else
+ {
+ errno = E2BIG;
+ res = (size_t)(-1);
+ }
+ }
+ length = out2ptr - result;
+ if (res == (size_t)(-1) && errno == E2BIG)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (length + 1 + extra_alloc > allocated)
+ abort ();
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ grow = false;
+
+ out2ptr = result + length;
+ out2size = allocated - extra_alloc - length;
+ if (cd2 != (iconv_t)(-1))
+ res = iconv (cd2,
+ (ICONV_CONST char **) &inptr,
+ &insize,
+ &out2ptr, &out2size);
+ else
+ {
+ /* TO_CODESET is UTF-8. */
+ if (!(out2size >= insize))
+ abort ();
+ memcpy (out2ptr, inptr, insize);
+ out2ptr += insize;
+ out2size -= insize;
+ inptr += insize;
+ insize = 0;
+ res = 0;
+ }
+ length = out2ptr - result;
+ }
+# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+ /* Irix iconv() inserts a NUL byte if it cannot convert.
+ NetBSD iconv() inserts a question mark if it cannot
+ convert.
+ Only GNU libiconv and GNU libc are known to prefer
+ to fail rather than doing a lossy conversion. */
+ if (res != (size_t)(-1) && res > 0)
+ {
+ errno = EILSEQ;
+ res = (size_t)(-1);
+ }
+# endif
+ if (res == (size_t)(-1))
+ {
+ /* Failure converting the ASCII replacement. */
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ else
+ {
+ if (result != initial_result)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+ }
+ if (!(in2size > 0
+ || (in1size == 0 && !do_final_flush1 && do_final_flush2)))
+ break;
+ if (grow)
+ {
+ char *memory;
+
+ allocated = 2 * allocated;
+ if (result == initial_result)
+ memory = (char *) malloc (allocated);
+ else
+ memory = (char *) realloc (result, allocated);
+ if (memory == NULL)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = ENOMEM;
+ return -1;
+ }
+ if (result == initial_result)
+ memcpy (memory, initial_result, length);
+ result = memory;
+ }
+ }
+
+ /* Move the remaining bytes to the beginning of utf8buf. */
+ if (in2size > 0)
+ memmove (utf8buf, in2ptr, in2size);
+ utf8len = in2size;
+ }
+
+ if (res1 == (size_t)(-1))
+ {
+ if (errno1 == EINVAL)
+ in1size = 0;
+ else if (errno1 == EILSEQ)
+ {
+ if (result != initial_result)
+ free (result);
+ errno = errno1;
+ return -1;
+ }
+ }
+ }
+# undef utf8bufsize
+ }
+
+ done:
+ /* Now the final memory allocation. */
+ if (result == tmpbuf)
+ {
+ size_t memsize = length + extra_alloc;
+
+ if (*resultp != NULL && *lengthp >= memsize)
+ result = *resultp;
+ else
+ {
+ char *memory;
+
+ memory = (char *) malloc (memsize > 0 ? memsize : 1);
+ if (memory != NULL)
+ result = memory;
+ else
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ memcpy (result, tmpbuf, length);
+ }
+ else if (result != *resultp && length + extra_alloc < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ size_t memsize = length + extra_alloc;
+ char *memory;
+
+ memory = (char *) realloc (result, memsize > 0 ? memsize : 1);
+ if (memory != NULL)
+ result = memory;
+ }
+ *resultp = result;
+ *lengthp = length;
+ return 0;
+# undef tmpbuf
+# undef tmpbufsize
+}
+
+int
+mem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ return mem_cd_iconveh_internal (src, srclen, cd->cd, cd->cd1, cd->cd2,
+ handler, 0, offsets, resultp, lengthp);
+}
+
+char *
+str_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler)
+{
+ /* For most encodings, a trailing NUL byte in the input will be converted
+ to a trailing NUL byte in the output. But not for UTF-7. So that this
+ function is usable for UTF-7, we have to exclude the NUL byte from the
+ conversion and add it by hand afterwards. */
+ char *result = NULL;
+ size_t length = 0;
+ int retval = mem_cd_iconveh_internal (src, strlen (src),
+ cd->cd, cd->cd1, cd->cd2, handler, 1,
+ NULL, &result, &length);
+
+ if (retval < 0)
+ {
+ if (result != NULL)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ /* Add the terminating NUL byte. */
+ result[length] = '\0';
+
+ return result;
+}
+
+#endif
+
+int
+mem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ if (srclen == 0)
+ {
+ /* Nothing to convert. */
+ *lengthp = 0;
+ return 0;
+ }
+ else if (offsets == NULL && c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result;
+
+ if (*resultp != NULL && *lengthp >= srclen)
+ result = *resultp;
+ else
+ {
+ result = (char *) malloc (srclen);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ }
+ memcpy (result, src, srclen);
+ *resultp = result;
+ *lengthp = srclen;
+ return 0;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconveh_t cd;
+ char *result;
+ size_t length;
+ int retval;
+
+ if (iconveh_open (to_codeset, from_codeset, &cd) < 0)
+ return -1;
+
+ result = *resultp;
+ length = *lengthp;
+ retval = mem_cd_iconveh (src, srclen, &cd, handler, offsets,
+ &result, &length);
+
+ if (retval < 0)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconveh_close (&cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconveh_close (&cd) < 0)
+ {
+ /* Return -1, but free the allocated memory, and while doing
+ that, preserve the errno from iconveh_close. */
+ int saved_errno = errno;
+ if (result != *resultp && result != NULL)
+ free (result);
+ errno = saved_errno;
+ return -1;
+ }
+ *resultp = result;
+ *lengthp = length;
+ }
+ return retval;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return -1;
+#endif
+ }
+}
+
+char *
+str_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+ else
+ {
+#if HAVE_ICONV
+ iconveh_t cd;
+ char *result;
+
+ if (iconveh_open (to_codeset, from_codeset, &cd) < 0)
+ return NULL;
+
+ result = str_cd_iconveh (src, &cd, handler);
+
+ if (result == NULL)
+ {
+ /* Close cd, but preserve the errno from str_cd_iconv. */
+ int saved_errno = errno;
+ iconveh_close (&cd);
+ errno = saved_errno;
+ }
+ else
+ {
+ if (iconveh_close (&cd) < 0)
+ {
+ /* Return NULL, but free the allocated memory, and while doing
+ that, preserve the errno from iconveh_close. */
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+ return result;
+#else
+ /* This is a different error code than if iconv_open existed but didn't
+ support from_codeset and to_codeset, so that the caller can emit
+ an error message such as
+ "iconv() is not supported. Installing GNU libiconv and
+ then reinstalling this package would fix this." */
+ errno = ENOSYS;
+ return NULL;
+#endif
+ }
+}
diff --git a/gnulib/lib/striconveh.h b/gnulib/lib/striconveh.h
new file mode 100644
index 0000000..dd6b604
--- /dev/null
+++ b/gnulib/lib/striconveh.h
@@ -0,0 +1,140 @@
+/* Character set conversion with error handling.
+ Copyright (C) 2001-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _STRICONVEH_H
+#define _STRICONVEH_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+#include "iconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* A conversion descriptor for use by the iconveh functions. */
+typedef struct
+ {
+ /* Conversion descriptor from FROM_CODESET to TO_CODESET, or (iconv_t)(-1)
+ if the system does not support a direct conversion from FROM_CODESET to
+ TO_CODESET. */
+ iconv_t cd;
+ /* Conversion descriptor from FROM_CODESET to UTF-8 (or (iconv_t)(-1) if
+ FROM_CODESET is UTF-8). */
+ iconv_t cd1;
+ /* Conversion descriptor from UTF-8 to TO_CODESET (or (iconv_t)(-1) if
+ TO_CODESET is UTF-8). */
+ iconv_t cd2;
+ }
+ iconveh_t;
+
+/* Open a conversion descriptor for use by the iconveh functions.
+ If successful, fills *CDP and returns 0. Upon failure, return -1 with errno
+ set. */
+extern int
+ iconveh_open (const char *to_codeset, const char *from_codeset,
+ iconveh_t *cdp);
+
+/* Close a conversion descriptor created by iconveh_open().
+ Return value: 0 if successful, otherwise -1 and errno set. */
+extern int
+ iconveh_close (const iconveh_t *cd);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ Both the "from" and the "to" encoding must use a single NUL byte at the end
+ of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONVEH_H */
diff --git a/gnulib/lib/striconveha.c b/gnulib/lib/striconveha.c
new file mode 100644
index 0000000..fb4c496
--- /dev/null
+++ b/gnulib/lib/striconveha.c
@@ -0,0 +1,352 @@
+/* Character set conversion with error handling and autodetection.
+ Copyright (C) 2002, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "striconveha.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "malloca.h"
+#include "c-strcase.h"
+#include "striconveh.h"
+
+#define SIZEOF(a) (sizeof(a)/sizeof(a[0]))
+
+
+/* Autodetection list. */
+
+struct autodetect_alias
+{
+ struct autodetect_alias *next;
+ const char *name;
+ const char * const *encodings_to_try;
+};
+
+static const char * const autodetect_utf8_try[] =
+{
+ /* Try UTF-8 first. There are very few ISO-8859-1 inputs that would
+ be valid UTF-8, but many UTF-8 inputs are valid ISO-8859-1. */
+ "UTF-8", "ISO-8859-1",
+ NULL
+};
+static const char * const autodetect_jp_try[] =
+{
+ /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
+ it will fail.
+ Try EUC-JP next. Short SHIFT_JIS inputs may come out wrong. This
+ is unavoidable. People will condemn SHIFT_JIS.
+ If we tried SHIFT_JIS first, then some short EUC-JP inputs would
+ come out wrong, and people would condemn EUC-JP and Unix, which
+ would not be good.
+ Finally try SHIFT_JIS. */
+ "ISO-2022-JP-2", "EUC-JP", "SHIFT_JIS",
+ NULL
+};
+static const char * const autodetect_kr_try[] =
+{
+ /* Try 7-bit encoding first. If the input contains bytes >= 0x80,
+ it will fail.
+ Finally try EUC-KR. */
+ "ISO-2022-KR", "EUC-KR",
+ NULL
+};
+
+static struct autodetect_alias autodetect_predefined[] =
+{
+ { &autodetect_predefined[1], "autodetect_utf8", autodetect_utf8_try },
+ { &autodetect_predefined[2], "autodetect_jp", autodetect_jp_try },
+ { NULL, "autodetect_kr", autodetect_kr_try }
+};
+
+static struct autodetect_alias *autodetect_list = &autodetect_predefined[0];
+static struct autodetect_alias **autodetect_list_end =
+ &autodetect_predefined[SIZEOF(autodetect_predefined)-1].next;
+
+int
+uniconv_register_autodetect (const char *name,
+ const char * const *try_in_order)
+{
+ size_t namelen;
+ size_t listlen;
+ size_t memneed;
+ size_t i;
+ char *memory;
+ struct autodetect_alias *new_alias;
+ char *new_name;
+ const char **new_try_in_order;
+
+ /* The TRY_IN_ORDER list must not be empty. */
+ if (try_in_order[0] == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* We must deep-copy NAME and TRY_IN_ORDER, because they may be allocated
+ with dynamic extent. */
+ namelen = strlen (name) + 1;
+ memneed = sizeof (struct autodetect_alias) + namelen + sizeof (char *);
+ for (i = 0; try_in_order[i] != NULL; i++)
+ memneed += sizeof (char *) + strlen (try_in_order[i]) + 1;
+ listlen = i;
+
+ memory = (char *) malloc (memneed);
+ if (memory != NULL)
+ {
+ new_alias = (struct autodetect_alias *) memory;
+ memory += sizeof (struct autodetect_alias);
+
+ new_try_in_order = (const char **) memory;
+ memory += (listlen + 1) * sizeof (char *);
+
+ new_name = (char *) memory;
+ memcpy (new_name, name, namelen);
+ memory += namelen;
+
+ for (i = 0; i < listlen; i++)
+ {
+ size_t len = strlen (try_in_order[i]) + 1;
+ memcpy (memory, try_in_order[i], len);
+ new_try_in_order[i] = (const char *) memory;
+ memory += len;
+ }
+ new_try_in_order[i] = NULL;
+
+ /* Now insert the new alias. */
+ new_alias->name = new_name;
+ new_alias->encodings_to_try = new_try_in_order;
+ new_alias->next = NULL;
+ /* FIXME: Not multithread-safe. */
+ *autodetect_list_end = new_alias;
+ autodetect_list_end = &new_alias->next;
+ return 0;
+ }
+ else
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+}
+
+/* Like mem_iconveha, except no handling of transliteration. */
+static int
+mem_iconveha_notranslit (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval = mem_iconveh (src, srclen, from_codeset, to_codeset, handler,
+ offsets, resultp, lengthp);
+ if (retval >= 0 || errno != EINVAL)
+ return retval;
+ else
+ {
+ struct autodetect_alias *alias;
+
+ /* Unsupported from_codeset or to_codeset. Check whether the caller
+ requested autodetection. */
+ for (alias = autodetect_list; alias != NULL; alias = alias->next)
+ if (strcmp (from_codeset, alias->name) == 0)
+ {
+ const char * const *encodings;
+
+ if (handler != iconveh_error)
+ {
+ /* First try all encodings without any forgiving. */
+ encodings = alias->encodings_to_try;
+ do
+ {
+ retval = mem_iconveha_notranslit (src, srclen,
+ *encodings, to_codeset,
+ iconveh_error, offsets,
+ resultp, lengthp);
+ if (!(retval < 0 && errno == EILSEQ))
+ return retval;
+ encodings++;
+ }
+ while (*encodings != NULL);
+ }
+
+ encodings = alias->encodings_to_try;
+ do
+ {
+ retval = mem_iconveha_notranslit (src, srclen,
+ *encodings, to_codeset,
+ handler, offsets,
+ resultp, lengthp);
+ if (!(retval < 0 && errno == EILSEQ))
+ return retval;
+ encodings++;
+ }
+ while (*encodings != NULL);
+
+ /* Return the last call's result. */
+ return -1;
+ }
+
+ /* It wasn't an autodetection name. */
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+int
+mem_iconveha (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ if (srclen == 0)
+ {
+ /* Nothing to convert. */
+ *lengthp = 0;
+ return 0;
+ }
+
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+ we want to use transliteration. */
+#if (((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2) \
+ && !defined __UCLIBC__) \
+ || _LIBICONV_VERSION >= 0x0105
+ if (transliterate)
+ {
+ int retval;
+ size_t len = strlen (to_codeset);
+ char *to_codeset_suffixed = (char *) malloca (len + 10 + 1);
+ memcpy (to_codeset_suffixed, to_codeset, len);
+ memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
+
+ retval = mem_iconveha_notranslit (src, srclen,
+ from_codeset, to_codeset_suffixed,
+ handler, offsets, resultp, lengthp);
+
+ freea (to_codeset_suffixed);
+
+ return retval;
+ }
+ else
+#endif
+ return mem_iconveha_notranslit (src, srclen,
+ from_codeset, to_codeset,
+ handler, offsets, resultp, lengthp);
+}
+
+/* Like str_iconveha, except no handling of transliteration. */
+static char *
+str_iconveha_notranslit (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_iconveh (src, from_codeset, to_codeset, handler);
+
+ if (result != NULL || errno != EINVAL)
+ return result;
+ else
+ {
+ struct autodetect_alias *alias;
+
+ /* Unsupported from_codeset or to_codeset. Check whether the caller
+ requested autodetection. */
+ for (alias = autodetect_list; alias != NULL; alias = alias->next)
+ if (strcmp (from_codeset, alias->name) == 0)
+ {
+ const char * const *encodings;
+
+ if (handler != iconveh_error)
+ {
+ /* First try all encodings without any forgiving. */
+ encodings = alias->encodings_to_try;
+ do
+ {
+ result = str_iconveha_notranslit (src,
+ *encodings, to_codeset,
+ iconveh_error);
+ if (!(result == NULL && errno == EILSEQ))
+ return result;
+ encodings++;
+ }
+ while (*encodings != NULL);
+ }
+
+ encodings = alias->encodings_to_try;
+ do
+ {
+ result = str_iconveha_notranslit (src,
+ *encodings, to_codeset,
+ handler);
+ if (!(result == NULL && errno == EILSEQ))
+ return result;
+ encodings++;
+ }
+ while (*encodings != NULL);
+
+ /* Return the last call's result. */
+ return NULL;
+ }
+
+ /* It wasn't an autodetection name. */
+ errno = EINVAL;
+ return NULL;
+ }
+}
+
+char *
+str_iconveha (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler)
+{
+ if (*src == '\0' || c_strcasecmp (from_codeset, to_codeset) == 0)
+ {
+ char *result = strdup (src);
+
+ if (result == NULL)
+ errno = ENOMEM;
+ return result;
+ }
+
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+ we want to use transliteration. */
+#if (((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2) \
+ && !defined __UCLIBC__) \
+ || _LIBICONV_VERSION >= 0x0105
+ if (transliterate)
+ {
+ char *result;
+ size_t len = strlen (to_codeset);
+ char *to_codeset_suffixed = (char *) malloca (len + 10 + 1);
+ memcpy (to_codeset_suffixed, to_codeset, len);
+ memcpy (to_codeset_suffixed + len, "//TRANSLIT", 10 + 1);
+
+ result = str_iconveha_notranslit (src, from_codeset, to_codeset_suffixed,
+ handler);
+
+ freea (to_codeset_suffixed);
+
+ return result;
+ }
+ else
+#endif
+ return str_iconveha_notranslit (src, from_codeset, to_codeset, handler);
+}
diff --git a/gnulib/lib/striconveha.h b/gnulib/lib/striconveha.h
new file mode 100644
index 0000000..792e6a8
--- /dev/null
+++ b/gnulib/lib/striconveha.h
@@ -0,0 +1,95 @@
+/* Character set conversion with error handling and autodetection.
+ Copyright (C) 2002, 2005, 2007-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _STRICONVEHA_H
+#define _STRICONVEHA_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include "iconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The "from" encoding can also be a name defined for autodetection.
+ If TRANSLITERATE is true, transliteration will attempted to avoid conversion
+ errors, for iconv implementations that support this. Usually you'll choose
+ TRANSLITERATE = true if HANDLER != iconveh_error.
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ mem_iconveha (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ The "from" encoding can also be a name defined for autodetection.
+ If TRANSLITERATE is true, transliteration will attempted to avoid conversion
+ errors, for iconv implementations that support this. Usually you'll choose
+ TRANSLITERATE = true if HANDLER != iconveh_error.
+ Allocate a malloced memory block for the result.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ str_iconveha (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ bool transliterate,
+ enum iconv_ilseq_handler handler);
+
+
+/* In the above, FROM_CODESET can also be one of the following values:
+ "autodetect_utf8" supports ISO-8859-1 and UTF-8
+ "autodetect_jp" supports EUC-JP, ISO-2022-JP-2 and SHIFT_JIS
+ "autodetect_kr" supports EUC-KR and ISO-2022-KR
+ More names can be defined for autodetection. */
+
+/* Registers an encoding name for autodetection.
+ TRY_IN_ORDER is a NULL terminated list of encodings to be tried.
+ Returns 0 upon success, or -1 (with errno set) in case of error.
+ Particular errno values: ENOMEM. */
+extern int
+ uniconv_register_autodetect (const char *name,
+ const char * const *try_in_order);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRICONVEHA_H */
diff --git a/gnulib/lib/string.in.h b/gnulib/lib/string.in.h
new file mode 100644
index 0000000..d8b753d
--- /dev/null
+++ b/gnulib/lib/string.in.h
@@ -0,0 +1,1011 @@
+/* A GNU-like <string.h>.
+
+ Copyright (C) 1995-1996, 2001-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+#define _@GUARD_PREFIX@_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro. */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSL@
+# if !@HAVE_FFSL@
+_GL_FUNCDECL_SYS (ffsl, int, (long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsl, int, (long int i));
+_GL_CXXALIASWARN (ffsl);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsl
+# if HAVE_RAW_DECL_FFSL
+_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
+# endif
+#endif
+
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSLL@
+# if !@HAVE_FFSLL@
+_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+_GL_CXXALIASWARN (ffsll);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsll
+# if HAVE_RAW_DECL_FFSLL
+_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
+# endif
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL. */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define memchr rpl_memchr
+# endif
+_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
+# else
+# if ! @HAVE_MEMCHR@
+_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const void * std::memchr (const void *, int, size_t); }
+ extern "C++" { void * std::memchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memchr,
+ void *, (void const *__s, int __c, size_t __n),
+ void const *, (void const *__s, int __c, size_t __n));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
+_GL_CXXALIASWARN1 (memchr, void const *,
+ (void const *__s, int __c, size_t __n));
+# else
+_GL_CXXALIASWARN (memchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared. */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+ "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define memmem rpl_memmem
+# endif
+_GL_FUNCDECL_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# else
+# if ! @HAVE_DECL_MEMMEM@
+_GL_FUNCDECL_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# endif
+_GL_CXXALIASWARN (memmem);
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+ "use gnulib module memmem-simple for portability, "
+ "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+_GL_FUNCDECL_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n));
+_GL_CXXALIASWARN (mempcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+ "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int). */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::memrchr (const void *, int, size_t); }
+ extern "C++" { void * std::memrchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memrchr,
+ void *, (void const *, int, size_t),
+ void const *, (void const *, int, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
+# else
+_GL_CXXALIASWARN (memrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+ "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S. More efficient than
+ memchr(S,C,N), at the expense of undefined behavior if C does not
+ occur within N bytes. */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::rawmemchr (const void *, int); }
+ extern "C++" { void * std::rawmemchr (void *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
+ void *, (void const *__s, int __c_in),
+ void const *, (void const *__s, int __c_in));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
+_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (rawmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+ "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+_GL_FUNCDECL_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src));
+_GL_CXXALIASWARN (stpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+ "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+#if @GNULIB_STPNCPY@
+# if @REPLACE_STPNCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef stpncpy
+# define stpncpy rpl_stpncpy
+# endif
+_GL_FUNCDECL_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# else
+# if ! @HAVE_STPNCPY@
+_GL_FUNCDECL_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# endif
+_GL_CXXALIASWARN (stpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+ "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strchr
+/* Assume strchr is always declared. */
+_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+#if @GNULIB_STRCHRNUL@
+# if @REPLACE_STRCHRNUL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strchrnul rpl_strchrnul
+# endif
+_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strchrnul, char *,
+ (const char *str, int ch));
+# else
+# if ! @HAVE_STRCHRNUL@
+_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * std::strchrnul (const char *, int); }
+ extern "C++" { char * std::strchrnul (char *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (strchrnul,
+ char *, (char const *__s, int __c_in),
+ char const *, (char const *__s, int __c_in));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
+_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (strchrnul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+ "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup rpl_strdup
+# endif
+_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+ /* strdup exists as a function and as a macro. Get rid of the macro. */
+# undef strdup
+# endif
+# if !(@HAVE_DECL_STRDUP@ || defined strdup)
+_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+ "use gnulib module strdup for portability");
+# endif
+#endif
+
+/* Append no more than N characters from SRC onto DEST. */
+#if @GNULIB_STRNCAT@
+# if @REPLACE_STRNCAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strncat
+# define strncat rpl_strncat
+# endif
+_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+# else
+_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+# endif
+_GL_CXXALIASWARN (strncat);
+#elif defined GNULIB_POSIXCHECK
+# undef strncat
+# if HAVE_RAW_DECL_STRNCAT
+_GL_WARN_ON_USE (strncat, "strncat is unportable - "
+ "use gnulib module strncat for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING. */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strndup
+# define strndup rpl_strndup
+# endif
+_GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n));
+# else
+# if ! @HAVE_DECL_STRNDUP@
+_GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n));
+# endif
+_GL_CXXALIASWARN (strndup);
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+ "use gnulib module strndup for portability");
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+ MAXLEN bytes. If no '\0' terminator is found in that many bytes,
+ return MAXLEN. */
+#if @GNULIB_STRNLEN@
+# if @REPLACE_STRNLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strnlen
+# define strnlen rpl_strnlen
+# endif
+_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen));
+# else
+# if ! @HAVE_DECL_STRNLEN@
+_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
+# endif
+_GL_CXXALIASWARN (strnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+ "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strcspn
+/* Assume strcspn is always declared. */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const char * strpbrk (const char *, const char *); }
+ extern "C++" { char * strpbrk (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strpbrk,
+ char *, (char const *__s, char const *__accept),
+ const char *, (char const *__s, char const *__accept));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+ (char const *__s, char const *__accept));
+# else
+_GL_CXXALIASWARN (strpbrk);
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strpbrk
+_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
+ "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it cannot work with multibyte strings. */
+# undef strspn
+/* Assume strspn is always declared. */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strrchr
+/* Assume strrchr is always declared. */
+_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP
+ to point to the next char after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of strtok() that is multithread-safe and supports
+ empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strtok_r(). */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+_GL_FUNCDECL_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim));
+_GL_CXXALIASWARN (strsep);
+# if defined GNULIB_POSIXCHECK
+# undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+ "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strstr rpl_strstr
+# endif
+_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
+# else
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strstr (const char *, const char *); }
+ extern "C++" { char * strstr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strstr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strstr, const char *,
+ (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+ different from UTF-8:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strstr
+/* Assume strstr is always declared. */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+ "work correctly on character strings in most "
+ "multibyte locales - "
+ "use mbsstr if you care about internationalization, "
+ "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strcasestr rpl_strcasestr
+# endif
+_GL_FUNCDECL_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle));
+# else
+# if ! @HAVE_STRCASESTR@
+_GL_FUNCDECL_SYS (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strcasestr (const char *, const char *); }
+ extern "C++" { char * strcasestr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strcasestr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+ (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strcasestr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+ It is a glibc extension, and glibc implements it only for unibyte
+ locales. */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasestr if you care about "
+ "internationalization, or use c-strcasestr if you want "
+ "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ This is a variant of strtok() that is multithread-safe.
+
+ For the POSIX documentation for this function, see:
+ http://www.opengroup.org/susv3xsh/strtok.html
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strsep(). */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtok_r
+# define strtok_r rpl_strtok_r
+# endif
+_GL_FUNCDECL_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# else
+# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+# undef strtok_r
+# endif
+# if ! @HAVE_DECL_STRTOK_R@
+_GL_FUNCDECL_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# endif
+_GL_CXXALIASWARN (strtok_r);
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+ "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX. They are gnulib
+ extensions. */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+ This considers multibyte characters, unlike strlen, which counts bytes. */
+# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
+# undef mbslen
+# endif
+# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbslen rpl_mbslen
+# endif
+_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
+# else
+_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
+# endif
+_GL_CXXALIASWARN (mbslen);
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
+ _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbschr);
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strrchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux || defined __INTERIX
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbsrchr rpl_mbsrchr /* avoid collision with system function */
+# endif
+_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbsrchr);
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
+ Unlike strstr(), this function works correctly in multibyte locales with
+ encodings different from UTF-8. */
+_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths!
+ Unlike strcasecmp(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths!
+ Unlike strncasecmp(), this function works correctly in multibyte locales.
+ But beware that N is not a byte count but a character count! */
+_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case. If the two match, return a pointer to the first byte
+ after this prefix in STRING. Otherwise, return NULL.
+ Note: This function may, in multibyte locales, return non-NULL if STRING
+ is of smaller length than PREFIX!
+ Unlike strncasecmp(), this function works correctly in multibyte
+ locales. */
+_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) !
+ Unlike strcasestr(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strcspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists.
+ Unlike strpbrk(), this function works correctly in multibyte locales. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
+# else
+_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
+# endif
+_GL_CXXALIASWARN (mbspbrk);
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+ string DELIM) starting at the character string *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP to point
+ to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of mbstok_r() that supports empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbstok_r(). */
+_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+ the character string DELIM.
+ If STRING is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = mbstok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbssep(). */
+_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+ _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message. */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror
+# define strerror rpl_strerror
+# endif
+_GL_FUNCDECL_RPL (strerror, char *, (int));
+_GL_CXXALIAS_RPL (strerror, char *, (int));
+# else
+_GL_CXXALIAS_SYS (strerror, char *, (int));
+# endif
+_GL_CXXALIASWARN (strerror);
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared. */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+ "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+/* Map any int, typically from errno, into an error message. Multithread-safe.
+ Uses the POSIX declaration, not the glibc declaration. */
+#if @GNULIB_STRERROR_R@
+# if @REPLACE_STRERROR_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror_r
+# define strerror_r rpl_strerror_r
+# endif
+_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_STRERROR_R@
+_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# endif
+# if @HAVE_DECL_STRERROR_R@
+_GL_CXXALIASWARN (strerror_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror_r
+# if HAVE_RAW_DECL_STRERROR_R
+_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
+ "use gnulib module strerror_r-posix for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strsignal rpl_strsignal
+# endif
+_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
+_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
+# else
+# if ! @HAVE_DECL_STRSIGNAL@
+_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is
+ 'const char *'. */
+_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
+# endif
+_GL_CXXALIASWARN (strsignal);
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+ "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
+_GL_CXXALIASWARN (strverscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+ "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
diff --git a/gnulib/lib/strings.in.h b/gnulib/lib/strings.in.h
new file mode 100644
index 0000000..7eaf28d
--- /dev/null
+++ b/gnulib/lib/strings.in.h
@@ -0,0 +1,123 @@
+/* A substitute <strings.h>.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Minix 3.1.8 has a bug: <sys/types.h> must be included before <strings.h>.
+ But avoid namespace pollution on glibc systems. */
+#if defined __minix && !defined __GLIBC__
+# include <sys/types.h>
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_STRINGS_H@
+# @INCLUDE_NEXT@ @NEXT_STRINGS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+#define _@GUARD_PREFIX@_STRINGS_H
+
+#if ! @HAVE_DECL_STRNCASECMP@
+/* Get size_t. */
+# include <stddef.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /* Find the index of the least-significant set bit. */
+#if @GNULIB_FFS@
+# if !@HAVE_FFS@
+_GL_FUNCDECL_SYS (ffs, int, (int i));
+# endif
+_GL_CXXALIAS_SYS (ffs, int, (int i));
+_GL_CXXALIASWARN (ffs);
+#elif defined GNULIB_POSIXCHECK
+# undef ffs
+# if HAVE_RAW_DECL_FFS
+_GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
+# endif
+#endif
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work in multibyte locales. */
+#if ! @HAVE_STRCASECMP@
+extern int strcasecmp (char const *s1, char const *s2)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strcasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strcasecmp
+# if HAVE_RAW_DECL_STRCASECMP
+_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasecmp if you care about "
+ "internationalization, or use c_strcasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+#if ! @HAVE_DECL_STRNCASECMP@
+extern int strncasecmp (char const *s1, char const *s2, size_t n)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strncasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strncasecmp
+# if HAVE_RAW_DECL_STRNCASECMP
+_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbsncasecmp or mbspcasecmp if you care about "
+ "internationalization, or use c_strncasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
diff --git a/gnulib/lib/stripslash.c b/gnulib/lib/stripslash.c
new file mode 100644
index 0000000..1212440
--- /dev/null
+++ b/gnulib/lib/stripslash.c
@@ -0,0 +1,45 @@
+/* stripslash.c -- remove redundant trailing slashes from a file name
+
+ Copyright (C) 1990, 2001, 2003-2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+/* Remove trailing slashes from FILE. Return true if a trailing slash
+ was removed. This is useful when using file name completion from a
+ shell that adds a "/" after directory names (such as tcsh and
+ bash), because on symlinks to directories, several system calls
+ have different semantics according to whether a trailing slash is
+ present. */
+
+bool
+strip_trailing_slashes (char *file)
+{
+ char *base = last_component (file);
+ char *base_lim;
+ bool had_slash;
+
+ /* last_component returns "" for file system roots, but we need to turn
+ `///' into `/'. */
+ if (! *base)
+ base = file;
+ base_lim = base + base_len (base);
+ had_slash = (*base_lim != '\0');
+ *base_lim = '\0';
+ return had_slash;
+}
diff --git a/gnulib/lib/strncasecmp.c b/gnulib/lib/strncasecmp.c
new file mode 100644
index 0000000..c44da83
--- /dev/null
+++ b/gnulib/lib/strncasecmp.c
@@ -0,0 +1,63 @@
+/* strncasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998-1999, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+
+int
+strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
diff --git a/gnulib/lib/strncat.c b/gnulib/lib/strncat.c
new file mode 100644
index 0000000..8fe2a64
--- /dev/null
+++ b/gnulib/lib/strncat.c
@@ -0,0 +1,33 @@
+/* Concatenate strings.
+ Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+char *
+strncat (char *dest, const char *src, size_t n)
+{
+ char *destptr = dest + strlen (dest);
+
+ for (; n > 0 && (*destptr = *src) != '\0'; src++, destptr++, n--)
+ ;
+ if (n == 0)
+ *destptr = '\0';
+ return dest;
+}
diff --git a/gnulib/lib/strndup.c b/gnulib/lib/strndup.c
new file mode 100644
index 0000000..dd446a8
--- /dev/null
+++ b/gnulib/lib/strndup.c
@@ -0,0 +1,37 @@
+/* A replacement function, for systems that lack strndup.
+
+ Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+char *
+strndup (char const *s, size_t n)
+{
+ size_t len = strnlen (s, n);
+ char *new = malloc (len + 1);
+
+ if (new == NULL)
+ return NULL;
+
+ new[len] = '\0';
+ return memcpy (new, s, len);
+}
diff --git a/gnulib/lib/strnlen.c b/gnulib/lib/strnlen.c
new file mode 100644
index 0000000..26295cc
--- /dev/null
+++ b/gnulib/lib/strnlen.c
@@ -0,0 +1,31 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <string.h>
+
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
diff --git a/gnulib/lib/strnlen1.c b/gnulib/lib/strnlen1.c
new file mode 100644
index 0000000..f64ce10
--- /dev/null
+++ b/gnulib/lib/strnlen1.c
@@ -0,0 +1,35 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "strnlen1.h"
+
+#include <string.h>
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+size_t
+strnlen1 (const char *string, size_t maxlen)
+{
+ const char *end = (const char *) memchr (string, '\0', maxlen);
+ if (end != NULL)
+ return end - string + 1;
+ else
+ return maxlen;
+}
diff --git a/gnulib/lib/strnlen1.h b/gnulib/lib/strnlen1.h
new file mode 100644
index 0000000..a0634fe
--- /dev/null
+++ b/gnulib/lib/strnlen1.h
@@ -0,0 +1,40 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _STRNLEN1_H
+#define _STRNLEN1_H
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+extern size_t strnlen1 (const char *string, size_t maxlen)
+ _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRNLEN1_H */
diff --git a/gnulib/lib/strpbrk.c b/gnulib/lib/strpbrk.c
new file mode 100644
index 0000000..05e6c51
--- /dev/null
+++ b/gnulib/lib/strpbrk.c
@@ -0,0 +1,42 @@
+/* Copyright (C) 1991, 1994, 2000, 2002-2003, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#undef strpbrk
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+char *
+strpbrk (const char *s, const char *accept)
+{
+ while (*s != '\0')
+ {
+ const char *a = accept;
+ while (*a != '\0')
+ if (*a++ == *s)
+ return (char *) s;
+ ++s;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/strptime.c b/gnulib/lib/strptime.c
new file mode 100644
index 0000000..6cf44bc
--- /dev/null
+++ b/gnulib/lib/strptime.c
@@ -0,0 +1,1145 @@
+/* Copyright (C) 2002, 2004-2005, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <time.h>
+
+#include <assert.h>
+#include <ctype.h>
+#ifdef _LIBC
+# include <langinfo.h>
+#endif
+#include <limits.h>
+#include <string.h>
+#include <stdbool.h>
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+#ifndef _LIBC
+enum ptime_locale_status { not, loc, raw };
+#endif
+
+
+
+#define match_char(ch1, ch2) if (ch1 != ch2) return NULL
+#if defined _LIBC && defined __GNUC__ && __GNUC__ >= 2
+# define match_string(cs1, s2) \
+ ({ size_t len = strlen (cs1); \
+ int result = __strncasecmp_l ((cs1), (s2), len, locale) == 0; \
+ if (result) (s2) += len; \
+ result; })
+#else
+/* Oh come on. Get a reasonable compiler. */
+# define match_string(cs1, s2) \
+ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
+#endif
+/* We intentionally do not use isdigit() for testing because this will
+ lead to problems with the wide character version. */
+#define get_number(from, to, n) \
+ do { \
+ int __n = n; \
+ val = 0; \
+ while (*rp == ' ') \
+ ++rp; \
+ if (*rp < '0' || *rp > '9') \
+ return NULL; \
+ do { \
+ val *= 10; \
+ val += *rp++ - '0'; \
+ } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \
+ if (val < from || val > to) \
+ return NULL; \
+ } while (0)
+#ifdef _NL_CURRENT
+# define get_alt_number(from, to, n) \
+ ({ \
+ __label__ do_normal; \
+ \
+ if (*decided != raw) \
+ { \
+ val = _nl_parse_alt_digit (&rp HELPER_LOCALE_ARG); \
+ if (val == -1 && *decided != loc) \
+ { \
+ *decided = loc; \
+ goto do_normal; \
+ } \
+ if (val < from || val > to) \
+ return NULL; \
+ } \
+ else \
+ { \
+ do_normal: \
+ get_number (from, to, n); \
+ } \
+ 0; \
+ })
+#else
+# define get_alt_number(from, to, n) \
+ /* We don't have the alternate representation. */ \
+ get_number(from, to, n)
+#endif
+#define recursive(new_fmt) \
+ (*(new_fmt) != '\0' \
+ && (rp = __strptime_internal (rp, (new_fmt), tm, \
+ decided, era_cnt LOCALE_ARG)) != NULL)
+
+
+#ifdef _LIBC
+/* This is defined in locale/C-time.c in the GNU libc. */
+extern const struct locale_data _nl_C_LC_TIME attribute_hidden;
+
+# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
+# define ab_weekday_name \
+ (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
+# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
+# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
+# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
+# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)
+# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
+# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
+# define HERE_T_FMT_AMPM \
+ (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
+# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
+
+# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n)
+#else
+static char const weekday_name[][10] =
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ };
+static char const ab_weekday_name[][4] =
+ {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+static char const month_name[][10] =
+ {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ };
+static char const ab_month_name[][4] =
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
+# define HERE_D_FMT "%m/%d/%y"
+# define HERE_AM_STR "AM"
+# define HERE_PM_STR "PM"
+# define HERE_T_FMT_AMPM "%I:%M:%S %p"
+# define HERE_T_FMT "%H:%M:%S"
+
+static const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+#endif
+
+#if defined _LIBC
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+# define strptime __strptime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# undef _NL_CURRENT_WORD
+# define _NL_CURRENT_WORD(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].word)
+# define LOCALE_PARAM , locale
+# define LOCALE_ARG , locale
+# define LOCALE_PARAM_PROTO , __locale_t locale
+# define LOCALE_PARAM_DECL __locale_t locale;
+# define HELPER_LOCALE_ARG , current
+# define ISSPACE(Ch) __isspace_l (Ch, locale)
+#else
+# define LOCALE_PARAM
+# define LOCALE_ARG
+# define LOCALE_PARAM_DECL
+# define LOCALE_PARAM_PROTO
+# define HELPER_LOCALE_ARG
+# define ISSPACE(Ch) isspace (Ch)
+#endif
+
+
+
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+ except every 100th isn't, and every 400th is). */
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+/* Compute the day of the week. */
+static void
+day_of_the_week (struct tm *tm)
+{
+ /* We know that January 1st 1970 was a Thursday (= 4). Compute the
+ difference between this data in the one on TM and so determine
+ the weekday. */
+ int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);
+ int wday = (-473
+ + (365 * (tm->tm_year - 70))
+ + (corr_year / 4)
+ - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0)
+ + (((corr_year / 4) / 25) / 4)
+ + __mon_yday[0][tm->tm_mon]
+ + tm->tm_mday - 1);
+ tm->tm_wday = ((wday % 7) + 7) % 7;
+}
+
+/* Compute the day of the year. */
+static void
+day_of_the_year (struct tm *tm)
+{
+ tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]
+ + (tm->tm_mday - 1));
+}
+
+
+#ifdef _LIBC
+char *
+internal_function
+#else
+static char *
+#endif
+__strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM)
+ const char *rp;
+ const char *fmt;
+ struct tm *tm;
+ enum ptime_locale_status *decided;
+ int era_cnt;
+ LOCALE_PARAM_DECL
+{
+#ifdef _LIBC
+ struct locale_data *const current = locale->__locales[LC_TIME];
+#endif
+
+ const char *rp_backup;
+ int cnt;
+ size_t val;
+ int have_I, is_pm;
+ int century, want_century;
+ int want_era;
+ int have_wday, want_xday;
+ int have_yday;
+ int have_mon, have_mday;
+ int have_uweek, have_wweek;
+ int week_no;
+#ifdef _NL_CURRENT
+ size_t num_eras;
+#endif
+ struct era_entry *era;
+
+ have_I = is_pm = 0;
+ century = -1;
+ want_century = 0;
+ want_era = 0;
+ era = NULL;
+ week_no = 0;
+
+ have_wday = want_xday = have_yday = have_mon = have_mday = have_uweek = 0;
+ have_wweek = 0;
+
+ while (*fmt != '\0')
+ {
+ /* A white space in the format string matches 0 more or white
+ space in the input string. */
+ if (ISSPACE (*fmt))
+ {
+ while (ISSPACE (*rp))
+ ++rp;
+ ++fmt;
+ continue;
+ }
+
+ /* Any character but `%' must be matched by the same character
+ in the iput string. */
+ if (*fmt != '%')
+ {
+ match_char (*fmt++, *rp++);
+ continue;
+ }
+
+ ++fmt;
+#ifndef _NL_CURRENT
+ /* We need this for handling the `E' modifier. */
+ start_over:
+#endif
+
+ /* Make back up of current processing pointer. */
+ rp_backup = rp;
+
+ switch (*fmt++)
+ {
+ case '%':
+ /* Match the `%' character itself. */
+ match_char ('%', *rp++);
+ break;
+ case 'a':
+ case 'A':
+ /* Match day of week. */
+ for (cnt = 0; cnt < 7; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
+ weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
+ ab_weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (*decided != loc
+ && (match_string (weekday_name[cnt], rp)
+ || match_string (ab_weekday_name[cnt], rp)))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 7)
+ /* Does not match a weekday name. */
+ return NULL;
+ tm->tm_wday = cnt;
+ have_wday = 1;
+ break;
+ case 'b':
+ case 'B':
+ case 'h':
+ /* Match month name. */
+ for (cnt = 0; cnt < 12; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
+ month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
+ ab_month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (match_string (month_name[cnt], rp)
+ || match_string (ab_month_name[cnt], rp))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 12)
+ /* Does not match a month name. */
+ return NULL;
+ tm->tm_mon = cnt;
+ want_xday = 1;
+ break;
+ case 'c':
+ /* Match locale's date and time format. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ /* Match century number. */
+#ifdef _NL_CURRENT
+ match_century:
+#endif
+ get_number (0, 99, 2);
+ century = val;
+ want_xday = 1;
+ break;
+ case 'd':
+ case 'e':
+ /* Match day of month. */
+ get_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'F':
+ if (!recursive ("%Y-%m-%d"))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'x':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'D':
+ /* Match standard day format. */
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'k':
+ case 'H':
+ /* Match hour in 24-hour clock. */
+ get_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'l':
+ /* Match hour in 12-hour clock. GNU extension. */
+ case 'I':
+ /* Match hour in 12-hour clock. */
+ get_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'j':
+ /* Match day number of year. */
+ get_number (1, 366, 3);
+ tm->tm_yday = val - 1;
+ have_yday = 1;
+ break;
+ case 'm':
+ /* Match number of month. */
+ get_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minute. */
+ get_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'n':
+ case 't':
+ /* Match any white space. */
+ while (ISSPACE (*rp))
+ ++rp;
+ break;
+ case 'p':
+ /* Match locale's equivalent of AM/PM. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
+ *decided = loc;
+ is_pm = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!match_string (HERE_AM_STR, rp))
+ {
+ if (match_string (HERE_PM_STR, rp))
+ is_pm = 1;
+ else
+ return NULL;
+ }
+ break;
+ case 'r':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
+ HERE_T_FMT_AMPM))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_T_FMT_AMPM))
+ return NULL;
+ break;
+ case 'R':
+ if (!recursive ("%H:%M"))
+ return NULL;
+ break;
+ case 's':
+ {
+ /* The number of seconds may be very high so we cannot use
+ the `get_number' macro. Instead read the number
+ character for character and construct the result while
+ doing this. */
+ time_t secs = 0;
+ if (*rp < '0' || *rp > '9')
+ /* We need at least one digit. */
+ return NULL;
+
+ do
+ {
+ secs *= 10;
+ secs += *rp++ - '0';
+ }
+ while (*rp >= '0' && *rp <= '9');
+
+ if (localtime_r (&secs, tm) == NULL)
+ /* Error in function. */
+ return NULL;
+ }
+ break;
+ case 'S':
+ get_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'X':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'T':
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ case 'u':
+ get_number (1, 7, 1);
+ tm->tm_wday = val % 7;
+ have_wday = 1;
+ break;
+ case 'g':
+ get_number (0, 99, 2);
+ /* XXX This cannot determine any field in TM. */
+ break;
+ case 'G':
+ if (*rp < '0' || *rp > '9')
+ return NULL;
+ /* XXX Ignore the number since we would need some more
+ information to compute a real date. */
+ do
+ ++rp;
+ while (*rp >= '0' && *rp <= '9');
+ break;
+ case 'U':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without some
+ information. */
+ break;
+ case 'w':
+ /* Match number of weekday. */
+ get_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+#ifdef _NL_CURRENT
+ match_year_in_century:
+#endif
+ /* Match year within century. */
+ get_number (0, 99, 2);
+ /* The "Year 2000: The Millennium Rollover" paper suggests that
+ values in the range 69-99 refer to the twentieth century. */
+ tm->tm_year = val >= 69 ? val : val + 100;
+ /* Indicate that we want to use the century, if specified. */
+ want_century = 1;
+ want_xday = 1;
+ break;
+ case 'Y':
+ /* Match year including century number. */
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'Z':
+ /* XXX How to handle this? */
+ break;
+ case 'z':
+ /* We recognize two formats: if two digits are given, these
+ specify hours. If fours digits are used, minutes are
+ also specified. */
+ {
+ bool neg;
+ int n;
+
+ val = 0;
+ while (*rp == ' ')
+ ++rp;
+ if (*rp != '+' && *rp != '-')
+ return NULL;
+ neg = *rp++ == '-';
+ n = 0;
+ while (n < 4 && *rp >= '0' && *rp <= '9')
+ {
+ val = val * 10 + *rp++ - '0';
+ ++n;
+ }
+ if (n == 2)
+ val *= 100;
+ else if (n != 4)
+ /* Only two or four digits recognized. */
+ return NULL;
+ else
+ {
+ /* We have to convert the minutes into decimal. */
+ if (val % 100 >= 60)
+ return NULL;
+ val = (val / 100) * 100 + ((val % 100) * 50) / 30;
+ }
+ if (val > 1200)
+ return NULL;
+#if defined _LIBC || HAVE_TM_GMTOFF
+ tm->tm_gmtoff = (val * 3600) / 100;
+ if (neg)
+ tm->tm_gmtoff = -tm->tm_gmtoff;
+#endif
+ }
+ break;
+ case 'E':
+#ifdef _NL_CURRENT
+ switch (*fmt++)
+ {
+ case 'c':
+ /* Match locale's alternate date and time format. */
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ if (*decided != raw)
+ {
+ if (era_cnt >= 0)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ else
+ return NULL;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ goto match_century;
+ case 'y':
+ if (*decided != raw)
+ {
+ get_number(0, 9999, 4);
+ tm->tm_year = val;
+ want_era = 1;
+ want_xday = 1;
+ want_century = 1;
+
+ if (era_cnt >= 0)
+ {
+ assert (*decided == loc);
+
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ bool match = false;
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ match = (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction));
+ }
+ if (! match)
+ return NULL;
+
+ break;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras; ++era_cnt)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ if (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+
+ goto match_year_in_century;
+ case 'Y':
+ if (*decided != raw)
+ {
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && recursive (era->era_format))
+ break;
+ }
+ if (era_cnt == (int) num_eras)
+ {
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ *decided = loc;
+ era_cnt = -1;
+ break;
+ }
+
+ *decided = raw;
+ }
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'x':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ break;
+ case 'X':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+#else
+ /* We have no information about the era format. Just use
+ the normal format. */
+ if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
+ && *fmt != 'x' && *fmt != 'X')
+ /* This is an illegal format. */
+ return NULL;
+
+ goto start_over;
+#endif
+ case 'O':
+ switch (*fmt++)
+ {
+ case 'd':
+ case 'e':
+ /* Match day of month using alternate numeric symbols. */
+ get_alt_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'H':
+ /* Match hour in 24-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'I':
+ /* Match hour in 12-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'm':
+ /* Match month using alternate numeric symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minutes using alternate numeric symbols. */
+ get_alt_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'S':
+ /* Match seconds using alternate numeric symbols. */
+ get_alt_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'U':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_alt_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without
+ further information. */
+ break;
+ case 'w':
+ /* Match number of weekday using alternate numeric symbols. */
+ get_alt_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+ /* Match year within century using alternate numeric symbols. */
+ get_alt_number (0, 99, 2);
+ tm->tm_year = val >= 69 ? val : val + 100;
+ want_xday = 1;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+ default:
+ return NULL;
+ }
+ }
+
+ if (have_I && is_pm)
+ tm->tm_hour += 12;
+
+ if (century != -1)
+ {
+ if (want_century)
+ tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
+ else
+ /* Only the century, but not the year. Strange, but so be it. */
+ tm->tm_year = (century - 19) * 100;
+ }
+
+ if (era_cnt != -1)
+ {
+#ifdef _NL_CURRENT
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era == NULL)
+ return NULL;
+ if (want_era)
+ tm->tm_year = (era->start_date[0]
+ + ((tm->tm_year - era->offset)
+ * era->absolute_direction));
+ else
+ /* Era start year assumed. */
+ tm->tm_year = era->start_date[0];
+#endif
+ }
+ else
+ if (want_era)
+ {
+ /* No era found but we have seen an E modifier. Rectify some
+ values. */
+ if (want_century && century == -1 && tm->tm_year < 69)
+ tm->tm_year += 100;
+ }
+
+ if (want_xday && !have_wday)
+ {
+ if ( !(have_mon && have_mday) && have_yday)
+ {
+ /* We don't have tm_mon and/or tm_mday, compute them. */
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+ day_of_the_week (tm);
+ }
+
+ if (want_xday && !have_yday)
+ day_of_the_year (tm);
+
+ if ((have_uweek || have_wweek) && have_wday)
+ {
+ int save_wday = tm->tm_wday;
+ int save_mday = tm->tm_mday;
+ int save_mon = tm->tm_mon;
+ int w_offset = have_uweek ? 0 : 1;
+
+ tm->tm_mday = 1;
+ tm->tm_mon = 0;
+ day_of_the_week (tm);
+ if (have_mday)
+ tm->tm_mday = save_mday;
+ if (have_mon)
+ tm->tm_mon = save_mon;
+
+ if (!have_yday)
+ tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7
+ + (week_no - 1) *7
+ + save_wday - w_offset);
+
+ if (!have_mday || !have_mon)
+ {
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon]
+ <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+
+ tm->tm_wday = save_wday;
+ }
+
+ return (char *) rp;
+}
+
+
+char *
+strptime (buf, format, tm LOCALE_PARAM)
+ const char *restrict buf;
+ const char *restrict format;
+ struct tm *restrict tm;
+ LOCALE_PARAM_DECL
+{
+ enum ptime_locale_status decided;
+
+#ifdef _NL_CURRENT
+ decided = not;
+#else
+ decided = raw;
+#endif
+ return __strptime_internal (buf, format, tm, &decided, -1 LOCALE_ARG);
+}
+
+#ifdef _LIBC
+weak_alias (__strptime_l, strptime_l)
+#endif
diff --git a/gnulib/lib/strsep.c b/gnulib/lib/strsep.c
new file mode 100644
index 0000000..77dcb99
--- /dev/null
+++ b/gnulib/lib/strsep.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2004, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ Written by Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <string.h>
+
+char *
+strsep (char **stringp, const char *delim)
+{
+ char *start = *stringp;
+ char *ptr;
+
+ if (start == NULL)
+ return NULL;
+
+ /* Optimize the case of no delimiters. */
+ if (delim[0] == '\0')
+ {
+ *stringp = NULL;
+ return start;
+ }
+
+ /* Optimize the case of one delimiter. */
+ if (delim[1] == '\0')
+ ptr = strchr (start, delim[0]);
+ else
+ /* The general case. */
+ ptr = strpbrk (start, delim);
+ if (ptr == NULL)
+ {
+ *stringp = NULL;
+ return start;
+ }
+
+ *ptr = '\0';
+ *stringp = ptr + 1;
+
+ return start;
+}
diff --git a/gnulib/lib/strsignal.c b/gnulib/lib/strsignal.c
new file mode 100644
index 0000000..7caab1d
--- /dev/null
+++ b/gnulib/lib/strsignal.c
@@ -0,0 +1,200 @@
+/* Copyright (C) 1991, 1994-2002, 2005, 2008-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <string.h>
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else /* !_LIBC */
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+# define N_(msgid) gettext_noop (msgid)
+#endif /* _LIBC */
+
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else /* !_LIBC */
+# include "glthread/lock.h"
+# include "glthread/tls.h"
+# define __libc_once_define(CLASS, NAME) gl_once_define (CLASS, NAME)
+# define __libc_once(NAME, INIT) gl_once ((NAME), (INIT))
+# define __libc_key_t gl_tls_key_t
+# define __libc_getspecific(NAME) gl_tls_get ((NAME))
+# define __libc_setspecific(NAME, POINTER) gl_tls_set ((NAME), (POINTER))
+# define __snprintf snprintf
+#endif /* _LIBC */
+
+#ifdef _LIBC
+
+/* Defined in siglist.c. */
+extern const char *const _sys_siglist[];
+extern const char *const _sys_siglist_internal[] attribute_hidden;
+
+#else /* !_LIBC */
+
+/* NetBSD declares sys_siglist in unistd.h. */
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+# define INTUSE(x) (x)
+
+# if HAVE_DECL_SYS_SIGLIST
+# undef _sys_siglist
+# define _sys_siglist sys_siglist
+# else /* !HAVE_DECL_SYS_SIGLIST */
+# ifndef NSIG
+# define NSIG 32
+# endif /* NSIG */
+# if !HAVE_DECL__SYS_SIGLIST
+static const char *_sys_siglist[NSIG];
+# endif
+# endif /* !HAVE_DECL_SYS_SIGLIST */
+
+#endif /* _LIBC */
+
+static __libc_key_t key;
+
+/* If nonzero the key allocation failed and we should better use a
+ static buffer than fail. */
+#define BUFFERSIZ 100
+static char local_buf[BUFFERSIZ];
+static char *static_buf;
+
+/* Destructor for the thread-specific data. */
+static void init (void);
+static void free_key_mem (void *mem);
+static char *getbuffer (void);
+
+
+/* Return a string describing the meaning of the signal number SIGNUM. */
+char *
+strsignal (int signum)
+{
+ const char *desc;
+ __libc_once_define (static, once);
+
+ /* If we have not yet initialized the buffer do it now. */
+ __libc_once (once, init);
+
+ if (
+#ifdef SIGRTMIN
+ (signum >= SIGRTMIN && signum <= SIGRTMAX) ||
+#endif
+ signum < 0 || signum >= NSIG
+ || (desc = INTUSE(_sys_siglist)[signum]) == NULL)
+ {
+ char *buffer = getbuffer ();
+ int len;
+#ifdef SIGRTMIN
+ if (signum >= SIGRTMIN && signum <= SIGRTMAX)
+ len = __snprintf (buffer, BUFFERSIZ - 1, _("Real-time signal %d"),
+ signum - (int) SIGRTMIN);
+ else
+#endif
+ len = __snprintf (buffer, BUFFERSIZ - 1, _("Unknown signal %d"),
+ signum);
+ if (len >= BUFFERSIZ)
+ buffer = NULL;
+ else
+ buffer[len] = '\0';
+
+ return buffer;
+ }
+
+ return (char *) _(desc);
+}
+
+
+/* Initialize buffer. */
+static void
+init (void)
+{
+#ifdef _LIBC
+ if (__libc_key_create (&key, free_key_mem))
+ /* Creating the key failed. This means something really went
+ wrong. In any case use a static buffer which is better than
+ nothing. */
+ static_buf = local_buf;
+#else /* !_LIBC */
+ gl_tls_key_init (key, free_key_mem);
+
+# if !HAVE_DECL_SYS_SIGLIST
+ memset (_sys_siglist, 0, NSIG * sizeof *_sys_siglist);
+
+ /* No need to use a do {} while (0) here since init_sig(...) must expand
+ to a complete statement. (We cannot use the ISO C99 designated array
+ initializer syntax since it is not supported by ANSI C compilers and
+ since some signal numbers might exceed NSIG.) */
+# define init_sig(sig, abbrev, desc) \
+ if (sig >= 0 && sig < NSIG) \
+ _sys_siglist[sig] = desc;
+
+# include "siglist.h"
+
+# undef init_sig
+
+# endif /* !HAVE_DECL_SYS_SIGLIST */
+#endif /* !_LIBC */
+}
+
+
+/* Free the thread specific data, this is done if a thread terminates. */
+static void
+free_key_mem (void *mem)
+{
+ free (mem);
+ __libc_setspecific (key, NULL);
+}
+
+
+/* Return the buffer to be used. */
+static char *
+getbuffer (void)
+{
+ char *result;
+
+ if (static_buf != NULL)
+ result = static_buf;
+ else
+ {
+ /* We don't use the static buffer and so we have a key. Use it
+ to get the thread-specific buffer. */
+ result = __libc_getspecific (key);
+ if (result == NULL)
+ {
+ /* No buffer allocated so far. */
+ result = malloc (BUFFERSIZ);
+ if (result == NULL)
+ /* No more memory available. We use the static buffer. */
+ result = local_buf;
+ else
+ __libc_setspecific (key, result);
+ }
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/strstr.c b/gnulib/lib/strstr.c
new file mode 100644
index 0000000..5399ff6
--- /dev/null
+++ b/gnulib/lib/strstr.c
@@ -0,0 +1,83 @@
+/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This particular implementation was written by Eric Blake, 2008. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Specification of strstr. */
+#include <string.h>
+
+#include <stdbool.h>
+
+#ifndef _LIBC
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#include "str-two-way.h"
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
+ if NEEDLE is empty, otherwise NULL if NEEDLE is not found in
+ HAYSTACK. */
+char *
+strstr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= *haystack++ == *needle++;
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+
+ /* Reduce the size of haystack using strchr, since it has a smaller
+ linear coefficient than the Two-Way algorithm. */
+ needle_len = needle - needle_start;
+ haystack = strchr (haystack_start + 1, *needle_start);
+ if (!haystack || __builtin_expect (needle_len == 1, 0))
+ return (char *) haystack;
+ needle -= needle_len;
+ haystack_len = (haystack > haystack_start + needle_len ? 1
+ : needle_len + haystack_start - haystack);
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle, needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle, needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/gnulib/lib/strtod.c b/gnulib/lib/strtod.c
new file mode 100644
index 0000000..bf6955a
--- /dev/null
+++ b/gnulib/lib/strtod.c
@@ -0,0 +1,367 @@
+/* Copyright (C) 1991-1992, 1997, 1999, 2003, 2006, 2008-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "c-ctype.h"
+
+#ifndef HAVE_LDEXP_IN_LIBC
+#define HAVE_LDEXP_IN_LIBC 0
+#endif
+#ifndef HAVE_RAW_DECL_STRTOD
+#define HAVE_RAW_DECL_STRTOD 0
+#endif
+
+/* Return true if C is a space in the current locale, avoiding
+ problems with signed char and isspace. */
+static bool
+locale_isspace (char c)
+{
+ unsigned char uc = c;
+ return isspace (uc) != 0;
+}
+
+#if !HAVE_LDEXP_IN_LIBC
+ #define ldexp dummy_ldexp
+ /* A dummy definition that will never be invoked. */
+ static double ldexp (double x _GL_UNUSED, int exponent _GL_UNUSED)
+ {
+ abort ();
+ return 0.0;
+ }
+#endif
+
+/* Return X * BASE**EXPONENT. Return an extreme value and set errno
+ to ERANGE if underflow or overflow occurs. */
+static double
+scale_radix_exp (double x, int radix, long int exponent)
+{
+ /* If RADIX == 10, this code is neither precise nor fast; it is
+ merely a straightforward and relatively portable approximation.
+ If N == 2, this code is precise on a radix-2 implementation,
+ albeit perhaps not fast if ldexp is not in libc. */
+
+ long int e = exponent;
+
+ if (HAVE_LDEXP_IN_LIBC && radix == 2)
+ return ldexp (x, e < INT_MIN ? INT_MIN : INT_MAX < e ? INT_MAX : e);
+ else
+ {
+ double r = x;
+
+ if (r != 0)
+ {
+ if (e < 0)
+ {
+ while (e++ != 0)
+ {
+ r /= radix;
+ if (r == 0 && x != 0)
+ {
+ errno = ERANGE;
+ break;
+ }
+ }
+ }
+ else
+ {
+ while (e-- != 0)
+ {
+ if (r < -DBL_MAX / radix)
+ {
+ errno = ERANGE;
+ return -HUGE_VAL;
+ }
+ else if (DBL_MAX / radix < r)
+ {
+ errno = ERANGE;
+ return HUGE_VAL;
+ }
+ else
+ r *= radix;
+ }
+ }
+ }
+
+ return r;
+ }
+}
+
+/* Parse a number at NPTR; this is a bit like strtol (NPTR, ENDPTR)
+ except there are no leading spaces or signs or "0x", and ENDPTR is
+ nonnull. The number uses a base BASE (either 10 or 16) fraction, a
+ radix RADIX (either 10 or 2) exponent, and exponent character
+ EXPCHAR. To convert from a number of digits to a radix exponent,
+ multiply by RADIX_MULTIPLIER (either 1 or 4). */
+static double
+parse_number (const char *nptr,
+ int base, int radix, int radix_multiplier, char expchar,
+ char **endptr)
+{
+ const char *s = nptr;
+ bool got_dot = false;
+ long int exponent = 0;
+ double num = 0;
+
+ for (;; ++s)
+ {
+ int digit;
+ if (c_isdigit (*s))
+ digit = *s - '0';
+ else if (base == 16 && c_isxdigit (*s))
+ digit = c_tolower (*s) - ('a' - 10);
+ else if (! got_dot && *s == '.')
+ {
+ /* Record that we have found the decimal point. */
+ got_dot = true;
+ continue;
+ }
+ else
+ /* Any other character terminates the number. */
+ break;
+
+ /* Make sure that multiplication by base will not overflow. */
+ if (num <= DBL_MAX / base)
+ num = num * base + digit;
+ else
+ {
+ /* The value of the digit doesn't matter, since we have already
+ gotten as many digits as can be represented in a `double'.
+ This doesn't necessarily mean the result will overflow.
+ The exponent may reduce it to within range.
+
+ We just need to record that there was another
+ digit so that we can multiply by 10 later. */
+ exponent += radix_multiplier;
+ }
+
+ /* Keep track of the number of digits after the decimal point.
+ If we just divided by base here, we might lose precision. */
+ if (got_dot)
+ exponent -= radix_multiplier;
+ }
+
+ if (c_tolower (*s) == expchar && ! locale_isspace (s[1]))
+ {
+ /* Add any given exponent to the implicit one. */
+ int save = errno;
+ char *end;
+ long int value = strtol (s + 1, &end, 10);
+ errno = save;
+
+ if (s + 1 != end)
+ {
+ /* Skip past the exponent, and add in the implicit exponent,
+ resulting in an extreme value on overflow. */
+ s = end;
+ exponent =
+ (exponent < 0
+ ? (value < LONG_MIN - exponent ? LONG_MIN : exponent + value)
+ : (LONG_MAX - exponent < value ? LONG_MAX : exponent + value));
+ }
+ }
+
+ *endptr = (char *) s;
+ return scale_radix_exp (num, radix, exponent);
+}
+
+static double underlying_strtod (const char *, char **);
+
+/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
+ ICC 10.0 has a bug when optimizing the expression -zero.
+ The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
+ to PowerPC on MacOS X 10.5. */
+#if defined __hpux || defined __sgi || defined __ICC
+static double
+compute_minus_zero (void)
+{
+ return -DBL_MIN * DBL_MIN;
+}
+# define minus_zero compute_minus_zero ()
+#else
+double minus_zero = -0.0;
+#endif
+
+/* Convert NPTR to a double. If ENDPTR is not NULL, a pointer to the
+ character after the last one used in the number is put in *ENDPTR. */
+double
+strtod (const char *nptr, char **endptr)
+{
+ bool negative = false;
+
+ /* The number so far. */
+ double num;
+
+ const char *s = nptr;
+ const char *end;
+ char *endbuf;
+ int saved_errno;
+
+ /* Eat whitespace. */
+ while (locale_isspace (*s))
+ ++s;
+
+ /* Get the sign. */
+ negative = *s == '-';
+ if (*s == '-' || *s == '+')
+ ++s;
+
+ saved_errno = errno;
+ num = underlying_strtod (s, &endbuf);
+ end = endbuf;
+
+ if (c_isdigit (s[*s == '.']))
+ {
+ /* If a hex float was converted incorrectly, do it ourselves.
+ If the string starts with "0x" but does not contain digits,
+ consume the "0" ourselves. If a hex float is followed by a
+ 'p' but no exponent, then adjust the end pointer. */
+ if (*s == '0' && c_tolower (s[1]) == 'x')
+ {
+ if (! c_isxdigit (s[2 + (s[2] == '.')]))
+ end = s + 1;
+ else if (end <= s + 2)
+ {
+ num = parse_number (s + 2, 16, 2, 4, 'p', &endbuf);
+ end = endbuf;
+ }
+ else
+ {
+ const char *p = s + 2;
+ while (p < end && c_tolower (*p) != 'p')
+ p++;
+ if (p < end && ! c_isdigit (p[1 + (p[1] == '-' || p[1] == '+')]))
+ end = p;
+ }
+ }
+ else
+ {
+ /* If "1e 1" was misparsed as 10.0 instead of 1.0, re-do the
+ underlying strtod on a copy of the original string
+ truncated to avoid the bug. */
+ const char *e = s + 1;
+ while (e < end && c_tolower (*e) != 'e')
+ e++;
+ if (e < end && ! c_isdigit (e[1 + (e[1] == '-' || e[1] == '+')]))
+ {
+ char *dup = strdup (s);
+ errno = saved_errno;
+ if (!dup)
+ {
+ /* Not really our day, is it. Rounding errors are
+ better than outright failure. */
+ num = parse_number (s, 10, 10, 1, 'e', &endbuf);
+ }
+ else
+ {
+ dup[e - s] = '\0';
+ num = underlying_strtod (dup, &endbuf);
+ saved_errno = errno;
+ free (dup);
+ errno = saved_errno;
+ }
+ end = e;
+ }
+ }
+
+ s = end;
+ }
+
+ /* Check for infinities and NaNs. */
+ else if (c_tolower (*s) == 'i'
+ && c_tolower (s[1]) == 'n'
+ && c_tolower (s[2]) == 'f')
+ {
+ s += 3;
+ if (c_tolower (*s) == 'i'
+ && c_tolower (s[1]) == 'n'
+ && c_tolower (s[2]) == 'i'
+ && c_tolower (s[3]) == 't'
+ && c_tolower (s[4]) == 'y')
+ s += 5;
+ num = HUGE_VAL;
+ errno = saved_errno;
+ }
+ else if (c_tolower (*s) == 'n'
+ && c_tolower (s[1]) == 'a'
+ && c_tolower (s[2]) == 'n')
+ {
+ s += 3;
+ if (*s == '(')
+ {
+ const char *p = s + 1;
+ while (c_isalnum (*p))
+ p++;
+ if (*p == ')')
+ s = p + 1;
+ }
+
+ /* If the underlying implementation misparsed the NaN, assume
+ its result is incorrect, and return a NaN. Normally it's
+ better to use the underlying implementation's result, since a
+ nice implementation populates the bits of the NaN according
+ to interpreting n-char-sequence as a hexadecimal number. */
+ if (s != end)
+ num = NAN;
+ errno = saved_errno;
+ }
+ else
+ {
+ /* No conversion could be performed. */
+ errno = EINVAL;
+ s = nptr;
+ }
+
+ if (endptr != NULL)
+ *endptr = (char *) s;
+ /* Special case -0.0, since at least ICC miscompiles negation. We
+ can't use copysign(), as that drags in -lm on some platforms. */
+ if (!num && negative)
+ return minus_zero;
+ return negative ? -num : num;
+}
+
+/* The "underlying" strtod implementation. This must be defined
+ after strtod because it #undefs strtod. */
+static double
+underlying_strtod (const char *nptr, char **endptr)
+{
+ if (HAVE_RAW_DECL_STRTOD)
+ {
+ /* Prefer the native strtod if available. Usually it should
+ work and it should give more-accurate results than our
+ approximation. */
+ #undef strtod
+ return strtod (nptr, endptr);
+ }
+ else
+ {
+ /* Approximate strtod well enough for this module. There's no
+ need to handle anything but finite unsigned decimal
+ numbers with nonnull ENDPTR. */
+ return parse_number (nptr, 10, 10, 1, 'e', endptr);
+ }
+}
diff --git a/gnulib/lib/strtoimax.c b/gnulib/lib/strtoimax.c
new file mode 100644
index 0000000..497d155
--- /dev/null
+++ b/gnulib/lib/strtoimax.c
@@ -0,0 +1,75 @@
+/* Convert string representation of a number into an intmax_t value.
+
+ Copyright (C) 1999, 2001-2004, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+/* Verify interface. */
+#include <inttypes.h>
+
+#include <stdlib.h>
+
+#include "verify.h"
+
+#ifdef UNSIGNED
+# ifndef HAVE_DECL_STRTOULL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG_INT
+unsigned long long int strtoull (char const *, char **, int);
+# endif
+
+#else
+
+# ifndef HAVE_DECL_STRTOLL
+"this configure-time declaration test was not run"
+# endif
+# if !HAVE_DECL_STRTOLL && HAVE_LONG_LONG_INT
+long long int strtoll (char const *, char **, int);
+# endif
+#endif
+
+#ifdef UNSIGNED
+# define Have_long_long HAVE_UNSIGNED_LONG_LONG_INT
+# define Int uintmax_t
+# define Unsigned unsigned
+# define strtoimax strtoumax
+# define strtol strtoul
+# define strtoll strtoull
+#else
+# define Have_long_long HAVE_LONG_LONG_INT
+# define Int intmax_t
+# define Unsigned
+#endif
+
+Int
+strtoimax (char const *ptr, char **endptr, int base)
+{
+#if Have_long_long
+ verify (sizeof (Int) == sizeof (Unsigned long int)
+ || sizeof (Int) == sizeof (Unsigned long long int));
+
+ if (sizeof (Int) != sizeof (Unsigned long int))
+ return strtoll (ptr, endptr, base);
+#else
+ verify (sizeof (Int) == sizeof (Unsigned long int));
+#endif
+
+ return strtol (ptr, endptr, base);
+}
diff --git a/gnulib/lib/strtok_r.c b/gnulib/lib/strtok_r.c
new file mode 100644
index 0000000..b60efcd
--- /dev/null
+++ b/gnulib/lib/strtok_r.c
@@ -0,0 +1,76 @@
+/* Reentrant string tokenizer. Generic version.
+ Copyright (C) 1991, 1996-1999, 2001, 2004, 2007, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef _LIBC
+# undef strtok_r
+# undef __strtok_r
+#else
+# define __strtok_r strtok_r
+# define __rawmemchr strchr
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+*/
+char *
+__strtok_r (char *s, const char *delim, char **save_ptr)
+{
+ char *token;
+
+ if (s == NULL)
+ s = *save_ptr;
+
+ /* Scan leading delimiters. */
+ s += strspn (s, delim);
+ if (*s == '\0')
+ {
+ *save_ptr = s;
+ return NULL;
+ }
+
+ /* Find the end of the token. */
+ token = s;
+ s = strpbrk (token, delim);
+ if (s == NULL)
+ /* This token finishes the string. */
+ *save_ptr = __rawmemchr (token, '\0');
+ else
+ {
+ /* Terminate the token and make *SAVE_PTR point past it. */
+ *s = '\0';
+ *save_ptr = s + 1;
+ }
+ return token;
+}
+#ifdef weak_alias
+libc_hidden_def (__strtok_r)
+weak_alias (__strtok_r, strtok_r)
+#endif
diff --git a/gnulib/lib/strtol.c b/gnulib/lib/strtol.c
new file mode 100644
index 0000000..6c15d11
--- /dev/null
+++ b/gnulib/lib/strtol.c
@@ -0,0 +1,433 @@
+/* Convert string representation of a number into an integer value.
+
+ Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# define USE_NUMBER_GROUPING
+#else
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef USE_NUMBER_GROUPING
+# include "../locale/localeinfo.h"
+#endif
+
+/* Nonzero if we are defining `strtoul' or `strtoull', operating on
+ unsigned integers. */
+#ifndef UNSIGNED
+# define UNSIGNED 0
+# define INT LONG int
+#else
+# define INT unsigned LONG int
+#endif
+
+/* Determine the name. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoull_l
+# else
+# define strtol __wcstoul_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoull_l
+# else
+# define strtol __strtoul_l
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoll_l
+# else
+# define strtol __wcstol_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoll_l
+# else
+# define strtol __strtol_l
+# endif
+# endif
+# endif
+#else
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoull
+# else
+# define strtol wcstoul
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoull
+# else
+# define strtol strtoul
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoll
+# else
+# define strtol wcstol
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoll
+# endif
+# endif
+# endif
+#endif
+
+/* If QUAD is defined, we are defining `strtoll' or `strtoull',
+ operating on `long long int's. */
+#ifdef QUAD
+# define LONG long long
+# define STRTOL_LONG_MIN LLONG_MIN
+# define STRTOL_LONG_MAX LLONG_MAX
+# define STRTOL_ULONG_MAX ULLONG_MAX
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if negative values of the signed integer type T use two's
+ complement, ones' complement, or signed magnitude representation,
+ respectively. Much GNU code assumes two's complement, but some
+ people like to be portable to all possible C hosts. */
+# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
+# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+
+/* True if the arithmetic type T is signed. */
+# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* The maximum and minimum values for the integer type T. These
+ macros have undefined behavior if T is signed and has padding bits.
+ If this is a problem for you, please let us know how to fix it for
+ your host. */
+# define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ TYPE_MAXIMUM (t)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+
+# ifndef ULLONG_MAX
+# define ULLONG_MAX TYPE_MAXIMUM (unsigned long long)
+# endif
+# ifndef LLONG_MAX
+# define LLONG_MAX TYPE_MAXIMUM (long long int)
+# endif
+# ifndef LLONG_MIN
+# define LLONG_MIN TYPE_MINIMUM (long long int)
+# endif
+
+# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
+ /* Work around gcc bug with using this constant. */
+ static const unsigned long long int maxquad = ULLONG_MAX;
+# undef STRTOL_ULONG_MAX
+# define STRTOL_ULONG_MAX maxquad
+# endif
+#else
+# define LONG long
+# define STRTOL_LONG_MIN LONG_MIN
+# define STRTOL_LONG_MAX LONG_MAX
+# define STRTOL_ULONG_MAX ULONG_MAX
+#endif
+
+
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_PROTO , __locale_t loc
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_PROTO
+#endif
+
+#ifdef USE_WIDE_CHAR
+# include <wchar.h>
+# include <wctype.h>
+# define L_(Ch) L##Ch
+# define UCHAR_TYPE wint_t
+# define STRING_TYPE wchar_t
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __iswspace_l ((Ch), loc)
+# define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __towupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) iswspace (Ch)
+# define ISALPHA(Ch) iswalpha (Ch)
+# define TOUPPER(Ch) towupper (Ch)
+# endif
+#else
+# define L_(Ch) Ch
+# define UCHAR_TYPE unsigned char
+# define STRING_TYPE char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __isspace_l ((Ch), loc)
+# define ISALPHA(Ch) __isalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __toupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) isspace (Ch)
+# define ISALPHA(Ch) isalpha (Ch)
+# define TOUPPER(Ch) toupper (Ch)
+# endif
+#endif
+
+#define INTERNAL(X) INTERNAL1(X)
+#define INTERNAL1(X) __##X##_internal
+#define WEAKNAME(X) WEAKNAME1(X)
+
+#ifdef USE_NUMBER_GROUPING
+/* This file defines a function to check for correct grouping. */
+# include "grouping.h"
+#endif
+
+
+
+/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
+ If BASE is 0 the base is determined by the presence of a leading
+ zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
+ If BASE is < 2 or > 36, it is reset to 10.
+ If ENDPTR is not NULL, a pointer to the character after the last
+ one converted is stored in *ENDPTR. */
+
+INT
+INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base, int group LOCALE_PARAM_PROTO)
+{
+ int negative;
+ register unsigned LONG int cutoff;
+ register unsigned int cutlim;
+ register unsigned LONG int i;
+ register const STRING_TYPE *s;
+ register UCHAR_TYPE c;
+ const STRING_TYPE *save, *end;
+ int overflow;
+
+#ifdef USE_NUMBER_GROUPING
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ struct locale_data *current = loc->__locales[LC_NUMERIC];
+# endif
+ /* The thousands character of the current locale. */
+ wchar_t thousands = L'\0';
+ /* The numeric grouping specification of the current locale,
+ in the format described in <locale.h>. */
+ const char *grouping;
+
+ if (group)
+ {
+ grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
+ if (*grouping <= 0 || *grouping == CHAR_MAX)
+ grouping = NULL;
+ else
+ {
+ /* Figure out the thousands separator character. */
+# if defined _LIBC || defined _HAVE_BTOWC
+ thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+ if (thousands == WEOF)
+ thousands = L'\0';
+# endif
+ if (thousands == L'\0')
+ grouping = NULL;
+ }
+ }
+ else
+ grouping = NULL;
+#endif
+
+ if (base < 0 || base == 1 || base > 36)
+ {
+ __set_errno (EINVAL);
+ return 0;
+ }
+
+ save = s = nptr;
+
+ /* Skip white space. */
+ while (ISSPACE (*s))
+ ++s;
+ if (*s == L_('\0'))
+ goto noconv;
+
+ /* Check for a sign. */
+ if (*s == L_('-'))
+ {
+ negative = 1;
+ ++s;
+ }
+ else if (*s == L_('+'))
+ {
+ negative = 0;
+ ++s;
+ }
+ else
+ negative = 0;
+
+ /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
+ if (*s == L_('0'))
+ {
+ if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
+ {
+ s += 2;
+ base = 16;
+ }
+ else if (base == 0)
+ base = 8;
+ }
+ else if (base == 0)
+ base = 10;
+
+ /* Save the pointer so we can check later if anything happened. */
+ save = s;
+
+#ifdef USE_NUMBER_GROUPING
+ if (group)
+ {
+ /* Find the end of the digit string and check its grouping. */
+ end = s;
+ for (c = *end; c != L_('\0'); c = *++end)
+ if ((wchar_t) c != thousands
+ && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
+ && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
+ break;
+ if (*s == thousands)
+ end = s;
+ else
+ end = correctly_grouped_prefix (s, end, thousands, grouping);
+ }
+ else
+#endif
+ end = NULL;
+
+ cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
+ cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
+
+ overflow = 0;
+ i = 0;
+ for (c = *s; c != L_('\0'); c = *++s)
+ {
+ if (s == end)
+ break;
+ if (c >= L_('0') && c <= L_('9'))
+ c -= L_('0');
+ else if (ISALPHA (c))
+ c = TOUPPER (c) - L_('A') + 10;
+ else
+ break;
+ if ((int) c >= base)
+ break;
+ /* Check for overflow. */
+ if (i > cutoff || (i == cutoff && c > cutlim))
+ overflow = 1;
+ else
+ {
+ i *= (unsigned LONG int) base;
+ i += c;
+ }
+ }
+
+ /* Check if anything actually happened. */
+ if (s == save)
+ goto noconv;
+
+ /* Store in ENDPTR the address of one character
+ past the last character we converted. */
+ if (endptr != NULL)
+ *endptr = (STRING_TYPE *) s;
+
+#if !UNSIGNED
+ /* Check for a value that is within the range of
+ `unsigned LONG int', but outside the range of `LONG int'. */
+ if (overflow == 0
+ && i > (negative
+ ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
+ : (unsigned LONG int) STRTOL_LONG_MAX))
+ overflow = 1;
+#endif
+
+ if (overflow)
+ {
+ __set_errno (ERANGE);
+#if UNSIGNED
+ return STRTOL_ULONG_MAX;
+#else
+ return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
+#endif
+ }
+
+ /* Return the result of the appropriate sign. */
+ return negative ? -i : i;
+
+noconv:
+ /* We must handle a special case here: the base is 0 or 16 and the
+ first two characters are '0' and 'x', but the rest are no
+ hexadecimal digits. This is no error case. We return 0 and
+ ENDPTR points to the `x`. */
+ if (endptr != NULL)
+ {
+ if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
+ && save[-2] == L_('0'))
+ *endptr = (STRING_TYPE *) &save[-1];
+ else
+ /* There was no number to convert. */
+ *endptr = (STRING_TYPE *) nptr;
+ }
+
+ return 0L;
+}
+
+/* External user entry point. */
+
+
+INT
+#ifdef weak_function
+weak_function
+#endif
+strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base LOCALE_PARAM_PROTO)
+{
+ return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
+}
diff --git a/gnulib/lib/strtoll.c b/gnulib/lib/strtoll.c
new file mode 100644
index 0000000..75afa4d
--- /dev/null
+++ b/gnulib/lib/strtoll.c
@@ -0,0 +1,33 @@
+/* Function to parse a `long long int' from text.
+ Copyright (C) 1995-1997, 1999, 2001, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define QUAD 1
+
+#include <strtol.c>
+
+#ifdef _LIBC
+# ifdef SHARED
+# include <shlib-compat.h>
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
+compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
+# endif
+
+# endif
+weak_alias (strtoll, strtoq)
+#endif
diff --git a/gnulib/lib/strtoul.c b/gnulib/lib/strtoul.c
new file mode 100644
index 0000000..6fa6d0c
--- /dev/null
+++ b/gnulib/lib/strtoul.c
@@ -0,0 +1,19 @@
+/* Copyright (C) 1991, 1997, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define UNSIGNED 1
+
+#include "strtol.c"
diff --git a/gnulib/lib/strtoull.c b/gnulib/lib/strtoull.c
new file mode 100644
index 0000000..bf25995
--- /dev/null
+++ b/gnulib/lib/strtoull.c
@@ -0,0 +1,26 @@
+/* Function to parse an `unsigned long long int' from text.
+ Copyright (C) 1995-1997, 1999, 2009-2011 Free Software Foundation, Inc.
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define QUAD 1
+
+#include "strtoul.c"
+
+#ifdef _LIBC
+strong_alias (__strtoull_internal, __strtouq_internal)
+weak_alias (strtoull, strtouq)
+#endif
diff --git a/gnulib/lib/strtoumax.c b/gnulib/lib/strtoumax.c
new file mode 100644
index 0000000..dc395d6
--- /dev/null
+++ b/gnulib/lib/strtoumax.c
@@ -0,0 +1,2 @@
+#define UNSIGNED 1
+#include "strtoimax.c"
diff --git a/gnulib/lib/strverscmp.c b/gnulib/lib/strverscmp.c
new file mode 100644
index 0000000..be527a7
--- /dev/null
+++ b/gnulib/lib/strverscmp.c
@@ -0,0 +1,132 @@
+/* Compare strings while treating digits characters numerically.
+ Copyright (C) 1997, 2000, 2002, 2004, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
+ fractional parts, S_Z: idem but with leading Zeroes only */
+#define S_N 0x0
+#define S_I 0x4
+#define S_F 0x8
+#define S_Z 0xC
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define CMP 2
+#define LEN 3
+
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+#undef __strverscmp
+#undef strverscmp
+
+#ifndef weak_alias
+# define __strverscmp strverscmp
+#endif
+
+/* Compare S1 and S2 as strings holding indices/version numbers,
+ returning less than, equal to or greater than zero if S1 is less than,
+ equal to or greater than S2 (for more info, see the texinfo doc).
+*/
+
+int
+__strverscmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+ int state;
+ int diff;
+
+ /* Symbol(s) 0 [1-9] others (padding)
+ Transition (10) 0 (01) d (00) x (11) - */
+ static const unsigned int next_state[] =
+ {
+ /* state x d 0 - */
+ /* S_N */ S_N, S_I, S_Z, S_N,
+ /* S_I */ S_N, S_I, S_I, S_I,
+ /* S_F */ S_N, S_F, S_F, S_F,
+ /* S_Z */ S_N, S_F, S_Z, S_Z
+ };
+
+ static const int result_type[] =
+ {
+ /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
+ 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
+
+ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP,
+ 1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
+ /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP,
+ -1, CMP, CMP, CMP
+ };
+
+ if (p1 == p2)
+ return 0;
+
+ c1 = *p1++;
+ c2 = *p2++;
+ /* Hint: '0' is a digit too. */
+ state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));
+
+ while ((diff = c1 - c2) == 0 && c1 != '\0')
+ {
+ state = next_state[state];
+ c1 = *p1++;
+ c2 = *p2++;
+ state |= (c1 == '0') + (ISDIGIT (c1) != 0);
+ }
+
+ state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];
+
+ switch (state)
+ {
+ case CMP:
+ return diff;
+
+ case LEN:
+ while (ISDIGIT (*p1++))
+ if (!ISDIGIT (*p2++))
+ return 1;
+
+ return ISDIGIT (*p2) ? -1 : diff;
+
+ default:
+ return state;
+ }
+}
+#ifdef weak_alias
+weak_alias (__strverscmp, strverscmp)
+#endif
diff --git a/gnulib/lib/symlink.c b/gnulib/lib/symlink.c
new file mode 100644
index 0000000..2896cc9
--- /dev/null
+++ b/gnulib/lib/symlink.c
@@ -0,0 +1,57 @@
+/* Stub for symlink().
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+
+#if HAVE_SYMLINK
+
+# undef symlink
+
+/* Create a symlink, but reject trailing slash. */
+int
+rpl_symlink (char const *contents, char const *name)
+{
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (lstat (name, &st) == 0)
+ errno = EEXIST;
+ return -1;
+ }
+ return symlink (contents, name);
+}
+
+#else /* !HAVE_SYMLINK */
+
+/* The system does not support symlinks. */
+int
+symlink (char const *contents _GL_UNUSED,
+ char const *name _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#endif /* !HAVE_SYMLINK */
diff --git a/gnulib/lib/symlinkat.c b/gnulib/lib/symlinkat.c
new file mode 100644
index 0000000..fc5bb52
--- /dev/null
+++ b/gnulib/lib/symlinkat.c
@@ -0,0 +1,76 @@
+/* Create a symlink relative to an open directory.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#if !HAVE_SYMLINK
+/* Mingw lacks symlink, and it is more efficient to provide a trivial
+ wrapper than to go through at-func.c to call rpl_symlink. */
+
+# include <errno.h>
+
+int
+symlinkat (char const *path1 _GL_UNUSED, int fd _GL_UNUSED,
+ char const *path2 _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_SYMLINK */
+
+/* Our openat helper functions expect the directory parameter first,
+ not second. These shims make life easier. */
+
+/* Like symlink, but with arguments reversed. */
+static int
+symlink_reversed (char const *file, char const *contents)
+{
+ return symlink (contents, file);
+}
+
+/* Like symlinkat, but with arguments reversed. */
+
+static int
+symlinkat_reversed (int fd, char const *file, char const *contents);
+
+# define AT_FUNC_NAME symlinkat_reversed
+# define AT_FUNC_F1 symlink_reversed
+# define AT_FUNC_POST_FILE_PARAM_DECLS , char const *contents
+# define AT_FUNC_POST_FILE_ARGS , contents
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+/* Create a symlink FILE, in the directory open on descriptor FD,
+ holding CONTENTS. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then symlink/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+
+int
+symlinkat (char const *contents, int fd, char const *file)
+{
+ return symlinkat_reversed (fd, file, contents);
+}
+
+#endif /* HAVE_SYMLINK */
diff --git a/gnulib/lib/sys_file.in.h b/gnulib/lib/sys_file.in.h
new file mode 100644
index 0000000..1e10dae
--- /dev/null
+++ b/gnulib/lib/sys_file.in.h
@@ -0,0 +1,64 @@
+/* Provide a more complete sys/file.h.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Richard W.M. Jones. */
+
+#ifndef _@GUARD_PREFIX@_SYS_FILE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_FILE_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_FILE_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_FILE_H
+#define _@GUARD_PREFIX@_SYS_FILE_H
+
+#ifndef LOCK_SH
+/* Operations for the 'flock' call (same as Linux kernel constants). */
+# define LOCK_SH 1 /* Shared lock. */
+# define LOCK_EX 2 /* Exclusive lock. */
+# define LOCK_UN 8 /* Unlock. */
+
+/* Can be OR'd in to one of the above. */
+# define LOCK_NB 4 /* Don't block when locking. */
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if @GNULIB_FLOCK@
+/* Apply or remove advisory locks on an open file.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if !@HAVE_FLOCK@
+extern int flock (int fd, int operation);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef flock
+# if HAVE_RAW_DECL_FLOCK
+_GL_WARN_ON_USE (flock, "flock is unportable - "
+ "use gnulib module flock for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_FILE_H */
+#endif /* _@GUARD_PREFIX@_SYS_FILE_H */
diff --git a/gnulib/lib/sys_ioctl.in.h b/gnulib/lib/sys_ioctl.in.h
new file mode 100644
index 0000000..5ed764e
--- /dev/null
+++ b/gnulib/lib/sys_ioctl.in.h
@@ -0,0 +1,79 @@
+/* Substitute for and wrapper around <sys/ioctl.h>.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_IOCTL_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_IOCTL_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+#define _@GUARD_PREFIX@_SYS_IOCTL_H
+
+/* AIX 5.1 and Solaris 10 declare ioctl() in <unistd.h> and in <stropts.h>,
+ but not in <sys/ioctl.h>.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_IOCTL@
+# if @REPLACE_IOCTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ioctl
+# define ioctl rpl_ioctl
+# endif
+_GL_FUNCDECL_RPL (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+_GL_CXXALIAS_RPL (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# else
+# if @SYS_IOCTL_H_HAVE_WINSOCK2_H@ || 1
+_GL_FUNCDECL_SYS (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# endif
+_GL_CXXALIAS_SYS (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# endif
+_GL_CXXALIASWARN (ioctl);
+#elif @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef ioctl
+# define ioctl ioctl_used_without_requesting_gnulib_module_ioctl
+#elif defined GNULIB_POSIXCHECK
+# undef ioctl
+# if HAVE_RAW_DECL_IOCTL
+_GL_WARN_ON_USE (ioctl, "ioctl does not portably work on sockets - "
+ "use gnulib module ioctl for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
diff --git a/gnulib/lib/sys_select.in.h b/gnulib/lib/sys_select.in.h
new file mode 100644
index 0000000..397508a
--- /dev/null
+++ b/gnulib/lib/sys_select.in.h
@@ -0,0 +1,288 @@
+/* Substitute for <sys/select.h>.
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+/* On OSF/1, <sys/types.h> and <sys/time.h> include <sys/select.h>.
+ Simply delegate to the system's header in this case. */
+#if @HAVE_SYS_SELECT_H@ && defined __osf__ && (defined _SYS_TYPES_H_ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H) && defined _OSF_SOURCE
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#elif @HAVE_SYS_SELECT_H@ && defined __osf__ && (defined _SYS_TIME_H_ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H) && defined _OSF_SOURCE
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+/* On IRIX 6.5, <sys/timespec.h> includes <sys/types.h>, which includes
+ <sys/bsd_types.h>, which includes <sys/select.h>. At this point we cannot
+ include <signal.h>, because that includes <internal/signal_core.h>, which
+ gives a syntax error because <sys/timespec.h> has not been completely
+ processed. Simply delegate to the system's header in this case. */
+#elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H)
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#else
+
+#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
+
+/* On many platforms, <sys/select.h> assumes prior inclusion of
+ <sys/types.h>. Also, mingw defines sigset_t there, instead of
+ in <signal.h> where it belongs. */
+#include <sys/types.h>
+
+/* Get definition of 'sigset_t'.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <signal.h>
+#endif
+
+#if @HAVE_SYS_SELECT_H@
+
+/* On OSF/1 4.0, <sys/select.h> provides only a forward declaration
+ of 'struct timeval', and no definition of this type.
+ Also, MacOS X, AIX, HP-UX, IRIX, Solaris, Interix declare select()
+ in <sys/time.h>.
+ But avoid namespace pollution on glibc systems. */
+# ifndef __GLIBC__
+# include <sys/time.h>
+# endif
+
+/* On AIX 7 and Solaris 10, <sys/select.h> provides an FD_ZERO implementation
+ that relies on memset(), but without including <string.h>.
+ But in any case avoid namespace pollution on glibc systems. */
+# if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \
+ && ! defined __GLIBC__
+# include <string.h>
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
+#define _@GUARD_PREFIX@_SYS_SELECT_H
+
+#if !@HAVE_SYS_SELECT_H@
+/* A platform that lacks <sys/select.h>. */
+/* Get the 'struct timeval' and 'fd_set' types and the FD_* macros
+ on most platforms. */
+# include <sys/time.h>
+/* On HP-UX 11, <sys/time.h> provides an FD_ZERO implementation
+ that relies on memset(), but without including <string.h>. */
+# if defined __hpux
+# include <string.h>
+# endif
+/* On native Windows platforms:
+ Get the 'fd_set' type.
+ Get the close() declaration before we override it. */
+# if @HAVE_WINSOCK2_H@
+# if !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+# endif
+# include <io.h>
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Fix some definitions from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+
+# if !GNULIB_defined_rpl_fd_isset
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using
+ network sockets. */
+static inline int
+rpl_fd_isset (SOCKET fd, fd_set * set)
+{
+ u_int i;
+ if (set == NULL)
+ return 0;
+
+ for (i = 0; i < set->fd_count; i++)
+ if (set->fd_array[i] == fd)
+ return 1;
+
+ return 0;
+}
+
+# define GNULIB_defined_rpl_fd_isset 1
+# endif
+
+# undef FD_ISSET
+# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+#endif
+
+
+#if @GNULIB_PSELECT@
+# if @REPLACE_PSELECT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pselect
+# define pselect rpl_pselect
+# endif
+_GL_FUNCDECL_RPL (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+_GL_CXXALIAS_RPL (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# else
+# if !@HAVE_PSELECT@
+_GL_FUNCDECL_SYS (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# endif
+_GL_CXXALIAS_SYS (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# endif
+_GL_CXXALIASWARN (pselect);
+#elif defined GNULIB_POSIXCHECK
+# undef pselect
+# if HAVE_RAW_DECL_PSELECT
+_GL_WARN_ON_USE (pselect, "pselect is not portable - "
+ "use gnulib module pselect for portability");
+# endif
+#endif
+
+#if @GNULIB_SELECT@
+# if @REPLACE_SELECT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select rpl_select
+# endif
+_GL_FUNCDECL_RPL (select, int,
+ (int, fd_set *, fd_set *, fd_set *, struct timeval *));
+_GL_CXXALIAS_RPL (select, int,
+ (int, fd_set *, fd_set *, fd_set *, struct timeval *));
+# else
+_GL_CXXALIAS_SYS (select, int,
+ (int, fd_set *, fd_set *, fd_set *, struct timeval *));
+# endif
+_GL_CXXALIASWARN (select);
+#elif @HAVE_WINSOCK2_H@
+# undef select
+# define select select_used_without_requesting_gnulib_module_select
+#elif defined GNULIB_POSIXCHECK
+# undef select
+# if HAVE_RAW_DECL_SELECT
+_GL_WARN_ON_USE (select, "select is not always POSIX compliant - "
+ "use gnulib module select for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
+#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
+#endif /* OSF/1 */
diff --git a/gnulib/lib/sys_socket.in.h b/gnulib/lib/sys_socket.in.h
new file mode 100644
index 0000000..107c180
--- /dev/null
+++ b/gnulib/lib/sys_socket.in.h
@@ -0,0 +1,683 @@
+/* Provide a sys/socket header file for systems lacking it (read: MinGW)
+ and for systems where it is incomplete.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file is supposed to be used on platforms that lack <sys/socket.h>,
+ on platforms where <sys/socket.h> cannot be included standalone, and on
+ platforms where <sys/socket.h> does not provide all necessary definitions.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+/* Special invocation convention:
+ - On Cygwin 1.5.x we have a sequence of nested includes
+ <sys/socket.h> -> <cygwin/socket.h> -> <asm/socket.h> -> <cygwin/if.h>,
+ and the latter includes <sys/socket.h>. In this situation, the functions
+ are not yet declared, therefore we cannot provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
+
+#if @HAVE_SYS_SOCKET_H@
+
+# define _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+
+/* On many platforms, <sys/socket.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* On FreeBSD 6.4, <sys/socket.h> defines some macros that assume that NULL
+ is defined. */
+# include <stddef.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
+
+# undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
+#define _@GUARD_PREFIX@_SYS_SOCKET_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if !@HAVE_SA_FAMILY_T@
+# if !GNULIB_defined_sa_family_t
+typedef unsigned short sa_family_t;
+# define GNULIB_defined_sa_family_t 1
+# endif
+#endif
+
+#if @HAVE_STRUCT_SOCKADDR_STORAGE@
+/* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1. */
+# if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+# ifndef ss_family
+# define ss_family __ss_family
+# endif
+# endif
+#else
+# include <stdalign.h>
+/* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on
+ 2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */
+# define __ss_aligntype unsigned long int
+# define _SS_SIZE 256
+# define _SS_PADSIZE \
+ (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \
+ ? sizeof (sa_family_t) \
+ : alignof (__ss_aligntype)) \
+ + sizeof (__ss_aligntype)))
+
+# if !GNULIB_defined_struct_sockaddr_storage
+struct sockaddr_storage
+{
+ sa_family_t ss_family; /* Address family, etc. */
+ __ss_aligntype __ss_align; /* Force desired alignment. */
+ char __ss_padding[_SS_PADSIZE];
+};
+# define GNULIB_defined_struct_sockaddr_storage 1
+# endif
+
+#endif
+
+/* Get struct iovec. */
+/* But avoid namespace pollution on glibc systems. */
+#if ! defined __GLIBC__
+# include <sys/uio.h>
+#endif
+
+#if @HAVE_SYS_SOCKET_H@
+
+/* A platform that has <sys/socket.h>. */
+
+/* For shutdown(). */
+# if !defined SHUT_RD
+# define SHUT_RD 0
+# endif
+# if !defined SHUT_WR
+# define SHUT_WR 1
+# endif
+# if !defined SHUT_RDWR
+# define SHUT_RDWR 2
+# endif
+
+#else
+
+# ifdef __CYGWIN__
+# error "Cygwin does have a sys/socket.h, doesn't it?!?"
+# endif
+
+/* A platform that lacks <sys/socket.h>.
+
+ Currently only MinGW is supported. See the gnulib manual regarding
+ Windows sockets. MinGW has the header files winsock2.h and
+ ws2tcpip.h that declare the sys/socket.h definitions we need. Note
+ that you can influence which definitions you get by setting the
+ WINVER symbol before including these two files. For example,
+ getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that
+ symbol is set indiriectly through WINVER). You can set this by
+ adding AC_DEFINE(WINVER, 0x0501) to configure.ac. Note that your
+ code may not run on older Windows releases then. My Windows 2000
+ box was not able to run the code, for example. The situation is
+ slightly confusing because
+ <http://msdn.microsoft.com/en-us/library/ms738520>
+ suggests that getaddrinfo should be available on all Windows
+ releases. */
+
+# if @HAVE_WINSOCK2_H@
+# include <winsock2.h>
+# endif
+# if @HAVE_WS2TCPIP_H@
+# include <ws2tcpip.h>
+# endif
+
+/* For shutdown(). */
+# if !defined SHUT_RD && defined SD_RECEIVE
+# define SHUT_RD SD_RECEIVE
+# endif
+# if !defined SHUT_WR && defined SD_SEND
+# define SHUT_WR SD_SEND
+# endif
+# if !defined SHUT_RDWR && defined SD_BOTH
+# define SHUT_RDWR SD_BOTH
+# endif
+
+# if @HAVE_WINSOCK2_H@
+/* Include headers needed by the emulation code. */
+# include <sys/types.h>
+# include <io.h>
+
+# if !GNULIB_defined_socklen_t
+typedef int socklen_t;
+# define GNULIB_defined_socklen_t 1
+# endif
+
+# endif
+
+/* Rudimentary 'struct msghdr'; this works as long as you don't try to
+ access msg_control or msg_controllen. */
+struct msghdr {
+ void *msg_name;
+ socklen_t msg_namelen;
+ struct iovec *msg_iov;
+ int msg_iovlen;
+ int msg_flags;
+};
+
+#endif
+
+/* Fix some definitions from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+
+# if !GNULIB_defined_rpl_fd_isset
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using
+ network sockets. */
+static inline int
+rpl_fd_isset (SOCKET fd, fd_set * set)
+{
+ u_int i;
+ if (set == NULL)
+ return 0;
+
+ for (i = 0; i < set->fd_count; i++)
+ if (set->fd_array[i] == fd)
+ return 1;
+
+ return 0;
+}
+
+# define GNULIB_defined_rpl_fd_isset 1
+# endif
+
+# undef FD_ISSET
+# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+/* Wrap everything else to use libc file descriptors for sockets. */
+
+#if @GNULIB_SOCKET@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket rpl_socket
+# endif
+_GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol));
+_GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol));
+# else
+_GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol));
+# endif
+_GL_CXXALIASWARN (socket);
+#elif @HAVE_WINSOCK2_H@
+# undef socket
+# define socket socket_used_without_requesting_gnulib_module_socket
+#elif defined GNULIB_POSIXCHECK
+# undef socket
+# if HAVE_RAW_DECL_SOCKET
+_GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - "
+ "use gnulib module socket for portability");
+# endif
+#endif
+
+#if @GNULIB_CONNECT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef connect
+# define connect rpl_connect
+# endif
+_GL_FUNCDECL_RPL (connect, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (connect, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen));
+# else
+/* Need to cast, because on NonStop Kernel, the third parameter is
+ size_t addrlen. */
+_GL_CXXALIAS_SYS_CAST (connect, int,
+ (int fd,
+ const struct sockaddr *addr, socklen_t addrlen));
+# endif
+_GL_CXXALIASWARN (connect);
+#elif @HAVE_WINSOCK2_H@
+# undef connect
+# define connect socket_used_without_requesting_gnulib_module_connect
+#elif defined GNULIB_POSIXCHECK
+# undef connect
+# if HAVE_RAW_DECL_CONNECT
+_GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - "
+ "use gnulib module connect for portability");
+# endif
+#endif
+
+#if @GNULIB_ACCEPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef accept
+# define accept rpl_accept
+# endif
+_GL_FUNCDECL_RPL (accept, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+_GL_CXXALIAS_RPL (accept, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (accept, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# endif
+_GL_CXXALIASWARN (accept);
+#elif @HAVE_WINSOCK2_H@
+# undef accept
+# define accept accept_used_without_requesting_gnulib_module_accept
+#elif defined GNULIB_POSIXCHECK
+# undef accept
+# if HAVE_RAW_DECL_ACCEPT
+_GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - "
+ "use gnulib module accept for portability");
+# endif
+#endif
+
+#if @GNULIB_BIND@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef bind
+# define bind rpl_bind
+# endif
+_GL_FUNCDECL_RPL (bind, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (bind, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen));
+# else
+/* Need to cast, because on NonStop Kernel, the third parameter is
+ size_t addrlen. */
+_GL_CXXALIAS_SYS_CAST (bind, int,
+ (int fd,
+ const struct sockaddr *addr, socklen_t addrlen));
+# endif
+_GL_CXXALIASWARN (bind);
+#elif @HAVE_WINSOCK2_H@
+# undef bind
+# define bind bind_used_without_requesting_gnulib_module_bind
+#elif defined GNULIB_POSIXCHECK
+# undef bind
+# if HAVE_RAW_DECL_BIND
+_GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - "
+ "use gnulib module bind for portability");
+# endif
+#endif
+
+#if @GNULIB_GETPEERNAME@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpeername
+# define getpeername rpl_getpeername
+# endif
+_GL_FUNCDECL_RPL (getpeername, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (getpeername, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (getpeername, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# endif
+_GL_CXXALIASWARN (getpeername);
+#elif @HAVE_WINSOCK2_H@
+# undef getpeername
+# define getpeername getpeername_used_without_requesting_gnulib_module_getpeername
+#elif defined GNULIB_POSIXCHECK
+# undef getpeername
+# if HAVE_RAW_DECL_GETPEERNAME
+_GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - "
+ "use gnulib module getpeername for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSOCKNAME@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getsockname
+# define getsockname rpl_getsockname
+# endif
+_GL_FUNCDECL_RPL (getsockname, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (getsockname, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (getsockname, int,
+ (int fd, struct sockaddr *addr, socklen_t *addrlen));
+# endif
+_GL_CXXALIASWARN (getsockname);
+#elif @HAVE_WINSOCK2_H@
+# undef getsockname
+# define getsockname getsockname_used_without_requesting_gnulib_module_getsockname
+#elif defined GNULIB_POSIXCHECK
+# undef getsockname
+# if HAVE_RAW_DECL_GETSOCKNAME
+_GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - "
+ "use gnulib module getsockname for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getsockopt
+# define getsockopt rpl_getsockopt
+# endif
+_GL_FUNCDECL_RPL (getsockopt, int, (int fd, int level, int optname,
+ void *optval, socklen_t *optlen)
+ _GL_ARG_NONNULL ((4, 5)));
+_GL_CXXALIAS_RPL (getsockopt, int, (int fd, int level, int optname,
+ void *optval, socklen_t *optlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the fifth parameter is
+ void *optlen. */
+_GL_CXXALIAS_SYS_CAST (getsockopt, int, (int fd, int level, int optname,
+ void *optval, socklen_t *optlen));
+# endif
+_GL_CXXALIASWARN (getsockopt);
+#elif @HAVE_WINSOCK2_H@
+# undef getsockopt
+# define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt
+#elif defined GNULIB_POSIXCHECK
+# undef getsockopt
+# if HAVE_RAW_DECL_GETSOCKOPT
+_GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - "
+ "use gnulib module getsockopt for portability");
+# endif
+#endif
+
+#if @GNULIB_LISTEN@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef listen
+# define listen rpl_listen
+# endif
+_GL_FUNCDECL_RPL (listen, int, (int fd, int backlog));
+_GL_CXXALIAS_RPL (listen, int, (int fd, int backlog));
+# else
+_GL_CXXALIAS_SYS (listen, int, (int fd, int backlog));
+# endif
+_GL_CXXALIASWARN (listen);
+#elif @HAVE_WINSOCK2_H@
+# undef listen
+# define listen listen_used_without_requesting_gnulib_module_listen
+#elif defined GNULIB_POSIXCHECK
+# undef listen
+# if HAVE_RAW_DECL_LISTEN
+_GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - "
+ "use gnulib module listen for portability");
+# endif
+#endif
+
+#if @GNULIB_RECV@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef recv
+# define recv rpl_recv
+# endif
+_GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
+# else
+_GL_CXXALIAS_SYS (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
+# endif
+_GL_CXXALIASWARN (recv);
+#elif @HAVE_WINSOCK2_H@
+# undef recv
+# define recv recv_used_without_requesting_gnulib_module_recv
+#elif defined GNULIB_POSIXCHECK
+# undef recv
+# if HAVE_RAW_DECL_RECV
+_GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - "
+ "use gnulib module recv for portability");
+# endif
+#endif
+
+#if @GNULIB_SEND@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef send
+# define send rpl_send
+# endif
+_GL_FUNCDECL_RPL (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags));
+# else
+_GL_CXXALIAS_SYS (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags));
+# endif
+_GL_CXXALIASWARN (send);
+#elif @HAVE_WINSOCK2_H@
+# undef send
+# define send send_used_without_requesting_gnulib_module_send
+#elif defined GNULIB_POSIXCHECK
+# undef send
+# if HAVE_RAW_DECL_SEND
+_GL_WARN_ON_USE (send, "send is not always POSIX compliant - "
+ "use gnulib module send for portability");
+# endif
+#endif
+
+#if @GNULIB_RECVFROM@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef recvfrom
+# define recvfrom rpl_recvfrom
+# endif
+_GL_FUNCDECL_RPL (recvfrom, ssize_t,
+ (int fd, void *buf, size_t len, int flags,
+ struct sockaddr *from, socklen_t *fromlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (recvfrom, ssize_t,
+ (int fd, void *buf, size_t len, int flags,
+ struct sockaddr *from, socklen_t *fromlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the sixth parameter is
+ void *fromlen. */
+_GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t,
+ (int fd, void *buf, size_t len, int flags,
+ struct sockaddr *from, socklen_t *fromlen));
+# endif
+_GL_CXXALIASWARN (recvfrom);
+#elif @HAVE_WINSOCK2_H@
+# undef recvfrom
+# define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom
+#elif defined GNULIB_POSIXCHECK
+# undef recvfrom
+# if HAVE_RAW_DECL_RECVFROM
+_GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - "
+ "use gnulib module recvfrom for portability");
+# endif
+#endif
+
+#if @GNULIB_SENDTO@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sendto
+# define sendto rpl_sendto
+# endif
+_GL_FUNCDECL_RPL (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen));
+# else
+/* Need to cast, because on NonStop Kernel, the sixth parameter is
+ size_t tolen. */
+_GL_CXXALIAS_SYS_CAST (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen));
+# endif
+_GL_CXXALIASWARN (sendto);
+#elif @HAVE_WINSOCK2_H@
+# undef sendto
+# define sendto sendto_used_without_requesting_gnulib_module_sendto
+#elif defined GNULIB_POSIXCHECK
+# undef sendto
+# if HAVE_RAW_DECL_SENDTO
+_GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - "
+ "use gnulib module sendto for portability");
+# endif
+#endif
+
+#if @GNULIB_SETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setsockopt
+# define setsockopt rpl_setsockopt
+# endif
+_GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname,
+ const void * optval, socklen_t optlen)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname,
+ const void * optval, socklen_t optlen));
+# else
+/* Need to cast, because on NonStop Kernel, the fifth parameter is
+ size_t optlen. */
+_GL_CXXALIAS_SYS_CAST (setsockopt, int,
+ (int fd, int level, int optname,
+ const void * optval, socklen_t optlen));
+# endif
+_GL_CXXALIASWARN (setsockopt);
+#elif @HAVE_WINSOCK2_H@
+# undef setsockopt
+# define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt
+#elif defined GNULIB_POSIXCHECK
+# undef setsockopt
+# if HAVE_RAW_DECL_SETSOCKOPT
+_GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - "
+ "use gnulib module setsockopt for portability");
+# endif
+#endif
+
+#if @GNULIB_SHUTDOWN@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef shutdown
+# define shutdown rpl_shutdown
+# endif
+_GL_FUNCDECL_RPL (shutdown, int, (int fd, int how));
+_GL_CXXALIAS_RPL (shutdown, int, (int fd, int how));
+# else
+_GL_CXXALIAS_SYS (shutdown, int, (int fd, int how));
+# endif
+_GL_CXXALIASWARN (shutdown);
+#elif @HAVE_WINSOCK2_H@
+# undef shutdown
+# define shutdown shutdown_used_without_requesting_gnulib_module_shutdown
+#elif defined GNULIB_POSIXCHECK
+# undef shutdown
+# if HAVE_RAW_DECL_SHUTDOWN
+_GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - "
+ "use gnulib module shutdown for portability");
+# endif
+#endif
+
+#if @GNULIB_ACCEPT4@
+/* Accept a connection on a socket, with specific opening flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ See also the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/accept4.2.html>. */
+# if @HAVE_ACCEPT4@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define accept4 rpl_accept4
+# endif
+_GL_FUNCDECL_RPL (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+_GL_CXXALIAS_RPL (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+# else
+_GL_FUNCDECL_SYS (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+_GL_CXXALIAS_SYS (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+# endif
+_GL_CXXALIASWARN (accept4);
+#elif defined GNULIB_POSIXCHECK
+# undef accept4
+# if HAVE_RAW_DECL_ACCEPT4
+_GL_WARN_ON_USE (accept4, "accept4 is unportable - "
+ "use gnulib module accept4 for portability");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
+#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
+#endif
diff --git a/gnulib/lib/sys_stat.in.h b/gnulib/lib/sys_stat.in.h
new file mode 100644
index 0000000..9f7bf76
--- /dev/null
+++ b/gnulib/lib/sys_stat.in.h
@@ -0,0 +1,674 @@
+/* Provide a more complete sys/stat header file.
+ Copyright (C) 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake, Paul Eggert, and Jim Meyering. */
+
+/* This file is supposed to be used on platforms where <sys/stat.h> is
+ incomplete. It is intended to provide definitions and prototypes
+ needed by an application. Start with what the system provides. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_sys_stat_h
+/* Special invocation convention. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_STAT_H
+
+/* Get nlink_t. */
+#include <sys/types.h>
+
+/* Get struct timespec. */
+#include <time.h>
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#ifndef _@GUARD_PREFIX@_SYS_STAT_H
+#define _@GUARD_PREFIX@_SYS_STAT_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Before doing "#define mkdir rpl_mkdir" below, we need to include all
+ headers that may declare mkdir(). Native Windows platforms declare mkdir
+ in <io.h> and/or <direct.h>, not in <unistd.h>. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# include <io.h> /* mingw32, mingw64 */
+# include <direct.h> /* mingw64, MSVC 9 */
+#endif
+
+#ifndef S_IFIFO
+# ifdef _S_IFIFO
+# define S_IFIFO _S_IFIFO
+# endif
+#endif
+
+#ifndef S_IFMT
+# define S_IFMT 0170000
+#endif
+
+#if STAT_MACROS_BROKEN
+# undef S_ISBLK
+# undef S_ISCHR
+# undef S_ISDIR
+# undef S_ISFIFO
+# undef S_ISLNK
+# undef S_ISNAM
+# undef S_ISMPB
+# undef S_ISMPC
+# undef S_ISNWK
+# undef S_ISREG
+# undef S_ISSOCK
+#endif
+
+#ifndef S_ISBLK
+# ifdef S_IFBLK
+# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
+# else
+# define S_ISBLK(m) 0
+# endif
+#endif
+
+#ifndef S_ISCHR
+# ifdef S_IFCHR
+# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+# else
+# define S_ISCHR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDIR
+# ifdef S_IFDIR
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# else
+# define S_ISDIR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDOOR /* Solaris 2.5 and up */
+# define S_ISDOOR(m) 0
+#endif
+
+#ifndef S_ISFIFO
+# ifdef S_IFIFO
+# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+# else
+# define S_ISFIFO(m) 0
+# endif
+#endif
+
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(m) 0
+# endif
+#endif
+
+#ifndef S_ISMPB /* V7 */
+# ifdef S_IFMPB
+# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
+# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
+# else
+# define S_ISMPB(m) 0
+# define S_ISMPC(m) 0
+# endif
+#endif
+
+#ifndef S_ISNAM /* Xenix */
+# ifdef S_IFNAM
+# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
+# else
+# define S_ISNAM(m) 0
+# endif
+#endif
+
+#ifndef S_ISNWK /* HP/UX */
+# ifdef S_IFNWK
+# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
+# else
+# define S_ISNWK(m) 0
+# endif
+#endif
+
+#ifndef S_ISPORT /* Solaris 10 and up */
+# define S_ISPORT(m) 0
+#endif
+
+#ifndef S_ISREG
+# ifdef S_IFREG
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+# else
+# define S_ISREG(m) 0
+# endif
+#endif
+
+#ifndef S_ISSOCK
+# ifdef S_IFSOCK
+# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+# else
+# define S_ISSOCK(m) 0
+# endif
+#endif
+
+
+#ifndef S_TYPEISMQ
+# define S_TYPEISMQ(p) 0
+#endif
+
+#ifndef S_TYPEISTMO
+# define S_TYPEISTMO(p) 0
+#endif
+
+
+#ifndef S_TYPEISSEM
+# ifdef S_INSEM
+# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
+# else
+# define S_TYPEISSEM(p) 0
+# endif
+#endif
+
+#ifndef S_TYPEISSHM
+# ifdef S_INSHD
+# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
+# else
+# define S_TYPEISSHM(p) 0
+# endif
+#endif
+
+/* high performance ("contiguous data") */
+#ifndef S_ISCTG
+# define S_ISCTG(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with data */
+#ifndef S_ISOFD
+# define S_ISOFD(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with no data */
+#ifndef S_ISOFL
+# define S_ISOFL(p) 0
+#endif
+
+/* 4.4BSD whiteout */
+#ifndef S_ISWHT
+# define S_ISWHT(m) 0
+#endif
+
+/* If any of the following are undefined,
+ define them to their de facto standard values. */
+#if !S_ISUID
+# define S_ISUID 04000
+#endif
+#if !S_ISGID
+# define S_ISGID 02000
+#endif
+
+/* S_ISVTX is a common extension to POSIX. */
+#ifndef S_ISVTX
+# define S_ISVTX 01000
+#endif
+
+#if !S_IRUSR && S_IREAD
+# define S_IRUSR S_IREAD
+#endif
+#if !S_IRUSR
+# define S_IRUSR 00400
+#endif
+#if !S_IRGRP
+# define S_IRGRP (S_IRUSR >> 3)
+#endif
+#if !S_IROTH
+# define S_IROTH (S_IRUSR >> 6)
+#endif
+
+#if !S_IWUSR && S_IWRITE
+# define S_IWUSR S_IWRITE
+#endif
+#if !S_IWUSR
+# define S_IWUSR 00200
+#endif
+#if !S_IWGRP
+# define S_IWGRP (S_IWUSR >> 3)
+#endif
+#if !S_IWOTH
+# define S_IWOTH (S_IWUSR >> 6)
+#endif
+
+#if !S_IXUSR && S_IEXEC
+# define S_IXUSR S_IEXEC
+#endif
+#if !S_IXUSR
+# define S_IXUSR 00100
+#endif
+#if !S_IXGRP
+# define S_IXGRP (S_IXUSR >> 3)
+#endif
+#if !S_IXOTH
+# define S_IXOTH (S_IXUSR >> 6)
+#endif
+
+#if !S_IRWXU
+# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
+#endif
+#if !S_IRWXG
+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+#endif
+#if !S_IRWXO
+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+#endif
+
+/* S_IXUGO is a common extension to POSIX. */
+#if !S_IXUGO
+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+#endif
+
+#ifndef S_IRWXUGO
+# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
+#endif
+
+/* Macros for futimens and utimensat. */
+#ifndef UTIME_NOW
+# define UTIME_NOW (-1)
+# define UTIME_OMIT (-2)
+#endif
+
+
+#if @GNULIB_FCHMODAT@
+# if !@HAVE_FCHMODAT@
+_GL_FUNCDECL_SYS (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag));
+_GL_CXXALIASWARN (fchmodat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchmodat
+# if HAVE_RAW_DECL_FCHMODAT
+_GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSTAT@
+# if @REPLACE_FSTAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fstat
+# define fstat rpl_fstat
+# endif
+_GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf));
+# else
+_GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf));
+# endif
+_GL_CXXALIASWARN (fstat);
+#elif defined GNULIB_POSIXCHECK
+# undef fstat
+# if HAVE_RAW_DECL_FSTAT
+_GL_WARN_ON_USE (fstat, "fstat has portability problems - "
+ "use gnulib module fstat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSTATAT@
+# if @REPLACE_FSTATAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fstatat
+# define fstatat rpl_fstatat
+# endif
+_GL_FUNCDECL_RPL (fstatat, int,
+ (int fd, char const *name, struct stat *st, int flags)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (fstatat, int,
+ (int fd, char const *name, struct stat *st, int flags));
+# else
+# if !@HAVE_FSTATAT@
+_GL_FUNCDECL_SYS (fstatat, int,
+ (int fd, char const *name, struct stat *st, int flags)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (fstatat, int,
+ (int fd, char const *name, struct stat *st, int flags));
+# endif
+_GL_CXXALIASWARN (fstatat);
+#elif defined GNULIB_POSIXCHECK
+# undef fstatat
+# if HAVE_RAW_DECL_FSTATAT
+_GL_WARN_ON_USE (fstatat, "fstatat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FUTIMENS@
+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens
+ implementation relies on futimesat, which on Solaris 10 makes an invocation
+ to futimens that is meant to invoke the libc's futimens(), not gnulib's
+ futimens(). */
+# if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef futimens
+# define futimens rpl_futimens
+# endif
+_GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2]));
+_GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2]));
+# else
+# if !@HAVE_FUTIMENS@
+_GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2]));
+# endif
+_GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2]));
+# endif
+# if @HAVE_FUTIMENS@
+_GL_CXXALIASWARN (futimens);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef futimens
+# if HAVE_RAW_DECL_FUTIMENS
+_GL_WARN_ON_USE (futimens, "futimens is not portable - "
+ "use gnulib module futimens for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHMOD@
+/* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME
+ denotes a symbolic link. */
+# if !@HAVE_LCHMOD@
+/* The lchmod replacement follows symbolic links. Callers should take
+ this into account; lchmod should be applied only to arguments that
+ are known to not be symbolic links. On hosts that lack lchmod,
+ this can lead to race conditions between the check and the
+ invocation of lchmod, but we know of no workarounds that are
+ reliable in general. You might try requesting support for lchmod
+ from your operating system supplier. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lchmod chmod
+# endif
+/* Need to cast, because on mingw, the second parameter of chmod is
+ int mode. */
+_GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int,
+ (const char *filename, mode_t mode));
+# else
+# if 0 /* assume already declared */
+_GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode));
+# endif
+# if @HAVE_LCHMOD@
+_GL_CXXALIASWARN (lchmod);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lchmod
+# if HAVE_RAW_DECL_LCHMOD
+_GL_WARN_ON_USE (lchmod, "lchmod is unportable - "
+ "use gnulib module lchmod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSTAT@
+# if ! @HAVE_LSTAT@
+/* mingw does not support symlinks, therefore it does not have lstat. But
+ without links, stat does just fine. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lstat stat
+# endif
+_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf));
+# elif @REPLACE_LSTAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lstat
+# define lstat rpl_lstat
+# endif
+_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf));
+# else
+_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf));
+# endif
+# if @HAVE_LSTAT@
+_GL_CXXALIASWARN (lstat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef lstat
+# if HAVE_RAW_DECL_LSTAT
+_GL_WARN_ON_USE (lstat, "lstat is unportable - "
+ "use gnulib module lstat for portability");
+# endif
+#endif
+
+
+#if @REPLACE_MKDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkdir
+# define mkdir rpl_mkdir
+# endif
+_GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+#else
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
+ which are included above. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# if !GNULIB_defined_rpl_mkdir
+static inline int
+rpl_mkdir (char const *name, mode_t mode)
+{
+ return _mkdir (name);
+}
+# define GNULIB_defined_rpl_mkdir 1
+# endif
+
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mkdir rpl_mkdir
+# endif
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
+# endif
+#endif
+_GL_CXXALIASWARN (mkdir);
+
+
+#if @GNULIB_MKDIRAT@
+# if !@HAVE_MKDIRAT@
+_GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode));
+_GL_CXXALIASWARN (mkdirat);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdirat
+# if HAVE_RAW_DECL_MKDIRAT
+_GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFO@
+# if @REPLACE_MKFIFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkfifo
+# define mkfifo rpl_mkfifo
+# endif
+_GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode));
+# else
+# if !@HAVE_MKFIFO@
+_GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode));
+# endif
+_GL_CXXALIASWARN (mkfifo);
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifo
+# if HAVE_RAW_DECL_MKFIFO
+_GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - "
+ "use gnulib module mkfifo for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFOAT@
+# if !@HAVE_MKFIFOAT@
+_GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode));
+_GL_CXXALIASWARN (mkfifoat);
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifoat
+# if HAVE_RAW_DECL_MKFIFOAT
+_GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNOD@
+# if @REPLACE_MKNOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mknod
+# define mknod rpl_mknod
+# endif
+_GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev));
+# else
+# if !@HAVE_MKNOD@
+_GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */
+_GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev));
+# endif
+_GL_CXXALIASWARN (mknod);
+#elif defined GNULIB_POSIXCHECK
+# undef mknod
+# if HAVE_RAW_DECL_MKNOD
+_GL_WARN_ON_USE (mknod, "mknod is not portable - "
+ "use gnulib module mknod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNODAT@
+# if !@HAVE_MKNODAT@
+_GL_FUNCDECL_SYS (mknodat, int,
+ (int fd, char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mknodat, int,
+ (int fd, char const *file, mode_t mode, dev_t dev));
+_GL_CXXALIASWARN (mknodat);
+#elif defined GNULIB_POSIXCHECK
+# undef mknodat
+# if HAVE_RAW_DECL_MKNODAT
+_GL_WARN_ON_USE (mknodat, "mknodat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_STAT@
+# if @REPLACE_STAT@
+/* We can't use the object-like #define stat rpl_stat, because of
+ struct stat. This means that rpl_stat will not be used if the user
+ does (stat)(a,b). Oh well. */
+# undef stat
+# ifdef _LARGE_FILES
+ /* With _LARGE_FILES defined, AIX (only) defines stat to stat64,
+ so we have to replace stat64() instead of stat(). */
+# define stat stat64
+# undef stat64
+# define stat64(name, st) rpl_stat (name, st)
+# else /* !_LARGE_FILES */
+# define stat(name, st) rpl_stat (name, st)
+# endif /* !_LARGE_FILES */
+_GL_EXTERN_C int stat (const char *name, struct stat *buf)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef stat
+# if HAVE_RAW_DECL_STAT
+_GL_WARN_ON_USE (stat, "stat is unportable - "
+ "use gnulib module stat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UTIMENSAT@
+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat
+ implementation relies on futimesat, which on Solaris 10 makes an invocation
+ to utimensat that is meant to invoke the libc's utimensat(), not gnulib's
+ utimensat(). */
+# if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef utimensat
+# define utimensat rpl_utimensat
+# endif
+_GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag));
+# else
+# if !@HAVE_UTIMENSAT@
+_GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag));
+# endif
+# if @HAVE_UTIMENSAT@
+_GL_CXXALIASWARN (utimensat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef utimensat
+# if HAVE_RAW_DECL_UTIMENSAT
+_GL_WARN_ON_USE (utimensat, "utimensat is not portable - "
+ "use gnulib module utimensat for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
+#endif
diff --git a/gnulib/lib/sys_time.in.h b/gnulib/lib/sys_time.in.h
new file mode 100644
index 0000000..1fed8c4
--- /dev/null
+++ b/gnulib/lib/sys_time.in.h
@@ -0,0 +1,200 @@
+/* Provide a more complete sys/time.h.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _@GUARD_PREFIX@_SYS_TIME_H
+
+/* Simply delegate to the system's header, without adding anything. */
+# if @HAVE_SYS_TIME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+# endif
+
+#else
+
+# define _@GUARD_PREFIX@_SYS_TIME_H
+
+# if @HAVE_SYS_TIME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+# else
+# include <time.h>
+# endif
+
+/* On native Windows with MSVC:
+ Get the 'struct timeval' type. */
+# if defined _MSC_VER && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+# endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if ! @HAVE_STRUCT_TIMEVAL@
+
+# if !GNULIB_defined_struct_timeval
+struct timeval
+{
+ time_t tv_sec;
+ long int tv_usec;
+};
+# define GNULIB_defined_struct_timeval 1
+# endif
+
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# if @GNULIB_GETTIMEOFDAY@
+# if @REPLACE_GETTIMEOFDAY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gettimeofday
+# define gettimeofday rpl_gettimeofday
+# endif
+_GL_FUNCDECL_RPL (gettimeofday, int,
+ (struct timeval *restrict, void *restrict)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gettimeofday, int,
+ (struct timeval *restrict, void *restrict));
+# else
+# if !@HAVE_GETTIMEOFDAY@
+_GL_FUNCDECL_SYS (gettimeofday, int,
+ (struct timeval *restrict, void *restrict)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on glibc systems, by default, the second argument is
+ struct timezone *. */
+_GL_CXXALIAS_SYS_CAST (gettimeofday, int,
+ (struct timeval *restrict, void *restrict));
+# endif
+_GL_CXXALIASWARN (gettimeofday);
+# elif defined GNULIB_POSIXCHECK
+# undef gettimeofday
+# if HAVE_RAW_DECL_GETTIMEOFDAY
+_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - "
+ "use gnulib module gettimeofday for portability");
+# endif
+# endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+# if defined _MSC_VER && @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+# endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
diff --git a/gnulib/lib/sys_times.in.h b/gnulib/lib/sys_times.in.h
new file mode 100644
index 0000000..413a373
--- /dev/null
+++ b/gnulib/lib/sys_times.in.h
@@ -0,0 +1,81 @@
+/* Provide a sys/times.h header file.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+/* This file is supposed to be used on platforms where <sys/times.h>
+ is missing. */
+
+#ifndef _@GUARD_PREFIX@_SYS_TIMES_H
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+# if @HAVE_SYS_TIMES_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIMES_H@
+# endif
+
+# define _@GUARD_PREFIX@_SYS_TIMES_H
+
+/* Get clock_t.
+ But avoid namespace pollution on glibc systems. */
+# ifndef __GLIBC__
+# include <time.h>
+# endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !@HAVE_STRUCT_TMS@
+# if !GNULIB_defined_struct_tms
+ /* Structure describing CPU time used by a process and its children. */
+ struct tms
+ {
+ clock_t tms_utime; /* User CPU time. */
+ clock_t tms_stime; /* System CPU time. */
+
+ clock_t tms_cutime; /* User CPU time of dead children. */
+ clock_t tms_cstime; /* System CPU time of dead children. */
+ };
+# define GNULIB_defined_struct_tms 1
+# endif
+# endif
+
+# if @GNULIB_TIMES@
+# if !@HAVE_TIMES@
+ extern clock_t times (struct tms *buffer) _GL_ARG_NONNULL ((1));
+# endif
+# elif defined GNULIB_POSIXCHECK
+# undef times
+# if HAVE_RAW_DECL_TIMES
+_GL_WARN_ON_USE (times, "times is unportable - "
+ "use gnulib module times for portability");
+# endif
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TIMES_H */
diff --git a/gnulib/lib/sys_types.in.h b/gnulib/lib/sys_types.in.h
new file mode 100644
index 0000000..a1d5fda
--- /dev/null
+++ b/gnulib/lib/sys_types.in.h
@@ -0,0 +1,40 @@
+/* Provide a more complete sys/types.h.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+#define _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) \
+ && ! defined __GLIBC__
+# include <stddef.h>
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
diff --git a/gnulib/lib/sys_uio.in.h b/gnulib/lib/sys_uio.in.h
new file mode 100644
index 0000000..04cf13d
--- /dev/null
+++ b/gnulib/lib/sys_uio.in.h
@@ -0,0 +1,64 @@
+/* Substitute for <sys/uio.h>.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_SYS_UIO_H
+
+#if @HAVE_SYS_UIO_H@
+
+/* On OpenBSD 4.4, <sys/uio.h> assumes prior inclusion of <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_UIO_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_UIO_H
+#define _@GUARD_PREFIX@_SYS_UIO_H
+
+#if !@HAVE_SYS_UIO_H@
+/* A platform that lacks <sys/uio.h>. */
+/* Get 'size_t' and 'ssize_t'. */
+# include <sys/types.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_iovec
+/* All known platforms that lack <sys/uio.h> also lack any declaration
+ of struct iovec in any other header. */
+struct iovec {
+ void *iov_base;
+ size_t iov_len;
+};
+# define GNULIB_defined_struct_iovec 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_UIO_H */
+#endif /* _@GUARD_PREFIX@_SYS_UIO_H */
diff --git a/gnulib/lib/sys_utsname.in.h b/gnulib/lib/sys_utsname.in.h
new file mode 100644
index 0000000..0249e57
--- /dev/null
+++ b/gnulib/lib/sys_utsname.in.h
@@ -0,0 +1,109 @@
+/* Substitute for <sys/utsname.h>.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_SYS_UTSNAME_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_SYS_UTSNAME_H@
+
+/* Minix 3.1.8 has a bug: <stddef.h> must be included before <sys/utsname.h>.
+ But avoid namespace pollution on glibc systems. */
+# if defined __minix && !defined __GLIBC__
+# include <stddef.h>
+# endif
+
+# @INCLUDE_NEXT@ @NEXT_SYS_UTSNAME_H@
+
+#endif
+
+#define _@GUARD_PREFIX@_SYS_UTSNAME_H
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !@HAVE_STRUCT_UTSNAME@
+/* Length of the entries in 'struct utsname' is 256. */
+# define _UTSNAME_LENGTH 256
+
+# ifndef _UTSNAME_NODENAME_LENGTH
+# define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_SYSNAME_LENGTH
+# define _UTSNAME_SYSNAME_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_RELEASE_LENGTH
+# define _UTSNAME_RELEASE_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_VERSION_LENGTH
+# define _UTSNAME_VERSION_LENGTH _UTSNAME_LENGTH
+# endif
+# ifndef _UTSNAME_MACHINE_LENGTH
+# define _UTSNAME_MACHINE_LENGTH _UTSNAME_LENGTH
+# endif
+
+# if !GNULIB_defined_struct_utsname
+/* Structure describing the system and machine. */
+struct utsname
+ {
+ /* Name of this node on the network. */
+ char nodename[_UTSNAME_NODENAME_LENGTH];
+
+ /* Name of the implementation of the operating system. */
+ char sysname[_UTSNAME_SYSNAME_LENGTH];
+ /* Current release level of this implementation. */
+ char release[_UTSNAME_RELEASE_LENGTH];
+ /* Current version level of this release. */
+ char version[_UTSNAME_VERSION_LENGTH];
+
+ /* Name of the hardware type the system is running on. */
+ char machine[_UTSNAME_MACHINE_LENGTH];
+ };
+# define GNULIB_defined_struct_utsname 1
+# endif
+
+#endif /* !@HAVE_STRUCT_UTSNAME@ */
+
+
+#if @GNULIB_UNAME@
+# if !@HAVE_UNAME@
+extern int uname (struct utsname *buf) _GL_ARG_NONNULL ((1));
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef uname
+# if HAVE_RAW_DECL_UNAME
+_GL_WARN_ON_USE (uname, "uname is unportable - "
+ "use gnulib module uname for portability");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_UTSNAME_H */
diff --git a/gnulib/lib/sys_wait.in.h b/gnulib/lib/sys_wait.in.h
new file mode 100644
index 0000000..e31be9c
--- /dev/null
+++ b/gnulib/lib/sys_wait.in.h
@@ -0,0 +1,130 @@
+/* A POSIX-like <sys/wait.h>.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+
+#ifndef _@GUARD_PREFIX@_SYS_WAIT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+# @INCLUDE_NEXT@ @NEXT_SYS_WAIT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_WAIT_H
+#define _@GUARD_PREFIX@_SYS_WAIT_H
+
+/* Get pid_t. */
+#include <sys/types.h>
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
+/* Unix API. */
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid().
+ On nearly all systems, including Linux/x86, WEXITSTATUS are bits 15..8 and
+ WTERMSIG are bits 7..0, while BeOS uses the opposite. Therefore programs
+ have to use the abstract macros. */
+
+/* For valid x, exactly one of WIFSIGNALED(x), WIFEXITED(x), WIFSTOPPED(x)
+ is true. */
+# ifndef WIFSIGNALED
+# define WIFSIGNALED(x) (WTERMSIG (x) != 0 && WTERMSIG(x) != 0x7f)
+# endif
+# ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+# endif
+# ifndef WIFSTOPPED
+# define WIFSTOPPED(x) (WTERMSIG (x) == 0x7f)
+# endif
+
+/* The termination signal. Only to be accessed if WIFSIGNALED(x) is true. */
+# ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+# endif
+
+/* The exit status. Only to be accessed if WIFEXITED(x) is true. */
+# ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+# endif
+
+/* The stopping signal. Only to be accessed if WIFSTOPPED(x) is true. */
+# ifndef WSTOPSIG
+# define WSTOPSIG(x) (((x) >> 8) & 0x7f)
+# endif
+
+/* True if the process dumped core. Not standardized by POSIX. */
+# ifndef WCOREDUMP
+# define WCOREDUMP(x) ((x) & 0x80)
+# endif
+
+#else
+/* Native Windows API. */
+
+# include <signal.h> /* for SIGTERM */
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid() or, equivalently, _cwait() or GetExitCodeProcess().
+ This value is simply an 'int', not composed of bit fields. */
+
+/* When an unhandled fatal signal terminates a process, the exit code is 3. */
+# define WIFSIGNALED(x) ((x) == 3)
+# define WIFEXITED(x) ((x) != 3)
+# define WIFSTOPPED(x) 0
+
+/* The signal that terminated a process is not known posthum. */
+# define WTERMSIG(x) SIGTERM
+
+# define WEXITSTATUS(x) (x)
+
+/* There are no stopping signals. */
+# define WSTOPSIG(x) 0
+
+/* There are no core dumps. */
+# define WCOREDUMP(x) 0
+
+#endif
+
+
+/* Declarations of functions. */
+
+#if @GNULIB_WAITPID@
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+_GL_FUNCDECL_SYS (waitpid, pid_t, (pid_t pid, int *statusp, int options));
+# endif
+_GL_CXXALIAS_SYS (waitpid, pid_t, (pid_t pid, int *statusp, int options));
+_GL_CXXALIASWARN (waitpid);
+#elif defined GNULIB_POSIXCHECK
+# undef waitpid
+# if HAVE_RAW_DECL_WAITPID
+_GL_WARN_ON_USE (waitpid, "waitpid is unportable - "
+ "use gnulib module sys_wait for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */
+#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */
diff --git a/gnulib/lib/sysexits.in.h b/gnulib/lib/sysexits.in.h
new file mode 100644
index 0000000..f925b69
--- /dev/null
+++ b/gnulib/lib/sysexits.in.h
@@ -0,0 +1,72 @@
+/* exit() exit codes for some BSD system programs.
+ Copyright (C) 2003, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Simon Josefsson based on sysexits(3) man page */
+
+#ifndef _@GUARD_PREFIX@_SYSEXITS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_SYSEXITS_H@
+
+/* IRIX 6.5 has an <unistd.h> that defines a macro EX_OK with a nonzero
+ value. Override it. See
+ <http://lists.gnu.org/archive/html/bug-gnulib/2007-03/msg00361.html> */
+# ifdef __sgi
+# include <unistd.h>
+# undef EX_OK
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYSEXITS_H@
+
+/* HP-UX 11 <sysexits.h> ends at EX_NOPERM. */
+# ifndef EX_CONFIG
+# define EX_CONFIG 78
+# endif
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYSEXITS_H
+#define _@GUARD_PREFIX@_SYSEXITS_H
+
+#if !@HAVE_SYSEXITS_H@
+
+# define EX_OK 0 /* same value as EXIT_SUCCESS */
+
+# define EX_USAGE 64
+# define EX_DATAERR 65
+# define EX_NOINPUT 66
+# define EX_NOUSER 67
+# define EX_NOHOST 68
+# define EX_UNAVAILABLE 69
+# define EX_SOFTWARE 70
+# define EX_OSERR 71
+# define EX_OSFILE 72
+# define EX_CANTCREAT 73
+# define EX_IOERR 74
+# define EX_TEMPFAIL 75
+# define EX_PROTOCOL 76
+# define EX_NOPERM 77
+# define EX_CONFIG 78
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYSEXITS_H */
+#endif /* _@GUARD_PREFIX@_SYSEXITS_H */
diff --git a/gnulib/lib/t-idcache b/gnulib/lib/t-idcache
new file mode 100755
index 0000000..e4d71af
--- /dev/null
+++ b/gnulib/lib/t-idcache
@@ -0,0 +1,52 @@
+#!/bin/sh
+# Compare the two halves (user and group) of idcache.c.
+# Once xformed, they'd better be the same:
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+srcdir=../..
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+# Extract user-oriented functions.
+perl -ne \
+ 'print if /^static struct.*user_alist/ .. /^static struct.*group_alist/' \
+ $srcdir/idcache.c | head -n -3 > u
+# Extract group-oriented functions.
+perl -ne 'print if /^static struct.*group_alist/ .. eof' $srcdir/idcache.c > g
+
+# Convert user-specific strings of "u" into corresponding group-specific strings
+subst='
+s/user_/group_/g;
+s/\buser\b/group/g;
+s/USER/GROUP/g;
+s/\bu\b/g/g;
+s/passwd/group/g;
+s/pw_uid/gr_gid/g;
+s/pwnam/grnam/g;
+s/pwent/grent/g;
+s/getpw/getgr/g;
+s/pw_/gr_/g;
+s/UID/GID/g;
+s/uid/gid/g;
+s/getuser/getgroup/;
+s/login name/group name/;
+s/to be the/to belong to/;
+s/pwd fun/grp fun/;
+'
+
+fail=0
+# Ensure that the transformed "u" is the same as g.
+# Any differences here constitute an error.
+perl -pe "$subst" u | diff -u - g || fail=1
+
+exit $fail
diff --git a/gnulib/lib/tanf.c b/gnulib/lib/tanf.c
new file mode 100644
index 0000000..39e1e10
--- /dev/null
+++ b/gnulib/lib/tanf.c
@@ -0,0 +1,26 @@
+/* Tangent function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+tanf (float x)
+{
+ return (float) tan ((double) x);
+}
diff --git a/gnulib/lib/tanhf.c b/gnulib/lib/tanhf.c
new file mode 100644
index 0000000..b7591a0
--- /dev/null
+++ b/gnulib/lib/tanhf.c
@@ -0,0 +1,26 @@
+/* Hyperbolic tangent function.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+float
+tanhf (float x)
+{
+ return (float) tanh ((double) x);
+}
diff --git a/gnulib/lib/tanl.c b/gnulib/lib/tanl.c
new file mode 100644
index 0000000..e5efb06
--- /dev/null
+++ b/gnulib/lib/tanl.c
@@ -0,0 +1,235 @@
+/* s_tanl.c -- long double version of s_tan.c.
+ * Conversion to IEEE quad long double by Jakub Jelinek, jj@ultra.linux.cz.
+ */
+
+/* @(#)s_tan.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <math.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+long double
+tanl (long double x)
+{
+ return tan (x);
+}
+
+#else
+
+/* tanl(x)
+ * Return tangent function of x.
+ *
+ * kernel function:
+ * __kernel_tanl ... tangent function on [-pi/4,pi/4]
+ * __ieee754_rem_pio2l ... argument reduction routine
+ *
+ * Method.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * in [-pi/4 , +pi/4], and let n = k mod 4.
+ * We have
+ *
+ * n sin(x) cos(x) tan(x)
+ * ----------------------------------------------------------
+ * 0 S C T
+ * 1 C -S -1/T
+ * 2 -S -C T
+ * 3 -C S -1/T
+ * ----------------------------------------------------------
+ *
+ * Special cases:
+ * Let trig be any of sin, cos, or tan.
+ * trig(+-INF) is NaN, with signals;
+ * trig(NaN) is that NaN;
+ *
+ * Accuracy:
+ * TRIG(x) returns trig(x) nearly rounded
+ */
+
+# include "trigl.h"
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ Long double expansions contributed by
+ Stephen L. Moshier <moshier@na-net.ornl.gov>
+*/
+
+/* __kernel_tanl( x, y, k )
+ * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
+ * Input x is assumed to be bounded by ~pi/4 in magnitude.
+ * Input y is the tail of x.
+ * Input k indicates whether tan (if k=1) or
+ * -1/tan (if k= -1) is returned.
+ *
+ * Algorithm
+ * 1. Since tan(-x) = -tan(x), we need only to consider positive x.
+ * 2. if x < 2^-57, return x with inexact if x!=0.
+ * 3. tan(x) is approximated by a rational form x + x^3 / 3 + x^5 R(x^2)
+ * on [0,0.67433].
+ *
+ * Note: tan(x+y) = tan(x) + tan'(x)*y
+ * ~ tan(x) + (1+x*x)*y
+ * Therefore, for better accuracy in computing tan(x+y), let
+ * r = x^3 * R(x^2)
+ * then
+ * tan(x+y) = x + (x^3 / 3 + (x^2 *(r+y)+y))
+ *
+ * 4. For x in [0.67433,pi/4], let y = pi/4 - x, then
+ * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
+ * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
+ */
+
+
+static const long double
+ pio4hi = 7.8539816339744830961566084581987569936977E-1L,
+ pio4lo = 2.1679525325309452561992610065108379921906E-35L,
+
+ /* tan x = x + x^3 / 3 + x^5 T(x^2)/U(x^2)
+ 0 <= x <= 0.6743316650390625
+ Peak relative error 8.0e-36 */
+ TH = 3.333333333333333333333333333333333333333E-1L,
+ T0 = -1.813014711743583437742363284336855889393E7L,
+ T1 = 1.320767960008972224312740075083259247618E6L,
+ T2 = -2.626775478255838182468651821863299023956E4L,
+ T3 = 1.764573356488504935415411383687150199315E2L,
+ T4 = -3.333267763822178690794678978979803526092E-1L,
+
+ U0 = -1.359761033807687578306772463253710042010E8L,
+ U1 = 6.494370630656893175666729313065113194784E7L,
+ U2 = -4.180787672237927475505536849168729386782E6L,
+ U3 = 8.031643765106170040139966622980914621521E4L,
+ U4 = -5.323131271912475695157127875560667378597E2L;
+ /* 1.000000000000000000000000000000000000000E0 */
+
+
+static long double
+kernel_tanl (long double x, long double y, int iy)
+{
+ long double z, r, v, w, s, u, u1;
+ int invert = 0, sign;
+
+ sign = 1;
+ if (x < 0)
+ {
+ x = -x;
+ y = -y;
+ sign = -1;
+ }
+
+ if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* x < 2**-57 */
+ {
+ if ((int) x == 0)
+ { /* generate inexact */
+ if (iy == -1 && x == 0.0)
+ return 1.0L / fabs (x);
+ else
+ return (iy == 1) ? x : -1.0L / x;
+ }
+ }
+ if (x >= 0.6743316650390625) /* |x| >= 0.6743316650390625 */
+ {
+ invert = 1;
+
+ z = pio4hi - x;
+ w = pio4lo - y;
+ x = z + w;
+ y = 0.0;
+ }
+ z = x * x;
+ r = T0 + z * (T1 + z * (T2 + z * (T3 + z * T4)));
+ v = U0 + z * (U1 + z * (U2 + z * (U3 + z * (U4 + z))));
+ r = r / v;
+
+ s = z * x;
+ r = y + z * (s * r + y);
+ r += TH * s;
+ w = x + r;
+ if (invert)
+ {
+ v = (long double) iy;
+ w = (v - 2.0 * (x - (w * w / (w + v) - r)));
+ if (sign < 0)
+ w = -w;
+ return w;
+ }
+ if (iy == 1)
+ return w;
+ else
+ { /* if allow error up to 2 ulp,
+ simply return -1.0/(x+r) here */
+ /* compute -1.0/(x+r) accurately */
+ u1 = (double) w;
+ v = r - (u1 - x);
+ z = -1.0 / w;
+ u = (double) z;
+ s = 1.0 + u * u1;
+ return u + z * (s + u * v);
+ }
+}
+
+long double
+tanl (long double x)
+{
+ long double y[2], z = 0.0L;
+ int n;
+
+ /* tanl(NaN) is NaN */
+ if (isnanl (x))
+ return x;
+
+ /* |x| ~< pi/4 */
+ if (x >= -0.7853981633974483096156608458198757210492 &&
+ x <= 0.7853981633974483096156608458198757210492)
+ return kernel_tanl (x, z, 1);
+
+ /* tanl(Inf) is NaN, tanl(0) is 0 */
+ else if (x + x == x)
+ return x - x; /* NaN */
+
+ /* argument reduction needed */
+ else
+ {
+ n = ieee754_rem_pio2l (x, y);
+ /* 1 -- n even, -1 -- n odd */
+ return kernel_tanl (y[0], y[1], 1 - ((n & 1) << 1));
+ }
+}
+
+#endif
+
+#if 0
+int
+main (void)
+{
+ printf ("%.16Lg\n", tanl (0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", tanl (-0.7853981633974483096156608458198757210492));
+ printf ("%.16Lg\n", tanl (0.7853981633974483096156608458198757210492 *3));
+ printf ("%.16Lg\n", tanl (-0.7853981633974483096156608458198757210492 *31));
+ printf ("%.16Lg\n", tanl (0.7853981633974483096156608458198757210492 / 2));
+ printf ("%.16Lg\n", tanl (0.7853981633974483096156608458198757210492 * 3/2));
+ printf ("%.16Lg\n", tanl (0.7853981633974483096156608458198757210492 * 5/2));
+}
+#endif
diff --git a/gnulib/lib/tcgetsid.c b/gnulib/lib/tcgetsid.c
new file mode 100644
index 0000000..838fb75
--- /dev/null
+++ b/gnulib/lib/tcgetsid.c
@@ -0,0 +1,42 @@
+/* Determine the session ID of the controlling terminal of the current process.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+#define USE_OLD_TTY /* needed on OpenBSD 4.5, so that TIOCGSID gets defined */
+
+/* Specification. */
+#include <termios.h>
+
+#include <errno.h>
+#include <sys/ioctl.h>
+
+pid_t
+tcgetsid (int fd)
+{
+#ifdef TIOCGSID /* MacOS X, OpenBSD */
+ int sid;
+
+ if (ioctl (fd, TIOCGSID, &sid) < 0)
+ return -1; /* errno is set here */
+
+ return sid;
+#else /* FreeBSD, Cygwin, mingw */
+ errno = ENOSYS;
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/tempname.c b/gnulib/lib/tempname.c
new file mode 100644
index 0000000..130ae97
--- /dev/null
+++ b/gnulib/lib/tempname.c
@@ -0,0 +1,309 @@
+/* tempname.c - generate the name of a temporary file.
+
+ Copyright (C) 1991-2003, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
+
+#if !_LIBC
+# include <config.h>
+# include "tempname.h"
+#endif
+
+#include <sys/types.h>
+#include <assert.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# define P_tmpdir "/tmp"
+#endif
+#ifndef TMP_MAX
+# define TMP_MAX 238328
+#endif
+#ifndef __GT_FILE
+# define __GT_FILE 0
+# define __GT_DIR 1
+# define __GT_NOCREATE 2
+#endif
+#if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \
+ || GT_NOCREATE != __GT_NOCREATE)
+# error report this to bug-gnulib@gnu.org
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <sys/time.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <sys/stat.h>
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __gen_tempname gen_tempname
+# define __getpid getpid
+# define __gettimeofday gettimeofday
+# define __mkdir mkdir
+# define __open open
+# define __lxstat64(version, file, buf) lstat (file, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+#ifdef _LIBC
+# include <hp-timing.h>
+# if HP_TIMING_AVAIL
+# define RANDOM_BITS(Var) \
+ if (__builtin_expect (value == UINT64_C (0), 0)) \
+ { \
+ /* If this is the first time this function is used initialize \
+ the variable we accumulate the value in to some somewhat \
+ random value. If we'd not do this programs at startup time \
+ might have a reduced set of possible names, at least on slow \
+ machines. */ \
+ struct timeval tv; \
+ __gettimeofday (&tv, NULL); \
+ value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \
+ } \
+ HP_TIMING_NOW (Var)
+# endif
+#endif
+
+/* Use the widest available unsigned type if uint64_t is not
+ available. The algorithm below extracts a number less than 62**6
+ (approximately 2**35.725) from uint64_t, so ancient hosts where
+ uintmax_t is only 32 bits lose about 3.725 bits of randomness,
+ which is better than not having mkstemp at all. */
+#if !defined UINT64_MAX && !defined uint64_t
+# define uint64_t uintmax_t
+#endif
+
+#if _LIBC
+/* Return nonzero if DIR is an existent directory. */
+static int
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ int try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen > 1 && dir[dlen - 1] == '/')
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
+#endif /* _LIBC */
+
+/* These are the characters used in temporary file names. */
+static const char letters[] =
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ __gen_tempname. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ __GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ __GT_FILE: create the file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ __GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+int
+__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
+{
+ int len;
+ char *XXXXXX;
+ static uint64_t value;
+ uint64_t random_time_bits;
+ unsigned int count;
+ int fd = -1;
+ int save_errno = errno;
+ struct_stat64 st;
+
+ /* A lower bound on the number of temporary files to attempt to
+ generate. The maximum total number of temporary file names that
+ can exist for a given template is 62**6. It should never be
+ necessary to try all these combinations. Instead if a reasonable
+ number of names is tried (we define reasonable as 62**3) fail to
+ give the system administrator the chance to remove the problems. */
+#define ATTEMPTS_MIN (62 * 62 * 62)
+
+ /* The number of times to attempt to generate a temporary file. To
+ conform to POSIX, this must be no smaller than TMP_MAX. */
+#if ATTEMPTS_MIN < TMP_MAX
+ unsigned int attempts = TMP_MAX;
+#else
+ unsigned int attempts = ATTEMPTS_MIN;
+#endif
+
+ len = strlen (tmpl);
+ if (len < 6 + suffixlen || memcmp (&tmpl[len - 6 - suffixlen], "XXXXXX", 6))
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* This is where the Xs start. */
+ XXXXXX = &tmpl[len - 6 - suffixlen];
+
+ /* Get some more or less random data. */
+#ifdef RANDOM_BITS
+ RANDOM_BITS (random_time_bits);
+#else
+ {
+ struct timeval tv;
+ __gettimeofday (&tv, NULL);
+ random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
+ }
+#endif
+ value += random_time_bits ^ __getpid ();
+
+ for (count = 0; count < attempts; value += 7777, ++count)
+ {
+ uint64_t v = value;
+
+ /* Fill in the random bits. */
+ XXXXXX[0] = letters[v % 62];
+ v /= 62;
+ XXXXXX[1] = letters[v % 62];
+ v /= 62;
+ XXXXXX[2] = letters[v % 62];
+ v /= 62;
+ XXXXXX[3] = letters[v % 62];
+ v /= 62;
+ XXXXXX[4] = letters[v % 62];
+ v /= 62;
+ XXXXXX[5] = letters[v % 62];
+
+ switch (kind)
+ {
+ case __GT_FILE:
+ fd = __open (tmpl,
+ (flags & ~O_ACCMODE)
+ | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+ break;
+
+ case __GT_DIR:
+ fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+ break;
+
+ case __GT_NOCREATE:
+ /* This case is backward from the other three. __gen_tempname
+ succeeds if __xstat fails because the name does not exist.
+ Note the continue to bypass the common logic at the bottom
+ of the loop. */
+ if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ __set_errno (save_errno);
+ return 0;
+ }
+ else
+ /* Give up now. */
+ return -1;
+ }
+ continue;
+
+ default:
+ assert (! "invalid KIND in __gen_tempname");
+ abort ();
+ }
+
+ if (fd >= 0)
+ {
+ __set_errno (save_errno);
+ return fd;
+ }
+ else if (errno != EEXIST)
+ return -1;
+ }
+
+ /* We got out of the loop because we ran out of combinations to try. */
+ __set_errno (EEXIST);
+ return -1;
+}
diff --git a/gnulib/lib/tempname.h b/gnulib/lib/tempname.h
new file mode 100644
index 0000000..f27b9ba
--- /dev/null
+++ b/gnulib/lib/tempname.h
@@ -0,0 +1,50 @@
+/* Create a temporary file or directory.
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* header written by Eric Blake */
+
+#ifndef GL_TEMPNAME_H
+# define GL_TEMPNAME_H
+
+# include <stdio.h>
+
+# ifdef __GT_FILE
+# define GT_FILE __GT_FILE
+# define GT_DIR __GT_DIR
+# define GT_NOCREATE __GT_NOCREATE
+# else
+# define GT_FILE 0
+# define GT_DIR 1
+# define GT_NOCREATE 2
+# endif
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ gen_tempname. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ GT_FILE: create a large file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
+
+#endif /* GL_TEMPNAME_H */
diff --git a/gnulib/lib/termios.in.h b/gnulib/lib/termios.in.h
new file mode 100644
index 0000000..f69786b
--- /dev/null
+++ b/gnulib/lib/termios.in.h
@@ -0,0 +1,76 @@
+/* Substitute for and wrapper around <termios.h>.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _@GUARD_PREFIX@_TERMIOS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* On HP-UX 11.00, some of the function declarations in <sys/termio.h>,
+ included by <termios.h>, are not protected by extern "C". Enforce
+ "C" linkage for these functions nevertheless. */
+#if defined __hpux && defined __cplusplus
+# include <sys/types.h>
+# include <sys/ioctl.h>
+extern "C" {
+# include <sys/termio.h>
+}
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_TERMIOS_H@
+# @INCLUDE_NEXT@ @NEXT_TERMIOS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_TERMIOS_H
+#define _@GUARD_PREFIX@_TERMIOS_H
+
+#if @GNULIB_TCGETSID@
+/* Get pid_t. */
+# include <sys/types.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_TCGETSID@
+/* Return the session ID of the controlling terminal of the current process.
+ The argument is a descriptor if this controlling terminal.
+ Return -1, with errno set, upon failure. errno = ENOSYS means that the
+ function is unsupported. */
+# if !@HAVE_DECL_TCGETSID@
+_GL_FUNCDECL_SYS (tcgetsid, pid_t, (int fd));
+# endif
+_GL_CXXALIAS_SYS (tcgetsid, pid_t, (int fd));
+_GL_CXXALIASWARN (tcgetsid);
+#elif defined GNULIB_POSIXCHECK
+# undef tcgetsid
+# if HAVE_RAW_DECL_TCGETSID
+_GL_WARN_ON_USE (tcgetsid, "tcgetsid is not portable - "
+ "use gnulib module tcgetsid for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_TERMIOS_H */
+#endif /* _@GUARD_PREFIX@_TERMIOS_H */
diff --git a/gnulib/lib/time.in.h b/gnulib/lib/time.in.h
new file mode 100644
index 0000000..ca852e8
--- /dev/null
+++ b/gnulib/lib/time.in.h
@@ -0,0 +1,249 @@
+/* A more-standard <time.h>.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Don't get in the way of glibc when it includes time.h merely to
+ declare a few standard symbols, rather than to declare all the
+ symbols. Also, Solaris 8 <time.h> eventually includes itself
+ recursively; if that is happening, just include the system <time.h>
+ without adding our own declarations. */
+#if (defined __need_time_t || defined __need_clock_t \
+ || defined __need_timespec \
+ || defined _@GUARD_PREFIX@_TIME_H)
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+#else
+
+# define _@GUARD_PREFIX@_TIME_H
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+/* NetBSD 5.0 mis-defines NULL. */
+# include <stddef.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3).
+ Or they define it with the wrong member names or define it in <sys/time.h>
+ (e.g., FreeBSD circa 1997). Stock Mingw does not define it, but the
+ pthreads-win32 library defines it in <pthread.h>. */
+# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
+# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+# include <sys/time.h>
+# elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+# include <pthread.h>
+/* The pthreads-win32 <pthread.h> also defines a couple of broken macros. */
+# undef asctime_r
+# undef ctime_r
+# undef gmtime_r
+# undef localtime_r
+# undef rand_r
+# undef strtok_r
+# else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_timespec
+# undef timespec
+# define timespec rpl_timespec
+struct timespec
+{
+ time_t tv_sec;
+ long int tv_nsec;
+};
+# define GNULIB_defined_struct_timespec 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# endif
+# endif
+
+# if !GNULIB_defined_struct_time_t_must_be_integral
+/* Per http://austingroupbugs.net/view.php?id=327, POSIX requires
+ time_t to be an integer type, even though C99 permits floating
+ point. We don't know of any implementation that uses floating
+ point, and it is much easier to write code that doesn't have to
+ worry about that corner case, so we force the issue. */
+struct __time_t_must_be_integral {
+ unsigned int __floating_time_t_unsupported : (time_t) 1;
+};
+# define GNULIB_defined_struct_time_t_must_be_integral 1
+# endif
+
+/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
+ return -1 and store the remaining time into RMTP. See
+ <http://www.opengroup.org/susv3xsh/nanosleep.html>. */
+# if @GNULIB_NANOSLEEP@
+# if @REPLACE_NANOSLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define nanosleep rpl_nanosleep
+# endif
+_GL_FUNCDECL_RPL (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp));
+# else
+# if ! @HAVE_NANOSLEEP@
+_GL_FUNCDECL_SYS (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp));
+# endif
+_GL_CXXALIASWARN (nanosleep);
+# endif
+
+/* Return the 'time_t' representation of TP and normalize TP. */
+# if @GNULIB_MKTIME@
+# if @REPLACE_MKTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mktime rpl_mktime
+# endif
+_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp));
+# else
+_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp));
+# endif
+_GL_CXXALIASWARN (mktime);
+# endif
+
+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
+ <http://www.opengroup.org/susv3xsh/localtime_r.html> and
+ <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */
+# if @GNULIB_TIME_R@
+# if @REPLACE_LOCALTIME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef localtime_r
+# define localtime_r rpl_localtime_r
+# endif
+_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# else
+# if ! @HAVE_DECL_LOCALTIME_R@
+_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# endif
+# if @HAVE_DECL_LOCALTIME_R@
+_GL_CXXALIASWARN (localtime_r);
+# endif
+# if @REPLACE_LOCALTIME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gmtime_r
+# define gmtime_r rpl_gmtime_r
+# endif
+_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# else
+# if ! @HAVE_DECL_LOCALTIME_R@
+_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# endif
+# if @HAVE_DECL_LOCALTIME_R@
+_GL_CXXALIASWARN (gmtime_r);
+# endif
+# endif
+
+/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store
+ the resulting broken-down time into TM. See
+ <http://www.opengroup.org/susv3xsh/strptime.html>. */
+# if @GNULIB_STRPTIME@
+# if ! @HAVE_STRPTIME@
+_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf,
+ char const *restrict __format,
+ struct tm *restrict __tm)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf,
+ char const *restrict __format,
+ struct tm *restrict __tm));
+_GL_CXXALIASWARN (strptime);
+# endif
+
+/* Convert TM to a time_t value, assuming UTC. */
+# if @GNULIB_TIMEGM@
+# if @REPLACE_TIMEGM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef timegm
+# define timegm rpl_timegm
+# endif
+_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm));
+# else
+# if ! @HAVE_TIMEGM@
+_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm));
+# endif
+_GL_CXXALIASWARN (timegm);
+# endif
+
+/* Encourage applications to avoid unsafe functions that can overrun
+ buffers when given outlandish struct tm values. Portable
+ applications should use strftime (or even sprintf) instead. */
+# if defined GNULIB_POSIXCHECK
+# undef asctime
+_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef asctime_r
+_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef ctime
+_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef ctime_r
+_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+
+#endif
diff --git a/gnulib/lib/time_r.c b/gnulib/lib/time_r.c
new file mode 100644
index 0000000..97be6c2
--- /dev/null
+++ b/gnulib/lib/time_r.c
@@ -0,0 +1,45 @@
+/* Reentrant time functions like localtime_r.
+
+ Copyright (C) 2003, 2006-2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <time.h>
+
+static struct tm *
+copy_tm_result (struct tm *dest, struct tm const *src)
+{
+ if (! src)
+ return 0;
+ *dest = *src;
+ return dest;
+}
+
+
+struct tm *
+gmtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, gmtime (t));
+}
+
+struct tm *
+localtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, localtime (t));
+}
diff --git a/gnulib/lib/timegm.c b/gnulib/lib/timegm.c
new file mode 100644
index 0000000..d1dddfb
--- /dev/null
+++ b/gnulib/lib/timegm.c
@@ -0,0 +1,39 @@
+/* Convert UTC calendar time to simple time. Like mktime but assumes UTC.
+
+ Copyright (C) 1994, 1997, 2003-2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc. This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <time.h>
+
+#ifndef _LIBC
+# undef __gmtime_r
+# define __gmtime_r gmtime_r
+# define __mktime_internal mktime_internal
+# include "mktime-internal.h"
+#endif
+
+time_t
+timegm (struct tm *tmp)
+{
+ static time_t gmtime_offset;
+ tmp->tm_isdst = 0;
+ return __mktime_internal (tmp, __gmtime_r, &gmtime_offset);
+}
diff --git a/gnulib/lib/times.c b/gnulib/lib/times.c
new file mode 100644
index 0000000..c290ba3
--- /dev/null
+++ b/gnulib/lib/times.c
@@ -0,0 +1,67 @@
+/* Get process times
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#include <config.h>
+
+/* Get times prototype. */
+#include <sys/times.h>
+
+/* Get round. */
+#include <math.h>
+
+/* Get GetProcessTimes etc. */
+#include <windows.h>
+
+static clock_t
+filetime2clock (FILETIME time)
+{
+ float f;
+
+ /* We have a 64-bit value, in the form of two DWORDS aka unsigned
+ int, counting the number of 100-nanosecond intervals. We need to
+ convert these to clock ticks. Older POSIX uses CLK_TCK to
+ indicate the number of clock ticks per second while modern POSIX
+ uses sysconf(_SC_CLK_TCK). Mingw32 does not appear to have
+ sysconf(_SC_CLK_TCK), but appears to have CLK_TCK = 1000 so we
+ use it. Note that CLOCKS_PER_SEC constant does not apply here,
+ it is for use with the clock function. */
+
+ f = (unsigned long long) time.dwHighDateTime << 32;
+ f += time.dwLowDateTime;
+ f = f * CLK_TCK / 10000000;
+ return (clock_t) round (f);
+}
+
+clock_t
+times (struct tms * buffer)
+{
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+
+ if (GetProcessTimes (GetCurrentProcess (), &creation_time, &exit_time,
+ &kernel_time, &user_time) == 0)
+ return (clock_t) -1;
+
+ buffer->tms_utime = filetime2clock (user_time);
+ buffer->tms_stime = filetime2clock (kernel_time);
+ buffer->tms_cutime = 0;
+ buffer->tms_cstime = 0;
+
+ return filetime2clock (creation_time);
+}
diff --git a/gnulib/lib/timespec-add.c b/gnulib/lib/timespec-add.c
new file mode 100644
index 0000000..813dadb
--- /dev/null
+++ b/gnulib/lib/timespec-add.c
@@ -0,0 +1,71 @@
+/* Add two struct timespec values.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* Return the sum of two timespec values A and B. On overflow, return
+ an extremal value. This assumes 0 <= tv_nsec <= 999999999. */
+
+#include <config.h>
+#include "timespec.h"
+
+#include "intprops.h"
+
+struct timespec
+timespec_add (struct timespec a, struct timespec b)
+{
+ struct timespec r;
+ time_t rs = a.tv_sec;
+ time_t bs = b.tv_sec;
+ int ns = a.tv_nsec + b.tv_nsec;
+ int nsd = ns - 1000000000;
+ int rns = ns;
+
+ if (0 <= nsd)
+ {
+ rns = nsd;
+ if (rs == TYPE_MAXIMUM (time_t))
+ {
+ if (0 <= bs)
+ goto high_overflow;
+ bs++;
+ }
+ else
+ rs++;
+ }
+
+ if (INT_ADD_OVERFLOW (rs, bs))
+ {
+ if (rs < 0)
+ {
+ rs = TYPE_MINIMUM (time_t);
+ rns = 0;
+ }
+ else
+ {
+ high_overflow:
+ rs = TYPE_MAXIMUM (time_t);
+ rns = 999999999;
+ }
+ }
+ else
+ rs += bs;
+
+ r.tv_sec = rs;
+ r.tv_nsec = rns;
+ return r;
+}
diff --git a/gnulib/lib/timespec-sub.c b/gnulib/lib/timespec-sub.c
new file mode 100644
index 0000000..679d0db
--- /dev/null
+++ b/gnulib/lib/timespec-sub.c
@@ -0,0 +1,72 @@
+/* Subtract two struct timespec values.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* Return the difference between two timespec values A and B. On
+ overflow, return an extremal value. This assumes 0 <= tv_nsec <=
+ 999999999. */
+
+#include <config.h>
+#include <config.h>
+#include "timespec.h"
+
+#include "intprops.h"
+
+struct timespec
+timespec_sub (struct timespec a, struct timespec b)
+{
+ struct timespec r;
+ time_t rs = a.tv_sec;
+ time_t bs = b.tv_sec;
+ int ns = a.tv_nsec - b.tv_nsec;
+ int rns = ns;
+
+ if (ns < 0)
+ {
+ rns = ns + 1000000000;
+ if (rs == TYPE_MINIMUM (time_t))
+ {
+ if (bs <= 0)
+ goto low_overflow;
+ bs--;
+ }
+ else
+ rs--;
+ }
+
+ if (INT_SUBTRACT_OVERFLOW (rs, bs))
+ {
+ if (rs < 0)
+ {
+ low_overflow:
+ rs = TYPE_MINIMUM (time_t);
+ rns = 0;
+ }
+ else
+ {
+ rs = TYPE_MAXIMUM (time_t);
+ rns = 999999999;
+ }
+ }
+ else
+ rs -= bs;
+
+ r.tv_sec = rs;
+ r.tv_nsec = rns;
+ return r;
+}
diff --git a/gnulib/lib/timespec.h b/gnulib/lib/timespec.h
new file mode 100644
index 0000000..acf815c
--- /dev/null
+++ b/gnulib/lib/timespec.h
@@ -0,0 +1,82 @@
+/* timespec -- System time interface
+
+ Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if ! defined TIMESPEC_H
+# define TIMESPEC_H
+
+# include <time.h>
+
+/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
+
+ For each time stamp T, this code assumes that either:
+
+ * T.tv_nsec is in the range 0..999999999; or
+ * T.tv_sec corresponds to a valid leap second on a host that supports
+ leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or
+ * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or
+ T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000.
+ This allows for special struct timespec values that are less or
+ greater than all possible valid time stamps.
+
+ In all these cases, it is safe to subtract two tv_nsec values and
+ convert the result to integer without worrying about overflow on
+ any platform of interest to the GNU project, since all such
+ platforms have 32-bit int or wider.
+
+ Replacing "(int) (a.tv_nsec - b.tv_nsec)" with something like
+ "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause
+ this function to work in some cases where the above assumption is
+ violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2,
+ b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the
+ extra instructions. Using a subtraction has the advantage of
+ detecting some invalid cases on platforms that detect integer
+ overflow.
+
+ The (int) cast avoids a gcc -Wconversion warning. */
+
+static inline int
+timespec_cmp (struct timespec a, struct timespec b)
+{
+ return (a.tv_sec < b.tv_sec ? -1
+ : a.tv_sec > b.tv_sec ? 1
+ : (int) (a.tv_nsec - b.tv_nsec));
+}
+
+/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be
+ nonnegative. */
+static inline int
+timespec_sign (struct timespec a)
+{
+ return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
+}
+
+struct timespec timespec_add (struct timespec, struct timespec);
+struct timespec timespec_sub (struct timespec, struct timespec);
+struct timespec dtotimespec (double);
+
+/* Return an approximation to A, of type 'double'. */
+static inline double
+timespectod (struct timespec a)
+{
+ return a.tv_sec + a.tv_nsec / 1e9;
+}
+
+void gettime (struct timespec *);
+int settime (struct timespec const *);
+
+#endif
diff --git a/gnulib/lib/tmpdir.c b/gnulib/lib/tmpdir.c
new file mode 100644
index 0000000..f159f16
--- /dev/null
+++ b/gnulib/lib/tmpdir.c
@@ -0,0 +1,157 @@
+/* Copyright (C) 1999, 2001-2002, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Extracted from sysdeps/posix/tempname.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include "tmpdir.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# ifdef _P_tmpdir /* native Windows */
+# define P_tmpdir _P_tmpdir
+# else
+# define P_tmpdir "/tmp"
+# endif
+#endif
+
+#include <sys/stat.h>
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+#endif
+
+#include "pathmax.h"
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __xstat64(version, path, buf) stat (path, buf)
+#endif
+
+#if ! (HAVE___SECURE_GETENV || _LIBC)
+# define __secure_getenv getenv
+#endif
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+
+/* Return nonzero if DIR is an existent directory. */
+static bool
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ bool try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ char dirbuf[PATH_MAX];
+ DWORD retval;
+
+ /* Find Windows temporary file directory.
+ We try this before P_tmpdir because Windows defines P_tmpdir to "\\"
+ and will therefore try to put all temporary files in the root
+ directory (unless $TMPDIR is set). */
+ retval = GetTempPath (PATH_MAX, dirbuf);
+ if (retval > 0 && retval < PATH_MAX && direxists (dirbuf))
+ dir = dirbuf;
+ else
+#endif
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen >= 1 && ISSLASH (dir[dlen - 1]))
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
diff --git a/gnulib/lib/tmpdir.h b/gnulib/lib/tmpdir.h
new file mode 100644
index 0000000..553304f
--- /dev/null
+++ b/gnulib/lib/tmpdir.h
@@ -0,0 +1,26 @@
+/* Determine a temporary directory.
+ Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stddef.h>
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+extern int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir);
diff --git a/gnulib/lib/tmpfile-safer.c b/gnulib/lib/tmpfile-safer.c
new file mode 100644
index 0000000..628db77
--- /dev/null
+++ b/gnulib/lib/tmpfile-safer.c
@@ -0,0 +1,69 @@
+/* Invoke tmpfile, but avoid some glitches.
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake, based on ideas from Paul Eggert. */
+
+#include <config.h>
+
+#include "stdio-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#include "binary-io.h"
+
+/* Like tmpfile, but do not return stdin, stdout, or stderr.
+
+ Remember that tmpfile can leave files behind if your program calls _exit,
+ so this function should not be mixed with the close_stdout module. */
+
+FILE *
+tmpfile_safer (void)
+{
+ FILE *fp = tmpfile ();
+
+ if (fp)
+ {
+ int fd = fileno (fp);
+
+ if (0 <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+
+ if (f < 0)
+ {
+ int e = errno;
+ fclose (fp);
+ errno = e;
+ return NULL;
+ }
+
+ /* Keep the temporary file in binary mode, on platforms
+ where that matters. */
+ if (fclose (fp) != 0
+ || ! (fp = fdopen (f, O_BINARY ? "wb+" : "w+")))
+ {
+ int e = errno;
+ close (f);
+ errno = e;
+ return NULL;
+ }
+ }
+ }
+
+ return fp;
+}
diff --git a/gnulib/lib/tmpfile.c b/gnulib/lib/tmpfile.c
new file mode 100644
index 0000000..c57e0e7
--- /dev/null
+++ b/gnulib/lib/tmpfile.c
@@ -0,0 +1,127 @@
+/* Create a temporary file.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Ben Pfaff. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* This replacement is used only on native Windows platforms. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <io.h>
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+#include "pathmax.h"
+#include "tempname.h"
+#include "tmpdir.h"
+
+/* PATH_MAX is guaranteed to be defined, because this replacement is only
+ used on native Windows. */
+
+/* On Windows, opening a file with _O_TEMPORARY has the effect of passing
+ the FILE_FLAG_DELETE_ON_CLOSE flag to CreateFile(), which has the effect
+ of deleting the file when it is closed - even when the program crashes.
+ But (according to the Cygwin sources) it works only on Windows NT or newer.
+ So we cache the info whether we are running on Windows NT or newer. */
+
+static bool
+supports_delete_on_close ()
+{
+ static int known; /* 1 = yes, -1 = no, 0 = unknown */
+ if (!known)
+ {
+ OSVERSIONINFO v;
+
+ if (GetVersionEx (&v))
+ known = (v.dwPlatformId == VER_PLATFORM_WIN32_NT ? 1 : -1);
+ else
+ known = -1;
+ }
+ return (known > 0);
+}
+
+FILE *
+tmpfile (void)
+{
+ char dir[PATH_MAX];
+ DWORD retval;
+
+ /* Find Windows temporary file directory.
+ We provide this as the directory argument to path_search because Windows
+ defines P_tmpdir to "\\" and will therefore try to put all temporary files
+ in the root directory (unless $TMPDIR is set). */
+ retval = GetTempPath (PATH_MAX, dir);
+ if (retval > 0 && retval < PATH_MAX)
+ {
+ char xtemplate[PATH_MAX];
+
+ if (path_search (xtemplate, PATH_MAX, dir, NULL, true) >= 0)
+ {
+ size_t len = strlen (xtemplate);
+ int o_temporary = (supports_delete_on_close () ? _O_TEMPORARY : 0);
+ int fd;
+
+ do
+ {
+ memcpy (&xtemplate[len - 6], "XXXXXX", 6);
+ if (gen_tempname (xtemplate, 0, 0, GT_NOCREATE) < 0)
+ {
+ fd = -1;
+ break;
+ }
+
+ fd = _open (xtemplate,
+ _O_CREAT | _O_EXCL | o_temporary
+ | _O_RDWR | _O_BINARY,
+ _S_IREAD | _S_IWRITE);
+ }
+ while (fd < 0 && errno == EEXIST);
+
+ if (fd >= 0)
+ {
+ FILE *fp = _fdopen (fd, "w+b");
+
+ if (fp != NULL)
+ return fp;
+ else
+ {
+ int saved_errno = errno;
+ _close (fd);
+ errno = saved_errno;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (retval > 0)
+ errno = ENAMETOOLONG;
+ else
+ /* Ideally this should translate GetLastError () to an errno value. */
+ errno = ENOENT;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/towctrans-impl.h b/gnulib/lib/towctrans-impl.h
new file mode 100644
index 0000000..9e640fe
--- /dev/null
+++ b/gnulib/lib/towctrans-impl.h
@@ -0,0 +1,22 @@
+/* Convert a wide character using a case mapping.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wint_t
+towctrans (wint_t wc, wctrans_t desc)
+{
+ return ((wint_t (*) (wint_t)) desc) (wc);
+}
diff --git a/gnulib/lib/towctrans.c b/gnulib/lib/towctrans.c
new file mode 100644
index 0000000..3bf42ad
--- /dev/null
+++ b/gnulib/lib/towctrans.c
@@ -0,0 +1,23 @@
+/* Convert a wide character using a case mapping.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+#include "towctrans-impl.h"
diff --git a/gnulib/lib/trigl.c b/gnulib/lib/trigl.c
new file mode 100644
index 0000000..0ed0da6
--- /dev/null
+++ b/gnulib/lib/trigl.c
@@ -0,0 +1,636 @@
+/* Quad-precision floating point argument reduction.
+ Copyright (C) 1999, 2007, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jj@ultra.linux.cz>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "trigl.h"
+
+#include <float.h>
+#include <math.h>
+
+/* Table of constants for 2/pi, 5628 hexadecimal digits of 2/pi */
+static const int two_over_pi[] = {
+ 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62,
+ 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a,
+ 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129,
+ 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41,
+ 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8,
+ 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf,
+ 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5,
+ 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08,
+ 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3,
+ 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880,
+ 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b,
+ 0x47c419, 0xc367cd, 0xdce809, 0x2a8359, 0xc4768b, 0x961ca6,
+ 0xddaf44, 0xd15719, 0x053ea5, 0xff0705, 0x3f7e33, 0xe832c2,
+ 0xde4f98, 0x327dbb, 0xc33d26, 0xef6b1e, 0x5ef89f, 0x3a1f35,
+ 0xcaf27f, 0x1d87f1, 0x21907c, 0x7c246a, 0xfa6ed5, 0x772d30,
+ 0x433b15, 0xc614b5, 0x9d19c3, 0xc2c4ad, 0x414d2c, 0x5d000c,
+ 0x467d86, 0x2d71e3, 0x9ac69b, 0x006233, 0x7cd2b4, 0x97a7b4,
+ 0xd55537, 0xf63ed7, 0x1810a3, 0xfc764d, 0x2a9d64, 0xabd770,
+ 0xf87c63, 0x57b07a, 0xe71517, 0x5649c0, 0xd9d63b, 0x3884a7,
+ 0xcb2324, 0x778ad6, 0x23545a, 0xb91f00, 0x1b0af1, 0xdfce19,
+ 0xff319f, 0x6a1e66, 0x615799, 0x47fbac, 0xd87f7e, 0xb76522,
+ 0x89e832, 0x60bfe6, 0xcdc4ef, 0x09366c, 0xd43f5d, 0xd7de16,
+ 0xde3b58, 0x929bde, 0x2822d2, 0xe88628, 0x4d58e2, 0x32cac6,
+ 0x16e308, 0xcb7de0, 0x50c017, 0xa71df3, 0x5be018, 0x34132e,
+ 0x621283, 0x014883, 0x5b8ef5, 0x7fb0ad, 0xf2e91e, 0x434a48,
+ 0xd36710, 0xd8ddaa, 0x425fae, 0xce616a, 0xa4280a, 0xb499d3,
+ 0xf2a606, 0x7f775c, 0x83c2a3, 0x883c61, 0x78738a, 0x5a8caf,
+ 0xbdd76f, 0x63a62d, 0xcbbff4, 0xef818d, 0x67c126, 0x45ca55,
+ 0x36d9ca, 0xd2a828, 0x8d61c2, 0x77c912, 0x142604, 0x9b4612,
+ 0xc459c4, 0x44c5c8, 0x91b24d, 0xf31700, 0xad43d4, 0xe54929,
+ 0x10d5fd, 0xfcbe00, 0xcc941e, 0xeece70, 0xf53e13, 0x80f1ec,
+ 0xc3e7b3, 0x28f8c7, 0x940593, 0x3e71c1, 0xb3092e, 0xf3450b,
+ 0x9c1288, 0x7b20ab, 0x9fb52e, 0xc29247, 0x2f327b, 0x6d550c,
+ 0x90a772, 0x1fe76b, 0x96cb31, 0x4a1679, 0xe27941, 0x89dff4,
+ 0x9794e8, 0x84e6e2, 0x973199, 0x6bed88, 0x365f5f, 0x0efdbb,
+ 0xb49a48, 0x6ca467, 0x427271, 0x325d8d, 0xb8159f, 0x09e5bc,
+ 0x25318d, 0x3974f7, 0x1c0530, 0x010c0d, 0x68084b, 0x58ee2c,
+ 0x90aa47, 0x02e774, 0x24d6bd, 0xa67df7, 0x72486e, 0xef169f,
+ 0xa6948e, 0xf691b4, 0x5153d1, 0xf20acf, 0x339820, 0x7e4bf5,
+ 0x6863b2, 0x5f3edd, 0x035d40, 0x7f8985, 0x295255, 0xc06437,
+ 0x10d86d, 0x324832, 0x754c5b, 0xd4714e, 0x6e5445, 0xc1090b,
+ 0x69f52a, 0xd56614, 0x9d0727, 0x50045d, 0xdb3bb4, 0xc576ea,
+ 0x17f987, 0x7d6b49, 0xba271d, 0x296996, 0xacccc6, 0x5414ad,
+ 0x6ae290, 0x89d988, 0x50722c, 0xbea404, 0x940777, 0x7030f3,
+ 0x27fc00, 0xa871ea, 0x49c266, 0x3de064, 0x83dd97, 0x973fa3,
+ 0xfd9443, 0x8c860d, 0xde4131, 0x9d3992, 0x8c70dd, 0xe7b717,
+ 0x3bdf08, 0x2b3715, 0xa0805c, 0x93805a, 0x921110, 0xd8e80f,
+ 0xaf806c, 0x4bffdb, 0x0f9038, 0x761859, 0x15a562, 0xbbcb61,
+ 0xb989c7, 0xbd4010, 0x04f2d2, 0x277549, 0xf6b6eb, 0xbb22db,
+ 0xaa140a, 0x2f2689, 0x768364, 0x333b09, 0x1a940e, 0xaa3a51,
+ 0xc2a31d, 0xaeedaf, 0x12265c, 0x4dc26d, 0x9c7a2d, 0x9756c0,
+ 0x833f03, 0xf6f009, 0x8c402b, 0x99316d, 0x07b439, 0x15200c,
+ 0x5bc3d8, 0xc492f5, 0x4badc6, 0xa5ca4e, 0xcd37a7, 0x36a9e6,
+ 0x9492ab, 0x6842dd, 0xde6319, 0xef8c76, 0x528b68, 0x37dbfc,
+ 0xaba1ae, 0x3115df, 0xa1ae00, 0xdafb0c, 0x664d64, 0xb705ed,
+ 0x306529, 0xbf5657, 0x3aff47, 0xb9f96a, 0xf3be75, 0xdf9328,
+ 0x3080ab, 0xf68c66, 0x15cb04, 0x0622fa, 0x1de4d9, 0xa4b33d,
+ 0x8f1b57, 0x09cd36, 0xe9424e, 0xa4be13, 0xb52333, 0x1aaaf0,
+ 0xa8654f, 0xa5c1d2, 0x0f3f0b, 0xcd785b, 0x76f923, 0x048b7b,
+ 0x721789, 0x53a6c6, 0xe26e6f, 0x00ebef, 0x584a9b, 0xb7dac4,
+ 0xba66aa, 0xcfcf76, 0x1d02d1, 0x2df1b1, 0xc1998c, 0x77adc3,
+ 0xda4886, 0xa05df7, 0xf480c6, 0x2ff0ac, 0x9aecdd, 0xbc5c3f,
+ 0x6dded0, 0x1fc790, 0xb6db2a, 0x3a25a3, 0x9aaf00, 0x9353ad,
+ 0x0457b6, 0xb42d29, 0x7e804b, 0xa707da, 0x0eaa76, 0xa1597b,
+ 0x2a1216, 0x2db7dc, 0xfde5fa, 0xfedb89, 0xfdbe89, 0x6c76e4,
+ 0xfca906, 0x70803e, 0x156e85, 0xff87fd, 0x073e28, 0x336761,
+ 0x86182a, 0xeabd4d, 0xafe7b3, 0x6e6d8f, 0x396795, 0x5bbf31,
+ 0x48d784, 0x16df30, 0x432dc7, 0x356125, 0xce70c9, 0xb8cb30,
+ 0xfd6cbf, 0xa200a4, 0xe46c05, 0xa0dd5a, 0x476f21, 0xd21262,
+ 0x845cb9, 0x496170, 0xe0566b, 0x015299, 0x375550, 0xb7d51e,
+ 0xc4f133, 0x5f6e13, 0xe4305d, 0xa92e85, 0xc3b21d, 0x3632a1,
+ 0xa4b708, 0xd4b1ea, 0x21f716, 0xe4698f, 0x77ff27, 0x80030c,
+ 0x2d408d, 0xa0cd4f, 0x99a520, 0xd3a2b3, 0x0a5d2f, 0x42f9b4,
+ 0xcbda11, 0xd0be7d, 0xc1db9b, 0xbd17ab, 0x81a2ca, 0x5c6a08,
+ 0x17552e, 0x550027, 0xf0147f, 0x8607e1, 0x640b14, 0x8d4196,
+ 0xdebe87, 0x2afdda, 0xb6256b, 0x34897b, 0xfef305, 0x9ebfb9,
+ 0x4f6a68, 0xa82a4a, 0x5ac44f, 0xbcf82d, 0x985ad7, 0x95c7f4,
+ 0x8d4d0d, 0xa63a20, 0x5f57a4, 0xb13f14, 0x953880, 0x0120cc,
+ 0x86dd71, 0xb6dec9, 0xf560bf, 0x11654d, 0x6b0701, 0xacb08c,
+ 0xd0c0b2, 0x485551, 0x0efb1e, 0xc37295, 0x3b06a3, 0x3540c0,
+ 0x7bdc06, 0xcc45e0, 0xfa294e, 0xc8cad6, 0x41f3e8, 0xde647c,
+ 0xd8649b, 0x31bed9, 0xc397a4, 0xd45877, 0xc5e369, 0x13daf0,
+ 0x3c3aba, 0x461846, 0x5f7555, 0xf5bdd2, 0xc6926e, 0x5d2eac,
+ 0xed440e, 0x423e1c, 0x87c461, 0xe9fd29, 0xf3d6e7, 0xca7c22,
+ 0x35916f, 0xc5e008, 0x8dd7ff, 0xe26a6e, 0xc6fdb0, 0xc10893,
+ 0x745d7c, 0xb2ad6b, 0x9d6ecd, 0x7b723e, 0x6a11c6, 0xa9cff7,
+ 0xdf7329, 0xbac9b5, 0x5100b7, 0x0db2e2, 0x24ba74, 0x607de5,
+ 0x8ad874, 0x2c150d, 0x0c1881, 0x94667e, 0x162901, 0x767a9f,
+ 0xbefdfd, 0xef4556, 0x367ed9, 0x13d9ec, 0xb9ba8b, 0xfc97c4,
+ 0x27a831, 0xc36ef1, 0x36c594, 0x56a8d8, 0xb5a8b4, 0x0ecccf,
+ 0x2d8912, 0x34576f, 0x89562c, 0xe3ce99, 0xb920d6, 0xaa5e6b,
+ 0x9c2a3e, 0xcc5f11, 0x4a0bfd, 0xfbf4e1, 0x6d3b8e, 0x2c86e2,
+ 0x84d4e9, 0xa9b4fc, 0xd1eeef, 0xc9352e, 0x61392f, 0x442138,
+ 0xc8d91b, 0x0afc81, 0x6a4afb, 0xd81c2f, 0x84b453, 0x8c994e,
+ 0xcc2254, 0xdc552a, 0xd6c6c0, 0x96190b, 0xb8701a, 0x649569,
+ 0x605a26, 0xee523f, 0x0f117f, 0x11b5f4, 0xf5cbfc, 0x2dbc34,
+ 0xeebc34, 0xcc5de8, 0x605edd, 0x9b8e67, 0xef3392, 0xb817c9,
+ 0x9b5861, 0xbc57e1, 0xc68351, 0x103ed8, 0x4871dd, 0xdd1c2d,
+ 0xa118af, 0x462c21, 0xd7f359, 0x987ad9, 0xc0549e, 0xfa864f,
+ 0xfc0656, 0xae79e5, 0x362289, 0x22ad38, 0xdc9367, 0xaae855,
+ 0x382682, 0x9be7ca, 0xa40d51, 0xb13399, 0x0ed7a9, 0x480569,
+ 0xf0b265, 0xa7887f, 0x974c88, 0x36d1f9, 0xb39221, 0x4a827b,
+ 0x21cf98, 0xdc9f40, 0x5547dc, 0x3a74e1, 0x42eb67, 0xdf9dfe,
+ 0x5fd45e, 0xa4677b, 0x7aacba, 0xa2f655, 0x23882b, 0x55ba41,
+ 0x086e59, 0x862a21, 0x834739, 0xe6e389, 0xd49ee5, 0x40fb49,
+ 0xe956ff, 0xca0f1c, 0x8a59c5, 0x2bfa94, 0xc5c1d3, 0xcfc50f,
+ 0xae5adb, 0x86c547, 0x624385, 0x3b8621, 0x94792c, 0x876110,
+ 0x7b4c2a, 0x1a2c80, 0x12bf43, 0x902688, 0x893c78, 0xe4c4a8,
+ 0x7bdbe5, 0xc23ac4, 0xeaf426, 0x8a67f7, 0xbf920d, 0x2ba365,
+ 0xb1933d, 0x0b7cbd, 0xdc51a4, 0x63dd27, 0xdde169, 0x19949a,
+ 0x9529a8, 0x28ce68, 0xb4ed09, 0x209f44, 0xca984e, 0x638270,
+ 0x237c7e, 0x32b90f, 0x8ef5a7, 0xe75614, 0x08f121, 0x2a9db5,
+ 0x4d7e6f, 0x5119a5, 0xabf9b5, 0xd6df82, 0x61dd96, 0x023616,
+ 0x9f3ac4, 0xa1a283, 0x6ded72, 0x7a8d39, 0xa9b882, 0x5c326b,
+ 0x5b2746, 0xed3400, 0x7700d2, 0x55f4fc, 0x4d5901, 0x8071e0,
+ 0xe13f89, 0xb295f3, 0x64a8f1, 0xaea74b, 0x38fc4c, 0xeab2bb,
+ 0x47270b, 0xabc3a7, 0x34ba60, 0x52dd34, 0xf8563a, 0xeb7e8a,
+ 0x31bb36, 0x5895b7, 0x47f7a9, 0x94c3aa, 0xd39225, 0x1e7f3e,
+ 0xd8974e, 0xbba94f, 0xd8ae01, 0xe661b4, 0x393d8e, 0xa523aa,
+ 0x33068e, 0x1633b5, 0x3bb188, 0x1d3a9d, 0x4013d0, 0xcc1be5,
+ 0xf862e7, 0x3bf28f, 0x39b5bf, 0x0bc235, 0x22747e, 0xa247c0,
+ 0xd52d1f, 0x19add3, 0x9094df, 0x9311d0, 0xb42b25, 0x496db2,
+ 0xe264b2, 0x5ef135, 0x3bc6a4, 0x1a4ad0, 0xaac92e, 0x64e886,
+ 0x573091, 0x982cfb, 0x311b1a, 0x08728b, 0xbdcee1, 0x60e142,
+ 0xeb641d, 0xd0bba3, 0xe559d4, 0x597b8c, 0x2a4483, 0xf332ba,
+ 0xf84867, 0x2c8d1b, 0x2fa9b0, 0x50f3dd, 0xf9f573, 0xdb61b4,
+ 0xfe233e, 0x6c41a6, 0xeea318, 0x775a26, 0xbc5e5c, 0xcea708,
+ 0x94dc57, 0xe20196, 0xf1e839, 0xbe4851, 0x5d2d2f, 0x4e9555,
+ 0xd96ec2, 0xe7d755, 0x6304e0, 0xc02e0e, 0xfc40a0, 0xbbf9b3,
+ 0x7125a7, 0x222dfb, 0xf619d8, 0x838c1c, 0x6619e6, 0xb20d55,
+ 0xbb5137, 0x79e809, 0xaf9149, 0x0d73de, 0x0b0da5, 0xce7f58,
+ 0xac1934, 0x724667, 0x7a1a13, 0x9e26bc, 0x4555e7, 0x585cb5,
+ 0x711d14, 0x486991, 0x480d60, 0x56adab, 0xd62f64, 0x96ee0c,
+ 0x212ff3, 0x5d6d88, 0xa67684, 0x95651e, 0xab9e0a, 0x4ddefe,
+ 0x571010, 0x836a39, 0xf8ea31, 0x9e381d, 0xeac8b1, 0xcac96b,
+ 0x37f21e, 0xd505e9, 0x984743, 0x9fc56c, 0x0331b7, 0x3b8bf8,
+ 0x86e56a, 0x8dc343, 0x6230e7, 0x93cfd5, 0x6a8f2d, 0x733005,
+ 0x1af021, 0xa09fcb, 0x7415a1, 0xd56b23, 0x6ff725, 0x2f4bc7,
+ 0xb8a591, 0x7fac59, 0x5c55de, 0x212c38, 0xb13296, 0x5cff50,
+ 0x366262, 0xfa7b16, 0xf4d9a6, 0x2acfe7, 0xf07403, 0xd4d604,
+ 0x6fd916, 0x31b1bf, 0xcbb450, 0x5bd7c8, 0x0ce194, 0x6bd643,
+ 0x4fd91c, 0xdf4543, 0x5f3453, 0xe2b5aa, 0xc9aec8, 0x131485,
+ 0xf9d2bf, 0xbadb9e, 0x76f5b9, 0xaf15cf, 0xca3182, 0x14b56d,
+ 0xe9fe4d, 0x50fc35, 0xf5aed5, 0xa2d0c1, 0xc96057, 0x192eb6,
+ 0xe91d92, 0x07d144, 0xaea3c6, 0x343566, 0x26d5b4, 0x3161e2,
+ 0x37f1a2, 0x209eff, 0x958e23, 0x493798, 0x35f4a6, 0x4bdc02,
+ 0xc2be13, 0xbe80a0, 0x0b72a3, 0x115c5f, 0x1e1bd1, 0x0db4d3,
+ 0x869e85, 0x96976b, 0x2ac91f, 0x8a26c2, 0x3070f0, 0x041412,
+ 0xfc9fa5, 0xf72a38, 0x9c6878, 0xe2aa76, 0x50cfe1, 0x559274,
+ 0x934e38, 0x0a92f7, 0x5533f0, 0xa63db4, 0x399971, 0xe2b755,
+ 0xa98a7c, 0x008f19, 0xac54d2, 0x2ea0b4, 0xf5f3e0, 0x60c849,
+ 0xffd269, 0xae52ce, 0x7a5fdd, 0xe9ce06, 0xfb0ae8, 0xa50cce,
+ 0xea9d3e, 0x3766dd, 0xb834f5, 0x0da090, 0x846f88, 0x4ae3d5,
+ 0x099a03, 0x2eae2d, 0xfcb40a, 0xfb9b33, 0xe281dd, 0x1b16ba,
+ 0xd8c0af, 0xd96b97, 0xb52dc9, 0x9c277f, 0x5951d5, 0x21ccd6,
+ 0xb6496b, 0x584562, 0xb3baf2, 0xa1a5c4, 0x7ca2cf, 0xa9b93d,
+ 0x7b7b89, 0x483d38,
+};
+
+static const long double c[] = {
+/* 93 bits of pi/2 */
+#define PI_2_1 c[0]
+ 1.57079632679489661923132169155131424e+00L, /* 3fff921fb54442d18469898cc5100000 */
+
+/* pi/2 - PI_2_1 */
+#define PI_2_1t c[1]
+ 8.84372056613570112025531863263659260e-29L, /* 3fa1c06e0e68948127044533e63a0106 */
+};
+
+static int kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec,
+ const int *ipio2);
+
+int
+ieee754_rem_pio2l (long double x, long double *y)
+{
+ long double z, w, t;
+ double tx[8];
+ int exp, n;
+
+ if (x >= -0.78539816339744830961566084581987572104929234984377
+ && x <= 0.78539816339744830961566084581987572104929234984377)
+ /* x in <-pi/4, pi/4> */
+ {
+ y[0] = x;
+ y[1] = 0;
+ return 0;
+ }
+
+ if (x > 0 && x < 2.35619449019234492884698253745962716314787704953131)
+ {
+ /* 113 + 93 bit PI is ok */
+ z = x - PI_2_1;
+ y[0] = z - PI_2_1t;
+ y[1] = (z - y[0]) - PI_2_1t;
+ return 1;
+ }
+
+ if (x < 0 && x > -2.35619449019234492884698253745962716314787704953131)
+ {
+ /* 113 + 93 bit PI is ok */
+ z = x + PI_2_1;
+ y[0] = z + PI_2_1t;
+ y[1] = (z - y[0]) + PI_2_1t;
+ return -1;
+ }
+
+ if (x + x == x) /* x is ±oo */
+ {
+ y[0] = x - x;
+ y[1] = y[0];
+ return 0;
+ }
+
+ /* Handle large arguments.
+ We split the 113 bits of the mantissa into 5 24bit integers
+ stored in a double array. */
+ z = frexp (x, &exp);
+ tx[0] = floorl (z *= 16777216.0);
+ z -= tx[0];
+ tx[1] = floorl (z *= 16777216.0);
+ z -= tx[1];
+ tx[2] = floorl (z *= 16777216.0);
+ z -= tx[2];
+ tx[3] = floorl (z *= 16777216.0);
+ z -= tx[3];
+ tx[4] = floorl (z *= 16777216.0);
+
+ n = kernel_rem_pio2 (tx, tx + 5, exp - 24, tx[4] ? 5 : 4, 3, two_over_pi);
+
+ /* The result is now stored in 3 double values, we need to convert it into
+ two long double values. */
+ t = (long double) tx[6] + (long double) tx[7];
+ w = (long double) tx[5];
+
+ if (x > 0)
+ {
+ y[0] = w + t;
+ y[1] = t - (y[0] - w);
+ return n;
+ }
+ else
+ {
+ y[0] = -(w + t);
+ y[1] = -t - (y[0] + w);
+ return -n;
+ }
+}
+
+/* @(#)k_rem_pio2.c 5.1 93/09/24 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] =
+ "$NetBSD: k_rem_pio2.c,v 1.7 1995/05/10 20:46:25 jtc Exp $";
+#endif
+
+/*
+ * kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
+ * double x[],y[]; int e0,nx,prec; int ipio2[];
+ *
+ * kernel_rem_pio2 return the last three digits of N with
+ * y = x - N*pi/2
+ * so that |y| < pi/2.
+ *
+ * The method is to compute the integer (mod 8) and fraction parts of
+ * (2/pi)*x without doing the full multiplication. In general we
+ * skip the part of the product that are known to be a huge integer (
+ * more accurately, = 0 mod 8 ). Thus the number of operations are
+ * independent of the exponent of the input.
+ *
+ * (2/pi) is represented by an array of 24-bit integers in ipio2[].
+ *
+ * Input parameters:
+ * x[] The input value (must be positive) is broken into nx
+ * pieces of 24-bit integers in double precision format.
+ * x[i] will be the i-th 24 bit of x. The scaled exponent
+ * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ * match x's up to 24 bits.
+ *
+ * Example of breaking a double positive z into x[0]+x[1]+x[2]:
+ * e0 = ilogb(z)-23
+ * z = scalbn(z,-e0)
+ * for i = 0,1,2
+ * x[i] = floor(z)
+ * z = (z-x[i])*2**24
+ *
+ *
+ * y[] ouput result in an array of double precision numbers.
+ * The dimension of y[] is:
+ * 24-bit precision 1
+ * 53-bit precision 2
+ * 64-bit precision 2
+ * 113-bit precision 3
+ * The actual value is the sum of them. Thus for 113-bit
+ * precision, one may have to do something like:
+ *
+ * long double t,w,r_head, r_tail;
+ * t = (long double)y[2] + (long double)y[1];
+ * w = (long double)y[0];
+ * r_head = t+w;
+ * r_tail = w - (r_head - t);
+ *
+ * e0 The exponent of x[0]
+ *
+ * nx dimension of x[]
+ *
+ * prec an integer indicating the precision:
+ * 0 24 bits (single)
+ * 1 53 bits (double)
+ * 2 64 bits (extended)
+ * 3 113 bits (quad)
+ *
+ * ipio2[]
+ * integer array, contains the (24*i)-th to (24*i+23)-th
+ * bit of 2/pi after binary point. The corresponding
+ * floating value is
+ *
+ * ipio2[i] * 2^(-24(i+1)).
+ *
+ * External function:
+ * double scalbn(), floor();
+ *
+ *
+ * Here is the description of some local variables:
+ *
+ * jk jk+1 is the initial number of terms of ipio2[] needed
+ * in the computation. The recommended value is 2,3,4,
+ * 6 for single, double, extended,and quad.
+ *
+ * jz local integer variable indicating the number of
+ * terms of ipio2[] used.
+ *
+ * jx nx - 1
+ *
+ * jv index for pointing to the suitable ipio2[] for the
+ * computation. In general, we want
+ * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
+ * is an integer. Thus
+ * e0-3-24*jv >= 0 or (e0-3)/24 >= jv
+ * Hence jv = max(0,(e0-3)/24).
+ *
+ * jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
+ *
+ * q[] double array with integral value, representing the
+ * 24-bits chunk of the product of x and 2/pi.
+ *
+ * q0 the corresponding exponent of q[0]. Note that the
+ * exponent for q[i] would be q0-24*i.
+ *
+ * PIo2[] double precision array, obtained by cutting pi/2
+ * into 24 bits chunks.
+ *
+ * f[] ipio2[] in floating point
+ *
+ * iq[] integer array by breaking up q[] in 24-bits chunk.
+ *
+ * fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
+ *
+ * ih integer. If >0 it indicates q[] is >= 0.5, hence
+ * it also indicates the *sign* of the result.
+ *
+ */
+
+
+/*
+ * Constants:
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ * to produce the hexadecimal values shown.
+ */
+
+static const int init_jk[] = { 2, 3, 4, 6 }; /* initial value for jk */
+static const double PIo2[] = {
+ 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
+ 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
+ 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
+ 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
+ 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
+ 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
+ 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
+ 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
+};
+
+static const double zero = 0.0, one = 1.0, two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
+ twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
+
+static int
+kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec,
+ const int *ipio2)
+{
+ int jz, jx, jv, jp, jk, carry, n, iq[20], i, j, k, m, q0, ih;
+ double z, fw, f[20], fq[20], q[20];
+
+ /* initialize jk */
+ jk = init_jk[prec];
+ jp = jk;
+
+ /* determine jx,jv,q0, note that 3>q0 */
+ jx = nx - 1;
+ jv = (e0 - 3) / 24;
+ if (jv < 0)
+ jv = 0;
+ q0 = e0 - 24 * (jv + 1);
+
+ /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
+ j = jv - jx;
+ m = jx + jk;
+ for (i = 0; i <= m; i++, j++)
+ f[i] = (j < 0) ? zero : (double) ipio2[j];
+
+ /* compute q[0],q[1],...q[jk] */
+ for (i = 0; i <= jk; i++)
+ {
+ for (j = 0, fw = 0.0; j <= jx; j++)
+ fw += x[j] * f[jx + i - j];
+ q[i] = fw;
+ }
+
+ jz = jk;
+recompute:
+ /* distill q[] into iq[] reversingly */
+ for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--)
+ {
+ fw = (double) ((int) (twon24 * z));
+ iq[i] = (int) (z - two24 * fw);
+ z = q[j - 1] + fw;
+ }
+
+ /* compute n */
+ z = ldexp (z, q0); /* actual value of z */
+ z -= 8.0 * floor (z * 0.125); /* trim off integer >= 8 */
+ n = (int) z;
+ z -= (double) n;
+ ih = 0;
+ if (q0 > 0)
+ { /* need iq[jz-1] to determine n */
+ i = (iq[jz - 1] >> (24 - q0));
+ n += i;
+ iq[jz - 1] -= i << (24 - q0);
+ ih = iq[jz - 1] >> (23 - q0);
+ }
+ else if (q0 == 0)
+ ih = iq[jz - 1] >> 23;
+ else if (z >= 0.5)
+ ih = 2;
+
+ if (ih > 0)
+ { /* q > 0.5 */
+ n += 1;
+ carry = 0;
+ for (i = 0; i < jz; i++)
+ { /* compute 1-q */
+ j = iq[i];
+ if (carry == 0)
+ {
+ if (j != 0)
+ {
+ carry = 1;
+ iq[i] = 0x1000000 - j;
+ }
+ }
+ else
+ iq[i] = 0xffffff - j;
+ }
+ if (q0 > 0)
+ { /* rare case: chance is 1 in 12 */
+ switch (q0)
+ {
+ case 1:
+ iq[jz - 1] &= 0x7fffff;
+ break;
+ case 2:
+ iq[jz - 1] &= 0x3fffff;
+ break;
+ }
+ }
+ if (ih == 2)
+ {
+ z = one - z;
+ if (carry != 0)
+ z -= ldexp (one, q0);
+ }
+ }
+
+ /* check if recomputation is needed */
+ if (z == zero)
+ {
+ j = 0;
+ for (i = jz - 1; i >= jk; i--)
+ j |= iq[i];
+ if (j == 0)
+ { /* need recomputation */
+ for (k = 1; iq[jk - k] == 0; k++); /* k = no. of terms needed */
+
+ for (i = jz + 1; i <= jz + k; i++)
+ { /* add q[jz+1] to q[jz+k] */
+ f[jx + i] = (double) ipio2[jv + i];
+ for (j = 0, fw = 0.0; j <= jx; j++)
+ fw += x[j] * f[jx + i - j];
+ q[i] = fw;
+ }
+ jz += k;
+ goto recompute;
+ }
+ }
+
+ /* chop off zero terms */
+ if (z == 0.0)
+ {
+ jz -= 1;
+ q0 -= 24;
+ while (iq[jz] == 0)
+ {
+ jz--;
+ q0 -= 24;
+ }
+ }
+ else
+ { /* break z into 24-bit if necessary */
+ z = ldexp (z, -q0);
+ if (z >= two24)
+ {
+ fw = (double) ((int) (twon24 * z));
+ iq[jz] = (int) (z - two24 * fw);
+ jz += 1;
+ q0 += 24;
+ iq[jz] = (int) fw;
+ }
+ else
+ iq[jz] = (int) z;
+ }
+
+ /* convert integer "bit" chunk to floating-point value */
+ fw = ldexp (one, q0);
+ for (i = jz; i >= 0; i--)
+ {
+ q[i] = fw * (double) iq[i];
+ fw *= twon24;
+ }
+
+ /* compute PIo2[0,...,jp]*q[jz,...,0] */
+ for (i = jz; i >= 0; i--)
+ {
+ for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++)
+ fw += PIo2[k] * q[i + k];
+ fq[jz - i] = fw;
+ }
+
+ /* compress fq[] into y[] */
+ switch (prec)
+ {
+ case 0:
+ fw = 0.0;
+ for (i = jz; i >= 0; i--)
+ fw += fq[i];
+ y[0] = (ih == 0) ? fw : -fw;
+ break;
+ case 1:
+ case 2:
+ fw = 0.0;
+ for (i = jz; i >= 0; i--)
+ fw += fq[i];
+ y[0] = (ih == 0) ? fw : -fw;
+ fw = fq[0] - fw;
+ for (i = 1; i <= jz; i++)
+ fw += fq[i];
+ y[1] = (ih == 0) ? fw : -fw;
+ break;
+ case 3: /* painful */
+ for (i = jz; i > 0; i--)
+ {
+ fw = fq[i - 1] + fq[i];
+ fq[i] += fq[i - 1] - fw;
+ fq[i - 1] = fw;
+ }
+ for (i = jz; i > 1; i--)
+ {
+ fw = fq[i - 1] + fq[i];
+ fq[i] += fq[i - 1] - fw;
+ fq[i - 1] = fw;
+ }
+ for (fw = 0.0, i = jz; i >= 2; i--)
+ fw += fq[i];
+ if (ih == 0)
+ {
+ y[0] = fq[0];
+ y[1] = fq[1];
+ y[2] = fw;
+ }
+ else
+ {
+ y[0] = -fq[0];
+ y[1] = -fq[1];
+ y[2] = -fw;
+ }
+ }
+ return n & 7;
+}
diff --git a/gnulib/lib/trigl.h b/gnulib/lib/trigl.h
new file mode 100644
index 0000000..d71ace9
--- /dev/null
+++ b/gnulib/lib/trigl.h
@@ -0,0 +1,35 @@
+/* Declarations for sinl, cosl, tanl internal functions
+ Contributed by Paolo Bonzini
+
+ Copyright 2002-2003, 2009-2011 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Decompose x into x = k * π/2 + r
+ where k is an integer and abs(r) <= π/4.
+ Store r in y[0] and y[1] (main part in y[0], small additional part in
+ y[1], r = y[0] + y[1]).
+ Return k. */
+extern int ieee754_rem_pio2l (long double x, long double *y);
+
+/* Compute and return sinl (x + y), where x is the main part and y is the
+ small additional part of a floating-point number.
+ iy is 0 when y is known to be 0.0, otherwise iy is 1. */
+extern long double kernel_sinl (long double x, long double y, int iy);
+
+/* Compute and return cosl (x + y), where x is the main part and y is the
+ small additional part of a floating-point number. */
+extern long double kernel_cosl (long double x, long double y);
diff --git a/gnulib/lib/trim.c b/gnulib/lib/trim.c
new file mode 100644
index 0000000..155063e
--- /dev/null
+++ b/gnulib/lib/trim.c
@@ -0,0 +1,129 @@
+/* Removes leading and/or trailing whitespaces
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Davide Angelocola <davide.angelocola@gmail.com> */
+
+#include <config.h>
+
+/* Specification. */
+#include "trim.h"
+
+#include <ctype.h>
+#include <string.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "mbchar.h"
+#include "mbiter.h"
+#include "xalloc.h"
+
+/* Use this to suppress gcc's `...may be used before initialized' warnings. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+char *
+trim2 (const char *s, int how)
+{
+ char *d;
+
+ d = strdup (s);
+
+ if (!d)
+ xalloc_die ();
+
+ if (MB_CUR_MAX > 1)
+ {
+ mbi_iterator_t i;
+
+ /* Trim leading whitespaces. */
+ if (how != TRIM_TRAILING)
+ {
+ mbi_init (i, d, strlen (d));
+
+ for (; mbi_avail (i) && mb_isspace (mbi_cur (i)); mbi_advance (i))
+ ;
+
+ memmove (d, mbi_cur_ptr (i), strlen (mbi_cur_ptr (i)) + 1);
+ }
+
+ /* Trim trailing whitespaces. */
+ if (how != TRIM_LEADING)
+ {
+ unsigned int state = 0;
+ char *r IF_LINT (= NULL); /* used only while state = 2 */
+
+ mbi_init (i, d, strlen (d));
+
+ for (; mbi_avail (i); mbi_advance (i))
+ {
+ if (state == 0 && mb_isspace (mbi_cur (i)))
+ continue;
+
+ if (state == 0 && !mb_isspace (mbi_cur (i)))
+ {
+ state = 1;
+ continue;
+ }
+
+ if (state == 1 && !mb_isspace (mbi_cur (i)))
+ continue;
+
+ if (state == 1 && mb_isspace (mbi_cur (i)))
+ {
+ state = 2;
+ r = (char *) mbi_cur_ptr (i);
+ }
+ else if (state == 2 && mb_isspace (mbi_cur (i)))
+ {
+ /* empty */
+ }
+ else
+ {
+ state = 1;
+ }
+ }
+
+ if (state == 2)
+ *r = '\0';
+ }
+ }
+ else
+ {
+ char *p;
+
+ /* Trim leading whitespaces. */
+ if (how != TRIM_TRAILING)
+ {
+ for (p = d; *p && isspace ((unsigned char) *p); p++)
+ ;
+
+ memmove (d, p, strlen (p) + 1);
+ }
+
+ /* Trim trailing whitespaces. */
+ if (how != TRIM_LEADING)
+ {
+ for (p = d + strlen (d) - 1;
+ p >= d && isspace ((unsigned char) *p); p--)
+ *p = '\0';
+ }
+ }
+
+ return d;
+}
diff --git a/gnulib/lib/trim.h b/gnulib/lib/trim.h
new file mode 100644
index 0000000..0bbb2ff
--- /dev/null
+++ b/gnulib/lib/trim.h
@@ -0,0 +1,33 @@
+/* Removes leading and/or trailing whitespaces
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Davide Angelocola <davide.angelocola@gmail.com> */
+
+/* Trim mode. */
+#define TRIM_TRAILING 0
+#define TRIM_LEADING 1
+#define TRIM_BOTH 2
+
+/* Removes trailing and leading whitespaces. */
+#define trim(s) trim2(s, TRIM_BOTH)
+
+/* Removes trailing whitespaces. */
+#define trim_trailing(s) trim2(s, TRIM_TRAILING)
+
+/* Removes leading whitespaces. */
+#define trim_leading(s) trim2(s, TRIM_LEADING)
+
+char *trim2 (const char *, int);
diff --git a/gnulib/lib/trunc.c b/gnulib/lib/trunc.c
new file mode 100644
index 0000000..73a3345
--- /dev/null
+++ b/gnulib/lib/trunc.c
@@ -0,0 +1,115 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#if ! defined USE_LONG_DOUBLE
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <math.h>
+
+#include <float.h>
+
+#undef MIN
+
+#ifdef USE_LONG_DOUBLE
+# define FUNC truncl
+# define DOUBLE long double
+# define MANT_DIG LDBL_MANT_DIG
+# define MIN LDBL_MIN
+# define L_(literal) literal##L
+#elif ! defined USE_FLOAT
+# define FUNC trunc
+# define DOUBLE double
+# define MANT_DIG DBL_MANT_DIG
+# define MIN DBL_MIN
+# define L_(literal) literal
+#else /* defined USE_FLOAT */
+# define FUNC truncf
+# define DOUBLE float
+# define MANT_DIG FLT_MANT_DIG
+# define MIN FLT_MIN
+# define L_(literal) literal##f
+#endif
+
+/* -0.0. See minus-zero.h. */
+#if defined __hpux || defined __sgi || defined __ICC
+# define MINUS_ZERO (-MIN * MIN)
+#else
+# define MINUS_ZERO L_(-0.0)
+#endif
+
+/* 2^(MANT_DIG-1). */
+static const DOUBLE TWO_MANT_DIG =
+ /* Assume MANT_DIG <= 5 * 31.
+ Use the identity
+ n = floor(n/5) + floor((n+1)/5) + ... + floor((n+4)/5). */
+ (DOUBLE) (1U << ((MANT_DIG - 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 1) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 2) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 3) / 5))
+ * (DOUBLE) (1U << ((MANT_DIG - 1 + 4) / 5));
+
+DOUBLE
+FUNC (DOUBLE x)
+{
+ /* The use of 'volatile' guarantees that excess precision bits are dropped
+ at each addition step and before the following comparison at the caller's
+ site. It is necessary on x86 systems where double-floats are not IEEE
+ compliant by default, to avoid that the results become platform and compiler
+ option dependent. 'volatile' is a portable alternative to gcc's
+ -ffloat-store option. */
+ volatile DOUBLE y = x;
+ volatile DOUBLE z = y;
+
+ if (z > L_(0.0))
+ {
+ /* For 0 < x < 1, return +0.0 even if the current rounding mode is
+ FE_DOWNWARD. */
+ if (z < L_(1.0))
+ z = L_(0.0);
+ /* Avoid rounding errors for values near 2^k, where k >= MANT_DIG-1. */
+ else if (z < TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z += TWO_MANT_DIG;
+ z -= TWO_MANT_DIG;
+ /* Enforce rounding down. */
+ if (z > y)
+ z -= L_(1.0);
+ }
+ }
+ else if (z < L_(0.0))
+ {
+ /* For -1 < x < 0, return -0.0 regardless of the current rounding
+ mode. */
+ if (z > L_(-1.0))
+ z = MINUS_ZERO;
+ /* Avoid rounding errors for values near -2^k, where k >= MANT_DIG-1. */
+ else if (z > - TWO_MANT_DIG)
+ {
+ /* Round to the next integer (nearest or up or down, doesn't matter). */
+ z -= TWO_MANT_DIG;
+ z += TWO_MANT_DIG;
+ /* Enforce rounding up. */
+ if (z < y)
+ z += L_(1.0);
+ }
+ }
+ return z;
+}
diff --git a/gnulib/lib/truncf.c b/gnulib/lib/truncf.c
new file mode 100644
index 0000000..609eb5e
--- /dev/null
+++ b/gnulib/lib/truncf.c
@@ -0,0 +1,20 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#define USE_FLOAT
+#include "trunc.c"
diff --git a/gnulib/lib/truncl.c b/gnulib/lib/truncl.c
new file mode 100644
index 0000000..8af2c5c
--- /dev/null
+++ b/gnulib/lib/truncl.c
@@ -0,0 +1,37 @@
+/* Round towards zero.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+#include <config.h>
+
+#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+
+/* Specification. */
+# include <math.h>
+
+long double
+truncl (long double x)
+{
+ return trunc (x);
+}
+
+#else
+
+# define USE_LONG_DOUBLE
+# include "trunc.c"
+
+#endif
diff --git a/gnulib/lib/tsearch.c b/gnulib/lib/tsearch.c
new file mode 100644
index 0000000..086ef53
--- /dev/null
+++ b/gnulib/lib/tsearch.c
@@ -0,0 +1,687 @@
+/* Copyright (C) 1995-1997, 2000, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tree search for red/black trees.
+ The algorithm for adding nodes is taken from one of the many "Algorithms"
+ books by Robert Sedgewick, although the implementation differs.
+ The algorithm for deleting nodes can probably be found in a book named
+ "Introduction to Algorithms" by Cormen/Leiserson/Rivest. At least that's
+ the book that my professor took most algorithms from during the "Data
+ Structures" course...
+
+ Totally public domain. */
+
+/* Red/black trees are binary trees in which the edges are colored either red
+ or black. They have the following properties:
+ 1. The number of black edges on every path from the root to a leaf is
+ constant.
+ 2. No two red edges are adjacent.
+ Therefore there is an upper bound on the length of every path, it's
+ O(log n) where n is the number of nodes in the tree. No path can be longer
+ than 1+2*P where P is the length of the shortest path in the tree.
+ Useful for the implementation:
+ 3. If one of the children of a node is NULL, then the other one is red
+ (if it exists).
+
+ In the implementation, not the edges are colored, but the nodes. The color
+ interpreted as the color of the edge leading to this node. The color is
+ meaningless for the root node, but we color the root node black for
+ convenience. All added nodes are red initially.
+
+ Adding to a red/black tree is rather easy. The right place is searched
+ with a usual binary tree search. Additionally, whenever a node N is
+ reached that has two red successors, the successors are colored black and
+ the node itself colored red. This moves red edges up the tree where they
+ pose less of a problem once we get to really insert the new node. Changing
+ N's color to red may violate rule 2, however, so rotations may become
+ necessary to restore the invariants. Adding a new red leaf may violate
+ the same rule, so afterwards an additional check is run and the tree
+ possibly rotated.
+
+ Deleting is hairy. There are mainly two nodes involved: the node to be
+ deleted (n1), and another node that is to be unchained from the tree (n2).
+ If n1 has a successor (the node with a smallest key that is larger than
+ n1), then the successor becomes n2 and its contents are copied into n1,
+ otherwise n1 becomes n2.
+ Unchaining a node may violate rule 1: if n2 is black, one subtree is
+ missing one black edge afterwards. The algorithm must try to move this
+ error upwards towards the root, so that the subtree that does not have
+ enough black edges becomes the whole tree. Once that happens, the error
+ has disappeared. It may not be necessary to go all the way up, since it
+ is possible that rotations and recoloring can fix the error before that.
+
+ Although the deletion algorithm must walk upwards through the tree, we
+ do not store parent pointers in the nodes. Instead, delete allocates a
+ small array of parent pointers and fills it while descending the tree.
+ Since we know that the length of a path is O(log n), where n is the number
+ of nodes, this is likely to use less memory. */
+
+/* Tree rotations look like this:
+ A C
+ / \ / \
+ B C A G
+ / \ / \ --> / \
+ D E F G B F
+ / \
+ D E
+
+ In this case, A has been rotated left. This preserves the ordering of the
+ binary tree. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the rootp == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#ifdef IN_LIBINTL
+# include "tsearch.h"
+#else
+# include <search.h>
+#endif
+
+#include <stdlib.h>
+
+typedef int (*__compar_fn_t) (const void *, const void *);
+typedef void (*__action_fn_t) (const void *, VISIT, int);
+
+#ifndef weak_alias
+# define __tsearch tsearch
+# define __tfind tfind
+# define __tdelete tdelete
+# define __twalk twalk
+#endif
+
+#ifndef internal_function
+/* Inside GNU libc we mark some function in a special way. In other
+ environments simply ignore the marking. */
+# define internal_function
+#endif
+
+typedef struct node_t
+{
+ /* Callers expect this to be the first element in the structure - do not
+ move! */
+ const void *key;
+ struct node_t *left;
+ struct node_t *right;
+ unsigned int red:1;
+} *node;
+typedef const struct node_t *const_node;
+
+#undef DEBUGGING
+
+#ifdef DEBUGGING
+
+/* Routines to check tree invariants. */
+
+#include <assert.h>
+
+#define CHECK_TREE(a) check_tree(a)
+
+static void
+check_tree_recurse (node p, int d_sofar, int d_total)
+{
+ if (p == NULL)
+ {
+ assert (d_sofar == d_total);
+ return;
+ }
+
+ check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
+ check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
+ if (p->left)
+ assert (!(p->left->red && p->red));
+ if (p->right)
+ assert (!(p->right->red && p->red));
+}
+
+static void
+check_tree (node root)
+{
+ int cnt = 0;
+ node p;
+ if (root == NULL)
+ return;
+ root->red = 0;
+ for (p = root->left; p; p = p->left)
+ cnt += !p->red;
+ check_tree_recurse (root, 0, cnt);
+}
+
+
+#else
+
+#define CHECK_TREE(a)
+
+#endif
+
+/* Possibly "split" a node with two red successors, and/or fix up two red
+ edges in a row. ROOTP is a pointer to the lowest node we visited, PARENTP
+ and GPARENTP pointers to its parent/grandparent. P_R and GP_R contain the
+ comparison values that determined which way was taken in the tree to reach
+ ROOTP. MODE is 1 if we need not do the split, but must check for two red
+ edges between GPARENTP and ROOTP. */
+static void
+maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
+ int p_r, int gp_r, int mode)
+{
+ node root = *rootp;
+ node *rp, *lp;
+ rp = &(*rootp)->right;
+ lp = &(*rootp)->left;
+
+ /* See if we have to split this node (both successors red). */
+ if (mode == 1
+ || ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
+ {
+ /* This node becomes red, its successors black. */
+ root->red = 1;
+ if (*rp)
+ (*rp)->red = 0;
+ if (*lp)
+ (*lp)->red = 0;
+
+ /* If the parent of this node is also red, we have to do
+ rotations. */
+ if (parentp != NULL && (*parentp)->red)
+ {
+ node gp = *gparentp;
+ node p = *parentp;
+ /* There are two main cases:
+ 1. The edge types (left or right) of the two red edges differ.
+ 2. Both red edges are of the same type.
+ There exist two symmetries of each case, so there is a total of
+ 4 cases. */
+ if ((p_r > 0) != (gp_r > 0))
+ {
+ /* Put the child at the top of the tree, with its parent
+ and grandparent as successors. */
+ p->red = 1;
+ gp->red = 1;
+ root->red = 0;
+ if (p_r < 0)
+ {
+ /* Child is left of parent. */
+ p->left = *rp;
+ *rp = p;
+ gp->right = *lp;
+ *lp = gp;
+ }
+ else
+ {
+ /* Child is right of parent. */
+ p->right = *lp;
+ *lp = p;
+ gp->left = *rp;
+ *rp = gp;
+ }
+ *gparentp = root;
+ }
+ else
+ {
+ *gparentp = *parentp;
+ /* Parent becomes the top of the tree, grandparent and
+ child are its successors. */
+ p->red = 0;
+ gp->red = 1;
+ if (p_r < 0)
+ {
+ /* Left edges. */
+ gp->left = p->right;
+ p->right = gp;
+ }
+ else
+ {
+ /* Right edges. */
+ gp->right = p->left;
+ p->left = gp;
+ }
+ }
+ }
+ }
+}
+
+/* Find or insert datum into search tree.
+ KEY is the key to be located, ROOTP is the address of tree root,
+ COMPAR the ordering function. */
+void *
+__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
+{
+ node q;
+ node *parentp = NULL, *gparentp = NULL;
+ node *rootp = (node *) vrootp;
+ node *nextp;
+ int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler. */
+
+ if (rootp == NULL)
+ return NULL;
+
+ /* This saves some additional tests below. */
+ if (*rootp != NULL)
+ (*rootp)->red = 0;
+
+ CHECK_TREE (*rootp);
+
+ nextp = rootp;
+ while (*nextp != NULL)
+ {
+ node root = *rootp;
+ r = (*compar) (key, root->key);
+ if (r == 0)
+ return root;
+
+ maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
+ /* If that did any rotations, parentp and gparentp are now garbage.
+ That doesn't matter, because the values they contain are never
+ used again in that case. */
+
+ nextp = r < 0 ? &root->left : &root->right;
+ if (*nextp == NULL)
+ break;
+
+ gparentp = parentp;
+ parentp = rootp;
+ rootp = nextp;
+
+ gp_r = p_r;
+ p_r = r;
+ }
+
+ q = (struct node_t *) malloc (sizeof (struct node_t));
+ if (q != NULL)
+ {
+ *nextp = q; /* link new node to old */
+ q->key = key; /* initialize new node */
+ q->red = 1;
+ q->left = q->right = NULL;
+
+ if (nextp != rootp)
+ /* There may be two red edges in a row now, which we must avoid by
+ rotating the tree. */
+ maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
+ }
+
+ return q;
+}
+#ifdef weak_alias
+weak_alias (__tsearch, tsearch)
+#endif
+
+
+/* Find datum in search tree.
+ KEY is the key to be located, ROOTP is the address of tree root,
+ COMPAR the ordering function. */
+void *
+__tfind (key, vrootp, compar)
+ const void *key;
+ void *const *vrootp;
+ __compar_fn_t compar;
+{
+ node *rootp = (node *) vrootp;
+
+ if (rootp == NULL)
+ return NULL;
+
+ CHECK_TREE (*rootp);
+
+ while (*rootp != NULL)
+ {
+ node root = *rootp;
+ int r;
+
+ r = (*compar) (key, root->key);
+ if (r == 0)
+ return root;
+
+ rootp = r < 0 ? &root->left : &root->right;
+ }
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__tfind, tfind)
+#endif
+
+
+/* Delete node with given key.
+ KEY is the key to be deleted, ROOTP is the address of the root of tree,
+ COMPAR the comparison function. */
+void *
+__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
+{
+ node p, q, r, retval;
+ int cmp;
+ node *rootp = (node *) vrootp;
+ node root, unchained;
+ /* Stack of nodes so we remember the parents without recursion. It's
+ _very_ unlikely that there are paths longer than 40 nodes. The tree
+ would need to have around 250.000 nodes. */
+ int stacksize = 100;
+ int sp = 0;
+ node *nodestack[100];
+
+ if (rootp == NULL)
+ return NULL;
+ p = *rootp;
+ if (p == NULL)
+ return NULL;
+
+ CHECK_TREE (p);
+
+ while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
+ {
+ if (sp == stacksize)
+ abort ();
+
+ nodestack[sp++] = rootp;
+ p = *rootp;
+ rootp = ((cmp < 0)
+ ? &(*rootp)->left
+ : &(*rootp)->right);
+ if (*rootp == NULL)
+ return NULL;
+ }
+
+ /* This is bogus if the node to be deleted is the root... this routine
+ really should return an integer with 0 for success, -1 for failure
+ and errno = ESRCH or something. */
+ retval = p;
+
+ /* We don't unchain the node we want to delete. Instead, we overwrite
+ it with its successor and unchain the successor. If there is no
+ successor, we really unchain the node to be deleted. */
+
+ root = *rootp;
+
+ r = root->right;
+ q = root->left;
+
+ if (q == NULL || r == NULL)
+ unchained = root;
+ else
+ {
+ node *parent = rootp, *up = &root->right;
+ for (;;)
+ {
+ if (sp == stacksize)
+ abort ();
+ nodestack[sp++] = parent;
+ parent = up;
+ if ((*up)->left == NULL)
+ break;
+ up = &(*up)->left;
+ }
+ unchained = *up;
+ }
+
+ /* We know that either the left or right successor of UNCHAINED is NULL.
+ R becomes the other one, it is chained into the parent of UNCHAINED. */
+ r = unchained->left;
+ if (r == NULL)
+ r = unchained->right;
+ if (sp == 0)
+ *rootp = r;
+ else
+ {
+ q = *nodestack[sp-1];
+ if (unchained == q->right)
+ q->right = r;
+ else
+ q->left = r;
+ }
+
+ if (unchained != root)
+ root->key = unchained->key;
+ if (!unchained->red)
+ {
+ /* Now we lost a black edge, which means that the number of black
+ edges on every path is no longer constant. We must balance the
+ tree. */
+ /* NODESTACK now contains all parents of R. R is likely to be NULL
+ in the first iteration. */
+ /* NULL nodes are considered black throughout - this is necessary for
+ correctness. */
+ while (sp > 0 && (r == NULL || !r->red))
+ {
+ node *pp = nodestack[sp - 1];
+ p = *pp;
+ /* Two symmetric cases. */
+ if (r == p->left)
+ {
+ /* Q is R's brother, P is R's parent. The subtree with root
+ R has one black edge less than the subtree with root Q. */
+ q = p->right;
+ if (q->red)
+ {
+ /* If Q is red, we know that P is black. We rotate P left
+ so that Q becomes the top node in the tree, with P below
+ it. P is colored red, Q is colored black.
+ This action does not change the black edge count for any
+ leaf in the tree, but we will be able to recognize one
+ of the following situations, which all require that Q
+ is black. */
+ q->red = 0;
+ p->red = 1;
+ /* Left rotate p. */
+ p->right = q->left;
+ q->left = p;
+ *pp = q;
+ /* Make sure pp is right if the case below tries to use
+ it. */
+ nodestack[sp++] = pp = &q->left;
+ q = p->right;
+ }
+ /* We know that Q can't be NULL here. We also know that Q is
+ black. */
+ if ((q->left == NULL || !q->left->red)
+ && (q->right == NULL || !q->right->red))
+ {
+ /* Q has two black successors. We can simply color Q red.
+ The whole subtree with root P is now missing one black
+ edge. Note that this action can temporarily make the
+ tree invalid (if P is red). But we will exit the loop
+ in that case and set P black, which both makes the tree
+ valid and also makes the black edge count come out
+ right. If P is black, we are at least one step closer
+ to the root and we'll try again the next iteration. */
+ q->red = 1;
+ r = p;
+ }
+ else
+ {
+ /* Q is black, one of Q's successors is red. We can
+ repair the tree with one operation and will exit the
+ loop afterwards. */
+ if (q->right == NULL || !q->right->red)
+ {
+ /* The left one is red. We perform the same action as
+ in maybe_split_for_insert where two red edges are
+ adjacent but point in different directions:
+ Q's left successor (let's call it Q2) becomes the
+ top of the subtree we are looking at, its parent (Q)
+ and grandparent (P) become its successors. The former
+ successors of Q2 are placed below P and Q.
+ P becomes black, and Q2 gets the color that P had.
+ This changes the black edge count only for node R and
+ its successors. */
+ node q2 = q->left;
+ q2->red = p->red;
+ p->right = q2->left;
+ q->left = q2->right;
+ q2->right = q;
+ q2->left = p;
+ *pp = q2;
+ p->red = 0;
+ }
+ else
+ {
+ /* It's the right one. Rotate P left. P becomes black,
+ and Q gets the color that P had. Q's right successor
+ also becomes black. This changes the black edge
+ count only for node R and its successors. */
+ q->red = p->red;
+ p->red = 0;
+
+ q->right->red = 0;
+
+ /* left rotate p */
+ p->right = q->left;
+ q->left = p;
+ *pp = q;
+ }
+
+ /* We're done. */
+ sp = 1;
+ r = NULL;
+ }
+ }
+ else
+ {
+ /* Comments: see above. */
+ q = p->left;
+ if (q->red)
+ {
+ q->red = 0;
+ p->red = 1;
+ p->left = q->right;
+ q->right = p;
+ *pp = q;
+ nodestack[sp++] = pp = &q->right;
+ q = p->left;
+ }
+ if ((q->right == NULL || !q->right->red)
+ && (q->left == NULL || !q->left->red))
+ {
+ q->red = 1;
+ r = p;
+ }
+ else
+ {
+ if (q->left == NULL || !q->left->red)
+ {
+ node q2 = q->right;
+ q2->red = p->red;
+ p->left = q2->right;
+ q->right = q2->left;
+ q2->left = q;
+ q2->right = p;
+ *pp = q2;
+ p->red = 0;
+ }
+ else
+ {
+ q->red = p->red;
+ p->red = 0;
+ q->left->red = 0;
+ p->left = q->right;
+ q->right = p;
+ *pp = q;
+ }
+ sp = 1;
+ r = NULL;
+ }
+ }
+ --sp;
+ }
+ if (r != NULL)
+ r->red = 0;
+ }
+
+ free (unchained);
+ return retval;
+}
+#ifdef weak_alias
+weak_alias (__tdelete, tdelete)
+#endif
+
+
+/* Walk the nodes of a tree.
+ ROOT is the root of the tree to be walked, ACTION the function to be
+ called at each node. LEVEL is the level of ROOT in the whole tree. */
+static void
+internal_function
+trecurse (const void *vroot, __action_fn_t action, int level)
+{
+ const_node root = (const_node) vroot;
+
+ if (root->left == NULL && root->right == NULL)
+ (*action) (root, leaf, level);
+ else
+ {
+ (*action) (root, preorder, level);
+ if (root->left != NULL)
+ trecurse (root->left, action, level + 1);
+ (*action) (root, postorder, level);
+ if (root->right != NULL)
+ trecurse (root->right, action, level + 1);
+ (*action) (root, endorder, level);
+ }
+}
+
+
+/* Walk the nodes of a tree.
+ ROOT is the root of the tree to be walked, ACTION the function to be
+ called at each node. */
+void
+__twalk (const void *vroot, __action_fn_t action)
+{
+ const_node root = (const_node) vroot;
+
+ CHECK_TREE (root);
+
+ if (root != NULL && action != NULL)
+ trecurse (root, action, 0);
+}
+#ifdef weak_alias
+weak_alias (__twalk, twalk)
+#endif
+
+
+#ifdef _LIBC
+
+/* The standardized functions miss an important functionality: the
+ tree cannot be removed easily. We provide a function to do this. */
+static void
+internal_function
+tdestroy_recurse (node root, __free_fn_t freefct)
+{
+ if (root->left != NULL)
+ tdestroy_recurse (root->left, freefct);
+ if (root->right != NULL)
+ tdestroy_recurse (root->right, freefct);
+ (*freefct) ((void *) root->key);
+ /* Free the node itself. */
+ free (root);
+}
+
+void
+__tdestroy (void *vroot, __free_fn_t freefct)
+{
+ node root = (node) vroot;
+
+ CHECK_TREE (root);
+
+ if (root != NULL)
+ tdestroy_recurse (root, freefct);
+}
+weak_alias (__tdestroy, tdestroy)
+
+#endif /* _LIBC */
diff --git a/gnulib/lib/ttyname_r.c b/gnulib/lib/ttyname_r.c
new file mode 100644
index 0000000..3379f1c
--- /dev/null
+++ b/gnulib/lib/ttyname_r.c
@@ -0,0 +1,86 @@
+/* Determine name of a terminal.
+
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+
+int
+ttyname_r (int fd, char *buf, size_t buflen)
+#undef ttyname_r
+{
+ /* When ttyname_r exists, use it. */
+#if HAVE_TTYNAME_R
+ /* This code is multithread-safe. */
+ /* On Solaris, ttyname_r always fails if buflen < 128. On OSF/1 5.1,
+ ttyname_r ignores the buffer size and assumes the buffer is large enough.
+ So provide a buffer that is large enough. */
+ char largerbuf[512];
+# if HAVE_POSIXDECL_TTYNAME_R
+ int err =
+ (buflen < sizeof (largerbuf)
+ ? ttyname_r (fd, largerbuf, sizeof (largerbuf))
+ : ttyname_r (fd, buf, buflen <= INT_MAX ? buflen : INT_MAX));
+ if (err != 0)
+ return err;
+ if (buflen < sizeof (largerbuf))
+ {
+ size_t namelen = strlen (largerbuf);
+ if (namelen > buflen)
+ return ERANGE;
+ memcpy (buf, largerbuf, namelen);
+ }
+# else
+ char *name =
+ (buflen < sizeof (largerbuf)
+ ? ttyname_r (fd, largerbuf, sizeof (largerbuf))
+ : ttyname_r (fd, buf, buflen <= INT_MAX ? buflen : INT_MAX));
+ if (name == NULL)
+ return errno;
+ if (name != buf)
+ {
+ size_t namelen = strlen (name) + 1;
+ if (namelen > buflen)
+ return ERANGE;
+ memmove (buf, name, namelen);
+ }
+# endif
+ return 0;
+#elif HAVE_TTYNAME
+ /* Note: This is not multithread-safe. */
+ char *name;
+ size_t namelen;
+
+ name = ttyname (fd);
+ if (name == NULL)
+ return errno;
+ namelen = strlen (name) + 1;
+ if (namelen > buflen)
+ return ERANGE;
+ memcpy (buf, name, namelen);
+ return 0;
+#else
+ /* Platforms like mingw: no ttys exist at all. */
+ return ENOTTY;
+#endif
+}
diff --git a/gnulib/lib/u64.h b/gnulib/lib/u64.h
new file mode 100644
index 0000000..182d649
--- /dev/null
+++ b/gnulib/lib/u64.h
@@ -0,0 +1,158 @@
+/* uint64_t-like operations that work even on hosts lacking uint64_t
+
+ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdint.h>
+
+/* Return X rotated left by N bits, where 0 < N < 64. */
+#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
+
+#ifdef UINT64_MAX
+
+/* Native implementations are trivial. See below for comments on what
+ these operations do. */
+typedef uint64_t u64;
+# define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo)))
+# define u64init(hi, lo) u64hilo (hi, lo)
+# define u64lo(x) ((u64) (x))
+# define u64lt(x, y) ((x) < (y))
+# define u64and(x, y) ((x) & (y))
+# define u64or(x, y) ((x) | (y))
+# define u64xor(x, y) ((x) ^ (y))
+# define u64plus(x, y) ((x) + (y))
+# define u64shl(x, n) ((x) << (n))
+# define u64shr(x, n) ((x) >> (n))
+
+#else
+
+/* u64 is a 64-bit unsigned integer value.
+ u64init (HI, LO), is like u64hilo (HI, LO), but for use in
+ initializer contexts. */
+# ifdef WORDS_BIGENDIAN
+typedef struct { uint32_t hi, lo; } u64;
+# define u64init(hi, lo) { hi, lo }
+# else
+typedef struct { uint32_t lo, hi; } u64;
+# define u64init(hi, lo) { lo, hi }
+# endif
+
+/* Given the high and low-order 32-bit quantities HI and LO, return a u64
+ value representing (HI << 32) + LO. */
+static inline u64
+u64hilo (uint32_t hi, uint32_t lo)
+{
+ u64 r;
+ r.hi = hi;
+ r.lo = lo;
+ return r;
+}
+
+/* Return a u64 value representing LO. */
+static inline u64
+u64lo (uint32_t lo)
+{
+ u64 r;
+ r.hi = 0;
+ r.lo = lo;
+ return r;
+}
+
+/* Return X < Y. */
+static inline int
+u64lt (u64 x, u64 y)
+{
+ return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
+}
+
+/* Return X & Y. */
+static inline u64
+u64and (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi & y.hi;
+ r.lo = x.lo & y.lo;
+ return r;
+}
+
+/* Return X | Y. */
+static inline u64
+u64or (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi | y.hi;
+ r.lo = x.lo | y.lo;
+ return r;
+}
+
+/* Return X ^ Y. */
+static inline u64
+u64xor (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi ^ y.hi;
+ r.lo = x.lo ^ y.lo;
+ return r;
+}
+
+/* Return X + Y. */
+static inline u64
+u64plus (u64 x, u64 y)
+{
+ u64 r;
+ r.lo = x.lo + y.lo;
+ r.hi = x.hi + y.hi + (r.lo < x.lo);
+ return r;
+}
+
+/* Return X << N. */
+static inline u64
+u64shl (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = (x.hi << n) | (x.lo >> (32 - n));
+ r.lo = x.lo << n;
+ }
+ else
+ {
+ r.hi = x.lo << (n - 32);
+ r.lo = 0;
+ }
+ return r;
+}
+
+/* Return X >> N. */
+static inline u64
+u64shr (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = x.hi >> n;
+ r.lo = (x.hi << (32 - n)) | (x.lo >> n);
+ }
+ else
+ {
+ r.hi = 0;
+ r.lo = x.hi >> (n - 32);
+ }
+ return r;
+}
+
+#endif
diff --git a/gnulib/lib/uinttostr.c b/gnulib/lib/uinttostr.c
new file mode 100644
index 0000000..48fd98f
--- /dev/null
+++ b/gnulib/lib/uinttostr.c
@@ -0,0 +1,3 @@
+#define anytostr uinttostr
+#define inttype unsigned int
+#include "anytostr.c"
diff --git a/gnulib/lib/umaxtostr.c b/gnulib/lib/umaxtostr.c
new file mode 100644
index 0000000..f95bfc3
--- /dev/null
+++ b/gnulib/lib/umaxtostr.c
@@ -0,0 +1,3 @@
+#define anytostr umaxtostr
+#define inttype uintmax_t
+#include "anytostr.c"
diff --git a/gnulib/lib/uname.c b/gnulib/lib/uname.c
new file mode 100644
index 0000000..226a2b4
--- /dev/null
+++ b/gnulib/lib/uname.c
@@ -0,0 +1,268 @@
+/* uname replacement.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/utsname.h>
+
+/* This file provides an implementation only for the native Windows API. */
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <windows.h>
+
+/* Mingw headers don't have all the platform codes. */
+#ifndef VER_PLATFORM_WIN32_CE
+# define VER_PLATFORM_WIN32_CE 3
+#endif
+
+/* Some headers don't have all the processor architecture codes. */
+#ifndef PROCESSOR_ARCHITECTURE_AMD64
+# define PROCESSOR_ARCHITECTURE_AMD64 9
+#endif
+#ifndef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
+# define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10
+#endif
+
+/* Mingw headers don't have the latest processor codes. */
+#ifndef PROCESSOR_AMD_X8664
+# define PROCESSOR_AMD_X8664 8664
+#endif
+
+int
+uname (struct utsname *buf)
+{
+ OSVERSIONINFO version;
+ OSVERSIONINFOEX versionex;
+ BOOL have_versionex; /* indicates whether versionex is filled */
+ const char *super_version;
+
+ /* Preparation: Fill version and, if possible, also versionex.
+ But try to call GetVersionEx only once in the common case. */
+ versionex.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
+ have_versionex = GetVersionEx ((OSVERSIONINFO *) &versionex);
+ if (have_versionex)
+ {
+ /* We know that OSVERSIONINFO is a subset of OSVERSIONINFOEX. */
+ memcpy (&version, &versionex, sizeof (OSVERSIONINFO));
+ }
+ else
+ {
+ version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+ if (!GetVersionEx (&version))
+ abort ();
+ }
+
+ /* Fill in nodename. */
+ if (gethostname (buf->nodename, sizeof (buf->nodename)) < 0)
+ strcpy (buf->nodename, "localhost");
+
+ /* Determine major-major Windows version. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* Windows NT or newer. */
+ super_version = "NT";
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows CE or Embedded CE. */
+ super_version = "CE";
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
+ {
+ /* Windows 95/98/ME. */
+ switch (version.dwMinorVersion)
+ {
+ case 0:
+ super_version = "95";
+ break;
+ case 10:
+ super_version = "98";
+ break;
+ case 90:
+ super_version = "ME";
+ break;
+ default:
+ super_version = "";
+ break;
+ }
+ }
+ else
+ super_version = "";
+
+ /* Fill in sysname. */
+#ifdef __MINGW32__
+ /* Returns a string compatible with the MSYS uname.exe program,
+ so that no further changes are needed to GNU config.guess.
+ For example,
+ $ ./uname.exe -s => MINGW32_NT-5.1
+ */
+ sprintf (buf->sysname, "MINGW32_%s-%u.%u", super_version,
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+#else
+ sprintf (buf->sysname, "Windows%s", super_version);
+#endif
+
+ /* Fill in release, version. */
+ /* The MSYS uname.exe programs uses strings from a modified Cygwin runtime:
+ $ ./uname.exe -r => 1.0.11(0.46/3/2)
+ $ ./uname.exe -v => 2008-08-25 23:40
+ There is no point in imitating this behaviour. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* Windows NT or newer. */
+ struct windows_version
+ {
+ int major;
+ int minor;
+ unsigned int server_offset;
+ const char *name;
+ };
+
+ /* Storing the workstation and server version names in a single
+ stream does not waste memory when they are the same. These
+ macros abstract the representation. VERSION1 is used if
+ version.wProductType does not matter, VERSION2 if it does. */
+ #define VERSION1(major, minor, name) \
+ { major, minor, 0, name }
+ #define VERSION2(major, minor, workstation, server) \
+ { major, minor, sizeof workstation, workstation "\0" server }
+ static const struct windows_version versions[] =
+ {
+ VERSION2 (3, -1, "Windows NT Workstation", "Windows NT Server"),
+ VERSION2 (4, -1, "Windows NT Workstation", "Windows NT Server"),
+ VERSION1 (5, 0, "Windows 2000"),
+ VERSION1 (5, 1, "Windows XP"),
+ VERSION1 (5, 2, "Windows Server 2003"),
+ VERSION2 (6, 0, "Windows Vista", "Windows Server 2008"),
+ VERSION2 (6, 1, "Windows 7", "Windows Server 2008 R2"),
+ VERSION2 (-1, -1, "Windows", "Windows Server")
+ };
+ const char *base;
+ const struct windows_version *v = versions;
+
+ /* Find a version that matches ours. The last element is a
+ wildcard that always ends the loop. */
+ while ((v->major != version.dwMajorVersion && v->major != -1)
+ || (v->minor != version.dwMinorVersion && v->minor != -1))
+ v++;
+
+ if (have_versionex && versionex.wProductType != VER_NT_WORKSTATION)
+ base = v->name + v->server_offset;
+ else
+ base = v->name;
+ if (v->major == -1 || v->minor == -1)
+ sprintf (buf->release, "%s %u.%u",
+ base,
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+ else
+ strcpy (buf->release, base);
+ }
+ else if (version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows CE or Embedded CE. */
+ sprintf (buf->release, "Windows CE %u.%u",
+ (unsigned int) version.dwMajorVersion,
+ (unsigned int) version.dwMinorVersion);
+ }
+ else
+ {
+ /* Windows 95/98/ME. */
+ sprintf (buf->release, "Windows %s", super_version);
+ }
+ strcpy (buf->version, version.szCSDVersion);
+
+ /* Fill in machine. */
+ {
+ SYSTEM_INFO info;
+
+ GetSystemInfo (&info);
+ /* Check for Windows NT or CE, since the info.wProcessorLevel is
+ garbage on Windows 95. */
+ if (version.dwPlatformId == VER_PLATFORM_WIN32_NT
+ || version.dwPlatformId == VER_PLATFORM_WIN32_CE)
+ {
+ /* Windows NT or newer, or Windows CE or Embedded CE. */
+ switch (info.wProcessorArchitecture)
+ {
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ strcpy (buf->machine, "x86_64");
+ break;
+ case PROCESSOR_ARCHITECTURE_IA64:
+ strcpy (buf->machine, "ia64");
+ break;
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ strcpy (buf->machine, "i386");
+ if (info.wProcessorLevel >= 3)
+ buf->machine[1] =
+ '0' + (info.wProcessorLevel <= 6 ? info.wProcessorLevel : 6);
+ break;
+ case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
+ strcpy (buf->machine, "i686");
+ break;
+ case PROCESSOR_ARCHITECTURE_MIPS:
+ strcpy (buf->machine, "mips");
+ break;
+ case PROCESSOR_ARCHITECTURE_ALPHA:
+ case PROCESSOR_ARCHITECTURE_ALPHA64:
+ strcpy (buf->machine, "alpha");
+ break;
+ case PROCESSOR_ARCHITECTURE_PPC:
+ strcpy (buf->machine, "powerpc");
+ break;
+ case PROCESSOR_ARCHITECTURE_SHX:
+ strcpy (buf->machine, "sh");
+ break;
+ case PROCESSOR_ARCHITECTURE_ARM:
+ strcpy (buf->machine, "arm");
+ break;
+ default:
+ strcpy (buf->machine, "unknown");
+ break;
+ }
+ }
+ else
+ {
+ /* Windows 95/98/ME. */
+ switch (info.dwProcessorType)
+ {
+ case PROCESSOR_AMD_X8664:
+ strcpy (buf->machine, "x86_64");
+ break;
+ case PROCESSOR_INTEL_IA64:
+ strcpy (buf->machine, "ia64");
+ break;
+ default:
+ if (info.dwProcessorType % 100 == 86)
+ sprintf (buf->machine, "i%u",
+ (unsigned int) info.dwProcessorType);
+ else
+ strcpy (buf->machine, "unknown");
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/gnulib/lib/unicase.in.h b/gnulib/lib/unicase.in.h
new file mode 100644
index 0000000..fb88906
--- /dev/null
+++ b/gnulib/lib/unicase.in.h
@@ -0,0 +1,457 @@
+/* Unicode character case mappings.
+ Copyright (C) 2002, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICASE_H
+#define _UNICASE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get uninorm_t. */
+#include "uninorm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Character case mappings.
+ These mappings are locale and context independent.
+ WARNING! These functions are not sufficient for languages such as German.
+ Better use the functions below that treat an entire string at once and are
+ language aware. */
+
+/* Return the uppercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_toupper (ucs4_t uc);
+
+/* Return the lowercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_tolower (ucs4_t uc);
+
+/* Return the titlecase mapping of a Unicode character. */
+extern ucs4_t
+ uc_totitle (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* String case mappings. */
+
+/* These functions are locale dependent. The iso639_language argument
+ identifies the language (e.g. "tr" for Turkish). NULL means to use
+ locale independent case mappings. */
+
+/* Return the ISO 639 language code of the current locale.
+ Return "" if it is unknown, or in the "C" locale. */
+extern const char *
+ uc_locale_language (void);
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+/* Return the uppercase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_toupper (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_toupper (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_toupper (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the lowercase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_tolower (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_tolower (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the titlecase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_totitle (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_totitle (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_totitle (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* The case-mapping context given by a prefix string. */
+typedef struct casing_prefix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t last_char_except_ignorable;
+ uint32_t last_char_normal_or_above;
+ }
+ casing_prefix_context_t;
+/* The case-mapping context of the empty prefix string. */
+extern const casing_prefix_context_t unicase_empty_prefix_context;
+/* Return the case-mapping context of a given prefix string. */
+extern casing_prefix_context_t
+ u8_casing_prefix_context (const uint8_t *s, size_t n);
+extern casing_prefix_context_t
+ u16_casing_prefix_context (const uint16_t *s, size_t n);
+extern casing_prefix_context_t
+ u32_casing_prefix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the prefix concat(A, S), given the
+ case-mapping context of the prefix A. */
+extern casing_prefix_context_t
+ u8_casing_prefixes_context (const uint8_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u16_casing_prefixes_context (const uint16_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u32_casing_prefixes_context (const uint32_t *s, size_t n,
+ casing_prefix_context_t a_context);
+
+/* The case-mapping context given by a suffix string. */
+typedef struct casing_suffix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t first_char_except_ignorable;
+ uint32_t bits;
+ }
+ casing_suffix_context_t;
+/* The case-mapping context of the empty suffix string. */
+extern const casing_suffix_context_t unicase_empty_suffix_context;
+/* Return the case-mapping context of a given suffix string. */
+extern casing_suffix_context_t
+ u8_casing_suffix_context (const uint8_t *s, size_t n);
+extern casing_suffix_context_t
+ u16_casing_suffix_context (const uint16_t *s, size_t n);
+extern casing_suffix_context_t
+ u32_casing_suffix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the suffix concat(S, A), given the
+ case-mapping context of the suffix A. */
+extern casing_suffix_context_t
+ u8_casing_suffixes_context (const uint8_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u16_casing_suffixes_context (const uint16_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u32_casing_suffixes_context (const uint32_t *s, size_t n,
+ casing_suffix_context_t a_context);
+
+/* Return the uppercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_toupper (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_toupper (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_toupper (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the lowercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_tolower (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_tolower (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_tolower (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the titlecase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_totitle (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_totitle (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_totitle (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Return the case folded string.
+ Comparing uN_casefold (S1) and uN_casefold (S2) with uN_cmp2() is equivalent
+ to comparing S1 and S2 with uN_casecmp().
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_casefold (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_casefold (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_casefold (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+/* Likewise, for a string that is surrounded by a prefix and a suffix. */
+extern uint8_t *
+ u8_ct_casefold (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_casefold (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_casefold (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Compare S1 and S2, ignoring differences in case and normalization.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_casecmp (const uint8_t *s1, size_t n1,
+ const uint8_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u16_casecmp (const uint16_t *s1, size_t n1,
+ const uint16_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u32_casecmp (const uint32_t *s1, size_t n1,
+ const uint32_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ ulc_casecmp (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+/* Convert the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_casexfrm (S1) and uN_casexfrm (S2) with the gnulib
+ function memcmp2() is equivalent to comparing S1 and S2 with uN_casecoll().
+ NF must be either UNINORM_NFC, UNINORM_NFKC, or NULL for no normalization. */
+extern char *
+ u8_casexfrm (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ u16_casexfrm (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ u32_casexfrm (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+extern char *
+ ulc_casexfrm (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf, char *resultbuf, size_t *lengthp);
+
+/* Compare S1 and S2, ignoring differences in case and normalization, using the
+ collation rules of the current locale.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It must be either UNINORM_NFC or UNINORM_NFKC. It can also
+ be NULL, for no normalization.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_casecoll (const uint8_t *s1, size_t n1,
+ const uint8_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u16_casecoll (const uint16_t *s1, size_t n1,
+ const uint16_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u32_casecoll (const uint32_t *s1, size_t n1,
+ const uint32_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ ulc_casecoll (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+
+/* Set *RESULTP to true if mapping NFD(S) to upper case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_uppercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_uppercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_uppercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to lower case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_lowercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_lowercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_lowercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to title case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_titlecase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_titlecase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_titlecase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if applying case folding to NFD(S) is a no-op, or to
+ false otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_casefolded (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_casefolded (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_casefolded (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if case matters for S, that is, if mapping NFD(S) to
+ either upper case or lower case or title case is not a no-op.
+ Set *RESULTP to false if NFD(S) maps to itself under the upper case mapping,
+ under the lower case mapping, and under the title case mapping; in other
+ words, when NFD(S) consists entirely of caseless characters.
+ Upon failure, return -1 with errno set. */
+extern int
+ u8_is_cased (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_cased (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_cased (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICASE_H */
diff --git a/gnulib/lib/unicase/cased.c b/gnulib/lib/unicase/cased.c
new file mode 100644
index 0000000..1966a2a
--- /dev/null
+++ b/gnulib/lib/unicase/cased.c
@@ -0,0 +1,53 @@
+/* Test whether a Unicode character is cased.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "cased" if it has the Lowercase
+ or Uppercase property or has a General_Category value of
+ Titlecase_Letter. */
+
+#if 0
+
+#include "unictype.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return (uc_is_property_lowercase (uc)
+ || uc_is_property_uppercase (uc)
+ || uc_is_general_category (uc, UC_TITLECASE_LETTER));
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_cased table. */
+#include "cased.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_cased, uc);
+}
+
+#endif
diff --git a/gnulib/lib/unicase/cased.h b/gnulib/lib/unicase/cased.h
new file mode 100644
index 0000000..06bf66c
--- /dev/null
+++ b/gnulib/lib/unicase/cased.h
@@ -0,0 +1,343 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[15 << 4];
+ }
+u_casing_property_cased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CCF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x007FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0xFFFFFFFF,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000378FF, 0x000003FF, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unicase/casefold.h b/gnulib/lib/unicase/casefold.h
new file mode 100644
index 0000000..31e94b1
--- /dev/null
+++ b/gnulib/lib/unicase/casefold.h
@@ -0,0 +1,22 @@
+/* Casefolding of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "unitypes.h"
+
+/* Return the casefold mapping of a Unicode character. */
+extern ucs4_t
+ uc_tocasefold (ucs4_t uc);
diff --git a/gnulib/lib/unicase/caseprop.h b/gnulib/lib/unicase/caseprop.h
new file mode 100644
index 0000000..ecc9f09
--- /dev/null
+++ b/gnulib/lib/unicase/caseprop.h
@@ -0,0 +1,32 @@
+/* Case related properties of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include "unitypes.h"
+
+/* Determine whether a character is "cased" according to the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D120. */
+extern bool
+ uc_is_cased (ucs4_t uc);
+
+/* Determine whether a character is "case-ignorable"
+ according to the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D121. */
+extern bool
+ uc_is_case_ignorable (ucs4_t uc);
diff --git a/gnulib/lib/unicase/context.h b/gnulib/lib/unicase/context.h
new file mode 100644
index 0000000..8212f2e
--- /dev/null
+++ b/gnulib/lib/unicase/context.h
@@ -0,0 +1,65 @@
+/* Case-mapping contexts of UTF-8/UTF-16/UTF-32 substring.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* The context of a prefix string combines the information of the "Before C"
+ conditions of the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_prefix_context_t contains the following fields:
+
+ // Helper for evaluating the FINAL_SIGMA condition:
+ // Last character that was not case-ignorable.
+ ucs4_t last_char_except_ignorable;
+
+ // Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ // Last character that was of combining class 230 ("Above") or 0.
+ ucs4_t last_char_normal_or_above;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased and uc_is_property_soft_dotted
+ ahead of time, more often than actually needed. */
+
+
+/* The context of a suffix string combines the information of the "After C"
+ conditions of the Unicode Standard,
+ <http://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_suffix_context_t contains the following fields:
+
+ // For evaluating the FINAL_SIGMA condition:
+ // First character that was not case-ignorable.
+ ucs4_t first_char_except_ignorable;
+
+ // For evaluating the MORE_ABOVE condition:
+ // Bit 0 is set if the suffix contains a character of combining class
+ // 230 (Above) with no character of combining class 0 or 230 (Above)
+ // before it.
+ //
+ // For evaluating the BEFORE_DOT condition:
+ // Bit 1 is set if the suffix contains a COMBINING DOT ABOVE (U+0307)
+ // with no character of combining class 0 or 230 (Above) before it.
+ //
+ uint32_t bits;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased ahead of time, more often than
+ actually needed. */
+#define SCC_MORE_ABOVE_MASK 1
+#define SCC_BEFORE_DOT_MASK 2
diff --git a/gnulib/lib/unicase/empty-prefix-context.c b/gnulib/lib/unicase/empty-prefix-context.c
new file mode 100644
index 0000000..5e0a640
--- /dev/null
+++ b/gnulib/lib/unicase/empty-prefix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty prefix string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_prefix_context_t unicase_empty_prefix_context =
+ {
+ 0xFFFD /* last_char_except_ignorable */,
+ 0xFFFD /* last_char_normal_or_above */
+ };
diff --git a/gnulib/lib/unicase/empty-suffix-context.c b/gnulib/lib/unicase/empty-suffix-context.c
new file mode 100644
index 0000000..de772a3
--- /dev/null
+++ b/gnulib/lib/unicase/empty-suffix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty suffix string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_suffix_context_t unicase_empty_suffix_context =
+ {
+ 0xFFFD /* first_char_except_ignorable */,
+ 0 /* bits */
+ };
diff --git a/gnulib/lib/unicase/ignorable.c b/gnulib/lib/unicase/ignorable.c
new file mode 100644
index 0000000..4dcc553
--- /dev/null
+++ b/gnulib/lib/unicase/ignorable.c
@@ -0,0 +1,71 @@
+/* Test whether a Unicode character is case-ignorable.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "case-ignorable" if it has the
+ value MidLetter {or the value MidNumLet} for the Word_Break property or
+ its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me),
+ Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+ The text marked in braces was added in Unicode 5.1.0, see
+ <http://www.unicode.org/versions/Unicode5.1.0/> section "Update of
+ Definition of case-ignorable". */
+/* Since this predicate is only used for the "Before C" and "After C"
+ conditions of FINAL_SIGMA, we exclude the "cased" characters here.
+ This simplifies the evaluation of the regular expressions
+ \p{cased} (\p{case-ignorable})* C
+ and
+ C (\p{case-ignorable})* \p{cased}
+ */
+
+#if 0
+
+#include "unictype.h"
+#include "uniwbrk.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ int wbp = uc_wordbreak_property (uc);
+
+ return (wbp == WBP_MIDLETTER || wbp == WBP_MIDNUMLET
+ || uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_Mn
+ | UC_CATEGORY_MASK_Me
+ | UC_CATEGORY_MASK_Cf
+ | UC_CATEGORY_MASK_Lm
+ | UC_CATEGORY_MASK_Sk))
+ && !uc_is_cased (uc);
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_case_ignorable table. */
+#include "ignorable.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_case_ignorable, uc);
+}
+
+#endif
diff --git a/gnulib/lib/unicase/ignorable.h b/gnulib/lib/unicase/ignorable.h
new file mode 100644
index 0000000..810f52a
--- /dev/null
+++ b/gnulib/lib/unicase/ignorable.h
@@ -0,0 +1,552 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[32 << 4];
+ }
+u_casing_property_case_ignorable =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 464,
+ 16 + 384 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x04004080, 0x40000000, 0x00000001,
+ 0x00000000, 0x0190A100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0xFFFFFFFC, 0xFFFFFFE0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFDF, 0x0030FFFF,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00100000,
+ 0x07FF000F, 0x00000000, 0xFFFFF801, 0x00010000,
+ 0x00000000, 0x00000000, 0xBFC00000, 0x00003DFF,
+ 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800,
+ 0xFFC00000, 0x00003FFF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0x14000000, 0x00FE21FE, 0x0002000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00003040, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007FC0, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F40, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x20002064, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3FB00000, 0x208FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x7F400000, 0x9FF81FE5,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x0003A340,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x0300F800, 0x00007C90, 0x00000000, 0x8002FC1F,
+ 0x1FE00000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80008000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x083EFC00, 0x00000000, 0x00000000,
+ 0x7E000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0xB0078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000700, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000007, 0x13C80000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00010000,
+ 0x00000000, 0xC19D0000, 0x20000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002120,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000,
+ 0x0008FFFF, 0x0000007F, 0x00240000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x04004080, 0x40000000, 0x00000001, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x0E000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000003, 0x26780000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF80380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unicase/invariant.h b/gnulib/lib/unicase/invariant.h
new file mode 100644
index 0000000..abf7085
--- /dev/null
+++ b/gnulib/lib/unicase/invariant.h
@@ -0,0 +1,45 @@
+/* Internal functions for Unicode character case mappings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "uninorm.h"
+
+/* Return true if mapping NFD(S) to via MAPPING is a no-op. */
+extern int
+ u8_is_invariant (const uint8_t *s, size_t n,
+ uint8_t * (*mapping) (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_invariant (const uint16_t *s, size_t n,
+ uint16_t * (*mapping) (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_invariant (const uint32_t *s, size_t n,
+ uint32_t * (*mapping) (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp);
diff --git a/gnulib/lib/unicase/locale-language.c b/gnulib/lib/unicase/locale-language.c
new file mode 100644
index 0000000..c1491e2
--- /dev/null
+++ b/gnulib/lib/unicase/locale-language.c
@@ -0,0 +1,55 @@
+/* Language code of current locale.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include "localename.h"
+
+#include "unicase/locale-languages.h"
+
+const char *
+uc_locale_language (void)
+{
+ const char *locale_name = gl_locale_name (LC_CTYPE, "LC_CTYPE");
+ const char *p;
+
+ /* Find the end of the language portion. */
+ p = locale_name;
+ while (*p != '\0' && *p != '_' && *p != '.' && *p != '@')
+ p++;
+
+ /* Return a statically allocated pointer to the language portion, so that the
+ caller of this function does not need to free() the result.
+ We could use a dynamically built unification table. But given that the
+ set of possible languages is small, it is easier (and excludes ENOMEM
+ error conditions) to allocate the unification table statically. */
+ if (p != locale_name)
+ {
+ const char *language =
+ uc_locale_languages_lookup (locale_name, p - locale_name);
+ if (language != NULL)
+ return language;
+ }
+
+ return "";
+}
diff --git a/gnulib/lib/unicase/locale-languages.gperf b/gnulib/lib/unicase/locale-languages.gperf
new file mode 100644
index 0000000..da0d94e
--- /dev/null
+++ b/gnulib/lib/unicase/locale-languages.gperf
@@ -0,0 +1,270 @@
+%language=ANSI-C
+%define hash-function-name uc_locale_language_hash
+%define lookup-function-name uc_locale_languages_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%pic
+/* List of languages taken from gettext/gettext-tools/src/lang-table.c
+ on 2009-02-07. */
+%%
+"aa", /* Afar" */
+"ab", /* Abkhazian" */
+"ace", /* Achinese" */
+"ae", /* Avestan" */
+"af", /* Afrikaans" */
+"ak", /* Akan" */
+"am", /* Amharic" */
+"an", /* Aragonese" */
+"ang", /* Old English" */
+"ar", /* Arabic" */
+"as", /* Assamese" */
+"ast", /* Asturian" */
+"av", /* Avaric" */
+"awa", /* Awadhi" */
+"ay", /* Aymara" */
+"az", /* Azerbaijani" */
+"ba", /* Bashkir" */
+"bal", /* Baluchi" */
+"ban", /* Balinese" */
+"be", /* Belarusian" */
+"bej", /* Beja" */
+"bem", /* Bemba" */
+"bg", /* Bulgarian" */
+"bh", /* Bihari" */
+"bho", /* Bhojpuri" */
+"bi", /* Bislama" */
+"bik", /* Bikol" */
+"bin", /* Bini" */
+"bm", /* Bambara" */
+"bn", /* Bengali" */
+"bo", /* Tibetan" */
+"br", /* Breton" */
+"bs", /* Bosnian" */
+"bug", /* Buginese" */
+"ca", /* Catalan" */
+"ce", /* Chechen" */
+"ceb", /* Cebuano" */
+"ch", /* Chamorro" */
+"co", /* Corsican" */
+"cr", /* Cree" */
+"crh", /* Crimean Tatar" */
+"cs", /* Czech" */
+"csb", /* Kashubian" */
+"cu", /* Church Slavic" */
+"cv", /* Chuvash" */
+"cy", /* Welsh" */
+"da", /* Danish" */
+"de", /* German" */
+"din", /* Dinka" */
+"doi", /* Dogri" */
+"dv", /* Divehi" */
+"dz", /* Dzongkha" */
+"ee", /* Ewe" */
+"el", /* Greek" */
+"en", /* English" */
+"eo", /* Esperanto" */
+"es", /* Spanish" */
+"et", /* Estonian" */
+"eu", /* Basque" */
+"fa", /* Persian" */
+"ff", /* Fulah" */
+"fi", /* Finnish" */
+"fil", /* Filipino" */
+"fj", /* Fijian" */
+"fo", /* Faroese" */
+"fon", /* Fon" */
+"fr", /* French" */
+"fur", /* Friulian" */
+"fy", /* Western Frisian" */
+"ga", /* Irish" */
+"gd", /* Scottish Gaelic" */
+"gl", /* Galician" */
+"gn", /* Guarani" */
+"gon", /* Gondi" */
+"gsw", /* Swiss German" */
+"gu", /* Gujarati" */
+"gv", /* Manx" */
+"ha", /* Hausa" */
+"he", /* Hebrew" */
+"hi", /* Hindi" */
+"hil", /* Hiligaynon" */
+"hmn", /* Hmong" */
+"ho", /* Hiri Motu" */
+"hr", /* Croatian" */
+"ht", /* Haitian" */
+"hu", /* Hungarian" */
+"hy", /* Armenian" */
+"hz", /* Herero" */
+"ia", /* Interlingua" */
+"id", /* Indonesian" */
+"ie", /* Interlingue" */
+"ig", /* Igbo" */
+"ii", /* Sichuan Yi" */
+"ik", /* Inupiak" */
+"ilo", /* Iloko" */
+"is", /* Icelandic" */
+"it", /* Italian" */
+"iu", /* Inuktitut" */
+"ja", /* Japanese" */
+"jab", /* Hyam" */
+"jv", /* Javanese" */
+"ka", /* Georgian" */
+"kab", /* Kabyle" */
+"kaj", /* Jju" */
+"kam", /* Kamba" */
+"kbd", /* Kabardian" */
+"kcg", /* Tyap" */
+"kdm", /* Kagoma" */
+"kg", /* Kongo" */
+"ki", /* Kikuyu" */
+"kj", /* Kuanyama" */
+"kk", /* Kazakh" */
+"kl", /* Kalaallisut" */
+"km", /* Central Khmer" */
+"kmb", /* Kimbundu" */
+"kn", /* Kannada" */
+"ko", /* Korean" */
+"kr", /* Kanuri" */
+"kru", /* Kurukh" */
+"ks", /* Kashmiri" */
+"ku", /* Kurdish" */
+"kv", /* Komi" */
+"kw", /* Cornish" */
+"ky", /* Kirghiz" */
+"kok", /* Konkani" */
+"la", /* Latin" */
+"lb", /* Letzeburgesch" */
+"lg", /* Ganda" */
+"li", /* Limburgish" */
+"ln", /* Lingala" */
+"lo", /* Laotian" */
+"lt", /* Lithuanian" */
+"lu", /* Luba-Katanga" */
+"lua", /* Luba-Lulua" */
+"luo", /* Luo" */
+"lv", /* Latvian" */
+"mad", /* Madurese" */
+"mag", /* Magahi" */
+"mai", /* Maithili" */
+"mak", /* Makasar" */
+"man", /* Mandingo" */
+"men", /* Mende" */
+"mg", /* Malagasy" */
+"mh", /* Marshallese" */
+"mi", /* Maori" */
+"min", /* Minangkabau" */
+"mk", /* Macedonian" */
+"ml", /* Malayalam" */
+"mn", /* Mongolian" */
+"mni", /* Manipuri" */
+"mo", /* Moldavian" */
+"mos", /* Mossi" */
+"mr", /* Marathi" */
+"ms", /* Malay" */
+"mt", /* Maltese" */
+"mwr", /* Marwari" */
+"my", /* Burmese" */
+"myn", /* Mayan" */
+"na", /* Nauru" */
+"nap", /* Neapolitan" */
+"nah", /* Nahuatl" */
+"nb", /* Norwegian Bokmal" */
+"nd", /* North Ndebele" */
+"nds", /* Low Saxon" */
+"ne", /* Nepali" */
+"ng", /* Ndonga" */
+"nl", /* Dutch" */
+"nn", /* Norwegian Nynorsk" */
+"no", /* Norwegian" */
+"nr", /* South Ndebele" */
+"nso", /* Northern Sotho" */
+"nv", /* Navajo" */
+"ny", /* Nyanja" */
+"nym", /* Nyamwezi" */
+"nyn", /* Nyankole" */
+"oc", /* Occitan" */
+"oj", /* Ojibwa" */
+"om", /* (Afan) Oromo" */
+"or", /* Oriya" */
+"os", /* Ossetian" */
+"pa", /* Punjabi" */
+"pag", /* Pangasinan" */
+"pam", /* Pampanga" */
+"pap", /* Papiamento" */
+"pbb", /* Páez" */
+"pi", /* Pali" */
+"pl", /* Polish" */
+"ps", /* Pashto" */
+"pt", /* Portuguese" */
+"qu", /* Quechua" */
+"raj", /* Rajasthani" */
+"rm", /* Romansh" */
+"rn", /* Kirundi" */
+"ro", /* Romanian" */
+"ru", /* Russian" */
+"rw", /* Kinyarwanda" */
+"sa", /* Sanskrit" */
+"sas", /* Sasak" */
+"sat", /* Santali" */
+"sc", /* Sardinian" */
+"scn", /* Sicilian" */
+"sd", /* Sindhi" */
+"se", /* Northern Sami" */
+"sg", /* Sango" */
+"shn", /* Shan" */
+"si", /* Sinhala" */
+"sid", /* Sidamo" */
+"sk", /* Slovak" */
+"sl", /* Slovenian" */
+"sm", /* Samoan" */
+"sn", /* Shona" */
+"so", /* Somali" */
+"sq", /* Albanian" */
+"sr", /* Serbian" */
+"srr", /* Serer" */
+"ss", /* Siswati" */
+"st", /* Sesotho" */
+"su", /* Sundanese" */
+"suk", /* Sukuma" */
+"sus", /* Susu" */
+"sv", /* Swedish" */
+"sw", /* Swahili" */
+"ta", /* Tamil" */
+"te", /* Telugu" */
+"tem", /* Timne" */
+"tet", /* Tetum" */
+"tg", /* Tajik" */
+"th", /* Thai" */
+"ti", /* Tigrinya" */
+"tiv", /* Tiv" */
+"tk", /* Turkmen" */
+"tl", /* Tagalog" */
+"tn", /* Setswana" */
+"to", /* Tonga" */
+"tr", /* Turkish" */
+"ts", /* Tsonga" */
+"tt", /* Tatar" */
+"tum", /* Tumbuka" */
+"tw", /* Twi" */
+"ty", /* Tahitian" */
+"ug", /* Uighur" */
+"uk", /* Ukrainian" */
+"umb", /* Umbundu" */
+"ur", /* Urdu" */
+"uz", /* Uzbek" */
+"ve", /* Venda" */
+"vi", /* Vietnamese" */
+"vo", /* Volapuk" */
+"wal", /* Walamo" */
+"war", /* Waray" */
+"wen", /* Sorbian" */
+"wo", /* Wolof" */
+"xh", /* Xhosa" */
+"yao", /* Yao" */
+"yi", /* Yiddish" */
+"yo", /* Yoruba" */
+"za", /* Zhuang" */
+"zh", /* Chinese" */
+"zu", /* Zulu" */
+"zap", /* Zapotec" */
diff --git a/gnulib/lib/unicase/simple-mapping.h b/gnulib/lib/unicase/simple-mapping.h
new file mode 100644
index 0000000..4a5ab0e
--- /dev/null
+++ b/gnulib/lib/unicase/simple-mapping.h
@@ -0,0 +1,39 @@
+/* Simple case mapping for Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ucs4_t
+FUNC (ucs4_t uc)
+{
+ unsigned int index1 = uc >> mapping_header_0;
+ if (index1 < mapping_header_1)
+ {
+ int lookup1 = u_mapping.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> mapping_header_2) & mapping_header_3;
+ int lookup2 = u_mapping.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & mapping_header_4);
+ int lookup3 = u_mapping.level3[lookup2 + index3];
+
+ return uc + lookup3;
+ }
+ }
+ }
+ return uc;
+}
diff --git a/gnulib/lib/unicase/special-casing-table.gperf b/gnulib/lib/unicase/special-casing-table.gperf
new file mode 100644
index 0000000..f77662e
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing-table.gperf
@@ -0,0 +1,136 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Special casing rules of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+struct special_casing_rule { char code[3]; };
+%struct-type
+%language=ANSI-C
+%define slot-name code
+%define hash-function-name gl_unicase_special_hash
+%define lookup-function-name gl_unicase_special_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%omit-struct-type
+%%
+"\x00\x49\x00", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x49\x01", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x02", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x03", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x04", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x4a\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 }
+"\x00\x69\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x69\x01", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\xcc\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 }
+"\x00\xcd\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 }
+"\x00\xdf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 }
+"\x01\x28\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 }
+"\x01\x2e\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 }
+"\x01\x30\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x01", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x02", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }
+"\x01\x49\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 }
+"\x01\xf0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 }
+"\x03\x07\x00", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x01", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x02", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x03\xa3\x00", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 }
+"\x03\xb0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x05\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 }
+"\x1e\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 }
+"\x1e\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 }
+"\x1e\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 }
+"\x1e\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 }
+"\x1e\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 }
+"\x1e\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 }
+"\x1f\x50\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 }
+"\x1f\x52\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 }
+"\x1f\x54\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 }
+"\x1f\x56\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 }
+"\x1f\x80\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x81\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x82\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x83\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x84\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x85\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x86\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x88\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x89\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x8a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x8b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x8c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x8d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x8e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x8f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x91\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x92\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x93\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x94\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x95\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x9b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x9c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x9d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x9f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\xa0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa1\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xa2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xa3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xa4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xa5\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xa6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xa7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xa8\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa9\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xaa\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xab\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xac\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xad\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xae\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xaf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xb2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 }
+"\x1f\xb3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xb4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 }
+"\x1f\xb6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 }
+"\x1f\xb7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 }
+"\x1f\xbc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xc2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 }
+"\x1f\xc3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xc4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 }
+"\x1f\xc6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 }
+"\x1f\xc7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 }
+"\x1f\xcc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xd2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 }
+"\x1f\xd3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x1f\xd6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 }
+"\x1f\xd7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 }
+"\x1f\xe2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 }
+"\x1f\xe3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x1f\xe4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 }
+"\x1f\xe6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 }
+"\x1f\xe7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 }
+"\x1f\xf2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 }
+"\x1f\xf3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\x1f\xf4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 }
+"\x1f\xf6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 }
+"\x1f\xf7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 }
+"\x1f\xfc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\xfb\x00\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 }
+"\xfb\x01\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 }
+"\xfb\x02\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 }
+"\xfb\x03\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 }
+"\xfb\x04\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C }
+"\xfb\x05\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x06\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x13\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 }
+"\xfb\x14\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 }
+"\xfb\x15\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 }
+"\xfb\x16\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 }
+"\xfb\x17\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 }
diff --git a/gnulib/lib/unicase/special-casing.c b/gnulib/lib/unicase/special-casing.c
new file mode 100644
index 0000000..6598ddb
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing.c
@@ -0,0 +1,25 @@
+/* Special casing table.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "special-casing.h"
+
+#include <string.h>
+
+#include "unicase/special-casing-table.h"
diff --git a/gnulib/lib/unicase/special-casing.h b/gnulib/lib/unicase/special-casing.h
new file mode 100644
index 0000000..38e74ce
--- /dev/null
+++ b/gnulib/lib/unicase/special-casing.h
@@ -0,0 +1,60 @@
+/* Special casing table.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* A special casing context.
+ A context is negated through x -> -x. */
+enum
+{
+ SCC_ALWAYS = 0,
+ SCC_FINAL_SIGMA = 1,
+ SCC_AFTER_SOFT_DOTTED = 2,
+ SCC_MORE_ABOVE = 3,
+ SCC_BEFORE_DOT = 4,
+ SCC_AFTER_I = 5
+};
+
+struct special_casing_rule
+{
+ /* The first two bytes are the code, in big-endian order. The third byte
+ only distinguishes different rules pertaining to the same code. */
+ /*unsigned*/ char code[3];
+
+ /* True when this rule is not the last one for the given code. */
+ /*bool*/ unsigned int has_next : 1;
+
+ /* Context. */
+ signed int context : 7;
+
+ /* Language, or an empty string. */
+ char language[2];
+
+ /* Mapping to upper case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short upper[3];
+
+ /* Mapping to lower case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short lower[3];
+
+ /* Mapping to title case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short title[3];
+
+ /* Casefolding mapping. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short casefold[3];
+};
+
+extern const struct special_casing_rule *
+ gl_unicase_special_lookup (const char *str, unsigned int len);
diff --git a/gnulib/lib/unicase/tocasefold.c b/gnulib/lib/unicase/tocasefold.c
new file mode 100644
index 0000000..6013de5
--- /dev/null
+++ b/gnulib/lib/unicase/tocasefold.c
@@ -0,0 +1,27 @@
+/* Casefold mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "casefold.h"
+
+/* Define u_mapping table. */
+#include "tocasefold.h"
+
+#define FUNC uc_tocasefold
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/tocasefold.h b/gnulib/lib/unicase/tocasefold.h
new file mode 100644
index 0000000..0b68f83
--- /dev/null
+++ b/gnulib/lib/unicase/tocasefold.h
@@ -0,0 +1,567 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 6.0.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[26 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, -1, 640, 768,
+ 896, 1024, 1152, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1280, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 1408, 1536, 1664, 1792,
+ -1, -1, 1920, 2048, -1, -1, -1, -1,
+ -1, 2176, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2304, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2560, 2688, 2816, 2944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3072, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3200, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 775, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -121, 1, 0, 1, 0, 1, 0, -268,
+ 0, 210, 1, 0, 1, 0, 206, 1,
+ 0, 205, 205, 1, 0, 0, 79, 202,
+ 203, 1, 0, 205, 207, 0, 211, 209,
+ 1, 0, 0, 0, 211, 213, 0, 214,
+ 1, 0, 1, 0, 1, 0, 218, 1,
+ 0, 218, 0, 0, 1, 0, 218, 1,
+ 0, 217, 217, 1, 0, 1, 0, 219,
+ 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 1, 0, 2,
+ 1, 0, 2, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 2, 1, 0, 1, 0, -97, -56,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -130, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 10795, 1, 0, -163, 10792, 0,
+ 0, 1, 0, -195, 69, 71, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 116, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0,
+ 37, 37, 37, 0, 64, 0, 63, 63,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 0, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ -30, -25, 0, 0, 0, -15, -22, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -54, -48, 0, 0, -60, -64, 0, 1,
+ 0, -7, 1, 0, 0, -130, -130, -130,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 15, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, -58, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -8, 0, -8, 0, -8, 0, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -74, -74, 0, 0, -7173, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -86, -86, -86, -86, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -100, -100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -112, -112, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -128, -128, -126, -126, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7517, 0,
+ 0, 0, -8383, -8262, 0, 0, 0, 0,
+ 0, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, -10743, -3814, -10727, 0, 0, 1,
+ 0, 1, 0, 1, 0, -10780, -10749, -10783,
+ -10782, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, -10815, -10815,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, -35332, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 1, 0, -42280, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/tolower.c b/gnulib/lib/unicase/tolower.c
new file mode 100644
index 0000000..8b42a6e
--- /dev/null
+++ b/gnulib/lib/unicase/tolower.c
@@ -0,0 +1,27 @@
+/* Lowercase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "tolower.h"
+
+#define FUNC uc_tolower
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/tolower.h b/gnulib/lib/unicase/tolower.h
new file mode 100644
index 0000000..b759903
--- /dev/null
+++ b/gnulib/lib/unicase/tolower.h
@@ -0,0 +1,567 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 6.0.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[26 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, -1, 640, 768,
+ 896, 1024, 1152, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1280, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 1408, 1536, 1664, 1792,
+ -1, -1, 1920, 2048, -1, -1, -1, -1,
+ -1, 2176, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2304, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2560, 2688, 2816, 2944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3072, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3200, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -199, 0, 1, 0, 1, 0, 1, 0,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -121, 1, 0, 1, 0, 1, 0, 0,
+ 0, 210, 1, 0, 1, 0, 206, 1,
+ 0, 205, 205, 1, 0, 0, 79, 202,
+ 203, 1, 0, 205, 207, 0, 211, 209,
+ 1, 0, 0, 0, 211, 213, 0, 214,
+ 1, 0, 1, 0, 1, 0, 218, 1,
+ 0, 218, 0, 0, 1, 0, 218, 1,
+ 0, 217, 217, 1, 0, 1, 0, 219,
+ 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 1, 0, 2,
+ 1, 0, 2, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 2, 1, 0, 1, 0, -97, -56,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -130, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 10795, 1, 0, -163, 10792, 0,
+ 0, 1, 0, -195, 69, 71, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0,
+ 37, 37, 37, 0, 64, 0, 63, 63,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 0, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, -60, 0, 0, 1,
+ 0, -7, 1, 0, 0, -130, -130, -130,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 15, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7615, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -8, 0, -8, 0, -8, 0, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -74, -74, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -86, -86, -86, -86, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -100, -100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -112, -112, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -128, -128, -126, -126, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7517, 0,
+ 0, 0, -8383, -8262, 0, 0, 0, 0,
+ 0, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, -10743, -3814, -10727, 0, 0, 1,
+ 0, 1, 0, 1, 0, -10780, -10749, -10783,
+ -10782, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, -10815, -10815,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, -35332, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 1, 0, -42280, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/totitle.c b/gnulib/lib/unicase/totitle.c
new file mode 100644
index 0000000..a9176c2
--- /dev/null
+++ b/gnulib/lib/unicase/totitle.c
@@ -0,0 +1,27 @@
+/* Titlecase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "totitle.h"
+
+#define FUNC uc_totitle
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/totitle.h b/gnulib/lib/unicase/totitle.h
new file mode 100644
index 0000000..3ccb935
--- /dev/null
+++ b/gnulib/lib/unicase/totitle.h
@@ -0,0 +1,615 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 6.0.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[29 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1536, -1, 1664, 1792, 1920, 2048,
+ -1, -1, 2176, 2304, -1, -1, -1, -1,
+ -1, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2560, 2688, 2816, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2944, 3072, 3200, 3328,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3456, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3584, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 743, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, 0,
+ -32, -32, -32, -32, -32, -32, -32, 121,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -232, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, -300,
+ 195, 0, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 97, 0, 0,
+ 0, -1, 163, 0, 0, 0, 130, 0,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, -1, 0,
+ 0, -1, 0, 0, 0, -1, 0, 56,
+ 0, 0, 0, 0, 1, 0, -1, 1,
+ 0, -1, 1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, -79, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 1, 0, -1, 0, -1, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, 0, 10815,
+ 10815, 0, -1, 0, 0, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 10783, 10780, 10782, -210, -206, 0, -205, -205,
+ 0, -202, 0, -203, 0, 0, 0, 0,
+ -205, 0, 0, -207, 0, 42280, 0, 0,
+ -209, -211, 0, 10743, 0, 0, 0, -211,
+ 0, 10749, -213, 0, 0, -214, 0, 0,
+ 0, 0, 0, 0, 0, 10727, 0, 0,
+ -218, 0, 0, -218, 0, 0, 0, 0,
+ -218, -69, -217, -217, -71, 0, 0, 0,
+ 0, 0, -219, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, 0, 0, -1,
+ 0, 0, 0, 130, 130, 130, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -38, -37, -37, -37,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -31, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -64, -63, -63, 0,
+ -62, -57, 0, 0, 0, -47, -54, -8,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ -86, -80, 7, 0, 0, -96, 0, 0,
+ -1, 0, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, -15,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35332, 0, 0, 0, 3814, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, -59, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 0, 8, 0, 8, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 74, 86, 86, 86, 86, 100, 100,
+ 128, 128, 112, 112, 126, 126, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7205, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, -1, 0, 0, 0, -10795, -10792, 0,
+ -1, 0, -1, 0, -1, 0, 0, 0,
+ 0, 0, 0, -1, 0, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, -1, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/toupper.c b/gnulib/lib/unicase/toupper.c
new file mode 100644
index 0000000..81b9ab1
--- /dev/null
+++ b/gnulib/lib/unicase/toupper.c
@@ -0,0 +1,27 @@
+/* Uppercase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "toupper.h"
+
+#define FUNC uc_toupper
+#include "simple-mapping.h"
diff --git a/gnulib/lib/unicase/toupper.h b/gnulib/lib/unicase/toupper.h
new file mode 100644
index 0000000..d8e4069
--- /dev/null
+++ b/gnulib/lib/unicase/toupper.h
@@ -0,0 +1,615 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-case.c for Unicode 6.0.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[29 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1536, -1, 1664, 1792, 1920, 2048,
+ -1, -1, 2176, 2304, -1, -1, -1, -1,
+ -1, 2432, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2560, 2688, 2816, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2944, 3072, 3200, 3328,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3456, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3584, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 743, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, 0,
+ -32, -32, -32, -32, -32, -32, -32, 121,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -232, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, -300,
+ 195, 0, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, -1, 0, 0, 97, 0, 0,
+ 0, -1, 163, 0, 0, 0, 130, 0,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ -1, 0, 0, 0, 0, -1, 0, 0,
+ -1, 0, 0, 0, -1, 0, -1, 0,
+ 0, -1, 0, 0, 0, -1, 0, 56,
+ 0, 0, 0, 0, 0, -1, -2, 0,
+ -1, -2, 0, -1, -2, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, -79, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, -2, 0, -1, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, 0, 10815,
+ 10815, 0, -1, 0, 0, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 10783, 10780, 10782, -210, -206, 0, -205, -205,
+ 0, -202, 0, -203, 0, 0, 0, 0,
+ -205, 0, 0, -207, 0, 42280, 0, 0,
+ -209, -211, 0, 10743, 0, 0, 0, -211,
+ 0, 10749, -213, 0, 0, -214, 0, 0,
+ 0, 0, 0, 0, 0, 10727, 0, 0,
+ -218, 0, 0, -218, 0, 0, 0, 0,
+ -218, -69, -217, -217, -71, 0, 0, 0,
+ 0, 0, -219, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 84, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, 0, 0, -1,
+ 0, 0, 0, 130, 130, 130, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, -38, -37, -37, -37,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -31, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -64, -63, -63, 0,
+ -62, -57, 0, 0, 0, -47, -54, -8,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ -86, -80, 7, 0, 0, -96, 0, 0,
+ -1, 0, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ -80, -80, -80, -80, -80, -80, -80, -80,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, -1, 0, -1, 0, -1, 0,
+ -1, 0, -1, 0, -1, 0, -1, -15,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35332, 0, 0, 0, 3814, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, -59, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 0, 8, 0, 8, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 74, 86, 86, 86, 86, 100, 100,
+ 128, 128, 112, 112, 126, 126, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7205, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 0, 0, 0, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ -16, -16, -16, -16, -16, -16, -16, -16,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, 0,
+ 0, -1, 0, 0, 0, -10795, -10792, 0,
+ -1, 0, -1, 0, -1, 0, 0, 0,
+ 0, 0, 0, -1, 0, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, -1, 0, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, -7264, -7264,
+ -7264, -7264, -7264, -7264, -7264, -7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, -1, 0, -1, 0, 0, -1,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, 0, 0, 0, -1, 0, 0, 0,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -1, 0, -1, 0, -1, 0, -1,
+ 0, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unicase/u-casecmp.h b/gnulib/lib/unicase/u-casecmp.h
new file mode 100644
index 0000000..1849d7d
--- /dev/null
+++ b/gnulib/lib/unicase/u-casecmp.h
@@ -0,0 +1,69 @@
+/* Case and normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const SRC_UNIT *s1, size_t n1, const SRC_UNIT *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp)
+{
+ UNIT buf1[2048 / sizeof (UNIT)];
+ UNIT buf2[2048 / sizeof (UNIT)];
+ UNIT *norms1;
+ size_t norms1_length;
+ UNIT *norms2;
+ size_t norms2_length;
+ int cmp;
+
+ /* Optimization: There is no need to do canonical composition of each string.
+ Decomposition is enough. */
+ if (nf != NULL)
+ nf = uninorm_decomposing_form (nf);
+
+ /* Case-fold and normalize S1. */
+ norms1_length = sizeof (buf1) / sizeof (UNIT);
+ norms1 = U_CASEFOLD (s1, n1, iso639_language, nf, buf1, &norms1_length);
+ if (norms1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Case-fold and normalize S2. */
+ norms2_length = sizeof (buf2) / sizeof (UNIT);
+ norms2 = U_CASEFOLD (s2, n2, iso639_language, nf, buf2, &norms2_length);
+ if (norms2 == NULL)
+ {
+ if (norms1 != buf1)
+ {
+ int saved_errno = errno;
+ free (norms1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the normalized strings. */
+ cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length);
+ if (cmp > 0)
+ cmp = 1;
+ else if (cmp < 0)
+ cmp = -1;
+
+ if (norms2 != buf2)
+ free (norms2);
+ if (norms1 != buf1)
+ free (norms1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-casecoll.h b/gnulib/lib/unicase/u-casecoll.h
new file mode 100644
index 0000000..463b6e1
--- /dev/null
+++ b/gnulib/lib/unicase/u-casecoll.h
@@ -0,0 +1,68 @@
+/* Locale dependent, case and normalization insensitive comparison of Unicode
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp)
+{
+ char buf1[2048];
+ char buf2[2048];
+ char *transformed1;
+ size_t transformed1_length;
+ char *transformed2;
+ size_t transformed2_length;
+ int cmp;
+
+ /* Normalize and transform S1. */
+ transformed1_length = sizeof (buf1);
+ transformed1 =
+ U_CASEXFRM (s1, n1, iso639_language, nf, buf1, &transformed1_length);
+ if (transformed1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize and transform S2. */
+ transformed2_length = sizeof (buf2);
+ transformed2 =
+ U_CASEXFRM (s2, n2, iso639_language, nf, buf2, &transformed2_length);
+ if (transformed2 == NULL)
+ {
+ if (transformed1 != buf1)
+ {
+ int saved_errno = errno;
+ free (transformed1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the transformed strings. */
+ cmp = memcmp2 (transformed1, transformed1_length,
+ transformed2, transformed2_length);
+ if (cmp < 0)
+ cmp = -1;
+ else if (cmp > 0)
+ cmp = 1;
+
+ if (transformed2 != buf2)
+ free (transformed2);
+ if (transformed1 != buf1)
+ free (transformed1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-casefold.h b/gnulib/lib/unicase/u-casefold.h
new file mode 100644
index 0000000..d63ffd2
--- /dev/null
+++ b/gnulib/lib/unicase/u-casefold.h
@@ -0,0 +1,28 @@
+/* Casefolding mapping for Unicode strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ return U_CT_CASEFOLD (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u-casemap.h b/gnulib/lib/unicase/u-casemap.h
new file mode 100644
index 0000000..eb5ce27
--- /dev/null
+++ b/gnulib/lib/unicase/u-casemap.h
@@ -0,0 +1,416 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+
+ /* Initialize the accumulator. */
+ if (nf != NULL || resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ /* Helper for evaluating the FINAL_SIGMA condition:
+ Last character that was not case-ignorable. */
+ ucs4_t last_char_except_ignorable =
+ prefix_context.last_char_except_ignorable;
+
+ /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ Last character that was of combining class 230 ("Above") or 0. */
+ ucs4_t last_char_normal_or_above =
+ prefix_context.last_char_normal_or_above;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ ucs4_t mapped_uc[3];
+ unsigned int mapped_count;
+
+ if (uc < 0x10000)
+ {
+ /* Look first in the special-casing table. */
+ char code[3];
+
+ code[0] = (uc >> 8) & 0xff;
+ code[1] = uc & 0xff;
+
+ for (code[2] = 0; ; code[2]++)
+ {
+ const struct special_casing_rule *rule =
+ gl_unicase_special_lookup (code, 3);
+
+ if (rule == NULL)
+ break;
+
+ /* Test if the condition applies. */
+ /* Does the language apply? */
+ if (rule->language[0] == '\0'
+ || (iso639_language != NULL
+ && iso639_language[0] == rule->language[0]
+ && iso639_language[1] == rule->language[1]))
+ {
+ /* Does the context apply? */
+ int context = rule->context;
+ bool applies;
+
+ if (context < 0)
+ context = - context;
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ applies = true;
+ break;
+
+ case SCC_FINAL_SIGMA:
+ /* "Before" condition: preceded by a sequence
+ consisting of a cased letter and a case-ignorable
+ sequence.
+ "After" condition: not followed by a sequence
+ consisting of a case-ignorable sequence and then a
+ cased letter. */
+ /* Test the "before" condition. */
+ applies = uc_is_cased (last_char_except_ignorable);
+ /* Test the "after" condition. */
+ if (applies)
+ {
+ const UNIT *s2 = s + count;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ /* Our uc_is_case_ignorable function is
+ known to return false for all cased
+ characters. So we can call
+ uc_is_case_ignorable first. */
+ if (!uc_is_case_ignorable (uc2))
+ {
+ applies = ! uc_is_cased (uc2);
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ! uc_is_cased (suffix_context.first_char_except_ignorable);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_SOFT_DOTTED:
+ /* "Before" condition: There is a Soft_Dotted character
+ before it, with no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = uc_is_property_soft_dotted (last_char_normal_or_above);
+ break;
+
+ case SCC_MORE_ABOVE:
+ /* "After" condition: followed by a character of
+ combining class 230 (Above) with no intervening
+ character of combining class 0 or 230 (Above). */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A)
+ {
+ applies = true;
+ break;
+ }
+ if (ccc == UC_CCC_NR)
+ break;
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_BEFORE_DOT:
+ /* "After" condition: followed by COMBINING DOT ABOVE
+ (U+0307). Any sequence of characters with a
+ combining class that is neither 0 nor 230 may
+ intervene between the current character and the
+ combining dot above. */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ if (uc2 == 0x0307) /* COMBINING DOT ABOVE */
+ {
+ applies = true;
+ break;
+ }
+ {
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_I:
+ /* "Before" condition: There is an uppercase I before
+ it, and there is no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = (last_char_normal_or_above == 'I');
+ break;
+
+ default:
+ abort ();
+ }
+ if (rule->context < 0)
+ applies = !applies;
+
+ if (applies)
+ {
+ /* The rule applies.
+ Look up the mapping (0 to 3 characters). */
+ const unsigned short *mapped_in_rule =
+ (const unsigned short *)((const char *)rule + offset_in_rule);
+
+ if (mapped_in_rule[0] == 0)
+ mapped_count = 0;
+ else
+ {
+ mapped_uc[0] = mapped_in_rule[0];
+ if (mapped_in_rule[1] == 0)
+ mapped_count = 1;
+ else
+ {
+ mapped_uc[1] = mapped_in_rule[1];
+ if (mapped_in_rule[2] == 0)
+ mapped_count = 2;
+ else
+ {
+ mapped_uc[2] = mapped_in_rule[2];
+ mapped_count = 3;
+ }
+ }
+ }
+ goto found_mapping;
+ }
+ }
+
+ /* Optimization: Save a hash table lookup in the next round. */
+ if (!rule->has_next)
+ break;
+ }
+ }
+
+ /* No special-cased mapping. So use the locale and context independent
+ mapping. */
+ mapped_uc[0] = single_character_map (uc);
+ mapped_count = 1;
+
+ found_mapping:
+ /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < mapped_count; i++)
+ {
+ ucs4_t muc = mapped_uc[i];
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+ }
+
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ }
+ }
+
+ if (nf != NULL)
+ {
+ /* Finally, normalize the result. */
+ UNIT *normalized_result;
+
+ normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp);
+ if (normalized_result == NULL)
+ goto fail;
+
+ free (result);
+ return normalized_result;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ if (result != resultbuf)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unicase/u-casexfrm.h b/gnulib/lib/unicase/u-casexfrm.h
new file mode 100644
index 0000000..44d845f
--- /dev/null
+++ b/gnulib/lib/unicase/u-casexfrm.h
@@ -0,0 +1,88 @@
+/* Locale dependent transformation for case insensitive comparison of Unicode
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *s, size_t n, const char *iso639_language, uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ UNIT foldedsbuf[2048 / sizeof (UNIT)];
+ UNIT *foldeds;
+ size_t foldeds_length;
+ char convsbuf[2048];
+ char *convs;
+ size_t convs_length;
+ char *result;
+
+ /* Casefold and normalize the Unicode string. */
+ foldeds_length = sizeof (foldedsbuf) / sizeof (UNIT);
+ foldeds = U_CASEFOLD (s, n, iso639_language, nf, foldedsbuf, &foldeds_length);
+ if (foldeds == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Convert it to locale encoding. */
+ convs_length = sizeof (convsbuf) - 1;
+ convs = U_CONV_TO_ENCODING (locale_charset (),
+ iconveh_error,
+ foldeds, foldeds_length,
+ NULL,
+ convsbuf, &convs_length);
+ if (convs == NULL)
+ {
+ if (foldeds != foldedsbuf)
+ {
+ int saved_errno = errno;
+ free (foldeds);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (foldeds != foldedsbuf)
+ free (foldeds);
+
+ /* Ensure one more byte is available. */
+ if (convs != convsbuf)
+ {
+ char *memory = (char *) realloc (convs, convs_length + 1);
+ if (memory == NULL)
+ {
+ free (convs);
+ errno = ENOMEM;
+ return NULL;
+ }
+ convs = memory;
+ }
+
+ /* Apply locale dependent transformations for comparison. */
+ result = amemxfrm (convs, convs_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (convs != convsbuf)
+ {
+ int saved_errno = errno;
+ free (convs);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (convs != convsbuf)
+ free (convs);
+ return result;
+}
diff --git a/gnulib/lib/unicase/u-ct-casefold.h b/gnulib/lib/unicase/u-ct-casefold.h
new file mode 100644
index 0000000..05036ba
--- /dev/null
+++ b/gnulib/lib/unicase/u-ct-casefold.h
@@ -0,0 +1,107 @@
+/* Casefolding mapping for Unicode substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* Implement the three definitions of caseless matching, as described in
+ Unicode 5.0, section "Default caseless matching":
+ - If no normalization is requested, simply apply the casefolding.
+ X -> toCasefold(X).
+ - If canonical normalization is requested, apply it, and apply an NFD
+ before.
+ X -> NFD(toCasefold(NFD(X))).
+ - If compatibility normalization is requested, apply it twice, apply
+ the normalization after each, and apply an NFD before:
+ X -> NFKD(toCasefold(NFKD(toCasefold(NFD(X))))). */
+ if (nf == NULL)
+ /* X -> toCasefold(X) */
+ return U_CASEMAP (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]),
+ NULL,
+ resultbuf, lengthp);
+ else
+ {
+ uninorm_t nfd = uninorm_decomposing_form (nf);
+ /* X -> nf(toCasefold(NFD(X))) or
+ X -> nf(toCasefold(nfd(toCasefold(NFD(X))))) */
+ int repeat = (uninorm_is_compat_decomposing (nf) ? 2 : 1);
+ UNIT tmpbuf1[2048 / sizeof (UNIT)];
+ UNIT tmpbuf2[2048 / sizeof (UNIT)];
+ UNIT *tmp1;
+ size_t tmp1_length;
+ UNIT *tmp2;
+ size_t tmp2_length;
+
+ tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT);
+ tmp1 = U_NORMALIZE (UNINORM_NFD, s, n, tmpbuf1, &tmp1_length);
+ if (tmp1 == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ do
+ {
+ tmp2_length = sizeof (tmpbuf2) / sizeof (UNIT);
+ tmp2 = U_CASEMAP (tmp1, tmp1_length,
+ prefix_context, suffix_context, iso639_language,
+ uc_tocasefold, offsetof (struct special_casing_rule, casefold[0]),
+ NULL,
+ tmpbuf2, &tmp2_length);
+ if (tmp2 == NULL)
+ {
+ int saved_errno = errno;
+ if (tmp1 != tmpbuf1)
+ free (tmp1);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (tmp1 != tmpbuf1)
+ free (tmp1);
+
+ if (repeat > 1)
+ {
+ tmp1_length = sizeof (tmpbuf1) / sizeof (UNIT);
+ tmp1 = U_NORMALIZE (nfd, tmp2, tmp2_length,
+ tmpbuf1, &tmp1_length);
+ }
+ else
+ /* Last run through this loop. */
+ tmp1 = U_NORMALIZE (nf, tmp2, tmp2_length,
+ resultbuf, lengthp);
+ if (tmp1 == NULL)
+ {
+ int saved_errno = errno;
+ if (tmp2 != tmpbuf2)
+ free (tmp2);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (tmp2 != tmpbuf2)
+ free (tmp2);
+ }
+ while (--repeat > 0);
+
+ return tmp1;
+ }
+}
diff --git a/gnulib/lib/unicase/u-ct-totitle.h b/gnulib/lib/unicase/u-ct-totitle.h
new file mode 100644
index 0000000..b39483c
--- /dev/null
+++ b/gnulib/lib/unicase/u-ct-totitle.h
@@ -0,0 +1,501 @@
+/* Titlecase mapping for UTF-8/UTF-16/UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Quoting the Unicode standard, section "Default Case Algorithms":
+ Find the word boundaries in X according to Unicode Standard Annex #29,
+ “Text Boundaries.” For each word boundary, find the first cased character
+ F following the word boundary. If F exists, map F to Titlecase_Mapping(F);
+ then map all characters C between F and the following word boundary to
+ Lowercase_Mapping(C). */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+ /* An array containing the word break positions. */
+ char *wordbreaks;
+
+ /* Initialize the accumulator. */
+ if (nf != NULL || resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ /* Initialize the word breaks array. */
+ if (n > 0)
+ {
+ wordbreaks = (char *) malloc (n);
+ if (wordbreaks == NULL)
+ {
+ errno = ENOMEM;
+ goto fail2;
+ }
+ U_WORDBREAKS (s, n, wordbreaks);
+ }
+ else
+ wordbreaks = NULL;
+
+ {
+ const UNIT *s_end = s + n;
+ const char *wp = wordbreaks;
+
+ /* When considering the string as segmented by word boundaries: For each
+ such segment:
+ - In the first part, we are searching for the first cased character.
+ In this state, in_word_first_part = true, and no conversion takes
+ place.
+ - In the second part, we are converting every character: the first
+ among these characters to title case, the other ones to lower case.
+ In this state, in_word_first_part = false. */
+ bool in_word_first_part = true;
+
+ /* Helper for evaluating the FINAL_SIGMA condition:
+ Last character that was not case-ignorable. */
+ ucs4_t last_char_except_ignorable =
+ prefix_context.last_char_except_ignorable;
+
+ /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ Last character that was of combining class 230 ("Above") or 0. */
+ ucs4_t last_char_normal_or_above =
+ prefix_context.last_char_normal_or_above;
+
+ while (s < s_end)
+ {
+ /* Fetch the next character. */
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ ucs4_t (*single_character_map) (ucs4_t);
+ size_t offset_in_rule; /* offset in 'struct special_casing_rule' */
+
+ ucs4_t mapped_uc[3];
+ unsigned int mapped_count;
+
+ if (*wp)
+ /* Crossing a word boundary. */
+ in_word_first_part = true;
+
+ /* Determine single_character_map, offset_in_rule.
+ There are three possibilities:
+ - uc should not be converted.
+ - uc should be titlecased.
+ - uc should be lowercased. */
+ if (in_word_first_part)
+ {
+ if (uc_is_cased (uc))
+ {
+ /* uc is to be titlecased. */
+ single_character_map = uc_totitle;
+ offset_in_rule = offsetof (struct special_casing_rule, title[0]);
+ in_word_first_part = false;
+ }
+ else
+ {
+ /* uc is not converted. */
+ single_character_map = NULL;
+ offset_in_rule = 0;
+ }
+ }
+ else
+ {
+ /* uc is to be lowercased. */
+ single_character_map = uc_tolower;
+ offset_in_rule = offsetof (struct special_casing_rule, lower[0]);
+ }
+
+ /* Actually map uc. */
+ if (single_character_map == NULL)
+ {
+ mapped_uc[0] = uc;
+ mapped_count = 1;
+ goto found_mapping;
+ }
+
+ if (uc < 0x10000)
+ {
+ /* Look first in the special-casing table. */
+ char code[3];
+
+ code[0] = (uc >> 8) & 0xff;
+ code[1] = uc & 0xff;
+
+ for (code[2] = 0; ; code[2]++)
+ {
+ const struct special_casing_rule *rule =
+ gl_unicase_special_lookup (code, 3);
+
+ if (rule == NULL)
+ break;
+
+ /* Test if the condition applies. */
+ /* Does the language apply? */
+ if (rule->language[0] == '\0'
+ || (iso639_language != NULL
+ && iso639_language[0] == rule->language[0]
+ && iso639_language[1] == rule->language[1]))
+ {
+ /* Does the context apply? */
+ int context = rule->context;
+ bool applies;
+
+ if (context < 0)
+ context = - context;
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ applies = true;
+ break;
+
+ case SCC_FINAL_SIGMA:
+ /* "Before" condition: preceded by a sequence
+ consisting of a cased letter and a case-ignorable
+ sequence.
+ "After" condition: not followed by a sequence
+ consisting of a case-ignorable sequence and then a
+ cased letter. */
+ /* Test the "before" condition. */
+ applies = uc_is_cased (last_char_except_ignorable);
+ /* Test the "after" condition. */
+ if (applies)
+ {
+ const UNIT *s2 = s + count;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ /* Our uc_is_case_ignorable function is
+ known to return false for all cased
+ characters. So we can call
+ uc_is_case_ignorable first. */
+ if (!uc_is_case_ignorable (uc2))
+ {
+ applies = ! uc_is_cased (uc2);
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ! uc_is_cased (suffix_context.first_char_except_ignorable);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_SOFT_DOTTED:
+ /* "Before" condition: There is a Soft_Dotted character
+ before it, with no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = uc_is_property_soft_dotted (last_char_normal_or_above);
+ break;
+
+ case SCC_MORE_ABOVE:
+ /* "After" condition: followed by a character of
+ combining class 230 (Above) with no intervening
+ character of combining class 0 or 230 (Above). */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A)
+ {
+ applies = true;
+ break;
+ }
+ if (ccc == UC_CCC_NR)
+ break;
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_BEFORE_DOT:
+ /* "After" condition: followed by COMBINING DOT ABOVE
+ (U+0307). Any sequence of characters with a
+ combining class that is neither 0 nor 230 may
+ intervene between the current character and the
+ combining dot above. */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ if (uc2 == 0x0307) /* COMBINING DOT ABOVE */
+ {
+ applies = true;
+ break;
+ }
+ {
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_I:
+ /* "Before" condition: There is an uppercase I before
+ it, and there is no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = (last_char_normal_or_above == 'I');
+ break;
+
+ default:
+ abort ();
+ }
+ if (rule->context < 0)
+ applies = !applies;
+
+ if (applies)
+ {
+ /* The rule applies.
+ Look up the mapping (0 to 3 characters). */
+ const unsigned short *mapped_in_rule =
+ (const unsigned short *)((const char *)rule + offset_in_rule);
+
+ if (mapped_in_rule[0] == 0)
+ mapped_count = 0;
+ else
+ {
+ mapped_uc[0] = mapped_in_rule[0];
+ if (mapped_in_rule[1] == 0)
+ mapped_count = 1;
+ else
+ {
+ mapped_uc[1] = mapped_in_rule[1];
+ if (mapped_in_rule[2] == 0)
+ mapped_count = 2;
+ else
+ {
+ mapped_uc[2] = mapped_in_rule[2];
+ mapped_count = 3;
+ }
+ }
+ }
+ goto found_mapping;
+ }
+ }
+
+ /* Optimization: Save a hash table lookup in the next round. */
+ if (!rule->has_next)
+ break;
+ }
+ }
+
+ /* No special-cased mapping. So use the locale and context independent
+ mapping. */
+ mapped_uc[0] = single_character_map (uc);
+ mapped_count = 1;
+
+ found_mapping:
+ /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < mapped_count; i++)
+ {
+ ucs4_t muc = mapped_uc[i];
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail1;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail1;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail1;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+ }
+
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ wp += count;
+ }
+ }
+
+ free (wordbreaks);
+
+ if (nf != NULL)
+ {
+ /* Finally, normalize the result. */
+ UNIT *normalized_result;
+
+ normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp);
+ if (normalized_result == NULL)
+ goto fail2;
+
+ free (result);
+ return normalized_result;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail2;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail1:
+ {
+ int saved_errno = errno;
+ free (wordbreaks);
+ errno = saved_errno;
+ }
+ fail2:
+ if (result != resultbuf)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unicase/u-is-cased.h b/gnulib/lib/unicase/u-is-cased.h
new file mode 100644
index 0000000..73dece2
--- /dev/null
+++ b/gnulib/lib/unicase/u-is-cased.h
@@ -0,0 +1,128 @@
+/* Test whether case matters for a Unicode string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ UNIT mappedbuf[2048 / sizeof (UNIT)];
+ UNIT *mapped_toupper;
+ UNIT *mapped_tolower;
+ UNIT *mapped_totitle;
+ size_t mapped_length;
+
+ /* Apply canonical decomposition to S. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (UNINORM_NFD, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return -1;
+
+ mapped_length = sizeof (mappedbuf) / sizeof (UNIT);
+
+ /* Apply toupper mapping. */
+ mapped_toupper = U_TOUPPER (norms, norms_length, iso639_language, NULL,
+ mappedbuf, &mapped_length);
+ if (mapped_toupper == NULL)
+ goto fail;
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_toupper, norms, norms_length) == 0))
+ {
+ if (mapped_toupper != mappedbuf)
+ free (mapped_toupper);
+ goto yes;
+ }
+
+ /* Apply tolower mapping. */
+ mapped_tolower = U_TOLOWER (norms, norms_length, iso639_language, NULL,
+ mapped_toupper, &mapped_length);
+ if (mapped_tolower == NULL)
+ {
+ if (mapped_toupper != mappedbuf)
+ {
+ int saved_errno = errno;
+ free (mapped_toupper);
+ errno = saved_errno;
+ }
+ goto fail;
+ }
+
+ if (mapped_toupper != mapped_tolower && mapped_toupper != mappedbuf)
+ free (mapped_toupper);
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_tolower, norms, norms_length) == 0))
+ {
+ if (mapped_tolower != mappedbuf)
+ free (mapped_tolower);
+ goto yes;
+ }
+
+ /* Apply totitle mapping. */
+ mapped_totitle = U_TOTITLE (norms, norms_length, iso639_language, NULL,
+ mapped_tolower, &mapped_length);
+ if (mapped_totitle == NULL)
+ {
+ if (mapped_tolower != mappedbuf)
+ {
+ int saved_errno = errno;
+ free (mapped_tolower);
+ errno = saved_errno;
+ }
+ goto fail;
+ }
+
+ if (mapped_tolower != mapped_totitle && mapped_tolower != mappedbuf)
+ free (mapped_tolower);
+
+ /* Compare. */
+ if (!(mapped_length == norms_length
+ && U_CMP (mapped_totitle, norms, norms_length) == 0))
+ {
+ if (mapped_totitle != mappedbuf)
+ free (mapped_totitle);
+ goto yes;
+ }
+
+ if (mapped_totitle != mappedbuf)
+ free (mapped_totitle);
+ if (norms != normsbuf)
+ free (norms);
+ *resultp = false;
+ return 0;
+
+ yes:
+ if (norms != normsbuf)
+ free (norms);
+ *resultp = true;
+ return 0;
+
+ fail:
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unicase/u-is-invariant.h b/gnulib/lib/unicase/u-is-invariant.h
new file mode 100644
index 0000000..05b749c
--- /dev/null
+++ b/gnulib/lib/unicase/u-is-invariant.h
@@ -0,0 +1,64 @@
+/* Test whether a Unicode string is invariant under a given case mapping.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s, size_t n,
+ UNIT * (*mapping) (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp),
+ const char *iso639_language,
+ bool *resultp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ UNIT mappedbuf[2048 / sizeof (UNIT)];
+ UNIT *mapped;
+ size_t mapped_length;
+
+ /* Apply canonical decomposition to S. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (UNINORM_NFD, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Apply mapping. */
+ mapped_length = sizeof (mappedbuf) / sizeof (UNIT);
+ mapped = mapping (norms, norms_length, iso639_language, NULL,
+ mappedbuf, &mapped_length);
+ if (mapped == NULL)
+ {
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare. */
+ *resultp = (mapped_length == norms_length
+ && U_CMP (mapped, norms, norms_length) == 0);
+
+ if (mapped != mappedbuf)
+ free (mapped);
+ if (norms != normsbuf)
+ free (norms);
+ return 0;
+}
diff --git a/gnulib/lib/unicase/u-prefix-context.h b/gnulib/lib/unicase/u-prefix-context.h
new file mode 100644
index 0000000..460a8bc
--- /dev/null
+++ b/gnulib/lib/unicase/u-prefix-context.h
@@ -0,0 +1,92 @@
+/* Case-mapping context of prefix UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+casing_prefix_context_t
+FUNC1 (const UNIT *s, size_t n)
+{
+ return FUNC2 (s, n, unicase_empty_prefix_context);
+}
+
+casing_prefix_context_t
+FUNC2 (const UNIT *s, size_t n, casing_prefix_context_t a_context)
+{
+#if 0
+ /* Forward iteration. Slow for long strings. */
+ casing_prefix_context_t context = a_context;
+ const UNIT *s_end = s + n;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ if (!uc_is_case_ignorable (uc))
+ context.last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ context.last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ }
+
+ return context;
+#else
+ /* Iterate backwards, only as far as needed. */
+ casing_prefix_context_t context;
+ ucs4_t last_char_except_ignorable = (ucs4_t)(-1);
+ ucs4_t last_char_normal_or_above = (ucs4_t)(-1);
+ const UNIT *p = s + n;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ p = U_PREV (&uc, p, s);
+ if (p == NULL)
+ break;
+
+ if (last_char_except_ignorable == (ucs4_t)(-1))
+ {
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+ }
+
+ if (last_char_normal_or_above == (ucs4_t)(-1))
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ if (last_char_except_ignorable != (ucs4_t)(-1)
+ && last_char_normal_or_above != (ucs4_t)(-1))
+ break;
+ }
+ context.last_char_except_ignorable =
+ (last_char_except_ignorable != (ucs4_t)(-1)
+ ? last_char_except_ignorable
+ : a_context.last_char_except_ignorable);
+ context.last_char_normal_or_above =
+ (last_char_normal_or_above != (ucs4_t)(-1)
+ ? last_char_normal_or_above
+ : a_context.last_char_normal_or_above);
+
+ return context;
+#endif
+}
diff --git a/gnulib/lib/unicase/u-suffix-context.h b/gnulib/lib/unicase/u-suffix-context.h
new file mode 100644
index 0000000..ec12d7d
--- /dev/null
+++ b/gnulib/lib/unicase/u-suffix-context.h
@@ -0,0 +1,90 @@
+/* Case-mapping context of suffix UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+casing_suffix_context_t
+FUNC1 (const UNIT *s, size_t n)
+{
+ return FUNC2 (s, n, unicase_empty_suffix_context);
+}
+
+casing_suffix_context_t
+FUNC2 (const UNIT *s, size_t n, casing_suffix_context_t a_context)
+{
+ casing_suffix_context_t context;
+ /* Evaluate all three conditions in a single pass through the string S.
+ The three variables are -1 as long as the value of the condition has
+ not been determined. */
+ ucs4_t first_char_except_ignorable = (ucs4_t)(-1);
+ int scc_MORE_ABOVE = -1;
+ int scc_BEFORE_DOT = -1;
+ const UNIT *s_end = s + n;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ if (first_char_except_ignorable == (ucs4_t)(-1))
+ {
+ if (!uc_is_case_ignorable (uc))
+ first_char_except_ignorable = uc;
+ }
+
+ if (scc_MORE_ABOVE < 0)
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A)
+ scc_MORE_ABOVE = SCC_MORE_ABOVE_MASK;
+ else if (ccc == UC_CCC_NR)
+ scc_MORE_ABOVE = 0;
+ }
+
+ if (scc_BEFORE_DOT < 0)
+ {
+ if (uc == 0x0307) /* COMBINING DOT ABOVE */
+ scc_BEFORE_DOT = SCC_BEFORE_DOT_MASK;
+ else
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ scc_BEFORE_DOT = 0;
+ }
+ }
+
+ if (first_char_except_ignorable != (ucs4_t)(-1)
+ && (scc_MORE_ABOVE | scc_BEFORE_DOT) >= 0)
+ /* All conditions have been determined. */
+ break;
+
+ s += count;
+ }
+
+ /* For those conditions that have not been determined so far, use the
+ value from the argument context. */
+ context.first_char_except_ignorable =
+ (first_char_except_ignorable != (ucs4_t)(-1)
+ ? first_char_except_ignorable
+ : a_context.first_char_except_ignorable);
+ context.bits =
+ (scc_MORE_ABOVE >= 0
+ ? scc_MORE_ABOVE
+ : a_context.bits & SCC_MORE_ABOVE_MASK)
+ | (scc_BEFORE_DOT >= 0
+ ? scc_BEFORE_DOT
+ : a_context.bits & SCC_BEFORE_DOT_MASK);
+ return context;
+}
diff --git a/gnulib/lib/unicase/u-totitle.h b/gnulib/lib/unicase/u-totitle.h
new file mode 100644
index 0000000..8362abd
--- /dev/null
+++ b/gnulib/lib/unicase/u-totitle.h
@@ -0,0 +1,28 @@
+/* Titlecase mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ return U_CT_TOTITLE (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-casecmp.c b/gnulib/lib/unicase/u16-casecmp.c
new file mode 100644
index 0000000..7dcf702
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_casecmp
+#define UNIT uint16_t
+#define SRC_UNIT uint16_t
+#define U_CASEFOLD u16_casefold
+#define U_CMP2 u16_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u16-casecoll.c b/gnulib/lib/unicase/u16-casecoll.c
new file mode 100644
index 0000000..578c810
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-16
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u16_casecoll
+#define UNIT uint16_t
+#define U_CASEXFRM u16_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u16-casefold.c b/gnulib/lib/unicase/u16-casefold.c
new file mode 100644
index 0000000..348e6c6
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casefold.c
@@ -0,0 +1,26 @@
+/* Casefolding mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u16_casefold
+#define UNIT uint16_t
+#define U_CT_CASEFOLD u16_ct_casefold
+#include "u-casefold.h"
diff --git a/gnulib/lib/unicase/u16-casemap.c b/gnulib/lib/unicase/u16-casemap.c
new file mode 100644
index 0000000..0ffdb08
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u16_casemap
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#define U_NORMALIZE u16_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u16-casexfrm.c b/gnulib/lib/unicase/u16-casexfrm.c
new file mode 100644
index 0000000..f26898b
--- /dev/null
+++ b/gnulib/lib/unicase/u16-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-16
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u16_casexfrm
+#define UNIT uint16_t
+#define U_CASEFOLD u16_casefold
+#define U_CONV_TO_ENCODING u16_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u16-ct-casefold.c b/gnulib/lib/unicase/u16-ct-casefold.c
new file mode 100644
index 0000000..0fdeef2
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u16_ct_casefold
+#define UNIT uint16_t
+#define U_CASEMAP u16_casemap
+#define U_NORMALIZE u16_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u16-ct-tolower.c b/gnulib/lib/unicase/u16-ct-tolower.c
new file mode 100644
index 0000000..45ccb9f
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_ct_tolower (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-ct-totitle.c b/gnulib/lib/unicase/u16-ct-totitle.c
new file mode 100644
index 0000000..215c4ac
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u16_ct_totitle
+#define UNIT uint16_t
+#define U_WORDBREAKS u16_wordbreaks
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#define U_NORMALIZE u16_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u16-ct-toupper.c b/gnulib/lib/unicase/u16-ct-toupper.c
new file mode 100644
index 0000000..594ddf4
--- /dev/null
+++ b/gnulib/lib/unicase/u16-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-16 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_ct_toupper (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-is-cased.c b/gnulib/lib/unicase/u16-is-cased.c
new file mode 100644
index 0000000..0e8f392
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-16 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_is_cased
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_TOUPPER u16_toupper
+#define U_TOLOWER u16_tolower
+#define U_TOTITLE u16_totitle
+#define U_CMP u16_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u16-is-casefolded.c b/gnulib/lib/unicase/u16-is-casefolded.c
new file mode 100644
index 0000000..67492b2
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is already case-folded.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_casefolded (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-invariant.c b/gnulib/lib/unicase/u16-is-invariant.c
new file mode 100644
index 0000000..415db2f
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-16 string is invariant under a given case mapping.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u16_is_invariant
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CMP u16_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u16-is-lowercase.c b/gnulib/lib/unicase/u16-is-lowercase.c
new file mode 100644
index 0000000..06bf2b0
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely lower case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_lowercase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-titlecase.c b/gnulib/lib/unicase/u16-is-titlecase.c
new file mode 100644
index 0000000..0c10916
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely title case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_titlecase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-is-uppercase.c b/gnulib/lib/unicase/u16-is-uppercase.c
new file mode 100644
index 0000000..fa8aafd
--- /dev/null
+++ b/gnulib/lib/unicase/u16-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-16 string is entirely upper case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u16_is_uppercase (const uint16_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u16_is_invariant (s, n, u16_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u16-prefix-context.c b/gnulib/lib/unicase/u16-prefix-context.c
new file mode 100644
index 0000000..fca0419
--- /dev/null
+++ b/gnulib/lib/unicase/u16-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-16 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u16_casing_prefix_context
+#define FUNC2 u16_casing_prefixes_context
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_PREV u16_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u16-suffix-context.c b/gnulib/lib/unicase/u16-suffix-context.c
new file mode 100644
index 0000000..b714e9d
--- /dev/null
+++ b/gnulib/lib/unicase/u16-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-16 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u16_casing_suffix_context
+#define FUNC2 u16_casing_suffixes_context
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u16-tolower.c b/gnulib/lib/unicase/u16-tolower.c
new file mode 100644
index 0000000..dde5fe9
--- /dev/null
+++ b/gnulib/lib/unicase/u16-tolower.c
@@ -0,0 +1,39 @@
+/* Lowercase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_tolower (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u16-totitle.c b/gnulib/lib/unicase/u16-totitle.c
new file mode 100644
index 0000000..541e705
--- /dev/null
+++ b/gnulib/lib/unicase/u16-totitle.c
@@ -0,0 +1,27 @@
+/* Titlecase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u16_totitle
+#define UNIT uint16_t
+#define U_CT_TOTITLE u16_ct_totitle
+#include "u-totitle.h"
+
diff --git a/gnulib/lib/unicase/u16-toupper.c b/gnulib/lib/unicase/u16-toupper.c
new file mode 100644
index 0000000..3b964f7
--- /dev/null
+++ b/gnulib/lib/unicase/u16-toupper.c
@@ -0,0 +1,39 @@
+/* Uppercase mapping for UTF-16 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint16_t *
+u16_toupper (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp)
+{
+ return u16_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-casecmp.c b/gnulib/lib/unicase/u32-casecmp.c
new file mode 100644
index 0000000..66ef142
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_casecmp
+#define UNIT uint32_t
+#define SRC_UNIT uint32_t
+#define U_CASEFOLD u32_casefold
+#define U_CMP2 u32_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u32-casecoll.c b/gnulib/lib/unicase/u32-casecoll.c
new file mode 100644
index 0000000..c48afa6
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-32
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u32_casecoll
+#define UNIT uint32_t
+#define U_CASEXFRM u32_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u32-casefold.c b/gnulib/lib/unicase/u32-casefold.c
new file mode 100644
index 0000000..b8e93f2
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casefold.c
@@ -0,0 +1,26 @@
+/* Casefolding mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u32_casefold
+#define UNIT uint32_t
+#define U_CT_CASEFOLD u32_ct_casefold
+#include "u-casefold.h"
diff --git a/gnulib/lib/unicase/u32-casemap.c b/gnulib/lib/unicase/u32-casemap.c
new file mode 100644
index 0000000..2201d76
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u32_casemap
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#define U_NORMALIZE u32_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u32-casexfrm.c b/gnulib/lib/unicase/u32-casexfrm.c
new file mode 100644
index 0000000..c537738
--- /dev/null
+++ b/gnulib/lib/unicase/u32-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-32
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u32_casexfrm
+#define UNIT uint32_t
+#define U_CASEFOLD u32_casefold
+#define U_CONV_TO_ENCODING u32_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u32-ct-casefold.c b/gnulib/lib/unicase/u32-ct-casefold.c
new file mode 100644
index 0000000..4267f27
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u32_ct_casefold
+#define UNIT uint32_t
+#define U_CASEMAP u32_casemap
+#define U_NORMALIZE u32_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u32-ct-tolower.c b/gnulib/lib/unicase/u32-ct-tolower.c
new file mode 100644
index 0000000..2f529db
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_ct_tolower (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-ct-totitle.c b/gnulib/lib/unicase/u32-ct-totitle.c
new file mode 100644
index 0000000..68689b3
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u32_ct_totitle
+#define UNIT uint32_t
+#define U_WORDBREAKS u32_wordbreaks
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#define U_NORMALIZE u32_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u32-ct-toupper.c b/gnulib/lib/unicase/u32-ct-toupper.c
new file mode 100644
index 0000000..195addd
--- /dev/null
+++ b/gnulib/lib/unicase/u32-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-32 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_ct_toupper (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-is-cased.c b/gnulib/lib/unicase/u32-is-cased.c
new file mode 100644
index 0000000..da4e473
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-32 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_is_cased
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_TOUPPER u32_toupper
+#define U_TOLOWER u32_tolower
+#define U_TOTITLE u32_totitle
+#define U_CMP u32_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u32-is-casefolded.c b/gnulib/lib/unicase/u32-is-casefolded.c
new file mode 100644
index 0000000..54f5259
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is already case-folded.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_casefolded (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-invariant.c b/gnulib/lib/unicase/u32-is-invariant.c
new file mode 100644
index 0000000..128fefd
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-32 string is invariant under a given case mapping.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u32_is_invariant
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CMP u32_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u32-is-lowercase.c b/gnulib/lib/unicase/u32-is-lowercase.c
new file mode 100644
index 0000000..03f49e2
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely lower case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_lowercase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-titlecase.c b/gnulib/lib/unicase/u32-is-titlecase.c
new file mode 100644
index 0000000..a49cecf
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely title case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_titlecase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-is-uppercase.c b/gnulib/lib/unicase/u32-is-uppercase.c
new file mode 100644
index 0000000..ff3fed9
--- /dev/null
+++ b/gnulib/lib/unicase/u32-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-32 string is entirely upper case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u32_is_uppercase (const uint32_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u32_is_invariant (s, n, u32_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u32-prefix-context.c b/gnulib/lib/unicase/u32-prefix-context.c
new file mode 100644
index 0000000..28719cf
--- /dev/null
+++ b/gnulib/lib/unicase/u32-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-32 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u32_casing_prefix_context
+#define FUNC2 u32_casing_prefixes_context
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_PREV u32_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u32-suffix-context.c b/gnulib/lib/unicase/u32-suffix-context.c
new file mode 100644
index 0000000..a4ede0c
--- /dev/null
+++ b/gnulib/lib/unicase/u32-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-32 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u32_casing_suffix_context
+#define FUNC2 u32_casing_suffixes_context
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u32-tolower.c b/gnulib/lib/unicase/u32-tolower.c
new file mode 100644
index 0000000..16c9762
--- /dev/null
+++ b/gnulib/lib/unicase/u32-tolower.c
@@ -0,0 +1,39 @@
+/* Lowercase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_tolower (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u32-totitle.c b/gnulib/lib/unicase/u32-totitle.c
new file mode 100644
index 0000000..0f637f6
--- /dev/null
+++ b/gnulib/lib/unicase/u32-totitle.c
@@ -0,0 +1,26 @@
+/* Titlecase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u32_totitle
+#define UNIT uint32_t
+#define U_CT_TOTITLE u32_ct_totitle
+#include "u-totitle.h"
diff --git a/gnulib/lib/unicase/u32-toupper.c b/gnulib/lib/unicase/u32-toupper.c
new file mode 100644
index 0000000..dbf93b9
--- /dev/null
+++ b/gnulib/lib/unicase/u32-toupper.c
@@ -0,0 +1,39 @@
+/* Uppercase mapping for UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint32_t *
+u32_toupper (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp)
+{
+ return u32_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-casecmp.c b/gnulib/lib/unicase/u8-casecmp.c
new file mode 100644
index 0000000..820cd3e
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casecmp.c
@@ -0,0 +1,35 @@
+/* Case and normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_casecmp
+#define UNIT uint8_t
+#define SRC_UNIT uint8_t
+#define U_CASEFOLD u8_casefold
+#define U_CMP2 u8_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/u8-casecoll.c b/gnulib/lib/unicase/u8-casecoll.c
new file mode 100644
index 0000000..6a5ba75
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casecoll.c
@@ -0,0 +1,32 @@
+/* Locale dependent, case and normalization insensitive comparison of UTF-8
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u8_casecoll
+#define UNIT uint8_t
+#define U_CASEXFRM u8_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/u8-casefold.c b/gnulib/lib/unicase/u8-casefold.c
new file mode 100644
index 0000000..88aabd8
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casefold.c
@@ -0,0 +1,107 @@
+/* Casefolding mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u8_casefold
+#define UNIT uint8_t
+#define U_CT_CASEFOLD u8_ct_casefold
+#include "u-casefold.h"
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the case folded input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_casefold ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-casemap.c b/gnulib/lib/unicase/u8-casemap.c
new file mode 100644
index 0000000..38107b1
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u8_casemap
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#define U_NORMALIZE u8_normalize
+#include "u-casemap.h"
diff --git a/gnulib/lib/unicase/u8-casexfrm.c b/gnulib/lib/unicase/u8-casexfrm.c
new file mode 100644
index 0000000..d8aea34
--- /dev/null
+++ b/gnulib/lib/unicase/u8-casexfrm.c
@@ -0,0 +1,35 @@
+/* Locale dependent transformation for case insensitive comparison of UTF-8
+ strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u8_casexfrm
+#define UNIT uint8_t
+#define U_CASEFOLD u8_casefold
+#define U_CONV_TO_ENCODING u8_conv_to_encoding
+#include "u-casexfrm.h"
diff --git a/gnulib/lib/unicase/u8-ct-casefold.c b/gnulib/lib/unicase/u8-ct-casefold.c
new file mode 100644
index 0000000..6e08a5e
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-casefold.c
@@ -0,0 +1,35 @@
+/* Casefolding mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+#include "casefold.h"
+
+#define FUNC u8_ct_casefold
+#define UNIT uint8_t
+#define U_CASEMAP u8_casemap
+#define U_NORMALIZE u8_normalize
+#include "u-ct-casefold.h"
diff --git a/gnulib/lib/unicase/u8-ct-tolower.c b/gnulib/lib/unicase/u8-ct-tolower.c
new file mode 100644
index 0000000..503d0f7
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-tolower.c
@@ -0,0 +1,40 @@
+/* Lowercase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_ct_tolower (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-ct-totitle.c b/gnulib/lib/unicase/u8-ct-totitle.c
new file mode 100644
index 0000000..20f38f0
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-totitle.c
@@ -0,0 +1,43 @@
+/* Titlecase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uniwbrk.h"
+#include "uninorm.h"
+#include "caseprop.h"
+#include "context.h"
+#include "special-casing.h"
+
+#define FUNC u8_ct_totitle
+#define UNIT uint8_t
+#define U_WORDBREAKS u8_wordbreaks
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#define U_NORMALIZE u8_normalize
+#include "u-ct-totitle.h"
diff --git a/gnulib/lib/unicase/u8-ct-toupper.c b/gnulib/lib/unicase/u8-ct-toupper.c
new file mode 100644
index 0000000..cfc3c81
--- /dev/null
+++ b/gnulib/lib/unicase/u8-ct-toupper.c
@@ -0,0 +1,40 @@
+/* Uppercase mapping for UTF-8 substrings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_ct_toupper (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n, prefix_context, suffix_context, iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
diff --git a/gnulib/lib/unicase/u8-is-cased.c b/gnulib/lib/unicase/u8-is-cased.c
new file mode 100644
index 0000000..3dd583b
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-cased.c
@@ -0,0 +1,36 @@
+/* Test whether case matters for an UTF-8 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_is_cased
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_TOUPPER u8_toupper
+#define U_TOLOWER u8_tolower
+#define U_TOTITLE u8_totitle
+#define U_CMP u8_cmp
+#include "u-is-cased.h"
diff --git a/gnulib/lib/unicase/u8-is-casefolded.c b/gnulib/lib/unicase/u8-is-casefolded.c
new file mode 100644
index 0000000..186643f
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-casefolded.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is already case-folded.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_casefolded (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_casefold, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-invariant.c b/gnulib/lib/unicase/u8-is-invariant.c
new file mode 100644
index 0000000..076b57a
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-invariant.c
@@ -0,0 +1,34 @@
+/* Test whether an UTF-8 string is invariant under a given case mapping.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/invariant.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uninorm.h"
+#include "unistr.h"
+
+#define FUNC u8_is_invariant
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CMP u8_cmp
+#include "u-is-invariant.h"
diff --git a/gnulib/lib/unicase/u8-is-lowercase.c b/gnulib/lib/unicase/u8-is-lowercase.c
new file mode 100644
index 0000000..f012b76
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-lowercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely lower case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_lowercase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_tolower, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-titlecase.c b/gnulib/lib/unicase/u8-is-titlecase.c
new file mode 100644
index 0000000..94568b7
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-titlecase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely title case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_titlecase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_totitle, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-is-uppercase.c b/gnulib/lib/unicase/u8-is-uppercase.c
new file mode 100644
index 0000000..a40d946
--- /dev/null
+++ b/gnulib/lib/unicase/u8-is-uppercase.c
@@ -0,0 +1,30 @@
+/* Test whether an UTF-8 string is entirely upper case.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unicase/invariant.h"
+
+int
+u8_is_uppercase (const uint8_t *s, size_t n, const char *iso639_language,
+ bool *resultp)
+{
+ return u8_is_invariant (s, n, u8_toupper, iso639_language, resultp);
+}
diff --git a/gnulib/lib/unicase/u8-prefix-context.c b/gnulib/lib/unicase/u8-prefix-context.c
new file mode 100644
index 0000000..f9bd286
--- /dev/null
+++ b/gnulib/lib/unicase/u8-prefix-context.c
@@ -0,0 +1,33 @@
+/* Case-mapping context of prefix UTF-8 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u8_casing_prefix_context
+#define FUNC2 u8_casing_prefixes_context
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_PREV u8_prev
+#include "u-prefix-context.h"
diff --git a/gnulib/lib/unicase/u8-suffix-context.c b/gnulib/lib/unicase/u8-suffix-context.c
new file mode 100644
index 0000000..8619c70
--- /dev/null
+++ b/gnulib/lib/unicase/u8-suffix-context.c
@@ -0,0 +1,32 @@
+/* Case-mapping context of suffix UTF-8 string.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include "unictype.h"
+#include "unistr.h"
+#include "caseprop.h"
+#include "context.h"
+
+#define FUNC1 u8_casing_suffix_context
+#define FUNC2 u8_casing_suffixes_context
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#include "u-suffix-context.h"
diff --git a/gnulib/lib/unicase/u8-tolower.c b/gnulib/lib/unicase/u8-tolower.c
new file mode 100644
index 0000000..b68f849
--- /dev/null
+++ b/gnulib/lib/unicase/u8-tolower.c
@@ -0,0 +1,120 @@
+/* Lowercase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the lower case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_tolower ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-totitle.c b/gnulib/lib/unicase/u8-totitle.c
new file mode 100644
index 0000000..0799cc9
--- /dev/null
+++ b/gnulib/lib/unicase/u8-totitle.c
@@ -0,0 +1,107 @@
+/* Titlecase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#define FUNC u8_totitle
+#define UNIT uint8_t
+#define U_CT_TOTITLE u8_ct_totitle
+#include "u-totitle.h"
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the upper case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_toupper ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/u8-toupper.c b/gnulib/lib/unicase/u8-toupper.c
new file mode 100644
index 0000000..3fee6a3
--- /dev/null
+++ b/gnulib/lib/unicase/u8-toupper.c
@@ -0,0 +1,120 @@
+/* Uppercase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicasemap.h"
+#include "special-casing.h"
+
+uint8_t *
+u8_toupper (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_toupper, offsetof (struct special_casing_rule, upper[0]),
+ nf,
+ resultbuf, lengthp);
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the upper case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_toupper ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unicase/ulc-casecmp.c b/gnulib/lib/unicase/ulc-casecmp.c
new file mode 100644
index 0000000..94a6637
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casecmp.c
@@ -0,0 +1,74 @@
+/* Case and normalization insensitive comparison of strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "uninorm.h"
+#include "uniconv.h"
+#include "unistr.h"
+
+static uint8_t *
+ulc_u8_casefold (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ uint8_t convbuf[2048 / sizeof (uint8_t)];
+ uint8_t *conv;
+ size_t conv_length;
+ uint8_t *result;
+
+ /* Convert the string to UTF-8. */
+ conv_length = sizeof (convbuf) / sizeof (uint8_t);
+ conv =
+ u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL,
+ convbuf, &conv_length);
+ if (conv == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Case-fold and normalize. */
+ result = u8_casefold (conv, conv_length, iso639_language, nf,
+ resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (conv != convbuf)
+ {
+ int saved_errno = errno;
+ free (conv);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (conv != convbuf)
+ free (conv);
+ return result;
+}
+
+#define FUNC ulc_casecmp
+#define UNIT uint8_t
+#define SRC_UNIT char
+#define U_CASEFOLD ulc_u8_casefold
+#define U_CMP2 u8_cmp2
+#include "u-casecmp.h"
diff --git a/gnulib/lib/unicase/ulc-casecoll.c b/gnulib/lib/unicase/ulc-casecoll.c
new file mode 100644
index 0000000..34ded70
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casecoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, case and normalization insensitive comparison of strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC ulc_casecoll
+#define UNIT char
+#define U_CASEXFRM ulc_casexfrm
+#include "u-casecoll.h"
diff --git a/gnulib/lib/unicase/ulc-casexfrm.c b/gnulib/lib/unicase/ulc-casexfrm.c
new file mode 100644
index 0000000..00108b6
--- /dev/null
+++ b/gnulib/lib/unicase/ulc-casexfrm.c
@@ -0,0 +1,64 @@
+/* Locale dependent transformation for case insensitive comparison of strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "uniconv.h"
+
+char *
+ulc_casexfrm (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ uint8_t convbuf[2048 / sizeof (uint8_t)];
+ uint8_t *conv;
+ size_t conv_length;
+ char *result;
+
+ /* Convert the string to UTF-8. */
+ conv_length = sizeof (convbuf) / sizeof (uint8_t);
+ conv =
+ u8_conv_from_encoding (locale_charset (), iconveh_error, s, n, NULL,
+ convbuf, &conv_length);
+ if (conv == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Case-fold and normalize. */
+ result = u8_casexfrm (conv, conv_length, iso639_language, nf,
+ resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (conv != convbuf)
+ {
+ int saved_errno = errno;
+ free (conv);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (conv != convbuf)
+ free (conv);
+ return result;
+}
diff --git a/gnulib/lib/unicase/unicasemap.h b/gnulib/lib/unicase/unicasemap.h
new file mode 100644
index 0000000..aff0610
--- /dev/null
+++ b/gnulib/lib/unicase/unicasemap.h
@@ -0,0 +1,52 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "unicase.h"
+#include "uninorm.h"
+
+extern uint8_t *
+ u8_casemap (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+
+extern uint16_t *
+ u16_casemap (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+
+extern uint32_t *
+ u32_casemap (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
diff --git a/gnulib/lib/unicodeio.c b/gnulib/lib/unicodeio.c
new file mode 100644
index 0000000..7665144
--- /dev/null
+++ b/gnulib/lib/unicodeio.c
@@ -0,0 +1,216 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+ Copyright (C) 2000-2003, 2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicodeio.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#if HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <error.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#include "localcharset.h"
+#include "unistr.h"
+#include "ignore-value.h"
+
+/* When we pass a Unicode character to iconv(), we must pass it in a
+ suitable encoding. The standardized Unicode encodings are
+ UTF-8, UCS-2, UCS-4, UTF-16, UTF-16BE, UTF-16LE, UTF-7.
+ UCS-2 supports only characters up to \U0000FFFF.
+ UTF-16 and variants support only characters up to \U0010FFFF.
+ UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order
+ mark. glibc currently interprets it as big endian without byte order
+ mark, but this is not backed by an RFC.
+ So we use UTF-8. It supports characters up to \U7FFFFFFF and is
+ unambiguously defined. */
+
+/* Luckily, the encoding's name is platform independent. */
+#define UTF8_NAME "UTF-8"
+
+/* Converts the Unicode character CODE to its multibyte representation
+ in the current locale and calls the SUCCESS callback on the resulting
+ byte sequence. If an error occurs, invokes the FAILURE callback instead,
+ passing it CODE and an English error string.
+ Returns whatever the callback returned.
+ Assumes that the locale doesn't change between two calls. */
+long
+unicode_to_mb (unsigned int code,
+ long (*success) (const char *buf, size_t buflen,
+ void *callback_arg),
+ long (*failure) (unsigned int code, const char *msg,
+ void *callback_arg),
+ void *callback_arg)
+{
+ static int initialized;
+ static int is_utf8;
+#if HAVE_ICONV
+ static iconv_t utf8_to_local;
+#endif
+
+ char inbuf[6];
+ int count;
+
+ if (!initialized)
+ {
+ const char *charset = locale_charset ();
+
+ is_utf8 = !strcmp (charset, UTF8_NAME);
+#if HAVE_ICONV
+ if (!is_utf8)
+ {
+ utf8_to_local = iconv_open (charset, UTF8_NAME);
+ if (utf8_to_local == (iconv_t)(-1))
+ /* For an unknown encoding, assume ASCII. */
+ utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
+ }
+#endif
+ initialized = 1;
+ }
+
+ /* Test whether the utf8_to_local converter is available at all. */
+ if (!is_utf8)
+ {
+#if HAVE_ICONV
+ if (utf8_to_local == (iconv_t)(-1))
+ return failure (code, N_("iconv function not usable"), callback_arg);
+#else
+ return failure (code, N_("iconv function not available"), callback_arg);
+#endif
+ }
+
+ /* Convert the character to UTF-8. */
+ count = u8_uctomb ((unsigned char *) inbuf, code, sizeof (inbuf));
+ if (count < 0)
+ return failure (code, N_("character out of range"), callback_arg);
+
+#if HAVE_ICONV
+ if (!is_utf8)
+ {
+ char outbuf[25];
+ const char *inptr;
+ size_t inbytesleft;
+ char *outptr;
+ size_t outbytesleft;
+ size_t res;
+
+ inptr = inbuf;
+ inbytesleft = count;
+ outptr = outbuf;
+ outbytesleft = sizeof (outbuf);
+
+ /* Convert the character from UTF-8 to the locale's charset. */
+ res = iconv (utf8_to_local,
+ (ICONV_CONST char **)&inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (inbytesleft > 0 || res == (size_t)(-1)
+ /* Irix iconv() inserts a NUL byte if it cannot convert. */
+# if !defined _LIBICONV_VERSION && (defined sgi || defined __sgi)
+ || (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0')
+# endif
+ )
+ return failure (code, NULL, callback_arg);
+
+ /* Avoid glibc-2.1 bug and Solaris 7 bug. */
+# if defined _LIBICONV_VERSION \
+ || !(((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) \
+ && !defined __UCLIBC__) \
+ || defined __sun)
+
+ /* Get back to the initial shift state. */
+ res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft);
+ if (res == (size_t)(-1))
+ return failure (code, NULL, callback_arg);
+# endif
+
+ return success (outbuf, outptr - outbuf, callback_arg);
+ }
+#endif
+
+ /* At this point, is_utf8 is true, so no conversion is needed. */
+ return success (inbuf, count, callback_arg);
+}
+
+/* Simple success callback that outputs the converted string.
+ The STREAM is passed as callback_arg. */
+long
+fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg)
+{
+ FILE *stream = (FILE *) callback_arg;
+
+ /* The return value of fwrite can be ignored here, because under normal
+ conditions (STREAM is an open stream and not wide-character oriented)
+ when fwrite() returns a value != buflen it also sets STREAM's error
+ indicator. */
+ ignore_value (fwrite (buf, 1, buflen, stream));
+ return 0;
+}
+
+/* Simple failure callback that displays an error and exits. */
+static long
+exit_failure_callback (unsigned int code, const char *msg,
+ void *callback_arg _GL_UNUSED)
+{
+ if (msg == NULL)
+ error (1, 0, _("cannot convert U+%04X to local character set"), code);
+ else
+ error (1, 0, _("cannot convert U+%04X to local character set: %s"), code,
+ gettext (msg));
+ return -1;
+}
+
+/* Simple failure callback that displays a fallback representation in plain
+ ASCII, using the same notation as ISO C99 strings. */
+static long
+fallback_failure_callback (unsigned int code,
+ const char *msg _GL_UNUSED,
+ void *callback_arg)
+{
+ FILE *stream = (FILE *) callback_arg;
+
+ if (code < 0x10000)
+ fprintf (stream, "\\u%04X", code);
+ else
+ fprintf (stream, "\\U%08X", code);
+ return -1;
+}
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+ Upon failure, exit if exit_on_error is true, otherwise output a fallback
+ notation. */
+void
+print_unicode_char (FILE *stream, unsigned int code, int exit_on_error)
+{
+ unicode_to_mb (code, fwrite_success_callback,
+ exit_on_error
+ ? exit_failure_callback
+ : fallback_failure_callback,
+ stream);
+}
diff --git a/gnulib/lib/unicodeio.h b/gnulib/lib/unicodeio.h
new file mode 100644
index 0000000..f065cf0
--- /dev/null
+++ b/gnulib/lib/unicodeio.h
@@ -0,0 +1,48 @@
+/* Unicode character output to streams with locale dependent encoding.
+
+ Copyright (C) 2000-2003, 2005, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef UNICODEIO_H
+# define UNICODEIO_H
+
+# include <stddef.h>
+# include <stdio.h>
+
+/* Converts the Unicode character CODE to its multibyte representation
+ in the current locale and calls the SUCCESS callback on the resulting
+ byte sequence. If an error occurs, invokes the FAILURE callback instead,
+ passing it CODE and an English error string.
+ Returns whatever the callback returned.
+ Assumes that the locale doesn't change between two calls. */
+extern long unicode_to_mb (unsigned int code,
+ long (*success) (const char *buf, size_t buflen,
+ void *callback_arg),
+ long (*failure) (unsigned int code, const char *msg,
+ void *callback_arg),
+ void *callback_arg);
+
+/* Outputs the Unicode character CODE to the output stream STREAM.
+ Upon failure, exit if exit_on_error is true, otherwise output a fallback
+ notation. */
+extern void print_unicode_char (FILE *stream, unsigned int code,
+ int exit_on_error);
+
+/* Simple success callback that outputs the converted string.
+ The STREAM is passed as callback_arg. */
+extern long fwrite_success_callback (const char *buf, size_t buflen,
+ void *callback_arg);
+
+#endif
diff --git a/gnulib/lib/uniconv.in.h b/gnulib/lib/uniconv.in.h
new file mode 100644
index 0000000..4bcdb19
--- /dev/null
+++ b/gnulib/lib/uniconv.in.h
@@ -0,0 +1,172 @@
+/* Conversions between Unicode and legacy encodings.
+ Copyright (C) 2002, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICONV_H
+#define _UNICONV_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Get enum iconv_ilseq_handler. */
+#include "iconveh.h"
+
+/* Get uniconv_register_autodetect() declaration. */
+#include "striconveha.h"
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Converts an entire string, possibly including NUL bytes, from one encoding
+ to a Unicode encoding.
+ Converts a memory region given in encoding FROMCODE. FROMCODE is as for
+ iconv_open(3).
+ The input is in the memory region between SRC (inclusive) and SRC + SRCLEN
+ (exclusive).
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ RESULTBUF and *LENGTHP should initially be a scratch buffer and its size,
+ or *RESULTBUF can be NULL.
+ May erase the contents of the memory at RESULTBUF.
+ If successful: The resulting Unicode string (non-NULL) is returned and its
+ length stored in *LENGTHP. The resulting string is RESULTBUF if no dynamic
+ memory allocation was necessary, or a freshly allocated memory block
+ otherwise.
+ In case of error: NULL is returned and errno is set. Particular errno
+ values: EINVAL, EILSEQ, ENOMEM. */
+extern uint8_t *
+ u8_conv_from_encoding (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_conv_from_encoding (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_conv_from_encoding (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ uint32_t *resultbuf, size_t *lengthp);
+
+/* Converts an entire Unicode string, possibly including NUL units, from a
+ Unicode encoding to a given encoding.
+ Converts a memory region to encoding TOCODE. TOCODE is as for
+ iconv_open(3).
+ The input is in the memory region between SRC (inclusive) and SRC + SRCLEN
+ (exclusive).
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ RESULTBUF and *LENGTHP should initially be a scratch buffer and its size,
+ or RESULTBUF can be NULL.
+ May erase the contents of the memory at RESULTBUF.
+ If successful: The resulting string (non-NULL) is returned and its length
+ stored in *LENGTHP. The resulting string is RESULTBUF if no dynamic memory
+ allocation was necessary, or a freshly allocated memory block otherwise.
+ In case of error: NULL is returned and errno is set. Particular errno
+ values: EINVAL, EILSEQ, ENOMEM. */
+extern char *
+ u8_conv_to_encoding (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const uint8_t *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u16_conv_to_encoding (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const uint16_t *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u32_conv_to_encoding (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const uint32_t *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp);
+
+/* Converts a NUL terminated string from a given encoding.
+ The result is malloc allocated, or NULL (with errno set) in case of error.
+ Particular errno values: EILSEQ, ENOMEM. */
+extern uint8_t *
+ u8_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler);
+extern uint16_t *
+ u16_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler);
+extern uint32_t *
+ u32_strconv_from_encoding (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler);
+
+/* Converts a NUL terminated string to a given encoding.
+ The result is malloc allocated, or NULL (with errno set) in case of error.
+ Particular errno values: EILSEQ, ENOMEM. */
+extern char *
+ u8_strconv_to_encoding (const uint8_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+extern char *
+ u16_strconv_to_encoding (const uint16_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+extern char *
+ u32_strconv_to_encoding (const uint32_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler);
+
+/* Converts a NUL terminated string from the locale encoding.
+ The result is malloc allocated, or NULL (with errno set) in case of error.
+ Particular errno values: ENOMEM. */
+extern uint8_t *
+ u8_strconv_from_locale (const char *string);
+extern uint16_t *
+ u16_strconv_from_locale (const char *string);
+extern uint32_t *
+ u32_strconv_from_locale (const char *string);
+
+/* Converts a NUL terminated string to the locale encoding.
+ The result is malloc allocated, or NULL (with errno set) in case of error.
+ Particular errno values: ENOMEM. */
+extern char *
+ u8_strconv_to_locale (const uint8_t *string);
+extern char *
+ u16_strconv_to_locale (const uint16_t *string);
+extern char *
+ u32_strconv_to_locale (const uint32_t *string);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICONV_H */
diff --git a/gnulib/lib/uniconv/u-conv-from-enc.h b/gnulib/lib/uniconv/u-conv-from-enc.h
new file mode 100644
index 0000000..928eed1
--- /dev/null
+++ b/gnulib/lib/uniconv/u-conv-from-enc.h
@@ -0,0 +1,91 @@
+/* Conversion to UTF-16/UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ UNIT *resultbuf, size_t *lengthp)
+{
+#if HAVE_UTF_NAME
+ char *result = (char *) resultbuf;
+ size_t length = *lengthp * sizeof (UNIT);
+
+ if (mem_iconveha (src, srclen, fromcode, UTF_NAME, true, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+ if (offsets != NULL)
+ {
+ /* Convert 'char *' offsets to 'UNIT *' offsets. */
+ size_t *offsets_end = offsets + srclen;
+ size_t *o;
+
+ for (o = offsets; o < offsets_end; o++)
+ if (*o != (size_t)(-1))
+ *o = *o / sizeof (UNIT);
+ }
+ if ((length % sizeof (UNIT)) != 0)
+ abort ();
+ *lengthp = length / sizeof (UNIT);
+ return (UNIT *) result;
+#else
+ uint8_t *utf8_string;
+ size_t utf8_length;
+ UNIT *result;
+
+ utf8_string =
+ u8_conv_from_encoding (fromcode, handler, src, srclen, offsets,
+ NULL, &utf8_length);
+ if (utf8_string == NULL)
+ return NULL;
+ result = U8_TO_U (utf8_string, utf8_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ int saved_errno = errno;
+ free (utf8_string);
+ errno = saved_errno;
+ return NULL;
+ }
+ if (offsets != NULL)
+ {
+ size_t length = *lengthp;
+ size_t *offsets_end = offsets + srclen;
+ size_t *o;
+ size_t off8 = 0; /* offset into utf8_string */
+ size_t offunit = 0; /* offset into result */
+
+ for (o = offsets; o < offsets_end; o++)
+ if (*o != (size_t)(-1))
+ {
+ while (off8 < *o)
+ {
+ int count8 = u8_mblen (utf8_string + off8, utf8_length - off8);
+ int countunit = U_MBLEN (result + offunit, length - offunit);
+ if (count8 < 0 || countunit < 0)
+ abort ();
+ off8 += count8;
+ offunit += countunit;
+ }
+ if (*o != off8)
+ abort ();
+ *o = offunit;
+ }
+ }
+ free (utf8_string);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u-conv-to-enc.h b/gnulib/lib/uniconv/u-conv-to-enc.h
new file mode 100644
index 0000000..281d153
--- /dev/null
+++ b/gnulib/lib/uniconv/u-conv-to-enc.h
@@ -0,0 +1,156 @@
+/* Conversion from UTF-16/UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const UNIT *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp)
+{
+#if HAVE_UTF_NAME
+ size_t *scaled_offsets;
+ char *result;
+ size_t length;
+
+ if (offsets != NULL && srclen > 0)
+ {
+ scaled_offsets =
+ (size_t *) malloc (srclen * sizeof (UNIT) * sizeof (size_t));
+ if (scaled_offsets == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ scaled_offsets = NULL;
+
+ result = resultbuf;
+ length = *lengthp;
+ if (mem_iconveha ((const char *) src, srclen * sizeof (UNIT),
+ UTF_NAME, tocode,
+ handler == iconveh_question_mark, handler,
+ scaled_offsets, &result, &length) < 0)
+ {
+ int saved_errno = errno;
+ free (scaled_offsets);
+ errno = saved_errno;
+ return NULL;
+ }
+
+ if (offsets != NULL)
+ {
+ /* Convert scaled_offsets[srclen * sizeof (UNIT)] to
+ offsets[srclen]. */
+ size_t i;
+
+ for (i = 0; i < srclen; i++)
+ offsets[i] = scaled_offsets[i * sizeof (UNIT)];
+ free (scaled_offsets);
+ }
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return result;
+#else
+ uint8_t tmpbuf[4096];
+ size_t tmpbufsize = SIZEOF (tmpbuf);
+ uint8_t *utf8_src;
+ size_t utf8_srclen;
+ size_t *scaled_offsets;
+ char *result;
+
+ utf8_src = U_TO_U8 (src, srclen, tmpbuf, &tmpbufsize);
+ if (utf8_src == NULL)
+ return NULL;
+ utf8_srclen = tmpbufsize;
+
+ if (offsets != NULL && utf8_srclen > 0)
+ {
+ scaled_offsets = (size_t *) malloc (utf8_srclen * sizeof (size_t));
+ if (scaled_offsets == NULL)
+ {
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ else
+ scaled_offsets = NULL;
+
+ result = u8_conv_to_encoding (tocode, handler, utf8_src, utf8_srclen,
+ scaled_offsets, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ int saved_errno = errno;
+ free (scaled_offsets);
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ errno = saved_errno;
+ return NULL;
+ }
+ if (offsets != NULL)
+ {
+ size_t iunit; /* offset into src */
+ size_t i8; /* offset into utf8_src */
+
+ for (iunit = 0; iunit < srclen; iunit++)
+ offsets[iunit] = (size_t)(-1);
+
+ iunit = 0;
+ i8 = 0;
+ while (iunit < srclen && i8 < utf8_srclen)
+ {
+ int countunit;
+ int count8;
+
+ offsets[iunit] = scaled_offsets[i8];
+
+ countunit = U_MBLEN (src + iunit, srclen - iunit);
+ count8 = u8_mblen (utf8_src + i8, utf8_srclen - i8);
+ if (countunit < 0 || count8 < 0)
+ abort ();
+ iunit += countunit;
+ i8 += count8;
+ }
+ /* Check that utf8_src has been traversed entirely. */
+ if (i8 < utf8_srclen)
+ abort ();
+ /* Check that src has been traversed entirely, except possibly for an
+ incomplete sequence of units at the end. */
+ if (iunit < srclen)
+ {
+ offsets[iunit] = *lengthp;
+ if (!(U_MBLEN (src + iunit, srclen - iunit) < 0))
+ abort ();
+ }
+ free (scaled_offsets);
+ }
+ if (utf8_src != tmpbuf)
+ free (utf8_src);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u-strconv-from-enc.h b/gnulib/lib/uniconv/u-strconv-from-enc.h
new file mode 100644
index 0000000..37f111f
--- /dev/null
+++ b/gnulib/lib/uniconv/u-strconv-from-enc.h
@@ -0,0 +1,40 @@
+/* Conversion to UTF-8/UTF-16/UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const char *string,
+ const char *fromcode,
+ enum iconv_ilseq_handler handler)
+{
+ UNIT *result;
+ size_t length;
+
+ result =
+ U_CONV_FROM_ENCODING (fromcode, handler,
+ string, strlen (string) + 1, NULL,
+ NULL, &length);
+ if (result == NULL)
+ return NULL;
+ /* Verify the result has exactly one NUL unit, at the end. */
+ if (!(length > 0 && result[length-1] == 0
+ && U_STRLEN (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+}
diff --git a/gnulib/lib/uniconv/u-strconv-to-enc.h b/gnulib/lib/uniconv/u-strconv-to-enc.h
new file mode 100644
index 0000000..ff5ffae
--- /dev/null
+++ b/gnulib/lib/uniconv/u-strconv-to-enc.h
@@ -0,0 +1,63 @@
+/* Conversion from UTF-16/UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler)
+{
+#if HAVE_UTF_NAME
+ char *result = NULL;
+ size_t length = 0;
+
+ if (mem_iconveha ((const char *) string, (U_STRLEN (string) + 1) * sizeof (UNIT),
+ UTF_NAME, tocode,
+ handler == iconveh_question_mark, handler,
+ NULL, &result, &length) < 0)
+ return NULL;
+ /* Verify the result has exactly one NUL byte, at the end. */
+ if (!(length > 0 && result[length-1] == '\0' && strlen (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+#else
+ uint8_t tmpbuf[4096];
+ size_t tmpbufsize = SIZEOF (tmpbuf);
+ uint8_t *utf8_string;
+ char *result;
+
+ utf8_string = U_TO_U8 (string, U_STRLEN (string) + 1, tmpbuf, &tmpbufsize);
+ if (utf8_string == NULL)
+ return NULL;
+ result = u8_strconv_to_encoding (utf8_string, tocode, handler);
+ if (result == NULL)
+ {
+ if (utf8_string != tmpbuf)
+ {
+ int saved_errno = errno;
+ free (utf8_string);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+ if (utf8_string != tmpbuf)
+ free (utf8_string);
+ return result;
+#endif
+}
diff --git a/gnulib/lib/uniconv/u16-conv-from-enc.c b/gnulib/lib/uniconv/u16-conv-from-enc.c
new file mode 100644
index 0000000..a7d5ed2
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-conv-from-enc.c
@@ -0,0 +1,47 @@
+/* Conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+#define FUNC u16_conv_from_encoding
+#define UNIT uint16_t
+#define U8_TO_U u8_to_u16
+#define U_MBLEN u16_mblen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u16-conv-to-enc.c b/gnulib/lib/uniconv/u16-conv-to-enc.c
new file mode 100644
index 0000000..8259faa
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-conv-to-enc.c
@@ -0,0 +1,177 @@
+/* Conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+
+#if !defined UTF16_NAME
+
+/* A variant of u16_to_u8 that treats an incomplete sequence of units at the
+ end as a harmless no-op, rather than reporting it as an EILSEQ error. */
+
+#define FUNC u16_to_u8_lenient
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint8_t
+
+static DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (count == -2)
+ /* Incomplete sequence of units. */
+ break;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
+
+#undef DST_UNIT
+#undef SRC_UNIT
+#undef FUNC
+
+#endif
+
+
+#define FUNC u16_conv_to_encoding
+#define UNIT uint16_t
+#define U_TO_U8 u16_to_u8_lenient
+#define U_MBLEN u16_mblen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-from-enc.c b/gnulib/lib/uniconv/u16-strconv-from-enc.c
new file mode 100644
index 0000000..4477911
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-16 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u16_strconv_from_encoding
+#define UNIT uint16_t
+#define U_CONV_FROM_ENCODING u16_conv_from_encoding
+#define U_STRLEN u16_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-from-locale.c b/gnulib/lib/uniconv/u16-strconv-from-locale.c
new file mode 100644
index 0000000..79b5fad
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-16 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint16_t *
+u16_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u16_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u16-strconv-to-enc.c b/gnulib/lib/uniconv/u16-strconv-to-enc.c
new file mode 100644
index 0000000..d883bbf
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-to-enc.c
@@ -0,0 +1,50 @@
+/* Conversion from UTF-16 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-16 encoding with machine dependent endianness and alignment. */
+#if defined _LIBICONV_VERSION || (((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__)
+# ifdef WORDS_BIGENDIAN
+# define UTF16_NAME "UTF-16BE"
+# else
+# define UTF16_NAME "UTF-16LE"
+# endif
+#endif
+
+#define FUNC u16_strconv_to_encoding
+#define UNIT uint16_t
+#define U_TO_U8 u16_to_u8
+#define U_STRLEN u16_strlen
+#if defined UTF16_NAME
+# define UTF_NAME UTF16_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-strconv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u16-strconv-to-locale.c b/gnulib/lib/uniconv/u16-strconv-to-locale.c
new file mode 100644
index 0000000..5090270
--- /dev/null
+++ b/gnulib/lib/uniconv/u16-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-16 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u16_strconv_to_locale (const uint16_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u16_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u32-conv-from-enc.c b/gnulib/lib/uniconv/u32-conv-from-enc.c
new file mode 100644
index 0000000..7d002ad
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-conv-from-enc.c
@@ -0,0 +1,46 @@
+/* Conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_conv_from_encoding
+#define UNIT uint32_t
+#define U8_TO_U u8_to_u32
+#define U_MBLEN u32_mblen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u32-conv-to-enc.c b/gnulib/lib/uniconv/u32-conv-to-enc.c
new file mode 100644
index 0000000..11f094e
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-conv-to-enc.c
@@ -0,0 +1,49 @@
+/* Conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_conv_to_encoding
+#define UNIT uint32_t
+#define U_TO_U8 u32_to_u8
+#define U_MBLEN u32_mblen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-conv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-from-enc.c b/gnulib/lib/uniconv/u32-strconv-from-enc.c
new file mode 100644
index 0000000..03a02fd
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-32 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u32_strconv_from_encoding
+#define UNIT uint32_t
+#define U_CONV_FROM_ENCODING u32_conv_from_encoding
+#define U_STRLEN u32_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-from-locale.c b/gnulib/lib/uniconv/u32-strconv-from-locale.c
new file mode 100644
index 0000000..61edff8
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-32 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint32_t *
+u32_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u32_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u32-strconv-to-enc.c b/gnulib/lib/uniconv/u32-strconv-to-enc.c
new file mode 100644
index 0000000..a25b47b
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-to-enc.c
@@ -0,0 +1,49 @@
+/* Conversion from UTF-32 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "striconveha.h"
+#include "unistr.h"
+
+#define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
+
+/* Name of UTF-32 or UCS-4 encoding with machine dependent endianness and
+ alignment. */
+#if defined _LIBICONV_VERSION
+# define UTF32_NAME "UCS-4-INTERNAL"
+#elif ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) && !defined __UCLIBC__
+# define UTF32_NAME "WCHAR_T"
+#endif
+
+#define FUNC u32_strconv_to_encoding
+#define UNIT uint32_t
+#define U_TO_U8 u32_to_u8
+#define U_STRLEN u32_strlen
+#if defined UTF32_NAME
+# define UTF_NAME UTF32_NAME
+# define HAVE_UTF_NAME 1
+#endif
+#include "u-strconv-to-enc.h"
diff --git a/gnulib/lib/uniconv/u32-strconv-to-locale.c b/gnulib/lib/uniconv/u32-strconv-to-locale.c
new file mode 100644
index 0000000..7cdb15d
--- /dev/null
+++ b/gnulib/lib/uniconv/u32-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-32 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u32_strconv_to_locale (const uint32_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u32_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u8-conv-from-enc.c b/gnulib/lib/uniconv/u8-conv-from-enc.c
new file mode 100644
index 0000000..a461b60
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-conv-from-enc.c
@@ -0,0 +1,105 @@
+/* Conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+uint8_t *
+u8_conv_from_encoding (const char *fromcode,
+ enum iconv_ilseq_handler handler,
+ const char *src, size_t srclen,
+ size_t *offsets,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ if (STRCASEEQ (fromcode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+ uint8_t *result;
+
+ if (u8_check ((const uint8_t *) src, srclen))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+
+ if (offsets != NULL)
+ {
+ size_t i;
+
+ for (i = 0; i < srclen; )
+ {
+ int count = u8_mblen ((const uint8_t *) src + i, srclen - i);
+ /* We can rely on count > 0 because of the previous u8_check. */
+ if (count <= 0)
+ abort ();
+ offsets[i] = i;
+ i++;
+ while (--count > 0)
+ offsets[i++] = (size_t)(-1);
+ }
+ }
+
+ /* Memory allocation. */
+ if (resultbuf != NULL && *lengthp >= srclen)
+ result = resultbuf;
+ else
+ {
+ result = (uint8_t *) malloc (srclen > 0 ? srclen : 1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+
+ memcpy ((char *) result, src, srclen);
+ *lengthp = srclen;
+ return result;
+ }
+ else
+ {
+ char *result = (char *) resultbuf;
+ size_t length = *lengthp;
+
+ if (mem_iconveha (src, srclen, fromcode, "UTF-8", true, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return (uint8_t *) result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-conv-to-enc.c b/gnulib/lib/uniconv/u8-conv-to-enc.c
new file mode 100644
index 0000000..b9a7614
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-conv-to-enc.c
@@ -0,0 +1,92 @@
+/* Conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+char *
+u8_conv_to_encoding (const char *tocode,
+ enum iconv_ilseq_handler handler,
+ const uint8_t *src, size_t srclen,
+ size_t *offsets,
+ char *resultbuf, size_t *lengthp)
+{
+ if (STRCASEEQ (tocode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ char *result;
+
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+#if CONFIG_UNICODE_SAFETY
+ if (u8_check (src, srclen))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+#endif
+
+ /* Memory allocation. */
+ if (resultbuf != NULL && *lengthp >= srclen)
+ result = resultbuf;
+ else
+ {
+ result = (char *) malloc (srclen > 0 ? srclen : 1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+
+ memcpy (result, (const char *) src, srclen);
+ *lengthp = srclen;
+ return result;
+ }
+ else
+ {
+ char *result = resultbuf;
+ size_t length = *lengthp;
+
+ if (mem_iconveha ((const char *) src, srclen,
+ "UTF-8", tocode,
+ handler == iconveh_question_mark, handler,
+ offsets, &result, &length) < 0)
+ return NULL;
+
+ if (result == NULL) /* when (resultbuf == NULL && length == 0) */
+ {
+ result = (char *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *lengthp = length;
+ return result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-from-enc.c b/gnulib/lib/uniconv/u8-strconv-from-enc.c
new file mode 100644
index 0000000..162284b
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-from-enc.c
@@ -0,0 +1,34 @@
+/* Conversion to UTF-8 from legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+
+#define FUNC u8_strconv_from_encoding
+#define UNIT uint8_t
+#define U_CONV_FROM_ENCODING u8_conv_from_encoding
+#define U_STRLEN u8_strlen
+#include "u-strconv-from-enc.h"
diff --git a/gnulib/lib/uniconv/u8-strconv-from-locale.c b/gnulib/lib/uniconv/u8-strconv-from-locale.c
new file mode 100644
index 0000000..2175d52
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-from-locale.c
@@ -0,0 +1,29 @@
+/* Conversion to UTF-8 from the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+uint8_t *
+u8_strconv_from_locale (const char *string)
+{
+ const char *encoding = locale_charset ();
+ return u8_strconv_from_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-to-enc.c b/gnulib/lib/uniconv/u8-strconv-to-enc.c
new file mode 100644
index 0000000..4cbf55a
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-to-enc.c
@@ -0,0 +1,79 @@
+/* Conversion from UTF-8 to legacy encodings.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-strcaseeq.h"
+#include "striconveha.h"
+#include "unistr.h"
+
+char *
+u8_strconv_to_encoding (const uint8_t *string,
+ const char *tocode,
+ enum iconv_ilseq_handler handler)
+{
+ char *result;
+ size_t length;
+
+ if (STRCASEEQ (tocode, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ {
+ /* Conversion from UTF-8 to UTF-8. No need to go through iconv(). */
+ length = u8_strlen (string) + 1;
+#if CONFIG_UNICODE_SAFETY
+ if (u8_check (string, length))
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+#endif
+ result = (char *) malloc (length);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ memcpy (result, (const char *) string, length);
+ return result;
+ }
+ else
+ {
+ result = NULL;
+ length = 0;
+ if (mem_iconveha ((const char *) string, u8_strlen (string) + 1,
+ "UTF-8", tocode,
+ handler == iconveh_question_mark, handler,
+ NULL, &result, &length) < 0)
+ return NULL;
+ /* Verify the result has exactly one NUL byte, at the end. */
+ if (!(length > 0 && result[length-1] == '\0'
+ && strlen (result) == length-1))
+ {
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ return result;
+ }
+}
diff --git a/gnulib/lib/uniconv/u8-strconv-to-locale.c b/gnulib/lib/uniconv/u8-strconv-to-locale.c
new file mode 100644
index 0000000..97a97bb
--- /dev/null
+++ b/gnulib/lib/uniconv/u8-strconv-to-locale.c
@@ -0,0 +1,29 @@
+/* Conversion from UTF-8 to the locale encoding.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniconv.h"
+
+char *
+u8_strconv_to_locale (const uint8_t *string)
+{
+ const char *encoding = locale_charset ();
+ return u8_strconv_to_encoding (string, encoding, iconveh_question_mark);
+}
diff --git a/gnulib/lib/unictype.in.h b/gnulib/lib/unictype.in.h
new file mode 100644
index 0000000..19faea1
--- /dev/null
+++ b/gnulib/lib/unictype.in.h
@@ -0,0 +1,881 @@
+/* Unicode character classification and properties.
+ Copyright (C) 2002, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNICTYPE_H
+#define _UNICTYPE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Field 1 of Unicode Character Database: Character name.
+ See "uniname.h". */
+
+/* ========================================================================= */
+
+/* Field 2 of Unicode Character Database: General category. */
+
+/* Data type denoting a General category value. This is not just a bitmask,
+ but rather a bitmask and a pointer to the lookup table, so that programs
+ that use only the predefined bitmasks (i.e. don't combine bitmasks with &
+ and |) don't have a link-time dependency towards the big general table. */
+typedef struct
+{
+ uint32_t bitmask : 31;
+ /*bool*/ unsigned int generic : 1;
+ union
+ {
+ const void *table; /* when generic is 0 */
+ bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */
+ } lookup;
+}
+uc_general_category_t;
+
+/* Bits and bit masks denoting General category values. UnicodeData-3.2.0.html
+ says a 32-bit integer will always suffice to represent them.
+ These bit masks can only be used with the uc_is_general_category_withtable
+ function. */
+enum
+{
+ UC_CATEGORY_MASK_L = 0x0000001f,
+ UC_CATEGORY_MASK_LC = 0x00000007,
+ UC_CATEGORY_MASK_Lu = 0x00000001,
+ UC_CATEGORY_MASK_Ll = 0x00000002,
+ UC_CATEGORY_MASK_Lt = 0x00000004,
+ UC_CATEGORY_MASK_Lm = 0x00000008,
+ UC_CATEGORY_MASK_Lo = 0x00000010,
+ UC_CATEGORY_MASK_M = 0x000000e0,
+ UC_CATEGORY_MASK_Mn = 0x00000020,
+ UC_CATEGORY_MASK_Mc = 0x00000040,
+ UC_CATEGORY_MASK_Me = 0x00000080,
+ UC_CATEGORY_MASK_N = 0x00000700,
+ UC_CATEGORY_MASK_Nd = 0x00000100,
+ UC_CATEGORY_MASK_Nl = 0x00000200,
+ UC_CATEGORY_MASK_No = 0x00000400,
+ UC_CATEGORY_MASK_P = 0x0003f800,
+ UC_CATEGORY_MASK_Pc = 0x00000800,
+ UC_CATEGORY_MASK_Pd = 0x00001000,
+ UC_CATEGORY_MASK_Ps = 0x00002000,
+ UC_CATEGORY_MASK_Pe = 0x00004000,
+ UC_CATEGORY_MASK_Pi = 0x00008000,
+ UC_CATEGORY_MASK_Pf = 0x00010000,
+ UC_CATEGORY_MASK_Po = 0x00020000,
+ UC_CATEGORY_MASK_S = 0x003c0000,
+ UC_CATEGORY_MASK_Sm = 0x00040000,
+ UC_CATEGORY_MASK_Sc = 0x00080000,
+ UC_CATEGORY_MASK_Sk = 0x00100000,
+ UC_CATEGORY_MASK_So = 0x00200000,
+ UC_CATEGORY_MASK_Z = 0x01c00000,
+ UC_CATEGORY_MASK_Zs = 0x00400000,
+ UC_CATEGORY_MASK_Zl = 0x00800000,
+ UC_CATEGORY_MASK_Zp = 0x01000000,
+ UC_CATEGORY_MASK_C = 0x3e000000,
+ UC_CATEGORY_MASK_Cc = 0x02000000,
+ UC_CATEGORY_MASK_Cf = 0x04000000,
+ UC_CATEGORY_MASK_Cs = 0x08000000,
+ UC_CATEGORY_MASK_Co = 0x10000000,
+ UC_CATEGORY_MASK_Cn = 0x20000000
+};
+
+/* Predefined General category values. */
+extern const uc_general_category_t UC_CATEGORY_L;
+extern const uc_general_category_t UC_CATEGORY_LC;
+extern const uc_general_category_t UC_CATEGORY_Lu;
+extern const uc_general_category_t UC_CATEGORY_Ll;
+extern const uc_general_category_t UC_CATEGORY_Lt;
+extern const uc_general_category_t UC_CATEGORY_Lm;
+extern const uc_general_category_t UC_CATEGORY_Lo;
+extern const uc_general_category_t UC_CATEGORY_M;
+extern const uc_general_category_t UC_CATEGORY_Mn;
+extern const uc_general_category_t UC_CATEGORY_Mc;
+extern const uc_general_category_t UC_CATEGORY_Me;
+extern const uc_general_category_t UC_CATEGORY_N;
+extern const uc_general_category_t UC_CATEGORY_Nd;
+extern const uc_general_category_t UC_CATEGORY_Nl;
+extern const uc_general_category_t UC_CATEGORY_No;
+extern const uc_general_category_t UC_CATEGORY_P;
+extern const uc_general_category_t UC_CATEGORY_Pc;
+extern const uc_general_category_t UC_CATEGORY_Pd;
+extern const uc_general_category_t UC_CATEGORY_Ps;
+extern const uc_general_category_t UC_CATEGORY_Pe;
+extern const uc_general_category_t UC_CATEGORY_Pi;
+extern const uc_general_category_t UC_CATEGORY_Pf;
+extern const uc_general_category_t UC_CATEGORY_Po;
+extern const uc_general_category_t UC_CATEGORY_S;
+extern const uc_general_category_t UC_CATEGORY_Sm;
+extern const uc_general_category_t UC_CATEGORY_Sc;
+extern const uc_general_category_t UC_CATEGORY_Sk;
+extern const uc_general_category_t UC_CATEGORY_So;
+extern const uc_general_category_t UC_CATEGORY_Z;
+extern const uc_general_category_t UC_CATEGORY_Zs;
+extern const uc_general_category_t UC_CATEGORY_Zl;
+extern const uc_general_category_t UC_CATEGORY_Zp;
+extern const uc_general_category_t UC_CATEGORY_C;
+extern const uc_general_category_t UC_CATEGORY_Cc;
+extern const uc_general_category_t UC_CATEGORY_Cf;
+extern const uc_general_category_t UC_CATEGORY_Cs;
+extern const uc_general_category_t UC_CATEGORY_Co;
+extern const uc_general_category_t UC_CATEGORY_Cn;
+/* Non-public. */
+extern const uc_general_category_t _UC_CATEGORY_NONE;
+
+/* Alias names for predefined General category values. */
+#define UC_LETTER UC_CATEGORY_L
+#define UC_CASED_LETTER UC_CATEGORY_LC
+#define UC_UPPERCASE_LETTER UC_CATEGORY_Lu
+#define UC_LOWERCASE_LETTER UC_CATEGORY_Ll
+#define UC_TITLECASE_LETTER UC_CATEGORY_Lt
+#define UC_MODIFIER_LETTER UC_CATEGORY_Lm
+#define UC_OTHER_LETTER UC_CATEGORY_Lo
+#define UC_MARK UC_CATEGORY_M
+#define UC_NON_SPACING_MARK UC_CATEGORY_Mn
+#define UC_COMBINING_SPACING_MARK UC_CATEGORY_Mc
+#define UC_ENCLOSING_MARK UC_CATEGORY_Me
+#define UC_NUMBER UC_CATEGORY_N
+#define UC_DECIMAL_DIGIT_NUMBER UC_CATEGORY_Nd
+#define UC_LETTER_NUMBER UC_CATEGORY_Nl
+#define UC_OTHER_NUMBER UC_CATEGORY_No
+#define UC_PUNCTUATION UC_CATEGORY_P
+#define UC_CONNECTOR_PUNCTUATION UC_CATEGORY_Pc
+#define UC_DASH_PUNCTUATION UC_CATEGORY_Pd
+#define UC_OPEN_PUNCTUATION UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */
+#define UC_CLOSE_PUNCTUATION UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */
+#define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi
+#define UC_FINAL_QUOTE_PUNCTUATION UC_CATEGORY_Pf
+#define UC_OTHER_PUNCTUATION UC_CATEGORY_Po
+#define UC_SYMBOL UC_CATEGORY_S
+#define UC_MATH_SYMBOL UC_CATEGORY_Sm
+#define UC_CURRENCY_SYMBOL UC_CATEGORY_Sc
+#define UC_MODIFIER_SYMBOL UC_CATEGORY_Sk
+#define UC_OTHER_SYMBOL UC_CATEGORY_So
+#define UC_SEPARATOR UC_CATEGORY_Z
+#define UC_SPACE_SEPARATOR UC_CATEGORY_Zs
+#define UC_LINE_SEPARATOR UC_CATEGORY_Zl
+#define UC_PARAGRAPH_SEPARATOR UC_CATEGORY_Zp
+#define UC_OTHER UC_CATEGORY_C
+#define UC_CONTROL UC_CATEGORY_Cc
+#define UC_FORMAT UC_CATEGORY_Cf
+#define UC_SURROGATE UC_CATEGORY_Cs /* all of them are invalid characters */
+#define UC_PRIVATE_USE UC_CATEGORY_Co
+#define UC_UNASSIGNED UC_CATEGORY_Cn /* some of them are invalid characters */
+
+/* Return the union of two general categories.
+ This corresponds to the unions of the two sets of characters. */
+extern uc_general_category_t
+ uc_general_category_or (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the intersection of two general categories as bit masks.
+ This *does*not* correspond to the intersection of the two sets of
+ characters. */
+extern uc_general_category_t
+ uc_general_category_and (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the intersection of a general category with the complement of a
+ second general category, as bit masks.
+ This *does*not* correspond to the intersection with complement, when
+ viewing the categories as sets of characters. */
+extern uc_general_category_t
+ uc_general_category_and_not (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the name of a general category. */
+extern const char *
+ uc_general_category_name (uc_general_category_t category);
+
+/* Return the long name of a general category. */
+extern const char *
+ uc_general_category_long_name (uc_general_category_t category);
+
+/* Return the general category given by name, e.g. "Lu", or by long name,
+ e.g. "Uppercase Letter". */
+extern uc_general_category_t
+ uc_general_category_byname (const char *category_name);
+
+/* Return the general category of a Unicode character. */
+extern uc_general_category_t
+ uc_general_category (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given category.
+ The CATEGORY argument can be the combination of several predefined
+ general categories. */
+extern bool
+ uc_is_general_category (ucs4_t uc, uc_general_category_t category);
+/* Likewise. This function uses a big table comprising all categories. */
+extern bool
+ uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask);
+
+/* ========================================================================= */
+
+/* Field 3 of Unicode Character Database: Canonical combining class. */
+
+/* The possible results of uc_combining_class (0..255) are described in
+ UCD.html. The list here is not definitive; more values can be added
+ in future versions. */
+enum
+{
+ UC_CCC_NR = 0, /* Not Reordered */
+ UC_CCC_OV = 1, /* Overlay */
+ UC_CCC_NK = 7, /* Nukta */
+ UC_CCC_KV = 8, /* Kana Voicing */
+ UC_CCC_VR = 9, /* Virama */
+ UC_CCC_ATBL = 200, /* Attached Below Left */
+ UC_CCC_ATB = 202, /* Attached Below */
+ UC_CCC_ATA = 214, /* Attached Above */
+ UC_CCC_ATAR = 216, /* Attached Above Right */
+ UC_CCC_BL = 218, /* Below Left */
+ UC_CCC_B = 220, /* Below */
+ UC_CCC_BR = 222, /* Below Right */
+ UC_CCC_L = 224, /* Left */
+ UC_CCC_R = 226, /* Right */
+ UC_CCC_AL = 228, /* Above Left */
+ UC_CCC_A = 230, /* Above */
+ UC_CCC_AR = 232, /* Above Right */
+ UC_CCC_DB = 233, /* Double Below */
+ UC_CCC_DA = 234, /* Double Above */
+ UC_CCC_IS = 240 /* Iota Subscript */
+};
+
+/* Return the canonical combining class of a Unicode character. */
+extern int
+ uc_combining_class (ucs4_t uc);
+
+/* Return the name of a canonical combining class. */
+extern const char *
+ uc_combining_class_name (int ccc);
+
+/* Return the long name of a canonical combining class. */
+extern const char *
+ uc_combining_class_long_name (int ccc);
+
+/* Return the canonical combining class given by name, e.g. "BL", or by long
+ name, e.g. "Below Left". */
+extern int
+ uc_combining_class_byname (const char *ccc_name);
+
+/* ========================================================================= */
+
+/* Field 4 of Unicode Character Database: Bidi class.
+ Before Unicode 4.0, this field was called "Bidirectional category". */
+
+enum
+{
+ UC_BIDI_L, /* Left-to-Right */
+ UC_BIDI_LRE, /* Left-to-Right Embedding */
+ UC_BIDI_LRO, /* Left-to-Right Override */
+ UC_BIDI_R, /* Right-to-Left */
+ UC_BIDI_AL, /* Right-to-Left Arabic */
+ UC_BIDI_RLE, /* Right-to-Left Embedding */
+ UC_BIDI_RLO, /* Right-to-Left Override */
+ UC_BIDI_PDF, /* Pop Directional Format */
+ UC_BIDI_EN, /* European Number */
+ UC_BIDI_ES, /* European Number Separator */
+ UC_BIDI_ET, /* European Number Terminator */
+ UC_BIDI_AN, /* Arabic Number */
+ UC_BIDI_CS, /* Common Number Separator */
+ UC_BIDI_NSM, /* Non-Spacing Mark */
+ UC_BIDI_BN, /* Boundary Neutral */
+ UC_BIDI_B, /* Paragraph Separator */
+ UC_BIDI_S, /* Segment Separator */
+ UC_BIDI_WS, /* Whitespace */
+ UC_BIDI_ON /* Other Neutral */
+};
+
+/* Return the name of a bidi class. */
+extern const char *
+ uc_bidi_class_name (int bidi_class);
+/* Same; obsolete function name. */
+extern const char *
+ uc_bidi_category_name (int category);
+
+/* Return the long name of a bidi class. */
+extern const char *
+ uc_bidi_class_long_name (int bidi_class);
+
+/* Return the bidi class given by name, e.g. "LRE", or by long name, e.g.
+ "Left-to-Right Embedding". */
+extern int
+ uc_bidi_class_byname (const char *bidi_class_name);
+/* Same; obsolete function name. */
+extern int
+ uc_bidi_category_byname (const char *category_name);
+
+/* Return the bidi class of a Unicode character. */
+extern int
+ uc_bidi_class (ucs4_t uc);
+/* Same; obsolete function name. */
+extern int
+ uc_bidi_category (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given bidi class. */
+extern bool
+ uc_is_bidi_class (ucs4_t uc, int bidi_class);
+/* Same; obsolete function name. */
+extern bool
+ uc_is_bidi_category (ucs4_t uc, int category);
+
+/* ========================================================================= */
+
+/* Field 5 of Unicode Character Database: Character decomposition mapping.
+ See "uninorm.h". */
+
+/* ========================================================================= */
+
+/* Field 6 of Unicode Character Database: Decimal digit value. */
+
+/* Return the decimal digit value of a Unicode character. */
+extern int
+ uc_decimal_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 7 of Unicode Character Database: Digit value. */
+
+/* Return the digit value of a Unicode character. */
+extern int
+ uc_digit_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 8 of Unicode Character Database: Numeric value. */
+
+/* Return the numeric value of a Unicode character. */
+typedef struct
+{
+ int numerator;
+ int denominator;
+}
+uc_fraction_t;
+extern uc_fraction_t
+ uc_numeric_value (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 9 of Unicode Character Database: Mirrored. */
+
+/* Return the mirrored character of a Unicode character UC in *PUC. */
+extern bool
+ uc_mirror_char (ucs4_t uc, ucs4_t *puc);
+
+/* ========================================================================= */
+
+/* Field 10 of Unicode Character Database: Unicode 1.0 Name.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 11 of Unicode Character Database: ISO 10646 comment.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping,
+ lowercase mapping, titlecase mapping. See "unicase.h". */
+
+/* ========================================================================= */
+
+/* Field 2 of the file ArabicShaping.txt in the Unicode Character Database. */
+
+/* Possible joining types. */
+enum
+{
+ UC_JOINING_TYPE_U, /* Non_Joining */
+ UC_JOINING_TYPE_T, /* Transparent */
+ UC_JOINING_TYPE_C, /* Join_Causing */
+ UC_JOINING_TYPE_L, /* Left_Joining */
+ UC_JOINING_TYPE_R, /* Right_Joining */
+ UC_JOINING_TYPE_D /* Dual_Joining */
+};
+
+/* Return the name of a joining type. */
+extern const char *
+ uc_joining_type_name (int joining_type);
+
+/* Return the long name of a joining type. */
+extern const char *
+ uc_joining_type_long_name (int joining_type);
+
+/* Return the joining type given by name, e.g. "D", or by long name, e.g.
+ "Dual Joining". */
+extern int
+ uc_joining_type_byname (const char *joining_type_name);
+
+/* Return the joining type of a Unicode character. */
+extern int
+ uc_joining_type (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Field 3 of the file ArabicShaping.txt in the Unicode Character Database. */
+
+/* Possible joining groups.
+ This enumeration may be extended in the future. */
+enum
+{
+ UC_JOINING_GROUP_NONE, /* No_Joining_Group */
+ UC_JOINING_GROUP_AIN, /* Ain */
+ UC_JOINING_GROUP_ALAPH, /* Alaph */
+ UC_JOINING_GROUP_ALEF, /* Alef */
+ UC_JOINING_GROUP_BEH, /* Beh */
+ UC_JOINING_GROUP_BETH, /* Beth */
+ UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */
+ UC_JOINING_GROUP_DAL, /* Dal */
+ UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */
+ UC_JOINING_GROUP_E, /* E */
+ UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */
+ UC_JOINING_GROUP_FE, /* Fe */
+ UC_JOINING_GROUP_FEH, /* Feh */
+ UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */
+ UC_JOINING_GROUP_GAF, /* Gaf */
+ UC_JOINING_GROUP_GAMAL, /* Gamal */
+ UC_JOINING_GROUP_HAH, /* Hah */
+ UC_JOINING_GROUP_HE, /* He */
+ UC_JOINING_GROUP_HEH, /* Heh */
+ UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */
+ UC_JOINING_GROUP_HETH, /* Heth */
+ UC_JOINING_GROUP_KAF, /* Kaf */
+ UC_JOINING_GROUP_KAPH, /* Kaph */
+ UC_JOINING_GROUP_KHAPH, /* Khaph */
+ UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */
+ UC_JOINING_GROUP_LAM, /* Lam */
+ UC_JOINING_GROUP_LAMADH, /* Lamadh */
+ UC_JOINING_GROUP_MEEM, /* Meem */
+ UC_JOINING_GROUP_MIM, /* Mim */
+ UC_JOINING_GROUP_NOON, /* Noon */
+ UC_JOINING_GROUP_NUN, /* Nun */
+ UC_JOINING_GROUP_NYA, /* Nya */
+ UC_JOINING_GROUP_PE, /* Pe */
+ UC_JOINING_GROUP_QAF, /* Qaf */
+ UC_JOINING_GROUP_QAPH, /* Qaph */
+ UC_JOINING_GROUP_REH, /* Reh */
+ UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */
+ UC_JOINING_GROUP_SAD, /* Sad */
+ UC_JOINING_GROUP_SADHE, /* Sadhe */
+ UC_JOINING_GROUP_SEEN, /* Seen */
+ UC_JOINING_GROUP_SEMKATH, /* Semkath */
+ UC_JOINING_GROUP_SHIN, /* Shin */
+ UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */
+ UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */
+ UC_JOINING_GROUP_TAH, /* Tah */
+ UC_JOINING_GROUP_TAW, /* Taw */
+ UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */
+ UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */
+ UC_JOINING_GROUP_TETH, /* Teth */
+ UC_JOINING_GROUP_WAW, /* Waw */
+ UC_JOINING_GROUP_YEH, /* Yeh */
+ UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */
+ UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */
+ UC_JOINING_GROUP_YUDH, /* Yudh */
+ UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */
+ UC_JOINING_GROUP_ZAIN, /* Zain */
+ UC_JOINING_GROUP_ZHAIN /* Zhain */
+};
+
+/* Return the name of a joining group. */
+extern const char *
+ uc_joining_group_name (int joining_group);
+
+/* Return the joining group given by name, e.g. "Teh_Marbuta". */
+extern int
+ uc_joining_group_byname (const char *joining_group_name);
+
+/* Return the joining group of a Unicode character. */
+extern int
+ uc_joining_group (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Common API for properties. */
+
+/* Data type denoting a property. This is not just a number, but rather a
+ pointer to the test functions, so that programs that use only few of the
+ properties don't have a link-time dependency towards all the tables. */
+typedef struct
+{
+ bool (*test_fn) (ucs4_t uc);
+}
+uc_property_t;
+
+/* Predefined properties. */
+/* General. */
+extern const uc_property_t UC_PROPERTY_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER;
+extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_DEPRECATED;
+extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
+extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR;
+extern const uc_property_t UC_PROPERTY_PRIVATE_USE;
+extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE;
+/* Case. */
+extern const uc_property_t UC_PROPERTY_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_TITLECASE;
+extern const uc_property_t UC_PROPERTY_CASED;
+extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED;
+extern const uc_property_t UC_PROPERTY_SOFT_DOTTED;
+/* Identifiers. */
+extern const uc_property_t UC_PROPERTY_ID_START;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_START;
+extern const uc_property_t UC_PROPERTY_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_XID_START;
+extern const uc_property_t UC_PROPERTY_XID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX;
+/* Shaping and rendering. */
+extern const uc_property_t UC_PROPERTY_JOIN_CONTROL;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK;
+/* Bidi. */
+extern const uc_property_t UC_PROPERTY_BIDI_CONTROL;
+extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
+extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE;
+extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK;
+extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
+extern const uc_property_t UC_PROPERTY_BIDI_PDF;
+extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
+extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL;
+/* Numeric. */
+extern const uc_property_t UC_PROPERTY_HEX_DIGIT;
+extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT;
+/* CJK. */
+extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC;
+extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH;
+extern const uc_property_t UC_PROPERTY_RADICAL;
+extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR;
+extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR;
+/* Misc. */
+extern const uc_property_t UC_PROPERTY_ZERO_WIDTH;
+extern const uc_property_t UC_PROPERTY_SPACE;
+extern const uc_property_t UC_PROPERTY_NON_BREAK;
+extern const uc_property_t UC_PROPERTY_ISO_CONTROL;
+extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL;
+extern const uc_property_t UC_PROPERTY_DASH;
+extern const uc_property_t UC_PROPERTY_HYPHEN;
+extern const uc_property_t UC_PROPERTY_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_QUOTATION_MARK;
+extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL;
+extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL;
+extern const uc_property_t UC_PROPERTY_MATH;
+extern const uc_property_t UC_PROPERTY_OTHER_MATH;
+extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR;
+extern const uc_property_t UC_PROPERTY_COMBINING;
+extern const uc_property_t UC_PROPERTY_COMPOSITE;
+extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT;
+extern const uc_property_t UC_PROPERTY_NUMERIC;
+extern const uc_property_t UC_PROPERTY_DIACRITIC;
+extern const uc_property_t UC_PROPERTY_EXTENDER;
+extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL;
+
+/* Return the property given by name, e.g. "White space". */
+extern uc_property_t
+ uc_property_byname (const char *property_name);
+
+/* Test whether a property is valid. */
+#define uc_property_is_valid(property) ((property).test_fn != NULL)
+
+/* Test whether a Unicode character has a given property. */
+extern bool
+ uc_is_property (ucs4_t uc, uc_property_t property);
+extern bool uc_is_property_white_space (ucs4_t uc);
+extern bool uc_is_property_alphabetic (ucs4_t uc);
+extern bool uc_is_property_other_alphabetic (ucs4_t uc);
+extern bool uc_is_property_not_a_character (ucs4_t uc);
+extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc);
+extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc);
+extern bool uc_is_property_deprecated (ucs4_t uc);
+extern bool uc_is_property_logical_order_exception (ucs4_t uc);
+extern bool uc_is_property_variation_selector (ucs4_t uc);
+extern bool uc_is_property_private_use (ucs4_t uc);
+extern bool uc_is_property_unassigned_code_value (ucs4_t uc);
+extern bool uc_is_property_uppercase (ucs4_t uc);
+extern bool uc_is_property_other_uppercase (ucs4_t uc);
+extern bool uc_is_property_lowercase (ucs4_t uc);
+extern bool uc_is_property_other_lowercase (ucs4_t uc);
+extern bool uc_is_property_titlecase (ucs4_t uc);
+extern bool uc_is_property_cased (ucs4_t uc);
+extern bool uc_is_property_case_ignorable (ucs4_t uc);
+extern bool uc_is_property_changes_when_lowercased (ucs4_t uc);
+extern bool uc_is_property_changes_when_uppercased (ucs4_t uc);
+extern bool uc_is_property_changes_when_titlecased (ucs4_t uc);
+extern bool uc_is_property_changes_when_casefolded (ucs4_t uc);
+extern bool uc_is_property_changes_when_casemapped (ucs4_t uc);
+extern bool uc_is_property_soft_dotted (ucs4_t uc);
+extern bool uc_is_property_id_start (ucs4_t uc);
+extern bool uc_is_property_other_id_start (ucs4_t uc);
+extern bool uc_is_property_id_continue (ucs4_t uc);
+extern bool uc_is_property_other_id_continue (ucs4_t uc);
+extern bool uc_is_property_xid_start (ucs4_t uc);
+extern bool uc_is_property_xid_continue (ucs4_t uc);
+extern bool uc_is_property_pattern_white_space (ucs4_t uc);
+extern bool uc_is_property_pattern_syntax (ucs4_t uc);
+extern bool uc_is_property_join_control (ucs4_t uc);
+extern bool uc_is_property_grapheme_base (ucs4_t uc);
+extern bool uc_is_property_grapheme_extend (ucs4_t uc);
+extern bool uc_is_property_other_grapheme_extend (ucs4_t uc);
+extern bool uc_is_property_grapheme_link (ucs4_t uc);
+extern bool uc_is_property_bidi_control (ucs4_t uc);
+extern bool uc_is_property_bidi_left_to_right (ucs4_t uc);
+extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc);
+extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc);
+extern bool uc_is_property_bidi_european_digit (ucs4_t uc);
+extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc);
+extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc);
+extern bool uc_is_property_bidi_common_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_block_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_segment_separator (ucs4_t uc);
+extern bool uc_is_property_bidi_whitespace (ucs4_t uc);
+extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc);
+extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc);
+extern bool uc_is_property_bidi_pdf (ucs4_t uc);
+extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc);
+extern bool uc_is_property_bidi_other_neutral (ucs4_t uc);
+extern bool uc_is_property_hex_digit (ucs4_t uc);
+extern bool uc_is_property_ascii_hex_digit (ucs4_t uc);
+extern bool uc_is_property_ideographic (ucs4_t uc);
+extern bool uc_is_property_unified_ideograph (ucs4_t uc);
+extern bool uc_is_property_radical (ucs4_t uc);
+extern bool uc_is_property_ids_binary_operator (ucs4_t uc);
+extern bool uc_is_property_ids_trinary_operator (ucs4_t uc);
+extern bool uc_is_property_zero_width (ucs4_t uc);
+extern bool uc_is_property_space (ucs4_t uc);
+extern bool uc_is_property_non_break (ucs4_t uc);
+extern bool uc_is_property_iso_control (ucs4_t uc);
+extern bool uc_is_property_format_control (ucs4_t uc);
+extern bool uc_is_property_dash (ucs4_t uc);
+extern bool uc_is_property_hyphen (ucs4_t uc);
+extern bool uc_is_property_punctuation (ucs4_t uc);
+extern bool uc_is_property_line_separator (ucs4_t uc);
+extern bool uc_is_property_paragraph_separator (ucs4_t uc);
+extern bool uc_is_property_quotation_mark (ucs4_t uc);
+extern bool uc_is_property_sentence_terminal (ucs4_t uc);
+extern bool uc_is_property_terminal_punctuation (ucs4_t uc);
+extern bool uc_is_property_currency_symbol (ucs4_t uc);
+extern bool uc_is_property_math (ucs4_t uc);
+extern bool uc_is_property_other_math (ucs4_t uc);
+extern bool uc_is_property_paired_punctuation (ucs4_t uc);
+extern bool uc_is_property_left_of_pair (ucs4_t uc);
+extern bool uc_is_property_combining (ucs4_t uc);
+extern bool uc_is_property_composite (ucs4_t uc);
+extern bool uc_is_property_decimal_digit (ucs4_t uc);
+extern bool uc_is_property_numeric (ucs4_t uc);
+extern bool uc_is_property_diacritic (ucs4_t uc);
+extern bool uc_is_property_extender (ucs4_t uc);
+extern bool uc_is_property_ignorable_control (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode characters into scripts. */
+
+typedef struct
+{
+ unsigned int code : 21;
+ unsigned int start : 1;
+ unsigned int end : 1;
+}
+uc_interval_t;
+typedef struct
+{
+ unsigned int nintervals;
+ const uc_interval_t *intervals;
+ const char *name;
+}
+uc_script_t;
+
+/* Return the script of a Unicode character. */
+extern const uc_script_t *
+ uc_script (ucs4_t uc);
+
+/* Return the script given by name, e.g. "HAN". */
+extern const uc_script_t *
+ uc_script_byname (const char *script_name);
+
+/* Test whether a Unicode character belongs to a given script. */
+extern bool
+ uc_is_script (ucs4_t uc, const uc_script_t *script);
+
+/* Get the list of all scripts. */
+extern void
+ uc_all_scripts (const uc_script_t **scripts, size_t *count);
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode character range into blocks. */
+
+typedef struct
+{
+ ucs4_t start;
+ ucs4_t end;
+ const char *name;
+}
+uc_block_t;
+
+/* Return the block a character belongs to. */
+extern const uc_block_t *
+ uc_block (ucs4_t uc);
+
+/* Test whether a Unicode character belongs to a given block. */
+extern bool
+ uc_is_block (ucs4_t uc, const uc_block_t *block);
+
+/* Get the list of all blocks. */
+extern void
+ uc_all_blocks (const uc_block_t **blocks, size_t *count);
+
+/* ========================================================================= */
+
+/* Properties taken from language standards. */
+
+/* Test whether a Unicode character is considered whitespace in ISO C 99. */
+extern bool
+ uc_is_c_whitespace (ucs4_t uc);
+
+/* Test whether a Unicode character is considered whitespace in Java. */
+extern bool
+ uc_is_java_whitespace (ucs4_t uc);
+
+enum
+{
+ UC_IDENTIFIER_START, /* valid as first or subsequent character */
+ UC_IDENTIFIER_VALID, /* valid as subsequent character only */
+ UC_IDENTIFIER_INVALID, /* not valid */
+ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
+};
+
+/* Return the categorization of a Unicode character w.r.t. the ISO C 99
+ identifier syntax. */
+extern int
+ uc_c_ident_category (ucs4_t uc);
+
+/* Return the categorization of a Unicode character w.r.t. the Java
+ identifier syntax. */
+extern int
+ uc_java_ident_category (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Like ISO C <ctype.h> and <wctype.h>. These functions are deprecated,
+ because this set of functions was designed with ASCII in mind and cannot
+ reflect the more diverse reality of the Unicode character set. But they
+ can be a quick-and-dirty porting aid when migrating from wchar_t APIs
+ to Unicode strings. */
+
+/* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true. */
+extern bool
+ uc_is_alnum (ucs4_t uc);
+
+/* Test for any character for which 'uc_is_upper' or 'uc_is_lower' is true,
+ or any character that is one of a locale-specific set of characters for
+ which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space'
+ is true. */
+extern bool
+ uc_is_alpha (ucs4_t uc);
+
+/* Test for any control character. */
+extern bool
+ uc_is_cntrl (ucs4_t uc);
+
+/* Test for any character that corresponds to a decimal-digit character. */
+extern bool
+ uc_is_digit (ucs4_t uc);
+
+/* Test for any character for which 'uc_is_print' is true and 'uc_is_space'
+ is false. */
+extern bool
+ uc_is_graph (ucs4_t uc);
+
+/* Test for any character that corresponds to a lowercase letter or is one
+ of a locale-specific set of characters for which none of 'uc_is_cntrl',
+ 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */
+extern bool
+ uc_is_lower (ucs4_t uc);
+
+/* Test for any printing character. */
+extern bool
+ uc_is_print (ucs4_t uc);
+
+/* Test for any printing character that is one of a locale-specific set of
+ characters for which neither 'uc_is_space' nor 'uc_is_alnum' is true. */
+extern bool
+ uc_is_punct (ucs4_t uc);
+
+/* Test for any character that corresponds to a locale-specific set of
+ characters for which none of 'uc_is_alnum', 'uc_is_graph', or 'uc_is_punct'
+ is true. */
+extern bool
+ uc_is_space (ucs4_t uc);
+
+/* Test for any character that corresponds to an uppercase letter or is one
+ of a locale-specific set of character for which none of 'uc_is_cntrl',
+ 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */
+extern bool
+ uc_is_upper (ucs4_t uc);
+
+/* Test for any character that corresponds to a hexadecimal-digit
+ character. */
+extern bool
+ uc_is_xdigit (ucs4_t uc);
+
+/* GNU extension. */
+/* Test for any character that corresponds to a standard blank character or
+ a locale-specific set of characters for which 'uc_is_alnum' is false. */
+extern bool
+ uc_is_blank (ucs4_t uc);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICTYPE_H */
diff --git a/gnulib/lib/unictype/3level.h b/gnulib/lib/unictype/3level.h
new file mode 100644
index 0000000..7ae7d00
--- /dev/null
+++ b/gnulib/lib/unictype/3level.h
@@ -0,0 +1,327 @@
+/* Copyright (C) 2000-2001, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
+
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Construction of sparse 3-level tables.
+ See wchar-lookup.h or coll-lookup.h for their structure and the
+ meaning of p and q.
+
+ Before including this file, set
+ TABLE to the name of the structure to be defined
+ ELEMENT to the type of every entry
+ DEFAULT to the default value for empty entries
+ ITERATE if you want the TABLE_iterate function to be defined
+ NO_FINALIZE if you don't want the TABLE_finalize function to be defined
+
+ This will define
+
+ struct TABLE;
+ void TABLE_init (struct TABLE *t);
+ ELEMENT TABLE_get (struct TABLE *t, uint32_t wc);
+ void TABLE_add (struct TABLE *t, uint32_t wc, ELEMENT value);
+ void TABLE_iterate (struct TABLE *t,
+ void (*fn) (uint32_t wc, ELEMENT value));
+ void TABLE_finalize (struct TABLE *t);
+*/
+
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+struct TABLE
+{
+ /* Parameters. */
+ unsigned int p;
+ unsigned int q;
+ /* Working representation. */
+ size_t level1_alloc;
+ size_t level1_size;
+ uint32_t *level1;
+ size_t level2_alloc;
+ size_t level2_size;
+ uint32_t *level2;
+ size_t level3_alloc;
+ size_t level3_size;
+ ELEMENT *level3;
+ /* Compressed representation. */
+ size_t result_size;
+ char *result;
+};
+
+/* Initialize. Assumes t->p and t->q have already been set. */
+static inline void
+CONCAT(TABLE,_init) (struct TABLE *t)
+{
+ t->level1 = NULL;
+ t->level1_alloc = t->level1_size = 0;
+ t->level2 = NULL;
+ t->level2_alloc = t->level2_size = 0;
+ t->level3 = NULL;
+ t->level3_alloc = t->level3_size = 0;
+}
+
+/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
+ whether 'int' is 16 bit, 32 bit, or 64 bit. */
+#define EMPTY ((uint32_t) ~0)
+
+/* Retrieve an entry. */
+static inline ELEMENT
+CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p);
+ if (index1 < t->level1_size)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t index2 = ((wc >> t->p) & ((1 << t->q) - 1))
+ + (lookup1 << t->q);
+ uint32_t lookup2 = t->level2[index2];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t index3 = (wc & ((1 << t->p) - 1))
+ + (lookup2 << t->p);
+ ELEMENT lookup3 = t->level3[index3];
+
+ return lookup3;
+ }
+ }
+ }
+ return DEFAULT;
+}
+
+/* Add one entry. */
+static void
+CONCAT(TABLE,_add) (struct TABLE *t, uint32_t wc, ELEMENT value)
+{
+ uint32_t index1 = wc >> (t->q + t->p);
+ uint32_t index2 = (wc >> t->p) & ((1 << t->q) - 1);
+ uint32_t index3 = wc & ((1 << t->p) - 1);
+ size_t i, i1, i2;
+
+ if (value == CONCAT(TABLE,_get) (t, wc))
+ return;
+
+ if (index1 >= t->level1_size)
+ {
+ if (index1 >= t->level1_alloc)
+ {
+ size_t alloc = 2 * t->level1_alloc;
+ if (alloc <= index1)
+ alloc = index1 + 1;
+ t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
+ alloc * sizeof (uint32_t));
+ t->level1_alloc = alloc;
+ }
+ while (index1 >= t->level1_size)
+ t->level1[t->level1_size++] = EMPTY;
+ }
+
+ if (t->level1[index1] == EMPTY)
+ {
+ if (t->level2_size == t->level2_alloc)
+ {
+ size_t alloc = 2 * t->level2_alloc + 1;
+ t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
+ (alloc << t->q) * sizeof (uint32_t));
+ t->level2_alloc = alloc;
+ }
+ i1 = t->level2_size << t->q;
+ i2 = (t->level2_size + 1) << t->q;
+ for (i = i1; i < i2; i++)
+ t->level2[i] = EMPTY;
+ t->level1[index1] = t->level2_size++;
+ }
+
+ index2 += t->level1[index1] << t->q;
+
+ if (t->level2[index2] == EMPTY)
+ {
+ if (t->level3_size == t->level3_alloc)
+ {
+ size_t alloc = 2 * t->level3_alloc + 1;
+ t->level3 = (ELEMENT *) xrealloc ((char *) t->level3,
+ (alloc << t->p) * sizeof (ELEMENT));
+ t->level3_alloc = alloc;
+ }
+ i1 = t->level3_size << t->p;
+ i2 = (t->level3_size + 1) << t->p;
+ for (i = i1; i < i2; i++)
+ t->level3[i] = DEFAULT;
+ t->level2[index2] = t->level3_size++;
+ }
+
+ index3 += t->level2[index2] << t->p;
+
+ t->level3[index3] = value;
+}
+
+#ifdef ITERATE
+/* Apply a function to all entries in the table. */
+static void
+CONCAT(TABLE,_iterate) (struct TABLE *t,
+ void (*fn) (uint32_t wc, ELEMENT value))
+{
+ uint32_t index1;
+ for (index1 = 0; index1 < t->level1_size; index1++)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t lookup1_shifted = lookup1 << t->q;
+ uint32_t index2;
+ for (index2 = 0; index2 < (1 << t->q); index2++)
+ {
+ uint32_t lookup2 = t->level2[index2 + lookup1_shifted];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t lookup2_shifted = lookup2 << t->p;
+ uint32_t index3;
+ for (index3 = 0; index3 < (1 << t->p); index3++)
+ {
+ ELEMENT lookup3 = t->level3[index3 + lookup2_shifted];
+ if (lookup3 != DEFAULT)
+ fn ((((index1 << t->q) + index2) << t->p) + index3,
+ lookup3);
+ }
+ }
+ }
+ }
+ }
+}
+#endif
+
+#ifndef NO_FINALIZE
+/* Finalize and shrink. */
+static void
+CONCAT(TABLE,_finalize) (struct TABLE *t)
+{
+ size_t i, j, k;
+ uint32_t reorder3[t->level3_size];
+ uint32_t reorder2[t->level2_size];
+ uint32_t level1_offset, level2_offset, level3_offset, last_offset;
+
+ /* Uniquify level3 blocks. */
+ k = 0;
+ for (j = 0; j < t->level3_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (ELEMENT)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder3[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (ELEMENT));
+ k++;
+ }
+ }
+ t->level3_size = k;
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ if (t->level2[i] != EMPTY)
+ t->level2[i] = reorder3[t->level2[i]];
+
+ /* Uniquify level2 blocks. */
+ k = 0;
+ for (j = 0; j < t->level2_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder2[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level2_size = k;
+
+ for (i = 0; i < t->level1_size; i++)
+ if (t->level1[i] != EMPTY)
+ t->level1[i] = reorder2[t->level1[i]];
+
+ /* Create and fill the resulting compressed representation. */
+ last_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t)
+ + (t->level3_size << t->p) * sizeof (ELEMENT);
+ t->result_size = (last_offset + 3) & ~3ul;
+ t->result = (char *) xmalloc (t->result_size);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t);
+
+ ((uint32_t *) t->result)[0] = t->q + t->p;
+ ((uint32_t *) t->result)[1] = t->level1_size;
+ ((uint32_t *) t->result)[2] = t->p;
+ ((uint32_t *) t->result)[3] = (1 << t->q) - 1;
+ ((uint32_t *) t->result)[4] = (1 << t->p) - 1;
+
+ for (i = 0; i < t->level1_size; i++)
+ ((uint32_t *) (t->result + level1_offset))[i] =
+ (t->level1[i] == EMPTY
+ ? 0
+ : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ ((uint32_t *) (t->result + level2_offset))[i] =
+ (t->level2[i] == EMPTY
+ ? 0
+ : (t->level2[i] << t->p) * sizeof (ELEMENT) + level3_offset);
+
+ for (i = 0; i < (t->level3_size << t->p); i++)
+ ((ELEMENT *) (t->result + level3_offset))[i] = t->level3[i];
+
+ if (last_offset < t->result_size)
+ memset (t->result + last_offset, 0, t->result_size - last_offset);
+
+ if (t->level1_alloc > 0)
+ free (t->level1);
+ if (t->level2_alloc > 0)
+ free (t->level2);
+ if (t->level3_alloc > 0)
+ free (t->level3);
+}
+#endif
+
+#undef EMPTY
+#undef TABLE
+#undef ELEMENT
+#undef DEFAULT
+#undef ITERATE
+#undef NO_FINALIZE
diff --git a/gnulib/lib/unictype/3levelbit.h b/gnulib/lib/unictype/3levelbit.h
new file mode 100644
index 0000000..66e9188
--- /dev/null
+++ b/gnulib/lib/unictype/3levelbit.h
@@ -0,0 +1,317 @@
+/* Copyright (C) 2000-2002, 2009-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Bruno Haible <haible@clisp.cons.org>, 2000.
+
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ See glibc/locale/programs/ld-ctype.c.
+ Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA. */
+
+/* Construction of sparse 3-level tables.
+ See wchar-lookup.h for their structure and the meaning of p and q.
+
+ Before including this file, set
+ TABLE to the name of the structure to be defined
+ ITERATE if you want the TABLE_iterate function to be defined
+ NO_FINALIZE if you don't want the TABLE_finalize function to be defined
+
+ This will define
+
+ struct TABLE;
+ void TABLE_init (struct TABLE *t);
+ int TABLE_get (struct TABLE *t, uint32_t wc);
+ void TABLE_add (struct TABLE *t, uint32_t wc);
+ void TABLE_iterate (struct TABLE *t, void (*fn) (uint32_t wc));
+ void TABLE_finalize (struct TABLE *t);
+*/
+
+#define CONCAT(a,b) CONCAT1(a,b)
+#define CONCAT1(a,b) a##b
+
+struct TABLE
+{
+ /* Parameters. */
+ unsigned int p;
+ unsigned int q;
+ /* Working representation. */
+ size_t level1_alloc;
+ size_t level1_size;
+ uint32_t *level1;
+ size_t level2_alloc;
+ size_t level2_size;
+ uint32_t *level2;
+ size_t level3_alloc;
+ size_t level3_size;
+ uint32_t *level3;
+ /* Compressed representation. */
+ size_t result_size;
+ char *result;
+};
+
+/* Initialize. Assumes t->p and t->q have already been set. */
+static inline void
+CONCAT(TABLE,_init) (struct TABLE *t)
+{
+ t->level1 = NULL;
+ t->level1_alloc = t->level1_size = 0;
+ t->level2 = NULL;
+ t->level2_alloc = t->level2_size = 0;
+ t->level3 = NULL;
+ t->level3_alloc = t->level3_size = 0;
+}
+
+/* Marker for an empty slot. This has the value 0xFFFFFFFF, regardless
+ whether 'int' is 16 bit, 32 bit, or 64 bit. */
+#define EMPTY ((uint32_t) ~0)
+
+/* Retrieve an entry. */
+static inline int
+CONCAT(TABLE,_get) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p + 5);
+ if (index1 < t->level1_size)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t index2 = ((wc >> (t->p + 5)) & ((1 << t->q) - 1))
+ + (lookup1 << t->q);
+ uint32_t lookup2 = t->level2[index2];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t index3 = ((wc >> 5) & ((1 << t->p) - 1))
+ + (lookup2 << t->p);
+ uint32_t lookup3 = t->level3[index3];
+ uint32_t index4 = wc & 0x1f;
+
+ return (lookup3 >> index4) & 1;
+ }
+ }
+ }
+ return 0;
+}
+
+/* Add one entry. */
+static void
+CONCAT(TABLE,_add) (struct TABLE *t, uint32_t wc)
+{
+ uint32_t index1 = wc >> (t->q + t->p + 5);
+ uint32_t index2 = (wc >> (t->p + 5)) & ((1 << t->q) - 1);
+ uint32_t index3 = (wc >> 5) & ((1 << t->p) - 1);
+ uint32_t index4 = wc & 0x1f;
+ size_t i, i1, i2;
+
+ if (index1 >= t->level1_size)
+ {
+ if (index1 >= t->level1_alloc)
+ {
+ size_t alloc = 2 * t->level1_alloc;
+ if (alloc <= index1)
+ alloc = index1 + 1;
+ t->level1 = (uint32_t *) xrealloc ((char *) t->level1,
+ alloc * sizeof (uint32_t));
+ t->level1_alloc = alloc;
+ }
+ while (index1 >= t->level1_size)
+ t->level1[t->level1_size++] = EMPTY;
+ }
+
+ if (t->level1[index1] == EMPTY)
+ {
+ if (t->level2_size == t->level2_alloc)
+ {
+ size_t alloc = 2 * t->level2_alloc + 1;
+ t->level2 = (uint32_t *) xrealloc ((char *) t->level2,
+ (alloc << t->q) * sizeof (uint32_t));
+ t->level2_alloc = alloc;
+ }
+ i1 = t->level2_size << t->q;
+ i2 = (t->level2_size + 1) << t->q;
+ for (i = i1; i < i2; i++)
+ t->level2[i] = EMPTY;
+ t->level1[index1] = t->level2_size++;
+ }
+
+ index2 += t->level1[index1] << t->q;
+
+ if (t->level2[index2] == EMPTY)
+ {
+ if (t->level3_size == t->level3_alloc)
+ {
+ size_t alloc = 2 * t->level3_alloc + 1;
+ t->level3 = (uint32_t *) xrealloc ((char *) t->level3,
+ (alloc << t->p) * sizeof (uint32_t));
+ t->level3_alloc = alloc;
+ }
+ i1 = t->level3_size << t->p;
+ i2 = (t->level3_size + 1) << t->p;
+ for (i = i1; i < i2; i++)
+ t->level3[i] = 0;
+ t->level2[index2] = t->level3_size++;
+ }
+
+ index3 += t->level2[index2] << t->p;
+
+ t->level3[index3] |= (uint32_t)1 << index4;
+}
+
+#ifdef ITERATE
+/* Apply a function to all entries in the table. */
+static void
+CONCAT(TABLE,_iterate) (struct TABLE *t, void (*fn) (uint32_t wc))
+{
+ uint32_t index1;
+ for (index1 = 0; index1 < t->level1_size; index1++)
+ {
+ uint32_t lookup1 = t->level1[index1];
+ if (lookup1 != EMPTY)
+ {
+ uint32_t lookup1_shifted = lookup1 << t->q;
+ uint32_t index2;
+ for (index2 = 0; index2 < (1 << t->q); index2++)
+ {
+ uint32_t lookup2 = t->level2[index2 + lookup1_shifted];
+ if (lookup2 != EMPTY)
+ {
+ uint32_t lookup2_shifted = lookup2 << t->p;
+ uint32_t index3;
+ for (index3 = 0; index3 < (1 << t->p); index3++)
+ {
+ uint32_t lookup3 = t->level3[index3 + lookup2_shifted];
+ uint32_t index4;
+ for (index4 = 0; index4 < 32; index4++)
+ if ((lookup3 >> index4) & 1)
+ fn ((((((index1 << t->q) + index2) << t->p) + index3) << 5) + index4);
+ }
+ }
+ }
+ }
+ }
+}
+#endif
+
+#ifndef NO_FINALIZE
+/* Finalize and shrink. */
+static void
+CONCAT(TABLE,_finalize) (struct TABLE *t)
+{
+ size_t i, j, k;
+ uint32_t reorder3[t->level3_size];
+ uint32_t reorder2[t->level2_size];
+ uint32_t level1_offset, level2_offset, level3_offset;
+
+ /* Uniquify level3 blocks. */
+ k = 0;
+ for (j = 0; j < t->level3_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder3[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level3[i << t->p], &t->level3[j << t->p],
+ (1 << t->p) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level3_size = k;
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ if (t->level2[i] != EMPTY)
+ t->level2[i] = reorder3[t->level2[i]];
+
+ /* Uniquify level2 blocks. */
+ k = 0;
+ for (j = 0; j < t->level2_size; j++)
+ {
+ for (i = 0; i < k; i++)
+ if (memcmp (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t)) == 0)
+ break;
+ /* Relocate block j to block i. */
+ reorder2[j] = i;
+ if (i == k)
+ {
+ if (i != j)
+ memcpy (&t->level2[i << t->q], &t->level2[j << t->q],
+ (1 << t->q) * sizeof (uint32_t));
+ k++;
+ }
+ }
+ t->level2_size = k;
+
+ for (i = 0; i < t->level1_size; i++)
+ if (t->level1[i] != EMPTY)
+ t->level1[i] = reorder2[t->level1[i]];
+
+ /* Create and fill the resulting compressed representation. */
+ t->result_size =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t)
+ + (t->level3_size << t->p) * sizeof (uint32_t);
+ t->result = (char *) xmalloc (t->result_size);
+
+ level1_offset =
+ 5 * sizeof (uint32_t);
+ level2_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t);
+ level3_offset =
+ 5 * sizeof (uint32_t)
+ + t->level1_size * sizeof (uint32_t)
+ + (t->level2_size << t->q) * sizeof (uint32_t);
+
+ ((uint32_t *) t->result)[0] = t->q + t->p + 5;
+ ((uint32_t *) t->result)[1] = t->level1_size;
+ ((uint32_t *) t->result)[2] = t->p + 5;
+ ((uint32_t *) t->result)[3] = (1 << t->q) - 1;
+ ((uint32_t *) t->result)[4] = (1 << t->p) - 1;
+
+ for (i = 0; i < t->level1_size; i++)
+ ((uint32_t *) (t->result + level1_offset))[i] =
+ (t->level1[i] == EMPTY
+ ? 0
+ : (t->level1[i] << t->q) * sizeof (uint32_t) + level2_offset);
+
+ for (i = 0; i < (t->level2_size << t->q); i++)
+ ((uint32_t *) (t->result + level2_offset))[i] =
+ (t->level2[i] == EMPTY
+ ? 0
+ : (t->level2[i] << t->p) * sizeof (uint32_t) + level3_offset);
+
+ for (i = 0; i < (t->level3_size << t->p); i++)
+ ((uint32_t *) (t->result + level3_offset))[i] = t->level3[i];
+
+ if (t->level1_alloc > 0)
+ free (t->level1);
+ if (t->level2_alloc > 0)
+ free (t->level2);
+ if (t->level3_alloc > 0)
+ free (t->level3);
+}
+#endif
+
+#undef EMPTY
+#undef TABLE
+#undef ITERATE
+#undef NO_FINALIZE
diff --git a/gnulib/lib/unictype/Makefile b/gnulib/lib/unictype/Makefile
new file mode 100644
index 0000000..d56ec31
--- /dev/null
+++ b/gnulib/lib/unictype/Makefile
@@ -0,0 +1,20 @@
+# Makefile for generating the table files from unicode.org data.
+
+ARCHIVE_DIR = /gfs/ibook/Volumes/ExtData/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions
+VERSION = 5.0.0
+UCD_DIR = $(ARCHIVE_DIR)/$(VERSION)/ucd
+
+EXTRA_DIST = gen-ctype.c 3levelbit.h 3level.h
+
+all: force
+ gcc -g -Wall gen-ctype.c -o gen-ctype
+ ./gen-ctype $(UCD_DIR)/UnicodeData.txt \
+ $(UCD_DIR)/PropList.txt \
+ $(UCD_DIR)/DerivedCoreProperties.txt \
+ $(UCD_DIR)/Scripts.txt \
+ $(UCD_DIR)/Blocks.txt \
+ $(ARCHIVE_DIR)/3.0.1/PropList-3.0.1.txt \
+ $(VERSION)
+ mv test-* ../../tests/unictype/
+
+force:
diff --git a/gnulib/lib/unictype/bidi_byname.c b/gnulib/lib/unictype/bidi_byname.c
new file mode 100644
index 0000000..4b3a92a
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_byname.c
@@ -0,0 +1,69 @@
+/* Bidi classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "unictype/bidi_byname.h"
+
+int
+uc_bidi_class_byname (const char *bidi_class_name)
+{
+ size_t len;
+
+ len = strlen (bidi_class_name);
+ if (len <= MAX_WORD_LENGTH)
+ {
+ char buf[MAX_WORD_LENGTH + 1];
+ const struct named_bidi_class *found;
+
+ /* Copy bidi_class_name into buf, converting '_' and '-' to ' '. */
+ {
+ const char *p = bidi_class_name;
+ char *q = buf;
+
+ for (;; p++, q++)
+ {
+ char c = *p;
+
+ if (c == '_' || c == '-')
+ c = ' ';
+ *q = c;
+ if (c == '\0')
+ break;
+ }
+ }
+ /* Here q == buf + len. */
+
+ /* Do a hash table lookup, with case-insensitive comparison. */
+ found = uc_bidi_class_lookup (buf, len);
+ if (found != NULL)
+ return found->bidi_class;
+ }
+ /* Invalid bidi class name. */
+ return -1;
+}
+
+int
+uc_bidi_category_byname (const char *category_name)
+{
+ return uc_bidi_class_byname (category_name);
+}
diff --git a/gnulib/lib/unictype/bidi_byname.gperf b/gnulib/lib/unictype/bidi_byname.gperf
new file mode 100644
index 0000000..9cacacf
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_byname.gperf
@@ -0,0 +1,70 @@
+/* Bidi classes of Unicode characters. */
+struct named_bidi_class { int name; int bidi_class; };
+%struct-type
+%ignore-case
+%language=ANSI-C
+%define hash-function-name bidi_class_hash
+%define lookup-function-name uc_bidi_class_lookup
+%readonly-tables
+%global-table
+%define word-array-name bidi_class_names
+%pic
+%define string-pool-name bidi_class_stringpool
+%%
+AL, UC_BIDI_AL
+AN, UC_BIDI_AN
+B, UC_BIDI_B
+BN, UC_BIDI_BN
+CS, UC_BIDI_CS
+EN, UC_BIDI_EN
+ES, UC_BIDI_ES
+ET, UC_BIDI_ET
+L, UC_BIDI_L
+LRE, UC_BIDI_LRE
+LRO, UC_BIDI_LRO
+NSM, UC_BIDI_NSM
+ON, UC_BIDI_ON
+PDF, UC_BIDI_PDF
+R, UC_BIDI_R
+RLE, UC_BIDI_RLE
+RLO, UC_BIDI_RLO
+S, UC_BIDI_S
+WS, UC_BIDI_WS
+Arabic Letter, UC_BIDI_AL
+ArabicLetter, UC_BIDI_AL
+Arabic Number, UC_BIDI_AN
+ArabicNumber, UC_BIDI_AN
+Paragraph Separator, UC_BIDI_B
+ParagraphSeparator, UC_BIDI_B
+Boundary Neutral, UC_BIDI_BN
+BoundaryNeutral, UC_BIDI_BN
+Common Separator, UC_BIDI_CS
+CommonSeparator, UC_BIDI_CS
+European Number, UC_BIDI_EN
+EuropeanNumber, UC_BIDI_EN
+European Separator, UC_BIDI_ES
+EuropeanSeparator, UC_BIDI_ES
+European Terminator, UC_BIDI_ET
+EuropeanTerminator, UC_BIDI_ET
+Left To Right, UC_BIDI_L
+LeftToRight, UC_BIDI_L
+Left To Right Embedding, UC_BIDI_LRE
+LeftToRightEmbedding, UC_BIDI_LRE
+Left To Right Override, UC_BIDI_LRO
+LeftToRightOverride, UC_BIDI_LRO
+Nonspacing Mark, UC_BIDI_NSM
+NonspacingMark, UC_BIDI_NSM
+Other Neutral, UC_BIDI_ON
+OtherNeutral, UC_BIDI_ON
+Pop Directional Format, UC_BIDI_PDF
+PopDirectionalFormat, UC_BIDI_PDF
+Right To Left, UC_BIDI_R
+RightToLeft, UC_BIDI_R
+Right To Left Embedding, UC_BIDI_RLE
+RightToLeftEmbedding, UC_BIDI_RLE
+Right To Left Override, UC_BIDI_RLO
+RightToLeftOverride, UC_BIDI_RLO
+Segment Separator, UC_BIDI_S
+SegmentSeparator, UC_BIDI_S
+White Space, UC_BIDI_WS
+WhiteSpace, UC_BIDI_WS
diff --git a/gnulib/lib/unictype/bidi_longname.c b/gnulib/lib/unictype/bidi_longname.c
new file mode 100644
index 0000000..a40080d
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_longname.c
@@ -0,0 +1,53 @@
+/* Bidi classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_bidi_class_long_name[19][24] =
+{
+ "Left To Right",
+ "Left To Right Embedding",
+ "Left To Right Override",
+ "Right To Left",
+ "Arabic Letter",
+ "Right To Left Embedding",
+ "Right To Left Override",
+ "Pop Directional Format",
+ "European Number",
+ "European Separator",
+ "European Terminator",
+ "Arabic Number",
+ "Common Separator",
+ "Nonspacing Mark",
+ "Boundary Neutral",
+ "Paragraph Separator",
+ "Segment Separator",
+ "White Space",
+ "Other Neutral"
+};
+
+const char *
+uc_bidi_class_long_name (int bidi_class)
+{
+ if (bidi_class >= 0
+ && bidi_class < sizeof (u_bidi_class_long_name) / sizeof (u_bidi_class_long_name[0]))
+ return u_bidi_class_long_name[bidi_class];
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/bidi_name.c b/gnulib/lib/unictype/bidi_name.c
new file mode 100644
index 0000000..eca74f6
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_name.c
@@ -0,0 +1,41 @@
+/* Bidi classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_bidi_class_name[19][4] =
+{
+ "L", "LRE", "LRO", "R", "AL", "RLE", "RLO", "PDF", "EN", "ES",
+ "ET", "AN", "CS", "NSM", "BN", "B", "S", "WS", "ON"
+};
+
+const char *
+uc_bidi_class_name (int bidi_class)
+{
+ if (bidi_class >= 0 && bidi_class < sizeof (u_bidi_class_name) / sizeof (u_bidi_class_name[0]))
+ return u_bidi_class_name[bidi_class];
+ return NULL;
+}
+
+const char *
+uc_bidi_category_name (int category)
+{
+ return uc_bidi_class_name (category);
+}
diff --git a/gnulib/lib/unictype/bidi_of.c b/gnulib/lib/unictype/bidi_of.c
new file mode 100644
index 0000000..5c735fd
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_of.c
@@ -0,0 +1,58 @@
+/* Bidi classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_bidi_category table. */
+#include "bidi_of.h"
+
+int
+uc_bidi_class (ucs4_t uc)
+{
+ unsigned int index1 = uc >> bidi_category_header_0;
+ if (index1 < bidi_category_header_1)
+ {
+ int lookup1 = u_bidi_category.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> bidi_category_header_2) & bidi_category_header_3;
+ int lookup2 = u_bidi_category.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & bidi_category_header_4) + lookup2) * 5;
+ /* level3 contains 5-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_bidi_category.level3[index3>>4]
+ | (u_bidi_category.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x1f;
+
+ return lookup3;
+ }
+ }
+ }
+ return UC_BIDI_L;
+}
+
+int
+uc_bidi_category (ucs4_t uc)
+{
+ return uc_bidi_class (uc);
+}
diff --git a/gnulib/lib/unictype/bidi_of.h b/gnulib/lib/unictype/bidi_of.h
new file mode 100644
index 0000000..c30ddc9
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_of.h
@@ -0,0 +1,909 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Bidi categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define bidi_category_header_0 16
+#define bidi_category_header_1 17
+#define bidi_category_header_2 7
+#define bidi_category_header_3 511
+#define bidi_category_header_4 127
+static const
+struct
+ {
+ int level1[17];
+ short level2[4 << 9];
+ unsigned short level3[125 * 40 + 1];
+ }
+u_bidi_category =
+{
+ {
+ 0, 512, 1024, 1024, 1024, 1024, 1024, 1024,
+ 1024, 1024, 1024, 1024, 1024, 1024, 1536, 1024,
+ 1024
+ },
+ {
+ 0, 128, -1, -1, -1, 256, 384, 512,
+ -1, 640, -1, 768, 896, 1024, 1152, 1280,
+ 1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304,
+ 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328,
+ 3456, 3584, -1, -1, -1, -1, 3712, 3840,
+ 3968, -1, -1, -1, -1, 4096, 4224, 4352,
+ 4480, 4608, 4736, 4864, 4992, -1, 5120, 5248,
+ 5376, 5504, -1, 5632, -1, -1, -1, 5760,
+ 5888, 6016, 6144, 6272, 6400, 6528, 6656, 6784,
+ 6912, 7040, 6528, 6528, 6528, 7168, 7296, 7424,
+ -1, -1, 6528, 6528, 6528, 6528, 7552, -1,
+ -1, 7680, 7808, 7936, 8064, 8192, 6528, 8320,
+ 8448, 8576, -1, 8704, 8832, 8960, 9088, 9216,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 9344, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 9472, -1, -1, 9600, 9728, 9856, 9984,
+ 10112, 10240, 10368, 10496, 10624, 10752, -1, 10880,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 11008, 11136,
+ 11136, 11136, 11264, 11392, 11520, 11648, 11776, 11904,
+ -1, -1, 12032, 12160, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1536, 1536, 12288, 1536, 12416, 1536, 12544, 1536,
+ 1536, 1536, 1536, 1536, 12672, 1536, 1536, 1536,
+ 12800, 12928, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 13056, 13184, 13312, -1, 13440, -1,
+ -1, -1, -1, -1, -1, 13568, 13696, 13824,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 13952, 14080, 14208, -1, -1, -1, 14336, 14464,
+ 14592, 14720, 14848, 14976, 15104, 15232, 15360, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 15488,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 15488,
+ 15616, 15616, 15744, 15872, 15616, 15616, 15616, 15616,
+ 15616, 15616, 15616, 15616, 15616, 15616, 15616, 15616,
+ 15616, 15616, 15616, 15616, 15616, 15616, 15616, 15616,
+ 15616, 15616, 15616, 15616, 15616, 15616, 15616, 15616,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 15488
+ },
+ {
+ 0x39ce, 0x9ce7, 0x0e73, 0x183e, 0x739f, 0x39ce, 0x9ce7, 0xce73,
+ 0xf739, 0x83de, 0x4a51, 0x94a5, 0x5294, 0xc4ca, 0x6312, 0x2108,
+ 0x1084, 0x0842, 0x2931, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5, 0x0012, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x74a5,
+ 0x39ce, 0x9ee7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x2a4c, 0x94a5, 0x5294, 0x2902, 0x949d, 0x214a,
+ 0x8124, 0x1294, 0x2901, 0x94a5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4000, 0x004a, 0x0000, 0x4800, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4800, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0xa400,
+ 0x5294, 0x294a, 0x9025, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x0000, 0x2520, 0x0000, 0x0000, 0x0480,
+ 0x0000, 0x2520, 0x0090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0004, 0x0000, 0x0000,
+ 0x8000, 0x5ad6, 0xad6b, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0048, 0x0000, 0xb5a3, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x68da, 0xb5a3, 0xdad1, 0x6368, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0xad6b, 0x8845, 0x4494, 0xc229, 0x9488, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x4235, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd690,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5a9, 0x2108, 0x108d, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4842, 0xad6b, 0xd6b5, 0x6c96, 0xb5ad, 0x08d6,
+ 0x4d69, 0xd6b6, 0x211a, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x5908, 0x11a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4235,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xad6b, 0xd6b5, 0x6b5a, 0x108d,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0xd68c, 0x6b5a, 0xb5ad, 0x8636, 0x5294, 0x318e, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0x4631, 0xad6b,
+ 0xd68d, 0x6b5a, 0xb5ad, 0x5a36, 0xa36b, 0xd6b5, 0x18da, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0xa318, 0x36b5, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x35ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd034, 0x0000, 0xb5a0, 0x5ad6, 0x0d6b, 0x0000,
+ 0x001a, 0xb5a0, 0x5ad6, 0x006b, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x2800, 0x0005, 0x0000, 0x0500, 0x0000,
+ 0x35a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0x35a0, 0x0000, 0x0d68, 0xd680,
+ 0x001a, 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x01ad, 0x1a00, 0x0000, 0x0000, 0x0000,
+ 0x35a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0xb5a0, 0x1ad6, 0x0d68, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0140, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x6800, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x4000, 0x0003, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0000, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa529, 0x5294, 0x0049, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6b40, 0x000d, 0x4000, 0x0d6b, 0xd6b4,
+ 0x001a, 0x0000, 0x5a00, 0x0003, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5200, 0x294a, 0x04a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xd000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x0006,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0034,
+ 0x0000, 0xb400, 0x40d6, 0x0003, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a0,
+ 0x5ad0, 0xad6b, 0x0035, 0x5000, 0x0000, 0x0000, 0xad68, 0xd6b5,
+ 0x035a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a0,
+ 0x5ad0, 0xad6b, 0xd681, 0x0000, 0x0000, 0x0000, 0xad00, 0xd6b5,
+ 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad00,
+ 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1a00, 0xa068, 0x2949, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb5a0, 0x5ad6, 0xad6b, 0xd6b5, 0x035a,
+ 0xb5ad, 0x40d6, 0x006b, 0x0000, 0x6b5a, 0xb5ad, 0x5ad6, 0xa06b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x0000, 0x0000, 0x4000, 0x0003, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b5a, 0xb40d,
+ 0x5ad6, 0xa06b, 0x0035, 0x035a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xad00, 0x0001, 0x6b40, 0x000d, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb5a0, 0x00d6, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x5a00, 0x0003, 0x0000, 0x001a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b5a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2900, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400, 0x00d6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb400,
+ 0x00d6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xb400, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb400, 0x0006, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xad68, 0xd6b5, 0x001a, 0x0000, 0x4000, 0xa003, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x0006, 0x0000, 0x0500, 0x001a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x0002, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0xd6ca, 0x045a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x35ad, 0x0000, 0x0d68, 0x0000, 0x0000, 0x3400,
+ 0x0000, 0xa000, 0x06b5, 0x0000, 0x0012, 0x2520, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9480, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d68,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4000, 0xad03, 0xd6b5, 0x035a, 0x340d, 0x5a00,
+ 0xad6b, 0xd6b5, 0x0000, 0x8000, 0x5ad6, 0xad6b, 0xd6b5, 0x6800,
+ 0xb5ad, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x40d0, 0xad6b, 0xd035, 0x0000, 0x3400, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xd680, 0x6b5a, 0xb5ad, 0x0006, 0x0000, 0x0000, 0x0000,
+ 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xb400, 0x1ad6, 0xad00, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000,
+ 0xad03, 0x0001, 0x681a, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000, 0x6b5a, 0xb5ad,
+ 0x4006, 0x006b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x35ad, 0x5ad0, 0xad6b, 0xd6b5, 0x6b5a, 0xb40d, 0x5ad6,
+ 0x0d6b, 0x0000, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd000, 0x6b5a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9024, 0x0252, 0x0000, 0x0000, 0x0000,
+ 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x04a4,
+ 0xc631, 0x6318, 0x318c, 0xe746, 0x181c, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0xf194, 0x7285, 0x6184, 0x294a,
+ 0xa4a5, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa4c9, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x8ca5, 0x39ce, 0x08e7,
+ 0x8421, 0xe738, 0x739c, 0x0008, 0x1080, 0x0842, 0x24a5, 0x04a5,
+ 0x2108, 0x1084, 0x0842, 0x24a5, 0x04a5, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x000d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0252, 0xa529, 0x5204, 0x0002, 0x0000, 0x0000, 0x8120, 0x1294,
+ 0x0000, 0x9480, 0x4a52, 0x2409, 0x4090, 0x0002, 0x0280, 0x0000,
+ 0x0000, 0x0000, 0x0948, 0x0000, 0x4a52, 0x0129, 0x0000, 0x2948,
+ 0x0025, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x2652, 0xa525, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x8129, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x004a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x0894, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x0421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2948, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x094a, 0x94a4, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a40, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x204a,
+ 0x9481, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x0001, 0x4a52, 0xa529, 0x5294, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa400,
+ 0x5294, 0x004a, 0x6800, 0x01ad, 0x0000, 0x4000, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6800,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0252,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x2902, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x094a, 0x0000,
+ 0x4a51, 0x0129, 0x5200, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x0012, 0x0000, 0x0000, 0xd6b4, 0x6b5a, 0x0012,
+ 0x8000, 0x0094, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x2935, 0x0001, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x04a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x04a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a40,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000, 0x0000, 0x2000,
+ 0x94a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5290, 0x004a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9480, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x94a4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x6800, 0x35ad, 0x0009, 0x0000, 0xd000, 0x949a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x0252, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3400, 0x4000, 0x0003, 0x0680, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5a00, 0x5203, 0x094a, 0x0000, 0x0000,
+ 0x0000, 0x4a00, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa520, 0x0094, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x4000, 0xad6b, 0xd6b5, 0x001a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad68, 0xd6b5,
+ 0x6b5a, 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x35ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x4006, 0xad6b, 0xd001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xd6b5, 0x035a, 0x35a0,
+ 0x5a00, 0x0003, 0x0000, 0x0000, 0x8000, 0x0006, 0x0000, 0xd000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb40d,
+ 0x00d6, 0x0d68, 0x0000, 0x6b40, 0x01a0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a00,
+ 0x0d00, 0x0000, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x1b46, 0x8c63, 0xc631, 0x2318, 0x318d, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x9488, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x1084, 0x0842, 0x8421, 0x4210, 0x2124,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x4a52, 0xa529, 0x5294,
+ 0x4212, 0x2108, 0xb5ad, 0x5ad6, 0x8423, 0x4210, 0x2108, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x324c, 0x9922, 0x5294, 0x294a, 0x54a5, 0xa652, 0xa524,
+ 0x5224, 0x4929, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x7108,
+ 0x4a40, 0x94a5, 0x5294, 0xc4ca, 0x6312, 0x2108, 0x1084, 0x0842,
+ 0x2931, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2900, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5, 0x4a52, 0x2529,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x494a, 0x9529,
+ 0x5202, 0x294a, 0x04a5, 0x39ce, 0x9ce7, 0x4e73, 0x294a, 0x73a5,
+ 0x0240, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x004a, 0x0000, 0x4a52, 0xa529, 0x5294,
+ 0x094a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001a,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x90c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0xb5a3, 0x5a36, 0x631b, 0xd18c, 0x6b5a, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0xad18, 0x31b5, 0x68c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x4318, 0x294a, 0x94a5, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x1ad6,
+ 0x01a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xad00, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0x0003, 0x0000,
+ 0x0000, 0x4800, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x2529,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x01ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x5ad6, 0xa003, 0x0035, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xad68, 0x0001, 0x0000, 0x0000, 0x9ce7, 0xce73, 0xd6b9, 0x6b5a,
+ 0x35ad, 0x5a00, 0xad6b, 0x06b5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6b4, 0x001a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0xb652, 0x24d6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000,
+ 0x4200, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x094a, 0x0000, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000,
+ 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x04a5, 0x4a40,
+ 0xa529, 0x5294, 0x294a, 0x04a5, 0x4a40, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a40, 0xa529, 0x5294, 0x294a, 0x94a5, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2108, 0x1084, 0x0842, 0x0021, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52,
+ 0x2529, 0x5290, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x0001,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000,
+ 0x0000, 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x8129, 0x5294, 0x004a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x0012, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x04a5, 0x4812, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x094a, 0x94a4, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x4094, 0x294a, 0x0001,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa409, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x0094, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2900, 0x94a5,
+ 0x4a40, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4812, 0x8129, 0x1204,
+ 0x2048, 0x04a5, 0x4a52, 0x2529, 0x5200, 0x094a, 0x0024, 0x4a52,
+ 0xa409, 0x5294, 0x294a, 0x94a5, 0x0012, 0xa400, 0x5294, 0x294a,
+ 0x94a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x2529, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7380,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/bidi_test.c b/gnulib/lib/unictype/bidi_test.c
new file mode 100644
index 0000000..ffe93a6
--- /dev/null
+++ b/gnulib/lib/unictype/bidi_test.c
@@ -0,0 +1,33 @@
+/* Bidi classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_bidi_class (ucs4_t uc, int bidi_class)
+{
+ return (uc_bidi_class (uc) == bidi_class);
+}
+
+bool
+uc_is_bidi_category (ucs4_t uc, int category)
+{
+ return uc_is_bidi_class (uc, category);
+}
diff --git a/gnulib/lib/unictype/bitmap.h b/gnulib/lib/unictype/bitmap.h
new file mode 100644
index 0000000..a945b8d
--- /dev/null
+++ b/gnulib/lib/unictype/bitmap.h
@@ -0,0 +1,47 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+static inline int bitmap_lookup (const void *table, ucs4_t uc);
+
+/* These values are currently hardcoded into gen-ctype.c. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+
+static inline int
+bitmap_lookup (const void *table, ucs4_t uc)
+{
+ unsigned int index1 = uc >> header_0;
+ if (index1 < ((const int *) table)[0])
+ {
+ int lookup1 = ((const int *) table)[1 + index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> header_2) & header_3;
+ int lookup2 = ((const short *) table)[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc >> 5) & header_4;
+ unsigned int lookup3 = ((const int *) table)[lookup2 + index3];
+
+ return (lookup3 >> (uc & 0x1f)) & 1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unictype/block_test.c b/gnulib/lib/unictype/block_test.c
new file mode 100644
index 0000000..9e20c04
--- /dev/null
+++ b/gnulib/lib/unictype/block_test.c
@@ -0,0 +1,31 @@
+/* Blocks of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_block (ucs4_t uc, const uc_block_t *block)
+{
+ if (block != NULL)
+ return ((ucs4_t) (uc - block->start) <= block->end - block->start);
+ else
+ return false;
+}
+
diff --git a/gnulib/lib/unictype/blocks.c b/gnulib/lib/unictype/blocks.c
new file mode 100644
index 0000000..19b0427
--- /dev/null
+++ b/gnulib/lib/unictype/blocks.c
@@ -0,0 +1,62 @@
+/* Blocks of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "blocks.h"
+
+const uc_block_t *
+uc_block (ucs4_t uc)
+{
+ unsigned int first_index;
+ unsigned int last_index;
+
+ if (uc < blocks_level1_threshold)
+ {
+ unsigned int index1 = uc >> blocks_level1_shift;
+ first_index = blocks_level1[2 * index1];
+ last_index = blocks_level1[2 * index1 + 1];
+ }
+ else
+ {
+ first_index = blocks_upper_first_index;
+ last_index = blocks_upper_last_index;
+ }
+ /* We know that the relevant blocks are blocks[i] with
+ first_index <= i < last_index. Now perform a binary search. */
+ while (first_index < last_index)
+ {
+ unsigned int mid_index = (first_index + last_index) / 2;
+ if (blocks[mid_index].end < uc)
+ first_index = mid_index + 1;
+ else if (uc < blocks[mid_index].start)
+ last_index = mid_index;
+ else
+ return &blocks[mid_index];
+ }
+ return NULL;
+}
+
+void
+uc_all_blocks (const uc_block_t **blocksp, size_t *countp)
+{
+ *blocksp = blocks;
+ *countp = sizeof (blocks) / sizeof (blocks[0]);
+}
diff --git a/gnulib/lib/unictype/blocks.h b/gnulib/lib/unictype/blocks.h
new file mode 100644
index 0000000..cd4b14e
--- /dev/null
+++ b/gnulib/lib/unictype/blocks.h
@@ -0,0 +1,990 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode blocks. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+static const uc_block_t blocks[] =
+{
+ { 0x0000, 0x007F, "Basic Latin" },
+ { 0x0080, 0x00FF, "Latin-1 Supplement" },
+ { 0x0100, 0x017F, "Latin Extended-A" },
+ { 0x0180, 0x024F, "Latin Extended-B" },
+ { 0x0250, 0x02AF, "IPA Extensions" },
+ { 0x02B0, 0x02FF, "Spacing Modifier Letters" },
+ { 0x0300, 0x036F, "Combining Diacritical Marks" },
+ { 0x0370, 0x03FF, "Greek and Coptic" },
+ { 0x0400, 0x04FF, "Cyrillic" },
+ { 0x0500, 0x052F, "Cyrillic Supplement" },
+ { 0x0530, 0x058F, "Armenian" },
+ { 0x0590, 0x05FF, "Hebrew" },
+ { 0x0600, 0x06FF, "Arabic" },
+ { 0x0700, 0x074F, "Syriac" },
+ { 0x0750, 0x077F, "Arabic Supplement" },
+ { 0x0780, 0x07BF, "Thaana" },
+ { 0x07C0, 0x07FF, "NKo" },
+ { 0x0800, 0x083F, "Samaritan" },
+ { 0x0840, 0x085F, "Mandaic" },
+ { 0x0900, 0x097F, "Devanagari" },
+ { 0x0980, 0x09FF, "Bengali" },
+ { 0x0A00, 0x0A7F, "Gurmukhi" },
+ { 0x0A80, 0x0AFF, "Gujarati" },
+ { 0x0B00, 0x0B7F, "Oriya" },
+ { 0x0B80, 0x0BFF, "Tamil" },
+ { 0x0C00, 0x0C7F, "Telugu" },
+ { 0x0C80, 0x0CFF, "Kannada" },
+ { 0x0D00, 0x0D7F, "Malayalam" },
+ { 0x0D80, 0x0DFF, "Sinhala" },
+ { 0x0E00, 0x0E7F, "Thai" },
+ { 0x0E80, 0x0EFF, "Lao" },
+ { 0x0F00, 0x0FFF, "Tibetan" },
+ { 0x1000, 0x109F, "Myanmar" },
+ { 0x10A0, 0x10FF, "Georgian" },
+ { 0x1100, 0x11FF, "Hangul Jamo" },
+ { 0x1200, 0x137F, "Ethiopic" },
+ { 0x1380, 0x139F, "Ethiopic Supplement" },
+ { 0x13A0, 0x13FF, "Cherokee" },
+ { 0x1400, 0x167F, "Unified Canadian Aboriginal Syllabics" },
+ { 0x1680, 0x169F, "Ogham" },
+ { 0x16A0, 0x16FF, "Runic" },
+ { 0x1700, 0x171F, "Tagalog" },
+ { 0x1720, 0x173F, "Hanunoo" },
+ { 0x1740, 0x175F, "Buhid" },
+ { 0x1760, 0x177F, "Tagbanwa" },
+ { 0x1780, 0x17FF, "Khmer" },
+ { 0x1800, 0x18AF, "Mongolian" },
+ { 0x18B0, 0x18FF, "Unified Canadian Aboriginal Syllabics Extended" },
+ { 0x1900, 0x194F, "Limbu" },
+ { 0x1950, 0x197F, "Tai Le" },
+ { 0x1980, 0x19DF, "New Tai Lue" },
+ { 0x19E0, 0x19FF, "Khmer Symbols" },
+ { 0x1A00, 0x1A1F, "Buginese" },
+ { 0x1A20, 0x1AAF, "Tai Tham" },
+ { 0x1B00, 0x1B7F, "Balinese" },
+ { 0x1B80, 0x1BBF, "Sundanese" },
+ { 0x1BC0, 0x1BFF, "Batak" },
+ { 0x1C00, 0x1C4F, "Lepcha" },
+ { 0x1C50, 0x1C7F, "Ol Chiki" },
+ { 0x1CD0, 0x1CFF, "Vedic Extensions" },
+ { 0x1D00, 0x1D7F, "Phonetic Extensions" },
+ { 0x1D80, 0x1DBF, "Phonetic Extensions Supplement" },
+ { 0x1DC0, 0x1DFF, "Combining Diacritical Marks Supplement" },
+ { 0x1E00, 0x1EFF, "Latin Extended Additional" },
+ { 0x1F00, 0x1FFF, "Greek Extended" },
+ { 0x2000, 0x206F, "General Punctuation" },
+ { 0x2070, 0x209F, "Superscripts and Subscripts" },
+ { 0x20A0, 0x20CF, "Currency Symbols" },
+ { 0x20D0, 0x20FF, "Combining Diacritical Marks for Symbols" },
+ { 0x2100, 0x214F, "Letterlike Symbols" },
+ { 0x2150, 0x218F, "Number Forms" },
+ { 0x2190, 0x21FF, "Arrows" },
+ { 0x2200, 0x22FF, "Mathematical Operators" },
+ { 0x2300, 0x23FF, "Miscellaneous Technical" },
+ { 0x2400, 0x243F, "Control Pictures" },
+ { 0x2440, 0x245F, "Optical Character Recognition" },
+ { 0x2460, 0x24FF, "Enclosed Alphanumerics" },
+ { 0x2500, 0x257F, "Box Drawing" },
+ { 0x2580, 0x259F, "Block Elements" },
+ { 0x25A0, 0x25FF, "Geometric Shapes" },
+ { 0x2600, 0x26FF, "Miscellaneous Symbols" },
+ { 0x2700, 0x27BF, "Dingbats" },
+ { 0x27C0, 0x27EF, "Miscellaneous Mathematical Symbols-A" },
+ { 0x27F0, 0x27FF, "Supplemental Arrows-A" },
+ { 0x2800, 0x28FF, "Braille Patterns" },
+ { 0x2900, 0x297F, "Supplemental Arrows-B" },
+ { 0x2980, 0x29FF, "Miscellaneous Mathematical Symbols-B" },
+ { 0x2A00, 0x2AFF, "Supplemental Mathematical Operators" },
+ { 0x2B00, 0x2BFF, "Miscellaneous Symbols and Arrows" },
+ { 0x2C00, 0x2C5F, "Glagolitic" },
+ { 0x2C60, 0x2C7F, "Latin Extended-C" },
+ { 0x2C80, 0x2CFF, "Coptic" },
+ { 0x2D00, 0x2D2F, "Georgian Supplement" },
+ { 0x2D30, 0x2D7F, "Tifinagh" },
+ { 0x2D80, 0x2DDF, "Ethiopic Extended" },
+ { 0x2DE0, 0x2DFF, "Cyrillic Extended-A" },
+ { 0x2E00, 0x2E7F, "Supplemental Punctuation" },
+ { 0x2E80, 0x2EFF, "CJK Radicals Supplement" },
+ { 0x2F00, 0x2FDF, "Kangxi Radicals" },
+ { 0x2FF0, 0x2FFF, "Ideographic Description Characters" },
+ { 0x3000, 0x303F, "CJK Symbols and Punctuation" },
+ { 0x3040, 0x309F, "Hiragana" },
+ { 0x30A0, 0x30FF, "Katakana" },
+ { 0x3100, 0x312F, "Bopomofo" },
+ { 0x3130, 0x318F, "Hangul Compatibility Jamo" },
+ { 0x3190, 0x319F, "Kanbun" },
+ { 0x31A0, 0x31BF, "Bopomofo Extended" },
+ { 0x31C0, 0x31EF, "CJK Strokes" },
+ { 0x31F0, 0x31FF, "Katakana Phonetic Extensions" },
+ { 0x3200, 0x32FF, "Enclosed CJK Letters and Months" },
+ { 0x3300, 0x33FF, "CJK Compatibility" },
+ { 0x3400, 0x4DBF, "CJK Unified Ideographs Extension A" },
+ { 0x4DC0, 0x4DFF, "Yijing Hexagram Symbols" },
+ { 0x4E00, 0x9FFF, "CJK Unified Ideographs" },
+ { 0xA000, 0xA48F, "Yi Syllables" },
+ { 0xA490, 0xA4CF, "Yi Radicals" },
+ { 0xA4D0, 0xA4FF, "Lisu" },
+ { 0xA500, 0xA63F, "Vai" },
+ { 0xA640, 0xA69F, "Cyrillic Extended-B" },
+ { 0xA6A0, 0xA6FF, "Bamum" },
+ { 0xA700, 0xA71F, "Modifier Tone Letters" },
+ { 0xA720, 0xA7FF, "Latin Extended-D" },
+ { 0xA800, 0xA82F, "Syloti Nagri" },
+ { 0xA830, 0xA83F, "Common Indic Number Forms" },
+ { 0xA840, 0xA87F, "Phags-pa" },
+ { 0xA880, 0xA8DF, "Saurashtra" },
+ { 0xA8E0, 0xA8FF, "Devanagari Extended" },
+ { 0xA900, 0xA92F, "Kayah Li" },
+ { 0xA930, 0xA95F, "Rejang" },
+ { 0xA960, 0xA97F, "Hangul Jamo Extended-A" },
+ { 0xA980, 0xA9DF, "Javanese" },
+ { 0xAA00, 0xAA5F, "Cham" },
+ { 0xAA60, 0xAA7F, "Myanmar Extended-A" },
+ { 0xAA80, 0xAADF, "Tai Viet" },
+ { 0xAB00, 0xAB2F, "Ethiopic Extended-A" },
+ { 0xABC0, 0xABFF, "Meetei Mayek" },
+ { 0xAC00, 0xD7AF, "Hangul Syllables" },
+ { 0xD7B0, 0xD7FF, "Hangul Jamo Extended-B" },
+ { 0xD800, 0xDB7F, "High Surrogates" },
+ { 0xDB80, 0xDBFF, "High Private Use Surrogates" },
+ { 0xDC00, 0xDFFF, "Low Surrogates" },
+ { 0xE000, 0xF8FF, "Private Use Area" },
+ { 0xF900, 0xFAFF, "CJK Compatibility Ideographs" },
+ { 0xFB00, 0xFB4F, "Alphabetic Presentation Forms" },
+ { 0xFB50, 0xFDFF, "Arabic Presentation Forms-A" },
+ { 0xFE00, 0xFE0F, "Variation Selectors" },
+ { 0xFE10, 0xFE1F, "Vertical Forms" },
+ { 0xFE20, 0xFE2F, "Combining Half Marks" },
+ { 0xFE30, 0xFE4F, "CJK Compatibility Forms" },
+ { 0xFE50, 0xFE6F, "Small Form Variants" },
+ { 0xFE70, 0xFEFF, "Arabic Presentation Forms-B" },
+ { 0xFF00, 0xFFEF, "Halfwidth and Fullwidth Forms" },
+ { 0xFFF0, 0xFFFF, "Specials" },
+ { 0x10000, 0x1007F, "Linear B Syllabary" },
+ { 0x10080, 0x100FF, "Linear B Ideograms" },
+ { 0x10100, 0x1013F, "Aegean Numbers" },
+ { 0x10140, 0x1018F, "Ancient Greek Numbers" },
+ { 0x10190, 0x101CF, "Ancient Symbols" },
+ { 0x101D0, 0x101FF, "Phaistos Disc" },
+ { 0x10280, 0x1029F, "Lycian" },
+ { 0x102A0, 0x102DF, "Carian" },
+ { 0x10300, 0x1032F, "Old Italic" },
+ { 0x10330, 0x1034F, "Gothic" },
+ { 0x10380, 0x1039F, "Ugaritic" },
+ { 0x103A0, 0x103DF, "Old Persian" },
+ { 0x10400, 0x1044F, "Deseret" },
+ { 0x10450, 0x1047F, "Shavian" },
+ { 0x10480, 0x104AF, "Osmanya" },
+ { 0x10800, 0x1083F, "Cypriot Syllabary" },
+ { 0x10840, 0x1085F, "Imperial Aramaic" },
+ { 0x10900, 0x1091F, "Phoenician" },
+ { 0x10920, 0x1093F, "Lydian" },
+ { 0x10A00, 0x10A5F, "Kharoshthi" },
+ { 0x10A60, 0x10A7F, "Old South Arabian" },
+ { 0x10B00, 0x10B3F, "Avestan" },
+ { 0x10B40, 0x10B5F, "Inscriptional Parthian" },
+ { 0x10B60, 0x10B7F, "Inscriptional Pahlavi" },
+ { 0x10C00, 0x10C4F, "Old Turkic" },
+ { 0x10E60, 0x10E7F, "Rumi Numeral Symbols" },
+ { 0x11000, 0x1107F, "Brahmi" },
+ { 0x11080, 0x110CF, "Kaithi" },
+ { 0x12000, 0x123FF, "Cuneiform" },
+ { 0x12400, 0x1247F, "Cuneiform Numbers and Punctuation" },
+ { 0x13000, 0x1342F, "Egyptian Hieroglyphs" },
+ { 0x16800, 0x16A3F, "Bamum Supplement" },
+ { 0x1B000, 0x1B0FF, "Kana Supplement" },
+ { 0x1D000, 0x1D0FF, "Byzantine Musical Symbols" },
+ { 0x1D100, 0x1D1FF, "Musical Symbols" },
+ { 0x1D200, 0x1D24F, "Ancient Greek Musical Notation" },
+ { 0x1D300, 0x1D35F, "Tai Xuan Jing Symbols" },
+ { 0x1D360, 0x1D37F, "Counting Rod Numerals" },
+ { 0x1D400, 0x1D7FF, "Mathematical Alphanumeric Symbols" },
+ { 0x1F000, 0x1F02F, "Mahjong Tiles" },
+ { 0x1F030, 0x1F09F, "Domino Tiles" },
+ { 0x1F0A0, 0x1F0FF, "Playing Cards" },
+ { 0x1F100, 0x1F1FF, "Enclosed Alphanumeric Supplement" },
+ { 0x1F200, 0x1F2FF, "Enclosed Ideographic Supplement" },
+ { 0x1F300, 0x1F5FF, "Miscellaneous Symbols And Pictographs" },
+ { 0x1F600, 0x1F64F, "Emoticons" },
+ { 0x1F680, 0x1F6FF, "Transport And Map Symbols" },
+ { 0x1F700, 0x1F77F, "Alchemical Symbols" },
+ { 0x20000, 0x2A6DF, "CJK Unified Ideographs Extension B" },
+ { 0x2A700, 0x2B73F, "CJK Unified Ideographs Extension C" },
+ { 0x2B740, 0x2B81F, "CJK Unified Ideographs Extension D" },
+ { 0x2F800, 0x2FA1F, "CJK Compatibility Ideographs Supplement" },
+ { 0xE0000, 0xE007F, "Tags" },
+ { 0xE0100, 0xE01EF, "Variation Selectors Supplement" },
+ { 0xF0000, 0xFFFFF, "Supplementary Private Use Area-A" },
+ { 0x100000, 0x10FFFF, "Supplementary Private Use Area-B" }
+};
+#define blocks_level1_shift 8
+#define blocks_level1_threshold 0x30000
+static const uint8_t blocks_level1[768 * 2] =
+{
+ 0, 2,
+ 2, 4,
+ 3, 6,
+ 6, 8,
+ 8, 9,
+ 9, 12,
+ 12, 13,
+ 13, 17,
+ 17, 19,
+ 19, 21,
+ 21, 23,
+ 23, 25,
+ 25, 27,
+ 27, 29,
+ 29, 31,
+ 31, 32,
+ 32, 34,
+ 34, 35,
+ 35, 36,
+ 35, 38,
+ 38, 39,
+ 38, 39,
+ 38, 41,
+ 41, 46,
+ 46, 48,
+ 48, 52,
+ 52, 54,
+ 54, 57,
+ 57, 60,
+ 60, 63,
+ 63, 64,
+ 64, 65,
+ 65, 69,
+ 69, 72,
+ 72, 73,
+ 73, 74,
+ 74, 77,
+ 77, 80,
+ 80, 81,
+ 81, 84,
+ 84, 85,
+ 85, 87,
+ 87, 88,
+ 88, 89,
+ 89, 92,
+ 92, 96,
+ 96, 98,
+ 98, 100,
+ 100, 103,
+ 103, 109,
+ 109, 110,
+ 110, 111,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 112,
+ 111, 113,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 113, 114,
+ 114, 115,
+ 114, 115,
+ 114, 115,
+ 114, 115,
+ 114, 117,
+ 117, 118,
+ 117, 120,
+ 120, 122,
+ 122, 127,
+ 127, 131,
+ 131, 134,
+ 134, 136,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 137,
+ 136, 138,
+ 138, 139,
+ 138, 139,
+ 138, 139,
+ 138, 140,
+ 140, 141,
+ 140, 141,
+ 140, 141,
+ 140, 141,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 141, 142,
+ 142, 143,
+ 142, 143,
+ 143, 145,
+ 144, 145,
+ 144, 145,
+ 145, 151,
+ 151, 153,
+ 153, 155,
+ 155, 159,
+ 159, 161,
+ 161, 165,
+ 165, 168,
+ 168, 168,
+ 168, 168,
+ 168, 168,
+ 168, 170,
+ 170, 172,
+ 172, 174,
+ 174, 177,
+ 177, 178,
+ 178, 178,
+ 178, 179,
+ 179, 179,
+ 179, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 181,
+ 181, 182,
+ 181, 182,
+ 181, 182,
+ 181, 182,
+ 182, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 183,
+ 183, 184,
+ 183, 184,
+ 183, 184,
+ 183, 184,
+ 183, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 184,
+ 184, 185,
+ 184, 185,
+ 184, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 185,
+ 185, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 186,
+ 186, 187,
+ 187, 188,
+ 188, 189,
+ 189, 191,
+ 191, 192,
+ 191, 192,
+ 191, 192,
+ 191, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 192,
+ 192, 195,
+ 195, 196,
+ 196, 197,
+ 197, 198,
+ 197, 198,
+ 197, 198,
+ 198, 200,
+ 200, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 201,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 201, 202,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 203,
+ 202, 204,
+ 203, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 204,
+ 204, 205,
+ 204, 205,
+ 204, 205,
+ 205, 205,
+ 205, 205,
+ 205, 205,
+ 205, 205,
+ 205, 205
+};
+#define blocks_upper_first_index 205
+#define blocks_upper_last_index 209
diff --git a/gnulib/lib/unictype/categ_C.c b/gnulib/lib/unictype/categ_C.c
new file mode 100644
index 0000000..3b2d2e9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_C.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_C table. */
+#include "categ_C.h"
+
+const uc_general_category_t UC_CATEGORY_C =
+ { UC_CATEGORY_MASK_C, 0, { &u_categ_C } };
diff --git a/gnulib/lib/unictype/categ_C.h b/gnulib/lib/unictype/categ_C.h
new file mode 100644
index 0000000..d70d6e8
--- /dev/null
+++ b/gnulib/lib/unictype/categ_C.h
@@ -0,0 +1,926 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[61 << 4];
+ }
+u_categ_C =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816,
+ 18 + 640 * sizeof (short) / sizeof (int) + 832,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 848,
+ 18 + 640 * sizeof (short) / sizeof (int) + 864,
+ 18 + 640 * sizeof (short) / sizeof (int) + 880,
+ 18 + 640 * sizeof (short) / sizeof (int) + 896,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 912,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 928,
+ 18 + 640 * sizeof (short) / sizeof (int) + 944,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 944,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 960,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FF00, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x3000003F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x01000000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x18000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00300000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000,
+ 0x30000000, 0x00000000, 0x80000000, 0x60000000,
+ 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x000CFFFF,
+ 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FC00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FC0000,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xF8000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFF000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000,
+ 0xFF000000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF,
+ 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000,
+ 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000,
+ 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF,
+ 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000C000,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0x00000000, 0x0007FFFC, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0xFFFFFF00, 0xC000FFFF,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0xE0000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0xCFFF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0x00400000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000,
+ 0x00000000, 0x20000000, 0xFFFFFFFC, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0x80018000, 0x00010001, 0xFFFFFFFF,
+ 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00,
+ 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F,
+ 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000,
+ 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000,
+ 0x00000000, 0x80000000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xE1000000,
+ 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFE00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cc.c b/gnulib/lib/unictype/categ_Cc.c
new file mode 100644
index 0000000..0cdaa03
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cc table. */
+#include "categ_Cc.h"
+
+const uc_general_category_t UC_CATEGORY_Cc =
+ { UC_CATEGORY_MASK_Cc, 0, { &u_categ_Cc } };
diff --git a/gnulib/lib/unictype/categ_Cc.h b/gnulib/lib/unictype/categ_Cc.h
new file mode 100644
index 0000000..3bbf97c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cc.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Cc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cf.c b/gnulib/lib/unictype/categ_Cf.c
new file mode 100644
index 0000000..afa4111
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cf.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cf table. */
+#include "categ_Cf.h"
+
+const uc_general_category_t UC_CATEGORY_Cf =
+ { UC_CATEGORY_MASK_Cf, 0, { &u_categ_Cf } };
diff --git a/gnulib/lib/unictype/categ_Cf.h b/gnulib/lib/unictype/categ_Cf.h
new file mode 100644
index 0000000..6b775de
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cf.h
@@ -0,0 +1,456 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_categ_Cf =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x20000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cn.c b/gnulib/lib/unictype/categ_Cn.c
new file mode 100644
index 0000000..1a75ba0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cn.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Cn table. */
+#include "categ_Cn.h"
+
+const uc_general_category_t UC_CATEGORY_Cn =
+ { UC_CATEGORY_MASK_Cn, 0, { &u_categ_Cn } };
diff --git a/gnulib/lib/unictype/categ_Cn.h b/gnulib/lib/unictype/categ_Cn.h
new file mode 100644
index 0000000..7eb02ce
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cn.h
@@ -0,0 +1,1050 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[6 << 7];
+ /*unsigned*/ int level3[60 << 4];
+ }
+u_categ_Cn =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 640,
+ 18 * sizeof (int) / sizeof (short) + 640
+ },
+ {
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 0,
+ 18 + 768 * sizeof (short) / sizeof (int) + 16,
+ 18 + 768 * sizeof (short) / sizeof (int) + 32,
+ 18 + 768 * sizeof (short) / sizeof (int) + 48,
+ 18 + 768 * sizeof (short) / sizeof (int) + 64,
+ 18 + 768 * sizeof (short) / sizeof (int) + 80,
+ 18 + 768 * sizeof (short) / sizeof (int) + 96,
+ 18 + 768 * sizeof (short) / sizeof (int) + 112,
+ 18 + 768 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 144,
+ 18 + 768 * sizeof (short) / sizeof (int) + 160,
+ 18 + 768 * sizeof (short) / sizeof (int) + 176,
+ 18 + 768 * sizeof (short) / sizeof (int) + 192,
+ 18 + 768 * sizeof (short) / sizeof (int) + 208,
+ 18 + 768 * sizeof (short) / sizeof (int) + 224,
+ 18 + 768 * sizeof (short) / sizeof (int) + 240,
+ 18 + 768 * sizeof (short) / sizeof (int) + 256,
+ 18 + 768 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 288,
+ 18 + 768 * sizeof (short) / sizeof (int) + 304,
+ 18 + 768 * sizeof (short) / sizeof (int) + 320,
+ 18 + 768 * sizeof (short) / sizeof (int) + 336,
+ 18 + 768 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 400,
+ 18 + 768 * sizeof (short) / sizeof (int) + 416,
+ 18 + 768 * sizeof (short) / sizeof (int) + 432,
+ 18 + 768 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 480,
+ 18 + 768 * sizeof (short) / sizeof (int) + 496,
+ 18 + 768 * sizeof (short) / sizeof (int) + 512,
+ 18 + 768 * sizeof (short) / sizeof (int) + 528,
+ 18 + 768 * sizeof (short) / sizeof (int) + 544,
+ 18 + 768 * sizeof (short) / sizeof (int) + 560,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 592,
+ 18 + 768 * sizeof (short) / sizeof (int) + 608,
+ 18 + 768 * sizeof (short) / sizeof (int) + 624,
+ 18 + 768 * sizeof (short) / sizeof (int) + 640,
+ 18 + 768 * sizeof (short) / sizeof (int) + 656,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 672,
+ 18 + 768 * sizeof (short) / sizeof (int) + 688,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 704,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 720,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 736,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 752,
+ 18 + 768 * sizeof (short) / sizeof (int) + 768,
+ 18 + 768 * sizeof (short) / sizeof (int) + 784,
+ 18 + 768 * sizeof (short) / sizeof (int) + 800,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 816,
+ 18 + 768 * sizeof (short) / sizeof (int) + 832,
+ 18 + 768 * sizeof (short) / sizeof (int) + 848,
+ 18 + 768 * sizeof (short) / sizeof (int) + 864,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 880,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 896,
+ 18 + 768 * sizeof (short) / sizeof (int) + 912,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 912,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 928,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ 18 + 768 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 768 * sizeof (short) / sizeof (int) + 944
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FF00, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x30000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x01000000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x18000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000,
+ 0x30000000, 0x00000000, 0x80000000, 0x60000000,
+ 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C03E0,
+ 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FC00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FC0000,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xF8000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFF000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000,
+ 0xFF000000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF,
+ 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000,
+ 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000,
+ 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF,
+ 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000C000,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0x00000000, 0x0007FFFC, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0xFFFFFF00, 0xC000FFFF,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0xC1FF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0x00400000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0x80018000, 0x00010001, 0xFFFFFFFF,
+ 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00,
+ 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F,
+ 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000,
+ 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000,
+ 0x00000000, 0x80000000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xE1000000,
+ 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFE00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Co.c b/gnulib/lib/unictype/categ_Co.c
new file mode 100644
index 0000000..2cd5abf
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Co.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Co table. */
+#include "categ_Co.h"
+
+const uc_general_category_t UC_CATEGORY_Co =
+ { UC_CATEGORY_MASK_Co, 0, { &u_categ_Co } };
diff --git a/gnulib/lib/unictype/categ_Co.h b/gnulib/lib/unictype/categ_Co.h
new file mode 100644
index 0000000..e7db3ea
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Co.h
@@ -0,0 +1,310 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Co =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Cs.c b/gnulib/lib/unictype/categ_Cs.c
new file mode 100644
index 0000000..4d0ee55
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cs.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Cs (ucs4_t uc)
+{
+ return (uc >= 0xd800 && uc < 0xe000);
+}
+
+const uc_general_category_t UC_CATEGORY_Cs =
+ { UC_CATEGORY_MASK_Cs, 1, { &uc_is_category_Cs } };
diff --git a/gnulib/lib/unictype/categ_Cs.h b/gnulib/lib/unictype/categ_Cs.h
new file mode 100644
index 0000000..6ee5355
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Cs.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Cs =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_L.c b/gnulib/lib/unictype/categ_L.c
new file mode 100644
index 0000000..64f2adb
--- /dev/null
+++ b/gnulib/lib/unictype/categ_L.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_L table. */
+#include "categ_L.h"
+
+const uc_general_category_t UC_CATEGORY_L =
+ { UC_CATEGORY_MASK_L, 0, { &u_categ_L } };
diff --git a/gnulib/lib/unictype/categ_L.h b/gnulib/lib/unictype/categ_L.h
new file mode 100644
index 0000000..8818601
--- /dev/null
+++ b/gnulib/lib/unictype/categ_L.h
@@ -0,0 +1,604 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[48 << 4];
+ }
+u_categ_L =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00060003,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x000043E0, 0x00000000,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000060, 0x183E0000, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000003FD, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x0000FF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_LC.c b/gnulib/lib/unictype/categ_LC.c
new file mode 100644
index 0000000..13801d9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_LC.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_LC table. */
+#include "categ_LC.h"
+
+const uc_general_category_t UC_CATEGORY_LC =
+ { UC_CATEGORY_MASK_LC, 0, { &u_categ_LC } };
diff --git a/gnulib/lib/unictype/categ_LC.h b/gnulib/lib/unictype/categ_LC.h
new file mode 100644
index 0000000..454bf75
--- /dev/null
+++ b/gnulib/lib/unictype/categ_LC.h
@@ -0,0 +1,339 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[14 << 4];
+ }
+u_categ_LC =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x38CF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x007FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000FFF, 0x00000000, 0xFEFFFFFC,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0x00000000,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xDFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFEFFFF,
+ 0x000378FF, 0x000003FF, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Ll.c b/gnulib/lib/unictype/categ_Ll.c
new file mode 100644
index 0000000..c915918
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ll.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Ll table. */
+#include "categ_Ll.h"
+
+const uc_general_category_t UC_CATEGORY_Ll =
+ { UC_CATEGORY_MASK_Ll, 0, { &u_categ_Ll } };
diff --git a/gnulib/lib/unictype/categ_Ll.h b/gnulib/lib/unictype/categ_Ll.h
new file mode 100644
index 0000000..3cac1f6
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ll.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_categ_Ll =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x55AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x4E243129, 0xE6512D2A, 0xB5555240, 0xAA29AAAA,
+ 0xAAAAAAAA, 0x93FAAAAA, 0xFFFFAA85, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x388A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x192FAAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000FFF, 0x00000000, 0xFEFFFFFC,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0xBFEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0008C400, 0x32108000, 0x000043C0, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x1FDA1562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000501A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FEAAAA,
+ 0x000250AA, 0x000002AA, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFC000000, 0x000FFFFF, 0xFFDFC000, 0x000000FF,
+ 0x0FFFFFFC, 0xEBC00000, 0x0000FFEF, 0xFFFFFC00,
+ 0xC000000F, 0x00FFFFFF, 0xFFFC0000, 0x00000FFF,
+ 0xFFFFFFC0, 0xFC000000, 0x000FFFFF, 0xFFFFC000,
+ 0x000000FF, 0x0FFFFFFC, 0xFFC00000, 0x0000FFFF,
+ 0xFFFFFC00, 0x0000003F, 0xF7FFFFFC, 0xF0000003,
+ 0x0FDFFFFF, 0xFFC00000, 0x003F7FFF, 0xFFFF0000,
+ 0x0000FDFF, 0xFFFFFC00, 0x00000BF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lm.c b/gnulib/lib/unictype/categ_Lm.c
new file mode 100644
index 0000000..9dfaf71
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lm.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lm table. */
+#include "categ_Lm.h"
+
+const uc_general_category_t UC_CATEGORY_Lm =
+ { UC_CATEGORY_MASK_Lm, 0, { &u_categ_Lm } };
diff --git a/gnulib/lib/unictype/categ_Lm.h b/gnulib/lib/unictype/categ_Lm.h
new file mode 100644
index 0000000..47f73ec
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lm.h
@@ -0,0 +1,232 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[20 << 4];
+ }
+u_categ_Lm =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 176,
+ 2 + 128 * sizeof (short) / sizeof (int) + 192,
+ 2 + 128 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 240,
+ 2 + 128 * sizeof (short) / sizeof (int) + 256,
+ 2 + 128 * sizeof (short) / sizeof (int) + 272,
+ 2 + 128 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 304
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x04100000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000060,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04300000,
+ 0x04000000, 0x00000110, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003,
+ 0xF8000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x083E0000, 0x00000000, 0x00000000,
+ 0x60000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF800000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lo.c b/gnulib/lib/unictype/categ_Lo.c
new file mode 100644
index 0000000..51cb6c3
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lo.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lo table. */
+#include "categ_Lo.h"
+
+const uc_general_category_t UC_CATEGORY_Lo =
+ { UC_CATEGORY_MASK_Lo, 0, { &u_categ_Lo } };
diff --git a/gnulib/lib/unictype/categ_Lo.h b/gnulib/lib/unictype/categ_Lo.h
new file mode 100644
index 0000000..966c33f
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lo.h
@@ -0,0 +1,592 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[45 << 4];
+ }
+u_categ_Lo =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00100000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FE, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C000,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x000007FF,
+ 0x003FFFFF, 0x00000000, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFC0003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00060003,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000003F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000001F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0x00000000, 0xFFFF0000, 0x07FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000007FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFF7, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x00FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01E00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0x0000003F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000040, 0x10000000, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0x807FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x87FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF0FFF, 0x00000C00, 0x00000000, 0x00004000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047EFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x18000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0000000, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFEFFC0,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000003FD, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x0000FF0F, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lt.c b/gnulib/lib/unictype/categ_Lt.c
new file mode 100644
index 0000000..53c093d
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lt.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lt table. */
+#include "categ_Lt.h"
+
+const uc_general_category_t UC_CATEGORY_Lt =
+ { UC_CATEGORY_MASK_Lt, 0, { &u_categ_Lt } };
diff --git a/gnulib/lib/unictype/categ_Lt.h b/gnulib/lib/unictype/categ_Lt.h
new file mode 100644
index 0000000..728cfd8
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lt.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_categ_Lt =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000920, 0x00040000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF00FF00, 0x1000FF00, 0x00001000, 0x10000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Lu.c b/gnulib/lib/unictype/categ_Lu.c
new file mode 100644
index 0000000..d3e2b11
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lu.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Lu table. */
+#include "categ_Lu.h"
+
+const uc_general_category_t UC_CATEGORY_Lu =
+ { UC_CATEGORY_MASK_Lu, 0, { &u_categ_Lu } };
diff --git a/gnulib/lib/unictype/categ_Lu.h b/gnulib/lib/unictype/categ_Lu.h
new file mode 100644
index 0000000..cfee1c0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Lu.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_categ_Lu =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAA490, 0x55D25555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x551C8000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0x00000000, 0x0F000000, 0x0F000F00, 0x0F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E273884, 0xC00F3D50, 0x00000020, 0x00000000,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0xC025EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00002805,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001555,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00012855, 0x00000155, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FFFFFF, 0xFFF00000, 0x00003FFF, 0xFFFFFF00,
+ 0xD0000003, 0x003FDE64, 0xFFFF0000, 0x000003FF,
+ 0x1FDFE7B0, 0x7B000000, 0x0001FC5F, 0xFFFFF000,
+ 0x0000003F, 0x03FFFFFF, 0xFFF00000, 0x00003FFF,
+ 0xFFFFFF00, 0xF0000003, 0x003FFFFF, 0xFFFF0000,
+ 0x000003FF, 0xFFFFFF00, 0x00000001, 0x07FFFFFC,
+ 0xF0000000, 0x001FFFFF, 0xFFC00000, 0x00007FFF,
+ 0xFFFF0000, 0x000001FF, 0x00000400, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_M.c b/gnulib/lib/unictype/categ_M.c
new file mode 100644
index 0000000..cce2e02
--- /dev/null
+++ b/gnulib/lib/unictype/categ_M.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_M table. */
+#include "categ_M.h"
+
+const uc_general_category_t UC_CATEGORY_M =
+ { UC_CATEGORY_MASK_M, 0, { &u_categ_M } };
diff --git a/gnulib/lib/unictype/categ_M.h b/gnulib/lib/unictype/categ_M.h
new file mode 100644
index 0000000..c8059ac
--- /dev/null
+++ b/gnulib/lib/unictype/categ_M.h
@@ -0,0 +1,532 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[27 << 4];
+ }
+u_categ_M =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFFFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0xDC000000, 0x00FEFFFF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0xFFFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D,
+ 0x3C00BFFC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x200FFFFF, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x7FE00000, 0x9FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800,
+ 0x00000007, 0x000007FE, 0x00000000, 0x000FFFC0,
+ 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000421FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000001F, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000,
+ 0x0000000F, 0xFFF80000, 0x00000001, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x08000000,
+ 0x00000000, 0xC19D0000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000037F8,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000007, 0x07FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Mc.c b/gnulib/lib/unictype/categ_Mc.c
new file mode 100644
index 0000000..625dfb1
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Mc table. */
+#include "categ_Mc.h"
+
+const uc_general_category_t UC_CATEGORY_Mc =
+ { UC_CATEGORY_MASK_Mc, 0, { &u_categ_Mc } };
diff --git a/gnulib/lib/unictype/categ_Mc.h b/gnulib/lib/unictype/categ_Mc.h
new file mode 100644
index 0000000..bc1d563
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mc.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_categ_Mc =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000008, 0xC8000000, 0x0000DE01, 0x00000000,
+ 0x0000000C, 0xC0000000, 0x00801981, 0x00000000,
+ 0x00000008, 0xC0000000, 0x00000001, 0x00000000,
+ 0x00000008, 0xC0000000, 0x00001A01, 0x00000000,
+ 0x0000000C, 0x40000000, 0x00801981, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00801DC6, 0x00000000,
+ 0x0000000E, 0x00000000, 0x0000001E, 0x00000000,
+ 0x0000000C, 0x40000000, 0x00600D9F, 0x00000000,
+ 0x0000000C, 0xC0000000, 0x00801DC1, 0x00000000,
+ 0x0000000C, 0x00000000, 0xFF038000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x19021800, 0x00C00000, 0x00003F9C,
+ 0x1C009F98, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0400000, 0x000001BF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FB0E78, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0E000000, 0x00000000, 0x00A00000, 0x0007E01A,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0xE8200000, 0x0000001B, 0x00000000,
+ 0x00000004, 0x000004C2, 0x00000000, 0x000C5C80,
+ 0x00000000, 0x00300FF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00040002,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000098, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x00000000, 0x000C0000, 0x00000000,
+ 0x00000008, 0xEC300000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00198000, 0x00002000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000016D8,
+ 0x00000005, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x01870000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007E060,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Me.c b/gnulib/lib/unictype/categ_Me.c
new file mode 100644
index 0000000..64b1709
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Me.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Me table. */
+#include "categ_Me.h"
+
+const uc_general_category_t UC_CATEGORY_Me =
+ { UC_CATEGORY_MASK_Me, 0, { &u_categ_Me } };
diff --git a/gnulib/lib/unictype/categ_Me.h b/gnulib/lib/unictype/categ_Me.h
new file mode 100644
index 0000000..3951c8b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Me.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Me =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000300, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x0000001D,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00070000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Mn.c b/gnulib/lib/unictype/categ_Mn.c
new file mode 100644
index 0000000..c330e7e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mn.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Mn table. */
+#include "categ_Mn.h"
+
+const uc_general_category_t UC_CATEGORY_Mn =
+ { UC_CATEGORY_MASK_Mn, 0, { &u_categ_Mn } };
diff --git a/gnulib/lib/unictype/categ_Mn.h b/gnulib/lib/unictype/categ_Mn.h
new file mode 100644
index 0000000..c1bb94c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Mn.h
@@ -0,0 +1,532 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[27 << 4];
+ }
+u_categ_Mn =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFFFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0x14000000, 0x00FE21FE, 0x0000000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00003040, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x20002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x7F400000, 0x9FF81FE5,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x0003A340,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000007, 0x13C80000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0xC19D0000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002120,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000003, 0x06780000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_N.c b/gnulib/lib/unictype/categ_N.c
new file mode 100644
index 0000000..d7853fa
--- /dev/null
+++ b/gnulib/lib/unictype/categ_N.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_N table. */
+#include "categ_N.h"
+
+const uc_general_category_t UC_CATEGORY_N =
+ { UC_CATEGORY_MASK_N, 0, { &u_categ_N } };
diff --git a/gnulib/lib/unictype/categ_N.h b/gnulib/lib/unictype/categ_N.h
new file mode 100644
index 0000000..29b9e25
--- /dev/null
+++ b/gnulib/lib/unictype/categ_N.h
@@ -0,0 +1,415 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[33 << 4];
+ }
+u_categ_N =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F0FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FCFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F00FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF03FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF03FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0x000003E7, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003F0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0xFFFFFFFF, 0x01FFFFFF,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0FC00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x60000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Nd.c b/gnulib/lib/unictype/categ_Nd.c
new file mode 100644
index 0000000..f530ab8
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nd.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Nd table. */
+#include "categ_Nd.h"
+
+const uc_general_category_t UC_CATEGORY_Nd =
+ { UC_CATEGORY_MASK_Nd, 0, { &u_categ_Nd } };
diff --git a/gnulib/lib/unictype/categ_Nd.h b/gnulib/lib/unictype/categ_Nd.h
new file mode 100644
index 0000000..765bfc9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nd.h
@@ -0,0 +1,355 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[18 << 4];
+ }
+u_categ_Nd =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF03FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Nl.c b/gnulib/lib/unictype/categ_Nl.c
new file mode 100644
index 0000000..7ff1156
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nl.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Nl table. */
+#include "categ_Nl.h"
+
+const uc_general_category_t UC_CATEGORY_Nl =
+ { UC_CATEGORY_MASK_Nl, 0, { &u_categ_Nl } };
diff --git a/gnulib/lib/unictype/categ_Nl.h b/gnulib/lib/unictype/categ_Nl.h
new file mode 100644
index 0000000..5fe8aae
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Nl.h
@@ -0,0 +1,311 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_categ_Nl =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x000001E7, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_No.c b/gnulib/lib/unictype/categ_No.c
new file mode 100644
index 0000000..201b9f0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_No.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_No table. */
+#include "categ_No.h"
+
+const uc_general_category_t UC_CATEGORY_No =
+ { UC_CATEGORY_MASK_No, 0, { &u_categ_No } };
diff --git a/gnulib/lib/unictype/categ_No.h b/gnulib/lib/unictype/categ_No.h
new file mode 100644
index 0000000..d25614b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_No.h
@@ -0,0 +1,375 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[23 << 4];
+ }
+u_categ_No =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FC0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00070000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000FFC00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x04000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003F0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0x00000000, 0x01E00000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0FC00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x60000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC0000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_P.c b/gnulib/lib/unictype/categ_P.c
new file mode 100644
index 0000000..cda2174
--- /dev/null
+++ b/gnulib/lib/unictype/categ_P.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_P table. */
+#include "categ_P.h"
+
+const uc_general_category_t UC_CATEGORY_P =
+ { UC_CATEGORY_MASK_P, 0, { &u_categ_P } };
diff --git a/gnulib/lib/unictype/categ_P.h b/gnulib/lib/unictype/categ_P.h
new file mode 100644
index 0000000..1b9ad86
--- /dev/null
+++ b/gnulib/lib/unictype/categ_P.h
@@ -0,0 +1,415 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[33 << 4];
+ }
+u_categ_P =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00F7EE, 0xB8000001, 0x28000000,
+ 0x00000000, 0x88800802, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000600, 0x40000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x7FFF0000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x061F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00003F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0xF0000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF00FF, 0x7FFBFFEF, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFF00,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00037FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFF3FF0E, 0x20010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FC0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x07000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0x00000D0B,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00F7EE, 0xB8000001, 0xA8000000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003F80, 0x00000000,
+ 0x00000000, 0xD8000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pc.c b/gnulib/lib/unictype/categ_Pc.c
new file mode 100644
index 0000000..3f6ce69
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pc table. */
+#include "categ_Pc.h"
+
+const uc_general_category_t UC_CATEGORY_Pc =
+ { UC_CATEGORY_MASK_Pc, 0, { &u_categ_Pc } };
diff --git a/gnulib/lib/unictype/categ_Pc.h b/gnulib/lib/unictype/categ_Pc.h
new file mode 100644
index 0000000..71cefb1
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pc.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00100001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00180000, 0x0000E000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pd.c b/gnulib/lib/unictype/categ_Pd.c
new file mode 100644
index 0000000..4f47496
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pd.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pd table. */
+#include "categ_Pd.h"
+
+const uc_general_category_t UC_CATEGORY_Pd =
+ { UC_CATEGORY_MASK_Pd, 0, { &u_categ_Pd } };
diff --git a/gnulib/lib/unictype/categ_Pd.h b/gnulib/lib/unictype/categ_Pd.h
new file mode 100644
index 0000000..1117137
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pd.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_categ_Pd =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x04800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00060000, 0x01000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pe.c b/gnulib/lib/unictype/categ_Pe.c
new file mode 100644
index 0000000..22e5077
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pe.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pe table. */
+#include "categ_Pe.h"
+
+const uc_general_category_t UC_CATEGORY_Pe =
+ { UC_CATEGORY_MASK_Pe, 0, { &u_categ_Pe } };
diff --git a/gnulib/lib/unictype/categ_Pe.h b/gnulib/lib/unictype/categ_Pe.h
new file mode 100644
index 0000000..5ac2941
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pe.h
@@ -0,0 +1,196 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_categ_Pe =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160
+ },
+ {
+ 0x00000000, 0x00000200, 0x20000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x28000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x40000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x002AAA00,
+ 0x00000000, 0x00000000, 0x00000040, 0x0000AA80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01555550, 0x00000000, 0x0A000000, 0x20000000,
+ 0x00000000, 0x000002A8, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xCAA2AA00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01000000, 0x55400000, 0x54000115, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000200, 0x20000000, 0x20000000, 0x00000009,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pf.c b/gnulib/lib/unictype/categ_Pf.c
new file mode 100644
index 0000000..a0fc9b0
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pf.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pf table. */
+#include "categ_Pf.h"
+
+const uc_general_category_t UC_CATEGORY_Pf =
+ { UC_CATEGORY_MASK_Pf, 0, { &u_categ_Pf } };
diff --git a/gnulib/lib/unictype/categ_Pf.h b/gnulib/lib/unictype/categ_Pf.h
new file mode 100644
index 0000000..6cdb192
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pf.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pf =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x22000000, 0x04000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x20002428, 0x00000002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Pi.c b/gnulib/lib/unictype/categ_Pi.c
new file mode 100644
index 0000000..ae18039
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pi.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Pi table. */
+#include "categ_Pi.h"
+
+const uc_general_category_t UC_CATEGORY_Pi =
+ { UC_CATEGORY_MASK_Pi, 0, { &u_categ_Pi } };
diff --git a/gnulib/lib/unictype/categ_Pi.h b/gnulib/lib/unictype/categ_Pi.h
new file mode 100644
index 0000000..9edd086
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Pi.h
@@ -0,0 +1,164 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_categ_Pi =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x99000000, 0x02000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10001214, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Po.c b/gnulib/lib/unictype/categ_Po.c
new file mode 100644
index 0000000..a7d78a1
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Po.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Po table. */
+#include "categ_Po.h"
+
+const uc_general_category_t UC_CATEGORY_Po =
+ { UC_CATEGORY_MASK_Po, 0, { &u_categ_Po } };
diff --git a/gnulib/lib/unictype/categ_Po.h b/gnulib/lib/unictype/categ_Po.h
new file mode 100644
index 0000000..a27eeee
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Po.h
@@ -0,0 +1,395 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[28 << 4];
+ }
+u_categ_Po =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00D4EE, 0x10000001, 0x00000000,
+ 0x00000000, 0x80800002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x7FFF0000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x061F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007BF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00003F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0xF0000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00C00000, 0x79FF00FF, 0x7FEBFF8E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xCB7FC9C3, 0x00037C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000E, 0x20000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FC0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x07000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000800,
+ 0x027F0000, 0x00010000, 0x80F71E60, 0x00000D03,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00D4EE, 0x10000001, 0x00000000, 0x00000032,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003F80, 0x00000000,
+ 0x00000000, 0xD8000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Ps.c b/gnulib/lib/unictype/categ_Ps.c
new file mode 100644
index 0000000..215d00c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ps.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Ps table. */
+#include "categ_Ps.h"
+
+const uc_general_category_t UC_CATEGORY_Ps =
+ { UC_CATEGORY_MASK_Ps, 0, { &u_categ_Ps } };
diff --git a/gnulib/lib/unictype/categ_Ps.h b/gnulib/lib/unictype/categ_Ps.h
new file mode 100644
index 0000000..124cf13
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Ps.h
@@ -0,0 +1,196 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_categ_Ps =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160
+ },
+ {
+ 0x00000000, 0x00000100, 0x08000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x14000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x44000000, 0x00000000, 0x00000020, 0x20000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00155500,
+ 0x00000000, 0x00000000, 0x00000020, 0x00005540,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00AAAAA8, 0x00000000, 0x05000000, 0x10000000,
+ 0x00000000, 0x00000154, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x25515500, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00800000, 0xAAA00000, 0x2A00008A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000100, 0x08000000, 0x88000000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_S.c b/gnulib/lib/unictype/categ_S.c
new file mode 100644
index 0000000..d5914b2
--- /dev/null
+++ b/gnulib/lib/unictype/categ_S.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_S table. */
+#include "categ_S.h"
+
+const uc_general_category_t UC_CATEGORY_S =
+ { UC_CATEGORY_MASK_S, 0, { &u_categ_S } };
diff --git a/gnulib/lib/unictype/categ_S.h b/gnulib/lib/unictype/categ_S.h
new file mode 100644
index 0000000..6b87f2a
--- /dev/null
+++ b/gnulib/lib/unictype/categ_S.h
@@ -0,0 +1,443 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[40 << 4];
+ }
+u_categ_S =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 528,
+ 3 + 256 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 576,
+ 3 + 256 * sizeof (short) / sizeof (int) + 592,
+ 3 + 256 * sizeof (short) / sizeof (int) + 608,
+ 3 + 256 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000810, 0x40000000, 0x50000001,
+ 0x00000000, 0x0153D3FC, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00200000,
+ 0x00000030, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C9C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x40000000, 0x60000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0C0C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x01E0DFBF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000001,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FF007FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00000000, 0x00040010, 0x1C000000,
+ 0x00001C00, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0xC1D0037B, 0x0C0042AF, 0x0000BC1F, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFF9FF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFD79F, 0xFFFF003F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFE000007, 0xFFFFFFFF, 0xF0FFFFFF, 0xCFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0x000C0010, 0xC0C00001, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFC30000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF,
+ 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x03C00F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000274,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000810, 0x40000000, 0x50000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30007F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0xFF800000, 0x00000000, 0xFE000000,
+ 0x0FFF03FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00001C1F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0xFFFF0000, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sc.c b/gnulib/lib/unictype/categ_Sc.c
new file mode 100644
index 0000000..9baa85b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sc.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sc table. */
+#include "categ_Sc.h"
+
+const uc_general_category_t UC_CATEGORY_Sc =
+ { UC_CATEGORY_MASK_Sc, 0, { &u_categ_Sc } };
diff --git a/gnulib/lib/unictype/categ_Sc.h b/gnulib/lib/unictype/categ_Sc.h
new file mode 100644
index 0000000..121d322
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sc.h
@@ -0,0 +1,192 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_categ_Sc =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144
+ },
+ {
+ 0x00000000, 0x00000010, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x080C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sk.c b/gnulib/lib/unictype/categ_Sk.c
new file mode 100644
index 0000000..e3d6ca9
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sk.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sk table. */
+#include "categ_Sk.h"
+
+const uc_general_category_t UC_CATEGORY_Sk =
+ { UC_CATEGORY_MASK_Sk, 0, { &u_categ_Sk } };
diff --git a/gnulib/lib/unictype/categ_Sk.h b/gnulib/lib/unictype/categ_Sk.h
new file mode 100644
index 0000000..4006353
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sk.h
@@ -0,0 +1,180 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_categ_Sk =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000001,
+ 0x00000000, 0x01108100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00200000,
+ 0x00000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000008
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Sm.c b/gnulib/lib/unictype/categ_Sm.c
new file mode 100644
index 0000000..d7f7150
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sm.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Sm table. */
+#include "categ_Sm.h"
+
+const uc_general_category_t UC_CATEGORY_Sm =
+ { UC_CATEGORY_MASK_Sm, 0, { &u_categ_Sm } };
diff --git a/gnulib/lib/unictype/categ_Sm.h b/gnulib/lib/unictype/categ_Sm.h
new file mode 100644
index 0000000..0a7b154
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Sm.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_categ_Sm =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000800, 0x00000000, 0x50000000,
+ 0x00000000, 0x00021000, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x000001C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00040010, 0x1C000000,
+ 0x00001C00, 0x00000000, 0x00000000, 0x00000000,
+ 0x01000000, 0x00000000, 0x0000081F, 0x00000000,
+ 0x0C1F0000, 0x00004049, 0x0014C000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000F00, 0x00000003, 0x00000000, 0x10000000,
+ 0xF8000000, 0x000FFFFF, 0xF0000000, 0x00000003,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000002, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFD79F, 0xFFFF003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFE000007, 0xFFFFFFFF, 0xF0FFFFFF, 0xCFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF0000, 0x00001F9F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000074,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000800, 0x00000000, 0x50000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00001E04,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_So.c b/gnulib/lib/unictype/categ_So.c
new file mode 100644
index 0000000..17ec608
--- /dev/null
+++ b/gnulib/lib/unictype/categ_So.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_So table. */
+#include "categ_So.h"
+
+const uc_general_category_t UC_CATEGORY_So =
+ { UC_CATEGORY_MASK_So, 0, { &u_categ_So } };
diff --git a/gnulib/lib/unictype/categ_So.h b/gnulib/lib/unictype/categ_So.h
new file mode 100644
index 0000000..b2f9447
--- /dev/null
+++ b/gnulib/lib/unictype/categ_So.h
@@ -0,0 +1,419 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[34 << 4];
+ }
+u_categ_So =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ 3 + 256 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x004142C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x40000000, 0x60000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x05F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFCF8000E, 0x01500000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x01E0DFBF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000001,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FF007FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0D0037B, 0x0C0042AF, 0x0000B400, 0x00000000,
+ 0xF3E00000, 0xFFFFBFB6, 0xFFEB3FFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFF0FF, 0xFFFFF9FC, 0xFFFFFFFF, 0xEFFFFFFF,
+ 0x07FFFFFF, 0xFFF00000, 0x0FFFFFFF, 0x000FFFFC,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFF7FFFFF, 0xFFFFFFFD, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF7FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x000000FF,
+ 0xFFF00000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0000FFFF, 0x03FF0060, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0x000C0010, 0xC0C00001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFC30000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF,
+ 0xFFFFFC00, 0x0001FFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x02C00F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30006110,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0xFF800000, 0x00000000, 0xFE000000,
+ 0x0FFF03FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00001C1F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0xFFFF0000, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Z.c b/gnulib/lib/unictype/categ_Z.c
new file mode 100644
index 0000000..1d1f8f1
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Z.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Z table. */
+#include "categ_Z.h"
+
+const uc_general_category_t UC_CATEGORY_Z =
+ { UC_CATEGORY_MASK_Z, 0, { &u_categ_Z } };
diff --git a/gnulib/lib/unictype/categ_Z.h b/gnulib/lib/unictype/categ_Z.h
new file mode 100644
index 0000000..ac0e05c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Z.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_categ_Z =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zl.c b/gnulib/lib/unictype/categ_Zl.c
new file mode 100644
index 0000000..6f8f5bf
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zl.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Zl (ucs4_t uc)
+{
+ return (uc == 0x2028);
+}
+
+const uc_general_category_t UC_CATEGORY_Zl =
+ { UC_CATEGORY_MASK_Zl, 1, { &uc_is_category_Zl } };
diff --git a/gnulib/lib/unictype/categ_Zl.h b/gnulib/lib/unictype/categ_Zl.h
new file mode 100644
index 0000000..abc7f93
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zl.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Zl =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zp.c b/gnulib/lib/unictype/categ_Zp.c
new file mode 100644
index 0000000..ae0d17b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zp.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+uc_is_category_Zp (ucs4_t uc)
+{
+ return (uc == 0x2029);
+}
+
+const uc_general_category_t UC_CATEGORY_Zp =
+ { UC_CATEGORY_MASK_Zp, 1, { &uc_is_category_Zp } };
diff --git a/gnulib/lib/unictype/categ_Zp.h b/gnulib/lib/unictype/categ_Zp.h
new file mode 100644
index 0000000..ba4216f
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zp.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_categ_Zp =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_Zs.c b/gnulib/lib/unictype/categ_Zs.c
new file mode 100644
index 0000000..5fe27c7
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zs.c
@@ -0,0 +1,27 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_categ_Zs table. */
+#include "categ_Zs.h"
+
+const uc_general_category_t UC_CATEGORY_Zs =
+ { UC_CATEGORY_MASK_Zs, 0, { &u_categ_Zs } };
diff --git a/gnulib/lib/unictype/categ_Zs.h b/gnulib/lib/unictype/categ_Zs.h
new file mode 100644
index 0000000..a2656af
--- /dev/null
+++ b/gnulib/lib/unictype/categ_Zs.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_categ_Zs =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_and.c b/gnulib/lib/unictype/categ_and.c
new file mode 100644
index 0000000..89f2dd7
--- /dev/null
+++ b/gnulib/lib/unictype/categ_and.c
@@ -0,0 +1,45 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_and (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask & category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == category2.bitmask)
+ return category2;
+
+ if (bitmask == 0)
+ return _UC_CATEGORY_NONE;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_and_not.c b/gnulib/lib/unictype/categ_and_not.c
new file mode 100644
index 0000000..662920e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_and_not.c
@@ -0,0 +1,42 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_and_not (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask & ~category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == 0)
+ return _UC_CATEGORY_NONE;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_byname.c b/gnulib/lib/unictype/categ_byname.c
new file mode 100644
index 0000000..80e97ab
--- /dev/null
+++ b/gnulib/lib/unictype/categ_byname.c
@@ -0,0 +1,191 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Indices stored in the 'struct named_category' elements of the perfect hash
+ table. We don't use uc_general_category_t values or their addresses
+ directly, because this would introduce load-time relocations. */
+enum
+{
+ UC_CATEGORY_INDEX_L,
+ UC_CATEGORY_INDEX_LC,
+ UC_CATEGORY_INDEX_Lu,
+ UC_CATEGORY_INDEX_Ll,
+ UC_CATEGORY_INDEX_Lt,
+ UC_CATEGORY_INDEX_Lm,
+ UC_CATEGORY_INDEX_Lo,
+ UC_CATEGORY_INDEX_M,
+ UC_CATEGORY_INDEX_Mn,
+ UC_CATEGORY_INDEX_Mc,
+ UC_CATEGORY_INDEX_Me,
+ UC_CATEGORY_INDEX_N,
+ UC_CATEGORY_INDEX_Nd,
+ UC_CATEGORY_INDEX_Nl,
+ UC_CATEGORY_INDEX_No,
+ UC_CATEGORY_INDEX_P,
+ UC_CATEGORY_INDEX_Pc,
+ UC_CATEGORY_INDEX_Pd,
+ UC_CATEGORY_INDEX_Ps,
+ UC_CATEGORY_INDEX_Pe,
+ UC_CATEGORY_INDEX_Pi,
+ UC_CATEGORY_INDEX_Pf,
+ UC_CATEGORY_INDEX_Po,
+ UC_CATEGORY_INDEX_S,
+ UC_CATEGORY_INDEX_Sm,
+ UC_CATEGORY_INDEX_Sc,
+ UC_CATEGORY_INDEX_Sk,
+ UC_CATEGORY_INDEX_So,
+ UC_CATEGORY_INDEX_Z,
+ UC_CATEGORY_INDEX_Zs,
+ UC_CATEGORY_INDEX_Zl,
+ UC_CATEGORY_INDEX_Zp,
+ UC_CATEGORY_INDEX_C,
+ UC_CATEGORY_INDEX_Cc,
+ UC_CATEGORY_INDEX_Cf,
+ UC_CATEGORY_INDEX_Cs,
+ UC_CATEGORY_INDEX_Co,
+ UC_CATEGORY_INDEX_Cn
+};
+
+#include "unictype/categ_byname.h"
+
+uc_general_category_t
+uc_general_category_byname (const char *category_name)
+{
+ size_t len;
+
+ len = strlen (category_name);
+ if (len <= MAX_WORD_LENGTH)
+ {
+ char buf[MAX_WORD_LENGTH + 1];
+ const struct named_category *found;
+
+ /* Copy category_name into buf, converting '_' and '-' to ' '. */
+ {
+ const char *p = category_name;
+ char *q = buf;
+
+ for (;; p++, q++)
+ {
+ char c = *p;
+
+ if (c == '_' || c == '-')
+ c = ' ';
+ *q = c;
+ if (c == '\0')
+ break;
+ }
+ }
+ /* Here q == buf + len. */
+
+ /* Do a hash table lookup, with case-insensitive comparison. */
+ found = uc_general_category_lookup (buf, len);
+ if (found != NULL)
+ /* Use a 'switch' statement here, because a table would introduce
+ load-time relocations. */
+ switch (found->category_index)
+ {
+ case UC_CATEGORY_INDEX_L:
+ return UC_CATEGORY_L;
+ case UC_CATEGORY_INDEX_LC:
+ return UC_CATEGORY_LC;
+ case UC_CATEGORY_INDEX_Lu:
+ return UC_CATEGORY_Lu;
+ case UC_CATEGORY_INDEX_Ll:
+ return UC_CATEGORY_Ll;
+ case UC_CATEGORY_INDEX_Lt:
+ return UC_CATEGORY_Lt;
+ case UC_CATEGORY_INDEX_Lm:
+ return UC_CATEGORY_Lm;
+ case UC_CATEGORY_INDEX_Lo:
+ return UC_CATEGORY_Lo;
+ case UC_CATEGORY_INDEX_M:
+ return UC_CATEGORY_M;
+ case UC_CATEGORY_INDEX_Mn:
+ return UC_CATEGORY_Mn;
+ case UC_CATEGORY_INDEX_Mc:
+ return UC_CATEGORY_Mc;
+ case UC_CATEGORY_INDEX_Me:
+ return UC_CATEGORY_Me;
+ case UC_CATEGORY_INDEX_N:
+ return UC_CATEGORY_N;
+ case UC_CATEGORY_INDEX_Nd:
+ return UC_CATEGORY_Nd;
+ case UC_CATEGORY_INDEX_Nl:
+ return UC_CATEGORY_Nl;
+ case UC_CATEGORY_INDEX_No:
+ return UC_CATEGORY_No;
+ case UC_CATEGORY_INDEX_P:
+ return UC_CATEGORY_P;
+ case UC_CATEGORY_INDEX_Pc:
+ return UC_CATEGORY_Pc;
+ case UC_CATEGORY_INDEX_Pd:
+ return UC_CATEGORY_Pd;
+ case UC_CATEGORY_INDEX_Ps:
+ return UC_CATEGORY_Ps;
+ case UC_CATEGORY_INDEX_Pe:
+ return UC_CATEGORY_Pe;
+ case UC_CATEGORY_INDEX_Pi:
+ return UC_CATEGORY_Pi;
+ case UC_CATEGORY_INDEX_Pf:
+ return UC_CATEGORY_Pf;
+ case UC_CATEGORY_INDEX_Po:
+ return UC_CATEGORY_Po;
+ case UC_CATEGORY_INDEX_S:
+ return UC_CATEGORY_S;
+ case UC_CATEGORY_INDEX_Sm:
+ return UC_CATEGORY_Sm;
+ case UC_CATEGORY_INDEX_Sc:
+ return UC_CATEGORY_Sc;
+ case UC_CATEGORY_INDEX_Sk:
+ return UC_CATEGORY_Sk;
+ case UC_CATEGORY_INDEX_So:
+ return UC_CATEGORY_So;
+ case UC_CATEGORY_INDEX_Z:
+ return UC_CATEGORY_Z;
+ case UC_CATEGORY_INDEX_Zs:
+ return UC_CATEGORY_Zs;
+ case UC_CATEGORY_INDEX_Zl:
+ return UC_CATEGORY_Zl;
+ case UC_CATEGORY_INDEX_Zp:
+ return UC_CATEGORY_Zp;
+ case UC_CATEGORY_INDEX_C:
+ return UC_CATEGORY_C;
+ case UC_CATEGORY_INDEX_Cc:
+ return UC_CATEGORY_Cc;
+ case UC_CATEGORY_INDEX_Cf:
+ return UC_CATEGORY_Cf;
+ case UC_CATEGORY_INDEX_Cs:
+ return UC_CATEGORY_Cs;
+ case UC_CATEGORY_INDEX_Co:
+ return UC_CATEGORY_Co;
+ case UC_CATEGORY_INDEX_Cn:
+ return UC_CATEGORY_Cn;
+ default:
+ abort ();
+ }
+ }
+ /* Invalid category name. */
+ return _UC_CATEGORY_NONE;
+}
diff --git a/gnulib/lib/unictype/categ_byname.gperf b/gnulib/lib/unictype/categ_byname.gperf
new file mode 100644
index 0000000..54d1996
--- /dev/null
+++ b/gnulib/lib/unictype/categ_byname.gperf
@@ -0,0 +1,116 @@
+/* Categories of Unicode characters. */
+struct named_category { int name; unsigned int category_index; };
+%struct-type
+%ignore-case
+%language=ANSI-C
+%define hash-function-name general_category_hash
+%define lookup-function-name uc_general_category_lookup
+%readonly-tables
+%global-table
+%define word-array-name general_category_names
+%pic
+%define string-pool-name general_category_stringpool
+%%
+L, UC_CATEGORY_INDEX_L
+LC, UC_CATEGORY_INDEX_LC
+Lu, UC_CATEGORY_INDEX_Lu
+Ll, UC_CATEGORY_INDEX_Ll
+Lt, UC_CATEGORY_INDEX_Lt
+Lm, UC_CATEGORY_INDEX_Lm
+Lo, UC_CATEGORY_INDEX_Lo
+M, UC_CATEGORY_INDEX_M
+Mn, UC_CATEGORY_INDEX_Mn
+Mc, UC_CATEGORY_INDEX_Mc
+Me, UC_CATEGORY_INDEX_Me
+N, UC_CATEGORY_INDEX_N
+Nd, UC_CATEGORY_INDEX_Nd
+Nl, UC_CATEGORY_INDEX_Nl
+No, UC_CATEGORY_INDEX_No
+P, UC_CATEGORY_INDEX_P
+Pc, UC_CATEGORY_INDEX_Pc
+Pd, UC_CATEGORY_INDEX_Pd
+Ps, UC_CATEGORY_INDEX_Ps
+Pe, UC_CATEGORY_INDEX_Pe
+Pi, UC_CATEGORY_INDEX_Pi
+Pf, UC_CATEGORY_INDEX_Pf
+Po, UC_CATEGORY_INDEX_Po
+S, UC_CATEGORY_INDEX_S
+Sm, UC_CATEGORY_INDEX_Sm
+Sc, UC_CATEGORY_INDEX_Sc
+Sk, UC_CATEGORY_INDEX_Sk
+So, UC_CATEGORY_INDEX_So
+Z, UC_CATEGORY_INDEX_Z
+Zs, UC_CATEGORY_INDEX_Zs
+Zl, UC_CATEGORY_INDEX_Zl
+Zp, UC_CATEGORY_INDEX_Zp
+C, UC_CATEGORY_INDEX_C
+Cc, UC_CATEGORY_INDEX_Cc
+Cf, UC_CATEGORY_INDEX_Cf
+Cs, UC_CATEGORY_INDEX_Cs
+Co, UC_CATEGORY_INDEX_Co
+Cn, UC_CATEGORY_INDEX_Cn
+Letter, UC_CATEGORY_INDEX_L
+Cased Letter, UC_CATEGORY_INDEX_LC
+CasedLetter, UC_CATEGORY_INDEX_LC
+Uppercase Letter, UC_CATEGORY_INDEX_Lu
+UppercaseLetter, UC_CATEGORY_INDEX_Lu
+Lowercase Letter, UC_CATEGORY_INDEX_Ll
+LowercaseLetter, UC_CATEGORY_INDEX_Ll
+Titlecase Letter, UC_CATEGORY_INDEX_Lt
+TitlecaseLetter, UC_CATEGORY_INDEX_Lt
+Modifier Letter, UC_CATEGORY_INDEX_Lm
+ModifierLetter, UC_CATEGORY_INDEX_Lm
+Other Letter, UC_CATEGORY_INDEX_Lo
+OtherLetter, UC_CATEGORY_INDEX_Lo
+Mark, UC_CATEGORY_INDEX_M
+Nonspacing Mark, UC_CATEGORY_INDEX_Mn
+NonspacingMark, UC_CATEGORY_INDEX_Mn
+Spacing Mark, UC_CATEGORY_INDEX_Mc
+SpacingMark, UC_CATEGORY_INDEX_Mc
+Enclosing Mark, UC_CATEGORY_INDEX_Me
+EnclosingMark, UC_CATEGORY_INDEX_Me
+Number, UC_CATEGORY_INDEX_N
+Decimal Number, UC_CATEGORY_INDEX_Nd
+DecimalNumber, UC_CATEGORY_INDEX_Nd
+Letter Number, UC_CATEGORY_INDEX_Nl
+LetterNumber, UC_CATEGORY_INDEX_Nl
+Other Number, UC_CATEGORY_INDEX_No
+OtherNumber, UC_CATEGORY_INDEX_No
+Punctuation, UC_CATEGORY_INDEX_P
+Connector Punctuation, UC_CATEGORY_INDEX_Pc
+ConnectorPunctuation, UC_CATEGORY_INDEX_Pc
+Dash Punctuation, UC_CATEGORY_INDEX_Pd
+DashPunctuation, UC_CATEGORY_INDEX_Pd
+Open Punctuation, UC_CATEGORY_INDEX_Ps
+OpenPunctuation, UC_CATEGORY_INDEX_Ps
+Close Punctuation, UC_CATEGORY_INDEX_Pe
+ClosePunctuation, UC_CATEGORY_INDEX_Pe
+Initial Punctuation, UC_CATEGORY_INDEX_Pi
+InitialPunctuation, UC_CATEGORY_INDEX_Pi
+Final Punctuation, UC_CATEGORY_INDEX_Pf
+FinalPunctuation, UC_CATEGORY_INDEX_Pf
+Other Punctuation, UC_CATEGORY_INDEX_Po
+OtherPunctuation, UC_CATEGORY_INDEX_Po
+Symbol, UC_CATEGORY_INDEX_S
+Math Symbol, UC_CATEGORY_INDEX_Sm
+MathSymbol, UC_CATEGORY_INDEX_Sm
+Currency Symbol, UC_CATEGORY_INDEX_Sc
+CurrencySymbol, UC_CATEGORY_INDEX_Sc
+Modifier Symbol, UC_CATEGORY_INDEX_Sk
+ModifierSymbol, UC_CATEGORY_INDEX_Sk
+Other Symbol, UC_CATEGORY_INDEX_So
+OtherSymbol, UC_CATEGORY_INDEX_So
+Separator, UC_CATEGORY_INDEX_Z
+Space Separator, UC_CATEGORY_INDEX_Zs
+SpaceSeparator, UC_CATEGORY_INDEX_Zs
+Line Separator, UC_CATEGORY_INDEX_Zl
+LineSeparator, UC_CATEGORY_INDEX_Zl
+Paragraph Separator, UC_CATEGORY_INDEX_Zp
+ParagraphSeparator, UC_CATEGORY_INDEX_Zp
+Other, UC_CATEGORY_INDEX_C
+Control, UC_CATEGORY_INDEX_Cc
+Format, UC_CATEGORY_INDEX_Cf
+Surrogate, UC_CATEGORY_INDEX_Cs
+Private Use, UC_CATEGORY_INDEX_Co
+PrivateUse, UC_CATEGORY_INDEX_Co
+Unassigned, UC_CATEGORY_INDEX_Cn
diff --git a/gnulib/lib/unictype/categ_longname.c b/gnulib/lib/unictype/categ_longname.c
new file mode 100644
index 0000000..58a653b
--- /dev/null
+++ b/gnulib/lib/unictype/categ_longname.c
@@ -0,0 +1,106 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_category_long_name[30][22] =
+{
+ "Uppercase Letter",
+ "Lowercase Letter",
+ "Titlecase Letter",
+ "Modifier Letter",
+ "Other Letter",
+ "Nonspacing Mark",
+ "Spacing Mark",
+ "Enclosing Mark",
+ "Decimal Number",
+ "Letter Number",
+ "Other Number",
+ "Connector Punctuation",
+ "Dash Punctuation",
+ "Open Punctuation",
+ "Close Punctuation",
+ "Initial Punctuation",
+ "Final Punctuation",
+ "Other Punctuation",
+ "Math Symbol",
+ "Currency Symbol",
+ "Modifier Symbol",
+ "Other Symbol",
+ "Space Separator",
+ "Line Separator",
+ "Paragraph Separator",
+ "Control",
+ "Format",
+ "Surrogate",
+ "Private Use",
+ "Unassigned"
+};
+
+const char *
+uc_general_category_long_name (uc_general_category_t category)
+{
+ uint32_t bitmask = category.bitmask;
+ /* bitmask should consist of a single bit. */
+ if (bitmask != 0)
+ {
+ if ((bitmask & (bitmask - 1)) == 0)
+ {
+ int bit;
+ /* Take log2 using a variant of Robert Harley's method.
+ Found by Bruno Haible 1996. */
+ uint32_t n = bitmask;
+ static const char ord2_tab[64] =
+ {
+ -1, 0, 1, 12, 2, 6, -1, 13, 3, -1, 7, -1, -1, -1, -1, 14,
+ 10, 4, -1, -1, 8, -1, -1, 25, -1, -1, -1, -1, -1, 21, 27, 15,
+ 31, 11, 5, -1, -1, -1, -1, -1, 9, -1, -1, 24, -1, -1, 20, 26,
+ 30, -1, -1, -1, -1, 23, -1, 19, 29, -1, 22, 18, 28, 17, 16, -1
+ };
+ n += n << 4;
+ n += n << 6;
+ n = (n << 16) - n;
+ bit = ord2_tab[n >> 26];
+
+ if (bit < sizeof (u_category_long_name) / sizeof (u_category_long_name[0]))
+ return u_category_long_name[bit];
+ }
+ else
+ {
+ if (bitmask == UC_CATEGORY_MASK_L)
+ return "Letter";
+ if (bitmask == UC_CATEGORY_MASK_LC)
+ return "Cased Letter";
+ if (bitmask == UC_CATEGORY_MASK_M)
+ return "Mark";
+ if (bitmask == UC_CATEGORY_MASK_N)
+ return "Number";
+ if (bitmask == UC_CATEGORY_MASK_P)
+ return "Punctuation";
+ if (bitmask == UC_CATEGORY_MASK_S)
+ return "Symbol";
+ if (bitmask == UC_CATEGORY_MASK_Z)
+ return "Separator";
+ if (bitmask == UC_CATEGORY_MASK_C)
+ return "Other";
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/categ_name.c b/gnulib/lib/unictype/categ_name.c
new file mode 100644
index 0000000..40ecb92
--- /dev/null
+++ b/gnulib/lib/unictype/categ_name.c
@@ -0,0 +1,79 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_category_name[30][3] =
+{
+ "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Mc", "Me", "Nd", "Nl",
+ "No", "Pc", "Pd", "Ps", "Pe", "Pi", "Pf", "Po", "Sm", "Sc",
+ "Sk", "So", "Zs", "Zl", "Zp", "Cc", "Cf", "Cs", "Co", "Cn"
+};
+
+const char *
+uc_general_category_name (uc_general_category_t category)
+{
+ uint32_t bitmask = category.bitmask;
+ /* bitmask should consist of a single bit. */
+ if (bitmask != 0)
+ {
+ if ((bitmask & (bitmask - 1)) == 0)
+ {
+ int bit;
+ /* Take log2 using a variant of Robert Harley's method.
+ Found by Bruno Haible 1996. */
+ uint32_t n = bitmask;
+ static const char ord2_tab[64] =
+ {
+ -1, 0, 1, 12, 2, 6, -1, 13, 3, -1, 7, -1, -1, -1, -1, 14,
+ 10, 4, -1, -1, 8, -1, -1, 25, -1, -1, -1, -1, -1, 21, 27, 15,
+ 31, 11, 5, -1, -1, -1, -1, -1, 9, -1, -1, 24, -1, -1, 20, 26,
+ 30, -1, -1, -1, -1, 23, -1, 19, 29, -1, 22, 18, 28, 17, 16, -1
+ };
+ n += n << 4;
+ n += n << 6;
+ n = (n << 16) - n;
+ bit = ord2_tab[n >> 26];
+
+ if (bit < sizeof (u_category_name) / sizeof (u_category_name[0]))
+ return u_category_name[bit];
+ }
+ else
+ {
+ if (bitmask == UC_CATEGORY_MASK_L)
+ return "L";
+ if (bitmask == UC_CATEGORY_MASK_LC)
+ return "LC";
+ if (bitmask == UC_CATEGORY_MASK_M)
+ return "M";
+ if (bitmask == UC_CATEGORY_MASK_N)
+ return "N";
+ if (bitmask == UC_CATEGORY_MASK_P)
+ return "P";
+ if (bitmask == UC_CATEGORY_MASK_S)
+ return "S";
+ if (bitmask == UC_CATEGORY_MASK_Z)
+ return "Z";
+ if (bitmask == UC_CATEGORY_MASK_C)
+ return "C";
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/categ_none.c b/gnulib/lib/unictype/categ_none.c
new file mode 100644
index 0000000..63ce05e
--- /dev/null
+++ b/gnulib/lib/unictype/categ_none.c
@@ -0,0 +1,30 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static bool
+always_false (ucs4_t uc, uint32_t bitmask)
+{
+ return false;
+}
+
+const uc_general_category_t _UC_CATEGORY_NONE =
+ { 0, 1, { &always_false } };
diff --git a/gnulib/lib/unictype/categ_of.c b/gnulib/lib/unictype/categ_of.c
new file mode 100644
index 0000000..98ba78a
--- /dev/null
+++ b/gnulib/lib/unictype/categ_of.c
@@ -0,0 +1,81 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_category table. */
+#include "categ_of.h"
+
+static inline int
+lookup_withtable (ucs4_t uc)
+{
+ unsigned int index1 = uc >> category_header_0;
+ if (index1 < category_header_1)
+ {
+ int lookup1 = u_category.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> category_header_2) & category_header_3;
+ int lookup2 = u_category.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & category_header_4) + lookup2) * 5;
+ /* level3 contains 5-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_category.level3[index3>>4]
+ | (u_category.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x1f;
+
+ return lookup3;
+ }
+ }
+ return 29; /* = log2(UC_CATEGORY_MASK_Cn) */
+ }
+ return -1;
+}
+
+bool
+uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask)
+{
+ int bit = lookup_withtable (uc);
+
+ if (bit >= 0)
+ return ((bitmask >> bit) & 1);
+ else
+ return false;
+}
+
+uc_general_category_t
+uc_general_category (ucs4_t uc)
+{
+ int bit = lookup_withtable (uc);
+ uc_general_category_t result;
+
+ if (bit >= 0)
+ {
+ result.bitmask = 1 << bit;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+ }
+ else
+ return _UC_CATEGORY_NONE;
+}
diff --git a/gnulib/lib/unictype/categ_of.h b/gnulib/lib/unictype/categ_of.h
new file mode 100644
index 0000000..ba7bf71
--- /dev/null
+++ b/gnulib/lib/unictype/categ_of.h
@@ -0,0 +1,1213 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Categories of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define category_header_0 16
+#define category_header_1 17
+#define category_header_2 7
+#define category_header_3 511
+#define category_header_4 127
+static const
+struct
+ {
+ int level1[17];
+ short level2[5 << 9];
+ unsigned short level3[173 * 40 + 1];
+ }
+u_category =
+{
+ {
+ 0, 512, 1024, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536, 2048,
+ 2048
+ },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, 1536, 1664, 1792, 1920,
+ 2048, -1, 2176, 2304, 2432, 2560, 2688, 2816,
+ 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840,
+ 3968, 4096, 4224, 4224, 4352, 4480, 4608, 4736,
+ 4864, 4224, 4224, 4224, 4992, 5120, 5248, 5376,
+ 5504, 5632, 5760, 5888, 6016, 6144, 6272, 6400,
+ 6528, 6656, 6784, 6912, 7040, 7168, 7296, 7424,
+ 7552, 7680, 7808, 7936, 8064, 8064, 8192, 8320,
+ 8448, 8576, 8704, 8832, 8960, 8704, 9088, 9216,
+ 8704, 8704, 8064, 9344, 8064, 8064, 9472, -1,
+ 9600, 9728, 9856, 9984, 10112, 10240, 8704, 10368,
+ 10496, 10624, 10752, 10880, 11008, 11136, 8704, 8704,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 11264, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 11392,
+ 11520, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 11648, 4224, 4224, 11776, 11904, 12032, 12160,
+ 12288, 12416, 12544, 12672, 12800, 12928, 13056, 13184,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 13312,
+ 13440, 13440, 13440, 13440, 13440, 13440, 13440, 13440,
+ 13440, 13440, 13440, 13440, 13440, 13440, 13440, 13440,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 4224, 4224, 13696, 13824, 13952, 14080,
+ 4224, 4224, 14208, 14336, 14464, 14592, 14720, 14848,
+ 14976, 15104, 15232, 15360, -1, 15488, 15616, 15744,
+ 15872, 16000, -1, -1, -1, -1, -1, -1,
+ 16128, -1, 16256, -1, 16384, -1, 16512, -1,
+ 16640, -1, -1, -1, 16768, -1, -1, -1,
+ 16896, 17024, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4224, 4224, 4224, 4224, 4224, 4224, 17152, -1,
+ 17280, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 17408, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4224, 4224, 4224, 4224, 17536, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17664, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8704, 17792, 17920, 18048, 18176, -1, 18304, -1,
+ 18432, 18560, 18688, 18816, 18944, 19072, 19200, 19328,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 19456, 19584, 19712, 19840, 19968, -1, 20096, 20224,
+ 20352, 20480, 20608, 20736, 20864, 20992, 21120, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 21248, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 4224, 4224,
+ 4224, 4224, 4224, 4224, 4224, 4224, 21376, 4224,
+ 21504, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4224, 4224, 4224, 4224, 21504, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 21632, -1, 21760, 21888, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 13568,
+ 13568, 13568, 13568, 13568, 13568, 13568, 13568, 22016
+ },
+ {
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xc636, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108,
+ 0x1084, 0x0842, 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0xcc9d,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xce36, 0x6739, 0xb4ad, 0x2786, 0xa575, 0x2a55,
+ 0x4345, 0x548d, 0xa805, 0x8a94, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0090, 0x0000, 0x0800, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2190, 0x1084, 0x0842,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x0108, 0x1004, 0x0040, 0x0401, 0x4010, 0x2100, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x0008, 0x1004, 0x0840,
+ 0x8001, 0x0200, 0x0100, 0x1000, 0x0002, 0x0400, 0x0200, 0x2000,
+ 0x0084, 0x0040, 0x8020, 0x0200, 0x0100, 0x0084, 0x0002, 0x0001,
+ 0x4010, 0x2000, 0x0204, 0x0842, 0x1084, 0x4402, 0x2200, 0x1100,
+ 0x0040, 0x0401, 0x4010, 0x0100, 0x1004, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8801, 0x0200, 0x2000, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x4210, 0x2108, 0x1000, 0x0800, 0x0401, 0x0000, 0x2008, 0x0080,
+ 0x0802, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4240, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x5063, 0xe94a, 0x6318, 0x318c,
+ 0x18c6, 0x5063, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x8c63, 0x2831,
+ 0x94a5, 0x3a52, 0xa0e8, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x8020, 0x2830, 0xbd08, 0x108f, 0xec42,
+ 0xf7bd, 0x294e, 0x0088, 0x0e80, 0x003a, 0x0001, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x7400, 0x0000, 0x0000, 0x1000, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0042, 0x0021, 0x4200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8421, 0x8200, 0x0104, 0x1080, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0xd420, 0x4a52, 0xe729, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x0400, 0x4010, 0x0100, 0x1004,
+ 0x0840, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0xbd08, 0xdef7, 0xef7b, 0x001d,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7de8, 0x18c4, 0x8c63, 0x843d, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x3d08, 0xdeb2, 0xef7b, 0x94bd, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x2b0a, 0x94b1, 0x4a58, 0xbd2c, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0xde90, 0xef7b, 0x9084, 0x7b18, 0xbdef, 0xdef7, 0xef7b,
+ 0x6b5a, 0xbbdd, 0x3294, 0x19c6, 0xad63, 0x94a5, 0x4a52, 0xa529,
+ 0xd894, 0x8c7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x5290,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x2108, 0x1084,
+ 0x0842, 0x18c5, 0x2123, 0x1085, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4912, 0xa529, 0x5294, 0x2d74, 0x94a5, 0xc652,
+ 0xa528, 0x5296, 0x210a, 0x2108, 0x1084, 0x0842, 0x4211, 0x256a,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0xd763, 0x10a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xde94,
+ 0x2109, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x294a, 0xf485,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x2108, 0x1084, 0x0842, 0x4211,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x5290, 0x294a, 0x94a5, 0x4632, 0x318d, 0xde8e, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xa529,
+ 0x528c, 0x294a, 0x94a5, 0x4a32, 0xa329, 0x5294, 0xef4a, 0xc631,
+ 0x6318, 0x318c, 0x18c6, 0xec63, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0xa421, 0xd294, 0xec7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x5314, 0x3188, 0x94a6, 0x4a52, 0xc529, 0x6318,
+ 0x318a, 0x94a4, 0x4a52, 0x8429, 0x4210, 0x2108, 0x9484, 0x2312,
+ 0x0842, 0x8421, 0x4210, 0x1071, 0x0842, 0x9d21, 0x4210, 0x2108,
+ 0x18bd, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x93a4,
+ 0x3bde, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x7a52, 0xa637, 0x6377,
+ 0xe90a, 0xf7bd, 0x7bde, 0xbd37, 0x4ef7, 0x2748, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xcc84, 0x94a9, 0x4a52, 0xd9d5, 0xef7b,
+ 0x14bd, 0x09d3, 0x8421, 0xde90, 0x277b, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x84e9, 0x5ef4, 0x31ba, 0x94a6, 0x7bde, 0xa52f, 0x52f7,
+ 0xef4a, 0xf4bd, 0x7bde, 0x9def, 0x4210, 0xe93a, 0xf7bd, 0x3bde,
+ 0x0842, 0x8421, 0x4210, 0x10a5, 0x4a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x14bd, 0x09d3, 0x8421, 0x4210, 0x2748, 0x7484, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x8421, 0x5ef4, 0x3188, 0x94a6, 0x4a52, 0xc52f, 0x6374,
+ 0xef4a, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xf67d, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x18bd, 0x09d3, 0x8421, 0x4210, 0x277a, 0x77a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x13a4,
+ 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x94a6, 0x7a52, 0xa637, 0x6377,
+ 0xef4a, 0xf7bd, 0x7bde, 0xbd31, 0x4ef7, 0x2748, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0x2895, 0x94a5, 0xbd52, 0xdef7, 0xef7b,
+ 0x17bd, 0x09d2, 0x8421, 0xde90, 0x213b, 0x13a4, 0x4842, 0x9def,
+ 0x4e90, 0x213a, 0x77bd, 0x7a42, 0x84ef, 0xde90, 0x213b, 0x1084,
+ 0x0842, 0x8421, 0xdef4, 0x31bb, 0x98c5, 0xbbde, 0xa631, 0x631b,
+ 0xef4a, 0xf7a4, 0x7bde, 0xbd37, 0xdef7, 0xef7b, 0xf7bd, 0x3bde,
+ 0x0842, 0x8421, 0x4210, 0xa94a, 0x6b5a, 0x75ad, 0xded6, 0xef7b,
+ 0x18dd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084,
+ 0x09d2, 0x8421, 0xdef4, 0x2949, 0x18c5, 0x7a63, 0xa529, 0x5297,
+ 0xef4a, 0xf7bd, 0x4bde, 0x84e9, 0xdef4, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0x4aef, 0xa529, 0xaa94,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213, 0x2108, 0x1084,
+ 0x09d2, 0x8421, 0x5ef4, 0x2988, 0x18c6, 0x7a63, 0xa631, 0x531b,
+ 0xef4a, 0xf7bd, 0x8dde, 0xbde9, 0xdef7, 0xe93b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0x909d, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x213a, 0x13a4, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0xde90, 0x3189, 0x94a6, 0xba52, 0xa631, 0x631b,
+ 0xe90a, 0xf7bd, 0x7bde, 0xbd37, 0xdef7, 0xef7b, 0x9484, 0x3bd2,
+ 0x0842, 0x8421, 0x4210, 0x294a, 0x54a5, 0xbdef, 0x4212, 0x2108,
+ 0x1bbd, 0x09d3, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0x4213, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x7484,
+ 0x0842, 0x8421, 0xd210, 0xef49, 0x1084, 0x0842, 0xbde9, 0xde97,
+ 0x377b, 0x94c6, 0x7a52, 0xc6e9, 0x6318, 0x318c, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0x1bbd, 0x7b13, 0xbdef, 0xdef7, 0xef7b,
+ 0x109d, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x10a4,
+ 0x4a52, 0xa529, 0xde94, 0x9f7b, 0x1084, 0xc842, 0xa528, 0x5294,
+ 0x894a, 0x2108, 0x1084, 0x0842, 0xd8c5, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x909d, 0x7a4e, 0xa427, 0xde93, 0xef49, 0xf7bd, 0x084e, 0x9d21,
+ 0x4210, 0x2108, 0x109d, 0x49d2, 0xbd27, 0xd213, 0x2109, 0x10a4,
+ 0x4a52, 0xa529, 0x52f4, 0xef48, 0x1084, 0xfa42, 0xa5e8, 0x5294,
+ 0xef4a, 0x2108, 0x1084, 0x0842, 0x4ef5, 0xef48, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6a4, 0x631a, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6b5a, 0xa5ad,
+ 0x5ad4, 0xad6b, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294, 0x294a,
+ 0x4b55, 0xb52d, 0xd734, 0x319c, 0x1084, 0x0842, 0x9d21, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xef7a, 0x94bd, 0x4a52, 0xa529, 0x5294, 0x314a,
+ 0x94a5, 0x6252, 0x8429, 0x4210, 0x294a, 0x94a5, 0x4a52, 0xbd29,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0xad7a, 0xd6b5, 0x6b5a, 0xb5a9, 0x5ad6,
+ 0xad7b, 0xc631, 0x6b18, 0x35ad, 0xdec6, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6310, 0x294a, 0x94c5,
+ 0x4a52, 0xa629, 0x6314, 0x214a, 0x2108, 0x1084, 0x0842, 0x18c5,
+ 0x8c63, 0x1084, 0x8842, 0xa531, 0x4210, 0x2948, 0x1885, 0x0863,
+ 0xc631, 0x6318, 0x210c, 0x94a4, 0x0852, 0x8421, 0x4210, 0x2108,
+ 0x1484, 0x4a63, 0xc631, 0x6318, 0x310a, 0x2108, 0x1084, 0x0842,
+ 0x6319, 0xad4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xbdef, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0xef7a,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x4213,
+ 0xef48, 0x1084, 0x0842, 0xa4e9, 0x4213, 0xef48, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0xa421, 0x4213, 0xef48, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4,
+ 0x4842, 0x84ef, 0x4210, 0xe908, 0x13a4, 0x4842, 0x84ef, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13a4, 0x4842, 0x84ef,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0x294b, 0xc635, 0x6318,
+ 0x518c, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xef7a,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0xdef6, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x108c, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2462, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1096, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0xe690, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x1890, 0x4a63, 0xf7a9, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x213a, 0x9484, 0x7a52, 0xbdef,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9484,
+ 0x6252, 0xbdec, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x9484, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x213a, 0x97a4, 0x7bd2, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0xb5a2, 0xa529, 0x5294, 0x318a, 0x18c6, 0x4c63, 0xa631, 0x5294,
+ 0x294a, 0x94a5, 0x6312, 0x311c, 0x49c6, 0xef4a, 0x2108, 0x1084,
+ 0x0842, 0xdef5, 0xef7b, 0x294a, 0x94a5, 0x4a52, 0xdef5, 0xef7b,
+ 0xc631, 0x2318, 0x318b, 0x52c6, 0xed8a, 0x2108, 0x1084, 0x0842,
+ 0xdef5, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x9084, 0x0841, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xde90, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x4842, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef7a, 0x14a5, 0x8c63, 0xc529, 0xd318, 0xef7b, 0x14c6,
+ 0x8c63, 0xa631, 0xd294, 0xef7b, 0xf7b5, 0x231e, 0x0842, 0x8421,
+ 0x4210, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xef48, 0x1084, 0x7a42, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b, 0x18c6,
+ 0x8c63, 0xc631, 0x6318, 0x318c, 0x1086, 0x0842, 0xc621, 0xdef4,
+ 0xef7b, 0x2108, 0x1084, 0x0842, 0xdea9, 0xad7b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xc529,
+ 0xd318, 0x8c7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4c42, 0xa531, 0x5294, 0xe94a, 0x14c5, 0x4a63,
+ 0xa529, 0x5294, 0x318c, 0x98c6, 0x4a52, 0xa529, 0x5294, 0x2f7a,
+ 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x2108, 0x1084, 0x0842,
+ 0xdef5, 0xef7b, 0xc631, 0x6318, 0x311c, 0x18c6, 0xef63, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x94a5, 0x0862, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4c52, 0xa529, 0x5314, 0x318c, 0x14c6, 0x0863, 0x8421, 0xd210,
+ 0xef7b, 0x2108, 0x1084, 0x0842, 0x18c5, 0x8c63, 0xd6b1, 0x6b5a,
+ 0xb5ad, 0x52d6, 0x294a, 0x94a5, 0x6b52, 0xb5ad, 0x5ad6, 0xef7b,
+ 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x94c4, 0x8a52, 0xa531, 0xde98, 0x213b, 0x2108,
+ 0x1084, 0x0842, 0xdef5, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842,
+ 0xa531, 0x6318, 0x298a, 0x18a5, 0x7bd3, 0xbdef, 0x1ef7, 0x8c63,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x8c62, 0xc631, 0x5318, 0x294a, 0x94a5,
+ 0x4c62, 0xbd29, 0x18f7, 0x8c63, 0x2108, 0x1084, 0x0842, 0xdef5,
+ 0x2109, 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x94a5, 0x4a58, 0xa529, 0x5294, 0x294a, 0x94c5, 0x4a52,
+ 0x8529, 0x4210, 0x210a, 0x9884, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x3084, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c,
+ 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8463, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2308, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x3184, 0x18c6, 0x8c63, 0xc631, 0x6318, 0x318c, 0x18c6, 0x8c63,
+ 0xc631, 0x6318, 0x318c, 0x18c6, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x5ef7, 0x294a,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x4200, 0x2108,
+ 0x1084, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802,
+ 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef,
+ 0x0000, 0xef40, 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x8421,
+ 0x4210, 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x00ef, 0x0000,
+ 0xef40, 0x8421, 0x4210, 0x1d08, 0xd074, 0x0741, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0x0000, 0x8421, 0x4210, 0x2108, 0x1084, 0xef42,
+ 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421, 0x4210, 0x4208,
+ 0x2108, 0x1084, 0x8421, 0x4210, 0x4208, 0x2108, 0x1084, 0x8421,
+ 0x7a10, 0x0008, 0x2000, 0xa068, 0x8694, 0x7a10, 0x0008, 0x2000,
+ 0xa528, 0x8421, 0x7bd0, 0x0008, 0xd000, 0xa529, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0xa528, 0x87bd, 0x7a10, 0x0008, 0x2000, 0xed28,
+ 0x5ad6, 0xad6b, 0xd6b5, 0xad5a, 0xd6b5, 0x318c, 0x58c6, 0x0f8c,
+ 0xf7b6, 0x7b60, 0xc631, 0x6318, 0x178c, 0xad6b, 0xb6b5, 0xc631,
+ 0x6318, 0xf18c, 0x18c1, 0x5c63, 0xc62b, 0x9b28, 0x318b, 0x18c6,
+ 0x8c63, 0xca31, 0x62b8, 0x318c, 0x18c6, 0xb463, 0x6b5a, 0x7bad,
+ 0xbdef, 0xad6b, 0xd6b5, 0xf46a, 0x94ae, 0x4a52, 0x2949, 0x1b9b,
+ 0x294a, 0x94a5, 0x4a52, 0x2949, 0xeb9b, 0x8c63, 0xc631, 0x6318,
+ 0x318c, 0xef7a, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0xdef6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x39ce, 0x9ca7, 0x4a73,
+ 0xa529, 0x5294, 0x294a, 0xf7a5, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x82b5, 0x6b5a, 0xb505, 0x0006, 0x0840, 0x8000, 0x4150, 0x12ad,
+ 0x0000, 0xad40, 0xd6b5, 0x2a0a, 0xa0a8, 0x0002, 0x0d40, 0x0000,
+ 0x0810, 0x2421, 0x1ad4, 0x0002, 0x4a52, 0x4129, 0x2108, 0x5954,
+ 0xa86b, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x2529, 0x5210, 0x494a, 0xdef5, 0xef7b, 0x4a52, 0x6b29, 0xb5ad,
+ 0x594a, 0xad6b, 0x56b2, 0xab59, 0xb5ac, 0x5ad6, 0xacab, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0x94ab, 0xcab5, 0x6b2a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0xa52a, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xd6b5, 0x6b5a, 0x52ad, 0x594a, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd652, 0x6b5a, 0xb5ad, 0x5ab9, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x2956, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x6b59, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x2ad6, 0x94a5, 0xd652, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xded6,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0x5529, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0xa52a, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb595, 0x5ad6, 0xad6b, 0xd655, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0x52ad, 0x294a, 0x94a5,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0x956b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xcdad, 0xd735, 0x735c, 0x35cd, 0x9cd7, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x6b55, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52, 0x9b29, 0x5293, 0x2eca,
+ 0x94bb, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6529,
+ 0xcd73, 0xd735, 0x735c, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0xca52, 0x9ae6, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x9ae6, 0x4e6b,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0xcd94, 0x2735, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd94a, 0x949c,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x6b29, 0x5295, 0x294a,
+ 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef6, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe800, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0xe842, 0x0020, 0x4200,
+ 0x0100, 0x1004, 0x0000, 0x8020, 0x4010, 0x2108, 0x1084, 0x0006,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008,
+ 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x6a10,
+ 0xb5ad, 0x1056, 0x2840, 0xf4a5, 0x7bde, 0x3def, 0x18c6, 0x8c55,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xbdef, 0xdef7, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842,
+ 0xbdef, 0xdef7, 0x1f7b, 0xf7b1, 0x7bde, 0xbdef, 0xdef7, 0x2f7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084,
+ 0x0842, 0x84e9, 0x4210, 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210,
+ 0xe908, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x3e31, 0x60f8, 0xf18c, 0xf8c1, 0x8c60, 0xc631, 0x6318, 0x3164,
+ 0xf8b2, 0x8c60, 0x360f, 0x5cd7, 0xcd73, 0x18c5, 0x1c63, 0xf631,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5af6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b,
+ 0xc636, 0x0758, 0xcd49, 0xd735, 0x735c, 0xd5cd, 0x5cda, 0xcd73,
+ 0xc735, 0x739a, 0xa535, 0x5294, 0x294a, 0x5295, 0x294a, 0x8c6c,
+ 0x4631, 0x29ad, 0x41a5, 0xad62, 0x109d, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9,
+ 0x4a14, 0x20c7, 0x108c, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x3890, 0x20c6,
+ 0xf7bd, 0x09de, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x109d,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0x2ab5, 0x54a5, 0xb5ad,
+ 0x5ad6, 0xad6b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0xde90, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda,
+ 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xed6b, 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0x2955, 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x294a, 0x94a5, 0x4a52, 0x5ad5, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x2955,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4842, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0642, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x6321, 0x318c, 0x8c46,
+ 0x1084, 0x0842, 0x8421, 0x3210, 0x8c62, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x2108, 0x1084, 0x0842, 0xd211, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x2902, 0x9ce7, 0x7bd8, 0xbdef, 0x5ef7, 0x1c4a,
+ 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0xbd08,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x4842,
+ 0x294a, 0x94a5, 0x4a52, 0xc4a5, 0x6318, 0xbd8c, 0xdef7, 0xef7b,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x631d,
+ 0x318c, 0x18c6, 0x8294, 0x0200, 0x2008, 0x0080, 0x0802, 0x8021,
+ 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200, 0x2008, 0x0080,
+ 0x0802, 0x8020, 0x0200, 0x2008, 0x0080, 0x0802, 0x8020, 0x0200,
+ 0x2008, 0x0080, 0x0802, 0x8423, 0x4210, 0x0108, 0x1004, 0x0800,
+ 0x8020, 0x0200, 0x8308, 0x1052, 0xe840, 0xf420, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0x8020, 0x0200, 0x2008, 0xdef4, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4207, 0x2108,
+ 0x1484, 0x4842, 0x8421, 0x4290, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4a63, 0xb531, 0xdad6, 0xef7b, 0x294a,
+ 0x54a5, 0xb3ad, 0xdef6, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x6312, 0xbd8c, 0xdef7, 0xef7b,
+ 0x10c6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x8c62, 0xc631, 0x6318, 0x318c, 0x18c6, 0x7a53, 0xbdef, 0xdef7,
+ 0x8c7b, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x10a5, 0x0842, 0x3121, 0xd246, 0xef7b,
+ 0x2108, 0x1084, 0x0842, 0x4211, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x4842, 0xa529, 0x5294, 0x8c4a, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa529, 0x5294,
+ 0x294a, 0x18a5, 0x7bd3, 0xbdef, 0xdef7, 0x8f7b, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef7a,
+ 0x14a5, 0x0843, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9084,
+ 0x4c62, 0xa529, 0x5318, 0x318c, 0xc626, 0x6318, 0x318c, 0x18c6,
+ 0x1f63, 0x2108, 0x1084, 0x0842, 0xdef5, 0x8c7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0x5294, 0x314a, 0x14a6,
+ 0x4a63, 0xbde9, 0xdef7, 0xef7b, 0x9084, 0x0842, 0x8421, 0x5210,
+ 0xef4c, 0x2108, 0x1084, 0x0842, 0x1ef5, 0x8c63, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0xb5a9, 0xd312, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x9485,
+ 0x0852, 0x8529, 0x4210, 0x2948, 0x90a4, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x4277, 0x8c46, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x109d, 0x0842, 0x9de9, 0x4210, 0xe908, 0x109d, 0x0842, 0xbde9,
+ 0xdef7, 0xef7b, 0x1084, 0x0842, 0x84e9, 0x4210, 0xe908, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8a63,
+ 0xc531, 0x6898, 0xef4a, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x7bd2, 0xbdef, 0xdef7, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbde9, 0x4277,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xd210, 0xef7b,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0xdef4, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x8421, 0x4210, 0xbde8, 0xdef7, 0xef7b, 0xf7bd, 0x4210, 0xbd08,
+ 0xdef7, 0x2149, 0x1084, 0x0842, 0x4421, 0x4212, 0x2108, 0x1084,
+ 0x0842, 0x84e9, 0x4210, 0xe93a, 0x7484, 0x3a42, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x5084,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0xf694, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x77bd, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x7348, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x13bd, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xbd21, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x3210, 0xef6b,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0xc631, 0x6318, 0x2e6c,
+ 0xdef6, 0xef7b, 0x94a5, 0x4a52, 0xbde9, 0xdef7, 0xef7b, 0xb191,
+ 0x9ab5, 0xae6b, 0xe6b9, 0x6b9a, 0xb9ae, 0x62e6, 0x2e6c, 0x18c6,
+ 0x5ad7, 0xc631, 0x631e, 0xac8c, 0xe6b9, 0x8b9a, 0x4a31, 0xa526,
+ 0x71ec, 0xd8c6, 0xef7b, 0x1084, 0x3a42, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xd77a,
+ 0xc63d, 0x6338, 0xcd8c, 0x1945, 0x8c59, 0x2108, 0x1084, 0x0842,
+ 0x28c5, 0x8ca5, 0x0011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1680, 0x5d1d, 0x8434, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x2684, 0x6c9d, 0x362e, 0x2317,
+ 0x8421, 0x4210, 0x2108, 0x1083, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x18c8, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0xe908, 0x13bd, 0x0842, 0xbd21, 0x4213,
+ 0x2108, 0x13bd, 0x0842, 0xbd21, 0x4213, 0xef7a, 0x4a73, 0xe75a,
+ 0x55ec, 0x294a, 0xed6b, 0xf7bd, 0x7bde, 0x5def, 0x5d6b, 0xef6b,
+ 0x1084, 0x0842, 0x8421, 0xd210, 0x2109, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x84e9, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4e90, 0x2748, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0xef48, 0x1084, 0x0842, 0x8421, 0x4210, 0xef48, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0xde90, 0xef7b,
+ 0xd631, 0x7bde, 0x4a57, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x7bd5, 0xb5af, 0x5ad6, 0xad6b, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x9494, 0xaa52, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0xdeaa, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0xdad6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef4b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef7a, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0xf7a4, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xe908, 0x294a, 0x7bd5, 0xbdef, 0xdef7, 0xef7b, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1124, 0x0842, 0x8421, 0xdea4,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x8f48, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x7bd2, 0x84ef, 0x4210,
+ 0x2108, 0xa531, 0x5294, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef48, 0x2108, 0x1084, 0x0842, 0xdef5, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x4842, 0xa4ef, 0x4213, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4842, 0xa427, 0x4ef7, 0x277a, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4842, 0x4a8f, 0xa529, 0x5294, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x8842, 0x4a52,
+ 0xd529, 0x8f7b, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0xdef4, 0x8f7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x94a4, 0x4bd2, 0xbde9, 0x5ef7, 0x294a, 0x1084, 0x09d2, 0x9d21,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x7bd2, 0xa5ef, 0xde94, 0x2f7b, 0x294a, 0x94a5, 0xbd52, 0xdef7,
+ 0xef7b, 0xc631, 0x6318, 0xb18c, 0xdef7, 0xef7b, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x8a94,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x4842, 0x3def, 0x18c6, 0x8c63, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x4842, 0x4aef, 0xa529, 0x5294, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x9084, 0x7bde, 0x4aef, 0xa529, 0x5294,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0xa421, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0xea94,
+ 0x18a6, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0xa521, 0x5294, 0x294a, 0x94a5, 0x4a52, 0x3189, 0x18c6,
+ 0xef63, 0x2bbd, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x14a5,
+ 0x0842, 0x8421, 0x4210, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x18a5, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x98c6,
+ 0x4a52, 0xa631, 0x1894, 0x8c75, 0xf631, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0xe908, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xc631, 0x7bd8, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0xe908, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0xa421, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf484, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x8d5a,
+ 0xa529, 0x5ad4, 0x318d, 0x18c6, 0xb5ad, 0x5ad6, 0x52eb, 0x294a,
+ 0x94a5, 0x4b5a, 0xa529, 0x5294, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5296, 0xad4a, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef6b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0x96b5, 0x6a52, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xbded, 0xdef7, 0xef7b, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0xf54a, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0840, 0x8421, 0x7a10, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x0084, 0x003a, 0x83bd, 0x01de, 0x1de8, 0x0000, 0x003a, 0x0000,
+ 0x4000, 0x2108, 0xd0f4, 0x0843, 0x8421, 0x43d0, 0x2108, 0x1084,
+ 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4000, 0x0007, 0xde80, 0x0001, 0x0000, 0x3a00, 0x0000,
+ 0x0000, 0x087a, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x0008, 0x0074, 0xe800, 0x0000, 0x3a00, 0xbde8, 0x0003,
+ 0x0000, 0x87a0, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0840, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8400, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4000, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x00ef, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8640, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1904, 0x0842, 0x0021, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1900, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x6410, 0x2108,
+ 0x0084, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x6400, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x9042, 0x8421, 0x0210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9000, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x4108, 0x1086, 0x0842, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x1086, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x0421, 0x4219, 0x2108, 0xd080,
+ 0x423b, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdad6, 0xef7b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef,
+ 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6bd,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x294a, 0x94a5, 0x4a52, 0xdea9, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0xdef6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0xded6, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0xded6, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0xdef7,
+ 0xef7b, 0xf6b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5,
+ 0x6b5a, 0xb5af, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef,
+ 0xdef7, 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7b5a, 0xb5ad, 0xded6,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xf7b5, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xed6b, 0xd7b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdad, 0x5ad6, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xef6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xbdad, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0x5af7, 0xad6b,
+ 0xd6bd, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd7b5, 0x7b5a, 0xb5ed,
+ 0x5ed7, 0xed6b, 0xd6b5, 0x6b5a, 0xb5ef, 0xdad6, 0xef6b, 0xd6b5,
+ 0x6bda, 0xb5ad, 0x5ad6, 0xad6b, 0xf7b5, 0x6bde, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6,
+ 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x7bda, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0xbde9, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084,
+ 0x7a42, 0xbdef, 0xdef7, 0xef7b, 0x1084, 0x0842, 0x8421, 0x4210,
+ 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842,
+ 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421, 0x4210, 0x2108,
+ 0x1084, 0x0842, 0x8421, 0x4210, 0x2108, 0x1084, 0x0842, 0x8421,
+ 0x4210, 0xef48, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd,
+ 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7,
+ 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde,
+ 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0xf75d, 0x7bde, 0xbdef, 0xdef7, 0xef7b, 0xf7bd, 0x7bde, 0xbdef,
+ 0xdef7, 0xef7b, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a,
+ 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b,
+ 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad,
+ 0x5ad6, 0xad6b, 0xd6b5, 0x6b5a, 0xb5ad, 0x5ad6, 0xad6b, 0xd6b5,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a,
+ 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529,
+ 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5,
+ 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294,
+ 0x294a, 0x94a5, 0x4a52, 0xa529, 0x5294, 0x294a, 0x94a5, 0x4a52,
+ 0xa529, 0x5294, 0x294a, 0xf7bd, 0x7bde, 0xbdef, 0xdef7, 0xef7b,
+ 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7,
+ 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c,
+ 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73,
+ 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce,
+ 0x9ce7, 0xce73, 0xe739, 0x739c, 0x39ce, 0x9ce7, 0xce73, 0xef79,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/categ_or.c b/gnulib/lib/unictype/categ_or.c
new file mode 100644
index 0000000..09c6862
--- /dev/null
+++ b/gnulib/lib/unictype/categ_or.c
@@ -0,0 +1,42 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+uc_general_category_t
+uc_general_category_or (uc_general_category_t category1,
+ uc_general_category_t category2)
+{
+ uint32_t bitmask;
+ uc_general_category_t result;
+
+ bitmask = category1.bitmask | category2.bitmask;
+
+ if (bitmask == category1.bitmask)
+ return category1;
+
+ if (bitmask == category2.bitmask)
+ return category2;
+
+ result.bitmask = bitmask;
+ result.generic = 1;
+ result.lookup.lookup_fn = &uc_is_general_category_withtable;
+ return result;
+}
diff --git a/gnulib/lib/unictype/categ_test.c b/gnulib/lib/unictype/categ_test.c
new file mode 100644
index 0000000..bdc4d7c
--- /dev/null
+++ b/gnulib/lib/unictype/categ_test.c
@@ -0,0 +1,32 @@
+/* Categories of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+bool
+uc_is_general_category (ucs4_t uc, uc_general_category_t category)
+{
+ if (category.generic)
+ return category.lookup.lookup_fn (uc, category.bitmask);
+ else
+ return bitmap_lookup (category.lookup.table, uc);
+}
diff --git a/gnulib/lib/unictype/combiningclass.c b/gnulib/lib/unictype/combiningclass.c
new file mode 100644
index 0000000..66b090b
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass.c
@@ -0,0 +1,47 @@
+/* Combining classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_combclass table. */
+#include "combiningclass.h"
+
+int
+uc_combining_class (ucs4_t uc)
+{
+ unsigned int index1 = uc >> combclass_header_0;
+ if (index1 < combclass_header_1)
+ {
+ int lookup1 = u_combclass.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> combclass_header_2) & combclass_header_3;
+ int lookup2 = u_combclass.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & combclass_header_4);
+ unsigned int lookup3 = u_combclass.level3[lookup2 + index3];
+
+ return lookup3;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unictype/combiningclass.h b/gnulib/lib/unictype/combiningclass.h
new file mode 100644
index 0000000..a87e75b
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass.h
@@ -0,0 +1,999 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Combining class of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define combclass_header_0 16
+#define combclass_header_1 2
+#define combclass_header_2 7
+#define combclass_header_3 511
+#define combclass_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[53 << 7];
+ }
+u_combclass =
+{
+ { 0, 512 },
+ {
+ -1, -1, -1, -1, -1, -1, 0, -1,
+ -1, 128, -1, 256, 384, 512, 640, 768,
+ 896, -1, 1024, 1152, 1152, 1152, 1152, 1280,
+ 1408, 1152, 1280, 1536, 1664, 1792, 1920, 2048,
+ 2176, 2304, -1, -1, -1, -1, 2432, -1,
+ -1, -1, -1, -1, -1, -1, 2560, 2688,
+ -1, 2816, 2944, -1, 3072, -1, 3200, 3328,
+ 3456, 3584, -1, 3712, -1, -1, -1, -1,
+ -1, 3840, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3968, 4096, 4224, -1, -1, -1, -1,
+ 4352, 4480, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4608, 4736, -1, -1,
+ 4864, 4992, 5120, 5248, -1, 5376, -1, 5504,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 5632, -1,
+ -1, -1, -1, -1, 5760, -1, -1, -1,
+ -1, -1, -1, 5888, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 6016, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 6144, 6272, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 6400, 6528, 6656, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 232, 220, 220,
+ 220, 220, 232, 216, 220, 220, 220, 220,
+ 220, 202, 202, 220, 220, 220, 220, 202,
+ 202, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 1, 1, 1, 1,
+ 1, 220, 220, 220, 220, 230, 230, 230,
+ 230, 230, 230, 230, 230, 240, 230, 220,
+ 220, 220, 230, 230, 230, 220, 220, 0,
+ 230, 230, 230, 220, 220, 220, 220, 230,
+ 232, 220, 220, 230, 233, 234, 234, 233,
+ 234, 234, 233, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 220, 230, 230, 230, 230, 220, 230,
+ 230, 230, 222, 220, 230, 230, 230, 230,
+ 230, 230, 220, 220, 220, 220, 220, 220,
+ 230, 230, 220, 230, 230, 222, 228, 230,
+ 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 19, 20, 21, 22, 0, 23,
+ 0, 24, 25, 0, 230, 220, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 30, 31, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31,
+ 32, 33, 34, 230, 230, 220, 220, 230,
+ 230, 230, 230, 230, 220, 230, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 230,
+ 230, 230, 230, 220, 230, 0, 0, 230,
+ 230, 0, 220, 230, 230, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 36, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 220, 230, 230, 220, 230, 230, 220,
+ 220, 220, 230, 220, 220, 230, 220, 230,
+ 230, 230, 220, 230, 220, 230, 220, 230,
+ 220, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 0, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 0, 230, 230, 230,
+ 0, 230, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 220, 220, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 230, 220, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 84, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 103, 103, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 107, 107, 107, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 118, 118, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 122, 122, 122, 122, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 220, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 220,
+ 0, 216, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 129, 130, 0, 132, 0, 0, 0,
+ 0, 0, 130, 130, 130, 130, 0, 0,
+ 130, 0, 230, 230, 9, 0, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 228, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 222, 230, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 220, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 220, 230, 230, 230,
+ 230, 230, 230, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 0, 1, 220, 220, 220,
+ 220, 220, 230, 230, 220, 220, 220, 220,
+ 230, 0, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 220, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 230, 234, 214, 220,
+ 202, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 233, 220, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 1, 1, 230, 230, 230, 230,
+ 1, 1, 1, 230, 230, 0, 0, 0,
+ 0, 230, 0, 0, 0, 1, 1, 230,
+ 220, 230, 1, 1, 220, 220, 220, 220,
+ 230, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 218, 228, 232, 222, 224, 224,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 0, 230, 230, 220, 0, 0, 230,
+ 230, 0, 0, 0, 0, 0, 230, 230,
+ 0, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 1, 220, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 216, 216, 1,
+ 1, 1, 0, 0, 0, 226, 216, 216,
+ 216, 216, 216, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 220, 220,
+ 220, 220, 220, 0, 0, 230, 230, 230,
+ 230, 230, 220, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unictype/combiningclass_byname.c b/gnulib/lib/unictype/combiningclass_byname.c
new file mode 100644
index 0000000..3880523
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass_byname.c
@@ -0,0 +1,63 @@
+/* Canonical combining classes of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "unictype/combiningclass_byname.h"
+
+int
+uc_combining_class_byname (const char *ccc_name)
+{
+ size_t len;
+
+ len = strlen (ccc_name);
+ if (len <= MAX_WORD_LENGTH)
+ {
+ char buf[MAX_WORD_LENGTH + 1];
+ const struct named_combining_class *found;
+
+ /* Copy ccc_name into buf, converting '_' and '-' to ' '. */
+ {
+ const char *p = ccc_name;
+ char *q = buf;
+
+ for (;; p++, q++)
+ {
+ char c = *p;
+
+ if (c == '_' || c == '-')
+ c = ' ';
+ *q = c;
+ if (c == '\0')
+ break;
+ }
+ }
+ /* Here q == buf + len. */
+
+ /* Do a hash table lookup, with case-insensitive comparison. */
+ found = uc_combining_class_lookup (buf, len);
+ if (found != NULL)
+ return found->combining_class;
+ }
+ /* Invalid combining class name. */
+ return -1;
+}
diff --git a/gnulib/lib/unictype/combiningclass_byname.gperf b/gnulib/lib/unictype/combiningclass_byname.gperf
new file mode 100644
index 0000000..4096850
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass_byname.gperf
@@ -0,0 +1,66 @@
+/* Categories of Unicode characters. */
+struct named_combining_class { int name; int combining_class; };
+%struct-type
+%ignore-case
+%language=ANSI-C
+%define hash-function-name combining_class_hash
+%define lookup-function-name uc_combining_class_lookup
+%readonly-tables
+%global-table
+%define word-array-name combining_class_names
+%pic
+%define string-pool-name combining_class_stringpool
+%%
+NR, UC_CCC_NR
+OV, UC_CCC_OV
+NK, UC_CCC_NK
+KV, UC_CCC_KV
+VR, UC_CCC_VR
+ATBL, UC_CCC_ATBL
+ATB, UC_CCC_ATB
+ATA, UC_CCC_ATA
+ATAR, UC_CCC_ATAR
+BL, UC_CCC_BL
+B, UC_CCC_B
+BR, UC_CCC_BR
+L, UC_CCC_L
+R, UC_CCC_R
+AL, UC_CCC_AL
+A, UC_CCC_A
+AR, UC_CCC_AR
+DB, UC_CCC_DB
+DA, UC_CCC_DA
+IS, UC_CCC_IS
+Not Reordered, UC_CCC_NR
+NotReordered, UC_CCC_NR
+Overlay, UC_CCC_OV
+Nukta, UC_CCC_NK
+Kana Voicing, UC_CCC_KV
+KanaVoicing, UC_CCC_KV
+Virama, UC_CCC_VR
+Attached Below Left, UC_CCC_ATBL
+AttachedBelowLeft, UC_CCC_ATBL
+Attached Below, UC_CCC_ATB
+AttachedBelow, UC_CCC_ATB
+Attached Above, UC_CCC_ATA
+AttachedAbove, UC_CCC_ATA
+Attached Above Right, UC_CCC_ATAR
+AttachedAboveRight, UC_CCC_ATAR
+Below Left, UC_CCC_BL
+BelowLeft, UC_CCC_BL
+Below, UC_CCC_B
+Below Right, UC_CCC_BR
+BelowRight, UC_CCC_BR
+Left, UC_CCC_L
+Right, UC_CCC_R
+Above Left, UC_CCC_AL
+AboveLeft, UC_CCC_AL
+Above, UC_CCC_A
+Above Right, UC_CCC_AR
+AboveRight, UC_CCC_AR
+Double Below, UC_CCC_DB
+DoubleBelow, UC_CCC_DB
+Double Above, UC_CCC_DA
+DoubleAbove, UC_CCC_DA
+Iota Subscript, UC_CCC_IS
+IotaSubscript, UC_CCC_IS
diff --git a/gnulib/lib/unictype/combiningclass_longname.c b/gnulib/lib/unictype/combiningclass_longname.c
new file mode 100644
index 0000000..d328279
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass_longname.c
@@ -0,0 +1,130 @@
+/* Canonical combining classes of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <stdlib.h>
+
+static const signed char u_combining_class_index_part1[10] =
+{
+ 0, /* Not Reordered */
+ 1, /* Overlay */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2, /* Nukta */
+ 3, /* Kana Voicing */
+ 4 /* Virama */
+};
+static const signed char u_combining_class_index_part2[241 - 200] =
+{
+ 5, /* Attached Below Left */
+ -1,
+ 6, /* Attached Below */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 7, /* Attached Above */
+ -1,
+ 8, /* Attached Above Right */
+ -1,
+ 9, /* Below Left */
+ -1,
+ 10, /* Below */
+ -1,
+ 11, /* Below Right */
+ -1,
+ 12, /* Left */
+ -1,
+ 13, /* Right */
+ -1,
+ 14, /* Above Left */
+ -1,
+ 15, /* Above */
+ -1,
+ 16, /* Above Right */
+ 17, /* Double Below */
+ 18, /* Double Above */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 19 /* Iota Subscript */
+};
+
+static const char u_combining_class_long_name[20][21] =
+{
+ "Not Reordered",
+ "Overlay",
+ "Nukta",
+ "Kana Voicing",
+ "Virama",
+ "Attached Below Left",
+ "Attached Below",
+ "Attached Above",
+ "Attached Above Right",
+ "Below Left",
+ "Below",
+ "Below Right",
+ "Left",
+ "Right",
+ "Above Left",
+ "Above",
+ "Above Right",
+ "Double Below",
+ "Double Above",
+ "Iota Subscript"
+};
+
+const char *
+uc_combining_class_long_name (int ccc)
+{
+ if (ccc >= 0)
+ {
+ int index;
+
+ if (ccc < 10)
+ index = u_combining_class_index_part1[ccc];
+ else if (ccc >= 200 && ccc < 241)
+ index = u_combining_class_index_part2[ccc - 200];
+ else
+ return NULL;
+
+ if (index >= 0)
+ {
+ if (index < sizeof (u_combining_class_long_name) / sizeof (u_combining_class_long_name[0]))
+ return u_combining_class_long_name[index];
+ else
+ abort ();
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/combiningclass_name.c b/gnulib/lib/unictype/combiningclass_name.c
new file mode 100644
index 0000000..0cf2bb8
--- /dev/null
+++ b/gnulib/lib/unictype/combiningclass_name.c
@@ -0,0 +1,130 @@
+/* Canonical combining classes of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <stdlib.h>
+
+static const signed char u_combining_class_index_part1[10] =
+{
+ 0, /* Not Reordered */
+ 1, /* Overlay */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2, /* Nukta */
+ 3, /* Kana Voicing */
+ 4 /* Virama */
+};
+static const signed char u_combining_class_index_part2[241 - 200] =
+{
+ 5, /* Attached Below Left */
+ -1,
+ 6, /* Attached Below */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 7, /* Attached Above */
+ -1,
+ 8, /* Attached Above Right */
+ -1,
+ 9, /* Below Left */
+ -1,
+ 10, /* Below */
+ -1,
+ 11, /* Below Right */
+ -1,
+ 12, /* Left */
+ -1,
+ 13, /* Right */
+ -1,
+ 14, /* Above Left */
+ -1,
+ 15, /* Above */
+ -1,
+ 16, /* Above Right */
+ 17, /* Double Below */
+ 18, /* Double Above */
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 19 /* Iota Subscript */
+};
+
+static const char u_combining_class_name[20][5] =
+{
+ "NR", /* Not Reordered */
+ "OV", /* Overlay */
+ "NK", /* Nukta */
+ "KV", /* Kana Voicing */
+ "VR", /* Virama */
+ "ATBL", /* Attached Below Left */
+ "ATB", /* Attached Below */
+ "ATA", /* Attached Above */
+ "ATAR", /* Attached Above Right */
+ "BL", /* Below Left */
+ "B", /* Below */
+ "BR", /* Below Right */
+ "L", /* Left */
+ "R", /* Right */
+ "AL", /* Above Left */
+ "A", /* Above */
+ "AR", /* Above Right */
+ "DB", /* Double Below */
+ "DA", /* Double Above */
+ "IS" /* Iota Subscript */
+};
+
+const char *
+uc_combining_class_name (int ccc)
+{
+ if (ccc >= 0)
+ {
+ int index;
+
+ if (ccc < 10)
+ index = u_combining_class_index_part1[ccc];
+ else if (ccc >= 200 && ccc < 241)
+ index = u_combining_class_index_part2[ccc - 200];
+ else
+ return NULL;
+
+ if (index >= 0)
+ {
+ if (index < sizeof (u_combining_class_name) / sizeof (u_combining_class_name[0]))
+ return u_combining_class_name[index];
+ else
+ abort ();
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/ctype_alnum.c b/gnulib/lib/unictype/ctype_alnum.c
new file mode 100644
index 0000000..2b328fe
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alnum.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_alnum table. */
+#include "ctype_alnum.h"
+
+bool
+uc_is_alnum (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_alnum, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_alnum.h b/gnulib/lib/unictype/ctype_alnum.h
new file mode 100644
index 0000000..4399aa4
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alnum.h
@@ -0,0 +1,616 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_is_alnum =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 768,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF,
+ 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFEFFC3,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x0003FFC3,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001CFFC0,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x0000FFC3,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x0002FFC3,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x0000FFC0,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x0006FFC3,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC00FFC3,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062,
+ 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF,
+ 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x03FF00FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000,
+ 0xFFFFFFF8, 0x03FFC001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBF50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x08FC0000,
+ 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x03FF8000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x047FFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF0007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x0000FFC0,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF1FFF, 0xFFFF03FF, 0xFFFF03FF,
+ 0x000007FF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_alpha.c b/gnulib/lib/unictype/ctype_alpha.c
new file mode 100644
index 0000000..63be5ff
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alpha.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_alpha table. */
+#include "ctype_alpha.h"
+
+bool
+uc_is_alpha (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_alpha, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_alpha.h b/gnulib/lib/unictype/ctype_alpha.h
new file mode 100644
index 0000000..db408cf
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_alpha.h
@@ -0,0 +1,616 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_is_alpha =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 768,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9FFFC060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x043007FF,
+ 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFEFFC3,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x0003FFC3,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001CFFC0,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x0000FFC3,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x0002FFC3,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x0000FFC0,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x0000FFC3,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x0006FFC3,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC00FFC3,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FBF, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0x00000001, 0x000003FF, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F03FF, 0xFFE1C062,
+ 0x03FF4003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x000003FF,
+ 0x03FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x03FF00FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x03FF0FE0, 0x00000000,
+ 0xFFFFFFF8, 0x03FFC001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBF50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x03FF0000, 0x08FC0000,
+ 0xFFFFFFFF, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x03FF8000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x03FF0FF7, 0x047FFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF0007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x0000FFC0,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF1FFF, 0xFFFF03FF, 0xFFFF03FF,
+ 0x000007FF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_blank.c b/gnulib/lib/unictype/ctype_blank.c
new file mode 100644
index 0000000..cfb6091
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_blank.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_blank table. */
+#include "ctype_blank.h"
+
+bool
+uc_is_blank (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_blank, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_blank.h b/gnulib/lib/unictype/ctype_blank.h
new file mode 100644
index 0000000..6b293fc
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_blank.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_is_blank =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000200, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000077F, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_cntrl.c b/gnulib/lib/unictype/ctype_cntrl.c
new file mode 100644
index 0000000..7414f73
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_cntrl.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_cntrl table. */
+#include "ctype_cntrl.h"
+
+bool
+uc_is_cntrl (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_cntrl, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_cntrl.h b/gnulib/lib/unictype/ctype_cntrl.h
new file mode 100644
index 0000000..5d242c9
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_cntrl.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_is_cntrl =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000300, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_digit.c b/gnulib/lib/unictype/ctype_digit.c
new file mode 100644
index 0000000..bce5c01
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_digit.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_digit table. */
+#include "ctype_digit.h"
+
+bool
+uc_is_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_digit, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_digit.h b/gnulib/lib/unictype/ctype_digit.h
new file mode 100644
index 0000000..2cb82ac
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_digit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_is_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_graph.c b/gnulib/lib/unictype/ctype_graph.c
new file mode 100644
index 0000000..40dc089
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_graph.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_graph table. */
+#include "ctype_graph.h"
+
+bool
+uc_is_graph (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_graph, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_graph.h b/gnulib/lib/unictype/ctype_graph.h
new file mode 100644
index 0000000..75a817f
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_graph.h
@@ -0,0 +1,926 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[61 << 4];
+ }
+u_is_graph =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 832,
+ 18 + 640 * sizeof (short) / sizeof (int) + 848,
+ 18 + 640 * sizeof (short) / sizeof (int) + 864,
+ 18 + 640 * sizeof (short) / sizeof (int) + 880,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 896,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 912,
+ 18 + 640 * sizeof (short) / sizeof (int) + 928,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 928,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 944,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 960
+ },
+ {
+ 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7CFFFFFF,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF,
+ 0xCFFFFFCF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFFFF, 0x7FFF3FFF, 0x4FFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFFFFFF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0FFFFFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x00FFFFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFE3FFFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000,
+ 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFFFFFF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x1FFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF,
+ 0x03FF3FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF,
+ 0xCFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF,
+ 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0xF00FFFFF,
+ 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0007FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0xFFF3FC1F,
+ 0x1FFF7FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE03FFFF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8001803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFFFFF, 0x03FF0FFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FFBFFF, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000007, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x3E007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0xFFBFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC3FFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_lower.c b/gnulib/lib/unictype/ctype_lower.c
new file mode 100644
index 0000000..7b4b57f
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_lower.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_lower table. */
+#include "ctype_lower.h"
+
+bool
+uc_is_lower (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_lower, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_lower.h b/gnulib/lib/unictype/ctype_lower.h
new file mode 100644
index 0000000..33b7047
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_lower.h
@@ -0,0 +1,327 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_is_lower =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x00200000, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x54AAAAAA, 0xAAAAA955, 0xD4AAAAAA,
+ 0x46241129, 0xA251212A, 0xB5555B60, 0xAA2CAAAA,
+ 0xAAAAAAAA, 0x900AAAA8, 0x0ADFAA85, 0x20268B29,
+ 0x00041F09, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x388A0000,
+ 0x00000000, 0xFFFEF000, 0xAAE37FFF, 0x0927AAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE,
+ 0x0000007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x082AAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00AA003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x400B00FF, 0x00030008, 0x00080023,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00004000, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x00481562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000500A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA,
+ 0x000210AA, 0x000002AA, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_print.c b/gnulib/lib/unictype/ctype_print.c
new file mode 100644
index 0000000..7777cab
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_print.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_print table. */
+#include "ctype_print.h"
+
+bool
+uc_is_print (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_print, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_print.h b/gnulib/lib/unictype/ctype_print.h
new file mode 100644
index 0000000..aff0794
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_print.h
@@ -0,0 +1,926 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[61 << 4];
+ }
+u_is_print =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 512,
+ 18 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ 18 + 640 * sizeof (short) / sizeof (int) + 0,
+ 18 + 640 * sizeof (short) / sizeof (int) + 16,
+ 18 + 640 * sizeof (short) / sizeof (int) + 32,
+ 18 + 640 * sizeof (short) / sizeof (int) + 48,
+ 18 + 640 * sizeof (short) / sizeof (int) + 64,
+ 18 + 640 * sizeof (short) / sizeof (int) + 80,
+ 18 + 640 * sizeof (short) / sizeof (int) + 96,
+ 18 + 640 * sizeof (short) / sizeof (int) + 112,
+ 18 + 640 * sizeof (short) / sizeof (int) + 128,
+ 18 + 640 * sizeof (short) / sizeof (int) + 144,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 176,
+ 18 + 640 * sizeof (short) / sizeof (int) + 192,
+ 18 + 640 * sizeof (short) / sizeof (int) + 208,
+ 18 + 640 * sizeof (short) / sizeof (int) + 224,
+ 18 + 640 * sizeof (short) / sizeof (int) + 240,
+ 18 + 640 * sizeof (short) / sizeof (int) + 256,
+ 18 + 640 * sizeof (short) / sizeof (int) + 272,
+ 18 + 640 * sizeof (short) / sizeof (int) + 288,
+ 18 + 640 * sizeof (short) / sizeof (int) + 304,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 320,
+ 18 + 640 * sizeof (short) / sizeof (int) + 336,
+ 18 + 640 * sizeof (short) / sizeof (int) + 352,
+ 18 + 640 * sizeof (short) / sizeof (int) + 368,
+ 18 + 640 * sizeof (short) / sizeof (int) + 384,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 400,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 416,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 432,
+ 18 + 640 * sizeof (short) / sizeof (int) + 448,
+ 18 + 640 * sizeof (short) / sizeof (int) + 464,
+ 18 + 640 * sizeof (short) / sizeof (int) + 480,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 512,
+ 18 + 640 * sizeof (short) / sizeof (int) + 528,
+ 18 + 640 * sizeof (short) / sizeof (int) + 544,
+ 18 + 640 * sizeof (short) / sizeof (int) + 560,
+ 18 + 640 * sizeof (short) / sizeof (int) + 576,
+ 18 + 640 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 608,
+ 18 + 640 * sizeof (short) / sizeof (int) + 624,
+ 18 + 640 * sizeof (short) / sizeof (int) + 640,
+ 18 + 640 * sizeof (short) / sizeof (int) + 656,
+ 18 + 640 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 688,
+ 18 + 640 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 720,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 768,
+ 18 + 640 * sizeof (short) / sizeof (int) + 784,
+ 18 + 640 * sizeof (short) / sizeof (int) + 800,
+ 18 + 640 * sizeof (short) / sizeof (int) + 816,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 832,
+ 18 + 640 * sizeof (short) / sizeof (int) + 848,
+ 18 + 640 * sizeof (short) / sizeof (int) + 864,
+ 18 + 640 * sizeof (short) / sizeof (int) + 880,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 896,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 912,
+ 18 + 640 * sizeof (short) / sizeof (int) + 928,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 928,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 944,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 160,
+ 18 + 640 * sizeof (short) / sizeof (int) + 960
+ },
+ {
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7CFFFFFF,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0xFFFE06FF, 0xFFFFFFFF, 0xFFFF00FF, 0x001F07FF,
+ 0xCFFFFFCF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFBFFF, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFFFF, 0x7FFF3FFF, 0x4FFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFFFFFF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0FFFFFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0002FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x00FFFFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x07FFFFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0xFF00FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFE3FFFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x001C0000,
+ 0xFFFFFFFE, 0x87FFFFFF, 0x0FFFFFFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFFFFFF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x001FDFFF, 0x007FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x03FF03FF,
+ 0x03FF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF,
+ 0xCFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF,
+ 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0FFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0xF00FFFFF,
+ 0xFFFFFFFF, 0xF8FFFFFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0007FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFFFFFF, 0xFFFFFCFF, 0xFFFFFFFF, 0xFFF3FC1F,
+ 0x1FFF7FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE03FFFF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8001803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xF00FFFFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFFFFF, 0x03FF0FFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC01F, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x800FFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xC3FFBFFF, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0xF3FF3FFF, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xF8000007, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x3E007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0xFFBFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x01FF00FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFC3FFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_punct.c b/gnulib/lib/unictype/ctype_punct.c
new file mode 100644
index 0000000..a1be4fb
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_punct.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_punct table. */
+#include "ctype_punct.h"
+
+bool
+uc_is_punct (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_punct, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_punct.h b/gnulib/lib/unictype/ctype_punct.h
new file mode 100644
index 0000000..6640b92
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_punct.h
@@ -0,0 +1,758 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_is_punct =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 160,
+ 18 + 512 * sizeof (short) / sizeof (int) + 176,
+ 18 + 512 * sizeof (short) / sizeof (int) + 192,
+ 18 + 512 * sizeof (short) / sizeof (int) + 208,
+ 18 + 512 * sizeof (short) / sizeof (int) + 224,
+ 18 + 512 * sizeof (short) / sizeof (int) + 240,
+ 18 + 512 * sizeof (short) / sizeof (int) + 256,
+ 18 + 512 * sizeof (short) / sizeof (int) + 272,
+ 18 + 512 * sizeof (short) / sizeof (int) + 288,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 336,
+ 18 + 512 * sizeof (short) / sizeof (int) + 352,
+ 18 + 512 * sizeof (short) / sizeof (int) + 368,
+ 18 + 512 * sizeof (short) / sizeof (int) + 384,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 432,
+ 18 + 512 * sizeof (short) / sizeof (int) + 448,
+ 18 + 512 * sizeof (short) / sizeof (int) + 464,
+ 18 + 512 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 496,
+ 18 + 512 * sizeof (short) / sizeof (int) + 512,
+ 18 + 512 * sizeof (short) / sizeof (int) + 528,
+ 18 + 512 * sizeof (short) / sizeof (int) + 544,
+ 18 + 512 * sizeof (short) / sizeof (int) + 560,
+ 18 + 512 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592,
+ 18 + 512 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 624,
+ 18 + 512 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 672,
+ 18 + 512 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 720,
+ 18 + 512 * sizeof (short) / sizeof (int) + 736,
+ 18 + 512 * sizeof (short) / sizeof (int) + 752,
+ 18 + 512 * sizeof (short) / sizeof (int) + 768,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 800
+ },
+ {
+ 0x00000000, 0xFC00FFFE, 0xF8000001, 0x78000001,
+ 0x00000000, 0xFBDFFBFF, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC003C, 0xFFFFAFE0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFDF, 0x4020FFFF,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003FC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0xFFFE0600, 0xFFFFFFFF, 0x000000FF, 0x00180000,
+ 0xCFFFFFCF, 0x00000000, 0xFFFFF800, 0x00013C00,
+ 0x00000000, 0x00000000, 0xFFD00000, 0x60003F9F,
+ 0x0002BFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x03CFF800,
+ 0xFBC00000, 0x7FFF3EEF, 0x4E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0xDC000000, 0x00FEFFFF, 0x0001003C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x0FFC000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0002000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x00FD000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x07FF0000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0xFF00000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x023F000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x001C0000,
+ 0x00000000, 0x80008000, 0x0C008040, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0xFFFFFFFE, 0xFFFFFC00, 0x00000000, 0xFFFE0000,
+ 0xFEFFE0FF, 0xDFFFFFFF, 0x07FFDFFF, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C0FC00, 0x001E3F9D,
+ 0xFC00BFFC, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x1FFFFFFF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x001C0000, 0x007C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFF00000, 0x2F7FFFFF, 0x03FF0000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000031, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xC4000301, 0xFFFFFFFF,
+ 0xCF800000, 0x00000000, 0x7FE00000, 0x9FFFFFFF,
+ 0x00000000, 0x00003F7F, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0xFC00001F, 0x1FFFFFFF,
+ 0x00000007, 0x000007FE, 0x00000000, 0xF00FFFC0,
+ 0x00000000, 0xF8FFFFF0, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000421FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0xFFFFF880, 0xFFFFFCFF, 0x7FFFFFFF, 0x7FF1FC1F,
+ 0x00007FFF, 0x03FFFFFF, 0xFFFF0000, 0x0001FFFF,
+ 0xC1D0037B, 0x0C0040AF, 0xFFFFBC1F, 0x00000000,
+ 0xFFFF0200, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFE0387E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x80010000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00037FFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFF1E, 0xE0C1FC01, 0x00000000, 0x00000000,
+ 0x1E000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x700F8000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FF0000,
+ 0x007FFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x03FF0FF8, 0x00000000, 0x00F00000,
+ 0x00000003, 0xFFF00000, 0x0000C01F, 0x0703FFFF,
+ 0x00000000, 0x0000FFC0, 0x800FFF80, 0x00000000,
+ 0x0000000F, 0xFFF80000, 0xC0003FFF, 0x00000000,
+ 0x00000000, 0x007FFE00, 0xF0003008, 0x0B800000,
+ 0x00000000, 0xC19D0000, 0xC0000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003FF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30000000,
+ 0x03FFFFFF, 0xFFFF007F, 0xFFF7FFFF, 0x00000F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0xFC00FFFE, 0xF8000001, 0xF8000001, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3E007F7F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF87, 0xFF8FFFFF, 0x00000000, 0xFFE00000,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8FC00000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F06E, 0x87000000, 0x01FF00FF, 0xE0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0xFF000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0xFF000000, 0xFFFC3FFF, 0x0000003F,
+ 0x00000007, 0xFFFF0000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000002, 0x08000000,
+ 0x00200000, 0x00200000, 0x00008000, 0x00008000,
+ 0x00000200, 0x00000200, 0x00000008, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0x000007FF, 0x00006000, 0x0000FC00, 0x00000000,
+ 0x07FFF800, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_space.c b/gnulib/lib/unictype/ctype_space.c
new file mode 100644
index 0000000..a7794dc
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_space.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_space table. */
+#include "ctype_space.h"
+
+bool
+uc_is_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_space, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_space.h b/gnulib/lib/unictype/ctype_space.h
new file mode 100644
index 0000000..71b335c
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_is_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000077F, 0x00000300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_upper.c b/gnulib/lib/unictype/ctype_upper.c
new file mode 100644
index 0000000..3b526e8
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_upper.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_upper table. */
+#include "ctype_upper.h"
+
+bool
+uc_is_upper (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_upper, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_upper.h b/gnulib/lib/unictype/ctype_upper.h
new file mode 100644
index 0000000..e714636
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_upper.h
@@ -0,0 +1,327 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_is_upper =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAADB0, 0x55D65555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x55008000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0xFF00FF00, 0x1F00FF00, 0x0F001F00, 0x1F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00040C40, 0x00000000, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0xC025EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00002805,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001555,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00012855, 0x00000155, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/ctype_xdigit.c b/gnulib/lib/unictype/ctype_xdigit.c
new file mode 100644
index 0000000..ccbed7f
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_xdigit.c
@@ -0,0 +1,32 @@
+/* ISO C <ctype.h> like properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_is_xdigit table. */
+#include "ctype_xdigit.h"
+
+bool
+uc_is_xdigit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_is_xdigit, uc);
+}
diff --git a/gnulib/lib/unictype/ctype_xdigit.h b/gnulib/lib/unictype/ctype_xdigit.h
new file mode 100644
index 0000000..bd93871
--- /dev/null
+++ b/gnulib/lib/unictype/ctype_xdigit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* ISO C <ctype.h> like properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_is_xdigit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/decdigit.c b/gnulib/lib/unictype/decdigit.c
new file mode 100644
index 0000000..cf5a336
--- /dev/null
+++ b/gnulib/lib/unictype/decdigit.c
@@ -0,0 +1,49 @@
+/* Values of decimal digit Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_decdigit table. */
+#include "decdigit.h"
+
+int
+uc_decimal_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> decdigit_header_0;
+ if (index1 < decdigit_header_1)
+ {
+ int lookup1 = u_decdigit.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> decdigit_header_2) & decdigit_header_3;
+ int lookup2 = u_decdigit.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & decdigit_header_4) + lookup2;
+ /* level3 contains 4-bit values. */
+ unsigned int lookup3 =
+ (u_decdigit.level3[index3>>1] >> ((index3 % 2) * 4)) & 0x0f;
+
+ return (int) lookup3 - 1;
+ }
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unictype/decdigit.h b/gnulib/lib/unictype/decdigit.h
new file mode 100644
index 0000000..020f35b
--- /dev/null
+++ b/gnulib/lib/unictype/decdigit.h
@@ -0,0 +1,255 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decimal digit values of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define decdigit_header_0 16
+#define decdigit_header_1 2
+#define decdigit_header_2 7
+#define decdigit_header_3 511
+#define decdigit_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[13 << 6];
+ }
+u_decdigit =
+{
+ { 0, 512 },
+ {
+ 0, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 128, 256, -1, 384,
+ -1, -1, 512, 512, 512, 512, 512, 512,
+ 512, 512, 512, -1, 640, 640, 768, -1,
+ 384, 896, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 128,
+ 896, -1, 1024, 640, -1, 1152, 640, 0,
+ 1280, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 768, -1, -1, -1,
+ -1, 640, 1408, 640, 640, -1, -1, 256,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 896, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 768, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 512, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 1536,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87,
+ 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43,
+ 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9
+ }
+};
diff --git a/gnulib/lib/unictype/digit.c b/gnulib/lib/unictype/digit.c
new file mode 100644
index 0000000..9c3a2a6
--- /dev/null
+++ b/gnulib/lib/unictype/digit.c
@@ -0,0 +1,49 @@
+/* Values of digit Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_digit table. */
+#include "digit.h"
+
+int
+uc_digit_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> digit_header_0;
+ if (index1 < digit_header_1)
+ {
+ int lookup1 = u_digit.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> digit_header_2) & digit_header_3;
+ int lookup2 = u_digit.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & digit_header_4) + lookup2;
+ /* level3 contains 4-bit values. */
+ unsigned int lookup3 =
+ (u_digit.level3[index3>>1] >> ((index3 % 2) * 4)) & 0x0f;
+
+ return (int) lookup3 - 1;
+ }
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/unictype/digit.h b/gnulib/lib/unictype/digit.h
new file mode 100644
index 0000000..5a11baf
--- /dev/null
+++ b/gnulib/lib/unictype/digit.h
@@ -0,0 +1,351 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Digit values of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define digit_header_0 16
+#define digit_header_1 2
+#define digit_header_2 7
+#define digit_header_3 511
+#define digit_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[25 << 6];
+ }
+u_digit =
+{
+ { 0, 512 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 384, -1, 512,
+ -1, -1, 640, 640, 640, 640, 640, 640,
+ 640, 640, 640, -1, 768, 768, 896, -1,
+ 512, 1024, -1, -1, -1, -1, 1152, -1,
+ -1, -1, -1, -1, -1, -1, -1, 256,
+ 1024, -1, 1280, 1408, -1, 1536, 768, 0,
+ 1664, -1, -1, -1, -1, -1, -1, -1,
+ 1792, 1920, -1, -1, -1, -1, -1, -1,
+ 2048, 2176, -1, -1, -1, -1, 2304, 2432,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 896, -1, -1, -1,
+ -1, 768, 1920, 768, 768, -1, -1, 384,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1024, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 896, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2560, -1, -1, -1,
+ -1, -1, -1, -1, 2688, -1, -1, -1,
+ 2816, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 2944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3072, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x43, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x87,
+ 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x21, 0x43, 0x65, 0x87, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x32, 0x54, 0x76, 0x98,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x43, 0x65, 0x87, 0xa9, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a,
+ 0x32, 0x54, 0x76, 0x98, 0x0a, 0x32, 0x54, 0x76,
+ 0x98, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
+ 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87,
+ 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9, 0x21, 0x43,
+ 0x65, 0x87, 0xa9, 0x21, 0x43, 0x65, 0x87, 0xa9,
+ 0x11, 0x32, 0x54, 0x76, 0x98, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ }
+};
diff --git a/gnulib/lib/unictype/identsyntaxmap.h b/gnulib/lib/unictype/identsyntaxmap.h
new file mode 100644
index 0000000..9b61daa
--- /dev/null
+++ b/gnulib/lib/unictype/identsyntaxmap.h
@@ -0,0 +1,42 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+static inline int identsyntax_lookup (ucs4_t uc);
+
+static inline int
+identsyntax_lookup (ucs4_t uc)
+{
+ unsigned int index1 = uc >> identsyntax_header_0;
+ if (index1 < identsyntax_header_1)
+ {
+ int lookup1 = TABLE.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> identsyntax_header_2) & identsyntax_header_3;
+ int lookup2 = TABLE.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & identsyntax_header_4) + lookup2;
+ /* level3 contains 2-bit values. */
+ unsigned int lookup3 = TABLE.level3[index3 >> 3];
+
+ return (lookup3 >> (2 * (index3 & 7))) & 3;
+ }
+ }
+ }
+ return UC_IDENTIFIER_INVALID;
+}
diff --git a/gnulib/lib/unictype/joininggroup_byname.c b/gnulib/lib/unictype/joininggroup_byname.c
new file mode 100644
index 0000000..063ec2d
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_byname.c
@@ -0,0 +1,63 @@
+/* Arabic joining group of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "unictype/joininggroup_byname.h"
+
+int
+uc_joining_group_byname (const char *joining_group_name)
+{
+ size_t len;
+
+ len = strlen (joining_group_name);
+ if (len <= MAX_WORD_LENGTH)
+ {
+ char buf[MAX_WORD_LENGTH + 1];
+ const struct named_joining_group *found;
+
+ /* Copy joining_group_name into buf, converting '_' and '-' to ' '. */
+ {
+ const char *p = joining_group_name;
+ char *q = buf;
+
+ for (;; p++, q++)
+ {
+ char c = *p;
+
+ if (c == '_' || c == '-')
+ c = ' ';
+ *q = c;
+ if (c == '\0')
+ break;
+ }
+ }
+ /* Here q == buf + len. */
+
+ /* Do a hash table lookup, with case-insensitive comparison. */
+ found = uc_joining_group_lookup (buf, len);
+ if (found != NULL)
+ return found->joining_group;
+ }
+ /* Invalid joining group name. */
+ return -1;
+}
diff --git a/gnulib/lib/unictype/joininggroup_byname.gperf b/gnulib/lib/unictype/joininggroup_byname.gperf
new file mode 100644
index 0000000..bc2fbc8
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_byname.gperf
@@ -0,0 +1,85 @@
+/* Arabic joining group of Unicode characters. */
+struct named_joining_group { int name; int joining_group; };
+%struct-type
+%ignore-case
+%language=ANSI-C
+%define hash-function-name joining_group_hash
+%define lookup-function-name uc_joining_group_lookup
+%readonly-tables
+%global-table
+%define word-array-name joining_group_names
+%pic
+%define string-pool-name joining_group_stringpool
+%%
+No Joining Group, UC_JOINING_GROUP_NONE
+NoJoiningGroup, UC_JOINING_GROUP_NONE
+Ain, UC_JOINING_GROUP_AIN
+Alaph, UC_JOINING_GROUP_ALAPH
+Alef, UC_JOINING_GROUP_ALEF
+Beh, UC_JOINING_GROUP_BEH
+Beth, UC_JOINING_GROUP_BETH
+Burushaski Yeh Barree, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE
+BurushaskiYehBarree, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE
+Dal, UC_JOINING_GROUP_DAL
+Dalath Rish, UC_JOINING_GROUP_DALATH_RISH
+DalathRish, UC_JOINING_GROUP_DALATH_RISH
+E, UC_JOINING_GROUP_E
+Farsi Yeh, UC_JOINING_GROUP_FARSI_YEH
+FarsiYeh, UC_JOINING_GROUP_FARSI_YEH
+Fe, UC_JOINING_GROUP_FE
+Feh, UC_JOINING_GROUP_FEH
+Final Semkath, UC_JOINING_GROUP_FINAL_SEMKATH
+FinalSemkath, UC_JOINING_GROUP_FINAL_SEMKATH
+Gaf, UC_JOINING_GROUP_GAF
+Gamal, UC_JOINING_GROUP_GAMAL
+Hah, UC_JOINING_GROUP_HAH
+He, UC_JOINING_GROUP_HE
+Heh, UC_JOINING_GROUP_HEH
+Heh Goal, UC_JOINING_GROUP_HEH_GOAL
+HehGoal, UC_JOINING_GROUP_HEH_GOAL
+Heth, UC_JOINING_GROUP_HETH
+Kaf, UC_JOINING_GROUP_KAF
+Kaph, UC_JOINING_GROUP_KAPH
+Khaph, UC_JOINING_GROUP_KHAPH
+Knotted Heh, UC_JOINING_GROUP_KNOTTED_HEH
+KnottedHeh, UC_JOINING_GROUP_KNOTTED_HEH
+Lam, UC_JOINING_GROUP_LAM
+Lamadh, UC_JOINING_GROUP_LAMADH
+Meem, UC_JOINING_GROUP_MEEM
+Mim, UC_JOINING_GROUP_MIM
+Noon, UC_JOINING_GROUP_NOON
+Nun, UC_JOINING_GROUP_NUN
+Nya, UC_JOINING_GROUP_NYA
+Pe, UC_JOINING_GROUP_PE
+Qaf, UC_JOINING_GROUP_QAF
+Qaph, UC_JOINING_GROUP_QAPH
+Reh, UC_JOINING_GROUP_REH
+Reversed Pe, UC_JOINING_GROUP_REVERSED_PE
+ReversedPe, UC_JOINING_GROUP_REVERSED_PE
+Sad, UC_JOINING_GROUP_SAD
+Sadhe, UC_JOINING_GROUP_SADHE
+Seen, UC_JOINING_GROUP_SEEN
+Semkath, UC_JOINING_GROUP_SEMKATH
+Shin, UC_JOINING_GROUP_SHIN
+Swash Kaf, UC_JOINING_GROUP_SWASH_KAF
+SwashKaf, UC_JOINING_GROUP_SWASH_KAF
+Syriac Waw, UC_JOINING_GROUP_SYRIAC_WAW
+SyriacWaw, UC_JOINING_GROUP_SYRIAC_WAW
+Tah, UC_JOINING_GROUP_TAH
+Taw, UC_JOINING_GROUP_TAW
+Teh Marbuta, UC_JOINING_GROUP_TEH_MARBUTA
+TehMarbuta, UC_JOINING_GROUP_TEH_MARBUTA
+Teh Marbuta Goal, UC_JOINING_GROUP_TEH_MARBUTA_GOAL
+TehMarbutaGoal, UC_JOINING_GROUP_TEH_MARBUTA_GOAL
+Teth, UC_JOINING_GROUP_TETH
+Waw, UC_JOINING_GROUP_WAW
+Yeh, UC_JOINING_GROUP_YEH
+Yeh Barree, UC_JOINING_GROUP_YEH_BARREE
+YehBarree, UC_JOINING_GROUP_YEH_BARREE
+Yeh with tail, UC_JOINING_GROUP_YEH_WITH_TAIL
+YehWithTail, UC_JOINING_GROUP_YEH_WITH_TAIL
+Yudh, UC_JOINING_GROUP_YUDH
+Yudh He, UC_JOINING_GROUP_YUDH_HE
+YudhHe, UC_JOINING_GROUP_YUDH_HE
+Zain, UC_JOINING_GROUP_ZAIN
+Zhain, UC_JOINING_GROUP_ZHAIN
diff --git a/gnulib/lib/unictype/joininggroup_name.c b/gnulib/lib/unictype/joininggroup_name.c
new file mode 100644
index 0000000..373a3c4
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_name.c
@@ -0,0 +1,55 @@
+/* Arabic joining group of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Use a string pool, rather than a two-dimensional array, because the strings
+ have very different lengths. */
+
+struct joining_group_stringpool_t
+ {
+#define ELEM(tag,string) char tag[sizeof (string)];
+#include "unictype/joininggroup_name.h"
+#undef ELEM
+ };
+
+static const struct joining_group_stringpool_t joining_group_stringpool_contents =
+ {
+#define ELEM(tag,string) string,
+#include "unictype/joininggroup_name.h"
+#undef ELEM
+ };
+#define joining_group_stringpool ((const char *) &joining_group_stringpool_contents)
+
+static const int joining_group_index[] =
+ {
+#define ELEM(tag,string) (int)(long)&((struct joining_group_stringpool_t *)0)->tag,
+#include "unictype/joininggroup_name.h"
+#undef ELEM
+ };
+
+const char *
+uc_joining_group_name (int joining_group)
+{
+ if (joining_group >= 0
+ && joining_group < sizeof (joining_group_index) / sizeof (joining_group_index[0]))
+ return joining_group_stringpool + joining_group_index[joining_group];
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/joininggroup_name.h b/gnulib/lib/unictype/joininggroup_name.h
new file mode 100644
index 0000000..12436a4
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_name.h
@@ -0,0 +1,74 @@
+/* Arabic joining group of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+ELEM (NONE, "No Joining Group")
+ELEM (AIN, "Ain")
+ELEM (ALAPH, "Alaph")
+ELEM (ALEF, "Alef")
+ELEM (BEH, "Beh")
+ELEM (BETH, "Beth")
+ELEM (BURUSHASKI_YEH_BARREE, "Burushaski Yeh Barree")
+ELEM (DAL, "Dal")
+ELEM (DALATH_RISH, "Dalath Rish")
+ELEM (E, "E")
+ELEM (FARSI_YEH, "Farsi Yeh")
+ELEM (FE, "Fe")
+ELEM (FEH, "Feh")
+ELEM (FINAL_SEMKATH, "Final Semkath")
+ELEM (GAF, "Gaf")
+ELEM (GAMAL, "Gamal")
+ELEM (HAH, "Hah")
+ELEM (HE, "He")
+ELEM (HEH, "Heh")
+ELEM (HEH_GOAL, "Heh Goal")
+ELEM (HETH, "Heth")
+ELEM (KAF, "Kaf")
+ELEM (KAPH, "Kaph")
+ELEM (KHAPH, "Khaph")
+ELEM (KNOTTED_HEH, "Knotted Heh")
+ELEM (LAM, "Lam")
+ELEM (LAMADH, "Lamadh")
+ELEM (MEEM, "Meem")
+ELEM (MIM, "Mim")
+ELEM (NOON, "Noon")
+ELEM (NUN, "Nun")
+ELEM (NYA, "Nya")
+ELEM (PE, "Pe")
+ELEM (QAF, "Qaf")
+ELEM (QAPH, "Qaph")
+ELEM (REH, "Reh")
+ELEM (REVERSED_PE, "Reversed Pe")
+ELEM (SAD, "Sad")
+ELEM (SADHE, "Sadhe")
+ELEM (SEEN, "Seen")
+ELEM (SEMKATH, "Semkath")
+ELEM (SHIN, "Shin")
+ELEM (SWASH_KAF, "Swash Kaf")
+ELEM (SYRIAC_WAW, "Syriac Waw")
+ELEM (TAH, "Tah")
+ELEM (TAW, "Taw")
+ELEM (TEH_MARBUTA, "Teh Marbuta")
+ELEM (TEH_MARBUTA_GOAL, "Teh Marbuta Goal")
+ELEM (TETH, "Teth")
+ELEM (WAW, "Waw")
+ELEM (YEH, "Yeh")
+ELEM (YEH_BARREE, "Yeh Barree")
+ELEM (YEH_WITH_TAIL, "Yeh With Tail")
+ELEM (YUDH, "Yudh")
+ELEM (YUDH_HE, "Yudh He")
+ELEM (ZAIN, "Zain")
+ELEM (ZHAIN, "Zhain")
diff --git a/gnulib/lib/unictype/joininggroup_of.c b/gnulib/lib/unictype/joininggroup_of.c
new file mode 100644
index 0000000..5dc393e
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_of.c
@@ -0,0 +1,33 @@
+/* Arabic joining group of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "unictype/joininggroup_of.h"
+
+int
+uc_joining_group (ucs4_t uc)
+{
+ if (uc >= joining_group_header_0
+ && uc < joining_group_header_0
+ + sizeof (u_joining_group) / sizeof (u_joining_group[0]))
+ return u_joining_group[uc - joining_group_header_0];
+ return UC_JOINING_GROUP_NONE;
+}
diff --git a/gnulib/lib/unictype/joininggroup_of.h b/gnulib/lib/unictype/joininggroup_of.h
new file mode 100644
index 0000000..1dd4804
--- /dev/null
+++ b/gnulib/lib/unictype/joininggroup_of.h
@@ -0,0 +1,183 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Arabic joining type of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define joining_group_header_0 0x620
+static const unsigned char u_joining_group[0x780 - 0x620] =
+{
+ UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_TEH_MARBUTA,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_SEEN,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD,
+ UC_JOINING_GROUP_SAD, UC_JOINING_GROUP_TAH,
+ UC_JOINING_GROUP_TAH, UC_JOINING_GROUP_AIN,
+ UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_FARSI_YEH,
+ UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_FARSI_YEH,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_FEH,
+ UC_JOINING_GROUP_QAF, UC_JOINING_GROUP_KAF,
+ UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_MEEM,
+ UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_HEH,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_YEH,
+ UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_QAF,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SEEN,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD,
+ UC_JOINING_GROUP_SAD, UC_JOINING_GROUP_TAH,
+ UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_FEH,
+ UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH,
+ UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH,
+ UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_QAF,
+ UC_JOINING_GROUP_QAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_SWASH_KAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_KAF, UC_JOINING_GROUP_KAF,
+ UC_JOINING_GROUP_KAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_LAM,
+ UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_LAM,
+ UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_NOON,
+ UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NOON,
+ UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NYA,
+ UC_JOINING_GROUP_KNOTTED_HEH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_TEH_MARBUTA, UC_JOINING_GROUP_HEH_GOAL,
+ UC_JOINING_GROUP_HEH_GOAL, UC_JOINING_GROUP_TEH_MARBUTA_GOAL,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_YEH_WITH_TAIL,
+ UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_YEH, UC_JOINING_GROUP_YEH,
+ UC_JOINING_GROUP_YEH_BARREE, UC_JOINING_GROUP_YEH_BARREE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_TEH_MARBUTA,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_SAD,
+ UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_KNOTTED_HEH,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_ALAPH, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_BETH, UC_JOINING_GROUP_GAMAL,
+ UC_JOINING_GROUP_GAMAL, UC_JOINING_GROUP_DALATH_RISH,
+ UC_JOINING_GROUP_DALATH_RISH, UC_JOINING_GROUP_HE,
+ UC_JOINING_GROUP_SYRIAC_WAW, UC_JOINING_GROUP_ZAIN,
+ UC_JOINING_GROUP_HETH, UC_JOINING_GROUP_TETH,
+ UC_JOINING_GROUP_TETH, UC_JOINING_GROUP_YUDH,
+ UC_JOINING_GROUP_YUDH_HE, UC_JOINING_GROUP_KAPH,
+ UC_JOINING_GROUP_LAMADH, UC_JOINING_GROUP_MIM,
+ UC_JOINING_GROUP_NUN, UC_JOINING_GROUP_SEMKATH,
+ UC_JOINING_GROUP_FINAL_SEMKATH, UC_JOINING_GROUP_E,
+ UC_JOINING_GROUP_PE, UC_JOINING_GROUP_REVERSED_PE,
+ UC_JOINING_GROUP_SADHE, UC_JOINING_GROUP_QAPH,
+ UC_JOINING_GROUP_DALATH_RISH, UC_JOINING_GROUP_SHIN,
+ UC_JOINING_GROUP_TAW, UC_JOINING_GROUP_BETH,
+ UC_JOINING_GROUP_GAMAL, UC_JOINING_GROUP_DALATH_RISH,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_NONE,
+ UC_JOINING_GROUP_NONE, UC_JOINING_GROUP_ZHAIN,
+ UC_JOINING_GROUP_KHAPH, UC_JOINING_GROUP_FE,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_BEH,
+ UC_JOINING_GROUP_BEH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_DAL,
+ UC_JOINING_GROUP_DAL, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_AIN,
+ UC_JOINING_GROUP_AIN, UC_JOINING_GROUP_AIN,
+ UC_JOINING_GROUP_FEH, UC_JOINING_GROUP_FEH,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_GAF,
+ UC_JOINING_GROUP_GAF, UC_JOINING_GROUP_MEEM,
+ UC_JOINING_GROUP_MEEM, UC_JOINING_GROUP_NOON,
+ UC_JOINING_GROUP_NOON, UC_JOINING_GROUP_NOON,
+ UC_JOINING_GROUP_LAM, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_REH, UC_JOINING_GROUP_SEEN,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_HAH,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_REH,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_ALEF,
+ UC_JOINING_GROUP_ALEF, UC_JOINING_GROUP_FARSI_YEH,
+ UC_JOINING_GROUP_FARSI_YEH, UC_JOINING_GROUP_YEH,
+ UC_JOINING_GROUP_WAW, UC_JOINING_GROUP_WAW,
+ UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE,
+ UC_JOINING_GROUP_HAH, UC_JOINING_GROUP_SEEN,
+ UC_JOINING_GROUP_SEEN, UC_JOINING_GROUP_KAF
+};
diff --git a/gnulib/lib/unictype/joiningtype_byname.c b/gnulib/lib/unictype/joiningtype_byname.c
new file mode 100644
index 0000000..11b4f69
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_byname.c
@@ -0,0 +1,63 @@
+/* Arabic joining type of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "unictype/joiningtype_byname.h"
+
+int
+uc_joining_type_byname (const char *joining_type_name)
+{
+ size_t len;
+
+ len = strlen (joining_type_name);
+ if (len <= MAX_WORD_LENGTH)
+ {
+ char buf[MAX_WORD_LENGTH + 1];
+ const struct named_joining_type *found;
+
+ /* Copy joining_type_name into buf, converting '_' and '-' to ' '. */
+ {
+ const char *p = joining_type_name;
+ char *q = buf;
+
+ for (;; p++, q++)
+ {
+ char c = *p;
+
+ if (c == '_' || c == '-')
+ c = ' ';
+ *q = c;
+ if (c == '\0')
+ break;
+ }
+ }
+ /* Here q == buf + len. */
+
+ /* Do a hash table lookup, with case-insensitive comparison. */
+ found = uc_joining_type_lookup (buf, len);
+ if (found != NULL)
+ return found->joining_type;
+ }
+ /* Invalid joining type name. */
+ return -1;
+}
diff --git a/gnulib/lib/unictype/joiningtype_byname.gperf b/gnulib/lib/unictype/joiningtype_byname.gperf
new file mode 100644
index 0000000..6b1e7d7
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_byname.gperf
@@ -0,0 +1,30 @@
+/* Arabic joining type of Unicode characters. */
+struct named_joining_type { int name; int joining_type; };
+%struct-type
+%ignore-case
+%language=ANSI-C
+%define hash-function-name joining_type_hash
+%define lookup-function-name uc_joining_type_lookup
+%readonly-tables
+%global-table
+%define word-array-name joining_type_names
+%pic
+%define string-pool-name joining_type_stringpool
+%%
+C, UC_JOINING_TYPE_C
+D, UC_JOINING_TYPE_D
+L, UC_JOINING_TYPE_L
+R, UC_JOINING_TYPE_R
+T, UC_JOINING_TYPE_T
+U, UC_JOINING_TYPE_U
+Join Causing, UC_JOINING_TYPE_C
+JoinCausing, UC_JOINING_TYPE_C
+Dual Joining, UC_JOINING_TYPE_D
+DualJoining, UC_JOINING_TYPE_D
+Left Joining, UC_JOINING_TYPE_L
+LeftJoining, UC_JOINING_TYPE_L
+Right Joining, UC_JOINING_TYPE_R
+RightJoining, UC_JOINING_TYPE_R
+Transparent, UC_JOINING_TYPE_T
+Non Joining, UC_JOINING_TYPE_U
+NonJoining, UC_JOINING_TYPE_U
diff --git a/gnulib/lib/unictype/joiningtype_longname.c b/gnulib/lib/unictype/joiningtype_longname.c
new file mode 100644
index 0000000..3948b0c
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_longname.c
@@ -0,0 +1,40 @@
+/* Arabic joining type of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_joining_type_long_name[6][14] =
+{
+ "Non Joining",
+ "Transparent",
+ "Join Causing",
+ "Left Joining",
+ "Right Joining",
+ "Dual Joining"
+};
+
+const char *
+uc_joining_type_long_name (int joining_type)
+{
+ if (joining_type >= 0
+ && joining_type < sizeof (u_joining_type_long_name) / sizeof (u_joining_type_long_name[0]))
+ return u_joining_type_long_name[joining_type];
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/joiningtype_name.c b/gnulib/lib/unictype/joiningtype_name.c
new file mode 100644
index 0000000..f1166ef
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_name.c
@@ -0,0 +1,35 @@
+/* Arabic joining type of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+static const char u_joining_type_name[6][2] =
+{
+ "U", "T", "C", "L", "R", "D"
+};
+
+const char *
+uc_joining_type_name (int joining_type)
+{
+ if (joining_type >= 0
+ && joining_type < sizeof (u_joining_type_name) / sizeof (u_joining_type_name[0]))
+ return u_joining_type_name[joining_type];
+ return NULL;
+}
diff --git a/gnulib/lib/unictype/joiningtype_of.c b/gnulib/lib/unictype/joiningtype_of.c
new file mode 100644
index 0000000..74a7855
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_of.c
@@ -0,0 +1,54 @@
+/* Arabic joining type of Unicode characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_joining_type table. */
+#include "joiningtype_of.h"
+
+int
+uc_joining_type (ucs4_t uc)
+{
+ unsigned int index1 = uc >> joining_type_header_0;
+ if (index1 < joining_type_header_1)
+ {
+ int lookup1 = u_joining_type.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> joining_type_header_2) & joining_type_header_3;
+ int lookup2 = u_joining_type.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & joining_type_header_4) + lookup2;
+ /* level3 contains 4-bit values. */
+ unsigned int lookup3 =
+ (u_joining_type.level3[index3>>1] >> ((index3 % 2) * 4))
+ & 0x0f;
+
+ if (lookup3 != 0x0f)
+ return lookup3;
+ }
+ }
+ }
+ if (uc_is_general_category_withtable
+ (uc, UC_CATEGORY_MASK_Mn | UC_CATEGORY_MASK_Me | UC_CATEGORY_MASK_Cf))
+ return UC_JOINING_TYPE_T;
+ return UC_JOINING_TYPE_U;
+}
diff --git a/gnulib/lib/unictype/joiningtype_of.h b/gnulib/lib/unictype/joiningtype_of.h
new file mode 100644
index 0000000..7e2c8bc
--- /dev/null
+++ b/gnulib/lib/unictype/joiningtype_of.h
@@ -0,0 +1,127 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Arabic joining type of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define joining_type_header_0 16
+#define joining_type_header_1 1
+#define joining_type_header_2 7
+#define joining_type_header_3 511
+#define joining_type_header_4 127
+static const
+struct
+ {
+ int level1[1];
+ short level2[1 << 9];
+ unsigned char level3[5 * 64];
+ }
+u_joining_type =
+{
+ { 0 },
+ {
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 0, 128, 256, 384,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 512, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x00, 0x00, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x05, 0x44, 0x44, 0x45, 0x45, 0x55, 0x55, 0x45,
+ 0x44, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x52, 0x55, 0x55, 0x55, 0x54, 0xf5, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x55,
+ 0x4f, 0x44, 0x40, 0x44, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x54, 0x45, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45,
+ 0x55, 0x44, 0x4f, 0xff, 0xff, 0xff, 0x0f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0xf5, 0x5f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xf4, 0x55, 0x45, 0x44, 0x44, 0x55, 0x55, 0x54,
+ 0x55, 0x55, 0x55, 0x55, 0x54, 0x54, 0x54, 0x45,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x45, 0x44, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x45, 0x54, 0x55,
+ 0x45, 0x45, 0x54, 0x55, 0x44, 0x55, 0x55, 0x55,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+ 0x55, 0x55, 0x55, 0x55, 0x55, 0xf5, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ }
+};
diff --git a/gnulib/lib/unictype/mirror.c b/gnulib/lib/unictype/mirror.c
new file mode 100644
index 0000000..4a6c983
--- /dev/null
+++ b/gnulib/lib/unictype/mirror.c
@@ -0,0 +1,49 @@
+/* Mirrored Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_mirror table. */
+#include "mirror.h"
+
+bool
+uc_mirror_char (ucs4_t uc, ucs4_t *puc)
+{
+ unsigned int index1 = uc >> mirror_header_0;
+ if (index1 < mirror_header_1)
+ {
+ int lookup1 = u_mirror.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> mirror_header_2) & mirror_header_3;
+ int lookup2 = u_mirror.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & mirror_header_4);
+ int lookup3 = u_mirror.level3[lookup2 + index3];
+
+ *puc = uc + lookup3;
+ return (lookup3 != 0);
+ }
+ }
+ }
+ *puc = uc;
+ return false;
+}
diff --git a/gnulib/lib/unictype/mirror.h b/gnulib/lib/unictype/mirror.h
new file mode 100644
index 0000000..786a010
--- /dev/null
+++ b/gnulib/lib/unictype/mirror.h
@@ -0,0 +1,503 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Mirrored Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define mirror_header_0 16
+#define mirror_header_1 2
+#define mirror_header_2 7
+#define mirror_header_3 511
+#define mirror_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[22 << 7];
+ }
+u_mirror =
+{
+ { 0, 512 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 256, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 384, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 512, 640, 768, -1, 896, 1024, 1152, -1,
+ -1, -1, -1, -1, -1, -1, 1280, 1408,
+ -1, -1, -1, 1536, 1664, 1792, -1, -1,
+ -1, -1, -1, -1, 1920, -1, -1, -1,
+ 2048, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2176, -1, 2304, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2432, 2560, 2688,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, -2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, -2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, -2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 61635, 61634, 61633, 61632, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 59746, 59745, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 57021, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 56828, 56827, 56826, 56825, 0, 0, 0,
+ 3, 56820, 3, -3, 56817, -3, 0, 0,
+ 0, 56812, 0, 0, 0, 56808, 56807, 0,
+ 0, 0, 56803, 56802, 56801, 56800, 0, 56798,
+ 56797, 56796, 56795, 0, 56793, 0, 56791, 0,
+ 0, 0, 0, 56786, 56785, 56784, 56783, 56782,
+ 56781, 56780, 56779, 56778, 0, 0, 0, 0,
+ 0, 56772, 0, 56770, 1, -1, 56767, 56766,
+ 56765, 56764, 56763, 138, 56761, 56760, 56759, 56758,
+ 56757, 56756, 56755, 56754, 56753, 0, 0, 0,
+ 0, 0, 1, -1, 1, -1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 56734,
+ 56733, 0, 56731, 0, 1, -1, 1, -1,
+ 56725, 56724, 1, -1, 0, 0, 56719, 56718,
+ 56717, 56716, 56715, 56714, 56713, 56712, 1, -1,
+ 1, -1, 1, -1, 1, -1, 56703, 56702,
+ 56701, 56700, 1, -1, 56697, 56696, 1, -1,
+ 56693, 56692, 56691, 56690, 56689, 0, 0, 1,
+ -1, 1, -1, 0, 0, 0, 0, 0,
+ 56677, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, -1, 0, 0, 56663, 56662,
+ 56661, 56660, 56659, 56658, 56657, 56656, 56655, 56654,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 56645, 0, 0, 0, 0, 0, 56639, 56638,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 1, -1, -138, 0, 0,
+ 1, -1, 0, 0, 0, 0, 1, -1,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 56605, 56604, 56603, 56602, 56601, 56600, 56599, 56598,
+ 56597, 56596, 56595, 56594, 56593, 56592, 0, 0,
+ 1, -1, 56587, 56586, 56585, 56584, 56583, 56582,
+ 56581, 56580, 56579, 56578, 56577, 56576, 56575, 56574,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 1, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 56541, 56540, 0, 0, 0, 0, 0, 0,
+ 0, 1, -1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 55445, 55444, 55443, 55442, 55441, 55440, 55439, 55438,
+ 55437, 55436, 55435, 55434, 55433, 55432, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 55357, 0, 0, 55354, 55353, 55352, 55351, 0,
+ 55349, 55348, 0, 0, 55345, 0, 0, 0,
+ 0, 0, 0, 55338, 55337, 55336, 55335, 0,
+ 0, 0, 0, 0, 55329, 55328, 55327, 0,
+ 0, 0, 55323, 55322, 55321, 55320, 55319, 55318,
+ 55317, 55316, 55315, 55314, 55313, 55312, 55311, 55310,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 54906, 54905, 54904, 54903, 54902,
+ 54901, 54900, 54899, 54898, 54897, 54896, 54895, 54894,
+ 54893, 54892, 54891, 54890, 54889, 54888, 54887, 54886,
+ 54885, 0, 0, 54882, 54881, 54880, 54879, 54878,
+ 54877, 54876, 54875, 54874, 54873, 54872, 54871, 54870,
+ 54869, 54868, 54867, 54866, 54865, 54864, 54863, 54862,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 54853, 0, 0, 0, 0, 0, 0, 0,
+ 54845, 54844, 54843, 54842, 54841, 54840, 0, 0,
+ 0, 54836, 0, 0, 0, 0, 54831, 54830,
+ 54829, 54828, 54827, 0, 54825, 54824, 0, 0,
+ 54821, 54820, 54819, 54818, 54817, 0, 0, 0,
+ 0, 54812, 0, 54810, 54809, 54808, 0, 0,
+ 54805, 54804, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 54793, 54792, 54791, 54790,
+ 54789, 54788, 0, 0, 54785, 54784, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 54771, 54770, 54769, 54768, 54767, 54766,
+ 54765, 54764, 54763, 54762, 54761, 54760, 54759, 54758,
+ 54757, 54756, 54755, 54754, 54753, 0, 54751, 54750,
+ 54749, 54748, 0, 0, 54745, 0, 54743, 0,
+ 0, 54740, 0, 54738, 54737, 54736, 54735, 0,
+ 0, 0, 0, 0, 54729, 54728, 0, 0,
+ 0, 0, 0, 0, 54721, 54720, 54719, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 54694,
+ 54693, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 54681, 54680, 0, 0,
+ 0, 0, 54675, 54674, 54673, 54672, 0, 54670,
+ 54669, 0, 0, 54666, 54665, 0, 0, 0,
+ 0, 54660, 54659, 54658, 54657, 54656, 54655, 54654,
+ 54653, 54652, 54651, 54650, 54649, 54648, 54647, 54646,
+ 54645, 54644, 54643, 54642, 54641, 54640, 54639, 54638,
+ 54637, 54636, 54635, 54634, 54633, 54632, 54631, 54630,
+ 54629, 54628, 54627, 54626, 54625, 54624, 54623, 54622,
+ 54621, 54620, 54619, 54618, 0, 0, 54615, 54614,
+ 54613, 54612, 54611, 54610, 54609, 54608, 0, 54606,
+ 54605, 54604, 54603, 54602, 54601, 54600, 54599, 54598,
+ 54597, 54596, 54595, 54594, 54593, 54592, 54591, 54590,
+ 54589, 54588, 54587, 54586, 54585, 54584, 54583, 54582,
+ 54581, 54580, 54579, 54578, 54577, 54576, 54575, 54574,
+ 54573, 54572, 54571, 54570, 54569, 54568, 54567, 0,
+ 0, 0, 0, 0, 54561, 0, 54559, 0,
+ 0, 0, 54555, 54554, 54553, 54552, 54551, 0,
+ 0, 0, 0, 0, 54545, 54544, 54543, 0,
+ 0, 0, 0, 54538, 0, 0, 0, 54534,
+ 54533, 54532, 54531, 54530, 0, 54528, 0, 0,
+ 0, 0, 53755, 53754, 53753, 53752, 0, 0,
+ 0, 53748, 53747, 0, 53745, 53744, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 53729, 53728, 0, 0,
+ 53725, 53724, 53723, 53722, 53721, 53720, 53719, 53718,
+ 53717, 53716, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, -1, 1, -1, 1, -1, 1, -1,
+ 1, -1, 0, 0, 1, -1, 1, -1,
+ 1, -1, 1, -1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 420, 419, 418, 417, 416, 415, 0,
+ 0, 0, 0, 0, 409, 408, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 245, 244, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 225, 0, 223, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 194, 0, 192, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 162, 0, 160, 0, 158,
+ 157, 0, 155, 154, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -55006, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -55064, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, -55122,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -55180, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, -55238, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/gnulib/lib/unictype/numeric.c b/gnulib/lib/unictype/numeric.c
new file mode 100644
index 0000000..d7417e2
--- /dev/null
+++ b/gnulib/lib/unictype/numeric.c
@@ -0,0 +1,55 @@
+/* Values of numeric Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_numeric_values and u_numeric tables. */
+#include "numeric.h"
+
+uc_fraction_t
+uc_numeric_value (ucs4_t uc)
+{
+ unsigned int index1 = uc >> numeric_header_0;
+ if (index1 < numeric_header_1)
+ {
+ int lookup1 = u_numeric.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> numeric_header_2) & numeric_header_3;
+ int lookup2 = u_numeric.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = ((uc & numeric_header_4) + lookup2) * 7;
+ /* level3 contains 7-bit values, packed into 16-bit words. */
+ unsigned int lookup3 =
+ ((u_numeric.level3[index3>>4]
+ | (u_numeric.level3[(index3>>4)+1] << 16))
+ >> (index3 % 16))
+ & 0x7f;
+
+ return u_numeric_values[lookup3];
+ }
+ }
+ }
+ {
+ const uc_fraction_t default_value = { 0, 0 };
+ return default_value;
+ }
+}
diff --git a/gnulib/lib/unictype/numeric.h b/gnulib/lib/unictype/numeric.h
new file mode 100644
index 0000000..7680466
--- /dev/null
+++ b/gnulib/lib/unictype/numeric.h
@@ -0,0 +1,710 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Numeric values of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+static const uc_fraction_t u_numeric_values[113] =
+{
+ { 0, 0 },
+ { 0, 1 },
+ { 1, 1 },
+ { 2, 1 },
+ { 3, 1 },
+ { 4, 1 },
+ { 5, 1 },
+ { 6, 1 },
+ { 7, 1 },
+ { 8, 1 },
+ { 9, 1 },
+ { 10, 1 },
+ { 11, 1 },
+ { 12, 1 },
+ { 13, 1 },
+ { 14, 1 },
+ { 15, 1 },
+ { 16, 1 },
+ { 17, 1 },
+ { 18, 1 },
+ { 19, 1 },
+ { 20, 1 },
+ { 21, 1 },
+ { 22, 1 },
+ { 23, 1 },
+ { 24, 1 },
+ { 25, 1 },
+ { 26, 1 },
+ { 27, 1 },
+ { 28, 1 },
+ { 29, 1 },
+ { 30, 1 },
+ { 31, 1 },
+ { 32, 1 },
+ { 33, 1 },
+ { 34, 1 },
+ { 35, 1 },
+ { 36, 1 },
+ { 37, 1 },
+ { 38, 1 },
+ { 39, 1 },
+ { 40, 1 },
+ { 41, 1 },
+ { 42, 1 },
+ { 43, 1 },
+ { 44, 1 },
+ { 45, 1 },
+ { 46, 1 },
+ { 47, 1 },
+ { 48, 1 },
+ { 49, 1 },
+ { 50, 1 },
+ { 60, 1 },
+ { 70, 1 },
+ { 80, 1 },
+ { 90, 1 },
+ { 100, 1 },
+ { 200, 1 },
+ { 300, 1 },
+ { 400, 1 },
+ { 500, 1 },
+ { 600, 1 },
+ { 700, 1 },
+ { 800, 1 },
+ { 900, 1 },
+ { 1000, 1 },
+ { 2000, 1 },
+ { 3000, 1 },
+ { 4000, 1 },
+ { 5000, 1 },
+ { 6000, 1 },
+ { 7000, 1 },
+ { 8000, 1 },
+ { 9000, 1 },
+ { 10000, 1 },
+ { 20000, 1 },
+ { 30000, 1 },
+ { 40000, 1 },
+ { 50000, 1 },
+ { 60000, 1 },
+ { 70000, 1 },
+ { 80000, 1 },
+ { 90000, 1 },
+ { 100000, 1 },
+ { -1, 2 },
+ { 1, 2 },
+ { 3, 2 },
+ { 5, 2 },
+ { 7, 2 },
+ { 9, 2 },
+ { 11, 2 },
+ { 13, 2 },
+ { 15, 2 },
+ { 17, 2 },
+ { 1, 3 },
+ { 2, 3 },
+ { 1, 4 },
+ { 3, 4 },
+ { 1, 5 },
+ { 2, 5 },
+ { 3, 5 },
+ { 4, 5 },
+ { 1, 6 },
+ { 5, 6 },
+ { 1, 7 },
+ { 1, 8 },
+ { 3, 8 },
+ { 5, 8 },
+ { 7, 8 },
+ { 1, 9 },
+ { 1, 10 },
+ { 1, 16 },
+ { 3, 16 }
+};
+#define numeric_header_0 16
+#define numeric_header_1 3
+#define numeric_header_2 7
+#define numeric_header_3 511
+#define numeric_header_4 127
+static const
+struct
+ {
+ int level1[3];
+ short level2[3 << 9];
+ unsigned short level3[54 * 56 + 1];
+ }
+u_numeric =
+{
+ { 0, 512, 1024 },
+ {
+ 0, 128, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 384, -1, 512,
+ -1, -1, 640, 768, 640, 640, 896, 1024,
+ 1152, 640, 1280, -1, 1408, 1408, 1536, -1,
+ 512, 1664, -1, -1, -1, -1, 1792, -1,
+ -1, -1, -1, -1, -1, 1920, -1, 2048,
+ 1664, -1, 2176, 2304, -1, 2432, 1408, 0,
+ 2560, -1, -1, -1, -1, -1, -1, -1,
+ 2688, 2816, 2944, 3072, -1, -1, -1, -1,
+ 3200, 3328, -1, -1, -1, -1, 3456, 3584,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3712, -1, -1, -1, -1, -1, -1,
+ 3840, -1, -1, 3968, 4096, 4224, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4352, 4480, -1, -1,
+ 4608, 1408, 2816, 1408, 1408, -1, -1, 384,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 4736, 4864, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1664, -1,
+ -1, -1, 4992, 5120, -1, -1, 5248, 5376,
+ -1, 4352, -1, -1, -1, -1, -1, -1,
+ 5504, -1, 5632, -1, 5760, -1, 5888, -1,
+ -1, -1, -1, -1, 6016, -1, -1, -1,
+ 6144, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 6272, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 6400, -1,
+ -1, -1, -1, -1, -1, -1, -1, 6528,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 6656, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 6784, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30,
+ 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc000, 0x0080, 0x0000,
+ 0x0000, 0x0001, 0xae00, 0x0186, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910,
+ 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0xf000, 0xc34e, 0xe1c1, 0x0008, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x1ab8, 0xa77e, 0x00e1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x5c0b, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x0000, 0x0000, 0x0100, 0x80c1, 0x1820, 0x0010,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x5c0b, 0x5c10, 0x030d, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080,
+ 0x1c30, 0x0910, 0xd545, 0xc57a, 0xb566, 0x6e5b, 0x0a97, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101,
+ 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x80c1, 0x3050,
+ 0x101c, 0xc509, 0xf2a2, 0xcd49, 0x3568, 0x0ddb, 0x04a7, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2648, 0x0014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000,
+ 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0304,
+ 0xc142, 0x4070, 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0085,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0xc101,
+ 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910,
+ 0x0005, 0x0000, 0x0000, 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0001, 0x5000, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000,
+ 0xc101, 0x5080, 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xb6e8, 0xfbdb, 0x8f15, 0x65c9, 0x39f3,
+ 0x5ead, 0x05b3, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331,
+ 0x82f1, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0xc331, 0x82f1,
+ 0xa2c1, 0x0012, 0xcc38, 0xd39c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xa305, 0x78e1,
+ 0x2240, 0x0992, 0x22a5, 0x1018, 0x860a, 0x2203, 0x58a1, 0x1a30,
+ 0x078e, 0x2224, 0x5099, 0x822a, 0xa101, 0x3860, 0x1220, 0x058a,
+ 0xe1a3, 0x4078, 0x9222, 0xa509, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8040, 0x70d1,
+ 0x203c, 0xc911, 0x5284, 0x0c11, 0x0508, 0x01c3, 0x5091, 0x022c,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0800, 0x8406, 0xe182, 0x4880, 0x1628,
+ 0x0182, 0x60a1, 0x2038, 0x8a12, 0x6085, 0x2840, 0x0e18, 0x8488,
+ 0x0162, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0x0002,
+ 0x0000, 0x0000, 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc100, 0x5080,
+ 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8b00, 0x07ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x4060, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0182, 0x60a1,
+ 0x2038, 0x8a12, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xcb00, 0x9305, 0x6cd1, 0x1d38, 0x07cf,
+ 0x1214, 0x488d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0182, 0x60a1, 0x2038, 0x8a12, 0x0005, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9280, 0x84e9, 0xa94a,
+ 0xac56, 0xeb96, 0x8b05, 0x66c9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc101, 0x5080,
+ 0x1c30, 0x0910, 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8406, 0xe182, 0x4880,
+ 0x0228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ae0, 0x9df8, 0x0386,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0160, 0x0000, 0x0300, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0380, 0x00e0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5800, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0304, 0xc142, 0x4070, 0x1424, 0xca8b,
+ 0x3527, 0xd5a3, 0x376c, 0x4e5c, 0xe3b7, 0x7cf5, 0x603f, 0x3850,
+ 0x1624, 0x478d, 0x5264, 0x64b9, 0x9d36, 0x684f, 0x0a54, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaae0, 0x30c0, 0x15e3, 0x869d,
+ 0x0cc5, 0x0bc7, 0x0d16, 0x198b, 0x178e, 0x3a54, 0x0217, 0x6081,
+ 0x1830, 0x0c0c, 0xc58b, 0xb162, 0xccf8, 0xb366, 0x4e19, 0xe3c7,
+ 0x78f1, 0x60bc, 0x30d1, 0x56ab, 0x61bf, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc302, 0x0662,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x1b80, 0x0000, 0x0000, 0x0000,
+ 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xc100, 0x5160, 0x01c1, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x6101,
+ 0xc151, 0x9505, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0800, 0x1516, 0x80dc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0182, 0xb0a1, 0xe0a8, 0x0082,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x00cc,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xa101,
+ 0xa8b0, 0x82e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xa101, 0xa8b0, 0x82e0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xe545, 0x9a93,
+ 0x6ad1, 0x1bb6, 0xa72e, 0xf1db, 0xbe7a, 0xb01f, 0xf60a, 0x017e,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0x4060, 0x1828, 0x880e, 0x6284,
+ 0xf951, 0x66a4, 0x9ab4, 0x86ed, 0x060b, 0x0304, 0xc142, 0x4070,
+ 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4203, 0x70c1, 0x2440, 0x8414, 0xe182, 0x4880, 0x0a28, 0x0386,
+ 0xa122, 0x0c10, 0x0508, 0x01c3, 0x5091, 0x0608, 0x8284, 0x4061,
+ 0x1420, 0x070c, 0x4244, 0x1821, 0x0810, 0x0305, 0x2000, 0x1018,
+ 0x0508, 0x8103, 0x2850, 0x0a14, 0x0407, 0x9102, 0x2848, 0x0a14,
+ 0x80c5, 0x3050, 0x041c, 0x4203, 0x60a1, 0x0030, 0x8200, 0xf781,
+ 0xf67b, 0xd37e, 0x3360, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0182, 0x60a1, 0x2038, 0x8a12, 0xe545, 0x9a93,
+ 0x6ad1, 0x1bb6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0404, 0x4203, 0x70c1, 0x2440, 0x0114, 0x80c1,
+ 0x3050, 0x101c, 0x4509, 0x3040, 0x1420, 0x070c, 0x4244, 0x1011,
+ 0x080c, 0xc305, 0x9101, 0x0450, 0x0304, 0xc142, 0x4070, 0x1424,
+ 0x8081, 0x4060, 0x1828, 0x880e, 0x0284, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_alphabetic.c b/gnulib/lib/unictype/pr_alphabetic.c
new file mode 100644
index 0000000..69a9cba
--- /dev/null
+++ b/gnulib/lib/unictype/pr_alphabetic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_alphabetic table. */
+#include "pr_alphabetic.h"
+
+bool
+uc_is_property_alphabetic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_alphabetic, uc);
+}
+
+const uc_property_t UC_PROPERTY_ALPHABETIC =
+ { &uc_is_property_alphabetic };
diff --git a/gnulib/lib/unictype/pr_alphabetic.h b/gnulib/lib/unictype/pr_alphabetic.h
new file mode 100644
index 0000000..0ba00fe
--- /dev/null
+++ b/gnulib/lib/unictype/pr_alphabetic.h
@@ -0,0 +1,612 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[50 << 4];
+ }
+u_property_alphabetic =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 768,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0xBFFF0000, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFF, 0xFEFFFFFF, 0xFFFFC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x1FEFFFFF, 0x9C00E1FE,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFC00, 0x043007FF,
+ 0xFCFFFFFF, 0x00001FFF, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xEFFFFFFF, 0xFFE1DFFF, 0xFEFE000F,
+ 0xFFF99FEE, 0xE3C5FDFF, 0xB080599F, 0x0003000F,
+ 0xFFF987EE, 0xC36DFDFF, 0x5E021987, 0x003F0000,
+ 0xFFFBBFEE, 0xE3EDFDFF, 0x00011BBF, 0x0000000F,
+ 0xFFF99FEE, 0xE3EDFDFF, 0xB0C0199F, 0x0002000F,
+ 0xD63DC7EC, 0xC3FFC718, 0x00811DC7, 0x00000000,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03601DDF, 0x0000000F,
+ 0xFFFDDFEC, 0xE3EFFDFF, 0x40601DDF, 0x0006000F,
+ 0xFFFDDFEC, 0xE7FFFFFF, 0x00805DDF, 0xFC00000F,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F807F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x0000207F, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x3000205F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFFFF03, 0x1FFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xF97FFFFF, 0xFFFF0000, 0xFFFFC1E7,
+ 0x3000407F, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x87FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x000FDFFF, 0x000FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x108001FF, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x01FF0FFF, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0x000003FF, 0x00000000,
+ 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x001FFFFE,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFEFFFFF, 0x00000FEF, 0x00000000,
+ 0xFFFFFFFF, 0x0000C3FF, 0xFFFFFFFF, 0x0003FFBF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x08FC0000,
+ 0xFFFFFC00, 0xFFFF07FF, 0x0007FFFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFF7FFFF, 0x00008000, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x00003FFF, 0x047FFFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x000007FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFC, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ascii_hex_digit.c b/gnulib/lib/unictype/pr_ascii_hex_digit.c
new file mode 100644
index 0000000..ec9f48c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ascii_hex_digit.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ascii_hex_digit table. */
+#include "pr_ascii_hex_digit.h"
+
+bool
+uc_is_property_ascii_hex_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ascii_hex_digit, uc);
+}
+
+const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT =
+ { &uc_is_property_ascii_hex_digit };
diff --git a/gnulib/lib/unictype/pr_ascii_hex_digit.h b/gnulib/lib/unictype/pr_ascii_hex_digit.h
new file mode 100644
index 0000000..5a4ddf3
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ascii_hex_digit.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ascii_hex_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_digit.c b/gnulib/lib/unictype/pr_bidi_arabic_digit.c
new file mode 100644
index 0000000..b0f260c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_arabic_digit table. */
+#include "pr_bidi_arabic_digit.h"
+
+bool
+uc_is_property_bidi_arabic_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_arabic_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_arabic_digit (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_AN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT =
+ { &uc_is_property_bidi_arabic_digit };
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_digit.h b/gnulib/lib/unictype/pr_bidi_arabic_digit.h
new file mode 100644
index 0000000..4f7c14b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_digit.h
@@ -0,0 +1,291 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_bidi_arabic_digit =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0000000F, 0x00000000, 0x00000000, 0x00001BFF,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c
new file mode 100644
index 0000000..e6a733d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_arabic_right_to_left table. */
+#include "pr_bidi_arabic_right_to_left.h"
+
+bool
+uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_arabic_right_to_left, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_AL);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT =
+ { &uc_is_property_bidi_arabic_right_to_left };
diff --git a/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h
new file mode 100644
index 0000000..918eda6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_arabic_right_to_left.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_arabic_right_to_left =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64
+ },
+ {
+ 0xF8002930, 0xFFFFFFFF, 0x000007FF, 0xFFFEE000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0xFC00C060,
+ 0xFFFD7FFF, 0x0000FFFF, 0xFFFFF800, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xDFFF0000,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0xFFFFF080,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_block_separator.c b/gnulib/lib/unictype/pr_bidi_block_separator.c
new file mode 100644
index 0000000..3a3d526
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_block_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_block_separator table. */
+#include "pr_bidi_block_separator.h"
+
+bool
+uc_is_property_bidi_block_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_block_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_block_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_B);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR =
+ { &uc_is_property_bidi_block_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_block_separator.h b/gnulib/lib/unictype/pr_bidi_block_separator.h
new file mode 100644
index 0000000..86f4015
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_block_separator.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_bidi_block_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x70002400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_boundary_neutral.c b/gnulib/lib/unictype/pr_bidi_boundary_neutral.c
new file mode 100644
index 0000000..d42549d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_boundary_neutral.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_boundary_neutral table. */
+#include "pr_bidi_boundary_neutral.h"
+
+bool
+uc_is_property_bidi_boundary_neutral (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_boundary_neutral, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_boundary_neutral (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_BN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL =
+ { &uc_is_property_bidi_boundary_neutral };
diff --git a/gnulib/lib/unictype/pr_bidi_boundary_neutral.h b/gnulib/lib/unictype/pr_bidi_boundary_neutral.h
new file mode 100644
index 0000000..d9f9d5b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_boundary_neutral.h
@@ -0,0 +1,586 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_bidi_boundary_neutral =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80
+ },
+ {
+ 0x0FFFC1FF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFDF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC1FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_common_separator.c b/gnulib/lib/unictype/pr_bidi_common_separator.c
new file mode 100644
index 0000000..e5fc460
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_common_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_common_separator table. */
+#include "pr_bidi_common_separator.h"
+
+bool
+uc_is_property_bidi_common_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_common_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_common_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_CS);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR =
+ { &uc_is_property_bidi_common_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_common_separator.h b/gnulib/lib/unictype/pr_bidi_common_separator.h
new file mode 100644
index 0000000..e282ed9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_common_separator.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_bidi_common_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48
+ },
+ {
+ 0x00000000, 0x0400D000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00250000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0400D000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_control.c b/gnulib/lib/unictype/pr_bidi_control.c
new file mode 100644
index 0000000..adb81d2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_control table. */
+#include "pr_bidi_control.h"
+
+bool
+uc_is_property_bidi_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_BIDI_CONTROL =
+ { &uc_is_property_bidi_control };
diff --git a/gnulib/lib/unictype/pr_bidi_control.h b/gnulib/lib/unictype/pr_bidi_control.h
new file mode 100644
index 0000000..413a01a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0000C000, 0x00007C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_embedding_or_override.c b/gnulib/lib/unictype/pr_bidi_embedding_or_override.c
new file mode 100644
index 0000000..2605f4e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_embedding_or_override.c
@@ -0,0 +1,49 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_embedding_or_override table. */
+#include "pr_bidi_embedding_or_override.h"
+
+bool
+uc_is_property_bidi_embedding_or_override (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_embedding_or_override, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_embedding_or_override (ucs4_t uc)
+{
+ int category = uc_bidi_category (uc);
+ return (category == UC_BIDI_LRE || category == UC_BIDI_LRO
+ || category == UC_BIDI_RLE || category == UC_BIDI_RLO);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE =
+ { &uc_is_property_bidi_embedding_or_override };
diff --git a/gnulib/lib/unictype/pr_bidi_embedding_or_override.h b/gnulib/lib/unictype/pr_bidi_embedding_or_override.h
new file mode 100644
index 0000000..0959cf5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_embedding_or_override.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_embedding_or_override =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00006C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_separator.c b/gnulib/lib/unictype/pr_bidi_eur_num_separator.c
new file mode 100644
index 0000000..a0356e7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_eur_num_separator table. */
+#include "pr_bidi_eur_num_separator.h"
+
+bool
+uc_is_property_bidi_eur_num_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_eur_num_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_eur_num_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ES);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR =
+ { &uc_is_property_bidi_eur_num_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_separator.h b/gnulib/lib/unictype/pr_bidi_eur_num_separator.h
new file mode 100644
index 0000000..2a94c12
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_separator.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_eur_num_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64
+ },
+ {
+ 0x00000000, 0x00002800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0C000000,
+ 0x00000C00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00040000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c
new file mode 100644
index 0000000..e07901c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_eur_num_terminator table. */
+#include "pr_bidi_eur_num_terminator.h"
+
+bool
+uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_eur_num_terminator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ET);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR =
+ { &uc_is_property_bidi_eur_num_terminator };
diff --git a/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h
new file mode 100644
index 0000000..6dc0185
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_eur_num_terminator.h
@@ -0,0 +1,192 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_bidi_eur_num_terminator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144
+ },
+ {
+ 0x00000000, 0x00000038, 0x00000000, 0x00000000,
+ 0x00000000, 0x0003003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000600, 0x00000000, 0x00000000, 0x00000400,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x080C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x001F0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00080000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x03000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000600,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000038, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_european_digit.c b/gnulib/lib/unictype/pr_bidi_european_digit.c
new file mode 100644
index 0000000..a4256b1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_european_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_european_digit table. */
+#include "pr_bidi_european_digit.h"
+
+bool
+uc_is_property_bidi_european_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_european_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_european_digit (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_EN);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT =
+ { &uc_is_property_bidi_european_digit };
diff --git a/gnulib/lib/unictype/pr_bidi_european_digit.h b/gnulib/lib/unictype/pr_bidi_european_digit.h
new file mode 100644
index 0000000..8fb100b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_european_digit.h
@@ -0,0 +1,311 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_bidi_european_digit =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x020C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0FFFFF00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c
new file mode 100644
index 0000000..9e9da84
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_hebrew_right_to_left table. */
+#include "pr_bidi_hebrew_right_to_left.h"
+
+bool
+uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_hebrew_right_to_left, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_R);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT =
+ { &uc_is_property_bidi_hebrew_right_to_left };
diff --git a/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h
new file mode 100644
index 0000000..a3e835f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_hebrew_right_to_left.h
@@ -0,0 +1,319 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_bidi_hebrew_right_to_left =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00010000, 0x40000000, 0xFFFFFF49, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFC3007FF,
+ 0x043FFFFF, 0xFFFFC110, 0xF1FFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xA0000000, 0xFFFFFDFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF0F91, 0x78FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x01FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_left_to_right.c b/gnulib/lib/unictype/pr_bidi_left_to_right.c
new file mode 100644
index 0000000..e099da9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_left_to_right.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_left_to_right table. */
+#include "pr_bidi_left_to_right.h"
+
+bool
+uc_is_property_bidi_left_to_right (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_left_to_right, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_left_to_right (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_L);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT =
+ { &uc_is_property_bidi_left_to_right };
diff --git a/gnulib/lib/unictype/pr_bidi_left_to_right.h b/gnulib/lib/unictype/pr_bidi_left_to_right.h
new file mode 100644
index 0000000..8a3c941
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_left_to_right.h
@@ -0,0 +1,726 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[43 << 4];
+ }
+u_property_bidi_left_to_right =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 384,
+ 18 * sizeof (int) / sizeof (short) + 256,
+ 18 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 18 + 512 * sizeof (short) / sizeof (int) + 0,
+ 18 + 512 * sizeof (short) / sizeof (int) + 16,
+ 18 + 512 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 48,
+ 18 + 512 * sizeof (short) / sizeof (int) + 64,
+ 18 + 512 * sizeof (short) / sizeof (int) + 80,
+ 18 + 512 * sizeof (short) / sizeof (int) + 96,
+ 18 + 512 * sizeof (short) / sizeof (int) + 112,
+ 18 + 512 * sizeof (short) / sizeof (int) + 128,
+ 18 + 512 * sizeof (short) / sizeof (int) + 144,
+ 18 + 512 * sizeof (short) / sizeof (int) + 160,
+ 18 + 512 * sizeof (short) / sizeof (int) + 176,
+ 18 + 512 * sizeof (short) / sizeof (int) + 192,
+ 18 + 512 * sizeof (short) / sizeof (int) + 208,
+ 18 + 512 * sizeof (short) / sizeof (int) + 224,
+ 18 + 512 * sizeof (short) / sizeof (int) + 240,
+ 18 + 512 * sizeof (short) / sizeof (int) + 256,
+ 18 + 512 * sizeof (short) / sizeof (int) + 272,
+ 18 + 512 * sizeof (short) / sizeof (int) + 288,
+ 18 + 512 * sizeof (short) / sizeof (int) + 304,
+ 18 + 512 * sizeof (short) / sizeof (int) + 320,
+ 18 + 512 * sizeof (short) / sizeof (int) + 336,
+ 18 + 512 * sizeof (short) / sizeof (int) + 352,
+ 18 + 512 * sizeof (short) / sizeof (int) + 368,
+ 18 + 512 * sizeof (short) / sizeof (int) + 384,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 416,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 432,
+ 18 + 512 * sizeof (short) / sizeof (int) + 448,
+ 18 + 512 * sizeof (short) / sizeof (int) + 464,
+ 18 + 512 * sizeof (short) / sizeof (int) + 480,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 512,
+ 18 + 512 * sizeof (short) / sizeof (int) + 528,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 544,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 560,
+ 18 + 512 * sizeof (short) / sizeof (int) + 576,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 592,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 608,
+ 18 + 512 * sizeof (short) / sizeof (int) + 624,
+ 18 + 512 * sizeof (short) / sizeof (int) + 640,
+ 18 + 512 * sizeof (short) / sizeof (int) + 656,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 672,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 400,
+ 18 + 512 * sizeof (short) / sizeof (int) + 672
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF9FFFFFF, 0x00030003, 0x0000401F,
+ 0x00000000, 0x00000000, 0x00000000, 0xBFCF0000,
+ 0xFFFFFF4F, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC07, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0000FBFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0xEBFFFFFF, 0xFF01DE01, 0xFFFFFFF3,
+ 0xFFFFFFFD, 0xEFFFFFFF, 0xFFFFDFE1, 0xF7F3FFF3,
+ 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFDC679, 0xFFDCFFFF,
+ 0xFFFFFFF9, 0xEFFFFFFF, 0xFFFFDE41, 0xFFFDFFF3,
+ 0xFFFFFFFD, 0x6FFFFFFF, 0xFFBFDFE1, 0xFFFFFFF3,
+ 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFDFFE, 0xF807FFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFF9FC23E, 0x80FFFFF3,
+ 0xFFFFFFFF, 0xEFFFFFFF, 0xFFFFCFFF, 0xFFFFFFF3,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFDFE1, 0xFFFFFFF3,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFA3FBFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x780DFFFF, 0xFFFF807F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xE40DFFFF, 0xFFFFC0FF, 0xFFFFFFFF,
+ 0xFCFFFFFF, 0xC15FFFFF, 0xFFFFFFFF, 0x8001FFFF,
+ 0x01001F20, 0xE0000000, 0xFFFFFFBF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE,
+ 0xDFFFDF9B, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF,
+ 0xFC00FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE7FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFE3FFFF, 0xFFE3FFFF, 0xFFF3FFFF, 0xFFF3FFFF,
+ 0xFFFFFFFF, 0xC07FFFFF, 0xD7F001BF, 0xFC00FFFF,
+ 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFDFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF1FBFE78, 0xFFFFFFCE, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x00000000,
+ 0xFE7FFFFF, 0xFFFFFFFF, 0x80BFFFFF, 0x6007E01A,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFF0, 0xE82FFFFF, 0xFFFFFFFB, 0xFFF007FF,
+ 0xFFFFFFFC, 0xFFFFFCC3, 0xFFFFFFFF, 0xFFFC5CBF,
+ 0xFFFFFFFF, 0xFF300FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0008FFFF, 0xFFFFDE02,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x0FFFFF80,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x5FFFFFFF, 0x1FFF1FFC, 0x9FFF1FFF,
+ 0x00004000, 0x00000000, 0x00000000, 0x800E0000,
+ 0xFFFF8000, 0xFC000000, 0x0000FFFF, 0xFFFE0000,
+ 0x3E2FFC84, 0xF3FFBD50, 0x0000C3E0, 0xFFFFFFFF,
+ 0x0000FDFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00200000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0xF0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00001000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002800, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x01FC781F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE1FFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFF0,
+ 0x9FFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x8FFFFFFF,
+ 0xFFFFFFFF, 0x0001FFFF, 0xFFFF0FFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF87FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0000FFFF, 0x00000000, 0xFFFFFF80, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FF07FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFCFFFF,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFEFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFF7BB, 0xFCFFF09F, 0xFFFFFFFF, 0xFF0FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFEF, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFC03F, 0xFFFC007F, 0xFFFFFFFF,
+ 0xFFFFFFF8, 0xEC37FFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFF9981FF, 0xFFFFEFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFDEDF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x1FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00008080,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0xFFFFFFFF, 0xDFFFFFFF,
+ 0xFFFFFFFD, 0x00FFFFFF, 0x0003FF80, 0xFFFFFFC0,
+ 0xFFFFFFFC, 0xF987FFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0007FC7F,
+ 0xFFFFF018, 0xFFFFC3FF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFFF,
+ 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFF7FFF, 0xFFFFFFFF,
+ 0xFFFFFDFF, 0xFFFFFFFF, 0x00003FF7, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0x80018000, 0x00010001, 0xFFFFFFFF,
+ 0xFFFFF800, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000,
+ 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000,
+ 0x00000000, 0x80000000, 0x00000002, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0xE1000000,
+ 0x00000000, 0xC0000010, 0x0000FFFF, 0xFFFFFF00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c
new file mode 100644
index 0000000..4f20ca4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_non_spacing_mark table. */
+#include "pr_bidi_non_spacing_mark.h"
+
+bool
+uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_non_spacing_mark, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_NSM);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK =
+ { &uc_is_property_bidi_non_spacing_mark };
diff --git a/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h
new file mode 100644
index 0000000..50c5d5f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_non_spacing_mark.h
@@ -0,0 +1,532 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[27 << 4];
+ }
+u_property_bidi_non_spacing_mark =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFFFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0x14000000, 0x00FE21FE, 0x0000000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x10000000, 0x00003000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x20002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x7F400000, 0x9FF81FE5,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x0003A340,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000007, 0x13C80000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0xC19D0000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002120,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000003, 0x06780000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_other_neutral.c b/gnulib/lib/unictype/pr_bidi_other_neutral.c
new file mode 100644
index 0000000..a798717
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_other_neutral.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_other_neutral table. */
+#include "pr_bidi_other_neutral.h"
+
+bool
+uc_is_property_bidi_other_neutral (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_other_neutral, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_other_neutral (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_ON);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL =
+ { &uc_is_property_bidi_other_neutral };
diff --git a/gnulib/lib/unictype/pr_bidi_other_neutral.h b/gnulib/lib/unictype/pr_bidi_other_neutral.h
new file mode 100644
index 0000000..995d2ff
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_other_neutral.h
@@ -0,0 +1,435 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[38 << 4];
+ }
+u_property_bidi_other_neutral =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 544,
+ 3 + 256 * sizeof (short) / sizeof (int) + 560,
+ 3 + 256 * sizeof (short) / sizeof (int) + 576,
+ 3 + 256 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0xF80007C6, 0xF8000001, 0x78000001,
+ 0x00000000, 0xF9D0DBC2, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x06000000, 0xFFFCFFFC, 0xFFFFBFE0,
+ 0x00000000, 0x00000000, 0x00000000, 0x40300000,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00400000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C0C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x40000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03C00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x05F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000031, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0xFFFF0000, 0xFFE000FF, 0x7FFFFFEF, 0x70000000,
+ 0x00007000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC1D0037B, 0x0C0002AF, 0xFFFF3C1F, 0x00000000,
+ 0xFFFF0200, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFF3FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0xF8000000,
+ 0xFFDFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0x000000FF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFEFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFE0007E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x0003FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFF1E, 0xE0C10001, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x0000000F,
+ 0x60000000, 0x00000000, 0xFFFF0000, 0x70000000,
+ 0x00000000, 0xFFFE0000, 0x0000F000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07800000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0x0000007F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0xC0080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x03FF0000, 0xFFFF0000, 0x7FD2FFFF, 0x00000973,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xF80007C6, 0xF8000001, 0xF8000001, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3E007F1C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC0000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000008, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFEFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFEF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_pdf.c b/gnulib/lib/unictype/pr_bidi_pdf.c
new file mode 100644
index 0000000..8276f43
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_pdf.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_pdf table. */
+#include "pr_bidi_pdf.h"
+
+bool
+uc_is_property_bidi_pdf (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_pdf, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_pdf (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_PDF);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_PDF =
+ { &uc_is_property_bidi_pdf };
diff --git a/gnulib/lib/unictype/pr_bidi_pdf.h b/gnulib/lib/unictype/pr_bidi_pdf.h
new file mode 100644
index 0000000..f32fe6f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_pdf.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_pdf =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00001000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_segment_separator.c b/gnulib/lib/unictype/pr_bidi_segment_separator.c
new file mode 100644
index 0000000..7c26550
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_segment_separator.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_segment_separator table. */
+#include "pr_bidi_segment_separator.h"
+
+bool
+uc_is_property_bidi_segment_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_segment_separator, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_segment_separator (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_S);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR =
+ { &uc_is_property_bidi_segment_separator };
diff --git a/gnulib/lib/unictype/pr_bidi_segment_separator.h b/gnulib/lib/unictype/pr_bidi_segment_separator.h
new file mode 100644
index 0000000..f35a725
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_segment_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_bidi_segment_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x80000A00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_bidi_whitespace.c b/gnulib/lib/unictype/pr_bidi_whitespace.c
new file mode 100644
index 0000000..1bfe6f0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_whitespace.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_bidi_whitespace table. */
+#include "pr_bidi_whitespace.h"
+
+bool
+uc_is_property_bidi_whitespace (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_bidi_whitespace, uc);
+}
+
+#else
+
+bool
+uc_is_property_bidi_whitespace (ucs4_t uc)
+{
+ return (uc_bidi_category (uc) == UC_BIDI_WS);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_BIDI_WHITESPACE =
+ { &uc_is_property_bidi_whitespace };
diff --git a/gnulib/lib/unictype/pr_bidi_whitespace.h b/gnulib/lib/unictype/pr_bidi_whitespace.h
new file mode 100644
index 0000000..ffec908
--- /dev/null
+++ b/gnulib/lib/unictype/pr_bidi_whitespace.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_bidi_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00001000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000100, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_byname.c b/gnulib/lib/unictype/pr_byname.c
new file mode 100644
index 0000000..94753ab
--- /dev/null
+++ b/gnulib/lib/unictype/pr_byname.c
@@ -0,0 +1,339 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2007, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Indices stored in the 'struct named_category' elements of the perfect hash
+ table. We don't use uc_general_category_t values or their addresses
+ directly, because this would introduce load-time relocations. */
+enum
+{
+ /* General. */
+ UC_PROPERTY_INDEX_WHITE_SPACE,
+ UC_PROPERTY_INDEX_ALPHABETIC,
+ UC_PROPERTY_INDEX_OTHER_ALPHABETIC,
+ UC_PROPERTY_INDEX_NOT_A_CHARACTER,
+ UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT,
+ UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT,
+ UC_PROPERTY_INDEX_DEPRECATED,
+ UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION,
+ UC_PROPERTY_INDEX_VARIATION_SELECTOR,
+ UC_PROPERTY_INDEX_PRIVATE_USE,
+ UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE,
+ /* Case. */
+ UC_PROPERTY_INDEX_UPPERCASE,
+ UC_PROPERTY_INDEX_OTHER_UPPERCASE,
+ UC_PROPERTY_INDEX_LOWERCASE,
+ UC_PROPERTY_INDEX_OTHER_LOWERCASE,
+ UC_PROPERTY_INDEX_TITLECASE,
+ UC_PROPERTY_INDEX_CASED,
+ UC_PROPERTY_INDEX_CASE_IGNORABLE,
+ UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED,
+ UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED,
+ UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED,
+ UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED,
+ UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED,
+ UC_PROPERTY_INDEX_SOFT_DOTTED,
+ /* Identifiers. */
+ UC_PROPERTY_INDEX_ID_START,
+ UC_PROPERTY_INDEX_OTHER_ID_START,
+ UC_PROPERTY_INDEX_ID_CONTINUE,
+ UC_PROPERTY_INDEX_OTHER_ID_CONTINUE,
+ UC_PROPERTY_INDEX_XID_START,
+ UC_PROPERTY_INDEX_XID_CONTINUE,
+ UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE,
+ UC_PROPERTY_INDEX_PATTERN_SYNTAX,
+ /* Shaping and rendering. */
+ UC_PROPERTY_INDEX_JOIN_CONTROL,
+ UC_PROPERTY_INDEX_GRAPHEME_BASE,
+ UC_PROPERTY_INDEX_GRAPHEME_EXTEND,
+ UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND,
+ UC_PROPERTY_INDEX_GRAPHEME_LINK,
+ /* Bidi. */
+ UC_PROPERTY_INDEX_BIDI_CONTROL,
+ UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT,
+ UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT,
+ UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT,
+ UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT,
+ UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR,
+ UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR,
+ UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT,
+ UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR,
+ UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR,
+ UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR,
+ UC_PROPERTY_INDEX_BIDI_WHITESPACE,
+ UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK,
+ UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL,
+ UC_PROPERTY_INDEX_BIDI_PDF,
+ UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE,
+ UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL,
+ /* Numeric. */
+ UC_PROPERTY_INDEX_HEX_DIGIT,
+ UC_PROPERTY_INDEX_ASCII_HEX_DIGIT,
+ /* CJK. */
+ UC_PROPERTY_INDEX_IDEOGRAPHIC,
+ UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH,
+ UC_PROPERTY_INDEX_RADICAL,
+ UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR,
+ UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR,
+ /* Misc. */
+ UC_PROPERTY_INDEX_ZERO_WIDTH,
+ UC_PROPERTY_INDEX_SPACE,
+ UC_PROPERTY_INDEX_NON_BREAK,
+ UC_PROPERTY_INDEX_ISO_CONTROL,
+ UC_PROPERTY_INDEX_FORMAT_CONTROL,
+ UC_PROPERTY_INDEX_DASH,
+ UC_PROPERTY_INDEX_HYPHEN,
+ UC_PROPERTY_INDEX_PUNCTUATION,
+ UC_PROPERTY_INDEX_LINE_SEPARATOR,
+ UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR,
+ UC_PROPERTY_INDEX_QUOTATION_MARK,
+ UC_PROPERTY_INDEX_SENTENCE_TERMINAL,
+ UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION,
+ UC_PROPERTY_INDEX_CURRENCY_SYMBOL,
+ UC_PROPERTY_INDEX_MATH,
+ UC_PROPERTY_INDEX_OTHER_MATH,
+ UC_PROPERTY_INDEX_PAIRED_PUNCTUATION,
+ UC_PROPERTY_INDEX_LEFT_OF_PAIR,
+ UC_PROPERTY_INDEX_COMBINING,
+ UC_PROPERTY_INDEX_COMPOSITE,
+ UC_PROPERTY_INDEX_DECIMAL_DIGIT,
+ UC_PROPERTY_INDEX_NUMERIC,
+ UC_PROPERTY_INDEX_DIACRITIC,
+ UC_PROPERTY_INDEX_EXTENDER,
+ UC_PROPERTY_INDEX_IGNORABLE_CONTROL
+};
+
+/* Get gperf generated lookup function. */
+#include "unictype/pr_byname.h"
+
+static const uc_property_t UC_PROPERTY_NONE = { NULL };
+
+uc_property_t
+uc_property_byname (const char *property_name)
+{
+ char buf[MAX_WORD_LENGTH + 1];
+ const char *cp;
+ char *bp;
+ unsigned int count;
+ const struct named_property *found;
+
+ for (cp = property_name, bp = buf, count = MAX_WORD_LENGTH + 1; ; cp++, bp++)
+ {
+ unsigned char c = (unsigned char) *cp;
+ if (c >= 0x80)
+ goto invalid;
+ if (c >= 'A' && c <= 'Z')
+ c += 'a' - 'A';
+ else if (c == ' ' || c == '-')
+ c = '_';
+ *bp = c;
+ if (c == '\0')
+ break;
+ if (--count == 0)
+ goto invalid;
+ }
+ found = uc_property_lookup (buf, bp - buf);
+ if (found != NULL)
+ /* Use a 'switch' statement here, because a table would introduce load-time
+ relocations. */
+ switch (found->property_index)
+ {
+ case UC_PROPERTY_INDEX_WHITE_SPACE:
+ return UC_PROPERTY_WHITE_SPACE;
+ case UC_PROPERTY_INDEX_ALPHABETIC:
+ return UC_PROPERTY_ALPHABETIC;
+ case UC_PROPERTY_INDEX_OTHER_ALPHABETIC:
+ return UC_PROPERTY_OTHER_ALPHABETIC;
+ case UC_PROPERTY_INDEX_NOT_A_CHARACTER:
+ return UC_PROPERTY_NOT_A_CHARACTER;
+ case UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT:
+ return UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
+ case UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT:
+ return UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
+ case UC_PROPERTY_INDEX_DEPRECATED:
+ return UC_PROPERTY_DEPRECATED;
+ case UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION:
+ return UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
+ case UC_PROPERTY_INDEX_VARIATION_SELECTOR:
+ return UC_PROPERTY_VARIATION_SELECTOR;
+ case UC_PROPERTY_INDEX_PRIVATE_USE:
+ return UC_PROPERTY_PRIVATE_USE;
+ case UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE:
+ return UC_PROPERTY_UNASSIGNED_CODE_VALUE;
+ case UC_PROPERTY_INDEX_UPPERCASE:
+ return UC_PROPERTY_UPPERCASE;
+ case UC_PROPERTY_INDEX_OTHER_UPPERCASE:
+ return UC_PROPERTY_OTHER_UPPERCASE;
+ case UC_PROPERTY_INDEX_LOWERCASE:
+ return UC_PROPERTY_LOWERCASE;
+ case UC_PROPERTY_INDEX_OTHER_LOWERCASE:
+ return UC_PROPERTY_OTHER_LOWERCASE;
+ case UC_PROPERTY_INDEX_TITLECASE:
+ return UC_PROPERTY_TITLECASE;
+ case UC_PROPERTY_INDEX_CASED:
+ return UC_PROPERTY_CASED;
+ case UC_PROPERTY_INDEX_CASE_IGNORABLE:
+ return UC_PROPERTY_CASE_IGNORABLE;
+ case UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED:
+ return UC_PROPERTY_CHANGES_WHEN_LOWERCASED;
+ case UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED:
+ return UC_PROPERTY_CHANGES_WHEN_UPPERCASED;
+ case UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED:
+ return UC_PROPERTY_CHANGES_WHEN_TITLECASED;
+ case UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED:
+ return UC_PROPERTY_CHANGES_WHEN_CASEFOLDED;
+ case UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED:
+ return UC_PROPERTY_CHANGES_WHEN_CASEMAPPED;
+ case UC_PROPERTY_INDEX_SOFT_DOTTED:
+ return UC_PROPERTY_SOFT_DOTTED;
+ case UC_PROPERTY_INDEX_ID_START:
+ return UC_PROPERTY_ID_START;
+ case UC_PROPERTY_INDEX_OTHER_ID_START:
+ return UC_PROPERTY_OTHER_ID_START;
+ case UC_PROPERTY_INDEX_ID_CONTINUE:
+ return UC_PROPERTY_ID_CONTINUE;
+ case UC_PROPERTY_INDEX_OTHER_ID_CONTINUE:
+ return UC_PROPERTY_OTHER_ID_CONTINUE;
+ case UC_PROPERTY_INDEX_XID_START:
+ return UC_PROPERTY_XID_START;
+ case UC_PROPERTY_INDEX_XID_CONTINUE:
+ return UC_PROPERTY_XID_CONTINUE;
+ case UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE:
+ return UC_PROPERTY_PATTERN_WHITE_SPACE;
+ case UC_PROPERTY_INDEX_PATTERN_SYNTAX:
+ return UC_PROPERTY_PATTERN_SYNTAX;
+ case UC_PROPERTY_INDEX_JOIN_CONTROL:
+ return UC_PROPERTY_JOIN_CONTROL;
+ case UC_PROPERTY_INDEX_GRAPHEME_BASE:
+ return UC_PROPERTY_GRAPHEME_BASE;
+ case UC_PROPERTY_INDEX_GRAPHEME_EXTEND:
+ return UC_PROPERTY_GRAPHEME_EXTEND;
+ case UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND:
+ return UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
+ case UC_PROPERTY_INDEX_GRAPHEME_LINK:
+ return UC_PROPERTY_GRAPHEME_LINK;
+ case UC_PROPERTY_INDEX_BIDI_CONTROL:
+ return UC_PROPERTY_BIDI_CONTROL;
+ case UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT:
+ return UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
+ case UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT:
+ return UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
+ case UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT:
+ return UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
+ case UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT:
+ return UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
+ case UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR:
+ return UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
+ case UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR:
+ return UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
+ case UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT:
+ return UC_PROPERTY_BIDI_ARABIC_DIGIT;
+ case UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR:
+ return UC_PROPERTY_BIDI_COMMON_SEPARATOR;
+ case UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR:
+ return UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
+ case UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR:
+ return UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
+ case UC_PROPERTY_INDEX_BIDI_WHITESPACE:
+ return UC_PROPERTY_BIDI_WHITESPACE;
+ case UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK:
+ return UC_PROPERTY_BIDI_NON_SPACING_MARK;
+ case UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL:
+ return UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
+ case UC_PROPERTY_INDEX_BIDI_PDF:
+ return UC_PROPERTY_BIDI_PDF;
+ case UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE:
+ return UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
+ case UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL:
+ return UC_PROPERTY_BIDI_OTHER_NEUTRAL;
+ case UC_PROPERTY_INDEX_HEX_DIGIT:
+ return UC_PROPERTY_HEX_DIGIT;
+ case UC_PROPERTY_INDEX_ASCII_HEX_DIGIT:
+ return UC_PROPERTY_ASCII_HEX_DIGIT;
+ case UC_PROPERTY_INDEX_IDEOGRAPHIC:
+ return UC_PROPERTY_IDEOGRAPHIC;
+ case UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH:
+ return UC_PROPERTY_UNIFIED_IDEOGRAPH;
+ case UC_PROPERTY_INDEX_RADICAL:
+ return UC_PROPERTY_RADICAL;
+ case UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR:
+ return UC_PROPERTY_IDS_BINARY_OPERATOR;
+ case UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR:
+ return UC_PROPERTY_IDS_TRINARY_OPERATOR;
+ case UC_PROPERTY_INDEX_ZERO_WIDTH:
+ return UC_PROPERTY_ZERO_WIDTH;
+ case UC_PROPERTY_INDEX_SPACE:
+ return UC_PROPERTY_SPACE;
+ case UC_PROPERTY_INDEX_NON_BREAK:
+ return UC_PROPERTY_NON_BREAK;
+ case UC_PROPERTY_INDEX_ISO_CONTROL:
+ return UC_PROPERTY_ISO_CONTROL;
+ case UC_PROPERTY_INDEX_FORMAT_CONTROL:
+ return UC_PROPERTY_FORMAT_CONTROL;
+ case UC_PROPERTY_INDEX_DASH:
+ return UC_PROPERTY_DASH;
+ case UC_PROPERTY_INDEX_HYPHEN:
+ return UC_PROPERTY_HYPHEN;
+ case UC_PROPERTY_INDEX_PUNCTUATION:
+ return UC_PROPERTY_PUNCTUATION;
+ case UC_PROPERTY_INDEX_LINE_SEPARATOR:
+ return UC_PROPERTY_LINE_SEPARATOR;
+ case UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR:
+ return UC_PROPERTY_PARAGRAPH_SEPARATOR;
+ case UC_PROPERTY_INDEX_QUOTATION_MARK:
+ return UC_PROPERTY_QUOTATION_MARK;
+ case UC_PROPERTY_INDEX_SENTENCE_TERMINAL:
+ return UC_PROPERTY_SENTENCE_TERMINAL;
+ case UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION:
+ return UC_PROPERTY_TERMINAL_PUNCTUATION;
+ case UC_PROPERTY_INDEX_CURRENCY_SYMBOL:
+ return UC_PROPERTY_CURRENCY_SYMBOL;
+ case UC_PROPERTY_INDEX_MATH:
+ return UC_PROPERTY_MATH;
+ case UC_PROPERTY_INDEX_OTHER_MATH:
+ return UC_PROPERTY_OTHER_MATH;
+ case UC_PROPERTY_INDEX_PAIRED_PUNCTUATION:
+ return UC_PROPERTY_PAIRED_PUNCTUATION;
+ case UC_PROPERTY_INDEX_LEFT_OF_PAIR:
+ return UC_PROPERTY_LEFT_OF_PAIR;
+ case UC_PROPERTY_INDEX_COMBINING:
+ return UC_PROPERTY_COMBINING;
+ case UC_PROPERTY_INDEX_COMPOSITE:
+ return UC_PROPERTY_COMPOSITE;
+ case UC_PROPERTY_INDEX_DECIMAL_DIGIT:
+ return UC_PROPERTY_DECIMAL_DIGIT;
+ case UC_PROPERTY_INDEX_NUMERIC:
+ return UC_PROPERTY_NUMERIC;
+ case UC_PROPERTY_INDEX_DIACRITIC:
+ return UC_PROPERTY_DIACRITIC;
+ case UC_PROPERTY_INDEX_EXTENDER:
+ return UC_PROPERTY_EXTENDER;
+ case UC_PROPERTY_INDEX_IGNORABLE_CONTROL:
+ return UC_PROPERTY_IGNORABLE_CONTROL;
+ default:
+ abort ();
+ }
+ invalid:
+ return UC_PROPERTY_NONE;
+}
diff --git a/gnulib/lib/unictype/pr_byname.gperf b/gnulib/lib/unictype/pr_byname.gperf
new file mode 100644
index 0000000..9c2031b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_byname.gperf
@@ -0,0 +1,218 @@
+struct named_property { int name; int property_index; };
+%struct-type
+%language=ANSI-C
+%define hash-function-name properties_hash
+%define lookup-function-name uc_property_lookup
+%7bit
+%readonly-tables
+%global-table
+%define word-array-name properties
+%pic
+%define string-pool-name properties_stringpool
+%%
+white_space, UC_PROPERTY_INDEX_WHITE_SPACE
+whitespace, UC_PROPERTY_INDEX_WHITE_SPACE
+wspace, UC_PROPERTY_INDEX_WHITE_SPACE
+alphabetic, UC_PROPERTY_INDEX_ALPHABETIC
+alpha, UC_PROPERTY_INDEX_ALPHABETIC
+other_alphabetic, UC_PROPERTY_INDEX_OTHER_ALPHABETIC
+otheralphabetic, UC_PROPERTY_INDEX_OTHER_ALPHABETIC
+oalpha, UC_PROPERTY_INDEX_OTHER_ALPHABETIC
+not_a_character, UC_PROPERTY_INDEX_NOT_A_CHARACTER
+notacharacter, UC_PROPERTY_INDEX_NOT_A_CHARACTER
+default_ignorable_code_point, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT
+defaultignorablecodepoint, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT
+di, UC_PROPERTY_INDEX_DEFAULT_IGNORABLE_CODE_POINT
+other_default_ignorable_code_point, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT
+otherdefaultignorablecodepoint, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT
+odi, UC_PROPERTY_INDEX_OTHER_DEFAULT_IGNORABLE_CODE_POINT
+deprecated, UC_PROPERTY_INDEX_DEPRECATED
+dep, UC_PROPERTY_INDEX_DEPRECATED
+logical_order_exception, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION
+logicalorderexception, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION
+loe, UC_PROPERTY_INDEX_LOGICAL_ORDER_EXCEPTION
+variation_selector, UC_PROPERTY_INDEX_VARIATION_SELECTOR
+variationselector, UC_PROPERTY_INDEX_VARIATION_SELECTOR
+vs, UC_PROPERTY_INDEX_VARIATION_SELECTOR
+private_use, UC_PROPERTY_INDEX_PRIVATE_USE
+privateuse, UC_PROPERTY_INDEX_PRIVATE_USE
+unassigned_code_value, UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE
+unassignedcodevalue, UC_PROPERTY_INDEX_UNASSIGNED_CODE_VALUE
+uppercase, UC_PROPERTY_INDEX_UPPERCASE
+upper, UC_PROPERTY_INDEX_UPPERCASE
+other_uppercase, UC_PROPERTY_INDEX_OTHER_UPPERCASE
+otheruppercase, UC_PROPERTY_INDEX_OTHER_UPPERCASE
+oupper, UC_PROPERTY_INDEX_OTHER_UPPERCASE
+lowercase, UC_PROPERTY_INDEX_LOWERCASE
+lower, UC_PROPERTY_INDEX_LOWERCASE
+other_lowercase, UC_PROPERTY_INDEX_OTHER_LOWERCASE
+otherlowercase, UC_PROPERTY_INDEX_OTHER_LOWERCASE
+olower, UC_PROPERTY_INDEX_OTHER_LOWERCASE
+titlecase, UC_PROPERTY_INDEX_TITLECASE
+cased, UC_PROPERTY_INDEX_CASED
+case_ignorable, UC_PROPERTY_INDEX_CASE_IGNORABLE
+caseignorable, UC_PROPERTY_INDEX_CASE_IGNORABLE
+ci, UC_PROPERTY_INDEX_CASE_IGNORABLE
+changes_when_lowercased, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED
+changeswhenlowercased, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED
+cwl, UC_PROPERTY_INDEX_CHANGES_WHEN_LOWERCASED
+changes_when_uppercased, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED
+changeswhenuppercased, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED
+cwu, UC_PROPERTY_INDEX_CHANGES_WHEN_UPPERCASED
+changes_when_titlecased, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED
+changeswhentitlecased, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED
+cwt, UC_PROPERTY_INDEX_CHANGES_WHEN_TITLECASED
+changes_when_casefolded, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED
+changeswhencasefolded, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED
+cwcf, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEFOLDED
+changes_when_casemapped, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED
+changeswhencasemapped, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED
+cwcm, UC_PROPERTY_INDEX_CHANGES_WHEN_CASEMAPPED
+soft_dotted, UC_PROPERTY_INDEX_SOFT_DOTTED
+softdotted, UC_PROPERTY_INDEX_SOFT_DOTTED
+sd, UC_PROPERTY_INDEX_SOFT_DOTTED
+id_start, UC_PROPERTY_INDEX_ID_START
+idstart, UC_PROPERTY_INDEX_ID_START
+ids, UC_PROPERTY_INDEX_ID_START
+other_id_start, UC_PROPERTY_INDEX_OTHER_ID_START
+otheridstart, UC_PROPERTY_INDEX_OTHER_ID_START
+oids, UC_PROPERTY_INDEX_OTHER_ID_START
+id_continue, UC_PROPERTY_INDEX_ID_CONTINUE
+idcontinue, UC_PROPERTY_INDEX_ID_CONTINUE
+idc, UC_PROPERTY_INDEX_ID_CONTINUE
+other_id_continue, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE
+otheridcontinue, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE
+oidc, UC_PROPERTY_INDEX_OTHER_ID_CONTINUE
+xid_start, UC_PROPERTY_INDEX_XID_START
+xidstart, UC_PROPERTY_INDEX_XID_START
+xids, UC_PROPERTY_INDEX_XID_START
+xid_continue, UC_PROPERTY_INDEX_XID_CONTINUE
+xidcontinue, UC_PROPERTY_INDEX_XID_CONTINUE
+xidc, UC_PROPERTY_INDEX_XID_CONTINUE
+pattern_white_space, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE
+patternwhitespace, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE
+pat_ws, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE
+patws, UC_PROPERTY_INDEX_PATTERN_WHITE_SPACE
+pattern_syntax, UC_PROPERTY_INDEX_PATTERN_SYNTAX
+patternsyntax, UC_PROPERTY_INDEX_PATTERN_SYNTAX
+pat_syn, UC_PROPERTY_INDEX_PATTERN_SYNTAX
+patsyn, UC_PROPERTY_INDEX_PATTERN_SYNTAX
+join_control, UC_PROPERTY_INDEX_JOIN_CONTROL
+joincontrol, UC_PROPERTY_INDEX_JOIN_CONTROL
+join_c, UC_PROPERTY_INDEX_JOIN_CONTROL
+joinc, UC_PROPERTY_INDEX_JOIN_CONTROL
+grapheme_base, UC_PROPERTY_INDEX_GRAPHEME_BASE
+graphemebase, UC_PROPERTY_INDEX_GRAPHEME_BASE
+gr_base, UC_PROPERTY_INDEX_GRAPHEME_BASE
+grbase, UC_PROPERTY_INDEX_GRAPHEME_BASE
+grapheme_extend, UC_PROPERTY_INDEX_GRAPHEME_EXTEND
+graphemeextend, UC_PROPERTY_INDEX_GRAPHEME_EXTEND
+gr_ext, UC_PROPERTY_INDEX_GRAPHEME_EXTEND
+grext, UC_PROPERTY_INDEX_GRAPHEME_EXTEND
+other_grapheme_extend, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND
+othergraphemeextend, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND
+ogr_ext, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND
+ogrext, UC_PROPERTY_INDEX_OTHER_GRAPHEME_EXTEND
+grapheme_link, UC_PROPERTY_INDEX_GRAPHEME_LINK
+graphemelink, UC_PROPERTY_INDEX_GRAPHEME_LINK
+gr_link, UC_PROPERTY_INDEX_GRAPHEME_LINK
+grlink, UC_PROPERTY_INDEX_GRAPHEME_LINK
+bidi_control, UC_PROPERTY_INDEX_BIDI_CONTROL
+bidicontrol, UC_PROPERTY_INDEX_BIDI_CONTROL
+bidi_c, UC_PROPERTY_INDEX_BIDI_CONTROL
+bidic, UC_PROPERTY_INDEX_BIDI_CONTROL
+bidi_left_to_right, UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT
+bidilefttoright, UC_PROPERTY_INDEX_BIDI_LEFT_TO_RIGHT
+bidi_hebrew_right_to_left, UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT
+bidihebrewrighttoleft, UC_PROPERTY_INDEX_BIDI_HEBREW_RIGHT_TO_LEFT
+bidi_arabic_right_to_left, UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT
+bidiarabicrighttoleft, UC_PROPERTY_INDEX_BIDI_ARABIC_RIGHT_TO_LEFT
+bidi_european_digit, UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT
+bidieuropeandigit, UC_PROPERTY_INDEX_BIDI_EUROPEAN_DIGIT
+bidi_eur_num_separator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR
+bidieurnumseparator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_SEPARATOR
+bidi_eur_num_terminator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR
+bidieurnumterminator, UC_PROPERTY_INDEX_BIDI_EUR_NUM_TERMINATOR
+bidi_arabic_digit, UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT
+bidiarabicdigit, UC_PROPERTY_INDEX_BIDI_ARABIC_DIGIT
+bidi_common_separator, UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR
+bidicommonseparator, UC_PROPERTY_INDEX_BIDI_COMMON_SEPARATOR
+bidi_block_separator, UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR
+bidiblockseparator, UC_PROPERTY_INDEX_BIDI_BLOCK_SEPARATOR
+bidi_segment_separator, UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR
+bidisegmentseparator, UC_PROPERTY_INDEX_BIDI_SEGMENT_SEPARATOR
+bidi_whitespace, UC_PROPERTY_INDEX_BIDI_WHITESPACE
+bidiwhitespace, UC_PROPERTY_INDEX_BIDI_WHITESPACE
+bidi_non_spacing_mark, UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK
+bidinonspacingmark, UC_PROPERTY_INDEX_BIDI_NON_SPACING_MARK
+bidi_boundary_neutral, UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL
+bidiboundaryneutral, UC_PROPERTY_INDEX_BIDI_BOUNDARY_NEUTRAL
+bidi_pdf, UC_PROPERTY_INDEX_BIDI_PDF
+bidipdf, UC_PROPERTY_INDEX_BIDI_PDF
+bidi_embedding_or_override, UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE
+bidiembeddingoroverride, UC_PROPERTY_INDEX_BIDI_EMBEDDING_OR_OVERRIDE
+bidi_other_neutral, UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL
+bidiotherneutral, UC_PROPERTY_INDEX_BIDI_OTHER_NEUTRAL
+hex_digit, UC_PROPERTY_INDEX_HEX_DIGIT
+hexdigit, UC_PROPERTY_INDEX_HEX_DIGIT
+hex, UC_PROPERTY_INDEX_HEX_DIGIT
+ascii_hex_digit, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT
+asciihexdigit, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT
+ahex, UC_PROPERTY_INDEX_ASCII_HEX_DIGIT
+ideographic, UC_PROPERTY_INDEX_IDEOGRAPHIC
+ideo, UC_PROPERTY_INDEX_IDEOGRAPHIC
+unified_ideograph, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH
+unifiedideograph, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH
+uideo, UC_PROPERTY_INDEX_UNIFIED_IDEOGRAPH
+radical, UC_PROPERTY_INDEX_RADICAL
+ids_binary_operator, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR
+idsbinaryoperator, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR
+idsb, UC_PROPERTY_INDEX_IDS_BINARY_OPERATOR
+ids_trinary_operator, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR
+idstrinaryoperator, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR
+idst, UC_PROPERTY_INDEX_IDS_TRINARY_OPERATOR
+zero_width, UC_PROPERTY_INDEX_ZERO_WIDTH
+zerowidth, UC_PROPERTY_INDEX_ZERO_WIDTH
+space, UC_PROPERTY_INDEX_SPACE
+non_break, UC_PROPERTY_INDEX_NON_BREAK
+nonbreak, UC_PROPERTY_INDEX_NON_BREAK
+iso_control, UC_PROPERTY_INDEX_ISO_CONTROL
+isocontrol, UC_PROPERTY_INDEX_ISO_CONTROL
+format_control, UC_PROPERTY_INDEX_FORMAT_CONTROL
+formatcontrol, UC_PROPERTY_INDEX_FORMAT_CONTROL
+dash, UC_PROPERTY_INDEX_DASH
+hyphen, UC_PROPERTY_INDEX_HYPHEN
+punctuation, UC_PROPERTY_INDEX_PUNCTUATION
+line_separator, UC_PROPERTY_INDEX_LINE_SEPARATOR
+lineseparator, UC_PROPERTY_INDEX_LINE_SEPARATOR
+paragraph_separator, UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR
+paragraphseparator, UC_PROPERTY_INDEX_PARAGRAPH_SEPARATOR
+quotation_mark, UC_PROPERTY_INDEX_QUOTATION_MARK
+quotationmark, UC_PROPERTY_INDEX_QUOTATION_MARK
+qmark, UC_PROPERTY_INDEX_QUOTATION_MARK
+sentence_terminal, UC_PROPERTY_INDEX_SENTENCE_TERMINAL
+sentenceterminal, UC_PROPERTY_INDEX_SENTENCE_TERMINAL
+terminal_punctuation, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION
+terminalpunctuation, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION
+term, UC_PROPERTY_INDEX_TERMINAL_PUNCTUATION
+currency_symbol, UC_PROPERTY_INDEX_CURRENCY_SYMBOL
+currencysymbol, UC_PROPERTY_INDEX_CURRENCY_SYMBOL
+math, UC_PROPERTY_INDEX_MATH
+other_math, UC_PROPERTY_INDEX_OTHER_MATH
+othermath, UC_PROPERTY_INDEX_OTHER_MATH
+omath, UC_PROPERTY_INDEX_OTHER_MATH
+paired_punctuation, UC_PROPERTY_INDEX_PAIRED_PUNCTUATION
+pairedpunctuation, UC_PROPERTY_INDEX_PAIRED_PUNCTUATION
+left_of_pair, UC_PROPERTY_INDEX_LEFT_OF_PAIR
+leftofpair, UC_PROPERTY_INDEX_LEFT_OF_PAIR
+combining, UC_PROPERTY_INDEX_COMBINING
+composite, UC_PROPERTY_INDEX_COMPOSITE
+decimal_digit, UC_PROPERTY_INDEX_DECIMAL_DIGIT
+decimaldigit, UC_PROPERTY_INDEX_DECIMAL_DIGIT
+numeric, UC_PROPERTY_INDEX_NUMERIC
+diacritic, UC_PROPERTY_INDEX_DIACRITIC
+dia, UC_PROPERTY_INDEX_DIACRITIC
+extender, UC_PROPERTY_INDEX_EXTENDER
+ext, UC_PROPERTY_INDEX_EXTENDER
+ignorable_control, UC_PROPERTY_INDEX_IGNORABLE_CONTROL
+ignorablecontrol, UC_PROPERTY_INDEX_IGNORABLE_CONTROL
diff --git a/gnulib/lib/unictype/pr_case_ignorable.c b/gnulib/lib/unictype/pr_case_ignorable.c
new file mode 100644
index 0000000..d9c0a49
--- /dev/null
+++ b/gnulib/lib/unictype/pr_case_ignorable.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_case_ignorable table. */
+#include "pr_case_ignorable.h"
+
+bool
+uc_is_property_case_ignorable (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_case_ignorable, uc);
+}
+
+const uc_property_t UC_PROPERTY_CASE_IGNORABLE =
+ { &uc_is_property_case_ignorable };
diff --git a/gnulib/lib/unictype/pr_case_ignorable.h b/gnulib/lib/unictype/pr_case_ignorable.h
new file mode 100644
index 0000000..15f2472
--- /dev/null
+++ b/gnulib/lib/unictype/pr_case_ignorable.h
@@ -0,0 +1,552 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[32 << 4];
+ }
+u_property_case_ignorable =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 464,
+ 16 + 384 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x04004080, 0x40000000, 0x00000001,
+ 0x00000000, 0x0190A100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0430FFFF,
+ 0x000000B0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00100000,
+ 0x07FF000F, 0x00000000, 0xFFFFF801, 0x00010000,
+ 0x00000000, 0x00000000, 0xBFC00000, 0x00003DFF,
+ 0x00028000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x043FF800,
+ 0xFFC00000, 0x00003FFF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0x14000000, 0x00FE21FE, 0x0002000C,
+ 0x00000002, 0x10000000, 0x0000201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0x90000000, 0x0040201E, 0x0000000C,
+ 0x00000004, 0x00000000, 0x00002001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00003040, 0x0000000C,
+ 0x00000000, 0x00000000, 0x0000201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x005C0400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007FC0, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F40, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x20002064, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3FB00000, 0x208FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x7F400000, 0x9FF81FE5,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x0003A340,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003,
+ 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x0300F800, 0x00007C90, 0x00000000, 0x8002FC1F,
+ 0x1FFF0000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80008000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x083EFC00, 0x00000000, 0x00000000,
+ 0x7E000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0xB0078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0xFFFFFFFF, 0x00000003, 0x00000000, 0x00010000,
+ 0x00000700, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000007, 0x13C80000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00010000,
+ 0x00000000, 0xC19D0000, 0x20000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002120,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000003, 0x00000000,
+ 0x0008FFFF, 0x0000007F, 0x00240000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x04004080, 0x40000000, 0x00000001, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x0E000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000003, 0x26780000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF80380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_cased.c b/gnulib/lib/unictype/pr_cased.c
new file mode 100644
index 0000000..075ebd0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_cased.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_cased table. */
+#include "pr_cased.h"
+
+bool
+uc_is_property_cased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_cased, uc);
+}
+
+const uc_property_t UC_PROPERTY_CASED =
+ { &uc_is_property_cased };
diff --git a/gnulib/lib/unictype/pr_cased.h b/gnulib/lib/unictype/pr_cased.h
new file mode 100644
index 0000000..96ae141
--- /dev/null
+++ b/gnulib/lib/unictype/pr_cased.h
@@ -0,0 +1,343 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[15 << 4];
+ }
+u_property_cased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xF7FFFFFF, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3CCF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x007FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E2FFC84, 0xF21FBD50, 0x000043E0, 0xFFFFFFFF,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000378FF, 0x000003FF, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_changes_when_casefolded.c b/gnulib/lib/unictype/pr_changes_when_casefolded.c
new file mode 100644
index 0000000..df2d089
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_casefolded.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_changes_when_casefolded table. */
+#include "pr_changes_when_casefolded.h"
+
+bool
+uc_is_property_changes_when_casefolded (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_changes_when_casefolded, uc);
+}
+
+const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED =
+ { &uc_is_property_changes_when_casefolded };
diff --git a/gnulib/lib/unictype/pr_changes_when_casefolded.h b/gnulib/lib/unictype/pr_changes_when_casefolded.h
new file mode 100644
index 0000000..44393b4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_casefolded.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_property_changes_when_casefolded =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00200000, 0xFF7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555556AA, 0xAB555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAADB0, 0x55D65555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x55638004, 0xE6B35555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x4C155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0xFFFFFFFF, 0x1F9CFFFF, 0x0F001F9C, 0x1F9C1F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00040C40, 0x00000000, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0xC025EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00002805,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001555,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00012855, 0x00000155, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_changes_when_casemapped.c b/gnulib/lib/unictype/pr_changes_when_casemapped.c
new file mode 100644
index 0000000..83ed258
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_casemapped.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_changes_when_casemapped table. */
+#include "pr_changes_when_casemapped.h"
+
+bool
+uc_is_property_changes_when_casemapped (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_changes_when_casemapped, uc);
+}
+
+const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED =
+ { &uc_is_property_changes_when_casemapped };
diff --git a/gnulib/lib/unictype/pr_changes_when_casemapped.h b/gnulib/lib/unictype/pr_changes_when_casemapped.h
new file mode 100644
index 0000000..34f528c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_casemapped.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_changes_when_casemapped =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x00200000, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xF7FFDFFF, 0xB3FFF3FF, 0xFFFFFFF0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFC0FFFFD, 0x0ADFFFFF, 0x20268B29,
+ 0x00041F09, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x38CF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFE3FFFF, 0xEFB7FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x007FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x4FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00040C40, 0x00004000, 0xFFFFFFFF,
+ 0x00000018, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xC06DFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000780F,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00003FFF,
+ 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFCFFFC, 0xFFFFFFFF, 0xFE00FFFF,
+ 0x000338FF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_changes_when_lowercased.c b/gnulib/lib/unictype/pr_changes_when_lowercased.c
new file mode 100644
index 0000000..5a2deb8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_lowercased.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_changes_when_lowercased table. */
+#include "pr_changes_when_lowercased.h"
+
+bool
+uc_is_property_changes_when_lowercased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_changes_when_lowercased, uc);
+}
+
+const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED =
+ { &uc_is_property_changes_when_lowercased };
diff --git a/gnulib/lib/unictype/pr_changes_when_lowercased.h b/gnulib/lib/unictype/pr_changes_when_lowercased.h
new file mode 100644
index 0000000..57e62ed
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_lowercased.h
@@ -0,0 +1,327 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[11 << 4];
+ }
+u_property_changes_when_lowercased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAADB0, 0x55D65555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x55008000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0xFF00FF00, 0x1F00FF00, 0x0F001F00, 0x1F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00040C40, 0x00000000, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0xC025EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00002805,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001555,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00012855, 0x00000155, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_changes_when_titlecased.c b/gnulib/lib/unictype/pr_changes_when_titlecased.c
new file mode 100644
index 0000000..6613e85
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_titlecased.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_changes_when_titlecased table. */
+#include "pr_changes_when_titlecased.h"
+
+bool
+uc_is_property_changes_when_titlecased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_changes_when_titlecased, uc);
+}
+
+const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED =
+ { &uc_is_property_changes_when_titlecased };
diff --git a/gnulib/lib/unictype/pr_changes_when_titlecased.h b/gnulib/lib/unictype/pr_changes_when_titlecased.h
new file mode 100644
index 0000000..d0b6cd7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_titlecased.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_property_changes_when_titlecased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x00200000, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x54AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x46241129, 0xA251212A, 0xB55556D0, 0xAA2BAAAA,
+ 0xAAAAAAAA, 0x900AAAA8, 0x0ADFAA85, 0x20268B29,
+ 0x00041F09, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x388A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x0927AAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x0FEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00004000, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x00481562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000500A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA,
+ 0x000210AA, 0x000002AA, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_changes_when_uppercased.c b/gnulib/lib/unictype/pr_changes_when_uppercased.c
new file mode 100644
index 0000000..82a59c6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_uppercased.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_changes_when_uppercased table. */
+#include "pr_changes_when_uppercased.h"
+
+bool
+uc_is_property_changes_when_uppercased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_changes_when_uppercased, uc);
+}
+
+const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED =
+ { &uc_is_property_changes_when_uppercased };
diff --git a/gnulib/lib/unictype/pr_changes_when_uppercased.h b/gnulib/lib/unictype/pr_changes_when_uppercased.h
new file mode 100644
index 0000000..849bdc8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_changes_when_uppercased.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_property_changes_when_uppercased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x00200000, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x54AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x46241129, 0xA251212A, 0xB5555B60, 0xAA2DAAAA,
+ 0xAAAAAAAA, 0x900AAAA8, 0x0ADFAA85, 0x20268B29,
+ 0x00041F09, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x388A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x0927AAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x22000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x0FEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0xFFFFFFFF, 0x50DFFFFF, 0x00CF10DC, 0x10DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00004000, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x00481562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000500A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA8AAA8, 0xAAAAAAAA, 0x9400AAAA,
+ 0x000210AA, 0x000002AA, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_combining.c b/gnulib/lib/unictype/pr_combining.c
new file mode 100644
index 0000000..5620877
--- /dev/null
+++ b/gnulib/lib/unictype/pr_combining.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_combining table. */
+#include "pr_combining.h"
+
+bool
+uc_is_property_combining (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_combining, uc);
+}
+
+const uc_property_t UC_PROPERTY_COMBINING =
+ { &uc_is_property_combining };
diff --git a/gnulib/lib/unictype/pr_combining.h b/gnulib/lib/unictype/pr_combining.h
new file mode 100644
index 0000000..c920b3a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_combining.h
@@ -0,0 +1,532 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[27 << 4];
+ }
+u_property_combining =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFFFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0xDC000000, 0x00FEFFFF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x0080399F, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00023987, 0x00230000,
+ 0x0000000E, 0xD0000000, 0x00003BBF, 0x0000000C,
+ 0x0000000E, 0xD0000000, 0x00C0399F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00803DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xD0000000, 0x00603DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00803DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8400, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0xFFFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x7FFFF800, 0xC3C00000, 0x001E3F9D,
+ 0x3C00BFFC, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x200FFFFF, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0FFF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x7FE00000, 0x9FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFF00000, 0x0000001F, 0x000FF800,
+ 0x00000007, 0x000007FE, 0x00000000, 0x000FFFC0,
+ 0x00000000, 0x00FFFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000421FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000001F, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x000FFF80, 0x00000000,
+ 0x0000000F, 0xFFF80000, 0x00000001, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x08000000,
+ 0x00000000, 0xC19D0000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000037F8,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000007, 0x07FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_composite.c b/gnulib/lib/unictype/pr_composite.c
new file mode 100644
index 0000000..d12ab65
--- /dev/null
+++ b/gnulib/lib/unictype/pr_composite.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_composite table. */
+#include "pr_composite.h"
+
+bool
+uc_is_property_composite (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_composite, uc);
+}
+
+const uc_property_t UC_PROPERTY_COMPOSITE =
+ { &uc_is_property_composite };
diff --git a/gnulib/lib/unictype/pr_composite.h b/gnulib/lib/unictype/pr_composite.h
new file mode 100644
index 0000000..890af97
--- /dev/null
+++ b/gnulib/lib/unictype/pr_composite.h
@@ -0,0 +1,387 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[26 << 4];
+ }
+u_property_composite =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x70000000, 0x3E7EFFBF, 0xBE7EFFBF,
+ 0xFFFCFFFF, 0xFEFDFF3F, 0xFFF3F3F9, 0x7FFFFF3F,
+ 0x00000000, 0x00018003, 0xDFFFFFF0, 0xFF3FFFCF,
+ 0xCFFFFFFF, 0x000FFFC0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x0001D760, 0x0001FC00, 0x00187C00, 0x00000000,
+ 0x0200708B, 0x02000000, 0x708B0000, 0x00C00000,
+ 0x00000000, 0x00000000, 0xFCCF0006, 0x033FFCFC,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000007C, 0x00000000, 0x01E00000,
+ 0x00000000, 0x00000000, 0x00080005, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00120200, 0xFF000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xB0001800, 0x00000000,
+ 0x00000000, 0x00480000, 0x4E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x30001900, 0x00000000,
+ 0x00100000, 0x00000000, 0x00001C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000100, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000D81, 0x00000000,
+ 0x00000000, 0x00000000, 0x00001C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x74000000, 0x00000000,
+ 0x00000000, 0x00080000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00080000, 0x30000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x10842008, 0x03E80200,
+ 0x20080002, 0x02001084, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000040, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00045540, 0x28000000, 0x0000000B, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x1555FFFF,
+ 0xFFFFFFFF, 0x17DFFFFF, 0xE7C7F5DE, 0x15DC37F7,
+ 0x00000000, 0x10D80060, 0x00800380, 0x00000000,
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x0040026B, 0x08000007, 0xFFFF0000, 0x0DEE0DEE,
+ 0x0C000200, 0x00004000, 0x0000E000, 0x00000000,
+ 0x00001210, 0x0001B050, 0x00000292, 0x0333E005,
+ 0x00000333, 0x0000F000, 0x00000000, 0x00003C0F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFE00,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00700000,
+ 0x00000000, 0x00000000, 0x10000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555000, 0x36DB02A5,
+ 0xC0100000, 0x55555000, 0x36DB02A5, 0xC7900000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFF000F, 0x7FFFC000,
+ 0x00000000, 0xFFFE0000, 0x0000FFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0000001F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xA0F8007F, 0x5F7FFC00, 0x0000FFDB, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FFFFC00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x1FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xAA820000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x14000000, 0x00000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x0000001F,
+ 0x00000000, 0xF8000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF07FF, 0x000067FF, 0x0000FC00, 0x00000000,
+ 0x00010000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_currency_symbol.c b/gnulib/lib/unictype/pr_currency_symbol.c
new file mode 100644
index 0000000..8418f68
--- /dev/null
+++ b/gnulib/lib/unictype/pr_currency_symbol.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_currency_symbol table. */
+#include "pr_currency_symbol.h"
+
+bool
+uc_is_property_currency_symbol (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_currency_symbol, uc);
+}
+
+#else
+
+bool
+uc_is_property_currency_symbol (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Sc);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL =
+ { &uc_is_property_currency_symbol };
diff --git a/gnulib/lib/unictype/pr_currency_symbol.h b/gnulib/lib/unictype/pr_currency_symbol.h
new file mode 100644
index 0000000..79219a7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_currency_symbol.h
@@ -0,0 +1,192 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_currency_symbol =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144
+ },
+ {
+ 0x00000000, 0x00000010, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000003C, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x080C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x08000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000200,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000063
+ }
+};
diff --git a/gnulib/lib/unictype/pr_dash.c b/gnulib/lib/unictype/pr_dash.c
new file mode 100644
index 0000000..c2b6b32
--- /dev/null
+++ b/gnulib/lib/unictype/pr_dash.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_dash table. */
+#include "pr_dash.h"
+
+bool
+uc_is_property_dash (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_dash, uc);
+}
+
+const uc_property_t UC_PROPERTY_DASH =
+ { &uc_is_property_dash };
diff --git a/gnulib/lib/unictype/pr_dash.h b/gnulib/lib/unictype/pr_dash.h
new file mode 100644
index 0000000..6df9fbb
--- /dev/null
+++ b/gnulib/lib/unictype/pr_dash.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_dash =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003F0000, 0x00000000, 0x00080000, 0x08000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00040000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x04800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x10000000, 0x00010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00060000, 0x01000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_decimal_digit.c b/gnulib/lib/unictype/pr_decimal_digit.c
new file mode 100644
index 0000000..b44acf1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_decimal_digit.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_decimal_digit table. */
+#include "pr_decimal_digit.h"
+
+bool
+uc_is_property_decimal_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_decimal_digit, uc);
+}
+
+#else
+
+bool
+uc_is_property_decimal_digit (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Nd);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_DECIMAL_DIGIT =
+ { &uc_is_property_decimal_digit };
diff --git a/gnulib/lib/unictype/pr_decimal_digit.h b/gnulib/lib/unictype/pr_decimal_digit.h
new file mode 100644
index 0000000..980a867
--- /dev/null
+++ b/gnulib/lib/unictype/pr_decimal_digit.h
@@ -0,0 +1,355 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[18 << 4];
+ }
+u_property_decimal_digit =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF03FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_default_ignorable_code_point.c b/gnulib/lib/unictype/pr_default_ignorable_code_point.c
new file mode 100644
index 0000000..95529f8
--- /dev/null
+++ b/gnulib/lib/unictype/pr_default_ignorable_code_point.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_default_ignorable_code_point table. */
+#include "pr_default_ignorable_code_point.h"
+
+bool
+uc_is_property_default_ignorable_code_point (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_default_ignorable_code_point, uc);
+}
+
+const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT =
+ { &uc_is_property_default_ignorable_code_point };
diff --git a/gnulib/lib/unictype/pr_default_ignorable_code_point.h b/gnulib/lib/unictype/pr_default_ignorable_code_point.h
new file mode 100644
index 0000000..6c5470f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_default_ignorable_code_point.h
@@ -0,0 +1,464 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_default_ignorable_code_point =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000010,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x01FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_deprecated.c b/gnulib/lib/unictype/pr_deprecated.c
new file mode 100644
index 0000000..e514269
--- /dev/null
+++ b/gnulib/lib/unictype/pr_deprecated.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_deprecated table. */
+#include "pr_deprecated.h"
+
+bool
+uc_is_property_deprecated (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_deprecated, uc);
+}
+
+const uc_property_t UC_PROPERTY_DEPRECATED =
+ { &uc_is_property_deprecated };
diff --git a/gnulib/lib/unictype/pr_deprecated.h b/gnulib/lib/unictype/pr_deprecated.h
new file mode 100644
index 0000000..4bb6261
--- /dev/null
+++ b/gnulib/lib/unictype/pr_deprecated.h
@@ -0,0 +1,324 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_deprecated =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 64,
+ 16 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000200, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000018, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_diacritic.c b/gnulib/lib/unictype/pr_diacritic.c
new file mode 100644
index 0000000..9ea3b47
--- /dev/null
+++ b/gnulib/lib/unictype/pr_diacritic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_diacritic table. */
+#include "pr_diacritic.h"
+
+bool
+uc_is_property_diacritic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_diacritic, uc);
+}
+
+const uc_property_t UC_PROPERTY_DIACRITIC =
+ { &uc_is_property_diacritic };
diff --git a/gnulib/lib/unictype/pr_diacritic.h b/gnulib/lib/unictype/pr_diacritic.h
new file mode 100644
index 0000000..494bc08
--- /dev/null
+++ b/gnulib/lib/unictype/pr_diacritic.h
@@ -0,0 +1,379 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[24 << 4];
+ }
+u_property_diacritic =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000001,
+ 0x00000000, 0x01908100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xE0FF7FFF, 0x04300007,
+ 0x00000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000000F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x02000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFB, 0x00000016, 0x00000000,
+ 0x00000000, 0x00000000, 0x0187F800, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00001C61,
+ 0x00000000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x003FF800,
+ 0x03000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x10000000, 0x001E2000, 0x00020000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x10000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000400, 0x00000000,
+ 0x00000000, 0x00000000, 0x00005F80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00001F00, 0x00000000,
+ 0x03000000, 0xC2A00000, 0x00000000, 0x00000000,
+ 0x000000DC, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x06800000, 0x00000000, 0x00000000,
+ 0x0C00BF80, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x200FFE00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x9FE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00100000, 0x00000010, 0x000FF800,
+ 0x00000000, 0x00000400, 0x00000000, 0x00000000,
+ 0x00000000, 0x00C00000, 0x00000000, 0x3F000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000021FF,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x000007FF,
+ 0x00000000, 0x00000000, 0x0000FFF0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xA0000000, 0xE000E003, 0x6000E000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x1E000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xB0008000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0xFF800000, 0x00000003, 0x00000000, 0x00000000,
+ 0x00000100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00007800, 0x00080000, 0x00000000,
+ 0x00000000, 0x00080000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x80000000, 0x00000007, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000001, 0x00010000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x06000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E380,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_extender.c b/gnulib/lib/unictype/pr_extender.c
new file mode 100644
index 0000000..0808584
--- /dev/null
+++ b/gnulib/lib/unictype/pr_extender.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_extender table. */
+#include "pr_extender.h"
+
+bool
+uc_is_property_extender (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_extender, uc);
+}
+
+const uc_property_t UC_PROPERTY_EXTENDER =
+ { &uc_is_property_extender };
diff --git a/gnulib/lib/unictype/pr_extender.h b/gnulib/lib/unictype/pr_extender.h
new file mode 100644
index 0000000..21f6e56
--- /dev/null
+++ b/gnulib/lib/unictype/pr_extender.h
@@ -0,0 +1,204 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_extender =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 144,
+ 2 + 128 * sizeof (short) / sizeof (int) + 160,
+ 2 + 128 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 192
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00030000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000008, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00400000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x003E0000, 0x00000000, 0x00000000,
+ 0x60000000, 0x00000000, 0x00000000, 0x70000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00200000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_format_control.c b/gnulib/lib/unictype/pr_format_control.c
new file mode 100644
index 0000000..cc40888
--- /dev/null
+++ b/gnulib/lib/unictype/pr_format_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_format_control table. */
+#include "pr_format_control.h"
+
+bool
+uc_is_property_format_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_format_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_FORMAT_CONTROL =
+ { &uc_is_property_format_control };
diff --git a/gnulib/lib/unictype/pr_format_control.h b/gnulib/lib/unictype/pr_format_control.h
new file mode 100644
index 0000000..42298d1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_format_control.h
@@ -0,0 +1,440 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_format_control =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000800, 0x00000000, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_base.c b/gnulib/lib/unictype/pr_grapheme_base.c
new file mode 100644
index 0000000..f2b4e13
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_base.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_base table. */
+#include "pr_grapheme_base.h"
+
+bool
+uc_is_property_grapheme_base (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_base, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_BASE =
+ { &uc_is_property_grapheme_base };
diff --git a/gnulib/lib/unictype/pr_grapheme_base.h b/gnulib/lib/unictype/pr_grapheme_base.h
new file mode 100644
index 0000000..f7f9cec
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_base.h
@@ -0,0 +1,652 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[60 << 4];
+ }
+u_property_grapheme_base =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 768,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 784,
+ 4 + 384 * sizeof (short) / sizeof (int) + 800,
+ 4 + 384 * sizeof (short) / sizeof (int) + 816,
+ 4 + 384 * sizeof (short) / sizeof (int) + 832,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 848,
+ 4 + 384 * sizeof (short) / sizeof (int) + 864,
+ 4 + 384 * sizeof (short) / sizeof (int) + 880,
+ 4 + 384 * sizeof (short) / sizeof (int) + 896,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 912,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 928,
+ 4 + 384 * sizeof (short) / sizeof (int) + 944,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 944,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0x00000000, 0xFFFFDFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x7CFF0000,
+ 0xFFFFD7F0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC07, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0xFE7FFFFF, 0xFFFFFFFE,
+ 0x000006FF, 0x40000000, 0xFFFF0049, 0x001F07FF,
+ 0xC800FFC0, 0xFFFFFFFF, 0x000007FF, 0xFFFEFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x403FFFFF, 0xFFFFC260,
+ 0xFFFD3FFF, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFFFF, 0x07F007FF,
+ 0x043FFFFF, 0x7FFF0110, 0x41FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0xEBFFFFFF, 0xFF01DE01, 0xFEFFFFF3,
+ 0xFFF99FEC, 0xA3C5FDFF, 0xB0005981, 0x0FFFFFC3,
+ 0xFFF987E8, 0xC36DFDFF, 0x5E000001, 0x001CFFC0,
+ 0xFFFBBFE8, 0xE3EDFDFF, 0x00011A01, 0x0002FFC3,
+ 0xFFF99FEC, 0x23EDFDFF, 0xB0001981, 0x00FFFFC3,
+ 0xD63DC7E8, 0x83FFC718, 0x00011DC6, 0x07FFFFC0,
+ 0xFFFDDFEE, 0x23EFFDFF, 0x0300001E, 0xFF00FFC3,
+ 0xFFFDDFEC, 0x63EFFDFF, 0x40000D9B, 0x0006FFC3,
+ 0xFFFDDFEC, 0xA7FFFFFF, 0x00005DC1, 0xFE3FFFC3,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0x7F03007F, 0x001C0000,
+ 0xFFFFFFFE, 0x800DFFFF, 0x0FFF807F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x33FF005F, 0x00000000,
+ 0xFCFFFFFF, 0xFD5FFFFF, 0xFFFFFEFF, 0x80001FFF,
+ 0x00001F20, 0xC0000000, 0x07FFDFBF, 0x00000000,
+ 0xFFFFFFFF, 0x99021FFF, 0x3CFFFFFF, 0xFFE1FFFE,
+ 0xDFFFDF9B, 0xFFFFFFFF, 0xFFFF003F, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x1FFFFFFF,
+ 0x03FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001FFFF,
+ 0x0003DFFF, 0x0063FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0xC04FFFFF, 0x1FF001BF, 0x03FF03FF,
+ 0x03FF47FF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x01FB0E78, 0xFFFFFFF1, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xC7FF03FF, 0xFFFFFFFF,
+ 0xCE7FFFFF, 0xFFFFFFFF, 0x00BFFFFF, 0x0007E01A,
+ 0x03FF03FF, 0x00003FFF, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0xE82FFFFF, 0xFFFF0FFB, 0x1FF007FF,
+ 0xFFFFFFFC, 0x03FFC4C3, 0xFFFFFFFF, 0xF00C5CBF,
+ 0xFFFFFFFF, 0xF8300FFF, 0xFFFFE3FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00080000, 0x0007DE02,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFDFFFFF, 0xEFCFFFDF, 0x7FDCFFFF,
+ 0xFFFF07FF, 0xFFFF80FF, 0xFFFFFFFF, 0xFFF30000,
+ 0x1FFF7FFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF03FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x0000007F, 0x000007FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF1FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFE007FFF,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0001803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0xFFFFFFFF, 0x0003FFFF, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x0FFF0000,
+ 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xF87FFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF7FFF, 0x07FFFFFF, 0xFFFFFFFF, 0xFFFF000F,
+ 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0xFFFFFFFF, 0xFFFF007F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x00000FFF, 0xFFFFFFFF, 0xC0087FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FCFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00037FFF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x03FF0F9F, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFC00F, 0x0FFC0000,
+ 0xFFFFFFFF, 0xFFFFC03F, 0x800C007F, 0x1FFFFFFF,
+ 0xFFFFFFF8, 0xEC37FFFF, 0xC3FFBFFF, 0x00000000,
+ 0xFFFFFFFF, 0x001981FF, 0xF3FF2FF7, 0x0FFFFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0xF8000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF1EDF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFFFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFF80003, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x3FFF0000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0xFFDF0F7F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x30007F7F,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0xFFFFFF87, 0xFF8FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x0FFF07FF, 0x00000000, 0xFFFF0000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF000F, 0x000007FF, 0x00000000,
+ 0xBFFFFFFF, 0xFFFFFFFF, 0x003FFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0xFFBFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8FFFFFFF, 0x83FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x01FF00FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFE3FFFFF, 0xFF3FFFFF, 0xFF07FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFD, 0x00FFFFFF, 0xFFFC3F80, 0x0000FFFF,
+ 0xFFFFFFFC, 0xD987FFFF, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000F0007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFFFFFFF, 0xFFFFFE7F, 0xFFFFFFFF, 0x00003C5F,
+ 0xFFFFF018, 0xFFFFC3FF, 0x3FFFFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000023, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000FFFFF, 0x7FFE7FFF, 0xFFFEFFFE, 0x00000000,
+ 0xFFFF07FF, 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFF03FF,
+ 0x07FFFFFF, 0x00000000, 0x00000000, 0xFFFFFFC0,
+ 0xFFFF0007, 0x07FFFFFF, 0x000301FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFBF0001, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x000FFFFF, 0xFFFFFFFF, 0x000007DF, 0x0001FFFF,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1EFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0x000000FF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x755DFFFE, 0xFFEF2F3F, 0x0000FFE1, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_extend.c b/gnulib/lib/unictype/pr_grapheme_extend.c
new file mode 100644
index 0000000..9c69b76
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_extend.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_extend table. */
+#include "pr_grapheme_extend.h"
+
+bool
+uc_is_property_grapheme_extend (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_extend, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND =
+ { &uc_is_property_grapheme_extend };
diff --git a/gnulib/lib/unictype/pr_grapheme_extend.h b/gnulib/lib/unictype/pr_grapheme_extend.h
new file mode 100644
index 0000000..f6c570b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_extend.h
@@ -0,0 +1,532 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[27 << 4];
+ }
+u_property_grapheme_extend =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000003F8, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFE0000, 0xBFFFFFFF, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFFFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x9FC00000, 0x00003D9F,
+ 0x00020000, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x000FF800,
+ 0xFBC00000, 0x00003EEF, 0x0E000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0x14000000, 0x00FE21FE, 0x0000000C,
+ 0x00000002, 0x50000000, 0x0080201E, 0x0000000C,
+ 0x00000006, 0x10000000, 0x00023986, 0x00230000,
+ 0x00000006, 0x10000000, 0x000021BE, 0x0000000C,
+ 0x00000002, 0xD0000000, 0x00C0201E, 0x0000000C,
+ 0x00000004, 0x40000000, 0x00802001, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00603DC1, 0x0000000C,
+ 0x00000000, 0x90000000, 0x00603044, 0x0000000C,
+ 0x00000000, 0x40000000, 0x0080201E, 0x0000000C,
+ 0x00000000, 0x00000000, 0x805C8400, 0x00000000,
+ 0x00000000, 0x07F20000, 0x00007F80, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00003F00, 0x00000000,
+ 0x03000000, 0x02A00000, 0x00000000, 0x7FFE0000,
+ 0xFEFFE0DF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0x00000000, 0x66FDE000, 0xC3000000, 0x001E0001,
+ 0x20002064, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001C0000, 0x001C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0x3F800000, 0x200FFE40, 0x00000000,
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x0E040187, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01800000, 0x00000000, 0x7F400000, 0x9FF81FE5,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x17D00000, 0x00000004, 0x000FF800,
+ 0x00000003, 0x0000033C, 0x00000000, 0x0003A340,
+ 0x00000000, 0x00CFF000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x000021FD,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0xF000007F,
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0001FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00038000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x0000FC00, 0x00000000, 0x00000000,
+ 0x06000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x30078000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00030000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000844, 0x00000060, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x0003FFFF,
+ 0x00000000, 0x00003FC0, 0x0003FF80, 0x00000000,
+ 0x00000007, 0x13C80000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00667E00, 0x00001008, 0x00000000,
+ 0x00000000, 0xC19D0000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002120,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x0000007F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x0000F06E, 0x87000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFF000000, 0x0000007F, 0x00000000,
+ 0x00000003, 0x06780000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807C3A0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_grapheme_link.c b/gnulib/lib/unictype/pr_grapheme_link.c
new file mode 100644
index 0000000..0615d23
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_link.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_grapheme_link table. */
+#include "pr_grapheme_link.h"
+
+bool
+uc_is_property_grapheme_link (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_grapheme_link, uc);
+}
+
+const uc_property_t UC_PROPERTY_GRAPHEME_LINK =
+ { &uc_is_property_grapheme_link };
diff --git a/gnulib/lib/unictype/pr_grapheme_link.h b/gnulib/lib/unictype/pr_grapheme_link.h
new file mode 100644
index 0000000..32acdb1
--- /dev/null
+++ b/gnulib/lib/unictype/pr_grapheme_link.h
@@ -0,0 +1,331 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[12 << 4];
+ }
+u_property_grapheme_link =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000400, 0x00000000,
+ 0x00000000, 0x04000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x06000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00100000, 0x00100000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00040000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000400, 0x00000000, 0x000C0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000010, 0x00000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00002000,
+ 0x00000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000040, 0x00000000,
+ 0x00000000, 0x02000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_hex_digit.c b/gnulib/lib/unictype/pr_hex_digit.c
new file mode 100644
index 0000000..45640bc
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hex_digit.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_hex_digit table. */
+#include "pr_hex_digit.h"
+
+bool
+uc_is_property_hex_digit (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_hex_digit, uc);
+}
+
+const uc_property_t UC_PROPERTY_HEX_DIGIT =
+ { &uc_is_property_hex_digit };
diff --git a/gnulib/lib/unictype/pr_hex_digit.h b/gnulib/lib/unictype/pr_hex_digit.h
new file mode 100644
index 0000000..c459d00
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hex_digit.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_hex_digit =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x0000007E, 0x0000007E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x0000007E, 0x0000007E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_hyphen.c b/gnulib/lib/unictype/pr_hyphen.c
new file mode 100644
index 0000000..ad6031c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hyphen.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_hyphen table. */
+#include "pr_hyphen.h"
+
+bool
+uc_is_property_hyphen (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_hyphen, uc);
+}
+
+const uc_property_t UC_PROPERTY_HYPHEN =
+ { &uc_is_property_hyphen };
diff --git a/gnulib/lib/unictype/pr_hyphen.h b/gnulib/lib/unictype/pr_hyphen.h
new file mode 100644
index 0000000..2714ac9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_hyphen.h
@@ -0,0 +1,180 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_hyphen =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96
+ },
+ {
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000040, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00030000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000008,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000020,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_id_continue.c b/gnulib/lib/unictype/pr_id_continue.c
new file mode 100644
index 0000000..d2c58a5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_id_continue table. */
+#include "pr_id_continue.h"
+
+bool
+uc_is_property_id_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_id_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_ID_CONTINUE =
+ { &uc_is_property_id_continue };
diff --git a/gnulib/lib/unictype/pr_id_continue.h b/gnulib/lib/unictype/pr_id_continue.h
new file mode 100644
index 0000000..5bc130e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_continue.h
@@ -0,0 +1,756 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_property_id_continue =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 16 + 512 * sizeof (short) / sizeof (int) + 0,
+ 16 + 512 * sizeof (short) / sizeof (int) + 16,
+ 16 + 512 * sizeof (short) / sizeof (int) + 32,
+ 16 + 512 * sizeof (short) / sizeof (int) + 48,
+ 16 + 512 * sizeof (short) / sizeof (int) + 64,
+ 16 + 512 * sizeof (short) / sizeof (int) + 80,
+ 16 + 512 * sizeof (short) / sizeof (int) + 96,
+ 16 + 512 * sizeof (short) / sizeof (int) + 112,
+ 16 + 512 * sizeof (short) / sizeof (int) + 128,
+ 16 + 512 * sizeof (short) / sizeof (int) + 144,
+ 16 + 512 * sizeof (short) / sizeof (int) + 160,
+ 16 + 512 * sizeof (short) / sizeof (int) + 176,
+ 16 + 512 * sizeof (short) / sizeof (int) + 192,
+ 16 + 512 * sizeof (short) / sizeof (int) + 208,
+ 16 + 512 * sizeof (short) / sizeof (int) + 224,
+ 16 + 512 * sizeof (short) / sizeof (int) + 240,
+ 16 + 512 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 320,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 336,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 352,
+ 16 + 512 * sizeof (short) / sizeof (int) + 368,
+ 16 + 512 * sizeof (short) / sizeof (int) + 384,
+ 16 + 512 * sizeof (short) / sizeof (int) + 400,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 432,
+ 16 + 512 * sizeof (short) / sizeof (int) + 448,
+ 16 + 512 * sizeof (short) / sizeof (int) + 464,
+ 16 + 512 * sizeof (short) / sizeof (int) + 480,
+ 16 + 512 * sizeof (short) / sizeof (int) + 496,
+ 16 + 512 * sizeof (short) / sizeof (int) + 512,
+ 16 + 512 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 544,
+ 16 + 512 * sizeof (short) / sizeof (int) + 560,
+ 16 + 512 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 608,
+ 16 + 512 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 688,
+ 16 + 512 * sizeof (short) / sizeof (int) + 704,
+ 16 + 512 * sizeof (short) / sizeof (int) + 720,
+ 16 + 512 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 752,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 768,
+ 16 + 512 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04A00400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3CDFFFFF,
+ 0xFFFFD7C0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFCFB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF,
+ 0xFFFFFFFF, 0x00003FFF, 0x0FFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFEFFCF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0003FFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0000FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0002FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x0000FFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFC00FFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFFFFDF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x0003FE00,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF,
+ 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0x07FF03FF, 0x00000000,
+ 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF,
+ 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800,
+ 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x0007FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x80000000, 0x00100001, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003F81F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xFE7FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x08FFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF8001, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x0C7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x38000007, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF37FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x0000FFFF, 0x0018007F, 0x0000E000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x0000FFC0,
+ 0xFFFFFFFF, 0x07FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_id_start.c b/gnulib/lib/unictype/pr_id_start.c
new file mode 100644
index 0000000..2b12837
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_id_start table. */
+#include "pr_id_start.h"
+
+bool
+uc_is_property_id_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_id_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_ID_START =
+ { &uc_is_property_id_start };
diff --git a/gnulib/lib/unictype/pr_id_start.h b/gnulib/lib/unictype/pr_id_start.h
new file mode 100644
index 0000000..ecddf47
--- /dev/null
+++ b/gnulib/lib/unictype/pr_id_start.h
@@ -0,0 +1,604 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[48 << 4];
+ }
+u_property_id_start =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x3CDF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00060003,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x000DFFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x200DECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xF87FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x0FFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFDF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ideographic.c b/gnulib/lib/unictype/pr_ideographic.c
new file mode 100644
index 0000000..f97e092
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ideographic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ideographic table. */
+#include "pr_ideographic.h"
+
+bool
+uc_is_property_ideographic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ideographic, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDEOGRAPHIC =
+ { &uc_is_property_ideographic };
diff --git a/gnulib/lib/unictype/pr_ideographic.h b/gnulib/lib/unictype/pr_ideographic.h
new file mode 100644
index 0000000..e0f23d4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ideographic.h
@@ -0,0 +1,320 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_ideographic =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ 4 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 32,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 64,
+ 4 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 96,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 112,
+ 4 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1
+ },
+ {
+ 0x000000C0, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ids_binary_operator.c b/gnulib/lib/unictype/pr_ids_binary_operator.c
new file mode 100644
index 0000000..a59893f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_binary_operator.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ids_binary_operator table. */
+#include "pr_ids_binary_operator.h"
+
+bool
+uc_is_property_ids_binary_operator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ids_binary_operator, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR =
+ { &uc_is_property_ids_binary_operator };
diff --git a/gnulib/lib/unictype/pr_ids_binary_operator.h b/gnulib/lib/unictype/pr_ids_binary_operator.h
new file mode 100644
index 0000000..d559b60
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_binary_operator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ids_binary_operator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FF30000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ids_trinary_operator.c b/gnulib/lib/unictype/pr_ids_trinary_operator.c
new file mode 100644
index 0000000..3574250
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_trinary_operator.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ids_trinary_operator table. */
+#include "pr_ids_trinary_operator.h"
+
+bool
+uc_is_property_ids_trinary_operator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ids_trinary_operator, uc);
+}
+
+const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR =
+ { &uc_is_property_ids_trinary_operator };
diff --git a/gnulib/lib/unictype/pr_ids_trinary_operator.h b/gnulib/lib/unictype/pr_ids_trinary_operator.h
new file mode 100644
index 0000000..db1f752
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ids_trinary_operator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_ids_trinary_operator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_ignorable_control.c b/gnulib/lib/unictype/pr_ignorable_control.c
new file mode 100644
index 0000000..fe2b2b9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ignorable_control.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_ignorable_control table. */
+#include "pr_ignorable_control.h"
+
+bool
+uc_is_property_ignorable_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_ignorable_control, uc);
+}
+
+const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL =
+ { &uc_is_property_ignorable_control };
diff --git a/gnulib/lib/unictype/pr_ignorable_control.h b/gnulib/lib/unictype/pr_ignorable_control.h
new file mode 100644
index 0000000..a75a29c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_ignorable_control.h
@@ -0,0 +1,456 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_ignorable_control =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x0FFFC1FE, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFDF, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x20000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_iso_control.c b/gnulib/lib/unictype/pr_iso_control.c
new file mode 100644
index 0000000..3c1bd50
--- /dev/null
+++ b/gnulib/lib/unictype/pr_iso_control.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_iso_control table. */
+#include "pr_iso_control.h"
+
+bool
+uc_is_property_iso_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_iso_control, uc);
+}
+
+#else
+
+bool
+uc_is_property_iso_control (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Cc);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_ISO_CONTROL =
+ { &uc_is_property_iso_control };
diff --git a/gnulib/lib/unictype/pr_iso_control.h b/gnulib/lib/unictype/pr_iso_control.h
new file mode 100644
index 0000000..c12e04f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_iso_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_iso_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x80000000,
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_join_control.c b/gnulib/lib/unictype/pr_join_control.c
new file mode 100644
index 0000000..f3613a2
--- /dev/null
+++ b/gnulib/lib/unictype/pr_join_control.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_join_control table. */
+#include "pr_join_control.h"
+
+bool
+uc_is_property_join_control (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_join_control, uc);
+}
+
+#else
+
+bool
+uc_is_property_join_control (ucs4_t uc)
+{
+ return (uc >= 0x200C && uc <= 0x200D);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_JOIN_CONTROL =
+ { &uc_is_property_join_control };
diff --git a/gnulib/lib/unictype/pr_join_control.h b/gnulib/lib/unictype/pr_join_control.h
new file mode 100644
index 0000000..d3965a4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_join_control.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_join_control =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_left_of_pair.c b/gnulib/lib/unictype/pr_left_of_pair.c
new file mode 100644
index 0000000..4d92c85
--- /dev/null
+++ b/gnulib/lib/unictype/pr_left_of_pair.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_left_of_pair table. */
+#include "pr_left_of_pair.h"
+
+bool
+uc_is_property_left_of_pair (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_left_of_pair, uc);
+}
+
+const uc_property_t UC_PROPERTY_LEFT_OF_PAIR =
+ { &uc_is_property_left_of_pair };
diff --git a/gnulib/lib/unictype/pr_left_of_pair.h b/gnulib/lib/unictype/pr_left_of_pair.h
new file mode 100644
index 0000000..42c062d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_left_of_pair.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_left_of_pair =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00000100, 0x08000000, 0x08000000,
+ 0x00000000, 0x00000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x14000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x08000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xDD000000, 0x02000000, 0x00000020, 0x20000000,
+ 0x00002000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x25515500, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAA00000, 0x2A00000A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000100, 0x08000000, 0x08000000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_line_separator.c b/gnulib/lib/unictype/pr_line_separator.c
new file mode 100644
index 0000000..6688d47
--- /dev/null
+++ b/gnulib/lib/unictype/pr_line_separator.c
@@ -0,0 +1,55 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_line_separator table. */
+#include "pr_line_separator.h"
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_line_separator, uc);
+}
+
+#elif 0
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return uc_is_category_Zl (uc);
+}
+
+#else
+
+bool
+uc_is_property_line_separator (ucs4_t uc)
+{
+ return (uc == 0x2028);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_LINE_SEPARATOR =
+ { &uc_is_property_line_separator };
diff --git a/gnulib/lib/unictype/pr_line_separator.h b/gnulib/lib/unictype/pr_line_separator.h
new file mode 100644
index 0000000..518e3fe
--- /dev/null
+++ b/gnulib/lib/unictype/pr_line_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_line_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000100, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_logical_order_exception.c b/gnulib/lib/unictype/pr_logical_order_exception.c
new file mode 100644
index 0000000..44a6a00
--- /dev/null
+++ b/gnulib/lib/unictype/pr_logical_order_exception.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_logical_order_exception table. */
+#include "pr_logical_order_exception.h"
+
+bool
+uc_is_property_logical_order_exception (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_logical_order_exception, uc);
+}
+
+const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION =
+ { &uc_is_property_logical_order_exception };
diff --git a/gnulib/lib/unictype/pr_logical_order_exception.h b/gnulib/lib/unictype/pr_logical_order_exception.h
new file mode 100644
index 0000000..3592b41
--- /dev/null
+++ b/gnulib/lib/unictype/pr_logical_order_exception.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_logical_order_exception =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x1A600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_lowercase.c b/gnulib/lib/unictype/pr_lowercase.c
new file mode 100644
index 0000000..3dc0d96
--- /dev/null
+++ b/gnulib/lib/unictype/pr_lowercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_lowercase table. */
+#include "pr_lowercase.h"
+
+bool
+uc_is_property_lowercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_lowercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_LOWERCASE =
+ { &uc_is_property_lowercase };
diff --git a/gnulib/lib/unictype/pr_lowercase.h b/gnulib/lib/unictype/pr_lowercase.h
new file mode 100644
index 0000000..5f98c21
--- /dev/null
+++ b/gnulib/lib/unictype/pr_lowercase.h
@@ -0,0 +1,339 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[14 << 4];
+ }
+u_property_lowercase =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0x80000000, 0xFF7FFFFF,
+ 0xAAAAAAAA, 0x55AAAAAA, 0xAAAAAB55, 0xD4AAAAAA,
+ 0x4E243129, 0xE6512D2A, 0xB5555240, 0xAA29AAAA,
+ 0xAAAAAAAA, 0x93FAAAAA, 0xFFFFAA85, 0xFFFFFFFF,
+ 0xFFEFFFFF, 0x01FFFFFF, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x3C8A0000,
+ 0x00010000, 0xFFFFF000, 0xAAE37FFF, 0x192FAAAA,
+ 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xAAAAAAAA,
+ 0xAAAAA802, 0xAAAAAAAA, 0xAAAAD554, 0xAAAAAAAA,
+ 0xAAAAAAAA, 0x000000AA, 0x00000000, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0xBFEAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
+ 0x003F00FF, 0x00FF00FF, 0x00FF003F, 0x3FFF00FF,
+ 0x00FF00FF, 0x40DF00FF, 0x00CF00DC, 0x00DC00FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0008C400, 0x32108000, 0x000043C0, 0xFFFF0000,
+ 0x00000010, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x7FFFFFFF, 0x3FDA1562,
+ 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0x0000501A,
+ 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xAAAAAAAA, 0x00002AAA,
+ 0x00AAAAAA, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xAAABAAA8, 0xAAAAAAAA, 0x95FFAAAA,
+ 0x000250AA, 0x000002AA, 0x00000000, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00F8007F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFF00, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFC000000, 0x000FFFFF, 0xFFDFC000, 0x000000FF,
+ 0x0FFFFFFC, 0xEBC00000, 0x0000FFEF, 0xFFFFFC00,
+ 0xC000000F, 0x00FFFFFF, 0xFFFC0000, 0x00000FFF,
+ 0xFFFFFFC0, 0xFC000000, 0x000FFFFF, 0xFFFFC000,
+ 0x000000FF, 0x0FFFFFFC, 0xFFC00000, 0x0000FFFF,
+ 0xFFFFFC00, 0x0000003F, 0xF7FFFFFC, 0xF0000003,
+ 0x0FDFFFFF, 0xFFC00000, 0x003F7FFF, 0xFFFF0000,
+ 0x0000FDFF, 0xFFFFFC00, 0x00000BF7, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_math.c b/gnulib/lib/unictype/pr_math.c
new file mode 100644
index 0000000..15fbd75
--- /dev/null
+++ b/gnulib/lib/unictype/pr_math.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_math table. */
+#include "pr_math.h"
+
+bool
+uc_is_property_math (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_math, uc);
+}
+
+const uc_property_t UC_PROPERTY_MATH =
+ { &uc_is_property_math };
diff --git a/gnulib/lib/unictype/pr_math.h b/gnulib/lib/unictype/pr_math.h
new file mode 100644
index 0000000..e4bf2ce
--- /dev/null
+++ b/gnulib/lib/unictype/pr_math.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_math =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x70000800, 0x40000000, 0x50000000,
+ 0x00000000, 0x00021000, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00270000, 0x00730000,
+ 0x000001C0, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00400000, 0x001C0000, 0x00040011, 0x7C00001E,
+ 0x00007C00, 0x00000000, 0x1FFF0000, 0x0000F862,
+ 0x3F2FFC84, 0xF1FBB310, 0x00000BFF, 0x00000000,
+ 0xFFFF0000, 0xF0C37EFF, 0x2FFFFFFF, 0xFFF00030,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000F00, 0x00000003, 0x00000000, 0x10000000,
+ 0xF8000000, 0x00BFFFFF, 0xF0010000, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF0FFC003, 0x000F8CC3, 0xFF001F94,
+ 0x00000060, 0x00000000, 0x00000005, 0x0000E00F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFD7FF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF0000, 0x00001F9F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000017E,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x70000800, 0x50000000, 0x50000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00001E04,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFCFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_non_break.c b/gnulib/lib/unictype/pr_non_break.c
new file mode 100644
index 0000000..38e9824
--- /dev/null
+++ b/gnulib/lib/unictype/pr_non_break.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_non_break table. */
+#include "pr_non_break.h"
+
+bool
+uc_is_property_non_break (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_non_break, uc);
+}
+
+const uc_property_t UC_PROPERTY_NON_BREAK =
+ { &uc_is_property_non_break };
diff --git a/gnulib/lib/unictype/pr_non_break.h b/gnulib/lib/unictype/pr_non_break.h
new file mode 100644
index 0000000..e70ec82
--- /dev/null
+++ b/gnulib/lib/unictype/pr_non_break.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_non_break =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0008000, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00041100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00020080, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_not_a_character.c b/gnulib/lib/unictype/pr_not_a_character.c
new file mode 100644
index 0000000..07c6bc9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_not_a_character.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_not_a_character table. */
+#include "pr_not_a_character.h"
+
+bool
+uc_is_property_not_a_character (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_not_a_character, uc);
+}
+
+const uc_property_t UC_PROPERTY_NOT_A_CHARACTER =
+ { &uc_is_property_not_a_character };
diff --git a/gnulib/lib/unictype/pr_not_a_character.h b/gnulib/lib/unictype/pr_not_a_character.h
new file mode 100644
index 0000000..31f75b7
--- /dev/null
+++ b/gnulib/lib/unictype/pr_not_a_character.h
@@ -0,0 +1,306 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_not_a_character =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_numeric.c b/gnulib/lib/unictype/pr_numeric.c
new file mode 100644
index 0000000..192181d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_numeric.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_numeric table. */
+#include "pr_numeric.h"
+
+bool
+uc_is_property_numeric (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_numeric, uc);
+}
+
+const uc_property_t UC_PROPERTY_NUMERIC =
+ { &uc_is_property_numeric };
diff --git a/gnulib/lib/unictype/pr_numeric.h b/gnulib/lib/unictype/pr_numeric.h
new file mode 100644
index 0000000..4ab5e4f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_numeric.h
@@ -0,0 +1,552 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[35 << 4];
+ }
+u_property_numeric =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x720C0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F0FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FCFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x7F00FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x000FFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000003FF, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x1FFFFE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0001C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF03FF,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0x00000000,
+ 0x00000000, 0x00000000, 0x07FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF03FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x03FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF03FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03F10000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+ 0x000003EF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x0FFFFFFF, 0x00000000, 0x00000000, 0xFFFFFC00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x000FFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x070003FE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0xFFFE0000, 0x00000000,
+ 0x000003FF, 0xFFFE0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x003F0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x03FF0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01080800,
+ 0x00000000, 0x00040000, 0x000A0000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF80, 0x000FFFFF, 0xFFFFFFFF, 0x01FFFFFF,
+ 0x00000400, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000F, 0x00000402, 0x00000000,
+ 0x00000000, 0x00000000, 0x003E0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0FC00000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x000000FF, 0x60000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x7FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFC0000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFF3FFFF, 0xFF3FFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFC000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00010000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_alphabetic.c b/gnulib/lib/unictype/pr_other_alphabetic.c
new file mode 100644
index 0000000..b8c9efb
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_alphabetic.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_alphabetic table. */
+#include "pr_other_alphabetic.h"
+
+bool
+uc_is_property_other_alphabetic (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_alphabetic, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC =
+ { &uc_is_property_other_alphabetic };
diff --git a/gnulib/lib/unictype/pr_other_alphabetic.h b/gnulib/lib/unictype/pr_other_alphabetic.h
new file mode 100644
index 0000000..5348558
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_alphabetic.h
@@ -0,0 +1,363 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[20 << 4];
+ }
+u_property_other_alphabetic =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000020, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xBFFF0000, 0x000000B6, 0x00000000,
+ 0x07FF0000, 0x00000000, 0xFEFFF800, 0x00010000,
+ 0x00000000, 0x00000000, 0x1FC00000, 0x0000219E,
+ 0x00020000, 0xFFFF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FFC0, 0x00000000, 0x00000000,
+ 0xF8C00000, 0x00001EEF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0xCC000000, 0x00E0DFFF, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x0080199F, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x00021987, 0x00230000,
+ 0x0000000E, 0xC0000000, 0x00001BBF, 0x0000000C,
+ 0x0000000E, 0xC0000000, 0x00C0199F, 0x0000000C,
+ 0x00000004, 0xC0000000, 0x00801DC7, 0x00000000,
+ 0x0000000E, 0xC0000000, 0x00601DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00601DDF, 0x0000000C,
+ 0x0000000C, 0xC0000000, 0x00801DDF, 0x0000000C,
+ 0x0000000C, 0x00000000, 0xFF5F8000, 0x000C0000,
+ 0x00000000, 0x07F20000, 0x00002000, 0x00000000,
+ 0x00000000, 0x1BF20000, 0x00002000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFEFFE003, 0x1FFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x797FF800, 0xC3C00000, 0x001E0185,
+ 0x3000007C, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000C0000, 0x000C0000, 0x000C0000, 0x000C0000,
+ 0x00000000, 0xFFC00000, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FF0FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFF0000, 0x00000301, 0x00000000,
+ 0x0F800000, 0x00000000, 0x7FE00000, 0x001FFFFE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0xFFE00000, 0x0000000F, 0x00000000,
+ 0x00000007, 0x000003FE, 0x00000000, 0x0003FF80,
+ 0x00000000, 0x003FFFF0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00040000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0xFFFFFFFF, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
+ 0x00000000, 0x000000F8, 0x00000000, 0x00000000,
+ 0x00000003, 0xFFF00000, 0x0000000F, 0x00000000,
+ 0x00000000, 0x000007C0, 0x0007FF80, 0x00000000,
+ 0x0000000F, 0xFFF00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x007FFE00, 0x00003008, 0x00000000,
+ 0x00000000, 0x419D0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000007F8,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x40000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000F06E, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000007, 0xFF000000, 0x0000003F, 0x00000000,
+ 0x00000004, 0x01FF0000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c
new file mode 100644
index 0000000..11aac32
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_default_ignorable_code_point table. */
+#include "pr_other_default_ignorable_code_point.h"
+
+bool
+uc_is_property_other_default_ignorable_code_point (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_default_ignorable_code_point, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT =
+ { &uc_is_property_other_default_ignorable_code_point };
diff --git a/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h
new file mode 100644
index 0000000..8303ef6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_default_ignorable_code_point.h
@@ -0,0 +1,324 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_other_default_ignorable_code_point =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 64,
+ 16 + 256 * sizeof (short) / sizeof (int) + 80,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ 16 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000003E0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000010,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x01FF0000,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_grapheme_extend.c b/gnulib/lib/unictype/pr_other_grapheme_extend.c
new file mode 100644
index 0000000..0997ece
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_grapheme_extend.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_grapheme_extend table. */
+#include "pr_other_grapheme_extend.h"
+
+bool
+uc_is_property_other_grapheme_extend (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_grapheme_extend, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND =
+ { &uc_is_property_other_grapheme_extend };
diff --git a/gnulib/lib/unictype/pr_other_grapheme_extend.h b/gnulib/lib/unictype/pr_other_grapheme_extend.h
new file mode 100644
index 0000000..7d98a4c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_grapheme_extend.h
@@ -0,0 +1,307 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_property_other_grapheme_extend =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00600004, 0x00000000,
+ 0x00000000, 0x40000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80008000, 0x00000000,
+ 0x00003000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0007C020,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_id_continue.c b/gnulib/lib/unictype/pr_other_id_continue.c
new file mode 100644
index 0000000..1be5c0e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_id_continue table. */
+#include "pr_other_id_continue.h"
+
+bool
+uc_is_property_other_id_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_id_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE =
+ { &uc_is_property_other_id_continue };
diff --git a/gnulib/lib/unictype/pr_other_id_continue.h b/gnulib/lib/unictype/pr_other_id_continue.h
new file mode 100644
index 0000000..d029114
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_continue.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_other_id_continue =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00800000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003FE00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x04000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_id_start.c b/gnulib/lib/unictype/pr_other_id_start.c
new file mode 100644
index 0000000..9ad652d
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_id_start table. */
+#include "pr_other_id_start.h"
+
+bool
+uc_is_property_other_id_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_id_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_ID_START =
+ { &uc_is_property_other_id_start };
diff --git a/gnulib/lib/unictype/pr_other_id_start.h b/gnulib/lib/unictype/pr_other_id_start.h
new file mode 100644
index 0000000..82122b6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_id_start.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_other_id_start =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_lowercase.c b/gnulib/lib/unictype/pr_other_lowercase.c
new file mode 100644
index 0000000..8324a2c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_lowercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_lowercase table. */
+#include "pr_other_lowercase.h"
+
+bool
+uc_is_property_other_lowercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_lowercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_LOWERCASE =
+ { &uc_is_property_other_lowercase };
diff --git a/gnulib/lib/unictype/pr_other_lowercase.h b/gnulib/lib/unictype/pr_other_lowercase.h
new file mode 100644
index 0000000..e3e39b6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_lowercase.h
@@ -0,0 +1,176 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[6 << 4];
+ }
+u_property_other_lowercase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x01FF0000, 0x00000003, 0x0000001F,
+ 0x00000000, 0x00000000, 0x00000020, 0x04000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0xFFFFFFFF, 0x01000003,
+ 0xF8000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x001F0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFF0000, 0x000003FF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_math.c b/gnulib/lib/unictype/pr_other_math.c
new file mode 100644
index 0000000..25f895b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_math.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_math table. */
+#include "pr_other_math.h"
+
+bool
+uc_is_property_other_math (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_math, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_MATH =
+ { &uc_is_property_other_math };
diff --git a/gnulib/lib/unictype/pr_other_math.h b/gnulib/lib/unictype/pr_other_math.h
new file mode 100644
index 0000000..9e8a456
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_math.h
@@ -0,0 +1,323 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[10 << 4];
+ }
+u_property_other_math =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00270000, 0x00330000,
+ 0x00400000, 0x001C0000, 0x00000001, 0x6000001E,
+ 0x00006000, 0x00000000, 0x1FFF0000, 0x0000F862,
+ 0x3E2FFC84, 0xF1FBB310, 0x000003E0, 0x00000000,
+ 0xF3E00000, 0xF0C33EB6, 0x2FEB3FFF, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00B00000, 0x00010000, 0x00000004,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF07FC003, 0x000F8CC1, 0x00001F94,
+ 0x00000060, 0x00000000, 0x00000005, 0x0000600F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000010A,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x50000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_other_uppercase.c b/gnulib/lib/unictype/pr_other_uppercase.c
new file mode 100644
index 0000000..a7fa7ee
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_uppercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_other_uppercase table. */
+#include "pr_other_uppercase.h"
+
+bool
+uc_is_property_other_uppercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_other_uppercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_OTHER_UPPERCASE =
+ { &uc_is_property_other_uppercase };
diff --git a/gnulib/lib/unictype/pr_other_uppercase.h b/gnulib/lib/unictype/pr_other_uppercase.h
new file mode 100644
index 0000000..fe143dd
--- /dev/null
+++ b/gnulib/lib/unictype/pr_other_uppercase.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_other_uppercase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0000FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_paired_punctuation.c b/gnulib/lib/unictype/pr_paired_punctuation.c
new file mode 100644
index 0000000..3c11913
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paired_punctuation.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_paired_punctuation table. */
+#include "pr_paired_punctuation.h"
+
+bool
+uc_is_property_paired_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_paired_punctuation, uc);
+}
+
+const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION =
+ { &uc_is_property_paired_punctuation };
diff --git a/gnulib/lib/unictype/pr_paired_punctuation.h b/gnulib/lib/unictype/pr_paired_punctuation.h
new file mode 100644
index 0000000..bf19712
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paired_punctuation.h
@@ -0,0 +1,184 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_paired_punctuation =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112
+ },
+ {
+ 0x00000000, 0x00000300, 0x28000000, 0x28000000,
+ 0x00000000, 0x08000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF000000, 0x06000000, 0x00000060, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xEFF3FF00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFE00000, 0x7E00001F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000300, 0x28000000, 0x28000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_paragraph_separator.c b/gnulib/lib/unictype/pr_paragraph_separator.c
new file mode 100644
index 0000000..c5ce2e9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paragraph_separator.c
@@ -0,0 +1,55 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_paragraph_separator table. */
+#include "pr_paragraph_separator.h"
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_paragraph_separator, uc);
+}
+
+#elif 0
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return uc_is_category_Zp (uc);
+}
+
+#else
+
+bool
+uc_is_property_paragraph_separator (ucs4_t uc)
+{
+ return (uc == 0x2029);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR =
+ { &uc_is_property_paragraph_separator };
diff --git a/gnulib/lib/unictype/pr_paragraph_separator.h b/gnulib/lib/unictype/pr_paragraph_separator.h
new file mode 100644
index 0000000..c5e458a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_paragraph_separator.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_paragraph_separator =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000200, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_pattern_syntax.c b/gnulib/lib/unictype/pr_pattern_syntax.c
new file mode 100644
index 0000000..656ba21
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_syntax.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_pattern_syntax table. */
+#include "pr_pattern_syntax.h"
+
+bool
+uc_is_property_pattern_syntax (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_pattern_syntax, uc);
+}
+
+const uc_property_t UC_PROPERTY_PATTERN_SYNTAX =
+ { &uc_is_property_pattern_syntax };
diff --git a/gnulib/lib/unictype/pr_pattern_syntax.h b/gnulib/lib/unictype/pr_pattern_syntax.h
new file mode 100644
index 0000000..70a23a5
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_syntax.h
@@ -0,0 +1,188 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_pattern_syntax =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 80,
+ 2 + 128 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 112,
+ 2 + 128 * sizeof (short) / sizeof (int) + 128
+ },
+ {
+ 0x00000000, 0xFC00FFFE, 0x78000001, 0x78000001,
+ 0x00000000, 0x88435AFE, 0x00800000, 0x00800000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0x7FFF00FF, 0x7FEFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF,
+ 0xFFF00000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFF0E, 0x00010001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000060, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_pattern_white_space.c b/gnulib/lib/unictype/pr_pattern_white_space.c
new file mode 100644
index 0000000..617694f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_white_space.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_pattern_white_space table. */
+#include "pr_pattern_white_space.h"
+
+bool
+uc_is_property_pattern_white_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_pattern_white_space, uc);
+}
+
+const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE =
+ { &uc_is_property_pattern_white_space };
diff --git a/gnulib/lib/unictype/pr_pattern_white_space.h b/gnulib/lib/unictype/pr_pattern_white_space.h
new file mode 100644
index 0000000..98698db
--- /dev/null
+++ b/gnulib/lib/unictype/pr_pattern_white_space.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_pattern_white_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000300, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_private_use.c b/gnulib/lib/unictype/pr_private_use.c
new file mode 100644
index 0000000..dc96133
--- /dev/null
+++ b/gnulib/lib/unictype/pr_private_use.c
@@ -0,0 +1,49 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_private_use table. */
+#include "pr_private_use.h"
+
+bool
+uc_is_property_private_use (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_private_use, uc);
+}
+
+#else
+
+bool
+uc_is_property_private_use (ucs4_t uc)
+{
+ return (uc >= 0xE000 && uc <= 0xF8FF)
+ || (uc >= 0xF0000 && uc <= 0xFFFFD)
+ || (uc >= 0x100000 && uc <= 0x10FFFD);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PRIVATE_USE =
+ { &uc_is_property_private_use };
diff --git a/gnulib/lib/unictype/pr_private_use.h b/gnulib/lib/unictype/pr_private_use.h
new file mode 100644
index 0000000..b432856
--- /dev/null
+++ b/gnulib/lib/unictype/pr_private_use.h
@@ -0,0 +1,310 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[17];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_property_private_use =
+{
+ { 17 },
+ {
+ 18 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 * sizeof (int) / sizeof (short) + 128,
+ 18 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 0,
+ 18 + 256 * sizeof (short) / sizeof (int) + 32
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_punctuation.c b/gnulib/lib/unictype/pr_punctuation.c
new file mode 100644
index 0000000..d30d00c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_punctuation.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_punctuation table. */
+#include "pr_punctuation.h"
+
+bool
+uc_is_property_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_punctuation, uc);
+}
+
+#else
+
+bool
+uc_is_property_punctuation (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_P);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_PUNCTUATION =
+ { &uc_is_property_punctuation };
diff --git a/gnulib/lib/unictype/pr_punctuation.h b/gnulib/lib/unictype/pr_punctuation.h
new file mode 100644
index 0000000..a057b4a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_punctuation.h
@@ -0,0 +1,415 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[33 << 4];
+ }
+u_property_punctuation =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 400,
+ 3 + 256 * sizeof (short) / sizeof (int) + 416,
+ 3 + 256 * sizeof (short) / sizeof (int) + 432,
+ 3 + 256 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 464,
+ 3 + 256 * sizeof (short) / sizeof (int) + 480,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 496,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C00F7EE, 0xB8000001, 0x28000000,
+ 0x00000000, 0x88800802, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000000,
+ 0x00000600, 0x40000000, 0x00000049, 0x00180000,
+ 0xC8003600, 0x00000000, 0x00000000, 0x00003C00,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00003FFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03800000,
+ 0x00000000, 0x7FFF0000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00100000,
+ 0x00000000, 0x00000000, 0x0C008000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007FFF0, 0x3C000000, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000000, 0x061F0000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FC00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x18000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x07700000, 0x00000000,
+ 0x000007FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00003F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC000000, 0x00000001,
+ 0x00000000, 0x00000000, 0x00000000, 0xF0000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00080000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFF0000, 0xFFFF00FF, 0x7FFBFFEF, 0x60000000,
+ 0x00006000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000600, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x003FFF00,
+ 0x00000000, 0x00000000, 0x00000060, 0x0000FFC0,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x01FFFFF8, 0x00000000, 0x0F000000, 0x30000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xDE000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00010000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00037FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFF3FF0E, 0x20010000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x08000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x40080000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00FC0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x07000000,
+ 0x00000000, 0x0000C000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0003FFE, 0x00000000,
+ 0x00000000, 0x00000000, 0xF0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FF0000, 0xFFFF0000, 0xFFF7FFFF, 0x00000D0B,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C00F7EE, 0xB8000001, 0xA8000000, 0x0000003F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x80000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x01FF0000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFE000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003F80, 0x00000000,
+ 0x00000000, 0xD8000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_quotation_mark.c b/gnulib/lib/unictype/pr_quotation_mark.c
new file mode 100644
index 0000000..52789df
--- /dev/null
+++ b/gnulib/lib/unictype/pr_quotation_mark.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_quotation_mark table. */
+#include "pr_quotation_mark.h"
+
+bool
+uc_is_property_quotation_mark (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_quotation_mark, uc);
+}
+
+const uc_property_t UC_PROPERTY_QUOTATION_MARK =
+ { &uc_is_property_quotation_mark };
diff --git a/gnulib/lib/unictype/pr_quotation_mark.h b/gnulib/lib/unictype/pr_quotation_mark.h
new file mode 100644
index 0000000..8dfa68c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_quotation_mark.h
@@ -0,0 +1,168 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[4 << 4];
+ }
+u_property_quotation_mark =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48
+ },
+ {
+ 0x00000000, 0x00000084, 0x00000000, 0x00000000,
+ 0x00000000, 0x08000800, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF000000, 0x06000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xE000F000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001E, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000084, 0x00000000, 0x00000000, 0x0000000C,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_radical.c b/gnulib/lib/unictype/pr_radical.c
new file mode 100644
index 0000000..bbc72e0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_radical.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_radical table. */
+#include "pr_radical.h"
+
+bool
+uc_is_property_radical (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_radical, uc);
+}
+
+const uc_property_t UC_PROPERTY_RADICAL =
+ { &uc_is_property_radical };
diff --git a/gnulib/lib/unictype/pr_radical.h b/gnulib/lib/unictype/pr_radical.h
new file mode 100644
index 0000000..f24e4f0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_radical.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_property_radical =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFBFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x003FFFFF, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_sentence_terminal.c b/gnulib/lib/unictype/pr_sentence_terminal.c
new file mode 100644
index 0000000..4f9aa5a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_sentence_terminal.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_sentence_terminal table. */
+#include "pr_sentence_terminal.h"
+
+bool
+uc_is_property_sentence_terminal (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_sentence_terminal, uc);
+}
+
+const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL =
+ { &uc_is_property_sentence_terminal };
diff --git a/gnulib/lib/unictype/pr_sentence_terminal.h b/gnulib/lib/unictype/pr_sentence_terminal.h
new file mode 100644
index 0000000..68e5c7a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_sentence_terminal.h
@@ -0,0 +1,363 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[20 << 4];
+ }
+u_property_sentence_terminal =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x80004002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x50000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x00000007, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x02000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000184,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00004000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00600000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000208, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xCC000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x18000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x30000000, 0x00000380, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000004, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00880000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00C00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000300, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000800,
+ 0x00000000, 0x00000000, 0x00C40000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80004002, 0x00000000, 0x00000000, 0x00000002,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00C00000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000180, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_soft_dotted.c b/gnulib/lib/unictype/pr_soft_dotted.c
new file mode 100644
index 0000000..0798c8e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_soft_dotted.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_soft_dotted table. */
+#include "pr_soft_dotted.h"
+
+bool
+uc_is_property_soft_dotted (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_soft_dotted, uc);
+}
+
+const uc_property_t UC_PROPERTY_SOFT_DOTTED =
+ { &uc_is_property_soft_dotted };
diff --git a/gnulib/lib/unictype/pr_soft_dotted.h b/gnulib/lib/unictype/pr_soft_dotted.h
new file mode 100644
index 0000000..bc9e168
--- /dev/null
+++ b/gnulib/lib/unictype/pr_soft_dotted.h
@@ -0,0 +1,319 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[9 << 4];
+ }
+u_property_soft_dotted =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000600,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000200, 0x00000100,
+ 0x20000000, 0x00040000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00080000,
+ 0x00000000, 0x00000000, 0x01400000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000004,
+ 0x00400000, 0x00000110, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00020000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000300, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x10000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000000C, 0x00C00000, 0x00000000,
+ 0x00000C00, 0xC0000000, 0x00000000, 0x000C0000,
+ 0x00000000, 0x000000C0, 0x0C000000, 0x00000000,
+ 0x0000C000, 0x00000000, 0x0000000C, 0x00C00000,
+ 0x00000000, 0x00000C00, 0xC0000000, 0x00000000,
+ 0x000C0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_space.c b/gnulib/lib/unictype/pr_space.c
new file mode 100644
index 0000000..4ef3b23
--- /dev/null
+++ b/gnulib/lib/unictype/pr_space.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_space table. */
+#include "pr_space.h"
+
+bool
+uc_is_property_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_space, uc);
+}
+
+#else
+
+bool
+uc_is_property_space (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Zs);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_SPACE =
+ { &uc_is_property_space };
diff --git a/gnulib/lib/unictype/pr_space.h b/gnulib/lib/unictype/pr_space.h
new file mode 100644
index 0000000..a805a8e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_terminal_punctuation.c b/gnulib/lib/unictype/pr_terminal_punctuation.c
new file mode 100644
index 0000000..5aaa716
--- /dev/null
+++ b/gnulib/lib/unictype/pr_terminal_punctuation.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_terminal_punctuation table. */
+#include "pr_terminal_punctuation.h"
+
+bool
+uc_is_property_terminal_punctuation (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_terminal_punctuation, uc);
+}
+
+const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION =
+ { &uc_is_property_terminal_punctuation };
diff --git a/gnulib/lib/unictype/pr_terminal_punctuation.h b/gnulib/lib/unictype/pr_terminal_punctuation.h
new file mode 100644
index 0000000..d3ea66e
--- /dev/null
+++ b/gnulib/lib/unictype/pr_terminal_punctuation.h
@@ -0,0 +1,383 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[25 << 4];
+ }
+u_property_terminal_punctuation =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 336,
+ 3 + 256 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x8C005002, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x40000000,
+ 0x00000080, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000200, 0x00000000, 0x00000008, 0x00000000,
+ 0x88001000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00100000, 0x00000000,
+ 0x000017FF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x03000000,
+ 0x00000000, 0x7FFF0000, 0x40000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000030,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0C000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0007E100, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000C00, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000001FE,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00006000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00003800,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x04700000, 0x00000000,
+ 0x0000033C, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000030, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000F00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xEC000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xF8000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x30000000, 0x00000380, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00004000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000006, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xC0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00C00000,
+ 0x00000000, 0x00000000, 0x0000C000, 0x00000000,
+ 0x00000000, 0x00008000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000380, 0x00000000,
+ 0x00000000, 0x00000000, 0xE0000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000800,
+ 0x00000000, 0x00000000, 0x00F70000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x8C005002, 0x00000000, 0x00000000, 0x00000012,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00010000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00800000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFC000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003F80, 0x00000000,
+ 0x00000000, 0xC0000000, 0x00000003, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000F0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_test.c b/gnulib/lib/unictype/pr_test.c
new file mode 100644
index 0000000..67f40d9
--- /dev/null
+++ b/gnulib/lib/unictype/pr_test.c
@@ -0,0 +1,27 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_property (ucs4_t uc, uc_property_t property)
+{
+ return property.test_fn (uc);
+}
diff --git a/gnulib/lib/unictype/pr_titlecase.c b/gnulib/lib/unictype/pr_titlecase.c
new file mode 100644
index 0000000..bc564c4
--- /dev/null
+++ b/gnulib/lib/unictype/pr_titlecase.c
@@ -0,0 +1,47 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#if 0
+
+#include "bitmap.h"
+
+/* Define u_property_titlecase table. */
+#include "pr_titlecase.h"
+
+bool
+uc_is_property_titlecase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_titlecase, uc);
+}
+
+#else
+
+bool
+uc_is_property_titlecase (ucs4_t uc)
+{
+ return uc_is_general_category (uc, UC_CATEGORY_Lt);
+}
+
+#endif
+
+const uc_property_t UC_PROPERTY_TITLECASE =
+ { &uc_is_property_titlecase };
diff --git a/gnulib/lib/unictype/pr_titlecase.h b/gnulib/lib/unictype/pr_titlecase.h
new file mode 100644
index 0000000..aabc6e0
--- /dev/null
+++ b/gnulib/lib/unictype/pr_titlecase.h
@@ -0,0 +1,160 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[2 << 4];
+ }
+u_property_titlecase =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000920, 0x00040000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFF00FF00, 0x1000FF00, 0x00001000, 0x10000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_unassigned_code_value.c b/gnulib/lib/unictype/pr_unassigned_code_value.c
new file mode 100644
index 0000000..e6661a6
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unassigned_code_value.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_unassigned_code_value table. */
+#include "pr_unassigned_code_value.h"
+
+bool
+uc_is_property_unassigned_code_value (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_unassigned_code_value, uc);
+}
+
+const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE =
+ { &uc_is_property_unassigned_code_value };
diff --git a/gnulib/lib/unictype/pr_unassigned_code_value.h b/gnulib/lib/unictype/pr_unassigned_code_value.h
new file mode 100644
index 0000000..74ac22f
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unassigned_code_value.h
@@ -0,0 +1,920 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[5 << 7];
+ /*unsigned*/ int level3[60 << 4];
+ }
+u_property_unassigned_code_value =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 384,
+ 16 * sizeof (int) / sizeof (short) + 512
+ },
+ {
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 0,
+ 16 + 640 * sizeof (short) / sizeof (int) + 16,
+ 16 + 640 * sizeof (short) / sizeof (int) + 32,
+ 16 + 640 * sizeof (short) / sizeof (int) + 48,
+ 16 + 640 * sizeof (short) / sizeof (int) + 64,
+ 16 + 640 * sizeof (short) / sizeof (int) + 80,
+ 16 + 640 * sizeof (short) / sizeof (int) + 96,
+ 16 + 640 * sizeof (short) / sizeof (int) + 112,
+ 16 + 640 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 144,
+ 16 + 640 * sizeof (short) / sizeof (int) + 160,
+ 16 + 640 * sizeof (short) / sizeof (int) + 176,
+ 16 + 640 * sizeof (short) / sizeof (int) + 192,
+ 16 + 640 * sizeof (short) / sizeof (int) + 208,
+ 16 + 640 * sizeof (short) / sizeof (int) + 224,
+ 16 + 640 * sizeof (short) / sizeof (int) + 240,
+ 16 + 640 * sizeof (short) / sizeof (int) + 256,
+ 16 + 640 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 288,
+ 16 + 640 * sizeof (short) / sizeof (int) + 304,
+ 16 + 640 * sizeof (short) / sizeof (int) + 320,
+ 16 + 640 * sizeof (short) / sizeof (int) + 336,
+ 16 + 640 * sizeof (short) / sizeof (int) + 352,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 400,
+ 16 + 640 * sizeof (short) / sizeof (int) + 416,
+ 16 + 640 * sizeof (short) / sizeof (int) + 432,
+ 16 + 640 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 464,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 480,
+ 16 + 640 * sizeof (short) / sizeof (int) + 496,
+ 16 + 640 * sizeof (short) / sizeof (int) + 512,
+ 16 + 640 * sizeof (short) / sizeof (int) + 528,
+ 16 + 640 * sizeof (short) / sizeof (int) + 544,
+ 16 + 640 * sizeof (short) / sizeof (int) + 560,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 592,
+ 16 + 640 * sizeof (short) / sizeof (int) + 608,
+ 16 + 640 * sizeof (short) / sizeof (int) + 624,
+ 16 + 640 * sizeof (short) / sizeof (int) + 640,
+ 16 + 640 * sizeof (short) / sizeof (int) + 656,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 672,
+ 16 + 640 * sizeof (short) / sizeof (int) + 688,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 704,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 720,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 736,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 752,
+ 16 + 640 * sizeof (short) / sizeof (int) + 768,
+ 16 + 640 * sizeof (short) / sizeof (int) + 784,
+ 16 + 640 * sizeof (short) / sizeof (int) + 800,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 816,
+ 16 + 640 * sizeof (short) / sizeof (int) + 832,
+ 16 + 640 * sizeof (short) / sizeof (int) + 848,
+ 16 + 640 * sizeof (short) / sizeof (int) + 864,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 880,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 896,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 912,
+ 16 + 640 * sizeof (short) / sizeof (int) + 928,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 16 + 640 * sizeof (short) / sizeof (int) + 928,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 880,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 880,
+ 16 + 640 * sizeof (short) / sizeof (int) + 944,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 576,
+ 16 + 640 * sizeof (short) / sizeof (int) + 880
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x83000000,
+ 0x0000280F, 0x00000004, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0001FF00, 0x01800000, 0x00000001,
+ 0x0001F900, 0x00000000, 0x0000FF00, 0xFFE0F800,
+ 0x30000030, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00001800, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0x00000000, 0xF8000000,
+ 0x00000000, 0x8000C000, 0xB0000000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x01000000,
+ 0x00066011, 0x0C3A0200, 0x4F7F8660, 0xF0000030,
+ 0x00067811, 0x2C920200, 0xA1FDC678, 0xFFC0003F,
+ 0x00044011, 0x0C120200, 0xFFFEC440, 0xFFFD0030,
+ 0x00066011, 0x0C120200, 0x4F3FC660, 0xFF000030,
+ 0x29C23813, 0x3C0038E7, 0xFF7EC238, 0xF800003F,
+ 0x00022011, 0x1C100200, 0xFC9FC220, 0x00FF0030,
+ 0x00022013, 0x0C100200, 0xBF9FC220, 0xFFF90030,
+ 0x00022013, 0x18000000, 0xFF7F8220, 0x01C00030,
+ 0x03800013, 0xD0040000, 0x00A07B80, 0xFFE3FFFF,
+ 0x00000001, 0x78000000, 0xF0000000, 0xFFFFFFFF,
+ 0x010FDA69, 0xC4001351, 0xCC00C0A0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000100, 0x0001E000,
+ 0x01000000, 0x20000000, 0xF8002000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFC0, 0xE0000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC280C200, 0x00000000,
+ 0x0000C200, 0x80C20000, 0x008000C2, 0x00000000,
+ 0x00C20000, 0x00000000, 0x18000000, 0xE0000000,
+ 0xFC000000, 0x00000000, 0x00000000, 0xFFE00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xE0000000, 0x00000000, 0x00000000, 0xFFFE0000,
+ 0xFFE02000, 0xFF800000, 0xFFF00000, 0xFFF22000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFC00FC00,
+ 0xFC008000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x0000F800, 0x00000000, 0xFFC00000,
+ 0xE0000000, 0xF000F000, 0x0000000E, 0xFFE0C000,
+ 0x00000000, 0x0000F000, 0x3800FC00, 0x00000000,
+ 0x30000000, 0x00000000, 0x80000000, 0x60000000,
+ 0xFC00FC00, 0xFFFFC000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0000F000, 0xE0000000,
+ 0x00000000, 0xFC003800, 0x00000000, 0x0FF00000,
+ 0x00000000, 0x07000000, 0x00001C00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFF80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0FFFFF80,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0C00000, 0x00000000, 0x5500C0C0, 0xC0000000,
+ 0x00000000, 0x00200000, 0x10300020, 0x80230000,
+ 0x00000000, 0x00000000, 0x00000000, 0x000C03E0,
+ 0xE0008000, 0xFC000000, 0x0000FFFF, 0xFFFE0000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FC00, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0xFFFFFF80, 0xFFFFF800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00002800, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFC00E000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00008000, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x01FC0000,
+ 0x00000000, 0x0000FFC0, 0x00000000, 0x7FFE7FC0,
+ 0xFF800000, 0x80808080, 0x80808080, 0x00000000,
+ 0x00000000, 0xFFFC0000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x04000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFC00000, 0xF000FFFF,
+ 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x01800000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000001F, 0x0001C000, 0x00000000, 0x00000000,
+ 0x00008000, 0xF8000000, 0x00000000, 0x0000FFF0,
+ 0x80000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFF000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000E000, 0x00000000, 0x0000FF80, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFF000, 0x00000000, 0x0FF00000,
+ 0xFF000000, 0x00000000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFC8000, 0xFFFFFC00, 0xFFFFFFFF, 0x03FFFFFF,
+ 0x00000000, 0xFC00F000, 0x00000000, 0xFF000000,
+ 0x00000000, 0x00000000, 0xFC003FE0, 0xF0000000,
+ 0x00000000, 0x00000000, 0x7FF00000, 0xE0000000,
+ 0x00000000, 0x00000000, 0x3C004000, 0xFFFFFFFF,
+ 0x00000000, 0xFF800000, 0x0C00C000, 0xF0000000,
+ 0x00000000, 0x00000000, 0x07FFFFF8, 0xFFFFFFFF,
+ 0xFF818181, 0xFFFF8080, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFC00C000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x0000FFF0, 0x00000780, 0xF0000000,
+ 0x00000000, 0x0000C000, 0x00000000, 0x0000C000,
+ 0x00000000, 0x00000000, 0xFC000000, 0xFFFFFFFF,
+ 0x1F07FF80, 0xA0800000, 0x00000024, 0x00000000,
+ 0x00000000, 0x00000000, 0x0007FFFC, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000FFFF, 0x00000000,
+ 0x00030000, 0x00000000, 0x0000FF00, 0xC0000000,
+ 0xFC000000, 0x0000FF80, 0x00080000, 0x0020F080,
+ 0x00000000, 0x00000000, 0x00000000, 0x60000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x80000000, 0xE3030303, 0x01FF8080,
+ 0x00001000, 0x48000080, 0xC000C000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xF8000000,
+ 0x00000078, 0x00700000, 0x00000000, 0x00000000,
+ 0xF000F800, 0xFFFFFFFF, 0x0000FFFF, 0xC0000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xE0000000, 0x00000000, 0xFFFE0000, 0xFFFFFFFF,
+ 0x80000000, 0x0000FFF0, 0xFFFFF800, 0xFFFFFFFF,
+ 0x40000000, 0x00000000, 0xFFC000F0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFC00, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000002C0, 0x6E400000, 0x00400000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x70000000, 0x7C000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x01100F90, 0x78F00000, 0xFE00FF00, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x01C00000, 0x00C00000, 0x00F80000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x0003C000, 0xFFFF0000,
+ 0x00000000, 0x00000000, 0xFFFFFFFC, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF8000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF0FFF8,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFFFF8000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0xFE000000, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFC00000,
+ 0x00000000, 0x00000180, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xC0000000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFC0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00200000, 0x00000000,
+ 0x20000000, 0x1400219B, 0x00000010, 0x00000000,
+ 0x20201840, 0x84000000, 0x000203A0, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x000000C0, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00003000, 0x00000000,
+ 0x00000000, 0x0000F000, 0x00000000, 0x00000000,
+ 0xFFF00000, 0x80018000, 0x00010001, 0xFFFFFFFF,
+ 0x0000F800, 0x00008000, 0x00000000, 0x0000FC00,
+ 0xF8000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F,
+ 0x0000FFF8, 0xF8000000, 0xFFFCFE00, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x0040FFFE, 0x00000000, 0xE0000000,
+ 0xFFF00000, 0x00000000, 0xFFFFF820, 0xFFFE0000,
+ 0x00000000, 0x80000000, 0x00000002, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xE1000000,
+ 0x00000000, 0xC0000000, 0x0000FFFF, 0xFFFFFF00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x8AA20001, 0x0010D0C0, 0xFFFF001E, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFC0, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFF00000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFF800000, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFE00000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xC0000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFD, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFF0000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_unified_ideograph.c b/gnulib/lib/unictype/pr_unified_ideograph.c
new file mode 100644
index 0000000..0a4da25
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unified_ideograph.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_unified_ideograph table. */
+#include "pr_unified_ideograph.h"
+
+bool
+uc_is_property_unified_ideograph (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_unified_ideograph, uc);
+}
+
+const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH =
+ { &uc_is_property_unified_ideograph };
diff --git a/gnulib/lib/unictype/pr_unified_ideograph.h b/gnulib/lib/unictype/pr_unified_ideograph.h
new file mode 100644
index 0000000..a32c65c
--- /dev/null
+++ b/gnulib/lib/unictype/pr_unified_ideograph.h
@@ -0,0 +1,312 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[7 << 4];
+ }
+u_property_unified_ideograph =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ 4 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 16,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 64,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 0,
+ 4 + 256 * sizeof (short) / sizeof (int) + 80,
+ 4 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0x801AC000, 0x0000039A, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_uppercase.c b/gnulib/lib/unictype/pr_uppercase.c
new file mode 100644
index 0000000..106ef40
--- /dev/null
+++ b/gnulib/lib/unictype/pr_uppercase.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_uppercase table. */
+#include "pr_uppercase.h"
+
+bool
+uc_is_property_uppercase (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_uppercase, uc);
+}
+
+const uc_property_t UC_PROPERTY_UPPERCASE =
+ { &uc_is_property_uppercase };
diff --git a/gnulib/lib/unictype/pr_uppercase.h b/gnulib/lib/unictype/pr_uppercase.h
new file mode 100644
index 0000000..9002116
--- /dev/null
+++ b/gnulib/lib/unictype/pr_uppercase.h
@@ -0,0 +1,335 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[13 << 4];
+ }
+u_property_uppercase =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x00000000,
+ 0x00000000, 0x00000000, 0x7F7FFFFF, 0x00000000,
+ 0x55555555, 0xAA555555, 0x555554AA, 0x2B555555,
+ 0xB1DBCED6, 0x11AED2D5, 0x4AAAA490, 0x55D25555,
+ 0x55555555, 0x6C055555, 0x0000557A, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00450000,
+ 0xFFFED740, 0x00000FFB, 0x551C8000, 0xE6905555,
+ 0xFFFFFFFF, 0x0000FFFF, 0x00000000, 0x55555555,
+ 0x55555401, 0x55555555, 0x55552AAB, 0x55555555,
+ 0x55555555, 0xFFFE0055, 0x007FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x0000003F, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x55555555, 0x55555555, 0x55555555, 0x55555555,
+ 0x40155555, 0x55555555, 0x55555555, 0x55555555,
+ 0x3F00FF00, 0xFF00FF00, 0xAA003F00, 0x0000FF00,
+ 0x00000000, 0x0F000000, 0x0F000F00, 0x0F001F00,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3E273884, 0xC00F3D50, 0x00000020, 0x0000FFFF,
+ 0x00000008, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFC00000, 0x0000FFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0xC025EA9D,
+ 0x55555555, 0x55555555, 0x55555555, 0x00002805,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x55555555, 0x00001555,
+ 0x00555555, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x55545554, 0x55555555, 0x6A005555,
+ 0x00012855, 0x00000155, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x07FFFFFE, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x000000FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x03FFFFFF, 0xFFF00000, 0x00003FFF, 0xFFFFFF00,
+ 0xD0000003, 0x003FDE64, 0xFFFF0000, 0x000003FF,
+ 0x1FDFE7B0, 0x7B000000, 0x0001FC5F, 0xFFFFF000,
+ 0x0000003F, 0x03FFFFFF, 0xFFF00000, 0x00003FFF,
+ 0xFFFFFF00, 0xF0000003, 0x003FFFFF, 0xFFFF0000,
+ 0x000003FF, 0xFFFFFF00, 0x00000001, 0x07FFFFFC,
+ 0xF0000000, 0x001FFFFF, 0xFFC00000, 0x00007FFF,
+ 0xFFFF0000, 0x000001FF, 0x00000400, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_variation_selector.c b/gnulib/lib/unictype/pr_variation_selector.c
new file mode 100644
index 0000000..587d482
--- /dev/null
+++ b/gnulib/lib/unictype/pr_variation_selector.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_variation_selector table. */
+#include "pr_variation_selector.h"
+
+bool
+uc_is_property_variation_selector (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_variation_selector, uc);
+}
+
+const uc_property_t UC_PROPERTY_VARIATION_SELECTOR =
+ { &uc_is_property_variation_selector };
diff --git a/gnulib/lib/unictype/pr_variation_selector.h b/gnulib/lib/unictype/pr_variation_selector.h
new file mode 100644
index 0000000..ede3709
--- /dev/null
+++ b/gnulib/lib/unictype/pr_variation_selector.h
@@ -0,0 +1,308 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[2 << 7];
+ /*unsigned*/ int level3[3 << 4];
+ }
+u_property_variation_selector =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 256 * sizeof (short) / sizeof (int) + 16,
+ 16 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003800, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000FFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_white_space.c b/gnulib/lib/unictype/pr_white_space.c
new file mode 100644
index 0000000..491b68a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_white_space.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_white_space table. */
+#include "pr_white_space.h"
+
+bool
+uc_is_property_white_space (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_white_space, uc);
+}
+
+const uc_property_t UC_PROPERTY_WHITE_SPACE =
+ { &uc_is_property_white_space };
diff --git a/gnulib/lib/unictype/pr_white_space.h b/gnulib/lib/unictype/pr_white_space.h
new file mode 100644
index 0000000..bd2ac52
--- /dev/null
+++ b/gnulib/lib/unictype/pr_white_space.h
@@ -0,0 +1,172 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[5 << 4];
+ }
+u_property_white_space =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 16,
+ 2 + 128 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 2 + 128 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000020, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00004000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x000007FF, 0x00008300, 0x80000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000001, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_xid_continue.c b/gnulib/lib/unictype/pr_xid_continue.c
new file mode 100644
index 0000000..6a5564a
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_continue.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_xid_continue table. */
+#include "pr_xid_continue.h"
+
+bool
+uc_is_property_xid_continue (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_xid_continue, uc);
+}
+
+const uc_property_t UC_PROPERTY_XID_CONTINUE =
+ { &uc_is_property_xid_continue };
diff --git a/gnulib/lib/unictype/pr_xid_continue.h b/gnulib/lib/unictype/pr_xid_continue.h
new file mode 100644
index 0000000..975e5ef
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_continue.h
@@ -0,0 +1,756 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[4 << 7];
+ /*unsigned*/ int level3[51 << 4];
+ }
+u_property_xid_continue =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ 16 * sizeof (int) / sizeof (short) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 384
+ },
+ {
+ 16 + 512 * sizeof (short) / sizeof (int) + 0,
+ 16 + 512 * sizeof (short) / sizeof (int) + 16,
+ 16 + 512 * sizeof (short) / sizeof (int) + 32,
+ 16 + 512 * sizeof (short) / sizeof (int) + 48,
+ 16 + 512 * sizeof (short) / sizeof (int) + 64,
+ 16 + 512 * sizeof (short) / sizeof (int) + 80,
+ 16 + 512 * sizeof (short) / sizeof (int) + 96,
+ 16 + 512 * sizeof (short) / sizeof (int) + 112,
+ 16 + 512 * sizeof (short) / sizeof (int) + 128,
+ 16 + 512 * sizeof (short) / sizeof (int) + 144,
+ 16 + 512 * sizeof (short) / sizeof (int) + 160,
+ 16 + 512 * sizeof (short) / sizeof (int) + 176,
+ 16 + 512 * sizeof (short) / sizeof (int) + 192,
+ 16 + 512 * sizeof (short) / sizeof (int) + 208,
+ 16 + 512 * sizeof (short) / sizeof (int) + 224,
+ 16 + 512 * sizeof (short) / sizeof (int) + 240,
+ 16 + 512 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 320,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 336,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 352,
+ 16 + 512 * sizeof (short) / sizeof (int) + 368,
+ 16 + 512 * sizeof (short) / sizeof (int) + 384,
+ 16 + 512 * sizeof (short) / sizeof (int) + 400,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 432,
+ 16 + 512 * sizeof (short) / sizeof (int) + 448,
+ 16 + 512 * sizeof (short) / sizeof (int) + 464,
+ 16 + 512 * sizeof (short) / sizeof (int) + 480,
+ 16 + 512 * sizeof (short) / sizeof (int) + 496,
+ 16 + 512 * sizeof (short) / sizeof (int) + 512,
+ 16 + 512 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 544,
+ 16 + 512 * sizeof (short) / sizeof (int) + 560,
+ 16 + 512 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 608,
+ 16 + 512 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 688,
+ 16 + 512 * sizeof (short) / sizeof (int) + 704,
+ 16 + 512 * sizeof (short) / sizeof (int) + 720,
+ 16 + 512 * sizeof (short) / sizeof (int) + 736,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 752,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 768,
+ 16 + 512 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 304,
+ 16 + 512 * sizeof (short) / sizeof (int) + 784,
+ -1,
+ -1,
+ 16 + 512 * sizeof (short) / sizeof (int) + 800,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04A00400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x38DFFFFF,
+ 0xFFFFD7C0, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFCFB, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0xFFFE00FF, 0xBFFFFFFF, 0xFFFF00B6, 0x000707FF,
+ 0x07FF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFC3FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x9FEFFFFF, 0x9FFFFDFF,
+ 0xFFFF0000, 0xFFFFFFFF, 0xFFFFE7FF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFFFFFFF, 0x043FFFFF,
+ 0xFFFFFFFF, 0x00003FFF, 0x0FFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFEFEFFCF,
+ 0xFFF99FEE, 0xF3C5FDFF, 0xB080799F, 0x0003FFCF,
+ 0xFFF987EE, 0xD36DFDFF, 0x5E023987, 0x003FFFC0,
+ 0xFFFBBFEE, 0xF3EDFDFF, 0x00013BBF, 0x0000FFCF,
+ 0xFFF99FEE, 0xF3EDFDFF, 0xB0C0399F, 0x0002FFCF,
+ 0xD63DC7EC, 0xC3FFC718, 0x00813DC7, 0x0000FFC0,
+ 0xFFFDDFEE, 0xE3EFFDFF, 0x03603DDF, 0x0000FFCF,
+ 0xFFFDDFEC, 0xF3EFFDFF, 0x40603DDF, 0x0006FFCF,
+ 0xFFFDDFEC, 0xE7FFFFFF, 0x00807DDF, 0xFC00FFCF,
+ 0xFC7FFFEC, 0x2FFBFFFF, 0xFF5F847F, 0x000C0000,
+ 0xFFFFFFFE, 0x07FFFFFF, 0x03FF7FFF, 0x00000000,
+ 0xFEF02596, 0x3BFFECAE, 0x33FF3F5F, 0x00000000,
+ 0x03000001, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE1FFF,
+ 0xFEFFFFDF, 0x1FFFFFFF, 0x00000040, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF03FF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0xE7FFFFFF, 0x0003FE00,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x001FDFFF, 0x001FFFFF, 0x000FFFFF, 0x000DDFFF,
+ 0xFFFFFFFF, 0xFFCFFFFF, 0x308FFFFF, 0x000003FF,
+ 0x03FF3800, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF07FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x0FFF0FFF, 0xFFFFFFC0, 0x001F3FFF,
+ 0xFFFFFFFF, 0xFFFF0FFF, 0x07FF03FF, 0x00000000,
+ 0x0FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x9FFFFFFF,
+ 0x03FF03FF, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF0FFF, 0x000FF800,
+ 0xFFFFFFFF, 0x03FFC7FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0x00FFFFFF, 0xFFFFE3FF, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0xFFF70000, 0x0007FFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xF000007F,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x80000000, 0x00100001, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x1FFF0000, 0x0001FFE2,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003F81F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x8000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0xFFFFFFFF,
+ 0x000000E0, 0x1F3EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE67FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000FFF, 0xFFFFFFFF, 0xB000FFFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFFFFF, 0x000000FF, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF001F, 0x08FFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0x000FFFFF, 0x1FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FF8001, 0x00000000,
+ 0xFFFFFFFF, 0x007FFFFF, 0x03FF3FFF, 0x0C7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x38000007, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x03FF37FF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xE0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x03FF0000,
+ 0x0000FFFF, 0x0018007F, 0x0000E000, 0xAA8A0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x03FF0000, 0x87FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0xFFFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x20000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x000003FF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEFF06F, 0x870FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0000007F, 0x0000FFC0,
+ 0xFFFFFFFF, 0x07FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xF807E3E0,
+ 0x00000FE7, 0x00003C00, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x0000001C, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0xFFFFCFF7, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF
+ }
+};
diff --git a/gnulib/lib/unictype/pr_xid_start.c b/gnulib/lib/unictype/pr_xid_start.c
new file mode 100644
index 0000000..6676c0b
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_start.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_xid_start table. */
+#include "pr_xid_start.h"
+
+bool
+uc_is_property_xid_start (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_xid_start, uc);
+}
+
+const uc_property_t UC_PROPERTY_XID_START =
+ { &uc_is_property_xid_start };
diff --git a/gnulib/lib/unictype/pr_xid_start.h b/gnulib/lib/unictype/pr_xid_start.h
new file mode 100644
index 0000000..7b28f82
--- /dev/null
+++ b/gnulib/lib/unictype/pr_xid_start.h
@@ -0,0 +1,604 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[3];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[48 << 4];
+ }
+u_property_xid_start =
+{
+ { 3 },
+ {
+ 4 * sizeof (int) / sizeof (short) + 0,
+ 4 * sizeof (int) / sizeof (short) + 128,
+ 4 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 4 + 384 * sizeof (short) / sizeof (int) + 0,
+ 4 + 384 * sizeof (short) / sizeof (int) + 16,
+ 4 + 384 * sizeof (short) / sizeof (int) + 32,
+ 4 + 384 * sizeof (short) / sizeof (int) + 48,
+ 4 + 384 * sizeof (short) / sizeof (int) + 64,
+ 4 + 384 * sizeof (short) / sizeof (int) + 80,
+ 4 + 384 * sizeof (short) / sizeof (int) + 96,
+ 4 + 384 * sizeof (short) / sizeof (int) + 112,
+ 4 + 384 * sizeof (short) / sizeof (int) + 128,
+ 4 + 384 * sizeof (short) / sizeof (int) + 144,
+ 4 + 384 * sizeof (short) / sizeof (int) + 160,
+ 4 + 384 * sizeof (short) / sizeof (int) + 176,
+ 4 + 384 * sizeof (short) / sizeof (int) + 192,
+ 4 + 384 * sizeof (short) / sizeof (int) + 208,
+ 4 + 384 * sizeof (short) / sizeof (int) + 224,
+ 4 + 384 * sizeof (short) / sizeof (int) + 240,
+ 4 + 384 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 272,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 320,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 336,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 352,
+ 4 + 384 * sizeof (short) / sizeof (int) + 368,
+ 4 + 384 * sizeof (short) / sizeof (int) + 384,
+ 4 + 384 * sizeof (short) / sizeof (int) + 400,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 416,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 432,
+ 4 + 384 * sizeof (short) / sizeof (int) + 448,
+ 4 + 384 * sizeof (short) / sizeof (int) + 464,
+ 4 + 384 * sizeof (short) / sizeof (int) + 480,
+ 4 + 384 * sizeof (short) / sizeof (int) + 496,
+ 4 + 384 * sizeof (short) / sizeof (int) + 512,
+ 4 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 544,
+ 4 + 384 * sizeof (short) / sizeof (int) + 560,
+ 4 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 592,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 608,
+ 4 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 688,
+ 4 + 384 * sizeof (short) / sizeof (int) + 704,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 720,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 736,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 4 + 384 * sizeof (short) / sizeof (int) + 304,
+ 4 + 384 * sizeof (short) / sizeof (int) + 752,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x07FFFFFE, 0x07FFFFFE,
+ 0x00000000, 0x04200400, 0xFF7FFFFF, 0xFF7FFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFC3, 0x0000501F,
+ 0x00000000, 0x00000000, 0x00000000, 0x38DF0000,
+ 0xFFFFD740, 0xFFFFFFFB, 0xFFFFFFFF, 0xFFBFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFC03, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFE00FF, 0x027FFFFF, 0xFFFFFFFE,
+ 0x000000FF, 0x00000000, 0xFFFF0000, 0x000707FF,
+ 0x00000000, 0xFFFFFFFF, 0x000007FF, 0xFFFEC000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x002FFFFF, 0x9C00C060,
+ 0xFFFD0000, 0x0000FFFF, 0xFFFFE000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0002003F, 0xFFFFFC00, 0x043007FF,
+ 0x043FFFFF, 0x00000110, 0x01FFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF0, 0x23FFFFFF, 0xFF010000, 0xFEFE0003,
+ 0xFFF99FE0, 0x23C5FDFF, 0xB0004000, 0x00030003,
+ 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+ 0xFFFBBFE0, 0x23EDFDFF, 0x00010000, 0x00000003,
+ 0xFFF99FE0, 0x23EDFDFF, 0xB0000000, 0x00020003,
+ 0xD63DC7E8, 0x03FFC718, 0x00010000, 0x00000000,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x03000000, 0x00000003,
+ 0xFFFDDFE0, 0x23EFFDFF, 0x40000000, 0x00060003,
+ 0xFFFDDFE0, 0x27FFFFFF, 0x00004000, 0xFC000003,
+ 0xFC7FFFE0, 0x2FFBFFFF, 0x0000007F, 0x00000000,
+ 0xFFFFFFFE, 0x0005FFFF, 0x0000007F, 0x00000000,
+ 0xFEF02596, 0x2005ECAE, 0x3000005F, 0x00000000,
+ 0x00000001, 0x00000000, 0xFFFFFEFF, 0x00001FFF,
+ 0x00001F00, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x800007FF, 0x3C3F0000, 0xFFE1C062,
+ 0x00004003, 0xFFFFFFFF, 0xFFFF003F, 0x17FFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3D7F3DFF, 0xFFFFFFFF,
+ 0xFFFF3DFF, 0x7F3DFFFF, 0xFF7FFF3D, 0xFFFFFFFF,
+ 0xFF3DFFFF, 0xFFFFFFFF, 0x07FFFFFF, 0x00000000,
+ 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x001FFFFF,
+ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFF9FFF,
+ 0x07FFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x0001C7FF,
+ 0x0003DFFF, 0x0003FFFF, 0x0003FFFF, 0x0001DFFF,
+ 0xFFFFFFFF, 0x000FFFFF, 0x10800000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF,
+ 0xFFFFFFFF, 0xFFFF05FF, 0xFFFFFFFF, 0x003FFFFF,
+ 0x1FFFFFFF, 0x00000000, 0xFFFF0000, 0x001F3FFF,
+ 0xFFFFFFFF, 0x00000FFF, 0x000000FE, 0x00000000,
+ 0x007FFFFF, 0xFFFFFFFF, 0x001FFFFF, 0x00000000,
+ 0x00000000, 0x00000080, 0x00000000, 0x00000000,
+ 0xFFFFFFE0, 0x000FFFFF, 0x00000FE0, 0x00000000,
+ 0xFFFFFFF8, 0x0000C001, 0xFFFFFFFF, 0x0000003F,
+ 0xFFFFFFFF, 0x0000000F, 0xFC00E000, 0x3FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x0003DE00,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x80020000,
+ 0x1FFF0000, 0x00000000, 0x00000000, 0x00000000,
+ 0x3F2FFC84, 0xF3FFFD50, 0x000043E0, 0xFFFFFFFF,
+ 0x000001FF, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFF7FFF, 0x7FFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000781F,
+ 0xFFFFFFFF, 0xFFFF003F, 0xFFFFFFFF, 0x0000803F,
+ 0x007FFFFF, 0x7F7F7F7F, 0x7F7F7F7F, 0x00000000,
+ 0x000000E0, 0x1F3E03FE, 0xFFFFFFFE, 0xFFFFFFFF,
+ 0xE07FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xF7FFFFFF,
+ 0xFFFFFFE0, 0xFFFE3FFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00007FFF, 0x07FFFFFF, 0x00000000, 0xFFFF0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x003FFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00001FFF, 0x00000000, 0xFFFF0000, 0x3FFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFF1FFF, 0x00000C00, 0xFFFFFFFF, 0x80007FFF,
+ 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF,
+ 0xFF800000, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x000379FF, 0x000003FF, 0x00000000, 0xFC000000,
+ 0xFFFFF7BB, 0x00000007, 0xFFFFFFFF, 0x000FFFFF,
+ 0xFFFFFFFC, 0x000FFFFF, 0x00000000, 0x08FC0000,
+ 0xFFFFFC00, 0xFFFF003F, 0x0000007F, 0x1FFFFFFF,
+ 0xFFFFFFF0, 0x0007FFFF, 0x00008000, 0x00000000,
+ 0xFFFFFFFF, 0x000001FF, 0x00000FF7, 0x047FFFFF,
+ 0xFFFFFFFF, 0x3E62FFFF, 0x38000005, 0x00000000,
+ 0x007E7E7E, 0x00007F7F, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000007,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF000F, 0xFFFFF87F, 0x0FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFF3FFF, 0xFFFFFFFF, 0xFFFF3FFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x00000000,
+ 0xA0F8007F, 0x5F7FFDFF, 0xFFFFFFDB, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x0003FFFF, 0xFFF80000, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFFFFF0,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x3FFFFFFF, 0xFFFF0000, 0xFFFFFFFF,
+ 0xFFFCFFFF, 0xFFFFFFFF, 0x000000FF, 0x03FF0000,
+ 0x00000000, 0x00000000, 0x00000000, 0xAA8A0000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x1FFFFFFF,
+ 0x00000000, 0x07FFFFFE, 0x07FFFFFE, 0xFFFFFFC0,
+ 0x3FFFFFFF, 0x7FFFFFFF, 0x1CFCFCFC, 0x00000000,
+ 0xFFFFEFFF, 0xB7FFFF7F, 0x3FFF3FFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x07FFFFFF,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x001FFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x1FFFFFFF, 0xFFFFFFFF, 0x0001FFFF, 0x00000000,
+ 0x7FFFFFFF, 0xFFFF0000, 0x000007FF, 0x00000000,
+ 0x3FFFFFFF, 0xFFFFFFFF, 0x003EFF0F, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFD3F, 0x91BFFFFF, 0x003FFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x003FFFFF, 0x03FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFEEF0001, 0x000FFFFF, 0x00000000, 0x1FFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x003FFFFF, 0x003FFFFF, 0x0007FFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x000001FF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x00FFFFFF, 0x00000000, 0x00000000,
+ 0xFFFFFFF8, 0x0000FFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00007FFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x00007FFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0x01FFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000003, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFDFFFFF, 0xFFFFFFFF,
+ 0xDFFFFFFF, 0xEBFFDE64, 0xFFFFFFEF, 0xFFFFFFFF,
+ 0xDFDFE7BF, 0x7BFFFFFF, 0xFFFDFC5F, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFF3F, 0xF7FFFFFD, 0xF7FFFFFF,
+ 0xFFDFFFFF, 0xFFDFFFFF, 0xFFFF7FFF, 0xFFFF7FFF,
+ 0xFFFFFDFF, 0xFFFFFDFF, 0x00000FF7, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0x007FFFFF, 0x00000000,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/pr_zero_width.c b/gnulib/lib/unictype/pr_zero_width.c
new file mode 100644
index 0000000..282a391
--- /dev/null
+++ b/gnulib/lib/unictype/pr_zero_width.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_zero_width table. */
+#include "pr_zero_width.h"
+
+bool
+uc_is_property_zero_width (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_zero_width, uc);
+}
+
+const uc_property_t UC_PROPERTY_ZERO_WIDTH =
+ { &uc_is_property_zero_width };
diff --git a/gnulib/lib/unictype/pr_zero_width.h b/gnulib/lib/unictype/pr_zero_width.h
new file mode 100644
index 0000000..2cd20ad
--- /dev/null
+++ b/gnulib/lib/unictype/pr_zero_width.h
@@ -0,0 +1,456 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ /*unsigned*/ int level3[8 << 4];
+ }
+u_property_zero_width =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00002000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x0000000F, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x20000000, 0x00000000,
+ 0x00008000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00300000, 0x00000000, 0x00000000,
+ 0x0000F800, 0x00007C00, 0x00000000, 0x0000FC1F,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x80000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x0E000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x20000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x07F80000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000002, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/scripts.c b/gnulib/lib/unictype/scripts.c
new file mode 100644
index 0000000..cbaa273
--- /dev/null
+++ b/gnulib/lib/unictype/scripts.c
@@ -0,0 +1,75 @@
+/* Scripts of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include <string.h>
+
+#include "scripts.h"
+#include "unictype/scripts_byname.h"
+
+const uc_script_t *
+uc_script (ucs4_t uc)
+{
+ unsigned int index1 = uc >> script_header_0;
+ if (index1 < script_header_1)
+ {
+ int lookup1 = u_script.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> script_header_2) & script_header_3;
+ int lookup2 = u_script.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & script_header_4);
+ unsigned char lookup3 = u_script.level3[lookup2 + index3];
+
+ if (lookup3 != 0xff)
+ return &scripts[lookup3];
+ }
+ }
+ }
+ return NULL;
+}
+
+const uc_script_t *
+uc_script_byname (const char *script_name)
+{
+ const struct named_script *found;
+
+ found = uc_script_lookup (script_name, strlen (script_name));
+ if (found != NULL)
+ return &scripts[found->index];
+ else
+ return NULL;
+}
+
+bool
+uc_is_script (ucs4_t uc, const uc_script_t *script)
+{
+ return uc_script (uc) == script;
+}
+
+void
+uc_all_scripts (const uc_script_t **scriptsp, size_t *countp)
+{
+ *scriptsp = scripts;
+ *countp = sizeof (scripts) / sizeof (scripts[0]);
+}
diff --git a/gnulib/lib/unictype/scripts.h b/gnulib/lib/unictype/scripts.h
new file mode 100644
index 0000000..dc984c3
--- /dev/null
+++ b/gnulib/lib/unictype/scripts.h
@@ -0,0 +1,4337 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode scripts. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+static const uc_interval_t script_common_intervals[] =
+{
+ { 0x0000, 1, 0 }, { 0x0040, 0, 1 },
+ { 0x005B, 1, 0 }, { 0x0060, 0, 1 },
+ { 0x007B, 1, 0 }, { 0x00A9, 0, 1 },
+ { 0x00AB, 1, 0 }, { 0x00B9, 0, 1 },
+ { 0x00BB, 1, 0 }, { 0x00BF, 0, 1 },
+ { 0x00D7, 1, 1 },
+ { 0x00F7, 1, 1 },
+ { 0x02B9, 1, 0 }, { 0x02DF, 0, 1 },
+ { 0x02E5, 1, 0 }, { 0x02E9, 0, 1 },
+ { 0x02EC, 1, 0 }, { 0x02FF, 0, 1 },
+ { 0x0374, 1, 1 },
+ { 0x037E, 1, 1 },
+ { 0x0385, 1, 1 },
+ { 0x0387, 1, 1 },
+ { 0x0589, 1, 1 },
+ { 0x060C, 1, 1 },
+ { 0x061B, 1, 1 },
+ { 0x061F, 1, 1 },
+ { 0x0640, 1, 1 },
+ { 0x0660, 1, 0 }, { 0x0669, 0, 1 },
+ { 0x06DD, 1, 1 },
+ { 0x0964, 1, 0 }, { 0x0965, 0, 1 },
+ { 0x0970, 1, 1 },
+ { 0x0E3F, 1, 1 },
+ { 0x0FD5, 1, 0 }, { 0x0FD8, 0, 1 },
+ { 0x10FB, 1, 1 },
+ { 0x16EB, 1, 0 }, { 0x16ED, 0, 1 },
+ { 0x1735, 1, 0 }, { 0x1736, 0, 1 },
+ { 0x1802, 1, 0 }, { 0x1803, 0, 1 },
+ { 0x1805, 1, 1 },
+ { 0x1CD3, 1, 1 },
+ { 0x1CE1, 1, 1 },
+ { 0x1CE9, 1, 0 }, { 0x1CEC, 0, 1 },
+ { 0x1CEE, 1, 0 }, { 0x1CF2, 0, 1 },
+ { 0x2000, 1, 0 }, { 0x200B, 0, 1 },
+ { 0x200E, 1, 0 }, { 0x2064, 0, 1 },
+ { 0x206A, 1, 0 }, { 0x2070, 0, 1 },
+ { 0x2074, 1, 0 }, { 0x207E, 0, 1 },
+ { 0x2080, 1, 0 }, { 0x208E, 0, 1 },
+ { 0x20A0, 1, 0 }, { 0x20B9, 0, 1 },
+ { 0x2100, 1, 0 }, { 0x2125, 0, 1 },
+ { 0x2127, 1, 0 }, { 0x2129, 0, 1 },
+ { 0x212C, 1, 0 }, { 0x2131, 0, 1 },
+ { 0x2133, 1, 0 }, { 0x214D, 0, 1 },
+ { 0x214F, 1, 0 }, { 0x215F, 0, 1 },
+ { 0x2189, 1, 1 },
+ { 0x2190, 1, 0 }, { 0x23F3, 0, 1 },
+ { 0x2400, 1, 0 }, { 0x2426, 0, 1 },
+ { 0x2440, 1, 0 }, { 0x244A, 0, 1 },
+ { 0x2460, 1, 0 }, { 0x26FF, 0, 1 },
+ { 0x2701, 1, 0 }, { 0x27CA, 0, 1 },
+ { 0x27CC, 1, 1 },
+ { 0x27CE, 1, 0 }, { 0x27FF, 0, 1 },
+ { 0x2900, 1, 0 }, { 0x2B4C, 0, 1 },
+ { 0x2B50, 1, 0 }, { 0x2B59, 0, 1 },
+ { 0x2E00, 1, 0 }, { 0x2E31, 0, 1 },
+ { 0x2FF0, 1, 0 }, { 0x2FFB, 0, 1 },
+ { 0x3000, 1, 0 }, { 0x3004, 0, 1 },
+ { 0x3006, 1, 1 },
+ { 0x3008, 1, 0 }, { 0x3020, 0, 1 },
+ { 0x3030, 1, 0 }, { 0x3037, 0, 1 },
+ { 0x303C, 1, 0 }, { 0x303F, 0, 1 },
+ { 0x309B, 1, 0 }, { 0x309C, 0, 1 },
+ { 0x30A0, 1, 1 },
+ { 0x30FB, 1, 0 }, { 0x30FC, 0, 1 },
+ { 0x3190, 1, 0 }, { 0x319F, 0, 1 },
+ { 0x31C0, 1, 0 }, { 0x31E3, 0, 1 },
+ { 0x3220, 1, 0 }, { 0x325F, 0, 1 },
+ { 0x327F, 1, 0 }, { 0x32CF, 0, 1 },
+ { 0x3358, 1, 0 }, { 0x33FF, 0, 1 },
+ { 0x4DC0, 1, 0 }, { 0x4DFF, 0, 1 },
+ { 0xA700, 1, 0 }, { 0xA721, 0, 1 },
+ { 0xA788, 1, 0 }, { 0xA78A, 0, 1 },
+ { 0xA830, 1, 0 }, { 0xA839, 0, 1 },
+ { 0xFD3E, 1, 0 }, { 0xFD3F, 0, 1 },
+ { 0xFDFD, 1, 1 },
+ { 0xFE10, 1, 0 }, { 0xFE19, 0, 1 },
+ { 0xFE30, 1, 0 }, { 0xFE52, 0, 1 },
+ { 0xFE54, 1, 0 }, { 0xFE66, 0, 1 },
+ { 0xFE68, 1, 0 }, { 0xFE6B, 0, 1 },
+ { 0xFEFF, 1, 1 },
+ { 0xFF01, 1, 0 }, { 0xFF20, 0, 1 },
+ { 0xFF3B, 1, 0 }, { 0xFF40, 0, 1 },
+ { 0xFF5B, 1, 0 }, { 0xFF65, 0, 1 },
+ { 0xFF70, 1, 1 },
+ { 0xFF9E, 1, 0 }, { 0xFF9F, 0, 1 },
+ { 0xFFE0, 1, 0 }, { 0xFFE6, 0, 1 },
+ { 0xFFE8, 1, 0 }, { 0xFFEE, 0, 1 },
+ { 0xFFF9, 1, 0 }, { 0xFFFD, 0, 1 },
+ { 0x10100, 1, 0 }, { 0x10102, 0, 1 },
+ { 0x10107, 1, 0 }, { 0x10133, 0, 1 },
+ { 0x10137, 1, 0 }, { 0x1013F, 0, 1 },
+ { 0x10190, 1, 0 }, { 0x1019B, 0, 1 },
+ { 0x101D0, 1, 0 }, { 0x101FC, 0, 1 },
+ { 0x1D000, 1, 0 }, { 0x1D0F5, 0, 1 },
+ { 0x1D100, 1, 0 }, { 0x1D126, 0, 1 },
+ { 0x1D129, 1, 0 }, { 0x1D166, 0, 1 },
+ { 0x1D16A, 1, 0 }, { 0x1D17A, 0, 1 },
+ { 0x1D183, 1, 0 }, { 0x1D184, 0, 1 },
+ { 0x1D18C, 1, 0 }, { 0x1D1A9, 0, 1 },
+ { 0x1D1AE, 1, 0 }, { 0x1D1DD, 0, 1 },
+ { 0x1D300, 1, 0 }, { 0x1D356, 0, 1 },
+ { 0x1D360, 1, 0 }, { 0x1D371, 0, 1 },
+ { 0x1D400, 1, 0 }, { 0x1D454, 0, 1 },
+ { 0x1D456, 1, 0 }, { 0x1D49C, 0, 1 },
+ { 0x1D49E, 1, 0 }, { 0x1D49F, 0, 1 },
+ { 0x1D4A2, 1, 1 },
+ { 0x1D4A5, 1, 0 }, { 0x1D4A6, 0, 1 },
+ { 0x1D4A9, 1, 0 }, { 0x1D4AC, 0, 1 },
+ { 0x1D4AE, 1, 0 }, { 0x1D4B9, 0, 1 },
+ { 0x1D4BB, 1, 1 },
+ { 0x1D4BD, 1, 0 }, { 0x1D4C3, 0, 1 },
+ { 0x1D4C5, 1, 0 }, { 0x1D505, 0, 1 },
+ { 0x1D507, 1, 0 }, { 0x1D50A, 0, 1 },
+ { 0x1D50D, 1, 0 }, { 0x1D514, 0, 1 },
+ { 0x1D516, 1, 0 }, { 0x1D51C, 0, 1 },
+ { 0x1D51E, 1, 0 }, { 0x1D539, 0, 1 },
+ { 0x1D53B, 1, 0 }, { 0x1D53E, 0, 1 },
+ { 0x1D540, 1, 0 }, { 0x1D544, 0, 1 },
+ { 0x1D546, 1, 1 },
+ { 0x1D54A, 1, 0 }, { 0x1D550, 0, 1 },
+ { 0x1D552, 1, 0 }, { 0x1D6A5, 0, 1 },
+ { 0x1D6A8, 1, 0 }, { 0x1D7CB, 0, 1 },
+ { 0x1D7CE, 1, 0 }, { 0x1D7FF, 0, 1 },
+ { 0x1F000, 1, 0 }, { 0x1F02B, 0, 1 },
+ { 0x1F030, 1, 0 }, { 0x1F093, 0, 1 },
+ { 0x1F0A0, 1, 0 }, { 0x1F0AE, 0, 1 },
+ { 0x1F0B1, 1, 0 }, { 0x1F0BE, 0, 1 },
+ { 0x1F0C1, 1, 0 }, { 0x1F0CF, 0, 1 },
+ { 0x1F0D1, 1, 0 }, { 0x1F0DF, 0, 1 },
+ { 0x1F100, 1, 0 }, { 0x1F10A, 0, 1 },
+ { 0x1F110, 1, 0 }, { 0x1F12E, 0, 1 },
+ { 0x1F130, 1, 0 }, { 0x1F169, 0, 1 },
+ { 0x1F170, 1, 0 }, { 0x1F19A, 0, 1 },
+ { 0x1F1E6, 1, 0 }, { 0x1F1FF, 0, 1 },
+ { 0x1F201, 1, 0 }, { 0x1F202, 0, 1 },
+ { 0x1F210, 1, 0 }, { 0x1F23A, 0, 1 },
+ { 0x1F240, 1, 0 }, { 0x1F248, 0, 1 },
+ { 0x1F250, 1, 0 }, { 0x1F251, 0, 1 },
+ { 0x1F300, 1, 0 }, { 0x1F320, 0, 1 },
+ { 0x1F330, 1, 0 }, { 0x1F335, 0, 1 },
+ { 0x1F337, 1, 0 }, { 0x1F37C, 0, 1 },
+ { 0x1F380, 1, 0 }, { 0x1F393, 0, 1 },
+ { 0x1F3A0, 1, 0 }, { 0x1F3C4, 0, 1 },
+ { 0x1F3C6, 1, 0 }, { 0x1F3CA, 0, 1 },
+ { 0x1F3E0, 1, 0 }, { 0x1F3F0, 0, 1 },
+ { 0x1F400, 1, 0 }, { 0x1F43E, 0, 1 },
+ { 0x1F440, 1, 1 },
+ { 0x1F442, 1, 0 }, { 0x1F4F7, 0, 1 },
+ { 0x1F4F9, 1, 0 }, { 0x1F4FC, 0, 1 },
+ { 0x1F500, 1, 0 }, { 0x1F53D, 0, 1 },
+ { 0x1F550, 1, 0 }, { 0x1F567, 0, 1 },
+ { 0x1F5FB, 1, 0 }, { 0x1F5FF, 0, 1 },
+ { 0x1F601, 1, 0 }, { 0x1F610, 0, 1 },
+ { 0x1F612, 1, 0 }, { 0x1F614, 0, 1 },
+ { 0x1F616, 1, 1 },
+ { 0x1F618, 1, 1 },
+ { 0x1F61A, 1, 1 },
+ { 0x1F61C, 1, 0 }, { 0x1F61E, 0, 1 },
+ { 0x1F620, 1, 0 }, { 0x1F625, 0, 1 },
+ { 0x1F628, 1, 0 }, { 0x1F62B, 0, 1 },
+ { 0x1F62D, 1, 1 },
+ { 0x1F630, 1, 0 }, { 0x1F633, 0, 1 },
+ { 0x1F635, 1, 0 }, { 0x1F640, 0, 1 },
+ { 0x1F645, 1, 0 }, { 0x1F64F, 0, 1 },
+ { 0x1F680, 1, 0 }, { 0x1F6C5, 0, 1 },
+ { 0x1F700, 1, 0 }, { 0x1F773, 0, 1 },
+ { 0xE0001, 1, 1 },
+ { 0xE0020, 1, 0 }, { 0xE007F, 0, 1 }
+};
+static const uc_interval_t script_latin_intervals[] =
+{
+ { 0x0041, 1, 0 }, { 0x005A, 0, 1 },
+ { 0x0061, 1, 0 }, { 0x007A, 0, 1 },
+ { 0x00AA, 1, 1 },
+ { 0x00BA, 1, 1 },
+ { 0x00C0, 1, 0 }, { 0x00D6, 0, 1 },
+ { 0x00D8, 1, 0 }, { 0x00F6, 0, 1 },
+ { 0x00F8, 1, 0 }, { 0x02B8, 0, 1 },
+ { 0x02E0, 1, 0 }, { 0x02E4, 0, 1 },
+ { 0x1D00, 1, 0 }, { 0x1D25, 0, 1 },
+ { 0x1D2C, 1, 0 }, { 0x1D5C, 0, 1 },
+ { 0x1D62, 1, 0 }, { 0x1D65, 0, 1 },
+ { 0x1D6B, 1, 0 }, { 0x1D77, 0, 1 },
+ { 0x1D79, 1, 0 }, { 0x1DBE, 0, 1 },
+ { 0x1E00, 1, 0 }, { 0x1EFF, 0, 1 },
+ { 0x2071, 1, 1 },
+ { 0x207F, 1, 1 },
+ { 0x2090, 1, 0 }, { 0x209C, 0, 1 },
+ { 0x212A, 1, 0 }, { 0x212B, 0, 1 },
+ { 0x2132, 1, 1 },
+ { 0x214E, 1, 1 },
+ { 0x2160, 1, 0 }, { 0x2188, 0, 1 },
+ { 0x2C60, 1, 0 }, { 0x2C7F, 0, 1 },
+ { 0xA722, 1, 0 }, { 0xA787, 0, 1 },
+ { 0xA78B, 1, 0 }, { 0xA78E, 0, 1 },
+ { 0xA790, 1, 0 }, { 0xA791, 0, 1 },
+ { 0xA7A0, 1, 0 }, { 0xA7A9, 0, 1 },
+ { 0xA7FA, 1, 0 }, { 0xA7FF, 0, 1 },
+ { 0xFB00, 1, 0 }, { 0xFB06, 0, 1 },
+ { 0xFF21, 1, 0 }, { 0xFF3A, 0, 1 },
+ { 0xFF41, 1, 0 }, { 0xFF5A, 0, 1 }
+};
+static const uc_interval_t script_greek_intervals[] =
+{
+ { 0x0370, 1, 0 }, { 0x0373, 0, 1 },
+ { 0x0375, 1, 0 }, { 0x0377, 0, 1 },
+ { 0x037A, 1, 0 }, { 0x037D, 0, 1 },
+ { 0x0384, 1, 1 },
+ { 0x0386, 1, 1 },
+ { 0x0388, 1, 0 }, { 0x038A, 0, 1 },
+ { 0x038C, 1, 1 },
+ { 0x038E, 1, 0 }, { 0x03A1, 0, 1 },
+ { 0x03A3, 1, 0 }, { 0x03E1, 0, 1 },
+ { 0x03F0, 1, 0 }, { 0x03FF, 0, 1 },
+ { 0x1D26, 1, 0 }, { 0x1D2A, 0, 1 },
+ { 0x1D5D, 1, 0 }, { 0x1D61, 0, 1 },
+ { 0x1D66, 1, 0 }, { 0x1D6A, 0, 1 },
+ { 0x1DBF, 1, 1 },
+ { 0x1F00, 1, 0 }, { 0x1F15, 0, 1 },
+ { 0x1F18, 1, 0 }, { 0x1F1D, 0, 1 },
+ { 0x1F20, 1, 0 }, { 0x1F45, 0, 1 },
+ { 0x1F48, 1, 0 }, { 0x1F4D, 0, 1 },
+ { 0x1F50, 1, 0 }, { 0x1F57, 0, 1 },
+ { 0x1F59, 1, 1 },
+ { 0x1F5B, 1, 1 },
+ { 0x1F5D, 1, 1 },
+ { 0x1F5F, 1, 0 }, { 0x1F7D, 0, 1 },
+ { 0x1F80, 1, 0 }, { 0x1FB4, 0, 1 },
+ { 0x1FB6, 1, 0 }, { 0x1FC4, 0, 1 },
+ { 0x1FC6, 1, 0 }, { 0x1FD3, 0, 1 },
+ { 0x1FD6, 1, 0 }, { 0x1FDB, 0, 1 },
+ { 0x1FDD, 1, 0 }, { 0x1FEF, 0, 1 },
+ { 0x1FF2, 1, 0 }, { 0x1FF4, 0, 1 },
+ { 0x1FF6, 1, 0 }, { 0x1FFE, 0, 1 },
+ { 0x2126, 1, 1 },
+ { 0x10140, 1, 0 }, { 0x1018A, 0, 1 },
+ { 0x1D200, 1, 0 }, { 0x1D245, 0, 1 }
+};
+static const uc_interval_t script_cyrillic_intervals[] =
+{
+ { 0x0400, 1, 0 }, { 0x0484, 0, 1 },
+ { 0x0487, 1, 0 }, { 0x0527, 0, 1 },
+ { 0x1D2B, 1, 1 },
+ { 0x1D78, 1, 1 },
+ { 0x2DE0, 1, 0 }, { 0x2DFF, 0, 1 },
+ { 0xA640, 1, 0 }, { 0xA673, 0, 1 },
+ { 0xA67C, 1, 0 }, { 0xA697, 0, 1 }
+};
+static const uc_interval_t script_armenian_intervals[] =
+{
+ { 0x0531, 1, 0 }, { 0x0556, 0, 1 },
+ { 0x0559, 1, 0 }, { 0x055F, 0, 1 },
+ { 0x0561, 1, 0 }, { 0x0587, 0, 1 },
+ { 0x058A, 1, 1 },
+ { 0xFB13, 1, 0 }, { 0xFB17, 0, 1 }
+};
+static const uc_interval_t script_hebrew_intervals[] =
+{
+ { 0x0591, 1, 0 }, { 0x05C7, 0, 1 },
+ { 0x05D0, 1, 0 }, { 0x05EA, 0, 1 },
+ { 0x05F0, 1, 0 }, { 0x05F4, 0, 1 },
+ { 0xFB1D, 1, 0 }, { 0xFB36, 0, 1 },
+ { 0xFB38, 1, 0 }, { 0xFB3C, 0, 1 },
+ { 0xFB3E, 1, 1 },
+ { 0xFB40, 1, 0 }, { 0xFB41, 0, 1 },
+ { 0xFB43, 1, 0 }, { 0xFB44, 0, 1 },
+ { 0xFB46, 1, 0 }, { 0xFB4F, 0, 1 }
+};
+static const uc_interval_t script_arabic_intervals[] =
+{
+ { 0x0600, 1, 0 }, { 0x0603, 0, 1 },
+ { 0x0606, 1, 0 }, { 0x060B, 0, 1 },
+ { 0x060D, 1, 0 }, { 0x061A, 0, 1 },
+ { 0x061E, 1, 1 },
+ { 0x0620, 1, 0 }, { 0x063F, 0, 1 },
+ { 0x0641, 1, 0 }, { 0x064A, 0, 1 },
+ { 0x0656, 1, 0 }, { 0x065E, 0, 1 },
+ { 0x066A, 1, 0 }, { 0x066F, 0, 1 },
+ { 0x0671, 1, 0 }, { 0x06DC, 0, 1 },
+ { 0x06DE, 1, 0 }, { 0x06FF, 0, 1 },
+ { 0x0750, 1, 0 }, { 0x077F, 0, 1 },
+ { 0xFB50, 1, 0 }, { 0xFBC1, 0, 1 },
+ { 0xFBD3, 1, 0 }, { 0xFD3D, 0, 1 },
+ { 0xFD50, 1, 0 }, { 0xFD8F, 0, 1 },
+ { 0xFD92, 1, 0 }, { 0xFDC7, 0, 1 },
+ { 0xFDF0, 1, 0 }, { 0xFDFC, 0, 1 },
+ { 0xFE70, 1, 0 }, { 0xFE74, 0, 1 },
+ { 0xFE76, 1, 0 }, { 0xFEFC, 0, 1 },
+ { 0x10E60, 1, 0 }, { 0x10E7E, 0, 1 }
+};
+static const uc_interval_t script_syriac_intervals[] =
+{
+ { 0x0700, 1, 0 }, { 0x070D, 0, 1 },
+ { 0x070F, 1, 0 }, { 0x074A, 0, 1 },
+ { 0x074D, 1, 0 }, { 0x074F, 0, 1 }
+};
+static const uc_interval_t script_thaana_intervals[] =
+{
+ { 0x0780, 1, 0 }, { 0x07B1, 0, 1 }
+};
+static const uc_interval_t script_devanagari_intervals[] =
+{
+ { 0x0900, 1, 0 }, { 0x0950, 0, 1 },
+ { 0x0953, 1, 0 }, { 0x0963, 0, 1 },
+ { 0x0966, 1, 0 }, { 0x096F, 0, 1 },
+ { 0x0971, 1, 0 }, { 0x0977, 0, 1 },
+ { 0x0979, 1, 0 }, { 0x097F, 0, 1 },
+ { 0xA8E0, 1, 0 }, { 0xA8FB, 0, 1 }
+};
+static const uc_interval_t script_bengali_intervals[] =
+{
+ { 0x0981, 1, 0 }, { 0x0983, 0, 1 },
+ { 0x0985, 1, 0 }, { 0x098C, 0, 1 },
+ { 0x098F, 1, 0 }, { 0x0990, 0, 1 },
+ { 0x0993, 1, 0 }, { 0x09A8, 0, 1 },
+ { 0x09AA, 1, 0 }, { 0x09B0, 0, 1 },
+ { 0x09B2, 1, 1 },
+ { 0x09B6, 1, 0 }, { 0x09B9, 0, 1 },
+ { 0x09BC, 1, 0 }, { 0x09C4, 0, 1 },
+ { 0x09C7, 1, 0 }, { 0x09C8, 0, 1 },
+ { 0x09CB, 1, 0 }, { 0x09CE, 0, 1 },
+ { 0x09D7, 1, 1 },
+ { 0x09DC, 1, 0 }, { 0x09DD, 0, 1 },
+ { 0x09DF, 1, 0 }, { 0x09E3, 0, 1 },
+ { 0x09E6, 1, 0 }, { 0x09FB, 0, 1 }
+};
+static const uc_interval_t script_gurmukhi_intervals[] =
+{
+ { 0x0A01, 1, 0 }, { 0x0A03, 0, 1 },
+ { 0x0A05, 1, 0 }, { 0x0A0A, 0, 1 },
+ { 0x0A0F, 1, 0 }, { 0x0A10, 0, 1 },
+ { 0x0A13, 1, 0 }, { 0x0A28, 0, 1 },
+ { 0x0A2A, 1, 0 }, { 0x0A30, 0, 1 },
+ { 0x0A32, 1, 0 }, { 0x0A33, 0, 1 },
+ { 0x0A35, 1, 0 }, { 0x0A36, 0, 1 },
+ { 0x0A38, 1, 0 }, { 0x0A39, 0, 1 },
+ { 0x0A3C, 1, 1 },
+ { 0x0A3E, 1, 0 }, { 0x0A42, 0, 1 },
+ { 0x0A47, 1, 0 }, { 0x0A48, 0, 1 },
+ { 0x0A4B, 1, 0 }, { 0x0A4D, 0, 1 },
+ { 0x0A51, 1, 1 },
+ { 0x0A59, 1, 0 }, { 0x0A5C, 0, 1 },
+ { 0x0A5E, 1, 1 },
+ { 0x0A66, 1, 0 }, { 0x0A75, 0, 1 }
+};
+static const uc_interval_t script_gujarati_intervals[] =
+{
+ { 0x0A81, 1, 0 }, { 0x0A83, 0, 1 },
+ { 0x0A85, 1, 0 }, { 0x0A8D, 0, 1 },
+ { 0x0A8F, 1, 0 }, { 0x0A91, 0, 1 },
+ { 0x0A93, 1, 0 }, { 0x0AA8, 0, 1 },
+ { 0x0AAA, 1, 0 }, { 0x0AB0, 0, 1 },
+ { 0x0AB2, 1, 0 }, { 0x0AB3, 0, 1 },
+ { 0x0AB5, 1, 0 }, { 0x0AB9, 0, 1 },
+ { 0x0ABC, 1, 0 }, { 0x0AC5, 0, 1 },
+ { 0x0AC7, 1, 0 }, { 0x0AC9, 0, 1 },
+ { 0x0ACB, 1, 0 }, { 0x0ACD, 0, 1 },
+ { 0x0AD0, 1, 1 },
+ { 0x0AE0, 1, 0 }, { 0x0AE3, 0, 1 },
+ { 0x0AE6, 1, 0 }, { 0x0AEF, 0, 1 },
+ { 0x0AF1, 1, 1 }
+};
+static const uc_interval_t script_oriya_intervals[] =
+{
+ { 0x0B01, 1, 0 }, { 0x0B03, 0, 1 },
+ { 0x0B05, 1, 0 }, { 0x0B0C, 0, 1 },
+ { 0x0B0F, 1, 0 }, { 0x0B10, 0, 1 },
+ { 0x0B13, 1, 0 }, { 0x0B28, 0, 1 },
+ { 0x0B2A, 1, 0 }, { 0x0B30, 0, 1 },
+ { 0x0B32, 1, 0 }, { 0x0B33, 0, 1 },
+ { 0x0B35, 1, 0 }, { 0x0B39, 0, 1 },
+ { 0x0B3C, 1, 0 }, { 0x0B44, 0, 1 },
+ { 0x0B47, 1, 0 }, { 0x0B48, 0, 1 },
+ { 0x0B4B, 1, 0 }, { 0x0B4D, 0, 1 },
+ { 0x0B56, 1, 0 }, { 0x0B57, 0, 1 },
+ { 0x0B5C, 1, 0 }, { 0x0B5D, 0, 1 },
+ { 0x0B5F, 1, 0 }, { 0x0B63, 0, 1 },
+ { 0x0B66, 1, 0 }, { 0x0B77, 0, 1 }
+};
+static const uc_interval_t script_tamil_intervals[] =
+{
+ { 0x0B82, 1, 0 }, { 0x0B83, 0, 1 },
+ { 0x0B85, 1, 0 }, { 0x0B8A, 0, 1 },
+ { 0x0B8E, 1, 0 }, { 0x0B90, 0, 1 },
+ { 0x0B92, 1, 0 }, { 0x0B95, 0, 1 },
+ { 0x0B99, 1, 0 }, { 0x0B9A, 0, 1 },
+ { 0x0B9C, 1, 1 },
+ { 0x0B9E, 1, 0 }, { 0x0B9F, 0, 1 },
+ { 0x0BA3, 1, 0 }, { 0x0BA4, 0, 1 },
+ { 0x0BA8, 1, 0 }, { 0x0BAA, 0, 1 },
+ { 0x0BAE, 1, 0 }, { 0x0BB9, 0, 1 },
+ { 0x0BBE, 1, 0 }, { 0x0BC2, 0, 1 },
+ { 0x0BC6, 1, 0 }, { 0x0BC8, 0, 1 },
+ { 0x0BCA, 1, 0 }, { 0x0BCD, 0, 1 },
+ { 0x0BD0, 1, 1 },
+ { 0x0BD7, 1, 1 },
+ { 0x0BE6, 1, 0 }, { 0x0BFA, 0, 1 }
+};
+static const uc_interval_t script_telugu_intervals[] =
+{
+ { 0x0C01, 1, 0 }, { 0x0C03, 0, 1 },
+ { 0x0C05, 1, 0 }, { 0x0C0C, 0, 1 },
+ { 0x0C0E, 1, 0 }, { 0x0C10, 0, 1 },
+ { 0x0C12, 1, 0 }, { 0x0C28, 0, 1 },
+ { 0x0C2A, 1, 0 }, { 0x0C33, 0, 1 },
+ { 0x0C35, 1, 0 }, { 0x0C39, 0, 1 },
+ { 0x0C3D, 1, 0 }, { 0x0C44, 0, 1 },
+ { 0x0C46, 1, 0 }, { 0x0C48, 0, 1 },
+ { 0x0C4A, 1, 0 }, { 0x0C4D, 0, 1 },
+ { 0x0C55, 1, 0 }, { 0x0C56, 0, 1 },
+ { 0x0C58, 1, 0 }, { 0x0C59, 0, 1 },
+ { 0x0C60, 1, 0 }, { 0x0C63, 0, 1 },
+ { 0x0C66, 1, 0 }, { 0x0C6F, 0, 1 },
+ { 0x0C78, 1, 0 }, { 0x0C7F, 0, 1 }
+};
+static const uc_interval_t script_kannada_intervals[] =
+{
+ { 0x0C82, 1, 0 }, { 0x0C83, 0, 1 },
+ { 0x0C85, 1, 0 }, { 0x0C8C, 0, 1 },
+ { 0x0C8E, 1, 0 }, { 0x0C90, 0, 1 },
+ { 0x0C92, 1, 0 }, { 0x0CA8, 0, 1 },
+ { 0x0CAA, 1, 0 }, { 0x0CB3, 0, 1 },
+ { 0x0CB5, 1, 0 }, { 0x0CB9, 0, 1 },
+ { 0x0CBC, 1, 0 }, { 0x0CC4, 0, 1 },
+ { 0x0CC6, 1, 0 }, { 0x0CC8, 0, 1 },
+ { 0x0CCA, 1, 0 }, { 0x0CCD, 0, 1 },
+ { 0x0CD5, 1, 0 }, { 0x0CD6, 0, 1 },
+ { 0x0CDE, 1, 1 },
+ { 0x0CE0, 1, 0 }, { 0x0CE3, 0, 1 },
+ { 0x0CE6, 1, 0 }, { 0x0CEF, 0, 1 },
+ { 0x0CF1, 1, 0 }, { 0x0CF2, 0, 1 }
+};
+static const uc_interval_t script_malayalam_intervals[] =
+{
+ { 0x0D02, 1, 0 }, { 0x0D03, 0, 1 },
+ { 0x0D05, 1, 0 }, { 0x0D0C, 0, 1 },
+ { 0x0D0E, 1, 0 }, { 0x0D10, 0, 1 },
+ { 0x0D12, 1, 0 }, { 0x0D3A, 0, 1 },
+ { 0x0D3D, 1, 0 }, { 0x0D44, 0, 1 },
+ { 0x0D46, 1, 0 }, { 0x0D48, 0, 1 },
+ { 0x0D4A, 1, 0 }, { 0x0D4E, 0, 1 },
+ { 0x0D57, 1, 1 },
+ { 0x0D60, 1, 0 }, { 0x0D63, 0, 1 },
+ { 0x0D66, 1, 0 }, { 0x0D75, 0, 1 },
+ { 0x0D79, 1, 0 }, { 0x0D7F, 0, 1 }
+};
+static const uc_interval_t script_sinhala_intervals[] =
+{
+ { 0x0D82, 1, 0 }, { 0x0D83, 0, 1 },
+ { 0x0D85, 1, 0 }, { 0x0D96, 0, 1 },
+ { 0x0D9A, 1, 0 }, { 0x0DB1, 0, 1 },
+ { 0x0DB3, 1, 0 }, { 0x0DBB, 0, 1 },
+ { 0x0DBD, 1, 1 },
+ { 0x0DC0, 1, 0 }, { 0x0DC6, 0, 1 },
+ { 0x0DCA, 1, 1 },
+ { 0x0DCF, 1, 0 }, { 0x0DD4, 0, 1 },
+ { 0x0DD6, 1, 1 },
+ { 0x0DD8, 1, 0 }, { 0x0DDF, 0, 1 },
+ { 0x0DF2, 1, 0 }, { 0x0DF4, 0, 1 }
+};
+static const uc_interval_t script_thai_intervals[] =
+{
+ { 0x0E01, 1, 0 }, { 0x0E3A, 0, 1 },
+ { 0x0E40, 1, 0 }, { 0x0E5B, 0, 1 }
+};
+static const uc_interval_t script_lao_intervals[] =
+{
+ { 0x0E81, 1, 0 }, { 0x0E82, 0, 1 },
+ { 0x0E84, 1, 1 },
+ { 0x0E87, 1, 0 }, { 0x0E88, 0, 1 },
+ { 0x0E8A, 1, 1 },
+ { 0x0E8D, 1, 1 },
+ { 0x0E94, 1, 0 }, { 0x0E97, 0, 1 },
+ { 0x0E99, 1, 0 }, { 0x0E9F, 0, 1 },
+ { 0x0EA1, 1, 0 }, { 0x0EA3, 0, 1 },
+ { 0x0EA5, 1, 1 },
+ { 0x0EA7, 1, 1 },
+ { 0x0EAA, 1, 0 }, { 0x0EAB, 0, 1 },
+ { 0x0EAD, 1, 0 }, { 0x0EB9, 0, 1 },
+ { 0x0EBB, 1, 0 }, { 0x0EBD, 0, 1 },
+ { 0x0EC0, 1, 0 }, { 0x0EC4, 0, 1 },
+ { 0x0EC6, 1, 1 },
+ { 0x0EC8, 1, 0 }, { 0x0ECD, 0, 1 },
+ { 0x0ED0, 1, 0 }, { 0x0ED9, 0, 1 },
+ { 0x0EDC, 1, 0 }, { 0x0EDD, 0, 1 }
+};
+static const uc_interval_t script_tibetan_intervals[] =
+{
+ { 0x0F00, 1, 0 }, { 0x0F47, 0, 1 },
+ { 0x0F49, 1, 0 }, { 0x0F6C, 0, 1 },
+ { 0x0F71, 1, 0 }, { 0x0F97, 0, 1 },
+ { 0x0F99, 1, 0 }, { 0x0FBC, 0, 1 },
+ { 0x0FBE, 1, 0 }, { 0x0FCC, 0, 1 },
+ { 0x0FCE, 1, 0 }, { 0x0FD4, 0, 1 },
+ { 0x0FD9, 1, 0 }, { 0x0FDA, 0, 1 }
+};
+static const uc_interval_t script_myanmar_intervals[] =
+{
+ { 0x1000, 1, 0 }, { 0x109F, 0, 1 },
+ { 0xAA60, 1, 0 }, { 0xAA7B, 0, 1 }
+};
+static const uc_interval_t script_georgian_intervals[] =
+{
+ { 0x10A0, 1, 0 }, { 0x10C5, 0, 1 },
+ { 0x10D0, 1, 0 }, { 0x10FA, 0, 1 },
+ { 0x10FC, 1, 1 },
+ { 0x2D00, 1, 0 }, { 0x2D25, 0, 1 }
+};
+static const uc_interval_t script_hangul_intervals[] =
+{
+ { 0x1100, 1, 0 }, { 0x11FF, 0, 1 },
+ { 0x302E, 1, 0 }, { 0x302F, 0, 1 },
+ { 0x3131, 1, 0 }, { 0x318E, 0, 1 },
+ { 0x3200, 1, 0 }, { 0x321E, 0, 1 },
+ { 0x3260, 1, 0 }, { 0x327E, 0, 1 },
+ { 0xA960, 1, 0 }, { 0xA97C, 0, 1 },
+ { 0xAC00, 1, 0 }, { 0xD7A3, 0, 1 },
+ { 0xD7B0, 1, 0 }, { 0xD7C6, 0, 1 },
+ { 0xD7CB, 1, 0 }, { 0xD7FB, 0, 1 },
+ { 0xFFA0, 1, 0 }, { 0xFFBE, 0, 1 },
+ { 0xFFC2, 1, 0 }, { 0xFFC7, 0, 1 },
+ { 0xFFCA, 1, 0 }, { 0xFFCF, 0, 1 },
+ { 0xFFD2, 1, 0 }, { 0xFFD7, 0, 1 },
+ { 0xFFDA, 1, 0 }, { 0xFFDC, 0, 1 }
+};
+static const uc_interval_t script_ethiopic_intervals[] =
+{
+ { 0x1200, 1, 0 }, { 0x1248, 0, 1 },
+ { 0x124A, 1, 0 }, { 0x124D, 0, 1 },
+ { 0x1250, 1, 0 }, { 0x1256, 0, 1 },
+ { 0x1258, 1, 1 },
+ { 0x125A, 1, 0 }, { 0x125D, 0, 1 },
+ { 0x1260, 1, 0 }, { 0x1288, 0, 1 },
+ { 0x128A, 1, 0 }, { 0x128D, 0, 1 },
+ { 0x1290, 1, 0 }, { 0x12B0, 0, 1 },
+ { 0x12B2, 1, 0 }, { 0x12B5, 0, 1 },
+ { 0x12B8, 1, 0 }, { 0x12BE, 0, 1 },
+ { 0x12C0, 1, 1 },
+ { 0x12C2, 1, 0 }, { 0x12C5, 0, 1 },
+ { 0x12C8, 1, 0 }, { 0x12D6, 0, 1 },
+ { 0x12D8, 1, 0 }, { 0x1310, 0, 1 },
+ { 0x1312, 1, 0 }, { 0x1315, 0, 1 },
+ { 0x1318, 1, 0 }, { 0x135A, 0, 1 },
+ { 0x135D, 1, 0 }, { 0x137C, 0, 1 },
+ { 0x1380, 1, 0 }, { 0x1399, 0, 1 },
+ { 0x2D80, 1, 0 }, { 0x2D96, 0, 1 },
+ { 0x2DA0, 1, 0 }, { 0x2DA6, 0, 1 },
+ { 0x2DA8, 1, 0 }, { 0x2DAE, 0, 1 },
+ { 0x2DB0, 1, 0 }, { 0x2DB6, 0, 1 },
+ { 0x2DB8, 1, 0 }, { 0x2DBE, 0, 1 },
+ { 0x2DC0, 1, 0 }, { 0x2DC6, 0, 1 },
+ { 0x2DC8, 1, 0 }, { 0x2DCE, 0, 1 },
+ { 0x2DD0, 1, 0 }, { 0x2DD6, 0, 1 },
+ { 0x2DD8, 1, 0 }, { 0x2DDE, 0, 1 },
+ { 0xAB01, 1, 0 }, { 0xAB06, 0, 1 },
+ { 0xAB09, 1, 0 }, { 0xAB0E, 0, 1 },
+ { 0xAB11, 1, 0 }, { 0xAB16, 0, 1 },
+ { 0xAB20, 1, 0 }, { 0xAB26, 0, 1 },
+ { 0xAB28, 1, 0 }, { 0xAB2E, 0, 1 }
+};
+static const uc_interval_t script_cherokee_intervals[] =
+{
+ { 0x13A0, 1, 0 }, { 0x13F4, 0, 1 }
+};
+static const uc_interval_t script_canadian_aboriginal_intervals[] =
+{
+ { 0x1400, 1, 0 }, { 0x167F, 0, 1 },
+ { 0x18B0, 1, 0 }, { 0x18F5, 0, 1 }
+};
+static const uc_interval_t script_ogham_intervals[] =
+{
+ { 0x1680, 1, 0 }, { 0x169C, 0, 1 }
+};
+static const uc_interval_t script_runic_intervals[] =
+{
+ { 0x16A0, 1, 0 }, { 0x16EA, 0, 1 },
+ { 0x16EE, 1, 0 }, { 0x16F0, 0, 1 }
+};
+static const uc_interval_t script_khmer_intervals[] =
+{
+ { 0x1780, 1, 0 }, { 0x17DD, 0, 1 },
+ { 0x17E0, 1, 0 }, { 0x17E9, 0, 1 },
+ { 0x17F0, 1, 0 }, { 0x17F9, 0, 1 },
+ { 0x19E0, 1, 0 }, { 0x19FF, 0, 1 }
+};
+static const uc_interval_t script_mongolian_intervals[] =
+{
+ { 0x1800, 1, 0 }, { 0x1801, 0, 1 },
+ { 0x1804, 1, 1 },
+ { 0x1806, 1, 0 }, { 0x180E, 0, 1 },
+ { 0x1810, 1, 0 }, { 0x1819, 0, 1 },
+ { 0x1820, 1, 0 }, { 0x1877, 0, 1 },
+ { 0x1880, 1, 0 }, { 0x18AA, 0, 1 }
+};
+static const uc_interval_t script_hiragana_intervals[] =
+{
+ { 0x3041, 1, 0 }, { 0x3096, 0, 1 },
+ { 0x309D, 1, 0 }, { 0x309F, 0, 1 },
+ { 0x1B001, 1, 1 },
+ { 0x1F200, 1, 1 }
+};
+static const uc_interval_t script_katakana_intervals[] =
+{
+ { 0x30A1, 1, 0 }, { 0x30FA, 0, 1 },
+ { 0x30FD, 1, 0 }, { 0x30FF, 0, 1 },
+ { 0x31F0, 1, 0 }, { 0x31FF, 0, 1 },
+ { 0x32D0, 1, 0 }, { 0x32FE, 0, 1 },
+ { 0x3300, 1, 0 }, { 0x3357, 0, 1 },
+ { 0xFF66, 1, 0 }, { 0xFF6F, 0, 1 },
+ { 0xFF71, 1, 0 }, { 0xFF9D, 0, 1 },
+ { 0x1B000, 1, 1 }
+};
+static const uc_interval_t script_bopomofo_intervals[] =
+{
+ { 0x02EA, 1, 0 }, { 0x02EB, 0, 1 },
+ { 0x3105, 1, 0 }, { 0x312D, 0, 1 },
+ { 0x31A0, 1, 0 }, { 0x31BA, 0, 1 }
+};
+static const uc_interval_t script_han_intervals[] =
+{
+ { 0x2E80, 1, 0 }, { 0x2E99, 0, 1 },
+ { 0x2E9B, 1, 0 }, { 0x2EF3, 0, 1 },
+ { 0x2F00, 1, 0 }, { 0x2FD5, 0, 1 },
+ { 0x3005, 1, 1 },
+ { 0x3007, 1, 1 },
+ { 0x3021, 1, 0 }, { 0x3029, 0, 1 },
+ { 0x3038, 1, 0 }, { 0x303B, 0, 1 },
+ { 0x3400, 1, 0 }, { 0x4DB5, 0, 1 },
+ { 0x4E00, 1, 0 }, { 0x9FCB, 0, 1 },
+ { 0xF900, 1, 0 }, { 0xFA2D, 0, 1 },
+ { 0xFA30, 1, 0 }, { 0xFA6D, 0, 1 },
+ { 0xFA70, 1, 0 }, { 0xFAD9, 0, 1 },
+ { 0x20000, 1, 0 }, { 0x2A6D6, 0, 1 },
+ { 0x2A700, 1, 0 }, { 0x2B734, 0, 1 },
+ { 0x2B740, 1, 0 }, { 0x2B81D, 0, 1 },
+ { 0x2F800, 1, 0 }, { 0x2FA1D, 0, 1 }
+};
+static const uc_interval_t script_yi_intervals[] =
+{
+ { 0xA000, 1, 0 }, { 0xA48C, 0, 1 },
+ { 0xA490, 1, 0 }, { 0xA4C6, 0, 1 }
+};
+static const uc_interval_t script_old_italic_intervals[] =
+{
+ { 0x10300, 1, 0 }, { 0x1031E, 0, 1 },
+ { 0x10320, 1, 0 }, { 0x10323, 0, 1 }
+};
+static const uc_interval_t script_gothic_intervals[] =
+{
+ { 0x10330, 1, 0 }, { 0x1034A, 0, 1 }
+};
+static const uc_interval_t script_deseret_intervals[] =
+{
+ { 0x10400, 1, 0 }, { 0x1044F, 0, 1 }
+};
+static const uc_interval_t script_inherited_intervals[] =
+{
+ { 0x0300, 1, 0 }, { 0x036F, 0, 1 },
+ { 0x0485, 1, 0 }, { 0x0486, 0, 1 },
+ { 0x064B, 1, 0 }, { 0x0655, 0, 1 },
+ { 0x065F, 1, 1 },
+ { 0x0670, 1, 1 },
+ { 0x0951, 1, 0 }, { 0x0952, 0, 1 },
+ { 0x1CD0, 1, 0 }, { 0x1CD2, 0, 1 },
+ { 0x1CD4, 1, 0 }, { 0x1CE0, 0, 1 },
+ { 0x1CE2, 1, 0 }, { 0x1CE8, 0, 1 },
+ { 0x1CED, 1, 1 },
+ { 0x1DC0, 1, 0 }, { 0x1DE6, 0, 1 },
+ { 0x1DFC, 1, 0 }, { 0x1DFF, 0, 1 },
+ { 0x200C, 1, 0 }, { 0x200D, 0, 1 },
+ { 0x20D0, 1, 0 }, { 0x20F0, 0, 1 },
+ { 0x302A, 1, 0 }, { 0x302D, 0, 1 },
+ { 0x3099, 1, 0 }, { 0x309A, 0, 1 },
+ { 0xFE00, 1, 0 }, { 0xFE0F, 0, 1 },
+ { 0xFE20, 1, 0 }, { 0xFE26, 0, 1 },
+ { 0x101FD, 1, 1 },
+ { 0x1D167, 1, 0 }, { 0x1D169, 0, 1 },
+ { 0x1D17B, 1, 0 }, { 0x1D182, 0, 1 },
+ { 0x1D185, 1, 0 }, { 0x1D18B, 0, 1 },
+ { 0x1D1AA, 1, 0 }, { 0x1D1AD, 0, 1 },
+ { 0xE0100, 1, 0 }, { 0xE01EF, 0, 1 }
+};
+static const uc_interval_t script_tagalog_intervals[] =
+{
+ { 0x1700, 1, 0 }, { 0x170C, 0, 1 },
+ { 0x170E, 1, 0 }, { 0x1714, 0, 1 }
+};
+static const uc_interval_t script_hanunoo_intervals[] =
+{
+ { 0x1720, 1, 0 }, { 0x1734, 0, 1 }
+};
+static const uc_interval_t script_buhid_intervals[] =
+{
+ { 0x1740, 1, 0 }, { 0x1753, 0, 1 }
+};
+static const uc_interval_t script_tagbanwa_intervals[] =
+{
+ { 0x1760, 1, 0 }, { 0x176C, 0, 1 },
+ { 0x176E, 1, 0 }, { 0x1770, 0, 1 },
+ { 0x1772, 1, 0 }, { 0x1773, 0, 1 }
+};
+static const uc_interval_t script_limbu_intervals[] =
+{
+ { 0x1900, 1, 0 }, { 0x191C, 0, 1 },
+ { 0x1920, 1, 0 }, { 0x192B, 0, 1 },
+ { 0x1930, 1, 0 }, { 0x193B, 0, 1 },
+ { 0x1940, 1, 1 },
+ { 0x1944, 1, 0 }, { 0x194F, 0, 1 }
+};
+static const uc_interval_t script_tai_le_intervals[] =
+{
+ { 0x1950, 1, 0 }, { 0x196D, 0, 1 },
+ { 0x1970, 1, 0 }, { 0x1974, 0, 1 }
+};
+static const uc_interval_t script_linear_b_intervals[] =
+{
+ { 0x10000, 1, 0 }, { 0x1000B, 0, 1 },
+ { 0x1000D, 1, 0 }, { 0x10026, 0, 1 },
+ { 0x10028, 1, 0 }, { 0x1003A, 0, 1 },
+ { 0x1003C, 1, 0 }, { 0x1003D, 0, 1 },
+ { 0x1003F, 1, 0 }, { 0x1004D, 0, 1 },
+ { 0x10050, 1, 0 }, { 0x1005D, 0, 1 },
+ { 0x10080, 1, 0 }, { 0x100FA, 0, 1 }
+};
+static const uc_interval_t script_ugaritic_intervals[] =
+{
+ { 0x10380, 1, 0 }, { 0x1039D, 0, 1 },
+ { 0x1039F, 1, 1 }
+};
+static const uc_interval_t script_shavian_intervals[] =
+{
+ { 0x10450, 1, 0 }, { 0x1047F, 0, 1 }
+};
+static const uc_interval_t script_osmanya_intervals[] =
+{
+ { 0x10480, 1, 0 }, { 0x1049D, 0, 1 },
+ { 0x104A0, 1, 0 }, { 0x104A9, 0, 1 }
+};
+static const uc_interval_t script_cypriot_intervals[] =
+{
+ { 0x10800, 1, 0 }, { 0x10805, 0, 1 },
+ { 0x10808, 1, 1 },
+ { 0x1080A, 1, 0 }, { 0x10835, 0, 1 },
+ { 0x10837, 1, 0 }, { 0x10838, 0, 1 },
+ { 0x1083C, 1, 1 },
+ { 0x1083F, 1, 1 }
+};
+static const uc_interval_t script_braille_intervals[] =
+{
+ { 0x2800, 1, 0 }, { 0x28FF, 0, 1 }
+};
+static const uc_interval_t script_buginese_intervals[] =
+{
+ { 0x1A00, 1, 0 }, { 0x1A1B, 0, 1 },
+ { 0x1A1E, 1, 0 }, { 0x1A1F, 0, 1 }
+};
+static const uc_interval_t script_coptic_intervals[] =
+{
+ { 0x03E2, 1, 0 }, { 0x03EF, 0, 1 },
+ { 0x2C80, 1, 0 }, { 0x2CF1, 0, 1 },
+ { 0x2CF9, 1, 0 }, { 0x2CFF, 0, 1 }
+};
+static const uc_interval_t script_new_tai_lue_intervals[] =
+{
+ { 0x1980, 1, 0 }, { 0x19AB, 0, 1 },
+ { 0x19B0, 1, 0 }, { 0x19C9, 0, 1 },
+ { 0x19D0, 1, 0 }, { 0x19DA, 0, 1 },
+ { 0x19DE, 1, 0 }, { 0x19DF, 0, 1 }
+};
+static const uc_interval_t script_glagolitic_intervals[] =
+{
+ { 0x2C00, 1, 0 }, { 0x2C2E, 0, 1 },
+ { 0x2C30, 1, 0 }, { 0x2C5E, 0, 1 }
+};
+static const uc_interval_t script_tifinagh_intervals[] =
+{
+ { 0x2D30, 1, 0 }, { 0x2D65, 0, 1 },
+ { 0x2D6F, 1, 0 }, { 0x2D70, 0, 1 },
+ { 0x2D7F, 1, 1 }
+};
+static const uc_interval_t script_syloti_nagri_intervals[] =
+{
+ { 0xA800, 1, 0 }, { 0xA82B, 0, 1 }
+};
+static const uc_interval_t script_old_persian_intervals[] =
+{
+ { 0x103A0, 1, 0 }, { 0x103C3, 0, 1 },
+ { 0x103C8, 1, 0 }, { 0x103D5, 0, 1 }
+};
+static const uc_interval_t script_kharoshthi_intervals[] =
+{
+ { 0x10A00, 1, 0 }, { 0x10A03, 0, 1 },
+ { 0x10A05, 1, 0 }, { 0x10A06, 0, 1 },
+ { 0x10A0C, 1, 0 }, { 0x10A13, 0, 1 },
+ { 0x10A15, 1, 0 }, { 0x10A17, 0, 1 },
+ { 0x10A19, 1, 0 }, { 0x10A33, 0, 1 },
+ { 0x10A38, 1, 0 }, { 0x10A3A, 0, 1 },
+ { 0x10A3F, 1, 0 }, { 0x10A47, 0, 1 },
+ { 0x10A50, 1, 0 }, { 0x10A58, 0, 1 }
+};
+static const uc_interval_t script_balinese_intervals[] =
+{
+ { 0x1B00, 1, 0 }, { 0x1B4B, 0, 1 },
+ { 0x1B50, 1, 0 }, { 0x1B7C, 0, 1 }
+};
+static const uc_interval_t script_cuneiform_intervals[] =
+{
+ { 0x12000, 1, 0 }, { 0x1236E, 0, 1 },
+ { 0x12400, 1, 0 }, { 0x12462, 0, 1 },
+ { 0x12470, 1, 0 }, { 0x12473, 0, 1 }
+};
+static const uc_interval_t script_phoenician_intervals[] =
+{
+ { 0x10900, 1, 0 }, { 0x1091B, 0, 1 },
+ { 0x1091F, 1, 1 }
+};
+static const uc_interval_t script_phags_pa_intervals[] =
+{
+ { 0xA840, 1, 0 }, { 0xA877, 0, 1 }
+};
+static const uc_interval_t script_nko_intervals[] =
+{
+ { 0x07C0, 1, 0 }, { 0x07FA, 0, 1 }
+};
+static const uc_interval_t script_sundanese_intervals[] =
+{
+ { 0x1B80, 1, 0 }, { 0x1BAA, 0, 1 },
+ { 0x1BAE, 1, 0 }, { 0x1BB9, 0, 1 }
+};
+static const uc_interval_t script_lepcha_intervals[] =
+{
+ { 0x1C00, 1, 0 }, { 0x1C37, 0, 1 },
+ { 0x1C3B, 1, 0 }, { 0x1C49, 0, 1 },
+ { 0x1C4D, 1, 0 }, { 0x1C4F, 0, 1 }
+};
+static const uc_interval_t script_ol_chiki_intervals[] =
+{
+ { 0x1C50, 1, 0 }, { 0x1C7F, 0, 1 }
+};
+static const uc_interval_t script_vai_intervals[] =
+{
+ { 0xA500, 1, 0 }, { 0xA62B, 0, 1 }
+};
+static const uc_interval_t script_saurashtra_intervals[] =
+{
+ { 0xA880, 1, 0 }, { 0xA8C4, 0, 1 },
+ { 0xA8CE, 1, 0 }, { 0xA8D9, 0, 1 }
+};
+static const uc_interval_t script_kayah_li_intervals[] =
+{
+ { 0xA900, 1, 0 }, { 0xA92F, 0, 1 }
+};
+static const uc_interval_t script_rejang_intervals[] =
+{
+ { 0xA930, 1, 0 }, { 0xA953, 0, 1 },
+ { 0xA95F, 1, 1 }
+};
+static const uc_interval_t script_lycian_intervals[] =
+{
+ { 0x10280, 1, 0 }, { 0x1029C, 0, 1 }
+};
+static const uc_interval_t script_carian_intervals[] =
+{
+ { 0x102A0, 1, 0 }, { 0x102D0, 0, 1 }
+};
+static const uc_interval_t script_lydian_intervals[] =
+{
+ { 0x10920, 1, 0 }, { 0x10939, 0, 1 },
+ { 0x1093F, 1, 1 }
+};
+static const uc_interval_t script_cham_intervals[] =
+{
+ { 0xAA00, 1, 0 }, { 0xAA36, 0, 1 },
+ { 0xAA40, 1, 0 }, { 0xAA4D, 0, 1 },
+ { 0xAA50, 1, 0 }, { 0xAA59, 0, 1 },
+ { 0xAA5C, 1, 0 }, { 0xAA5F, 0, 1 }
+};
+static const uc_interval_t script_tai_tham_intervals[] =
+{
+ { 0x1A20, 1, 0 }, { 0x1A5E, 0, 1 },
+ { 0x1A60, 1, 0 }, { 0x1A7C, 0, 1 },
+ { 0x1A7F, 1, 0 }, { 0x1A89, 0, 1 },
+ { 0x1A90, 1, 0 }, { 0x1A99, 0, 1 },
+ { 0x1AA0, 1, 0 }, { 0x1AAD, 0, 1 }
+};
+static const uc_interval_t script_tai_viet_intervals[] =
+{
+ { 0xAA80, 1, 0 }, { 0xAAC2, 0, 1 },
+ { 0xAADB, 1, 0 }, { 0xAADF, 0, 1 }
+};
+static const uc_interval_t script_avestan_intervals[] =
+{
+ { 0x10B00, 1, 0 }, { 0x10B35, 0, 1 },
+ { 0x10B39, 1, 0 }, { 0x10B3F, 0, 1 }
+};
+static const uc_interval_t script_egyptian_hieroglyphs_intervals[] =
+{
+ { 0x13000, 1, 0 }, { 0x1342E, 0, 1 }
+};
+static const uc_interval_t script_samaritan_intervals[] =
+{
+ { 0x0800, 1, 0 }, { 0x082D, 0, 1 },
+ { 0x0830, 1, 0 }, { 0x083E, 0, 1 }
+};
+static const uc_interval_t script_lisu_intervals[] =
+{
+ { 0xA4D0, 1, 0 }, { 0xA4FF, 0, 1 }
+};
+static const uc_interval_t script_bamum_intervals[] =
+{
+ { 0xA6A0, 1, 0 }, { 0xA6F7, 0, 1 },
+ { 0x16800, 1, 0 }, { 0x16A38, 0, 1 }
+};
+static const uc_interval_t script_javanese_intervals[] =
+{
+ { 0xA980, 1, 0 }, { 0xA9CD, 0, 1 },
+ { 0xA9CF, 1, 0 }, { 0xA9D9, 0, 1 },
+ { 0xA9DE, 1, 0 }, { 0xA9DF, 0, 1 }
+};
+static const uc_interval_t script_meetei_mayek_intervals[] =
+{
+ { 0xABC0, 1, 0 }, { 0xABED, 0, 1 },
+ { 0xABF0, 1, 0 }, { 0xABF9, 0, 1 }
+};
+static const uc_interval_t script_imperial_aramaic_intervals[] =
+{
+ { 0x10840, 1, 0 }, { 0x10855, 0, 1 },
+ { 0x10857, 1, 0 }, { 0x1085F, 0, 1 }
+};
+static const uc_interval_t script_old_south_arabian_intervals[] =
+{
+ { 0x10A60, 1, 0 }, { 0x10A7F, 0, 1 }
+};
+static const uc_interval_t script_inscriptional_parthian_intervals[] =
+{
+ { 0x10B40, 1, 0 }, { 0x10B55, 0, 1 },
+ { 0x10B58, 1, 0 }, { 0x10B5F, 0, 1 }
+};
+static const uc_interval_t script_inscriptional_pahlavi_intervals[] =
+{
+ { 0x10B60, 1, 0 }, { 0x10B72, 0, 1 },
+ { 0x10B78, 1, 0 }, { 0x10B7F, 0, 1 }
+};
+static const uc_interval_t script_old_turkic_intervals[] =
+{
+ { 0x10C00, 1, 0 }, { 0x10C48, 0, 1 }
+};
+static const uc_interval_t script_kaithi_intervals[] =
+{
+ { 0x11080, 1, 0 }, { 0x110C1, 0, 1 }
+};
+static const uc_interval_t script_batak_intervals[] =
+{
+ { 0x1BC0, 1, 0 }, { 0x1BF3, 0, 1 },
+ { 0x1BFC, 1, 0 }, { 0x1BFF, 0, 1 }
+};
+static const uc_interval_t script_brahmi_intervals[] =
+{
+ { 0x11000, 1, 0 }, { 0x1104D, 0, 1 },
+ { 0x11052, 1, 0 }, { 0x1106F, 0, 1 }
+};
+static const uc_interval_t script_mandaic_intervals[] =
+{
+ { 0x0840, 1, 0 }, { 0x085B, 0, 1 },
+ { 0x085E, 1, 1 }
+};
+static const uc_script_t scripts[95] =
+{
+ {
+ sizeof (script_common_intervals) / sizeof (uc_interval_t),
+ script_common_intervals,
+ "Common"
+ },
+ {
+ sizeof (script_latin_intervals) / sizeof (uc_interval_t),
+ script_latin_intervals,
+ "Latin"
+ },
+ {
+ sizeof (script_greek_intervals) / sizeof (uc_interval_t),
+ script_greek_intervals,
+ "Greek"
+ },
+ {
+ sizeof (script_cyrillic_intervals) / sizeof (uc_interval_t),
+ script_cyrillic_intervals,
+ "Cyrillic"
+ },
+ {
+ sizeof (script_armenian_intervals) / sizeof (uc_interval_t),
+ script_armenian_intervals,
+ "Armenian"
+ },
+ {
+ sizeof (script_hebrew_intervals) / sizeof (uc_interval_t),
+ script_hebrew_intervals,
+ "Hebrew"
+ },
+ {
+ sizeof (script_arabic_intervals) / sizeof (uc_interval_t),
+ script_arabic_intervals,
+ "Arabic"
+ },
+ {
+ sizeof (script_syriac_intervals) / sizeof (uc_interval_t),
+ script_syriac_intervals,
+ "Syriac"
+ },
+ {
+ sizeof (script_thaana_intervals) / sizeof (uc_interval_t),
+ script_thaana_intervals,
+ "Thaana"
+ },
+ {
+ sizeof (script_devanagari_intervals) / sizeof (uc_interval_t),
+ script_devanagari_intervals,
+ "Devanagari"
+ },
+ {
+ sizeof (script_bengali_intervals) / sizeof (uc_interval_t),
+ script_bengali_intervals,
+ "Bengali"
+ },
+ {
+ sizeof (script_gurmukhi_intervals) / sizeof (uc_interval_t),
+ script_gurmukhi_intervals,
+ "Gurmukhi"
+ },
+ {
+ sizeof (script_gujarati_intervals) / sizeof (uc_interval_t),
+ script_gujarati_intervals,
+ "Gujarati"
+ },
+ {
+ sizeof (script_oriya_intervals) / sizeof (uc_interval_t),
+ script_oriya_intervals,
+ "Oriya"
+ },
+ {
+ sizeof (script_tamil_intervals) / sizeof (uc_interval_t),
+ script_tamil_intervals,
+ "Tamil"
+ },
+ {
+ sizeof (script_telugu_intervals) / sizeof (uc_interval_t),
+ script_telugu_intervals,
+ "Telugu"
+ },
+ {
+ sizeof (script_kannada_intervals) / sizeof (uc_interval_t),
+ script_kannada_intervals,
+ "Kannada"
+ },
+ {
+ sizeof (script_malayalam_intervals) / sizeof (uc_interval_t),
+ script_malayalam_intervals,
+ "Malayalam"
+ },
+ {
+ sizeof (script_sinhala_intervals) / sizeof (uc_interval_t),
+ script_sinhala_intervals,
+ "Sinhala"
+ },
+ {
+ sizeof (script_thai_intervals) / sizeof (uc_interval_t),
+ script_thai_intervals,
+ "Thai"
+ },
+ {
+ sizeof (script_lao_intervals) / sizeof (uc_interval_t),
+ script_lao_intervals,
+ "Lao"
+ },
+ {
+ sizeof (script_tibetan_intervals) / sizeof (uc_interval_t),
+ script_tibetan_intervals,
+ "Tibetan"
+ },
+ {
+ sizeof (script_myanmar_intervals) / sizeof (uc_interval_t),
+ script_myanmar_intervals,
+ "Myanmar"
+ },
+ {
+ sizeof (script_georgian_intervals) / sizeof (uc_interval_t),
+ script_georgian_intervals,
+ "Georgian"
+ },
+ {
+ sizeof (script_hangul_intervals) / sizeof (uc_interval_t),
+ script_hangul_intervals,
+ "Hangul"
+ },
+ {
+ sizeof (script_ethiopic_intervals) / sizeof (uc_interval_t),
+ script_ethiopic_intervals,
+ "Ethiopic"
+ },
+ {
+ sizeof (script_cherokee_intervals) / sizeof (uc_interval_t),
+ script_cherokee_intervals,
+ "Cherokee"
+ },
+ {
+ sizeof (script_canadian_aboriginal_intervals) / sizeof (uc_interval_t),
+ script_canadian_aboriginal_intervals,
+ "Canadian_Aboriginal"
+ },
+ {
+ sizeof (script_ogham_intervals) / sizeof (uc_interval_t),
+ script_ogham_intervals,
+ "Ogham"
+ },
+ {
+ sizeof (script_runic_intervals) / sizeof (uc_interval_t),
+ script_runic_intervals,
+ "Runic"
+ },
+ {
+ sizeof (script_khmer_intervals) / sizeof (uc_interval_t),
+ script_khmer_intervals,
+ "Khmer"
+ },
+ {
+ sizeof (script_mongolian_intervals) / sizeof (uc_interval_t),
+ script_mongolian_intervals,
+ "Mongolian"
+ },
+ {
+ sizeof (script_hiragana_intervals) / sizeof (uc_interval_t),
+ script_hiragana_intervals,
+ "Hiragana"
+ },
+ {
+ sizeof (script_katakana_intervals) / sizeof (uc_interval_t),
+ script_katakana_intervals,
+ "Katakana"
+ },
+ {
+ sizeof (script_bopomofo_intervals) / sizeof (uc_interval_t),
+ script_bopomofo_intervals,
+ "Bopomofo"
+ },
+ {
+ sizeof (script_han_intervals) / sizeof (uc_interval_t),
+ script_han_intervals,
+ "Han"
+ },
+ {
+ sizeof (script_yi_intervals) / sizeof (uc_interval_t),
+ script_yi_intervals,
+ "Yi"
+ },
+ {
+ sizeof (script_old_italic_intervals) / sizeof (uc_interval_t),
+ script_old_italic_intervals,
+ "Old_Italic"
+ },
+ {
+ sizeof (script_gothic_intervals) / sizeof (uc_interval_t),
+ script_gothic_intervals,
+ "Gothic"
+ },
+ {
+ sizeof (script_deseret_intervals) / sizeof (uc_interval_t),
+ script_deseret_intervals,
+ "Deseret"
+ },
+ {
+ sizeof (script_inherited_intervals) / sizeof (uc_interval_t),
+ script_inherited_intervals,
+ "Inherited"
+ },
+ {
+ sizeof (script_tagalog_intervals) / sizeof (uc_interval_t),
+ script_tagalog_intervals,
+ "Tagalog"
+ },
+ {
+ sizeof (script_hanunoo_intervals) / sizeof (uc_interval_t),
+ script_hanunoo_intervals,
+ "Hanunoo"
+ },
+ {
+ sizeof (script_buhid_intervals) / sizeof (uc_interval_t),
+ script_buhid_intervals,
+ "Buhid"
+ },
+ {
+ sizeof (script_tagbanwa_intervals) / sizeof (uc_interval_t),
+ script_tagbanwa_intervals,
+ "Tagbanwa"
+ },
+ {
+ sizeof (script_limbu_intervals) / sizeof (uc_interval_t),
+ script_limbu_intervals,
+ "Limbu"
+ },
+ {
+ sizeof (script_tai_le_intervals) / sizeof (uc_interval_t),
+ script_tai_le_intervals,
+ "Tai_Le"
+ },
+ {
+ sizeof (script_linear_b_intervals) / sizeof (uc_interval_t),
+ script_linear_b_intervals,
+ "Linear_B"
+ },
+ {
+ sizeof (script_ugaritic_intervals) / sizeof (uc_interval_t),
+ script_ugaritic_intervals,
+ "Ugaritic"
+ },
+ {
+ sizeof (script_shavian_intervals) / sizeof (uc_interval_t),
+ script_shavian_intervals,
+ "Shavian"
+ },
+ {
+ sizeof (script_osmanya_intervals) / sizeof (uc_interval_t),
+ script_osmanya_intervals,
+ "Osmanya"
+ },
+ {
+ sizeof (script_cypriot_intervals) / sizeof (uc_interval_t),
+ script_cypriot_intervals,
+ "Cypriot"
+ },
+ {
+ sizeof (script_braille_intervals) / sizeof (uc_interval_t),
+ script_braille_intervals,
+ "Braille"
+ },
+ {
+ sizeof (script_buginese_intervals) / sizeof (uc_interval_t),
+ script_buginese_intervals,
+ "Buginese"
+ },
+ {
+ sizeof (script_coptic_intervals) / sizeof (uc_interval_t),
+ script_coptic_intervals,
+ "Coptic"
+ },
+ {
+ sizeof (script_new_tai_lue_intervals) / sizeof (uc_interval_t),
+ script_new_tai_lue_intervals,
+ "New_Tai_Lue"
+ },
+ {
+ sizeof (script_glagolitic_intervals) / sizeof (uc_interval_t),
+ script_glagolitic_intervals,
+ "Glagolitic"
+ },
+ {
+ sizeof (script_tifinagh_intervals) / sizeof (uc_interval_t),
+ script_tifinagh_intervals,
+ "Tifinagh"
+ },
+ {
+ sizeof (script_syloti_nagri_intervals) / sizeof (uc_interval_t),
+ script_syloti_nagri_intervals,
+ "Syloti_Nagri"
+ },
+ {
+ sizeof (script_old_persian_intervals) / sizeof (uc_interval_t),
+ script_old_persian_intervals,
+ "Old_Persian"
+ },
+ {
+ sizeof (script_kharoshthi_intervals) / sizeof (uc_interval_t),
+ script_kharoshthi_intervals,
+ "Kharoshthi"
+ },
+ {
+ sizeof (script_balinese_intervals) / sizeof (uc_interval_t),
+ script_balinese_intervals,
+ "Balinese"
+ },
+ {
+ sizeof (script_cuneiform_intervals) / sizeof (uc_interval_t),
+ script_cuneiform_intervals,
+ "Cuneiform"
+ },
+ {
+ sizeof (script_phoenician_intervals) / sizeof (uc_interval_t),
+ script_phoenician_intervals,
+ "Phoenician"
+ },
+ {
+ sizeof (script_phags_pa_intervals) / sizeof (uc_interval_t),
+ script_phags_pa_intervals,
+ "Phags_Pa"
+ },
+ {
+ sizeof (script_nko_intervals) / sizeof (uc_interval_t),
+ script_nko_intervals,
+ "Nko"
+ },
+ {
+ sizeof (script_sundanese_intervals) / sizeof (uc_interval_t),
+ script_sundanese_intervals,
+ "Sundanese"
+ },
+ {
+ sizeof (script_lepcha_intervals) / sizeof (uc_interval_t),
+ script_lepcha_intervals,
+ "Lepcha"
+ },
+ {
+ sizeof (script_ol_chiki_intervals) / sizeof (uc_interval_t),
+ script_ol_chiki_intervals,
+ "Ol_Chiki"
+ },
+ {
+ sizeof (script_vai_intervals) / sizeof (uc_interval_t),
+ script_vai_intervals,
+ "Vai"
+ },
+ {
+ sizeof (script_saurashtra_intervals) / sizeof (uc_interval_t),
+ script_saurashtra_intervals,
+ "Saurashtra"
+ },
+ {
+ sizeof (script_kayah_li_intervals) / sizeof (uc_interval_t),
+ script_kayah_li_intervals,
+ "Kayah_Li"
+ },
+ {
+ sizeof (script_rejang_intervals) / sizeof (uc_interval_t),
+ script_rejang_intervals,
+ "Rejang"
+ },
+ {
+ sizeof (script_lycian_intervals) / sizeof (uc_interval_t),
+ script_lycian_intervals,
+ "Lycian"
+ },
+ {
+ sizeof (script_carian_intervals) / sizeof (uc_interval_t),
+ script_carian_intervals,
+ "Carian"
+ },
+ {
+ sizeof (script_lydian_intervals) / sizeof (uc_interval_t),
+ script_lydian_intervals,
+ "Lydian"
+ },
+ {
+ sizeof (script_cham_intervals) / sizeof (uc_interval_t),
+ script_cham_intervals,
+ "Cham"
+ },
+ {
+ sizeof (script_tai_tham_intervals) / sizeof (uc_interval_t),
+ script_tai_tham_intervals,
+ "Tai_Tham"
+ },
+ {
+ sizeof (script_tai_viet_intervals) / sizeof (uc_interval_t),
+ script_tai_viet_intervals,
+ "Tai_Viet"
+ },
+ {
+ sizeof (script_avestan_intervals) / sizeof (uc_interval_t),
+ script_avestan_intervals,
+ "Avestan"
+ },
+ {
+ sizeof (script_egyptian_hieroglyphs_intervals) / sizeof (uc_interval_t),
+ script_egyptian_hieroglyphs_intervals,
+ "Egyptian_Hieroglyphs"
+ },
+ {
+ sizeof (script_samaritan_intervals) / sizeof (uc_interval_t),
+ script_samaritan_intervals,
+ "Samaritan"
+ },
+ {
+ sizeof (script_lisu_intervals) / sizeof (uc_interval_t),
+ script_lisu_intervals,
+ "Lisu"
+ },
+ {
+ sizeof (script_bamum_intervals) / sizeof (uc_interval_t),
+ script_bamum_intervals,
+ "Bamum"
+ },
+ {
+ sizeof (script_javanese_intervals) / sizeof (uc_interval_t),
+ script_javanese_intervals,
+ "Javanese"
+ },
+ {
+ sizeof (script_meetei_mayek_intervals) / sizeof (uc_interval_t),
+ script_meetei_mayek_intervals,
+ "Meetei_Mayek"
+ },
+ {
+ sizeof (script_imperial_aramaic_intervals) / sizeof (uc_interval_t),
+ script_imperial_aramaic_intervals,
+ "Imperial_Aramaic"
+ },
+ {
+ sizeof (script_old_south_arabian_intervals) / sizeof (uc_interval_t),
+ script_old_south_arabian_intervals,
+ "Old_South_Arabian"
+ },
+ {
+ sizeof (script_inscriptional_parthian_intervals) / sizeof (uc_interval_t),
+ script_inscriptional_parthian_intervals,
+ "Inscriptional_Parthian"
+ },
+ {
+ sizeof (script_inscriptional_pahlavi_intervals) / sizeof (uc_interval_t),
+ script_inscriptional_pahlavi_intervals,
+ "Inscriptional_Pahlavi"
+ },
+ {
+ sizeof (script_old_turkic_intervals) / sizeof (uc_interval_t),
+ script_old_turkic_intervals,
+ "Old_Turkic"
+ },
+ {
+ sizeof (script_kaithi_intervals) / sizeof (uc_interval_t),
+ script_kaithi_intervals,
+ "Kaithi"
+ },
+ {
+ sizeof (script_batak_intervals) / sizeof (uc_interval_t),
+ script_batak_intervals,
+ "Batak"
+ },
+ {
+ sizeof (script_brahmi_intervals) / sizeof (uc_interval_t),
+ script_brahmi_intervals,
+ "Brahmi"
+ },
+ {
+ sizeof (script_mandaic_intervals) / sizeof (uc_interval_t),
+ script_mandaic_intervals,
+ "Mandaic"
+ }
+};
+#define script_header_0 16
+#define script_header_1 15
+#define script_header_2 7
+#define script_header_3 511
+#define script_header_4 127
+static const
+struct
+ {
+ int level1[15];
+ short level2[4 << 9];
+ unsigned char level3[163 << 7];
+ }
+u_script =
+{
+ {
+ 0, 512, 1024, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 768, 896, 1024, 1152, 1280, 1408, 1536, 1664,
+ 1792, -1, 1920, 2048, 2176, 2304, 2432, 2560,
+ 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584,
+ 3712, 3840, 3968, 3968, 4096, 4224, 4352, 4480,
+ 4608, 4608, 4608, 4608, 4608, 4736, 4864, 4992,
+ 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016,
+ 6144, 6272, 6400, 6528, 256, 256, 6656, 6784,
+ 6912, 7040, 7168, 7296, 7424, 7424, 7424, 7552,
+ 7680, 7424, 7424, 7424, 7424, 7424, 7808, 7936,
+ 8064, 8064, 7424, 7424, 7424, 7424, 8192, -1,
+ 8320, 8448, 8576, 8704, 8832, 8960, 9088, 9216,
+ 9344, 9472, 9600, 9728, 9856, 9984, 10112, 7424,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 10240, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 10368,
+ 10496, 10496, 10496, 10496, 10496, 10496, 10496, 10496,
+ 10496, 10624, 10752, 10752, 10880, 11008, 11136, 11264,
+ 11392, 11520, 11648, 11776, 11904, 12032, 12160, 12288,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3968, 3968, 3968, 3968, 12416,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 9088, 9088, 12544, 12672, 12800, 12928,
+ 13056, 13056, 13184, 13312, 13440, 13568, 13696, 13824,
+ 13952, 14080, 14208, 14336, -1, 14464, 14592, 14720,
+ 14848, 14976, -1, -1, -1, -1, -1, -1,
+ 15104, -1, 15232, -1, 15360, -1, 15488, -1,
+ 15616, -1, -1, -1, 15744, -1, -1, -1,
+ 15872, 16000, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 16128, 16128, 16128, 16128, 16128, 16128, 16256, -1,
+ 16384, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 16512, 16512, 16512, 16512, 16512, 16512, 16512, 16512,
+ 16640, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 16768, 16768, 16768, 16768, 16896, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17024, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7424, 17152, 17280, 17408, 17536, -1, 17664, -1,
+ 17792, 17920, 18048, 7424, 7424, 18176, 7424, 18304,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 18432, 18560, 18688, 18816, 18944, -1, 19072, 19200,
+ 19328, 19456, 19584, 19712, 19840, 19968, 7552, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 20096, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 9088, 9088,
+ 9088, 9088, 9088, 9088, 9088, 9088, 20224, 9088,
+ 20352, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9088, 9088, 9088, 9088, 20352, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 20480, -1, 20608, 20736, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 34, 34, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 2, 2, 2, 2, 0, 2, 2, 2,
+ 255, 255, 2, 2, 2, 2, 0, 255,
+ 255, 255, 255, 255, 2, 0, 2, 0,
+ 2, 2, 2, 255, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 255, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 40, 40, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 255,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 255, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 255, 0, 4, 255, 255, 255, 255, 255,
+ 255, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 255, 255, 255, 255, 255,
+ 5, 5, 5, 5, 5, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 255, 255, 6, 6,
+ 6, 6, 6, 6, 0, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 0, 255, 255, 6, 0,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 0, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 6, 6, 6, 6, 6,
+ 40, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 255, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 255, 255, 7, 7, 7,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 255, 255, 255, 255, 255,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 255, 255,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 255,
+ 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 255, 255, 94, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 40, 40, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 0, 0, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 0, 9, 9, 9, 9, 9, 9, 9,
+ 255, 9, 9, 9, 9, 9, 9, 9,
+ 255, 10, 10, 10, 255, 10, 10, 10,
+ 10, 10, 10, 10, 10, 255, 255, 10,
+ 10, 255, 255, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 255, 10, 10, 10, 10, 10, 10,
+ 10, 255, 10, 255, 255, 255, 10, 10,
+ 10, 10, 255, 255, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 255, 255, 10,
+ 10, 255, 255, 10, 10, 10, 10, 255,
+ 255, 255, 255, 255, 255, 255, 255, 10,
+ 255, 255, 255, 255, 10, 10, 255, 10,
+ 10, 10, 10, 10, 255, 255, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 255, 255, 255, 255,
+ 255, 11, 11, 11, 255, 11, 11, 11,
+ 11, 11, 11, 255, 255, 255, 255, 11,
+ 11, 255, 255, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 255, 11, 11, 11, 11, 11, 11,
+ 11, 255, 11, 11, 255, 11, 11, 255,
+ 11, 11, 255, 255, 11, 255, 11, 11,
+ 11, 11, 11, 255, 255, 255, 255, 11,
+ 11, 255, 255, 11, 11, 11, 255, 255,
+ 255, 11, 255, 255, 255, 255, 255, 255,
+ 255, 11, 11, 11, 11, 255, 11, 255,
+ 255, 255, 255, 255, 255, 255, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 12, 12, 12, 255, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 255, 12,
+ 12, 12, 255, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 255, 12, 12, 12, 12, 12, 12,
+ 12, 255, 12, 12, 255, 12, 12, 12,
+ 12, 12, 255, 255, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 255, 12,
+ 12, 12, 255, 12, 12, 12, 255, 255,
+ 12, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 12, 12, 12, 12, 255, 255, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 255, 12, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 13, 13, 13, 255, 13, 13, 13,
+ 13, 13, 13, 13, 13, 255, 255, 13,
+ 13, 255, 255, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 255, 13, 13, 13, 13, 13, 13,
+ 13, 255, 13, 13, 255, 13, 13, 13,
+ 13, 13, 255, 255, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 255, 255, 13,
+ 13, 255, 255, 13, 13, 13, 255, 255,
+ 255, 255, 255, 255, 255, 255, 13, 13,
+ 255, 255, 255, 255, 13, 13, 255, 13,
+ 13, 13, 13, 13, 255, 255, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 14, 14, 255, 14, 14, 14,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 255, 14, 14, 14, 14, 255, 255,
+ 255, 14, 14, 255, 14, 255, 14, 14,
+ 255, 255, 255, 14, 14, 255, 255, 255,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 255, 255, 255, 255, 14, 14,
+ 14, 14, 14, 255, 255, 255, 14, 14,
+ 14, 255, 14, 14, 14, 14, 255, 255,
+ 14, 255, 255, 255, 255, 255, 255, 14,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 255, 255, 255, 255, 255,
+ 255, 15, 15, 15, 255, 15, 15, 15,
+ 15, 15, 15, 15, 15, 255, 15, 15,
+ 15, 255, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 255, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 255, 15, 15, 15,
+ 15, 15, 255, 255, 255, 15, 15, 15,
+ 15, 15, 15, 15, 15, 255, 15, 15,
+ 15, 255, 15, 15, 15, 15, 255, 255,
+ 255, 255, 255, 255, 255, 15, 15, 255,
+ 15, 15, 255, 255, 255, 255, 255, 255,
+ 15, 15, 15, 15, 255, 255, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 255, 255, 16, 16, 255, 16, 16, 16,
+ 16, 16, 16, 16, 16, 255, 16, 16,
+ 16, 255, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 255, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 255, 16, 16, 16,
+ 16, 16, 255, 255, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 255, 16, 16,
+ 16, 255, 16, 16, 16, 16, 255, 255,
+ 255, 255, 255, 255, 255, 16, 16, 255,
+ 255, 255, 255, 255, 255, 255, 16, 255,
+ 16, 16, 16, 16, 255, 255, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 255, 16, 16, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 17, 17, 255, 17, 17, 17,
+ 17, 17, 17, 17, 17, 255, 17, 17,
+ 17, 255, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 255, 255, 17, 17, 17,
+ 17, 17, 17, 17, 17, 255, 17, 17,
+ 17, 255, 17, 17, 17, 17, 17, 255,
+ 255, 255, 255, 255, 255, 255, 255, 17,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 17, 17, 17, 17, 255, 255, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 255, 255,
+ 255, 17, 17, 17, 17, 17, 17, 17,
+ 255, 255, 18, 18, 255, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 255,
+ 255, 255, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 255, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 255, 18, 255, 255,
+ 18, 18, 18, 18, 18, 18, 18, 255,
+ 255, 255, 18, 255, 255, 255, 255, 18,
+ 18, 18, 18, 18, 18, 255, 18, 255,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 18, 18, 18, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 255, 255, 255, 255, 0,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 20, 20, 255, 20, 255, 255, 20,
+ 20, 255, 20, 255, 255, 20, 255, 255,
+ 255, 255, 255, 255, 20, 20, 20, 20,
+ 255, 20, 20, 20, 20, 20, 20, 20,
+ 255, 20, 20, 20, 255, 20, 255, 20,
+ 255, 255, 20, 20, 255, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 255, 20, 20, 20, 255, 255,
+ 20, 20, 20, 20, 20, 255, 20, 255,
+ 20, 20, 20, 20, 20, 20, 255, 255,
+ 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 255, 255, 20, 20, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 255, 255,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 255, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 255, 21, 21,
+ 21, 21, 21, 21, 21, 0, 0, 0,
+ 0, 21, 21, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 0, 23, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 255, 25, 25, 25, 25, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 255, 255, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 255, 255, 255, 255, 255, 255,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 255, 255, 255,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 0, 0, 0, 29, 29,
+ 29, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 255, 41, 41,
+ 41, 41, 41, 41, 41, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 255, 44, 44,
+ 44, 255, 44, 44, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 255, 255, 255, 255, 255, 255,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 255, 255, 255, 255, 255, 255,
+ 31, 31, 0, 0, 31, 0, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 255, 255, 255, 255, 255, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 255, 255, 255, 255, 255,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 255, 255, 255, 255,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 255, 255, 255, 255,
+ 45, 255, 255, 255, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 255, 255,
+ 46, 46, 46, 46, 46, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 255, 255, 255, 255, 255, 255,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 255, 255, 255, 55, 55,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 255, 255, 53, 53,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 255,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 255, 255, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 255, 255, 255, 255, 255, 255,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 255, 255, 255, 255, 255, 255,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 255, 255, 255, 255,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 61, 61, 61,
+ 61, 61, 61, 61, 61, 255, 255, 255,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 255, 255, 255, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 255, 255, 255, 255, 255, 255,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 255, 255, 255, 255,
+ 255, 255, 255, 255, 92, 92, 92, 92,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 255, 255, 255, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 255, 255, 255, 67, 67, 67,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 40, 40, 40, 0, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 0, 40, 40, 40, 40, 40, 40,
+ 40, 0, 0, 0, 0, 40, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 3, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 40, 40, 40, 40,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 255, 2, 255, 2, 255, 2, 255, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 255, 255, 2, 2,
+ 2, 2, 2, 2, 255, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 255, 255, 2, 2, 2, 255, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40, 40, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 255, 255, 0, 0, 0, 0, 0, 0,
+ 0, 1, 255, 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 255,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 255,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 255, 255, 255, 255, 255, 255,
+ 255, 54, 54, 54, 54, 54, 54, 54,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 57,
+ 57, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 57,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 255, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 35, 0, 35,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 40, 40, 40, 40, 24, 24,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 0, 0, 0, 0,
+ 255, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 255,
+ 255, 40, 40, 0, 0, 32, 32, 32,
+ 0, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 0, 0, 33, 33, 33,
+ 255, 255, 255, 255, 255, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 255, 255,
+ 255, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 255,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 255, 255, 255,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 255, 255, 255, 255,
+ 255, 255, 255, 255, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 1, 1, 1, 1, 255,
+ 1, 1, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 1, 1, 1, 1, 1, 1,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 255, 255, 255, 255, 255, 255,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 255, 255, 255, 255,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 72,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 255, 255, 255,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 255, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 255, 255, 255, 255, 84, 84,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 76, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 76, 76, 76, 76, 255, 255,
+ 76, 76, 76, 76, 76, 76, 76, 76,
+ 76, 76, 255, 255, 76, 76, 76, 76,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 255, 255, 255, 255,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 78, 78, 78, 78, 78,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 25, 25, 25, 25, 25, 25, 255,
+ 255, 25, 25, 25, 25, 25, 25, 255,
+ 255, 25, 25, 25, 25, 25, 25, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 25, 25, 25, 25, 25, 25, 25, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 255, 255,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 255, 255, 255, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 255, 255, 255, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 1, 1, 1, 1, 1, 1, 1, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 4, 4, 4, 4, 4,
+ 255, 255, 255, 255, 255, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 255,
+ 5, 5, 5, 5, 5, 255, 5, 255,
+ 5, 5, 255, 5, 5, 255, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 255, 255, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 0, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 40, 40, 40, 40, 40, 40, 40, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 255, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 255, 255, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 0, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 0, 0,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 255,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 24, 24, 24,
+ 255, 255, 24, 24, 24, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 0, 0, 0, 0, 0, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 255, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 255, 47, 47, 255, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 255, 255, 255, 255, 255,
+ 0, 0, 0, 255, 255, 255, 255, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 40, 255, 255,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 73, 73, 73,
+ 73, 73, 73, 73, 73, 255, 255, 255,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 255,
+ 37, 37, 37, 37, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 255, 48,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 255, 255, 255, 255,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 255, 255,
+ 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 51, 51, 51, 51, 51, 51, 255, 255,
+ 51, 255, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 255, 51,
+ 51, 255, 255, 255, 51, 255, 255, 51,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 255, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 255, 255, 255, 63,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 255, 255, 255, 255, 255, 75,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 60, 60, 60, 60, 255, 60, 60, 255,
+ 255, 255, 255, 255, 60, 60, 60, 60,
+ 60, 60, 60, 60, 255, 60, 60, 60,
+ 255, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 60, 255, 255, 255, 255,
+ 60, 60, 60, 255, 255, 255, 255, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 255, 255, 255, 255, 255, 255, 255,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 255, 255,
+ 255, 79, 79, 79, 79, 79, 79, 79,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 255, 255,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 255, 255, 255, 255, 255,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 255,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 255, 255,
+ 255, 255, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 62, 62, 62, 62, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 33, 32, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 40,
+ 40, 40, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 40, 40, 40, 40, 40,
+ 40, 40, 40, 0, 0, 40, 40, 40,
+ 40, 40, 40, 40, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 40, 40, 40, 40, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 255, 255, 0, 255, 255, 0, 0, 255,
+ 255, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 0,
+ 0, 0, 0, 255, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 255, 0, 255,
+ 255, 255, 0, 0, 0, 0, 0, 0,
+ 0, 255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 255, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 255,
+ 0, 255, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 0, 0, 0, 0, 0,
+ 255, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 0, 0, 0, 255, 0, 255,
+ 0, 255, 0, 255, 0, 0, 0, 255,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 0, 0, 0, 0, 255, 0, 255, 255,
+ 0, 0, 0, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 255, 255, 255, 255, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 0, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255
+ }
+};
diff --git a/gnulib/lib/unictype/scripts_byname.gperf b/gnulib/lib/unictype/scripts_byname.gperf
new file mode 100644
index 0000000..6352fdf
--- /dev/null
+++ b/gnulib/lib/unictype/scripts_byname.gperf
@@ -0,0 +1,109 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Unicode scripts. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+struct named_script { int name; unsigned int index; };
+%struct-type
+%language=ANSI-C
+%define hash-function-name scripts_hash
+%define lookup-function-name uc_script_lookup
+%readonly-tables
+%global-table
+%define word-array-name script_names
+%pic
+%define string-pool-name script_stringpool
+%%
+Common, 0
+Latin, 1
+Greek, 2
+Cyrillic, 3
+Armenian, 4
+Hebrew, 5
+Arabic, 6
+Syriac, 7
+Thaana, 8
+Devanagari, 9
+Bengali, 10
+Gurmukhi, 11
+Gujarati, 12
+Oriya, 13
+Tamil, 14
+Telugu, 15
+Kannada, 16
+Malayalam, 17
+Sinhala, 18
+Thai, 19
+Lao, 20
+Tibetan, 21
+Myanmar, 22
+Georgian, 23
+Hangul, 24
+Ethiopic, 25
+Cherokee, 26
+Canadian_Aboriginal, 27
+Ogham, 28
+Runic, 29
+Khmer, 30
+Mongolian, 31
+Hiragana, 32
+Katakana, 33
+Bopomofo, 34
+Han, 35
+Yi, 36
+Old_Italic, 37
+Gothic, 38
+Deseret, 39
+Inherited, 40
+Tagalog, 41
+Hanunoo, 42
+Buhid, 43
+Tagbanwa, 44
+Limbu, 45
+Tai_Le, 46
+Linear_B, 47
+Ugaritic, 48
+Shavian, 49
+Osmanya, 50
+Cypriot, 51
+Braille, 52
+Buginese, 53
+Coptic, 54
+New_Tai_Lue, 55
+Glagolitic, 56
+Tifinagh, 57
+Syloti_Nagri, 58
+Old_Persian, 59
+Kharoshthi, 60
+Balinese, 61
+Cuneiform, 62
+Phoenician, 63
+Phags_Pa, 64
+Nko, 65
+Sundanese, 66
+Lepcha, 67
+Ol_Chiki, 68
+Vai, 69
+Saurashtra, 70
+Kayah_Li, 71
+Rejang, 72
+Lycian, 73
+Carian, 74
+Lydian, 75
+Cham, 76
+Tai_Tham, 77
+Tai_Viet, 78
+Avestan, 79
+Egyptian_Hieroglyphs, 80
+Samaritan, 81
+Lisu, 82
+Bamum, 83
+Javanese, 84
+Meetei_Mayek, 85
+Imperial_Aramaic, 86
+Old_South_Arabian, 87
+Inscriptional_Parthian, 88
+Inscriptional_Pahlavi, 89
+Old_Turkic, 90
+Kaithi, 91
+Batak, 92
+Brahmi, 93
+Mandaic, 94
diff --git a/gnulib/lib/unictype/sy_c_ident.c b/gnulib/lib/unictype/sy_c_ident.c
new file mode 100644
index 0000000..b46e43c
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_ident.c
@@ -0,0 +1,31 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "sy_c_ident.h"
+#define TABLE u_c_ident
+#include "identsyntaxmap.h"
+
+int
+uc_c_ident_category (ucs4_t uc)
+{
+ return identsyntax_lookup (uc);
+}
diff --git a/gnulib/lib/unictype/sy_c_ident.h b/gnulib/lib/unictype/sy_c_ident.h
new file mode 100644
index 0000000..387aeed
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_ident.h
@@ -0,0 +1,140 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define identsyntax_header_0 12
+#define identsyntax_header_1 14
+#define identsyntax_header_2 7
+#define identsyntax_header_3 31
+#define identsyntax_header_4 127
+static const
+struct
+ {
+ int level1[14];
+ short level2[9 << 5];
+ unsigned short level3[39 * 16];
+ }
+u_c_ident =
+{
+ {
+ 0, 32, 64, 96, 128, 160, 160, 160,
+ 160, 192, 224, 160, 160, 256
+ },
+ {
+ 0, 128, 256, 384, 512, 640, 768, 896,
+ 1024, 1152, 1280, 1408, 1536, 1664, -1, -1,
+ -1, -1, 1792, 1920, 2048, 2176, 2304, 2432,
+ 2560, 2688, 2816, -1, 2944, 3072, 3200, 3328,
+ -1, 3456, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 3584, 3712, 3840,
+ 3968, -1, 4096, 4224, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4352, 4480, 4608, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 4736,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 4864,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x5555, 0xaaa5,
+ 0x0002, 0x0000, 0x0000, 0x2a80, 0x0002, 0x0000, 0x0000, 0xaa80,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaa8a, 0x22aa, 0xaa8a,
+ 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x000a,
+ 0x0000, 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa8, 0x0000, 0x0228,
+ 0xaaa0, 0xaaaa, 0xaaa0, 0xaaaa, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaa8a,
+ 0x8aaa, 0x0880, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8000, 0x8000, 0x888a, 0x0008, 0x0000, 0xaa00, 0xaaaa,
+ 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0002, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaaa0, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2800, 0xa828, 0x0000, 0x0000, 0x0000, 0x0a00, 0xa000, 0xaaa0,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaa2, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x2020,
+ 0xaa82, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaa80, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x0000, 0x0000, 0xaa80,
+ 0x0000, 0x0000, 0xaa80, 0xaaaa, 0x0000, 0xaaa0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x800a,
+ 0x0000, 0x8000, 0x0000, 0xa800, 0x02aa, 0xa008, 0x0000, 0xaaa0,
+ 0x0202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0,
+ 0x0000, 0xa000, 0xaa80, 0x0000, 0x0a00, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a88, 0x0aa0,
+ 0x2800, 0xa028, 0xaaaa, 0x20aa, 0x0a00, 0x0000, 0xaaa0, 0xaaaa,
+ 0x028a, 0x2a80, 0x0028, 0x0000, 0x0000, 0x0008, 0x8208, 0x0aa0,
+ 0x2a80, 0xa028, 0xaaaa, 0x8802, 0x0aaa, 0x0000, 0xa8aa, 0xaaaa,
+ 0x0202, 0x2200, 0x0020, 0x0000, 0x0000, 0x0008, 0x0208, 0x02a0,
+ 0x2000, 0xa020, 0xaaa8, 0xaaaa, 0x0aa8, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a08, 0x02a0,
+ 0x2a00, 0xa028, 0xaaaa, 0x20aa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0a80, 0xa008, 0x0882, 0xa82a, 0x0a80, 0x2000, 0x0aa0,
+ 0x0a80, 0xa008, 0xaaaa, 0xaaaa, 0x2aaa, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0202, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x0aa0,
+ 0x0800, 0xa008, 0xaaaa, 0xaaaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x0aa0,
+ 0x0800, 0xa008, 0xaaaa, 0x8aaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x020a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0000, 0x0aa0,
+ 0x0a00, 0xa008, 0xaaaa, 0xaaaa, 0x0aa0, 0x0000, 0xaaaa, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80,
+ 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x2882, 0xa288, 0x00aa, 0x0002, 0x2202, 0x820a, 0x0000, 0xa020,
+ 0x8800, 0xa000, 0x0000, 0xa0a0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaa0, 0x0000, 0x0000, 0x2200, 0x0aa2,
+ 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0xaaa0, 0x0002, 0x0000,
+ 0x0800, 0xaa00, 0x2000, 0x0002, 0x0000, 0xa000, 0x0002, 0xaaa2,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xaa00, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0x0000, 0x0000, 0xa000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xa000, 0x0000, 0x2222, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8800,
+ 0x080a, 0xa800, 0x0a00, 0xaa00, 0x0000, 0xa800, 0x080a, 0xa800,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa,
+ 0x2a8a, 0x000a, 0xa200, 0xa000, 0x88aa, 0x0008, 0x0020, 0xaaa8,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0xaaa0, 0xaaaa, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xaa00, 0xa82a, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xa82a,
+ 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa
+ }
+};
diff --git a/gnulib/lib/unictype/sy_c_whitespace.c b/gnulib/lib/unictype/sy_c_whitespace.c
new file mode 100644
index 0000000..3c125ee
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_whitespace.c
@@ -0,0 +1,27 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_c_whitespace (ucs4_t uc)
+{
+ return (uc == ' ' || (uc <= 0x000D && uc >= 0x0009));
+}
diff --git a/gnulib/lib/unictype/sy_c_whitespace.h b/gnulib/lib/unictype/sy_c_whitespace.h
new file mode 100644
index 0000000..e78fa6f
--- /dev/null
+++ b/gnulib/lib/unictype/sy_c_whitespace.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_c_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003E00, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unictype/sy_java_ident.c b/gnulib/lib/unictype/sy_java_ident.c
new file mode 100644
index 0000000..f4a2311
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_ident.c
@@ -0,0 +1,31 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "sy_java_ident.h"
+#define TABLE u_java_ident
+#include "identsyntaxmap.h"
+
+int
+uc_java_ident_category (ucs4_t uc)
+{
+ return identsyntax_lookup (uc);
+}
diff --git a/gnulib/lib/unictype/sy_java_ident.h b/gnulib/lib/unictype/sy_java_ident.h
new file mode 100644
index 0000000..46decd6
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_ident.h
@@ -0,0 +1,389 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define identsyntax_header_0 12
+#define identsyntax_header_1 225
+#define identsyntax_header_2 7
+#define identsyntax_header_3 31
+#define identsyntax_header_4 127
+static const
+struct
+ {
+ int level1[225];
+ short level2[21 << 5];
+ unsigned short level3[126 * 16];
+ }
+u_java_ident =
+{
+ {
+ 0, 32, 64, 96, 128, 160, 160, 160,
+ 160, 192, 224, 160, 160, 256, -1, 288,
+ 320, 352, 384, 416, -1, -1, 448, -1,
+ -1, -1, -1, 480, -1, 512, -1, -1,
+ 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 160, 544, 576, -1, -1, -1, 608,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 640
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432,
+ 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456,
+ 3584, 3712, 256, 256, 3840, 3968, 4096, 4224,
+ 4352, 256, 256, 256, 4480, 4608, 4736, 4864,
+ 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888,
+ 6016, 6144, 256, 6272, 256, 256, 6400, 6528,
+ 6656, 6784, 6912, 7040, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7168, 7296, 7424, 7552, 7680, -1, -1, -1,
+ 7808, 7936, 8064, 8192, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 8320, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 8448,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 8576, 256, 256, 8704, 8832, 8960, 9088,
+ 9216, 9344, 9472, 9600, 9728, 9856, 9984, 10112,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 10240,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 256, 256, 10368, 10496, 10624, 10752,
+ 256, 256, 10880, 11008, 11136, 11264, 11392, 11520,
+ 11648, 11776, 11904, 12032, -1, 12160, 12288, 12416,
+ 256, 12544, -1, -1, -1, -1, -1, -1,
+ 12672, -1, 12800, -1, 12928, -1, 13056, -1,
+ 13184, -1, -1, -1, -1, -1, -1, -1,
+ 13312, 13440, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 13568, -1,
+ 13696, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 13824, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 13952, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 14080, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 14208, 14336, 14464, -1, -1, -1,
+ 14592, 14720, 14848, 256, 256, 14976, 15104, 15232,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 15360, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 15488, 256,
+ 15616, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 15616, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 15744, -1, 15872, 16000, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0xffff, 0xfaab, 0xffff, 0xaaff, 0xa8aa, 0xaaaa, 0x5555, 0xaaa5,
+ 0x0002, 0x0000, 0x0000, 0x2a80, 0x0002, 0x0000, 0x0000, 0xea80,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xa00a, 0xae8a, 0xa2aa, 0xaa8a,
+ 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0aa0, 0x0000, 0xaaa0, 0xaaaa, 0xa800, 0x88aa, 0xaaaa, 0xaaaa,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x0800, 0xa00a,
+ 0x8aaa, 0x0880, 0x0000, 0x0000, 0x0020, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x0000,
+ 0x5560, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaa2, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0x5556, 0x5555, 0x5555, 0x5555, 0x5555, 0x6555,
+ 0x6596, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaa80, 0xaaaa,
+ 0xaaff, 0xaa2a, 0x5555, 0xaa95, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5540, 0x5555, 0x5555, 0x5555, 0x0aa5, 0x0001, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5200, 0x6d55, 0x4155, 0x0559, 0x5555, 0x2805,
+ 0xaaaa, 0xeaaa, 0x0004, 0x0000, 0x0000, 0x0000, 0x5555, 0x5555,
+ 0x5555, 0x0295, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x5555, 0xaaa1, 0xaaaa,
+ 0x5555, 0x0005, 0x0000, 0x0000, 0x0000, 0x5540, 0xa055, 0xaa8a,
+ 0x0000, 0x0000, 0x5000, 0x5545, 0x5455, 0xa554, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xaa54, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5150,
+ 0x5555, 0x5555, 0x5554, 0x0000, 0x5a50, 0x5555, 0x0002, 0x0002,
+ 0x0256, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0a88, 0x51a0,
+ 0x6955, 0x8569, 0x6aaa, 0x20aa, 0x5a50, 0x5555, 0xaa00, 0xaa2a,
+ 0x0256, 0x2a80, 0x0028, 0x0000, 0x0000, 0x0008, 0x8208, 0x59a0,
+ 0x6a95, 0xa569, 0xaaa6, 0x8802, 0x5aaa, 0x5555, 0xa405, 0xaaaa,
+ 0x0256, 0x2000, 0x0020, 0x0000, 0x0000, 0x0008, 0x0208, 0x51a0,
+ 0x6555, 0xa565, 0xaaa8, 0xaaaa, 0x5a50, 0x5555, 0xaaa2, 0xaaaa,
+ 0x0256, 0x2800, 0x0028, 0x0000, 0x0000, 0x0008, 0x0208, 0x51a0,
+ 0x6955, 0xa569, 0x5aaa, 0x20aa, 0x5a50, 0x5555, 0xaaa2, 0xaaaa,
+ 0x021a, 0x0a80, 0xa008, 0x0882, 0xa82a, 0x0a80, 0x0000, 0x5aa0,
+ 0x5a95, 0xa559, 0x6aa8, 0xaaaa, 0x5aaa, 0x5555, 0xaaaa, 0xaaa2,
+ 0x0256, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x52a0,
+ 0x5955, 0xa559, 0x96aa, 0xaaa0, 0x5a50, 0x5555, 0xaaaa, 0xaaaa,
+ 0x025a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0008, 0x0200, 0x51a0,
+ 0x5955, 0xa559, 0x96aa, 0x8aaa, 0x5a50, 0x5555, 0xaa82, 0xaaaa,
+ 0x025a, 0x0800, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x5280,
+ 0x5955, 0x8559, 0x6aaa, 0xaaaa, 0x5a50, 0x5555, 0xaaaa, 0x000a,
+ 0x025a, 0x0000, 0x8000, 0x000a, 0x0000, 0x0000, 0x0020, 0xa200,
+ 0x8000, 0x6a9a, 0x9955, 0x5555, 0xaaaa, 0xaaaa, 0xaa5a, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5504, 0x2a95,
+ 0x4000, 0x9555, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x2882, 0xa288, 0x00aa, 0x0002, 0x2202, 0x020a, 0x5504, 0xa165,
+ 0x8800, 0xa555, 0x5555, 0xa0a5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaa8, 0xaaaa, 0xaaaa, 0xaaa5, 0x5555, 0xaaa5, 0x66aa, 0x5aa6,
+ 0x0000, 0x0002, 0x0000, 0x0000, 0x0000, 0xa800, 0x5556, 0x5555,
+ 0x5955, 0x5400, 0x5555, 0x5556, 0x5555, 0x5555, 0x5555, 0xa955,
+ 0x9aaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0x5555, 0x1555,
+ 0x5555, 0xaaa5, 0x5000, 0x5005, 0x4151, 0x0555, 0x0154, 0x0000,
+ 0x5550, 0x4555, 0x5555, 0xa555, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa880,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xa008, 0x8000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000, 0xa008, 0x8000,
+ 0xa008, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xa008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5680, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2800, 0x0000, 0x0000,
+ 0x0002, 0x0000, 0x0000, 0xaa80, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a80, 0xaaa8, 0xaaaa,
+ 0x0000, 0x0800, 0xa950, 0xaaaa, 0x0000, 0x0000, 0xa950, 0xaaaa,
+ 0x0000, 0x0000, 0xaa50, 0xaaaa, 0x0000, 0x0800, 0xaa58, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f00, 0x5555,
+ 0x5555, 0x5555, 0x2a55, 0xa42a, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xa56a, 0x5555, 0xaaa5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa84, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa800, 0x5555, 0xaa55, 0x5555, 0xaa55,
+ 0x5aaa, 0x5555, 0x0000, 0x0000, 0x0000, 0xa000, 0xa800, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0x5555, 0x5555,
+ 0x0001, 0xaaa5, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x4000, 0xaa55, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5400, 0x9555, 0x5555, 0x5555, 0x5555, 0x6955,
+ 0x5555, 0xaaa5, 0x5555, 0xaaa5, 0x2aaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0155, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555,
+ 0x0155, 0xaa00, 0x5555, 0xaaa5, 0xaaaa, 0x556a, 0xaa55, 0xaaaa,
+ 0x0015, 0x0000, 0x0000, 0x0000, 0x5554, 0x0a95, 0x5555, 0xaaa5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5000, 0x5555, 0xaa55, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555, 0x5555, 0xaaaa,
+ 0x5555, 0x02a5, 0x5555, 0x0005, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x5595, 0x5555, 0x5555, 0x0401, 0xaa90, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x9555, 0xaaaa, 0xaaaa, 0x55aa,
+ 0x0000, 0x0000, 0xa000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xa000, 0xa000, 0x0000, 0x2222, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x8800,
+ 0x080a, 0xa800, 0x0a00, 0xaa00, 0x0000, 0xa800, 0x080a, 0xa800,
+ 0xaaaa, 0xffea, 0xaaaa, 0xaaaa, 0xaaaa, 0xbffa, 0xaaaa, 0x2aaa,
+ 0xaaa8, 0xaaaa, 0xa8aa, 0xaaaa, 0xabff, 0xfffa, 0xaaa2, 0x2aaa,
+ 0xaaaa, 0xaaaa, 0x0000, 0xa800, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0xaaaa, 0xaaaa, 0x5555, 0xa955, 0x56a6, 0x5555, 0xaaa9, 0xaaaa,
+ 0x2a8a, 0x000a, 0xa200, 0xa002, 0x88aa, 0x2008, 0x0000, 0x00a0,
+ 0x02aa, 0x8aa0, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0x402a, 0xaaa5, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x2aaa, 0xaaaa, 0x6aaa,
+ 0x0000, 0x0000, 0x8000, 0xaaaa, 0x8000, 0x8000, 0x8000, 0x8000,
+ 0x8000, 0x8000, 0x8000, 0x8000, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x2aaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0002, 0x5550, 0xa002, 0xa800,
+ 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0x0296, 0x0002, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080,
+ 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0002, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaa80,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaa00, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0xa800, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0x0000, 0xa800, 0x0000, 0x0000, 0x5555, 0xaa05, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0xaaaa, 0x25aa,
+ 0x0000, 0x0000, 0x0000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa5, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x2aaa, 0x0000, 0x000a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8028, 0xaaa0, 0xaaaa, 0x0000, 0xaaa0, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x000a,
+ 0x1010, 0x0040, 0x0000, 0x0000, 0x5540, 0xaaaa, 0xaaaa, 0xaaa8,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa,
+ 0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5500, 0x5555,
+ 0xa955, 0xaaaa, 0x5555, 0xaaa5, 0x5555, 0x5555, 0x0005, 0xaa2a,
+ 0x5555, 0x0005, 0x0000, 0x0000, 0x5000, 0xa555, 0x0000, 0x0000,
+ 0x4000, 0x5555, 0xaa55, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xa800,
+ 0x0055, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0x5555,
+ 0xaaa9, 0x2aaa, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5554, 0x9555, 0xaaaa,
+ 0x0040, 0xa500, 0x5555, 0xaaa5, 0x0000, 0x0000, 0x8000, 0xaa4a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4151, 0x5001,
+ 0xaa84, 0xaaaa, 0xaaaa, 0xa02a, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x8002, 0x8002, 0x8002, 0xaaaa, 0x8000, 0x8000, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5540, 0xa595, 0x5555, 0xaaa5,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaaaa, 0x0000, 0x0000,
+ 0x8000, 0x002a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xaaa0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x8000, 0xaaaa, 0x002a, 0x12aa, 0x0000, 0x0008, 0x8000, 0x8800,
+ 0x0820, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa0, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0x002a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000,
+ 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x000a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0xa800,
+ 0x5555, 0x5555, 0xaaaa, 0xaaaa, 0x9555, 0xaaaa, 0xa82a, 0xaaaa,
+ 0xaaaa, 0x02aa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaa2, 0x0800, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe800,
+ 0xa8aa, 0xaaaa, 0x5555, 0xaaa5, 0x0002, 0x0000, 0x0000, 0x2a80,
+ 0x0002, 0x0000, 0x0000, 0xaa80, 0x0aaa, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000,
+ 0x000a, 0x000a, 0x000a, 0xa80a, 0x82a0, 0xaaaa, 0xaaaa, 0xaafe,
+ 0x0000, 0x0200, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x2080,
+ 0x0000, 0xa000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xa6aa,
+ 0x0000, 0x0000, 0x0000, 0xa800, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0x0000, 0x0000,
+ 0x0000, 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xaa00, 0x0000, 0xa002, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0x5555, 0xaaa5, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xa000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x28a8,
+ 0x0000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xaaa0,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x9654, 0x55aa, 0x0200, 0x0002, 0x0000, 0x0000, 0xaa00, 0x6a95,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x0000, 0x0000, 0x0000, 0xa800,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa,
+ 0x0000, 0x0000, 0xa000, 0xaaaa, 0x0000, 0x0000, 0xaa80, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xaaa8, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5555,
+ 0x9555, 0xaaaa, 0xaaaa, 0xaaaa, 0x5aaa, 0x5555, 0xaaaa, 0xaaaa,
+ 0x0015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5555, 0xae95,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaaa8,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaa0, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0x56aa, 0x56a5, 0xffd5, 0x557f,
+ 0x5695, 0xaa55, 0xaaaa, 0xaaaa, 0xaaaa, 0xa55a, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xa95a, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0800, 0x828a, 0x0802, 0x0000, 0x0220,
+ 0x0200, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2000, 0x0280, 0x0800, 0x0800, 0x0000, 0x0000, 0x0000, 0x8020,
+ 0x8800, 0x000a, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x0000, 0x0000, 0x0000,
+ 0x0008, 0x0000, 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0080,
+ 0x0000, 0x0000, 0x0800, 0x0000, 0x0000, 0x0000, 0x0800, 0x0000,
+ 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000,
+ 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000,
+ 0x0080, 0x5a00, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa800, 0xaaaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xa000, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
+ 0xaaae, 0xaaaa, 0xaaaa, 0xaaaa, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
+ 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0xaaaa, 0xaaaa
+ }
+};
diff --git a/gnulib/lib/unictype/sy_java_whitespace.c b/gnulib/lib/unictype/sy_java_whitespace.c
new file mode 100644
index 0000000..3b03ae2
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_whitespace.c
@@ -0,0 +1,27 @@
+/* Syntax properties of Unicode characters.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+bool
+uc_is_java_whitespace (ucs4_t uc)
+{
+ return (uc == ' ' || (uc <= 0x000D && uc >= 0x0009 && uc != 0x000B));
+}
diff --git a/gnulib/lib/unictype/sy_java_whitespace.h b/gnulib/lib/unictype/sy_java_whitespace.h
new file mode 100644
index 0000000..ec51d0e
--- /dev/null
+++ b/gnulib/lib/unictype/sy_java_whitespace.h
@@ -0,0 +1,156 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Language syntax properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[1];
+ short level2[1 << 7];
+ /*unsigned*/ int level3[1 << 4];
+ }
+u_java_whitespace =
+{
+ { 1 },
+ { 2 * sizeof (int) / sizeof (short) + 0 },
+ {
+ 2 + 128 * sizeof (short) / sizeof (int) + 0,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00003600, 0x00000001, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ }
+};
diff --git a/gnulib/lib/unigbrk.in.h b/gnulib/lib/unigbrk.in.h
new file mode 100644
index 0000000..906fc1d
--- /dev/null
+++ b/gnulib/lib/unigbrk.in.h
@@ -0,0 +1,120 @@
+/* Grapheme cluster breaks in Unicode strings.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNIGBRK_H
+#define _UNIGBRK_H
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Property defined in Unicode Standard Annex #29, section "Grapheme Cluster
+ Boundaries"
+ <http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries> */
+
+/* Possible values of the Grapheme_Cluster_Break property.
+ This enumeration may be extended in the future. */
+enum
+{
+ GBP_OTHER = 0,
+ GBP_CR = 1,
+ GBP_LF = 2,
+ GBP_CONTROL = 3,
+ GBP_EXTEND = 4,
+ GBP_PREPEND = 5,
+ GBP_SPACINGMARK = 6,
+ GBP_L = 7,
+ GBP_V = 8,
+ GBP_T = 9,
+ GBP_LV = 10,
+ GBP_LVT = 11
+};
+
+/* Return the Grapheme_Cluster_Break property of a Unicode character. */
+extern int
+ uc_graphemeclusterbreak_property (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Grapheme cluster breaks. */
+
+/* Returns true if there is a grapheme cluster boundary between Unicode code
+ points A and B. A "grapheme cluster" is an approximation to a
+ user-perceived character, which sometimes corresponds to multiple code
+ points. For example, an English letter followed by an acute accent can be
+ expressed as two consecutive Unicode code points, but it is perceived by the
+ user as only a single character and therefore constitutes a single grapheme
+ cluster.
+
+ Implements extended (not legacy) grapheme cluster rules, because UAX #29
+ indicates that they are preferred.
+
+ Use A == 0 or B == 0 to indicate start of text or end of text,
+ respectively. */
+extern bool
+ uc_is_grapheme_break (ucs4_t a, ucs4_t b);
+
+/* Returns the start of the next grapheme cluster following S, or NULL if the
+ end of the string has been reached. */
+extern const uint8_t *
+ u8_grapheme_next (const uint8_t *s, const uint8_t *end);
+extern const uint16_t *
+ u16_grapheme_next (const uint16_t *s, const uint16_t *end);
+extern const uint32_t *
+ u32_grapheme_next (const uint32_t *s, const uint32_t *end);
+
+/* Returns the start of the previous grapheme cluster before S, or NULL if the
+ start of the string has been reached. */
+extern const uint8_t *
+ u8_grapheme_prev (const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+ u16_grapheme_prev (const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+ u32_grapheme_prev (const uint32_t *s, const uint32_t *start);
+
+/* Determine the grapheme cluster boundaries in S, and store the result at
+ p[0..n-1]. p[i] = 1 means that a new grapheme cluster begins at s[i]. p[i]
+ = 0 means that s[i-1] and s[i] are part of the same grapheme cluster. p[0]
+ will always be 1.
+ */
+extern void
+ u8_grapheme_breaks (const uint8_t *s, size_t n, char *p);
+extern void
+ u16_grapheme_breaks (const uint16_t *s, size_t n, char *p);
+extern void
+ u32_grapheme_breaks (const uint32_t *s, size_t n, char *p);
+extern void
+ ulc_grapheme_breaks (const char *s, size_t n, char *p);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNIGBRK_H */
diff --git a/gnulib/lib/unigbrk/gbrkprop.h b/gnulib/lib/unigbrk/gbrkprop.h
new file mode 100644
index 0000000..847d2e7
--- /dev/null
+++ b/gnulib/lib/unigbrk/gbrkprop.h
@@ -0,0 +1,842 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Grapheme break property of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+#define gbrkprop_header_0 16
+#define gbrkprop_header_1 15
+#define gbrkprop_header_2 7
+#define gbrkprop_header_3 511
+#define gbrkprop_header_4 127
+static const
+struct
+ {
+ int level1[15];
+ short level2[3 << 9];
+ unsigned char level3[(78 << 7) / 2];
+ }
+unigbrkprop =
+{
+ {
+ 0, 512, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1024
+ },
+ {
+ 0, 64, -1, -1, -1, -1, 128, -1,
+ -1, 192, -1, 256, 320, 384, 448, 512,
+ 576, -1, 640, 704, 768, 832, 896, 960,
+ 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472,
+ 1536, 1600, 1664, 1728, -1, -1, 1792, -1,
+ -1, -1, -1, -1, -1, -1, 1856, 1920,
+ 1984, 2048, 2112, 2176, 2240, -1, 2304, 2368,
+ 2432, 2496, -1, 2560, -1, -1, -1, -1,
+ 2624, 2688, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2752, 2816, 2880, -1, -1, -1, -1,
+ 2944, 3008, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 3072, 3136, -1, -1,
+ 3200, 3264, 3328, 3392, 3456, 3520, -1, 3584,
+ 3648, 3712, 3776, 3840, 3904, 3968, 4032, 3648,
+ 3712, 3776, 3840, 3904, 3968, 4032, 3648, 3712,
+ 3776, 3840, 3904, 3968, 4032, 3648, 3712, 3776,
+ 3840, 3904, 3968, 4032, 3648, 3712, 3776, 3840,
+ 3904, 3968, 4032, 3648, 3712, 3776, 3840, 3904,
+ 3968, 4032, 3648, 3712, 3776, 3840, 3904, 3968,
+ 4032, 3648, 3712, 3776, 3840, 3904, 3968, 4032,
+ 3648, 3712, 3776, 3840, 3904, 3968, 4032, 3648,
+ 3712, 3776, 3840, 3904, 3968, 4032, 3648, 3712,
+ 3776, 3840, 3904, 3968, 4032, 3648, 3712, 3776,
+ 3840, 3904, 3968, 4032, 3648, 3712, 3776, 4096,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 4160, -1,
+ -1, -1, -1, -1, 4224, 4288, -1, 4352,
+ -1, -1, -1, 4416, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4480, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4544, 4608, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 4672, 4736, 4800, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4864, -1, 4928, 128, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x13, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40,
+ 0x40, 0x04, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x34, 0x40,
+ 0x44, 0x44, 0x04, 0x40, 0x04, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+ 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0x44, 0x40, 0x44, 0x44,
+ 0x44, 0x44, 0x40, 0x44, 0x40, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x04, 0x66,
+ 0x46, 0x44, 0x44, 0x44, 0x64, 0x66, 0x46, 0x66,
+ 0x40, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x64,
+ 0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66,
+ 0x46, 0x04, 0x00, 0x40, 0x04, 0x40, 0x44, 0x00,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x66,
+ 0x46, 0x44, 0x44, 0x40, 0x64, 0x60, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44,
+ 0x46, 0x44, 0x04, 0x60, 0x06, 0x60, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
+ 0x64, 0x06, 0x00, 0x66, 0x06, 0x66, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
+ 0x64, 0x66, 0x06, 0x44, 0x04, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46,
+ 0x66, 0x64, 0x06, 0x64, 0x06, 0x66, 0x44, 0x00,
+ 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64,
+ 0x46, 0x44, 0x04, 0x66, 0x06, 0x66, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40,
+ 0x66, 0x44, 0x04, 0x04, 0x66, 0x66, 0x66, 0x46,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x46, 0x66, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00,
+ 0x55, 0x55, 0x65, 0x40, 0x44, 0x44, 0x44, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x46, 0x66, 0x44, 0x44, 0x44, 0x40, 0x04, 0x00,
+ 0x55, 0x55, 0x05, 0x00, 0x44, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x66,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x64,
+ 0x44, 0x44, 0x04, 0x44, 0x00, 0x00, 0x40, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x40, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x46, 0x44,
+ 0x64, 0x44, 0x44, 0x44, 0x46, 0x64, 0x46, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x66, 0x44, 0x00, 0x00, 0x44,
+ 0x04, 0x66, 0x06, 0x60, 0x66, 0x66, 0x66, 0x00,
+ 0x40, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x64, 0x46, 0x64, 0x66, 0x66, 0x46, 0x60,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x33, 0x46, 0x44, 0x44, 0x44, 0x66,
+ 0x66, 0x66, 0x66, 0x64, 0x46, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x64, 0x66, 0x46, 0x64, 0x66, 0x00, 0x00,
+ 0x66, 0x64, 0x66, 0x66, 0x46, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x06, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x64, 0x66, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x64, 0x44, 0x44, 0x44, 0x04,
+ 0x64, 0x64, 0x46, 0x44, 0x44, 0x44, 0x64, 0x66,
+ 0x66, 0x46, 0x44, 0x44, 0x44, 0x44, 0x04, 0x40,
+ 0x44, 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x64, 0x44, 0x44, 0x64, 0x64, 0x66,
+ 0x66, 0x64, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44,
+ 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x60, 0x44, 0x44, 0x66, 0x44, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x64, 0x44, 0x66, 0x46, 0x46,
+ 0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x44, 0x44,
+ 0x44, 0x44, 0x66, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x04, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x64, 0x44, 0x44, 0x44, 0x04, 0x00, 0x40, 0x00,
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x33,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x33, 0x33, 0x33, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0x33, 0x03, 0x00, 0x00, 0x33, 0x33, 0x33,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
+ 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x04, 0x00, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0x46, 0x64, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
+ 0x66, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x07, 0x00,
+ 0x44, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x66, 0x44, 0x44, 0x66, 0x64, 0x66,
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x64,
+ 0x46, 0x64, 0x46, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x44, 0x54, 0x45, 0x54, 0x50, 0x05, 0x44,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x60, 0x46, 0x66, 0x64, 0x06, 0x46, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+ 0xbb, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x08, 0x00, 0x90, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99,
+ 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x30, 0x33, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x40, 0x44, 0x40, 0x04, 0x00, 0x00, 0x44, 0x44,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x46, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x46, 0x44, 0x64, 0x46, 0x04, 0x30, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x46, 0x44, 0x00, 0x60, 0x44,
+ 0x44, 0x34, 0x33, 0x33, 0x33, 0x43, 0x44, 0x44,
+ 0x44, 0x04, 0x40, 0x44, 0x44, 0x44, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44
+ }
+};
diff --git a/gnulib/lib/unigbrk/u16-grapheme-breaks.c b/gnulib/lib/unigbrk/u16-grapheme-breaks.c
new file mode 100644
index 0000000..b922434
--- /dev/null
+++ b/gnulib/lib/unigbrk/u16-grapheme-breaks.c
@@ -0,0 +1,44 @@
+/* Grapheme cluster breaks function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+void
+u16_grapheme_breaks (const uint16_t *s, size_t n, char *p)
+{
+ ucs4_t prev;
+ int mblen;
+
+ prev = 0;
+ for (; n > 0; s += mblen, p += mblen, n -= mblen)
+ {
+ ucs4_t next;
+
+ mblen = u16_mbtouc (&next, s, n);
+
+ p[0] = uc_is_grapheme_break (prev, next);
+ if (mblen > 1)
+ p[1] = 0;
+
+ prev = next;
+ }
+}
diff --git a/gnulib/lib/unigbrk/u16-grapheme-next.c b/gnulib/lib/unigbrk/u16-grapheme-next.c
new file mode 100644
index 0000000..c4bed19
--- /dev/null
+++ b/gnulib/lib/unigbrk/u16-grapheme-next.c
@@ -0,0 +1,46 @@
+/* Next grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint16_t *
+u16_grapheme_next (const uint16_t *s, const uint16_t *end)
+{
+ ucs4_t prev;
+ int mblen;
+
+ if (s == end)
+ return NULL;
+
+ for (s += u16_mbtouc (&prev, s, end - s); s != end; s += mblen)
+ {
+ ucs4_t next;
+
+ mblen = u16_mbtouc (&next, s, end - s);
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ prev = next;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/u16-grapheme-prev.c b/gnulib/lib/unigbrk/u16-grapheme-prev.c
new file mode 100644
index 0000000..ff7a065
--- /dev/null
+++ b/gnulib/lib/unigbrk/u16-grapheme-prev.c
@@ -0,0 +1,54 @@
+/* Previous grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint16_t *
+u16_grapheme_prev (const uint16_t *s, const uint16_t *start)
+{
+ ucs4_t next;
+
+ if (s == start)
+ return NULL;
+
+ s = u16_prev (&next, s, start);
+ while (s != start)
+ {
+ const uint16_t *prev_s;
+ ucs4_t prev;
+
+ prev_s = u16_prev (&prev, s, start);
+ if (prev_s == NULL)
+ {
+ /* Ill-formed UTF-16 encoding. */
+ return start;
+ }
+
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ s = prev_s;
+ next = prev;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/u32-grapheme-breaks.c b/gnulib/lib/unigbrk/u32-grapheme-breaks.c
new file mode 100644
index 0000000..09dc238
--- /dev/null
+++ b/gnulib/lib/unigbrk/u32-grapheme-breaks.c
@@ -0,0 +1,42 @@
+/* Grapheme cluster breaks function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+void
+u32_grapheme_breaks (const uint32_t *s, size_t n, char *p)
+{
+ ucs4_t prev;
+ size_t i;
+
+ prev = 0;
+ for (i = 0; i < n; i++)
+ {
+ ucs4_t next;
+
+ u32_mbtouc (&next, &s[i], 1);
+
+ p[i] = uc_is_grapheme_break (prev, next);
+
+ prev = next;
+ }
+}
diff --git a/gnulib/lib/unigbrk/u32-grapheme-next.c b/gnulib/lib/unigbrk/u32-grapheme-next.c
new file mode 100644
index 0000000..52dc514
--- /dev/null
+++ b/gnulib/lib/unigbrk/u32-grapheme-next.c
@@ -0,0 +1,46 @@
+/* Next grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint32_t *
+u32_grapheme_next (const uint32_t *s, const uint32_t *end)
+{
+ ucs4_t prev;
+
+ if (s == end)
+ return NULL;
+
+ u32_mbtouc (&prev, s, end - s);
+ for (s++; s != end; s++)
+ {
+ ucs4_t next;
+
+ u32_mbtouc (&next, s, end - s);
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ prev = next;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/u32-grapheme-prev.c b/gnulib/lib/unigbrk/u32-grapheme-prev.c
new file mode 100644
index 0000000..fb0ea13
--- /dev/null
+++ b/gnulib/lib/unigbrk/u32-grapheme-prev.c
@@ -0,0 +1,51 @@
+/* Previous grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint32_t *
+u32_grapheme_prev (const uint32_t *s, const uint32_t *start)
+{
+ ucs4_t next;
+
+ if (s == start)
+ return NULL;
+
+ u32_prev (&next, s, start);
+ for (s--; s != start; s--)
+ {
+ ucs4_t prev;
+
+ if (u32_prev (&prev, s, start) == NULL)
+ {
+ /* Ill-formed UTF-32 encoding. */
+ return start;
+ }
+
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ next = prev;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/u8-grapheme-breaks.c b/gnulib/lib/unigbrk/u8-grapheme-breaks.c
new file mode 100644
index 0000000..f145bdc
--- /dev/null
+++ b/gnulib/lib/unigbrk/u8-grapheme-breaks.c
@@ -0,0 +1,46 @@
+/* Grapheme cluster breaks function.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010,
+ based on code written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+void
+u8_grapheme_breaks (const uint8_t *s, size_t n, char *p)
+{
+ ucs4_t prev;
+ int mblen;
+
+ prev = 0;
+ for (; n > 0; s += mblen, p += mblen, n -= mblen)
+ {
+ ucs4_t next;
+ int i;
+
+ mblen = u8_mbtouc (&next, s, n);
+
+ p[0] = uc_is_grapheme_break (prev, next);
+ for (i = 1; i < mblen; i++)
+ p[i] = 0;
+
+ prev = next;
+ }
+}
diff --git a/gnulib/lib/unigbrk/u8-grapheme-next.c b/gnulib/lib/unigbrk/u8-grapheme-next.c
new file mode 100644
index 0000000..068f174
--- /dev/null
+++ b/gnulib/lib/unigbrk/u8-grapheme-next.c
@@ -0,0 +1,46 @@
+/* Next grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint8_t *
+u8_grapheme_next (const uint8_t *s, const uint8_t *end)
+{
+ ucs4_t prev;
+ int mblen;
+
+ if (s == end)
+ return NULL;
+
+ for (s += u8_mbtouc (&prev, s, end - s); s != end; s += mblen)
+ {
+ ucs4_t next;
+
+ mblen = u8_mbtouc (&next, s, end - s);
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ prev = next;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/u8-grapheme-prev.c b/gnulib/lib/unigbrk/u8-grapheme-prev.c
new file mode 100644
index 0000000..d89e181
--- /dev/null
+++ b/gnulib/lib/unigbrk/u8-grapheme-prev.c
@@ -0,0 +1,54 @@
+/* Previous grapheme cluster function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "unistr.h"
+
+const uint8_t *
+u8_grapheme_prev (const uint8_t *s, const uint8_t *start)
+{
+ ucs4_t next;
+
+ if (s == start)
+ return NULL;
+
+ s = u8_prev (&next, s, start);
+ while (s != start)
+ {
+ const uint8_t *prev_s;
+ ucs4_t prev;
+
+ prev_s = u8_prev (&prev, s, start);
+ if (prev_s == NULL)
+ {
+ /* Ill-formed UTF-8 encoding. */
+ return start;
+ }
+
+ if (uc_is_grapheme_break (prev, next))
+ break;
+
+ s = prev_s;
+ next = prev;
+ }
+
+ return s;
+}
diff --git a/gnulib/lib/unigbrk/uc-gbrk-prop.c b/gnulib/lib/unigbrk/uc-gbrk-prop.c
new file mode 100644
index 0000000..c349afb
--- /dev/null
+++ b/gnulib/lib/unigbrk/uc-gbrk-prop.c
@@ -0,0 +1,45 @@
+/* Grapheme cluster break property function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include "gbrkprop.h"
+
+int
+uc_graphemeclusterbreak_property (ucs4_t uc)
+{
+ unsigned int index1 = uc >> gbrkprop_header_0;
+ if (index1 < gbrkprop_header_1)
+ {
+ int lookup1 = unigbrkprop.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> gbrkprop_header_2) & gbrkprop_header_3;
+ int lookup2 = unigbrkprop.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & gbrkprop_header_4;
+ unsigned char lookup3 = unigbrkprop.level3[lookup2 + index3 / 2];
+ return (lookup3 >> ((uc & 1) << 2)) & 0x0f;
+ }
+ }
+ }
+ return GBP_OTHER;
+}
diff --git a/gnulib/lib/unigbrk/uc-is-grapheme-break.c b/gnulib/lib/unigbrk/uc-is-grapheme-break.c
new file mode 100644
index 0000000..c67a5da
--- /dev/null
+++ b/gnulib/lib/unigbrk/uc-is-grapheme-break.c
@@ -0,0 +1,106 @@
+/* Grapheme cluster break function.
+ Copyright (C) 2010-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+/* Evaluates to true if there is an extended grapheme cluster break between
+ code points with GBP_* values A and B, false if there is not. The comments
+ are the grapheme cluster boundary rules from in UAX #29. */
+#define UC_IS_GRAPHEME_BREAK(A, B) \
+ (/* GB1 and GB2 are covered--just use a GBP_CONTROL character, such \
+ as 0, for sot and eot. */ \
+ \
+ /* GB3 */ \
+ (A) == GBP_CR && (B) == GBP_LF ? false : \
+ \
+ /* GB4 */ \
+ (A) == GBP_CONTROL || (A) == GBP_CR || (A) == GBP_LF ? true : \
+ \
+ /* GB5 */ \
+ (B) == GBP_CONTROL || (B) == GBP_CR || (B) == GBP_LF ? true : \
+ \
+ /* GB6 */ \
+ (A) == GBP_L && ((B) == GBP_L || (B) == GBP_V \
+ || (B) == GBP_LV || (B) == GBP_LVT) ? false : \
+ \
+ /* GB7 */ \
+ ((A) == GBP_LV || (A) == GBP_V) \
+ && ((B) == GBP_V || (B) == GBP_T) ? false : \
+ \
+ /* GB8 */ \
+ ((A) == GBP_LVT || (A) == GBP_T) && (B) == GBP_T ? false : \
+ \
+ /* GB9 */ \
+ (B) == GBP_EXTEND ? false : \
+ \
+ /* GB9a */ \
+ (B) == GBP_SPACINGMARK ? false : \
+ \
+ /* GB9b */ \
+ (A) == GBP_PREPEND ? false \
+ \
+ /* GB10 */ \
+ : true)
+
+#define UC_GRAPHEME_BREAKS_FOR(A) \
+ ( (UC_IS_GRAPHEME_BREAK(A, GBP_OTHER) << GBP_OTHER) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_CR) << GBP_CR) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_LF) << GBP_LF) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_CONTROL) << GBP_CONTROL) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_EXTEND) << GBP_EXTEND) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_PREPEND) << GBP_PREPEND) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_SPACINGMARK) << GBP_SPACINGMARK) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_L) << GBP_L) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_V) << GBP_V) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_T) << GBP_T) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_LV) << GBP_LV) \
+ | (UC_IS_GRAPHEME_BREAK(A, GBP_LVT) << GBP_LVT))
+
+static const unsigned short int gb_table[12] =
+ {
+ UC_GRAPHEME_BREAKS_FOR(0), /* GBP_OTHER */
+ UC_GRAPHEME_BREAKS_FOR(1), /* GBP_CR */
+ UC_GRAPHEME_BREAKS_FOR(2), /* GBP_LF */
+ UC_GRAPHEME_BREAKS_FOR(3), /* GBP_CONTROL */
+ UC_GRAPHEME_BREAKS_FOR(4), /* GBP_EXTEND */
+ UC_GRAPHEME_BREAKS_FOR(5), /* GBP_PREPEND */
+ UC_GRAPHEME_BREAKS_FOR(6), /* GBP_SPACINGMARK */
+ UC_GRAPHEME_BREAKS_FOR(7), /* GBP_L */
+ UC_GRAPHEME_BREAKS_FOR(8), /* GBP_V */
+ UC_GRAPHEME_BREAKS_FOR(9), /* GBP_T */
+ UC_GRAPHEME_BREAKS_FOR(10), /* GBP_LV */
+ UC_GRAPHEME_BREAKS_FOR(11), /* GBP_LVT */
+ };
+
+bool
+uc_is_grapheme_break (ucs4_t a, ucs4_t b)
+{
+ int a_gcp, b_gcp;
+
+ if ((a | b) < 0x300)
+ {
+ /* GB3 is the only relevant rule for this case. */
+ return a != '\r' || b != '\n';
+ }
+
+ a_gcp = uc_graphemeclusterbreak_property (a);
+ b_gcp = uc_graphemeclusterbreak_property (b);
+ return (gb_table[a_gcp] >> b_gcp) & 1;
+}
diff --git a/gnulib/lib/unigbrk/ulc-grapheme-breaks.c b/gnulib/lib/unigbrk/ulc-grapheme-breaks.c
new file mode 100644
index 0000000..68dde87
--- /dev/null
+++ b/gnulib/lib/unigbrk/ulc-grapheme-breaks.c
@@ -0,0 +1,130 @@
+/* Grapheme cluster breaks function.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Ben Pfaff <blp@cs.stanford.edu>, 2010,
+ based on code written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unigbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "c-strcaseeq.h"
+#include "localcharset.h"
+#include "uniconv.h"
+
+static int
+is_utf8_encoding (const char *encoding)
+{
+ if (STRCASEEQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
+
+#if C_CTYPE_ASCII
+/* Assume that every ASCII character starts a new grapheme, which is often
+ true, except that CR-LF is a single grapheme. */
+static void
+ascii_grapheme_breaks (const char *s, size_t n, char *p)
+{
+ size_t i;
+
+ p[0] = 1;
+ for (i = 1; i < n; i++)
+ {
+ bool is_ascii = c_isprint (s[i]) || c_isspace (s[i]);
+ p[i] = is_ascii && (s[i] != '\n' || s[i - 1] != '\r');
+ }
+}
+#endif
+
+/* Grapheme boundaries in a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+void
+ulc_grapheme_breaks (const char *s, size_t n, char *p)
+{
+ if (n > 0)
+ {
+ const char *encoding = locale_charset ();
+
+ if (is_utf8_encoding (encoding))
+ u8_grapheme_breaks ((const uint8_t *) s, n, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *q = (char *) (m > 0 ? malloc (m) : NULL);
+
+ if (m == 0 || q != NULL)
+ {
+ size_t i;
+
+ /* Determine the grapheme breaks of the UTF-8 string. */
+ u8_grapheme_breaks (t, m, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, 0, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (q);
+ free (t);
+ free (offsets);
+ return;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ /* Fall back to ASCII as best we can. */
+ ascii_grapheme_breaks (s, n, p);
+#else
+ /* We cannot make any assumptions. */
+ p[0] = 1;
+ memset (p + 1, 0, n - 1);
+#endif
+ }
+ }
+}
diff --git a/gnulib/lib/unilbrk.in.h b/gnulib/lib/unilbrk.in.h
new file mode 100644
index 0000000..0a14866
--- /dev/null
+++ b/gnulib/lib/unilbrk.in.h
@@ -0,0 +1,110 @@
+/* Line breaking of Unicode strings.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNILBRK_H
+#define _UNILBRK_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+
+/* Line breaking. */
+
+enum
+{
+ UC_BREAK_UNDEFINED,
+ UC_BREAK_PROHIBITED,
+ UC_BREAK_POSSIBLE,
+ UC_BREAK_MANDATORY,
+ UC_BREAK_HYPHENATION
+};
+
+/* Determine the line break points in S, and store the result at p[0..n-1].
+ p[i] = UC_BREAK_MANDATORY means that s[i] is a line break character.
+ p[i] = UC_BREAK_POSSIBLE means that a line break may be inserted between
+ s[i-1] and s[i].
+ p[i] = UC_BREAK_HYPHENATION means that a hyphen and a line break may be
+ inserted between s[i-1] and s[i]. But beware of language dependent
+ hyphenation rules.
+ p[i] = UC_BREAK_PROHIBITED means that s[i-1] and s[i] must not be separated.
+ */
+extern void
+ u8_possible_linebreaks (const uint8_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ u16_possible_linebreaks (const uint16_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ u32_possible_linebreaks (const uint32_t *s, size_t n,
+ const char *encoding, char *p);
+extern void
+ ulc_possible_linebreaks (const char *s, size_t n,
+ const char *encoding, char *p);
+
+/* Choose the best line breaks, assuming the uc_width function.
+ The string is s[0..n-1]. The maximum number of columns per line is given
+ as WIDTH. The starting column of the string is given as START_COLUMN.
+ If the algorithm shall keep room after the last piece, they can be given
+ as AT_END_COLUMNS.
+ o is an optional override; if o[i] != UC_BREAK_UNDEFINED, o[i] takes
+ precedence over p[i] as returned by the *_possible_linebreaks function.
+ The given ENCODING is used for disambiguating widths in uc_width.
+ Return the column after the end of the string, and store the result at
+ p[0..n-1].
+ */
+extern int
+ u8_width_linebreaks (const uint8_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ u16_width_linebreaks (const uint16_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ u32_width_linebreaks (const uint32_t *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+extern int
+ ulc_width_linebreaks (const char *s, size_t n, int width,
+ int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNILBRK_H */
diff --git a/gnulib/lib/unilbrk/lbrkprop1.h b/gnulib/lib/unilbrk/lbrkprop1.h
new file mode 100644
index 0000000..aacd2d7
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrkprop1.h
@@ -0,0 +1,33 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-lbrk for Unicode 6.0.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define lbrkprop_header_0 16
+#define lbrkprop_header_1 15
+#define lbrkprop_header_2 7
+#define lbrkprop_header_3 511
+#define lbrkprop_header_4 127
+
+typedef struct
+ {
+ int level1[15];
+ int level2[4 << 9];
+ unsigned char level3[166 << 7];
+ }
+lbrkprop_t;
+extern const lbrkprop_t unilbrkprop;
diff --git a/gnulib/lib/unilbrk/lbrkprop2.h b/gnulib/lib/unilbrk/lbrkprop2.h
new file mode 100644
index 0000000..6c1baff
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrkprop2.h
@@ -0,0 +1,2942 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-lbrk for Unicode 6.0.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2008 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+const lbrkprop_t unilbrkprop =
+{
+ {
+ 0, 512, 1024, 1024, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1536
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432,
+ 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456,
+ 3584, 3712, 3840, 3968, 4096, 4224, 4352, 4480,
+ 4608, 256, 256, 256, 256, 4736, 4864, 4992,
+ 5120, 5248, 5376, 5504, 5632, 5760, 5888, 6016,
+ 6144, 6272, 256, 6400, 256, 256, 6528, 6656,
+ 6784, 6912, 7040, 7168, 7296, 7424, 7552, 7680,
+ 7808, 7936, 8064, 8192, 8320, 8448, 8576, 8704,
+ 256, 256, 256, 8832, 256, 256, 8960, -1,
+ 9088, 9216, 9344, 9472, 9600, 9728, 9856, 9984,
+ 10112, 10240, 10368, 10496, 10624, 10752, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 10880, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 11008, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 11136, 256, 256, 11264, 11392, 256, 11520,
+ 11648, 11776, 11904, 12032, 12160, 12288, 12416, 12544,
+ 12672, 12800, 12928, 13056, 13184, 13312, 13440, 12672,
+ 12800, 12928, 13056, 13184, 13312, 13440, 12672, 12800,
+ 12928, 13056, 13184, 13312, 13440, 12672, 12800, 12928,
+ 13056, 13184, 13312, 13440, 12672, 12800, 12928, 13056,
+ 13184, 13312, 13440, 12672, 12800, 12928, 13056, 13184,
+ 13312, 13440, 12672, 12800, 12928, 13056, 13184, 13312,
+ 13440, 12672, 12800, 12928, 13056, 13184, 13312, 13440,
+ 12672, 12800, 12928, 13056, 13184, 13312, 13440, 12672,
+ 12800, 12928, 13056, 13184, 13312, 13440, 12672, 12800,
+ 12928, 13056, 13184, 13312, 13440, 12672, 12800, 12928,
+ 13056, 13184, 13312, 13440, 12672, 12800, 12928, 13568,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 9856, 9856, 9856, 9856, 13696, 13824,
+ 256, 256, 13952, 14080, 14208, 14336, 14464, 14592,
+ 14720, 14848, 14976, 15104, -1, 15232, 15360, 15488,
+ 256, 15616, -1, -1, -1, -1, -1, -1,
+ 15744, -1, 15872, -1, 16000, -1, 16128, -1,
+ 16256, -1, -1, -1, 16384, -1, -1, -1,
+ 16512, 16640, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 16768, -1,
+ 16896, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 17024, 17152, 17280, 256,
+ 17408, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 17536, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 17664, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 17792, 17920, 18048, 18176, -1, 18304, -1,
+ 18432, 18560, 18688, 256, 256, 18816, 256, 18944,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 19072, 19200, 19328, 19456, 19584, -1, 19712, 19840,
+ 19968, 20096, 20224, 20352, 20480, 20608, 7680, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856,
+ 9856, 9856, 9856, 9856, 9856, 9856, 9856, 20736,
+ 20864, -1, 20992, 21120, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_BA, LBP_BK, LBP_BK, LBP_BK, LBP_BK, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_SP, LBP_EX, LBP_QU, LBP_AL, LBP_PR, LBP_PO, LBP_AL, LBP_QU,
+ LBP_OP, LBP_CP, LBP_AL, LBP_PR, LBP_IS, LBP_HY, LBP_IS, LBP_SY,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_IS, LBP_IS, LBP_AL, LBP_AL, LBP_AL, LBP_EX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_PR, LBP_CP, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_BA, LBP_CL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BK, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_GL, LBP_OP, LBP_PO, LBP_PR, LBP_PR, LBP_PR, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AI, LBP_QU, LBP_AL, LBP_BA, LBP_AL, LBP_AL,
+ LBP_PO, LBP_PR, LBP_AI, LBP_AI, LBP_BB, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_QU, LBP_AI, LBP_AI, LBP_AI, LBP_OP,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_BB, LBP_AI, LBP_AI, LBP_AI, LBP_BB, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_BB,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_GL, LBP_GL, LBP_GL,
+ LBP_GL, LBP_GL, LBP_GL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_IS, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM,
+ LBP_AL, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_EX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PO, LBP_PO, LBP_PO, LBP_IS, LBP_IS, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_EX, LBP_XX, LBP_XX, LBP_EX, LBP_EX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_PO, LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_EX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_IS, LBP_EX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_PO, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PO, LBP_AL, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM,
+ LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PR, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_PR,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA,
+ LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_XX, LBP_SA, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX, LBP_SA,
+ LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_SA, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_BB, LBP_BB, LBP_BB, LBP_BB, LBP_AL, LBP_BB, LBP_BB,
+ LBP_GL, LBP_BB, LBP_BB, LBP_BA, LBP_GL, LBP_EX, LBP_EX, LBP_EX,
+ LBP_EX, LBP_EX, LBP_GL, LBP_AL, LBP_EX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_CM, LBP_AL, LBP_CM,
+ LBP_AL, LBP_CM, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_BB, LBP_BB, LBP_BA, LBP_BB, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_GL, LBP_GL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_BA, LBP_BA, LBP_NS, LBP_SA,
+ LBP_BA, LBP_AL, LBP_BA, LBP_PR, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_EX, LBP_EX, LBP_BA, LBP_BA, LBP_BB, LBP_AL,
+ LBP_EX, LBP_EX, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_GL, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_EX, LBP_EX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_CM,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_AL, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_GL,
+ LBP_BA, LBP_BA, LBP_BA, LBP_ZW, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_BA, LBP_GL, LBP_BA, LBP_BA, LBP_B2, LBP_AI, LBP_AI, LBP_AL,
+ LBP_QU, LBP_QU, LBP_OP, LBP_QU, LBP_QU, LBP_QU, LBP_OP, LBP_QU,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_IN, LBP_IN, LBP_IN, LBP_BA,
+ LBP_BK, LBP_BK, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_GL,
+ LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO, LBP_PO,
+ LBP_AL, LBP_QU, LBP_QU, LBP_AI, LBP_NS, LBP_NS, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_IS, LBP_OP, LBP_CL, LBP_NS,
+ LBP_NS, LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_AL,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA, LBP_BA, LBP_BA,
+ LBP_WJ, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AI,
+ LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR,
+ LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PR, LBP_PO, LBP_PR,
+ LBP_PR, LBP_PR, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_PO, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_PR, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AI, LBP_PR, LBP_PR, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AL, LBP_AI, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AL, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI,
+ LBP_AL, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_AL,
+ LBP_AL, LBP_AL, LBP_EX, LBP_EX, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_EX, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_EX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU,
+ LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_QU, LBP_BA, LBP_BA,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_AL, LBP_BA,
+ LBP_OP, LBP_BA, LBP_AL, LBP_AL, LBP_QU, LBP_QU, LBP_AL, LBP_AL,
+ LBP_QU, LBP_QU, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_EX, LBP_AL,
+ LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_CL, LBP_CL, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_NS, LBP_OP, LBP_CL, LBP_CL,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID,
+ LBP_XX, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID,
+ LBP_NS, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_NS, LBP_ID, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_ID,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_NS, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_EX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_AL, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_PO, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BB, LBP_BB, LBP_EX, LBP_EX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_BA, LBP_BA,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL,
+ LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_JL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_BA,
+ LBP_BA, LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_AL, LBP_BA, LBP_BA, LBP_BA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_SA, LBP_SA, LBP_SA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_SA, LBP_SA, LBP_SA, LBP_SA, LBP_SA,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_BA, LBP_CM, LBP_CM, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H2, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H2, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_H3,
+ LBP_H3, LBP_H3, LBP_H3, LBP_H3, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV,
+ LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_JV, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_JT,
+ LBP_JT, LBP_JT, LBP_JT, LBP_JT, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_CM, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_PO, LBP_AL, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_IS, LBP_CL, LBP_CL, LBP_IS, LBP_IS, LBP_EX, LBP_EX, LBP_OP,
+ LBP_CL, LBP_IN, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP,
+ LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_OP,
+ LBP_CL, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_CL, LBP_ID, LBP_CL, LBP_XX, LBP_NS, LBP_NS, LBP_EX, LBP_EX,
+ LBP_ID, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_OP, LBP_CL, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX,
+ LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_WJ,
+ LBP_XX, LBP_EX, LBP_ID, LBP_ID, LBP_PR, LBP_PO, LBP_ID, LBP_ID,
+ LBP_OP, LBP_CL, LBP_ID, LBP_ID, LBP_CL, LBP_ID, LBP_CL, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_NS, LBP_NS, LBP_ID, LBP_ID, LBP_ID, LBP_EX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_OP, LBP_ID, LBP_CL, LBP_ID, LBP_OP,
+ LBP_CL, LBP_CL, LBP_OP, LBP_CL, LBP_CL, LBP_NS, LBP_AL, LBP_NS,
+ LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS, LBP_NS,
+ LBP_NS, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NS, LBP_NS,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_PO, LBP_PR, LBP_ID, LBP_ID, LBP_ID, LBP_PR, LBP_PR, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CB, LBP_AI, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_CM, LBP_CM, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_CM,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_BA,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_BA,
+ LBP_BA, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_BA, LBP_BA,
+ LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_BA, LBP_BA, LBP_BA, LBP_BA, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_OP, LBP_OP, LBP_OP, LBP_CL, LBP_CL, LBP_CL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_OP, LBP_CL,
+ LBP_OP, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_OP, LBP_CL, LBP_CL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_CM, LBP_CM, LBP_CM, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU, LBP_NU,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AL, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI, LBP_AI,
+ LBP_AI, LBP_AI, LBP_AI, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX,
+ LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL,
+ LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_AL, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID,
+ LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_ID, LBP_XX, LBP_XX,
+ LBP_XX, LBP_CM, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM, LBP_CM,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX,
+ LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX, LBP_XX
+ }
+};
diff --git a/gnulib/lib/unilbrk/lbrktables.c b/gnulib/lib/unilbrk/lbrktables.c
new file mode 100644
index 0000000..054da45
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrktables.c
@@ -0,0 +1,64 @@
+/* Line breaking auxiliary tables.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk/lbrktables.h"
+
+/* Define unilbrkprop, table of line breaking properties. */
+#include "unilbrk/lbrkprop2.h"
+
+const unsigned char unilbrk_table[25][25] =
+{
+ /* after */
+ /* WJ GL B2 BA BB HY CL CP EX IN NS OP QU IS NU PO PR SY AL H2 H3 ID JL JV JT */
+/* WJ */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* GL */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* B2 */ { P, I, P, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* BA */ { P, D, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* BB */ { P, I, I, I, I, I, P, P, P, I, I, I, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* HY */ { P, D, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* CL */ { P, I, D, I, D, I, P, P, P, D, P, D, I, P, D, I, I, P, D, D, D, D, D, D, D, },
+/* CP */ { P, I, D, I, D, I, P, P, P, D, P, D, I, P, I, I, I, P, I, D, D, D, D, D, D, },
+/* EX */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* IN */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* NS */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, D, D, D, P, D, D, D, D, D, D, D, },
+/* OP */ { P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, },
+/* QU */ { P, I, I, I, I, I, P, P, P, I, I, P, I, P, I, I, I, P, I, I, I, I, I, I, I, },
+/* IS */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* NU */ { P, I, D, I, D, I, P, P, P, I, I, I, I, P, I, I, I, P, I, D, D, D, D, D, D, },
+/* PO */ { P, I, D, I, D, I, P, P, P, D, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, },
+/* PR */ { P, I, D, I, D, I, P, P, P, D, I, I, I, P, I, D, D, P, I, I, I, I, I, I, I, },
+/* SY */ { P, I, D, I, D, I, P, P, P, D, I, D, I, P, I, D, D, P, D, D, D, D, D, D, D, },
+/* AL */ { P, I, D, I, D, I, P, P, P, I, I, I, I, P, I, D, D, P, I, D, D, D, D, D, D, },
+/* H2 */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, },
+/* H3 */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, },
+/* ID */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, D, },
+/* JL */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, I, I, D, I, I, D, },
+/* JV */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, I, I, },
+/* JT */ { P, I, D, I, D, I, P, P, P, I, I, D, I, P, D, I, D, P, D, D, D, D, D, D, I, },
+/* "" */
+/* before */
+};
+/* Note: The (IS,AL) entry has been changed from I to D. In other words, the
+ rule "Do not break between numeric punctuation and alphabetics" is not
+ implemented here. We want to break before the HTML tag in strings like
+ "<P>Some sentence.</P>" */
+/* Note: The (B2,B2) entry should probably be D instead of P. */
+/* Note: The (PR,ID) entry should probably be D instead of I. */
+/* Note: The (WJ,*) and (GL,*) entries should probably be P instead of I. */
diff --git a/gnulib/lib/unilbrk/lbrktables.h b/gnulib/lib/unilbrk/lbrktables.h
new file mode 100644
index 0000000..4f69de7
--- /dev/null
+++ b/gnulib/lib/unilbrk/lbrktables.h
@@ -0,0 +1,95 @@
+/* Line breaking auxiliary tables.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "unitypes.h"
+
+/* Line breaking classification. */
+
+enum
+{
+ /* Values >= 25 are resolved at run time. */
+ LBP_BK = 25, /* mandatory break */
+/*LBP_CR, carriage return - not used here because it's a DOSism */
+/*LBP_LF, line feed - not used here because it's a DOSism */
+ LBP_CM = 26, /* attached characters and combining marks */
+/*LBP_NL, next line - not used here because it's equivalent to LBP_BK */
+/*LBP_SG, surrogates - not used here because they are not characters */
+ LBP_WJ = 0, /* word joiner */
+ LBP_ZW = 27, /* zero width space */
+ LBP_GL = 1, /* non-breaking (glue) */
+ LBP_SP = 28, /* space */
+ LBP_B2 = 2, /* break opportunity before and after */
+ LBP_BA = 3, /* break opportunity after */
+ LBP_BB = 4, /* break opportunity before */
+ LBP_HY = 5, /* hyphen */
+ LBP_CB = 29, /* contingent break opportunity */
+ LBP_CL = 6, /* closing punctuation */
+ LBP_CP = 7, /* closing parenthesis */
+ LBP_EX = 8, /* exclamation/interrogation */
+ LBP_IN = 9, /* inseparable */
+ LBP_NS = 10, /* non starter */
+ LBP_OP = 11, /* opening punctuation */
+ LBP_QU = 12, /* ambiguous quotation */
+ LBP_IS = 13, /* infix separator (numeric) */
+ LBP_NU = 14, /* numeric */
+ LBP_PO = 15, /* postfix (numeric) */
+ LBP_PR = 16, /* prefix (numeric) */
+ LBP_SY = 17, /* symbols allowing breaks */
+ LBP_AI = 30, /* ambiguous (alphabetic or ideograph) */
+ LBP_AL = 18, /* ordinary alphabetic and symbol characters */
+ LBP_H2 = 19, /* Hangul LV syllable */
+ LBP_H3 = 20, /* Hangul LVT syllable */
+ LBP_ID = 21, /* ideographic */
+ LBP_JL = 22, /* Hangul L Jamo */
+ LBP_JV = 23, /* Hangul V Jamo */
+ LBP_JT = 24, /* Hangul T Jamo */
+ LBP_SA = 31, /* complex context (South East Asian) */
+ LBP_XX = 32 /* unknown */
+};
+
+#include "lbrkprop1.h"
+
+static inline unsigned char
+unilbrkprop_lookup (ucs4_t uc)
+{
+ unsigned int index1 = uc >> lbrkprop_header_0;
+ if (index1 < lbrkprop_header_1)
+ {
+ int lookup1 = unilbrkprop.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> lbrkprop_header_2) & lbrkprop_header_3;
+ int lookup2 = unilbrkprop.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & lbrkprop_header_4;
+ return unilbrkprop.level3[lookup2 + index3];
+ }
+ }
+ }
+ return LBP_XX;
+}
+
+/* Table indexed by two line breaking classifications. */
+#define D 1 /* direct break opportunity, empty in table 7.3 of UTR #14 */
+#define I 2 /* indirect break opportunity, '%' in table 7.3 of UTR #14 */
+#define P 3 /* prohibited break, '^' in table 7.3 of UTR #14 */
+
+extern const unsigned char unilbrk_table[25][25];
+
+/* We don't support line breaking of complex-context dependent characters
+ (Thai, Lao, Myanmar, Khmer) yet, because it requires dictionary lookup. */
diff --git a/gnulib/lib/unilbrk/u16-possible-linebreaks.c b/gnulib/lib/unilbrk/u16-possible-linebreaks.c
new file mode 100644
index 0000000..39fe3a3
--- /dev/null
+++ b/gnulib/lib/unilbrk/u16-possible-linebreaks.c
@@ -0,0 +1,164 @@
+/* Line breaking of UTF-16 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+#include "unistr.h"
+
+void
+u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint16_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ /* Don't break inside multibyte characters. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u16_mbtouc_unsafe (&uc, s, s_end - s);
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s += count;
+ p += count;
+ }
+}
diff --git a/gnulib/lib/unilbrk/u16-width-linebreaks.c b/gnulib/lib/unilbrk/u16-width-linebreaks.c
new file mode 100644
index 0000000..a669e87
--- /dev/null
+++ b/gnulib/lib/unilbrk/u16-width-linebreaks.c
@@ -0,0 +1,108 @@
+/* Line breaking of UTF-16 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "unistr.h"
+#include "uniwidth.h"
+
+int
+u16_width_linebreaks (const uint16_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint16_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u16_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u16_mbtouc_unsafe (&uc, s, s_end - s);
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s += count;
+ p += count;
+ if (o != NULL)
+ o += count;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
diff --git a/gnulib/lib/unilbrk/u32-possible-linebreaks.c b/gnulib/lib/unilbrk/u32-possible-linebreaks.c
new file mode 100644
index 0000000..93c5f7b
--- /dev/null
+++ b/gnulib/lib/unilbrk/u32-possible-linebreaks.c
@@ -0,0 +1,158 @@
+/* Line breaking of UTF-32 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+
+void
+u32_possible_linebreaks (const uint32_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint32_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ while (s < s_end)
+ {
+ ucs4_t uc = *s;
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s++;
+ p++;
+ }
+}
diff --git a/gnulib/lib/unilbrk/u32-width-linebreaks.c b/gnulib/lib/unilbrk/u32-width-linebreaks.c
new file mode 100644
index 0000000..61ec21d
--- /dev/null
+++ b/gnulib/lib/unilbrk/u32-width-linebreaks.c
@@ -0,0 +1,106 @@
+/* Line breaking of UTF-32 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "uniwidth.h"
+
+int
+u32_width_linebreaks (const uint32_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint32_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u32_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc = *s;
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s++;
+ p++;
+ if (o != NULL)
+ o++;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
diff --git a/gnulib/lib/unilbrk/u8-possible-linebreaks.c b/gnulib/lib/unilbrk/u8-possible-linebreaks.c
new file mode 100644
index 0000000..f094d6f
--- /dev/null
+++ b/gnulib/lib/unilbrk/u8-possible-linebreaks.c
@@ -0,0 +1,261 @@
+/* Line breaking of UTF-8 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "unilbrk/lbrktables.h"
+#include "uniwidth/cjk.h"
+#include "unistr.h"
+
+void
+u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *p)
+{
+ int LBP_AI_REPLACEMENT = (is_cjk_encoding (encoding) ? LBP_ID : LBP_AL);
+ const uint8_t *s_end = s + n;
+ int last_prop = LBP_BK; /* line break property of last non-space character */
+ char *seen_space = NULL; /* Was a space seen after the last non-space character? */
+ char *seen_space2 = NULL; /* At least two spaces after the last non-space? */
+
+ /* Don't break inside multibyte characters. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u8_mbtouc_unsafe (&uc, s, s_end - s);
+ int prop = unilbrkprop_lookup (uc);
+
+ if (prop == LBP_BK)
+ {
+ /* Mandatory break. */
+ *p = UC_BREAK_MANDATORY;
+ last_prop = LBP_BK;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else
+ {
+ char *q;
+
+ /* Resolve property values whose behaviour is not fixed. */
+ switch (prop)
+ {
+ case LBP_AI:
+ /* Resolve ambiguous. */
+ prop = LBP_AI_REPLACEMENT;
+ break;
+ case LBP_CB:
+ /* This is arbitrary. */
+ prop = LBP_ID;
+ break;
+ case LBP_SA:
+ /* We don't handle complex scripts yet.
+ Treat LBP_SA like LBP_XX. */
+ case LBP_XX:
+ /* This is arbitrary. */
+ prop = LBP_AL;
+ break;
+ }
+
+ /* Deal with spaces and combining characters. */
+ q = p;
+ if (prop == LBP_SP)
+ {
+ /* Don't break just before a space. */
+ *p = UC_BREAK_PROHIBITED;
+ seen_space2 = seen_space;
+ seen_space = p;
+ }
+ else if (prop == LBP_ZW)
+ {
+ /* Don't break just before a zero-width space. */
+ *p = UC_BREAK_PROHIBITED;
+ last_prop = LBP_ZW;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ else if (prop == LBP_CM)
+ {
+ /* Don't break just before a combining character, except immediately after a
+ zero-width space. */
+ if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *p = UC_BREAK_POSSIBLE;
+ /* A combining character turns a preceding space into LBP_ID. */
+ last_prop = LBP_ID;
+ }
+ else
+ {
+ *p = UC_BREAK_PROHIBITED;
+ /* A combining character turns a preceding space into LBP_ID. */
+ if (seen_space != NULL)
+ {
+ q = seen_space;
+ seen_space = seen_space2;
+ prop = LBP_ID;
+ goto lookup_via_table;
+ }
+ }
+ }
+ else
+ {
+ lookup_via_table:
+ /* prop must be usable as an index for table 7.3 of UTR #14. */
+ if (!(prop >= 0 && prop < sizeof (unilbrk_table) / sizeof (unilbrk_table[0])))
+ abort ();
+
+ if (last_prop == LBP_BK)
+ {
+ /* Don't break at the beginning of a line. */
+ *q = UC_BREAK_PROHIBITED;
+ }
+ else if (last_prop == LBP_ZW)
+ {
+ /* Break after zero-width space. */
+ *q = UC_BREAK_POSSIBLE;
+ }
+ else
+ {
+ switch (unilbrk_table [last_prop] [prop])
+ {
+ case D:
+ *q = UC_BREAK_POSSIBLE;
+ break;
+ case I:
+ *q = (seen_space != NULL ? UC_BREAK_POSSIBLE : UC_BREAK_PROHIBITED);
+ break;
+ case P:
+ *q = UC_BREAK_PROHIBITED;
+ break;
+ default:
+ abort ();
+ }
+ }
+ last_prop = prop;
+ seen_space = NULL;
+ seen_space2 = NULL;
+ }
+ }
+
+ s += count;
+ p += count;
+ }
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 1)
+ {
+ /* Display all the break opportunities in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_possible_linebreaks ((uint8_t *) input, length, "UTF-8", breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ /* U+2027 in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ /* U+21B2 (or U+21B5) in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x86, stdout); putc (0xb2, stdout);
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/u8-width-linebreaks.c b/gnulib/lib/unilbrk/u8-width-linebreaks.c
new file mode 100644
index 0000000..a9d7030
--- /dev/null
+++ b/gnulib/lib/unilbrk/u8-width-linebreaks.c
@@ -0,0 +1,204 @@
+/* Line breaking of UTF-8 strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include "unistr.h"
+#include "uniwidth.h"
+
+int
+u8_width_linebreaks (const uint8_t *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ const uint8_t *s_end;
+ char *last_p;
+ int last_column;
+ int piece_width;
+
+ u8_possible_linebreaks (s, n, encoding, p);
+
+ s_end = s + n;
+ last_p = NULL;
+ last_column = start_column;
+ piece_width = 0;
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = u8_mbtouc_unsafe (&uc, s, s_end - s);
+
+ /* Respect the override. */
+ if (o != NULL && *o != UC_BREAK_UNDEFINED)
+ *p = *o;
+
+ if (*p == UC_BREAK_POSSIBLE || *p == UC_BREAK_MANDATORY)
+ {
+ /* An atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+ }
+
+ if (*p == UC_BREAK_MANDATORY)
+ {
+ /* uc is a line break character. */
+ /* Start a new piece at column 0. */
+ last_p = NULL;
+ last_column = 0;
+ piece_width = 0;
+ }
+ else
+ {
+ /* uc is not a line break character. */
+ int w;
+
+ if (*p == UC_BREAK_POSSIBLE)
+ {
+ /* Start a new piece. */
+ last_p = p;
+ last_column += piece_width;
+ piece_width = 0;
+ /* No line break for the moment, may be turned into
+ UC_BREAK_POSSIBLE later, via last_p. */
+ }
+
+ *p = UC_BREAK_PROHIBITED;
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ piece_width += w;
+ }
+
+ s += count;
+ p += count;
+ if (o != NULL)
+ o += count;
+ }
+
+ /* The last atomic piece of text ends here. */
+ if (last_p != NULL && last_column + piece_width + at_end_columns > width)
+ {
+ /* Insert a line break. */
+ *last_p = UC_BREAK_POSSIBLE;
+ last_column = 0;
+ }
+
+ return last_column + piece_width;
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 2)
+ {
+ /* Insert line breaks for a given width. */
+ int width = atoi (argv[1]);
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_width_linebreaks ((uint8_t *) input, length, width, 0, 0, NULL, "UTF-8", breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('\n', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/ulc-common.c b/gnulib/lib/unilbrk/ulc-common.c
new file mode 100644
index 0000000..7279385
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-common.c
@@ -0,0 +1,51 @@
+/* Line breaking auxiliary functions.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk/ulc-common.h"
+
+#include "c-ctype.h"
+#include "c-strcaseeq.h"
+
+int
+is_utf8_encoding (const char *encoding)
+{
+ if (STRCASEEQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
+
+#if C_CTYPE_ASCII
+
+/* Tests whether a string is entirely ASCII. Returns 1 if yes.
+ Returns 0 if the string is in an 8-bit encoding or an ISO-2022 encoding. */
+int
+is_all_ascii (const char *s, size_t n)
+{
+ for (; n > 0; s++, n--)
+ {
+ unsigned char c = (unsigned char) *s;
+
+ if (!(c_isprint (c) || c_isspace (c)))
+ return 0;
+ }
+ return 1;
+}
+
+#endif /* C_CTYPE_ASCII */
diff --git a/gnulib/lib/unilbrk/ulc-common.h b/gnulib/lib/unilbrk/ulc-common.h
new file mode 100644
index 0000000..61b97fe
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-common.h
@@ -0,0 +1,31 @@
+/* Line breaking auxiliary functions.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "c-ctype.h"
+
+#define is_utf8_encoding unilbrk_is_utf8_encoding
+extern int is_utf8_encoding (const char *encoding);
+
+#if C_CTYPE_ASCII
+
+# define is_all_ascii unilbrk_is_all_ascii
+extern int is_all_ascii (const char *s, size_t n);
+
+#endif /* C_CTYPE_ASCII */
diff --git a/gnulib/lib/unilbrk/ulc-possible-linebreaks.c b/gnulib/lib/unilbrk/ulc-possible-linebreaks.c
new file mode 100644
index 0000000..1632010
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-possible-linebreaks.c
@@ -0,0 +1,212 @@
+/* Line breaking of strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Line breaking of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+void
+ulc_possible_linebreaks (const char *s, size_t n, const char *encoding,
+ char *p)
+{
+ if (n > 0)
+ {
+ if (is_utf8_encoding (encoding))
+ u8_possible_linebreaks ((const uint8_t *) s, n, encoding, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *q = (char *) (m > 0 ? malloc (m) : NULL);
+
+ if (m == 0 || q != NULL)
+ {
+ size_t i;
+
+ /* Determine the possible line breaks of the UTF-8
+ string. */
+ u8_possible_linebreaks (t, m, encoding, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (q);
+ free (t);
+ free (offsets);
+ return;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ u8_possible_linebreaks ((const uint8_t *) s, n, encoding, p);
+ return;
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce line breaks except those already present in the
+ input string. All we assume here is that the encoding is
+ minimally ASCII compatible. */
+ {
+ const char *s_end = s + n;
+ while (s < s_end)
+ {
+ *p = (*s == '\n' ? UC_BREAK_MANDATORY : UC_BREAK_PROHIBITED);
+ s++;
+ p++;
+ }
+ }
+ }
+ }
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <locale.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 1)
+ {
+ /* Display all the break opportunities in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_possible_linebreaks (input, length, locale_charset (), breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('|', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/unilbrk/ulc-width-linebreaks.c b/gnulib/lib/unilbrk/ulc-width-linebreaks.c
new file mode 100644
index 0000000..1625dfc
--- /dev/null
+++ b/gnulib/lib/unilbrk/ulc-width-linebreaks.c
@@ -0,0 +1,231 @@
+/* Line breaking of strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unilbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Line breaking of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+int
+ulc_width_linebreaks (const char *s, size_t n,
+ int width, int start_column, int at_end_columns,
+ const char *o, const char *encoding,
+ char *p)
+{
+ if (n > 0)
+ {
+ if (is_utf8_encoding (encoding))
+ return u8_width_linebreaks ((const uint8_t *) s, n, width, start_column, at_end_columns, o, encoding, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *memory =
+ (char *) (m > 0 ? malloc (m + (o != NULL ? m : 0)) : NULL);
+
+ if (m == 0 || memory != NULL)
+ {
+ char *q = (char *) memory;
+ char *o8 = (o != NULL ? (char *) (q + m) : NULL);
+ int res_column;
+ size_t i;
+
+ /* Translate the overrides to the UTF-8 string. */
+ if (o != NULL)
+ {
+ memset (o8, UC_BREAK_UNDEFINED, m);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ o8[offsets[i]] = o[i];
+ }
+
+ /* Determine the line breaks of the UTF-8 string. */
+ res_column =
+ u8_width_linebreaks (t, m, width, start_column, at_end_columns, o8, encoding, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, UC_BREAK_PROHIBITED, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (memory);
+ free (t);
+ free (offsets);
+ return res_column;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ return u8_width_linebreaks ((const uint8_t *) s, n, width, start_column, at_end_columns, o, encoding, p);
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce line breaks except those already present in the
+ input string. All we assume here is that the encoding is
+ minimally ASCII compatible. */
+ {
+ const char *s_end = s + n;
+ while (s < s_end)
+ {
+ *p = ((o != NULL && *o == UC_BREAK_MANDATORY) || *s == '\n'
+ ? UC_BREAK_MANDATORY
+ : UC_BREAK_PROHIBITED);
+ s++;
+ p++;
+ if (o != NULL)
+ o++;
+ }
+ /* We cannot compute widths in this case. */
+ }
+ }
+ }
+ return start_column;
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <locale.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 2)
+ {
+ /* Insert line breaks for a given width. */
+ int width = atoi (argv[1]);
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_width_linebreaks (input, length, width, 0, 0, NULL, locale_charset (), breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case UC_BREAK_POSSIBLE:
+ putc ('\n', stdout);
+ break;
+ case UC_BREAK_MANDATORY:
+ break;
+ case UC_BREAK_PROHIBITED:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniname.in.h b/gnulib/lib/uniname.in.h
new file mode 100644
index 0000000..4a202e8
--- /dev/null
+++ b/gnulib/lib/uniname.in.h
@@ -0,0 +1,45 @@
+/* Association between Unicode characters and their names.
+ Copyright (C) 2000-2002, 2005, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNINAME_H
+#define _UNINAME_H
+
+#include "unitypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Required size of buffer for a Unicode character name. */
+#define UNINAME_MAX 256
+
+/* Looks up the name of a Unicode character, in uppercase ASCII.
+ Returns the filled buf, or NULL if the character does not have a name. */
+extern char *
+ unicode_character_name (ucs4_t uc, char *buf);
+
+/* Looks up the Unicode character with a given name, in upper- or lowercase
+ ASCII. Returns the character if found, or UNINAME_INVALID if not found. */
+extern ucs4_t
+ unicode_name_character (const char *name);
+#define UNINAME_INVALID ((ucs4_t) 0xFFFF)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNINAME_H */
diff --git a/gnulib/lib/uniname/gen-uninames.lisp b/gnulib/lib/uniname/gen-uninames.lisp
new file mode 100755
index 0000000..d08e93f
--- /dev/null
+++ b/gnulib/lib/uniname/gen-uninames.lisp
@@ -0,0 +1,301 @@
+#!/usr/local/bin/clisp -C
+
+;;; Creation of gnulib's uninames.h from the UnicodeData.txt table.
+;;; Bruno Haible 2000-12-28
+
+(defparameter add-comments nil)
+
+(defstruct unicode-char
+ (code nil :type integer)
+ (name nil :type string)
+ word-indices
+ word-indices-index
+)
+
+(defstruct word-list
+ (hashed nil :type hash-table)
+ (sorted nil :type list)
+ size ; number of characters total
+ length ; number of words
+)
+
+(defun main (inputfile outputfile)
+ (declare (type string inputfile outputfile))
+ #+UNICODE (setq *default-file-encoding* charset:utf-8)
+ (let ((all-chars '()))
+ ;; Read all characters and names from the input file.
+ (with-open-file (istream inputfile :direction :input)
+ (loop
+ (let ((line (read-line istream nil nil)))
+ (unless line (return))
+ (let* ((i1 (position #\; line))
+ (i2 (position #\; line :start (1+ i1)))
+ (code-string (subseq line 0 i1))
+ (code (parse-integer code-string :radix 16))
+ (name-string (subseq line (1+ i1) i2)))
+ ; Ignore characters whose name starts with "<".
+ (unless (eql (char name-string 0) #\<)
+ ; Also ignore Hangul syllables; they are treated specially.
+ (unless (<= #xAC00 code #xD7A3)
+ ; Also ignore CJK compatibility ideographs; they are treated
+ ; specially as well.
+ (unless (or (<= #xF900 code #xFA2D) (<= #xFA30 code #xFA6A)
+ (<= #xFA70 code #xFAD9) (<= #x2F800 code #x2FA1D))
+ ; Transform the code so that it fits in 16 bits. In
+ ; Unicode 5.1 the following ranges are used.
+ ; 0x00000..0x04DFF >>12= 0x00..0x04 -> 0x0..0x4
+ ; 0x0A000..0x0AAFF >>12= 0x0A -> 0x5
+ ; 0x0F900..0x0FFFF >>12= 0x0F -> 0x6
+ ; 0x10000..0x10A58 >>12= 0x10 -> 0x7
+ ; 0x12000..0x12473 >>12= 0x12 -> 0x8
+ ; 0x1D000..0x1D7FF >>12= 0x1D -> 0x9
+ ; 0x1F000..0x1F093 >>12= 0x1F -> 0xA
+ ; 0x2F800..0x2FAFF >>12= 0x2F -> 0xB
+ ; 0xE0000..0xE00FF >>12= 0xE0 -> 0xC
+ (flet ((transform (x)
+ (dpb
+ (case (ash x -12)
+ ((#x00 #x01 #x02 #x03 #x04) (ash x -12))
+ (#x0A 5)
+ (#x0F 6)
+ (#x10 7)
+ (#x12 8)
+ (#x1D 9)
+ (#x1F #xA)
+ (#x2F #xB)
+ (#xE0 #xC)
+ (t (error "Update the transform function for 0x~5,'0X" x))
+ )
+ (byte 8 12)
+ x
+ )) )
+ (push (make-unicode-char :code (transform code)
+ :name name-string)
+ all-chars
+ ) ) ) ) )
+ ) ) ) )
+ (setq all-chars (nreverse all-chars))
+ ;; Split into words.
+ (let ((words-by-length (make-array 0 :adjustable t)))
+ (dolist (name (list* "HANGUL SYLLABLE" "CJK COMPATIBILITY" (mapcar #'unicode-char-name all-chars)))
+ (let ((i1 0))
+ (loop
+ (when (>= i1 (length name)) (return))
+ (let ((i2 (or (position #\Space name :start i1) (length name))))
+ (let* ((word (subseq name i1 i2))
+ (len (length word)))
+ (when (>= len (length words-by-length))
+ (adjust-array words-by-length (1+ len))
+ )
+ (unless (aref words-by-length len)
+ (setf (aref words-by-length len)
+ (make-word-list
+ :hashed (make-hash-table :test #'equal)
+ :sorted '()
+ ) ) )
+ (let ((word-list (aref words-by-length len)))
+ (unless (gethash word (word-list-hashed word-list))
+ (setf (gethash word (word-list-hashed word-list)) t)
+ (push word (word-list-sorted word-list))
+ ) )
+ )
+ (setq i1 (1+ i2))
+ ) ) ) )
+ ;; Sort the word lists.
+ (dotimes (len (length words-by-length))
+ (unless (aref words-by-length len)
+ (setf (aref words-by-length len)
+ (make-word-list
+ :hashed (make-hash-table :test #'equal)
+ :sorted '()
+ ) ) )
+ (let ((word-list (aref words-by-length len)))
+ (setf (word-list-sorted word-list)
+ (sort (word-list-sorted word-list) #'string<)
+ )
+ (setf (word-list-size word-list)
+ (reduce #'+ (mapcar #'length (word-list-sorted word-list)))
+ )
+ (setf (word-list-length word-list)
+ (length (word-list-sorted word-list))
+ ) ) )
+ ;; Output the tables.
+ (with-open-file (ostream outputfile :direction :output
+ #+UNICODE :external-format #+UNICODE charset:ascii)
+ (format ostream "/* DO NOT EDIT! GENERATED AUTOMATICALLY! */~%")
+ (format ostream "/*~%")
+ (format ostream " * ~A~%" (file-namestring outputfile))
+ (format ostream " *~%")
+ (format ostream " * Unicode character name table.~%")
+ (format ostream " * Generated automatically by the gen-uninames utility.~%")
+ (format ostream " */~%")
+ (format ostream "~%")
+ (format ostream "static const char unicode_name_words[~D] = {~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-size word-list))
+ ) )
+ sum
+ ) )
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (dolist (word (word-list-sorted word-list))
+ (format ostream " ~{ '~C',~}~%" (coerce word 'list))
+ ) ) )
+ (format ostream "};~%")
+ (format ostream "#define UNICODE_CHARNAME_NUM_WORDS ~D~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-length word-list))
+ ) )
+ sum
+ ) )
+ #| ; Redundant data
+ (format ostream "static const uint16_t unicode_name_word_offsets[~D] = {~%"
+ (let ((sum 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (incf sum (word-list-length word-list))
+ ) )
+ sum
+ ) )
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (when (word-list-sorted word-list)
+ (format ostream " ")
+ (do ((l (word-list-sorted word-list) (cdr l))
+ (offset 0 (+ offset (length (car l)))))
+ ((endp l))
+ (format ostream "~<~% ~0,79:; ~D,~>" offset)
+ )
+ (format ostream "~%")
+ ) ) )
+ (format ostream "};~%")
+ |#
+ (format ostream "static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[~D] = {~%"
+ (1+ (length words-by-length))
+ )
+ (let ((extra-offset 0)
+ (ind-offset 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (format ostream " { ~D, ~D },~%" extra-offset ind-offset)
+ (incf extra-offset (word-list-size word-list))
+ (incf ind-offset (word-list-length word-list))
+ ) )
+ (format ostream " { ~D, ~D }~%" extra-offset ind-offset)
+ )
+ (format ostream "};~%")
+ (let ((ind-offset 0))
+ (dotimes (len (length words-by-length))
+ (let ((word-list (aref words-by-length len)))
+ (dolist (word (word-list-sorted word-list))
+ (setf (gethash word (word-list-hashed word-list)) ind-offset)
+ (incf ind-offset)
+ ) ) ) )
+ (dolist (word '("HANGUL" "SYLLABLE" "CJK" "COMPATIBILITY"))
+ (format ostream "#define UNICODE_CHARNAME_WORD_~A ~D~%" word
+ (gethash word (word-list-hashed (aref words-by-length (length word))))
+ ) )
+ ;; Compute the word-indices for every unicode-char.
+ (dolist (uc all-chars)
+ (let ((name (unicode-char-name uc))
+ (indices '()))
+ (let ((i1 0))
+ (loop
+ (when (>= i1 (length name)) (return))
+ (let ((i2 (or (position #\Space name :start i1) (length name))))
+ (let* ((word (subseq name i1 i2))
+ (len (length word)))
+ (push (gethash word (word-list-hashed (aref words-by-length len)))
+ indices
+ )
+ )
+ (setq i1 (1+ i2))
+ ) ) )
+ (setf (unicode-char-word-indices uc)
+ (coerce (nreverse indices) 'vector)
+ )
+ ) )
+ ;; Sort the list of unicode-chars by word-indices.
+ (setq all-chars
+ (sort all-chars
+ (lambda (vec1 vec2)
+ (let ((len1 (length vec1))
+ (len2 (length vec2)))
+ (do ((i 0 (1+ i)))
+ (nil)
+ (if (< i len2)
+ (if (< i len1)
+ (cond ((< (aref vec1 i) (aref vec2 i)) (return t))
+ ((> (aref vec1 i) (aref vec2 i)) (return nil))
+ )
+ (return t)
+ )
+ (return nil)
+ ) ) ) )
+ :key #'unicode-char-word-indices
+ ) )
+ ;; Output the word-indices.
+ (format ostream "static const uint16_t unicode_names[~D] = {~%"
+ (reduce #'+ (mapcar (lambda (uc) (length (unicode-char-word-indices uc))) all-chars))
+ )
+ (let ((i 0))
+ (dolist (uc all-chars)
+ (format ostream " ~{ ~D,~}"
+ (maplist (lambda (r) (+ (* 2 (car r)) (if (cdr r) 1 0)))
+ (coerce (unicode-char-word-indices uc) 'list)
+ )
+ )
+ (when add-comments
+ (format ostream "~40T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ (setf (unicode-char-word-indices-index uc) i)
+ (incf i (length (unicode-char-word-indices uc)))
+ ) )
+ (format ostream "};~%")
+ (format ostream "static const struct { uint16_t code; uint32_t name:24; }~%")
+ (format ostream "#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)~%__attribute__((__packed__))~%#endif~%")
+ (format ostream "unicode_name_to_code[~D] = {~%"
+ (length all-chars)
+ )
+ (dolist (uc all-chars)
+ (format ostream " { 0x~4,'0X, ~D },"
+ (unicode-char-code uc)
+ (unicode-char-word-indices-index uc)
+ )
+ (when add-comments
+ (format ostream "~21T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ )
+ (format ostream "};~%")
+ (format ostream "static const struct { uint16_t code; uint32_t name:24; }~%")
+ (format ostream "#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)~%__attribute__((__packed__))~%#endif~%")
+ (format ostream "unicode_code_to_name[~D] = {~%"
+ (length all-chars)
+ )
+ (dolist (uc (sort (copy-list all-chars) #'< :key #'unicode-char-code))
+ (format ostream " { 0x~4,'0X, ~D },"
+ (unicode-char-code uc)
+ (unicode-char-word-indices-index uc)
+ )
+ (when add-comments
+ (format ostream "~21T/* ~A */" (unicode-char-name uc))
+ )
+ (format ostream "~%")
+ )
+ (format ostream "};~%")
+ (format ostream "#define UNICODE_CHARNAME_MAX_LENGTH ~D~%"
+ (reduce #'max (mapcar (lambda (uc) (length (unicode-char-name uc))) all-chars))
+ )
+ (format ostream "#define UNICODE_CHARNAME_MAX_WORDS ~D~%"
+ (reduce #'max (mapcar (lambda (uc) (length (unicode-char-word-indices uc))) all-chars))
+ )
+ )
+) ) )
+
+(main (first *args*) (second *args*))
diff --git a/gnulib/lib/uniname/uniname.c b/gnulib/lib/uniname/uniname.c
new file mode 100644
index 0000000..6998b81
--- /dev/null
+++ b/gnulib/lib/uniname/uniname.c
@@ -0,0 +1,516 @@
+/* Association between Unicode characters and their names.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniname.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+/* Table of Unicode character names, derived from UnicodeData.txt.
+ This table is generated in a way to minimize the memory footprint:
+ 1. its compiled size is small (less than 350 KB),
+ 2. it resides entirely in the text or read-only data segment of the
+ executable or shared library: the table contains only immediate
+ integers, no pointers, and the functions don't do heap allocation.
+ */
+#include "uninames.h"
+/* It contains:
+ static const char unicode_name_words[36303] = ...;
+ #define UNICODE_CHARNAME_NUM_WORDS 6260
+ static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[26] = ...;
+ #define UNICODE_CHARNAME_WORD_HANGUL 3902
+ #define UNICODE_CHARNAME_WORD_SYLLABLE 4978
+ #define UNICODE_CHARNAME_WORD_CJK 417
+ #define UNICODE_CHARNAME_WORD_COMPATIBILITY 6107
+ static const uint16_t unicode_names[68940] = ...;
+ static const struct { uint16_t code; uint32_t name:24; } unicode_name_to_code[16626] = ...;
+ static const struct { uint16_t code; uint32_t name:24; } unicode_code_to_name[16626] = ...;
+ #define UNICODE_CHARNAME_MAX_LENGTH 83
+ #define UNICODE_CHARNAME_MAX_WORDS 13
+*/
+
+/* Returns the word with a given index. */
+static const char *
+unicode_name_word (unsigned int index, unsigned int *lengthp)
+{
+ unsigned int i1;
+ unsigned int i2;
+ unsigned int i;
+
+ assert (index < UNICODE_CHARNAME_NUM_WORDS);
+
+ /* Binary search for i with
+ unicode_name_by_length[i].ind_offset <= index
+ and
+ index < unicode_name_by_length[i+1].ind_offset
+ */
+
+ i1 = 0;
+ i2 = SIZEOF (unicode_name_by_length) - 1;
+ while (i2 - i1 > 1)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ if (unicode_name_by_length[i].ind_offset <= index)
+ i1 = i;
+ else
+ i2 = i;
+ }
+ i = i1;
+ assert (unicode_name_by_length[i].ind_offset <= index
+ && index < unicode_name_by_length[i+1].ind_offset);
+ *lengthp = i;
+ return &unicode_name_words[unicode_name_by_length[i].extra_offset
+ + (index-unicode_name_by_length[i].ind_offset)*i];
+}
+
+/* Looks up the index of a word. */
+static int
+unicode_name_word_lookup (const char *word, unsigned int length)
+{
+ if (length > 0 && length < SIZEOF (unicode_name_by_length) - 1)
+ {
+ /* Binary search among the words of given length. */
+ unsigned int extra_offset = unicode_name_by_length[length].extra_offset;
+ unsigned int i0 = unicode_name_by_length[length].ind_offset;
+ unsigned int i1 = i0;
+ unsigned int i2 = unicode_name_by_length[length+1].ind_offset;
+ while (i2 - i1 > 0)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ const char *p = &unicode_name_words[extra_offset + (i-i0)*length];
+ const char *w = word;
+ unsigned int n = length;
+ for (;;)
+ {
+ if (*p < *w)
+ {
+ if (i1 == i)
+ return -1;
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ break;
+ }
+ if (*p > *w)
+ {
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ break;
+ }
+ p++; w++; n--;
+ if (n == 0)
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+/* Auxiliary tables for Hangul syllable names, see the Unicode 3.0 book,
+ sections 3.11 and 4.4. */
+static const char jamo_initial_short_name[19][3] =
+{
+ "G", "GG", "N", "D", "DD", "R", "M", "B", "BB", "S", "SS", "", "J", "JJ",
+ "C", "K", "T", "P", "H"
+};
+static const char jamo_medial_short_name[21][4] =
+{
+ "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE", "O", "WA", "WAE", "OE", "YO",
+ "U", "WEO", "WE", "WI", "YU", "EU", "YI", "I"
+};
+static const char jamo_final_short_name[28][3] =
+{
+ "", "G", "GG", "GS", "N", "NI", "NH", "D", "L", "LG", "LM", "LB", "LS", "LT",
+ "LP", "LH", "M", "B", "BS", "S", "SS", "NG", "J", "C", "K", "T", "P", "H"
+};
+
+/* Looks up the name of a Unicode character, in uppercase ASCII.
+ Returns the filled buf, or NULL if the character does not have a name. */
+char *
+unicode_character_name (ucs4_t c, char *buf)
+{
+ if (c >= 0xAC00 && c <= 0xD7A3)
+ {
+ /* Special case for Hangul syllables. Keeps the tables small. */
+ char *ptr;
+ unsigned int tmp;
+ unsigned int index1;
+ unsigned int index2;
+ unsigned int index3;
+ const char *q;
+
+ /* buf needs to have at least 16 + 7 bytes here. */
+ memcpy (buf, "HANGUL SYLLABLE ", 16);
+ ptr = buf + 16;
+
+ tmp = c - 0xAC00;
+ index3 = tmp % 28; tmp = tmp / 28;
+ index2 = tmp % 21; tmp = tmp / 21;
+ index1 = tmp;
+
+ q = jamo_initial_short_name[index1];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ q = jamo_medial_short_name[index2];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ q = jamo_final_short_name[index3];
+ while (*q != '\0')
+ *ptr++ = *q++;
+ *ptr = '\0';
+ return buf;
+ }
+ else if ((c >= 0xF900 && c <= 0xFA2D) || (c >= 0xFA30 && c <= 0xFA6A)
+ || (c >= 0xFA70 && c <= 0xFAD9) || (c >= 0x2F800 && c <= 0x2FA1D))
+ {
+ /* Special case for CJK compatibility ideographs. Keeps the tables
+ small. */
+ char *ptr;
+ int i;
+
+ /* buf needs to have at least 28 + 5 bytes here. */
+ memcpy (buf, "CJK COMPATIBILITY IDEOGRAPH-", 28);
+ ptr = buf + 28;
+
+ for (i = (c < 0x10000 ? 12 : 16); i >= 0; i -= 4)
+ {
+ unsigned int x = (c >> i) & 0xf;
+ *ptr++ = (x < 10 ? '0' : 'A' - 10) + x;
+ }
+ *ptr = '\0';
+ return buf;
+ }
+ else
+ {
+ const uint16_t *words;
+
+ /* Transform the code so that it fits in 16 bits. */
+ switch (c >> 12)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03: case 0x04:
+ break;
+ case 0x0A:
+ c -= 0x05000;
+ break;
+ case 0x0F:
+ c -= 0x09000;
+ break;
+ case 0x10:
+ c -= 0x09000;
+ break;
+ case 0x12:
+ c -= 0x0A000;
+ break;
+ case 0x1D:
+ c -= 0x14000;
+ break;
+ case 0x1F:
+ c -= 0x15000;
+ break;
+ case 0x2F:
+ c -= 0x24000;
+ break;
+ case 0xE0:
+ c -= 0xD4000;
+ break;
+ default:
+ return NULL;
+ }
+
+ {
+ /* Binary search in unicode_code_to_name. */
+ unsigned int i1 = 0;
+ unsigned int i2 = SIZEOF (unicode_code_to_name);
+ for (;;)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ if (unicode_code_to_name[i].code == c)
+ {
+ words = &unicode_names[unicode_code_to_name[i].name];
+ break;
+ }
+ else if (unicode_code_to_name[i].code < c)
+ {
+ if (i1 == i)
+ {
+ words = NULL;
+ break;
+ }
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ }
+ else if (unicode_code_to_name[i].code > c)
+ {
+ if (i2 == i)
+ {
+ words = NULL;
+ break;
+ }
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ }
+ }
+ }
+ if (words != NULL)
+ {
+ /* Found it in unicode_code_to_name. Now concatenate the words. */
+ /* buf needs to have at least UNICODE_CHARNAME_MAX_LENGTH bytes. */
+ char *ptr = buf;
+ for (;;)
+ {
+ unsigned int wordlen;
+ const char *word = unicode_name_word (*words>>1, &wordlen);
+ do
+ *ptr++ = *word++;
+ while (--wordlen > 0);
+ if ((*words & 1) == 0)
+ break;
+ *ptr++ = ' ';
+ words++;
+ }
+ *ptr = '\0';
+ return buf;
+ }
+ return NULL;
+ }
+}
+
+/* Looks up the Unicode character with a given name, in upper- or lowercase
+ ASCII. Returns the character if found, or UNINAME_INVALID if not found. */
+ucs4_t
+unicode_name_character (const char *name)
+{
+ unsigned int len = strlen (name);
+ if (len > 1 && len <= UNICODE_CHARNAME_MAX_LENGTH)
+ {
+ /* Test for "word1 word2 ..." syntax. */
+ char buf[UNICODE_CHARNAME_MAX_LENGTH];
+ char *ptr = buf;
+ for (;;)
+ {
+ char c = *name++;
+ if (!(c >= ' ' && c <= '~'))
+ break;
+ *ptr++ = (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
+ if (--len == 0)
+ goto filled_buf;
+ }
+ if (false)
+ filled_buf:
+ {
+ /* Convert the constituents to uint16_t words. */
+ uint16_t words[UNICODE_CHARNAME_MAX_WORDS];
+ uint16_t *wordptr = words;
+ {
+ const char *p1 = buf;
+ for (;;)
+ {
+ {
+ int word;
+ const char *p2 = p1;
+ while (p2 < ptr && *p2 != ' ')
+ p2++;
+ word = unicode_name_word_lookup (p1, p2 - p1);
+ if (word < 0)
+ break;
+ if (wordptr == &words[UNICODE_CHARNAME_MAX_WORDS])
+ break;
+ *wordptr++ = word;
+ if (p2 == ptr)
+ goto filled_words;
+ p1 = p2 + 1;
+ }
+ /* Special case for Hangul syllables. Keeps the tables small. */
+ if (wordptr == &words[2]
+ && words[0] == UNICODE_CHARNAME_WORD_HANGUL
+ && words[1] == UNICODE_CHARNAME_WORD_SYLLABLE)
+ {
+ /* Split the last word [p1..ptr) into three parts:
+ 1) [BCDGHJKMNPRST]
+ 2) [AEIOUWY]
+ 3) [BCDGHIJKLMNPST]
+ */
+ const char *p2;
+ const char *p3;
+ const char *p4;
+
+ p2 = p1;
+ while (p2 < ptr
+ && (*p2 == 'B' || *p2 == 'C' || *p2 == 'D'
+ || *p2 == 'G' || *p2 == 'H' || *p2 == 'J'
+ || *p2 == 'K' || *p2 == 'M' || *p2 == 'N'
+ || *p2 == 'P' || *p2 == 'R' || *p2 == 'S'
+ || *p2 == 'T'))
+ p2++;
+ p3 = p2;
+ while (p3 < ptr
+ && (*p3 == 'A' || *p3 == 'E' || *p3 == 'I'
+ || *p3 == 'O' || *p3 == 'U' || *p3 == 'W'
+ || *p3 == 'Y'))
+ p3++;
+ p4 = p3;
+ while (p4 < ptr
+ && (*p4 == 'B' || *p4 == 'C' || *p4 == 'D'
+ || *p4 == 'G' || *p4 == 'H' || *p4 == 'I'
+ || *p4 == 'J' || *p4 == 'K' || *p4 == 'L'
+ || *p4 == 'M' || *p4 == 'N' || *p4 == 'P'
+ || *p4 == 'S' || *p4 == 'T'))
+ p4++;
+ if (p4 == ptr)
+ {
+ unsigned int n1 = p2 - p1;
+ unsigned int n2 = p3 - p2;
+ unsigned int n3 = p4 - p3;
+
+ if (n1 <= 2 && (n2 >= 1 && n2 <= 3) && n3 <= 2)
+ {
+ unsigned int index1;
+
+ for (index1 = 0; index1 < 19; index1++)
+ if (memcmp (jamo_initial_short_name[index1], p1, n1) == 0
+ && jamo_initial_short_name[index1][n1] == '\0')
+ {
+ unsigned int index2;
+
+ for (index2 = 0; index2 < 21; index2++)
+ if (memcmp (jamo_medial_short_name[index2], p2, n2) == 0
+ && jamo_medial_short_name[index2][n2] == '\0')
+ {
+ unsigned int index3;
+
+ for (index3 = 0; index3 < 28; index3++)
+ if (memcmp (jamo_final_short_name[index3], p3, n3) == 0
+ && jamo_final_short_name[index3][n3] == '\0')
+ {
+ return 0xAC00 + (index1 * 21 + index2) * 28 + index3;
+ }
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+ /* Special case for CJK compatibility ideographs. Keeps the
+ tables small. */
+ if (wordptr == &words[2]
+ && words[0] == UNICODE_CHARNAME_WORD_CJK
+ && words[1] == UNICODE_CHARNAME_WORD_COMPATIBILITY
+ && p1 + 14 <= ptr
+ && p1 + 15 >= ptr
+ && memcmp (p1, "IDEOGRAPH-", 10) == 0)
+ {
+ const char *p2 = p1 + 10;
+
+ if (*p2 != '0')
+ {
+ unsigned int c = 0;
+
+ for (;;)
+ {
+ if (*p2 >= '0' && *p2 <= '9')
+ c += (*p2 - '0');
+ else if (*p2 >= 'A' && *p2 <= 'F')
+ c += (*p2 - 'A' + 10);
+ else
+ break;
+ p2++;
+ if (p2 == ptr)
+ {
+ if ((c >= 0xF900 && c <= 0xFA2D)
+ || (c >= 0xFA30 && c <= 0xFA6A)
+ || (c >= 0xFA70 && c <= 0xFAD9)
+ || (c >= 0x2F800 && c <= 0x2FA1D))
+ return c;
+ else
+ break;
+ }
+ c = c << 4;
+ }
+ }
+ }
+ }
+ }
+ if (false)
+ filled_words:
+ {
+ /* Multiply by 2, to simplify later comparisons. */
+ unsigned int words_length = wordptr - words;
+ {
+ int i = words_length - 1;
+ words[i] = 2 * words[i];
+ for (; --i >= 0; )
+ words[i] = 2 * words[i] + 1;
+ }
+ /* Binary search in unicode_name_to_code. */
+ {
+ unsigned int i1 = 0;
+ unsigned int i2 = SIZEOF (unicode_name_to_code);
+ for (;;)
+ {
+ unsigned int i = (i1 + i2) >> 1;
+ const uint16_t *w = words;
+ const uint16_t *p = &unicode_names[unicode_name_to_code[i].name];
+ unsigned int n = words_length;
+ for (;;)
+ {
+ if (*p < *w)
+ {
+ if (i1 == i)
+ goto name_not_found;
+ /* Note here: i1 < i < i2. */
+ i1 = i;
+ break;
+ }
+ else if (*p > *w)
+ {
+ if (i2 == i)
+ goto name_not_found;
+ /* Note here: i1 <= i < i2. */
+ i2 = i;
+ break;
+ }
+ p++; w++; n--;
+ if (n == 0)
+ {
+ unsigned int c = unicode_name_to_code[i].code;
+
+ /* Undo the transformation to 16-bit space. */
+ static const unsigned int offset[13] =
+ {
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x05000, 0x09000, 0x09000, 0x0A000, 0x14000,
+ 0x15000, 0x24000, 0xD4000
+ };
+ return c + offset[c >> 12];
+ }
+ }
+ }
+ }
+ name_not_found: ;
+ }
+ }
+ }
+ return UNINAME_INVALID;
+}
diff --git a/gnulib/lib/uniname/uninames.h b/gnulib/lib/uniname/uninames.h
new file mode 100644
index 0000000..7b6db1f
--- /dev/null
+++ b/gnulib/lib/uniname/uninames.h
@@ -0,0 +1,61495 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/*
+ * uninames.h
+ *
+ * Unicode character name table.
+ * Generated automatically by the gen-uninames utility.
+ */
+
+static const char unicode_name_words[39544] = {
+ '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',
+ '-', 'A',
+ 'A', '2',
+ 'A', '3',
+ 'A', 'A',
+ 'A', 'B',
+ 'A', 'C',
+ 'A', 'D',
+ 'A', 'E',
+ 'A', 'G',
+ 'A', 'H',
+ 'A', 'I',
+ 'A', 'K',
+ 'A', 'L',
+ 'A', 'M',
+ 'A', 'N',
+ 'A', 'O',
+ 'A', 'P',
+ 'A', 'Q',
+ 'A', 'S',
+ 'A', 'T',
+ 'A', 'U',
+ 'A', 'V',
+ 'A', 'X',
+ 'A', 'Y',
+ 'B', 'A',
+ 'B', 'E',
+ 'B', 'H',
+ 'B', 'I',
+ 'B', 'O',
+ 'B', 'Q',
+ 'B', 'U',
+ 'B', 'Y',
+ 'C', 'A',
+ 'C', 'C',
+ 'C', 'D',
+ 'C', 'E',
+ 'C', 'H',
+ 'C', 'I',
+ 'C', 'M',
+ 'C', 'O',
+ 'C', 'U',
+ 'C', 'Y',
+ 'D', '2',
+ 'D', 'A',
+ 'D', 'B',
+ 'D', 'E',
+ 'D', 'I',
+ 'D', 'L',
+ 'D', 'M',
+ 'D', 'O',
+ 'D', 'U',
+ 'D', 'V',
+ 'D', 'Z',
+ 'E', '2',
+ 'E', 'A',
+ 'E', 'E',
+ 'E', 'F',
+ 'E', 'H',
+ 'E', 'I',
+ 'E', 'K',
+ 'E', 'L',
+ 'E', 'M',
+ 'E', 'N',
+ 'E', 'O',
+ 'E', 'P',
+ 'E', 'R',
+ 'E', 'S',
+ 'E', 'T',
+ 'E', 'U',
+ 'E', 'V',
+ 'E', 'W',
+ 'E', 'X',
+ 'F', 'A',
+ 'F', 'E',
+ 'F', 'F',
+ 'F', 'I',
+ 'F', 'L',
+ 'F', 'M',
+ 'F', 'O',
+ 'F', 'U',
+ 'F', 'Y',
+ 'G', '2',
+ 'G', 'A',
+ 'G', 'B',
+ 'G', 'E',
+ 'G', 'G',
+ 'G', 'I',
+ 'G', 'N',
+ 'G', 'O',
+ 'G', 'U',
+ 'G', 'V',
+ 'G', 'Y',
+ 'H', 'A',
+ 'H', 'E',
+ 'H', 'G',
+ 'H', 'I',
+ 'H', 'K',
+ 'H', 'O',
+ 'H', 'P',
+ 'H', 'U',
+ 'H', 'V',
+ 'H', 'Z',
+ 'I', 'B',
+ 'I', 'E',
+ 'I', 'F',
+ 'I', 'G',
+ 'I', 'H',
+ 'I', 'I',
+ 'I', 'J',
+ 'I', 'L',
+ 'I', 'M',
+ 'I', 'N',
+ 'I', 'O',
+ 'I', 'P',
+ 'I', 'R',
+ 'I', 'S',
+ 'I', 'T',
+ 'I', 'U',
+ 'I', 'X',
+ 'I', 'Y',
+ 'J', 'A',
+ 'J', 'E',
+ 'J', 'I',
+ 'J', 'O',
+ 'J', 'U',
+ 'J', 'Y',
+ 'K', '2',
+ 'K', 'A',
+ 'K', 'B',
+ 'K', 'E',
+ 'K', 'G',
+ 'K', 'I',
+ 'K', 'K',
+ 'K', 'L',
+ 'K', 'M',
+ 'K', 'O',
+ 'K', 'T',
+ 'K', 'U',
+ 'K', 'V',
+ 'K', 'W',
+ 'L', 'A',
+ 'L', 'D',
+ 'L', 'E',
+ 'L', 'H',
+ 'L', 'I',
+ 'L', 'J',
+ 'L', 'L',
+ 'L', 'M',
+ 'L', 'N',
+ 'L', 'O',
+ 'L', 'S',
+ 'L', 'U',
+ 'L', 'V',
+ 'L', 'X',
+ 'L', 'Y',
+ 'L', 'Z',
+ 'M', 'A',
+ 'M', 'B',
+ 'M', 'E',
+ 'M', 'G',
+ 'M', 'H',
+ 'M', 'I',
+ 'M', 'L',
+ 'M', 'M',
+ 'M', 'O',
+ 'M', 'S',
+ 'M', 'U',
+ 'M', 'V',
+ 'M', 'W',
+ 'M', 'Y',
+ 'N', 'A',
+ 'N', 'D',
+ 'N', 'E',
+ 'N', 'F',
+ 'N', 'G',
+ 'N', 'H',
+ 'N', 'I',
+ 'N', 'J',
+ 'N', 'M',
+ 'N', 'N',
+ 'N', 'O',
+ 'N', 'S',
+ 'N', 'U',
+ 'N', 'V',
+ 'N', 'W',
+ 'O', 'A',
+ 'O', 'B',
+ 'O', 'E',
+ 'O', 'F',
+ 'O', 'H',
+ 'O', 'I',
+ 'O', 'L',
+ 'O', 'M',
+ 'O', 'N',
+ 'O', 'O',
+ 'O', 'P',
+ 'O', 'R',
+ 'O', 'S',
+ 'O', 'T',
+ 'O', 'U',
+ 'O', 'V',
+ 'O', 'W',
+ 'O', 'X',
+ 'O', 'Y',
+ 'P', '2',
+ 'P', 'A',
+ 'P', 'C',
+ 'P', 'D',
+ 'P', 'E',
+ 'P', 'F',
+ 'P', 'G',
+ 'P', 'H',
+ 'P', 'I',
+ 'P', 'M',
+ 'P', 'O',
+ 'P', 'R',
+ 'P', 'S',
+ 'P', 'U',
+ 'P', 'V',
+ 'P', 'W',
+ 'P', 'Y',
+ 'P', 'Z',
+ 'Q', 'A',
+ 'Q', 'E',
+ 'Q', 'I',
+ 'Q', 'O',
+ 'Q', 'P',
+ 'Q', 'U',
+ 'Q', 'Y',
+ 'R', 'A',
+ 'R', 'E',
+ 'R', 'I',
+ 'R', 'O',
+ 'R', 'R',
+ 'R', 'U',
+ 'R', 'Y',
+ 'S', 'A',
+ 'S', 'E',
+ 'S', 'G',
+ 'S', 'H',
+ 'S', 'I',
+ 'S', 'K',
+ 'S', 'O',
+ 'S', 'P',
+ 'S', 'R',
+ 'S', 'S',
+ 'S', 'T',
+ 'S', 'U',
+ 'S', 'V',
+ 'S', 'W',
+ 'S', 'Y',
+ 'S', 'Z',
+ 'T', 'A',
+ 'T', 'C',
+ 'T', 'E',
+ 'T', 'H',
+ 'T', 'I',
+ 'T', 'N',
+ 'T', 'O',
+ 'T', 'R',
+ 'T', 'S',
+ 'T', 'T',
+ 'T', 'U',
+ 'T', 'Z',
+ 'U', '2',
+ 'U', 'A',
+ 'U', 'B',
+ 'U', 'C',
+ 'U', 'D',
+ 'U', 'E',
+ 'U', 'K',
+ 'U', 'M',
+ 'U', 'N',
+ 'U', 'O',
+ 'U', 'P',
+ 'U', 'R',
+ 'U', 'S',
+ 'U', 'U',
+ 'U', 'Y',
+ 'V', 'A',
+ 'V', 'E',
+ 'V', 'I',
+ 'V', 'O',
+ 'V', 'U',
+ 'V', 'Y',
+ 'W', 'A',
+ 'W', 'B',
+ 'W', 'E',
+ 'W', 'G',
+ 'W', 'I',
+ 'W', 'O',
+ 'W', 'U',
+ 'W', 'V',
+ 'X', 'A',
+ 'X', 'E',
+ 'X', 'G',
+ 'X', 'I',
+ 'X', 'O',
+ 'X', 'U',
+ 'X', 'Y',
+ 'Y', 'A',
+ 'Y', 'E',
+ 'Y', 'I',
+ 'Y', 'N',
+ 'Y', 'O',
+ 'Y', 'R',
+ 'Y', 'U',
+ 'Y', 'V',
+ 'Y', 'Y',
+ 'Z', 'A',
+ 'Z', 'E',
+ 'Z', 'H',
+ 'Z', 'I',
+ 'Z', 'O',
+ 'Z', 'U',
+ 'Z', 'Y',
+ '-', 'U', 'M',
+ 'A', '-', 'O',
+ 'A', '-', 'U',
+ 'A', 'A', 'I',
+ 'A', 'A', 'J',
+ 'A', 'A', 'K',
+ 'A', 'A', 'M',
+ 'A', 'A', 'W',
+ 'A', 'A', 'Y',
+ 'A', 'B', '2',
+ 'A', 'D', 'I',
+ 'A', 'D', 'O',
+ 'A', 'G', 'E',
+ 'A', 'I', 'N',
+ 'A', 'I', 'R',
+ 'A', 'L', 'F',
+ 'A', 'L', 'I',
+ 'A', 'L', 'L',
+ 'A', 'N', 'D',
+ 'A', 'N', 'G',
+ 'A', 'N', 'N',
+ 'A', 'N', 'O',
+ 'A', 'P', 'L',
+ 'A', 'R', 'C',
+ 'A', 'R', 'E',
+ 'A', 'R', 'M',
+ 'A', 'S', 'H',
+ 'A', 'U', 'E',
+ 'A', 'W', 'E',
+ 'A', 'X', 'E',
+ 'A', 'Y', 'B',
+ 'A', 'Z', 'U',
+ 'B', 'A', 'A',
+ 'B', 'A', 'D',
+ 'B', 'A', 'G',
+ 'B', 'A', 'L',
+ 'B', 'A', 'N',
+ 'B', 'A', 'P',
+ 'B', 'A', 'R',
+ 'B', 'A', 'T',
+ 'B', 'A', 'X',
+ 'B', 'B', 'A',
+ 'B', 'B', 'E',
+ 'B', 'B', 'I',
+ 'B', 'B', 'O',
+ 'B', 'B', 'U',
+ 'B', 'B', 'Y',
+ 'B', 'E', 'E',
+ 'B', 'E', 'H',
+ 'B', 'E', 'I',
+ 'B', 'E', 'N',
+ 'B', 'E', 'P',
+ 'B', 'E', 'T',
+ 'B', 'E', 'X',
+ 'B', 'H', 'A',
+ 'B', 'H', 'E',
+ 'B', 'H', 'I',
+ 'B', 'H', 'O',
+ 'B', 'H', 'U',
+ 'B', 'I', 'B',
+ 'B', 'I', 'E',
+ 'B', 'I', 'G',
+ 'B', 'I', 'P',
+ 'B', 'I', 'T',
+ 'B', 'I', 'X',
+ 'B', 'L', 'A',
+ 'B', 'O', 'A',
+ 'B', 'O', 'O',
+ 'B', 'O', 'P',
+ 'B', 'O', 'T',
+ 'B', 'O', 'W',
+ 'B', 'O', 'X',
+ 'B', 'U', 'O',
+ 'B', 'U', 'P',
+ 'B', 'U', 'R',
+ 'B', 'U', 'T',
+ 'B', 'U', 'X',
+ 'B', 'W', 'A',
+ 'B', 'W', 'E',
+ 'B', 'W', 'I',
+ 'B', 'X', 'G',
+ 'B', 'Y', 'P',
+ 'B', 'Y', 'R',
+ 'B', 'Y', 'T',
+ 'B', 'Y', 'X',
+ 'C', 'A', 'A',
+ 'C', 'A', 'L',
+ 'C', 'A', 'N',
+ 'C', 'A', 'P',
+ 'C', 'A', 'T',
+ 'C', 'A', 'X',
+ 'C', 'C', 'A',
+ 'C', 'C', 'E',
+ 'C', 'C', 'I',
+ 'C', 'C', 'O',
+ 'C', 'C', 'U',
+ 'C', 'E', 'E',
+ 'C', 'E', 'N',
+ 'C', 'E', 'P',
+ 'C', 'E', 'X',
+ 'C', 'H', 'A',
+ 'C', 'H', 'E',
+ 'C', 'H', 'I',
+ 'C', 'H', 'O',
+ 'C', 'H', 'U',
+ 'C', 'H', 'Y',
+ 'C', 'I', 'E',
+ 'C', 'I', 'I',
+ 'C', 'I', 'L',
+ 'C', 'I', 'P',
+ 'C', 'I', 'T',
+ 'C', 'I', 'X',
+ 'C', 'J', 'K',
+ 'C', 'O', 'A',
+ 'C', 'O', 'N',
+ 'C', 'O', 'O',
+ 'C', 'O', 'P',
+ 'C', 'O', 'T',
+ 'C', 'O', 'W',
+ 'C', 'O', 'X',
+ 'C', 'U', 'M',
+ 'C', 'U', 'O',
+ 'C', 'U', 'P',
+ 'C', 'U', 'R',
+ 'C', 'U', 'T',
+ 'C', 'U', 'X',
+ 'C', 'W', 'A',
+ 'C', 'W', 'E',
+ 'C', 'W', 'I',
+ 'C', 'W', 'O',
+ 'C', 'Y', 'A',
+ 'C', 'Y', 'P',
+ 'C', 'Y', 'R',
+ 'C', 'Y', 'T',
+ 'C', 'Y', 'X',
+ 'D', 'A', 'A',
+ 'D', 'A', 'D',
+ 'D', 'A', 'G',
+ 'D', 'A', 'L',
+ 'D', 'A', 'M',
+ 'D', 'A', 'P',
+ 'D', 'A', 'R',
+ 'D', 'A', 'T',
+ 'D', 'A', 'X',
+ 'D', 'A', 'Y',
+ 'D', 'D', 'A',
+ 'D', 'D', 'E',
+ 'D', 'D', 'I',
+ 'D', 'D', 'O',
+ 'D', 'D', 'U',
+ 'D', 'E', 'E',
+ 'D', 'E', 'I',
+ 'D', 'E', 'K',
+ 'D', 'E', 'L',
+ 'D', 'E', 'P',
+ 'D', 'E', 'X',
+ 'D', 'H', 'A',
+ 'D', 'H', 'E',
+ 'D', 'H', 'I',
+ 'D', 'H', 'O',
+ 'D', 'H', 'U',
+ 'D', 'I', 'B',
+ 'D', 'I', 'E',
+ 'D', 'I', 'M',
+ 'D', 'I', 'N',
+ 'D', 'I', 'P',
+ 'D', 'I', 'T',
+ 'D', 'I', 'X',
+ 'D', 'J', 'A',
+ 'D', 'J', 'E',
+ 'D', 'L', 'A',
+ 'D', 'L', 'E',
+ 'D', 'L', 'I',
+ 'D', 'L', 'O',
+ 'D', 'L', 'U',
+ 'D', 'O', 'A',
+ 'D', 'O', 'G',
+ 'D', 'O', 'N',
+ 'D', 'O', 'O',
+ 'D', 'O', 'P',
+ 'D', 'O', 'T',
+ 'D', 'O', 'X',
+ 'D', 'R', 'Y',
+ 'D', 'U', 'B',
+ 'D', 'U', 'G',
+ 'D', 'U', 'H',
+ 'D', 'U', 'L',
+ 'D', 'U', 'M',
+ 'D', 'U', 'N',
+ 'D', 'U', 'O',
+ 'D', 'U', 'P',
+ 'D', 'U', 'R',
+ 'D', 'U', 'T',
+ 'D', 'U', 'X',
+ 'D', 'W', 'A',
+ 'D', 'W', 'E',
+ 'D', 'W', 'O',
+ 'D', 'Y', 'O',
+ 'D', 'Z', 'A',
+ 'D', 'Z', 'E',
+ 'D', 'Z', 'I',
+ 'D', 'Z', 'O',
+ 'D', 'Z', 'U',
+ 'E', 'A', 'R',
+ 'E', 'A', 'T',
+ 'E', 'C', 'H',
+ 'E', 'D', 'D',
+ 'E', 'E', 'N',
+ 'E', 'G', 'G',
+ 'E', 'I', 'E',
+ 'E', 'I', 'S',
+ 'E', 'K', 'S',
+ 'E', 'N', 'D',
+ 'E', 'N', 'G',
+ 'E', 'N', 'N',
+ 'E', 'O', 'H',
+ 'E', 'R', 'A',
+ 'E', 'R', 'G',
+ 'E', 'R', 'R',
+ 'E', 'R', 'S',
+ 'E', 'S', 'H',
+ 'E', 'S', 'O',
+ 'E', 'T', 'A',
+ 'E', 'T', 'H',
+ 'E', 'W', 'E',
+ 'E', 'X', 'O',
+ 'E', 'Y', 'E',
+ 'E', 'Z', 'H',
+ 'F', 'A', 'A',
+ 'F', 'A', 'N',
+ 'F', 'A', 'P',
+ 'F', 'A', 'T',
+ 'F', 'A', 'X',
+ 'F', 'E', 'E',
+ 'F', 'E', 'H',
+ 'F', 'E', 'I',
+ 'F', 'F', 'I',
+ 'F', 'F', 'L',
+ 'F', 'I', 'I',
+ 'F', 'I', 'P',
+ 'F', 'I', 'T',
+ 'F', 'I', 'X',
+ 'F', 'L', 'A',
+ 'F', 'L', 'Y',
+ 'F', 'O', 'O',
+ 'F', 'O', 'P',
+ 'F', 'O', 'R',
+ 'F', 'O', 'X',
+ 'F', 'U', 'P',
+ 'F', 'U', 'R',
+ 'F', 'U', 'T',
+ 'F', 'U', 'X',
+ 'F', 'W', 'A',
+ 'F', 'W', 'E',
+ 'F', 'W', 'I',
+ 'F', 'Y', 'A',
+ 'F', 'Y', 'P',
+ 'F', 'Y', 'T',
+ 'F', 'Y', 'X',
+ 'G', 'A', '2',
+ 'G', 'A', 'A',
+ 'G', 'A', 'D',
+ 'G', 'A', 'F',
+ 'G', 'A', 'G',
+ 'G', 'A', 'L',
+ 'G', 'A', 'M',
+ 'G', 'A', 'N',
+ 'G', 'A', 'P',
+ 'G', 'A', 'R',
+ 'G', 'A', 'T',
+ 'G', 'A', 'X',
+ 'G', 'A', 'Y',
+ 'G', 'B', 'A',
+ 'G', 'B', 'E',
+ 'G', 'B', 'I',
+ 'G', 'B', 'O',
+ 'G', 'B', 'U',
+ 'G', 'E', 'E',
+ 'G', 'E', 'N',
+ 'G', 'E', 'P',
+ 'G', 'E', 'R',
+ 'G', 'E', 'T',
+ 'G', 'E', 'X',
+ 'G', 'G', 'A',
+ 'G', 'G', 'E',
+ 'G', 'G', 'I',
+ 'G', 'G', 'O',
+ 'G', 'G', 'U',
+ 'G', 'H', 'A',
+ 'G', 'H', 'E',
+ 'G', 'H', 'I',
+ 'G', 'H', 'O',
+ 'G', 'H', 'U',
+ 'G', 'H', 'Z',
+ 'G', 'I', '4',
+ 'G', 'I', 'E',
+ 'G', 'I', 'M',
+ 'G', 'I', 'P',
+ 'G', 'I', 'T',
+ 'G', 'I', 'X',
+ 'G', 'J', 'E',
+ 'G', 'L', 'A',
+ 'G', 'O', 'A',
+ 'G', 'O', 'O',
+ 'G', 'O', 'P',
+ 'G', 'O', 'T',
+ 'G', 'O', 'X',
+ 'G', 'P', 'A',
+ 'G', 'R', 'U',
+ 'G', 'U', '2',
+ 'G', 'U', 'D',
+ 'G', 'U', 'G',
+ 'G', 'U', 'L',
+ 'G', 'U', 'M',
+ 'G', 'U', 'O',
+ 'G', 'U', 'P',
+ 'G', 'U', 'R',
+ 'G', 'U', 'T',
+ 'G', 'U', 'X',
+ 'G', 'W', 'A',
+ 'G', 'W', 'E',
+ 'G', 'W', 'I',
+ 'G', 'Y', 'A',
+ 'G', 'Y', 'E',
+ 'G', 'Y', 'I',
+ 'G', 'Y', 'O',
+ 'G', 'Y', 'U',
+ 'H', 'A', 'A',
+ 'H', 'A', 'E',
+ 'H', 'A', 'H',
+ 'H', 'A', 'L',
+ 'H', 'A', 'N',
+ 'H', 'A', 'P',
+ 'H', 'A', 'R',
+ 'H', 'A', 'T',
+ 'H', 'A', 'X',
+ 'H', 'E', 'E',
+ 'H', 'E', 'H',
+ 'H', 'E', 'I',
+ 'H', 'E', 'N',
+ 'H', 'E', 'P',
+ 'H', 'E', 'T',
+ 'H', 'E', 'X',
+ 'H', 'H', 'A',
+ 'H', 'H', 'E',
+ 'H', 'H', 'I',
+ 'H', 'H', 'O',
+ 'H', 'H', 'U',
+ 'H', 'I', 'E',
+ 'H', 'I', 'I',
+ 'H', 'I', 'N',
+ 'H', 'I', 'P',
+ 'H', 'I', 'T',
+ 'H', 'L', 'A',
+ 'H', 'L', 'E',
+ 'H', 'L', 'I',
+ 'H', 'L', 'O',
+ 'H', 'L', 'U',
+ 'H', 'L', 'Y',
+ 'H', 'M', 'A',
+ 'H', 'M', 'I',
+ 'H', 'M', 'O',
+ 'H', 'M', 'U',
+ 'H', 'M', 'Y',
+ 'H', 'N', 'A',
+ 'H', 'N', 'E',
+ 'H', 'N', 'I',
+ 'H', 'O', 'A',
+ 'H', 'O', 'E',
+ 'H', 'O', 'N',
+ 'H', 'O', 'O',
+ 'H', 'O', 'P',
+ 'H', 'O', 'T',
+ 'H', 'O', 'X',
+ 'H', 'P', 'A',
+ 'H', 'T', 'A',
+ 'H', 'U', 'N',
+ 'H', 'U', 'O',
+ 'H', 'W', 'A',
+ 'H', 'W', 'E',
+ 'H', 'W', 'I',
+ 'H', 'W', 'O',
+ 'H', 'W', 'U',
+ 'H', 'X', 'A',
+ 'H', 'X', 'E',
+ 'H', 'X', 'I',
+ 'H', 'X', 'O',
+ 'H', 'Z', 'G',
+ 'H', 'Z', 'T',
+ 'H', 'Z', 'W',
+ 'H', 'Z', 'Z',
+ 'I', '-', 'A',
+ 'I', '-', 'O',
+ 'I', '-', 'U',
+ 'I', 'A', 'N',
+ 'I', 'C', 'E',
+ 'I', 'E', 'P',
+ 'I', 'E', 'T',
+ 'I', 'E', 'X',
+ 'I', 'G', 'I',
+ 'I', 'L', '2',
+ 'I', 'N', 'G',
+ 'I', 'N', 'I',
+ 'I', 'N', 'N',
+ 'I', 'N', 'Y',
+ 'I', 'O', 'R',
+ 'I', 'R', 'I',
+ 'I', 'S', 'H',
+ 'I', 'S', 'S',
+ 'J', 'A', 'A',
+ 'J', 'A', 'R',
+ 'J', 'E', 'E',
+ 'J', 'E', 'H',
+ 'J', 'E', 'R',
+ 'J', 'H', 'A',
+ 'J', 'H', 'O',
+ 'J', 'I', 'A',
+ 'J', 'I', 'E',
+ 'J', 'I', 'L',
+ 'J', 'I', 'P',
+ 'J', 'I', 'T',
+ 'J', 'I', 'X',
+ 'J', 'J', 'A',
+ 'J', 'J', 'E',
+ 'J', 'J', 'I',
+ 'J', 'J', 'O',
+ 'J', 'J', 'U',
+ 'J', 'J', 'Y',
+ 'J', 'O', 'A',
+ 'J', 'O', 'O',
+ 'J', 'O', 'P',
+ 'J', 'O', 'T',
+ 'J', 'O', 'X',
+ 'J', 'O', 'Y',
+ 'J', 'U', 'O',
+ 'J', 'U', 'P',
+ 'J', 'U', 'R',
+ 'J', 'U', 'T',
+ 'J', 'U', 'X',
+ 'J', 'W', 'A',
+ 'J', 'Y', 'P',
+ 'J', 'Y', 'R',
+ 'J', 'Y', 'T',
+ 'J', 'Y', 'X',
+ 'K', 'A', '2',
+ 'K', 'A', 'A',
+ 'K', 'A', 'B',
+ 'K', 'A', 'F',
+ 'K', 'A', 'H',
+ 'K', 'A', 'I',
+ 'K', 'A', 'K',
+ 'K', 'A', 'L',
+ 'K', 'A', 'N',
+ 'K', 'A', 'P',
+ 'K', 'A', 'T',
+ 'K', 'A', 'X',
+ 'K', 'A', 'Y',
+ 'K', 'E', 'E',
+ 'K', 'E', 'H',
+ 'K', 'E', 'N',
+ 'K', 'E', 'P',
+ 'K', 'E', 'T',
+ 'K', 'E', 'X',
+ 'K', 'E', 'Y',
+ 'K', 'H', 'A',
+ 'K', 'H', 'E',
+ 'K', 'H', 'I',
+ 'K', 'H', 'O',
+ 'K', 'H', 'U',
+ 'K', 'H', 'Z',
+ 'K', 'I', 'D',
+ 'K', 'I', 'E',
+ 'K', 'I', 'H',
+ 'K', 'I', 'I',
+ 'K', 'I', 'N',
+ 'K', 'I', 'P',
+ 'K', 'I', 'T',
+ 'K', 'I', 'X',
+ 'K', 'J', 'E',
+ 'K', 'K', 'A',
+ 'K', 'K', 'E',
+ 'K', 'K', 'I',
+ 'K', 'K', 'O',
+ 'K', 'K', 'U',
+ 'K', 'L', 'A',
+ 'K', 'O', 'A',
+ 'K', 'O', 'H',
+ 'K', 'O', 'N',
+ 'K', 'O', 'O',
+ 'K', 'O', 'P',
+ 'K', 'O', 'T',
+ 'K', 'O', 'X',
+ 'K', 'P', 'A',
+ 'K', 'P', 'E',
+ 'K', 'P', 'I',
+ 'K', 'P', 'O',
+ 'K', 'P', 'U',
+ 'K', 'R', 'A',
+ 'K', 'S', 'I',
+ 'K', 'U', '3',
+ 'K', 'U', '4',
+ 'K', 'U', '7',
+ 'K', 'U', 'L',
+ 'K', 'U', 'N',
+ 'K', 'U', 'O',
+ 'K', 'U', 'P',
+ 'K', 'U', 'R',
+ 'K', 'U', 'T',
+ 'K', 'U', 'X',
+ 'K', 'V', 'A',
+ 'K', 'W', 'A',
+ 'K', 'W', 'E',
+ 'K', 'W', 'I',
+ 'K', 'W', 'O',
+ 'K', 'X', 'A',
+ 'K', 'X', 'E',
+ 'K', 'X', 'I',
+ 'K', 'X', 'O',
+ 'K', 'X', 'U',
+ 'K', 'Y', 'A',
+ 'K', 'Y', 'E',
+ 'K', 'Y', 'I',
+ 'K', 'Y', 'O',
+ 'K', 'Y', 'U',
+ 'L', 'A', 'A',
+ 'L', 'A', 'E',
+ 'L', 'A', 'L',
+ 'L', 'A', 'M',
+ 'L', 'A', 'O',
+ 'L', 'A', 'P',
+ 'L', 'A', 'S',
+ 'L', 'A', 'T',
+ 'L', 'A', 'W',
+ 'L', 'A', 'X',
+ 'L', 'C', 'E',
+ 'L', 'C', 'I',
+ 'L', 'D', '2',
+ 'L', 'E', 'E',
+ 'L', 'E', 'G',
+ 'L', 'E', 'K',
+ 'L', 'E', 'O',
+ 'L', 'E', 'P',
+ 'L', 'E', 'X',
+ 'L', 'H', 'A',
+ 'L', 'H', 'E',
+ 'L', 'H', 'I',
+ 'L', 'H', 'O',
+ 'L', 'H', 'U',
+ 'L', 'I', 'D',
+ 'L', 'I', 'E',
+ 'L', 'I', 'I',
+ 'L', 'I', 'L',
+ 'L', 'I', 'P',
+ 'L', 'I', 'T',
+ 'L', 'I', 'X',
+ 'L', 'J', 'E',
+ 'L', 'L', 'A',
+ 'L', 'O', 'A',
+ 'L', 'O', 'G',
+ 'L', 'O', 'O',
+ 'L', 'O', 'P',
+ 'L', 'O', 'T',
+ 'L', 'O', 'W',
+ 'L', 'O', 'X',
+ 'L', 'U', '2',
+ 'L', 'U', '3',
+ 'L', 'U', 'E',
+ 'L', 'U', 'H',
+ 'L', 'U', 'L',
+ 'L', 'U', 'M',
+ 'L', 'U', 'O',
+ 'L', 'U', 'P',
+ 'L', 'U', 'R',
+ 'L', 'U', 'T',
+ 'L', 'U', 'X',
+ 'L', 'W', 'A',
+ 'L', 'W', 'E',
+ 'L', 'W', 'I',
+ 'L', 'W', 'O',
+ 'L', 'Y', 'P',
+ 'L', 'Y', 'R',
+ 'L', 'Y', 'T',
+ 'L', 'Y', 'X',
+ 'L', 'Y', 'Y',
+ 'M', 'A', '2',
+ 'M', 'A', 'A',
+ 'M', 'A', 'H',
+ 'M', 'A', 'I',
+ 'M', 'A', 'N',
+ 'M', 'A', 'P',
+ 'M', 'A', 'R',
+ 'M', 'A', 'T',
+ 'M', 'A', 'X',
+ 'M', 'A', 'Y',
+ 'M', 'B', '2',
+ 'M', 'B', '3',
+ 'M', 'B', '4',
+ 'M', 'B', 'A',
+ 'M', 'B', 'E',
+ 'M', 'B', 'I',
+ 'M', 'B', 'O',
+ 'M', 'B', 'U',
+ 'M', 'E', 'D',
+ 'M', 'E', 'E',
+ 'M', 'E', 'M',
+ 'M', 'E', 'N',
+ 'M', 'E', 'S',
+ 'M', 'E', 'X',
+ 'M', 'G', 'A',
+ 'M', 'G', 'E',
+ 'M', 'G', 'O',
+ 'M', 'G', 'U',
+ 'M', 'H', 'Z',
+ 'M', 'I', 'D',
+ 'M', 'I', 'E',
+ 'M', 'I', 'G',
+ 'M', 'I', 'I',
+ 'M', 'I', 'L',
+ 'M', 'I', 'M',
+ 'M', 'I', 'N',
+ 'M', 'I', 'P',
+ 'M', 'I', 'T',
+ 'M', 'I', 'X',
+ 'M', 'L', 'A',
+ 'M', 'O', 'A',
+ 'M', 'O', 'L',
+ 'M', 'O', 'N',
+ 'M', 'O', 'O',
+ 'M', 'O', 'P',
+ 'M', 'O', 'T',
+ 'M', 'O', 'X',
+ 'M', 'P', 'A',
+ 'M', 'U', 'E',
+ 'M', 'U', 'G',
+ 'M', 'U', 'M',
+ 'M', 'U', 'O',
+ 'M', 'U', 'P',
+ 'M', 'U', 'R',
+ 'M', 'U', 'T',
+ 'M', 'U', 'X',
+ 'M', 'W', 'A',
+ 'M', 'W', 'E',
+ 'M', 'W', 'I',
+ 'M', 'W', 'O',
+ 'M', 'Y', 'A',
+ 'M', 'Y', 'P',
+ 'M', 'Y', 'T',
+ 'M', 'Y', 'X',
+ 'N', 'A', '2',
+ 'N', 'A', 'A',
+ 'N', 'A', 'G',
+ 'N', 'A', 'H',
+ 'N', 'A', 'M',
+ 'N', 'A', 'P',
+ 'N', 'A', 'R',
+ 'N', 'A', 'X',
+ 'N', 'B', 'A',
+ 'N', 'B', 'I',
+ 'N', 'B', 'O',
+ 'N', 'B', 'U',
+ 'N', 'B', 'Y',
+ 'N', 'D', 'A',
+ 'N', 'D', 'E',
+ 'N', 'D', 'I',
+ 'N', 'D', 'O',
+ 'N', 'D', 'U',
+ 'N', 'E', 'E',
+ 'N', 'E', 'N',
+ 'N', 'E', 'O',
+ 'N', 'E', 'P',
+ 'N', 'E', 'T',
+ 'N', 'E', 'W',
+ 'N', 'E', 'X',
+ 'N', 'G', 'A',
+ 'N', 'G', 'E',
+ 'N', 'G', 'G',
+ 'N', 'G', 'I',
+ 'N', 'G', 'O',
+ 'N', 'G', 'U',
+ 'N', 'H', 'A',
+ 'N', 'I', '2',
+ 'N', 'I', 'A',
+ 'N', 'I', 'B',
+ 'N', 'I', 'E',
+ 'N', 'I', 'I',
+ 'N', 'I', 'M',
+ 'N', 'I', 'P',
+ 'N', 'I', 'T',
+ 'N', 'I', 'X',
+ 'N', 'J', 'A',
+ 'N', 'J', 'E',
+ 'N', 'J', 'I',
+ 'N', 'J', 'O',
+ 'N', 'J', 'U',
+ 'N', 'J', 'Y',
+ 'N', 'K', 'O',
+ 'N', 'N', 'A',
+ 'N', 'N', 'G',
+ 'N', 'N', 'O',
+ 'N', 'O', 'A',
+ 'N', 'O', 'O',
+ 'N', 'O', 'P',
+ 'N', 'O', 'R',
+ 'N', 'O', 'T',
+ 'N', 'O', 'W',
+ 'N', 'O', 'X',
+ 'N', 'R', 'A',
+ 'N', 'R', 'E',
+ 'N', 'R', 'O',
+ 'N', 'R', 'U',
+ 'N', 'R', 'Y',
+ 'N', 'U', 'E',
+ 'N', 'U', 'M',
+ 'N', 'U', 'N',
+ 'N', 'U', 'O',
+ 'N', 'U', 'P',
+ 'N', 'U', 'R',
+ 'N', 'U', 'T',
+ 'N', 'U', 'X',
+ 'N', 'W', 'A',
+ 'N', 'W', 'E',
+ 'N', 'Y', 'A',
+ 'N', 'Y', 'D',
+ 'N', 'Y', 'E',
+ 'N', 'Y', 'I',
+ 'N', 'Y', 'O',
+ 'N', 'Y', 'U',
+ 'N', 'Z', 'A',
+ 'N', 'Z', 'E',
+ 'N', 'Z', 'I',
+ 'N', 'Z', 'U',
+ 'N', 'Z', 'Y',
+ 'O', '-', 'E',
+ 'O', '-', 'O',
+ 'O', '-', 'U',
+ 'O', 'A', 'K',
+ 'O', 'A', 'Y',
+ 'O', 'C', 'R',
+ 'O', 'D', 'D',
+ 'O', 'H', 'M',
+ 'O', 'I', 'L',
+ 'O', 'L', 'D',
+ 'O', 'L', 'E',
+ 'O', 'N', 'E',
+ 'O', 'N', 'G',
+ 'O', 'N', 'N',
+ 'O', 'N', 'U',
+ 'O', 'O', 'N',
+ 'O', 'O', 'U',
+ 'O', 'T', 'T',
+ 'O', 'T', 'U',
+ 'O', 'U', 'T',
+ 'P', 'A', 'A',
+ 'P', 'A', 'D',
+ 'P', 'A', 'N',
+ 'P', 'A', 'P',
+ 'P', 'A', 'R',
+ 'P', 'A', 'T',
+ 'P', 'A', 'W',
+ 'P', 'A', 'X',
+ 'P', 'E', 'E',
+ 'P', 'E', 'H',
+ 'P', 'E', 'R',
+ 'P', 'E', 'S',
+ 'P', 'H', 'A',
+ 'P', 'H', 'E',
+ 'P', 'H', 'I',
+ 'P', 'H', 'O',
+ 'P', 'H', 'U',
+ 'P', 'I', 'E',
+ 'P', 'I', 'G',
+ 'P', 'I', 'I',
+ 'P', 'I', 'P',
+ 'P', 'I', 'T',
+ 'P', 'I', 'X',
+ 'P', 'L', 'A',
+ 'P', 'O', 'A',
+ 'P', 'O', 'O',
+ 'P', 'O', 'P',
+ 'P', 'O', 'T',
+ 'P', 'O', 'X',
+ 'P', 'P', 'A',
+ 'P', 'P', 'M',
+ 'P', 'S', 'I',
+ 'P', 'T', 'E',
+ 'P', 'U', '2',
+ 'P', 'U', 'O',
+ 'P', 'U', 'P',
+ 'P', 'U', 'R',
+ 'P', 'U', 'T',
+ 'P', 'U', 'X',
+ 'P', 'W', 'A',
+ 'P', 'W', 'E',
+ 'P', 'W', 'I',
+ 'P', 'W', 'O',
+ 'P', 'Y', 'P',
+ 'P', 'Y', 'R',
+ 'P', 'Y', 'T',
+ 'P', 'Y', 'X',
+ 'Q', 'A', 'A',
+ 'Q', 'A', 'F',
+ 'Q', 'A', 'I',
+ 'Q', 'A', 'Q',
+ 'Q', 'A', 'R',
+ 'Q', 'A', 'U',
+ 'Q', 'E', 'E',
+ 'Q', 'H', 'A',
+ 'Q', 'H', 'E',
+ 'Q', 'H', 'I',
+ 'Q', 'H', 'O',
+ 'Q', 'H', 'U',
+ 'Q', 'I', 'E',
+ 'Q', 'I', 'I',
+ 'Q', 'I', 'P',
+ 'Q', 'I', 'T',
+ 'Q', 'I', 'X',
+ 'Q', 'O', 'A',
+ 'Q', 'O', 'F',
+ 'Q', 'O', 'O',
+ 'Q', 'O', 'P',
+ 'Q', 'O', 'T',
+ 'Q', 'O', 'X',
+ 'Q', 'U', 'A',
+ 'Q', 'U', 'E',
+ 'Q', 'U', 'I',
+ 'Q', 'U', 'K',
+ 'Q', 'U', 'O',
+ 'Q', 'U', 'P',
+ 'Q', 'U', 'R',
+ 'Q', 'U', 'T',
+ 'Q', 'U', 'U',
+ 'Q', 'U', 'V',
+ 'Q', 'U', 'X',
+ 'Q', 'W', 'A',
+ 'Q', 'W', 'E',
+ 'Q', 'W', 'I',
+ 'Q', 'Y', 'A',
+ 'Q', 'Y', 'E',
+ 'Q', 'Y', 'I',
+ 'Q', 'Y', 'O',
+ 'Q', 'Y', 'P',
+ 'Q', 'Y', 'R',
+ 'Q', 'Y', 'T',
+ 'Q', 'Y', 'U',
+ 'Q', 'Y', 'X',
+ 'R', 'A', '2',
+ 'R', 'A', '3',
+ 'R', 'A', 'A',
+ 'R', 'A', 'B',
+ 'R', 'A', 'D',
+ 'R', 'A', 'E',
+ 'R', 'A', 'M',
+ 'R', 'A', 'N',
+ 'R', 'A', 'P',
+ 'R', 'A', 'T',
+ 'R', 'A', 'X',
+ 'R', 'A', 'Y',
+ 'R', 'D', 'O',
+ 'R', 'E', 'D',
+ 'R', 'E', 'E',
+ 'R', 'E', 'H',
+ 'R', 'E', 'P',
+ 'R', 'E', 'X',
+ 'R', 'H', 'A',
+ 'R', 'H', 'O',
+ 'R', 'I', 'I',
+ 'R', 'I', 'N',
+ 'R', 'I', 'P',
+ 'R', 'J', 'E',
+ 'R', 'O', '2',
+ 'R', 'O', 'A',
+ 'R', 'O', 'C',
+ 'R', 'O', 'D',
+ 'R', 'O', 'O',
+ 'R', 'O', 'P',
+ 'R', 'O', 'T',
+ 'R', 'O', 'X',
+ 'R', 'R', 'A',
+ 'R', 'R', 'E',
+ 'R', 'R', 'O',
+ 'R', 'R', 'U',
+ 'R', 'R', 'Y',
+ 'R', 'U', 'A',
+ 'R', 'U', 'B',
+ 'R', 'U', 'M',
+ 'R', 'U', 'N',
+ 'R', 'U', 'O',
+ 'R', 'U', 'P',
+ 'R', 'U', 'R',
+ 'R', 'U', 'T',
+ 'R', 'U', 'X',
+ 'R', 'W', 'A',
+ 'R', 'Y', 'A',
+ 'R', 'Y', 'P',
+ 'R', 'Y', 'R',
+ 'R', 'Y', 'T',
+ 'R', 'Y', 'X',
+ 'R', 'Y', 'Y',
+ 'S', '-', 'W',
+ 'S', 'A', 'A',
+ 'S', 'A', 'D',
+ 'S', 'A', 'G',
+ 'S', 'A', 'L',
+ 'S', 'A', 'N',
+ 'S', 'A', 'P',
+ 'S', 'A', 'R',
+ 'S', 'A', 'T',
+ 'S', 'A', 'W',
+ 'S', 'A', 'X',
+ 'S', 'A', 'Y',
+ 'S', 'E', 'E',
+ 'S', 'E', 'H',
+ 'S', 'E', 'P',
+ 'S', 'E', 'T',
+ 'S', 'E', 'X',
+ 'S', 'H', '2',
+ 'S', 'H', 'A',
+ 'S', 'H', 'E',
+ 'S', 'H', 'I',
+ 'S', 'H', 'O',
+ 'S', 'H', 'U',
+ 'S', 'H', 'Y',
+ 'S', 'I', 'E',
+ 'S', 'I', 'G',
+ 'S', 'I', 'I',
+ 'S', 'I', 'N',
+ 'S', 'I', 'P',
+ 'S', 'I', 'T',
+ 'S', 'I', 'X',
+ 'S', 'J', 'E',
+ 'S', 'K', 'W',
+ 'S', 'N', 'A',
+ 'S', 'O', 'A',
+ 'S', 'O', 'F',
+ 'S', 'O', 'N',
+ 'S', 'O', 'O',
+ 'S', 'O', 'P',
+ 'S', 'O', 'T',
+ 'S', 'O', 'U',
+ 'S', 'O', 'W',
+ 'S', 'O', 'X',
+ 'S', 'S', 'A',
+ 'S', 'S', 'E',
+ 'S', 'S', 'I',
+ 'S', 'S', 'O',
+ 'S', 'S', 'U',
+ 'S', 'S', 'Y',
+ 'S', 'T', '2',
+ 'S', 'U', 'A',
+ 'S', 'U', 'D',
+ 'S', 'U', 'M',
+ 'S', 'U', 'N',
+ 'S', 'U', 'O',
+ 'S', 'U', 'P',
+ 'S', 'U', 'R',
+ 'S', 'U', 'T',
+ 'S', 'U', 'X',
+ 'S', 'W', 'A',
+ 'S', 'W', 'E',
+ 'S', 'W', 'G',
+ 'S', 'W', 'I',
+ 'S', 'W', 'O',
+ 'S', 'W', 'Z',
+ 'S', 'Y', 'A',
+ 'S', 'Y', 'P',
+ 'S', 'Y', 'R',
+ 'S', 'Y', 'T',
+ 'S', 'Y', 'X',
+ 'S', 'Z', 'A',
+ 'S', 'Z', 'E',
+ 'S', 'Z', 'I',
+ 'S', 'Z', 'O',
+ 'S', 'Z', 'U',
+ 'S', 'Z', 'Z',
+ 'T', 'A', '2',
+ 'T', 'A', 'A',
+ 'T', 'A', 'B',
+ 'T', 'A', 'G',
+ 'T', 'A', 'H',
+ 'T', 'A', 'I',
+ 'T', 'A', 'K',
+ 'T', 'A', 'M',
+ 'T', 'A', 'N',
+ 'T', 'A', 'O',
+ 'T', 'A', 'P',
+ 'T', 'A', 'R',
+ 'T', 'A', 'T',
+ 'T', 'A', 'U',
+ 'T', 'A', 'V',
+ 'T', 'A', 'W',
+ 'T', 'A', 'X',
+ 'T', 'E', 'E',
+ 'T', 'E', 'H',
+ 'T', 'E', 'N',
+ 'T', 'E', 'P',
+ 'T', 'E', 'T',
+ 'T', 'E', 'X',
+ 'T', 'H', 'A',
+ 'T', 'H', 'E',
+ 'T', 'H', 'I',
+ 'T', 'H', 'O',
+ 'T', 'H', 'U',
+ 'T', 'H', 'Z',
+ 'T', 'I', 'E',
+ 'T', 'I', 'I',
+ 'T', 'I', 'L',
+ 'T', 'I', 'P',
+ 'T', 'I', 'R',
+ 'T', 'I', 'T',
+ 'T', 'I', 'X',
+ 'T', 'J', 'E',
+ 'T', 'L', 'A',
+ 'T', 'L', 'E',
+ 'T', 'L', 'I',
+ 'T', 'L', 'O',
+ 'T', 'L', 'U',
+ 'T', 'L', 'V',
+ 'T', 'O', 'A',
+ 'T', 'O', 'N',
+ 'T', 'O', 'O',
+ 'T', 'O', 'P',
+ 'T', 'O', 'T',
+ 'T', 'O', 'X',
+ 'T', 'R', 'I',
+ 'T', 'S', 'A',
+ 'T', 'S', 'E',
+ 'T', 'S', 'I',
+ 'T', 'S', 'O',
+ 'T', 'S', 'U',
+ 'T', 'S', 'V',
+ 'T', 'T', '2',
+ 'T', 'T', 'A',
+ 'T', 'T', 'E',
+ 'T', 'T', 'H',
+ 'T', 'T', 'I',
+ 'T', 'T', 'O',
+ 'T', 'T', 'U',
+ 'T', 'U', 'K',
+ 'T', 'U', 'M',
+ 'T', 'U', 'O',
+ 'T', 'U', 'P',
+ 'T', 'U', 'R',
+ 'T', 'U', 'T',
+ 'T', 'U', 'X',
+ 'T', 'W', 'A',
+ 'T', 'W', 'E',
+ 'T', 'W', 'I',
+ 'T', 'W', 'O',
+ 'T', 'Y', 'A',
+ 'T', 'Y', 'E',
+ 'T', 'Y', 'I',
+ 'T', 'Y', 'O',
+ 'T', 'Y', 'R',
+ 'T', 'Z', 'A',
+ 'T', 'Z', 'E',
+ 'T', 'Z', 'I',
+ 'T', 'Z', 'O',
+ 'T', 'Z', 'U',
+ 'U', '-', 'A',
+ 'U', '-', 'U',
+ 'U', 'E', 'E',
+ 'U', 'E', 'Y',
+ 'U', 'K', 'U',
+ 'U', 'L', 'U',
+ 'U', 'N', 'A',
+ 'U', 'N', 'N',
+ 'U', 'O', 'N',
+ 'U', 'O', 'P',
+ 'U', 'O', 'X',
+ 'U', 'R', '2',
+ 'U', 'R', '4',
+ 'U', 'R', 'A',
+ 'U', 'R', 'I',
+ 'U', 'R', 'N',
+ 'U', 'R', 'U',
+ 'U', 'S', 'E',
+ 'U', 'S', 'H',
+ 'U', 'U', 'U',
+ 'U', 'Z', '3',
+ 'U', 'Z', 'U',
+ 'V', 'A', 'A',
+ 'V', 'A', 'I',
+ 'V', 'A', 'P',
+ 'V', 'A', 'T',
+ 'V', 'A', 'V',
+ 'V', 'A', 'X',
+ 'V', 'E', 'E',
+ 'V', 'E', 'H',
+ 'V', 'E', 'P',
+ 'V', 'E', 'W',
+ 'V', 'E', 'X',
+ 'V', 'I', 'E',
+ 'V', 'I', 'N',
+ 'V', 'I', 'P',
+ 'V', 'I', 'T',
+ 'V', 'I', 'X',
+ 'V', 'O', 'O',
+ 'V', 'O', 'P',
+ 'V', 'O', 'T',
+ 'V', 'O', 'U',
+ 'V', 'O', 'W',
+ 'V', 'O', 'X',
+ 'V', 'U', 'P',
+ 'V', 'U', 'R',
+ 'V', 'U', 'T',
+ 'V', 'U', 'X',
+ 'V', 'W', 'A',
+ 'V', 'Y', 'P',
+ 'V', 'Y', 'R',
+ 'V', 'Y', 'T',
+ 'V', 'Y', 'X',
+ 'W', 'A', 'A',
+ 'W', 'A', 'E',
+ 'W', 'A', 'N',
+ 'W', 'A', 'P',
+ 'W', 'A', 'T',
+ 'W', 'A', 'U',
+ 'W', 'A', 'W',
+ 'W', 'A', 'X',
+ 'W', 'E', 'E',
+ 'W', 'E', 'N',
+ 'W', 'E', 'O',
+ 'W', 'E', 'P',
+ 'W', 'E', 'X',
+ 'W', 'I', 'I',
+ 'W', 'I', 'N',
+ 'W', 'O', 'A',
+ 'W', 'O', 'E',
+ 'W', 'O', 'N',
+ 'W', 'O', 'O',
+ 'W', 'O', 'P',
+ 'W', 'O', 'X',
+ 'W', 'U', 'N',
+ 'W', 'U', 'O',
+ 'X', 'A', 'A',
+ 'X', 'A', 'N',
+ 'X', 'E', 'E',
+ 'X', 'E', 'H',
+ 'X', 'I', 'E',
+ 'X', 'I', 'P',
+ 'X', 'I', 'T',
+ 'X', 'I', 'X',
+ 'X', 'O', 'A',
+ 'X', 'O', 'P',
+ 'X', 'O', 'R',
+ 'X', 'O', 'T',
+ 'X', 'O', 'X',
+ 'X', 'U', 'O',
+ 'X', 'V', 'A',
+ 'X', 'W', 'A',
+ 'X', 'W', 'E',
+ 'X', 'W', 'I',
+ 'X', 'Y', 'A',
+ 'X', 'Y', 'E',
+ 'X', 'Y', 'I',
+ 'X', 'Y', 'O',
+ 'X', 'Y', 'P',
+ 'X', 'Y', 'R',
+ 'X', 'Y', 'T',
+ 'X', 'Y', 'U',
+ 'X', 'Y', 'X',
+ 'Y', 'A', 'A',
+ 'Y', 'A', 'B',
+ 'Y', 'A', 'D',
+ 'Y', 'A', 'E',
+ 'Y', 'A', 'F',
+ 'Y', 'A', 'G',
+ 'Y', 'A', 'H',
+ 'Y', 'A', 'J',
+ 'Y', 'A', 'K',
+ 'Y', 'A', 'L',
+ 'Y', 'A', 'M',
+ 'Y', 'A', 'N',
+ 'Y', 'A', 'P',
+ 'Y', 'A', 'Q',
+ 'Y', 'A', 'R',
+ 'Y', 'A', 'S',
+ 'Y', 'A', 'T',
+ 'Y', 'A', 'V',
+ 'Y', 'A', 'W',
+ 'Y', 'A', 'Y',
+ 'Y', 'A', 'Z',
+ 'Y', 'E', 'A',
+ 'Y', 'E', 'E',
+ 'Y', 'E', 'H',
+ 'Y', 'E', 'N',
+ 'Y', 'E', 'O',
+ 'Y', 'E', 'R',
+ 'Y', 'E', 'W',
+ 'Y', 'E', 'Y',
+ 'Y', 'I', 'E',
+ 'Y', 'I', 'G',
+ 'Y', 'I', 'I',
+ 'Y', 'I', 'N',
+ 'Y', 'I', 'P',
+ 'Y', 'I', 'T',
+ 'Y', 'I', 'X',
+ 'Y', 'O', 'A',
+ 'Y', 'O', 'D',
+ 'Y', 'O', 'O',
+ 'Y', 'O', 'P',
+ 'Y', 'O', 'T',
+ 'Y', 'O', 'X',
+ 'Y', 'U', 'O',
+ 'Y', 'U', 'P',
+ 'Y', 'U', 'R',
+ 'Y', 'U', 'S',
+ 'Y', 'U', 'T',
+ 'Y', 'U', 'X',
+ 'Y', 'W', 'A',
+ 'Y', 'W', 'E',
+ 'Y', 'W', 'I',
+ 'Y', 'W', 'O',
+ 'Y', 'Y', 'A',
+ 'Y', 'Y', 'P',
+ 'Y', 'Y', 'R',
+ 'Y', 'Y', 'T',
+ 'Y', 'Y', 'X',
+ 'Z', 'A', 'A',
+ 'Z', 'A', 'G',
+ 'Z', 'A', 'H',
+ 'Z', 'A', 'I',
+ 'Z', 'A', 'L',
+ 'Z', 'A', 'P',
+ 'Z', 'A', 'T',
+ 'Z', 'A', 'X',
+ 'Z', 'E', '2',
+ 'Z', 'E', 'E',
+ 'Z', 'E', 'N',
+ 'Z', 'E', 'P',
+ 'Z', 'E', 'X',
+ 'Z', 'H', 'A',
+ 'Z', 'H', 'E',
+ 'Z', 'H', 'I',
+ 'Z', 'H', 'O',
+ 'Z', 'H', 'U',
+ 'Z', 'H', 'Y',
+ 'Z', 'I', '3',
+ 'Z', 'I', 'B',
+ 'Z', 'I', 'E',
+ 'Z', 'I', 'G',
+ 'Z', 'I', 'P',
+ 'Z', 'I', 'T',
+ 'Z', 'I', 'X',
+ 'Z', 'J', 'E',
+ 'Z', 'L', 'A',
+ 'Z', 'O', 'A',
+ 'Z', 'O', 'O',
+ 'Z', 'O', 'P',
+ 'Z', 'O', 'T',
+ 'Z', 'O', 'X',
+ 'Z', 'R', 'A',
+ 'Z', 'U', '5',
+ 'Z', 'U', 'M',
+ 'Z', 'U', 'O',
+ 'Z', 'U', 'P',
+ 'Z', 'U', 'R',
+ 'Z', 'U', 'T',
+ 'Z', 'U', 'X',
+ 'Z', 'W', 'A',
+ 'Z', 'Y', 'P',
+ 'Z', 'Y', 'R',
+ 'Z', 'Y', 'T',
+ 'Z', 'Y', 'X',
+ 'Z', 'Z', 'A',
+ 'Z', 'Z', 'E',
+ 'Z', 'Z', 'I',
+ 'Z', 'Z', 'O',
+ 'Z', 'Z', 'U',
+ 'Z', 'Z', 'Y',
+ 'A', 'A', 'R', 'U',
+ 'A', 'D', 'A', 'K',
+ 'A', 'D', 'E', 'G',
+ 'A', 'E', 'S', 'C',
+ 'A', 'H', 'A', 'D',
+ 'A', 'H', 'S', 'A',
+ 'A', 'I', 'L', 'M',
+ 'A', 'I', 'N', 'N',
+ 'A', 'I', 'N', 'U',
+ 'A', 'L', 'A', 'N',
+ 'A', 'L', 'E', 'F',
+ 'A', 'L', 'F', 'A',
+ 'A', 'L', 'L', 'I',
+ 'A', 'L', 'L', 'O',
+ 'A', 'L', 'P', 'A',
+ 'A', 'L', 'T', 'A',
+ 'A', 'M', 'A', 'R',
+ 'A', 'M', 'B', 'A',
+ 'A', 'M', 'P', 'S',
+ 'A', 'N', 'H', 'U',
+ 'A', 'N', 'K', 'H',
+ 'A', 'P', 'I', 'N',
+ 'A', 'P', 'L', 'I',
+ 'A', 'R', 'A', 'D',
+ 'A', 'R', 'C', 'H',
+ 'A', 'R', 'G', 'I',
+ 'A', 'R', 'M', 'Y',
+ 'A', 'S', 'A', 'T',
+ 'A', 'S', 'H', '2',
+ 'A', 'S', 'H', '9',
+ 'A', 'T', 'O', 'M',
+ 'A', 'U', 'N', 'N',
+ 'A', 'Y', 'A', 'H',
+ 'A', 'Y', 'E', 'R',
+ 'A', 'Y', 'I', 'N',
+ 'B', '0', '0', '1',
+ 'B', '0', '0', '2',
+ 'B', '0', '0', '3',
+ 'B', '0', '0', '4',
+ 'B', '0', '0', '5',
+ 'B', '0', '0', '6',
+ 'B', '0', '0', '7',
+ 'B', '0', '0', '8',
+ 'B', '0', '0', '9',
+ 'B', '0', '1', '0',
+ 'B', '0', '1', '1',
+ 'B', '0', '1', '2',
+ 'B', '0', '1', '3',
+ 'B', '0', '1', '4',
+ 'B', '0', '1', '5',
+ 'B', '0', '1', '6',
+ 'B', '0', '1', '7',
+ 'B', '0', '1', '8',
+ 'B', '0', '1', '9',
+ 'B', '0', '2', '0',
+ 'B', '0', '2', '1',
+ 'B', '0', '2', '2',
+ 'B', '0', '2', '3',
+ 'B', '0', '2', '4',
+ 'B', '0', '2', '5',
+ 'B', '0', '2', '6',
+ 'B', '0', '2', '7',
+ 'B', '0', '2', '8',
+ 'B', '0', '2', '9',
+ 'B', '0', '3', '0',
+ 'B', '0', '3', '1',
+ 'B', '0', '3', '2',
+ 'B', '0', '3', '3',
+ 'B', '0', '3', '4',
+ 'B', '0', '3', '6',
+ 'B', '0', '3', '7',
+ 'B', '0', '3', '8',
+ 'B', '0', '3', '9',
+ 'B', '0', '4', '0',
+ 'B', '0', '4', '1',
+ 'B', '0', '4', '2',
+ 'B', '0', '4', '3',
+ 'B', '0', '4', '4',
+ 'B', '0', '4', '5',
+ 'B', '0', '4', '6',
+ 'B', '0', '4', '7',
+ 'B', '0', '4', '8',
+ 'B', '0', '4', '9',
+ 'B', '0', '5', '0',
+ 'B', '0', '5', '1',
+ 'B', '0', '5', '2',
+ 'B', '0', '5', '3',
+ 'B', '0', '5', '4',
+ 'B', '0', '5', '5',
+ 'B', '0', '5', '6',
+ 'B', '0', '5', '7',
+ 'B', '0', '5', '8',
+ 'B', '0', '5', '9',
+ 'B', '0', '6', '0',
+ 'B', '0', '6', '1',
+ 'B', '0', '6', '2',
+ 'B', '0', '6', '3',
+ 'B', '0', '6', '4',
+ 'B', '0', '6', '5',
+ 'B', '0', '6', '6',
+ 'B', '0', '6', '7',
+ 'B', '0', '6', '8',
+ 'B', '0', '6', '9',
+ 'B', '0', '7', '0',
+ 'B', '0', '7', '1',
+ 'B', '0', '7', '2',
+ 'B', '0', '7', '3',
+ 'B', '0', '7', '4',
+ 'B', '0', '7', '5',
+ 'B', '0', '7', '6',
+ 'B', '0', '7', '7',
+ 'B', '0', '7', '8',
+ 'B', '0', '7', '9',
+ 'B', '0', '8', '0',
+ 'B', '0', '8', '1',
+ 'B', '0', '8', '2',
+ 'B', '0', '8', '3',
+ 'B', '0', '8', '5',
+ 'B', '0', '8', '6',
+ 'B', '0', '8', '7',
+ 'B', '0', '8', '9',
+ 'B', '0', '9', '0',
+ 'B', '0', '9', '1',
+ 'B', '1', '0', '0',
+ 'B', '1', '0', '2',
+ 'B', '1', '0', '4',
+ 'B', '1', '0', '5',
+ 'B', '1', '2', '0',
+ 'B', '1', '2', '1',
+ 'B', '1', '2', '2',
+ 'B', '1', '2', '3',
+ 'B', '1', '2', '5',
+ 'B', '1', '2', '7',
+ 'B', '1', '2', '8',
+ 'B', '1', '3', '0',
+ 'B', '1', '3', '1',
+ 'B', '1', '3', '2',
+ 'B', '1', '3', '3',
+ 'B', '1', '3', '5',
+ 'B', '1', '4', '0',
+ 'B', '1', '4', '1',
+ 'B', '1', '4', '2',
+ 'B', '1', '4', '5',
+ 'B', '1', '4', '6',
+ 'B', '1', '5', '0',
+ 'B', '1', '5', '1',
+ 'B', '1', '5', '2',
+ 'B', '1', '5', '3',
+ 'B', '1', '5', '4',
+ 'B', '1', '5', '5',
+ 'B', '1', '5', '6',
+ 'B', '1', '5', '7',
+ 'B', '1', '5', '8',
+ 'B', '1', '5', '9',
+ 'B', '1', '6', '0',
+ 'B', '1', '6', '1',
+ 'B', '1', '6', '2',
+ 'B', '1', '6', '3',
+ 'B', '1', '6', '4',
+ 'B', '1', '6', '5',
+ 'B', '1', '6', '6',
+ 'B', '1', '6', '7',
+ 'B', '1', '6', '8',
+ 'B', '1', '6', '9',
+ 'B', '1', '7', '0',
+ 'B', '1', '7', '1',
+ 'B', '1', '7', '2',
+ 'B', '1', '7', '3',
+ 'B', '1', '7', '4',
+ 'B', '1', '7', '6',
+ 'B', '1', '7', '7',
+ 'B', '1', '7', '8',
+ 'B', '1', '7', '9',
+ 'B', '1', '8', '0',
+ 'B', '1', '8', '1',
+ 'B', '1', '8', '2',
+ 'B', '1', '8', '3',
+ 'B', '1', '8', '4',
+ 'B', '1', '8', '5',
+ 'B', '1', '8', '9',
+ 'B', '1', '9', '0',
+ 'B', '1', '9', '1',
+ 'B', '2', '0', '0',
+ 'B', '2', '0', '1',
+ 'B', '2', '0', '2',
+ 'B', '2', '0', '3',
+ 'B', '2', '0', '4',
+ 'B', '2', '0', '5',
+ 'B', '2', '0', '6',
+ 'B', '2', '0', '7',
+ 'B', '2', '0', '8',
+ 'B', '2', '0', '9',
+ 'B', '2', '1', '0',
+ 'B', '2', '1', '1',
+ 'B', '2', '1', '2',
+ 'B', '2', '1', '3',
+ 'B', '2', '1', '4',
+ 'B', '2', '1', '5',
+ 'B', '2', '1', '6',
+ 'B', '2', '1', '7',
+ 'B', '2', '1', '8',
+ 'B', '2', '1', '9',
+ 'B', '2', '2', '0',
+ 'B', '2', '2', '1',
+ 'B', '2', '2', '2',
+ 'B', '2', '2', '5',
+ 'B', '2', '2', '6',
+ 'B', '2', '2', '7',
+ 'B', '2', '2', '8',
+ 'B', '2', '2', '9',
+ 'B', '2', '3', '0',
+ 'B', '2', '3', '1',
+ 'B', '2', '3', '2',
+ 'B', '2', '3', '3',
+ 'B', '2', '3', '4',
+ 'B', '2', '3', '6',
+ 'B', '2', '4', '0',
+ 'B', '2', '4', '1',
+ 'B', '2', '4', '2',
+ 'B', '2', '4', '3',
+ 'B', '2', '4', '5',
+ 'B', '2', '4', '6',
+ 'B', '2', '4', '7',
+ 'B', '2', '4', '8',
+ 'B', '2', '4', '9',
+ 'B', '2', '5', '0',
+ 'B', '2', '5', '1',
+ 'B', '2', '5', '2',
+ 'B', '2', '5', '3',
+ 'B', '2', '5', '4',
+ 'B', '2', '5', '5',
+ 'B', '2', '5', '6',
+ 'B', '2', '5', '7',
+ 'B', '2', '5', '8',
+ 'B', '2', '5', '9',
+ 'B', '3', '0', '5',
+ 'B', 'A', 'C', 'K',
+ 'B', 'A', 'G', '3',
+ 'B', 'A', 'G', 'A',
+ 'B', 'A', 'H', 'T',
+ 'B', 'A', 'N', '2',
+ 'B', 'A', 'N', 'D',
+ 'B', 'A', 'N', 'G',
+ 'B', 'A', 'N', 'K',
+ 'B', 'A', 'R', 'B',
+ 'B', 'A', 'R', 'S',
+ 'B', 'A', 'S', 'E',
+ 'B', 'B', 'A', 'P',
+ 'B', 'B', 'A', 'T',
+ 'B', 'B', 'A', 'X',
+ 'B', 'B', 'E', 'P',
+ 'B', 'B', 'E', 'X',
+ 'B', 'B', 'I', 'E',
+ 'B', 'B', 'I', 'P',
+ 'B', 'B', 'I', 'T',
+ 'B', 'B', 'I', 'X',
+ 'B', 'B', 'O', 'P',
+ 'B', 'B', 'O', 'T',
+ 'B', 'B', 'O', 'X',
+ 'B', 'B', 'U', 'O',
+ 'B', 'B', 'U', 'P',
+ 'B', 'B', 'U', 'R',
+ 'B', 'B', 'U', 'T',
+ 'B', 'B', 'U', 'X',
+ 'B', 'B', 'Y', 'P',
+ 'B', 'B', 'Y', 'T',
+ 'B', 'B', 'Y', 'X',
+ 'B', 'C', 'A', 'D',
+ 'B', 'E', 'A', 'M',
+ 'B', 'E', 'A', 'N',
+ 'B', 'E', 'A', 'T',
+ 'B', 'E', 'E', 'H',
+ 'B', 'E', 'L', 'L',
+ 'B', 'E', 'L', 'T',
+ 'B', 'E', 'N', 'D',
+ 'B', 'E', 'T', 'A',
+ 'B', 'E', 'T', 'H',
+ 'B', 'H', 'E', 'E',
+ 'B', 'H', 'O', 'O',
+ 'B', 'I', 'E', 'P',
+ 'B', 'I', 'E', 'T',
+ 'B', 'I', 'E', 'X',
+ 'B', 'I', 'R', 'D',
+ 'B', 'I', 'R', 'U',
+ 'B', 'K', 'A', '-',
+ 'B', 'L', 'U', 'E',
+ 'B', 'O', 'A', 'R',
+ 'B', 'O', 'A', 'T',
+ 'B', 'O', 'D', 'Y',
+ 'B', 'O', 'L', 'D',
+ 'B', 'O', 'L', 'T',
+ 'B', 'O', 'N', 'E',
+ 'B', 'R', 'D', 'A',
+ 'B', 'U', 'K', 'Y',
+ 'B', 'U', 'L', 'L',
+ 'B', 'U', 'O', 'N',
+ 'B', 'U', 'O', 'P',
+ 'B', 'U', 'O', 'X',
+ 'B', 'U', 'R', '2',
+ 'B', 'U', 'R', 'U',
+ 'B', 'U', 'R', 'X',
+ 'B', 'W', 'E', 'E',
+ 'B', 'Y', 'R', 'X',
+ 'B', 'Z', 'H', 'I',
+ 'C', '-', '1', '8',
+ 'C', '-', '3', '9',
+ 'C', 'A', 'A', 'I',
+ 'C', 'A', 'D', 'A',
+ 'C', 'A', 'L', 'C',
+ 'C', 'A', 'L', 'L',
+ 'C', 'A', 'N', 'G',
+ 'C', 'A', 'P', 'O',
+ 'C', 'A', 'R', 'E',
+ 'C', 'A', 'R', 'T',
+ 'C', 'A', 'V', 'E',
+ 'C', 'A', 'Y', 'N',
+ 'C', 'C', 'A', 'A',
+ 'C', 'C', 'E', 'E',
+ 'C', 'C', 'H', 'A',
+ 'C', 'C', 'H', 'E',
+ 'C', 'C', 'H', 'I',
+ 'C', 'C', 'H', 'O',
+ 'C', 'C', 'H', 'U',
+ 'C', 'E', 'D', 'I',
+ 'C', 'E', 'N', 'T',
+ 'C', 'H', 'A', 'A',
+ 'C', 'H', 'A', 'D',
+ 'C', 'H', 'A', 'M',
+ 'C', 'H', 'A', 'N',
+ 'C', 'H', 'A', 'P',
+ 'C', 'H', 'A', 'R',
+ 'C', 'H', 'A', 'T',
+ 'C', 'H', 'A', 'X',
+ 'C', 'H', 'E', 'E',
+ 'C', 'H', 'E', 'H',
+ 'C', 'H', 'E', 'N',
+ 'C', 'H', 'E', 'P',
+ 'C', 'H', 'E', 'T',
+ 'C', 'H', 'E', 'X',
+ 'C', 'H', 'H', 'A',
+ 'C', 'H', 'I', 'N',
+ 'C', 'H', 'O', 'A',
+ 'C', 'H', 'O', 'E',
+ 'C', 'H', 'O', 'P',
+ 'C', 'H', 'O', 'T',
+ 'C', 'H', 'O', 'X',
+ 'C', 'H', 'U', 'O',
+ 'C', 'H', 'U', 'P',
+ 'C', 'H', 'U', 'R',
+ 'C', 'H', 'U', 'X',
+ 'C', 'H', 'W', 'A',
+ 'C', 'H', 'Y', 'P',
+ 'C', 'H', 'Y', 'R',
+ 'C', 'H', 'Y', 'T',
+ 'C', 'H', 'Y', 'X',
+ 'C', 'I', 'E', 'P',
+ 'C', 'I', 'E', 'T',
+ 'C', 'I', 'E', 'X',
+ 'C', 'I', 'T', 'Y',
+ 'C', 'L', 'A', 'N',
+ 'C', 'L', 'A', 'W',
+ 'C', 'L', 'E', 'F',
+ 'C', 'L', 'U', 'B',
+ 'C', 'O', 'D', 'A',
+ 'C', 'O', 'L', 'L',
+ 'C', 'O', 'M', 'B',
+ 'C', 'O', 'P', 'Y',
+ 'C', 'R', 'O', 'P',
+ 'C', 'U', 'B', 'E',
+ 'C', 'U', 'O', 'P',
+ 'C', 'U', 'O', 'X',
+ 'C', 'U', 'R', 'L',
+ 'C', 'U', 'R', 'X',
+ 'C', 'W', 'A', 'A',
+ 'C', 'W', 'I', 'I',
+ 'C', 'W', 'O', 'O',
+ 'C', 'Y', 'R', 'X',
+ 'D', 'A', 'E', 'G',
+ 'D', 'A', 'G', 'S',
+ 'D', 'A', 'I', 'R',
+ 'D', 'A', 'M', 'P',
+ 'D', 'A', 'N', 'G',
+ 'D', 'A', 'R', 'K',
+ 'D', 'A', 'R', 'T',
+ 'D', 'A', 'S', 'H',
+ 'D', 'A', 'T', 'A',
+ 'D', 'A', 'T', 'E',
+ 'D', 'D', 'A', 'A',
+ 'D', 'D', 'A', 'L',
+ 'D', 'D', 'A', 'P',
+ 'D', 'D', 'A', 'T',
+ 'D', 'D', 'A', 'X',
+ 'D', 'D', 'D', 'A',
+ 'D', 'D', 'E', 'E',
+ 'D', 'D', 'E', 'P',
+ 'D', 'D', 'E', 'X',
+ 'D', 'D', 'H', 'A',
+ 'D', 'D', 'H', 'O',
+ 'D', 'D', 'I', 'E',
+ 'D', 'D', 'I', 'P',
+ 'D', 'D', 'I', 'T',
+ 'D', 'D', 'I', 'X',
+ 'D', 'D', 'O', 'A',
+ 'D', 'D', 'O', 'P',
+ 'D', 'D', 'O', 'T',
+ 'D', 'D', 'O', 'X',
+ 'D', 'D', 'U', 'O',
+ 'D', 'D', 'U', 'P',
+ 'D', 'D', 'U', 'R',
+ 'D', 'D', 'U', 'T',
+ 'D', 'D', 'U', 'X',
+ 'D', 'D', 'W', 'A',
+ 'D', 'E', 'A', 'D',
+ 'D', 'E', 'E', 'L',
+ 'D', 'E', 'E', 'R',
+ 'D', 'E', 'H', 'I',
+ 'D', 'E', 'K', 'A',
+ 'D', 'E', 'L', 'T',
+ 'D', 'E', 'N', 'G',
+ 'D', 'E', 'S', 'I',
+ 'D', 'E', 'Z', 'H',
+ 'D', 'H', 'A', 'L',
+ 'D', 'H', 'E', 'E',
+ 'D', 'H', 'H', 'A',
+ 'D', 'H', 'H', 'E',
+ 'D', 'H', 'H', 'I',
+ 'D', 'H', 'H', 'O',
+ 'D', 'H', 'H', 'U',
+ 'D', 'H', 'O', 'O',
+ 'D', 'I', 'E', 'P',
+ 'D', 'I', 'E', 'X',
+ 'D', 'I', 'G', 'A',
+ 'D', 'I', 'M', '2',
+ 'D', 'I', 'N', 'G',
+ 'D', 'I', 'S', 'C',
+ 'D', 'I', 'S', 'H',
+ 'D', 'K', 'A', 'R',
+ 'D', 'L', 'E', 'E',
+ 'D', 'O', '-', 'O',
+ 'D', 'O', 'E', 'S',
+ 'D', 'O', 'I', 'T',
+ 'D', 'O', 'N', 'G',
+ 'D', 'O', 'O', 'R',
+ 'D', 'O', 'R', 'U',
+ 'D', 'O', 'T', 'S',
+ 'D', 'O', 'V', 'E',
+ 'D', 'O', 'W', 'N',
+ 'D', 'R', 'I', 'L',
+ 'D', 'R', 'U', 'M',
+ 'D', 'U', 'B', '2',
+ 'D', 'U', 'N', '3',
+ 'D', 'U', 'N', '4',
+ 'D', 'U', 'N', 'G',
+ 'D', 'U', 'O', 'X',
+ 'D', 'U', 'R', '2',
+ 'D', 'U', 'R', 'X',
+ 'D', 'Y', 'E', 'H',
+ 'D', 'Z', 'E', 'E',
+ 'D', 'Z', 'H', 'A',
+ 'D', 'Z', 'H', 'E',
+ 'D', 'Z', 'J', 'E',
+ 'D', 'Z', 'W', 'E',
+ 'D', 'Z', 'Z', 'E',
+ 'E', 'A', 'S', 'E',
+ 'E', 'A', 'S', 'T',
+ 'E', 'D', 'I', 'N',
+ 'E', 'G', 'I', 'R',
+ 'E', 'N', 'O', 'S',
+ 'E', 'O', '-', 'O',
+ 'E', 'O', '-', 'U',
+ 'E', 'R', 'E', 'N',
+ 'E', 'S', 'H', '2',
+ 'E', 'U', '-', 'U',
+ 'E', 'U', 'R', 'O',
+ 'E', 'V', 'E', 'N',
+ 'E', 'Z', 'E', 'N',
+ 'F', 'A', 'A', 'I',
+ 'F', 'A', 'C', 'E',
+ 'F', 'A', 'N', 'G',
+ 'F', 'E', 'E', 'D',
+ 'F', 'E', 'H', 'U',
+ 'F', 'E', 'N', 'G',
+ 'F', 'E', 'O', 'H',
+ 'F', 'I', 'L', 'E',
+ 'F', 'I', 'L', 'L',
+ 'F', 'I', 'R', 'E',
+ 'F', 'I', 'S', 'H',
+ 'F', 'I', 'T', 'A',
+ 'F', 'I', 'V', 'E',
+ 'F', 'L', 'A', 'G',
+ 'F', 'L', 'A', 'T',
+ 'F', 'L', 'I', 'P',
+ 'F', 'O', 'O', 'T',
+ 'F', 'O', 'R', 'K',
+ 'F', 'O', 'R', 'M',
+ 'F', 'O', 'U', 'R',
+ 'F', 'R', 'E', 'E',
+ 'F', 'R', 'O', 'G',
+ 'F', 'R', 'O', 'M',
+ 'F', 'U', 'L', 'L',
+ 'F', 'U', 'R', 'X',
+ 'F', 'U', 'S', 'A',
+ 'F', 'U', 'S', 'E',
+ 'F', 'W', 'A', 'A',
+ 'F', 'W', 'E', 'E',
+ 'G', 'A', 'B', 'A',
+ 'G', 'A', 'L', 'I',
+ 'G', 'A', 'M', 'L',
+ 'G', 'A', 'N', '2',
+ 'G', 'A', 'R', '3',
+ 'G', 'A', 'T', 'E',
+ 'G', 'B', 'E', 'E',
+ 'G', 'B', 'E', 'N',
+ 'G', 'B', 'O', 'N',
+ 'G', 'B', 'O', 'O',
+ 'G', 'C', 'A', 'N',
+ 'G', 'C', 'I', 'G',
+ 'G', 'D', 'A', 'N',
+ 'G', 'E', 'A', 'R',
+ 'G', 'E', 'B', 'A',
+ 'G', 'E', 'B', 'O',
+ 'G', 'E', 'D', 'E',
+ 'G', 'E', 'T', 'A',
+ 'G', 'G', 'A', 'A',
+ 'G', 'G', 'A', 'P',
+ 'G', 'G', 'A', 'T',
+ 'G', 'G', 'A', 'X',
+ 'G', 'G', 'E', 'E',
+ 'G', 'G', 'E', 'P',
+ 'G', 'G', 'E', 'T',
+ 'G', 'G', 'E', 'X',
+ 'G', 'G', 'I', 'E',
+ 'G', 'G', 'I', 'T',
+ 'G', 'G', 'I', 'X',
+ 'G', 'G', 'O', 'P',
+ 'G', 'G', 'O', 'T',
+ 'G', 'G', 'O', 'X',
+ 'G', 'G', 'U', 'O',
+ 'G', 'G', 'U', 'P',
+ 'G', 'G', 'U', 'R',
+ 'G', 'G', 'U', 'T',
+ 'G', 'G', 'U', 'X',
+ 'G', 'G', 'W', 'A',
+ 'G', 'G', 'W', 'E',
+ 'G', 'G', 'W', 'I',
+ 'G', 'H', 'A', 'D',
+ 'G', 'H', 'A', 'N',
+ 'G', 'H', 'E', 'E',
+ 'G', 'H', 'H', 'A',
+ 'G', 'H', 'W', 'A',
+ 'G', 'I', 'B', 'A',
+ 'G', 'I', 'E', 'P',
+ 'G', 'I', 'E', 'T',
+ 'G', 'I', 'E', 'X',
+ 'G', 'I', 'G', 'A',
+ 'G', 'I', 'R', '2',
+ 'G', 'I', 'R', '3',
+ 'G', 'I', 'S', 'H',
+ 'G', 'O', 'A', 'L',
+ 'G', 'O', 'L', 'D',
+ 'G', 'O', 'N', 'G',
+ 'G', 'O', 'R', 'A',
+ 'G', 'O', 'R', 'T',
+ 'G', 'R', 'A', 'M',
+ 'G', 'S', 'U', 'M',
+ 'G', 'T', 'E', 'R',
+ 'G', 'U', 'E', 'H',
+ 'G', 'U', 'N', 'U',
+ 'G', 'U', 'O', 'P',
+ 'G', 'U', 'O', 'T',
+ 'G', 'U', 'O', 'X',
+ 'G', 'U', 'R', '7',
+ 'G', 'U', 'R', 'X',
+ 'G', 'W', 'A', 'A',
+ 'G', 'W', 'E', 'E',
+ 'G', 'Y', 'A', 'A',
+ 'G', 'Y', 'A', 'S',
+ 'G', 'Y', 'E', 'E',
+ 'G', 'Y', 'F', 'U',
+ 'G', 'Y', 'O', 'N',
+ 'H', 'A', 'G', 'L',
+ 'H', 'A', 'I', 'R',
+ 'H', 'A', 'L', 'F',
+ 'H', 'A', 'N', 'D',
+ 'H', 'A', 'R', 'D',
+ 'H', 'A', 'T', 'E',
+ 'H', 'A', 'V', 'E',
+ 'H', 'E', 'A', 'D',
+ 'H', 'E', 'L', 'M',
+ 'H', 'E', 'M', 'P',
+ 'H', 'E', 'N', 'G',
+ 'H', 'E', 'R', 'U',
+ 'H', 'E', 'T', 'A',
+ 'H', 'E', 'T', 'H',
+ 'H', 'H', 'A', 'A',
+ 'H', 'H', 'E', 'E',
+ 'H', 'H', 'W', 'A',
+ 'H', 'I', 'D', 'E',
+ 'H', 'I', 'E', 'X',
+ 'H', 'I', 'G', 'H',
+ 'H', 'I', 'Z', 'B',
+ 'H', 'L', 'A', 'P',
+ 'H', 'L', 'A', 'T',
+ 'H', 'L', 'A', 'X',
+ 'H', 'L', 'E', 'P',
+ 'H', 'L', 'E', 'X',
+ 'H', 'L', 'I', 'E',
+ 'H', 'L', 'I', 'P',
+ 'H', 'L', 'I', 'T',
+ 'H', 'L', 'I', 'X',
+ 'H', 'L', 'O', 'P',
+ 'H', 'L', 'O', 'X',
+ 'H', 'L', 'U', 'O',
+ 'H', 'L', 'U', 'P',
+ 'H', 'L', 'U', 'R',
+ 'H', 'L', 'U', 'T',
+ 'H', 'L', 'U', 'X',
+ 'H', 'L', 'Y', 'P',
+ 'H', 'L', 'Y', 'R',
+ 'H', 'L', 'Y', 'T',
+ 'H', 'L', 'Y', 'X',
+ 'H', 'M', 'A', 'P',
+ 'H', 'M', 'A', 'T',
+ 'H', 'M', 'A', 'X',
+ 'H', 'M', 'I', 'E',
+ 'H', 'M', 'I', 'P',
+ 'H', 'M', 'I', 'T',
+ 'H', 'M', 'I', 'X',
+ 'H', 'M', 'O', 'P',
+ 'H', 'M', 'O', 'T',
+ 'H', 'M', 'O', 'X',
+ 'H', 'M', 'U', 'O',
+ 'H', 'M', 'U', 'P',
+ 'H', 'M', 'U', 'R',
+ 'H', 'M', 'U', 'T',
+ 'H', 'M', 'U', 'X',
+ 'H', 'M', 'Y', 'P',
+ 'H', 'M', 'Y', 'R',
+ 'H', 'M', 'Y', 'X',
+ 'H', 'N', 'A', 'P',
+ 'H', 'N', 'A', 'T',
+ 'H', 'N', 'A', 'X',
+ 'H', 'N', 'E', 'P',
+ 'H', 'N', 'E', 'X',
+ 'H', 'N', 'I', 'E',
+ 'H', 'N', 'I', 'P',
+ 'H', 'N', 'I', 'T',
+ 'H', 'N', 'I', 'X',
+ 'H', 'N', 'O', 'P',
+ 'H', 'N', 'O', 'T',
+ 'H', 'N', 'O', 'X',
+ 'H', 'N', 'U', 'O',
+ 'H', 'N', 'U', 'T',
+ 'H', 'O', 'O', 'K',
+ 'H', 'O', 'O', 'N',
+ 'H', 'O', 'R', 'I',
+ 'H', 'O', 'R', 'N',
+ 'H', 'O', 'T', 'A',
+ 'H', 'O', 'U', 'R',
+ 'H', 'P', 'W', 'G',
+ 'H', 'U', 'B', '2',
+ 'H', 'U', 'L', '2',
+ 'H', 'U', 'N', 'G',
+ 'H', 'U', 'O', 'P',
+ 'H', 'U', 'O', 'T',
+ 'H', 'U', 'O', 'X',
+ 'H', 'W', 'E', 'E',
+ 'H', 'X', 'A', 'P',
+ 'H', 'X', 'A', 'T',
+ 'H', 'X', 'A', 'X',
+ 'H', 'X', 'E', 'P',
+ 'H', 'X', 'E', 'X',
+ 'H', 'X', 'I', 'E',
+ 'H', 'X', 'I', 'P',
+ 'H', 'X', 'I', 'T',
+ 'H', 'X', 'I', 'X',
+ 'H', 'X', 'O', 'P',
+ 'H', 'X', 'O', 'T',
+ 'H', 'X', 'O', 'X',
+ 'H', 'X', 'U', 'O',
+ 'H', 'X', 'W', 'G',
+ 'H', 'Z', 'W', 'G',
+ 'H', 'Z', 'Z', 'P',
+ 'H', 'Z', 'Z', 'Z',
+ 'I', '-', 'E', 'U',
+ 'I', '-', 'Y', 'A',
+ 'I', 'D', 'I', 'M',
+ 'I', 'D', 'L', 'E',
+ 'I', 'F', 'I', 'N',
+ 'I', 'L', 'U', 'T',
+ 'I', 'L', 'U', 'Y',
+ 'I', 'M', 'I', 'N',
+ 'I', 'N', 'C', 'H',
+ 'I', 'N', 'N', 'N',
+ 'I', 'N', 'T', 'I',
+ 'I', 'O', 'T', 'A',
+ 'I', 'S', 'A', 'Z',
+ 'I', 'S', 'O', 'N',
+ 'I', 'T', 'E', 'M',
+ 'I', 'U', 'J', 'A',
+ 'I', 'W', 'A', 'Z',
+ 'I', 'Z', 'H', 'E',
+ 'J', 'A', 'D', 'E',
+ 'J', 'E', 'E', 'M',
+ 'J', 'E', 'R', 'A',
+ 'J', 'H', 'A', 'N',
+ 'J', 'H', 'E', 'H',
+ 'J', 'I', 'E', 'P',
+ 'J', 'I', 'E', 'T',
+ 'J', 'I', 'E', 'X',
+ 'J', 'J', 'E', 'E',
+ 'J', 'J', 'I', 'E',
+ 'J', 'J', 'I', 'P',
+ 'J', 'J', 'I', 'T',
+ 'J', 'J', 'I', 'X',
+ 'J', 'J', 'O', 'P',
+ 'J', 'J', 'O', 'T',
+ 'J', 'J', 'O', 'X',
+ 'J', 'J', 'U', 'O',
+ 'J', 'J', 'U', 'P',
+ 'J', 'J', 'U', 'R',
+ 'J', 'J', 'U', 'T',
+ 'J', 'J', 'U', 'X',
+ 'J', 'J', 'Y', 'P',
+ 'J', 'J', 'Y', 'T',
+ 'J', 'J', 'Y', 'X',
+ 'J', 'O', 'I', 'N',
+ 'J', 'O', 'N', 'A',
+ 'J', 'O', 'N', 'G',
+ 'J', 'U', 'L', 'Y',
+ 'J', 'U', 'N', 'E',
+ 'J', 'U', 'N', 'O',
+ 'J', 'U', 'O', 'P',
+ 'J', 'U', 'O', 'T',
+ 'J', 'U', 'O', 'X',
+ 'J', 'U', 'R', 'X',
+ 'J', 'Y', 'R', 'X',
+ 'K', 'A', 'A', 'F',
+ 'K', 'A', 'A', 'I',
+ 'K', 'A', 'B', 'A',
+ 'K', 'A', 'D', '2',
+ 'K', 'A', 'D', '3',
+ 'K', 'A', 'D', '4',
+ 'K', 'A', 'D', '5',
+ 'K', 'A', 'K', 'O',
+ 'K', 'A', 'M', '2',
+ 'K', 'A', 'M', '4',
+ 'K', 'A', 'N', 'A',
+ 'K', 'A', 'N', 'G',
+ 'K', 'A', 'P', 'A',
+ 'K', 'A', 'P', 'H',
+ 'K', 'A', 'P', 'O',
+ 'K', 'A', 'T', 'O',
+ 'K', 'A', 'U', 'N',
+ 'K', 'C', 'A', 'L',
+ 'K', 'H', 'A', 'A',
+ 'K', 'H', 'A', 'H',
+ 'K', 'H', 'A', 'I',
+ 'K', 'H', 'A', 'N',
+ 'K', 'H', 'A', 'R',
+ 'K', 'H', 'E', 'E',
+ 'K', 'H', 'E', 'I',
+ 'K', 'H', 'H', 'A',
+ 'K', 'H', 'O', 'N',
+ 'K', 'H', 'O', 'T',
+ 'K', 'I', 'C', 'K',
+ 'K', 'I', 'E', 'P',
+ 'K', 'I', 'E', 'X',
+ 'K', 'I', 'N', 'G',
+ 'K', 'I', 'R', 'O',
+ 'K', 'I', 'S', 'H',
+ 'K', 'K', 'E', 'E',
+ 'K', 'O', 'E', 'T',
+ 'K', 'O', 'M', 'I',
+ 'K', 'O', 'T', 'O',
+ 'K', 'P', 'A', 'N',
+ 'K', 'P', 'E', 'E',
+ 'K', 'P', 'E', 'N',
+ 'K', 'P', 'O', 'O',
+ 'K', 'S', 'S', 'A',
+ 'K', 'U', 'N', 'G',
+ 'K', 'U', 'O', 'P',
+ 'K', 'U', 'O', 'X',
+ 'K', 'U', 'R', 'T',
+ 'K', 'U', 'R', 'X',
+ 'K', 'U', 'U', 'H',
+ 'K', 'W', 'A', 'A',
+ 'K', 'W', 'E', 'E',
+ 'K', 'W', 'I', 'I',
+ 'K', 'W', 'O', 'O',
+ 'K', 'X', 'A', 'A',
+ 'K', 'X', 'E', 'E',
+ 'K', 'X', 'W', 'A',
+ 'K', 'X', 'W', 'E',
+ 'K', 'X', 'W', 'I',
+ 'K', 'Y', 'A', 'A',
+ 'K', 'Y', 'E', 'E',
+ 'L', 'A', 'A', 'I',
+ 'L', 'A', 'A', 'N',
+ 'L', 'A', 'C', 'A',
+ 'L', 'A', 'C', 'K',
+ 'L', 'A', 'E', 'V',
+ 'L', 'A', 'G', 'U',
+ 'L', 'A', 'K', 'E',
+ 'L', 'A', 'M', 'D',
+ 'L', 'A', 'M', 'E',
+ 'L', 'A', 'S', 'T',
+ 'L', 'A', 'T', 'E',
+ 'L', 'A', 'Z', 'Y',
+ 'L', 'D', 'A', 'N',
+ 'L', 'E', 'A', 'F',
+ 'L', 'E', 'E', 'K',
+ 'L', 'E', 'F', 'T',
+ 'L', 'E', 'G', 'S',
+ 'L', 'E', 'S', 'S',
+ 'L', 'E', 'Z', 'H',
+ 'L', 'H', 'A', 'A',
+ 'L', 'H', 'A', 'G',
+ 'L', 'H', 'E', 'E',
+ 'L', 'H', 'I', 'I',
+ 'L', 'H', 'O', 'O',
+ 'L', 'I', 'E', 'P',
+ 'L', 'I', 'E', 'T',
+ 'L', 'I', 'E', 'X',
+ 'L', 'I', 'F', 'E',
+ 'L', 'I', 'L', 'Y',
+ 'L', 'I', 'N', 'E',
+ 'L', 'I', 'N', 'G',
+ 'L', 'I', 'N', 'K',
+ 'L', 'I', 'R', 'A',
+ 'L', 'I', 'S', 'H',
+ 'L', 'I', 'W', 'N',
+ 'L', 'L', 'L', 'A',
+ 'L', 'O', 'G', 'R',
+ 'L', 'O', 'L', 'L',
+ 'L', 'O', 'N', 'G',
+ 'L', 'O', 'O', 'P',
+ 'L', 'O', 'O', 'T',
+ 'L', 'U', 'I', 'S',
+ 'L', 'U', 'O', 'P',
+ 'L', 'U', 'O', 'T',
+ 'L', 'U', 'O', 'X',
+ 'L', 'U', 'R', 'X',
+ 'L', 'W', 'A', 'A',
+ 'L', 'W', 'I', 'I',
+ 'L', 'W', 'O', 'O',
+ 'L', 'Y', 'R', 'X',
+ 'M', 'A', 'A', 'I',
+ 'M', 'A', 'D', 'U',
+ 'M', 'A', 'L', 'E',
+ 'M', 'A', 'R', 'E',
+ 'M', 'A', 'R', 'K',
+ 'M', 'A', 'S', 'H',
+ 'M', 'A', 'S', 'U',
+ 'M', 'B', 'E', 'E',
+ 'M', 'B', 'O', 'O',
+ 'M', 'C', 'H', 'U',
+ 'M', 'D', 'U', 'N',
+ 'M', 'E', 'A', 'T',
+ 'M', 'E', 'E', 'M',
+ 'M', 'E', 'E', 'T',
+ 'M', 'E', 'G', 'A',
+ 'M', 'E', 'R', 'I',
+ 'M', 'E', 'S', 'H',
+ 'M', 'E', 'S', 'I',
+ 'M', 'E', 'S', 'O',
+ 'M', 'E', 'T', 'A',
+ 'M', 'G', 'A', 'P',
+ 'M', 'G', 'A', 'T',
+ 'M', 'G', 'A', 'X',
+ 'M', 'G', 'B', 'A',
+ 'M', 'G', 'B', 'E',
+ 'M', 'G', 'B', 'I',
+ 'M', 'G', 'B', 'O',
+ 'M', 'G', 'B', 'U',
+ 'M', 'G', 'E', 'P',
+ 'M', 'G', 'E', 'X',
+ 'M', 'G', 'I', 'E',
+ 'M', 'G', 'O', 'P',
+ 'M', 'G', 'O', 'T',
+ 'M', 'G', 'O', 'X',
+ 'M', 'G', 'U', 'O',
+ 'M', 'G', 'U', 'P',
+ 'M', 'G', 'U', 'R',
+ 'M', 'G', 'U', 'T',
+ 'M', 'G', 'U', 'X',
+ 'M', 'I', 'E', 'P',
+ 'M', 'I', 'E', 'X',
+ 'M', 'I', 'I', 'N',
+ 'M', 'I', 'L', 'L',
+ 'M', 'I', 'M', 'E',
+ 'M', 'I', 'N', 'Y',
+ 'M', 'I', 'R', 'I',
+ 'M', 'N', 'A', 'S',
+ 'M', 'O', 'O', 'N',
+ 'M', 'U', 'A', 'N',
+ 'M', 'U', 'C', 'H',
+ 'M', 'U', 'I', 'N',
+ 'M', 'U', 'O', 'P',
+ 'M', 'U', 'O', 'T',
+ 'M', 'U', 'O', 'X',
+ 'M', 'U', 'O', 'Y',
+ 'M', 'U', 'R', 'X',
+ 'M', 'U', 'S', 'H',
+ 'M', 'W', 'A', 'A',
+ 'M', 'W', 'E', 'E',
+ 'M', 'W', 'I', 'I',
+ 'M', 'W', 'O', 'O',
+ 'N', 'A', 'A', 'I',
+ 'N', 'A', 'G', 'A',
+ 'N', 'A', 'M', '2',
+ 'N', 'A', 'M', 'E',
+ 'N', 'A', 'N', 'A',
+ 'N', 'A', 'N', 'D',
+ 'N', 'A', 'N', 'O',
+ 'N', 'A', 'O', 'S',
+ 'N', 'A', 'U', 'D',
+ 'N', 'B', 'A', 'P',
+ 'N', 'B', 'A', 'T',
+ 'N', 'B', 'A', 'X',
+ 'N', 'B', 'I', 'E',
+ 'N', 'B', 'I', 'P',
+ 'N', 'B', 'I', 'T',
+ 'N', 'B', 'I', 'X',
+ 'N', 'B', 'O', 'P',
+ 'N', 'B', 'O', 'T',
+ 'N', 'B', 'O', 'X',
+ 'N', 'B', 'U', 'P',
+ 'N', 'B', 'U', 'R',
+ 'N', 'B', 'U', 'T',
+ 'N', 'B', 'U', 'X',
+ 'N', 'B', 'Y', 'P',
+ 'N', 'B', 'Y', 'R',
+ 'N', 'B', 'Y', 'T',
+ 'N', 'B', 'Y', 'X',
+ 'N', 'D', 'A', 'P',
+ 'N', 'D', 'A', 'T',
+ 'N', 'D', 'A', 'X',
+ 'N', 'D', 'E', 'E',
+ 'N', 'D', 'E', 'P',
+ 'N', 'D', 'E', 'X',
+ 'N', 'D', 'I', 'E',
+ 'N', 'D', 'I', 'P',
+ 'N', 'D', 'I', 'T',
+ 'N', 'D', 'I', 'X',
+ 'N', 'D', 'O', 'O',
+ 'N', 'D', 'O', 'P',
+ 'N', 'D', 'O', 'T',
+ 'N', 'D', 'O', 'X',
+ 'N', 'D', 'U', 'P',
+ 'N', 'D', 'U', 'R',
+ 'N', 'D', 'U', 'T',
+ 'N', 'D', 'U', 'X',
+ 'N', 'E', 'X', 'T',
+ 'N', 'G', 'A', 'A',
+ 'N', 'G', 'A', 'I',
+ 'N', 'G', 'A', 'N',
+ 'N', 'G', 'A', 'P',
+ 'N', 'G', 'A', 'S',
+ 'N', 'G', 'A', 'T',
+ 'N', 'G', 'A', 'X',
+ 'N', 'G', 'E', 'N',
+ 'N', 'G', 'E', 'P',
+ 'N', 'G', 'E', 'X',
+ 'N', 'G', 'G', 'A',
+ 'N', 'G', 'G', 'E',
+ 'N', 'G', 'G', 'I',
+ 'N', 'G', 'G', 'O',
+ 'N', 'G', 'G', 'U',
+ 'N', 'G', 'I', 'E',
+ 'N', 'G', 'I', 'I',
+ 'N', 'G', 'K', 'A',
+ 'N', 'G', 'O', 'N',
+ 'N', 'G', 'O', 'O',
+ 'N', 'G', 'O', 'P',
+ 'N', 'G', 'O', 'T',
+ 'N', 'G', 'O', 'X',
+ 'N', 'G', 'U', 'E',
+ 'N', 'G', 'U', 'O',
+ 'N', 'H', 'J', 'A',
+ 'N', 'H', 'U', 'E',
+ 'N', 'I', 'E', 'P',
+ 'N', 'I', 'E', 'X',
+ 'N', 'I', 'N', 'E',
+ 'N', 'I', 'O', 'N',
+ 'N', 'J', 'E', 'E',
+ 'N', 'J', 'I', 'E',
+ 'N', 'J', 'I', 'P',
+ 'N', 'J', 'I', 'T',
+ 'N', 'J', 'I', 'X',
+ 'N', 'J', 'O', 'O',
+ 'N', 'J', 'O', 'P',
+ 'N', 'J', 'O', 'T',
+ 'N', 'J', 'O', 'X',
+ 'N', 'J', 'U', 'O',
+ 'N', 'J', 'U', 'P',
+ 'N', 'J', 'U', 'R',
+ 'N', 'J', 'U', 'X',
+ 'N', 'J', 'Y', 'P',
+ 'N', 'J', 'Y', 'R',
+ 'N', 'J', 'Y', 'T',
+ 'N', 'J', 'Y', 'X',
+ 'N', 'N', 'G', 'A',
+ 'N', 'N', 'G', 'I',
+ 'N', 'N', 'G', 'O',
+ 'N', 'N', 'N', 'A',
+ 'N', 'N', 'Y', 'A',
+ 'N', 'O', 'D', 'E',
+ 'N', 'O', 'O', 'N',
+ 'N', 'O', 'S', 'E',
+ 'N', 'O', 'T', 'E',
+ 'N', 'R', 'A', 'P',
+ 'N', 'R', 'A', 'T',
+ 'N', 'R', 'A', 'X',
+ 'N', 'R', 'E', 'P',
+ 'N', 'R', 'E', 'T',
+ 'N', 'R', 'E', 'X',
+ 'N', 'R', 'O', 'P',
+ 'N', 'R', 'O', 'X',
+ 'N', 'R', 'U', 'P',
+ 'N', 'R', 'U', 'R',
+ 'N', 'R', 'U', 'T',
+ 'N', 'R', 'U', 'X',
+ 'N', 'R', 'Y', 'P',
+ 'N', 'R', 'Y', 'R',
+ 'N', 'R', 'Y', 'T',
+ 'N', 'R', 'Y', 'X',
+ 'N', 'U', '1', '1',
+ 'N', 'U', 'L', 'L',
+ 'N', 'U', 'O', 'P',
+ 'N', 'U', 'O', 'X',
+ 'N', 'U', 'R', 'X',
+ 'N', 'U', 'U', 'N',
+ 'N', 'W', 'A', 'A',
+ 'N', 'Y', 'A', 'A',
+ 'N', 'Y', 'C', 'A',
+ 'N', 'Y', 'E', 'E',
+ 'N', 'Y', 'E', 'H',
+ 'N', 'Y', 'E', 'T',
+ 'N', 'Y', 'I', 'E',
+ 'N', 'Y', 'I', 'P',
+ 'N', 'Y', 'I', 'S',
+ 'N', 'Y', 'I', 'T',
+ 'N', 'Y', 'I', 'X',
+ 'N', 'Y', 'J', 'A',
+ 'N', 'Y', 'O', 'A',
+ 'N', 'Y', 'O', 'O',
+ 'N', 'Y', 'O', 'P',
+ 'N', 'Y', 'O', 'T',
+ 'N', 'Y', 'O', 'X',
+ 'N', 'Y', 'U', 'O',
+ 'N', 'Y', 'U', 'P',
+ 'N', 'Y', 'U', 'T',
+ 'N', 'Y', 'U', 'X',
+ 'N', 'Y', 'W', 'A',
+ 'N', 'Z', 'A', 'P',
+ 'N', 'Z', 'A', 'T',
+ 'N', 'Z', 'A', 'X',
+ 'N', 'Z', 'E', 'X',
+ 'N', 'Z', 'I', 'E',
+ 'N', 'Z', 'I', 'P',
+ 'N', 'Z', 'I', 'T',
+ 'N', 'Z', 'I', 'X',
+ 'N', 'Z', 'O', 'P',
+ 'N', 'Z', 'O', 'X',
+ 'N', 'Z', 'U', 'O',
+ 'N', 'Z', 'U', 'P',
+ 'N', 'Z', 'U', 'R',
+ 'N', 'Z', 'U', 'X',
+ 'N', 'Z', 'Y', 'P',
+ 'N', 'Z', 'Y', 'R',
+ 'N', 'Z', 'Y', 'T',
+ 'N', 'Z', 'Y', 'X',
+ 'O', '-', 'E', 'O',
+ 'O', '-', 'Y', 'E',
+ 'O', 'B', 'O', 'L',
+ 'O', 'K', 'T', 'O',
+ 'O', 'N', 'S', 'U',
+ 'O', 'O', 'M', 'U',
+ 'O', 'O', 'Z', 'E',
+ 'O', 'P', 'E', 'N',
+ 'O', 'V', 'E', 'R',
+ 'O', 'X', 'I', 'A',
+ 'P', 'A', 'A', 'I',
+ 'P', 'A', 'G', 'E',
+ 'P', 'A', 'L', 'M',
+ 'P', 'A', 'N', 'G',
+ 'P', 'A', 'R', 'A',
+ 'P', 'A', 'R', 'T',
+ 'P', 'A', 'T', 'H',
+ 'P', 'A', 'W', 'N',
+ 'P', 'E', 'E', 'P',
+ 'P', 'E', 'S', 'O',
+ 'P', 'H', 'A', 'A',
+ 'P', 'H', 'A', 'N',
+ 'P', 'H', 'A', 'R',
+ 'P', 'H', 'E', 'E',
+ 'P', 'H', 'O', 'A',
+ 'P', 'H', 'U', 'R',
+ 'P', 'H', 'W', 'A',
+ 'P', 'I', 'C', 'K',
+ 'P', 'I', 'E', 'P',
+ 'P', 'I', 'E', 'X',
+ 'P', 'I', 'K', 'O',
+ 'P', 'I', 'N', 'G',
+ 'P', 'I', 'W', 'R',
+ 'P', 'L', 'A', 'K',
+ 'P', 'L', 'O', 'W',
+ 'P', 'L', 'U', 'K',
+ 'P', 'L', 'U', 'M',
+ 'P', 'L', 'U', 'S',
+ 'P', 'O', 'L', 'E',
+ 'P', 'O', 'L', 'I',
+ 'P', 'R', 'A', 'M',
+ 'P', 'U', 'N', 'G',
+ 'P', 'U', 'O', 'P',
+ 'P', 'U', 'O', 'X',
+ 'P', 'U', 'R', 'X',
+ 'P', 'W', 'A', 'A',
+ 'P', 'W', 'E', 'E',
+ 'P', 'W', 'I', 'I',
+ 'P', 'W', 'O', 'O',
+ 'P', 'Y', 'R', 'X',
+ 'Q', 'A', 'A', 'F',
+ 'Q', 'A', 'A', 'I',
+ 'Q', 'A', 'L', 'A',
+ 'Q', 'A', 'P', 'H',
+ 'Q', 'H', 'A', 'A',
+ 'Q', 'H', 'E', 'E',
+ 'Q', 'H', 'W', 'A',
+ 'Q', 'H', 'W', 'E',
+ 'Q', 'H', 'W', 'I',
+ 'Q', 'I', 'E', 'P',
+ 'Q', 'I', 'E', 'T',
+ 'Q', 'I', 'E', 'X',
+ 'Q', 'O', 'P', 'A',
+ 'Q', 'U', 'A', 'D',
+ 'Q', 'U', 'O', 'P',
+ 'Q', 'U', 'O', 'T',
+ 'Q', 'U', 'O', 'X',
+ 'Q', 'U', 'R', 'X',
+ 'Q', 'U', 'U', 'V',
+ 'Q', 'W', 'A', 'A',
+ 'Q', 'W', 'E', 'E',
+ 'Q', 'Y', 'A', 'A',
+ 'Q', 'Y', 'E', 'E',
+ 'Q', 'Y', 'R', 'X',
+ 'R', 'A', 'A', 'I',
+ 'R', 'A', 'D', 'I',
+ 'R', 'A', 'F', 'E',
+ 'R', 'A', 'I', 'N',
+ 'R', 'A', 'M', 'S',
+ 'R', 'A', 'Y', 'S',
+ 'R', 'D', 'E', 'L',
+ 'R', 'E', 'I', 'D',
+ 'R', 'E', 'M', 'U',
+ 'R', 'E', 'P', 'A',
+ 'R', 'E', 'S', 'H',
+ 'R', 'E', 'S', 'T',
+ 'R', 'G', 'Y', 'A',
+ 'R', 'I', 'A', 'L',
+ 'R', 'I', 'C', 'E',
+ 'R', 'I', 'E', 'L',
+ 'R', 'I', 'N', 'G',
+ 'R', 'I', 'R', 'A',
+ 'R', 'I', 'S', 'H',
+ 'R', 'J', 'E', 'S',
+ 'R', 'N', 'A', 'M',
+ 'R', 'O', 'A', 'R',
+ 'R', 'O', 'O', 'F',
+ 'R', 'O', 'O', 'K',
+ 'R', 'O', 'O', 'T',
+ 'R', 'O', 'S', 'H',
+ 'R', 'R', 'A', 'X',
+ 'R', 'R', 'E', 'H',
+ 'R', 'R', 'E', 'P',
+ 'R', 'R', 'E', 'T',
+ 'R', 'R', 'E', 'X',
+ 'R', 'R', 'O', 'P',
+ 'R', 'R', 'O', 'T',
+ 'R', 'R', 'O', 'X',
+ 'R', 'R', 'U', 'O',
+ 'R', 'R', 'U', 'P',
+ 'R', 'R', 'U', 'R',
+ 'R', 'R', 'U', 'T',
+ 'R', 'R', 'U', 'X',
+ 'R', 'R', 'Y', 'P',
+ 'R', 'R', 'Y', 'R',
+ 'R', 'R', 'Y', 'T',
+ 'R', 'R', 'Y', 'X',
+ 'R', 'U', 'I', 'S',
+ 'R', 'U', 'L', 'E',
+ 'R', 'U', 'O', 'P',
+ 'R', 'U', 'O', 'X',
+ 'R', 'U', 'R', 'X',
+ 'R', 'U', 'S', 'I',
+ 'R', 'W', 'A', 'A',
+ 'R', 'Y', 'R', 'X',
+ 'S', 'A', '-', 'I',
+ 'S', 'A', 'A', 'I',
+ 'S', 'A', 'D', 'E',
+ 'S', 'A', 'G', 'A',
+ 'S', 'A', 'I', 'L',
+ 'S', 'A', 'L', 'A',
+ 'S', 'A', 'L', 'T',
+ 'S', 'A', 'P', 'A',
+ 'S', 'A', 'R', 'A',
+ 'S', 'A', 'R', 'I',
+ 'S', 'B', 'U', 'B',
+ 'S', 'C', 'A', 'N',
+ 'S', 'C', 'W', 'A',
+ 'S', 'E', 'A', 'L',
+ 'S', 'E', 'E', 'N',
+ 'S', 'E', 'L', 'F',
+ 'S', 'E', 'M', 'K',
+ 'S', 'G', 'A', 'B',
+ 'S', 'G', 'A', 'W',
+ 'S', 'G', 'O', 'R',
+ 'S', 'G', 'R', 'A',
+ 'S', 'H', 'A', '3',
+ 'S', 'H', 'A', '6',
+ 'S', 'H', 'A', 'A',
+ 'S', 'H', 'A', 'D',
+ 'S', 'H', 'A', 'N',
+ 'S', 'H', 'A', 'P',
+ 'S', 'H', 'A', 'T',
+ 'S', 'H', 'A', 'X',
+ 'S', 'H', 'E', 'E',
+ 'S', 'H', 'E', 'I',
+ 'S', 'H', 'E', 'N',
+ 'S', 'H', 'E', 'P',
+ 'S', 'H', 'E', 'T',
+ 'S', 'H', 'E', 'X',
+ 'S', 'H', 'H', 'A',
+ 'S', 'H', 'I', 'D',
+ 'S', 'H', 'I', 'I',
+ 'S', 'H', 'I', 'M',
+ 'S', 'H', 'I', 'N',
+ 'S', 'H', 'I', 'P',
+ 'S', 'H', 'I', 'R',
+ 'S', 'H', 'O', 'A',
+ 'S', 'H', 'O', 'E',
+ 'S', 'H', 'O', 'G',
+ 'S', 'H', 'O', 'O',
+ 'S', 'H', 'O', 'P',
+ 'S', 'H', 'O', 'T',
+ 'S', 'H', 'O', 'X',
+ 'S', 'H', 'T', 'A',
+ 'S', 'H', 'U', '2',
+ 'S', 'H', 'U', 'O',
+ 'S', 'H', 'U', 'P',
+ 'S', 'H', 'U', 'R',
+ 'S', 'H', 'U', 'T',
+ 'S', 'H', 'U', 'X',
+ 'S', 'H', 'W', 'A',
+ 'S', 'H', 'W', 'E',
+ 'S', 'H', 'W', 'I',
+ 'S', 'H', 'W', 'O',
+ 'S', 'H', 'Y', 'A',
+ 'S', 'H', 'Y', 'P',
+ 'S', 'H', 'Y', 'R',
+ 'S', 'H', 'Y', 'T',
+ 'S', 'H', 'Y', 'X',
+ 'S', 'I', 'B', 'E',
+ 'S', 'I', 'E', 'P',
+ 'S', 'I', 'E', 'X',
+ 'S', 'I', 'G', '4',
+ 'S', 'I', 'G', 'N',
+ 'S', 'I', 'K', '2',
+ 'S', 'I', 'K', 'I',
+ 'S', 'I', 'L', 'K',
+ 'S', 'I', 'M', 'A',
+ 'S', 'I', 'N', 'E',
+ 'S', 'I', 'O', 'S',
+ 'S', 'K', 'I', 'N',
+ 'S', 'K', 'W', 'A',
+ 'S', 'L', 'U', 'R',
+ 'S', 'N', 'A', 'P',
+ 'S', 'O', 'F', 'T',
+ 'S', 'P', 'O', 'T',
+ 'S', 'P', 'W', 'A',
+ 'S', 'S', 'A', 'A',
+ 'S', 'S', 'A', 'P',
+ 'S', 'S', 'A', 'T',
+ 'S', 'S', 'A', 'X',
+ 'S', 'S', 'E', 'E',
+ 'S', 'S', 'E', 'P',
+ 'S', 'S', 'E', 'X',
+ 'S', 'S', 'I', 'E',
+ 'S', 'S', 'I', 'P',
+ 'S', 'S', 'I', 'T',
+ 'S', 'S', 'I', 'X',
+ 'S', 'S', 'O', 'P',
+ 'S', 'S', 'O', 'T',
+ 'S', 'S', 'O', 'X',
+ 'S', 'S', 'U', 'P',
+ 'S', 'S', 'U', 'T',
+ 'S', 'S', 'U', 'X',
+ 'S', 'S', 'Y', 'P',
+ 'S', 'S', 'Y', 'R',
+ 'S', 'S', 'Y', 'T',
+ 'S', 'S', 'Y', 'X',
+ 'S', 'T', 'A', 'N',
+ 'S', 'T', 'A', 'R',
+ 'S', 'T', 'E', 'M',
+ 'S', 'T', 'E', 'P',
+ 'S', 'T', 'O', 'P',
+ 'S', 'T', 'W', 'A',
+ 'S', 'U', 'D', '2',
+ 'S', 'U', 'I', 'T',
+ 'S', 'U', 'K', 'U',
+ 'S', 'U', 'N', 'G',
+ 'S', 'U', 'O', 'P',
+ 'S', 'U', 'O', 'X',
+ 'S', 'U', 'R', '9',
+ 'S', 'U', 'R', 'E',
+ 'S', 'U', 'R', 'X',
+ 'S', 'W', 'A', 'A',
+ 'S', 'W', 'I', 'I',
+ 'S', 'W', 'O', 'O',
+ 'S', 'Y', 'R', 'X',
+ 'S', 'Z', 'A', 'A',
+ 'S', 'Z', 'E', 'E',
+ 'S', 'Z', 'W', 'A',
+ 'S', 'Z', 'W', 'G',
+ 'T', 'A', 'A', 'I',
+ 'T', 'A', 'C', 'K',
+ 'T', 'A', 'I', 'L',
+ 'T', 'A', 'K', '4',
+ 'T', 'A', 'K', 'E',
+ 'T', 'A', 'L', 'L',
+ 'T', 'A', 'P', 'E',
+ 'T', 'A', 'W', 'A',
+ 'T', 'C', 'H', 'E',
+ 'T', 'E', '-', 'U',
+ 'T', 'E', 'N', 'S',
+ 'T', 'E', 'N', 'T',
+ 'T', 'E', 'N', 'U',
+ 'T', 'E', 'S', 'H',
+ 'T', 'E', 'T', 'H',
+ 'T', 'E', 'X', 'T',
+ 'T', 'H', 'A', 'A',
+ 'T', 'H', 'A', 'I',
+ 'T', 'H', 'A', 'L',
+ 'T', 'H', 'A', 'N',
+ 'T', 'H', 'E', 'E',
+ 'T', 'H', 'E', 'H',
+ 'T', 'H', 'E', 'N',
+ 'T', 'H', 'E', 'S',
+ 'T', 'H', 'E', 'Y',
+ 'T', 'H', 'I', 'I',
+ 'T', 'H', 'I', 'N',
+ 'T', 'H', 'O', 'A',
+ 'T', 'H', 'O', 'O',
+ 'T', 'H', 'W', 'A',
+ 'T', 'I', 'C', 'K',
+ 'T', 'I', 'E', 'P',
+ 'T', 'I', 'E', 'X',
+ 'T', 'I', 'L', 'E',
+ 'T', 'I', 'M', 'E',
+ 'T', 'I', 'N', 'G',
+ 'T', 'I', 'N', 'Y',
+ 'T', 'I', 'W', 'N',
+ 'T', 'L', 'E', 'E',
+ 'T', 'L', 'H', 'A',
+ 'T', 'L', 'H', 'E',
+ 'T', 'L', 'H', 'I',
+ 'T', 'L', 'H', 'O',
+ 'T', 'L', 'H', 'U',
+ 'T', 'O', 'D', 'O',
+ 'T', 'O', 'N', 'E',
+ 'T', 'O', 'N', 'G',
+ 'T', 'R', 'E', 'E',
+ 'T', 'R', 'I', 'A',
+ 'T', 'R', 'U', 'E',
+ 'T', 'S', 'A', 'A',
+ 'T', 'S', 'E', 'E',
+ 'T', 'S', 'H', 'A',
+ 'T', 'S', 'H', 'E',
+ 'T', 'S', 'S', 'E',
+ 'T', 'S', 'W', 'A',
+ 'T', 'S', 'W', 'E',
+ 'T', 'T', 'A', 'A',
+ 'T', 'T', 'E', 'E',
+ 'T', 'T', 'E', 'H',
+ 'T', 'T', 'H', 'A',
+ 'T', 'T', 'H', 'E',
+ 'T', 'T', 'H', 'I',
+ 'T', 'T', 'H', 'O',
+ 'T', 'T', 'S', 'A',
+ 'T', 'T', 'S', 'E',
+ 'T', 'T', 'S', 'I',
+ 'T', 'T', 'S', 'O',
+ 'T', 'T', 'S', 'U',
+ 'T', 'U', 'G', '2',
+ 'T', 'U', 'O', 'P',
+ 'T', 'U', 'O', 'T',
+ 'T', 'U', 'O', 'X',
+ 'T', 'U', 'R', 'N',
+ 'T', 'U', 'R', 'X',
+ 'T', 'W', 'A', 'A',
+ 'T', 'W', 'I', 'I',
+ 'T', 'W', 'O', 'O',
+ 'T', 'Y', 'P', 'E',
+ 'T', 'Z', 'A', 'A',
+ 'T', 'Z', 'E', 'E',
+ 'T', 'Z', 'I', 'R',
+ 'T', 'Z', 'O', 'A',
+ 'U', '-', 'A', 'E',
+ 'U', '-', 'Y', 'E',
+ 'U', 'A', 'T', 'H',
+ 'U', 'D', 'U', 'G',
+ 'U', 'M', 'U', 'M',
+ 'U', 'N', 'D', 'O',
+ 'U', 'N', 'I', 'T',
+ 'U', 'R', 'I', '3',
+ 'U', 'R', 'U', 'S',
+ 'U', 'R', 'U', 'Z',
+ 'U', 'S', 'E', 'D',
+ 'U', 'S', 'H', '2',
+ 'U', 'S', 'H', 'X',
+ 'U', 'S', 'S', 'U',
+ 'U', 'U', 'U', '2',
+ 'U', 'U', 'U', '3',
+ 'U', 'U', 'U', 'U',
+ 'V', 'A', 'N', 'E',
+ 'V', 'E', 'D', 'E',
+ 'V', 'E', 'N', 'D',
+ 'V', 'E', 'R', 'Y',
+ 'V', 'I', 'D', 'A',
+ 'V', 'I', 'E', 'P',
+ 'V', 'I', 'E', 'T',
+ 'V', 'I', 'E', 'X',
+ 'V', 'I', 'N', 'E',
+ 'V', 'O', 'I', 'D',
+ 'V', 'U', 'R', 'X',
+ 'V', 'Y', 'R', 'X',
+ 'W', 'A', 'E', 'N',
+ 'W', 'A', 'L', 'K',
+ 'W', 'A', 'L', 'L',
+ 'W', 'A', 'V', 'E',
+ 'W', 'A', 'V', 'Y',
+ 'W', 'E', 'E', 'N',
+ 'W', 'E', 'L', 'L',
+ 'W', 'E', 'S', 'T',
+ 'W', 'I', 'D', 'E',
+ 'W', 'I', 'N', 'D',
+ 'W', 'I', 'N', 'E',
+ 'W', 'I', 'T', 'H',
+ 'W', 'O', 'O', 'D',
+ 'W', 'O', 'O', 'L',
+ 'W', 'O', 'O', 'N',
+ 'W', 'O', 'R', 'D',
+ 'W', 'O', 'R', 'K',
+ 'W', 'R', 'A', 'P',
+ 'W', 'U', 'O', 'P',
+ 'W', 'U', 'O', 'X',
+ 'W', 'Y', 'N', 'N',
+ 'X', 'I', 'E', 'P',
+ 'X', 'I', 'E', 'T',
+ 'X', 'I', 'E', 'X',
+ 'X', 'U', 'O', 'X',
+ 'X', 'W', 'A', 'A',
+ 'X', 'W', 'E', 'E',
+ 'X', 'Y', 'A', 'A',
+ 'X', 'Y', 'E', 'E',
+ 'X', 'Y', 'R', 'X',
+ 'Y', 'A', '-', 'O',
+ 'Y', 'A', 'A', 'I',
+ 'Y', 'A', 'B', 'H',
+ 'Y', 'A', 'C', 'H',
+ 'Y', 'A', 'D', 'D',
+ 'Y', 'A', 'D', 'H',
+ 'Y', 'A', 'G', 'H',
+ 'Y', 'A', 'G', 'N',
+ 'Y', 'A', 'H', 'H',
+ 'Y', 'A', 'K', 'H',
+ 'Y', 'A', 'N', 'G',
+ 'Y', 'A', 'R', 'R',
+ 'Y', 'A', 'S', 'H',
+ 'Y', 'A', 'S', 'S',
+ 'Y', 'A', 'T', 'H',
+ 'Y', 'A', 'T', 'I',
+ 'Y', 'A', 'T', 'T',
+ 'Y', 'A', 'Z', 'H',
+ 'Y', 'A', 'Z', 'Z',
+ 'Y', 'E', 'A', 'R',
+ 'Y', 'E', 'R', 'I',
+ 'Y', 'E', 'R', 'U',
+ 'Y', 'F', 'E', 'N',
+ 'Y', 'I', '-', 'U',
+ 'Y', 'I', 'E', 'P',
+ 'Y', 'I', 'E', 'T',
+ 'Y', 'I', 'E', 'X',
+ 'Y', 'I', 'N', 'G',
+ 'Y', 'I', 'W', 'N',
+ 'Y', 'O', '-', 'I',
+ 'Y', 'O', '-', 'O',
+ 'Y', 'O', 'G', 'H',
+ 'Y', 'O', 'M', 'O',
+ 'Y', 'O', 'R', 'I',
+ 'Y', 'U', '-', 'A',
+ 'Y', 'U', '-', 'E',
+ 'Y', 'U', '-', 'I',
+ 'Y', 'U', '-', 'U',
+ 'Y', 'U', 'A', 'N',
+ 'Y', 'U', 'D', 'H',
+ 'Y', 'U', 'O', 'P',
+ 'Y', 'U', 'O', 'T',
+ 'Y', 'U', 'O', 'X',
+ 'Y', 'U', 'R', 'X',
+ 'Y', 'W', 'A', 'A',
+ 'Y', 'W', 'I', 'I',
+ 'Y', 'W', 'O', 'O',
+ 'Y', 'Y', 'R', 'X',
+ 'Z', 'A', 'I', 'N',
+ 'Z', 'A', 'M', 'X',
+ 'Z', 'A', 'T', 'A',
+ 'Z', 'E', 'R', 'O',
+ 'Z', 'E', 'T', 'A',
+ 'Z', 'H', 'A', 'A',
+ 'Z', 'H', 'A', 'P',
+ 'Z', 'H', 'A', 'R',
+ 'Z', 'H', 'A', 'T',
+ 'Z', 'H', 'A', 'X',
+ 'Z', 'H', 'E', 'E',
+ 'Z', 'H', 'E', 'P',
+ 'Z', 'H', 'E', 'T',
+ 'Z', 'H', 'E', 'X',
+ 'Z', 'H', 'O', 'O',
+ 'Z', 'H', 'O', 'P',
+ 'Z', 'H', 'O', 'T',
+ 'Z', 'H', 'O', 'X',
+ 'Z', 'H', 'U', 'O',
+ 'Z', 'H', 'U', 'P',
+ 'Z', 'H', 'U', 'R',
+ 'Z', 'H', 'U', 'T',
+ 'Z', 'H', 'U', 'X',
+ 'Z', 'H', 'W', 'A',
+ 'Z', 'H', 'W', 'E',
+ 'Z', 'H', 'Y', 'P',
+ 'Z', 'H', 'Y', 'R',
+ 'Z', 'H', 'Y', 'T',
+ 'Z', 'H', 'Y', 'X',
+ 'Z', 'I', 'D', 'A',
+ 'Z', 'I', 'E', 'P',
+ 'Z', 'I', 'E', 'X',
+ 'Z', 'I', 'Z', '2',
+ 'Z', 'U', 'O', 'P',
+ 'Z', 'U', 'O', 'X',
+ 'Z', 'U', 'R', 'X',
+ 'Z', 'Y', 'R', 'X',
+ 'Z', 'Z', 'A', 'A',
+ 'Z', 'Z', 'A', 'P',
+ 'Z', 'Z', 'A', 'T',
+ 'Z', 'Z', 'A', 'X',
+ 'Z', 'Z', 'E', 'E',
+ 'Z', 'Z', 'E', 'P',
+ 'Z', 'Z', 'E', 'X',
+ 'Z', 'Z', 'I', 'E',
+ 'Z', 'Z', 'I', 'P',
+ 'Z', 'Z', 'I', 'T',
+ 'Z', 'Z', 'I', 'X',
+ 'Z', 'Z', 'O', 'P',
+ 'Z', 'Z', 'O', 'X',
+ 'Z', 'Z', 'U', 'P',
+ 'Z', 'Z', 'U', 'R',
+ 'Z', 'Z', 'U', 'X',
+ 'Z', 'Z', 'Y', 'P',
+ 'Z', 'Z', 'Y', 'R',
+ 'Z', 'Z', 'Y', 'T',
+ 'Z', 'Z', 'Y', 'X',
+ '-', 'C', 'H', 'A', 'L',
+ '-', 'C', 'H', 'A', 'R',
+ '-', 'D', 'Z', 'U', 'D',
+ '-', 'P', 'H', 'R', 'U',
+ 'A', 'B', 'O', 'V', 'E',
+ 'A', 'C', 'U', 'T', 'E',
+ 'A', 'D', 'D', 'A', 'K',
+ 'A', 'F', 'T', 'E', 'R',
+ 'A', 'G', 'A', 'I', 'N',
+ 'A', 'G', 'O', 'G', 'I',
+ 'A', 'H', 'S', 'D', 'A',
+ 'A', 'K', 'A', 'R', 'A',
+ 'A', 'K', 'B', 'A', 'R',
+ 'A', 'L', 'A', 'P', 'H',
+ 'A', 'L', 'E', 'P', 'H',
+ 'A', 'L', 'E', 'U', 'T',
+ 'A', 'L', 'G', 'I', 'Z',
+ 'A', 'L', 'I', 'F', 'U',
+ 'A', 'L', 'L', 'A', 'H',
+ 'A', 'L', 'P', 'H', 'A',
+ 'A', 'N', 'G', 'L', 'E',
+ 'A', 'N', 'P', 'E', 'A',
+ 'A', 'N', 'S', 'H', 'E',
+ 'A', 'N', 'S', 'U', 'Z',
+ 'A', 'P', 'A', 'R', 'T',
+ 'A', 'P', 'E', 'S', 'O',
+ 'A', 'P', 'R', 'I', 'L',
+ 'A', 'R', 'A', 'E', 'A',
+ 'A', 'R', 'E', 'P', 'A',
+ 'A', 'R', 'G', 'O', 'N',
+ 'A', 'R', 'I', 'E', 'S',
+ 'A', 'R', 'K', 'A', 'B',
+ 'A', 'R', 'R', 'A', 'Y',
+ 'A', 'R', 'R', 'O', 'W',
+ 'A', 'S', 'A', 'L', '2',
+ 'A', 'T', 'N', 'A', 'H',
+ 'A', 'T', 'T', 'A', 'K',
+ 'A', 'T', 'T', 'I', 'C',
+ 'B', '1', '0', '5', 'F',
+ 'B', '1', '0', '5', 'M',
+ 'B', '1', '0', '6', 'F',
+ 'B', '1', '0', '6', 'M',
+ 'B', '1', '0', '7', 'F',
+ 'B', '1', '0', '7', 'M',
+ 'B', '1', '0', '8', 'F',
+ 'B', '1', '0', '8', 'M',
+ 'B', '1', '0', '9', 'F',
+ 'B', '1', '0', '9', 'M',
+ 'B', 'A', 'L', 'A', 'G',
+ 'B', 'A', 'R', 'A', '2',
+ 'B', 'A', 'S', 'S', 'A',
+ 'B', 'B', 'I', 'E', 'P',
+ 'B', 'B', 'I', 'E', 'T',
+ 'B', 'B', 'I', 'E', 'X',
+ 'B', 'B', 'U', 'O', 'P',
+ 'B', 'B', 'U', 'O', 'X',
+ 'B', 'B', 'U', 'R', 'X',
+ 'B', 'E', 'E', 'T', 'A',
+ 'B', 'E', 'G', 'I', 'N',
+ 'B', 'E', 'H', 'E', 'H',
+ 'B', 'E', 'I', 'T', 'H',
+ 'B', 'E', 'L', 'O', 'W',
+ 'B', 'E', 'N', 'D', 'E',
+ 'B', 'E', 'O', 'R', 'C',
+ 'B', 'H', 'E', 'T', 'H',
+ 'B', 'I', 'N', 'D', 'I',
+ 'B', 'I', 'R', 'G', 'A',
+ 'B', 'I', 'S', 'A', 'H',
+ 'B', 'L', 'A', 'C', 'K',
+ 'B', 'L', 'A', 'D', 'E',
+ 'B', 'L', 'A', 'N', 'K',
+ 'B', 'L', 'O', 'C', 'K',
+ 'B', 'L', 'O', 'O', 'D',
+ 'B', 'R', 'A', 'C', 'E',
+ 'B', 'R', 'E', 'V', 'E',
+ 'B', 'R', 'O', 'A', 'D',
+ 'B', 'R', 'U', 'S', 'H',
+ 'B', 'S', 'D', 'U', 'S',
+ 'B', 'S', 'K', 'A', '-',
+ 'B', 'S', 'K', 'U', 'R',
+ 'B', 'S', 'T', 'A', 'R',
+ 'B', 'U', 'H', 'I', 'D',
+ 'B', 'U', 'L', 'L', 'S',
+ 'B', 'U', 'L', 'U', 'G',
+ 'B', 'U', 'M', 'P', 'Y',
+ 'B', 'Z', 'U', 'N', 'G',
+ 'C', 'A', 'L', 'Y', 'A',
+ 'C', 'A', 'R', 'E', 'T',
+ 'C', 'A', 'R', 'I', 'K',
+ 'C', 'A', 'R', 'O', 'N',
+ 'C', 'A', 'U', 'D', 'A',
+ 'C', 'C', 'H', 'A', 'A',
+ 'C', 'C', 'H', 'E', 'E',
+ 'C', 'E', 'A', 'L', 'C',
+ 'C', 'E', 'C', 'E', 'K',
+ 'C', 'E', 'I', 'R', 'T',
+ 'C', 'E', 'R', 'E', 'S',
+ 'C', 'H', 'A', 'D', 'A',
+ 'C', 'H', 'A', 'I', 'R',
+ 'C', 'H', 'A', 'N', 'G',
+ 'C', 'H', 'E', 'C', 'K',
+ 'C', 'H', 'E', 'S', 'S',
+ 'C', 'H', 'I', 'K', 'I',
+ 'C', 'H', 'I', 'L', 'D',
+ 'C', 'H', 'I', 'N', 'G',
+ 'C', 'H', 'O', 'K', 'E',
+ 'C', 'H', 'R', 'O', 'A',
+ 'C', 'H', 'U', 'L', 'A',
+ 'C', 'H', 'U', 'O', 'P',
+ 'C', 'H', 'U', 'O', 'T',
+ 'C', 'H', 'U', 'O', 'X',
+ 'C', 'H', 'U', 'R', 'X',
+ 'C', 'H', 'Y', 'R', 'X',
+ 'C', 'I', 'E', 'U', 'C',
+ 'C', 'L', 'E', 'A', 'R',
+ 'C', 'L', 'I', 'C', 'K',
+ 'C', 'L', 'I', 'F', 'F',
+ 'C', 'L', 'O', 'S', 'E',
+ 'C', 'L', 'O', 'T', 'H',
+ 'C', 'L', 'O', 'U', 'D',
+ 'C', 'O', 'E', 'N', 'G',
+ 'C', 'O', 'L', 'O', 'N',
+ 'C', 'O', 'L', 'O', 'R',
+ 'C', 'O', 'M', 'E', 'T',
+ 'C', 'O', 'M', 'M', 'A',
+ 'C', 'O', 'V', 'E', 'R',
+ 'C', 'R', 'O', 'I', 'X',
+ 'C', 'R', 'O', 'S', 'S',
+ 'C', 'U', 'B', 'E', 'D',
+ 'C', 'U', 'R', 'L', 'Y',
+ 'C', 'U', 'R', 'V', 'E',
+ 'D', 'A', 'A', 'S', 'U',
+ 'D', 'A', 'E', 'N', 'G',
+ 'D', 'A', 'G', 'A', 'Z',
+ 'D', 'A', 'H', 'A', 'L',
+ 'D', 'A', 'I', 'N', 'G',
+ 'D', 'A', 'L', 'D', 'A',
+ 'D', 'A', 'L', 'E', 'T',
+ 'D', 'A', 'M', 'M', 'A',
+ 'D', 'A', 'N', 'D', 'A',
+ 'D', 'A', 'R', 'A', '3',
+ 'D', 'A', 'R', 'A', '4',
+ 'D', 'A', 'R', 'G', 'A',
+ 'D', 'A', 'S', 'I', 'A',
+ 'D', 'A', 'V', 'I', 'D',
+ 'D', 'D', 'D', 'H', 'A',
+ 'D', 'D', 'I', 'E', 'P',
+ 'D', 'D', 'I', 'E', 'X',
+ 'D', 'D', 'U', 'O', 'P',
+ 'D', 'D', 'U', 'O', 'X',
+ 'D', 'D', 'U', 'R', 'X',
+ 'D', 'E', 'A', 'T', 'H',
+ 'D', 'E', 'B', 'I', 'T',
+ 'D', 'E', 'L', 'T', 'A',
+ 'D', 'E', 'R', 'E', 'T',
+ 'D', 'E', 'U', 'N', 'G',
+ 'D', 'E', 'X', 'I', 'A',
+ 'D', 'H', 'H', 'E', 'E',
+ 'D', 'H', 'H', 'O', 'O',
+ 'D', 'I', 'F', 'A', 'T',
+ 'D', 'I', 'G', 'I', 'T',
+ 'D', 'I', 'P', 'L', 'I',
+ 'D', 'I', 'P', 'T', 'E',
+ 'D', 'I', 'T', 'T', 'O',
+ 'D', 'J', 'E', 'R', 'V',
+ 'D', 'O', 'B', 'R', 'O',
+ 'D', 'O', 'O', 'N', 'G',
+ 'D', 'O', 'U', 'B', 'T',
+ 'D', 'R', 'I', 'V', 'E',
+ 'D', 'R', 'O', 'P', 'S',
+ 'D', 'U', 'G', 'U', 'D',
+ 'D', 'Z', 'E', 'L', 'O',
+ 'E', 'A', 'G', 'L', 'E',
+ 'E', 'A', 'R', 'L', 'Y',
+ 'E', 'A', 'R', 'T', 'H',
+ 'E', 'E', 'K', 'A', 'A',
+ 'E', 'H', 'W', 'A', 'Z',
+ 'E', 'I', 'G', 'H', 'T',
+ 'E', 'J', 'E', 'C', 'T',
+ 'E', 'K', 'A', 'R', 'A',
+ 'E', 'L', 'I', 'F', 'I',
+ 'E', 'M', 'P', 'T', 'Y',
+ 'E', 'N', 'D', 'E', 'P',
+ 'E', 'N', 'T', 'E', 'R',
+ 'E', 'O', '-', 'E', 'U',
+ 'E', 'O', 'L', 'H', 'X',
+ 'E', 'Q', 'U', 'A', 'L',
+ 'E', 'Q', 'U', 'I', 'D',
+ 'E', 'R', 'A', 'S', 'E',
+ 'E', 'R', 'I', 'N', '2',
+ 'E', 'S', '-', 'T', 'E',
+ 'E', 'S', 'A', 'S', 'A',
+ 'E', 'S', 'H', '1', '6',
+ 'E', 'S', 'H', '2', '1',
+ 'E', 'S', 'H', 'E', '3',
+ 'E', 'T', 'H', 'E', 'L',
+ 'E', 'U', '-', 'E', 'U',
+ 'E', 'U', 'L', 'E', 'R',
+ 'E', 'X', 'I', 'S', 'T',
+ 'F', 'A', 'A', 'F', 'U',
+ 'F', 'A', 'I', 'H', 'U',
+ 'F', 'A', 'R', 'S', 'I',
+ 'F', 'A', 'T', 'H', 'A',
+ 'F', 'E', 'A', 'R', 'N',
+ 'F', 'E', 'E', 'N', 'G',
+ 'F', 'E', 'N', 'C', 'E',
+ 'F', 'I', 'E', 'L', 'D',
+ 'F', 'I', 'F', 'T', 'H',
+ 'F', 'I', 'F', 'T', 'Y',
+ 'F', 'I', 'G', 'H', 'T',
+ 'F', 'I', 'N', 'A', 'L',
+ 'F', 'I', 'R', 'S', 'T',
+ 'F', 'L', 'O', 'O', 'R',
+ 'F', 'L', 'U', 'T', 'E',
+ 'F', 'O', 'L', 'L', 'Y',
+ 'F', 'O', 'R', 'C', 'E',
+ 'F', 'O', 'R', 'M', 'S',
+ 'F', 'O', 'R', 'T', 'E',
+ 'F', 'O', 'R', 'T', 'Y',
+ 'F', 'R', 'A', 'M', 'E',
+ 'F', 'R', 'A', 'N', 'C',
+ 'F', 'R', 'I', 'T', 'U',
+ 'F', 'R', 'O', 'W', 'N',
+ 'G', 'A', 'A', 'F', 'U',
+ 'G', 'A', 'D', 'O', 'L',
+ 'G', 'A', 'L', 'A', 'M',
+ 'G', 'A', 'M', 'A', 'L',
+ 'G', 'A', 'M', 'L', 'A',
+ 'G', 'A', 'M', 'M', 'A',
+ 'G', 'A', 'N', 'M', 'A',
+ 'G', 'A', 'R', 'O', 'N',
+ 'G', 'E', 'S', 'H', '2',
+ 'G', 'E', 'S', 'H', 'U',
+ 'G', 'G', 'I', 'E', 'P',
+ 'G', 'G', 'I', 'E', 'X',
+ 'G', 'G', 'U', 'O', 'P',
+ 'G', 'G', 'U', 'O', 'T',
+ 'G', 'G', 'U', 'O', 'X',
+ 'G', 'G', 'U', 'R', 'X',
+ 'G', 'G', 'W', 'A', 'A',
+ 'G', 'G', 'W', 'E', 'E',
+ 'G', 'H', 'A', 'I', 'N',
+ 'G', 'H', 'O', 'S', 'T',
+ 'G', 'I', 'D', 'I', 'M',
+ 'G', 'I', 'M', 'E', 'L',
+ 'G', 'I', 'N', 'I', 'I',
+ 'G', 'I', 'S', 'A', 'L',
+ 'G', 'N', 'Y', 'I', 'S',
+ 'G', 'O', 'I', 'N', 'G',
+ 'G', 'O', 'R', 'G', 'I',
+ 'G', 'R', 'A', 'C', 'E',
+ 'G', 'R', 'A', 'I', 'N',
+ 'G', 'R', 'A', 'S', 'S',
+ 'G', 'R', 'A', 'V', 'E',
+ 'G', 'R', 'E', 'A', 'T',
+ 'G', 'R', 'E', 'E', 'K',
+ 'G', 'R', 'E', 'E', 'N',
+ 'G', 'R', 'O', 'U', 'P',
+ 'G', 'U', 'R', 'U', 'N',
+ 'H', 'A', '-', 'H', 'A',
+ 'H', 'A', 'A', 'R', 'U',
+ 'H', 'A', 'E', 'G', 'L',
+ 'H', 'A', 'I', 'T', 'U',
+ 'H', 'A', 'M', 'Z', 'A',
+ 'H', 'A', 'N', 'D', 'S',
+ 'H', 'A', 'S', 'E', 'R',
+ 'H', 'A', 'T', 'A', 'F',
+ 'H', 'A', 'T', 'H', 'I',
+ 'H', 'B', 'A', 'S', 'A',
+ 'H', 'E', 'A', 'R', 'T',
+ 'H', 'E', 'A', 'V', 'Y',
+ 'H', 'I', 'D', 'E', 'T',
+ 'H', 'I', 'E', 'U', 'H',
+ 'H', 'I', 'R', 'I', 'Q',
+ 'H', 'L', 'I', 'E', 'P',
+ 'H', 'L', 'I', 'E', 'X',
+ 'H', 'L', 'U', 'O', 'P',
+ 'H', 'L', 'U', 'O', 'X',
+ 'H', 'L', 'U', 'R', 'X',
+ 'H', 'L', 'Y', 'R', 'X',
+ 'H', 'M', 'I', 'E', 'P',
+ 'H', 'M', 'I', 'E', 'X',
+ 'H', 'M', 'U', 'O', 'P',
+ 'H', 'M', 'U', 'O', 'X',
+ 'H', 'M', 'U', 'R', 'X',
+ 'H', 'M', 'Y', 'R', 'X',
+ 'H', 'N', 'I', 'E', 'P',
+ 'H', 'N', 'I', 'E', 'T',
+ 'H', 'N', 'I', 'E', 'X',
+ 'H', 'N', 'U', 'O', 'X',
+ 'H', 'O', 'L', 'A', 'M',
+ 'H', 'O', 'O', 'R', 'U',
+ 'H', 'O', 'R', 'S', 'E',
+ 'H', 'O', 'U', 'S', 'E',
+ 'H', 'U', 'M', 'A', 'N',
+ 'H', 'U', 'R', 'A', 'N',
+ 'H', 'W', 'A', 'I', 'R',
+ 'H', 'X', 'I', 'E', 'P',
+ 'H', 'X', 'I', 'E', 'T',
+ 'H', 'X', 'I', 'E', 'X',
+ 'H', 'X', 'U', 'O', 'P',
+ 'H', 'X', 'U', 'O', 'T',
+ 'H', 'X', 'U', 'O', 'X',
+ 'H', 'Z', 'Z', 'Z', 'G',
+ 'I', 'A', 'U', 'D', 'A',
+ 'I', 'C', 'H', 'O', 'S',
+ 'I', 'C', 'H', 'O', 'U',
+ 'I', 'E', 'U', 'N', 'G',
+ 'I', 'G', 'G', 'W', 'S',
+ 'I', 'K', 'A', 'R', 'A',
+ 'I', 'M', 'A', 'G', 'E',
+ 'I', 'M', 'I', 'N', '3',
+ 'I', 'N', 'D', 'E', 'X',
+ 'I', 'N', 'N', 'E', 'R',
+ 'J', 'E', 'R', 'A', 'N',
+ 'J', 'J', 'I', 'E', 'P',
+ 'J', 'J', 'I', 'E', 'T',
+ 'J', 'J', 'I', 'E', 'X',
+ 'J', 'J', 'U', 'O', 'P',
+ 'J', 'J', 'U', 'O', 'X',
+ 'J', 'J', 'U', 'R', 'X',
+ 'J', 'O', 'K', 'E', 'R',
+ 'J', 'U', 'D', 'G', 'E',
+ 'J', 'U', 'E', 'U', 'I',
+ 'K', 'A', 'A', 'F', 'U',
+ 'K', 'A', 'I', 'R', 'I',
+ 'K', 'A', 'P', 'A', 'L',
+ 'K', 'A', 'P', 'P', 'A',
+ 'K', 'A', 'R', 'E', 'N',
+ 'K', 'A', 'S', 'R', 'A',
+ 'K', 'A', 'U', 'N', 'A',
+ 'K', 'A', 'Y', 'A', 'H',
+ 'K', 'E', 'E', 'N', 'G',
+ 'K', 'E', 'E', 'S', 'U',
+ 'K', 'E', 'H', 'E', 'H',
+ 'K', 'E', 'N', 'A', 'T',
+ 'K', 'E', 'S', 'H', '2',
+ 'K', 'E', 'T', 'T', 'I',
+ 'K', 'H', 'A', 'N', 'G',
+ 'K', 'H', 'A', 'P', 'H',
+ 'K', 'H', 'M', 'E', 'R',
+ 'K', 'H', 'U', 'A', 'T',
+ 'K', 'H', 'W', 'A', 'I',
+ 'K', 'I', 'S', 'A', 'L',
+ 'K', 'N', 'I', 'F', 'E',
+ 'K', 'O', 'M', 'B', 'U',
+ 'K', 'O', 'O', 'P', 'O',
+ 'K', 'O', 'P', 'P', 'A',
+ 'K', 'U', 'S', 'M', 'A',
+ 'K', 'X', 'W', 'A', 'A',
+ 'K', 'X', 'W', 'E', 'E',
+ 'L', 'A', 'A', 'M', 'U',
+ 'L', 'A', 'B', 'O', 'R',
+ 'L', 'A', 'G', 'A', 'B',
+ 'L', 'A', 'G', 'A', 'R',
+ 'L', 'A', 'G', 'U', 'S',
+ 'L', 'A', 'M', 'D', 'A',
+ 'L', 'A', 'M', 'E', 'D',
+ 'L', 'A', 'R', 'G', 'E',
+ 'L', 'A', 'T', 'I', 'K',
+ 'L', 'A', 'T', 'I', 'N',
+ 'L', 'A', 'U', 'L', 'A',
+ 'L', 'E', 'M', 'O', 'I',
+ 'L', 'E', 'N', 'G', 'A',
+ 'L', 'E', 'V', 'E', 'L',
+ 'L', 'I', 'B', 'R', 'A',
+ 'L', 'I', 'G', 'H', 'T',
+ 'L', 'I', 'M', 'B', 'U',
+ 'L', 'I', 'M', 'I', 'T',
+ 'L', 'I', 'M', 'M', 'U',
+ 'L', 'I', 'N', 'E', 'S',
+ 'L', 'I', 'T', 'R', 'A',
+ 'L', 'O', 'N', 'G', 'A',
+ 'L', 'O', 'T', 'U', 'S',
+ 'L', 'O', 'U', 'R', 'E',
+ 'L', 'O', 'W', '-', '9',
+ 'L', 'O', 'W', 'E', 'R',
+ 'L', 'U', 'G', 'A', 'L',
+ 'M', 'A', 'D', 'D', 'A',
+ 'M', 'A', 'H', 'H', 'A',
+ 'M', 'A', 'I', 'R', 'U',
+ 'M', 'A', 'N', 'N', 'A',
+ 'M', 'A', 'P', 'I', 'Q',
+ 'M', 'A', 'Q', 'A', 'F',
+ 'M', 'A', 'R', 'C', 'H',
+ 'M', 'A', 'S', 'H', '2',
+ 'M', 'E', 'E', 'M', 'U',
+ 'M', 'E', 'I', 'Z', 'I',
+ 'M', 'E', 'L', 'O', 'N',
+ 'M', 'E', 'T', 'A', 'L',
+ 'M', 'E', 'T', 'E', 'G',
+ 'M', 'E', 'Z', 'Z', 'O',
+ 'M', 'G', 'B', 'E', 'E',
+ 'M', 'G', 'B', 'O', 'O',
+ 'M', 'G', 'I', 'E', 'X',
+ 'M', 'G', 'U', 'O', 'P',
+ 'M', 'G', 'U', 'O', 'X',
+ 'M', 'G', 'U', 'R', 'X',
+ 'M', 'I', 'C', 'R', 'O',
+ 'M', 'I', 'E', 'U', 'M',
+ 'M', 'I', 'K', 'R', 'I',
+ 'M', 'I', 'L', 'L', 'E',
+ 'M', 'I', 'N', 'U', 'S',
+ 'M', 'I', 'R', 'E', 'D',
+ 'M', 'I', 'S', 'R', 'A',
+ 'M', 'N', 'Y', 'A', 'M',
+ 'M', 'O', 'D', 'E', 'L',
+ 'M', 'O', 'N', 'T', 'H',
+ 'M', 'O', 'U', 'N', 'D',
+ 'M', 'O', 'U', 'T', 'H',
+ 'M', 'O', 'V', 'E', 'D',
+ 'M', 'U', 'L', 'T', 'I',
+ 'M', 'U', 'N', 'A', 'H',
+ 'M', 'U', 'R', 'D', 'A',
+ 'M', 'U', 'S', 'H', '3',
+ 'M', 'U', 'S', 'I', 'C',
+ 'N', '-', 'A', 'R', 'Y',
+ 'N', 'A', 'B', 'L', 'A',
+ 'N', 'A', 'G', 'A', 'R',
+ 'N', 'A', 'G', 'R', 'I',
+ 'N', 'A', 'I', 'R', 'A',
+ 'N', 'A', 'S', 'H', 'I',
+ 'N', 'B', 'I', 'E', 'P',
+ 'N', 'B', 'I', 'E', 'X',
+ 'N', 'B', 'U', 'R', 'X',
+ 'N', 'B', 'Y', 'R', 'X',
+ 'N', 'D', 'I', 'E', 'X',
+ 'N', 'D', 'O', 'L', 'E',
+ 'N', 'D', 'U', 'R', 'X',
+ 'N', 'G', 'A', 'A', 'I',
+ 'N', 'G', 'G', 'E', 'E',
+ 'N', 'G', 'G', 'E', 'N',
+ 'N', 'G', 'G', 'O', 'O',
+ 'N', 'G', 'I', 'E', 'P',
+ 'N', 'G', 'I', 'E', 'X',
+ 'N', 'G', 'O', 'E', 'H',
+ 'N', 'G', 'U', 'O', 'T',
+ 'N', 'G', 'U', 'O', 'X',
+ 'N', 'I', 'E', 'U', 'N',
+ 'N', 'I', 'G', 'H', 'T',
+ 'N', 'I', 'S', 'A', 'G',
+ 'N', 'J', 'I', 'E', 'P',
+ 'N', 'J', 'I', 'E', 'T',
+ 'N', 'J', 'I', 'E', 'X',
+ 'N', 'J', 'U', 'O', 'X',
+ 'N', 'J', 'U', 'R', 'X',
+ 'N', 'J', 'Y', 'R', 'X',
+ 'N', 'N', 'G', 'A', 'A',
+ 'N', 'N', 'G', 'I', 'I',
+ 'N', 'N', 'G', 'O', 'O',
+ 'N', 'O', 'O', 'N', 'U',
+ 'N', 'O', 'R', 'T', 'H',
+ 'N', 'O', 'T', 'C', 'H',
+ 'N', 'O', 'T', 'E', 'S',
+ 'N', 'O', 'T', 'T', 'O',
+ 'N', 'R', 'U', 'R', 'X',
+ 'N', 'R', 'Y', 'R', 'X',
+ 'N', 'U', 'K', 'T', 'A',
+ 'N', 'U', 'N', 'U', 'Z',
+ 'N', 'Y', 'I', 'E', 'P',
+ 'N', 'Y', 'I', 'E', 'T',
+ 'N', 'Y', 'I', 'E', 'X',
+ 'N', 'Y', 'U', 'O', 'P',
+ 'N', 'Y', 'U', 'O', 'X',
+ 'N', 'Z', 'I', 'E', 'P',
+ 'N', 'Z', 'I', 'E', 'X',
+ 'N', 'Z', 'U', 'O', 'X',
+ 'N', 'Z', 'U', 'R', 'X',
+ 'N', 'Z', 'Y', 'R', 'X',
+ 'O', 'B', 'O', 'L', 'S',
+ 'O', 'G', 'H', 'A', 'M',
+ 'O', 'J', 'E', 'O', 'N',
+ 'O', 'K', 'A', 'R', 'A',
+ 'O', 'L', 'I', 'V', 'E',
+ 'O', 'M', 'E', 'G', 'A',
+ 'O', 'N', 'K', 'A', 'R',
+ 'O', 'R', 'I', 'Y', 'A',
+ 'O', 'T', 'H', 'A', 'L',
+ 'O', 'U', 'N', 'C', 'E',
+ 'O', 'U', 'T', 'E', 'R',
+ 'O', 'X', 'E', 'I', 'A',
+ 'P', 'A', 'A', 'T', 'U',
+ 'P', 'A', 'D', 'M', 'A',
+ 'P', 'A', 'N', 'T', 'I',
+ 'P', 'A', 'P', 'E', 'R',
+ 'P', 'A', 'S', 'E', 'Q',
+ 'P', 'A', 'S', 'U', 'Q',
+ 'P', 'A', 'T', 'A', 'H',
+ 'P', 'A', 'T', 'A', 'K',
+ 'P', 'A', 'Z', 'E', 'R',
+ 'P', 'E', 'A', 'C', 'E',
+ 'P', 'E', 'D', 'A', 'L',
+ 'P', 'E', 'E', 'Z', 'I',
+ 'P', 'E', 'H', 'E', 'H',
+ 'P', 'E', 'I', 'T', 'H',
+ 'P', 'E', 'N', 'N', 'Y',
+ 'P', 'E', 'N', 'S', 'U',
+ 'P', 'E', 'P', 'E', 'T',
+ 'P', 'E', 'S', 'H', '2',
+ 'P', 'H', 'U', 'N', 'G',
+ 'P', 'I', 'A', 'N', 'O',
+ 'P', 'I', 'E', 'C', 'E',
+ 'P', 'I', 'E', 'U', 'P',
+ 'P', 'I', 'R', 'I', 'G',
+ 'P', 'L', 'A', 'C', 'E',
+ 'P', 'L', 'A', 'N', 'E',
+ 'P', 'L', 'U', 'T', 'O',
+ 'P', 'O', 'I', 'N', 'T',
+ 'P', 'O', 'N', 'D', 'O',
+ 'P', 'O', 'U', 'N', 'D',
+ 'P', 'O', 'W', 'E', 'R',
+ 'P', 'R', 'I', 'M', 'E',
+ 'P', 'R', 'I', 'N', 'T',
+ 'P', 'R', 'O', 'O', 'F',
+ 'P', 'R', 'O', 'V', 'E',
+ 'P', 'S', 'I', 'L', 'I',
+ 'Q', 'A', 'A', 'F', 'U',
+ 'Q', 'A', 'D', 'M', 'A',
+ 'Q', 'A', 'T', 'A', 'N',
+ 'Q', 'H', 'W', 'A', 'A',
+ 'Q', 'H', 'W', 'E', 'E',
+ 'Q', 'U', 'E', 'E', 'N',
+ 'Q', 'U', 'I', 'L', 'L',
+ 'Q', 'U', 'O', 'T', 'E',
+ 'R', 'A', 'I', 'D', 'A',
+ 'R', 'A', 'I', 'D', 'O',
+ 'R', 'A', 'N', 'G', 'E',
+ 'R', 'A', 'S', 'H', 'A',
+ 'R', 'A', 'T', 'I', 'O',
+ 'R', 'B', 'A', 'S', 'A',
+ 'R', 'E', 'A', 'C', 'H',
+ 'R', 'E', 'L', 'A', 'A',
+ 'R', 'E', 'V', 'I', 'A',
+ 'R', 'E', 'V', 'M', 'A',
+ 'R', 'G', 'Y', 'A', 'N',
+ 'R', 'I', 'C', 'E', 'M',
+ 'R', 'I', 'E', 'U', 'L',
+ 'R', 'I', 'G', 'H', 'T',
+ 'R', 'I', 'T', 'S', 'I',
+ 'R', 'I', 'V', 'E', 'R',
+ 'R', 'N', 'O', 'O', 'N',
+ 'R', 'O', 'B', 'A', 'T',
+ 'R', 'O', 'M', 'A', 'N',
+ 'R', 'O', 'U', 'N', 'D',
+ 'R', 'R', 'U', 'O', 'X',
+ 'R', 'R', 'U', 'R', 'X',
+ 'R', 'R', 'Y', 'R', 'X',
+ 'R', 'T', 'A', 'G', 'S',
+ 'R', 'U', 'M', 'A', 'I',
+ 'R', 'U', 'N', 'I', 'C',
+ 'R', 'U', 'P', 'E', 'E',
+ 'R', 'U', 'P', 'I', 'I',
+ 'R', 'W', 'A', 'H', 'A',
+ 'S', 'A', 'D', 'H', 'E',
+ 'S', 'A', 'F', 'H', 'A',
+ 'S', 'A', 'L', 'A', 'M',
+ 'S', 'A', 'L', 'L', 'A',
+ 'S', 'A', 'M', 'K', 'A',
+ 'S', 'A', 'M', 'P', 'I',
+ 'S', 'A', 'N', 'A', 'H',
+ 'S', 'A', 'S', 'A', 'K',
+ 'S', 'A', 'U', 'I', 'L',
+ 'S', 'B', 'R', 'U', 'L',
+ 'S', 'C', 'H', 'W', 'A',
+ 'S', 'D', 'O', 'N', 'G',
+ 'S', 'E', 'E', 'N', 'U',
+ 'S', 'E', 'G', 'N', 'O',
+ 'S', 'E', 'G', 'O', 'L',
+ 'S', 'E', 'N', 'T', 'I',
+ 'S', 'E', 'N', 'T', 'O',
+ 'S', 'E', 'V', 'E', 'N',
+ 'S', 'H', 'A', 'B', '6',
+ 'S', 'H', 'A', 'D', 'E',
+ 'S', 'H', 'A', 'N', 'G',
+ 'S', 'H', 'A', 'R', '2',
+ 'S', 'H', 'A', 'R', 'P',
+ 'S', 'H', 'A', 'R', 'U',
+ 'S', 'H', 'C', 'H', 'A',
+ 'S', 'H', 'E', 'E', 'N',
+ 'S', 'H', 'E', 'E', 'P',
+ 'S', 'H', 'E', 'G', '9',
+ 'S', 'H', 'E', 'L', 'F',
+ 'S', 'H', 'E', 'L', 'L',
+ 'S', 'H', 'E', 'S', 'H',
+ 'S', 'H', 'E', 'V', 'A',
+ 'S', 'H', 'I', 'F', 'T',
+ 'S', 'H', 'I', 'I', 'N',
+ 'S', 'H', 'I', 'M', 'A',
+ 'S', 'H', 'I', 'T', 'A',
+ 'S', 'H', 'O', 'G', 'I',
+ 'S', 'H', 'O', 'O', 'T',
+ 'S', 'H', 'O', 'R', 'T',
+ 'S', 'H', 'U', 'O', 'P',
+ 'S', 'H', 'U', 'O', 'X',
+ 'S', 'H', 'U', 'R', 'X',
+ 'S', 'H', 'W', 'A', 'A',
+ 'S', 'H', 'W', 'I', 'I',
+ 'S', 'H', 'W', 'O', 'O',
+ 'S', 'H', 'Y', 'R', 'X',
+ 'S', 'I', 'G', 'E', 'L',
+ 'S', 'I', 'G', 'M', 'A',
+ 'S', 'I', 'G', 'N', 'S',
+ 'S', 'I', 'L', 'A', '3',
+ 'S', 'I', 'X', 'T', 'H',
+ 'S', 'I', 'X', 'T', 'Y',
+ 'S', 'K', 'U', 'L', 'L',
+ 'S', 'L', 'A', 'S', 'H',
+ 'S', 'L', 'A', 'V', 'E',
+ 'S', 'L', 'I', 'C', 'E',
+ 'S', 'L', 'I', 'N', 'G',
+ 'S', 'L', 'O', 'P', 'E',
+ 'S', 'L', 'O', 'V', 'O',
+ 'S', 'M', 'A', 'L', 'L',
+ 'S', 'M', 'A', 'S', 'H',
+ 'S', 'M', 'E', 'A', 'R',
+ 'S', 'M', 'I', 'L', 'E',
+ 'S', 'N', 'A', 'K', 'E',
+ 'S', 'N', 'O', 'U', 'T',
+ 'S', 'O', 'U', 'N', 'D',
+ 'S', 'O', 'U', 'T', 'H',
+ 'S', 'P', 'A', 'C', 'E',
+ 'S', 'P', 'A', 'D', 'E',
+ 'S', 'P', 'E', 'A', 'R',
+ 'S', 'P', 'I', 'C', 'E',
+ 'S', 'P', 'O', 'O', 'N',
+ 'S', 'Q', 'U', 'A', 'T',
+ 'S', 'S', 'I', 'E', 'P',
+ 'S', 'S', 'I', 'E', 'X',
+ 'S', 'S', 'Y', 'R', 'X',
+ 'S', 'T', 'A', 'F', 'F',
+ 'S', 'T', 'A', 'N', 'D',
+ 'S', 'T', 'A', 'R', 'K',
+ 'S', 'T', 'A', 'R', 'T',
+ 'S', 'T', 'E', 'A', 'M',
+ 'S', 'T', 'I', 'L', 'E',
+ 'S', 'T', 'I', 'L', 'L',
+ 'S', 'T', 'O', 'C', 'K',
+ 'S', 'T', 'O', 'N', 'E',
+ 'S', 'T', 'O', 'V', 'E',
+ 'S', 'T', 'U', 'D', 'Y',
+ 'S', 'U', 'H', 'U', 'R',
+ 'S', 'U', 'K', 'U', 'N',
+ 'S', 'W', 'A', 'S', 'H',
+ 'S', 'W', 'E', 'E', 'T',
+ 'S', 'W', 'O', 'R', 'D',
+ 'S', 'W', 'U', 'N', 'G',
+ 'S', 'Y', 'R', 'M', 'A',
+ 'T', 'A', 'B', 'L', 'E',
+ 'T', 'A', 'M', 'I', 'L',
+ 'T', 'A', 'P', 'E', 'R',
+ 'T', 'C', 'H', 'E', 'H',
+ 'T', 'E', 'G', 'E', 'H',
+ 'T', 'E', 'H', 'E', 'H',
+ 'T', 'E', 'I', 'W', 'S',
+ 'T', 'E', 'V', 'I', 'R',
+ 'T', 'H', 'E', 'M', 'A',
+ 'T', 'H', 'E', 'R', 'E',
+ 'T', 'H', 'E', 'T', 'A',
+ 'T', 'H', 'I', 'G', 'H',
+ 'T', 'H', 'I', 'R', 'D',
+ 'T', 'H', 'I', 'T', 'A',
+ 'T', 'H', 'O', 'N', 'G',
+ 'T', 'H', 'O', 'R', 'N',
+ 'T', 'H', 'R', 'E', 'E',
+ 'T', 'H', 'U', 'N', 'G',
+ 'T', 'H', 'U', 'R', 'S',
+ 'T', 'H', 'W', 'A', 'A',
+ 'T', 'I', 'A', 'R', 'A',
+ 'T', 'I', 'G', 'E', 'R',
+ 'T', 'I', 'G', 'H', 'T',
+ 'T', 'I', 'L', 'D', 'E',
+ 'T', 'I', 'M', 'E', 'S',
+ 'T', 'I', 'N', 'N', 'E',
+ 'T', 'I', 'P', 'P', 'I',
+ 'T', 'I', 'T', 'L', 'O',
+ 'T', 'I', 'W', 'A', 'Z',
+ 'T', 'L', 'H', 'E', 'E',
+ 'T', 'O', 'N', 'A', 'L',
+ 'T', 'O', 'N', 'O', 'S',
+ 'T', 'O', 'O', 'T', 'H',
+ 'T', 'O', 'T', 'A', 'L',
+ 'T', 'R', 'A', 'C', 'K',
+ 'T', 'R', 'A', 'D', 'E',
+ 'T', 'R', 'I', 'O', 'N',
+ 'T', 'R', 'U', 'N', 'K',
+ 'T', 'R', 'U', 'T', 'H',
+ 'T', 'S', 'A', 'D', 'I',
+ 'T', 'S', 'E', 'R', 'E',
+ 'T', 'S', 'H', 'E', 'G',
+ 'T', 'S', 'H', 'E', 'S',
+ 'T', 'T', 'S', 'E', 'E',
+ 'T', 'T', 'T', 'H', 'A',
+ 'T', 'U', 'N', 'N', 'Y',
+ 'T', 'U', 'R', 'O', '2',
+ 'T', 'U', 'U', 'M', 'U',
+ 'U', 'D', 'A', 'A', 'T',
+ 'U', 'K', 'A', 'R', 'A',
+ 'U', 'M', 'B', 'I', 'N',
+ 'U', 'N', 'C', 'I', 'A',
+ 'U', 'N', 'D', 'E', 'R',
+ 'U', 'N', 'I', 'O', 'N',
+ 'U', 'N', 'I', 'T', 'Y',
+ 'U', 'P', 'P', 'E', 'R',
+ 'U', 'R', 'U', 'D', 'A',
+ 'U', 'S', 'S', 'U', '3',
+ 'U', 'T', 'U', 'K', 'I',
+ 'V', 'A', 'A', 'V', 'U',
+ 'V', 'A', 'R', 'I', 'A',
+ 'V', 'A', 'R', 'Y', 'S',
+ 'V', 'A', 'S', 'I', 'S',
+ 'V', 'A', 'T', 'H', 'Y',
+ 'V', 'E', 'R', 'G', 'E',
+ 'V', 'E', 'R', 'S', 'E',
+ 'V', 'E', 'S', 'T', 'A',
+ 'V', 'I', 'R', 'G', 'A',
+ 'V', 'I', 'R', 'G', 'O',
+ 'V', 'O', 'C', 'A', 'L',
+ 'V', 'O', 'W', 'E', 'L',
+ 'V', 'Z', 'M', 'E', 'T',
+ 'W', 'A', 'A', 'V', 'U',
+ 'W', 'A', 'S', 'L', 'A',
+ 'W', 'A', 'T', 'C', 'H',
+ 'W', 'A', 'T', 'E', 'R',
+ 'W', 'A', 'T', 'T', 'O',
+ 'W', 'H', 'E', 'A', 'T',
+ 'W', 'H', 'E', 'E', 'L',
+ 'W', 'H', 'I', 'T', 'E',
+ 'W', 'H', 'O', 'L', 'E',
+ 'W', 'I', 'D', 'T', 'H',
+ 'W', 'I', 'N', 'D', 'U',
+ 'W', 'I', 'N', 'J', 'A',
+ 'W', 'O', 'M', 'A', 'N',
+ 'W', 'R', 'O', 'N', 'G',
+ 'W', 'U', 'N', 'J', 'O',
+ 'X', 'I', 'R', 'O', 'N',
+ 'Y', 'A', '-', 'Y', 'O',
+ 'Y', 'A', 'A', 'D', 'O',
+ 'Y', 'A', 'A', 'R', 'U',
+ 'Y', 'A', 'D', 'D', 'H',
+ 'Y', 'A', 'G', 'H', 'H',
+ 'Y', 'A', 'K', 'H', 'H',
+ 'Y', 'E', 'O', '-', 'O',
+ 'Y', 'E', 'O', '-', 'U',
+ 'Y', 'E', 'R', 'A', 'H',
+ 'Y', 'E', 'S', 'T', 'U',
+ 'Y', 'E', 'T', 'I', 'V',
+ 'Y', 'I', 'Z', 'E', 'T',
+ 'Y', 'O', '-', 'Y', 'A',
+ 'Y', 'U', '-', 'E', 'O',
+ 'Y', 'U', '-', 'Y', 'E',
+ 'Z', 'A', 'Q', 'E', 'F',
+ 'Z', 'A', 'R', 'Q', 'A',
+ 'Z', 'A', 'Y', 'I', 'N',
+ 'Z', 'H', 'A', 'I', 'N',
+ 'Z', 'H', 'U', 'O', 'P',
+ 'Z', 'H', 'U', 'O', 'X',
+ 'Z', 'H', 'U', 'R', 'X',
+ 'Z', 'H', 'Y', 'R', 'X',
+ 'Z', 'I', 'L', 'D', 'E',
+ 'Z', 'I', 'N', 'O', 'R',
+ 'Z', 'L', 'A', 'M', 'A',
+ 'Z', 'U', 'B', 'U', 'R',
+ 'Z', 'Y', 'G', 'O', 'S',
+ 'Z', 'Z', 'I', 'E', 'P',
+ 'Z', 'Z', 'I', 'E', 'T',
+ 'Z', 'Z', 'I', 'E', 'X',
+ 'Z', 'Z', 'U', 'R', 'X',
+ 'Z', 'Z', 'Y', 'R', 'X',
+ '-', 'K', 'H', 'Y', 'I', 'L',
+ '-', 'K', 'H', 'Y', 'U', 'D',
+ 'A', 'C', 'C', 'E', 'N', 'T',
+ 'A', 'E', 'G', 'E', 'A', 'N',
+ 'A', 'I', 'H', 'V', 'U', 'S',
+ 'A', 'I', 'K', 'A', 'R', 'A',
+ 'A', 'L', 'A', 'Y', 'H', 'E',
+ 'A', 'L', 'M', 'O', 'S', 'T',
+ 'A', 'M', 'O', 'U', 'N', 'T',
+ 'A', 'N', 'C', 'H', 'O', 'R',
+ 'A', 'N', 'C', 'O', 'R', 'A',
+ 'A', 'P', 'A', 'A', 'T', 'O',
+ 'A', 'P', 'L', 'O', 'U', 'N',
+ 'A', 'R', 'A', 'B', 'I', 'C',
+ 'A', 'R', 'A', 'E', 'A', 'E',
+ 'A', 'R', 'L', 'A', 'U', 'G',
+ 'A', 'R', 'M', 'O', 'U', 'R',
+ 'A', 'R', 'O', 'U', 'N', 'D',
+ 'A', 'R', 'O', 'U', 'R', 'A',
+ 'A', 'R', 'R', 'I', 'V', 'E',
+ 'A', 'R', 'R', 'O', 'W', 'S',
+ 'A', 'R', 'S', 'E', 'O', 'S',
+ 'A', 'R', 'T', 'A', 'B', 'E',
+ 'A', 'R', 'U', 'H', 'U', 'A',
+ 'A', 'S', 'C', 'E', 'N', 'T',
+ 'A', 'S', 'H', 'G', 'A', 'B',
+ 'A', 'S', 'Y', 'U', 'R', 'A',
+ 'A', 'U', 'G', 'U', 'S', 'T',
+ 'A', 'U', 'T', 'U', 'M', 'N',
+ 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'B', 'A', 'D', 'G', 'E', 'R',
+ 'B', 'A', 'H', 'A', 'R', '2',
+ 'B', 'A', 'I', 'M', 'A', 'I',
+ 'B', 'A', 'L', 'L', 'O', 'T',
+ 'B', 'A', 'L', 'U', 'D', 'A',
+ 'B', 'A', 'M', 'B', 'O', 'O',
+ 'B', 'A', 'N', 'T', 'O', 'C',
+ 'B', 'A', 'R', 'L', 'E', 'Y',
+ 'B', 'A', 'R', 'R', 'E', 'D',
+ 'B', 'A', 'R', 'R', 'E', 'E',
+ 'B', 'E', 'A', 'M', 'E', 'D',
+ 'B', 'E', 'F', 'O', 'R', 'E',
+ 'B', 'E', 'R', 'B', 'E', 'R',
+ 'B', 'E', 'S', 'I', 'D', 'E',
+ 'B', 'E', 'Y', 'Y', 'A', 'L',
+ 'B', 'I', 'N', 'A', 'R', 'Y',
+ 'B', 'I', 'S', 'H', 'O', 'P',
+ 'B', 'I', 'T', 'I', 'N', 'G',
+ 'B', 'I', 'T', 'T', 'E', 'R',
+ 'B', 'O', 'R', 'U', 'T', 'O',
+ 'B', 'O', 'T', 'T', 'O', 'M',
+ 'B', 'O', 'W', 'T', 'I', 'E',
+ 'B', 'R', 'A', 'N', 'C', 'H',
+ 'B', 'R', 'E', 'A', 'T', 'H',
+ 'B', 'R', 'E', 'V', 'I', 'S',
+ 'B', 'R', 'I', 'D', 'G', 'E',
+ 'B', 'R', 'O', 'K', 'E', 'N',
+ 'B', 'R', 'O', 'N', 'Z', 'E',
+ 'B', 'U', 'C', 'K', 'L', 'E',
+ 'B', 'U', 'L', 'L', 'E', 'T',
+ 'C', 'A', 'M', 'N', 'U', 'C',
+ 'C', 'A', 'N', 'C', 'E', 'L',
+ 'C', 'A', 'N', 'C', 'E', 'R',
+ 'C', 'A', 'N', 'D', 'R', 'A',
+ 'C', 'A', 'R', 'I', 'A', 'N',
+ 'C', 'A', 'T', 'A', 'W', 'A',
+ 'C', 'E', 'N', 'T', 'R', 'E',
+ 'C', 'E', 'R', '-', 'W', 'A',
+ 'C', 'H', 'A', 'M', 'K', 'O',
+ 'C', 'H', 'A', 'N', 'G', 'E',
+ 'C', 'H', 'I', 'L', 'L', 'U',
+ 'C', 'H', 'I', 'R', 'E', 'T',
+ 'C', 'H', 'I', 'R', 'O', 'N',
+ 'C', 'H', 'R', 'I', 'V', 'I',
+ 'C', 'H', 'R', 'O', 'M', 'A',
+ 'C', 'H', 'U', 'R', 'C', 'H',
+ 'C', 'I', 'R', 'C', 'L', 'E',
+ 'C', 'L', 'E', 'F', '-', '1',
+ 'C', 'L', 'E', 'F', '-', '2',
+ 'C', 'L', 'I', 'V', 'I', 'S',
+ 'C', 'L', 'O', 'S', 'E', 'D',
+ 'C', 'O', 'F', 'F', 'I', 'N',
+ 'C', 'O', 'L', 'U', 'M', 'N',
+ 'C', 'O', 'M', 'I', 'N', 'G',
+ 'C', 'O', 'M', 'M', 'O', 'N',
+ 'C', 'O', 'P', 'T', 'I', 'C',
+ 'C', 'O', 'R', 'N', 'E', 'R',
+ 'C', 'O', 'R', 'P', 'S', 'E',
+ 'C', 'R', 'E', 'D', 'I', 'T',
+ 'C', 'U', 'R', 'V', 'E', 'D',
+ 'D', 'A', 'A', 'D', 'H', 'U',
+ 'D', 'A', 'G', 'E', 'S', 'H',
+ 'D', 'A', 'G', 'G', 'E', 'R',
+ 'D', 'A', 'L', 'A', 'T', 'H',
+ 'D', 'A', 'M', 'A', 'R', 'U',
+ 'D', 'A', 'S', 'E', 'I', 'A',
+ 'D', 'A', 'S', 'H', 'E', 'D',
+ 'D', 'D', 'A', 'H', 'A', 'L',
+ 'D', 'E', 'G', 'R', 'E', 'E',
+ 'D', 'E', 'L', 'E', 'T', 'E',
+ 'D', 'E', 'N', 'N', 'E', 'N',
+ 'D', 'E', 'N', 'T', 'A', 'L',
+ 'D', 'E', 'V', 'I', 'C', 'E',
+ 'D', 'H', 'A', 'A', 'L', 'U',
+ 'D', 'H', 'A', 'R', 'M', 'A',
+ 'D', 'I', 'E', 'S', 'I', 'S',
+ 'D', 'I', 'G', 'R', 'A', 'M',
+ 'D', 'I', 'P', 'P', 'E', 'R',
+ 'D', 'I', 'R', 'E', 'C', 'T',
+ 'D', 'I', 'V', 'I', 'D', 'E',
+ 'D', 'J', 'E', 'R', 'V', 'I',
+ 'D', 'O', 'L', 'I', 'U', 'M',
+ 'D', 'O', 'L', 'L', 'A', 'R',
+ 'D', 'O', 'M', 'A', 'I', 'N',
+ 'D', 'O', 'M', 'I', 'N', 'O',
+ 'D', 'O', 'T', 'S', '-', '1',
+ 'D', 'O', 'T', 'S', '-', '2',
+ 'D', 'O', 'T', 'S', '-', '3',
+ 'D', 'O', 'T', 'S', '-', '4',
+ 'D', 'O', 'T', 'S', '-', '5',
+ 'D', 'O', 'T', 'S', '-', '6',
+ 'D', 'O', 'T', 'S', '-', '7',
+ 'D', 'O', 'T', 'S', '-', '8',
+ 'D', 'O', 'T', 'T', 'E', 'D',
+ 'D', 'O', 'U', 'B', 'L', 'E',
+ 'D', 'R', 'A', 'G', 'O', 'N',
+ 'D', 'U', 'T', 'I', 'E', 'S',
+ 'E', 'I', 'G', 'H', 'T', 'H',
+ 'E', 'I', 'G', 'H', 'T', 'Y',
+ 'E', 'L', 'E', 'V', 'E', 'N',
+ 'E', 'N', 'D', 'I', 'N', 'G',
+ 'E', 'Q', 'U', 'A', 'L', 'S',
+ 'E', 'S', 'C', 'A', 'P', 'E',
+ 'E', 'T', 'E', 'R', 'O', 'N',
+ 'E', 'X', 'C', 'E', 'S', 'S',
+ 'E', 'X', 'I', 'S', 'T', 'S',
+ 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'F', 'A', 'C', 'E', '-', '1',
+ 'F', 'A', 'C', 'E', '-', '2',
+ 'F', 'A', 'C', 'E', '-', '3',
+ 'F', 'A', 'C', 'E', '-', '4',
+ 'F', 'A', 'C', 'E', '-', '5',
+ 'F', 'A', 'C', 'E', '-', '6',
+ 'F', 'A', 'C', 'T', 'O', 'R',
+ 'F', 'A', 'M', 'I', 'L', 'Y',
+ 'F', 'A', 'T', 'H', 'E', 'R',
+ 'F', 'E', 'M', 'A', 'L', 'E',
+ 'F', 'H', 'T', 'O', 'R', 'A',
+ 'F', 'I', 'F', 'T', 'H', 'S',
+ 'F', 'I', 'G', 'U', 'R', 'E',
+ 'F', 'I', 'L', 'L', 'E', 'D',
+ 'F', 'I', 'L', 'L', 'E', 'R',
+ 'F', 'I', 'N', 'I', 'T', 'E',
+ 'F', 'L', 'A', 'G', '-', '1',
+ 'F', 'L', 'A', 'G', '-', '2',
+ 'F', 'L', 'A', 'G', '-', '3',
+ 'F', 'L', 'A', 'G', '-', '4',
+ 'F', 'L', 'A', 'G', '-', '5',
+ 'F', 'L', 'E', 'X', 'U', 'S',
+ 'F', 'L', 'I', 'G', 'H', 'T',
+ 'F', 'L', 'O', 'R', 'A', 'L',
+ 'F', 'L', 'O', 'W', 'E', 'R',
+ 'F', 'O', 'R', 'C', 'E', 'S',
+ 'F', 'O', 'R', 'K', 'E', 'D',
+ 'F', 'O', 'U', 'R', 'T', 'H',
+ 'F', 'R', 'E', 'N', 'C', 'H',
+ 'F', 'T', 'H', 'O', 'R', 'A',
+ 'G', 'A', 'N', 'G', 'I', 'A',
+ 'G', 'A', 'P', 'P', 'E', 'D',
+ 'G', 'A', 'S', 'H', 'A', 'N',
+ 'G', 'E', 'D', 'O', 'L', 'A',
+ 'G', 'E', 'M', 'I', 'N', 'I',
+ 'G', 'E', 'N', 'I', 'K', 'I',
+ 'G', 'E', 'N', 'T', 'L', 'E',
+ 'G', 'E', 'R', 'E', 'S', 'H',
+ 'G', 'E', 'R', 'M', 'A', 'N',
+ 'G', 'H', 'A', 'I', 'N', 'U',
+ 'G', 'H', 'A', 'M', 'A', 'L',
+ 'G', 'H', 'U', 'N', 'N', 'A',
+ 'G', 'L', 'E', 'I', 'C', 'H',
+ 'G', 'O', 'R', 'G', 'O', 'N',
+ 'G', 'O', 'T', 'H', 'I', 'C',
+ 'G', 'R', 'A', 'M', 'M', 'A',
+ 'G', 'R', 'A', 'T', 'E', 'R',
+ 'G', 'R', 'O', 'U', 'N', 'D',
+ 'G', 'U', 'R', 'A', 'M', 'U',
+ 'G', 'U', 'R', 'U', 'S', 'H',
+ 'H', '-', 'T', 'Y', 'P', 'E',
+ 'H', 'A', 'F', 'U', 'K', 'H',
+ 'H', 'A', 'G', 'L', 'A', 'Z',
+ 'H', 'A', 'M', 'M', 'E', 'R',
+ 'H', 'A', 'N', 'G', 'U', 'L',
+ 'H', 'E', 'A', 'D', 'E', 'D',
+ 'H', 'E', 'A', 'V', 'E', 'N',
+ 'H', 'E', 'B', 'R', 'E', 'W',
+ 'H', 'E', 'I', 'S', 'E', 'I',
+ 'H', 'E', 'L', 'M', 'E', 'T',
+ 'H', 'E', 'R', 'M', 'E', 'S',
+ 'H', 'E', 'R', 'U', 'T', 'U',
+ 'H', 'I', 'D', 'I', 'N', 'G',
+ 'H', 'U', 'I', 'I', 'T', 'O',
+ 'H', 'Y', 'P', 'H', 'E', 'N',
+ 'I', '-', 'B', 'E', 'A', 'M',
+ 'I', 'L', 'I', 'M', 'M', 'U',
+ 'I', 'N', 'G', 'W', 'A', 'Z',
+ 'I', 'N', 'I', 'N', 'G', 'U',
+ 'I', 'N', 'S', 'E', 'C', 'T',
+ 'I', 'N', 'S', 'I', 'D', 'E',
+ 'I', 'S', 'A', 'K', 'I', 'A',
+ 'I', 'S', 'S', 'H', 'A', 'R',
+ 'I', 'T', 'A', 'L', 'I', 'C',
+ 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'J', 'O', 'I', 'N', 'E', 'D',
+ 'J', 'O', 'I', 'N', 'E', 'R',
+ 'J', 'O', 'Y', 'O', 'U', 'S',
+ 'K', 'A', 'N', 'A', 'K', 'O',
+ 'K', 'A', 'N', 'G', 'X', 'I',
+ 'K', 'A', 'S', 'K', 'A', 'L',
+ 'K', 'A', 'T', 'A', 'V', 'A',
+ 'K', 'A', 'V', 'Y', 'K', 'A',
+ 'K', 'A', 'Z', 'A', 'K', 'H',
+ 'K', 'E', 'F', 'U', 'L', 'A',
+ 'K', 'E', 'L', 'V', 'I', 'N',
+ 'K', 'E', 'M', 'P', 'L', 'I',
+ 'K', 'E', 'M', 'P', 'U', 'L',
+ 'K', 'E', 'Y', 'C', 'A', 'P',
+ 'K', 'H', 'A', 'N', 'D', 'A',
+ 'K', 'H', 'O', 'M', 'U', 'T',
+ 'K', 'I', 'S', 'I', 'M', '5',
+ 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'K', 'L', 'A', 'S', 'M', 'A',
+ 'K', 'L', 'I', 'T', 'O', 'N',
+ 'K', 'N', 'I', 'G', 'H', 'T',
+ 'K', 'O', 'R', 'E', 'A', 'N',
+ 'K', 'O', 'R', 'U', 'N', 'A',
+ 'K', 'U', 'S', 'H', 'U', '2',
+ 'K', 'W', 'U', '3', '1', '8',
+ 'K', 'Y', 'U', 'R', 'I', 'I',
+ 'L', '-', 'T', 'Y', 'P', 'E',
+ 'L', 'A', 'H', 'S', 'H', 'U',
+ 'L', 'A', 'M', 'A', 'D', 'H',
+ 'L', 'A', 'M', 'B', 'D', 'A',
+ 'L', 'A', 'R', 'G', 'E', 'R',
+ 'L', 'A', 'U', 'K', 'A', 'Z',
+ 'L', 'E', 'A', 'D', 'E', 'R',
+ 'L', 'E', 'G', 'I', 'O', 'N',
+ 'L', 'E', 'I', 'M', 'M', 'A',
+ 'L', 'E', 'N', 'G', 'T', 'H',
+ 'L', 'E', 'P', 'C', 'H', 'A',
+ 'L', 'E', 'S', 'S', 'E', 'R',
+ 'L', 'E', 'T', 'T', 'E', 'R',
+ 'L', 'I', 'L', 'I', 'T', 'H',
+ 'L', 'I', 'M', 'M', 'U', '2',
+ 'L', 'I', 'M', 'M', 'U', '4',
+ 'L', 'I', 'N', 'E', '-', '1',
+ 'L', 'I', 'N', 'E', '-', '3',
+ 'L', 'I', 'N', 'E', '-', '7',
+ 'L', 'I', 'N', 'E', '-', '9',
+ 'L', 'I', 'N', 'E', 'A', 'R',
+ 'L', 'I', 'Q', 'U', 'I', 'D',
+ 'L', 'I', 'T', 'T', 'L', 'E',
+ 'L', 'U', 'N', 'A', 'T', 'E',
+ 'L', 'Y', 'C', 'I', 'A', 'N',
+ 'L', 'Y', 'D', 'I', 'A', 'N',
+ 'M', 'A', 'C', 'R', 'O', 'N',
+ 'M', 'A', 'D', 'D', 'A', 'H',
+ 'M', 'A', 'I', 'D', 'E', 'N',
+ 'M', 'A', 'N', 'C', 'H', 'U',
+ 'M', 'A', 'N', 'N', 'A', 'Z',
+ 'M', 'A', 'R', 'K', '-', '1',
+ 'M', 'A', 'R', 'K', '-', '2',
+ 'M', 'A', 'R', 'K', '-', '3',
+ 'M', 'A', 'R', 'K', '-', '4',
+ 'M', 'A', 'R', 'K', 'E', 'R',
+ 'M', 'A', 'R', 'U', 'K', 'U',
+ 'M', 'A', 'S', 'O', 'R', 'A',
+ 'M', 'A', 'T', 'R', 'I', 'X',
+ 'M', 'A', 'X', 'I', 'M', 'A',
+ 'M', 'E', 'D', 'I', 'A', 'L',
+ 'M', 'E', 'D', 'I', 'U', 'M',
+ 'M', 'E', 'G', 'A', 'L', 'I',
+ 'M', 'E', 'M', 'B', 'E', 'R',
+ 'M', 'E', 'R', 'K', 'H', 'A',
+ 'M', 'E', 'T', 'R', 'I', 'A',
+ 'M', 'I', 'D', 'D', 'L', 'E',
+ 'M', 'I', 'K', 'R', 'O', 'N',
+ 'M', 'I', 'L', 'L', 'E', 'T',
+ 'M', 'I', 'N', 'I', 'M', 'A',
+ 'M', 'O', 'D', 'E', 'L', 'S',
+ 'M', 'O', 'D', 'U', 'L', 'O',
+ 'M', 'O', 'R', 'T', 'A', 'R',
+ 'M', 'O', 'T', 'H', 'E', 'R',
+ 'M', 'U', 'C', 'A', 'A', 'D',
+ 'M', 'U', 'N', 'S', 'U', 'B',
+ 'M', 'U', 'Q', 'D', 'A', 'M',
+ 'M', 'U', 'R', 'G', 'U', '2',
+ 'N', '-', 'C', 'R', 'E', 'E',
+ 'N', 'A', 'R', 'R', 'O', 'W',
+ 'N', 'A', 'U', 'D', 'I', 'Z',
+ 'N', 'A', 'U', 'T', 'H', 'S',
+ 'N', 'A', 'X', 'I', 'A', 'N',
+ 'N', 'E', 'N', 'A', 'N', 'O',
+ 'N', 'E', 'S', 'T', 'E', 'D',
+ 'N', 'E', 'U', 'T', 'E', 'R',
+ 'N', 'I', 'N', 'D', 'A', '2',
+ 'N', 'I', 'N', 'E', 'T', 'Y',
+ 'N', 'I', 'R', 'U', 'G', 'U',
+ 'N', 'O', 'K', 'H', 'U', 'K',
+ 'N', 'O', 'R', 'M', 'A', 'L',
+ 'N', 'U', 'B', 'I', 'A', 'N',
+ 'N', 'U', 'M', 'B', 'E', 'R',
+ 'N', 'U', 'M', 'E', 'R', 'O',
+ 'O', 'B', 'E', 'L', 'O', 'S',
+ 'O', 'B', 'E', 'L', 'U', 'S',
+ 'O', 'B', 'J', 'E', 'C', 'T',
+ 'O', 'G', 'O', 'N', 'E', 'K',
+ 'O', 'L', 'I', 'G', 'O', 'N',
+ 'O', 'M', 'A', 'L', 'O', 'N',
+ 'O', 'P', 'E', 'N', '-', 'P',
+ 'O', 'P', 'P', 'O', 'S', 'E',
+ 'O', 'P', 'T', 'I', 'O', 'N',
+ 'O', 'R', 'C', 'H', 'I', 'D',
+ 'O', 'R', 'I', 'G', 'I', 'N',
+ 'O', 'R', 'N', 'A', 'T', 'E',
+ 'O', 'T', 'T', 'A', 'V', 'A',
+ 'O', 'U', 'N', 'K', 'I', 'A',
+ 'O', 'X', 'E', 'I', 'A', 'I',
+ 'O', 'Y', 'A', 'N', 'N', 'A',
+ 'P', 'A', 'I', 'R', 'E', 'D',
+ 'P', 'A', 'L', 'L', 'A', 'S',
+ 'P', 'A', 'L', 'U', 'T', 'A',
+ 'P', 'A', 'M', 'A', 'D', 'A',
+ 'P', 'A', 'S', 'H', 'T', 'A',
+ 'P', 'E', 'N', 'C', 'I', 'L',
+ 'P', 'E', 'N', 'I', 'H', 'I',
+ 'P', 'E', 'O', 'R', 'T', 'H',
+ 'P', 'E', 'R', 'S', 'O', 'N',
+ 'P', 'E', 'R', 'T', 'H', 'O',
+ 'P', 'E', 'S', 'E', 'T', 'A',
+ 'P', 'H', 'N', 'A', 'E', 'K',
+ 'P', 'H', 'R', 'A', 'S', 'E',
+ 'P', 'I', 'A', 'S', 'M', 'A',
+ 'P', 'I', 'K', 'U', 'R', 'U',
+ 'P', 'I', 'P', 'I', 'N', 'G',
+ 'P', 'I', 'S', 'C', 'E', 'S',
+ 'P', 'L', 'A', 'N', 'C', 'K',
+ 'P', 'L', 'O', 'P', 'H', 'U',
+ 'P', 'L', 'U', 'M', 'E', 'D',
+ 'P', 'O', 'E', 'T', 'I', 'C',
+ 'P', 'O', 'E', 'T', 'R', 'Y',
+ 'P', 'O', 'I', 'N', 'T', 'O',
+ 'P', 'O', 'K', 'O', 'J', 'I',
+ 'P', 'O', 'S', 'T', 'A', 'L',
+ 'P', 'O', 'W', 'E', 'R', 'S',
+ 'P', 'R', 'O', 'T', 'O', 'S',
+ 'P', 'S', 'I', 'L', 'O', 'N',
+ 'P', 'T', 'H', 'A', 'H', 'A',
+ 'P', 'U', 'R', 'I', 'T', 'Y',
+ 'Q', 'A', 'M', 'A', 'T', 'S',
+ 'Q', 'A', 'R', 'N', 'E', 'Y',
+ 'Q', 'E', 'T', 'A', 'N', 'A',
+ 'Q', 'U', 'B', 'U', 'T', 'S',
+ 'R', '-', 'C', 'R', 'E', 'E',
+ 'R', 'A', 'I', 'S', 'E', 'D',
+ 'R', 'A', 'M', 'B', 'A', 'T',
+ 'R', 'A', 'S', 'O', 'U', 'L',
+ 'R', 'E', 'C', 'O', 'R', 'D',
+ 'R', 'E', 'J', 'A', 'N', 'G',
+ 'R', 'E', 'P', 'E', 'A', 'T',
+ 'R', 'E', 'T', 'U', 'R', 'N',
+ 'R', 'H', 'O', 'T', 'I', 'C',
+ 'R', 'I', 'K', 'R', 'I', 'K',
+ 'R', 'I', 'S', 'I', 'N', 'G',
+ 'R', 'I', 'T', 'U', 'A', 'L',
+ 'R', 'N', 'Y', 'I', 'N', 'G',
+ 'R', 'U', 'N', 'O', 'U', 'T',
+ 'S', 'A', 'A', 'D', 'H', 'U',
+ 'S', 'A', 'J', 'D', 'A', 'H',
+ 'S', 'A', 'M', 'E', 'K', 'H',
+ 'S', 'A', 'M', 'Y', 'O', 'K',
+ 'S', 'A', 'N', 'G', 'A', '2',
+ 'S', 'A', 'N', 'N', 'Y', 'A',
+ 'S', 'A', 'T', 'U', 'R', 'N',
+ 'S', 'A', 'Y', 'I', 'S', 'I',
+ 'S', 'C', 'A', 'L', 'E', 'S',
+ 'S', 'C', 'H', 'E', 'M', 'A',
+ 'S', 'C', 'R', 'E', 'E', 'N',
+ 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'E', 'C', 'O', 'N', 'D',
+ 'S', 'E', 'C', 'R', 'E', 'T',
+ 'S', 'E', 'C', 'T', 'O', 'R',
+ 'S', 'E', 'I', 'S', 'M', 'A',
+ 'S', 'E', 'R', 'I', 'F', 'S',
+ 'S', 'E', 'S', 'A', 'M', 'E',
+ 'S', 'H', 'A', 'D', 'D', 'A',
+ 'S', 'H', 'A', 'K', 'T', 'I',
+ 'S', 'H', 'A', 'P', 'E', 'S',
+ 'S', 'H', 'E', 'E', 'N', 'U',
+ 'S', 'H', 'E', 'Q', 'E', 'L',
+ 'S', 'H', 'E', 'S', 'H', '2',
+ 'S', 'H', 'I', 'E', 'L', 'D',
+ 'S', 'H', 'I', 'N', 'I', 'G',
+ 'S', 'H', 'O', 'R', 'T', 'S',
+ 'S', 'H', 'U', 'B', 'U', 'R',
+ 'S', 'I', 'C', 'K', 'L', 'E',
+ 'S', 'I', 'N', 'D', 'H', 'I',
+ 'S', 'I', 'N', 'G', 'L', 'E',
+ 'S', 'I', 'X', 'T', 'H', 'S',
+ 'S', 'K', 'E', 'W', 'E', 'D',
+ 'S', 'L', 'O', 'W', 'L', 'Y',
+ 'S', 'O', 'U', 'R', 'C', 'E',
+ 'S', 'O', 'W', 'I', 'L', 'O',
+ 'S', 'P', 'A', 'T', 'H', 'I',
+ 'S', 'P', 'E', 'E', 'C', 'H',
+ 'S', 'P', 'I', 'R', 'A', 'L',
+ 'S', 'P', 'I', 'R', 'I', 'T',
+ 'S', 'P', 'O', 'K', 'E', 'D',
+ 'S', 'P', 'R', 'I', 'N', 'G',
+ 'S', 'P', 'R', 'O', 'U', 'T',
+ 'S', 'P', 'U', 'N', 'G', 'S',
+ 'S', 'Q', 'U', 'A', 'R', 'E',
+ 'S', 'Q', 'U', 'I', 'S', 'H',
+ 'S', 'T', 'I', 'G', 'M', 'A',
+ 'S', 'T', 'I', 'M', 'M', 'E',
+ 'S', 'T', 'R', 'A', 'I', 'F',
+ 'S', 'T', 'R', 'E', 'S', 'S',
+ 'S', 'T', 'R', 'I', 'D', 'E',
+ 'S', 'T', 'R', 'O', 'K', 'E',
+ 'S', 'U', 'B', 'I', 'T', 'O',
+ 'S', 'U', 'B', 'S', 'E', 'T',
+ 'S', 'U', 'M', 'A', 'S', 'H',
+ 'S', 'U', 'M', 'M', 'E', 'R',
+ 'S', 'U', 'R', 'A', 'N', 'G',
+ 'S', 'W', 'O', 'R', 'D', 'S',
+ 'S', 'Y', 'L', 'O', 'T', 'I',
+ 'S', 'Y', 'M', 'B', 'O', 'L',
+ 'S', 'Y', 'N', 'A', 'F', 'I',
+ 'S', 'Y', 'O', 'U', 'W', 'A',
+ 'S', 'Y', 'R', 'I', 'A', 'C',
+ 'T', 'A', '-', 'R', 'O', 'L',
+ 'T', 'A', 'I', 'L', 'E', 'D',
+ 'T', 'A', 'L', 'E', 'N', 'T',
+ 'T', 'A', 'L', 'I', 'N', 'G',
+ 'T', 'A', 'M', 'I', 'N', 'G',
+ 'T', 'A', 'N', 'N', 'E', 'D',
+ 'T', 'A', 'U', 'R', 'U', 'S',
+ 'T', 'E', 'D', 'U', 'N', 'G',
+ 'T', 'E', 'L', 'E', 'I', 'A',
+ 'T', 'E', 'L', 'O', 'U', 'S',
+ 'T', 'E', 'L', 'U', 'G', 'U',
+ 'T', 'E', 'M', 'P', 'U', 'S',
+ 'T', 'E', 'N', 'U', 'T', 'O',
+ 'T', 'H', 'A', 'A', 'L', 'U',
+ 'T', 'H', 'A', 'A', 'N', 'A',
+ 'T', 'H', 'A', 'H', 'A', 'N',
+ 'T', 'H', 'A', 'N', 'N', 'A',
+ 'T', 'H', 'E', 'T', 'H', 'E',
+ 'T', 'H', 'I', 'R', 'D', 'S',
+ 'T', 'H', 'I', 'R', 'T', 'Y',
+ 'T', 'H', 'I', 'U', 'T', 'H',
+ 'T', 'H', 'R', 'E', 'A', 'D',
+ 'T', 'H', 'Y', 'O', 'O', 'M',
+ 'T', 'I', 'K', 'E', 'U', 'T',
+ 'T', 'I', 'P', 'E', 'H', 'A',
+ 'T', 'O', 'N', 'E', '-', '1',
+ 'T', 'O', 'N', 'E', '-', '2',
+ 'T', 'O', 'N', 'E', '-', '3',
+ 'T', 'O', 'N', 'E', '-', '4',
+ 'T', 'O', 'N', 'E', '-', '5',
+ 'T', 'O', 'N', 'E', '-', '6',
+ 'T', 'O', 'N', 'G', 'U', 'E',
+ 'T', 'O', 'P', 'B', 'A', 'R',
+ 'T', 'R', 'I', 'P', 'L', 'E',
+ 'T', 'R', 'I', 'P', 'L', 'I',
+ 'T', 'R', 'I', 'P', 'O', 'D',
+ 'T', 'R', 'I', 'T', 'O', 'S',
+ 'T', 'S', 'H', 'O', 'O', 'K',
+ 'T', 'S', 'H', 'U', 'G', 'S',
+ 'T', 'T', 'E', 'H', 'E', 'H',
+ 'T', 'U', 'A', 'R', 'E', 'G',
+ 'T', 'U', 'G', 'R', 'I', 'K',
+ 'T', 'U', 'R', 'B', 'A', 'N',
+ 'T', 'U', 'R', 'N', 'E', 'D',
+ 'T', 'U', 'R', 'T', 'L', 'E',
+ 'T', 'V', 'R', 'I', 'D', 'O',
+ 'T', 'W', 'E', 'L', 'V', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y',
+ 'T', 'Y', 'P', 'E', '-', '1',
+ 'T', 'Y', 'P', 'E', '-', '2',
+ 'T', 'Y', 'P', 'E', '-', '3',
+ 'T', 'Y', 'P', 'E', '-', '4',
+ 'T', 'Y', 'P', 'E', '-', '5',
+ 'T', 'Y', 'P', 'E', '-', '6',
+ 'T', 'Y', 'P', 'E', '-', '7',
+ 'U', 'D', 'A', 'T', 'T', 'A',
+ 'U', 'I', 'G', 'H', 'U', 'R',
+ 'U', 'P', 'T', 'U', 'R', 'N',
+ 'U', 'P', 'W', 'A', 'R', 'D',
+ 'U', 'R', 'A', 'N', 'U', 'S',
+ 'U', 'S', 'H', 'U', 'M', 'X',
+ 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'A', 'L', 'L', 'E', 'Y',
+ 'V', 'A', 'R', 'E', 'I', 'A',
+ 'V', 'A', 'R', 'I', 'K', 'A',
+ 'V', 'E', 'C', 'T', 'O', 'R',
+ 'V', 'E', 'S', 'S', 'E', 'L',
+ 'V', 'I', 'R', 'A', 'M', 'A',
+ 'V', 'I', 'R', 'I', 'A', 'M',
+ 'V', 'O', 'I', 'C', 'E', 'D',
+ 'V', 'O', 'L', 'U', 'M', 'E',
+ 'V', 'R', 'A', 'C', 'H', 'Y',
+ 'V', 'U', 'L', 'G', 'A', 'R',
+ 'W', 'E', 'A', 'P', 'O', 'N',
+ 'W', 'E', 'I', 'G', 'H', 'T',
+ 'W', 'I', 'G', 'G', 'L', 'Y',
+ 'W', 'I', 'N', 'T', 'E', 'R',
+ 'W', 'O', 'L', 'O', 'S', 'O',
+ 'W', 'R', 'E', 'A', 'T', 'H',
+ 'X', 'E', 'S', 'T', 'E', 'S',
+ 'Y', '-', 'C', 'R', 'E', 'E',
+ 'Y', 'A', 'K', 'A', 'S', 'H',
+ 'Y', 'E', 'L', 'L', 'O', 'W',
+ 'Y', 'F', 'E', 'S', 'I', 'S',
+ 'Y', 'O', '-', 'Y', 'A', 'E',
+ 'Y', 'O', '-', 'Y', 'E', 'O',
+ 'Y', 'P', 'S', 'I', 'L', 'I',
+ 'Y', 'U', '-', 'Y', 'E', 'O',
+ 'Z', 'E', 'M', 'L', 'J', 'A',
+ 'Z', 'E', 'M', 'L', 'Y', 'A',
+ 'Z', 'I', 'G', 'Z', 'A', 'G',
+ 'Z', 'Q', 'A', 'P', 'H', 'A',
+ 'A', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'B', 'A', 'F', 'I', 'L', 'I',
+ 'A', 'B', 'Y', 'S', 'M', 'A', 'L',
+ 'A', 'C', 'A', 'D', 'E', 'M', 'Y',
+ 'A', 'C', 'C', 'O', 'U', 'N', 'T',
+ 'A', 'D', 'V', 'A', 'N', 'C', 'E',
+ 'A', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'F', 'G', 'H', 'A', 'N', 'I',
+ 'A', 'F', 'R', 'I', 'C', 'A', 'N',
+ 'A', 'H', 'A', 'G', 'G', 'A', 'R',
+ 'A', 'I', 'V', 'I', 'L', 'I', 'K',
+ 'A', 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'L', 'E', 'M', 'B', 'I', 'C',
+ 'A', 'L', 'I', 'G', 'N', 'E', 'D',
+ 'A', 'L', 'L', 'A', 'H', 'O', 'U',
+ 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'A', 'N', 'N', 'U', 'I', 'T', 'Y',
+ 'A', 'P', 'O', 'T', 'H', 'E', 'S',
+ 'A', 'R', 'A', 'E', 'A', '-', 'I',
+ 'A', 'R', 'A', 'E', 'A', '-', 'U',
+ 'A', 'R', 'C', 'H', 'A', 'I', 'C',
+ 'A', 'R', 'K', 'T', 'I', 'K', 'O',
+ 'A', 'U', 'S', 'T', 'R', 'A', 'L',
+ 'A', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'V', 'E', 'R', 'A', 'G', 'E',
+ 'B', 'A', 'A', 'R', 'E', 'R', 'U',
+ 'B', 'A', 'I', 'R', 'K', 'A', 'N',
+ 'B', 'A', 'M', 'B', 'O', 'O', 'S',
+ 'B', 'A', 'R', 'L', 'I', 'N', 'E',
+ 'B', 'A', 'R', 'R', 'E', 'K', 'H',
+ 'B', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'B', 'A', 'S', 'H', 'K', 'I', 'R',
+ 'B', 'A', 'T', 'H', 'T', 'U', 'B',
+ 'B', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'B', 'E', 'C', 'A', 'U', 'S', 'E',
+ 'B', 'E', 'E', 'H', 'I', 'V', 'E',
+ 'B', 'E', 'N', 'G', 'A', 'L', 'I',
+ 'B', 'E', 'N', 'Z', 'E', 'N', 'E',
+ 'B', 'E', 'T', 'W', 'E', 'E', 'N',
+ 'B', 'I', 'N', 'D', 'I', 'N', 'G',
+ 'B', 'J', 'A', 'R', 'K', 'A', 'N',
+ 'B', 'L', 'E', 'N', 'D', 'E', 'D',
+ 'B', 'R', 'A', 'C', 'K', 'E', 'T',
+ 'B', 'R', 'A', 'I', 'L', 'L', 'E',
+ 'B', 'R', 'A', 'K', 'C', 'E', 'T',
+ 'B', 'R', 'I', 'S', 'T', 'L', 'E',
+ 'B', 'U', 'U', 'M', 'I', 'S', 'H',
+ 'C', 'A', 'E', 'S', 'U', 'R', 'A',
+ 'C', 'A', 'P', 'I', 'T', 'A', 'L',
+ 'C', 'A', 'P', 'T', 'I', 'V', 'E',
+ 'C', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'C', 'A', 'U', 'T', 'I', 'O', 'N',
+ 'C', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'C', 'E', 'D', 'I', 'L', 'L', 'A',
+ 'C', 'E', 'I', 'L', 'I', 'N', 'G',
+ 'C', 'E', 'L', 'S', 'I', 'U', 'S',
+ 'C', 'E', 'N', 'T', 'R', 'E', 'D',
+ 'C', 'H', 'A', 'M', 'I', 'L', 'I',
+ 'C', 'H', 'A', 'R', 'I', 'O', 'T',
+ 'C', 'H', 'E', 'V', 'R', 'O', 'N',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'H', 'I', 'N', 'E', 'S', 'E',
+ 'C', 'H', 'R', 'O', 'N', 'O', 'N',
+ 'C', 'H', 'R', 'O', 'N', 'O', 'U',
+ 'C', 'I', 'R', 'C', 'L', 'E', 'D',
+ 'C', 'I', 'R', 'C', 'L', 'E', 'S',
+ 'C', 'L', 'O', 'S', 'I', 'N', 'G',
+ 'C', 'L', 'O', 'S', 'U', 'R', 'E',
+ 'C', 'L', 'O', 'T', 'H', 'E', 'S',
+ 'C', 'L', 'U', 'S', 'T', 'E', 'R',
+ 'C', 'O', 'M', 'P', 'A', 'R', 'E',
+ 'C', 'O', 'N', 'I', 'C', 'A', 'L',
+ 'C', 'O', 'N', 'T', 'A', 'C', 'T',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N',
+ 'C', 'O', 'N', 'T', 'O', 'U', 'R',
+ 'C', 'O', 'N', 'T', 'R', 'O', 'L',
+ 'C', 'O', 'R', 'N', 'E', 'R', 'S',
+ 'C', 'O', 'R', 'O', 'N', 'I', 'S',
+ 'C', 'O', 'R', 'R', 'E', 'C', 'T',
+ 'C', 'O', 'U', 'N', 'C', 'I', 'L',
+ 'C', 'R', 'O', 'S', 'S', 'E', 'D',
+ 'C', 'U', 'R', 'R', 'E', 'N', 'T',
+ 'C', 'U', 'R', 'V', 'I', 'N', 'G',
+ 'C', 'W', 'E', 'O', 'R', 'T', 'H',
+ 'C', 'Y', 'P', 'E', 'R', 'U', 'S',
+ 'C', 'Y', 'P', 'R', 'I', 'O', 'T',
+ 'D', 'A', 'G', 'A', 'L', 'G', 'A',
+ 'D', 'A', 'N', 'T', 'A', 'J', 'A',
+ 'D', 'A', 'P', '-', 'B', 'E', 'I',
+ 'D', 'A', 'P', '-', 'P', 'I', 'I',
+ 'D', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'D', 'E', 'C', 'A', 'Y', 'E', 'D',
+ 'D', 'E', 'C', 'I', 'M', 'A', 'L',
+ 'D', 'E', 'L', 'P', 'H', 'I', 'C',
+ 'D', 'E', 'S', 'E', 'R', 'E', 'T',
+ 'D', 'H', 'A', 'L', 'A', 'T', 'H',
+ 'D', 'I', 'A', 'M', 'O', 'N', 'D',
+ 'D', 'I', 'A', 'R', 'G', 'O', 'N',
+ 'D', 'I', 'G', 'A', 'M', 'M', 'A',
+ 'D', 'I', 'G', 'R', 'A', 'P', 'H',
+ 'D', 'I', 'M', 'I', 'D', 'I', 'A',
+ 'D', 'I', 'M', 'M', 'I', 'N', 'G',
+ 'D', 'I', 'N', 'G', 'B', 'A', 'T',
+ 'D', 'I', 'P', 'L', 'O', 'U', 'N',
+ 'D', 'I', 'S', 'I', 'M', 'O', 'U',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'D',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'R',
+ 'D', 'I', 'V', 'I', 'D', 'E', 'S',
+ 'D', 'I', 'V', 'O', 'R', 'C', 'E',
+ 'D', 'O', 'T', 'L', 'E', 'S', 'S',
+ 'D', 'O', 'T', 'S', '-', '1', '2',
+ 'D', 'O', 'T', 'S', '-', '1', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3',
+ 'D', 'O', 'T', 'S', '-', '2', '4',
+ 'D', 'O', 'T', 'S', '-', '2', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', 'D',
+ 'D', 'R', 'A', 'C', 'H', 'M', 'A',
+ 'E', 'A', 'B', 'H', 'A', 'D', 'H',
+ 'E', 'A', 'D', 'H', 'A', 'D', 'H',
+ 'E', 'A', 'R', 'T', 'H', 'L', 'Y',
+ 'E', 'A', 'S', 'T', 'E', 'R', 'N',
+ 'E', 'B', 'E', 'F', 'I', 'L', 'I',
+ 'E', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'E', 'I', 'G', 'H', 'T', 'H', 'S',
+ 'E', 'L', 'A', 'F', 'R', 'O', 'N',
+ 'E', 'L', 'E', 'M', 'E', 'N', 'T',
+ 'E', 'L', 'L', 'I', 'P', 'S', 'E',
+ 'E', 'N', 'A', 'R', 'X', 'I', 'S',
+ 'E', 'N', 'Q', 'U', 'I', 'R', 'Y',
+ 'E', 'P', 'S', 'I', 'L', 'O', 'N',
+ 'E', 'T', 'N', 'A', 'H', 'T', 'A',
+ 'E', 'V', 'E', 'N', 'I', 'N', 'G',
+ 'F', 'A', 'I', 'L', 'U', 'R', 'E',
+ 'F', 'A', 'L', 'L', 'I', 'N', 'G',
+ 'F', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'F', 'E', 'A', 'T', 'H', 'E', 'R',
+ 'F', 'E', 'R', 'M', 'A', 'T', 'A',
+ 'F', 'I', 'F', 'T', 'E', 'E', 'N',
+ 'F', 'I', 'S', 'H', 'E', 'Y', 'E',
+ 'F', 'O', 'N', 'G', 'M', 'A', 'N',
+ 'F', 'O', 'R', 'K', 'I', 'N', 'G',
+ 'F', 'R', 'A', 'K', 'T', 'U', 'R',
+ 'F', 'U', 'N', 'E', 'R', 'A', 'L',
+ 'G', 'A', 'A', 'H', 'L', 'A', 'A',
+ 'G', 'A', 'R', 'M', 'E', 'N', 'T',
+ 'G', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'G', 'E', 'N', 'E', 'R', 'I', 'C',
+ 'G', 'E', 'S', 'H', 'T', 'I', 'N',
+ 'G', 'I', 'R', 'U', 'D', 'A', 'A',
+ 'G', 'L', 'A', 'G', 'O', 'L', 'I',
+ 'G', 'L', 'O', 'T', 'T', 'A', 'L',
+ 'G', 'R', 'E', 'A', 'T', 'E', 'R',
+ 'G', 'U', 'A', 'R', 'A', 'N', 'I',
+ 'H', 'A', 'F', 'U', 'K', 'H', 'A',
+ 'H', 'A', 'L', 'A', 'N', 'T', 'A',
+ 'H', 'A', 'L', 'B', 'E', 'R', 'D',
+ 'H', 'A', 'N', 'U', 'N', 'O', 'O',
+ 'H', 'A', 'R', 'P', 'O', 'O', 'N',
+ 'H', 'A', 'S', 'A', 'N', 'T', 'A',
+ 'H', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'H', 'E', '-', 'G', 'O', 'A', 'T',
+ 'H', 'E', 'A', 'D', 'I', 'N', 'G',
+ 'H', 'E', 'R', 'A', 'E', 'U', 'M',
+ 'H', 'E', 'X', 'A', 'G', 'O', 'N',
+ 'H', 'O', 'L', 'D', 'I', 'N', 'G',
+ 'H', 'R', 'Y', 'V', 'N', 'I', 'A',
+ 'H', 'U', 'N', 'D', 'R', 'E', 'D',
+ 'I', '-', 'A', 'R', 'A', 'E', 'A',
+ 'I', 'B', 'I', 'F', 'I', 'L', 'I',
+ 'I', 'C', 'H', 'A', 'D', 'I', 'N',
+ 'I', 'I', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'L', 'I', 'M', 'M', 'U', '3',
+ 'I', 'L', 'I', 'M', 'M', 'U', '4',
+ 'I', 'M', 'I', 'S', 'E', 'O', 'S',
+ 'I', 'N', 'H', 'I', 'B', 'I', 'T',
+ 'I', 'N', 'I', 'T', 'I', 'A', 'L',
+ 'I', 'N', 'S', 'U', 'L', 'A', 'R',
+ 'I', 'N', 'V', 'E', 'R', 'S', 'E',
+ 'I', 'O', 'D', 'H', 'A', 'D', 'H',
+ 'I', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'I', 'Z', 'H', 'I', 'T', 'S', 'A',
+ 'J', 'A', 'N', 'U', 'A', 'R', 'Y',
+ 'J', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'J', 'E', 'G', 'O', 'G', 'A', 'N',
+ 'J', 'U', 'P', 'I', 'T', 'E', 'R',
+ 'K', 'A', 'K', 'A', 'B', 'A', 'T',
+ 'K', 'A', 'N', 'N', 'A', 'D', 'A',
+ 'K', 'A', 'N', 'T', 'A', 'J', 'A',
+ 'K', 'A', 'R', 'A', 'T', 'T', 'O',
+ 'K', 'A', 'R', 'O', 'R', 'I', 'I',
+ 'K', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'K', 'E', 'E', 'P', 'I', 'N', 'G',
+ 'K', 'E', 'M', 'B', 'A', 'N', 'G',
+ 'K', 'E', 'N', 'T', 'I', 'M', 'A',
+ 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'K', 'I', 'N', 'S', 'H', 'I', 'P',
+ 'K', 'I', 'R', 'G', 'H', 'I', 'Z',
+ 'K', 'O', 'M', 'B', 'U', 'V', 'A',
+ 'K', 'O', 'O', 'M', 'U', 'U', 'T',
+ 'K', 'O', 'R', 'A', 'N', 'I', 'C',
+ 'K', 'O', 'R', 'O', 'N', 'I', 'S',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'A',
+ 'K', 'U', 'R', 'O', 'O', 'N', 'E',
+ 'K', 'Y', 'A', 'T', 'H', 'O', 'S',
+ 'K', 'Y', 'L', 'I', 'S', 'M', 'A',
+ 'L', 'A', 'T', 'E', 'R', 'A', 'L',
+ 'L', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'L', 'E', 'A', 'T', 'H', 'E', 'R',
+ 'L', 'E', 'G', 'E', 'T', 'O', 'S',
+ 'L', 'I', 'M', 'I', 'T', 'E', 'D',
+ 'L', 'I', 'N', 'K', 'I', 'N', 'G',
+ 'L', 'J', 'U', 'D', 'I', 'J', 'E',
+ 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'L', 'O', 'Z', 'E', 'N', 'G', 'E',
+ 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'M', 'A', 'H', 'J', 'O', 'N', 'G',
+ 'M', 'A', 'I', 'K', 'U', 'R', 'O',
+ 'M', 'A', 'I', 'M', 'U', 'A', 'N',
+ 'M', 'A', 'K', 'S', 'U', 'R', 'A',
+ 'M', 'A', 'L', 'A', 'K', 'O', 'N',
+ 'M', 'A', 'L', 'T', 'E', 'S', 'E',
+ 'M', 'A', 'N', 'S', 'Y', 'O', 'N',
+ 'M', 'A', 'R', 'B', 'U', 'T', 'A',
+ 'M', 'A', 'R', 'C', 'A', 'T', 'O',
+ 'M', 'A', 'S', 'S', 'I', 'N', 'G',
+ 'M', 'A', 'T', 'T', 'O', 'C', 'K',
+ 'M', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'M', 'E', 'A', 'S', 'U', 'R', 'E',
+ 'M', 'E', 'E', 'T', 'O', 'R', 'U',
+ 'M', 'E', 'G', 'A', 'T', 'O', 'N',
+ 'M', 'E', 'R', 'C', 'U', 'R', 'Y',
+ 'M', 'I', 'D', 'L', 'I', 'N', 'E',
+ 'M', 'I', 'K', 'U', 'R', 'O', 'N',
+ 'M', 'O', 'D', 'E', 'S', 'T', 'Y',
+ 'M', 'O', 'R', 'N', 'I', 'N', 'G',
+ 'M', 'U', 'S', 'I', 'C', 'A', 'L',
+ 'M', 'Y', 'A', 'N', 'M', 'A', 'R',
+ 'M', 'Y', 'S', 'L', 'I', 'T', 'E',
+ 'N', 'A', 'S', 'K', 'A', 'P', 'I',
+ 'N', 'A', 'T', 'U', 'R', 'A', 'L',
+ 'N', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'N', 'E', 'G', 'A', 'T', 'E', 'D',
+ 'N', 'E', 'I', 'T', 'H', 'E', 'R',
+ 'N', 'E', 'P', 'T', 'U', 'N', 'E',
+ 'N', 'E', 'U', 'T', 'R', 'A', 'L',
+ 'N', 'E', 'W', 'L', 'I', 'N', 'E',
+ 'N', 'G', 'E', 'A', 'D', 'A', 'L',
+ 'N', 'I', 'K', 'A', 'H', 'I', 'T',
+ 'N', 'O', 'M', 'I', 'N', 'A', 'L',
+ 'N', 'O', 'T', 'C', 'H', 'E', 'D',
+ 'N', 'U', 'M', 'E', 'R', 'A', 'L',
+ 'N', 'U', 'M', 'E', 'R', 'I', 'C',
+ 'N', 'U', 'N', 'A', 'V', 'I', 'K',
+ 'N', 'U', 'N', 'A', 'V', 'U', 'T',
+ 'N', 'U', 'T', 'I', 'L', 'L', 'U',
+ 'N', 'Y', 'I', 'N', '-', 'D', 'O',
+ 'O', 'B', 'L', 'I', 'Q', 'U', 'E',
+ 'O', 'B', 'O', 'F', 'I', 'L', 'I',
+ 'O', 'C', 'T', 'O', 'B', 'E', 'R',
+ 'O', 'M', 'I', 'C', 'R', 'O', 'N',
+ 'O', 'N', 'E', 'S', 'E', 'L', 'F',
+ 'O', 'O', 'Y', 'A', 'N', 'N', 'A',
+ 'O', 'P', 'E', 'N', 'I', 'N', 'G',
+ 'O', 'R', 'D', 'I', 'N', 'A', 'L',
+ 'O', 'S', 'M', 'A', 'N', 'Y', 'A',
+ 'O', 'T', 'H', 'A', 'L', 'A', 'N',
+ 'O', 'U', 'T', 'L', 'I', 'N', 'E',
+ 'O', 'V', 'E', 'R', 'B', 'A', 'R',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'Y',
+ 'P', 'A', 'C', 'K', 'I', 'N', 'G',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L',
+ 'P', 'A', 'L', 'A', 'U', 'N', 'G',
+ 'P', 'A', 'L', 'L', 'A', 'W', 'A',
+ 'P', 'A', 'M', 'A', 'A', 'E', 'H',
+ 'P', 'A', 'M', 'E', 'P', 'E', 'T',
+ 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'P', 'A', 'N', 'Y', 'I', 'K', 'U',
+ 'P', 'A', 'N', 'Y', 'U', 'K', 'U',
+ 'P', 'A', 'P', 'Y', 'R', 'U', 'S',
+ 'P', 'A', 'R', 'E', 'R', 'E', 'N',
+ 'P', 'A', 'R', 'T', 'I', 'A', 'L',
+ 'P', 'A', 'T', 'T', 'E', 'R', 'N',
+ 'P', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'P', 'A', 'Y', 'E', 'R', 'O', 'K',
+ 'P', 'E', 'R', 'C', 'E', 'N', 'T',
+ 'P', 'E', 'R', 'S', 'I', 'A', 'N',
+ 'P', 'E', 'T', 'A', 'S', 'M', 'A',
+ 'P', 'E', 'T', 'A', 'S', 'T', 'I',
+ 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'P', 'H', 'I', 'N', 'T', 'H', 'U',
+ 'P', 'H', 'U', 'T', 'H', 'A', 'O',
+ 'P', 'I', 'L', 'C', 'R', 'O', 'W',
+ 'P', 'L', 'A', 'G', 'I', 'O', 'S',
+ 'P', 'O', 'D', 'A', 'T', 'U', 'S',
+ 'P', 'O', 'I', 'N', 'T', 'E', 'D',
+ 'P', 'O', 'I', 'N', 'T', 'E', 'R',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E',
+ 'P', 'R', 'E', 'F', 'A', 'C', 'E',
+ 'P', 'R', 'I', 'V', 'A', 'T', 'E',
+ 'P', 'R', 'O', 'D', 'U', 'C', 'T',
+ 'P', 'U', 'S', 'H', 'I', 'N', 'G',
+ 'Q', 'U', 'A', 'R', 'T', 'E', 'R',
+ 'R', 'A', 'D', 'I', 'C', 'A', 'L',
+ 'R', 'A', 'K', 'H', 'A', 'N', 'G',
+ 'R', 'A', 'P', 'I', 'S', 'M', 'A',
+ 'R', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'R', 'E', 'A', 'H', 'M', 'U', 'K',
+ 'R', 'E', 'L', 'E', 'A', 'S', 'E',
+ 'R', 'E', 'R', 'E', 'K', 'A', 'N',
+ 'R', 'E', 'T', 'R', 'E', 'A', 'T',
+ 'R', 'E', 'V', 'E', 'R', 'S', 'E',
+ 'R', 'G', 'Y', 'I', 'N', 'G', 'S',
+ 'R', 'I', 'T', 'T', 'O', 'R', 'U',
+ 'R', 'O', 'S', 'E', 'T', 'T', 'E',
+ 'R', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'R', 'O', 'T', 'U', 'N', 'D', 'A',
+ 'R', 'O', 'U', 'N', 'D', 'E', 'D',
+ 'R', 'U', 'U', 'B', 'U', 'R', 'U',
+ 'S', 'A', 'I', 'K', 'U', 'R', 'U',
+ 'S', 'A', 'L', 'T', 'I', 'R', 'E',
+ 'S', 'A', 'M', 'P', 'H', 'A', 'O',
+ 'S', 'A', 'N', 'Y', 'A', 'K', 'A',
+ 'S', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'S', 'C', 'H', 'O', 'L', 'A', 'R',
+ 'S', 'C', 'R', 'U', 'P', 'L', 'E',
+ 'S', 'E', 'A', 'G', 'U', 'L', 'L',
+ 'S', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'S', 'E', 'G', 'M', 'E', 'N', 'T',
+ 'S', 'E', 'M', 'K', 'A', 'T', 'H',
+ 'S', 'E', 'R', 'V', 'I', 'C', 'E',
+ 'S', 'E', 'V', 'E', 'N', 'T', 'Y',
+ 'S', 'E', 'X', 'T', 'A', 'N', 'S',
+ 'S', 'E', 'X', 'T', 'I', 'L', 'E',
+ 'S', 'E', 'X', 'T', 'U', 'L', 'A',
+ 'S', 'H', 'A', 'P', 'I', 'N', 'G',
+ 'S', 'H', 'A', 'V', 'I', 'A', 'N',
+ 'S', 'H', 'E', 'S', 'H', 'I', 'G',
+ 'S', 'H', 'T', 'A', 'P', 'I', 'C',
+ 'S', 'H', 'U', 'F', 'F', 'L', 'E',
+ 'S', 'I', 'L', 'I', 'Q', 'U', 'A',
+ 'S', 'I', 'M', 'I', 'L', 'A', 'R',
+ 'S', 'I', 'N', 'H', 'A', 'L', 'A',
+ 'S', 'I', 'N', 'K', 'I', 'N', 'G',
+ 'S', 'I', 'R', 'I', 'N', 'G', 'U',
+ 'S', 'I', 'X', 'T', 'E', 'E', 'N',
+ 'S', 'K', 'L', 'I', 'R', 'O', 'N',
+ 'S', 'L', 'A', 'N', 'T', 'E', 'D',
+ 'S', 'L', 'O', 'P', 'I', 'N', 'G',
+ 'S', 'M', 'A', 'L', 'L', 'E', 'R',
+ 'S', 'M', 'I', 'L', 'I', 'N', 'G',
+ 'S', 'N', 'O', 'W', 'M', 'A', 'N',
+ 'S', 'O', 'C', 'I', 'E', 'T', 'Y',
+ 'S', 'O', 'G', 'D', 'I', 'A', 'N',
+ 'S', 'O', 'L', 'I', 'D', 'U', 'S',
+ 'S', 'P', 'A', 'C', 'I', 'N', 'G',
+ 'S', 'P', 'A', 'R', 'K', 'L', 'E',
+ 'S', 'P', 'E', 'C', 'I', 'A', 'L',
+ 'S', 'P', 'I', 'D', 'E', 'R', 'Y',
+ 'S', 'P', 'I', 'R', 'A', 'N', 'T',
+ 'S', 'P', 'R', 'I', 'N', 'G', 'S',
+ 'S', 'Q', 'U', 'A', 'R', 'E', 'D',
+ 'S', 'Q', 'U', 'A', 'R', 'E', 'S',
+ 'S', 'T', 'A', 'T', 'E', 'R', 'S',
+ 'S', 'T', 'A', 'U', 'R', 'O', 'S',
+ 'S', 'T', 'A', 'V', 'R', 'O', 'S',
+ 'S', 'T', 'A', 'V', 'R', 'O', 'U',
+ 'S', 'T', 'R', 'O', 'K', 'E', 'S',
+ 'S', 'U', 'B', 'J', 'E', 'C', 'T',
+ 'S', 'U', 'B', 'U', 'N', 'I', 'T',
+ 'S', 'U', 'C', 'C', 'E', 'E', 'D',
+ 'S', 'U', 'R', 'F', 'A', 'C', 'E',
+ 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'S', 'Y', 'N', 'E', 'V', 'M', 'A',
+ 'T', 'A', 'A', 'L', 'U', 'J', 'A',
+ 'T', 'A', 'G', 'A', 'L', 'O', 'G',
+ 'T', 'A', 'I', 'S', 'Y', 'O', 'U',
+ 'T', 'A', 'L', 'E', 'N', 'T', 'S',
+ 'T', 'A', 'T', 'W', 'E', 'E', 'L',
+ 'T', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'T', 'C', 'H', 'E', 'H', 'E', 'H',
+ 'T', 'E', 'L', 'I', 'S', 'H', 'A',
+ 'T', 'E', 'S', 'S', 'E', 'R', 'A',
+ 'T', 'H', '-', 'C', 'R', 'E', 'E',
+ 'T', 'H', 'E', 'S', 'E', 'O', 'S',
+ 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'T', 'H', 'R', 'E', 'E', '-', 'D',
+ 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'T', 'H', 'U', 'N', 'D', 'E', 'R',
+ 'T', 'I', 'B', 'E', 'T', 'A', 'N',
+ 'T', 'I', 'N', 'A', 'G', 'M', 'A',
+ 'T', 'R', 'I', 'G', 'R', 'A', 'M',
+ 'T', 'R', 'I', 'I', 'S', 'A', 'P',
+ 'T', 'R', 'I', 'S', 'E', 'M', 'E',
+ 'T', 'T', 'U', 'D', 'D', 'A', 'G',
+ 'U', '-', 'E', 'O', '-', 'E', 'U',
+ 'U', 'B', 'A', 'D', 'A', 'M', 'A',
+ 'U', 'B', 'U', 'F', 'I', 'L', 'I',
+ 'U', 'P', 'R', 'I', 'G', 'H', 'T',
+ 'U', 'P', 'S', 'I', 'L', 'O', 'N',
+ 'U', 'P', 'W', 'A', 'R', 'D', 'S',
+ 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'A', 'R', 'E', 'I', 'A', 'I',
+ 'V', 'A', 'R', 'I', 'A', 'N', 'T',
+ 'V', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'V', 'I', 'C', 'T', 'O', 'R', 'Y',
+ 'V', 'I', 'L', 'L', 'A', 'G', 'E',
+ 'V', 'I', 'S', 'A', 'R', 'G', 'A',
+ 'V', 'O', 'C', 'A', 'L', 'I', 'C',
+ 'V', 'O', 'I', 'C', 'I', 'N', 'G',
+ 'V', 'O', 'L', 'T', 'A', 'G', 'E',
+ 'W', 'A', 'I', 'T', 'I', 'N', 'G',
+ 'W', 'A', 'R', 'N', 'I', 'N', 'G',
+ 'W', 'A', 'S', 'T', 'I', 'N', 'G',
+ 'W', 'E', 'S', 'T', 'E', 'R', 'N',
+ 'W', 'H', 'E', 'E', 'L', 'E', 'D',
+ 'W', 'R', 'I', 'T', 'I', 'N', 'G',
+ 'Y', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'Y', 'I', 'D', 'D', 'I', 'S', 'H',
+ 'Y', 'P', 'O', 'R', 'R', 'O', 'I',
+ 'Z', 'H', 'I', 'V', 'E', 'T', 'E',
+ 'A', 'C', 'T', 'I', 'V', 'A', 'T', 'E',
+ 'A', 'C', 'T', 'U', 'A', 'L', 'L', 'Y',
+ 'A', 'E', 'E', 'Y', 'A', 'N', 'N', 'A',
+ 'A', 'I', 'R', 'P', 'L', 'A', 'N', 'E',
+ 'A', 'K', 'H', 'M', 'I', 'M', 'I', 'C',
+ 'A', 'L', 'L', 'I', 'A', 'N', 'C', 'E',
+ 'A', 'L', 'V', 'E', 'O', 'L', 'A', 'R',
+ 'A', 'N', 'G', 'S', 'T', 'R', 'O', 'M',
+ 'A', 'N', 'U', 'D', 'A', 'T', 'T', 'A',
+ 'A', 'N', 'U', 'S', 'V', 'A', 'R', 'A',
+ 'A', 'P', 'O', 'D', 'E', 'R', 'M', 'A',
+ 'A', 'P', 'O', 'D', 'E', 'X', 'I', 'A',
+ 'A', 'P', 'O', 'T', 'H', 'E', 'M', 'A',
+ 'A', 'P', 'P', 'R', 'O', 'A', 'C', 'H',
+ 'A', 'Q', 'U', 'A', 'R', 'I', 'U', 'S',
+ 'A', 'R', 'A', 'E', 'A', '-', 'E', 'O',
+ 'A', 'R', 'C', 'H', 'A', 'I', 'O', 'N',
+ 'A', 'R', 'G', 'O', 'T', 'E', 'R', 'I',
+ 'A', 'R', 'I', 'S', 'T', 'E', 'R', 'A',
+ 'A', 'R', 'M', 'E', 'N', 'I', 'A', 'N',
+ 'A', 'R', 'O', 'U', 'S', 'I', 'N', 'G',
+ 'A', 'S', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'A', 'S', 'S', 'Y', 'R', 'I', 'A', 'N',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'K',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'M',
+ 'A', 'T', 'T', 'H', 'A', 'C', 'A', 'N',
+ 'A', 'V', 'A', 'G', 'R', 'A', 'H', 'A',
+ 'B', 'A', 'L', 'I', 'N', 'E', 'S', 'E',
+ 'B', 'E', 'L', 'G', 'T', 'H', 'O', 'R',
+ 'B', 'E', 'R', 'K', 'A', 'N', 'A', 'N',
+ 'B', 'E', 'V', 'E', 'R', 'A', 'G', 'E',
+ 'B', 'I', 'D', 'E', 'N', 'T', 'A', 'L',
+ 'B', 'I', 'L', 'A', 'B', 'I', 'A', 'L',
+ 'B', 'O', 'P', 'O', 'M', 'O', 'F', 'O',
+ 'B', 'O', 'U', 'N', 'D', 'A', 'R', 'Y',
+ 'B', 'U', 'G', 'I', 'N', 'E', 'S', 'E',
+ 'B', 'U', 'L', 'L', 'S', 'E', 'Y', 'E',
+ 'B', 'U', 'S', 'S', 'Y', 'E', 'R', 'U',
+ 'C', 'A', 'D', 'U', 'C', 'E', 'U', 'S',
+ 'C', 'A', 'N', 'A', 'D', 'I', 'A', 'N',
+ 'C', 'A', 'R', 'R', 'I', 'A', 'G', 'E',
+ 'C', 'A', 'U', 'L', 'D', 'R', 'O', 'N',
+ 'C', 'H', 'A', 'M', 'I', 'L', 'O', 'N',
+ 'C', 'H', 'A', 'T', 'T', 'A', 'W', 'A',
+ 'C', 'H', 'E', 'R', 'O', 'K', 'E', 'E',
+ 'C', 'H', 'O', 'R', 'E', 'V', 'M', 'A',
+ 'C', 'H', 'O', 'S', 'E', 'O', 'N', 'G',
+ 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'R',
+ 'C', 'I', 'V', 'I', 'L', 'I', 'A', 'N',
+ 'C', 'L', 'I', 'M', 'A', 'C', 'U', 'S',
+ 'C', 'L', 'I', 'N', 'G', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'F', 'L', 'I', 'C', 'T',
+ 'C', 'O', 'N', 'S', 'T', 'A', 'N', 'T',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N', 'S',
+ 'C', 'O', 'U', 'N', 'T', 'I', 'N', 'G',
+ 'C', 'R', 'E', 'A', 'T', 'I', 'V', 'E',
+ 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'T',
+ 'C', 'R', 'O', 'S', 'S', 'I', 'N', 'G',
+ 'C', 'R', 'U', 'Z', 'E', 'I', 'R', 'O',
+ 'C', 'U', 'R', 'R', 'E', 'N', 'C', 'Y',
+ 'C', 'U', 'S', 'T', 'O', 'M', 'E', 'R',
+ 'C', 'Y', 'R', 'E', 'N', 'A', 'I', 'C',
+ 'C', 'Y', 'R', 'I', 'L', 'L', 'I', 'C',
+ 'D', 'A', 'M', 'M', 'A', 'T', 'A', 'N',
+ 'D', 'A', 'P', '-', 'B', 'U', 'O', 'N',
+ 'D', 'A', 'P', '-', 'M', 'U', 'O', 'Y',
+ 'D', 'A', 'P', '-', 'P', 'R', 'A', 'M',
+ 'D', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'D', 'D', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'D', 'E', 'C', 'E', 'M', 'B', 'E', 'R',
+ 'D', 'E', 'C', 'R', 'E', 'A', 'S', 'E',
+ 'D', 'E', 'N', 'A', 'R', 'I', 'U', 'S',
+ 'D', 'E', 'Y', 'T', 'E', 'R', 'O', 'S',
+ 'D', 'E', 'Y', 'T', 'E', 'R', 'O', 'U',
+ 'D', 'I', 'A', 'G', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'A', 'M', 'E', 'T', 'E', 'R',
+ 'D', 'I', 'A', 'S', 'T', 'O', 'L', 'I',
+ 'D', 'I', 'A', 'T', 'O', 'N', 'O', 'N',
+ 'D', 'I', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'D', 'I', 'G', 'O', 'R', 'G', 'O', 'N',
+ 'D', 'I', 'G', 'R', 'A', 'M', 'M', 'A',
+ 'D', 'I', 'R', 'E', 'C', 'T', 'L', 'Y',
+ 'D', 'I', 'V', 'I', 'S', 'I', 'O', 'N',
+ 'D', 'O', 'D', 'E', 'K', 'A', 'T', 'A',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '6', '7', '8',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'L',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'N',
+ 'D', 'O', 'T', 'T', 'E', 'D', '-', 'P',
+ 'D', 'R', 'A', 'C', 'H', 'M', 'A', 'S',
+ 'D', 'R', 'A', 'F', 'T', 'I', 'N', 'G',
+ 'D', 'R', 'A', 'U', 'G', 'H', 'T', 'S',
+ 'D', 'R', 'A', 'W', 'I', 'N', 'G', 'S',
+ 'D', 'U', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'D', 'V', 'I', 'S', 'V', 'A', 'R', 'A',
+ 'E', 'I', 'G', 'H', 'T', 'E', 'E', 'N',
+ 'E', 'L', 'E', 'C', 'T', 'R', 'I', 'C',
+ 'E', 'L', 'L', 'I', 'P', 'S', 'I', 'S',
+ 'E', 'M', 'P', 'H', 'A', 'S', 'I', 'S',
+ 'E', 'M', 'P', 'H', 'A', 'T', 'I', 'C',
+ 'E', 'N', 'T', 'E', 'R', 'I', 'N', 'G',
+ 'E', 'N', 'V', 'E', 'L', 'O', 'P', 'E',
+ 'E', 'P', 'E', 'G', 'E', 'R', 'M', 'A',
+ 'E', 'S', 'U', 'K', 'U', 'U', 'D', 'O',
+ 'E', 'T', 'E', 'R', 'N', 'I', 'T', 'Y',
+ 'E', 'T', 'H', 'I', 'O', 'P', 'I', 'C',
+ 'E', 'X', 'T', 'E', 'N', 'D', 'E', 'D',
+ 'F', 'A', 'T', 'H', 'A', 'T', 'A', 'N',
+ 'F', 'E', 'B', 'R', 'U', 'A', 'R', 'Y',
+ 'F', 'E', 'M', 'I', 'N', 'I', 'N', 'E',
+ 'F', 'E', 'S', 'T', 'I', 'V', 'A', 'L',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '1',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '2',
+ 'F', 'I', 'G', 'U', 'R', 'E', '-', '3',
+ 'F', 'I', 'N', 'G', 'E', 'R', 'E', 'D',
+ 'F', 'I', 'S', 'H', 'H', 'O', 'O', 'K',
+ 'F', 'L', 'A', 'T', 'N', 'E', 'S', 'S',
+ 'F', 'L', 'O', 'R', 'E', 'T', 'T', 'E',
+ 'F', 'L', 'O', 'U', 'R', 'I', 'S', 'H',
+ 'F', 'O', 'O', 'T', 'N', 'O', 'T', 'E',
+ 'F', 'O', 'U', 'R', 'T', 'E', 'E', 'N',
+ 'F', 'R', 'A', 'C', 'T', 'I', 'O', 'N',
+ 'F', 'R', 'A', 'G', 'M', 'E', 'N', 'T',
+ 'F', 'R', 'A', 'G', 'R', 'A', 'N', 'T',
+ 'F', 'R', 'O', 'W', 'N', 'I', 'N', 'G',
+ 'F', 'U', 'L', 'L', 'N', 'E', 'S', 'S',
+ 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'G', 'A', 'R', 'S', 'H', 'U', 'N', 'I',
+ 'G', 'A', 'U', 'N', 'T', 'L', 'E', 'T',
+ 'G', 'E', 'N', 'I', 'T', 'I', 'V', 'E',
+ 'G', 'E', 'O', 'R', 'G', 'I', 'A', 'N',
+ 'G', 'R', 'A', 'P', 'H', 'E', 'M', 'E',
+ 'G', 'U', 'J', 'A', 'R', 'A', 'T', 'I',
+ 'G', 'U', 'R', 'M', 'U', 'K', 'H', 'I',
+ 'H', 'A', 'N', '-', 'A', 'K', 'A', 'T',
+ 'H', 'A', 'N', 'G', 'Z', 'H', 'O', 'U',
+ 'H', 'A', 'R', 'D', 'N', 'E', 'S', 'S',
+ 'H', 'A', 'R', 'K', 'L', 'E', 'A', 'N',
+ 'H', 'A', 'R', 'M', 'O', 'N', 'I', 'C',
+ 'H', 'E', 'A', 'V', 'E', 'N', 'L', 'Y',
+ 'H', 'E', 'X', 'A', 'G', 'R', 'A', 'M',
+ 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A',
+ 'H', 'U', 'A', 'R', 'A', 'D', 'D', 'O',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'M',
+ 'I', 'L', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'M', 'I', 'F', 'O', 'N', 'O', 'N',
+ 'I', 'N', 'C', 'R', 'E', 'A', 'S', 'E',
+ 'I', 'N', 'D', 'I', 'R', 'E', 'C', 'T',
+ 'I', 'N', 'F', 'I', 'N', 'I', 'T', 'Y',
+ 'I', 'N', 'H', 'E', 'R', 'E', 'N', 'T',
+ 'I', 'N', 'T', 'E', 'G', 'R', 'A', 'L',
+ 'I', 'N', 'T', 'E', 'R', 'E', 'S', 'T',
+ 'I', 'N', 'T', 'E', 'R', 'I', 'O', 'R',
+ 'I', 'N', 'V', 'E', 'R', 'T', 'E', 'D',
+ 'I', 'O', 'T', 'I', 'F', 'I', 'E', 'D',
+ 'I', 'R', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'S', '-', 'P', 'I', 'L', 'L', 'A',
+ 'I', 'S', 'O', 'L', 'A', 'T', 'E', 'D',
+ 'J', 'A', 'P', 'A', 'N', 'E', 'S', 'E',
+ 'J', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'K', 'A', 'S', 'R', 'A', 'T', 'A', 'N',
+ 'K', 'A', 'T', 'A', 'K', 'A', 'N', 'A',
+ 'K', 'A', 'T', 'H', 'I', 'S', 'T', 'I',
+ 'K', 'E', 'Y', 'B', 'O', 'A', 'R', 'D',
+ 'K', 'O', 'N', 'T', 'E', 'V', 'M', 'A',
+ 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'K', 'R', 'E', 'M', 'A', 'S', 'T', 'I',
+ 'L', '-', 'S', 'H', 'A', 'P', 'E', 'D',
+ 'L', 'A', 'N', 'G', 'U', 'A', 'G', 'E',
+ 'L', 'A', 'T', 'I', 'N', 'A', 'T', 'E',
+ 'L', 'I', 'G', 'A', 'T', 'U', 'R', 'E',
+ 'L', 'O', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'O', 'C', 'A', 'T', 'I', 'V', 'E',
+ 'L', 'O', 'G', 'O', 'T', 'Y', 'P', 'E',
+ 'L', 'O', 'R', 'R', 'A', 'I', 'N', 'E',
+ 'M', 'A', 'H', 'A', 'P', 'A', 'K', 'H',
+ 'M', 'A', 'I', 'M', 'A', 'L', 'A', 'I',
+ 'M', 'A', 'I', 'Y', 'A', 'M', 'O', 'K',
+ 'M', 'A', 'N', 'A', 'C', 'L', 'E', 'S',
+ 'M', 'A', 'N', 'G', 'A', 'L', 'A', 'M',
+ 'M', 'A', 'R', 'R', 'I', 'A', 'G', 'E',
+ 'M', 'A', 'R', 'R', 'Y', 'I', 'N', 'G',
+ 'M', 'A', 'R', 'T', 'Y', 'R', 'I', 'A',
+ 'M', 'E', 'A', 'S', 'U', 'R', 'E', 'D',
+ 'M', 'E', 'D', 'I', 'C', 'I', 'N', 'E',
+ 'M', 'E', 'T', 'R', 'E', 'T', 'E', 'S',
+ 'M', 'E', 'T', 'R', 'I', 'C', 'A', 'L',
+ 'M', 'I', 'L', 'L', 'I', 'O', 'N', 'S',
+ 'M', 'I', 'N', 'I', 'S', 'T', 'E', 'R',
+ 'M', 'O', 'D', 'I', 'F', 'I', 'E', 'R',
+ 'M', 'O', 'H', 'A', 'M', 'M', 'A', 'D',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'M',
+ 'M', 'O', 'U', 'N', 'T', 'A', 'I', 'N',
+ 'M', 'U', 'L', 'T', 'I', 'M', 'A', 'P',
+ 'M', 'U', 'L', 'T', 'I', 'P', 'L', 'E',
+ 'M', 'U', 'L', 'T', 'I', 'S', 'E', 'T',
+ 'N', 'A', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'N', 'E', 'G', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'E', 'G', 'A', 'T', 'I', 'V', 'E',
+ 'N', 'I', 'K', 'H', 'A', 'H', 'I', 'T',
+ 'N', 'I', 'N', 'E', 'T', 'E', 'E', 'N',
+ 'N', 'O', '-', 'B', 'R', 'E', 'A', 'K',
+ 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'O', 'T', 'E', 'H', 'E', 'A', 'D',
+ 'N', 'O', 'V', 'E', 'M', 'B', 'E', 'R',
+ 'O', 'M', 'I', 'S', 'S', 'I', 'O', 'N',
+ 'O', 'N', 'E', '-', 'L', 'I', 'N', 'E',
+ 'O', 'P', 'E', 'R', 'A', 'T', 'O', 'R',
+ 'O', 'P', 'P', 'O', 'S', 'I', 'N', 'G',
+ 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L',
+ 'O', 'R', 'N', 'A', 'M', 'E', 'N', 'T',
+ 'O', 'R', 'T', 'H', 'O', 'D', 'O', 'X',
+ 'O', 'U', 'T', 'L', 'I', 'N', 'E', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'I', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'I', 'N', 'E',
+ 'O', 'V', 'E', 'R', 'R', 'I', 'D', 'E',
+ 'P', 'A', 'A', 'S', 'E', 'N', 'T', 'O',
+ 'P', 'A', 'I', 'R', 'T', 'H', 'R', 'A',
+ 'P', 'A', 'L', 'O', 'C', 'H', 'K', 'A',
+ 'P', 'A', 'M', 'E', 'N', 'E', 'N', 'G',
+ 'P', 'A', 'M', 'U', 'D', 'P', 'O', 'D',
+ 'P', 'A', 'N', 'G', 'H', 'U', 'L', 'U',
+ 'P', 'A', 'N', 'O', 'L', 'O', 'N', 'G',
+ 'P', 'A', 'N', 'Y', 'A', 'K', 'R', 'A',
+ 'P', 'A', 'N', 'Y', 'E', 'C', 'E', 'K',
+ 'P', 'A', 'R', 'A', 'L', 'L', 'E', 'L',
+ 'P', 'A', 'R', 'I', 'C', 'H', 'O', 'N',
+ 'P', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'P', 'E', 'D', 'E', 'S', 'T', 'A', 'L',
+ 'P', 'E', 'L', 'A', 'S', 'T', 'O', 'N',
+ 'P', 'E', 'N', 'T', 'A', 'G', 'O', 'N',
+ 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'A',
+ 'P', 'E', 'T', 'A', 'L', 'L', 'E', 'D',
+ 'P', 'H', 'A', 'A', 'R', 'K', 'A', 'A',
+ 'P', 'H', 'A', 'G', 'S', '-', 'P', 'A',
+ 'P', 'H', 'A', 'I', 'S', 'T', 'O', 'S',
+ 'P', 'I', 'N', 'W', 'H', 'E', 'E', 'L',
+ 'P', 'L', 'A', 'S', 'T', 'I', 'C', 'S',
+ 'P', 'L', 'E', 'T', 'H', 'R', 'O', 'N',
+ 'P', 'N', 'E', 'U', 'M', 'A', 'T', 'A',
+ 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'P', 'O', 'K', 'R', 'Y', 'T', 'I', 'E',
+ 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'A', 'M', '-', 'B', 'E', 'I',
+ 'P', 'R', 'A', 'M', '-', 'P', 'I', 'I',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E', 'D',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'E', 'S',
+ 'P', 'R', 'E', 'V', 'I', 'O', 'U', 'S',
+ 'P', 'R', 'O', 'F', 'O', 'U', 'N', 'D',
+ 'P', 'R', 'O', 'G', 'R', 'E', 'S', 'S',
+ 'P', 'R', 'O', 'P', 'E', 'R', 'T', 'Y',
+ 'Q', 'A', 'I', 'R', 'T', 'H', 'R', 'A',
+ 'Q', 'U', 'A', 'D', 'R', 'A', 'N', 'T',
+ 'Q', 'U', 'A', 'R', 'T', 'E', 'R', 'S',
+ 'Q', 'U', 'E', 'S', 'T', 'I', 'O', 'N',
+ 'Q', 'U', 'I', 'N', 'C', 'U', 'N', 'X',
+ 'R', 'E', 'C', 'O', 'R', 'D', 'E', 'R',
+ 'R', 'E', 'C', 'Y', 'C', 'L', 'E', 'D',
+ 'R', 'E', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'R', 'E', 'L', 'I', 'G', 'I', 'O', 'N',
+ 'R', 'E', 'N', 'T', 'O', 'G', 'E', 'N',
+ 'R', 'E', 'P', 'E', 'A', 'T', 'E', 'D',
+ 'R', 'E', 'S', 'O', 'U', 'R', 'C', 'E',
+ 'R', 'E', 'S', 'P', 'O', 'N', 'S', 'E',
+ 'R', 'E', 'V', 'E', 'R', 'S', 'E', 'D',
+ 'R', 'U', 'K', 'K', 'A', 'K', 'H', 'A',
+ 'S', '-', 'S', 'H', 'A', 'P', 'E', 'D',
+ 'S', 'A', 'L', 'T', 'I', 'L', 'L', 'O',
+ 'S', 'A', 'N', 'T', 'I', 'I', 'M', 'U',
+ 'S', 'A', 'N', 'Y', 'O', 'O', 'G', 'A',
+ 'S', 'A', 'X', 'I', 'M', 'A', 'T', 'A',
+ 'S', 'C', 'I', 'S', 'S', 'O', 'R', 'S',
+ 'S', 'C', 'O', 'R', 'P', 'I', 'U', 'S',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R',
+ 'S', 'E', 'M', 'I', 'S', 'O', 'F', 'T',
+ 'S', 'E', 'M', 'U', 'N', 'C', 'I', 'A',
+ 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'S', 'H', 'A', 'M', 'R', 'O', 'C', 'K',
+ 'S', 'H', 'E', '-', 'G', 'O', 'A', 'T',
+ 'S', 'H', 'E', 'S', 'H', 'L', 'A', 'M',
+ 'S', 'I', 'C', 'K', 'N', 'E', 'S', 'S',
+ 'S', 'I', 'D', 'E', 'W', 'A', 'Y', 'S',
+ 'S', 'I', 'M', 'A', 'N', 'S', 'I', 'S',
+ 'S', 'I', 'X', '-', 'L', 'I', 'N', 'E',
+ 'S', 'L', 'A', 'V', 'O', 'N', 'I', 'C',
+ 'S', 'Q', 'U', 'I', 'G', 'G', 'L', 'E',
+ 'S', 'Q', 'U', 'I', 'R', 'R', 'E', 'L',
+ 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'S', 'T', 'A', 'L', 'L', 'I', 'O', 'N',
+ 'S', 'T', 'A', 'N', 'D', 'A', 'R', 'D',
+ 'S', 'T', 'O', 'P', 'P', 'A', 'G', 'E',
+ 'S', 'T', 'O', 'P', 'P', 'I', 'N', 'G',
+ 'S', 'T', 'R', 'A', 'I', 'G', 'H', 'T',
+ 'S', 'T', 'R', 'A', 'I', 'N', 'E', 'R',
+ 'S', 'T', 'R', 'A', 'T', 'I', 'A', 'N',
+ 'S', 'T', 'R', 'E', 'N', 'G', 'T', 'H',
+ 'S', 'T', 'R', 'I', 'C', 'T', 'L', 'Y',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '2',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '3',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '4',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '5',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '6',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '7',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '8',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '9',
+ 'S', 'U', 'B', 'G', 'R', 'O', 'U', 'P',
+ 'S', 'U', 'C', 'C', 'E', 'E', 'D', 'S',
+ 'S', 'U', 'I', 'T', 'A', 'B', 'L', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'S', 'E', 'T',
+ 'S', 'U', 'R', 'R', 'O', 'U', 'N', 'D',
+ 'S', 'W', 'A', 'P', 'P', 'I', 'N', 'G',
+ 'S', 'Y', 'L', 'L', 'A', 'B', 'L', 'E',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '9',
+ 'S', 'Y', 'M', 'M', 'E', 'T', 'R', 'Y',
+ 'T', 'A', 'G', 'B', 'A', 'N', 'W', 'A',
+ 'T', 'A', 'I', 'L', 'L', 'E', 'S', 'S',
+ 'T', 'A', 'T', 'T', 'O', 'O', 'E', 'D',
+ 'T', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'T', 'E', 'S', 'S', 'A', 'R', 'O', 'N',
+ 'T', 'E', 'T', 'A', 'R', 'T', 'O', 'S',
+ 'T', 'E', 'T', 'R', 'A', 'P', 'L', 'I',
+ 'T', 'H', 'E', 'S', 'P', 'I', 'A', 'N',
+ 'T', 'H', 'I', 'R', 'T', 'E', 'E', 'N',
+ 'T', 'H', 'O', 'U', 'S', 'A', 'N', 'D',
+ 'T', 'H', 'U', 'R', 'I', 'S', 'A', 'Z',
+ 'T', 'I', 'F', 'I', 'N', 'A', 'G', 'H',
+ 'T', 'I', 'R', 'O', 'N', 'I', 'A', 'N',
+ 'T', 'O', 'G', 'E', 'T', 'H', 'E', 'R',
+ 'T', 'O', 'R', 'C', 'U', 'L', 'U', 'S',
+ 'T', 'O', 'R', 'T', 'O', 'I', 'S', 'E',
+ 'T', 'R', 'E', 'A', 'D', 'I', 'N', 'G',
+ 'T', 'R', 'E', 'S', 'I', 'L', 'L', 'O',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E',
+ 'T', 'R', 'I', 'C', 'O', 'L', 'O', 'N',
+ 'T', 'R', 'I', 'S', 'I', 'M', 'O', 'U',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'N',
+ 'T', 'R', 'Y', 'B', 'L', 'I', 'O', 'N',
+ 'T', 'T', 'A', 'Y', 'A', 'N', 'N', 'A',
+ 'T', 'T', 'U', 'D', 'D', 'A', 'A', 'G',
+ 'T', 'V', 'I', 'M', 'A', 'D', 'U', 'R',
+ 'T', 'W', 'O', '-', 'L', 'I', 'N', 'E',
+ 'U', 'G', 'A', 'R', 'I', 'T', 'I', 'C',
+ 'U', 'I', 'L', 'L', 'E', 'A', 'N', 'N',
+ 'U', 'M', 'B', 'R', 'E', 'L', 'L', 'A',
+ 'U', 'N', 'D', 'E', 'R', 'B', 'A', 'R',
+ 'U', 'N', 'D', 'E', 'R', 'D', 'O', 'T',
+ 'U', 'N', 'D', 'E', 'R', 'T', 'I', 'E',
+ 'V', 'A', 'S', 'T', 'N', 'E', 'S', 'S',
+ 'V', 'E', 'R', 'S', 'I', 'C', 'L', 'E',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L',
+ 'V', 'I', 'E', 'W', 'D', 'A', 'T', 'A',
+ 'W', 'A', 'N', 'D', 'E', 'R', 'E', 'R',
+ 'W', 'A', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'Y', 'A', 'M', 'A', 'K', 'K', 'A', 'N',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G',
+ 'Y', 'O', 'U', 'T', 'H', 'F', 'U', 'L',
+ 'Z', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'Z', 'W', 'A', 'R', 'A', 'K', 'A', 'Y',
+ 'A', 'A', 'B', 'A', 'A', 'F', 'I', 'L', 'I',
+ 'A', 'B', 'K', 'H', 'A', 'S', 'I', 'A', 'N',
+ 'A', 'B', 'U', 'N', 'D', 'A', 'N', 'C', 'E',
+ 'A', 'D', 'D', 'R', 'E', 'S', 'S', 'E', 'D',
+ 'A', 'L', '-', 'L', 'A', 'K', 'U', 'N', 'A',
+ 'A', 'L', 'P', 'A', 'P', 'R', 'A', 'N', 'A',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'E',
+ 'A', 'M', 'P', 'E', 'R', 'S', 'A', 'N', 'D',
+ 'A', 'N', 'T', 'I', 'F', 'O', 'N', 'I', 'A',
+ 'A', 'R', '-', 'R', 'A', 'H', 'E', 'E', 'M',
+ 'A', 'R', '-', 'R', 'A', 'H', 'M', 'A', 'N',
+ 'A', 'R', 'R', 'O', 'W', 'H', 'E', 'A', 'D',
+ 'A', 'S', 'C', 'E', 'N', 'D', 'I', 'N', 'G',
+ 'A', 'S', 'P', 'I', 'R', 'A', 'T', 'E', 'D',
+ 'A', 'S', 'S', 'E', 'R', 'T', 'I', 'O', 'N',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'K', 'S',
+ 'A', 'T', 'T', 'E', 'N', 'T', 'I', 'O', 'N',
+ 'B', 'A', 'C', 'K', 'S', 'L', 'A', 'S', 'H',
+ 'B', 'A', 'C', 'K', 'S', 'P', 'A', 'C', 'E',
+ 'B', 'E', 'G', 'I', 'N', 'N', 'I', 'N', 'G',
+ 'B', 'I', 'N', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'B', 'I', 'O', 'H', 'A', 'Z', 'A', 'R', 'D',
+ 'B', 'I', 'S', 'E', 'C', 'T', 'I', 'N', 'G',
+ 'B', 'I', 'S', 'M', 'I', 'L', 'L', 'A', 'H',
+ 'B', 'L', 'A', 'C', 'K', 'F', 'O', 'O', 'T',
+ 'B', 'O', 'O', 'M', 'E', 'R', 'A', 'N', 'G',
+ 'B', 'R', 'A', 'N', 'C', 'H', 'I', 'N', 'G',
+ 'B', 'Y', 'Z', 'A', 'N', 'T', 'I', 'N', 'E',
+ 'C', 'A', 'P', 'R', 'I', 'C', 'O', 'R', 'N',
+ 'C', 'A', 'R', 'P', 'E', 'N', 'T', 'R', 'Y',
+ 'C', 'A', 'R', 'Y', 'S', 'T', 'I', 'A', 'N',
+ 'C', 'E', 'N', 'T', 'U', 'R', 'I', 'A', 'L',
+ 'C', 'H', 'A', 'R', 'A', 'C', 'T', 'E', 'R',
+ 'C', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E',
+ 'C', 'L', 'O', 'S', 'E', 'N', 'E', 'S', 'S',
+ 'C', 'O', 'M', 'B', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E', 'D',
+ 'C', 'O', 'N', 'G', 'R', 'U', 'E', 'N', 'T',
+ 'C', 'O', 'N', 'J', 'U', 'G', 'A', 'T', 'E',
+ 'C', 'O', 'N', 'S', 'O', 'N', 'A', 'N', 'T',
+ 'C', 'O', 'N', 'S', 'T', 'A', 'N', 'C', 'Y',
+ 'C', 'O', 'N', 'T', 'O', 'U', 'R', 'E', 'D',
+ 'C', 'O', 'P', 'R', 'O', 'D', 'U', 'C', 'T',
+ 'C', 'O', 'P', 'Y', 'R', 'I', 'G', 'H', 'T',
+ 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'D', 'O',
+ 'C', 'U', 'A', 'T', 'R', 'I', 'L', 'L', 'O',
+ 'C', 'U', 'N', 'E', 'I', 'F', 'O', 'R', 'M',
+ 'D', 'A', 'H', 'Y', 'A', 'A', 'U', 'S', 'H',
+ 'D', 'A', 'R', 'K', 'E', 'N', 'I', 'N', 'G',
+ 'D', 'E', 'L', 'I', 'M', 'I', 'T', 'E', 'R',
+ 'D', 'E', 'N', 'T', 'I', 'S', 'T', 'R', 'Y',
+ 'D', 'E', 'P', 'A', 'R', 'T', 'I', 'N', 'G',
+ 'D', 'E', 'P', 'A', 'R', 'T', 'U', 'R', 'E',
+ 'D', 'E', 'S', 'C', 'E', 'N', 'D', 'E', 'R',
+ 'D', 'I', 'A', 'E', 'R', 'E', 'S', 'I', 'S',
+ 'D', 'I', 'A', 'L', 'E', 'C', 'T', '-', 'P',
+ 'D', 'I', 'A', 'L', 'Y', 'T', 'I', 'K', 'A',
+ 'D', 'I', 'A', 'T', 'O', 'N', 'I', 'K', 'I',
+ 'D', 'I', 'F', 'T', 'O', 'G', 'G', 'O', 'S',
+ 'D', 'I', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'D', 'I', 'M', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '5', '6', '7', '8',
+ 'D', 'O', 'W', 'N', 'W', 'A', 'R', 'D', 'S',
+ 'D', 'U', 'P', 'O', 'N', 'D', 'I', 'U', 'S',
+ 'E', 'D', 'I', 'T', 'O', 'R', 'I', 'A', 'L',
+ 'E', 'E', 'B', 'E', 'E', 'F', 'I', 'L', 'I',
+ 'E', 'M', 'B', 'E', 'D', 'D', 'I', 'N', 'G',
+ 'E', 'N', 'C', 'L', 'O', 'S', 'I', 'N', 'G',
+ 'E', 'N', 'C', 'L', 'O', 'S', 'U', 'R', 'E',
+ 'E', 'N', 'D', 'E', 'A', 'V', 'O', 'U', 'R',
+ 'E', 'N', 'D', 'O', 'F', 'O', 'N', 'O', 'N',
+ 'E', 'S', 'T', 'I', 'M', 'A', 'T', 'E', 'D',
+ 'E', 'S', 'T', 'I', 'M', 'A', 'T', 'E', 'S',
+ 'E', 'X', 'C', 'E', 'L', 'L', 'E', 'N', 'T',
+ 'E', 'X', 'T', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'E', 'X', 'T', 'R', 'A', '-', 'L', 'O', 'W',
+ 'E', 'Y', 'B', 'E', 'Y', 'F', 'I', 'L', 'I',
+ 'F', 'A', 'C', 'S', 'I', 'M', 'I', 'L', 'E',
+ 'F', 'A', 'N', 'E', 'R', 'O', 'S', 'I', 'S',
+ 'F', 'I', 'N', 'A', 'N', 'C', 'I', 'A', 'L',
+ 'F', 'I', 'V', 'E', '-', 'L', 'I', 'N', 'E',
+ 'F', 'L', 'A', 'T', 'T', 'E', 'N', 'E', 'D',
+ 'F', 'O', 'L', 'L', 'O', 'W', 'I', 'N', 'G',
+ 'F', 'O', 'O', 'T', 'S', 'T', 'O', 'O', 'L',
+ 'F', 'O', 'S', 'T', 'E', 'R', 'I', 'N', 'G',
+ 'F', 'O', 'U', 'R', '-', 'L', 'I', 'N', 'E',
+ 'F', 'R', 'E', 'T', 'B', 'O', 'A', 'R', 'D',
+ 'F', 'R', 'I', 'C', 'A', 'T', 'I', 'V', 'E',
+ 'F', 'U', 'L', 'L', 'W', 'I', 'D', 'T', 'H',
+ 'G', 'A', 'T', 'H', 'E', 'R', 'I', 'N', 'G',
+ 'G', 'E', 'O', 'M', 'E', 'T', 'R', 'I', 'C',
+ 'G', 'E', 'R', 'S', 'H', 'A', 'Y', 'I', 'M',
+ 'G', 'L', 'I', 'S', 'S', 'A', 'N', 'D', 'O',
+ 'G', 'N', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'G', 'O', 'R', 'G', 'O', 'T', 'E', 'R', 'I',
+ 'G', 'R', 'E', 'A', 'T', 'N', 'E', 'S', 'S',
+ 'G', 'R', 'E', 'G', 'O', 'R', 'I', 'A', 'N',
+ 'G', 'U', 'R', 'A', 'M', 'U', 'T', 'O', 'N',
+ 'H', 'A', 'L', 'F', 'W', 'I', 'D', 'T', 'H',
+ 'H', 'E', 'K', 'U', 'T', 'A', 'A', 'R', 'U',
+ 'H', 'E', 'R', 'M', 'I', 'T', 'I', 'A', 'N',
+ 'H', 'O', 'U', 'R', 'G', 'L', 'A', 'S', 'S',
+ 'I', 'C', 'H', 'I', 'M', 'A', 'T', 'O', 'S',
+ 'I', 'D', 'E', 'N', 'T', 'I', 'C', 'A', 'L',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'P', 'H',
+ 'I', 'L', 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'M', 'I', 'F', 'T', 'H', 'O', 'R', 'A',
+ 'I', 'N', 'C', 'L', 'U', 'D', 'I', 'N', 'G',
+ 'I', 'N', 'C', 'R', 'E', 'A', 'S', 'E', 'S',
+ 'I', 'N', 'C', 'R', 'E', 'M', 'E', 'N', 'T',
+ 'I', 'N', 'D', 'I', 'C', 'A', 'T', 'O', 'R',
+ 'I', 'N', 'F', 'L', 'U', 'E', 'N', 'C', 'E',
+ 'I', 'N', 'N', 'O', 'C', 'E', 'N', 'C', 'E',
+ 'I', 'N', 'S', 'E', 'R', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'V', 'I', 'S', 'I', 'B', 'L', 'E',
+ 'I', 'R', 'U', 'U', 'Y', 'A', 'N', 'N', 'A',
+ 'I', 'T', 'E', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'J', 'E', 'R', 'U', 'S', 'A', 'L', 'E', 'M',
+ 'J', 'O', 'N', 'G', 'S', 'E', 'O', 'N', 'G',
+ 'J', 'U', 'N', 'G', 'S', 'E', 'O', 'N', 'G',
+ 'K', 'A', 'T', 'A', 'V', 'A', 'S', 'M', 'A',
+ 'K', 'E', 'M', 'P', 'H', 'R', 'E', 'N', 'G',
+ 'K', 'E', 'N', 'T', 'I', 'M', 'A', 'T', 'A',
+ 'K', 'I', 'R', 'O', 'W', 'A', 'T', 'T', 'O',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'A', 'T', 'A',
+ 'K', 'U', 'R', 'U', 'Z', 'E', 'I', 'R', 'O',
+ 'L', 'A', 'B', 'O', 'U', 'R', 'I', 'N', 'G',
+ 'L', 'A', 'R', 'Y', 'N', 'G', 'E', 'A', 'L',
+ 'L', 'E', 'F', 'T', '-', 'H', 'A', 'N', 'D',
+ 'L', 'E', 'F', 'T', '-', 'S', 'I', 'D', 'E',
+ 'L', 'E', 'F', 'T', '-', 'S', 'T', 'E', 'M',
+ 'L', 'E', 'F', 'T', 'W', 'A', 'R', 'D', 'S',
+ 'L', 'E', 'S', 'S', '-', 'T', 'H', 'A', 'N',
+ 'L', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'L', 'I', 'A', 'B', 'I', 'L', 'I', 'T', 'Y',
+ 'L', 'I', 'G', 'H', 'T', 'N', 'I', 'N', 'G',
+ 'M', 'A', 'H', 'A', 'P', 'R', 'A', 'N', 'A',
+ 'M', 'A', 'I', 'T', 'A', 'I', 'K', 'H', 'U',
+ 'M', 'A', 'L', 'A', 'Y', 'A', 'L', 'A', 'M',
+ 'M', 'A', 'S', 'C', 'U', 'L', 'I', 'N', 'E',
+ 'M', 'A', 'T', 'E', 'R', 'I', 'A', 'L', 'S',
+ 'M', 'E', 'S', 'S', 'E', 'N', 'I', 'A', 'N',
+ 'M', 'E', 'T', 'O', 'B', 'E', 'L', 'U', 'S',
+ 'M', 'I', 'R', 'I', 'B', 'A', 'A', 'R', 'U',
+ 'M', 'O', 'N', 'G', 'O', 'L', 'I', 'A', 'N',
+ 'M', 'O', 'N', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'P', 'H',
+ 'M', 'O', 'N', 'O', 'S', 'P', 'A', 'C', 'E',
+ 'M', 'U', 'K', 'P', 'H', 'R', 'E', 'N', 'G',
+ 'M', 'U', 'U', 'R', 'D', 'H', 'A', 'J', 'A',
+ 'N', 'I', 'G', 'G', 'A', 'H', 'I', 'T', 'A',
+ 'N', 'I', 'G', 'I', 'D', 'A', 'E', 'S', 'H',
+ 'N', 'I', 'G', 'I', 'D', 'A', 'M', 'I', 'N',
+ 'N', 'O', 'R', 'T', 'H', 'W', 'E', 'S', 'T',
+ 'N', 'U', 'M', 'E', 'R', 'A', 'T', 'O', 'R',
+ 'O', 'A', 'B', 'O', 'A', 'F', 'I', 'L', 'I',
+ 'O', 'O', 'B', 'O', 'O', 'F', 'I', 'L', 'I',
+ 'O', 'Y', 'R', 'A', 'N', 'I', 'S', 'M', 'A',
+ 'P', 'A', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'P', 'A', 'I', 'Y', 'A', 'N', 'N', 'O', 'I',
+ 'P', 'A', 'M', 'I', 'N', 'G', 'K', 'A', 'L',
+ 'P', 'A', 'M', 'U', 'N', 'G', 'K', 'A', 'H',
+ 'P', 'A', 'N', 'G', 'L', 'A', 'Y', 'A', 'R',
+ 'P', 'A', 'N', 'G', 'W', 'I', 'S', 'A', 'D',
+ 'P', 'A', 'R', 'A', 'G', 'R', 'A', 'P', 'H',
+ 'P', 'E', 'N', 'T', 'A', 'S', 'E', 'M', 'E',
+ 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'U', 'M',
+ 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T',
+ 'P', 'I', 'A', 'S', 'U', 'T', 'O', 'R', 'U',
+ 'P', 'I', 'T', 'C', 'H', 'F', 'O', 'R', 'K',
+ 'P', 'I', 'Z', 'Z', 'I', 'C', 'A', 'T', 'O',
+ 'P', 'O', 'R', 'R', 'E', 'C', 'T', 'U', 'S',
+ 'P', 'R', 'A', 'M', '-', 'B', 'U', 'O', 'N',
+ 'P', 'R', 'A', 'M', '-', 'M', 'U', 'O', 'Y',
+ 'P', 'R', 'E', 'C', 'E', 'D', 'I', 'N', 'G',
+ 'P', 'R', 'O', 'L', 'O', 'N', 'G', 'E', 'D',
+ 'P', 'R', 'O', 'P', 'E', 'L', 'L', 'E', 'R',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'N',
+ 'Q', 'U', 'A', 'D', 'R', 'U', 'P', 'L', 'E',
+ 'Q', 'U', 'I', 'N', 'A', 'R', 'I', 'U', 'S',
+ 'Q', 'U', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'Q', 'U', 'S', 'H', 'S', 'H', 'A', 'Y', 'A',
+ 'R', 'E', 'C', 'E', 'P', 'T', 'I', 'V', 'E',
+ 'R', 'E', 'C', 'O', 'R', 'D', 'I', 'N', 'G',
+ 'R', 'E', 'C', 'T', 'A', 'N', 'G', 'L', 'E',
+ 'R', 'E', 'C', 'Y', 'C', 'L', 'I', 'N', 'G',
+ 'R', 'E', 'F', 'E', 'R', 'E', 'N', 'C', 'E',
+ 'R', 'E', 'P', 'R', 'E', 'S', 'E', 'N', 'T',
+ 'R', 'E', 'S', 'I', 'D', 'E', 'N', 'C', 'E',
+ 'R', 'E', 'S', 'U', 'P', 'I', 'N', 'U', 'S',
+ 'R', 'E', 'T', 'R', 'O', 'F', 'L', 'E', 'X',
+ 'R', 'I', 'G', 'H', 'T', 'H', 'A', 'N', 'D',
+ 'S', 'A', 'M', 'A', 'R', 'I', 'T', 'A', 'N',
+ 'S', 'C', 'A', 'N', 'D', 'I', 'C', 'U', 'S',
+ 'S', 'E', 'B', 'A', 'T', 'B', 'E', 'I', 'T',
+ 'S', 'E', 'M', 'I', 'C', 'O', 'L', 'O', 'N',
+ 'S', 'E', 'M', 'I', 'V', 'O', 'W', 'E', 'L',
+ 'S', 'E', 'P', 'A', 'R', 'A', 'T', 'O', 'R',
+ 'S', 'E', 'P', 'T', 'E', 'M', 'B', 'E', 'R',
+ 'S', 'E', 'V', 'E', 'N', 'T', 'E', 'E', 'N',
+ 'S', 'E', 'V', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'S', 'H', 'A', 'V', 'I', 'Y', 'A', 'N', 'I',
+ 'S', 'H', 'O', 'R', 'T', 'E', 'N', 'E', 'R',
+ 'S', 'I', 'X', 'T', 'E', 'E', 'N', 'T', 'H',
+ 'S', 'N', 'O', 'W', 'F', 'L', 'A', 'K', 'E',
+ 'S', 'P', 'H', 'E', 'R', 'I', 'C', 'A', 'L',
+ 'S', 'P', 'L', 'I', 'T', 'T', 'I', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'S', 'T', 'R', 'E', 'T', 'C', 'H', 'E', 'D',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1', '0',
+ 'S', 'T', 'R', 'O', 'K', 'E', '-', '1', '1',
+ 'S', 'U', 'B', 'J', 'O', 'I', 'N', 'E', 'D',
+ 'S', 'U', 'B', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'S', 'U', 'B', 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'U', 'M', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'S', 'U', 'N', 'D', 'A', 'N', 'E', 'S', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'V', 'I', 'S', 'E',
+ 'S', 'Y', 'L', 'L', 'A', 'B', 'I', 'C', 'S',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '1', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '4',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '2', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '6',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '3', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '5',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '7',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '8',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '4', '9',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '0',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '1',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '2',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '3',
+ 'S', 'Y', 'M', 'B', 'O', 'L', '-', '5', '4',
+ 'S', 'Y', 'M', 'M', 'E', 'T', 'R', 'I', 'C',
+ 'S', 'Y', 'N', 'D', 'E', 'S', 'M', 'O', 'S',
+ 'S', 'Y', 'R', 'M', 'A', 'T', 'I', 'K', 'I',
+ 'T', 'A', 'K', 'H', 'A', 'L', 'L', 'U', 'S',
+ 'T', 'E', 'L', 'E', 'G', 'R', 'A', 'P', 'H',
+ 'T', 'E', 'L', 'E', 'P', 'H', 'O', 'N', 'E',
+ 'T', 'E', 'T', 'R', 'A', 'G', 'R', 'A', 'M',
+ 'T', 'E', 'T', 'R', 'A', 'S', 'E', 'M', 'E',
+ 'T', 'H', 'E', 'R', 'E', 'F', 'O', 'R', 'E',
+ 'T', 'H', 'O', 'U', 'S', 'A', 'N', 'D', 'S',
+ 'T', 'R', 'A', 'P', 'E', 'Z', 'I', 'U', 'M',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '1',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '2',
+ 'T', 'R', 'E', 'M', 'O', 'L', 'O', '-', '3',
+ 'T', 'R', 'I', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'T', 'R', 'I', 'G', 'O', 'R', 'G', 'O', 'N',
+ 'T', 'R', 'U', 'N', 'C', 'A', 'T', 'E', 'D',
+ 'T', 'U', 'R', 'N', 'S', 'T', 'I', 'L', 'E',
+ 'T', 'U', 'T', 'E', 'Y', 'A', 'S', 'A', 'T',
+ 'U', 'K', 'R', 'A', 'I', 'N', 'I', 'A', 'N',
+ 'U', 'N', 'D', 'E', 'R', 'L', 'I', 'N', 'E',
+ 'U', 'N', 'I', 'V', 'E', 'R', 'S', 'A', 'L',
+ 'U', 'N', 'M', 'A', 'R', 'R', 'I', 'E', 'D',
+ 'V', 'A', 'R', 'I', 'A', 'T', 'I', 'O', 'N',
+ 'V', 'I', 'S', 'A', 'R', 'G', 'A', 'Y', 'A',
+ 'V', 'O', 'I', 'C', 'E', 'L', 'E', 'S', 'S',
+ 'W', 'A', 'S', 'S', 'A', 'L', 'L', 'A', 'M',
+ 'W', 'E', 'S', 'T', '-', 'C', 'R', 'E', 'E',
+ 'W', 'O', 'R', 'D', 'S', 'P', 'A', 'C', 'E',
+ 'Y', 'P', 'O', 'K', 'R', 'I', 'S', 'I', 'S',
+ 'A', 'C', 'R', 'O', 'P', 'H', 'O', 'N', 'I', 'C',
+ 'A', 'E', 'D', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'A', 'E', 'L', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'A', 'L', 'P', 'A', 'P', 'R', 'A', 'A', 'N', 'A',
+ 'A', 'N', 'G', 'K', 'H', 'A', 'N', 'K', 'H', 'U',
+ 'A', 'N', 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'N', 'T', 'I', 'K', 'E', 'N', 'O', 'M', 'A',
+ 'A', 'N', 'U', 'S', 'V', 'A', 'R', 'A', 'Y', 'A',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'F', 'O', 'I',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'F', 'O', 'S',
+ 'A', 'P', 'O', 'S', 'T', 'R', 'O', 'P', 'H', 'E',
+ 'A', 'P', 'P', 'R', 'O', 'A', 'C', 'H', 'E', 'S',
+ 'A', 'R', 'P', 'E', 'G', 'G', 'I', 'A', 'T', 'O',
+ 'A', 'R', 'R', 'O', 'W', '-', 'T', 'A', 'I', 'L',
+ 'A', 'S', 'T', 'E', 'R', 'I', 'S', 'C', 'U', 'S',
+ 'A', 'T', 'H', 'A', 'P', 'A', 'S', 'C', 'A', 'N',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A',
+ 'B', 'A', 'R', 'I', 'Y', 'O', 'O', 'S', 'A', 'N',
+ 'B', 'A', 'T', 'H', 'A', 'M', 'A', 'S', 'A', 'T',
+ 'B', 'I', 'B', 'L', 'E', '-', 'C', 'R', 'E', 'E',
+ 'C', 'E', 'N', 'T', 'R', 'E', 'L', 'I', 'N', 'E',
+ 'C', 'H', 'A', 'R', 'A', 'C', 'T', 'E', 'R', 'S',
+ 'C', 'I', 'R', 'C', 'U', 'M', 'F', 'L', 'E', 'X',
+ 'C', 'O', 'M', 'M', 'E', 'R', 'C', 'I', 'A', 'L',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'M', 'E', 'N', 'T',
+ 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'M', 'P', 'L', 'I', 'A', 'N', 'C', 'E',
+ 'C', 'O', 'N', 'J', 'O', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'T', 'A', 'I', 'N', 'I', 'N', 'G',
+ 'C', 'O', 'N', 'T', 'E', 'N', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'T', 'I', 'N', 'U', 'O', 'U', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'B', 'O', 'N', 'E', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'H', 'A', 'T', 'C', 'H',
+ 'D', 'A', 'G', 'B', 'A', 'S', 'I', 'N', 'N', 'A',
+ 'D', 'E', 'F', 'I', 'N', 'I', 'T', 'I', 'O', 'N',
+ 'D', 'E', 'S', 'C', 'E', 'N', 'D', 'I', 'N', 'G',
+ 'D', 'E', 'V', 'A', 'N', 'A', 'G', 'A', 'R', 'I',
+ 'D', 'I', 'F', 'F', 'E', 'R', 'E', 'N', 'C', 'E',
+ 'D', 'I', 'F', 'F', 'I', 'C', 'U', 'L', 'T', 'Y',
+ 'D', 'I', 'S', 'P', 'E', 'R', 'S', 'I', 'O', 'N',
+ 'D', 'I', 'S', 'T', 'O', 'R', 'T', 'I', 'O', 'N',
+ 'D', 'I', 'V', 'E', 'R', 'G', 'E', 'N', 'C', 'E',
+ 'D', 'I', 'V', 'I', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '4', '5', '6', '7', '8',
+ 'E', 'K', 'S', 'T', 'R', 'E', 'P', 'T', 'O', 'N',
+ 'E', 'L', 'E', 'C', 'T', 'R', 'I', 'C', 'A', 'L',
+ 'E', 'M', 'B', 'R', 'O', 'I', 'D', 'E', 'R', 'Y',
+ 'E', 'N', 'A', 'R', 'M', 'O', 'N', 'I', 'O', 'S',
+ 'E', 'N', 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'S',
+ 'E', 'N', 'T', 'E', 'R', 'P', 'R', 'I', 'S', 'E',
+ 'E', 'N', 'T', 'H', 'U', 'S', 'I', 'A', 'S', 'M',
+ 'E', 'P', 'I', 'D', 'A', 'U', 'R', 'E', 'A', 'N',
+ 'E', 'P', 'I', 'G', 'R', 'A', 'P', 'H', 'I', 'C',
+ 'E', 'Q', 'U', 'I', 'V', 'A', 'L', 'E', 'N', 'T',
+ 'E', 'X', 'H', 'A', 'U', 'S', 'T', 'I', 'O', 'N',
+ 'E', 'X', 'T', 'R', 'A', '-', 'H', 'I', 'G', 'H',
+ 'F', 'A', 'H', 'R', 'E', 'N', 'H', 'E', 'I', 'T',
+ 'F', 'E', 'L', 'L', 'O', 'W', 'S', 'H', 'I', 'P',
+ 'F', 'I', 'X', 'E', 'D', '-', 'F', 'O', 'R', 'M',
+ 'F', 'O', 'R', 'M', 'A', 'T', 'T', 'I', 'N', 'G',
+ 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'G', 'B', 'A', 'K', 'U', 'R', 'U', 'N', 'E', 'N',
+ 'G', 'E', 'M', 'I', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'G', 'L', 'A', 'G', 'O', 'L', 'I', 'T', 'I', 'C',
+ 'G', 'O', 'R', 'T', 'H', 'M', 'I', 'K', 'O', 'N',
+ 'H', 'E', 'R', 'M', 'I', 'O', 'N', 'I', 'A', 'N',
+ 'H', 'O', 'M', 'O', 'T', 'H', 'E', 'T', 'I', 'C',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L',
+ 'H', 'Y', 'S', 'T', 'E', 'R', 'E', 'S', 'I', 'S',
+ 'I', 'E', 'U', 'N', 'G', '-', 'S', 'I', 'O', 'S',
+ 'I', 'M', 'I', 'D', 'I', 'A', 'R', 'G', 'O', 'N',
+ 'I', 'M', 'I', 'F', 'T', 'H', 'O', 'R', 'O', 'N',
+ 'I', 'M', 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'A',
+ 'I', 'N', 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E',
+ 'I', 'N', 'D', 'U', 'S', 'T', 'R', 'I', 'A', 'L',
+ 'K', 'H', 'A', 'K', 'A', 'S', 'S', 'I', 'A', 'N',
+ 'K', 'H', 'A', 'R', 'O', 'S', 'H', 'T', 'H', 'I',
+ 'K', 'I', 'R', 'O', 'G', 'U', 'R', 'A', 'M', 'U',
+ 'K', 'U', 'N', 'D', 'D', 'A', 'L', 'I', 'Y', 'A',
+ 'L', 'A', 'J', 'A', 'N', 'Y', 'A', 'L', 'A', 'N',
+ 'L', 'E', 'N', 'G', 'T', 'H', 'E', 'N', 'E', 'R',
+ 'L', 'E', 'N', 'T', 'I', 'C', 'U', 'L', 'A', 'R',
+ 'L', 'I', 'M', 'I', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'M', 'E', 'M', 'B', 'E', 'R', 'S', 'H', 'I', 'P',
+ 'M', 'I', 'E', 'U', 'M', '-', 'S', 'I', 'O', 'S',
+ 'M', 'O', 'N', 'O', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'M', 'O', 'N', 'O', 'S', 'T', 'A', 'B', 'L', 'E',
+ 'M', 'O', 'O', 'S', 'E', '-', 'C', 'R', 'E', 'E',
+ 'M', 'U', '-', 'G', 'A', 'A', 'H', 'L', 'A', 'A',
+ 'N', 'A', 'A', 'S', 'I', 'K', 'Y', 'A', 'Y', 'A',
+ 'N', 'A', 'N', 'G', 'M', 'O', 'N', 'T', 'H', 'O',
+ 'N', 'I', 'E', 'U', 'N', '-', 'S', 'I', 'O', 'S',
+ 'N', 'O', 'N', '-', 'J', 'O', 'I', 'N', 'E', 'R',
+ 'N', 'O', 'N', 'F', 'O', 'R', 'K', 'I', 'N', 'G',
+ 'O', 'P', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'O', 'P', 'P', 'R', 'E', 'S', 'S', 'I', 'O', 'N',
+ 'O', 'R', 'T', 'H', 'O', 'G', 'O', 'N', 'A', 'L',
+ 'P', 'A', 'M', 'P', 'H', 'Y', 'L', 'I', 'A', 'N',
+ 'P', 'A', 'N', 'A', 'E', 'L', 'A', 'E', 'N', 'G',
+ 'P', 'A', 'N', 'E', 'U', 'L', 'E', 'U', 'N', 'G',
+ 'P', 'A', 'R', 'A', 'P', 'H', 'R', 'A', 'S', 'E',
+ 'P', 'A', 'T', 'H', 'A', 'M', 'A', 'S', 'A', 'T',
+ 'P', 'E', 'D', 'E', 'S', 'T', 'R', 'I', 'A', 'N',
+ 'P', 'E', 'R', 'C', 'U', 'S', 'S', 'I', 'V', 'E',
+ 'P', 'H', 'A', 'R', 'Y', 'N', 'G', 'E', 'A', 'L',
+ 'P', 'H', 'I', 'L', 'I', 'P', 'P', 'I', 'N', 'E',
+ 'P', 'H', 'O', 'E', 'N', 'I', 'C', 'I', 'A', 'N',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S',
+ 'P', 'L', 'U', 'S', '-', 'M', 'I', 'N', 'U', 'S',
+ 'P', 'O', 'S', 'S', 'E', 'S', 'S', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'J', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'J', 'E', 'C', 'T', 'I', 'V', 'E',
+ 'P', 'R', 'O', 'L', 'A', 'T', 'I', 'O', 'N', 'E',
+ 'P', 'R', 'O', 'P', 'O', 'R', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'T', 'O', 'V', 'A', 'R', 'Y', 'S',
+ 'Q', 'U', 'A', 'T', 'E', 'R', 'N', 'I', 'O', 'N',
+ 'Q', 'U', 'E', 'S', 'T', 'I', 'O', 'N', 'E', 'D',
+ 'R', 'E', 'G', 'I', 'S', 'T', 'E', 'R', 'E', 'D',
+ 'R', 'E', 'L', 'A', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'R', 'E', 'S', 'I', 'S', 'T', 'A', 'N', 'C', 'E',
+ 'R', 'E', 'S', 'O', 'L', 'U', 'T', 'I', 'O', 'N',
+ 'R', 'E', 'V', 'O', 'L', 'U', 'T', 'I', 'O', 'N',
+ 'R', 'I', 'E', 'U', 'L', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'G', 'H', 'T', '-', 'H', 'A', 'N', 'D',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'I', 'D', 'E',
+ 'R', 'I', 'G', 'H', 'T', 'W', 'A', 'R', 'D', 'S',
+ 'S', 'A', 'N', 'S', '-', 'S', 'E', 'R', 'I', 'F',
+ 'S', 'A', 'U', 'R', 'A', 'S', 'H', 'T', 'R', 'A',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9',
+ 'S', 'E', 'M', 'I', 'B', 'R', 'E', 'V', 'I', 'S',
+ 'S', 'E', 'M', 'I', 'C', 'I', 'R', 'C', 'L', 'E',
+ 'S', 'E', 'M', 'I', 'D', 'I', 'R', 'E', 'C', 'T',
+ 'S', 'E', 'M', 'I', 'M', 'I', 'N', 'I', 'M', 'A',
+ 'S', 'E', 'S', 'T', 'E', 'R', 'T', 'I', 'U', 'S',
+ 'S', 'H', 'A', 'L', 'S', 'H', 'E', 'L', 'E', 'T',
+ 'S', 'H', 'O', 'U', 'L', 'D', 'E', 'R', 'E', 'D',
+ 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'S', 'I', 'O', 'S', '-', 'C', 'I', 'E', 'U', 'C',
+ 'S', 'I', 'O', 'S', '-', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'I', 'O', 'S', '-', 'I', 'E', 'U', 'N', 'G',
+ 'S', 'I', 'O', 'S', '-', 'M', 'I', 'E', 'U', 'M',
+ 'S', 'I', 'O', 'S', '-', 'N', 'I', 'E', 'U', 'N',
+ 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P',
+ 'S', 'I', 'O', 'S', '-', 'R', 'I', 'E', 'U', 'L',
+ 'S', 'I', 'X', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'S', 'I', 'X', '-', 'S', 'T', 'R', 'I', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'A', 'R', 'A', 'E', 'A',
+ 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'S', 'S', 'A', 'N', 'G', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'S', 'A', 'N', 'G', 'I', 'E', 'U', 'N', 'G',
+ 'S', 'S', 'A', 'N', 'G', 'N', 'I', 'E', 'U', 'N',
+ 'S', 'S', 'A', 'N', 'G', 'P', 'I', 'E', 'U', 'P',
+ 'S', 'S', 'A', 'N', 'G', 'R', 'I', 'E', 'U', 'L',
+ 'S', 'T', 'A', 'N', 'D', 'S', 'T', 'I', 'L', 'L',
+ 'S', 'U', 'B', 'P', 'U', 'N', 'C', 'T', 'I', 'S',
+ 'S', 'U', 'B', 'S', 'T', 'I', 'T', 'U', 'T', 'E',
+ 'S', 'U', 'P', 'E', 'R', 'F', 'I', 'X', 'E', 'D',
+ 'S', 'U', 'S', 'P', 'E', 'N', 'S', 'I', 'O', 'N',
+ 'T', 'A', 'B', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'T', 'A', 'W', 'E', 'L', 'L', 'E', 'M', 'E', 'T',
+ 'T', 'E', 'R', 'M', 'I', 'N', 'A', 'T', 'O', 'R',
+ 'T', 'E', 'T', 'R', 'A', 'S', 'I', 'M', 'O', 'U',
+ 'T', 'H', 'I', 'R', 'T', 'Y', '-', 'O', 'N', 'E',
+ 'T', 'H', 'R', 'E', 'E', '-', 'L', 'I', 'N', 'E',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'T', 'R', 'I', 'F', 'O', 'L', 'I', 'A', 'T', 'E',
+ 'T', 'R', 'I', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'T', 'R', 'O', 'E', 'Z', 'E', 'N', 'I', 'A', 'N',
+ 'T', 'R', 'O', 'K', 'U', 'T', 'A', 'S', 'T', 'I',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'O', 'N', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'S', 'I', 'X',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'T', 'W', 'O',
+ 'T', 'W', 'O', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'V', 'I', 'S', 'I', 'G', 'O', 'T', 'H', 'I', 'C',
+ 'W', 'H', 'E', 'E', 'L', 'C', 'H', 'A', 'I', 'R',
+ 'W', 'O', 'O', 'D', 'S', '-', 'C', 'R', 'E', 'E',
+ 'A', 'C', 'K', 'N', 'O', 'W', 'L', 'E', 'D', 'G', 'E',
+ 'A', 'E', 'S', 'C', 'U', 'L', 'A', 'P', 'I', 'U', 'S',
+ 'A', 'G', 'G', 'R', 'A', 'V', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'L', 'T', 'E', 'R', 'N', 'A', 'T', 'I', 'V', 'E',
+ 'A', 'P', 'P', 'L', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'P', 'P', 'R', 'O', 'X', 'I', 'M', 'A', 'T', 'E',
+ 'B', 'A', 'C', 'K', '-', 'T', 'I', 'L', 'T', 'E', 'D',
+ 'C', 'A', 'N', 'D', 'R', 'A', 'B', 'I', 'N', 'D', 'U',
+ 'C', 'I', 'E', 'U', 'C', '-', 'I', 'E', 'U', 'N', 'G',
+ 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'L', 'U', 'B', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'C', 'O', 'M', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'J', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'S', 'E', 'C', 'U', 'T', 'I', 'V', 'E',
+ 'C', 'O', 'N', 'T', 'R', 'A', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'N', 'T', 'R', 'A', 'R', 'I', 'E', 'T', 'Y',
+ 'C', 'O', 'R', 'P', 'O', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'O', 'R', 'R', 'E', 'S', 'P', 'O', 'N', 'D', 'S',
+ 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'B', 'O', 'R', 'E',
+ 'C', 'O', 'U', 'N', 'T', 'E', 'R', 'S', 'I', 'N', 'K',
+ 'D', 'A', 'H', 'Y', 'A', 'A', 'U', 'S', 'H', '-', '2',
+ 'D', 'E', 'C', 'R', 'E', 'S', 'C', 'E', 'N', 'D', 'O',
+ 'D', 'E', 'L', 'I', 'V', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'D', 'E', 'N', 'O', 'M', 'I', 'N', 'A', 'T', 'O', 'R',
+ 'D', 'E', 'R', 'E', 'T', '-', 'H', 'I', 'D', 'E', 'T',
+ 'D', 'E', 'S', 'C', 'R', 'I', 'P', 'T', 'I', 'O', 'N',
+ 'D', 'E', 'V', 'E', 'L', 'O', 'P', 'M', 'E', 'N', 'T',
+ 'D', 'I', 'A', 'E', 'R', 'E', 'S', 'I', 'Z', 'E', 'D',
+ 'D', 'I', 'M', 'E', 'N', 'S', 'I', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'R', 'E', 'C', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'D', 'I', 'S', 'T', 'I', 'N', 'G', 'U', 'I', 'S', 'H',
+ 'D', 'O', 'A', 'C', 'H', 'A', 'S', 'H', 'M', 'E', 'E',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'L', 'I', 'N', 'E',
+ 'E', 'A', 'M', 'H', 'A', 'N', 'C', 'H', 'O', 'L', 'L',
+ 'E', 'K', 'F', 'O', 'N', 'I', 'T', 'I', 'K', 'O', 'N',
+ 'E', 'N', 'L', 'A', 'R', 'G', 'E', 'M', 'E', 'N', 'T',
+ 'E', 'Q', 'U', 'I', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'E', 'X', 'C', 'L', 'A', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'F', 'I', 'N', 'G', 'E', 'R', 'N', 'A', 'I', 'L', 'S',
+ 'F', 'O', 'U', 'R', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'F', 'O', 'U', 'R', '-', 'S', 'T', 'R', 'I', 'N', 'G',
+ 'G', 'A', 'Y', 'A', 'N', 'U', 'K', 'I', 'T', 'T', 'A',
+ 'G', 'U', 'A', 'R', 'D', 'E', 'D', 'N', 'E', 'S', 'S',
+ 'H', 'A', 'U', 'P', 'T', 'S', 'T', 'I', 'M', 'M', 'E',
+ 'H', 'B', 'A', 'S', 'A', '-', 'E', 'S', 'A', 'S', 'A',
+ 'H', 'I', 'E', 'U', 'H', '-', 'M', 'I', 'E', 'U', 'M',
+ 'H', 'I', 'E', 'U', 'H', '-', 'N', 'I', 'E', 'U', 'N',
+ 'H', 'I', 'E', 'U', 'H', '-', 'P', 'I', 'E', 'U', 'P',
+ 'H', 'I', 'E', 'U', 'H', '-', 'R', 'I', 'E', 'U', 'L',
+ 'H', 'Y', 'P', 'H', 'E', 'N', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'D', 'E', 'O', 'G', 'R', 'A', 'P', 'H', 'I', 'C',
+ 'I', 'E', 'U', 'N', 'G', '-', 'C', 'I', 'E', 'U', 'C',
+ 'I', 'E', 'U', 'N', 'G', '-', 'M', 'I', 'E', 'U', 'M',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'I', 'E', 'U', 'P',
+ 'I', 'M', 'P', 'E', 'R', 'F', 'E', 'C', 'T', 'U', 'M',
+ 'I', 'N', 'D', 'E', 'P', 'E', 'N', 'D', 'E', 'N', 'T',
+ 'I', 'N', 'F', 'O', 'R', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'G', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'R', 'C', 'A', 'L', 'A', 'T', 'E',
+ 'I', 'N', 'T', 'E', 'R', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'I', 'N', 'T', 'E', 'R', 'L', 'O', 'C', 'K', 'E', 'D',
+ 'I', 'N', 'T', 'E', 'R', 'R', 'O', 'B', 'A', 'N', 'G',
+ 'J', 'I', 'H', 'V', 'A', 'M', 'U', 'L', 'I', 'Y', 'A',
+ 'K', 'I', 'R', 'O', 'M', 'E', 'E', 'T', 'O', 'R', 'U',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S',
+ 'L', 'A', 'K', 'K', 'H', 'A', 'N', 'G', 'Y', 'A', 'O',
+ 'L', 'E', 'F', 'T', '-', 'S', 'H', 'A', 'D', 'E', 'D',
+ 'M', 'A', 'H', 'A', 'A', 'P', 'R', 'A', 'A', 'N', 'A',
+ 'M', 'I', 'E', 'U', 'M', '-', 'H', 'I', 'E', 'U', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'P', 'I', 'E', 'U', 'P',
+ 'M', 'I', 'E', 'U', 'M', '-', 'R', 'I', 'E', 'U', 'L',
+ 'M', 'O', 'N', 'O', 'G', 'R', 'A', 'M', 'M', 'O', 'S',
+ 'M', 'U', 'L', 'T', 'I', 'O', 'C', 'U', 'L', 'A', 'R',
+ 'M', 'U', 'U', 'S', 'I', 'K', 'A', 'T', 'O', 'A', 'N',
+ 'N', 'A', 'A', 'K', 'S', 'I', 'K', 'Y', 'A', 'Y', 'A',
+ 'N', 'E', 'B', 'E', 'N', 'S', 'T', 'I', 'M', 'M', 'E',
+ 'N', 'I', 'E', 'U', 'N', '-', 'C', 'I', 'E', 'U', 'C',
+ 'N', 'I', 'E', 'U', 'N', '-', 'H', 'I', 'E', 'U', 'H',
+ 'N', 'I', 'E', 'U', 'N', '-', 'P', 'I', 'E', 'U', 'P',
+ 'O', 'B', 'S', 'T', 'R', 'U', 'C', 'T', 'I', 'O', 'N',
+ 'O', 'P', 'E', 'N', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'O', 'V', 'E', 'R', 'L', 'A', 'P', 'P', 'I', 'N', 'G',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L', 'I', 'Z', 'E', 'D',
+ 'P', 'A', 'R', 'A', 'G', 'R', 'A', 'P', 'H', 'O', 'S',
+ 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'P', 'A', 'R', 'A', 'K', 'L', 'I', 'T', 'I', 'K', 'I',
+ 'P', 'A', 'R', 'E', 'N', 'T', 'H', 'E', 'S', 'I', 'S',
+ 'P', 'A', 'R', 'T', 'N', 'E', 'R', 'S', 'H', 'I', 'P',
+ 'P', 'E', 'N', 'E', 'T', 'R', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'E', 'R', 'I', 'S', 'P', 'O', 'M', 'E', 'N', 'I',
+ 'P', 'E', 'R', 'S', 'P', 'E', 'C', 'T', 'I', 'V', 'E',
+ 'P', 'I', 'E', 'U', 'P', '-', 'C', 'I', 'E', 'U', 'C',
+ 'P', 'I', 'E', 'U', 'P', '-', 'H', 'I', 'E', 'U', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'N', 'I', 'E', 'U', 'N',
+ 'P', 'I', 'E', 'U', 'P', '-', 'R', 'I', 'E', 'U', 'L',
+ 'P', 'U', 'N', 'C', 'T', 'U', 'A', 'T', 'I', 'O', 'N',
+ 'R', 'A', 'D', 'I', 'O', 'A', 'C', 'T', 'I', 'V', 'E',
+ 'R', 'A', 'H', 'M', 'A', 'T', 'U', 'L', 'L', 'A', 'H',
+ 'R', 'E', 'C', 'T', 'A', 'N', 'G', 'U', 'L', 'A', 'R',
+ 'R', 'E', 'C', 'T', 'I', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'R', 'E', 'P', 'L', 'A', 'C', 'E', 'M', 'E', 'N', 'T',
+ 'R', 'I', 'E', 'U', 'L', '-', 'H', 'I', 'E', 'U', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M',
+ 'R', 'I', 'E', 'U', 'L', '-', 'N', 'I', 'E', 'U', 'N',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P',
+ 'R', 'I', 'N', 'F', 'O', 'R', 'Z', 'A', 'N', 'D', 'O',
+ 'S', 'A', 'C', 'R', 'I', 'F', 'I', 'C', 'I', 'A', 'L',
+ 'S', 'A', 'G', 'I', 'T', 'T', 'A', 'R', 'I', 'U', 'S',
+ 'S', 'A', 'L', 'L', 'A', 'L', 'L', 'A', 'H', 'O', 'U',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '5', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '6', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '7', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '8', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '9', '9',
+ 'S', 'E', 'M', 'I', '-', 'V', 'O', 'I', 'C', 'E', 'D',
+ 'S', 'E', 'M', 'I', 'S', 'E', 'X', 'T', 'I', 'L', 'E',
+ 'S', 'I', 'N', 'G', 'L', 'E', '-', 'L', 'I', 'N', 'E',
+ 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'I', 'O', 'S', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'S', 'S', 'A', 'N', 'G', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'S', 'A', 'N', 'G', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'S', 'U', 'P', 'E', 'R', 'S', 'C', 'R', 'I', 'P', 'T',
+ 'S', 'U', 'P', 'R', 'A', 'L', 'I', 'N', 'E', 'A', 'R',
+ 'S', 'Y', 'N', 'C', 'H', 'R', 'O', 'N', 'O', 'U', 'S',
+ 'T', 'E', 'T', 'R', 'A', 'F', 'O', 'N', 'I', 'A', 'S',
+ 'T', 'H', 'A', 'N', 'T', 'H', 'A', 'K', 'H', 'A', 'T',
+ 'T', 'H', 'E', 'M', 'A', 'T', 'I', 'S', 'M', 'O', 'S',
+ 'T', 'O', 'A', 'N', 'D', 'A', 'K', 'H', 'I', 'A', 'T',
+ 'T', 'O', 'P', '-', 'L', 'I', 'G', 'H', 'T', 'E', 'D',
+ 'T', 'R', 'A', 'N', 'S', 'V', 'E', 'R', 'S', 'A', 'L',
+ 'T', 'R', 'I', 'T', 'I', 'M', 'O', 'R', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'F', 'I', 'V', 'E',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'F', 'O', 'U', 'R',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'N', 'I', 'N', 'E',
+ 'U', 'N', 'A', 'S', 'P', 'I', 'R', 'A', 'T', 'E', 'D',
+ 'U', 'P', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'U', 'P', 'A', 'D', 'H', 'M', 'A', 'N', 'I', 'Y', 'A',
+ 'W', 'I', 'D', 'E', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'Y', 'E', 'O', 'R', 'I', 'N', 'H', 'I', 'E', 'U', 'H',
+ 'A', 'B', 'B', 'R', 'E', 'V', 'I', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'C', 'C', 'U', 'M', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'C', 'U', 'T', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'A', 'K', 'T', 'I', 'E', 'S', 'E', 'L', 'S', 'K', 'A', 'B',
+ 'A', 'M', 'A', 'L', 'G', 'A', 'M', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'N', 'A', 'T', 'R', 'I', 'C', 'H', 'I', 'S', 'M', 'A',
+ 'A', 'R', 'A', 'B', 'I', 'C', '-', 'I', 'N', 'D', 'I', 'C',
+ 'A', 'S', 'T', 'R', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'A', 'U', 'G', 'M', 'E', 'N', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A', '-', '2',
+ 'A', 'U', 'R', 'A', 'M', 'A', 'Z', 'D', 'A', 'A', 'H', 'A',
+ 'B', 'L', 'A', 'C', 'K', '-', 'L', 'E', 'T', 'T', 'E', 'R',
+ 'B', 'R', 'E', 'A', 'K', 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'B', 'R', 'E', 'V', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'C', '-', 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'C', 'A', 'N', 'C', 'E', 'L', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'A', 'N', 'T', 'I', 'L', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'I', 'O', 'S',
+ 'C', 'R', 'O', 'S', 'S', 'E', 'D', '-', 'T', 'A', 'I', 'L',
+ 'C', 'Y', 'L', 'I', 'N', 'D', 'R', 'I', 'C', 'I', 'T', 'Y',
+ 'D', 'E', 'C', 'I', 'S', 'I', 'V', 'E', 'N', 'E', 'S', 'S',
+ 'D', 'I', 'F', 'F', 'E', 'R', 'E', 'N', 'T', 'I', 'A', 'L',
+ 'D', 'I', 'F', 'F', 'I', 'C', 'U', 'L', 'T', 'I', 'E', 'S',
+ 'D', 'I', 'M', 'I', 'N', 'I', 'S', 'H', 'M', 'E', 'N', 'T',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '1',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '2',
+ 'D', 'I', 'M', 'I', 'N', 'U', 'T', 'I', 'O', 'N', '-', '3',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '7',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '1', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'T', 'S', '-', '2', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'E', 'N', 'D', 'E', 'D',
+ 'E', 'R', 'R', 'O', 'R', '-', 'B', 'A', 'R', 'R', 'E', 'D',
+ 'F', 'L', 'E', 'U', 'R', '-', 'D', 'E', '-', 'L', 'I', 'S',
+ 'F', 'R', 'O', 'N', 'T', '-', 'T', 'I', 'L', 'T', 'E', 'D',
+ 'G', 'A', 'E', 'T', 'T', 'A', '-', 'P', 'I', 'L', 'L', 'A',
+ 'G', 'R', 'A', 'V', 'E', '-', 'M', 'A', 'C', 'R', 'O', 'N',
+ 'G', 'R', 'E', 'A', 'T', 'E', 'R', '-', 'T', 'H', 'A', 'N',
+ 'G', 'R', 'O', 'N', 'T', 'H', 'I', 'S', 'M', 'A', 'T', 'A',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', 'L', 'Y',
+ 'H', 'Y', 'P', 'H', 'E', 'N', '-', 'M', 'I', 'N', 'U', 'S',
+ 'H', 'Y', 'P', 'O', 'D', 'I', 'A', 'S', 'T', 'O', 'L', 'E',
+ 'I', 'C', 'E', 'L', 'A', 'N', 'D', 'I', 'C', '-', 'Y', 'R',
+ 'I', 'E', 'U', 'N', 'G', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'I', 'E', 'U', 'N', 'G', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'I', 'N', 'S', 'T', 'R', 'U', 'M', 'E', 'N', 'T', 'A', 'L',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'E', 'C', 'T', 'I', 'N', 'G',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'E', 'C', 'T', 'I', 'O', 'N',
+ 'J', '-', 'S', 'I', 'M', 'P', 'L', 'I', 'F', 'I', 'E', 'D',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'R', 'I', 'E', 'U', 'L',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'A', 'C', 'U', 'T', 'E',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'B', 'R', 'E', 'V', 'E',
+ 'M', 'A', 'C', 'R', 'O', 'N', '-', 'G', 'R', 'A', 'V', 'E',
+ 'M', 'A', 'T', 'H', 'E', 'M', 'A', 'T', 'I', 'C', 'A', 'L',
+ 'M', 'I', 'D', 'D', 'L', 'E', '-', 'W', 'E', 'L', 'S', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'N', 'A', 'S', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'N', 'I', 'E', 'U', 'N', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'N', 'I', 'E', 'U', 'N', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'N', 'O', 'N', '-', 'B', 'R', 'E', 'A', 'K', 'I', 'N', 'G',
+ 'P', 'I', 'E', 'U', 'P', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'P', 'I', 'E', 'U', 'P', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'P', 'O', 'S', 'T', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'E', 'S', 'C', 'R', 'I', 'P', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'E', 'S', 'E', 'N', 'T', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'P', 'O', 'R', 'T', 'I', 'O', 'N', 'A', 'L',
+ 'Q', 'U', 'I', 'N', 'D', 'I', 'C', 'E', 'S', 'I', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'H', 'A', 'D', 'E', 'D',
+ 'R', 'O', 'U', 'N', 'D', '-', 'T', 'I', 'P', 'P', 'E', 'D',
+ 'R', 'U', 'L', 'E', '-', 'D', 'E', 'L', 'A', 'Y', 'E', 'D',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '0', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '5', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '6', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '7', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '8', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '1', '9', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '0', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '1', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '2', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '3', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '6',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '7',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '8',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '4', '9',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '0',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '1',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '2',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '3',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '4',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '5',
+ 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'R', '-', '2', '5', '6',
+ 'S', 'E', 'M', 'I', 'C', 'I', 'R', 'C', 'U', 'L', 'A', 'R',
+ 'S', 'I', 'O', 'S', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'S', 'I', 'O', 'S', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'S', 'I', 'O', 'S', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'S', 'I', 'O', 'S', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'S', 'I', 'X', 'T', 'Y', '-', 'F', 'O', 'U', 'R', 'T', 'H',
+ 'S', 'O', 'U', 'T', 'H', '-', 'S', 'L', 'A', 'V', 'E', 'Y',
+ 'S', 'P', 'R', 'E', 'C', 'H', 'G', 'E', 'S', 'A', 'N', 'G',
+ 'S', 'T', 'R', 'A', 'G', 'G', 'I', 'S', 'M', 'A', 'T', 'A',
+ 'S', 'T', 'R', 'A', 'I', 'G', 'H', 'T', 'N', 'E', 'S', 'S',
+ 'S', 'U', 'B', 'S', 'T', 'I', 'T', 'U', 'T', 'I', 'O', 'N',
+ 'S', 'U', 'P', 'E', 'R', 'I', 'M', 'P', 'O', 'S', 'E', 'D',
+ 'T', 'H', 'R', 'E', 'E', '-', 'P', 'E', 'R', '-', 'E', 'M',
+ 'T', 'H', 'U', 'N', 'D', 'E', 'R', 'S', 'T', 'O', 'R', 'M',
+ 'T', 'I', 'K', 'E', 'U', 'T', '-', 'R', 'I', 'E', 'U', 'L',
+ 'T', 'R', 'A', 'N', 'S', 'M', 'I', 'S', 'S', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'E', 'I', 'G', 'H', 'T',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'S', 'E', 'V', 'E', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'T', 'H', 'R', 'E', 'E',
+ 'W', 'E', 'D', 'G', 'E', '-', 'T', 'A', 'I', 'L', 'E', 'D',
+ 'X', 'S', 'H', 'A', 'A', 'Y', 'A', 'T', 'H', 'I', 'Y', 'A',
+ 'Y', 'O', 'U', 'T', 'H', 'F', 'U', 'L', 'N', 'E', 'S', 'S',
+ 'A', 'N', 'T', 'I', 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E',
+ 'A', 'P', 'P', 'R', 'O', 'X', 'I', 'M', 'A', 'T', 'E', 'L', 'Y',
+ 'A', 'R', 'G', 'O', 'S', 'Y', 'N', 'T', 'H', 'E', 'T', 'O', 'N',
+ 'A', 'V', 'A', 'K', 'R', 'A', 'H', 'A', 'S', 'A', 'N', 'Y', 'A',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H', '-', 'H', 'I', 'E', 'U', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'C', 'I', 'E', 'U', 'C',
+ 'C', 'H', 'R', 'Y', 'S', 'A', 'N', 'T', 'H', 'E', 'M', 'U', 'M',
+ 'C', 'O', 'M', 'P', 'A', 'T', 'I', 'B', 'I', 'L', 'I', 'T', 'Y',
+ 'C', 'O', 'N', 'C', 'A', 'V', 'E', '-', 'S', 'I', 'D', 'E', 'D',
+ 'C', 'O', 'N', 'T', 'E', 'M', 'P', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'C', 'R', 'Y', 'P', 'T', 'O', 'G', 'R', 'A', 'M', 'M', 'I', 'C',
+ 'D', 'E', 'F', 'E', 'C', 'T', 'I', 'V', 'E', 'N', 'E', 'S', 'S',
+ 'D', 'I', 'S', 'C', 'O', 'N', 'T', 'I', 'N', 'U', 'O', 'U', 'S',
+ 'D', 'O', 'T', 'S', '-', '1', '2', '3', '4', '5', '6', '7', '8',
+ 'D', 'O', 'U', 'B', 'L', 'E', '-', 'S', 'T', 'R', 'U', 'C', 'K',
+ 'D', 'O', 'W', 'N', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'D', 'R', 'O', 'P', '-', 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'E', 'G', 'Y', 'P', 'T', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'E', 'M', 'B', 'E', 'L', 'L', 'I', 'S', 'H', 'M', 'E', 'N', 'T',
+ 'E', 'U', 'R', 'O', '-', 'C', 'U', 'R', 'R', 'E', 'N', 'C', 'Y',
+ 'G', 'E', 'O', 'M', 'E', 'T', 'R', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'I', 'E', 'U', 'N', 'G', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'I', 'E', 'U', 'N', 'G', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'I', 'E', 'U', 'N', 'G', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'I', 'N', 'T', 'E', 'R', 'P', 'O', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'I', 'N', 'T', 'E', 'R', 'S', 'Y', 'L', 'L', 'A', 'B', 'I', 'C',
+ 'J', 'U', 'D', 'E', 'O', '-', 'S', 'P', 'A', 'N', 'I', 'S', 'H',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'M', 'I', 'E', 'U', 'M',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'I', 'E', 'U', 'P',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'R', 'I', 'E', 'U', 'L',
+ 'L', 'A', 'B', 'I', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'E', 'F', 'T', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'L', 'E', 'F', 'T', '-', 'T', 'O', '-', 'R', 'I', 'G', 'H', 'T',
+ 'M', 'I', 'E', 'U', 'M', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'M', 'I', 'E', 'U', 'M', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'M', 'I', 'N', 'U', 'S', '-', 'O', 'R', '-', 'P', 'L', 'U', 'S',
+ 'M', 'O', 'R', 'P', 'H', 'O', 'L', 'O', 'G', 'I', 'C', 'A', 'L',
+ 'N', 'I', 'E', 'U', 'N', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'N', 'I', 'E', 'U', 'N', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'O', 'P', 'E', 'N', '-', 'O', 'U', 'T', 'L', 'I', 'N', 'E', 'D',
+ 'P', 'A', 'R', 'A', 'L', 'L', 'E', 'L', 'O', 'G', 'R', 'A', 'M',
+ 'P', 'A', 'R', 'E', 'N', 'T', 'H', 'E', 'S', 'I', 'Z', 'E', 'D',
+ 'P', 'A', 'R', 'E', 'S', 'T', 'I', 'G', 'M', 'E', 'N', 'O', 'N',
+ 'P', 'E', 'R', 'P', 'E', 'N', 'D', 'I', 'C', 'U', 'L', 'A', 'R',
+ 'P', 'H', 'I', 'E', 'U', 'P', 'H', '-', 'P', 'I', 'E', 'U', 'P',
+ 'P', 'I', 'E', 'U', 'P', '-', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'P', 'I', 'E', 'U', 'P', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'P', 'R', 'E', 'P', 'O', 'N', 'D', 'E', 'R', 'A', 'N', 'C', 'E',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'H', 'I', 'E', 'U', 'T', 'H',
+ 'R', 'I', 'G', 'H', 'T', '-', 'T', 'O', '-', 'L', 'E', 'F', 'T',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'A', 'R',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'Y', 'R',
+ 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'I', 'S', 'S', 'I', 'M', 'O',
+ 'S', 'T', 'R', 'I', 'K', 'E', 'T', 'H', 'R', 'O', 'U', 'G', 'H',
+ 'T', 'E', 'T', 'A', 'R', 'T', 'I', 'M', 'O', 'R', 'I', 'O', 'N',
+ 'T', 'H', 'E', 'R', 'M', 'O', 'D', 'Y', 'N', 'A', 'M', 'I', 'C',
+ 'T', 'H', 'I', 'R', 'T', 'Y', '-', 'S', 'E', 'C', 'O', 'N', 'D',
+ 'T', 'I', 'K', 'E', 'U', 'T', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'T', 'R', 'A', 'N', 'S', 'P', 'O', 'S', 'I', 'T', 'I', 'O', 'N',
+ 'T', 'W', 'E', 'N', 'T', 'Y', '-', 'E', 'I', 'G', 'H', 'T', 'H',
+ 'V', 'O', 'W', 'E', 'L', '-', 'C', 'A', 'R', 'R', 'I', 'E', 'R',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G', '-', 'S', 'I', 'O', 'S',
+ 'Y', 'P', 'O', 'G', 'E', 'G', 'R', 'A', 'M', 'M', 'E', 'N', 'I',
+ 'Y', 'U', 'U', 'K', 'A', 'L', 'E', 'A', 'P', 'I', 'N', 'T', 'U',
+ 'A', 'F', 'O', 'R', 'E', 'M', 'E', 'N', 'T', 'I', 'O', 'N', 'E', 'D',
+ 'A', 'R', 'O', 'U', 'N', 'D', '-', 'P', 'R', 'O', 'F', 'I', 'L', 'E',
+ 'A', 'S', 'Y', 'M', 'P', 'T', 'O', 'T', 'I', 'C', 'A', 'L', 'L', 'Y',
+ 'B', 'A', 'L', 'L', 'O', 'O', 'N', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'B', 'O', 'T', 'T', 'O', 'M', '-', 'L', 'I', 'G', 'H', 'T', 'E', 'D',
+ 'C', 'O', 'N', 'G', 'R', 'A', 'T', 'U', 'L', 'A', 'T', 'I', 'O', 'N',
+ 'G', 'O', 'R', 'G', 'O', 'S', 'Y', 'N', 'T', 'H', 'E', 'T', 'O', 'N',
+ 'I', 'D', 'E', 'N', 'T', 'I', 'F', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'A', 'R',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'Y', 'R',
+ 'M', 'U', 'L', 'T', 'I', 'P', 'L', 'I', 'C', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'A', 'L', 'A', 'T', 'A', 'L', 'I', 'Z', 'A', 'T', 'I', 'O', 'N',
+ 'P', 'R', 'O', 'S', 'G', 'E', 'G', 'R', 'A', 'M', 'M', 'E', 'N', 'I',
+ 'R', 'I', 'G', 'H', 'T', '-', 'P', 'O', 'I', 'N', 'T', 'I', 'N', 'G',
+ 'R', 'I', 'G', 'H', 'T', '-', 'S', 'H', 'A', 'D', 'O', 'W', 'E', 'D',
+ 'S', 'E', 'S', 'Q', 'U', 'I', 'Q', 'U', 'A', 'D', 'R', 'A', 'T', 'E',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'O', 'S', 'S',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'S', 'O', 'L',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'T', 'Y', 'R',
+ 'S', 'I', 'O', 'S', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E', '-', 'R', 'O', 'U', 'N', 'D',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '0', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '1', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '2', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '3', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '4', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '5', '-', '0', '6',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '0',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '1',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '2',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '3',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '4',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '5',
+ 'V', 'E', 'R', 'T', 'I', 'C', 'A', 'L', '-', '0', '6', '-', '0', '6',
+ 'A', 'C', 'C', 'E', 'N', 'T', '-', 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'A', 'N', 'T', 'I', 'K', 'E', 'N', 'O', 'K', 'Y', 'L', 'I', 'S', 'M', 'A',
+ 'A', 'N', 'T', 'I', 'R', 'E', 'S', 'T', 'R', 'I', 'C', 'T', 'I', 'O', 'N',
+ 'B', 'L', 'A', 'C', 'K', '-', 'F', 'E', 'A', 'T', 'H', 'E', 'R', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'I', 'O', 'S',
+ 'C', 'H', 'I', 'E', 'U', 'C', 'H', '-', 'K', 'H', 'I', 'E', 'U', 'K', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'O', 'N', 'C', 'A', 'V', 'E', '-', 'P', 'O', 'I', 'N', 'T', 'E', 'D',
+ 'H', 'I', 'G', 'H', '-', 'R', 'E', 'V', 'E', 'R', 'S', 'E', 'D', '-', '9',
+ 'J', 'A', 'L', 'L', 'A', 'J', 'A', 'L', 'A', 'L', 'O', 'U', 'H', 'O', 'U',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'H', 'I', 'E', 'U', 'P', 'H',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'O', 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'K', 'R', 'A', 'T', 'I', 'M', 'O', 'Y', 'P', 'O', 'R', 'R', 'O', 'O', 'N',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'O', 'S', 'S',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'S', 'O', 'L',
+ 'M', 'I', 'E', 'U', 'M', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'P', 'E', 'T', 'A', 'S', 'T', 'O', 'K', 'O', 'U', 'F', 'I', 'S', 'M', 'A',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'L', 'Y', 'G', 'I', 'S', 'M', 'A',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'S', 'Y', 'N', 'A', 'G', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'M', 'A', 'D', 'R',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'N', 'A', 'U', 'D',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'B', 'A', 'R', 'B', 'E', 'D',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'S', 'P', 'O', 'K', 'E', 'D',
+ 'T', 'R', 'I', 'A', 'N', 'G', 'L', 'E', '-', 'H', 'E', 'A', 'D', 'E', 'D',
+ 'W', 'H', 'I', 'T', 'E', '-', 'F', 'E', 'A', 'T', 'H', 'E', 'R', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'C', 'I', 'E', 'U', 'C',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '0', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '1', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '2', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '3', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '4', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '5', '-', '0', '6',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '0',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '1',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '2',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '3',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '4',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '5',
+ 'H', 'O', 'R', 'I', 'Z', 'O', 'N', 'T', 'A', 'L', '-', '0', '6', '-', '0', '6',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'M', 'A', 'D', 'R',
+ 'M', 'A', 'R', 'C', 'A', 'T', 'O', '-', 'S', 'T', 'A', 'C', 'C', 'A', 'T', 'O',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'C', 'I', 'E', 'U', 'C',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S',
+ 'T', 'E', 'A', 'R', 'D', 'R', 'O', 'P', '-', 'S', 'H', 'A', 'N', 'K', 'E', 'D',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'N',
+ 'Y', 'E', 'S', 'I', 'E', 'U', 'N', 'G', '-', 'P', 'A', 'N', 'S', 'I', 'O', 'S',
+ 'A', 'C', 'U', 'T', 'E', '-', 'G', 'R', 'A', 'V', 'E', '-', 'A', 'C', 'U', 'T', 'E',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'G', 'R', 'A', 'V', 'E', '-', 'A', 'C', 'U', 'T', 'E', '-', 'G', 'R', 'A', 'V', 'E',
+ 'I', 'E', 'U', 'N', 'G', '-', 'S', 'S', 'A', 'N', 'G', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'K', 'A', 'T', 'A', 'K', 'A', 'N', 'A', '-', 'H', 'I', 'R', 'A', 'G', 'A', 'N', 'A',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'P', 'I', 'E', 'U', 'P', '-', 'S', 'I', 'O', 'S', '-', 'T', 'I', 'K', 'E', 'U', 'T',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S',
+ 'R', 'I', 'E', 'U', 'L', '-', 'P', 'I', 'E', 'U', 'P', '-', 'H', 'I', 'E', 'U', 'H',
+ 'R', 'I', 'E', 'U', 'L', '-', 'Y', 'E', 'O', 'R', 'I', 'N', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'H', 'A', 'G', 'A', 'L', 'L',
+ 'S', 'I', 'O', 'S', '-', 'P', 'I', 'E', 'U', 'P', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'S', 'O', 'F', 'T', 'W', 'A', 'R', 'E', '-', 'F', 'U', 'N', 'C', 'T', 'I', 'O', 'N',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'C', 'H', 'I', 'E', 'U', 'C', 'H',
+ 'C', 'H', 'I', 'T', 'U', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'S', 'S', 'A', 'N', 'G', 'P', 'I', 'E', 'U', 'P',
+ 'K', 'I', 'Y', 'E', 'O', 'K', '-', 'S', 'I', 'O', 'S', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'L', 'O', 'N', 'G', '-', 'B', 'R', 'A', 'N', 'C', 'H', '-', 'H', 'A', 'G', 'A', 'L', 'L',
+ 'P', 'A', 'R', 'T', 'I', 'A', 'L', 'L', 'Y', '-', 'R', 'E', 'C', 'Y', 'C', 'L', 'E', 'D',
+ 'R', 'I', 'E', 'U', 'L', '-', 'M', 'I', 'E', 'U', 'M', '-', 'K', 'I', 'Y', 'E', 'O', 'K',
+ 'R', 'I', 'E', 'U', 'L', '-', 'T', 'I', 'K', 'E', 'U', 'T', '-', 'H', 'I', 'E', 'U', 'H',
+ 'S', 'H', 'O', 'R', 'T', '-', 'T', 'W', 'I', 'G', '-', 'B', 'J', 'A', 'R', 'K', 'A', 'N',
+ 'T', 'R', 'O', 'M', 'I', 'K', 'O', 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'O', 'P', 'E', 'N', '-', 'C', 'I', 'R', 'C', 'U', 'I', 'T', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+ 'P', 'S', 'I', 'F', 'I', 'S', 'T', 'O', 'P', 'A', 'R', 'A', 'K', 'A', 'L', 'E', 'S', 'M', 'A',
+ 'R', 'I', 'E', 'U', 'L', '-', 'K', 'A', 'P', 'Y', 'E', 'O', 'U', 'N', 'P', 'I', 'E', 'U', 'P',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'S', 'I', 'O', 'S',
+ 'A', 'N', 'T', 'I', 'C', 'L', 'O', 'C', 'K', 'W', 'I', 'S', 'E', '-', 'R', 'O', 'T', 'A', 'T', 'E', 'D',
+ 'C', 'E', 'O', 'N', 'G', 'C', 'H', 'I', 'E', 'U', 'M', 'S', 'S', 'A', 'N', 'G', 'C', 'I', 'E', 'U', 'C',
+ 'B', 'Y', 'E', 'L', 'O', 'R', 'U', 'S', 'S', 'I', 'A', 'N', '-', 'U', 'K', 'R', 'A', 'I', 'N', 'I', 'A', 'N',
+ 'P', 'A', 'S', 'S', 'I', 'V', 'E', '-', 'P', 'U', 'L', 'L', '-', 'U', 'P', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+ 'P', 'A', 'S', 'S', 'I', 'V', 'E', '-', 'P', 'U', 'L', 'L', '-', 'D', 'O', 'W', 'N', '-', 'O', 'U', 'T', 'P', 'U', 'T',
+};
+#define UNICODE_CHARNAME_NUM_WORDS 6710
+static const struct { uint16_t extra_offset; uint16_t ind_offset; } unicode_name_by_length[26] = {
+ { 0, 0 },
+ { 0, 0 },
+ { 26, 26 },
+ { 658, 342 },
+ { 4468, 1612 },
+ { 10756, 3184 },
+ { 14596, 3952 },
+ { 17782, 4483 },
+ { 20883, 4926 },
+ { 24251, 5347 },
+ { 27446, 5702 },
+ { 29846, 5942 },
+ { 32629, 6195 },
+ { 35689, 6450 },
+ { 36599, 6520 },
+ { 37607, 6592 },
+ { 38012, 6619 },
+ { 38956, 6678 },
+ { 39177, 6691 },
+ { 39357, 6701 },
+ { 39414, 6704 },
+ { 39434, 6705 },
+ { 39476, 6707 },
+ { 39520, 6709 },
+ { 39520, 6709 },
+ { 39544, 6710 }
+};
+#define UNICODE_CHARNAME_WORD_HANGUL 4143
+#define UNICODE_CHARNAME_WORD_SYLLABLE 5292
+#define UNICODE_CHARNAME_WORD_CJK 454
+#define UNICODE_CHARNAME_WORD_COMPATIBILITY 6457
+static const uint16_t unicode_names[75152] = {
+ 23, 3, 761, 8774,
+ 37, 275, 10642,
+ 47, 275, 1, 11203, 826,
+ 51, 10365, 753, 11680,
+ 51, 10365, 4849, 6989, 9050,
+ 51, 10365, 4849, 9045, 9050,
+ 51, 10365, 5782,
+ 51, 10365, 6031, 6610,
+ 51, 10365, 7421, 13188,
+ 51, 10365, 7443, 6989, 9050,
+ 51, 10365, 7443, 9045, 9050,
+ 51, 10365, 8131, 13188,
+ 51, 10365, 8675, 8590,
+ 51, 10365, 8675, 11734,
+ 51, 10365, 8675, 11908,
+ 51, 10365, 11751, 11908,
+ 63, 9128,
+ 175, 3992,
+ 175, 5496,
+ 175, 7608,
+ 177, 3992,
+ 177, 5496,
+ 177, 7608,
+ 435, 6573, 385, 9798,
+ 435, 6573, 3232,
+ 435, 6573, 6689, 2170,
+ 435, 6573, 6689, 2540,
+ 435, 6573, 6689, 2778,
+ 435, 6573, 6689, 4200,
+ 435, 6573, 6689, 4214,
+ 435, 6573, 6689, 5190,
+ 435, 6573, 6689, 6260,
+ 435, 6573, 6689, 6722,
+ 435, 6573, 6689, 7508,
+ 435, 6573, 6689, 7694,
+ 435, 6573, 7430,
+ 435, 6573, 8405, 68,
+ 435, 6573, 8405, 76,
+ 435, 6573, 8405, 90,
+ 435, 6573, 8405, 176,
+ 435, 6573, 8405, 180,
+ 435, 6573, 8405, 264,
+ 435, 6573, 8405, 280,
+ 435, 6573, 8405, 282,
+ 435, 6573, 8405, 332,
+ 435, 6573, 8405, 336,
+ 435, 6573, 8405, 340,
+ 435, 6573, 8405, 350,
+ 435, 6573, 8405, 354,
+ 435, 6573, 8405, 424,
+ 435, 6573, 8405, 430,
+ 435, 6573, 8405, 452,
+ 435, 6573, 8405, 586,
+ 435, 6573, 8405, 588,
+ 435, 6573, 8405, 608,
+ 435, 6573, 8405, 692,
+ 435, 6573, 8405, 694,
+ 435, 6573, 8405, 696,
+ 435, 6573, 8405, 698,
+ 435, 6573, 8405, 722,
+ 435, 6573, 8405, 1096,
+ 435, 6573, 8405, 1120,
+ 435, 6573, 8405, 1492,
+ 435, 6573, 8405, 1732,
+ 435, 6573, 8405, 2182,
+ 435, 6573, 8405, 2814,
+ 435, 6573, 9299, 10654,
+ 435, 6573, 10426,
+ 435, 6573, 11691, 10654,
+ 435, 6573, 12133, 8153, 8488,
+ 435, 6573, 12133, 8488,
+ 445, 6121, 1045, 8318,
+ 601, 3713, 4849, 4117, 3713, 4849, 9326,
+ 601, 3713, 4849, 4117, 3713, 7443, 9326,
+ 601, 3713, 7443, 4117, 3713, 4849, 9326,
+ 601, 3713, 7443, 4117, 3713, 7443, 9326,
+ 601, 4117, 6434,
+ 601, 4117, 6435, 6121, 3716,
+ 601, 4117, 6505, 6434,
+ 601, 4117, 7821, 6434,
+ 601, 4117, 8153, 6434,
+ 601, 4197, 5878,
+ 601, 5876,
+ 601, 5877, 6121, 8057, 6376,
+ 601, 6435, 9785, 8056,
+ 601, 7443, 10001, 10154,
+ 601, 10716,
+ 601, 10717, 9043, 2779, 11649, 3714,
+ 657, 9617, 134,
+ 657, 9617, 152,
+ 657, 9617, 216,
+ 657, 9617, 298,
+ 657, 9617, 310,
+ 657, 9617, 340,
+ 657, 9617, 374,
+ 657, 9617, 442,
+ 657, 9617, 576,
+ 657, 9617, 632,
+ 657, 9617, 660,
+ 657, 9617, 670,
+ 657, 9617, 832,
+ 657, 9617, 886,
+ 657, 9617, 902,
+ 657, 9617, 946,
+ 657, 9617, 950,
+ 657, 9617, 1242,
+ 657, 9617, 1294,
+ 657, 9617, 1406,
+ 657, 9617, 1538,
+ 657, 9617, 1636,
+ 657, 9617, 1782,
+ 657, 9617, 1844,
+ 657, 9617, 1940,
+ 657, 9617, 2262,
+ 657, 9617, 2278,
+ 657, 9617, 2324,
+ 657, 9617, 2526,
+ 657, 9617, 2570,
+ 657, 9617, 2656,
+ 657, 9617, 2860,
+ 657, 9617, 2890,
+ 657, 9617, 3074,
+ 657, 9617, 3182,
+ 657, 9617, 3194,
+ 657, 9617, 3196,
+ 657, 9617, 3748,
+ 657, 9617, 3962,
+ 657, 9617, 4040,
+ 657, 9617, 4292,
+ 657, 9617, 4298,
+ 657, 9617, 4572,
+ 657, 9617, 4576,
+ 657, 9617, 4582,
+ 657, 9617, 4646,
+ 657, 9617, 4666,
+ 657, 9617, 5064,
+ 657, 9617, 5304,
+ 657, 9617, 5318,
+ 657, 9617, 5356,
+ 657, 9617, 5674,
+ 657, 9617, 5712,
+ 657, 9617, 5726,
+ 657, 9617, 7896,
+ 657, 10585, 0,
+ 657, 10585, 8,
+ 657, 10585, 16,
+ 657, 10585, 28,
+ 657, 10585, 84,
+ 657, 10585, 90,
+ 657, 10585, 96,
+ 657, 10585, 100,
+ 657, 10585, 102,
+ 657, 10585, 106,
+ 657, 10585, 108,
+ 657, 10585, 112,
+ 657, 10585, 114,
+ 657, 10585, 116,
+ 657, 10585, 122,
+ 657, 10585, 126,
+ 657, 10585, 130,
+ 657, 10585, 132,
+ 657, 10585, 134,
+ 657, 10585, 138,
+ 657, 10585, 142,
+ 657, 10585, 144,
+ 657, 10585, 150,
+ 657, 10585, 152,
+ 657, 10585, 194,
+ 657, 10585, 196,
+ 657, 10585, 202,
+ 657, 10585, 208,
+ 657, 10585, 210,
+ 657, 10585, 212,
+ 657, 10585, 216,
+ 657, 10585, 220,
+ 657, 10585, 224,
+ 657, 10585, 228,
+ 657, 10585, 230,
+ 657, 10585, 236,
+ 657, 10585, 238,
+ 657, 10585, 246,
+ 657, 10585, 258,
+ 657, 10585, 278,
+ 657, 10585, 284,
+ 657, 10585, 288,
+ 657, 10585, 296,
+ 657, 10585, 298,
+ 657, 10585, 300,
+ 657, 10585, 302,
+ 657, 10585, 306,
+ 657, 10585, 310,
+ 657, 10585, 314,
+ 657, 10585, 322,
+ 657, 10585, 326,
+ 657, 10585, 332,
+ 657, 10585, 336,
+ 657, 10585, 340,
+ 657, 10585, 350,
+ 657, 10585, 354,
+ 657, 10585, 360,
+ 657, 10585, 364,
+ 657, 10585, 368,
+ 657, 10585, 374,
+ 657, 10585, 380,
+ 657, 10585, 384,
+ 657, 10585, 390,
+ 657, 10585, 392,
+ 657, 10585, 396,
+ 657, 10585, 404,
+ 657, 10585, 412,
+ 657, 10585, 416,
+ 657, 10585, 442,
+ 657, 10585, 448,
+ 657, 10585, 456,
+ 657, 10585, 462,
+ 657, 10585, 476,
+ 657, 10585, 480,
+ 657, 10585, 486,
+ 657, 10585, 492,
+ 657, 10585, 500,
+ 657, 10585, 502,
+ 657, 10585, 506,
+ 657, 10585, 508,
+ 657, 10585, 510,
+ 657, 10585, 512,
+ 657, 10585, 516,
+ 657, 10585, 520,
+ 657, 10585, 522,
+ 657, 10585, 524,
+ 657, 10585, 526,
+ 657, 10585, 532,
+ 657, 10585, 536,
+ 657, 10585, 546,
+ 657, 10585, 552,
+ 657, 10585, 556,
+ 657, 10585, 560,
+ 657, 10585, 564,
+ 657, 10585, 568,
+ 657, 10585, 576,
+ 657, 10585, 598,
+ 657, 10585, 610,
+ 657, 10585, 614,
+ 657, 10585, 616,
+ 657, 10585, 618,
+ 657, 10585, 620,
+ 657, 10585, 622,
+ 657, 10585, 626,
+ 657, 10585, 632,
+ 657, 10585, 634,
+ 657, 10585, 644,
+ 657, 10585, 646,
+ 657, 10585, 650,
+ 657, 10585, 656,
+ 657, 10585, 660,
+ 657, 10585, 664,
+ 657, 10585, 668,
+ 657, 10585, 670,
+ 657, 10585, 672,
+ 657, 10585, 676,
+ 657, 10585, 678,
+ 657, 10585, 680,
+ 657, 10585, 682,
+ 657, 10585, 758,
+ 657, 10585, 762,
+ 657, 10585, 764,
+ 657, 10585, 766,
+ 657, 10585, 768,
+ 657, 10585, 770,
+ 657, 10585, 772,
+ 657, 10585, 774,
+ 657, 10585, 776,
+ 657, 10585, 786,
+ 657, 10585, 790,
+ 657, 10585, 804,
+ 657, 10585, 808,
+ 657, 10585, 810,
+ 657, 10585, 812,
+ 657, 10585, 820,
+ 657, 10585, 822,
+ 657, 10585, 826,
+ 657, 10585, 828,
+ 657, 10585, 830,
+ 657, 10585, 832,
+ 657, 10585, 834,
+ 657, 10585, 836,
+ 657, 10585, 846,
+ 657, 10585, 848,
+ 657, 10585, 850,
+ 657, 10585, 852,
+ 657, 10585, 860,
+ 657, 10585, 862,
+ 657, 10585, 864,
+ 657, 10585, 880,
+ 657, 10585, 882,
+ 657, 10585, 884,
+ 657, 10585, 886,
+ 657, 10585, 890,
+ 657, 10585, 892,
+ 657, 10585, 894,
+ 657, 10585, 896,
+ 657, 10585, 902,
+ 657, 10585, 904,
+ 657, 10585, 906,
+ 657, 10585, 916,
+ 657, 10585, 918,
+ 657, 10585, 922,
+ 657, 10585, 926,
+ 657, 10585, 928,
+ 657, 10585, 930,
+ 657, 10585, 932,
+ 657, 10585, 934,
+ 657, 10585, 946,
+ 657, 10585, 948,
+ 657, 10585, 950,
+ 657, 10585, 952,
+ 657, 10585, 964,
+ 657, 10585, 968,
+ 657, 10585, 970,
+ 657, 10585, 974,
+ 657, 10585, 976,
+ 657, 10585, 978,
+ 657, 10585, 980,
+ 657, 10585, 982,
+ 657, 10585, 992,
+ 657, 10585, 994,
+ 657, 10585, 1008,
+ 657, 10585, 1014,
+ 657, 10585, 1016,
+ 657, 10585, 1018,
+ 657, 10585, 1042,
+ 657, 10585, 1044,
+ 657, 10585, 1046,
+ 657, 10585, 1062,
+ 657, 10585, 1064,
+ 657, 10585, 1066,
+ 657, 10585, 1068,
+ 657, 10585, 1070,
+ 657, 10585, 1144,
+ 657, 10585, 1146,
+ 657, 10585, 1148,
+ 657, 10585, 1162,
+ 657, 10585, 1164,
+ 657, 10585, 1166,
+ 657, 10585, 1174,
+ 657, 10585, 1178,
+ 657, 10585, 1180,
+ 657, 10585, 1182,
+ 657, 10585, 1184,
+ 657, 10585, 1186,
+ 657, 10585, 1196,
+ 657, 10585, 1198,
+ 657, 10585, 1200,
+ 657, 10585, 1218,
+ 657, 10585, 1222,
+ 657, 10585, 1224,
+ 657, 10585, 1242,
+ 657, 10585, 1246,
+ 657, 10585, 1248,
+ 657, 10585, 1250,
+ 657, 10585, 1252,
+ 657, 10585, 1254,
+ 657, 10585, 1256,
+ 657, 10585, 1258,
+ 657, 10585, 1274,
+ 657, 10585, 1278,
+ 657, 10585, 1280,
+ 657, 10585, 1282,
+ 657, 10585, 1292,
+ 657, 10585, 1294,
+ 657, 10585, 1296,
+ 657, 10585, 1312,
+ 657, 10585, 1314,
+ 657, 10585, 1316,
+ 657, 10585, 1318,
+ 657, 10585, 1320,
+ 657, 10585, 1348,
+ 657, 10585, 1352,
+ 657, 10585, 1354,
+ 657, 10585, 1364,
+ 657, 10585, 1368,
+ 657, 10585, 1380,
+ 657, 10585, 1388,
+ 657, 10585, 1390,
+ 657, 10585, 1392,
+ 657, 10585, 1394,
+ 657, 10585, 1396,
+ 657, 10585, 1398,
+ 657, 10585, 1400,
+ 657, 10585, 1402,
+ 657, 10585, 1404,
+ 657, 10585, 1406,
+ 657, 10585, 1408,
+ 657, 10585, 1410,
+ 657, 10585, 1412,
+ 657, 10585, 1414,
+ 657, 10585, 1416,
+ 657, 10585, 1426,
+ 657, 10585, 1428,
+ 657, 10585, 1430,
+ 657, 10585, 1438,
+ 657, 10585, 1450,
+ 657, 10585, 1452,
+ 657, 10585, 1454,
+ 657, 10585, 1456,
+ 657, 10585, 1476,
+ 657, 10585, 1478,
+ 657, 10585, 1480,
+ 657, 10585, 1518,
+ 657, 10585, 1522,
+ 657, 10585, 1524,
+ 657, 10585, 1526,
+ 657, 10585, 1532,
+ 657, 10585, 1534,
+ 657, 10585, 1536,
+ 657, 10585, 1538,
+ 657, 10585, 1544,
+ 657, 10585, 1546,
+ 657, 10585, 1548,
+ 657, 10585, 1552,
+ 657, 10585, 1554,
+ 657, 10585, 1556,
+ 657, 10585, 1558,
+ 657, 10585, 1560,
+ 657, 10585, 1564,
+ 657, 10585, 1566,
+ 657, 10585, 1568,
+ 657, 10585, 1570,
+ 657, 10585, 1590,
+ 657, 10585, 1592,
+ 657, 10585, 1594,
+ 657, 10585, 1604,
+ 657, 10585, 1606,
+ 657, 10585, 1608,
+ 657, 10585, 1626,
+ 657, 10585, 1634,
+ 657, 10585, 1636,
+ 657, 10585, 1638,
+ 657, 10585, 1662,
+ 657, 10585, 1664,
+ 657, 10585, 1666,
+ 657, 10585, 1692,
+ 657, 10585, 1694,
+ 657, 10585, 1696,
+ 657, 10585, 1698,
+ 657, 10585, 1700,
+ 657, 10585, 1742,
+ 657, 10585, 1746,
+ 657, 10585, 1750,
+ 657, 10585, 1766,
+ 657, 10585, 1768,
+ 657, 10585, 1782,
+ 657, 10585, 1788,
+ 657, 10585, 1790,
+ 657, 10585, 1792,
+ 657, 10585, 1804,
+ 657, 10585, 1806,
+ 657, 10585, 1810,
+ 657, 10585, 1824,
+ 657, 10585, 1826,
+ 657, 10585, 1828,
+ 657, 10585, 1830,
+ 657, 10585, 1832,
+ 657, 10585, 1842,
+ 657, 10585, 1844,
+ 657, 10585, 1846,
+ 657, 10585, 1848,
+ 657, 10585, 1862,
+ 657, 10585, 1866,
+ 657, 10585, 1868,
+ 657, 10585, 1898,
+ 657, 10585, 1900,
+ 657, 10585, 1902,
+ 657, 10585, 1904,
+ 657, 10585, 1906,
+ 657, 10585, 1912,
+ 657, 10585, 1924,
+ 657, 10585, 1926,
+ 657, 10585, 1928,
+ 657, 10585, 1940,
+ 657, 10585, 1942,
+ 657, 10585, 1944,
+ 657, 10585, 1954,
+ 657, 10585, 1956,
+ 657, 10585, 1958,
+ 657, 10585, 1960,
+ 657, 10585, 1962,
+ 657, 10585, 1974,
+ 657, 10585, 1976,
+ 657, 10585, 1978,
+ 657, 10585, 1990,
+ 657, 10585, 1994,
+ 657, 10585, 1996,
+ 657, 10585, 1998,
+ 657, 10585, 2000,
+ 657, 10585, 2002,
+ 657, 10585, 2004,
+ 657, 10585, 2006,
+ 657, 10585, 2008,
+ 657, 10585, 2010,
+ 657, 10585, 2012,
+ 657, 10585, 2014,
+ 657, 10585, 2022,
+ 657, 10585, 2028,
+ 657, 10585, 2030,
+ 657, 10585, 2032,
+ 657, 10585, 2038,
+ 657, 10585, 2050,
+ 657, 10585, 2056,
+ 657, 10585, 2058,
+ 657, 10585, 2060,
+ 657, 10585, 2066,
+ 657, 10585, 2068,
+ 657, 10585, 2070,
+ 657, 10585, 2072,
+ 657, 10585, 2086,
+ 657, 10585, 2090,
+ 657, 10585, 2094,
+ 657, 10585, 2096,
+ 657, 10585, 2098,
+ 657, 10585, 2100,
+ 657, 10585, 2102,
+ 657, 10585, 2104,
+ 657, 10585, 2112,
+ 657, 10585, 2114,
+ 657, 10585, 2116,
+ 657, 10585, 2118,
+ 657, 10585, 2120,
+ 657, 10585, 2132,
+ 657, 10585, 2134,
+ 657, 10585, 2136,
+ 657, 10585, 2138,
+ 657, 10585, 2140,
+ 657, 10585, 2142,
+ 657, 10585, 2144,
+ 657, 10585, 2146,
+ 657, 10585, 2194,
+ 657, 10585, 2198,
+ 657, 10585, 2202,
+ 657, 10585, 2222,
+ 657, 10585, 2228,
+ 657, 10585, 2230,
+ 657, 10585, 2232,
+ 657, 10585, 2240,
+ 657, 10585, 2242,
+ 657, 10585, 2244,
+ 657, 10585, 2256,
+ 657, 10585, 2258,
+ 657, 10585, 2260,
+ 657, 10585, 2262,
+ 657, 10585, 2264,
+ 657, 10585, 2274,
+ 657, 10585, 2276,
+ 657, 10585, 2278,
+ 657, 10585, 2280,
+ 657, 10585, 2306,
+ 657, 10585, 2310,
+ 657, 10585, 2312,
+ 657, 10585, 2314,
+ 657, 10585, 2322,
+ 657, 10585, 2324,
+ 657, 10585, 2326,
+ 657, 10585, 2336,
+ 657, 10585, 2338,
+ 657, 10585, 2340,
+ 657, 10585, 2342,
+ 657, 10585, 2348,
+ 657, 10585, 2364,
+ 657, 10585, 2366,
+ 657, 10585, 2368,
+ 657, 10585, 2372,
+ 657, 10585, 2390,
+ 657, 10585, 2392,
+ 657, 10585, 2394,
+ 657, 10585, 2406,
+ 657, 10585, 2408,
+ 657, 10585, 2432,
+ 657, 10585, 2434,
+ 657, 10585, 2436,
+ 657, 10585, 2438,
+ 657, 10585, 2440,
+ 657, 10585, 2442,
+ 657, 10585, 2444,
+ 657, 10585, 2446,
+ 657, 10585, 2456,
+ 657, 10585, 2458,
+ 657, 10585, 2460,
+ 657, 10585, 2462,
+ 657, 10585, 2464,
+ 657, 10585, 2470,
+ 657, 10585, 2472,
+ 657, 10585, 2474,
+ 657, 10585, 2476,
+ 657, 10585, 2492,
+ 657, 10585, 2496,
+ 657, 10585, 2500,
+ 657, 10585, 2508,
+ 657, 10585, 2512,
+ 657, 10585, 2516,
+ 657, 10585, 2518,
+ 657, 10585, 2522,
+ 657, 10585, 2524,
+ 657, 10585, 2526,
+ 657, 10585, 2528,
+ 657, 10585, 2536,
+ 657, 10585, 2538,
+ 657, 10585, 2540,
+ 657, 10585, 2556,
+ 657, 10585, 2558,
+ 657, 10585, 2564,
+ 657, 10585, 2566,
+ 657, 10585, 2568,
+ 657, 10585, 2570,
+ 657, 10585, 2572,
+ 657, 10585, 2574,
+ 657, 10585, 2576,
+ 657, 10585, 2588,
+ 657, 10585, 2590,
+ 657, 10585, 2592,
+ 657, 10585, 2594,
+ 657, 10585, 2596,
+ 657, 10585, 2612,
+ 657, 10585, 2614,
+ 657, 10585, 2616,
+ 657, 10585, 2618,
+ 657, 10585, 2652,
+ 657, 10585, 2656,
+ 657, 10585, 2664,
+ 657, 10585, 2672,
+ 657, 10585, 2676,
+ 657, 10585, 2690,
+ 657, 10585, 2696,
+ 657, 10585, 2700,
+ 657, 10585, 2702,
+ 657, 10585, 2724,
+ 657, 10585, 2726,
+ 657, 10585, 2728,
+ 657, 10585, 2762,
+ 657, 10585, 2764,
+ 657, 10585, 2766,
+ 657, 10585, 2768,
+ 657, 10585, 2770,
+ 657, 10585, 2818,
+ 657, 10585, 2820,
+ 657, 10585, 2848,
+ 657, 10585, 2850,
+ 657, 10585, 2854,
+ 657, 10585, 2860,
+ 657, 10585, 2864,
+ 657, 10585, 2866,
+ 657, 10585, 2870,
+ 657, 10585, 2872,
+ 657, 10585, 2874,
+ 657, 10585, 2878,
+ 657, 10585, 2880,
+ 657, 10585, 2886,
+ 657, 10585, 2888,
+ 657, 10585, 2890,
+ 657, 10585, 2892,
+ 657, 10585, 2894,
+ 657, 10585, 2898,
+ 657, 10585, 2900,
+ 657, 10585, 2902,
+ 657, 10585, 2904,
+ 657, 10585, 2912,
+ 657, 10585, 2914,
+ 657, 10585, 2920,
+ 657, 10585, 2928,
+ 657, 10585, 2930,
+ 657, 10585, 2944,
+ 657, 10585, 2946,
+ 657, 10585, 2950,
+ 657, 10585, 2960,
+ 657, 10585, 2962,
+ 657, 10585, 2964,
+ 657, 10585, 2966,
+ 657, 10585, 2970,
+ 657, 10585, 2974,
+ 657, 10585, 2976,
+ 657, 10585, 2978,
+ 657, 10585, 2996,
+ 657, 10585, 2998,
+ 657, 10585, 3000,
+ 657, 10585, 3004,
+ 657, 10585, 3064,
+ 657, 10585, 3072,
+ 657, 10585, 3074,
+ 657, 10585, 3076,
+ 657, 10585, 3084,
+ 657, 10585, 3086,
+ 657, 10585, 3088,
+ 657, 10585, 3090,
+ 657, 10585, 3092,
+ 657, 10585, 3094,
+ 657, 10585, 3098,
+ 657, 10585, 3100,
+ 657, 10585, 3112,
+ 657, 10585, 3114,
+ 657, 10585, 3116,
+ 657, 10585, 3118,
+ 657, 10585, 3130,
+ 657, 10585, 3132,
+ 657, 10585, 3134,
+ 657, 10585, 3142,
+ 657, 10585, 3144,
+ 657, 10585, 3146,
+ 657, 10585, 3148,
+ 657, 10585, 3152,
+ 657, 10585, 3154,
+ 657, 10585, 3156,
+ 657, 10585, 3162,
+ 657, 10585, 3166,
+ 657, 10585, 3168,
+ 657, 10585, 3170,
+ 657, 10585, 3180,
+ 657, 10585, 3182,
+ 657, 10585, 3184,
+ 657, 10585, 3192,
+ 657, 10585, 3194,
+ 657, 10585, 3196,
+ 657, 10585, 3198,
+ 657, 10585, 3200,
+ 657, 10585, 3204,
+ 657, 10585, 3206,
+ 657, 10585, 3208,
+ 657, 10585, 3210,
+ 657, 10585, 3212,
+ 657, 10585, 3214,
+ 657, 10585, 3216,
+ 657, 10585, 3218,
+ 657, 10585, 3220,
+ 657, 10585, 3222,
+ 657, 10585, 3718,
+ 657, 10585, 3720,
+ 657, 10585, 3722,
+ 657, 10585, 3724,
+ 657, 10585, 3726,
+ 657, 10585, 3728,
+ 657, 10585, 3730,
+ 657, 10585, 3732,
+ 657, 10585, 3734,
+ 657, 10585, 3736,
+ 657, 10585, 3738,
+ 657, 10585, 3740,
+ 657, 10585, 3742,
+ 657, 10585, 3744,
+ 657, 10585, 3746,
+ 657, 10585, 3748,
+ 657, 10585, 3750,
+ 657, 10585, 3752,
+ 657, 10585, 3754,
+ 657, 10585, 3756,
+ 657, 10585, 3782,
+ 657, 10585, 3784,
+ 657, 10585, 3786,
+ 657, 10585, 3816,
+ 657, 10585, 3818,
+ 657, 10585, 3824,
+ 657, 10585, 3828,
+ 657, 10585, 3882,
+ 657, 10585, 3886,
+ 657, 10585, 3888,
+ 657, 10585, 3896,
+ 657, 10585, 3898,
+ 657, 10585, 3900,
+ 657, 10585, 3910,
+ 657, 10585, 3912,
+ 657, 10585, 3914,
+ 657, 10585, 3916,
+ 657, 10585, 3918,
+ 657, 10585, 3920,
+ 657, 10585, 3922,
+ 657, 10585, 3926,
+ 657, 10585, 3928,
+ 657, 10585, 3930,
+ 657, 10585, 3932,
+ 657, 10585, 3934,
+ 657, 10585, 3936,
+ 657, 10585, 3938,
+ 657, 10585, 3962,
+ 657, 10585, 3964,
+ 657, 10585, 3968,
+ 657, 10585, 3976,
+ 657, 10585, 4002,
+ 657, 10585, 4004,
+ 657, 10585, 4006,
+ 657, 10585, 4012,
+ 657, 10585, 4014,
+ 657, 10585, 4020,
+ 657, 10585, 4022,
+ 657, 10585, 4024,
+ 657, 10585, 4026,
+ 657, 10585, 4030,
+ 657, 10585, 4032,
+ 657, 10585, 4034,
+ 657, 10585, 4036,
+ 657, 10585, 4038,
+ 657, 10585, 4040,
+ 657, 10585, 4042,
+ 657, 10585, 4044,
+ 657, 10585, 4082,
+ 657, 10585, 4084,
+ 657, 10585, 4130,
+ 657, 10585, 4134,
+ 657, 10585, 4224,
+ 657, 10585, 4272,
+ 657, 10585, 4274,
+ 657, 10585, 4276,
+ 657, 10585, 4280,
+ 657, 10585, 4282,
+ 657, 10585, 4284,
+ 657, 10585, 4286,
+ 657, 10585, 4288,
+ 657, 10585, 4290,
+ 657, 10585, 4292,
+ 657, 10585, 4294,
+ 657, 10585, 4296,
+ 657, 10585, 4298,
+ 657, 10585, 4300,
+ 657, 10585, 4302,
+ 657, 10585, 4304,
+ 657, 10585, 4306,
+ 657, 10585, 4326,
+ 657, 10585, 4328,
+ 657, 10585, 4330,
+ 657, 10585, 4360,
+ 657, 10585, 4362,
+ 657, 10585, 4364,
+ 657, 10585, 4368,
+ 657, 10585, 4420,
+ 657, 10585, 4426,
+ 657, 10585, 4428,
+ 657, 10585, 4430,
+ 657, 10585, 4432,
+ 657, 10585, 4434,
+ 657, 10585, 4436,
+ 657, 10585, 4438,
+ 657, 10585, 4440,
+ 657, 10585, 4442,
+ 657, 10585, 4444,
+ 657, 10585, 4446,
+ 657, 10585, 4448,
+ 657, 10585, 4450,
+ 657, 10585, 4452,
+ 657, 10585, 4454,
+ 657, 10585, 4456,
+ 657, 10585, 4458,
+ 657, 10585, 4460,
+ 657, 10585, 4462,
+ 657, 10585, 4464,
+ 657, 10585, 4466,
+ 657, 10585, 4468,
+ 657, 10585, 4470,
+ 657, 10585, 4472,
+ 657, 10585, 4474,
+ 657, 10585, 4476,
+ 657, 10585, 4478,
+ 657, 10585, 4480,
+ 657, 10585, 4482,
+ 657, 10585, 4484,
+ 657, 10585, 4486,
+ 657, 10585, 4488,
+ 657, 10585, 4490,
+ 657, 10585, 4492,
+ 657, 10585, 4494,
+ 657, 10585, 4496,
+ 657, 10585, 4498,
+ 657, 10585, 4500,
+ 657, 10585, 4502,
+ 657, 10585, 4504,
+ 657, 10585, 4506,
+ 657, 10585, 4508,
+ 657, 10585, 4510,
+ 657, 10585, 4512,
+ 657, 10585, 4514,
+ 657, 10585, 4516,
+ 657, 10585, 4518,
+ 657, 10585, 4520,
+ 657, 10585, 4522,
+ 657, 10585, 4524,
+ 657, 10585, 4526,
+ 657, 10585, 4528,
+ 657, 10585, 4550,
+ 657, 10585, 4552,
+ 657, 10585, 4554,
+ 657, 10585, 4558,
+ 657, 10585, 4560,
+ 657, 10585, 4562,
+ 657, 10585, 4564,
+ 657, 10585, 4566,
+ 657, 10585, 4568,
+ 657, 10585, 4570,
+ 657, 10585, 4572,
+ 657, 10585, 4574,
+ 657, 10585, 4576,
+ 657, 10585, 4578,
+ 657, 10585, 4580,
+ 657, 10585, 4582,
+ 657, 10585, 4638,
+ 657, 10585, 4640,
+ 657, 10585, 4642,
+ 657, 10585, 4646,
+ 657, 10585, 4648,
+ 657, 10585, 4650,
+ 657, 10585, 4652,
+ 657, 10585, 4654,
+ 657, 10585, 4656,
+ 657, 10585, 4658,
+ 657, 10585, 4660,
+ 657, 10585, 4662,
+ 657, 10585, 4664,
+ 657, 10585, 4666,
+ 657, 10585, 4668,
+ 657, 10585, 4670,
+ 657, 10585, 4672,
+ 657, 10585, 4674,
+ 657, 10585, 4688,
+ 657, 10585, 4690,
+ 657, 10585, 4692,
+ 657, 10585, 4694,
+ 657, 10585, 4696,
+ 657, 10585, 4756,
+ 657, 10585, 4758,
+ 657, 10585, 4786,
+ 657, 10585, 4788,
+ 657, 10585, 4792,
+ 657, 10585, 4866,
+ 657, 10585, 4868,
+ 657, 10585, 4870,
+ 657, 10585, 4902,
+ 657, 10585, 4904,
+ 657, 10585, 4906,
+ 657, 10585, 4908,
+ 657, 10585, 4916,
+ 657, 10585, 4958,
+ 657, 10585, 4960,
+ 657, 10585, 4962,
+ 657, 10585, 4974,
+ 657, 10585, 4976,
+ 657, 10585, 4978,
+ 657, 10585, 4980,
+ 657, 10585, 4982,
+ 657, 10585, 4984,
+ 657, 10585, 4986,
+ 657, 10585, 4988,
+ 657, 10585, 4990,
+ 657, 10585, 4992,
+ 657, 10585, 4994,
+ 657, 10585, 4996,
+ 657, 10585, 4998,
+ 657, 10585, 5020,
+ 657, 10585, 5022,
+ 657, 10585, 5024,
+ 657, 10585, 5028,
+ 657, 10585, 5058,
+ 657, 10585, 5060,
+ 657, 10585, 5062,
+ 657, 10585, 5064,
+ 657, 10585, 5066,
+ 657, 10585, 5068,
+ 657, 10585, 5070,
+ 657, 10585, 5072,
+ 657, 10585, 5074,
+ 657, 10585, 5076,
+ 657, 10585, 5078,
+ 657, 10585, 5080,
+ 657, 10585, 5082,
+ 657, 10585, 5084,
+ 657, 10585, 5086,
+ 657, 10585, 5088,
+ 657, 10585, 5090,
+ 657, 10585, 5092,
+ 657, 10585, 5094,
+ 657, 10585, 5096,
+ 657, 10585, 5098,
+ 657, 10585, 5102,
+ 657, 10585, 5104,
+ 657, 10585, 5106,
+ 657, 10585, 5108,
+ 657, 10585, 5110,
+ 657, 10585, 5112,
+ 657, 10585, 5116,
+ 657, 10585, 5118,
+ 657, 10585, 5120,
+ 657, 10585, 5122,
+ 657, 10585, 5124,
+ 657, 10585, 5126,
+ 657, 10585, 5128,
+ 657, 10585, 5138,
+ 657, 10585, 5142,
+ 657, 10585, 5144,
+ 657, 10585, 5148,
+ 657, 10585, 5150,
+ 657, 10585, 5162,
+ 657, 10585, 5172,
+ 657, 10585, 5174,
+ 657, 10585, 5176,
+ 657, 10585, 5180,
+ 657, 10585, 5186,
+ 657, 10585, 5188,
+ 657, 10585, 5196,
+ 657, 10585, 5198,
+ 657, 10585, 5200,
+ 657, 10585, 5202,
+ 657, 10585, 5206,
+ 657, 10585, 5208,
+ 657, 10585, 5210,
+ 657, 10585, 5212,
+ 657, 10585, 5214,
+ 657, 10585, 5216,
+ 657, 10585, 5218,
+ 657, 10585, 5220,
+ 657, 10585, 5222,
+ 657, 10585, 5224,
+ 657, 10585, 5226,
+ 657, 10585, 5246,
+ 657, 10585, 5248,
+ 657, 10585, 5250,
+ 657, 10585, 5252,
+ 657, 10585, 5254,
+ 657, 10585, 5256,
+ 657, 10585, 5258,
+ 657, 10585, 5260,
+ 657, 10585, 5262,
+ 657, 10585, 5264,
+ 657, 10585, 5266,
+ 657, 10585, 5268,
+ 657, 10585, 5270,
+ 657, 10585, 5272,
+ 657, 10585, 5274,
+ 657, 10585, 5276,
+ 657, 10585, 5282,
+ 657, 10585, 5284,
+ 657, 10585, 5286,
+ 657, 10585, 5302,
+ 657, 10585, 5304,
+ 657, 10585, 5308,
+ 657, 10585, 5310,
+ 657, 10585, 5318,
+ 657, 10585, 5320,
+ 657, 10585, 5322,
+ 657, 10585, 5324,
+ 657, 10585, 5326,
+ 657, 10585, 5328,
+ 657, 10585, 5330,
+ 657, 10585, 5334,
+ 657, 10585, 5336,
+ 657, 10585, 5338,
+ 657, 10585, 5340,
+ 657, 10585, 5342,
+ 657, 10585, 5344,
+ 657, 10585, 5346,
+ 657, 10585, 5348,
+ 657, 10585, 5350,
+ 657, 10585, 5352,
+ 657, 10585, 5354,
+ 657, 10585, 5356,
+ 657, 10585, 5358,
+ 657, 10585, 5360,
+ 657, 10585, 5362,
+ 657, 10585, 5364,
+ 657, 10585, 5366,
+ 657, 10585, 5368,
+ 657, 10585, 5426,
+ 657, 10585, 5428,
+ 657, 10585, 5454,
+ 657, 10585, 5456,
+ 657, 10585, 5458,
+ 657, 10585, 5468,
+ 657, 10585, 5488,
+ 657, 10585, 5490,
+ 657, 10585, 5492,
+ 657, 10585, 5498,
+ 657, 10585, 5500,
+ 657, 10585, 5502,
+ 657, 10585, 5504,
+ 657, 10585, 5516,
+ 657, 10585, 5570,
+ 657, 10585, 5574,
+ 657, 10585, 5576,
+ 657, 10585, 5578,
+ 657, 10585, 5580,
+ 657, 10585, 5582,
+ 657, 10585, 5584,
+ 657, 10585, 5586,
+ 657, 10585, 5588,
+ 657, 10585, 5590,
+ 657, 10585, 5592,
+ 657, 10585, 5594,
+ 657, 10585, 5596,
+ 657, 10585, 5598,
+ 657, 10585, 5600,
+ 657, 10585, 5602,
+ 657, 10585, 5608,
+ 657, 10585, 5610,
+ 657, 10585, 5612,
+ 657, 10585, 5618,
+ 657, 10585, 5672,
+ 657, 10585, 5674,
+ 657, 10585, 5676,
+ 657, 10585, 5684,
+ 657, 10585, 5686,
+ 657, 10585, 5688,
+ 657, 10585, 5712,
+ 657, 10585, 5714,
+ 657, 10585, 5716,
+ 657, 10585, 5722,
+ 657, 10585, 5724,
+ 657, 10585, 5726,
+ 657, 10585, 5728,
+ 657, 10585, 5730,
+ 657, 10585, 5742,
+ 657, 10585, 5744,
+ 657, 10585, 5746,
+ 657, 10585, 5748,
+ 657, 10585, 5752,
+ 657, 10585, 5754,
+ 657, 10585, 5788,
+ 657, 10585, 5790,
+ 657, 10585, 5792,
+ 657, 10585, 5796,
+ 657, 10585, 5798,
+ 657, 10585, 5800,
+ 657, 10585, 5802,
+ 657, 10585, 5804,
+ 657, 10585, 5806,
+ 657, 10585, 5808,
+ 657, 10585, 5810,
+ 657, 10585, 5812,
+ 657, 10585, 5814,
+ 657, 10585, 5816,
+ 657, 10585, 5818,
+ 657, 10585, 5820,
+ 657, 10585, 5822,
+ 657, 10585, 5824,
+ 657, 10585, 5826,
+ 657, 10585, 5848,
+ 657, 10585, 5850,
+ 657, 10585, 5856,
+ 657, 10585, 5864,
+ 657, 10585, 5936,
+ 657, 10585, 5938,
+ 657, 10585, 6014,
+ 657, 10585, 6016,
+ 657, 10585, 6018,
+ 657, 10585, 6022,
+ 657, 10585, 6084,
+ 657, 10585, 6086,
+ 657, 10585, 6088,
+ 657, 10585, 6094,
+ 657, 10585, 6096,
+ 657, 10585, 6134,
+ 657, 10585, 6136,
+ 657, 10585, 6140,
+ 657, 10585, 6142,
+ 657, 10585, 6144,
+ 657, 10585, 6146,
+ 657, 10585, 6156,
+ 657, 10585, 6206,
+ 657, 10585, 6208,
+ 657, 10585, 6210,
+ 657, 10585, 6238,
+ 657, 10585, 6240,
+ 657, 10585, 6242,
+ 657, 10585, 6244,
+ 657, 10585, 6252,
+ 657, 10585, 6266,
+ 657, 10585, 6270,
+ 657, 10585, 6272,
+ 657, 10585, 6276,
+ 657, 10585, 6278,
+ 657, 10585, 6280,
+ 657, 10585, 6284,
+ 657, 10585, 6286,
+ 657, 10585, 6288,
+ 657, 10585, 6290,
+ 657, 10585, 6292,
+ 657, 10585, 6294,
+ 657, 10585, 6296,
+ 657, 10585, 6298,
+ 657, 10585, 6304,
+ 657, 10585, 6306,
+ 657, 10585, 6308,
+ 657, 10585, 6310,
+ 657, 10585, 6314,
+ 657, 10585, 6316,
+ 657, 10585, 6320,
+ 657, 10585, 6322,
+ 657, 10585, 6324,
+ 657, 10585, 6326,
+ 657, 10585, 6330,
+ 657, 10585, 6332,
+ 657, 10585, 6334,
+ 657, 10585, 6338,
+ 657, 10585, 6340,
+ 657, 10585, 6342,
+ 657, 10585, 6344,
+ 657, 10585, 6346,
+ 657, 10585, 6348,
+ 657, 10585, 6350,
+ 657, 10585, 6352,
+ 657, 10585, 6354,
+ 657, 10585, 6356,
+ 657, 10585, 6358,
+ 657, 10585, 6360,
+ 657, 10585, 6362,
+ 657, 10585, 6364,
+ 657, 10585, 6366,
+ 657, 10585, 6470,
+ 657, 10585, 6472,
+ 657, 10585, 6474,
+ 657, 10585, 6476,
+ 657, 10585, 6478,
+ 657, 10585, 6480,
+ 657, 10585, 6584,
+ 657, 10585, 6586,
+ 657, 10585, 6588,
+ 657, 10585, 6590,
+ 657, 10585, 6592,
+ 657, 10585, 6660,
+ 657, 10585, 6662,
+ 657, 10585, 6664,
+ 657, 10585, 6666,
+ 657, 10585, 6668,
+ 657, 10585, 6834,
+ 657, 10585, 6836,
+ 657, 10585, 6838,
+ 657, 10585, 6840,
+ 657, 10585, 6842,
+ 657, 10585, 6844,
+ 657, 10585, 6916,
+ 657, 10585, 6918,
+ 657, 10585, 6920,
+ 657, 10585, 6922,
+ 657, 10585, 6924,
+ 657, 10585, 6926,
+ 657, 10585, 6928,
+ 657, 10585, 6930,
+ 657, 10585, 6932,
+ 657, 10585, 6934,
+ 657, 10585, 6936,
+ 657, 10585, 6938,
+ 657, 10585, 6940,
+ 657, 10585, 6942,
+ 657, 10585, 6944,
+ 657, 10585, 6946,
+ 657, 10585, 6962,
+ 657, 10585, 6964,
+ 657, 10585, 6966,
+ 657, 10585, 6968,
+ 657, 10585, 6970,
+ 657, 10585, 6972,
+ 657, 10585, 6998,
+ 657, 10585, 7000,
+ 657, 10585, 7002,
+ 657, 10585, 7004,
+ 657, 10585, 7006,
+ 657, 10585, 7008,
+ 657, 10585, 7156,
+ 657, 10585, 7158,
+ 657, 10585, 7160,
+ 657, 10585, 7162,
+ 657, 10585, 7212,
+ 657, 10585, 7214,
+ 657, 10585, 7216,
+ 657, 10585, 7218,
+ 657, 10585, 7220,
+ 657, 10585, 7224,
+ 657, 10585, 7234,
+ 657, 10585, 7236,
+ 657, 10585, 7240,
+ 657, 10585, 7242,
+ 657, 10585, 7250,
+ 657, 10585, 7252,
+ 657, 10585, 7254,
+ 657, 10585, 7256,
+ 657, 10585, 7258,
+ 657, 10585, 7260,
+ 657, 10585, 7278,
+ 657, 10585, 7280,
+ 657, 10585, 7286,
+ 657, 10585, 7288,
+ 657, 10585, 7290,
+ 657, 10585, 7292,
+ 657, 10585, 7294,
+ 657, 10585, 7296,
+ 657, 10585, 7298,
+ 657, 10585, 7300,
+ 657, 10585, 7302,
+ 657, 10585, 7304,
+ 657, 10585, 7456,
+ 657, 10585, 7458,
+ 657, 10585, 7460,
+ 657, 10585, 7552,
+ 657, 10585, 7554,
+ 657, 10585, 7556,
+ 657, 10585, 7564,
+ 657, 10585, 7620,
+ 657, 10585, 7622,
+ 657, 10585, 7624,
+ 657, 10585, 7876,
+ 657, 10585, 7878,
+ 657, 10585, 7880,
+ 657, 10585, 7882,
+ 657, 10585, 7894,
+ 657, 10585, 7896,
+ 657, 10585, 7898,
+ 657, 10585, 7900,
+ 657, 10585, 7902,
+ 705, 8694,
+ 719, 6741, 568,
+ 719, 13042,
+ 721, 6121, 1044,
+ 729, 11635, 8775, 601, 5707, 1546,
+ 729, 11635, 8775, 601, 5877, 1546,
+ 729, 11635, 8775, 601, 5877, 9546,
+ 729, 11635, 8775, 601, 5877, 10804,
+ 729, 11635, 8775, 601, 6543, 7708,
+ 729, 11635, 8775, 991, 7636,
+ 729, 11635, 8775, 991, 7708,
+ 729, 11635, 8775, 991, 10804,
+ 729, 11635, 8775, 1547, 10666,
+ 729, 11635, 8775, 1547, 10804,
+ 729, 11635, 8775, 2412,
+ 729, 11635, 8775, 4117, 5707, 7636,
+ 729, 11635, 8775, 4117, 5877, 1546,
+ 729, 11635, 8775, 4117, 5877, 10666,
+ 729, 11635, 8775, 4117, 6543, 7708,
+ 729, 11635, 8775, 4614,
+ 729, 11635, 8775, 4615, 10666,
+ 729, 11635, 8775, 4849, 5707, 7636,
+ 729, 11635, 8775, 5496,
+ 729, 11635, 8775, 5497, 601, 6542,
+ 729, 11635, 8775, 5497, 990,
+ 729, 11635, 8775, 5497, 1546,
+ 729, 11635, 8775, 5497, 2091, 6740,
+ 729, 11635, 8775, 5497, 4117, 6542,
+ 729, 11635, 8775, 5497, 6610,
+ 729, 11635, 8775, 5497, 6674,
+ 729, 11635, 8775, 5497, 6740,
+ 729, 11635, 8775, 5497, 7580,
+ 729, 11635, 8775, 5497, 8056,
+ 729, 11635, 8775, 5497, 8122,
+ 729, 11635, 8775, 5497, 9158,
+ 729, 11635, 8775, 5497, 9811, 6434,
+ 729, 11635, 8775, 5497, 10468,
+ 729, 11635, 8775, 5497, 10728,
+ 729, 11635, 8775, 5497, 10959, 6434,
+ 729, 11635, 8775, 5497, 11097, 6434,
+ 729, 11635, 8775, 5497, 11098,
+ 729, 11635, 8775, 5497, 11765, 6434,
+ 729, 11635, 8775, 5497, 12472,
+ 729, 11635, 8775, 5831, 10804,
+ 729, 11635, 8775, 6406,
+ 729, 11635, 8775, 6407, 10666,
+ 729, 11635, 8775, 6617, 760,
+ 729, 11635, 8775, 6675, 7636,
+ 729, 11635, 8775, 6675, 10666,
+ 729, 11635, 8775, 7316,
+ 729, 11635, 8775, 7317, 10666,
+ 729, 11635, 8775, 7415, 5496,
+ 729, 11635, 8775, 7415, 10666,
+ 729, 11635, 8775, 7581, 760,
+ 729, 11635, 8775, 7637, 7708,
+ 729, 11635, 8775, 7709, 10804,
+ 729, 11635, 8775, 7884,
+ 729, 11635, 8775, 8057, 1546,
+ 729, 11635, 8775, 8057, 5830,
+ 729, 11635, 8775, 8057, 7636,
+ 729, 11635, 8775, 8057, 10666,
+ 729, 11635, 8775, 8057, 10728,
+ 729, 11635, 8775, 8057, 10804,
+ 729, 11635, 8775, 8308,
+ 729, 11635, 8775, 8747, 5496,
+ 729, 11635, 8775, 9159, 10666,
+ 729, 11635, 8775, 9271, 10666,
+ 729, 11635, 8775, 9811, 6074,
+ 729, 11635, 8775, 10729, 760,
+ 729, 11635, 8775, 10959, 6074,
+ 729, 11635, 8775, 11097, 6074,
+ 729, 11635, 8775, 11225, 10666,
+ 729, 11635, 8775, 11765, 6074,
+ 729, 11635, 8775, 12473, 10804,
+ 730,
+ 789, 8774,
+ 807, 9633, 9718,
+ 807, 9718,
+ 827, 10145, 601, 6909, 721, 4117, 11649, 7100,
+ 827, 10145, 601, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 601, 6909, 721, 4849, 7100,
+ 827, 10145, 601, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 601, 6909, 721, 7443, 7100,
+ 827, 10145, 601, 6909, 721, 11649, 7100,
+ 827, 10145, 601, 7101, 721, 4117, 11649, 6908,
+ 827, 10145, 601, 7101, 721, 4849, 4117, 6908,
+ 827, 10145, 601, 7101, 721, 4849, 6908,
+ 827, 10145, 601, 7101, 721, 7443, 4117, 6908,
+ 827, 10145, 601, 7101, 721, 7443, 6908,
+ 827, 10145, 601, 7101, 721, 11649, 6908,
+ 827, 10145, 601, 8153, 721, 4849, 8716,
+ 827, 10145, 601, 8153, 721, 7443, 8716,
+ 827, 10145, 601, 8153, 721, 11649, 8716,
+ 827, 10145, 601, 8717, 721, 4849, 8152,
+ 827, 10145, 601, 8717, 721, 7443, 8152,
+ 827, 10145, 601, 8717, 721, 11649, 8152,
+ 827, 10145, 4117, 6909, 721, 601, 11649, 7100,
+ 827, 10145, 4117, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 4117, 6909, 721, 4849, 7100,
+ 827, 10145, 4117, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4117, 6909, 721, 7443, 7100,
+ 827, 10145, 4117, 6909, 721, 11649, 7100,
+ 827, 10145, 4117, 7101, 721, 601, 11649, 6908,
+ 827, 10145, 4117, 7101, 721, 4849, 601, 6908,
+ 827, 10145, 4117, 7101, 721, 4849, 6908,
+ 827, 10145, 4117, 7101, 721, 7443, 601, 6908,
+ 827, 10145, 4117, 7101, 721, 7443, 6908,
+ 827, 10145, 4117, 7101, 721, 11649, 6908,
+ 827, 10145, 4117, 8153, 721, 4849, 8716,
+ 827, 10145, 4117, 8153, 721, 7443, 8716,
+ 827, 10145, 4117, 8153, 721, 11649, 8716,
+ 827, 10145, 4117, 8717, 721, 4849, 8152,
+ 827, 10145, 4117, 8717, 721, 7443, 8152,
+ 827, 10145, 4117, 8717, 721, 11649, 8152,
+ 827, 10145, 4849, 601, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 4849, 4117, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 601, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 4117, 7100,
+ 827, 10145, 4849, 6909, 721, 7443, 10677, 7100,
+ 827, 10145, 4849, 7101, 721, 7443, 601, 6908,
+ 827, 10145, 4849, 7101, 721, 7443, 4117, 6908,
+ 827, 10145, 4849, 7101, 721, 7443, 10677, 6908,
+ 827, 10145, 6909, 600,
+ 827, 10145, 6909, 601, 721, 4848,
+ 827, 10145, 6909, 601, 721, 7101, 4116,
+ 827, 10145, 6909, 601, 721, 7442,
+ 827, 10145, 6909, 601, 721, 11648,
+ 827, 10145, 6909, 4116,
+ 827, 10145, 6909, 4117, 721, 4848,
+ 827, 10145, 6909, 4117, 721, 7442,
+ 827, 10145, 6909, 4117, 721, 11648,
+ 827, 10145, 6909, 4848,
+ 827, 10145, 6909, 4849, 721, 7101, 7442,
+ 827, 10145, 6909, 7442,
+ 827, 10145, 6909, 8153, 3993, 10676,
+ 827, 10145, 6909, 8153, 3993, 11648,
+ 827, 10145, 6909, 8849, 3993, 10676,
+ 827, 10145, 6909, 8849, 3993, 11648,
+ 827, 10145, 6909, 10676,
+ 827, 10145, 6909, 10677, 721, 4848,
+ 827, 10145, 6909, 10677, 721, 7442,
+ 827, 10145, 6909, 10677, 721, 11648,
+ 827, 10145, 6909, 11191, 3993, 10676,
+ 827, 10145, 6909, 11191, 3993, 11648,
+ 827, 10145, 6909, 11648,
+ 827, 10145, 7101, 600,
+ 827, 10145, 7101, 601, 721, 4848,
+ 827, 10145, 7101, 601, 721, 6909, 4116,
+ 827, 10145, 7101, 601, 721, 7442,
+ 827, 10145, 7101, 601, 721, 11648,
+ 827, 10145, 7101, 731, 601, 721, 4848,
+ 827, 10145, 7101, 731, 601, 721, 7442,
+ 827, 10145, 7101, 731, 4117, 721, 4848,
+ 827, 10145, 7101, 731, 4117, 721, 7442,
+ 827, 10145, 7101, 4116,
+ 827, 10145, 7101, 4117, 721, 4848,
+ 827, 10145, 7101, 4117, 721, 7442,
+ 827, 10145, 7101, 4117, 721, 11648,
+ 827, 10145, 7101, 4848,
+ 827, 10145, 7101, 4849, 721, 6909, 7442,
+ 827, 10145, 7101, 7442,
+ 827, 10145, 7101, 8153, 3993, 10676,
+ 827, 10145, 7101, 8153, 3993, 11648,
+ 827, 10145, 7101, 8849, 3993, 10676,
+ 827, 10145, 7101, 8849, 3993, 11648,
+ 827, 10145, 7101, 10001, 6622,
+ 827, 10145, 7101, 10001, 7773, 4849, 569, 7121, 7442,
+ 827, 10145, 7101, 10001, 7773, 7443, 569, 7121, 4848,
+ 827, 10145, 7101, 10676,
+ 827, 10145, 7101, 10677, 721, 4848,
+ 827, 10145, 7101, 10677, 721, 7442,
+ 827, 10145, 7101, 10677, 721, 11648,
+ 827, 10145, 7101, 11191, 3993, 10676,
+ 827, 10145, 7101, 11191, 3993, 11648,
+ 827, 10145, 7101, 11648,
+ 827, 10145, 7443, 601, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 7443, 4117, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 601, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 4117, 7100,
+ 827, 10145, 7443, 6909, 721, 4849, 10677, 7100,
+ 827, 10145, 7443, 7101, 721, 4849, 601, 6908,
+ 827, 10145, 7443, 7101, 721, 4849, 4117, 6908,
+ 827, 10145, 7443, 7101, 721, 4849, 10677, 6908,
+ 827, 10145, 8153, 601, 721, 4848,
+ 827, 10145, 8153, 601, 721, 7442,
+ 827, 10145, 8153, 601, 721, 11648,
+ 827, 10145, 8153, 4117, 721, 4848,
+ 827, 10145, 8153, 4117, 721, 7442,
+ 827, 10145, 8153, 4117, 721, 11648,
+ 827, 10145, 8153, 10676,
+ 827, 10145, 8153, 10677, 721, 4848,
+ 827, 10145, 8153, 10677, 721, 7442,
+ 827, 10145, 8153, 10677, 721, 11648,
+ 827, 10145, 8153, 11648,
+ 827, 10145, 10677, 6909, 721, 4849, 7100,
+ 827, 10145, 10677, 6909, 721, 7443, 7100,
+ 827, 10145, 10677, 6909, 721, 11649, 7100,
+ 827, 10145, 10677, 7101, 721, 4849, 6908,
+ 827, 10145, 10677, 7101, 721, 7443, 6908,
+ 827, 10145, 10677, 7101, 721, 11649, 6908,
+ 827, 10145, 10677, 8153, 721, 4849, 8716,
+ 827, 10145, 10677, 8153, 721, 7443, 8716,
+ 827, 10145, 10677, 8153, 721, 11649, 8716,
+ 827, 10145, 10677, 8717, 721, 4849, 8152,
+ 827, 10145, 10677, 8717, 721, 7443, 8152,
+ 827, 10145, 10677, 8717, 721, 11649, 8152,
+ 889, 2412,
+ 909, 8759, 6,
+ 909, 8759, 14,
+ 909, 8759, 26,
+ 909, 8759, 30,
+ 909, 8759, 32,
+ 909, 8759, 36,
+ 909, 8759, 38,
+ 909, 8759, 240,
+ 909, 8759, 248,
+ 909, 8759, 254,
+ 909, 8759, 466,
+ 909, 8759, 472,
+ 909, 8759, 494,
+ 909, 8759, 528,
+ 909, 8759, 538,
+ 909, 8759, 544,
+ 909, 8759, 550,
+ 909, 8759, 554,
+ 909, 8759, 566,
+ 909, 8759, 628,
+ 909, 8759, 642,
+ 909, 8759, 844,
+ 909, 8759, 1458,
+ 909, 8759, 1460,
+ 909, 8759, 1462,
+ 909, 8759, 1464,
+ 909, 8759, 2602,
+ 909, 8759, 2608,
+ 909, 8759, 2630,
+ 909, 8759, 4542,
+ 909, 8759, 4584,
+ 909, 8759, 4586,
+ 909, 8759, 4588,
+ 909, 8759, 4590,
+ 909, 8759, 5872,
+ 909, 8759, 6974,
+ 909, 9617, 826,
+ 909, 9617, 920,
+ 909, 9617, 1036,
+ 909, 9617, 1093, 2170,
+ 909, 9617, 1093, 2778,
+ 909, 9617, 1093, 7694,
+ 909, 9617, 1132,
+ 909, 9617, 1136,
+ 909, 9617, 2025, 2170,
+ 909, 9617, 2025, 2778,
+ 909, 9617, 2025, 4214,
+ 909, 9617, 2025, 7694,
+ 909, 9617, 2166,
+ 909, 9617, 2201, 2170,
+ 909, 9617, 2201, 2778,
+ 909, 9617, 2386,
+ 909, 9617, 2390,
+ 909, 9617, 2586,
+ 909, 9617, 3794,
+ 909, 9617, 3805, 429, 6604,
+ 909, 9617, 3806,
+ 909, 9617, 3940,
+ 909, 9617, 4194,
+ 909, 9617, 4208,
+ 909, 9617, 4390,
+ 909, 9617, 4398,
+ 909, 9617, 4536,
+ 909, 9617, 4628,
+ 909, 9617, 4835, 2170,
+ 909, 9617, 4835, 2778,
+ 909, 9617, 4835, 4214,
+ 909, 9617, 4835, 7694,
+ 909, 9617, 4895, 2170,
+ 909, 9617, 4895, 2778,
+ 909, 9617, 4940,
+ 909, 9617, 4950,
+ 909, 9617, 5012,
+ 909, 9617, 5524,
+ 909, 9617, 5646,
+ 909, 9617, 5764,
+ 909, 9617, 6101, 2170,
+ 909, 9617, 6101, 2778,
+ 909, 9617, 6113, 2170,
+ 909, 9617, 6113, 2778,
+ 909, 9617, 6521, 2170,
+ 909, 9617, 6521, 2778,
+ 909, 9617, 6578,
+ 909, 9617, 6600,
+ 909, 9617, 6670,
+ 909, 9617, 6852,
+ 909, 9617, 6873, 2170,
+ 909, 9617, 6873, 2778,
+ 909, 9617, 6873, 7694,
+ 909, 9617, 6907, 2170,
+ 909, 9617, 6907, 2778,
+ 909, 9617, 7057, 2170,
+ 909, 9617, 7057, 2778,
+ 909, 9617, 7185, 2170,
+ 909, 9617, 7185, 2778,
+ 909, 9617, 7526,
+ 909, 9617, 7593, 2170,
+ 909, 9617, 7593, 2778,
+ 909, 9617, 7600,
+ 909, 9617, 7603, 2170,
+ 909, 9617, 7603, 2778,
+ 909, 9617, 7662,
+ 909, 9617, 7704,
+ 909, 9617, 7813, 2170,
+ 909, 9617, 7813, 2778,
+ 909, 9617, 7974,
+ 909, 9617, 8484,
+ 909, 9617, 8486,
+ 909, 9617, 8576,
+ 909, 9617, 8640,
+ 909, 9617, 8681, 2170,
+ 909, 9617, 8681, 2778,
+ 909, 9617, 8681, 7694,
+ 909, 9617, 8735, 2170,
+ 909, 9617, 8735, 2778,
+ 909, 9617, 8824,
+ 909, 9617, 8870,
+ 909, 9617, 9102,
+ 909, 9617, 9948,
+ 909, 9617, 11488,
+ 909, 9617, 11803, 4389, 5969, 7736,
+ 909, 9617, 11803, 4536,
+ 909, 9617, 11803, 6100,
+ 909, 9617, 11803, 7816,
+ 909, 9617, 11803, 8946,
+ 909, 9617, 12419, 1092,
+ 909, 9617, 12419, 1170,
+ 909, 9617, 12419, 2504,
+ 909, 9617, 12419, 3788,
+ 909, 9617, 12419, 3850,
+ 909, 9617, 12419, 4172,
+ 909, 9617, 12419, 4196,
+ 909, 9617, 12419, 4218,
+ 909, 9617, 12419, 4244,
+ 909, 9617, 12419, 4342,
+ 909, 9617, 12419, 4844,
+ 909, 9617, 12419, 4894,
+ 909, 9617, 12419, 5632,
+ 909, 9617, 12419, 5764,
+ 909, 9617, 12419, 6116,
+ 909, 9617, 12419, 6952,
+ 909, 9617, 12419, 7532,
+ 909, 9617, 12419, 7726,
+ 909, 9617, 12419, 8154,
+ 909, 9617, 12419, 8730,
+ 909, 9617, 12419, 8793, 9426,
+ 909, 9617, 12419, 8870,
+ 909, 9617, 12495, 4172,
+ 909, 9617, 12495, 7726,
+ 909, 9617, 12495, 8154,
+ 909, 9617, 12495, 8870,
+ 1009, 8178,
+ 1009, 8180,
+ 1009, 8182,
+ 1009, 8184,
+ 1009, 8186,
+ 1009, 8188,
+ 1045, 5444,
+ 1045, 6376,
+ 1045, 7172,
+ 1045, 10374,
+ 1109, 429, 7394,
+ 1177, 718,
+ 1429, 9730,
+ 1429, 9912,
+ 1635, 5758,
+ 1741, 247, 380,
+ 1741, 247, 412,
+ 1741, 323, 332,
+ 1741, 5965, 1859, 170,
+ 1741, 5965, 1859, 564,
+ 1741, 5965, 1859, 2684,
+ 1741, 5965, 1859, 8034,
+ 1741, 6689, 2170,
+ 1741, 6689, 2540,
+ 1741, 6689, 2778,
+ 1741, 6689, 4200,
+ 1741, 6689, 4214,
+ 1741, 6689, 5190,
+ 1741, 6689, 6260,
+ 1741, 6689, 6722,
+ 1741, 6689, 7508,
+ 1741, 6689, 7694,
+ 1741, 7803, 5759, 0,
+ 1741, 7803, 5759, 8,
+ 1741, 7803, 5759, 16,
+ 1741, 7803, 5759, 28,
+ 1741, 7803, 5759, 40,
+ 1741, 7803, 5759, 48,
+ 1741, 7803, 5759, 58,
+ 1741, 7803, 5759, 72,
+ 1741, 7803, 5759, 78,
+ 1741, 7803, 5759, 98,
+ 1741, 7803, 5759, 168,
+ 1741, 7803, 5759, 266,
+ 1741, 7803, 5759, 606,
+ 1741, 7803, 5759, 668,
+ 1741, 7803, 5759, 1859, 1588,
+ 1741, 7803, 5759, 1859, 1658,
+ 1741, 8405, 28,
+ 1741, 8405, 108,
+ 1741, 8405, 130,
+ 1741, 8405, 150,
+ 1741, 8405, 209, 2646,
+ 1741, 8405, 209, 5846,
+ 1741, 8405, 247, 2646,
+ 1741, 8405, 247, 5846,
+ 1741, 8405, 322,
+ 1741, 8405, 351, 4878,
+ 1741, 8405, 351, 4898,
+ 1741, 8405, 380,
+ 1741, 8405, 412,
+ 1741, 8405, 480,
+ 1741, 8405, 537, 2646,
+ 1741, 8405, 537, 5846,
+ 1741, 8405, 568,
+ 1741, 8405, 632,
+ 1741, 8405, 660,
+ 1741, 8405, 1619, 2646,
+ 1741, 8405, 1619, 5846,
+ 1741, 8405, 2038,
+ 1741, 8405, 2134,
+ 1741, 8405, 2219, 2646,
+ 1741, 8405, 2219, 5846,
+ 1741, 8405, 2685, 2646,
+ 1741, 8405, 2685, 5846,
+ 1741, 10154,
+ 1741, 11134,
+ 1741, 11227, 5759, 350,
+ 1741, 11227, 5759, 2134,
+ 1741, 12421, 4926,
+ 1764,
+ 1809, 4876,
+ 1809, 8153, 7391, 11195, 4926,
+ 1809, 9898,
+ 2027, 2643, 1817, 5759, 1734,
+ 2027, 2643, 1817, 5759, 4826,
+ 2027, 2643, 1817, 5965, 8442,
+ 2027, 2643, 1817, 5965, 8444,
+ 2027, 2643, 1817, 6689, 2170,
+ 2027, 2643, 1817, 6689, 2540,
+ 2027, 2643, 1817, 6689, 2778,
+ 2027, 2643, 1817, 6689, 4200,
+ 2027, 2643, 1817, 6689, 4214,
+ 2027, 2643, 1817, 6689, 5190,
+ 2027, 2643, 1817, 6689, 6260,
+ 2027, 2643, 1817, 6689, 6722,
+ 2027, 2643, 1817, 6689, 7508,
+ 2027, 2643, 1817, 6689, 7694,
+ 2027, 2643, 1817, 7803, 5759, 8,
+ 2027, 2643, 1817, 7803, 5759, 28,
+ 2027, 2643, 1817, 7803, 5759, 40,
+ 2027, 2643, 1817, 7803, 5759, 58,
+ 2027, 2643, 1817, 7803, 5759, 66,
+ 2027, 2643, 1817, 7803, 5759, 98,
+ 2027, 2643, 1817, 7803, 5759, 266,
+ 2027, 2643, 1817, 7803, 5759, 290,
+ 2027, 2643, 1817, 7803, 5759, 422,
+ 2027, 2643, 1817, 7803, 5759, 458,
+ 2027, 2643, 1817, 7803, 5759, 590,
+ 2027, 2643, 1817, 7803, 5759, 606,
+ 2027, 2643, 1817, 7803, 5759, 608,
+ 2027, 2643, 1817, 7803, 5759, 700,
+ 2027, 2643, 1817, 7803, 5759, 2156,
+ 2027, 2643, 1817, 7803, 5759, 2806,
+ 2027, 2643, 1817, 7803, 5759, 7803, 11238,
+ 2027, 2643, 1817, 8405, 1809, 100,
+ 2027, 2643, 1817, 8405, 1809, 138,
+ 2027, 2643, 1817, 8405, 1809, 196,
+ 2027, 2643, 1817, 8405, 1809, 236,
+ 2027, 2643, 1817, 8405, 1809, 306,
+ 2027, 2643, 1817, 8405, 1809, 332,
+ 2027, 2643, 1817, 8405, 1809, 364,
+ 2027, 2643, 1817, 8405, 1809, 392,
+ 2027, 2643, 1817, 8405, 1809, 462,
+ 2027, 2643, 1817, 8405, 1809, 496,
+ 2027, 2643, 1817, 8405, 1809, 524,
+ 2027, 2643, 1817, 8405, 1809, 556,
+ 2027, 2643, 1817, 8405, 1809, 610,
+ 2027, 2643, 1817, 8405, 1809, 638,
+ 2027, 2643, 1817, 8405, 1809, 652,
+ 2027, 2643, 1817, 8405, 1809, 1702,
+ 2027, 2643, 1817, 8405, 1809, 2030,
+ 2027, 2643, 1817, 8405, 1809, 2212,
+ 2027, 2643, 1817, 8405, 1809, 2678,
+ 2027, 2643, 1817, 8405, 1809, 2732,
+ 2027, 2643, 1817, 8405, 1809, 2980,
+ 2027, 2643, 1817, 8405, 4423, 100,
+ 2027, 2643, 1817, 8405, 4423, 138,
+ 2027, 2643, 1817, 8405, 4423, 196,
+ 2027, 2643, 1817, 8405, 4423, 236,
+ 2027, 2643, 1817, 8405, 4423, 306,
+ 2027, 2643, 1817, 8405, 4423, 332,
+ 2027, 2643, 1817, 8405, 4423, 364,
+ 2027, 2643, 1817, 8405, 4423, 392,
+ 2027, 2643, 1817, 8405, 4423, 462,
+ 2027, 2643, 1817, 8405, 4423, 496,
+ 2027, 2643, 1817, 8405, 4423, 524,
+ 2027, 2643, 1817, 8405, 4423, 556,
+ 2027, 2643, 1817, 8405, 4423, 610,
+ 2027, 2643, 1817, 8405, 4423, 638,
+ 2027, 2643, 1817, 8405, 4423, 652,
+ 2027, 2643, 1817, 8405, 4423, 1702,
+ 2027, 2643, 1817, 8405, 4423, 2030,
+ 2027, 2643, 1817, 8405, 4423, 2212,
+ 2027, 2643, 1817, 8405, 4423, 2678,
+ 2027, 2643, 1817, 8405, 4423, 2732,
+ 2027, 2643, 1817, 8405, 4423, 2980,
+ 2027, 2643, 1817, 8405, 6789, 2,
+ 2027, 2643, 1817, 8405, 6789, 6,
+ 2027, 2643, 1817, 8405, 6789, 20,
+ 2027, 2643, 1817, 8405, 6789, 24,
+ 2027, 2643, 1817, 8405, 6789, 26,
+ 2027, 2643, 1817, 8405, 6789, 42,
+ 2027, 2643, 1817, 8405, 6789, 400,
+ 2027, 8701, 5758,
+ 2075, 1809, 5965, 11424,
+ 2075, 4423, 5965, 11424,
+ 2075, 6616,
+ 2075, 6689, 2170,
+ 2075, 6689, 2540,
+ 2075, 6689, 2778,
+ 2075, 6689, 4200,
+ 2075, 6689, 4214,
+ 2075, 6689, 5190,
+ 2075, 6689, 6260,
+ 2075, 6689, 6722,
+ 2075, 6689, 7508,
+ 2075, 6689, 7694,
+ 2075, 8405, 0,
+ 2075, 8405, 8,
+ 2075, 8405, 16,
+ 2075, 8405, 26,
+ 2075, 8405, 28,
+ 2075, 8405, 40,
+ 2075, 8405, 100,
+ 2075, 8405, 138,
+ 2075, 8405, 162,
+ 2075, 8405, 196,
+ 2075, 8405, 236,
+ 2075, 8405, 292,
+ 2075, 8405, 306,
+ 2075, 8405, 332,
+ 2075, 8405, 364,
+ 2075, 8405, 392,
+ 2075, 8405, 393, 8936,
+ 2075, 8405, 440,
+ 2075, 8405, 462,
+ 2075, 8405, 510,
+ 2075, 8405, 524,
+ 2075, 8405, 556,
+ 2075, 8405, 622,
+ 2075, 8405, 652,
+ 2075, 8405, 884,
+ 2075, 8405, 1228,
+ 2075, 8405, 2126,
+ 2075, 8405, 2127, 8936,
+ 2075, 8405, 2438,
+ 2075, 8405, 4679, 292,
+ 2075, 8405, 4679, 510,
+ 2075, 8405, 4679, 884,
+ 2075, 8405, 11470,
+ 2075, 8775, 441, 8104,
+ 2075, 8775, 11636,
+ 2075, 10767, 4895, 1809, 5964,
+ 2075, 10767, 4895, 4423, 5964,
+ 2075, 10767, 4895, 8649, 5964,
+ 2075, 10767, 4895, 11475, 5964,
+ 2075, 10767, 7551, 1809, 5964,
+ 2075, 10767, 7551, 4423, 5964,
+ 2075, 10767, 7551, 8649, 5964,
+ 2075, 10767, 8153, 1045, 6376,
+ 2075, 10767, 12511, 4926,
+ 2075, 11672,
+ 2075, 12017, 4926,
+ 2088,
+ 2091, 1, 8763, 428,
+ 2091, 1, 10579, 428,
+ 2091, 81, 9263, 428,
+ 2091, 5758,
+ 2091, 5972,
+ 2091, 6569, 4926,
+ 2091, 6741, 568,
+ 2091, 7708,
+ 2091, 7919, 6741, 568,
+ 2091, 8521, 10573, 428,
+ 2091, 8521, 10573, 429, 445, 6741, 568,
+ 2091, 8745, 6989, 429, 445, 6741, 568,
+ 2091, 8745, 10379, 429, 445, 6741, 568,
+ 2091, 10411, 568,
+ 2091, 11041, 568,
+ 2091, 11098,
+ 2091, 11621, 568,
+ 2091, 12472,
+ 2091, 13045, 6741, 568,
+ 2159, 825, 2690,
+ 2159, 3771, 8020,
+ 2159, 3992,
+ 2159, 4210,
+ 2159, 4530,
+ 2159, 6564,
+ 2159, 7921, 429, 6568,
+ 2159, 8009, 3711, 13054,
+ 2159, 8153, 10728,
+ 2159, 9973, 8975, 8524,
+ 2159, 10267, 4210,
+ 2163, 5758,
+ 2167, 8325, 8405, 0,
+ 2167, 8325, 8405, 8,
+ 2167, 8325, 8405, 16,
+ 2167, 8325, 8405, 28,
+ 2167, 8325, 8405, 40,
+ 2167, 8325, 8405, 102,
+ 2167, 8325, 8405, 142,
+ 2167, 8325, 8405, 164,
+ 2167, 8325, 8405, 172,
+ 2167, 8325, 8405, 174,
+ 2167, 8325, 8405, 176,
+ 2167, 8325, 8405, 182,
+ 2167, 8325, 8405, 184,
+ 2167, 8325, 8405, 238,
+ 2167, 8325, 8405, 266,
+ 2167, 8325, 8405, 306,
+ 2167, 8325, 8405, 310,
+ 2167, 8325, 8405, 326,
+ 2167, 8325, 8405, 468,
+ 2167, 8325, 8405, 560,
+ 2167, 8325, 8405, 606,
+ 2167, 8325, 8405, 612,
+ 2167, 8325, 8405, 672,
+ 2167, 8325, 8405, 886,
+ 2167, 8325, 8405, 1106,
+ 2167, 8325, 8405, 1122,
+ 2167, 8325, 8405, 1124,
+ 2167, 8325, 8405, 1614,
+ 2167, 8325, 8405, 2214,
+ 2167, 8325, 8405, 2518,
+ 2167, 8325, 8405, 2680,
+ 2167, 8325, 9513, 2170,
+ 2167, 8325, 9513, 2670,
+ 2167, 8325, 9513, 4200,
+ 2167, 8325, 9513, 6784,
+ 2167, 9583, 5759, 0,
+ 2167, 9583, 5759, 16,
+ 2167, 9583, 5759, 40,
+ 2167, 9583, 5759, 100,
+ 2167, 9583, 5759, 116,
+ 2167, 9583, 5759, 138,
+ 2167, 9583, 5759, 144,
+ 2167, 9583, 5759, 152,
+ 2167, 9583, 5759, 196,
+ 2167, 9583, 5759, 216,
+ 2167, 9583, 5759, 230,
+ 2167, 9583, 5759, 236,
+ 2167, 9583, 5759, 292,
+ 2167, 9583, 5759, 296,
+ 2167, 9583, 5759, 306,
+ 2167, 9583, 5759, 326,
+ 2167, 9583, 5759, 332,
+ 2167, 9583, 5759, 364,
+ 2167, 9583, 5759, 374,
+ 2167, 9583, 5759, 384,
+ 2167, 9583, 5759, 392,
+ 2167, 9583, 5759, 416,
+ 2167, 9583, 5759, 462,
+ 2167, 9583, 5759, 510,
+ 2167, 9583, 5759, 520,
+ 2167, 9583, 5759, 524,
+ 2167, 9583, 5759, 556,
+ 2167, 9583, 5759, 576,
+ 2167, 9583, 5759, 610,
+ 2167, 9583, 5759, 614,
+ 2167, 9583, 5759, 638,
+ 2167, 9583, 5759, 652,
+ 2167, 9583, 5759, 670,
+ 2167, 9583, 5759, 2516,
+ 2167, 9583, 5759, 2566,
+ 2167, 9583, 5759, 2678,
+ 2167, 9583, 5759, 3700,
+ 2167, 9583, 5759, 9058,
+ 2167, 9583, 5759, 10790,
+ 2167, 9583, 5759, 11436,
+ 2167, 9583, 5759, 11926,
+ 2167, 9583, 5759, 12408,
+ 2167, 9583, 5759, 12410,
+ 2167, 9583, 5759, 12896,
+ 2167, 9583, 6129, 9178,
+ 2167, 9583, 8525, 2170,
+ 2167, 9583, 8525, 2670,
+ 2167, 9583, 8525, 2778,
+ 2167, 9583, 8525, 8876,
+ 2167, 9583, 8525, 9344,
+ 2171, 1045, 5387, 2779, 4113, 12132,
+ 2171, 1045, 8392,
+ 2209, 2671, 10625, 5758,
+ 2209, 5758,
+ 2209, 7171, 5758,
+ 2241, 11945, 11632,
+ 2511, 7172,
+ 2541, 9601, 6505, 5830,
+ 2541, 10425, 6505, 721, 7821, 10194,
+ 2586,
+ 2639, 1809, 4876,
+ 2639, 4223, 5836,
+ 2639, 4849, 6627, 9050,
+ 2639, 4849, 8745, 9050,
+ 2639, 4849, 12114,
+ 2639, 5445, 5758,
+ 2639, 6610,
+ 2639, 6616,
+ 2639, 6689, 2170,
+ 2639, 6689, 2540,
+ 2639, 6689, 2778,
+ 2639, 6689, 4200,
+ 2639, 6689, 4214,
+ 2639, 6689, 5190,
+ 2639, 6689, 6260,
+ 2639, 6689, 6722,
+ 2639, 6689, 7508,
+ 2639, 6689, 7694,
+ 2639, 6875, 7908,
+ 2639, 7089, 7593, 8405, 0,
+ 2639, 7089, 7593, 8405, 2,
+ 2639, 7089, 7593, 8405, 4,
+ 2639, 7089, 7593, 8405, 6,
+ 2639, 7089, 7593, 8405, 8,
+ 2639, 7089, 7593, 8405, 10,
+ 2639, 7089, 7593, 8405, 12,
+ 2639, 7089, 7593, 8405, 14,
+ 2639, 7089, 7593, 8405, 16,
+ 2639, 7089, 7593, 8405, 18,
+ 2639, 7089, 7593, 8405, 20,
+ 2639, 7089, 7593, 8405, 22,
+ 2639, 7089, 7593, 8405, 24,
+ 2639, 7089, 7593, 8405, 26,
+ 2639, 7089, 7593, 8405, 28,
+ 2639, 7089, 7593, 8405, 30,
+ 2639, 7089, 7593, 8405, 32,
+ 2639, 7089, 7593, 8405, 34,
+ 2639, 7089, 7593, 8405, 36,
+ 2639, 7089, 7593, 8405, 38,
+ 2639, 7089, 7593, 8405, 40,
+ 2639, 7089, 7593, 8405, 42,
+ 2639, 7089, 7593, 8405, 44,
+ 2639, 7089, 7593, 8405, 46,
+ 2639, 7089, 7593, 8405, 48,
+ 2639, 7089, 7593, 8405, 50,
+ 2639, 7089, 9063, 8405, 0,
+ 2639, 7089, 9063, 8405, 2,
+ 2639, 7089, 9063, 8405, 4,
+ 2639, 7089, 9063, 8405, 6,
+ 2639, 7089, 9063, 8405, 8,
+ 2639, 7089, 9063, 8405, 10,
+ 2639, 7089, 9063, 8405, 12,
+ 2639, 7089, 9063, 8405, 14,
+ 2639, 7089, 9063, 8405, 16,
+ 2639, 7089, 9063, 8405, 18,
+ 2639, 7089, 9063, 8405, 20,
+ 2639, 7089, 9063, 8405, 22,
+ 2639, 7089, 9063, 8405, 24,
+ 2639, 7089, 9063, 8405, 26,
+ 2639, 7089, 9063, 8405, 28,
+ 2639, 7089, 9063, 8405, 30,
+ 2639, 7089, 9063, 8405, 32,
+ 2639, 7089, 9063, 8405, 34,
+ 2639, 7089, 9063, 8405, 36,
+ 2639, 7089, 9063, 8405, 38,
+ 2639, 7089, 9063, 8405, 40,
+ 2639, 7089, 9063, 8405, 42,
+ 2639, 7089, 9063, 8405, 44,
+ 2639, 7089, 9063, 8405, 46,
+ 2639, 7089, 9063, 8405, 48,
+ 2639, 7089, 9063, 8405, 50,
+ 2639, 7443, 6627, 9050,
+ 2639, 7443, 8745, 9050,
+ 2639, 7443, 12114,
+ 2639, 7608,
+ 2639, 7708,
+ 2639, 8129, 5758,
+ 2639, 8167, 5758,
+ 2639, 8525, 5758,
+ 2639, 9581, 5758,
+ 2639, 9633, 9718,
+ 2639, 9718,
+ 2639, 9898,
+ 2639, 10469, 4926,
+ 2639, 10677, 4876,
+ 2639, 10708,
+ 2639, 11099, 5758,
+ 2639, 11195, 4926,
+ 2639, 11224,
+ 2639, 11424,
+ 2639, 11449, 7908,
+ 2639, 11451, 90,
+ 2639, 12017, 4926,
+ 2639, 12473, 5758,
+ 2639, 12478,
+ 2643, 337, 8405, 0,
+ 2643, 337, 8405, 8,
+ 2643, 337, 8405, 16,
+ 2643, 337, 8405, 28,
+ 2643, 337, 8405, 40,
+ 2643, 337, 8405, 72,
+ 2643, 337, 8405, 162,
+ 2643, 337, 8405, 166,
+ 2643, 337, 8405, 196,
+ 2643, 337, 8405, 236,
+ 2643, 337, 8405, 306,
+ 2643, 337, 8405, 332,
+ 2643, 337, 8405, 364,
+ 2643, 337, 8405, 392,
+ 2643, 337, 8405, 440,
+ 2643, 337, 8405, 462,
+ 2643, 337, 8405, 496,
+ 2643, 337, 8405, 524,
+ 2643, 337, 8405, 556,
+ 2643, 337, 8405, 590,
+ 2643, 337, 8405, 610,
+ 2643, 337, 8405, 638,
+ 2643, 337, 8405, 652,
+ 2643, 337, 8405, 738,
+ 2643, 337, 8405, 1612,
+ 2643, 337, 8405, 2030,
+ 2643, 337, 8405, 2212,
+ 2643, 337, 8405, 2678,
+ 2643, 337, 8405, 2732,
+ 2643, 337, 8405, 5978,
+ 2643, 337, 8405, 8834,
+ 2643, 337, 8405, 8836,
+ 2643, 337, 8405, 8838,
+ 2643, 337, 8405, 8840,
+ 2643, 337, 8405, 8842,
+ 2691, 5387, 10256,
+ 2725, 731, 10763, 6435, 6121, 7172,
+ 2725, 731, 12901, 6434,
+ 2725, 731, 12901, 6435, 6121, 5444,
+ 2725, 4389, 10260,
+ 2725, 4849, 3958,
+ 2725, 4849, 4389, 9050,
+ 2725, 4849, 8076,
+ 2725, 6627, 9050,
+ 2725, 7443, 3958,
+ 2725, 7443, 4389, 9050,
+ 2725, 7443, 8076,
+ 2725, 8745, 9050,
+ 2725, 10637, 7533, 9050,
+ 2725, 12114,
+ 2779, 1045, 8392,
+ 2779, 1045, 12132,
+ 2779, 4113, 5387, 2171, 1045, 12132,
+ 2779, 8329, 9734,
+ 2779, 9437, 445, 10374,
+ 2779, 9437, 721, 10374,
+ 2779, 10725, 8993, 11876,
+ 2779, 11913, 8167, 7570,
+ 2779, 12491, 9437, 444,
+ 2779, 12491, 9437, 720,
+ 2847, 4223, 5836,
+ 2847, 6616,
+ 2847, 6689, 2170,
+ 2847, 6689, 2540,
+ 2847, 6689, 2778,
+ 2847, 6689, 4200,
+ 2847, 6689, 4214,
+ 2847, 6689, 5190,
+ 2847, 6689, 6260,
+ 2847, 6689, 6722,
+ 2847, 6689, 7508,
+ 2847, 6689, 7694,
+ 2847, 8775, 1140,
+ 2847, 8775, 2052,
+ 2847, 8775, 2634,
+ 2847, 8775, 3708,
+ 2847, 8775, 3986,
+ 2847, 8775, 4100,
+ 2847, 8775, 4680,
+ 2847, 8775, 4784,
+ 2847, 8775, 5944,
+ 2847, 8775, 5966,
+ 2847, 8775, 6700,
+ 2847, 8775, 6776,
+ 2847, 8775, 7032,
+ 2847, 10469, 4926,
+ 2847, 10585, 0,
+ 2847, 10585, 8,
+ 2847, 10585, 16,
+ 2847, 10585, 28,
+ 2847, 10585, 40,
+ 2847, 10585, 80,
+ 2847, 10585, 100,
+ 2847, 10585, 102,
+ 2847, 10585, 106,
+ 2847, 10585, 108,
+ 2847, 10585, 112,
+ 2847, 10585, 116,
+ 2847, 10585, 122,
+ 2847, 10585, 126,
+ 2847, 10585, 130,
+ 2847, 10585, 132,
+ 2847, 10585, 138,
+ 2847, 10585, 142,
+ 2847, 10585, 144,
+ 2847, 10585, 150,
+ 2847, 10585, 152,
+ 2847, 10585, 162,
+ 2847, 10585, 176,
+ 2847, 10585, 196,
+ 2847, 10585, 198,
+ 2847, 10585, 202,
+ 2847, 10585, 208,
+ 2847, 10585, 210,
+ 2847, 10585, 216,
+ 2847, 10585, 220,
+ 2847, 10585, 224,
+ 2847, 10585, 228,
+ 2847, 10585, 230,
+ 2847, 10585, 236,
+ 2847, 10585, 238,
+ 2847, 10585, 242,
+ 2847, 10585, 246,
+ 2847, 10585, 250,
+ 2847, 10585, 274,
+ 2847, 10585, 292,
+ 2847, 10585, 294,
+ 2847, 10585, 296,
+ 2847, 10585, 298,
+ 2847, 10585, 300,
+ 2847, 10585, 306,
+ 2847, 10585, 310,
+ 2847, 10585, 314,
+ 2847, 10585, 322,
+ 2847, 10585, 326,
+ 2847, 10585, 332,
+ 2847, 10585, 336,
+ 2847, 10585, 340,
+ 2847, 10585, 350,
+ 2847, 10585, 354,
+ 2847, 10585, 364,
+ 2847, 10585, 368,
+ 2847, 10585, 374,
+ 2847, 10585, 380,
+ 2847, 10585, 384,
+ 2847, 10585, 392,
+ 2847, 10585, 396,
+ 2847, 10585, 400,
+ 2847, 10585, 404,
+ 2847, 10585, 412,
+ 2847, 10585, 416,
+ 2847, 10585, 438,
+ 2847, 10585, 440,
+ 2847, 10585, 462,
+ 2847, 10585, 468,
+ 2847, 10585, 476,
+ 2847, 10585, 480,
+ 2847, 10585, 486,
+ 2847, 10585, 510,
+ 2847, 10585, 512,
+ 2847, 10585, 514,
+ 2847, 10585, 516,
+ 2847, 10585, 520,
+ 2847, 10585, 524,
+ 2847, 10585, 526,
+ 2847, 10585, 532,
+ 2847, 10585, 536,
+ 2847, 10585, 546,
+ 2847, 10585, 556,
+ 2847, 10585, 560,
+ 2847, 10585, 564,
+ 2847, 10585, 568,
+ 2847, 10585, 576,
+ 2847, 10585, 596,
+ 2847, 10585, 610,
+ 2847, 10585, 612,
+ 2847, 10585, 614,
+ 2847, 10585, 616,
+ 2847, 10585, 618,
+ 2847, 10585, 622,
+ 2847, 10585, 626,
+ 2847, 10585, 630,
+ 2847, 10585, 632,
+ 2847, 10585, 634,
+ 2847, 10585, 652,
+ 2847, 10585, 654,
+ 2847, 10585, 656,
+ 2847, 10585, 660,
+ 2847, 10585, 664,
+ 2847, 10585, 670,
+ 2847, 10585, 672,
+ 2847, 10585, 676,
+ 2847, 10585, 678,
+ 2847, 10585, 680,
+ 2847, 10585, 778,
+ 2847, 10585, 792,
+ 2847, 10585, 794,
+ 2847, 10585, 796,
+ 2847, 10585, 798,
+ 2847, 10585, 800,
+ 2847, 10585, 818,
+ 2847, 10585, 876,
+ 2847, 10585, 914,
+ 2847, 10585, 984,
+ 2847, 10585, 996,
+ 2847, 10585, 998,
+ 2847, 10585, 1000,
+ 2847, 10585, 1002,
+ 2847, 10585, 1004,
+ 2847, 10585, 1040,
+ 2847, 10585, 1098,
+ 2847, 10585, 1150,
+ 2847, 10585, 1172,
+ 2847, 10585, 1228,
+ 2847, 10585, 1230,
+ 2847, 10585, 1232,
+ 2847, 10585, 1234,
+ 2847, 10585, 1236,
+ 2847, 10585, 1238,
+ 2847, 10585, 1240,
+ 2847, 10585, 1290,
+ 2847, 10585, 1346,
+ 2847, 10585, 1356,
+ 2847, 10585, 1362,
+ 2847, 10585, 1384,
+ 2847, 10585, 1422,
+ 2847, 10585, 1424,
+ 2847, 10585, 1436,
+ 2847, 10585, 1506,
+ 2847, 10585, 1542,
+ 2847, 10585, 1588,
+ 2847, 10585, 1598,
+ 2847, 10585, 1660,
+ 2847, 10585, 1668,
+ 2847, 10585, 1670,
+ 2847, 10585, 1672,
+ 2847, 10585, 1674,
+ 2847, 10585, 1676,
+ 2847, 10585, 1758,
+ 2847, 10585, 1802,
+ 2847, 10585, 1878,
+ 2847, 10585, 1880,
+ 2847, 10585, 1882,
+ 2847, 10585, 1884,
+ 2847, 10585, 1886,
+ 2847, 10585, 1890,
+ 2847, 10585, 1938,
+ 2847, 10585, 2006,
+ 2847, 10585, 2008,
+ 2847, 10585, 2010,
+ 2847, 10585, 2012,
+ 2847, 10585, 2014,
+ 2847, 10585, 2016,
+ 2847, 10585, 2062,
+ 2847, 10585, 2064,
+ 2847, 10585, 2066,
+ 2847, 10585, 2068,
+ 2847, 10585, 2070,
+ 2847, 10585, 2084,
+ 2847, 10585, 2126,
+ 2847, 10585, 2130,
+ 2847, 10585, 2132,
+ 2847, 10585, 2134,
+ 2847, 10585, 2136,
+ 2847, 10585, 2178,
+ 2847, 10585, 2204,
+ 2847, 10585, 2238,
+ 2847, 10585, 2402,
+ 2847, 10585, 2430,
+ 2847, 10585, 2504,
+ 2847, 10585, 2516,
+ 2847, 10585, 2518,
+ 2847, 10585, 2520,
+ 2847, 10585, 2522,
+ 2847, 10585, 2524,
+ 2847, 10585, 2554,
+ 2847, 10585, 2666,
+ 2847, 10585, 2678,
+ 2847, 10585, 2680,
+ 2847, 10585, 2682,
+ 2847, 10585, 2684,
+ 2847, 10585, 2686,
+ 2847, 10585, 2722,
+ 2847, 10585, 2856,
+ 2847, 10585, 2876,
+ 2847, 10585, 2910,
+ 2847, 10585, 2922,
+ 2847, 10585, 2924,
+ 2847, 10585, 2934,
+ 2847, 10585, 2940,
+ 2847, 10585, 2942,
+ 2847, 10585, 2948,
+ 2847, 10585, 3050,
+ 2847, 10585, 3082,
+ 2847, 10585, 3138,
+ 2847, 10585, 3146,
+ 2847, 10585, 3148,
+ 2847, 10585, 3150,
+ 2847, 10585, 3152,
+ 2847, 10585, 3154,
+ 2847, 10585, 3178,
+ 2847, 10585, 3778,
+ 2847, 10585, 3780,
+ 2847, 10585, 4068,
+ 2847, 10585, 4070,
+ 2847, 10585, 4072,
+ 2847, 10585, 4074,
+ 2847, 10585, 4076,
+ 2847, 10585, 4078,
+ 2847, 10585, 4080,
+ 2847, 10585, 4246,
+ 2847, 10585, 4248,
+ 2847, 10585, 4250,
+ 2847, 10585, 4252,
+ 2847, 10585, 4774,
+ 2847, 10585, 4776,
+ 2847, 10585, 4778,
+ 2847, 10585, 4780,
+ 2847, 10585, 4932,
+ 2847, 10585, 4934,
+ 2847, 10585, 4964,
+ 2847, 10585, 4966,
+ 2847, 10585, 4968,
+ 2847, 10585, 4970,
+ 2847, 10585, 4972,
+ 2847, 10585, 5100,
+ 2847, 10585, 5114,
+ 2847, 10585, 5136,
+ 2847, 10585, 5146,
+ 2847, 10585, 5152,
+ 2847, 10585, 5154,
+ 2847, 10585, 5156,
+ 2847, 10585, 5158,
+ 2847, 10585, 5160,
+ 2847, 10585, 5168,
+ 2847, 10585, 5194,
+ 2847, 10585, 5204,
+ 2847, 10585, 5296,
+ 2847, 10585, 5316,
+ 2847, 10585, 5678,
+ 2847, 10585, 5710,
+ 2847, 10585, 5914,
+ 2847, 10585, 5930,
+ 2847, 10585, 6108,
+ 2847, 10585, 6126,
+ 2847, 10585, 6274,
+ 2847, 10585, 6282,
+ 2847, 10585, 6682,
+ 2847, 10585, 6684,
+ 2847, 10585, 7152,
+ 2847, 10585, 7154,
+ 2847, 10585, 7223, 150,
+ 2847, 10585, 7223, 196,
+ 2847, 10585, 7223, 306,
+ 2847, 10585, 7223, 364,
+ 2847, 10585, 7223, 2554,
+ 2847, 10585, 7228,
+ 2847, 10585, 7230,
+ 2847, 10585, 7232,
+ 2847, 10585, 11674,
+ 2941, 5758,
+ 2972,
+ 3055, 5758,
+ 3071, 6178,
+ 3245, 8774,
+ 3264,
+ 3285, 8774,
+ 3769, 8774,
+ 3839, 2812,
+ 3849, 428,
+ 3871, 5758,
+ 3873, 5758,
+ 3879, 6689, 2170,
+ 3879, 6689, 2540,
+ 3879, 6689, 2778,
+ 3879, 6689, 4200,
+ 3879, 6689, 4214,
+ 3879, 6689, 5190,
+ 3879, 6689, 6260,
+ 3879, 6689, 6722,
+ 3879, 6689, 7508,
+ 3879, 6689, 7694,
+ 3879, 7803, 5759, 16,
+ 3879, 7803, 5759, 28,
+ 3879, 7803, 5759, 40,
+ 3879, 7803, 5759, 58,
+ 3879, 7803, 5759, 72,
+ 3879, 7803, 5759, 92,
+ 3879, 7803, 5759, 168,
+ 3879, 7803, 5759, 266,
+ 3879, 7803, 5759, 426,
+ 3879, 7803, 5759, 590,
+ 3879, 8405, 0,
+ 3879, 8405, 8,
+ 3879, 8405, 16,
+ 3879, 8405, 28,
+ 3879, 8405, 40,
+ 3879, 8405, 72,
+ 3879, 8405, 100,
+ 3879, 8405, 138,
+ 3879, 8405, 216,
+ 3879, 8405, 236,
+ 3879, 8405, 292,
+ 3879, 8405, 306,
+ 3879, 8405, 332,
+ 3879, 8405, 364,
+ 3879, 8405, 392,
+ 3879, 8405, 462,
+ 3879, 8405, 510,
+ 3879, 8405, 524,
+ 3879, 8405, 556,
+ 3879, 8405, 610,
+ 3879, 8405, 652,
+ 3879, 8405, 766,
+ 3879, 8405, 792,
+ 3879, 8405, 884,
+ 3879, 8405, 974,
+ 3879, 8405, 996,
+ 3879, 8405, 1260,
+ 3879, 8405, 1512,
+ 3879, 8405, 1612,
+ 3879, 8405, 1948,
+ 3879, 8405, 2030,
+ 3879, 8405, 2042,
+ 3879, 8405, 2106,
+ 3879, 8405, 2212,
+ 3879, 8405, 2246,
+ 3879, 8405, 2566,
+ 3879, 8405, 2678,
+ 3879, 8405, 3902,
+ 3879, 8405, 5178,
+ 3879, 8405, 5182,
+ 3879, 8405, 5184,
+ 3879, 8405, 6789, 12,
+ 3879, 8405, 6789, 20,
+ 3879, 8405, 6789, 22,
+ 3879, 8405, 6789, 26,
+ 3879, 8405, 6789, 30,
+ 3879, 8405, 6789, 34,
+ 3879, 8405, 6789, 38,
+ 3879, 8405, 6789, 48,
+ 3879, 8405, 6789, 124,
+ 3879, 8405, 6789, 400,
+ 3879, 8405, 6789, 542,
+ 3879, 10775, 5759, 332,
+ 3879, 10775, 5759, 510,
+ 3879, 10775, 5759, 622,
+ 3879, 10775, 5759, 652,
+ 3879, 10775, 5759, 6789, 14,
+ 3879, 10775, 5759, 6789, 24,
+ 3879, 10775, 5759, 6789, 400,
+ 3879, 12133, 6646,
+ 3879, 12133, 8153, 6646,
+ 3879, 12133, 8732,
+ 3879, 12133, 8849, 6646,
+ 3961, 5566,
+ 3989, 7512,
+ 4103, 2091, 6798,
+ 4103, 2091, 7396,
+ 4103, 2091, 8122,
+ 4103, 2091, 8123, 6121, 10489, 10355, 7580,
+ 4103, 2091, 9113, 89, 8466,
+ 4103, 2091, 9113, 89, 8521, 10572,
+ 4103, 2091, 9113, 89, 8521, 10573, 445, 6740,
+ 4103, 2091, 9604,
+ 4103, 2091, 9605, 445, 6740,
+ 4103, 2091, 9750,
+ 4103, 2091, 9751, 445, 6740,
+ 4107, 5758,
+ 4117, 4197, 5878,
+ 4117, 5876,
+ 4117, 5877, 6121, 8057, 6490,
+ 4117, 7443, 10001, 10154,
+ 4117, 10716,
+ 4153, 8781, 6622,
+ 4171, 5758,
+ 4201, 1045, 4926,
+ 4201, 1045, 12132,
+ 4215, 1045, 4926,
+ 4215, 1045, 12132,
+ 4215, 11907, 9898,
+ 4215, 13047, 9898,
+ 4215, 13233, 9898,
+ 4223, 5836,
+ 4223, 6510,
+ 4223, 7327, 4676,
+ 4228,
+ 4260,
+ 4269, 4926,
+ 4387, 7608,
+ 4401, 8774,
+ 4423, 9831, 5758,
+ 4676,
+ 4686,
+ 4837, 9615, 5012,
+ 4849, 721, 7443, 5876,
+ 4849, 721, 7443, 8153, 11378,
+ 4849, 731, 11099, 9050,
+ 4849, 1809, 11715, 9050,
+ 4849, 2171, 8159, 6510,
+ 4849, 2171, 9615, 6510,
+ 4849, 3713, 601, 7443, 3713, 601, 9326,
+ 4849, 3713, 601, 7443, 3713, 4117, 9326,
+ 4849, 3713, 4117, 7443, 3713, 601, 9326,
+ 4849, 3713, 4117, 7443, 3713, 4117, 9326,
+ 4849, 4197, 5878,
+ 4849, 4201, 9259, 6510,
+ 4849, 4389, 6505, 8056,
+ 4849, 4389, 6510,
+ 4849, 5876,
+ 4849, 6409, 9050,
+ 4849, 6409, 9051, 6121, 1044,
+ 4849, 6435, 6121, 7593, 8056,
+ 4849, 6435, 6121, 9095, 5444,
+ 4849, 6505, 10637, 7533, 9050,
+ 4849, 6505, 11677, 9050,
+ 4849, 6627, 9050,
+ 4849, 6627, 9051, 7121, 4530,
+ 4849, 6627, 9051, 7773, 4530,
+ 4849, 6627, 9051, 8473, 7370,
+ 4849, 6792,
+ 4849, 7327, 4676,
+ 4849, 7443, 6105, 6434,
+ 4849, 7443, 6434,
+ 4849, 7443, 6435, 6121, 8153, 10677, 8758,
+ 4849, 7443, 6435, 6121, 8758,
+ 4849, 7443, 6435, 6121, 10677, 8758,
+ 4849, 7443, 6435, 9785, 7593, 8056,
+ 4849, 7443, 6505, 6434,
+ 4849, 7443, 7821, 6434,
+ 4849, 7443, 8153, 6434,
+ 4849, 7443, 8153, 6435, 6121, 8758,
+ 4849, 7443, 8153, 6435, 6121, 10677, 8758,
+ 4849, 7443, 12103, 6434,
+ 4849, 7509, 9259, 6510,
+ 4849, 7695, 9259, 6510,
+ 4849, 7695, 10467, 6510,
+ 4849, 7821, 6627, 9050,
+ 4849, 7821, 8077, 9050,
+ 4849, 7821, 8745, 9050,
+ 4849, 7821, 10637, 7533, 9050,
+ 4849, 7821, 11677, 9050,
+ 4849, 7821, 12114,
+ 4849, 8077, 9050,
+ 4849, 8151, 12877, 9050,
+ 4849, 8153, 6409, 9050,
+ 4849, 8153, 8933, 6778,
+ 4849, 8153, 11195, 4926,
+ 4849, 8153, 12114,
+ 4849, 8521, 8191, 11793, 9610,
+ 4849, 8631, 10371, 9050,
+ 4849, 8717, 11195, 4926,
+ 4849, 8745, 9050,
+ 4849, 8745, 9051, 6121, 5935, 275, 2725, 8076,
+ 4849, 8745, 9051, 6121, 5935, 275, 8005, 8076,
+ 4849, 8745, 9051, 6121, 7412,
+ 4849, 8745, 9051, 6121, 10666,
+ 4849, 8745, 9051, 7121, 8076,
+ 4849, 8745, 9051, 7773, 8076,
+ 4849, 8745, 9051, 10982,
+ 4849, 8933, 6778,
+ 4849, 9074,
+ 4849, 10346,
+ 4849, 10493, 753, 10794,
+ 4849, 10523, 41, 9050,
+ 4849, 10637, 7533, 9050,
+ 4849, 10643, 7991, 10677, 760,
+ 4849, 10677, 761, 6121, 7412,
+ 4849, 10677, 827, 4876,
+ 4849, 11793, 9610,
+ 4849, 12114,
+ 4849, 12115, 7121, 4530,
+ 4849, 12115, 7773, 4530,
+ 4849, 12115, 10982,
+ 4849, 12877, 9050,
+ 4849, 13029, 9050,
+ 4877, 11228,
+ 4877, 12057, 2091, 11049, 2681, 5446,
+ 4877, 12057, 6121, 12139, 5403, 7939, 5446,
+ 4877, 12057, 6121, 12857, 5403, 7939, 5446,
+ 4883, 5758,
+ 4895, 3993, 4221, 4849, 8467, 429, 8153, 10676,
+ 4895, 4849, 5876,
+ 4895, 4849, 7443, 6434,
+ 4895, 4849, 7443, 8153, 6434,
+ 4895, 7443, 5876,
+ 4895, 10016,
+ 4895, 11097, 6434,
+ 4895, 11097, 6435, 4221, 760,
+ 4895, 11097, 8153, 6434,
+ 4895, 11097, 8153, 6435, 4221, 760,
+ 4895, 11097, 10531, 6434,
+ 4895, 11765, 6434,
+ 4895, 11765, 6435, 4221, 760,
+ 4895, 11765, 8153, 6434,
+ 4895, 11765, 8153, 6435, 4221, 760,
+ 4895, 11765, 10531, 6434,
+ 4923, 721, 8197, 5758,
+ 4923, 5758,
+ 4923, 6121, 8759, 721, 4923, 721, 8197, 5758,
+ 4923, 6121, 8759, 5758,
+ 4931, 4926,
+ 5003, 5758,
+ 5006,
+ 5017, 11098,
+ 5017, 12472,
+ 5050,
+ 5131, 5392,
+ 5385, 826,
+ 5385, 8037, 6505, 5830,
+ 5385, 8037, 6622,
+ 5385, 8037, 9898,
+ 5385, 8037, 13233, 9898,
+ 5385, 8762,
+ 5385, 10578,
+ 5395, 8008,
+ 5401, 11891, 4926,
+ 5409, 5758,
+ 5445, 5758,
+ 5445, 5759, 275, 4849, 4389, 8056,
+ 5445, 5759, 275, 7443, 4389, 8056,
+ 5445, 5759, 275, 10642,
+ 5445, 5759, 6121, 1045, 6490,
+ 5445, 5759, 6121, 6505, 10642,
+ 5445, 5759, 6121, 7593, 8057, 6376,
+ 5445, 5759, 6121, 7709, 6376,
+ 5445, 5759, 6121, 7709, 6490,
+ 5445, 5759, 6121, 11261, 2778,
+ 5445, 5759, 6121, 11449, 7909, 6376,
+ 5445, 5759, 6377, 8167, 5758,
+ 5545, 5758,
+ 5551, 275, 6741, 568,
+ 5551, 6376,
+ 5551, 6741, 568,
+ 5551, 7382,
+ 5551, 10374,
+ 5769, 6104,
+ 5781, 8306,
+ 5831, 429, 6656,
+ 5831, 721, 9964,
+ 5831, 8166,
+ 5831, 10374,
+ 5887, 6704,
+ 5909, 6689, 2170,
+ 5909, 6689, 2540,
+ 5909, 6689, 2778,
+ 5909, 6689, 4200,
+ 5909, 6689, 4214,
+ 5909, 6689, 5190,
+ 5909, 6689, 6260,
+ 5909, 6689, 6722,
+ 5909, 6689, 7508,
+ 5909, 6689, 7694,
+ 5909, 9971, 8775, 3702,
+ 5909, 10759, 29, 722,
+ 5909, 10759, 109, 7968,
+ 5909, 10759, 151, 988,
+ 5909, 10759, 151, 6562,
+ 5909, 10759, 209, 196,
+ 5909, 10759, 209, 1142,
+ 5909, 10759, 247, 1386,
+ 5909, 10759, 247, 8518,
+ 5909, 10759, 323, 1582,
+ 5909, 10759, 351, 4878,
+ 5909, 10759, 351, 6582,
+ 5909, 10759, 354,
+ 5909, 10759, 381, 364,
+ 5909, 10759, 413, 416,
+ 5909, 10759, 413, 2018,
+ 5909, 10759, 481, 2234,
+ 5909, 10759, 517, 2448,
+ 5909, 10759, 520,
+ 5909, 10759, 537, 536,
+ 5909, 10759, 537, 2580,
+ 5909, 10759, 537, 5614,
+ 5909, 10759, 537, 5630,
+ 5909, 10759, 569, 2650,
+ 5909, 10759, 569, 7344,
+ 5909, 10759, 633, 6098,
+ 5909, 10759, 661, 3022,
+ 5909, 10759, 661, 6212,
+ 5909, 10759, 891, 3880,
+ 5909, 10759, 891, 3908,
+ 5909, 10759, 891, 6566,
+ 5909, 10759, 891, 6576,
+ 5909, 10759, 1619, 4738,
+ 5909, 10759, 1619, 4750,
+ 5909, 10759, 1619, 7050,
+ 5909, 10759, 1619, 7052,
+ 5909, 10759, 1619, 9618,
+ 5909, 10759, 1859, 170,
+ 5909, 10759, 1859, 2684,
+ 5909, 10759, 1859, 2730,
+ 5909, 10759, 1859, 9938,
+ 5909, 10759, 1859, 10228,
+ 5909, 10759, 2039, 2040,
+ 5909, 10759, 2219, 5412,
+ 5909, 10759, 2219, 7366,
+ 5909, 10759, 2219, 9652,
+ 5909, 10759, 2685, 5912,
+ 5909, 10759, 2685, 7690,
+ 5909, 10759, 2685, 7696,
+ 5909, 10759, 2685, 8812,
+ 5909, 10759, 2685, 9592,
+ 5909, 10759, 2685, 11694,
+ 5909, 10759, 5637, 0,
+ 5909, 10759, 5637, 8,
+ 5909, 10759, 5637, 16,
+ 5909, 10759, 5637, 28,
+ 5909, 10759, 5637, 40,
+ 5909, 10759, 5637, 58,
+ 5909, 10759, 5637, 66,
+ 5909, 10759, 5637, 73, 9446,
+ 5909, 10759, 5637, 73, 10312,
+ 5909, 10759, 5637, 78,
+ 5909, 10759, 5637, 266,
+ 5909, 10759, 5637, 590,
+ 5909, 10759, 5637, 606,
+ 5909, 10759, 5637, 2804,
+ 5909, 10759, 8358,
+ 5909, 10759, 9290,
+ 5909, 10759, 9590,
+ 5909, 10759, 10314,
+ 5909, 10759, 10358,
+ 5909, 10759, 10684,
+ 5909, 10759, 11108,
+ 5909, 10759, 11152,
+ 5909, 10759, 11412,
+ 5909, 10759, 12072,
+ 5909, 10759, 12362,
+ 5927, 7608,
+ 5946,
+ 5972,
+ 6051, 8774,
+ 6081, 5017, 11098,
+ 6081, 5017, 12472,
+ 6105, 3992,
+ 6105, 6435, 10441, 10015, 4848,
+ 6105, 6435, 10441, 10015, 7442,
+ 6107, 1809, 4876,
+ 6107, 3992,
+ 6107, 4876,
+ 6107, 10388,
+ 6113, 8781, 6622,
+ 6129, 8330,
+ 6261, 7825, 7608,
+ 6261, 7825, 8330,
+ 6261, 7825, 10363, 7608,
+ 6261, 7825, 11698,
+ 6379, 6408,
+ 6379, 7908,
+ 6408,
+ 6409, 6121, 37, 8318,
+ 6409, 6121, 10666,
+ 6428,
+ 6435, 10441, 10959, 5919, 9131, 11096,
+ 6435, 10441, 10959, 5919, 9131, 11764,
+ 6435, 10441, 11765, 5919, 9131, 9810,
+ 6435, 10441, 11765, 5919, 9131, 10958,
+ 6505, 2048,
+ 6505, 2587, 6121, 5528,
+ 6505, 3949, 5842,
+ 6505, 4202,
+ 6505, 4215, 9601, 5830,
+ 6505, 4849, 10441, 6992,
+ 6505, 5013, 8406,
+ 6505, 5830,
+ 6505, 6081, 7593, 8744,
+ 6505, 6571, 4760,
+ 6505, 6571, 5404,
+ 6505, 6571, 5564,
+ 6505, 6571, 7410,
+ 6505, 6571, 7996,
+ 6505, 6571, 8368,
+ 6505, 6907, 5842,
+ 6505, 7085, 8056,
+ 6505, 7085, 8744,
+ 6505, 7121, 4849, 10642,
+ 6505, 7121, 7443, 10642,
+ 6505, 7443, 10441, 6992,
+ 6505, 7547, 7370,
+ 6505, 7593, 5830,
+ 6505, 7593, 8744,
+ 6505, 7593, 9158,
+ 6505, 7593, 9438,
+ 6505, 7611, 5842,
+ 6505, 7773, 4849, 10642,
+ 6505, 7773, 7443, 10642,
+ 6505, 8006,
+ 6505, 8037, 7821, 5830,
+ 6505, 8056,
+ 6505, 8057, 6121, 2779, 7821, 4112,
+ 6505, 8057, 6121, 4117, 6434,
+ 6505, 8057, 6121, 7821, 1045, 7442,
+ 6505, 8463, 7593, 8744,
+ 6505, 8463, 8744,
+ 6505, 8463, 9158,
+ 6505, 8463, 9438,
+ 6505, 8744,
+ 6505, 9158,
+ 6505, 9159, 5842,
+ 6505, 9159, 6121, 4117, 6434,
+ 6505, 9159, 7173, 7821, 46,
+ 6505, 9338,
+ 6505, 9438,
+ 6505, 9711, 4178,
+ 6505, 10143, 1860,
+ 6505, 10143, 4760,
+ 6505, 10194,
+ 6505, 10420,
+ 6505, 10502,
+ 6505, 10677, 9264,
+ 6505, 10677, 11202,
+ 6505, 11036,
+ 6505, 11097, 8022,
+ 6505, 11202,
+ 6505, 11354,
+ 6505, 11387, 11205, 8774,
+ 6505, 11649, 9264,
+ 6505, 11765, 6434,
+ 6505, 11765, 8022,
+ 6505, 11765, 10716,
+ 6505, 12383, 7593, 10642,
+ 6505, 12383, 10642,
+ 6505, 12931, 7593, 10642,
+ 6505, 12931, 10642,
+ 6505, 12967, 7593, 10642,
+ 6505, 12967, 9602,
+ 6505, 12967, 10642,
+ 6505, 12984,
+ 6505, 13067, 7593, 10642,
+ 6505, 13067, 9602,
+ 6505, 13067, 10420,
+ 6505, 13067, 10642,
+ 6509, 8774,
+ 6516,
+ 6531, 7803, 5759, 16,
+ 6531, 7803, 5759, 40,
+ 6531, 8405, 0,
+ 6531, 8405, 16,
+ 6531, 8405, 40,
+ 6531, 8405, 100,
+ 6531, 8405, 138,
+ 6531, 8405, 216,
+ 6531, 8405, 236,
+ 6531, 8405, 306,
+ 6531, 8405, 332,
+ 6531, 8405, 364,
+ 6531, 8405, 392,
+ 6531, 8405, 462,
+ 6531, 8405, 510,
+ 6531, 8405, 524,
+ 6531, 8405, 556,
+ 6531, 8405, 622,
+ 6531, 8405, 652,
+ 6531, 8405, 2030,
+ 6542,
+ 6543, 11061, 7382,
+ 6546,
+ 6560,
+ 6569, 4926,
+ 6597, 8677, 8774,
+ 6603, 600,
+ 6606,
+ 6610,
+ 6611, 5758,
+ 6611, 8166,
+ 6614,
+ 6616,
+ 6623, 429, 10308,
+ 6623, 429, 11068,
+ 6627, 9051, 10982,
+ 6627, 9437, 444,
+ 6627, 9437, 720,
+ 6643, 8774,
+ 6675, 6741, 568,
+ 6689, 2170,
+ 6689, 2171, 4223, 5836,
+ 6689, 2540,
+ 6689, 2541, 4223, 5836,
+ 6689, 2778,
+ 6689, 2779, 4223, 5836,
+ 6689, 4200,
+ 6689, 4201, 4223, 5836,
+ 6689, 4214,
+ 6689, 4215, 4223, 5836,
+ 6689, 5190,
+ 6689, 5191, 4223, 5836,
+ 6689, 6260,
+ 6689, 6722,
+ 6689, 6723, 4223, 5836,
+ 6689, 7508,
+ 6689, 7509, 4223, 5836,
+ 6689, 7694,
+ 6689, 7695, 4223, 5836,
+ 6695, 4926,
+ 6716,
+ 6717, 8272,
+ 6723, 8737, 9898,
+ 6723, 9601, 6505, 5830,
+ 6723, 9601, 10433, 5830,
+ 6723, 9601, 12141, 6505, 5830,
+ 6723, 10425, 10385, 6505, 10194,
+ 6723, 13233, 11187, 9898,
+ 6725, 8774,
+ 6731, 2510,
+ 6731, 2511, 6121, 4849, 6435, 6376,
+ 6731, 2511, 6121, 7443, 6435, 6376,
+ 6731, 2511, 6121, 7593, 8057, 6376,
+ 6731, 2511, 6121, 9546,
+ 6735, 8774,
+ 6741, 569, 115, 11472,
+ 6741, 569, 445, 10452,
+ 6741, 569, 445, 10574,
+ 6741, 569, 445, 11098,
+ 6741, 569, 445, 12472,
+ 6741, 721, 10411, 568,
+ 6745, 569, 2681, 4848,
+ 6745, 569, 2681, 7442,
+ 6763, 9956,
+ 6771, 8774,
+ 6791, 9615, 5012,
+ 6812,
+ 6857, 8774,
+ 6875, 7908,
+ 6879, 477, 8774,
+ 6879, 727, 8798,
+ 6879, 1583, 8774,
+ 6879, 2171, 4389, 5758,
+ 6879, 2171, 4389, 5759, 10707, 4212,
+ 6879, 2217, 8774,
+ 6879, 2413, 6121, 8759, 8774,
+ 6879, 2413, 8774,
+ 6879, 2779, 7307, 5758,
+ 6879, 2779, 8819, 5758,
+ 6879, 3775, 8774,
+ 6879, 4201, 7307, 5758,
+ 6879, 4215, 7307, 5758,
+ 6879, 5375, 5758,
+ 6879, 5388,
+ 6879, 6197, 5758,
+ 6879, 6261, 5758,
+ 6879, 6654,
+ 6879, 6655, 721, 5388,
+ 6879, 6655, 721, 7782,
+ 6879, 6655, 721, 12120,
+ 6879, 7023, 8774,
+ 6879, 7111, 5758,
+ 6879, 7121, 9513, 5758,
+ 6879, 7398,
+ 6879, 7399, 721, 5388,
+ 6879, 7399, 721, 7782,
+ 6879, 7399, 721, 12120,
+ 6879, 7593, 8151, 8427, 7569, 8774,
+ 6879, 7593, 8405, 384,
+ 6879, 7593, 8405, 416,
+ 6879, 7593, 8405, 476,
+ 6879, 7593, 8405, 644,
+ 6879, 7593, 8405, 888,
+ 6879, 7593, 8405, 1128,
+ 6879, 7593, 8405, 1129, 6121, 5388,
+ 6879, 7593, 8405, 1129, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6654,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7398,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 7724,
+ 6879, 7593, 8405, 1129, 6121, 7782,
+ 6879, 7593, 8405, 1129, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 12120,
+ 6879, 7593, 8405, 1129, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 1129, 6121, 13036,
+ 6879, 7593, 8405, 2216,
+ 6879, 7593, 8405, 2250,
+ 6879, 7593, 8405, 2412,
+ 6879, 7593, 8405, 2413, 6121, 6654,
+ 6879, 7593, 8405, 2413, 6121, 7398,
+ 6879, 7593, 8405, 2490,
+ 6879, 7593, 8405, 2522,
+ 6879, 7593, 8405, 2658,
+ 6879, 7593, 8405, 3774,
+ 6879, 7593, 8405, 4408,
+ 6879, 7593, 8405, 4614,
+ 6879, 7593, 8405, 4615, 6121, 5388,
+ 6879, 7593, 8405, 4615, 6121, 6654,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 7398,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 7724,
+ 6879, 7593, 8405, 4615, 6121, 7782,
+ 6879, 7593, 8405, 4615, 6121, 8432,
+ 6879, 7593, 8405, 4615, 6121, 8924,
+ 6879, 7593, 8405, 4615, 6121, 10808,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 5388,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 7724,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 7782,
+ 6879, 7593, 8405, 4615, 6121, 10809, 721, 12120,
+ 6879, 7593, 8405, 4615, 6121, 12120,
+ 6879, 7593, 8405, 6262,
+ 6879, 7593, 8405, 6406,
+ 6879, 7593, 8405, 6407, 6121, 5388,
+ 6879, 7593, 8405, 6407, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6654,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7398,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 7724,
+ 6879, 7593, 8405, 6407, 6121, 7782,
+ 6879, 7593, 8405, 6407, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 8432,
+ 6879, 7593, 8405, 6407, 6121, 8924,
+ 6879, 7593, 8405, 6407, 6121, 12120,
+ 6879, 7593, 8405, 6407, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 6407, 6121, 13036,
+ 6879, 7593, 8405, 6674,
+ 6879, 7593, 8405, 6789, 7568,
+ 6879, 7593, 8405, 6824,
+ 6879, 7593, 8405, 7022,
+ 6879, 7593, 8405, 7062,
+ 6879, 7593, 8405, 7080,
+ 6879, 7593, 8405, 7316,
+ 6879, 7593, 8405, 7317, 6121, 5388,
+ 6879, 7593, 8405, 7317, 6121, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6654,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 6655, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7398,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 5389, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7399, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 7724,
+ 6879, 7593, 8405, 7317, 6121, 7782,
+ 6879, 7593, 8405, 7317, 6121, 7783, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 12120,
+ 6879, 7593, 8405, 7317, 6121, 12121, 721, 13036,
+ 6879, 7593, 8405, 7317, 6121, 13036,
+ 6879, 7593, 8405, 7484,
+ 6879, 7593, 8405, 7568,
+ 6879, 7593, 8405, 7682,
+ 6879, 7593, 8405, 8748,
+ 6879, 7593, 8405, 9007, 7062,
+ 6879, 7593, 8405, 9007, 7484,
+ 6879, 7593, 8405, 9162,
+ 6879, 7593, 8405, 9270,
+ 6879, 7593, 8405, 9271, 6121, 5388,
+ 6879, 7593, 8405, 9271, 6121, 6654,
+ 6879, 7593, 8405, 9271, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9271, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9271, 6121, 7398,
+ 6879, 7593, 8405, 9271, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9271, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9271, 6121, 7724,
+ 6879, 7593, 8405, 9271, 6121, 7782,
+ 6879, 7593, 8405, 9530,
+ 6879, 7593, 8405, 9531, 6121, 5388,
+ 6879, 7593, 8405, 9531, 6121, 6654,
+ 6879, 7593, 8405, 9531, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9531, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9531, 6121, 7398,
+ 6879, 7593, 8405, 9531, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9531, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9531, 6121, 7724,
+ 6879, 7593, 8405, 9531, 6121, 7782,
+ 6879, 7593, 8405, 9808,
+ 6879, 7593, 8405, 9809, 6121, 5388,
+ 6879, 7593, 8405, 9809, 6121, 6654,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 6655, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 7398,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 7399, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 7724,
+ 6879, 7593, 8405, 9809, 6121, 7782,
+ 6879, 7593, 8405, 9809, 6121, 8432,
+ 6879, 7593, 8405, 9809, 6121, 8924,
+ 6879, 7593, 8405, 9809, 6121, 10808,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 5388,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 7724,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 7782,
+ 6879, 7593, 8405, 9809, 6121, 10809, 721, 12120,
+ 6879, 7593, 8405, 9809, 6121, 12120,
+ 6879, 7593, 8405, 11709, 9162,
+ 6879, 7593, 10489, 8151, 8427, 7569, 8774,
+ 6879, 7593, 10489, 8427, 7569, 8774,
+ 6879, 7683, 8774,
+ 6879, 7695, 7307, 5758,
+ 6879, 7695, 10467, 5758,
+ 6879, 7724,
+ 6879, 7782,
+ 6879, 7801, 10365, 10586,
+ 6879, 7801, 10365, 10588,
+ 6879, 7801, 10365, 10590,
+ 6879, 7801, 10365, 10592,
+ 6879, 7801, 10365, 10594,
+ 6879, 7801, 10365, 10596,
+ 6879, 7801, 10365, 10598,
+ 6879, 7801, 10365, 10600,
+ 6879, 7801, 10365, 10602,
+ 6879, 7801, 10365, 11270,
+ 6879, 7801, 10365, 11272,
+ 6879, 7801, 10365, 11274,
+ 6879, 7801, 10365, 11276,
+ 6879, 7801, 10365, 11278,
+ 6879, 7801, 10365, 11280,
+ 6879, 7801, 10365, 11282,
+ 6879, 7801, 10365, 11284,
+ 6879, 7801, 10365, 11286,
+ 6879, 7801, 10365, 11288,
+ 6879, 7801, 10365, 11290,
+ 6879, 7801, 10365, 11292,
+ 6879, 7801, 10365, 11294,
+ 6879, 7801, 10365, 11296,
+ 6879, 7801, 10365, 11298,
+ 6879, 7801, 10365, 11334,
+ 6879, 7801, 10365, 11336,
+ 6879, 7801, 10365, 11338,
+ 6879, 7801, 10365, 11340,
+ 6879, 7801, 10365, 11342,
+ 6879, 7941, 5758,
+ 6879, 7949, 5758,
+ 6879, 8269, 5758,
+ 6879, 8405, 3086,
+ 6879, 8405, 7062,
+ 6879, 8405, 7484,
+ 6879, 8405, 7593, 9063, 476,
+ 6879, 8405, 7593, 9063, 2250,
+ 6879, 8405, 7593, 9063, 2412,
+ 6879, 8405, 7593, 9063, 6824,
+ 6879, 8405, 7593, 9063, 7080,
+ 6879, 8405, 8748,
+ 6879, 8405, 9007, 7062,
+ 6879, 8405, 9162,
+ 6879, 8427, 7569, 8774,
+ 6879, 8427, 9271, 8774,
+ 6879, 8555, 5758,
+ 6879, 8787, 5758,
+ 6879, 8941, 5758,
+ 6879, 9063, 1583, 8774,
+ 6879, 9063, 7683, 8774,
+ 6879, 9063, 8151, 8427, 7569, 8774,
+ 6879, 9063, 8405, 384,
+ 6879, 9063, 8405, 416,
+ 6879, 9063, 8405, 476,
+ 6879, 9063, 8405, 644,
+ 6879, 9063, 8405, 888,
+ 6879, 9063, 8405, 1128,
+ 6879, 9063, 8405, 1129, 6121, 5388,
+ 6879, 9063, 8405, 1129, 6121, 6654,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7398,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 1129, 6121, 7724,
+ 6879, 9063, 8405, 1129, 6121, 7782,
+ 6879, 9063, 8405, 1129, 6121, 13064,
+ 6879, 9063, 8405, 2216,
+ 6879, 9063, 8405, 2250,
+ 6879, 9063, 8405, 2412,
+ 6879, 9063, 8405, 2413, 6121, 6654,
+ 6879, 9063, 8405, 2490,
+ 6879, 9063, 8405, 2522,
+ 6879, 9063, 8405, 2658,
+ 6879, 9063, 8405, 3774,
+ 6879, 9063, 8405, 4408,
+ 6879, 9063, 8405, 4614,
+ 6879, 9063, 8405, 4615, 6121, 5388,
+ 6879, 9063, 8405, 4615, 6121, 6654,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 4615, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 4615, 6121, 7398,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 4615, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 4615, 6121, 7724,
+ 6879, 9063, 8405, 4615, 6121, 7782,
+ 6879, 9063, 8405, 4615, 6121, 8432,
+ 6879, 9063, 8405, 4615, 6121, 8924,
+ 6879, 9063, 8405, 4615, 6121, 10808,
+ 6879, 9063, 8405, 6262,
+ 6879, 9063, 8405, 6406,
+ 6879, 9063, 8405, 6407, 6121, 5388,
+ 6879, 9063, 8405, 6407, 6121, 6654,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7398,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 6407, 6121, 7724,
+ 6879, 9063, 8405, 6407, 6121, 7782,
+ 6879, 9063, 8405, 6407, 6121, 8432,
+ 6879, 9063, 8405, 6407, 6121, 8924,
+ 6879, 9063, 8405, 6407, 6121, 13064,
+ 6879, 9063, 8405, 6674,
+ 6879, 9063, 8405, 6824,
+ 6879, 9063, 8405, 7022,
+ 6879, 9063, 8405, 7080,
+ 6879, 9063, 8405, 7316,
+ 6879, 9063, 8405, 7317, 6121, 5388,
+ 6879, 9063, 8405, 7317, 6121, 6654,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 6655, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7398,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 5389, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 7783, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 12120,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 12121, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7399, 721, 13064,
+ 6879, 9063, 8405, 7317, 6121, 7724,
+ 6879, 9063, 8405, 7317, 6121, 7782,
+ 6879, 9063, 8405, 7317, 6121, 13064,
+ 6879, 9063, 8405, 7568,
+ 6879, 9063, 8405, 7682,
+ 6879, 9063, 8405, 9007, 7484,
+ 6879, 9063, 8405, 9270,
+ 6879, 9063, 8405, 9271, 6121, 5388,
+ 6879, 9063, 8405, 9271, 6121, 6654,
+ 6879, 9063, 8405, 9271, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9271, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9271, 6121, 7398,
+ 6879, 9063, 8405, 9271, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 9271, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 9271, 6121, 7724,
+ 6879, 9063, 8405, 9271, 6121, 7782,
+ 6879, 9063, 8405, 9530,
+ 6879, 9063, 8405, 9531, 6121, 5388,
+ 6879, 9063, 8405, 9531, 6121, 6654,
+ 6879, 9063, 8405, 9531, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9531, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9531, 6121, 7398,
+ 6879, 9063, 8405, 9531, 6121, 7399, 721, 5388,
+ 6879, 9063, 8405, 9531, 6121, 7399, 721, 7782,
+ 6879, 9063, 8405, 9531, 6121, 7724,
+ 6879, 9063, 8405, 9531, 6121, 7782,
+ 6879, 9063, 8405, 9808,
+ 6879, 9063, 8405, 9809, 6121, 5388,
+ 6879, 9063, 8405, 9809, 6121, 6654,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 5388,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 7782,
+ 6879, 9063, 8405, 9809, 6121, 6655, 721, 12120,
+ 6879, 9063, 8405, 9809, 6121, 7724,
+ 6879, 9063, 8405, 9809, 6121, 7782,
+ 6879, 9063, 8405, 9809, 6121, 8432,
+ 6879, 9063, 8405, 9809, 6121, 8924,
+ 6879, 9063, 8405, 9809, 6121, 10808,
+ 6879, 9063, 8405, 11709, 9162,
+ 6879, 9063, 8427, 7569, 8774,
+ 6879, 9063, 10489, 8151, 8427, 7569, 8774,
+ 6879, 9063, 10489, 8427, 7569, 8774,
+ 6879, 9245, 5758,
+ 6879, 9412,
+ 6879, 9419, 3717, 5758,
+ 6879, 9483, 8396,
+ 6879, 9513, 5758,
+ 6879, 9809, 6121, 4531, 8774,
+ 6879, 9809, 6121, 6379, 721, 4531, 8774,
+ 6879, 9809, 6121, 10805, 721, 4531, 8774,
+ 6879, 10331, 5758,
+ 6879, 10469, 4926,
+ 6879, 10489, 8427, 9271, 8774,
+ 6879, 10651, 3717, 5758,
+ 6879, 10809, 721, 5388,
+ 6879, 10809, 721, 7782,
+ 6879, 10809, 721, 12120,
+ 6879, 10809, 7724,
+ 6879, 11261, 7593, 8405, 888,
+ 6879, 11261, 7593, 8405, 2216,
+ 6879, 11261, 7593, 8405, 2412,
+ 6879, 11261, 7593, 8405, 3774,
+ 6879, 11261, 7593, 8405, 6824,
+ 6879, 11405, 6443, 2171, 4388,
+ 6879, 11405, 6443, 2171, 9244,
+ 6879, 11405, 6443, 2171, 9345, 9736,
+ 6879, 11405, 6443, 2171, 9345, 9764,
+ 6879, 11405, 6443, 2171, 9614,
+ 6879, 11405, 6443, 2171, 10625, 9736,
+ 6879, 11405, 6443, 2171, 10625, 9764,
+ 6879, 11405, 6443, 2671, 5010,
+ 6879, 11405, 6443, 2671, 9736,
+ 6879, 11405, 6443, 2671, 9764,
+ 6879, 11405, 6443, 2671, 10625, 9736,
+ 6879, 11405, 6443, 4200,
+ 6879, 11405, 6443, 4201, 9344,
+ 6879, 11405, 6443, 4201, 9345, 9736,
+ 6879, 11405, 6443, 4201, 9345, 9764,
+ 6879, 11405, 6443, 4201, 9736,
+ 6879, 11405, 6443, 4201, 9764,
+ 6879, 11405, 6443, 4201, 10624,
+ 6879, 11405, 6443, 4201, 10625, 9764,
+ 6879, 11405, 6443, 6784,
+ 6879, 11405, 6443, 6785, 9736,
+ 6879, 11405, 6443, 6785, 9764,
+ 6879, 11405, 6443, 6785, 10624,
+ 6879, 11405, 6443, 6785, 10625, 9736,
+ 6879, 11405, 8505, 4201, 9344,
+ 6879, 11405, 9153, 4201, 5010,
+ 6879, 11405, 9337, 2171, 10436,
+ 6879, 11405, 9975, 2779, 10138,
+ 6879, 11405, 10549, 6785, 5010,
+ 6879, 11405, 10621, 2170,
+ 6879, 11405, 10621, 2171, 9344,
+ 6879, 11405, 10621, 2171, 10624,
+ 6879, 11405, 10621, 2670,
+ 6879, 11405, 10621, 2778,
+ 6879, 11405, 10621, 4201, 9344,
+ 6879, 11405, 10621, 4201, 10624,
+ 6879, 11405, 10621, 6784,
+ 6879, 11405, 10621, 7695, 9344,
+ 6879, 11405, 10621, 8820,
+ 6879, 11405, 10755, 4201, 9344,
+ 6879, 11405, 11117, 2670,
+ 6879, 11405, 11617, 2778,
+ 6879, 11405, 11617, 2779, 10138,
+ 6879, 11405, 11617, 4201, 9344,
+ 6879, 11405, 11645, 2170,
+ 6879, 11405, 11645, 2670,
+ 6879, 11405, 11645, 6784,
+ 6879, 11405, 11865, 2670,
+ 6879, 11405, 11865, 2671, 10707, 4212,
+ 6879, 11405, 11865, 4200,
+ 6879, 11405, 11865, 4201, 9344,
+ 6879, 11405, 11865, 6784,
+ 6879, 11405, 11865, 6785, 10707, 4212,
+ 6879, 12120,
+ 6879, 12489, 10365, 10586,
+ 6879, 12489, 10365, 10588,
+ 6879, 12489, 10365, 10592,
+ 6879, 12489, 10365, 10594,
+ 6879, 12489, 10365, 10598,
+ 6879, 12489, 10365, 10600,
+ 6879, 12489, 10365, 11272,
+ 6879, 12489, 10365, 11274,
+ 6879, 12489, 10365, 11276,
+ 6879, 12489, 10365, 11278,
+ 6879, 12489, 10365, 11284,
+ 6879, 12489, 10365, 11286,
+ 6879, 12489, 10365, 11288,
+ 6879, 12489, 10365, 11296,
+ 6879, 12489, 10365, 11298,
+ 6879, 12489, 10365, 11300,
+ 6879, 12489, 10365, 11302,
+ 6879, 12489, 10365, 11304,
+ 6879, 12489, 10365, 11306,
+ 6879, 12489, 10365, 11308,
+ 6879, 12489, 10365, 11310,
+ 6879, 12489, 10365, 11312,
+ 6879, 12489, 10365, 11314,
+ 6879, 12489, 10365, 11316,
+ 6879, 12489, 10365, 11318,
+ 6879, 12489, 10365, 11320,
+ 6879, 12489, 10365, 11322,
+ 6879, 12489, 10365, 11324,
+ 6879, 12489, 10365, 11326,
+ 6879, 12489, 10365, 11328,
+ 6879, 12489, 10365, 11330,
+ 6879, 12489, 10365, 11332,
+ 6879, 12489, 10365, 11334,
+ 6879, 12489, 10365, 11336,
+ 6879, 12489, 10365, 11338,
+ 6879, 12489, 10365, 11340,
+ 6879, 12489, 10365, 11342,
+ 6879, 13036,
+ 6879, 13064,
+ 6909, 4215, 13047, 9898,
+ 6909, 5385, 8037, 6622,
+ 6909, 6505, 6906,
+ 6909, 6505, 8083, 9811, 721, 11765, 6434,
+ 6909, 6505, 8083, 10959, 721, 11765, 6434,
+ 6909, 6569, 4926,
+ 6909, 6723, 9601, 12141, 6505, 5830,
+ 6909, 6723, 13233, 11187, 9898,
+ 6909, 6879, 6622,
+ 6909, 6907, 12017, 4927, 10380,
+ 6909, 7121, 13069, 7821, 11765, 6434,
+ 6909, 7271, 4153, 6434,
+ 6909, 7607, 4153, 6434,
+ 6909, 7773, 13069, 7821, 11765, 6434,
+ 6909, 7971, 46,
+ 6909, 8097, 13235, 11765, 6434,
+ 6909, 8153, 6617, 11195, 4927, 10380,
+ 6909, 8153, 8869, 6617, 11195, 4927, 10380,
+ 6909, 8717, 6617, 11195, 4927, 10380,
+ 6909, 8717, 8869, 6617, 11195, 4927, 10380,
+ 6909, 9085, 11242,
+ 6909, 9722,
+ 6909, 9898,
+ 6909, 10385, 6505, 5830,
+ 6909, 10677, 760,
+ 6909, 11765, 6434,
+ 6909, 12017, 4927, 10380,
+ 6909, 12387, 11765, 6434,
+ 6909, 12539, 11765, 6434,
+ 6909, 12895, 11765, 6434,
+ 6909, 12967, 6409, 9051, 10380,
+ 6909, 12967, 6409, 11195, 4927, 10380,
+ 6909, 13061, 46,
+ 6909, 13067, 6409, 9051, 10380,
+ 6909, 13067, 6409, 11195, 4927, 10380,
+ 6909, 13191, 7271, 4153, 6434,
+ 6909, 13191, 7607, 4153, 6434,
+ 6909, 13191, 11765, 6434,
+ 6909, 13199, 6505, 11765, 6434,
+ 6909, 13233, 9898,
+ 6909, 13233, 10433, 9898,
+ 6909, 13235, 11765, 6434,
+ 6909, 13351, 11765, 6434,
+ 6954,
+ 6989, 428,
+ 6989, 429, 445, 12903, 6741, 568,
+ 7031, 341, 5759, 940,
+ 7031, 341, 5759, 5740,
+ 7031, 341, 5965, 6540,
+ 7031, 341, 5965, 6541, 8596,
+ 7031, 341, 5965, 8596,
+ 7031, 341, 6689, 2170,
+ 7031, 341, 6689, 2540,
+ 7031, 341, 6689, 2778,
+ 7031, 341, 6689, 4200,
+ 7031, 341, 6689, 4214,
+ 7031, 341, 6689, 5190,
+ 7031, 341, 6689, 6260,
+ 7031, 341, 6689, 6722,
+ 7031, 341, 6689, 7508,
+ 7031, 341, 6689, 7694,
+ 7031, 341, 7803, 8,
+ 7031, 341, 7803, 28,
+ 7031, 341, 7803, 40,
+ 7031, 341, 7803, 162,
+ 7031, 341, 7803, 590,
+ 7031, 341, 8405, 0,
+ 7031, 341, 8405, 16,
+ 7031, 341, 8405, 100,
+ 7031, 341, 8405, 116,
+ 7031, 341, 8405, 138,
+ 7031, 341, 8405, 216,
+ 7031, 341, 8405, 236,
+ 7031, 341, 8405, 306,
+ 7031, 341, 8405, 332,
+ 7031, 341, 8405, 364,
+ 7031, 341, 8405, 392,
+ 7031, 341, 8405, 426,
+ 7031, 341, 8405, 440,
+ 7031, 341, 8405, 462,
+ 7031, 341, 8405, 510,
+ 7031, 341, 8405, 524,
+ 7031, 341, 8405, 556,
+ 7031, 341, 8405, 610,
+ 7031, 341, 8405, 622,
+ 7031, 341, 8405, 652,
+ 7031, 341, 8405, 670,
+ 7031, 341, 8405, 1434,
+ 7031, 341, 8405, 1612,
+ 7031, 341, 8405, 2030,
+ 7031, 341, 8405, 2126,
+ 7031, 341, 8405, 2212,
+ 7031, 341, 8405, 2516,
+ 7031, 341, 8405, 2678,
+ 7049, 5759, 1763, 2722,
+ 7049, 5759, 4740,
+ 7049, 5759, 6388,
+ 7049, 5759, 6608,
+ 7049, 5759, 7450,
+ 7049, 5759, 7976,
+ 7049, 5759, 7992,
+ 7049, 5759, 8025, 2227, 4794,
+ 7049, 5759, 8583, 5014,
+ 7049, 5759, 8663, 8666,
+ 7049, 5759, 8918,
+ 7049, 5759, 9382,
+ 7049, 5759, 9408,
+ 7049, 5759, 9506,
+ 7049, 5759, 9624,
+ 7049, 5759, 9794,
+ 7049, 5759, 9902,
+ 7049, 5759, 11438,
+ 7049, 5759, 11440,
+ 7049, 5759, 12088,
+ 7049, 5759, 12366,
+ 7049, 5759, 12906,
+ 7049, 5759, 13038,
+ 7049, 6689, 2170,
+ 7049, 6689, 2540,
+ 7049, 6689, 2778,
+ 7049, 6689, 4200,
+ 7049, 6689, 4214,
+ 7049, 6689, 5190,
+ 7049, 6689, 6260,
+ 7049, 6689, 6722,
+ 7049, 6689, 7508,
+ 7049, 6689, 7694,
+ 7049, 7803, 5759, 8,
+ 7049, 7803, 5759, 16,
+ 7049, 7803, 5759, 40,
+ 7049, 7803, 5759, 48,
+ 7049, 7803, 5759, 58,
+ 7049, 7803, 5759, 66,
+ 7049, 7803, 5759, 72,
+ 7049, 7803, 5759, 92,
+ 7049, 7803, 5759, 258,
+ 7049, 7803, 5759, 266,
+ 7049, 7803, 5759, 426,
+ 7049, 7803, 5759, 440,
+ 7049, 7803, 5759, 582,
+ 7049, 7803, 5759, 606,
+ 7049, 7803, 5759, 652,
+ 7049, 7803, 5759, 668,
+ 7049, 7803, 10259, 58,
+ 7049, 7803, 10259, 86,
+ 7049, 8405, 100,
+ 7049, 8405, 116,
+ 7049, 8405, 130,
+ 7049, 8405, 138,
+ 7049, 8405, 150,
+ 7049, 8405, 236,
+ 7049, 8405, 306,
+ 7049, 8405, 322,
+ 7049, 8405, 332,
+ 7049, 8405, 350,
+ 7049, 8405, 380,
+ 7049, 8405, 412,
+ 7049, 8405, 480,
+ 7049, 8405, 496,
+ 7049, 8405, 516,
+ 7049, 8405, 524,
+ 7049, 8405, 556,
+ 7049, 8405, 568,
+ 7049, 8405, 616,
+ 7049, 8405, 660,
+ 7049, 8405, 884,
+ 7049, 8405, 890,
+ 7049, 8405, 1612,
+ 7049, 8405, 1618,
+ 7049, 8405, 2038,
+ 7049, 8405, 2080,
+ 7049, 8405, 2134,
+ 7049, 8405, 2212,
+ 7049, 8405, 2218,
+ 7049, 8405, 2516,
+ 7049, 8405, 2572,
+ 7049, 8405, 2678,
+ 7049, 8405, 2684,
+ 7049, 8405, 5994,
+ 7049, 8405, 6000,
+ 7049, 8775, 783, 2426,
+ 7049, 8775, 783, 4768,
+ 7049, 8775, 965, 2426,
+ 7049, 8775, 965, 4768,
+ 7049, 8775, 1763, 6441, 782,
+ 7049, 8775, 1763, 6441, 2226,
+ 7049, 8775, 1763, 6441, 2552,
+ 7049, 8775, 1763, 6441, 3814,
+ 7049, 8775, 1763, 6441, 5026,
+ 7049, 8775, 1763, 6441, 5450,
+ 7049, 8775, 1763, 6441, 10446,
+ 7049, 8775, 1763, 6441, 10448,
+ 7049, 8775, 1763, 6441, 11178,
+ 7049, 8775, 1763, 6441, 11180,
+ 7049, 8775, 2227, 2426,
+ 7049, 8775, 2227, 4768,
+ 7049, 8775, 3815, 2426,
+ 7049, 8775, 3815, 4768,
+ 7049, 8775, 5027, 2426,
+ 7049, 8775, 5027, 4768,
+ 7049, 8775, 5451, 2426,
+ 7049, 8775, 5451, 4768,
+ 7049, 8775, 9143, 2426,
+ 7049, 8775, 9143, 4768,
+ 7049, 8775, 9145, 2426,
+ 7049, 8775, 9145, 4768,
+ 7049, 8775, 9981, 2426,
+ 7049, 8775, 9981, 4768,
+ 7049, 8775, 9983, 2426,
+ 7049, 8775, 9983, 4768,
+ 7049, 8775, 9985, 2426,
+ 7049, 8775, 9985, 4768,
+ 7049, 8775, 10447, 2426,
+ 7049, 8775, 10447, 4768,
+ 7049, 8775, 10449, 2426,
+ 7049, 8775, 10449, 4768,
+ 7049, 8775, 11179, 2426,
+ 7049, 8775, 11179, 4768,
+ 7049, 8775, 11181, 2426,
+ 7049, 8775, 11181, 4768,
+ 7049, 8775, 11380,
+ 7049, 8775, 11716,
+ 7049, 9971, 8775, 5548,
+ 7049, 12053, 7803, 360,
+ 7049, 12053, 7803, 498,
+ 7049, 12053, 7803, 500,
+ 7049, 12053, 7803, 506,
+ 7049, 12053, 7803, 522,
+ 7049, 12053, 7803, 1850,
+ 7049, 12053, 7803, 2282,
+ 7049, 12053, 7803, 2286,
+ 7049, 12053, 7803, 2288,
+ 7049, 12053, 7803, 2292,
+ 7049, 12053, 7803, 2308,
+ 7049, 12053, 7803, 2321, 6031, 2170,
+ 7049, 12053, 7803, 2321, 6031, 2778,
+ 7049, 12053, 7803, 2334,
+ 7049, 12053, 7803, 2344,
+ 7049, 12053, 7803, 2478,
+ 7049, 12053, 7803, 5506,
+ 7085, 601, 5876,
+ 7085, 4117, 5876,
+ 7085, 4849, 10643, 10374,
+ 7085, 8056,
+ 7085, 8849, 10677, 761, 10374,
+ 7089, 6622,
+ 7089, 7593, 8405, 0,
+ 7089, 7593, 8405, 1, 6121, 1045, 6376,
+ 7089, 7593, 8405, 1, 6121, 1045, 6377, 721, 8432,
+ 7089, 7593, 8405, 1, 6121, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 5551, 6376,
+ 7089, 7593, 8405, 1, 6121, 5551, 6377, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 5551, 6490,
+ 7089, 7593, 8405, 1, 6121, 6378,
+ 7089, 7593, 8405, 1, 6121, 6516,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 6874,
+ 7089, 7593, 8405, 1, 6121, 6517, 721, 7708,
+ 7089, 7593, 8405, 1, 6121, 6546,
+ 7089, 7593, 8405, 1, 6121, 6874,
+ 7089, 7593, 8405, 1, 6121, 7443, 4389, 5550,
+ 7089, 7593, 8405, 1, 6121, 7708,
+ 7089, 7593, 8405, 1, 6121, 8153, 6874,
+ 7089, 7593, 8405, 1, 6121, 8432,
+ 7089, 7593, 8405, 1, 6121, 8534,
+ 7089, 7593, 8405, 1, 6121, 8758,
+ 7089, 7593, 8405, 1, 6121, 10267, 6516,
+ 7089, 7593, 8405, 1, 6121, 10804,
+ 7089, 7593, 8405, 1, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 1, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1, 6121, 11448,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 1, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 2,
+ 7089, 7593, 8405, 3, 6121, 1045, 6376,
+ 7089, 7593, 8405, 3, 6121, 1045, 6490,
+ 7089, 7593, 8405, 3, 6121, 4530,
+ 7089, 7593, 8405, 3, 6121, 4877, 6490,
+ 7089, 7593, 8405, 3, 6121, 8473, 7708,
+ 7089, 7593, 8405, 3, 6121, 8758,
+ 7089, 7593, 8405, 3, 6121, 8846,
+ 7089, 7593, 8405, 3, 6121, 9553, 4530,
+ 7089, 7593, 8405, 4,
+ 7089, 7593, 8405, 5, 6121, 1045, 6376,
+ 7089, 7593, 8405, 5, 6121, 3966,
+ 7089, 7593, 8405, 5, 6121, 4530,
+ 7089, 7593, 8405, 5, 6121, 6378,
+ 7089, 7593, 8405, 5, 6121, 6546,
+ 7089, 7593, 8405, 5, 6121, 8758,
+ 7089, 7593, 8405, 5, 6121, 9072,
+ 7089, 7593, 8405, 5, 6121, 9073, 721, 6378,
+ 7089, 7593, 8405, 5, 6121, 11448,
+ 7089, 7593, 8405, 6,
+ 7089, 7593, 8405, 7, 6121, 1045, 6376,
+ 7089, 7593, 8405, 7, 6121, 1045, 6490,
+ 7089, 7593, 8405, 7, 6121, 3966,
+ 7089, 7593, 8405, 7, 6121, 4530,
+ 7089, 7593, 8405, 7, 6121, 4531, 721, 5878,
+ 7089, 7593, 8405, 7, 6121, 4877, 6490,
+ 7089, 7593, 8405, 7, 6121, 5878,
+ 7089, 7593, 8405, 7, 6121, 6546,
+ 7089, 7593, 8405, 7, 6121, 8473, 7708,
+ 7089, 7593, 8405, 7, 6121, 8758,
+ 7089, 7593, 8405, 7, 6121, 8846,
+ 7089, 7593, 8405, 7, 6121, 9072,
+ 7089, 7593, 8405, 7, 6121, 9553, 4530,
+ 7089, 7593, 8405, 7, 6121, 11449, 6490,
+ 7089, 7593, 8405, 8,
+ 7089, 7593, 8405, 9, 6121, 1045, 6376,
+ 7089, 7593, 8405, 9, 6121, 1045, 6490,
+ 7089, 7593, 8405, 9, 6121, 4531, 6376,
+ 7089, 7593, 8405, 9, 6121, 6378,
+ 7089, 7593, 8405, 9, 6121, 6516,
+ 7089, 7593, 8405, 9, 6121, 6546,
+ 7089, 7593, 8405, 9, 6121, 6874,
+ 7089, 7593, 8405, 9, 6121, 7272,
+ 7089, 7593, 8405, 9, 6121, 7708,
+ 7089, 7593, 8405, 9, 6121, 7709, 6490,
+ 7089, 7593, 8405, 9, 6121, 8153, 6874,
+ 7089, 7593, 8405, 9, 6121, 8432,
+ 7089, 7593, 8405, 9, 6121, 8433, 721, 6378,
+ 7089, 7593, 8405, 9, 6121, 8433, 721, 6874,
+ 7089, 7593, 8405, 9, 6121, 8534,
+ 7089, 7593, 8405, 9, 6121, 8758,
+ 7089, 7593, 8405, 9, 6121, 9072,
+ 7089, 7593, 8405, 9, 6121, 9073, 721, 6516,
+ 7089, 7593, 8405, 9, 6121, 10267, 6516,
+ 7089, 7593, 8405, 9, 6121, 10804,
+ 7089, 7593, 8405, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 9, 6121, 11448,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 9, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 9, 6121, 11449, 6490,
+ 7089, 7593, 8405, 10,
+ 7089, 7593, 8405, 11, 6121, 1045, 6376,
+ 7089, 7593, 8405, 11, 6121, 4530,
+ 7089, 7593, 8405, 11, 6121, 8473, 7708,
+ 7089, 7593, 8405, 11, 6121, 9553, 4530,
+ 7089, 7593, 8405, 12,
+ 7089, 7593, 8405, 13, 6121, 1045, 6376,
+ 7089, 7593, 8405, 13, 6121, 4530,
+ 7089, 7593, 8405, 13, 6121, 6378,
+ 7089, 7593, 8405, 13, 6121, 6516,
+ 7089, 7593, 8405, 13, 6121, 6546,
+ 7089, 7593, 8405, 13, 6121, 8432,
+ 7089, 7593, 8405, 13, 6121, 8758,
+ 7089, 7593, 8405, 13, 6121, 9072,
+ 7089, 7593, 8405, 13, 6121, 9553, 4530,
+ 7089, 7593, 8405, 13, 6121, 11448,
+ 7089, 7593, 8405, 14,
+ 7089, 7593, 8405, 15, 6121, 1045, 6376,
+ 7089, 7593, 8405, 15, 6121, 1045, 6490,
+ 7089, 7593, 8405, 15, 6121, 4530,
+ 7089, 7593, 8405, 15, 6121, 4877, 6490,
+ 7089, 7593, 8405, 15, 6121, 6517, 6490,
+ 7089, 7593, 8405, 15, 6121, 6546,
+ 7089, 7593, 8405, 15, 6121, 8758,
+ 7089, 7593, 8405, 15, 6121, 9072,
+ 7089, 7593, 8405, 15, 6121, 10802,
+ 7089, 7593, 8405, 15, 6121, 10804,
+ 7089, 7593, 8405, 15, 6121, 11448,
+ 7089, 7593, 8405, 16,
+ 7089, 7593, 8405, 17, 6121, 1045, 6490,
+ 7089, 7593, 8405, 17, 6121, 4531, 6376,
+ 7089, 7593, 8405, 17, 6121, 6378,
+ 7089, 7593, 8405, 17, 6121, 6516,
+ 7089, 7593, 8405, 17, 6121, 6546,
+ 7089, 7593, 8405, 17, 6121, 6874,
+ 7089, 7593, 8405, 17, 6121, 7708,
+ 7089, 7593, 8405, 17, 6121, 7709, 6490,
+ 7089, 7593, 8405, 17, 6121, 8153, 6874,
+ 7089, 7593, 8405, 17, 6121, 8432,
+ 7089, 7593, 8405, 17, 6121, 8534,
+ 7089, 7593, 8405, 17, 6121, 8758,
+ 7089, 7593, 8405, 17, 6121, 10267, 6516,
+ 7089, 7593, 8405, 17, 6121, 10804,
+ 7089, 7593, 8405, 17, 6121, 10805, 721, 6378,
+ 7089, 7593, 8405, 17, 6121, 11215, 4530,
+ 7089, 7593, 8405, 17, 6121, 11448,
+ 7089, 7593, 8405, 18,
+ 7089, 7593, 8405, 19, 6121, 6546,
+ 7089, 7593, 8405, 19, 6121, 8758,
+ 7089, 7593, 8405, 19, 6121, 11448,
+ 7089, 7593, 8405, 19, 6121, 12426,
+ 7089, 7593, 8405, 20,
+ 7089, 7593, 8405, 21, 6121, 1045, 6490,
+ 7089, 7593, 8405, 21, 6121, 4530,
+ 7089, 7593, 8405, 21, 6121, 4877, 6490,
+ 7089, 7593, 8405, 21, 6121, 6378,
+ 7089, 7593, 8405, 21, 6121, 6546,
+ 7089, 7593, 8405, 21, 6121, 8758,
+ 7089, 7593, 8405, 21, 6121, 8759, 721, 10001, 8758,
+ 7089, 7593, 8405, 21, 6121, 9072,
+ 7089, 7593, 8405, 21, 6121, 9553, 4530,
+ 7089, 7593, 8405, 21, 6121, 10001, 8758,
+ 7089, 7593, 8405, 21, 6121, 10802,
+ 7089, 7593, 8405, 22,
+ 7089, 7593, 8405, 23, 6121, 760,
+ 7089, 7593, 8405, 23, 6121, 1045, 6490,
+ 7089, 7593, 8405, 23, 6121, 1045, 6491, 721, 8432,
+ 7089, 7593, 8405, 23, 6121, 3770,
+ 7089, 7593, 8405, 23, 6121, 3966,
+ 7089, 7593, 8405, 23, 6121, 4423, 8758,
+ 7089, 7593, 8405, 23, 6121, 4877, 6490,
+ 7089, 7593, 8405, 23, 6121, 6378,
+ 7089, 7593, 8405, 23, 6121, 6546,
+ 7089, 7593, 8405, 23, 6121, 8153, 760,
+ 7089, 7593, 8405, 23, 6121, 8473, 1044,
+ 7089, 7593, 8405, 23, 6121, 8473, 7708,
+ 7089, 7593, 8405, 23, 6121, 8758,
+ 7089, 7593, 8405, 23, 6121, 9072,
+ 7089, 7593, 8405, 23, 6121, 9553, 4530,
+ 7089, 7593, 8405, 23, 6121, 11215, 4530,
+ 7089, 7593, 8405, 23, 6121, 11449, 6490,
+ 7089, 7593, 8405, 24,
+ 7089, 7593, 8405, 25, 6121, 1045, 6376,
+ 7089, 7593, 8405, 25, 6121, 1045, 6490,
+ 7089, 7593, 8405, 25, 6121, 4530,
+ 7089, 7593, 8405, 25, 6121, 6378,
+ 7089, 7593, 8405, 25, 6121, 8473, 7708,
+ 7089, 7593, 8405, 25, 6121, 9553, 4530,
+ 7089, 7593, 8405, 26,
+ 7089, 7593, 8405, 27, 6121, 1045, 6376,
+ 7089, 7593, 8405, 27, 6121, 1045, 6490,
+ 7089, 7593, 8405, 27, 6121, 3966,
+ 7089, 7593, 8405, 27, 6121, 4849, 4530,
+ 7089, 7593, 8405, 27, 6121, 4877, 6490,
+ 7089, 7593, 8405, 27, 6121, 4895, 7443, 1760,
+ 7089, 7593, 8405, 27, 6121, 6378,
+ 7089, 7593, 8405, 27, 6121, 6546,
+ 7089, 7593, 8405, 27, 6121, 6874,
+ 7089, 7593, 8405, 27, 6121, 7708,
+ 7089, 7593, 8405, 27, 6121, 8473, 7708,
+ 7089, 7593, 8405, 27, 6121, 9072,
+ 7089, 7593, 8405, 27, 6121, 9553, 4530,
+ 7089, 7593, 8405, 27, 6121, 11215, 4530,
+ 7089, 7593, 8405, 27, 6121, 11449, 6490,
+ 7089, 7593, 8405, 27, 10451, 115, 11424,
+ 7089, 7593, 8405, 28,
+ 7089, 7593, 8405, 29, 6121, 1045, 6376,
+ 7089, 7593, 8405, 29, 6121, 1045, 6377, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 1809, 5551, 8318,
+ 7089, 7593, 8405, 29, 6121, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 4536,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 4537, 721, 7708,
+ 7089, 7593, 8405, 29, 6121, 4895, 8759, 9548,
+ 7089, 7593, 8405, 29, 6121, 4896,
+ 7089, 7593, 8405, 29, 6121, 6378,
+ 7089, 7593, 8405, 29, 6121, 6516,
+ 7089, 7593, 8405, 29, 6121, 6546,
+ 7089, 7593, 8405, 29, 6121, 6874,
+ 7089, 7593, 8405, 29, 6121, 7708,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 7709, 721, 10804,
+ 7089, 7593, 8405, 29, 6121, 8153, 6378,
+ 7089, 7593, 8405, 29, 6121, 8153, 6874,
+ 7089, 7593, 8405, 29, 6121, 8432,
+ 7089, 7593, 8405, 29, 6121, 8433, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 8433, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 8534,
+ 7089, 7593, 8405, 29, 6121, 8535, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 8758,
+ 7089, 7593, 8405, 29, 6121, 8759, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 10267, 6516,
+ 7089, 7593, 8405, 29, 6121, 10804,
+ 7089, 7593, 8405, 29, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 29, 6121, 11448,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 1045, 6490,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 4531, 6376,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 6378,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 6874,
+ 7089, 7593, 8405, 29, 6121, 11449, 721, 7708,
+ 7089, 7593, 8405, 30,
+ 7089, 7593, 8405, 31, 6121, 1045, 6376,
+ 7089, 7593, 8405, 31, 6121, 4530,
+ 7089, 7593, 8405, 31, 6121, 6378,
+ 7089, 7593, 8405, 31, 6121, 8473, 7708,
+ 7089, 7593, 8405, 31, 6121, 8758,
+ 7089, 7593, 8405, 31, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 31, 6121, 9553, 4530,
+ 7089, 7593, 8405, 31, 6121, 10196,
+ 7089, 7593, 8405, 31, 6121, 10533, 5878,
+ 7089, 7593, 8405, 32,
+ 7089, 7593, 8405, 33, 6121, 4530,
+ 7089, 7593, 8405, 33, 6121, 4531, 5878,
+ 7089, 7593, 8405, 33, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 33, 6121, 10001, 8758,
+ 7089, 7593, 8405, 34,
+ 7089, 7593, 8405, 35, 6121, 1045, 6376,
+ 7089, 7593, 8405, 35, 6121, 1045, 6490,
+ 7089, 7593, 8405, 35, 6121, 1045, 6491, 721, 8432,
+ 7089, 7593, 8405, 35, 6121, 4877, 6490,
+ 7089, 7593, 8405, 35, 6121, 4895, 1760,
+ 7089, 7593, 8405, 35, 6121, 5878,
+ 7089, 7593, 8405, 35, 6121, 6378,
+ 7089, 7593, 8405, 35, 6121, 6546,
+ 7089, 7593, 8405, 35, 6121, 8153, 6874,
+ 7089, 7593, 8405, 35, 6121, 8473, 7708,
+ 7089, 7593, 8405, 35, 6121, 8758,
+ 7089, 7593, 8405, 35, 6121, 9072,
+ 7089, 7593, 8405, 35, 6121, 9553, 4530,
+ 7089, 7593, 8405, 35, 6121, 10190,
+ 7089, 7593, 8405, 35, 6121, 10191, 721, 8473, 7708,
+ 7089, 7593, 8405, 35, 6121, 10267, 6516,
+ 7089, 7593, 8405, 35, 9642,
+ 7089, 7593, 8405, 36,
+ 7089, 7593, 8405, 37, 6121, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 1045, 6490,
+ 7089, 7593, 8405, 37, 6121, 1045, 6491, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 4530,
+ 7089, 7593, 8405, 37, 6121, 6378,
+ 7089, 7593, 8405, 37, 6121, 6379, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 6546,
+ 7089, 7593, 8405, 37, 6121, 6547, 721, 1045, 6376,
+ 7089, 7593, 8405, 37, 6121, 6617, 6490,
+ 7089, 7593, 8405, 37, 6121, 7653, 5878,
+ 7089, 7593, 8405, 37, 6121, 8473, 7708,
+ 7089, 7593, 8405, 37, 6121, 9072,
+ 7089, 7593, 8405, 37, 6121, 9553, 4530,
+ 7089, 7593, 8405, 37, 6121, 11448,
+ 7089, 7593, 8405, 38,
+ 7089, 7593, 8405, 39, 6121, 1045, 6376,
+ 7089, 7593, 8405, 39, 6121, 1045, 6490,
+ 7089, 7593, 8405, 39, 6121, 3966,
+ 7089, 7593, 8405, 39, 6121, 4530,
+ 7089, 7593, 8405, 39, 6121, 4877, 6490,
+ 7089, 7593, 8405, 39, 6121, 6546,
+ 7089, 7593, 8405, 39, 6121, 6617, 6490,
+ 7089, 7593, 8405, 39, 6121, 8473, 7708,
+ 7089, 7593, 8405, 39, 6121, 8758,
+ 7089, 7593, 8405, 39, 6121, 9072,
+ 7089, 7593, 8405, 39, 6121, 9553, 4530,
+ 7089, 7593, 8405, 39, 6121, 10001, 8758,
+ 7089, 7593, 8405, 39, 6121, 10804,
+ 7089, 7593, 8405, 39, 6121, 11215, 4530,
+ 7089, 7593, 8405, 39, 6121, 11449, 6490,
+ 7089, 7593, 8405, 40,
+ 7089, 7593, 8405, 41, 760,
+ 7089, 7593, 8405, 41, 6121, 1045, 6490,
+ 7089, 7593, 8405, 41, 6121, 4531, 6376,
+ 7089, 7593, 8405, 41, 6121, 4536,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 1045, 6490,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 4531, 6376,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 6874,
+ 7089, 7593, 8405, 41, 6121, 4537, 721, 7708,
+ 7089, 7593, 8405, 41, 6121, 5551, 6376,
+ 7089, 7593, 8405, 41, 6121, 6378,
+ 7089, 7593, 8405, 41, 6121, 6516,
+ 7089, 7593, 8405, 41, 6121, 6546,
+ 7089, 7593, 8405, 41, 6121, 6874,
+ 7089, 7593, 8405, 41, 6121, 7708,
+ 7089, 7593, 8405, 41, 6121, 7709, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 7709, 6490,
+ 7089, 7593, 8405, 41, 6121, 8153, 6378,
+ 7089, 7593, 8405, 41, 6121, 8153, 6874,
+ 7089, 7593, 8405, 41, 6121, 8432,
+ 7089, 7593, 8405, 41, 6121, 8433, 721, 10804,
+ 7089, 7593, 8405, 41, 6121, 8534,
+ 7089, 7593, 8405, 41, 6121, 10267, 6516,
+ 7089, 7593, 8405, 41, 6121, 10804,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6378,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6546,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 6874,
+ 7089, 7593, 8405, 41, 6121, 10805, 721, 8432,
+ 7089, 7593, 8405, 41, 6121, 10805, 6490,
+ 7089, 7593, 8405, 41, 6121, 11215, 4530,
+ 7089, 7593, 8405, 41, 6121, 11448,
+ 7089, 7593, 8405, 41, 6121, 11449, 6490,
+ 7089, 7593, 8405, 42,
+ 7089, 7593, 8405, 43, 6121, 1045, 6490,
+ 7089, 7593, 8405, 43, 6121, 3966,
+ 7089, 7593, 8405, 43, 6121, 4530,
+ 7089, 7593, 8405, 43, 6121, 7443, 4530,
+ 7089, 7593, 8405, 43, 6121, 7708,
+ 7089, 7593, 8405, 43, 6121, 9553, 4530,
+ 7089, 7593, 8405, 43, 6121, 10001, 8758,
+ 7089, 7593, 8405, 44,
+ 7089, 7593, 8405, 45, 6121, 1045, 6376,
+ 7089, 7593, 8405, 45, 6121, 1045, 6490,
+ 7089, 7593, 8405, 45, 6121, 4530,
+ 7089, 7593, 8405, 45, 6121, 5551, 6376,
+ 7089, 7593, 8405, 45, 6121, 6378,
+ 7089, 7593, 8405, 45, 6121, 6874,
+ 7089, 7593, 8405, 45, 6121, 10804,
+ 7089, 7593, 8405, 45, 6121, 11448,
+ 7089, 7593, 8405, 46,
+ 7089, 7593, 8405, 47, 6121, 1045, 6376,
+ 7089, 7593, 8405, 47, 6121, 9553, 4530,
+ 7089, 7593, 8405, 47, 6121, 10804,
+ 7089, 7593, 8405, 48,
+ 7089, 7593, 8405, 49, 6121, 1045, 6376,
+ 7089, 7593, 8405, 49, 6121, 1045, 6490,
+ 7089, 7593, 8405, 49, 6121, 4530,
+ 7089, 7593, 8405, 49, 6121, 4531, 6376,
+ 7089, 7593, 8405, 49, 6121, 4896,
+ 7089, 7593, 8405, 49, 6121, 5551, 6376,
+ 7089, 7593, 8405, 49, 6121, 6378,
+ 7089, 7593, 8405, 49, 6121, 6874,
+ 7089, 7593, 8405, 49, 6121, 7708,
+ 7089, 7593, 8405, 49, 6121, 8432,
+ 7089, 7593, 8405, 49, 6121, 8758,
+ 7089, 7593, 8405, 49, 6121, 10804,
+ 7089, 7593, 8405, 49, 6121, 11448,
+ 7089, 7593, 8405, 50,
+ 7089, 7593, 8405, 51, 6121, 1045, 6376,
+ 7089, 7593, 8405, 51, 6121, 1045, 6490,
+ 7089, 7593, 8405, 51, 6121, 3966,
+ 7089, 7593, 8405, 51, 6121, 4530,
+ 7089, 7593, 8405, 51, 6121, 4877, 6490,
+ 7089, 7593, 8405, 51, 6121, 6378,
+ 7089, 7593, 8405, 51, 6121, 6546,
+ 7089, 7593, 8405, 51, 6121, 7653, 5878,
+ 7089, 7593, 8405, 51, 6121, 8473, 7708,
+ 7089, 7593, 8405, 51, 6121, 8758,
+ 7089, 7593, 8405, 51, 6121, 9553, 4530,
+ 7089, 7593, 8405, 51, 6121, 10802,
+ 7089, 7593, 8405, 51, 6121, 11215, 4530,
+ 7089, 7593, 8405, 51, 6121, 11448,
+ 7089, 7593, 8405, 58,
+ 7089, 7593, 8405, 66,
+ 7089, 7593, 8405, 67, 6121, 6378,
+ 7089, 7593, 8405, 67, 6121, 8432,
+ 7089, 7593, 8405, 82,
+ 7089, 7593, 8405, 92,
+ 7089, 7593, 8405, 94,
+ 7089, 7593, 8405, 95, 6121, 11649, 760,
+ 7089, 7593, 8405, 98,
+ 7089, 7593, 8405, 141, 9164,
+ 7089, 7593, 8405, 156,
+ 7089, 7593, 8405, 157, 6121, 6546,
+ 7089, 7593, 8405, 157, 9164,
+ 7089, 7593, 8405, 157, 9165, 6121, 3966,
+ 7089, 7593, 8405, 186,
+ 7089, 7593, 8405, 252,
+ 7089, 7593, 8405, 282,
+ 7089, 7593, 8405, 342,
+ 7089, 7593, 8405, 353, 9164,
+ 7089, 7593, 8405, 363, 9164,
+ 7089, 7593, 8405, 406,
+ 7089, 7593, 8405, 432,
+ 7089, 7593, 8405, 440,
+ 7089, 7593, 8405, 450,
+ 7089, 7593, 8405, 505, 9164,
+ 7089, 7593, 8405, 559, 9165, 6121, 3966,
+ 7089, 7593, 8405, 563, 6121, 13018,
+ 7089, 7593, 8405, 573, 9164,
+ 7089, 7593, 8405, 578,
+ 7089, 7593, 8405, 590,
+ 7089, 7593, 8405, 594,
+ 7089, 7593, 8405, 620,
+ 7089, 7593, 8405, 912,
+ 7089, 7593, 8405, 1058,
+ 7089, 7593, 8405, 1110,
+ 7089, 7593, 8405, 1124,
+ 7089, 7593, 8405, 1125, 6121, 3966,
+ 7089, 7593, 8405, 1125, 6121, 9553, 4530,
+ 7089, 7593, 8405, 1125, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1130,
+ 7089, 7593, 8405, 1138,
+ 7089, 7593, 8405, 1139, 6121, 3966,
+ 7089, 7593, 8405, 1139, 6121, 5878,
+ 7089, 7593, 8405, 1139, 6121, 6546,
+ 7089, 7593, 8405, 1139, 6121, 11215, 4530,
+ 7089, 7593, 8405, 1139, 10488,
+ 7089, 7593, 8405, 1678,
+ 7089, 7593, 8405, 1822,
+ 7089, 7593, 8405, 1952,
+ 7089, 7593, 8405, 2108,
+ 7089, 7593, 8405, 2216,
+ 7089, 7593, 8405, 2452,
+ 7089, 7593, 8405, 2453, 9642,
+ 7089, 7593, 8405, 2725, 4389, 28,
+ 7089, 7593, 8405, 2760,
+ 7089, 7593, 8405, 4065, 9164,
+ 7089, 7593, 8405, 4187, 9164,
+ 7089, 7593, 8405, 4389, 14,
+ 7089, 7593, 8405, 4404,
+ 7089, 7593, 8405, 4405, 6121, 4530,
+ 7089, 7593, 8405, 4614,
+ 7089, 7593, 8405, 4615, 6121, 8758,
+ 7089, 7593, 8405, 4854,
+ 7089, 7593, 8405, 4895, 36,
+ 7089, 7593, 8405, 4895, 37, 6121, 1045, 6376,
+ 7089, 7593, 8405, 4895, 37, 6121, 4423, 8758,
+ 7089, 7593, 8405, 4895, 37, 6121, 10001, 8758,
+ 7089, 7593, 8405, 5385, 8,
+ 7089, 7593, 8405, 5385, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 5385, 28,
+ 7089, 7593, 8405, 5385, 29, 6121, 11215, 4530,
+ 7089, 7593, 8405, 5527, 4536,
+ 7089, 7593, 8405, 5901, 9164,
+ 7089, 7593, 8405, 5965, 2540,
+ 7089, 7593, 8405, 5965, 2778,
+ 7089, 7593, 8405, 5965, 4200,
+ 7089, 7593, 8405, 6078,
+ 7089, 7593, 8405, 6220,
+ 7089, 7593, 8405, 6406,
+ 7089, 7593, 8405, 6407, 6121, 11215, 4530,
+ 7089, 7593, 8405, 6674,
+ 7089, 7593, 8405, 6824,
+ 7089, 7593, 8405, 7494,
+ 7089, 7593, 8405, 7495, 6121, 4530,
+ 7089, 7593, 8405, 7495, 6121, 11215, 4530,
+ 7089, 7593, 8405, 7519, 36,
+ 7089, 7593, 8405, 7619, 10489, 1124,
+ 7089, 7593, 8405, 7692,
+ 7089, 7593, 8405, 7693, 6121, 8758,
+ 7089, 7593, 8405, 7693, 6121, 8759, 9785, 10802,
+ 7089, 7593, 8405, 7981, 28,
+ 7089, 7593, 8405, 8005, 4389, 28,
+ 7089, 7593, 8405, 8017, 22,
+ 7089, 7593, 8405, 8065, 5385, 8,
+ 7089, 7593, 8405, 8065, 7316,
+ 7089, 7593, 8405, 8065, 10489, 5385, 8,
+ 7089, 7593, 8405, 8387, 6121, 8758,
+ 7089, 7593, 8405, 8679, 12,
+ 7089, 7593, 8405, 8869, 0,
+ 7089, 7593, 8405, 8869, 8,
+ 7089, 7593, 8405, 8869, 12,
+ 7089, 7593, 8405, 8869, 14,
+ 7089, 7593, 8405, 8869, 15, 6121, 10190,
+ 7089, 7593, 8405, 8869, 15, 6121, 10191, 721, 5878,
+ 7089, 7593, 8405, 8869, 16,
+ 7089, 7593, 8405, 8869, 20,
+ 7089, 7593, 8405, 8869, 22,
+ 7089, 7593, 8405, 8869, 24,
+ 7089, 7593, 8405, 8869, 25, 6121, 4895, 1760,
+ 7089, 7593, 8405, 8869, 34,
+ 7089, 7593, 8405, 8869, 35, 6121, 4530,
+ 7089, 7593, 8405, 8869, 35, 6121, 4895, 1760,
+ 7089, 7593, 8405, 8869, 35, 6121, 5878,
+ 7089, 7593, 8405, 8869, 38,
+ 7089, 7593, 8405, 8869, 42,
+ 7089, 7593, 8405, 8869, 44,
+ 7089, 7593, 8405, 8869, 48,
+ 7089, 7593, 8405, 8869, 66,
+ 7089, 7593, 8405, 8869, 426,
+ 7089, 7593, 8405, 8869, 5385, 8,
+ 7089, 7593, 8405, 8869, 6406,
+ 7089, 7593, 8405, 8869, 6674,
+ 7089, 7593, 8405, 8869, 9365, 12,
+ 7089, 7593, 8405, 9185, 16,
+ 7089, 7593, 8405, 9185, 18,
+ 7089, 7593, 8405, 9185, 19, 6121, 8758,
+ 7089, 7593, 8405, 9185, 19, 6121, 8759, 721, 4530,
+ 7089, 7593, 8405, 9313, 5836,
+ 7089, 7593, 8405, 9365, 6,
+ 7089, 7593, 8405, 9365, 10,
+ 7089, 7593, 8405, 9365, 12,
+ 7089, 7593, 8405, 9365, 34,
+ 7089, 7593, 8405, 9365, 36,
+ 7089, 7593, 8405, 9365, 38,
+ 7089, 7593, 8405, 9808,
+ 7089, 7593, 8405, 9809, 6121, 8758,
+ 7089, 7593, 8405, 10489, 4,
+ 7089, 7593, 8405, 10489, 5, 6121, 1044,
+ 7089, 7593, 8405, 10489, 8,
+ 7089, 7593, 8405, 10489, 35, 6121, 10190,
+ 7089, 7593, 8405, 10489, 5385, 8,
+ 7089, 7593, 8405, 10489, 5385, 9, 6121, 4530,
+ 7089, 7593, 8405, 10489, 5385, 9, 6121, 11215, 4530,
+ 7089, 7593, 8405, 10494,
+ 7089, 7593, 8405, 10523, 28,
+ 7089, 7593, 8405, 10523, 29, 6121, 8758,
+ 7089, 7593, 8405, 10523, 40,
+ 7089, 7593, 8405, 10523, 5385, 28,
+ 7089, 7593, 8405, 10523, 8869, 24,
+ 7089, 7593, 8405, 10523, 11941, 40,
+ 7089, 7593, 8405, 10609, 2216,
+ 7089, 7593, 8405, 10640,
+ 7089, 7593, 8405, 10786,
+ 7089, 7593, 8405, 10787, 6121, 6616,
+ 7089, 7593, 8405, 11879, 50,
+ 7089, 7593, 8405, 12507, 42,
+ 7089, 7593, 8405, 12507, 344,
+ 7089, 7593, 8405, 12935, 710,
+ 7089, 7593, 8405, 12935, 3244,
+ 7089, 7593, 9063, 8405, 17, 6121, 8758,
+ 7089, 7593, 9063, 8405, 41, 6121, 8758,
+ 7089, 7593, 10301, 200,
+ 7089, 7593, 10301, 202,
+ 7089, 7593, 10301, 204,
+ 7089, 7593, 10301, 268,
+ 7089, 7593, 10301, 426,
+ 7089, 7593, 10301, 544,
+ 7089, 7593, 10301, 1156,
+ 7089, 7593, 10301, 1158,
+ 7089, 7593, 10301, 4895, 37, 38,
+ 7089, 8405, 662,
+ 7089, 8405, 710,
+ 7089, 8405, 2779, 6121, 8758,
+ 7089, 8405, 6138,
+ 7089, 8405, 7593, 9063, 0,
+ 7089, 8405, 7593, 9063, 2,
+ 7089, 8405, 7593, 9063, 4,
+ 7089, 8405, 7593, 9063, 6,
+ 7089, 8405, 7593, 9063, 8,
+ 7089, 8405, 7593, 9063, 10,
+ 7089, 8405, 7593, 9063, 12,
+ 7089, 8405, 7593, 9063, 13, 6121, 4530,
+ 7089, 8405, 7593, 9063, 14,
+ 7089, 8405, 7593, 9063, 16,
+ 7089, 8405, 7593, 9063, 18,
+ 7089, 8405, 7593, 9063, 20,
+ 7089, 8405, 7593, 9063, 22,
+ 7089, 8405, 7593, 9063, 23, 6121, 8758,
+ 7089, 8405, 7593, 9063, 24,
+ 7089, 8405, 7593, 9063, 26,
+ 7089, 8405, 7593, 9063, 28,
+ 7089, 8405, 7593, 9063, 30,
+ 7089, 8405, 7593, 9063, 34,
+ 7089, 8405, 7593, 9063, 36,
+ 7089, 8405, 7593, 9063, 38,
+ 7089, 8405, 7593, 9063, 40,
+ 7089, 8405, 7593, 9063, 42,
+ 7089, 8405, 7593, 9063, 44,
+ 7089, 8405, 7593, 9063, 48,
+ 7089, 8405, 7593, 9063, 50,
+ 7089, 8405, 7593, 9063, 66,
+ 7089, 8405, 7593, 9063, 426,
+ 7089, 8405, 7593, 9063, 450,
+ 7089, 8405, 7593, 9063, 1130,
+ 7089, 8405, 7593, 9063, 1138,
+ 7089, 8405, 7593, 9063, 2452,
+ 7089, 8405, 7593, 9063, 5385, 28,
+ 7089, 8405, 7593, 9063, 7981, 2,
+ 7089, 8405, 7593, 9063, 8869, 8,
+ 7089, 8405, 7593, 9063, 8869, 34,
+ 7089, 8405, 7593, 9063, 10267, 34,
+ 7089, 8405, 7593, 9063, 10489, 26,
+ 7089, 8405, 7593, 9063, 10489, 34,
+ 7089, 8405, 8107, 6598,
+ 7089, 8405, 8921, 11089, 9728,
+ 7089, 8405, 9313, 5836,
+ 7089, 8405, 9313, 5837, 6121, 8758,
+ 7089, 8405, 9423, 6598,
+ 7089, 8405, 9865, 6598,
+ 7089, 8405, 9915, 11720,
+ 7089, 8405, 9917, 6598,
+ 7089, 8405, 9917, 11720,
+ 7089, 8405, 10267, 9313, 5836,
+ 7089, 8405, 10267, 9313, 5837, 6121, 8758,
+ 7089, 8405, 10489, 1125, 4896,
+ 7089, 8405, 10489, 9313, 5837, 6121, 8758,
+ 7089, 8405, 11215, 6598,
+ 7089, 8405, 11251, 4,
+ 7089, 8405, 11723, 8921, 11008,
+ 7089, 9063, 8405, 0,
+ 7089, 9063, 8405, 1, 6121, 1045, 6376,
+ 7089, 9063, 8405, 1, 6121, 1045, 6377, 721, 8432,
+ 7089, 9063, 8405, 1, 6121, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 5551, 6376,
+ 7089, 9063, 8405, 1, 6121, 5551, 6377, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 5551, 6490,
+ 7089, 9063, 8405, 1, 6121, 6378,
+ 7089, 9063, 8405, 1, 6121, 6516,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 6874,
+ 7089, 9063, 8405, 1, 6121, 6517, 721, 7708,
+ 7089, 9063, 8405, 1, 6121, 6546,
+ 7089, 9063, 8405, 1, 6121, 6874,
+ 7089, 9063, 8405, 1, 6121, 7708,
+ 7089, 9063, 8405, 1, 6121, 8153, 6874,
+ 7089, 9063, 8405, 1, 6121, 8432,
+ 7089, 9063, 8405, 1, 6121, 8534,
+ 7089, 9063, 8405, 1, 6121, 8758,
+ 7089, 9063, 8405, 1, 6121, 10267, 6516,
+ 7089, 9063, 8405, 1, 6121, 10804,
+ 7089, 9063, 8405, 1, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 1, 6121, 11448,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 1, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 2,
+ 7089, 9063, 8405, 3, 6121, 1045, 6376,
+ 7089, 9063, 8405, 3, 6121, 1045, 6490,
+ 7089, 9063, 8405, 3, 6121, 4530,
+ 7089, 9063, 8405, 3, 6121, 4877, 6490,
+ 7089, 9063, 8405, 3, 6121, 8758,
+ 7089, 9063, 8405, 3, 6121, 8846,
+ 7089, 9063, 8405, 4,
+ 7089, 9063, 8405, 5, 6121, 1045, 6376,
+ 7089, 9063, 8405, 5, 6121, 4530,
+ 7089, 9063, 8405, 5, 6121, 6378,
+ 7089, 9063, 8405, 5, 6121, 6546,
+ 7089, 9063, 8405, 5, 6121, 8758,
+ 7089, 9063, 8405, 5, 6121, 9072,
+ 7089, 9063, 8405, 5, 6121, 9073, 721, 6378,
+ 7089, 9063, 8405, 5, 6121, 11448,
+ 7089, 9063, 8405, 6,
+ 7089, 9063, 8405, 7, 6121, 1045, 6376,
+ 7089, 9063, 8405, 7, 6121, 1045, 6490,
+ 7089, 9063, 8405, 7, 6121, 4530,
+ 7089, 9063, 8405, 7, 6121, 4877, 6490,
+ 7089, 9063, 8405, 7, 6121, 6546,
+ 7089, 9063, 8405, 7, 6121, 7593, 8405, 50,
+ 7089, 9063, 8405, 7, 6121, 7593, 8405, 51, 6121, 6546,
+ 7089, 9063, 8405, 7, 6121, 8758,
+ 7089, 9063, 8405, 7, 6121, 8846,
+ 7089, 9063, 8405, 7, 6121, 9072,
+ 7089, 9063, 8405, 7, 6121, 11449, 6490,
+ 7089, 9063, 8405, 8,
+ 7089, 9063, 8405, 9, 6121, 1045, 6376,
+ 7089, 9063, 8405, 9, 6121, 1045, 6490,
+ 7089, 9063, 8405, 9, 6121, 4531, 6376,
+ 7089, 9063, 8405, 9, 6121, 6378,
+ 7089, 9063, 8405, 9, 6121, 6516,
+ 7089, 9063, 8405, 9, 6121, 6546,
+ 7089, 9063, 8405, 9, 6121, 6874,
+ 7089, 9063, 8405, 9, 6121, 7708,
+ 7089, 9063, 8405, 9, 6121, 7709, 6490,
+ 7089, 9063, 8405, 9, 6121, 8153, 6874,
+ 7089, 9063, 8405, 9, 6121, 8432,
+ 7089, 9063, 8405, 9, 6121, 8433, 721, 6378,
+ 7089, 9063, 8405, 9, 6121, 8433, 721, 6874,
+ 7089, 9063, 8405, 9, 6121, 8534,
+ 7089, 9063, 8405, 9, 6121, 8758,
+ 7089, 9063, 8405, 9, 6121, 9072,
+ 7089, 9063, 8405, 9, 6121, 9073, 721, 6516,
+ 7089, 9063, 8405, 9, 6121, 10267, 6516,
+ 7089, 9063, 8405, 9, 6121, 10804,
+ 7089, 9063, 8405, 9, 6121, 11448,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 9, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 9, 6121, 11449, 6490,
+ 7089, 9063, 8405, 10,
+ 7089, 9063, 8405, 11, 6121, 1045, 6376,
+ 7089, 9063, 8405, 11, 6121, 4530,
+ 7089, 9063, 8405, 12,
+ 7089, 9063, 8405, 13, 6121, 1045, 6376,
+ 7089, 9063, 8405, 13, 6121, 4530,
+ 7089, 9063, 8405, 13, 6121, 6378,
+ 7089, 9063, 8405, 13, 6121, 6516,
+ 7089, 9063, 8405, 13, 6121, 6546,
+ 7089, 9063, 8405, 13, 6121, 8432,
+ 7089, 9063, 8405, 13, 6121, 8758,
+ 7089, 9063, 8405, 13, 6121, 9072,
+ 7089, 9063, 8405, 13, 6121, 11448,
+ 7089, 9063, 8405, 14,
+ 7089, 9063, 8405, 15, 6121, 1045, 6376,
+ 7089, 9063, 8405, 15, 6121, 1045, 6490,
+ 7089, 9063, 8405, 15, 6121, 6517, 6490,
+ 7089, 9063, 8405, 15, 6121, 6546,
+ 7089, 9063, 8405, 15, 6121, 8758,
+ 7089, 9063, 8405, 15, 6121, 9072,
+ 7089, 9063, 8405, 15, 6121, 10802,
+ 7089, 9063, 8405, 15, 6121, 10804,
+ 7089, 9063, 8405, 15, 6121, 11448,
+ 7089, 9063, 8405, 16,
+ 7089, 9063, 8405, 17, 6121, 1045, 6376,
+ 7089, 9063, 8405, 17, 6121, 1045, 6490,
+ 7089, 9063, 8405, 17, 6121, 4531, 6376,
+ 7089, 9063, 8405, 17, 6121, 6378,
+ 7089, 9063, 8405, 17, 6121, 6516,
+ 7089, 9063, 8405, 17, 6121, 6546,
+ 7089, 9063, 8405, 17, 6121, 6874,
+ 7089, 9063, 8405, 17, 6121, 7708,
+ 7089, 9063, 8405, 17, 6121, 7709, 6490,
+ 7089, 9063, 8405, 17, 6121, 8153, 6874,
+ 7089, 9063, 8405, 17, 6121, 8432,
+ 7089, 9063, 8405, 17, 6121, 8534,
+ 7089, 9063, 8405, 17, 6121, 8758,
+ 7089, 9063, 8405, 17, 6121, 10267, 6516,
+ 7089, 9063, 8405, 17, 6121, 10804,
+ 7089, 9063, 8405, 17, 6121, 10805, 721, 6378,
+ 7089, 9063, 8405, 17, 6121, 11448,
+ 7089, 9063, 8405, 18,
+ 7089, 9063, 8405, 19, 6121, 8758,
+ 7089, 9063, 8405, 19, 6121, 11448,
+ 7089, 9063, 8405, 20,
+ 7089, 9063, 8405, 21, 6121, 1045, 6490,
+ 7089, 9063, 8405, 21, 6121, 4530,
+ 7089, 9063, 8405, 21, 6121, 4877, 6490,
+ 7089, 9063, 8405, 21, 6121, 6378,
+ 7089, 9063, 8405, 21, 6121, 6546,
+ 7089, 9063, 8405, 21, 6121, 8758,
+ 7089, 9063, 8405, 21, 6121, 8759, 721, 10001, 8758,
+ 7089, 9063, 8405, 21, 6121, 9072,
+ 7089, 9063, 8405, 21, 6121, 10001, 8758,
+ 7089, 9063, 8405, 21, 6121, 10802,
+ 7089, 9063, 8405, 22,
+ 7089, 9063, 8405, 23, 6121, 760,
+ 7089, 9063, 8405, 23, 6121, 1045, 6490,
+ 7089, 9063, 8405, 23, 6121, 1045, 6491, 721, 8432,
+ 7089, 9063, 8405, 23, 6121, 4423, 8758,
+ 7089, 9063, 8405, 23, 6121, 4877, 6490,
+ 7089, 9063, 8405, 23, 6121, 6378,
+ 7089, 9063, 8405, 23, 6121, 6546,
+ 7089, 9063, 8405, 23, 6121, 7593, 8405, 18,
+ 7089, 9063, 8405, 23, 6121, 8153, 760,
+ 7089, 9063, 8405, 23, 6121, 8473, 1044,
+ 7089, 9063, 8405, 23, 6121, 8473, 7708,
+ 7089, 9063, 8405, 23, 6121, 8758,
+ 7089, 9063, 8405, 23, 6121, 9072,
+ 7089, 9063, 8405, 23, 6121, 11449, 6490,
+ 7089, 9063, 8405, 24,
+ 7089, 9063, 8405, 25, 6121, 1045, 6376,
+ 7089, 9063, 8405, 25, 6121, 1045, 6490,
+ 7089, 9063, 8405, 25, 6121, 4530,
+ 7089, 9063, 8405, 25, 6121, 6378,
+ 7089, 9063, 8405, 26,
+ 7089, 9063, 8405, 27, 6121, 1045, 6376,
+ 7089, 9063, 8405, 27, 6121, 1045, 6490,
+ 7089, 9063, 8405, 27, 6121, 4849, 4530,
+ 7089, 9063, 8405, 27, 6121, 4877, 6490,
+ 7089, 9063, 8405, 27, 6121, 4895, 7443, 1760,
+ 7089, 9063, 8405, 27, 6121, 6378,
+ 7089, 9063, 8405, 27, 6121, 6546,
+ 7089, 9063, 8405, 27, 6121, 6874,
+ 7089, 9063, 8405, 27, 6121, 7593, 8405, 18,
+ 7089, 9063, 8405, 27, 6121, 7708,
+ 7089, 9063, 8405, 27, 6121, 9072,
+ 7089, 9063, 8405, 27, 6121, 11449, 6490,
+ 7089, 9063, 8405, 28,
+ 7089, 9063, 8405, 29, 6121, 1045, 6376,
+ 7089, 9063, 8405, 29, 6121, 1045, 6377, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 4536,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 4537, 721, 7708,
+ 7089, 9063, 8405, 29, 6121, 4895, 8759, 9548,
+ 7089, 9063, 8405, 29, 6121, 4896,
+ 7089, 9063, 8405, 29, 6121, 6378,
+ 7089, 9063, 8405, 29, 6121, 6516,
+ 7089, 9063, 8405, 29, 6121, 6546,
+ 7089, 9063, 8405, 29, 6121, 6874,
+ 7089, 9063, 8405, 29, 6121, 7708,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 7709, 721, 10804,
+ 7089, 9063, 8405, 29, 6121, 8153, 6378,
+ 7089, 9063, 8405, 29, 6121, 8153, 6874,
+ 7089, 9063, 8405, 29, 6121, 8432,
+ 7089, 9063, 8405, 29, 6121, 8433, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 8433, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 8473, 7708,
+ 7089, 9063, 8405, 29, 6121, 8534,
+ 7089, 9063, 8405, 29, 6121, 8535, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 8758,
+ 7089, 9063, 8405, 29, 6121, 8759, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 10267, 6516,
+ 7089, 9063, 8405, 29, 6121, 10804,
+ 7089, 9063, 8405, 29, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 29, 6121, 11448,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 1045, 6490,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 4531, 6376,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 6378,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 6874,
+ 7089, 9063, 8405, 29, 6121, 11449, 721, 7708,
+ 7089, 9063, 8405, 30,
+ 7089, 9063, 8405, 31, 6121, 1045, 6376,
+ 7089, 9063, 8405, 31, 6121, 4530,
+ 7089, 9063, 8405, 31, 6121, 6378,
+ 7089, 9063, 8405, 31, 6121, 8758,
+ 7089, 9063, 8405, 31, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 31, 6121, 10196,
+ 7089, 9063, 8405, 31, 6121, 10533, 5878,
+ 7089, 9063, 8405, 32,
+ 7089, 9063, 8405, 33, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 33, 6121, 10001, 8758,
+ 7089, 9063, 8405, 34,
+ 7089, 9063, 8405, 35, 6121, 1045, 6376,
+ 7089, 9063, 8405, 35, 6121, 1045, 6490,
+ 7089, 9063, 8405, 35, 6121, 1045, 6491, 721, 8432,
+ 7089, 9063, 8405, 35, 6121, 4877, 6490,
+ 7089, 9063, 8405, 35, 6121, 5878,
+ 7089, 9063, 8405, 35, 6121, 6378,
+ 7089, 9063, 8405, 35, 6121, 6546,
+ 7089, 9063, 8405, 35, 6121, 8153, 6874,
+ 7089, 9063, 8405, 35, 6121, 8758,
+ 7089, 9063, 8405, 35, 6121, 9072,
+ 7089, 9063, 8405, 35, 6121, 10267, 6516,
+ 7089, 9063, 8405, 35, 9642,
+ 7089, 9063, 8405, 36,
+ 7089, 9063, 8405, 37, 6121, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 1045, 6490,
+ 7089, 9063, 8405, 37, 6121, 1045, 6491, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6378,
+ 7089, 9063, 8405, 37, 6121, 6379, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6546,
+ 7089, 9063, 8405, 37, 6121, 6547, 721, 1045, 6376,
+ 7089, 9063, 8405, 37, 6121, 6617, 6490,
+ 7089, 9063, 8405, 37, 6121, 9072,
+ 7089, 9063, 8405, 37, 6121, 11448,
+ 7089, 9063, 8405, 38,
+ 7089, 9063, 8405, 39, 6121, 1045, 6376,
+ 7089, 9063, 8405, 39, 6121, 1045, 6490,
+ 7089, 9063, 8405, 39, 6121, 4530,
+ 7089, 9063, 8405, 39, 6121, 4877, 6490,
+ 7089, 9063, 8405, 39, 6121, 6546,
+ 7089, 9063, 8405, 39, 6121, 6617, 6490,
+ 7089, 9063, 8405, 39, 6121, 8758,
+ 7089, 9063, 8405, 39, 6121, 9072,
+ 7089, 9063, 8405, 39, 6121, 10001, 8758,
+ 7089, 9063, 8405, 39, 6121, 11215, 4530,
+ 7089, 9063, 8405, 39, 6121, 11449, 6490,
+ 7089, 9063, 8405, 40,
+ 7089, 9063, 8405, 41, 760,
+ 7089, 9063, 8405, 41, 6121, 1045, 6490,
+ 7089, 9063, 8405, 41, 6121, 4531, 6376,
+ 7089, 9063, 8405, 41, 6121, 4536,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 1045, 6490,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 4531, 6376,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 6874,
+ 7089, 9063, 8405, 41, 6121, 4537, 721, 7708,
+ 7089, 9063, 8405, 41, 6121, 5551, 6376,
+ 7089, 9063, 8405, 41, 6121, 6378,
+ 7089, 9063, 8405, 41, 6121, 6516,
+ 7089, 9063, 8405, 41, 6121, 6546,
+ 7089, 9063, 8405, 41, 6121, 6874,
+ 7089, 9063, 8405, 41, 6121, 7708,
+ 7089, 9063, 8405, 41, 6121, 7709, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 7709, 6490,
+ 7089, 9063, 8405, 41, 6121, 8153, 6378,
+ 7089, 9063, 8405, 41, 6121, 8153, 6874,
+ 7089, 9063, 8405, 41, 6121, 8432,
+ 7089, 9063, 8405, 41, 6121, 8433, 721, 10804,
+ 7089, 9063, 8405, 41, 6121, 8534,
+ 7089, 9063, 8405, 41, 6121, 10267, 6516,
+ 7089, 9063, 8405, 41, 6121, 10804,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6378,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6546,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 6874,
+ 7089, 9063, 8405, 41, 6121, 10805, 721, 8432,
+ 7089, 9063, 8405, 41, 6121, 10805, 6490,
+ 7089, 9063, 8405, 41, 6121, 11448,
+ 7089, 9063, 8405, 41, 6121, 11449, 6490,
+ 7089, 9063, 8405, 42,
+ 7089, 9063, 8405, 43, 6121, 1045, 6490,
+ 7089, 9063, 8405, 43, 6121, 4530,
+ 7089, 9063, 8405, 43, 6121, 7708,
+ 7089, 9063, 8405, 43, 6121, 10001, 8758,
+ 7089, 9063, 8405, 44,
+ 7089, 9063, 8405, 45, 6121, 1045, 6376,
+ 7089, 9063, 8405, 45, 6121, 1045, 6490,
+ 7089, 9063, 8405, 45, 6121, 4530,
+ 7089, 9063, 8405, 45, 6121, 6378,
+ 7089, 9063, 8405, 45, 6121, 6874,
+ 7089, 9063, 8405, 45, 6121, 10804,
+ 7089, 9063, 8405, 45, 6121, 11448,
+ 7089, 9063, 8405, 46,
+ 7089, 9063, 8405, 47, 6121, 1045, 6376,
+ 7089, 9063, 8405, 47, 6121, 10804,
+ 7089, 9063, 8405, 48,
+ 7089, 9063, 8405, 49, 6121, 1045, 6376,
+ 7089, 9063, 8405, 49, 6121, 1045, 6490,
+ 7089, 9063, 8405, 49, 6121, 4530,
+ 7089, 9063, 8405, 49, 6121, 4531, 6376,
+ 7089, 9063, 8405, 49, 6121, 4896,
+ 7089, 9063, 8405, 49, 6121, 6378,
+ 7089, 9063, 8405, 49, 6121, 6874,
+ 7089, 9063, 8405, 49, 6121, 7708,
+ 7089, 9063, 8405, 49, 6121, 8432,
+ 7089, 9063, 8405, 49, 6121, 8758,
+ 7089, 9063, 8405, 49, 6121, 10804,
+ 7089, 9063, 8405, 49, 6121, 11448,
+ 7089, 9063, 8405, 50,
+ 7089, 9063, 8405, 51, 6121, 1045, 6376,
+ 7089, 9063, 8405, 51, 6121, 1045, 6490,
+ 7089, 9063, 8405, 51, 6121, 4530,
+ 7089, 9063, 8405, 51, 6121, 4877, 6490,
+ 7089, 9063, 8405, 51, 6121, 6378,
+ 7089, 9063, 8405, 51, 6121, 6546,
+ 7089, 9063, 8405, 51, 6121, 8758,
+ 7089, 9063, 8405, 51, 6121, 10802,
+ 7089, 9063, 8405, 51, 6121, 11448,
+ 7089, 9063, 8405, 58,
+ 7089, 9063, 8405, 66,
+ 7089, 9063, 8405, 67, 6121, 6378,
+ 7089, 9063, 8405, 67, 6121, 8432,
+ 7089, 9063, 8405, 82,
+ 7089, 9063, 8405, 92,
+ 7089, 9063, 8405, 94,
+ 7089, 9063, 8405, 95, 6121, 11649, 760,
+ 7089, 9063, 8405, 98,
+ 7089, 9063, 8405, 156,
+ 7089, 9063, 8405, 157, 6121, 6546,
+ 7089, 9063, 8405, 186,
+ 7089, 9063, 8405, 282,
+ 7089, 9063, 8405, 342,
+ 7089, 9063, 8405, 406,
+ 7089, 9063, 8405, 432,
+ 7089, 9063, 8405, 440,
+ 7089, 9063, 8405, 450,
+ 7089, 9063, 8405, 578,
+ 7089, 9063, 8405, 620,
+ 7089, 9063, 8405, 912,
+ 7089, 9063, 8405, 1110,
+ 7089, 9063, 8405, 1124,
+ 7089, 9063, 8405, 1130,
+ 7089, 9063, 8405, 1138,
+ 7089, 9063, 8405, 1139, 6121, 6546,
+ 7089, 9063, 8405, 1139, 10488,
+ 7089, 9063, 8405, 2453, 9642,
+ 7089, 9063, 8405, 4389, 14,
+ 7089, 9063, 8405, 4404,
+ 7089, 9063, 8405, 4614,
+ 7089, 9063, 8405, 5385, 8,
+ 7089, 9063, 8405, 5385, 28,
+ 7089, 9063, 8405, 5965, 2540,
+ 7089, 9063, 8405, 5965, 2778,
+ 7089, 9063, 8405, 5965, 4200,
+ 7089, 9063, 8405, 6078,
+ 7089, 9063, 8405, 6138,
+ 7089, 9063, 8405, 6220,
+ 7089, 9063, 8405, 6406,
+ 7089, 9063, 8405, 6824,
+ 7089, 9063, 8405, 6960,
+ 7089, 9063, 8405, 7494,
+ 7089, 9063, 8405, 7519, 36,
+ 7089, 9063, 8405, 7593, 33, 6121, 4531, 5878,
+ 7089, 9063, 8405, 7692,
+ 7089, 9063, 8405, 7693, 6121, 8758,
+ 7089, 9063, 8405, 7693, 6121, 8759, 9785, 10802,
+ 7089, 9063, 8405, 8017, 22,
+ 7089, 9063, 8405, 8869, 0,
+ 7089, 9063, 8405, 8869, 22,
+ 7089, 9063, 8405, 8869, 24,
+ 7089, 9063, 8405, 8869, 42,
+ 7089, 9063, 8405, 8869, 9365, 12,
+ 7089, 9063, 8405, 8983, 6,
+ 7089, 9063, 8405, 9313, 5836,
+ 7089, 9063, 8405, 9365, 6,
+ 7089, 9063, 8405, 9365, 10,
+ 7089, 9063, 8405, 9365, 12,
+ 7089, 9063, 8405, 9365, 34,
+ 7089, 9063, 8405, 9365, 36,
+ 7089, 9063, 8405, 9365, 38,
+ 7089, 9063, 8405, 9808,
+ 7089, 9063, 8405, 10489, 5, 6121, 1044,
+ 7089, 9063, 8405, 10489, 8,
+ 7089, 9063, 8405, 10494,
+ 7089, 9063, 8405, 10640,
+ 7089, 9063, 8405, 10786,
+ 7089, 9063, 8405, 10787, 6121, 6616,
+ 7089, 9063, 8405, 11879, 50,
+ 7089, 9063, 8405, 12507, 42,
+ 7089, 9063, 8405, 12507, 344,
+ 7089, 9063, 8405, 12935, 710,
+ 7089, 9063, 8405, 12935, 3244,
+ 7089, 9063, 10301, 268,
+ 7089, 9063, 10301, 426,
+ 7089, 11261, 7593, 8405, 0,
+ 7089, 11261, 7593, 8405, 8,
+ 7089, 11261, 7593, 8405, 16,
+ 7089, 11261, 7593, 8405, 18,
+ 7089, 11261, 7593, 8405, 28,
+ 7089, 11261, 7593, 8405, 34,
+ 7089, 11261, 7593, 8405, 40,
+ 7089, 11261, 7593, 8405, 42,
+ 7089, 11261, 7593, 8405, 46,
+ 7089, 11261, 7593, 8405, 7494,
+ 7089, 11619, 8405, 17, 7112,
+ 7089, 11619, 8405, 9007, 24,
+ 7089, 11619, 8405, 10267, 24,
+ 7089, 11619, 8405, 10489, 10,
+ 7089, 11619, 8405, 10489, 30,
+ 7098,
+ 7101, 4849, 10637, 7533, 9051, 10380,
+ 7101, 7443, 10637, 7533, 9051, 10380,
+ 7101, 7512,
+ 7101, 10677, 760,
+ 7103, 5759, 1802,
+ 7103, 5759, 5620,
+ 7103, 5759, 11076,
+ 7103, 5759, 11130,
+ 7103, 6689, 2170,
+ 7103, 6689, 2540,
+ 7103, 6689, 2778,
+ 7103, 6689, 4200,
+ 7103, 6689, 4214,
+ 7103, 6689, 5190,
+ 7103, 6689, 6260,
+ 7103, 6689, 6722,
+ 7103, 6689, 7508,
+ 7103, 6689, 7694,
+ 7103, 7593, 8405, 306,
+ 7103, 7593, 8405, 332,
+ 7103, 7593, 8405, 364,
+ 7103, 7593, 8405, 392,
+ 7103, 7593, 8405, 462,
+ 7103, 7593, 8405, 510,
+ 7103, 7593, 8405, 556,
+ 7103, 7593, 8405, 2030,
+ 7103, 7593, 8405, 9870,
+ 7103, 7803, 5759, 0,
+ 7103, 7803, 5759, 8,
+ 7103, 7803, 5759, 16,
+ 7103, 7803, 5759, 28,
+ 7103, 7803, 5759, 40,
+ 7103, 7803, 5759, 72,
+ 7103, 7803, 5759, 92,
+ 7103, 7803, 5759, 162,
+ 7103, 7803, 5759, 440,
+ 7103, 8405, 100,
+ 7103, 8405, 116,
+ 7103, 8405, 138,
+ 7103, 8405, 216,
+ 7103, 8405, 236,
+ 7103, 8405, 292,
+ 7103, 8405, 306,
+ 7103, 8405, 332,
+ 7103, 8405, 364,
+ 7103, 8405, 392,
+ 7103, 8405, 462,
+ 7103, 8405, 510,
+ 7103, 8405, 524,
+ 7103, 8405, 556,
+ 7103, 8405, 622,
+ 7103, 8405, 652,
+ 7103, 8405, 792,
+ 7103, 8405, 884,
+ 7103, 8405, 996,
+ 7103, 8405, 1260,
+ 7103, 8405, 1512,
+ 7103, 8405, 1612,
+ 7103, 8405, 2030,
+ 7103, 8405, 2212,
+ 7103, 8405, 2516,
+ 7103, 8405, 2566,
+ 7103, 8405, 2678,
+ 7103, 8405, 3028,
+ 7103, 10469, 4926,
+ 7103, 11257, 8405, 510,
+ 7103, 11257, 8405, 622,
+ 7103, 11257, 8405, 652,
+ 7103, 12017, 4926,
+ 7103, 13033, 8404,
+ 7121, 2171, 8159, 6510,
+ 7121, 2171, 9615, 6510,
+ 7121, 4201, 9259, 6510,
+ 7121, 4389, 6510,
+ 7121, 4389, 8056,
+ 7121, 4389, 9367, 7821, 8056,
+ 7121, 4849, 10465, 9947, 730,
+ 7121, 4849, 10642,
+ 7121, 4849, 12857, 12901, 6434,
+ 7121, 6507, 10502,
+ 7121, 7443, 8077, 6121, 1044,
+ 7121, 7443, 8570,
+ 7121, 7443, 10465, 9947, 730,
+ 7121, 7443, 10513, 7821, 8744,
+ 7121, 7443, 10642,
+ 7121, 7443, 12857, 10763, 6434,
+ 7121, 7443, 12933, 7821, 8744,
+ 7121, 7509, 9259, 6510,
+ 7121, 7695, 9259, 6510,
+ 7121, 7695, 10467, 6510,
+ 7165, 5758,
+ 7173, 5758,
+ 7173, 5759, 275, 10642,
+ 7173, 5759, 6121, 1045, 6490,
+ 7173, 5759, 6121, 6617, 6376,
+ 7173, 5759, 6121, 8649, 4112,
+ 7173, 5759, 6121, 9279, 4112,
+ 7173, 7708,
+ 7199, 4205, 5758,
+ 7199, 7519, 5758,
+ 7199, 9491, 5758,
+ 7201, 7711, 10374,
+ 7201, 7768,
+ 7201, 7769, 10375, 6121, 1044,
+ 7201, 7769, 10375, 6121, 5444,
+ 7201, 7821, 10677, 760,
+ 7201, 8745, 7769, 10374,
+ 7201, 8745, 12493, 10374,
+ 7201, 9095, 1045, 10374,
+ 7201, 9095, 5445, 10374,
+ 7201, 9095, 7711, 10374,
+ 7201, 9437, 444,
+ 7201, 9437, 720,
+ 7201, 9610,
+ 7201, 10780,
+ 7201, 11262,
+ 7201, 12492,
+ 7202,
+ 7209, 5758,
+ 7271, 4153, 721, 7607, 6113, 6434,
+ 7271, 4153, 6434,
+ 7271, 4153, 6435, 721, 7607, 4153, 6434,
+ 7271, 4153, 6435, 6121, 4530,
+ 7271, 4153, 6435, 9967, 7271, 6113, 6434,
+ 7271, 4153, 6435, 9967, 7607, 4153, 6434,
+ 7271, 4153, 6505, 6434,
+ 7271, 4153, 7821, 6434,
+ 7271, 4153, 8153, 6434,
+ 7271, 6113, 721, 7607, 4153, 6434,
+ 7271, 6113, 6434,
+ 7271, 6113, 6435, 569, 4895, 760,
+ 7271, 6113, 6435, 569, 8076,
+ 7271, 6113, 6435, 721, 7271, 4153, 6434,
+ 7271, 6113, 6435, 6121, 4530,
+ 7271, 6113, 6435, 9967, 7271, 4153, 6434,
+ 7271, 6113, 6505, 6434,
+ 7271, 6113, 7821, 6434,
+ 7271, 6113, 8153, 6434,
+ 7309, 7609, 4926,
+ 7309, 8405, 444,
+ 7309, 8405, 602,
+ 7309, 8405, 2174,
+ 7309, 8405, 3236,
+ 7309, 8405, 3952,
+ 7309, 8405, 3982,
+ 7309, 8405, 4348,
+ 7309, 8405, 4600,
+ 7309, 8405, 4900,
+ 7309, 8405, 5018,
+ 7309, 8405, 5192,
+ 7309, 8405, 5604,
+ 7309, 8405, 5628,
+ 7309, 8405, 6044,
+ 7309, 8405, 6488,
+ 7309, 8405, 6558,
+ 7309, 8405, 6774,
+ 7309, 8405, 7356,
+ 7309, 8405, 7712,
+ 7309, 8405, 8752,
+ 7309, 8405, 9246,
+ 7309, 8405, 9248,
+ 7309, 8405, 9368,
+ 7309, 8405, 9504,
+ 7309, 8405, 10662,
+ 7309, 8405, 12008,
+ 7309, 9283, 4926,
+ 7309, 10489, 9283, 4926,
+ 7321, 73, 8399, 4926,
+ 7321, 93, 8399, 4926,
+ 7321, 5759, 7282,
+ 7321, 5759, 8916,
+ 7321, 5759, 9824,
+ 7321, 5759, 9870,
+ 7321, 5759, 9904,
+ 7321, 5759, 11900,
+ 7321, 6689, 2170,
+ 7321, 6689, 2540,
+ 7321, 6689, 2778,
+ 7321, 6689, 4200,
+ 7321, 6689, 4214,
+ 7321, 6689, 5190,
+ 7321, 6689, 6260,
+ 7321, 6689, 6722,
+ 7321, 6689, 7508,
+ 7321, 6689, 7694,
+ 7321, 7803, 5759, 8,
+ 7321, 7803, 5759, 16,
+ 7321, 7803, 5759, 28,
+ 7321, 7803, 5759, 40,
+ 7321, 7803, 5759, 58,
+ 7321, 7803, 5759, 72,
+ 7321, 7803, 5759, 92,
+ 7321, 7803, 5759, 266,
+ 7321, 7803, 5759, 606,
+ 7321, 7803, 5759, 9827, 22,
+ 7321, 7803, 5759, 9827, 34,
+ 7321, 7803, 5759, 9827, 344,
+ 7321, 7803, 5759, 9827, 518,
+ 7321, 8322,
+ 7321, 8405, 0,
+ 7321, 8405, 8,
+ 7321, 8405, 16,
+ 7321, 8405, 28,
+ 7321, 8405, 40,
+ 7321, 8405, 58,
+ 7321, 8405, 72,
+ 7321, 8405, 92,
+ 7321, 8405, 100,
+ 7321, 8405, 116,
+ 7321, 8405, 138,
+ 7321, 8405, 216,
+ 7321, 8405, 236,
+ 7321, 8405, 266,
+ 7321, 8405, 292,
+ 7321, 8405, 306,
+ 7321, 8405, 332,
+ 7321, 8405, 364,
+ 7321, 8405, 392,
+ 7321, 8405, 462,
+ 7321, 8405, 510,
+ 7321, 8405, 524,
+ 7321, 8405, 556,
+ 7321, 8405, 606,
+ 7321, 8405, 610,
+ 7321, 8405, 622,
+ 7321, 8405, 652,
+ 7321, 8405, 792,
+ 7321, 8405, 884,
+ 7321, 8405, 974,
+ 7321, 8405, 996,
+ 7321, 8405, 1260,
+ 7321, 8405, 1512,
+ 7321, 8405, 1612,
+ 7321, 8405, 1796,
+ 7321, 8405, 2030,
+ 7321, 8405, 2076,
+ 7321, 8405, 2126,
+ 7321, 8405, 2212,
+ 7321, 8405, 2410,
+ 7321, 8405, 2438,
+ 7321, 8405, 2516,
+ 7321, 8405, 2566,
+ 7321, 8405, 2678,
+ 7321, 8405, 2746,
+ 7321, 8405, 3110,
+ 7321, 8405, 4016,
+ 7321, 8405, 5994,
+ 7321, 8405, 9827, 22,
+ 7321, 8405, 9827, 34,
+ 7321, 8405, 9827, 344,
+ 7321, 8405, 9827, 518,
+ 7325, 5758,
+ 7349, 8774,
+ 7377, 429, 10263, 5758,
+ 7380,
+ 7387, 5758,
+ 7390,
+ 7393, 8677, 8774,
+ 7424,
+ 7443, 731, 12473, 9050,
+ 7443, 1809, 11715, 9050,
+ 7443, 2171, 8159, 6510,
+ 7443, 4197, 5878,
+ 7443, 4389, 6505, 8056,
+ 7443, 4389, 6510,
+ 7443, 5876,
+ 7443, 6408,
+ 7443, 6409, 6121, 730,
+ 7443, 6409, 6121, 10959, 8963, 6434,
+ 7443, 6409, 8151, 12877, 8450,
+ 7443, 6409, 9050,
+ 7443, 6409, 9051, 6121, 1044,
+ 7443, 6409, 9817, 6121, 8744,
+ 7443, 6409, 12877, 8450,
+ 7443, 6435, 6121, 7593, 8056,
+ 7443, 6435, 6121, 9095, 5444,
+ 7443, 6505, 10637, 7533, 9050,
+ 7443, 6505, 11677, 9050,
+ 7443, 6627, 9050,
+ 7443, 6627, 9051, 7121, 4530,
+ 7443, 6627, 9051, 7773, 4530,
+ 7443, 6627, 9051, 8473, 7370,
+ 7443, 6792,
+ 7443, 7327, 4676,
+ 7443, 7821, 6627, 9050,
+ 7443, 7821, 8077, 9050,
+ 7443, 7821, 8745, 9050,
+ 7443, 7821, 10637, 7533, 9050,
+ 7443, 7821, 11677, 9050,
+ 7443, 7821, 12114,
+ 7443, 8077, 9050,
+ 7443, 8151, 12877, 9050,
+ 7443, 8153, 6409, 9050,
+ 7443, 8153, 6435, 6121, 9645, 4398,
+ 7443, 8153, 8933, 6778,
+ 7443, 8153, 11195, 4926,
+ 7443, 8153, 12114,
+ 7443, 8521, 8191, 11793, 9610,
+ 7443, 8631, 10371, 9050,
+ 7443, 8717, 11195, 4926,
+ 7443, 8745, 9050,
+ 7443, 8745, 9051, 6121, 5935, 275, 2725, 8076,
+ 7443, 8745, 9051, 6121, 5935, 275, 8005, 8076,
+ 7443, 8745, 9051, 6121, 7412,
+ 7443, 8745, 9051, 6121, 10666,
+ 7443, 8745, 9051, 7121, 8076,
+ 7443, 8745, 9051, 7773, 8076,
+ 7443, 8745, 9051, 10982,
+ 7443, 8933, 6778,
+ 7443, 9074,
+ 7443, 10493, 753, 10794,
+ 7443, 10523, 41, 9050,
+ 7443, 10637, 7533, 9050,
+ 7443, 10642,
+ 7443, 10643, 6377, 4849, 10642,
+ 7443, 10677, 761, 6121, 7412,
+ 7443, 10677, 827, 4876,
+ 7443, 11793, 9610,
+ 7443, 12114,
+ 7443, 12115, 7121, 4530,
+ 7443, 12115, 7773, 4530,
+ 7443, 12115, 10982,
+ 7443, 12877, 9050,
+ 7443, 13029, 9050,
+ 7453, 89, 5758,
+ 7453, 7765, 5758,
+ 7453, 9167, 9679, 5758,
+ 7453, 9513, 2170,
+ 7453, 9513, 2171, 9344,
+ 7453, 9513, 2171, 9345, 10624,
+ 7453, 9513, 2171, 10624,
+ 7453, 9513, 2171, 10625, 5, 6,
+ 7453, 9513, 2540,
+ 7453, 9513, 2541, 4839, 4212,
+ 7453, 9513, 2670,
+ 7453, 9513, 2671, 10624,
+ 7453, 9513, 2778,
+ 7453, 9513, 4200,
+ 7453, 9513, 4201, 9344,
+ 7453, 9513, 4201, 10624,
+ 7453, 9513, 4214,
+ 7453, 9513, 5190,
+ 7453, 9513, 6722,
+ 7453, 9513, 6784,
+ 7453, 9513, 6785, 6715, 4212,
+ 7453, 9513, 6785, 10624,
+ 7453, 9513, 7508,
+ 7453, 9513, 7694,
+ 7453, 9513, 8162,
+ 7453, 9513, 8874,
+ 7453, 9513, 10489, 2171, 9344,
+ 7453, 9675, 5758,
+ 7453, 9679, 5758,
+ 7453, 9691, 5758,
+ 7453, 9995, 5758,
+ 7453, 10511, 5758,
+ 7453, 10757, 5758,
+ 7453, 10961, 5758,
+ 7453, 11193, 5758,
+ 7453, 11797, 5758,
+ 7467, 6623, 12132,
+ 7467, 7935, 8774,
+ 7467, 8405, 4,
+ 7467, 8405, 6,
+ 7467, 8405, 8,
+ 7467, 8405, 12,
+ 7467, 8405, 28,
+ 7467, 8405, 32,
+ 7467, 8405, 42,
+ 7467, 8405, 44,
+ 7467, 8405, 46,
+ 7467, 8405, 48,
+ 7467, 8405, 50,
+ 7467, 8405, 63, 0,
+ 7467, 8405, 426,
+ 7467, 8405, 438,
+ 7467, 8405, 447, 28,
+ 7467, 8405, 662,
+ 7467, 8405, 878,
+ 7467, 8405, 1090,
+ 7467, 8405, 1110,
+ 7467, 8405, 1130,
+ 7467, 8405, 1220,
+ 7467, 8405, 1244,
+ 7467, 8405, 1486,
+ 7467, 8405, 1494,
+ 7467, 8405, 3230,
+ 7467, 8405, 3840,
+ 7467, 8405, 4185, 4189, 199, 10,
+ 7467, 8405, 4265, 4381, 12,
+ 7467, 8405, 4617, 283, 1501, 16,
+ 7467, 8405, 4625, 1114,
+ 7467, 8405, 4731, 20,
+ 7467, 8405, 5828,
+ 7467, 8405, 6059, 603, 40,
+ 7467, 8405, 6401, 6738,
+ 7467, 8405, 6415, 0,
+ 7467, 8405, 6554,
+ 7467, 8405, 6635, 3979, 6,
+ 7467, 8405, 6721, 167, 8,
+ 7467, 8405, 6891, 14,
+ 7467, 8405, 6997, 18,
+ 7467, 8405, 7028,
+ 7467, 8405, 7419, 2383, 5533, 34,
+ 7467, 8405, 7567, 13213, 36,
+ 7467, 8405, 7719, 2699, 2789, 38,
+ 7467, 8405, 7835, 6139, 44,
+ 7467, 8405, 8283, 14,
+ 7467, 8405, 8312,
+ 7467, 8405, 8391, 4829, 4891, 22,
+ 7467, 8405, 8441, 1861, 24,
+ 7467, 8405, 8501, 2129, 5057, 26,
+ 7467, 8405, 8540,
+ 7467, 8405, 8579, 8575, 30,
+ 7467, 8405, 8727, 36,
+ 7467, 8405, 9132,
+ 7467, 8405, 9543, 6759, 28,
+ 7467, 8405, 9911, 6495, 9047, 2,
+ 7467, 8405, 10132,
+ 7467, 8405, 10134,
+ 7467, 8405, 10136,
+ 7467, 8405, 10627, 7699, 7692,
+ 7467, 8405, 12482,
+ 7467, 8405, 13013, 0,
+ 7467, 8405, 13014,
+ 7467, 8405, 13057, 66,
+ 7467, 8405, 13058,
+ 7467, 8405, 13073, 28,
+ 7467, 8405, 13075, 36,
+ 7467, 8405, 13077, 38,
+ 7467, 8405, 13211, 28,
+ 7467, 8405, 13227, 24,
+ 7467, 8405, 13229, 26,
+ 7467, 8405, 13339, 24,
+ 7467, 8405, 13377, 14,
+ 7467, 8405, 13391, 14,
+ 7467, 8405, 13399, 2,
+ 7467, 8717, 12132,
+ 7467, 9909, 8774,
+ 7467, 10349, 12132,
+ 7467, 10657, 8774,
+ 7469, 5758,
+ 7551, 601, 5876,
+ 7551, 601, 5877, 6121, 10666,
+ 7551, 601, 5877, 6377, 7551, 4117, 5876,
+ 7551, 4117, 5876,
+ 7551, 4117, 5877, 6121, 9546,
+ 7551, 4849, 5876,
+ 7551, 11765, 6435, 6377, 11097, 6434,
+ 7579, 721, 11466,
+ 7588,
+ 7593, 175, 3992,
+ 7593, 2857, 6121, 10666,
+ 7593, 4223, 5836,
+ 7593, 4849, 6627, 9050,
+ 7593, 4849, 10637, 7533, 9050,
+ 7593, 4849, 12114,
+ 7593, 5445, 5758,
+ 7593, 6610,
+ 7593, 6616,
+ 7593, 7443, 6627, 9050,
+ 7593, 7443, 10637, 7533, 9050,
+ 7593, 7443, 12114,
+ 7593, 7453, 9513, 2170,
+ 7593, 7453, 9513, 2171, 9344,
+ 7593, 7453, 9513, 2171, 10624,
+ 7593, 7453, 9513, 2540,
+ 7593, 7453, 9513, 2670,
+ 7593, 7453, 9513, 2778,
+ 7593, 7453, 9513, 4200,
+ 7593, 7453, 9513, 4201, 9344,
+ 7593, 7453, 9513, 4214,
+ 7593, 7453, 9513, 5190,
+ 7593, 7453, 9513, 6722,
+ 7593, 7453, 9513, 6784,
+ 7593, 7453, 9513, 7508,
+ 7593, 7453, 9513, 7694,
+ 7593, 7453, 9513, 8162,
+ 7593, 7453, 9513, 8874,
+ 7593, 7708,
+ 7593, 8129, 5758,
+ 7593, 8167, 5758,
+ 7593, 8525, 5758,
+ 7593, 9263, 428,
+ 7593, 9263, 429, 6121, 9546,
+ 7593, 9263, 429, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 7593, 9581, 5758,
+ 7593, 9633, 9718,
+ 7593, 9898,
+ 7593, 9959, 89, 8466,
+ 7593, 9959, 6121, 9546,
+ 7593, 9959, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 7593, 10469, 4926,
+ 7593, 10708,
+ 7593, 11099, 5758,
+ 7593, 11224,
+ 7593, 11451, 90,
+ 7593, 12017, 4926,
+ 7593, 12043, 6616,
+ 7593, 12473, 5758,
+ 7593, 12478,
+ 7595, 9610,
+ 7598,
+ 7605, 11201, 10782,
+ 7607, 4153, 6434,
+ 7607, 4153, 6435, 569, 8076,
+ 7607, 4153, 6435, 721, 7607, 6113, 6434,
+ 7607, 4153, 6435, 6121, 4530,
+ 7607, 4153, 6435, 9967, 7271, 4153, 6434,
+ 7607, 4153, 6505, 6434,
+ 7607, 4153, 7821, 6434,
+ 7607, 4153, 8153, 6434,
+ 7607, 6113, 6434,
+ 7607, 6113, 6435, 721, 7271, 6113, 6434,
+ 7607, 6113, 6435, 6121, 4530,
+ 7607, 6113, 6505, 6434,
+ 7607, 6113, 7821, 6434,
+ 7607, 6113, 8153, 6434,
+ 7608,
+ 7619, 6505, 11765, 6434,
+ 7627, 429, 8298,
+ 7627, 429, 11886,
+ 7659, 3992,
+ 7665, 89, 6377, 5758,
+ 7665, 93, 8399, 4926,
+ 7665, 436,
+ 7665, 973, 5758,
+ 7665, 5759, 8916,
+ 7665, 5759, 9824,
+ 7665, 5759, 9870,
+ 7665, 6197, 5758,
+ 7665, 6673, 5758,
+ 7665, 6689, 2170,
+ 7665, 6689, 2540,
+ 7665, 6689, 2778,
+ 7665, 6689, 4200,
+ 7665, 6689, 4214,
+ 7665, 6689, 5190,
+ 7665, 6689, 6260,
+ 7665, 6689, 6722,
+ 7665, 6689, 7508,
+ 7665, 6689, 7694,
+ 7665, 7183, 5758,
+ 7665, 7469, 5758,
+ 7665, 7803, 5759, 8,
+ 7665, 7803, 5759, 16,
+ 7665, 7803, 5759, 28,
+ 7665, 7803, 5759, 40,
+ 7665, 7803, 5759, 58,
+ 7665, 7803, 5759, 72,
+ 7665, 7803, 5759, 92,
+ 7665, 7803, 5759, 162,
+ 7665, 7803, 5759, 266,
+ 7665, 7803, 5759, 440,
+ 7665, 7803, 5759, 606,
+ 7665, 8081, 5758,
+ 7665, 8405, 0,
+ 7665, 8405, 8,
+ 7665, 8405, 16,
+ 7665, 8405, 28,
+ 7665, 8405, 40,
+ 7665, 8405, 58,
+ 7665, 8405, 72,
+ 7665, 8405, 92,
+ 7665, 8405, 116,
+ 7665, 8405, 162,
+ 7665, 8405, 236,
+ 7665, 8405, 266,
+ 7665, 8405, 292,
+ 7665, 8405, 306,
+ 7665, 8405, 332,
+ 7665, 8405, 364,
+ 7665, 8405, 392,
+ 7665, 8405, 440,
+ 7665, 8405, 462,
+ 7665, 8405, 510,
+ 7665, 8405, 524,
+ 7665, 8405, 556,
+ 7665, 8405, 606,
+ 7665, 8405, 610,
+ 7665, 8405, 652,
+ 7665, 8405, 1796,
+ 7665, 8405, 2030,
+ 7665, 8405, 2076,
+ 7665, 8405, 2126,
+ 7665, 8405, 2438,
+ 7665, 8405, 2516,
+ 7665, 8405, 2566,
+ 7665, 8405, 2746,
+ 7665, 8405, 4888,
+ 7665, 8405, 5234,
+ 7665, 8525, 2171, 9344,
+ 7665, 8525, 2171, 10624,
+ 7665, 8525, 2670,
+ 7665, 8525, 5758,
+ 7681, 4103, 2091, 6764,
+ 7681, 8174,
+ 7695, 1045, 12132,
+ 7695, 11097, 7944,
+ 7695, 11765, 7944,
+ 7695, 11913, 8167, 7570,
+ 7695, 11943, 6408,
+ 7707, 11861, 11242,
+ 7708,
+ 7709, 6121, 1045, 6376,
+ 7709, 6121, 1045, 6490,
+ 7709, 6121, 5551, 6376,
+ 7709, 10374,
+ 7709, 10375, 6121, 1045, 6376,
+ 7709, 10375, 6121, 8649, 4112,
+ 7709, 10375, 6377, 11097, 6434,
+ 7709, 10375, 6377, 11765, 6434,
+ 7711, 6121, 4849, 4389, 6504,
+ 7711, 6121, 7443, 4389, 6504,
+ 7729, 8654,
+ 7733, 4927, 5758,
+ 7768,
+ 7769, 6121, 7173, 5758,
+ 7769, 6121, 9437, 444,
+ 7769, 6121, 9546,
+ 7769, 6377, 761, 6377, 12492,
+ 7769, 6377, 12492,
+ 7769, 7991, 721, 8329, 6121, 7768,
+ 7773, 2171, 8159, 6510,
+ 7773, 4389, 6510,
+ 7773, 4389, 8056,
+ 7773, 4389, 9367, 7821, 8056,
+ 7773, 4849, 445, 7121, 7443, 6627, 9051, 9664,
+ 7773, 4849, 8077, 6121, 1044,
+ 7773, 4849, 10465, 9947, 730,
+ 7773, 4849, 10642,
+ 7773, 6507, 10502,
+ 7773, 7443, 445, 7121, 4849, 6627, 9051, 9664,
+ 7773, 7443, 8570,
+ 7773, 7443, 10465, 9947, 730,
+ 7773, 7443, 10513, 7821, 8744,
+ 7773, 7443, 10642,
+ 7773, 7443, 12933, 7821, 8744,
+ 7794,
+ 7798,
+ 7810,
+ 7819, 429, 8112,
+ 7821, 601, 10441, 6992,
+ 7821, 2048,
+ 7821, 2587, 6121, 5528,
+ 7821, 3949, 5842,
+ 7821, 4117, 10441, 6992,
+ 7821, 4202,
+ 7821, 4215, 9601, 5830,
+ 7821, 4849, 10441, 6992,
+ 7821, 5830,
+ 7821, 6081, 7593, 8744,
+ 7821, 6571, 4760,
+ 7821, 6571, 5404,
+ 7821, 6571, 5564,
+ 7821, 6571, 7410,
+ 7821, 6571, 7996,
+ 7821, 6571, 8368,
+ 7821, 6907, 5842,
+ 7821, 7085, 8744,
+ 7821, 7443, 10441, 6992,
+ 7821, 7547, 7370,
+ 7821, 7593, 5830,
+ 7821, 7593, 8744,
+ 7821, 7593, 9438,
+ 7821, 7611, 5842,
+ 7821, 8022,
+ 7821, 8056,
+ 7821, 8057, 6121, 1045, 7442,
+ 7821, 8057, 6121, 2779, 4112,
+ 7821, 8057, 6121, 4117, 6434,
+ 7821, 8057, 6121, 7121, 4849, 10464,
+ 7821, 8057, 6121, 7121, 7443, 10464,
+ 7821, 8057, 6121, 7773, 4849, 10464,
+ 7821, 8057, 6121, 7773, 7443, 10464,
+ 7821, 8463, 5830,
+ 7821, 8463, 7593, 8744,
+ 7821, 8463, 8744,
+ 7821, 8463, 9158,
+ 7821, 8463, 9438,
+ 7821, 8691, 1044,
+ 7821, 8744,
+ 7821, 8745, 6121, 7121, 4849, 10464,
+ 7821, 8745, 6121, 7121, 7443, 10464,
+ 7821, 8745, 6121, 7773, 4849, 10464,
+ 7821, 8745, 6121, 7773, 7443, 10464,
+ 7821, 8745, 6121, 8037, 10677, 4876,
+ 7821, 8745, 6121, 9645, 9118,
+ 7821, 8745, 6121, 10677, 10739, 4876,
+ 7821, 8745, 6121, 11097, 5934,
+ 7821, 8745, 6121, 11765, 5934,
+ 7821, 8745, 11461, 6505, 7593, 8744,
+ 7821, 9158,
+ 7821, 9159, 5842,
+ 7821, 9159, 6121, 9079, 1044,
+ 7821, 9159, 11461, 6505, 7593, 9158,
+ 7821, 9338,
+ 7821, 9711, 4178,
+ 7821, 10143, 1860,
+ 7821, 10143, 4760,
+ 7821, 10194,
+ 7821, 10209, 4178,
+ 7821, 10420,
+ 7821, 10502,
+ 7821, 10643, 11461, 7593, 7821, 10642,
+ 7821, 10677, 760,
+ 7821, 10677, 9264,
+ 7821, 10677, 11202,
+ 7821, 11036,
+ 7821, 11202,
+ 7821, 11354,
+ 7821, 11364,
+ 7821, 11649, 9264,
+ 7821, 12383, 7593, 10642,
+ 7821, 12383, 10642,
+ 7821, 12383, 10643, 6121, 1044,
+ 7821, 12917, 9158,
+ 7821, 12917, 9159, 6121, 11097, 5934,
+ 7821, 12917, 9159, 6121, 11765, 5934,
+ 7821, 12931, 7593, 10642,
+ 7821, 12931, 10642,
+ 7821, 12967, 7593, 10642,
+ 7821, 12967, 9602,
+ 7821, 12967, 10642,
+ 7821, 12984,
+ 7821, 13067, 7593, 10642,
+ 7821, 13067, 9602,
+ 7821, 13067, 10420,
+ 7821, 13067, 10642,
+ 7911, 1049, 9467, 6791, 9748,
+ 7911, 6129, 11229, 1044,
+ 7911, 6129, 11229, 4876,
+ 7911, 6569, 4926,
+ 7911, 8423, 9467, 6791, 9748,
+ 7911, 8525, 2170,
+ 7911, 8525, 2171, 9344,
+ 7911, 8525, 2171, 10624,
+ 7911, 8525, 2540,
+ 7911, 8525, 2541, 9344,
+ 7911, 8525, 2541, 10624,
+ 7911, 8525, 2670,
+ 7911, 8525, 2671, 10624,
+ 7911, 8525, 2778,
+ 7911, 8525, 2779, 9344,
+ 7911, 8525, 2779, 10624,
+ 7911, 8525, 4200,
+ 7911, 8525, 4201, 9344,
+ 7911, 8525, 4201, 10624,
+ 7911, 8525, 4214,
+ 7911, 8525, 4215, 9344,
+ 7911, 8525, 4215, 10624,
+ 7911, 8525, 5190,
+ 7911, 8525, 5191, 9344,
+ 7911, 8525, 5191, 10624,
+ 7911, 8525, 6722,
+ 7911, 8525, 6723, 9344,
+ 7911, 8525, 6723, 10624,
+ 7911, 8525, 6784,
+ 7911, 8525, 6785, 10624,
+ 7911, 8525, 6804,
+ 7911, 8525, 6805, 10624,
+ 7911, 8525, 7508,
+ 7911, 8525, 7509, 9344,
+ 7911, 8525, 7509, 10624,
+ 7911, 8525, 7576,
+ 7911, 8525, 7577, 10624,
+ 7911, 8525, 7694,
+ 7911, 8525, 7695, 9344,
+ 7911, 8525, 7695, 10624,
+ 7911, 8525, 8160,
+ 7911, 8525, 8161, 10624,
+ 7911, 8525, 8514,
+ 7911, 8525, 8515, 10624,
+ 7911, 8525, 8820,
+ 7911, 8525, 8821, 10624,
+ 7911, 8525, 8876,
+ 7911, 8525, 8877, 10624,
+ 7911, 8525, 9672,
+ 7911, 8525, 9673, 10624,
+ 7911, 8931, 3717, 6052,
+ 7911, 8931, 6791, 9748,
+ 7911, 8931, 7687, 9748,
+ 7911, 8931, 8233, 9748,
+ 7911, 8931, 8681, 9748,
+ 7911, 9467, 7687, 9748,
+ 7911, 9467, 8681, 9748,
+ 7919, 6741, 445, 6741, 568,
+ 7919, 6741, 568,
+ 7919, 6741, 569, 6121, 11449, 7908,
+ 7922,
+ 7931, 1109, 429, 3288,
+ 7931, 2396,
+ 7931, 3997, 11228,
+ 7931, 4201, 9601, 5830,
+ 7931, 4223, 5836,
+ 7931, 4927, 5241, 8260,
+ 7931, 5759, 5521, 8995, 3262,
+ 7931, 5759, 7176,
+ 7931, 5759, 7476,
+ 7931, 5759, 7486,
+ 7931, 5759, 7917, 9894,
+ 7931, 5759, 8715, 10708,
+ 7931, 5759, 8715, 12523, 1894,
+ 7931, 5759, 11350,
+ 7931, 5759, 12137, 7916,
+ 7931, 5759, 12159, 7917, 11396,
+ 7931, 5879, 10204,
+ 7931, 6616,
+ 7931, 6644,
+ 7931, 6645, 8461, 4212,
+ 7931, 6645, 10275, 4212,
+ 7931, 6731, 8037, 1809, 5836,
+ 7931, 6731, 8037, 4423, 5836,
+ 7931, 6772,
+ 7931, 6773, 6121, 2779, 4112,
+ 7931, 6773, 8461, 4212,
+ 7931, 6773, 10275, 4212,
+ 7931, 6895, 6376,
+ 7931, 6895, 6490,
+ 7931, 7026,
+ 7931, 7027, 8461, 4212,
+ 7931, 7027, 10275, 4212,
+ 7931, 7377, 429, 8658,
+ 7931, 7593, 1809, 4942,
+ 7931, 7593, 1809, 5648,
+ 7931, 7593, 2918,
+ 7931, 7593, 3052,
+ 7931, 7593, 4423, 1739, 3244,
+ 7931, 7593, 4423, 2640,
+ 7931, 7593, 4423, 3052,
+ 7931, 7593, 4423, 4630,
+ 7931, 7593, 4423, 4943, 9363, 4212,
+ 7931, 7593, 4423, 4943, 10275, 4212,
+ 7931, 7593, 4423, 5240,
+ 7931, 7593, 4423, 5648,
+ 7931, 7593, 4423, 6254,
+ 7931, 7593, 4423, 7124,
+ 7931, 7593, 4423, 7695, 4112,
+ 7931, 7593, 4423, 9185, 4399, 429, 4736,
+ 7931, 7593, 4423, 9645, 6260,
+ 7931, 7593, 4423, 9807, 12139, 6260,
+ 7931, 7593, 4423, 10301, 2285, 6121, 1739, 6121, 3245, 9448,
+ 7931, 7593, 4423, 10301, 2485, 6121, 1739, 6121, 3245, 9448,
+ 7931, 7593, 4423, 10301, 3245, 6121, 1739, 6121, 3052,
+ 7931, 7593, 6644,
+ 7931, 7593, 6772,
+ 7931, 7593, 7026,
+ 7931, 7633, 429, 2451, 173, 4424,
+ 7931, 7650,
+ 7931, 7651, 8461, 4212,
+ 7931, 7651, 10275, 4212,
+ 7931, 7803, 5759, 1045, 6490,
+ 7931, 7803, 5759, 7593, 43, 6376,
+ 7931, 7803, 5759, 10267, 7593, 43, 6376,
+ 7931, 8405, 8,
+ 7931, 8405, 9, 6789, 4212,
+ 7931, 8405, 9, 8461, 4212,
+ 7931, 8405, 9, 9363, 4212,
+ 7931, 8405, 9, 10275, 4212,
+ 7931, 8405, 40,
+ 7931, 8405, 41, 6121, 6895, 6376,
+ 7931, 8405, 41, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 41, 6789, 4212,
+ 7931, 8405, 41, 10275, 4212,
+ 7931, 8405, 66,
+ 7931, 8405, 400,
+ 7931, 8405, 401, 6789, 4212,
+ 7931, 8405, 401, 8461, 4212,
+ 7931, 8405, 401, 9363, 4212,
+ 7931, 8405, 401, 10275, 4212,
+ 7931, 8405, 426,
+ 7931, 8405, 427, 6789, 4212,
+ 7931, 8405, 427, 10275, 4212,
+ 7931, 8405, 612,
+ 7931, 8405, 613, 6789, 4212,
+ 7931, 8405, 613, 10275, 4212,
+ 7931, 8405, 664,
+ 7931, 8405, 665, 6789, 4212,
+ 7931, 8405, 665, 10275, 4212,
+ 7931, 8405, 710,
+ 7931, 8405, 711, 6121, 2779, 4113, 6376,
+ 7931, 8405, 711, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 711, 6121, 7695, 4113, 6376,
+ 7931, 8405, 711, 6121, 7695, 4113, 10441, 10959, 6376,
+ 7931, 8405, 711, 6789, 4212,
+ 7931, 8405, 711, 8461, 4212,
+ 7931, 8405, 711, 9363, 4212,
+ 7931, 8405, 711, 10275, 4212,
+ 7931, 8405, 780,
+ 7931, 8405, 781, 6121, 1045, 6491, 721, 7695, 4113, 6376,
+ 7931, 8405, 781, 6121, 2779, 4113, 6491, 721, 1045, 6376,
+ 7931, 8405, 781, 6121, 7593, 42,
+ 7931, 8405, 781, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 781, 6121, 7695, 4113, 10441, 9811, 6491, 721, 2779, 4113, 6376,
+ 7931, 8405, 781, 6121, 7695, 4113, 12477, 6490,
+ 7931, 8405, 781, 6121, 10267, 7593, 43, 6490,
+ 7931, 8405, 781, 6789, 4212,
+ 7931, 8405, 781, 8461, 4212,
+ 7931, 8405, 781, 9363, 4212,
+ 7931, 8405, 781, 10275, 4212,
+ 7931, 8405, 956,
+ 7931, 8405, 957, 6121, 1045, 6490,
+ 7931, 8405, 957, 6789, 4212,
+ 7931, 8405, 957, 8461, 4212,
+ 7931, 8405, 957, 9363, 4212,
+ 7931, 8405, 957, 10275, 4212,
+ 7931, 8405, 960,
+ 7931, 8405, 961, 6121, 1045, 6490,
+ 7931, 8405, 961, 6121, 1045, 6491, 721, 7593, 2640,
+ 7931, 8405, 961, 6121, 2779, 4113, 11877, 6491, 721, 7593, 2640,
+ 7931, 8405, 961, 6121, 4215, 4113, 6376,
+ 7931, 8405, 961, 6121, 5550,
+ 7931, 8405, 961, 6121, 7695, 4113, 6377, 10958,
+ 7931, 8405, 961, 6121, 10267, 42,
+ 7931, 8405, 961, 6121, 10267, 7593, 43, 6490,
+ 7931, 8405, 961, 6789, 4212,
+ 7931, 8405, 961, 10275, 4212,
+ 7931, 8405, 1056,
+ 7931, 8405, 1057, 6789, 4212,
+ 7931, 8405, 1057, 10275, 4212,
+ 7931, 8405, 1152,
+ 7931, 8405, 1153, 6121, 1045, 6490,
+ 7931, 8405, 1153, 6121, 1045, 7189, 6490,
+ 7931, 8405, 1153, 6121, 2779, 4113, 6490,
+ 7931, 8405, 1153, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1153, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 1153, 6789, 4212,
+ 7931, 8405, 1153, 8461, 4212,
+ 7931, 8405, 1153, 9363, 4212,
+ 7931, 8405, 1153, 10275, 4212,
+ 7931, 8405, 1208,
+ 7931, 8405, 1209, 6121, 2779, 4113, 6490,
+ 7931, 8405, 1209, 6121, 5550,
+ 7931, 8405, 1209, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1209, 6789, 4212,
+ 7931, 8405, 1209, 8461, 4212,
+ 7931, 8405, 1209, 9363, 4212,
+ 7931, 8405, 1209, 10275, 4212,
+ 7931, 8405, 1342,
+ 7931, 8405, 1343, 6121, 2779, 4113, 6376,
+ 7931, 8405, 1343, 6121, 2779, 4113, 10677, 6376,
+ 7931, 8405, 1343, 6121, 6895, 6376,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 6376,
+ 7931, 8405, 1343, 6121, 7593, 7931, 8405, 2641, 6490,
+ 7931, 8405, 1343, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1343, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 1343, 6121, 10173, 12403, 6689, 4215, 6490,
+ 7931, 8405, 1343, 6789, 4212,
+ 7931, 8405, 1343, 8461, 4212,
+ 7931, 8405, 1343, 9363, 4212,
+ 7931, 8405, 1343, 10275, 4212,
+ 7931, 8405, 1358,
+ 7931, 8405, 1359, 4340,
+ 7931, 8405, 1359, 4341, 6121, 6895, 6376,
+ 7931, 8405, 1359, 4341, 6789, 4212,
+ 7931, 8405, 1359, 4341, 8461, 4212,
+ 7931, 8405, 1359, 4341, 9363, 4212,
+ 7931, 8405, 1359, 4341, 10275, 4212,
+ 7931, 8405, 1359, 6121, 3053, 6376,
+ 7931, 8405, 1359, 6121, 3053, 6377, 6789, 4212,
+ 7931, 8405, 1359, 6121, 3053, 6377, 10275, 4212,
+ 7931, 8405, 1359, 6121, 10267, 42,
+ 7931, 8405, 1359, 6789, 4212,
+ 7931, 8405, 1359, 8461, 4212,
+ 7931, 8405, 1359, 9363, 4212,
+ 7931, 8405, 1359, 10275, 4212,
+ 7931, 8405, 1359, 11948,
+ 7931, 8405, 1359, 11949, 6789, 4212,
+ 7931, 8405, 1359, 11949, 8461, 4212,
+ 7931, 8405, 1359, 11949, 9363, 4212,
+ 7931, 8405, 1359, 11949, 10275, 4212,
+ 7931, 8405, 1508,
+ 7931, 8405, 1509, 6789, 4212,
+ 7931, 8405, 1509, 10275, 4212,
+ 7931, 8405, 1578,
+ 7931, 8405, 1579, 6121, 1045, 6376,
+ 7931, 8405, 1579, 6121, 2779, 4113, 6376,
+ 7931, 8405, 1579, 6121, 5550,
+ 7931, 8405, 1579, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1579, 6789, 4212,
+ 7931, 8405, 1579, 8461, 4212,
+ 7931, 8405, 1579, 9363, 4212,
+ 7931, 8405, 1579, 10275, 4212,
+ 7931, 8405, 1738,
+ 7931, 8405, 1739, 6121, 760,
+ 7931, 8405, 1739, 6121, 1045, 6376,
+ 7931, 8405, 1739, 6121, 7593, 42,
+ 7931, 8405, 1739, 6121, 7695, 4113, 6376,
+ 7931, 8405, 1739, 6121, 7695, 4113, 6490,
+ 7931, 8405, 1739, 6789, 4212,
+ 7931, 8405, 1739, 8461, 4212,
+ 7931, 8405, 1739, 9363, 4212,
+ 7931, 8405, 1739, 10275, 4212,
+ 7931, 8405, 2206,
+ 7931, 8405, 2207, 6789, 4212,
+ 7931, 8405, 2207, 8461, 4212,
+ 7931, 8405, 2207, 9363, 4212,
+ 7931, 8405, 2207, 10275, 4212,
+ 7931, 8405, 2284,
+ 7931, 8405, 2285, 6121, 1045, 6376,
+ 7931, 8405, 2285, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2285, 6789, 4212,
+ 7931, 8405, 2285, 8461, 4212,
+ 7931, 8405, 2285, 9363, 4212,
+ 7931, 8405, 2285, 10275, 4212,
+ 7931, 8405, 2404,
+ 7931, 8405, 2405, 6121, 1045, 6490,
+ 7931, 8405, 2405, 6121, 1045, 6491, 721, 1045, 6376,
+ 7931, 8405, 2405, 6121, 2779, 4113, 6376,
+ 7931, 8405, 2405, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 2405, 6121, 4215, 4113, 6376,
+ 7931, 8405, 2405, 6121, 5550,
+ 7931, 8405, 2405, 6121, 6895, 6376,
+ 7931, 8405, 2405, 6121, 7593, 42,
+ 7931, 8405, 2405, 6121, 7593, 43, 6490,
+ 7931, 8405, 2405, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 2405, 6121, 8758,
+ 7931, 8405, 2405, 6121, 10267, 42,
+ 7931, 8405, 2405, 6789, 4212,
+ 7931, 8405, 2405, 10275, 4212,
+ 7931, 8405, 2484,
+ 7931, 8405, 2485, 6121, 2779, 4113, 6490,
+ 7931, 8405, 2485, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2485, 6789, 4212,
+ 7931, 8405, 2485, 8461, 4212,
+ 7931, 8405, 2485, 9363, 4212,
+ 7931, 8405, 2485, 10275, 4212,
+ 7931, 8405, 2640,
+ 7931, 8405, 2641, 6121, 7695, 4113, 6376,
+ 7931, 8405, 2641, 6789, 4212,
+ 7931, 8405, 2641, 8461, 4212,
+ 7931, 8405, 2641, 9363, 4212,
+ 7931, 8405, 2641, 10275, 4212,
+ 7931, 8405, 2668,
+ 7931, 8405, 2669, 6121, 5550,
+ 7931, 8405, 2669, 6121, 7695, 4113, 6377, 10958,
+ 7931, 8405, 2669, 6789, 4212,
+ 7931, 8405, 2669, 8461, 4212,
+ 7931, 8405, 2669, 9363, 4212,
+ 7931, 8405, 2669, 9456,
+ 7931, 8405, 2669, 9457, 4340,
+ 7931, 8405, 2669, 9457, 6789, 4212,
+ 7931, 8405, 2669, 9457, 10275, 4212,
+ 7931, 8405, 2669, 10275, 4212,
+ 7931, 8405, 2858,
+ 7931, 8405, 2859, 6789, 4212,
+ 7931, 8405, 2859, 8461, 4212,
+ 7931, 8405, 2859, 9363, 4212,
+ 7931, 8405, 2859, 10275, 4212,
+ 7931, 8405, 2918,
+ 7931, 8405, 2919, 6121, 1045, 6376,
+ 7931, 8405, 2919, 6121, 2779, 4113, 6376,
+ 7931, 8405, 2919, 6121, 5550,
+ 7931, 8405, 2919, 6121, 6895, 6376,
+ 7931, 8405, 2919, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 2919, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 2919, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 2919, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 2919, 6789, 4212,
+ 7931, 8405, 2919, 10275, 4212,
+ 7931, 8405, 3052,
+ 7931, 8405, 3053, 6121, 5878,
+ 7931, 8405, 3053, 6121, 6895, 6376,
+ 7931, 8405, 3053, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 8461, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 9363, 4212,
+ 7931, 8405, 3053, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3053, 6121, 7593, 42,
+ 7931, 8405, 3053, 6121, 7695, 4113, 6490,
+ 7931, 8405, 3053, 6789, 4212,
+ 7931, 8405, 3053, 7982,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6376,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3053, 7983, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3053, 7983, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 3053, 7983, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 3053, 7983, 6789, 4212,
+ 7931, 8405, 3053, 7983, 10275, 4212,
+ 7931, 8405, 3053, 8461, 4212,
+ 7931, 8405, 3053, 9363, 4212,
+ 7931, 8405, 3053, 10275, 4212,
+ 7931, 8405, 3124,
+ 7931, 8405, 3125, 6789, 4212,
+ 7931, 8405, 3125, 8461, 4212,
+ 7931, 8405, 3125, 9363, 4212,
+ 7931, 8405, 3125, 10275, 4212,
+ 7931, 8405, 3244,
+ 7931, 8405, 3245, 6121, 6107, 6895, 6376,
+ 7931, 8405, 3245, 6121, 6107, 6895, 6490,
+ 7931, 8405, 3245, 6121, 6895, 6376,
+ 7931, 8405, 3245, 6121, 6895, 6377, 6789, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6377, 10275, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6490,
+ 7931, 8405, 3245, 6121, 6895, 6491, 6789, 4212,
+ 7931, 8405, 3245, 6121, 6895, 6491, 10275, 4212,
+ 7931, 8405, 3245, 6121, 7125, 6376,
+ 7931, 8405, 3245, 6121, 7125, 6377, 6789, 4212,
+ 7931, 8405, 3245, 6121, 7125, 6377, 10275, 4212,
+ 7931, 8405, 3245, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 3245, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 3245, 6789, 4212,
+ 7931, 8405, 3245, 7808,
+ 7931, 8405, 3245, 7809, 6789, 4212,
+ 7931, 8405, 3245, 7809, 10275, 4212,
+ 7931, 8405, 3245, 9448,
+ 7931, 8405, 3245, 9449, 6789, 4212,
+ 7931, 8405, 3245, 9449, 10275, 4212,
+ 7931, 8405, 3245, 10275, 4212,
+ 7931, 8405, 3766,
+ 7931, 8405, 3767, 6789, 4212,
+ 7931, 8405, 3767, 8461, 4212,
+ 7931, 8405, 3767, 9363, 4212,
+ 7931, 8405, 3767, 10275, 4212,
+ 7931, 8405, 4000,
+ 7931, 8405, 4001, 6789, 4212,
+ 7931, 8405, 4001, 10275, 4212,
+ 7931, 8405, 4136,
+ 7931, 8405, 4137, 6789, 4212,
+ 7931, 8405, 4137, 8461, 4212,
+ 7931, 8405, 4137, 9363, 4212,
+ 7931, 8405, 4137, 10275, 4212,
+ 7931, 8405, 4356,
+ 7931, 8405, 4357, 6789, 4212,
+ 7931, 8405, 4357, 8461, 4212,
+ 7931, 8405, 4357, 9363, 4212,
+ 7931, 8405, 4357, 10275, 4212,
+ 7931, 8405, 4423, 6894,
+ 7931, 8405, 4423, 6895, 2918,
+ 7931, 8405, 4423, 6895, 3052,
+ 7931, 8405, 4423, 6895, 3244,
+ 7931, 8405, 4630,
+ 7931, 8405, 4631, 6789, 4212,
+ 7931, 8405, 4631, 8461, 4212,
+ 7931, 8405, 4631, 9363, 4212,
+ 7931, 8405, 4631, 10275, 4212,
+ 7931, 8405, 4736,
+ 7931, 8405, 4737, 6789, 4212,
+ 7931, 8405, 4737, 8461, 4212,
+ 7931, 8405, 4737, 9363, 4212,
+ 7931, 8405, 4737, 10275, 4212,
+ 7931, 8405, 4942,
+ 7931, 8405, 4943, 6121, 1045, 6376,
+ 7931, 8405, 4943, 6121, 1045, 6490,
+ 7931, 8405, 4943, 6789, 4212,
+ 7931, 8405, 4943, 8461, 4212,
+ 7931, 8405, 4943, 9363, 4212,
+ 7931, 8405, 4943, 10275, 4212,
+ 7931, 8405, 5240,
+ 7931, 8405, 5241, 6121, 1045, 6490,
+ 7931, 8405, 5241, 6121, 2779, 4113, 6490,
+ 7931, 8405, 5241, 6121, 5550,
+ 7931, 8405, 5241, 6121, 7593, 42,
+ 7931, 8405, 5241, 6121, 7593, 2640,
+ 7931, 8405, 5241, 6121, 7695, 4113, 6376,
+ 7931, 8405, 5241, 6789, 4212,
+ 7931, 8405, 5241, 8260,
+ 7931, 8405, 5241, 8261, 6789, 4212,
+ 7931, 8405, 5241, 8261, 10275, 4212,
+ 7931, 8405, 5241, 8461, 4212,
+ 7931, 8405, 5241, 9363, 4212,
+ 7931, 8405, 5241, 10275, 4212,
+ 7931, 8405, 5298,
+ 7931, 8405, 5299, 6789, 4212,
+ 7931, 8405, 5299, 8461, 4212,
+ 7931, 8405, 5299, 9363, 4212,
+ 7931, 8405, 5299, 10275, 4212,
+ 7931, 8405, 5572,
+ 7931, 8405, 5573, 6789, 4212,
+ 7931, 8405, 5573, 10275, 4212,
+ 7931, 8405, 5648,
+ 7931, 8405, 5649, 6121, 1045, 6491, 721, 1045, 6376,
+ 7931, 8405, 5649, 6121, 2779, 4113, 11877, 6376,
+ 7931, 8405, 5649, 6121, 4215, 4113, 6376,
+ 7931, 8405, 5649, 6121, 7593, 7931, 8405, 2641, 721, 2779, 4112,
+ 7931, 8405, 5649, 6121, 7695, 4113, 6490,
+ 7931, 8405, 5649, 6121, 7695, 4113, 6491, 721, 7695, 4113, 6376,
+ 7931, 8405, 5649, 6121, 10173, 12403, 6689, 4215, 6376,
+ 7931, 8405, 5649, 6121, 10267, 42,
+ 7931, 8405, 5649, 6789, 4212,
+ 7931, 8405, 5649, 8461, 4212,
+ 7931, 8405, 5649, 9363, 4212,
+ 7931, 8405, 5649, 10275, 4212,
+ 7931, 8405, 5910,
+ 7931, 8405, 5911, 6789, 4212,
+ 7931, 8405, 5911, 10275, 4212,
+ 7931, 8405, 5916,
+ 7931, 8405, 5917, 6789, 4212,
+ 7931, 8405, 5917, 8461, 4212,
+ 7931, 8405, 5917, 9363, 4212,
+ 7931, 8405, 5917, 10275, 4212,
+ 7931, 8405, 5992,
+ 7931, 8405, 5993, 6789, 4212,
+ 7931, 8405, 5993, 8461, 4212,
+ 7931, 8405, 5993, 9363, 4212,
+ 7931, 8405, 5993, 10275, 4212,
+ 7931, 8405, 6254,
+ 7931, 8405, 6255, 6789, 4212,
+ 7931, 8405, 6255, 10275, 4212,
+ 7931, 8405, 6486,
+ 7931, 8405, 6487, 6789, 4212,
+ 7931, 8405, 6487, 8461, 4212,
+ 7931, 8405, 6487, 9363, 4212,
+ 7931, 8405, 6487, 10275, 4212,
+ 7931, 8405, 6636,
+ 7931, 8405, 6637, 6789, 4212,
+ 7931, 8405, 6637, 10275, 4212,
+ 7931, 8405, 6771, 3052,
+ 7931, 8405, 6771, 3053, 6121, 2779, 4113, 6376,
+ 7931, 8405, 6771, 3053, 6121, 7695, 4113, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 2779, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 4215, 6490,
+ 7931, 8405, 6771, 3053, 6121, 10173, 12403, 6689, 7695, 6376,
+ 7931, 8405, 6771, 3053, 6121, 10267, 42,
+ 7931, 8405, 6771, 3053, 6789, 4212,
+ 7931, 8405, 6771, 3053, 8461, 4212,
+ 7931, 8405, 6771, 3053, 9363, 4212,
+ 7931, 8405, 6771, 3053, 10275, 4212,
+ 7931, 8405, 6850,
+ 7931, 8405, 6851, 6121, 1045, 6490,
+ 7931, 8405, 6851, 6789, 4212,
+ 7931, 8405, 6851, 8461, 4212,
+ 7931, 8405, 6851, 9363, 4212,
+ 7931, 8405, 6851, 10275, 4212,
+ 7931, 8405, 6894,
+ 7931, 8405, 6895, 10275, 4212,
+ 7931, 8405, 7036,
+ 7931, 8405, 7037, 6121, 1045, 6376,
+ 7931, 8405, 7037, 6121, 2779, 4113, 6376,
+ 7931, 8405, 7037, 6121, 7695, 4113, 6376,
+ 7931, 8405, 7037, 6121, 7695, 4113, 6490,
+ 7931, 8405, 7037, 6121, 7695, 4113, 10441, 9811, 6490,
+ 7931, 8405, 7037, 6789, 4212,
+ 7931, 8405, 7037, 8461, 4212,
+ 7931, 8405, 7037, 9363, 4212,
+ 7931, 8405, 7037, 10275, 4212,
+ 7931, 8405, 7238,
+ 7931, 8405, 7239, 6789, 4212,
+ 7931, 8405, 7239, 8461, 4212,
+ 7931, 8405, 7239, 9363, 4212,
+ 7931, 8405, 7239, 10275, 4212,
+ 7931, 8405, 7354,
+ 7931, 8405, 7355, 6789, 4212,
+ 7931, 8405, 7355, 8461, 4212,
+ 7931, 8405, 7355, 9363, 4212,
+ 7931, 8405, 7355, 10275, 4212,
+ 7931, 8405, 7448,
+ 7931, 8405, 7449, 6789, 4212,
+ 7931, 8405, 7449, 8461, 4212,
+ 7931, 8405, 7449, 9363, 4212,
+ 7931, 8405, 7449, 10275, 4212,
+ 7931, 8405, 7524,
+ 7931, 8405, 7525, 6121, 1045, 6490,
+ 7931, 8405, 7525, 6789, 4212,
+ 7931, 8405, 7525, 8461, 4212,
+ 7931, 8405, 7525, 9363, 4212,
+ 7931, 8405, 7525, 10275, 4212,
+ 7931, 8405, 7653, 1578,
+ 7931, 8405, 7668,
+ 7931, 8405, 7669, 6121, 1045, 6376,
+ 7931, 8405, 7669, 6789, 4212,
+ 7931, 8405, 7669, 8461, 4212,
+ 7931, 8405, 7669, 9363, 4212,
+ 7931, 8405, 7669, 10275, 4212,
+ 7931, 8405, 7672,
+ 7931, 8405, 7673, 6789, 4212,
+ 7931, 8405, 7673, 8461, 4212,
+ 7931, 8405, 7673, 9363, 4212,
+ 7931, 8405, 7673, 10275, 4212,
+ 7931, 8405, 8098,
+ 7931, 8405, 8099, 6789, 4212,
+ 7931, 8405, 8099, 10275, 4212,
+ 7931, 8405, 8860,
+ 7931, 8405, 8861, 6789, 4212,
+ 7931, 8405, 8861, 8461, 4212,
+ 7931, 8405, 8861, 9363, 4212,
+ 7931, 8405, 8861, 10275, 4212,
+ 7931, 8405, 8895, 8345, 9405, 3245, 9449, 8461, 4212,
+ 7931, 8405, 8895, 8345, 9405, 3245, 9449, 9363, 4212,
+ 7931, 8405, 9185, 780,
+ 7931, 8405, 9185, 1152,
+ 7931, 8405, 9185, 2284,
+ 7931, 8405, 9405, 426,
+ 7931, 8405, 9405, 427, 6789, 4212,
+ 7931, 8405, 9405, 427, 10275, 4212,
+ 7931, 8405, 9405, 664,
+ 7931, 8405, 9405, 665, 6789, 4212,
+ 7931, 8405, 9405, 665, 10275, 4212,
+ 7931, 8405, 9770,
+ 7931, 8405, 9771, 6789, 4212,
+ 7931, 8405, 9771, 8461, 4212,
+ 7931, 8405, 9771, 9363, 4212,
+ 7931, 8405, 9771, 10275, 4212,
+ 7931, 8405, 12355, 3244,
+ 7931, 8435, 6376,
+ 7931, 8525, 5758,
+ 7931, 8601, 7793, 5758,
+ 7931, 8692,
+ 7931, 8693, 8461, 4212,
+ 7931, 8693, 10275, 4212,
+ 7931, 8849, 1045, 12133, 4926,
+ 7931, 9151, 11228,
+ 7931, 9581, 5758,
+ 7931, 9645, 4423, 5837, 6121, 8205, 8036,
+ 7931, 9766,
+ 7931, 9767, 6121, 10175, 6376,
+ 7931, 9978,
+ 7931, 9979, 10275, 4212,
+ 7931, 10174,
+ 7931, 10175, 10275, 4212,
+ 7931, 10199, 8450,
+ 7931, 10267, 6644,
+ 7931, 10280,
+ 7931, 10281, 10275, 4212,
+ 7931, 10301, 711, 6121, 3053, 6789, 4212,
+ 7931, 10301, 711, 6121, 3053, 10275, 4212,
+ 7931, 10301, 711, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 711, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 711, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 711, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4631, 9363, 4212,
+ 7931, 10301, 711, 6121, 4631, 10275, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 711, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4943, 9363, 4212,
+ 7931, 10301, 711, 6121, 4943, 10275, 4212,
+ 7931, 10301, 781, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 1343, 9363, 4212,
+ 7931, 10301, 781, 6121, 1343, 10275, 4212,
+ 7931, 10301, 781, 6121, 1359, 8461, 4212,
+ 7931, 10301, 781, 6121, 1359, 9363, 4212,
+ 7931, 10301, 781, 6121, 2405, 6789, 4212,
+ 7931, 10301, 781, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 3053, 10275, 4212,
+ 7931, 10301, 781, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 781, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 781, 6121, 4631, 9363, 4212,
+ 7931, 10301, 781, 6121, 4631, 10275, 4212,
+ 7931, 10301, 781, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 781, 6121, 4737, 9363, 4212,
+ 7931, 10301, 781, 6121, 4737, 10275, 4212,
+ 7931, 10301, 781, 6121, 4943, 6789, 4212,
+ 7931, 10301, 781, 6121, 4943, 8461, 4212,
+ 7931, 10301, 781, 6121, 4943, 9363, 4212,
+ 7931, 10301, 781, 6121, 4943, 10275, 4212,
+ 7931, 10301, 781, 6121, 5241, 6789, 4212,
+ 7931, 10301, 781, 6121, 6255, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 957, 6121, 1343, 9363, 4212,
+ 7931, 10301, 957, 6121, 1343, 10275, 4212,
+ 7931, 10301, 957, 6121, 2405, 6789, 4212,
+ 7931, 10301, 957, 6121, 2405, 10275, 4212,
+ 7931, 10301, 957, 6121, 3053, 6789, 4212,
+ 7931, 10301, 957, 6121, 3053, 10275, 4212,
+ 7931, 10301, 957, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 957, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 957, 6121, 4631, 9363, 4212,
+ 7931, 10301, 957, 6121, 4631, 10275, 4212,
+ 7931, 10301, 957, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 957, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 957, 6121, 4737, 9363, 4212,
+ 7931, 10301, 957, 6121, 4737, 10275, 4212,
+ 7931, 10301, 957, 6121, 4943, 9363, 4212,
+ 7931, 10301, 957, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1153, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1153, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1153, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1153, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1153, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1153, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1153, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1153, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1153, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1153, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1343, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1343, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1343, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1343, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1343, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1359, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1359, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1359, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1359, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1359, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1359, 6121, 12355, 3245, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1579, 6121, 1739, 6789, 4212,
+ 7931, 10301, 1579, 6121, 1739, 8461, 4212,
+ 7931, 10301, 1579, 6121, 1739, 9363, 4212,
+ 7931, 10301, 1579, 6121, 1739, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3245, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1579, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1579, 6121, 3245, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1579, 6121, 4943, 8461, 4212,
+ 7931, 10301, 1579, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1579, 6121, 4943, 10275, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1739, 6121, 1343, 10275, 4212,
+ 7931, 10301, 1739, 6121, 1359, 9363, 4212,
+ 7931, 10301, 1739, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3053, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6377, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6377, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6491, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 6895, 6491, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 7125, 6377, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6121, 7125, 6377, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 1739, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 1739, 6121, 3245, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4631, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4631, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4737, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4737, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4737, 10275, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 6789, 4212,
+ 7931, 10301, 1739, 6121, 4943, 8461, 4212,
+ 7931, 10301, 1739, 6121, 4943, 9363, 4212,
+ 7931, 10301, 1739, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2285, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2285, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2285, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2285, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2285, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2285, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2285, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2285, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2405, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2485, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2485, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2485, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2485, 6121, 2405, 6789, 4212,
+ 7931, 10301, 2485, 6121, 2405, 10275, 4212,
+ 7931, 10301, 2485, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2485, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2485, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2485, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2485, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2485, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2485, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2641, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2641, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2641, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2641, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2641, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2641, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2641, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 8461, 4212,
+ 7931, 10301, 2641, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2641, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4631, 6789, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2669, 6121, 1343, 10275, 4212,
+ 7931, 10301, 2669, 6121, 1359, 8461, 4212,
+ 7931, 10301, 2669, 6121, 1359, 9363, 4212,
+ 7931, 10301, 2669, 6121, 2405, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3053, 10275, 4212,
+ 7931, 10301, 2669, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4631, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4737, 10275, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 6789, 4212,
+ 7931, 10301, 2669, 6121, 4943, 8461, 4212,
+ 7931, 10301, 2669, 6121, 4943, 9363, 4212,
+ 7931, 10301, 2669, 6121, 4943, 10275, 4212,
+ 7931, 10301, 2669, 6121, 5241, 6789, 4212,
+ 7931, 10301, 2669, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3053, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 1343, 9363, 4212,
+ 7931, 10301, 3053, 6121, 1343, 10275, 4212,
+ 7931, 10301, 3053, 6121, 1359, 8461, 4212,
+ 7931, 10301, 3053, 6121, 1359, 9363, 4212,
+ 7931, 10301, 3053, 6121, 2405, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3053, 10275, 4212,
+ 7931, 10301, 3053, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 3053, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4631, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4631, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4737, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4737, 10275, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3053, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3053, 6121, 5241, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 9, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 41, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 41, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 67, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 67, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 427, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 427, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 665, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 665, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1343, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1343, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1359, 8461, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 1359, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2405, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2919, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 2919, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3053, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3053, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 3245, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4631, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4631, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4737, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 5241, 6789, 4212,
+ 7931, 10301, 3053, 6121, 6895, 6377, 6121, 6255, 6789, 4212,
+ 7931, 10301, 3125, 6121, 4943, 8461, 4212,
+ 7931, 10301, 3125, 6121, 4943, 9363, 4212,
+ 7931, 10301, 3125, 6121, 4943, 10275, 4212,
+ 7931, 10301, 3245, 6121, 10175, 6789, 4212,
+ 7931, 10301, 3245, 6121, 10175, 10275, 4212,
+ 7931, 10301, 3245, 9449, 6121, 12355, 3245, 6789, 4212,
+ 7931, 10301, 3245, 9449, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 4631, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4631, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4631, 6121, 4943, 10275, 4212,
+ 7931, 10301, 4737, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4737, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 4737, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4737, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4737, 6121, 4631, 10275, 4212,
+ 7931, 10301, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4737, 6121, 4943, 10275, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4943, 6121, 1343, 10275, 4212,
+ 7931, 10301, 4943, 6121, 3053, 10275, 4212,
+ 7931, 10301, 4943, 6121, 3245, 6789, 4212,
+ 7931, 10301, 4943, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 4737, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4631, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 4631, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4737, 10275, 4212,
+ 7931, 10301, 4943, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 4943, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5241, 6121, 1343, 10275, 4212,
+ 7931, 10301, 5241, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5241, 6121, 1359, 9363, 4212,
+ 7931, 10301, 5241, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5241, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 1343, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4631, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4737, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4737, 10275, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5241, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5241, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5241, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5241, 6121, 5241, 6789, 4212,
+ 7931, 10301, 5241, 6121, 6255, 6789, 4212,
+ 7931, 10301, 5475, 6061, 89, 9411, 5837, 5759, 10275, 4212,
+ 7931, 10301, 5649, 6121, 1343, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 1343, 8461, 4212,
+ 7931, 10301, 5649, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 1343, 10275, 4212,
+ 7931, 10301, 5649, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5649, 6121, 1359, 9363, 4212,
+ 7931, 10301, 5649, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5649, 6121, 2405, 10275, 4212,
+ 7931, 10301, 5649, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5649, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5649, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4631, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4631, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4631, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4737, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4737, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4737, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4737, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4737, 10275, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 1343, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 1343, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4631, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5649, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5649, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5649, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5911, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 5917, 6121, 1359, 8461, 4212,
+ 7931, 10301, 5917, 6121, 2405, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3053, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3053, 10275, 4212,
+ 7931, 10301, 5917, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 5917, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 5917, 6121, 4631, 10275, 4212,
+ 7931, 10301, 5917, 6121, 4943, 6789, 4212,
+ 7931, 10301, 5917, 6121, 4943, 8461, 4212,
+ 7931, 10301, 5917, 6121, 4943, 9363, 4212,
+ 7931, 10301, 5917, 6121, 4943, 10275, 4212,
+ 7931, 10301, 5917, 6121, 5241, 6789, 4212,
+ 7931, 10301, 5917, 6121, 6255, 6789, 4212,
+ 7931, 10301, 6393, 10275, 4212,
+ 7931, 10301, 6405, 10275, 4212,
+ 7931, 10301, 6851, 6121, 3053, 6789, 4212,
+ 7931, 10301, 6851, 6121, 3053, 10275, 4212,
+ 7931, 10301, 6851, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 6851, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 6851, 6121, 4631, 9363, 4212,
+ 7931, 10301, 6851, 6121, 4631, 10275, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 3053, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 6851, 6121, 4943, 9363, 4212,
+ 7931, 10301, 6851, 6121, 4943, 10275, 4212,
+ 7931, 10301, 7479, 10275, 4212,
+ 7931, 10301, 7481, 6061, 89, 9411, 5837, 5759, 10275, 4212,
+ 7931, 10301, 7481, 10275, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 1343, 6789, 4212,
+ 7931, 10301, 7525, 6121, 1343, 8461, 4212,
+ 7931, 10301, 7525, 6121, 1343, 9363, 4212,
+ 7931, 10301, 7525, 6121, 1343, 10275, 4212,
+ 7931, 10301, 7525, 6121, 1359, 8461, 4212,
+ 7931, 10301, 7525, 6121, 1359, 9363, 4212,
+ 7931, 10301, 7525, 6121, 2405, 6789, 4212,
+ 7931, 10301, 7525, 6121, 2405, 10275, 4212,
+ 7931, 10301, 7525, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 3053, 10275, 4212,
+ 7931, 10301, 7525, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 7525, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4631, 6121, 3053, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4631, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4631, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4631, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4631, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4737, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4737, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4737, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4737, 10275, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4737, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4737, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 6789, 4212,
+ 7931, 10301, 7525, 6121, 4943, 8461, 4212,
+ 7931, 10301, 7525, 6121, 4943, 9363, 4212,
+ 7931, 10301, 7525, 6121, 4943, 10275, 4212,
+ 7931, 10301, 7917, 10275, 4212,
+ 7931, 10301, 8635, 10275, 4212,
+ 7931, 10301, 8693, 6121, 6645, 8461, 4212,
+ 7931, 10301, 8693, 6121, 6645, 10275, 4212,
+ 7931, 10301, 8693, 6121, 6773, 8461, 4212,
+ 7931, 10301, 8693, 6121, 6773, 10275, 4212,
+ 7931, 10301, 8693, 6121, 7027, 8461, 4212,
+ 7931, 10301, 8693, 6121, 7027, 10275, 4212,
+ 7931, 10301, 8693, 6121, 9979, 10275, 4212,
+ 7931, 10301, 8693, 6121, 10281, 10275, 4212,
+ 7931, 10301, 8693, 6121, 12355, 3245, 10275, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 6789, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 9363, 4212,
+ 7931, 10301, 8895, 9405, 3053, 6121, 6895, 6377, 6121, 3245, 9449, 10275, 4212,
+ 7931, 10301, 10341, 10275, 4212,
+ 7931, 10301, 10683, 10275, 4212,
+ 7931, 10301, 10741, 10715, 10712,
+ 7931, 10301, 12159, 7917, 10682,
+ 7931, 10301, 13202,
+ 7931, 10469, 4926,
+ 7931, 10489, 6644,
+ 7931, 10692,
+ 7931, 11224,
+ 7931, 11261, 3244,
+ 7931, 11363, 11228,
+ 7971, 46,
+ 7971, 826,
+ 7971, 827, 6121, 46,
+ 7971, 827, 6121, 6568,
+ 7985, 8159, 7274,
+ 7985, 11241, 7274,
+ 8005, 731, 12901, 6434,
+ 8005, 4389, 10260,
+ 8005, 4849, 3958,
+ 8005, 4849, 4389, 9050,
+ 8005, 4849, 8076,
+ 8005, 6627, 9050,
+ 8005, 7443, 3958,
+ 8005, 7443, 4389, 9050,
+ 8005, 7443, 8076,
+ 8005, 8745, 9050,
+ 8005, 8745, 9051, 5387, 2725, 8745, 9050,
+ 8005, 10637, 7533, 9050,
+ 8005, 12114,
+ 8006,
+ 8007, 6121, 4849, 4389, 6504,
+ 8007, 6121, 7443, 4389, 6504,
+ 8017, 760,
+ 8017, 8057, 6121, 11141, 6434,
+ 8022,
+ 8023, 10374,
+ 8027, 2638,
+ 8028,
+ 8033, 8405, 0,
+ 8033, 8405, 2,
+ 8033, 8405, 6,
+ 8033, 8405, 8,
+ 8033, 8405, 12,
+ 8033, 8405, 16,
+ 8033, 8405, 20,
+ 8033, 8405, 22,
+ 8033, 8405, 24,
+ 8033, 8405, 26,
+ 8033, 8405, 28,
+ 8033, 8405, 30,
+ 8033, 8405, 32,
+ 8033, 8405, 34,
+ 8033, 8405, 36,
+ 8033, 8405, 38,
+ 8033, 8405, 40,
+ 8033, 8405, 46,
+ 8033, 8405, 54,
+ 8033, 8405, 136,
+ 8033, 8405, 158,
+ 8033, 8405, 214,
+ 8033, 8405, 266,
+ 8033, 8405, 304,
+ 8033, 8405, 334,
+ 8033, 8405, 366,
+ 8033, 8405, 394,
+ 8033, 8405, 400,
+ 8033, 8405, 410,
+ 8033, 8405, 460,
+ 8033, 8405, 518,
+ 8033, 8405, 530,
+ 8033, 8405, 542,
+ 8033, 8405, 544,
+ 8033, 8405, 574,
+ 8033, 8405, 606,
+ 8033, 8405, 1756,
+ 8033, 8405, 1872,
+ 8033, 8405, 1874,
+ 8033, 8405, 1876,
+ 8033, 8405, 2514,
+ 8033, 8405, 2578,
+ 8033, 8405, 2744,
+ 8033, 8405, 2838,
+ 8033, 8405, 3832,
+ 8033, 8405, 3834,
+ 8033, 8405, 6068,
+ 8033, 8405, 6070,
+ 8033, 8405, 6072,
+ 8037, 4877, 8774,
+ 8048,
+ 8057, 6121, 719, 835, 7773, 4849, 10465, 6504,
+ 8057, 6121, 2779, 11649, 9745, 569, 2681, 7442,
+ 8057, 6121, 4849, 4389, 6504,
+ 8057, 6121, 7121, 4389, 6504,
+ 8057, 6121, 7443, 4389, 6504,
+ 8057, 6121, 7593, 8057, 569, 2681, 7442,
+ 8057, 6121, 7773, 4389, 6504,
+ 8057, 6121, 7773, 7443, 10465, 6504,
+ 8057, 6121, 10677, 4192,
+ 8057, 6121, 11649, 760,
+ 8057, 6121, 12879, 46,
+ 8057, 9177, 115, 11649, 761, 721, 2725, 4389, 9177, 115, 10677, 760,
+ 8065, 7769, 6121, 8688,
+ 8065, 7769, 6121, 8689, 721, 7595, 9610,
+ 8065, 8762,
+ 8065, 8763, 445, 6741, 568,
+ 8065, 10578,
+ 8065, 10579, 445, 6741, 568,
+ 8065, 12493, 6121, 8688,
+ 8066,
+ 8075, 2167, 8523, 4223, 5836,
+ 8075, 2167, 8523, 7793, 9178,
+ 8075, 2167, 8523, 8121, 10469, 4926,
+ 8075, 2167, 8523, 10255, 10469, 4926,
+ 8075, 4223, 5836,
+ 8075, 7593, 8405, 28,
+ 8075, 7593, 8405, 202,
+ 8075, 7593, 8405, 374,
+ 8075, 7593, 8405, 404,
+ 8075, 7593, 8405, 476,
+ 8075, 7593, 8405, 516,
+ 8075, 7593, 8405, 582,
+ 8075, 7593, 8405, 986,
+ 8075, 7593, 8405, 1102,
+ 8075, 7593, 8405, 1154,
+ 8075, 7593, 8405, 1616,
+ 8075, 7593, 8405, 1680,
+ 8075, 7593, 8405, 2167, 8075, 236,
+ 8075, 7593, 8405, 2167, 8075, 710,
+ 8075, 7593, 8405, 2167, 8075, 1020,
+ 8075, 7593, 8405, 2167, 8075, 1124,
+ 8075, 7593, 8405, 2167, 8075, 1352,
+ 8075, 7593, 8405, 2167, 8075, 1360,
+ 8075, 7593, 8405, 2167, 8075, 2180,
+ 8075, 7593, 8405, 2167, 8075, 4534,
+ 8075, 7593, 8405, 2167, 8075, 5680,
+ 8075, 7593, 8405, 2167, 8075, 7542,
+ 8075, 7593, 8405, 2167, 8075, 8238,
+ 8075, 7593, 8405, 2167, 8523, 2036,
+ 8075, 7593, 8405, 2167, 8523, 2132,
+ 8075, 7593, 8405, 2167, 8523, 2916,
+ 8075, 7593, 8405, 2167, 8523, 7542,
+ 8075, 7593, 8405, 2180,
+ 8075, 7593, 8405, 2250,
+ 8075, 7593, 8405, 2560,
+ 8075, 7593, 8405, 2658,
+ 8075, 7593, 8405, 3246,
+ 8075, 7593, 8405, 4394,
+ 8075, 7593, 8405, 4534,
+ 8075, 7593, 8405, 4722,
+ 8075, 7593, 8405, 4746,
+ 8075, 7593, 8405, 5680,
+ 8075, 7593, 8405, 5766,
+ 8075, 7593, 8405, 6082,
+ 8075, 7593, 8405, 6258,
+ 8075, 7593, 8405, 6640,
+ 8075, 7593, 8405, 6824,
+ 8075, 7593, 8405, 6976,
+ 8075, 7593, 8405, 7090,
+ 8075, 7593, 8405, 7484,
+ 8075, 7593, 8405, 7542,
+ 8075, 7593, 8405, 8238,
+ 8075, 7593, 8405, 8816,
+ 8075, 7593, 8405, 9127, 5680,
+ 8075, 7593, 8405, 9861, 4746,
+ 8075, 7593, 8405, 10295, 236,
+ 8075, 7593, 8405, 10807, 404,
+ 8075, 7593, 8405, 10807, 3244,
+ 8075, 7593, 8405, 10807, 4534,
+ 8075, 7593, 8405, 10807, 4722,
+ 8075, 7593, 8405, 12921, 404,
+ 8075, 7593, 8405, 12921, 1102,
+ 8075, 8775, 375, 516,
+ 8075, 8775, 477, 516,
+ 8075, 8775, 1582,
+ 8075, 8775, 1617, 516,
+ 8075, 8775, 2659, 516,
+ 8075, 8775, 7543, 5766,
+ 8075, 8775, 9738,
+ 8075, 9063, 8405, 28,
+ 8075, 9063, 8405, 202,
+ 8075, 9063, 8405, 374,
+ 8075, 9063, 8405, 404,
+ 8075, 9063, 8405, 476,
+ 8075, 9063, 8405, 516,
+ 8075, 9063, 8405, 582,
+ 8075, 9063, 8405, 986,
+ 8075, 9063, 8405, 1102,
+ 8075, 9063, 8405, 1154,
+ 8075, 9063, 8405, 1616,
+ 8075, 9063, 8405, 1680,
+ 8075, 9063, 8405, 2167, 8075, 236,
+ 8075, 9063, 8405, 2167, 8075, 710,
+ 8075, 9063, 8405, 2167, 8075, 1020,
+ 8075, 9063, 8405, 2167, 8075, 1124,
+ 8075, 9063, 8405, 2167, 8075, 1352,
+ 8075, 9063, 8405, 2167, 8075, 1360,
+ 8075, 9063, 8405, 2167, 8075, 2180,
+ 8075, 9063, 8405, 2167, 8075, 4534,
+ 8075, 9063, 8405, 2167, 8075, 5680,
+ 8075, 9063, 8405, 2167, 8075, 7542,
+ 8075, 9063, 8405, 2167, 8075, 8238,
+ 8075, 9063, 8405, 2167, 8523, 2036,
+ 8075, 9063, 8405, 2167, 8523, 2132,
+ 8075, 9063, 8405, 2167, 8523, 2916,
+ 8075, 9063, 8405, 2167, 8523, 7542,
+ 8075, 9063, 8405, 2180,
+ 8075, 9063, 8405, 2250,
+ 8075, 9063, 8405, 2560,
+ 8075, 9063, 8405, 2658,
+ 8075, 9063, 8405, 3246,
+ 8075, 9063, 8405, 4394,
+ 8075, 9063, 8405, 4534,
+ 8075, 9063, 8405, 4722,
+ 8075, 9063, 8405, 4746,
+ 8075, 9063, 8405, 5680,
+ 8075, 9063, 8405, 5766,
+ 8075, 9063, 8405, 6082,
+ 8075, 9063, 8405, 6258,
+ 8075, 9063, 8405, 6640,
+ 8075, 9063, 8405, 6824,
+ 8075, 9063, 8405, 6976,
+ 8075, 9063, 8405, 7090,
+ 8075, 9063, 8405, 7484,
+ 8075, 9063, 8405, 7542,
+ 8075, 9063, 8405, 8238,
+ 8075, 9063, 8405, 8816,
+ 8075, 9063, 8405, 9127, 5680,
+ 8075, 9063, 8405, 9861, 4746,
+ 8075, 9063, 8405, 10295, 236,
+ 8075, 9063, 8405, 10807, 404,
+ 8075, 9063, 8405, 10807, 3244,
+ 8075, 9063, 8405, 10807, 4534,
+ 8075, 9063, 8405, 10807, 4722,
+ 8075, 9063, 8405, 12921, 404,
+ 8075, 9063, 8405, 12921, 1102,
+ 8075, 10203, 2171, 4388,
+ 8075, 12977, 9178,
+ 8083, 5833, 11163, 5759, 10380,
+ 8088,
+ 8097, 1809, 4876,
+ 8097, 10388,
+ 8097, 13235, 11765, 6434,
+ 8101, 5758,
+ 8101, 9076,
+ 8101, 11626,
+ 8117, 1177, 6716,
+ 8117, 1177, 6957, 6716,
+ 8117, 1177, 8403, 3070,
+ 8117, 1177, 8403, 6178,
+ 8117, 1177, 9251, 6956,
+ 8117, 1177, 9251, 8290,
+ 8117, 1177, 9315, 3070,
+ 8117, 1177, 9315, 6178,
+ 8117, 1177, 10239, 6716,
+ 8121, 9129, 8775, 4213, 2778,
+ 8129, 5758,
+ 8133, 5941, 10677, 3696,
+ 8133, 5941, 11649, 3696,
+ 8133, 5941, 13086,
+ 8133, 5941, 13088,
+ 8133, 5941, 13090,
+ 8133, 5941, 13092,
+ 8133, 5941, 13094,
+ 8133, 5941, 13096,
+ 8133, 5941, 13098,
+ 8133, 5941, 13100,
+ 8133, 5941, 13102,
+ 8133, 5941, 13104,
+ 8133, 5941, 13106,
+ 8133, 5941, 13108,
+ 8133, 5941, 13110,
+ 8133, 5941, 13112,
+ 8133, 5941, 13114,
+ 8133, 5941, 13116,
+ 8133, 5941, 13118,
+ 8133, 5941, 13120,
+ 8133, 5941, 13122,
+ 8133, 5941, 13124,
+ 8133, 5941, 13126,
+ 8133, 5941, 13128,
+ 8133, 5941, 13130,
+ 8133, 5941, 13132,
+ 8133, 5941, 13134,
+ 8133, 5941, 13136,
+ 8133, 5941, 13138,
+ 8133, 5941, 13140,
+ 8133, 5941, 13142,
+ 8133, 5941, 13144,
+ 8133, 5941, 13146,
+ 8133, 5941, 13148,
+ 8133, 5941, 13150,
+ 8133, 5941, 13152,
+ 8133, 5941, 13154,
+ 8133, 5941, 13156,
+ 8133, 5941, 13158,
+ 8133, 5941, 13160,
+ 8133, 5941, 13162,
+ 8133, 5941, 13164,
+ 8133, 5941, 13166,
+ 8133, 5941, 13168,
+ 8133, 5941, 13170,
+ 8133, 5941, 13172,
+ 8133, 5941, 13174,
+ 8133, 5941, 13176,
+ 8133, 5941, 13178,
+ 8133, 5941, 13180,
+ 8133, 5941, 13182,
+ 8133, 5941, 13240,
+ 8133, 5941, 13242,
+ 8133, 5941, 13244,
+ 8133, 5941, 13246,
+ 8133, 5941, 13248,
+ 8133, 5941, 13250,
+ 8133, 5941, 13252,
+ 8133, 5941, 13254,
+ 8133, 5941, 13256,
+ 8133, 5941, 13258,
+ 8133, 5941, 13260,
+ 8133, 5941, 13262,
+ 8133, 5941, 13264,
+ 8133, 5941, 13266,
+ 8133, 5941, 13268,
+ 8133, 5941, 13270,
+ 8133, 5941, 13272,
+ 8133, 5941, 13274,
+ 8133, 5941, 13276,
+ 8133, 5941, 13278,
+ 8133, 5941, 13280,
+ 8133, 5941, 13282,
+ 8133, 5941, 13284,
+ 8133, 5941, 13286,
+ 8133, 5941, 13288,
+ 8133, 5941, 13290,
+ 8133, 5941, 13292,
+ 8133, 5941, 13294,
+ 8133, 5941, 13296,
+ 8133, 5941, 13298,
+ 8133, 5941, 13300,
+ 8133, 5941, 13302,
+ 8133, 5941, 13304,
+ 8133, 5941, 13306,
+ 8133, 5941, 13308,
+ 8133, 5941, 13310,
+ 8133, 5941, 13312,
+ 8133, 5941, 13314,
+ 8133, 5941, 13316,
+ 8133, 5941, 13318,
+ 8133, 5941, 13320,
+ 8133, 5941, 13322,
+ 8133, 5941, 13324,
+ 8133, 5941, 13326,
+ 8133, 5941, 13328,
+ 8133, 5941, 13330,
+ 8133, 5941, 13332,
+ 8133, 5941, 13334,
+ 8133, 5941, 13336,
+ 8151, 6622,
+ 8151, 6778,
+ 8151, 8056,
+ 8151, 8528,
+ 8151, 8744,
+ 8151, 13029, 8450,
+ 8151, 13067, 6408,
+ 8153, 601, 5876,
+ 8153, 1809, 4876,
+ 8153, 4117, 5876,
+ 8153, 4849, 731, 12473, 9050,
+ 8153, 5444,
+ 8153, 6107, 10388,
+ 8153, 6379, 7908,
+ 8153, 6611, 6740,
+ 8153, 7119, 11195, 4926,
+ 8153, 7390,
+ 8153, 7391, 11195, 4926,
+ 8153, 7443, 731, 11099, 9050,
+ 8153, 7768,
+ 8153, 8088,
+ 8153, 8509, 11098,
+ 8153, 8509, 11099, 6121, 10666,
+ 8153, 8509, 12472,
+ 8153, 8745, 7768,
+ 8153, 8745, 12492,
+ 8153, 8759, 2091, 5758,
+ 8153, 8762,
+ 8153, 9095, 6689, 2170,
+ 8153, 9095, 6689, 2540,
+ 8153, 9095, 6689, 2778,
+ 8153, 9095, 6689, 4200,
+ 8153, 9095, 6689, 4214,
+ 8153, 9095, 6689, 5190,
+ 8153, 9095, 6689, 6722,
+ 8153, 9095, 6689, 7508,
+ 8153, 9095, 6689, 7694,
+ 8153, 9095, 8525, 2670,
+ 8153, 9437, 444,
+ 8153, 9437, 720,
+ 8153, 9525, 8306,
+ 8153, 9719, 10374,
+ 8153, 10260,
+ 8153, 10452,
+ 8153, 10469, 4926,
+ 8153, 10574,
+ 8153, 10578,
+ 8153, 10677, 761, 4849, 11378,
+ 8153, 10677, 761, 8153, 4849, 11378,
+ 8153, 10677, 761, 8153, 7443, 11378,
+ 8153, 10677, 4876,
+ 8153, 12017, 4926,
+ 8153, 12492,
+ 8153, 13201, 11195, 4926,
+ 8159, 5244,
+ 8167, 5758,
+ 8167, 5759, 721, 9705, 10410,
+ 8167, 5759, 721, 9705, 10411, 6121, 7709, 6376,
+ 8167, 5759, 6121, 1045, 6490,
+ 8167, 5759, 6121, 2779, 4113, 6377, 721, 2779, 4113, 6490,
+ 8167, 5759, 6121, 6537, 6376,
+ 8167, 5759, 6377, 5445, 5758,
+ 8167, 5759, 6377, 7709, 10374,
+ 8167, 5759, 6377, 11097, 6434,
+ 8167, 5759, 6377, 11765, 6434,
+ 8167, 6121, 9898,
+ 8167, 6610,
+ 8172,
+ 8197, 5758,
+ 8203, 3992,
+ 8203, 7608,
+ 8209, 5401, 10260,
+ 8225, 6906,
+ 8226,
+ 8227, 12133, 4926,
+ 8228,
+ 8231, 12108,
+ 8233, 5566,
+ 8235, 6809, 5758,
+ 8246,
+ 8255, 7359, 5758,
+ 8263, 7630,
+ 8267, 8405, 1104,
+ 8267, 8405, 1510,
+ 8267, 8405, 3234,
+ 8267, 8405, 3980,
+ 8267, 8405, 4324,
+ 8267, 8405, 4384,
+ 8267, 8405, 4622,
+ 8267, 8405, 5191, 9344,
+ 8267, 8405, 6056,
+ 8267, 8405, 6768,
+ 8267, 8405, 6960,
+ 8267, 8405, 6984,
+ 8267, 8405, 7064,
+ 8267, 8405, 7078,
+ 8267, 8405, 7130,
+ 8267, 8405, 7322,
+ 8267, 8405, 7416,
+ 8267, 8405, 7490,
+ 8267, 8405, 7674,
+ 8267, 8405, 7828,
+ 8267, 8405, 7912,
+ 8267, 8405, 8502,
+ 8267, 8405, 8514,
+ 8267, 8405, 8822,
+ 8267, 8405, 9018,
+ 8267, 8405, 10394,
+ 8267, 8405, 10462,
+ 8285, 721, 5424,
+ 8285, 721, 8712,
+ 8287, 8153, 1045, 5965, 4926,
+ 8287, 8206,
+ 8287, 8405, 0,
+ 8287, 8405, 8,
+ 8287, 8405, 16,
+ 8287, 8405, 28,
+ 8287, 8405, 40,
+ 8287, 8405, 66,
+ 8287, 8405, 178,
+ 8287, 8405, 188,
+ 8287, 8405, 426,
+ 8287, 8405, 622,
+ 8287, 8405, 626,
+ 8287, 8405, 630,
+ 8287, 8405, 652,
+ 8287, 8405, 654,
+ 8287, 8405, 656,
+ 8287, 8405, 660,
+ 8287, 8405, 664,
+ 8287, 8405, 2908,
+ 8287, 8405, 2926,
+ 8287, 8405, 3012,
+ 8287, 8405, 3056,
+ 8287, 8405, 5770,
+ 8287, 8405, 6216,
+ 8287, 8405, 6230,
+ 8287, 8405, 6422,
+ 8287, 8405, 6594,
+ 8287, 8405, 6912,
+ 8287, 8405, 6982,
+ 8287, 8405, 7166,
+ 8287, 8405, 7244,
+ 8287, 8405, 7372,
+ 8287, 8405, 7440,
+ 8287, 8405, 7862,
+ 8287, 8405, 7866,
+ 8287, 8405, 7932,
+ 8287, 8405, 8362,
+ 8287, 8405, 8828,
+ 8287, 8405, 8950,
+ 8287, 8405, 8956,
+ 8287, 8405, 9086,
+ 8287, 8405, 9400,
+ 8287, 8405, 9562,
+ 8287, 8405, 9588,
+ 8287, 8405, 9780,
+ 8287, 8405, 10686,
+ 8287, 8405, 11248,
+ 8287, 8405, 11682,
+ 8287, 8405, 11696,
+ 8287, 8405, 11728,
+ 8287, 8405, 11758,
+ 8287, 8405, 11804,
+ 8287, 8405, 11812,
+ 8287, 8405, 11814,
+ 8287, 8405, 11824,
+ 8287, 8405, 11826,
+ 8287, 8405, 11828,
+ 8287, 8405, 11830,
+ 8287, 8405, 11832,
+ 8287, 8405, 12070,
+ 8287, 8405, 12080,
+ 8287, 8405, 12094,
+ 8287, 8405, 12096,
+ 8287, 8405, 12124,
+ 8287, 8405, 12144,
+ 8287, 8405, 12146,
+ 8287, 8405, 12150,
+ 8287, 8405, 12346,
+ 8287, 8405, 12348,
+ 8287, 8405, 12350,
+ 8287, 8405, 12352,
+ 8287, 8405, 12388,
+ 8287, 8405, 12514,
+ 8287, 8405, 12518,
+ 8287, 8405, 12520,
+ 8287, 8405, 12532,
+ 8287, 8405, 12534,
+ 8287, 8405, 12958,
+ 8287, 8405, 12960,
+ 8287, 8405, 12972,
+ 8287, 8405, 12978,
+ 8287, 8405, 12998,
+ 8287, 8405, 13004,
+ 8287, 8405, 13006,
+ 8287, 8405, 13008,
+ 8287, 8405, 13034,
+ 8287, 8405, 13204,
+ 8287, 8405, 13348,
+ 8287, 8405, 13354,
+ 8287, 8405, 13366,
+ 8287, 8405, 13368,
+ 8287, 8405, 13370,
+ 8287, 8405, 13374,
+ 8287, 8405, 13386,
+ 8287, 8717, 1045, 5965, 4926,
+ 8287, 9945, 5770,
+ 8287, 9945, 6594,
+ 8287, 9945, 6912,
+ 8287, 9945, 6982,
+ 8287, 9945, 7166,
+ 8287, 9945, 7244,
+ 8287, 9945, 7372,
+ 8287, 9945, 7440,
+ 8287, 9945, 8206,
+ 8287, 9945, 8362,
+ 8287, 9945, 8828,
+ 8287, 9945, 9086,
+ 8287, 9945, 9400,
+ 8287, 9945, 9562,
+ 8287, 9945, 9588,
+ 8287, 9945, 9780,
+ 8287, 9945, 10686,
+ 8287, 9945, 11248,
+ 8287, 9945, 11652,
+ 8287, 9945, 11728,
+ 8287, 9945, 11804,
+ 8287, 9945, 11806,
+ 8287, 9945, 11808,
+ 8287, 9945, 11810,
+ 8287, 9945, 11812,
+ 8287, 9945, 11814,
+ 8287, 9945, 11816,
+ 8287, 9945, 11824,
+ 8287, 9945, 11826,
+ 8287, 9945, 11828,
+ 8287, 9945, 11830,
+ 8287, 9945, 11832,
+ 8287, 9945, 11834,
+ 8287, 9945, 11902,
+ 8287, 9945, 12044,
+ 8287, 9945, 12046,
+ 8287, 9945, 12048,
+ 8287, 9945, 12080,
+ 8287, 9945, 12098,
+ 8287, 9945, 12124,
+ 8287, 9945, 12128,
+ 8287, 9945, 12144,
+ 8287, 9945, 12148,
+ 8287, 9945, 12346,
+ 8287, 9945, 12348,
+ 8287, 9945, 12350,
+ 8287, 9945, 12352,
+ 8287, 9945, 12388,
+ 8287, 9945, 12424,
+ 8287, 9945, 12484,
+ 8287, 9945, 12486,
+ 8287, 9945, 12512,
+ 8287, 9945, 12514,
+ 8287, 9945, 12518,
+ 8287, 9945, 12520,
+ 8287, 9945, 12858,
+ 8287, 9945, 12860,
+ 8287, 9945, 12862,
+ 8287, 9945, 12864,
+ 8287, 9945, 12908,
+ 8287, 9945, 12910,
+ 8287, 9945, 12942,
+ 8287, 9945, 12946,
+ 8287, 9945, 12948,
+ 8287, 9945, 12950,
+ 8287, 9945, 12958,
+ 8287, 9945, 12960,
+ 8287, 9945, 12962,
+ 8287, 9945, 12992,
+ 8287, 9945, 12994,
+ 8287, 9945, 12996,
+ 8287, 9945, 12998,
+ 8287, 9945, 13026,
+ 8287, 9945, 13078,
+ 8287, 9945, 13192,
+ 8287, 9945, 13194,
+ 8287, 9945, 13196,
+ 8287, 9945, 13204,
+ 8287, 9945, 13218,
+ 8287, 9945, 13238,
+ 8287, 9945, 13342,
+ 8287, 9945, 13344,
+ 8287, 9945, 13358,
+ 8287, 9945, 13366,
+ 8287, 9945, 13368,
+ 8287, 9945, 13378,
+ 8287, 9945, 13382,
+ 8287, 9945, 13384,
+ 8287, 9945, 13386,
+ 8287, 9945, 13408,
+ 8287, 9945, 13412,
+ 8287, 11071, 5770,
+ 8287, 11071, 6594,
+ 8287, 11071, 6912,
+ 8287, 11071, 6982,
+ 8287, 11071, 7166,
+ 8287, 11071, 7244,
+ 8287, 11071, 7372,
+ 8287, 11071, 7440,
+ 8287, 11071, 8362,
+ 8287, 11071, 8828,
+ 8287, 11071, 9086,
+ 8287, 11071, 9400,
+ 8287, 11071, 9562,
+ 8287, 11071, 9588,
+ 8287, 11071, 9780,
+ 8287, 11071, 10686,
+ 8287, 11071, 11248,
+ 8287, 11071, 11682,
+ 8287, 11071, 11696,
+ 8287, 11071, 11728,
+ 8287, 11071, 11758,
+ 8287, 11071, 11814,
+ 8287, 11071, 11816,
+ 8287, 11071, 11828,
+ 8287, 11071, 11834,
+ 8287, 11071, 12032,
+ 8287, 11071, 12034,
+ 8287, 11071, 12036,
+ 8287, 11071, 12038,
+ 8287, 11071, 12070,
+ 8287, 11071, 12078,
+ 8287, 11071, 12080,
+ 8287, 11071, 12082,
+ 8287, 11071, 12094,
+ 8287, 11071, 12096,
+ 8287, 11071, 12126,
+ 8287, 11071, 12130,
+ 8287, 11071, 12144,
+ 8287, 11071, 12146,
+ 8287, 11071, 12148,
+ 8287, 11071, 12150,
+ 8287, 11071, 12346,
+ 8287, 11071, 12348,
+ 8287, 11071, 12350,
+ 8287, 11071, 12388,
+ 8287, 11071, 12484,
+ 8287, 11071, 12496,
+ 8287, 11071, 12508,
+ 8287, 11071, 12512,
+ 8287, 11071, 12514,
+ 8287, 11071, 12532,
+ 8287, 11071, 12534,
+ 8287, 11071, 12884,
+ 8287, 11071, 12944,
+ 8287, 11071, 12958,
+ 8287, 11071, 12960,
+ 8287, 11071, 12970,
+ 8287, 11071, 12972,
+ 8287, 11071, 12978,
+ 8287, 11071, 12980,
+ 8287, 11071, 12992,
+ 8287, 11071, 12996,
+ 8287, 11071, 13002,
+ 8287, 11071, 13004,
+ 8287, 11071, 13006,
+ 8287, 11071, 13008,
+ 8287, 11071, 13026,
+ 8287, 11071, 13034,
+ 8287, 11071, 13204,
+ 8287, 11071, 13214,
+ 8287, 11071, 13224,
+ 8287, 11071, 13346,
+ 8287, 11071, 13348,
+ 8287, 11071, 13354,
+ 8287, 11071, 13362,
+ 8287, 11071, 13370,
+ 8287, 11071, 13372,
+ 8287, 11071, 13374,
+ 8287, 11071, 13388,
+ 8287, 11071, 13394,
+ 8287, 11071, 13396,
+ 8287, 11071, 13406,
+ 8287, 11073, 0,
+ 8287, 11073, 8,
+ 8287, 11073, 16,
+ 8287, 11073, 28,
+ 8287, 11073, 40,
+ 8287, 11073, 66,
+ 8287, 11073, 178,
+ 8287, 11073, 188,
+ 8287, 11073, 426,
+ 8287, 11073, 622,
+ 8287, 11073, 626,
+ 8287, 11073, 630,
+ 8287, 11073, 652,
+ 8287, 11073, 654,
+ 8287, 11073, 656,
+ 8287, 11073, 660,
+ 8287, 11073, 664,
+ 8287, 11073, 686,
+ 8287, 11073, 688,
+ 8287, 11073, 1466,
+ 8287, 11073, 1468,
+ 8287, 11073, 1470,
+ 8287, 11073, 2148,
+ 8287, 11073, 2150,
+ 8287, 11073, 2152,
+ 8287, 11073, 2800,
+ 8287, 11073, 2802,
+ 8287, 11073, 2908,
+ 8287, 11073, 2926,
+ 8287, 11073, 3012,
+ 8287, 11073, 3056,
+ 8287, 11073, 4160,
+ 8287, 11073, 4162,
+ 8287, 11073, 4168,
+ 8287, 11073, 4592,
+ 8287, 11073, 4594,
+ 8287, 11073, 5370,
+ 8287, 11073, 5372,
+ 8287, 11073, 6040,
+ 8287, 11073, 6042,
+ 8287, 11073, 6158,
+ 8287, 11073, 6204,
+ 8287, 11073, 6216,
+ 8287, 11073, 6218,
+ 8287, 11073, 6226,
+ 8287, 11073, 6228,
+ 8287, 11073, 6230,
+ 8287, 11073, 6232,
+ 8287, 11073, 6422,
+ 8287, 11073, 6736,
+ 8287, 11073, 6760,
+ 8287, 11073, 7838,
+ 8287, 11073, 7850,
+ 8287, 11073, 7852,
+ 8287, 11073, 7862,
+ 8287, 11073, 7864,
+ 8287, 11073, 7866,
+ 8287, 11073, 8206,
+ 8287, 11073, 8950,
+ 8287, 11073, 8952,
+ 8287, 11073, 8956,
+ 8287, 11073, 9002,
+ 8287, 11073, 9004,
+ 8287, 11073, 9346,
+ 8287, 11073, 9800,
+ 8287, 11073, 9882,
+ 8287, 11073, 11822,
+ 8293, 4927, 7121, 1044,
+ 8293, 4927, 7773, 1044,
+ 8293, 4927, 8455, 8056,
+ 8293, 7383, 2535, 1044,
+ 8293, 7383, 5522,
+ 8293, 7383, 5699, 1044,
+ 8293, 7383, 6901, 7342,
+ 8293, 7383, 6901, 7502,
+ 8293, 7383, 6901, 8620,
+ 8293, 7383, 6914,
+ 8293, 7383, 6948,
+ 8293, 7383, 6949, 6899, 1177, 2852,
+ 8293, 7383, 7148,
+ 8293, 7383, 7342,
+ 8293, 7383, 7502,
+ 8293, 7383, 7536,
+ 8293, 7383, 7742,
+ 8293, 7383, 8087, 445, 7132,
+ 8293, 7383, 8620,
+ 8293, 7383, 8621, 7404,
+ 8293, 7383, 8626,
+ 8293, 7383, 12957, 8910,
+ 8293, 7909, 2168,
+ 8293, 7909, 4054,
+ 8293, 7909, 4604,
+ 8293, 7909, 6439, 8280,
+ 8293, 7909, 6652,
+ 8293, 7909, 7192,
+ 8293, 7909, 7346,
+ 8293, 7909, 7402,
+ 8293, 7909, 7432,
+ 8293, 7909, 7502,
+ 8293, 7909, 7676,
+ 8293, 7909, 7855, 785, 6222,
+ 8293, 7909, 7858,
+ 8293, 7909, 7869, 6816,
+ 8293, 7909, 7869, 7404,
+ 8293, 7909, 7870,
+ 8293, 7909, 7886,
+ 8293, 7909, 8252,
+ 8293, 7909, 8253, 8492,
+ 8293, 7909, 8468,
+ 8293, 7909, 8469, 8346,
+ 8293, 7909, 8568,
+ 8293, 7909, 8623, 5398,
+ 8293, 7909, 8830,
+ 8293, 7909, 9272,
+ 8293, 7909, 9773, 8244,
+ 8293, 7909, 9773, 8624,
+ 8293, 7909, 10310,
+ 8293, 7909, 11016,
+ 8293, 7909, 11798,
+ 8293, 8405, 238,
+ 8293, 8405, 239, 6121, 7132,
+ 8293, 8405, 468,
+ 8293, 8405, 469, 6121, 5522,
+ 8293, 8405, 469, 6121, 8086,
+ 8293, 8405, 788,
+ 8293, 8405, 789, 6121, 5522,
+ 8293, 8405, 789, 6121, 8086,
+ 8293, 8405, 1366,
+ 8293, 8405, 1578,
+ 8293, 8405, 1579, 6121, 5522,
+ 8293, 8405, 1579, 6121, 8086,
+ 8293, 8405, 1892,
+ 8293, 8405, 1893, 6121, 8086,
+ 8293, 8405, 2110,
+ 8293, 8405, 2111, 6121, 8086,
+ 8293, 8405, 2318,
+ 8293, 8405, 2319, 6121, 8086,
+ 8293, 8405, 2660,
+ 8293, 8405, 2661, 6121, 8086,
+ 8293, 8405, 2674,
+ 8293, 8405, 2675, 6121, 8086,
+ 8293, 8405, 2852,
+ 8293, 8405, 2853, 6121, 6948,
+ 8293, 8405, 2853, 6121, 8086,
+ 8293, 8405, 3080,
+ 8293, 8405, 3081, 6121, 6914,
+ 8293, 8405, 3081, 6121, 8086,
+ 8293, 8405, 3244,
+ 8293, 8405, 3245, 6121, 7132,
+ 8293, 8405, 3245, 6121, 7342,
+ 8293, 8405, 3245, 6121, 8620,
+ 8293, 8405, 3292,
+ 8293, 8405, 5538,
+ 8293, 8405, 5539, 6121, 8086,
+ 8293, 8405, 5698,
+ 8293, 8405, 5699, 6121, 2535, 1044,
+ 8293, 8405, 5699, 6121, 5699, 1044,
+ 8293, 8405, 5699, 6121, 8086,
+ 8293, 8405, 5699, 6121, 8087, 721, 2535, 1044,
+ 8293, 8405, 5699, 6121, 8087, 721, 5699, 1044,
+ 8293, 8405, 6115, 238,
+ 8293, 8405, 6115, 1578,
+ 8293, 8405, 6115, 2660,
+ 8293, 8405, 6115, 3244,
+ 8293, 8405, 6115, 5538,
+ 8293, 8405, 6115, 6642,
+ 8293, 8405, 6115, 6789, 1892,
+ 8293, 8405, 6115, 7082,
+ 8293, 8405, 6642,
+ 8293, 8405, 6643, 6121, 8086,
+ 8293, 8405, 6789, 468,
+ 8293, 8405, 6789, 469, 6121, 8086,
+ 8293, 8405, 6789, 1578,
+ 8293, 8405, 6789, 1579, 6121, 8086,
+ 8293, 8405, 6789, 1892,
+ 8293, 8405, 6789, 2110,
+ 8293, 8405, 6789, 7740,
+ 8293, 8405, 6856,
+ 8293, 8405, 6857, 6121, 8086,
+ 8293, 8405, 7082,
+ 8293, 8405, 7083, 6121, 8086,
+ 8293, 8405, 7740,
+ 8293, 8405, 7741, 6121, 8086,
+ 8293, 8405, 7872,
+ 8293, 8405, 7873, 6121, 8086,
+ 8293, 8405, 8660,
+ 8293, 8405, 8661, 6121, 8086,
+ 8293, 8405, 11893, 3292,
+ 8293, 8405, 11893, 5445, 5758,
+ 8293, 10301, 3245, 7082,
+ 8293, 10301, 9847, 2853, 3080,
+ 8293, 10301, 9847, 3081, 3081, 7342,
+ 8293, 10301, 9847, 8153, 2852,
+ 8293, 10301, 9847, 8153, 3080,
+ 8293, 12133, 2111, 9318,
+ 8293, 12133, 2551, 7340,
+ 8293, 12133, 7134,
+ 8293, 12133, 7338,
+ 8293, 12133, 8252,
+ 8293, 12133, 11016,
+ 8306,
+ 8307, 6121, 10804,
+ 8307, 8022,
+ 8337, 9617, 151, 2090,
+ 8337, 9617, 228,
+ 8337, 9617, 229, 8722,
+ 8337, 9617, 720,
+ 8337, 9617, 742,
+ 8337, 9617, 806,
+ 8337, 9617, 824,
+ 8337, 9617, 920,
+ 8337, 9617, 1036,
+ 8337, 9617, 1044,
+ 8337, 9617, 1048,
+ 8337, 9617, 1090,
+ 8337, 9617, 1092,
+ 8337, 9617, 1136,
+ 8337, 9617, 1170,
+ 8337, 9617, 1182,
+ 8337, 9617, 1474,
+ 8337, 9617, 1504,
+ 8337, 9617, 1780,
+ 8337, 9617, 1860,
+ 8337, 9617, 2024,
+ 8337, 9617, 2090,
+ 8337, 9617, 2166,
+ 8337, 9617, 2170,
+ 8337, 9617, 2224,
+ 8337, 9617, 2390,
+ 8337, 9617, 2392,
+ 8337, 9617, 2400,
+ 8337, 9617, 2454,
+ 8337, 9617, 2502,
+ 8337, 9617, 2504,
+ 8337, 9617, 2586,
+ 8337, 9617, 2670,
+ 8337, 9617, 2778,
+ 8337, 9617, 2779, 6896,
+ 8337, 9617, 2834,
+ 8337, 9617, 3762,
+ 8337, 9617, 3788,
+ 8337, 9617, 3794,
+ 8337, 9617, 3798,
+ 8337, 9617, 3800,
+ 8337, 9617, 3805, 429, 6604,
+ 8337, 9617, 3806,
+ 8337, 9617, 3850,
+ 8337, 9617, 3852,
+ 8337, 9617, 3940,
+ 8337, 9617, 3942,
+ 8337, 9617, 3944,
+ 8337, 9617, 4052,
+ 8337, 9617, 4094,
+ 8337, 9617, 4108,
+ 8337, 9617, 4117, 826,
+ 8337, 9617, 4120,
+ 8337, 9617, 4172,
+ 8337, 9617, 4178,
+ 8337, 9617, 4180,
+ 8337, 9617, 4194,
+ 8337, 9617, 4196,
+ 8337, 9617, 4208,
+ 8337, 9617, 4218,
+ 8337, 9617, 4244,
+ 8337, 9617, 4342,
+ 8337, 9617, 4386,
+ 8337, 9617, 4389, 5969, 7736,
+ 8337, 9617, 4390,
+ 8337, 9617, 4398,
+ 8337, 9617, 4402,
+ 8337, 9617, 4530,
+ 8337, 9617, 4536,
+ 8337, 9617, 4608,
+ 8337, 9617, 4628,
+ 8337, 9617, 4824,
+ 8337, 9617, 4834,
+ 8337, 9617, 4844,
+ 8337, 9617, 4846,
+ 8337, 9617, 4850,
+ 8337, 9617, 4872,
+ 8337, 9617, 4876,
+ 8337, 9617, 4894,
+ 8337, 9617, 4895, 8756,
+ 8337, 9617, 4940,
+ 8337, 9617, 5012,
+ 8337, 9617, 5242,
+ 8337, 9617, 5385, 826,
+ 8337, 9617, 5438,
+ 8337, 9617, 5524,
+ 8337, 9617, 5546,
+ 8337, 9617, 5562,
+ 8337, 9617, 5632,
+ 8337, 9617, 5646,
+ 8337, 9617, 5650,
+ 8337, 9617, 5764,
+ 8337, 9617, 5772,
+ 8337, 9617, 5834,
+ 8337, 9617, 5836,
+ 8337, 9617, 5884,
+ 8337, 9617, 5940,
+ 8337, 9617, 5968,
+ 8337, 9617, 6100,
+ 8337, 9617, 6101, 10970,
+ 8337, 9617, 6112,
+ 8337, 9617, 6116,
+ 8337, 9617, 6118,
+ 8337, 9617, 6130,
+ 8337, 9617, 6132,
+ 8337, 9617, 6384,
+ 8337, 9617, 6434,
+ 8337, 9617, 6504,
+ 8337, 9617, 6512,
+ 8337, 9617, 6520,
+ 8337, 9617, 6574,
+ 8337, 9617, 6600,
+ 8337, 9617, 6612,
+ 8337, 9617, 6618,
+ 8337, 9617, 6670,
+ 8337, 9617, 6716,
+ 8337, 9617, 6722,
+ 8337, 9617, 6734,
+ 8337, 9617, 6780,
+ 8337, 9617, 6786,
+ 8337, 9617, 6794,
+ 8337, 9617, 6852,
+ 8337, 9617, 6870,
+ 8337, 9617, 6872,
+ 8337, 9617, 6906,
+ 8337, 9617, 6952,
+ 8337, 9617, 7056,
+ 8337, 9617, 7144,
+ 8337, 9617, 7184,
+ 8337, 9617, 7186,
+ 8337, 9617, 7388,
+ 8337, 9617, 7443, 5385, 826,
+ 8337, 9617, 7446,
+ 8337, 9617, 7526,
+ 8337, 9617, 7532,
+ 8337, 9617, 7548,
+ 8337, 9617, 7551, 8785, 3788,
+ 8337, 9617, 7551, 8824,
+ 8337, 9617, 7580,
+ 8337, 9617, 7582,
+ 8337, 9617, 7584,
+ 8337, 9617, 7592,
+ 8337, 9617, 7602,
+ 8337, 9617, 7604,
+ 8337, 9617, 7612,
+ 8337, 9617, 7616,
+ 8337, 9617, 7628,
+ 8337, 9617, 7634,
+ 8337, 9617, 7642,
+ 8337, 9617, 7654,
+ 8337, 9617, 7662,
+ 8337, 9617, 7704,
+ 8337, 9617, 7726,
+ 8337, 9617, 7730,
+ 8337, 9617, 7812,
+ 8337, 9617, 7816,
+ 8337, 9617, 7820,
+ 8337, 9617, 7830,
+ 8337, 9617, 7832,
+ 8337, 9617, 7942,
+ 8337, 9617, 7964,
+ 8337, 9617, 7974,
+ 8337, 9617, 8000,
+ 8337, 9617, 8008,
+ 8337, 9617, 8078,
+ 8337, 9617, 8118,
+ 8337, 9617, 8151, 5896,
+ 8337, 9617, 8151, 6600,
+ 8337, 9617, 8153, 46,
+ 8337, 9617, 8154,
+ 8337, 9617, 8194,
+ 8337, 9617, 8303, 10970,
+ 8337, 9617, 8316,
+ 8337, 9617, 8476,
+ 8337, 9617, 8484,
+ 8337, 9617, 8542,
+ 8337, 9617, 8678,
+ 8337, 9617, 8680,
+ 8337, 9617, 8730,
+ 8337, 9617, 8734,
+ 8337, 9617, 8740,
+ 8337, 9617, 8744,
+ 8337, 9617, 8793, 9426,
+ 8337, 9617, 8844,
+ 8337, 9617, 8852,
+ 8337, 9617, 8866,
+ 8337, 9617, 8870,
+ 8337, 9617, 8906,
+ 8337, 9617, 8928,
+ 8337, 9617, 8946,
+ 8337, 9617, 9056,
+ 8337, 9617, 9102,
+ 8337, 9617, 9106,
+ 8337, 9617, 9274,
+ 8337, 9617, 9282,
+ 8337, 9617, 9322,
+ 8337, 9617, 9426,
+ 8337, 9617, 9480,
+ 8337, 9617, 9532,
+ 8337, 9617, 9608,
+ 8337, 9617, 9658,
+ 8337, 9617, 9822,
+ 8337, 9617, 9934,
+ 8337, 9617, 10206,
+ 8337, 9617, 10336,
+ 8337, 9617, 10344,
+ 8337, 9617, 10456,
+ 8337, 9617, 10520,
+ 8337, 9617, 10542,
+ 8337, 9617, 10970,
+ 8337, 9617, 11488,
+ 8337, 9617, 11606,
+ 8337, 9617, 11946,
+ 8337, 9617, 12155, 6118,
+ 8349, 5758,
+ 8371, 10539, 8774,
+ 8389, 5912,
+ 8389, 5913, 445, 6741, 568,
+ 8401, 5759, 2388,
+ 8401, 5759, 7282,
+ 8401, 6689, 2170,
+ 8401, 6689, 2540,
+ 8401, 6689, 2778,
+ 8401, 6689, 4200,
+ 8401, 6689, 4214,
+ 8401, 6689, 5190,
+ 8401, 6689, 6260,
+ 8401, 6689, 6722,
+ 8401, 6689, 7508,
+ 8401, 6689, 7694,
+ 8401, 7803, 5759, 8,
+ 8401, 7803, 5759, 16,
+ 8401, 7803, 5759, 28,
+ 8401, 7803, 5759, 40,
+ 8401, 7803, 5759, 58,
+ 8401, 7803, 5759, 440,
+ 8401, 7803, 5759, 606,
+ 8401, 8405, 0,
+ 8401, 8405, 100,
+ 8401, 8405, 116,
+ 8401, 8405, 138,
+ 8401, 8405, 196,
+ 8401, 8405, 216,
+ 8401, 8405, 236,
+ 8401, 8405, 292,
+ 8401, 8405, 306,
+ 8401, 8405, 332,
+ 8401, 8405, 364,
+ 8401, 8405, 392,
+ 8401, 8405, 462,
+ 8401, 8405, 510,
+ 8401, 8405, 524,
+ 8401, 8405, 556,
+ 8401, 8405, 610,
+ 8401, 8405, 622,
+ 8401, 8405, 652,
+ 8401, 8405, 814,
+ 8401, 8405, 884,
+ 8401, 8405, 974,
+ 8401, 8405, 1080,
+ 8401, 8405, 1168,
+ 8401, 8405, 1286,
+ 8401, 8405, 1390,
+ 8401, 8405, 1612,
+ 8401, 8405, 1652,
+ 8401, 8405, 1930,
+ 8401, 8405, 2030,
+ 8401, 8405, 2126,
+ 8401, 8405, 2212,
+ 8401, 8405, 2234,
+ 8401, 8405, 2516,
+ 8401, 8405, 2678,
+ 8401, 8405, 2732,
+ 8401, 8405, 2746,
+ 8401, 8405, 5978,
+ 8401, 8405, 5994,
+ 8401, 10775, 5759, 20,
+ 8401, 10775, 5759, 22,
+ 8401, 10775, 5759, 24,
+ 8401, 10775, 5759, 26,
+ 8401, 10775, 5759, 30,
+ 8401, 10775, 5759, 34,
+ 8401, 10775, 5759, 38,
+ 8401, 10775, 5759, 4720,
+ 8401, 10775, 5759, 9522,
+ 8401, 11257, 8405, 510,
+ 8401, 11257, 8405, 652,
+ 8401, 12133, 5301, 8827, 8782,
+ 8401, 12133, 8038,
+ 8401, 12133, 8782,
+ 8401, 12133, 8856,
+ 8401, 12133, 8857, 8038,
+ 8421, 3, 8775, 3328,
+ 8421, 3, 8775, 3330,
+ 8421, 3, 8775, 3336,
+ 8421, 3, 8775, 3360,
+ 8421, 3, 8775, 3384,
+ 8421, 3, 8775, 3388,
+ 8421, 3, 8775, 3402,
+ 8421, 3, 8775, 3416,
+ 8421, 3, 8775, 3418,
+ 8421, 3, 8775, 3448,
+ 8421, 3, 8775, 3454,
+ 8421, 3, 8775, 3456,
+ 8421, 3, 8775, 3460,
+ 8421, 3, 8775, 3464,
+ 8421, 3, 10247, 3471, 1860,
+ 8421, 3, 10247, 3473, 7830,
+ 8421, 3, 10247, 3475, 4052,
+ 8421, 3, 10247, 3477, 6742,
+ 8421, 3, 10247, 3479, 7816,
+ 8421, 3, 10247, 3481, 7978,
+ 8421, 3, 10247, 3483, 7314,
+ 8421, 3, 10247, 3485, 7614,
+ 8421, 3, 10247, 3487, 9134,
+ 8421, 3, 10247, 3493, 2164,
+ 8421, 3, 10247, 3495, 6118,
+ 8421, 3, 10247, 3496,
+ 8421, 3, 10247, 3503, 8018,
+ 8421, 3, 10247, 3505, 4342,
+ 8421, 3, 10247, 3506,
+ 8421, 3, 10247, 3509, 6124,
+ 8421, 3, 10247, 3510,
+ 8421, 3, 10247, 3512,
+ 8421, 3, 10247, 3515, 4536,
+ 8421, 3, 10247, 3516,
+ 8421, 3, 10247, 3518,
+ 8421, 3, 10247, 3520,
+ 8421, 3, 10247, 3526,
+ 8421, 3, 10247, 3528,
+ 8421, 3, 10247, 3531, 6604,
+ 8421, 3, 10247, 3532,
+ 8421, 3, 10247, 3534,
+ 8421, 3, 10247, 3537, 9300,
+ 8421, 3, 10247, 3539, 7936,
+ 8421, 3, 10247, 3540,
+ 8421, 3, 10247, 3542,
+ 8421, 3, 10247, 3544,
+ 8421, 3, 10247, 3546,
+ 8421, 3, 10247, 3548,
+ 8421, 3, 10247, 3550,
+ 8421, 3, 10247, 3552,
+ 8421, 3, 10247, 3554,
+ 8421, 3, 10247, 3556,
+ 8421, 3, 10247, 3559, 7182,
+ 8421, 3, 10247, 3560,
+ 8421, 3, 10247, 3563, 5968,
+ 8421, 3, 10247, 3564,
+ 8421, 3, 10247, 3566,
+ 8421, 3, 10247, 3568,
+ 8421, 3, 10247, 3570,
+ 8421, 3, 10247, 3572,
+ 8421, 3, 10247, 3574,
+ 8421, 3, 10247, 3576,
+ 8421, 3, 10247, 3578,
+ 8421, 3, 10247, 3580,
+ 8421, 3, 10247, 3582,
+ 8421, 3, 10247, 3584,
+ 8421, 3, 10247, 3587, 8296,
+ 8421, 3, 10247, 3629, 11000,
+ 8421, 3, 10247, 3635, 9030,
+ 8421, 3, 10247, 3645, 7612,
+ 8421, 3, 10247, 3647, 6434,
+ 8421, 3, 10247, 3648,
+ 8421, 3, 10247, 3651, 7656,
+ 8421, 3, 10247, 3652,
+ 8421, 3, 10247, 3654,
+ 8421, 3, 10247, 3657, 9841, 9082,
+ 8421, 3, 10247, 3659, 9082,
+ 8421, 3, 10247, 3661, 9083, 6806,
+ 8421, 3, 10247, 3663, 7818,
+ 8421, 3, 10247, 3664,
+ 8421, 3, 10247, 3666,
+ 8421, 3, 10247, 3670,
+ 8421, 3, 10247, 3672,
+ 8421, 3, 10247, 3676,
+ 8421, 3, 10247, 3678,
+ 8421, 3, 10247, 3680,
+ 8421, 3, 10247, 3683, 3990,
+ 8421, 3, 10247, 3684,
+ 8421, 3, 10247, 3686,
+ 8421, 3, 10247, 3688,
+ 8421, 3, 10247, 3690,
+ 8421, 3, 10247, 3692,
+ 8421, 3, 10247, 6445, 4924,
+ 8421, 3, 10247, 6447, 10536,
+ 8421, 3, 10247, 6449, 1132,
+ 8421, 3, 10247, 6451, 2386,
+ 8421, 3, 10247, 6453, 10516,
+ 8421, 3, 10247, 6455, 9332,
+ 8421, 3, 10247, 6457, 2562,
+ 8421, 3, 10247, 6459, 3796,
+ 8421, 3, 10247, 6461, 920,
+ 8421, 3, 10247, 6463, 3812,
+ 8421, 3, 10247, 8915, 3522,
+ 8421, 3, 10247, 8915, 3588,
+ 8421, 3, 10247, 8915, 3590,
+ 8421, 3, 10247, 8915, 3592,
+ 8421, 3, 10247, 8915, 3594,
+ 8421, 3, 10247, 8915, 3596,
+ 8421, 3, 10247, 8915, 3598,
+ 8421, 3, 10247, 8915, 3600,
+ 8421, 3, 10247, 8915, 3602,
+ 8421, 3, 10247, 8915, 3604,
+ 8421, 3, 10247, 8915, 3606,
+ 8421, 3, 10247, 8915, 3608,
+ 8421, 3, 10247, 8915, 3610,
+ 8421, 3, 10247, 8915, 3612,
+ 8421, 3, 10247, 8915, 3614,
+ 8421, 3, 10247, 8915, 3616,
+ 8421, 3, 10247, 8915, 3618,
+ 8421, 3, 10247, 8915, 3620,
+ 8421, 3, 10247, 8915, 3622,
+ 8421, 3, 10247, 8915, 3624,
+ 8421, 3, 10247, 8915, 3626,
+ 8421, 3, 10247, 8915, 3630,
+ 8421, 3, 10247, 8915, 3632,
+ 8421, 3, 10247, 8915, 3636,
+ 8421, 3, 10247, 8915, 3638,
+ 8421, 3, 10247, 8915, 3640,
+ 8421, 3, 10247, 8915, 3642,
+ 8421, 3, 10247, 8915, 3674,
+ 8421, 3, 10247, 8915, 3694,
+ 8421, 3, 10343, 3489, 4726,
+ 8421, 3, 10343, 3491, 8334,
+ 8421, 3, 10343, 3499, 6424,
+ 8421, 3, 10343, 3501, 4948,
+ 8421, 3, 10343, 3525, 7754,
+ 8421, 3, 10343, 3669, 6692,
+ 8421, 3, 10585, 3295, 138,
+ 8421, 3, 10585, 3297, 516,
+ 8421, 3, 10585, 3299, 462,
+ 8421, 3, 10585, 3301, 560,
+ 8421, 3, 10585, 3303, 568,
+ 8421, 3, 10585, 3305, 392,
+ 8421, 3, 10585, 3307, 144,
+ 8421, 3, 10585, 3309, 0,
+ 8421, 3, 10585, 3311, 526,
+ 8421, 3, 10585, 3313, 40,
+ 8421, 3, 10585, 3315, 480,
+ 8421, 3, 10585, 3317, 536,
+ 8421, 3, 10585, 3319, 368,
+ 8421, 3, 10585, 3321, 150,
+ 8421, 3, 10585, 3323, 380,
+ 8421, 3, 10585, 3325, 496,
+ 8421, 3, 10585, 3327, 670,
+ 8421, 3, 10585, 3333, 678,
+ 8421, 3, 10585, 3335, 500,
+ 8421, 3, 10585, 3339, 384,
+ 8421, 3, 10585, 3341, 396,
+ 8421, 3, 10585, 3343, 54,
+ 8421, 3, 10585, 3345, 520,
+ 8421, 3, 10585, 3347, 512,
+ 8421, 3, 10585, 3349, 16,
+ 8421, 3, 10585, 3351, 2254,
+ 8421, 3, 10585, 3353, 404,
+ 8421, 3, 10585, 3355, 524,
+ 8421, 3, 10585, 3357, 502,
+ 8421, 3, 10585, 3359, 2376,
+ 8421, 3, 10585, 3363, 298,
+ 8421, 3, 10585, 3365, 564,
+ 8421, 3, 10585, 3367, 8,
+ 8421, 3, 10585, 3369, 476,
+ 8421, 3, 10585, 3371, 630,
+ 8421, 3, 10585, 3373, 532,
+ 8421, 3, 10585, 3375, 632,
+ 8421, 3, 10585, 3377, 56,
+ 8421, 3, 10585, 3379, 310,
+ 8421, 3, 10585, 3381, 142,
+ 8421, 3, 10585, 3383, 294,
+ 8421, 3, 10585, 3387, 2122,
+ 8421, 3, 10585, 3391, 486,
+ 8421, 3, 10585, 3393, 152,
+ 8421, 3, 10585, 3395, 412,
+ 8421, 3, 10585, 3397, 514,
+ 8421, 3, 10585, 3399, 622,
+ 8421, 3, 10585, 3401, 416,
+ 8421, 3, 10585, 3405, 292,
+ 8421, 3, 10585, 3407, 546,
+ 8421, 3, 10585, 3409, 556,
+ 8421, 3, 10585, 3411, 510,
+ 8421, 3, 10585, 3413, 28,
+ 8421, 3, 10585, 3415, 2252,
+ 8421, 3, 10585, 3421, 300,
+ 8421, 3, 10585, 3423, 2632,
+ 8421, 3, 10585, 3425, 314,
+ 8421, 3, 10585, 3427, 2422,
+ 8421, 3, 10585, 3429, 576,
+ 8421, 3, 10585, 3431, 322,
+ 8421, 3, 10585, 3433, 1074,
+ 8421, 3, 10585, 3435, 468,
+ 8421, 3, 10585, 3437, 374,
+ 8421, 3, 10585, 3439, 672,
+ 8421, 3, 10585, 3441, 626,
+ 8421, 3, 10585, 3443, 2374,
+ 8421, 3, 10585, 3445, 306,
+ 8421, 3, 10585, 3447, 498,
+ 8421, 3, 10585, 3451, 364,
+ 8421, 3, 10585, 3453, 326,
+ 8421, 3, 10585, 3459, 92,
+ 8421, 3, 10585, 3463, 2774,
+ 8421, 3, 10585, 3467, 1076,
+ 8421, 3, 10585, 3469, 2778,
+ 8429, 8405, 0,
+ 8429, 8405, 2,
+ 8429, 8405, 6,
+ 8429, 8405, 8,
+ 8429, 8405, 12,
+ 8429, 8405, 14,
+ 8429, 8405, 16,
+ 8429, 8405, 18,
+ 8429, 8405, 20,
+ 8429, 8405, 22,
+ 8429, 8405, 24,
+ 8429, 8405, 26,
+ 8429, 8405, 30,
+ 8429, 8405, 32,
+ 8429, 8405, 34,
+ 8429, 8405, 36,
+ 8429, 8405, 38,
+ 8429, 8405, 40,
+ 8429, 8405, 44,
+ 8429, 8405, 46,
+ 8429, 8405, 50,
+ 8429, 8405, 80,
+ 8429, 8405, 104,
+ 8429, 8405, 176,
+ 8429, 8405, 316,
+ 8429, 8405, 378,
+ 8429, 8405, 410,
+ 8429, 8405, 562,
+ 8429, 8405, 574,
+ 8431, 8405, 0,
+ 8431, 8405, 2,
+ 8431, 8405, 4,
+ 8431, 8405, 6,
+ 8431, 8405, 8,
+ 8431, 8405, 10,
+ 8431, 8405, 12,
+ 8431, 8405, 16,
+ 8431, 8405, 20,
+ 8431, 8405, 22,
+ 8431, 8405, 24,
+ 8431, 8405, 26,
+ 8431, 8405, 28,
+ 8431, 8405, 32,
+ 8431, 8405, 34,
+ 8431, 8405, 36,
+ 8431, 8405, 38,
+ 8431, 8405, 40,
+ 8431, 8405, 42,
+ 8431, 8405, 48,
+ 8431, 8405, 80,
+ 8431, 8405, 176,
+ 8431, 8405, 360,
+ 8431, 8405, 410,
+ 8431, 8405, 542,
+ 8431, 8405, 574,
+ 8431, 11859, 4926,
+ 8432,
+ 8463, 4849, 6627, 9051, 10380,
+ 8463, 4849, 12115, 10380,
+ 8463, 6505, 8056,
+ 8463, 7443, 6627, 9051, 10380,
+ 8463, 7443, 12115, 10380,
+ 8463, 7512,
+ 8463, 7593, 7821, 8056,
+ 8463, 7821, 8056,
+ 8463, 10677, 760,
+ 8463, 10997, 4849, 12115, 10380,
+ 8463, 10997, 7443, 12115, 10380,
+ 8463, 12505, 7608,
+ 8463, 12967, 6409, 9051, 10380,
+ 8463, 13067, 6409, 9051, 10380,
+ 8473, 1044,
+ 8480,
+ 8483, 2779, 2584,
+ 8499, 10363, 7608,
+ 8510,
+ 8521, 10573, 428,
+ 8521, 10573, 429, 445, 6741, 568,
+ 8525, 2671, 4223, 5836,
+ 8525, 5758,
+ 8525, 8163, 4223, 5836,
+ 8525, 8875, 4223, 5836,
+ 8525, 8877, 4223, 5836,
+ 8525, 9287, 4223, 5836,
+ 8525, 9701, 4223, 5836,
+ 8525, 10151, 4223, 5836,
+ 8525, 10201, 4223, 5836,
+ 8525, 10361, 4223, 5836,
+ 8525, 10623, 4223, 5836,
+ 8525, 11233, 4223, 5836,
+ 8527, 5758,
+ 8533, 12143, 10758,
+ 8534,
+ 8545, 1610,
+ 8551, 4849, 12114,
+ 8551, 7443, 12114,
+ 8562,
+ 8570,
+ 8581, 5758,
+ 8592,
+ 8595, 9956,
+ 8595, 9957, 5387, 2779, 476,
+ 8609, 4926,
+ 8609, 4927, 4178,
+ 8631, 8151, 12953, 8450,
+ 8631, 8744,
+ 8631, 12953, 8450,
+ 8639, 7803, 5759, 8,
+ 8639, 7803, 5759, 16,
+ 8639, 7803, 5759, 28,
+ 8639, 7803, 5759, 40,
+ 8639, 7803, 5759, 72,
+ 8639, 7803, 5759, 92,
+ 8639, 7803, 5759, 160,
+ 8639, 7803, 5759, 188,
+ 8639, 8405, 0,
+ 8639, 8405, 100,
+ 8639, 8405, 116,
+ 8639, 8405, 138,
+ 8639, 8405, 216,
+ 8639, 8405, 236,
+ 8639, 8405, 292,
+ 8639, 8405, 306,
+ 8639, 8405, 332,
+ 8639, 8405, 364,
+ 8639, 8405, 392,
+ 8639, 8405, 462,
+ 8639, 8405, 510,
+ 8639, 8405, 524,
+ 8639, 8405, 556,
+ 8639, 8405, 622,
+ 8639, 8405, 652,
+ 8639, 8405, 1878,
+ 8639, 8405, 2006,
+ 8639, 8405, 2030,
+ 8639, 8405, 2126,
+ 8639, 8405, 5152,
+ 8639, 8405, 5312,
+ 8639, 8916,
+ 8639, 9665, 4926,
+ 8639, 10775, 5759, 14,
+ 8639, 10775, 5759, 26,
+ 8639, 10775, 5759, 34,
+ 8639, 10775, 5759, 400,
+ 8643, 8774,
+ 8649, 10001, 9967, 7607, 4153, 6434,
+ 8649, 10001, 9967, 9279, 10000,
+ 8668,
+ 8672,
+ 8679, 7593, 8,
+ 8679, 7593, 12,
+ 8679, 7593, 22,
+ 8679, 7593, 28,
+ 8679, 9063, 2,
+ 8679, 9063, 8,
+ 8679, 9063, 10,
+ 8679, 9063, 14,
+ 8679, 9063, 16,
+ 8679, 9063, 22,
+ 8679, 9063, 24,
+ 8679, 9063, 30,
+ 8679, 9063, 34,
+ 8684,
+ 8691, 1044,
+ 8717, 7119, 11195, 4926,
+ 8717, 12967, 6409, 11195, 4926,
+ 8717, 13067, 6409, 11195, 4926,
+ 8717, 13201, 11195, 4926,
+ 8745, 1, 5387, 24,
+ 8745, 5, 5387, 312,
+ 8745, 21, 2162,
+ 8745, 25, 2162,
+ 8745, 25, 5387, 36,
+ 8745, 25, 5387, 37, 9732,
+ 8745, 25, 6624,
+ 8745, 25, 9732,
+ 8745, 43, 5387, 24,
+ 8745, 78,
+ 8745, 92,
+ 8745, 110,
+ 8745, 118,
+ 8745, 120,
+ 8745, 128,
+ 8745, 129, 6624,
+ 8745, 129, 9732,
+ 8745, 130,
+ 8745, 138,
+ 8745, 140,
+ 8745, 146,
+ 8745, 148,
+ 8745, 149, 6624,
+ 8745, 149, 9732,
+ 8745, 190,
+ 8745, 206,
+ 8745, 218,
+ 8745, 234,
+ 8745, 236,
+ 8745, 240,
+ 8745, 248,
+ 8745, 254,
+ 8745, 274,
+ 8745, 286,
+ 8745, 306,
+ 8745, 308,
+ 8745, 312,
+ 8745, 316,
+ 8745, 318,
+ 8745, 320,
+ 8745, 321, 6624,
+ 8745, 321, 9062,
+ 8745, 321, 9732,
+ 8745, 324,
+ 8745, 328,
+ 8745, 330,
+ 8745, 346,
+ 8745, 348,
+ 8745, 358,
+ 8745, 364,
+ 8745, 366,
+ 8745, 367, 7592,
+ 8745, 370,
+ 8745, 376,
+ 8745, 378,
+ 8745, 379, 6624,
+ 8745, 379, 9732,
+ 8745, 382,
+ 8745, 385, 0,
+ 8745, 385, 10,
+ 8745, 385, 12,
+ 8745, 385, 22,
+ 8745, 385, 24,
+ 8745, 385, 36,
+ 8745, 385, 42,
+ 8745, 385, 44,
+ 8745, 386,
+ 8745, 387, 4946,
+ 8745, 388,
+ 8745, 389, 4946,
+ 8745, 392,
+ 8745, 398,
+ 8745, 408,
+ 8745, 414,
+ 8745, 418,
+ 8745, 420,
+ 8745, 452,
+ 8745, 462,
+ 8745, 463, 3260,
+ 8745, 464,
+ 8745, 470,
+ 8745, 474,
+ 8745, 478,
+ 8745, 482,
+ 8745, 484,
+ 8745, 488,
+ 8745, 490,
+ 8745, 540,
+ 8745, 548,
+ 8745, 624,
+ 8745, 760,
+ 8745, 856,
+ 8745, 860,
+ 8745, 928,
+ 8745, 1117, 5047, 7142,
+ 8745, 1117, 5047, 8294,
+ 8745, 1117, 5047, 8778,
+ 8745, 1117, 5047, 9762,
+ 8745, 1118,
+ 8745, 1212,
+ 8745, 1270,
+ 8745, 1298,
+ 8745, 1422,
+ 8745, 1432,
+ 8745, 1622,
+ 8745, 1668,
+ 8745, 1800,
+ 8745, 1908,
+ 8745, 1918,
+ 8745, 1934,
+ 8745, 1946,
+ 8745, 2248,
+ 8745, 2382,
+ 8745, 2383, 5387, 36,
+ 8745, 2383, 5387, 37, 9732,
+ 8745, 2688,
+ 8745, 2720,
+ 8745, 2816,
+ 8745, 3224,
+ 8745, 3790,
+ 8745, 4062,
+ 8745, 4110,
+ 8745, 4208,
+ 8745, 4332,
+ 8745, 4532,
+ 8745, 4612,
+ 8745, 4732,
+ 8745, 4762,
+ 8745, 4849, 5385, 827, 10374,
+ 8745, 4946,
+ 8745, 5008,
+ 8745, 5052,
+ 8745, 5378,
+ 8745, 5380,
+ 8745, 5408,
+ 8745, 5430,
+ 8745, 5534,
+ 8745, 5552,
+ 8745, 5566,
+ 8745, 6121, 2725, 4389, 6504,
+ 8745, 6121, 4849, 4389, 6504,
+ 8745, 6121, 7121, 4849, 10001, 4389, 6504,
+ 8745, 6121, 7121, 7443, 10001, 4389, 6504,
+ 8745, 6121, 7443, 4389, 6504,
+ 8745, 6121, 7773, 4849, 569, 7121, 7443, 4192,
+ 8745, 6121, 7773, 4849, 10001, 4389, 6504,
+ 8745, 6121, 7773, 7443, 569, 7121, 4849, 4192,
+ 8745, 6121, 7773, 7443, 10001, 4389, 6504,
+ 8745, 6121, 8005, 4389, 6504,
+ 8745, 6121, 10001, 11469, 4192,
+ 8745, 6121, 10677, 4192,
+ 8745, 6121, 10779, 9544,
+ 8745, 6121, 11649, 4192,
+ 8745, 6121, 11707, 11469, 4192,
+ 8745, 6234,
+ 8745, 6410,
+ 8745, 6482,
+ 8745, 6630,
+ 8745, 6718,
+ 8745, 6826,
+ 8745, 6828,
+ 8745, 6858,
+ 8745, 6892,
+ 8745, 6950,
+ 8745, 6958,
+ 8745, 6989, 428,
+ 8745, 6989, 429, 445, 2091, 6741, 568,
+ 8745, 6989, 429, 445, 6741, 568,
+ 8745, 7018,
+ 8745, 7034,
+ 8745, 7060,
+ 8745, 7126,
+ 8745, 7128,
+ 8745, 7276,
+ 8745, 7330,
+ 8745, 7352,
+ 8745, 7360,
+ 8745, 7384,
+ 8745, 7443, 5385, 827, 10374,
+ 8745, 7470,
+ 8745, 7504,
+ 8745, 7506,
+ 8745, 7814,
+ 8745, 7840,
+ 8745, 7842,
+ 8745, 7926,
+ 8745, 7950,
+ 8745, 8002,
+ 8745, 8274,
+ 8745, 8300,
+ 8745, 8304,
+ 8745, 8314,
+ 8745, 8372,
+ 8745, 8378,
+ 8745, 8452,
+ 8745, 8572,
+ 8745, 8588,
+ 8745, 8604,
+ 8745, 9016,
+ 8745, 9308,
+ 8745, 9388,
+ 8745, 9390,
+ 8745, 9416,
+ 8745, 9438,
+ 8745, 9444,
+ 8745, 9454,
+ 8745, 9468,
+ 8745, 9470,
+ 8745, 9476,
+ 8745, 9636,
+ 8745, 9646,
+ 8745, 9648,
+ 8745, 9698,
+ 8745, 9926,
+ 8745, 10166,
+ 8745, 10244,
+ 8745, 10379, 428,
+ 8745, 10379, 429, 445, 2091, 6741, 568,
+ 8745, 10379, 429, 445, 6741, 568,
+ 8745, 10392,
+ 8745, 10480,
+ 8745, 10496,
+ 8745, 11028,
+ 8745, 11032,
+ 8745, 11080,
+ 8745, 11084,
+ 8745, 11120,
+ 8745, 11170,
+ 8745, 11668,
+ 8745, 11918,
+ 8745, 12068,
+ 8755, 10385, 7821, 5830,
+ 8763, 428,
+ 8763, 429, 445, 6741, 568,
+ 8763, 429, 445, 6741, 569, 6121, 1045, 6376,
+ 8763, 429, 6121, 2091, 6741, 568,
+ 8763, 429, 6377, 2091, 6741, 568,
+ 8763, 429, 6377, 7709, 10374,
+ 8763, 429, 6377, 7919, 6741, 568,
+ 8763, 429, 6377, 8167, 5758,
+ 8763, 6121, 1044,
+ 8763, 6121, 5445, 5759, 6490,
+ 8763, 6121, 13061, 5759, 6490,
+ 8763, 6377, 8762,
+ 8763, 6377, 10578,
+ 8763, 6377, 11765, 6434,
+ 8773, 7207, 5759, 9328,
+ 8773, 7207, 5759, 9870,
+ 8773, 7207, 5759, 10148,
+ 8773, 7207, 7803, 5759, 0,
+ 8773, 7207, 7803, 5759, 8,
+ 8773, 7207, 7803, 5759, 16,
+ 8773, 7207, 7803, 5759, 40,
+ 8773, 7207, 7803, 5759, 440,
+ 8773, 7207, 8405, 0,
+ 8773, 7207, 8405, 8,
+ 8773, 7207, 8405, 16,
+ 8773, 7207, 8405, 28,
+ 8773, 7207, 8405, 40,
+ 8773, 7207, 8405, 108,
+ 8773, 7207, 8405, 130,
+ 8773, 7207, 8405, 150,
+ 8773, 7207, 8405, 228,
+ 8773, 7207, 8405, 246,
+ 8773, 7207, 8405, 298,
+ 8773, 7207, 8405, 322,
+ 8773, 7207, 8405, 350,
+ 8773, 7207, 8405, 380,
+ 8773, 7207, 8405, 412,
+ 8773, 7207, 8405, 480,
+ 8773, 7207, 8405, 516,
+ 8773, 7207, 8405, 536,
+ 8773, 7207, 8405, 568,
+ 8773, 7207, 8405, 798,
+ 8773, 7207, 8405, 890,
+ 8773, 7207, 8405, 980,
+ 8773, 7207, 8405, 1002,
+ 8773, 7207, 8405, 1266,
+ 8773, 7207, 8405, 1514,
+ 8773, 7207, 8405, 1618,
+ 8773, 7207, 8405, 2218,
+ 8773, 7207, 8405, 2442,
+ 8773, 7207, 8405, 2684,
+ 8773, 7207, 8405, 2754,
+ 8773, 7207, 8405, 4018,
+ 8773, 7207, 8405, 6000,
+ 8773, 7207, 8603, 8442,
+ 8773, 7207, 8603, 8444,
+ 8773, 7207, 8603, 8446,
+ 8773, 7207, 8603, 8448,
+ 8775, 1177, 1109, 429, 5904,
+ 8775, 1177, 1109, 429, 8462,
+ 8775, 1177, 1109, 429, 12886,
+ 8775, 1177, 1109, 429, 12887, 6510,
+ 8775, 1177, 3768,
+ 8775, 1177, 3995, 4881, 8168,
+ 8775, 1177, 4191, 11228,
+ 8775, 1177, 4213, 4182,
+ 8775, 1177, 4877, 4182,
+ 8775, 1177, 5280,
+ 8775, 1177, 6053, 11228,
+ 8775, 1177, 6883, 11228,
+ 8775, 1177, 7539, 274,
+ 8775, 1177, 7539, 2186,
+ 8775, 1177, 7608,
+ 8775, 1177, 7633, 429, 5904,
+ 8775, 1177, 7633, 429, 9334,
+ 8775, 1177, 8026,
+ 8775, 1177, 8102,
+ 8775, 1177, 8103, 4213, 2778,
+ 8775, 1177, 8109, 9117, 2170,
+ 8775, 1177, 8109, 9117, 2778,
+ 8775, 1177, 8109, 9117, 4214,
+ 8775, 1177, 8109, 9117, 7694,
+ 8775, 1177, 8168,
+ 8775, 1177, 8637, 11228,
+ 8775, 1177, 9268,
+ 8775, 1177, 9502,
+ 8775, 1177, 9933, 8642,
+ 8775, 1177, 10357, 11884,
+ 8775, 1177, 10677, 11846,
+ 8775, 1177, 10730,
+ 8775, 1177, 11219, 8724,
+ 8775, 1177, 11649, 11846,
+ 8775, 1177, 11840,
+ 8775, 1177, 11841, 4213, 2778,
+ 8775, 1177, 11884,
+ 8775, 1177, 12359, 4598,
+ 8781, 1109, 429, 11162,
+ 8781, 2779, 10677, 4113, 6376,
+ 8781, 2779, 10677, 4113, 6490,
+ 8781, 6611, 8721, 4848,
+ 8781, 6611, 8721, 7442,
+ 8781, 6751, 6376,
+ 8781, 6751, 6490,
+ 8781, 6905, 6376,
+ 8781, 6905, 6490,
+ 8781, 7198,
+ 8781, 7427, 6376,
+ 8781, 7427, 6490,
+ 8781, 7472,
+ 8781, 7695, 4113, 6376,
+ 8781, 7695, 4113, 6490,
+ 8781, 8151, 7889, 8996,
+ 8781, 8151, 7889, 11648,
+ 8781, 8405, 8,
+ 8781, 8405, 238,
+ 8781, 8405, 468,
+ 8781, 8405, 1920,
+ 8781, 8405, 2110,
+ 8781, 8405, 2662,
+ 8781, 8405, 2918,
+ 8781, 8405, 3776,
+ 8781, 8405, 4410,
+ 8781, 8405, 4724,
+ 8781, 8405, 5476,
+ 8781, 8405, 5554,
+ 8781, 8405, 5698,
+ 8781, 8405, 5902,
+ 8781, 8405, 5903, 10214,
+ 8781, 8405, 6236,
+ 8781, 8405, 6237, 238,
+ 8781, 8405, 6254,
+ 8781, 8405, 6394,
+ 8781, 8405, 6789, 9668,
+ 8781, 8405, 6820,
+ 8781, 8405, 6821, 10214,
+ 8781, 8405, 7474,
+ 8781, 8405, 8090,
+ 8781, 8405, 8384,
+ 8781, 8405, 9185, 8091, 5554,
+ 8781, 8405, 9583, 6496,
+ 8781, 8405, 9583, 8258,
+ 8781, 8405, 9583, 9156,
+ 8781, 8405, 9668,
+ 8781, 8405, 9717, 198,
+ 8781, 8405, 9717, 7046,
+ 8781, 8405, 9717, 7874,
+ 8781, 8405, 10489, 468,
+ 8781, 8405, 12355, 6394,
+ 8781, 8617, 6376,
+ 8781, 8617, 6490,
+ 8781, 8617, 8150,
+ 8781, 8965, 6376,
+ 8781, 8965, 6490,
+ 8781, 8965, 8150,
+ 8781, 9024,
+ 8781, 9525, 4877, 6376,
+ 8781, 9525, 4877, 6490,
+ 8781, 10179, 1044,
+ 8781, 10235, 8530,
+ 8781, 10235, 11118,
+ 8781, 10235, 11432,
+ 8781, 10490,
+ 8781, 11196,
+ 8781, 11259, 4223, 5836,
+ 8781, 11259, 6610,
+ 8781, 11259, 6611, 8721, 7442,
+ 8781, 11649, 6610,
+ 8781, 11914,
+ 8781, 12031, 8150,
+ 8781, 12357, 4223, 5836,
+ 8781, 12357, 6610,
+ 8781, 12357, 6611, 8721, 4848,
+ 8781, 12391, 4926,
+ 8794,
+ 8803, 73, 8399, 4926,
+ 8803, 5759, 7756,
+ 8803, 5759, 8916,
+ 8803, 5759, 9824,
+ 8803, 5759, 9870,
+ 8803, 5759, 9904,
+ 8803, 5759, 11900,
+ 8803, 6689, 2170,
+ 8803, 6689, 2540,
+ 8803, 6689, 2778,
+ 8803, 6689, 4200,
+ 8803, 6689, 4214,
+ 8803, 6689, 5190,
+ 8803, 6689, 6260,
+ 8803, 6689, 6722,
+ 8803, 6689, 7508,
+ 8803, 6689, 7694,
+ 8803, 7803, 5759, 8,
+ 8803, 7803, 5759, 16,
+ 8803, 7803, 5759, 28,
+ 8803, 7803, 5759, 40,
+ 8803, 7803, 5759, 58,
+ 8803, 7803, 5759, 72,
+ 8803, 7803, 5759, 92,
+ 8803, 7803, 5759, 162,
+ 8803, 7803, 5759, 266,
+ 8803, 7803, 5759, 440,
+ 8803, 7803, 5759, 606,
+ 8803, 7803, 5759, 9827, 22,
+ 8803, 7803, 5759, 9827, 34,
+ 8803, 7803, 5759, 9827, 344,
+ 8803, 7803, 5759, 9827, 518,
+ 8803, 8399, 4926,
+ 8803, 8405, 0,
+ 8803, 8405, 8,
+ 8803, 8405, 16,
+ 8803, 8405, 28,
+ 8803, 8405, 40,
+ 8803, 8405, 58,
+ 8803, 8405, 72,
+ 8803, 8405, 92,
+ 8803, 8405, 100,
+ 8803, 8405, 116,
+ 8803, 8405, 138,
+ 8803, 8405, 162,
+ 8803, 8405, 216,
+ 8803, 8405, 236,
+ 8803, 8405, 266,
+ 8803, 8405, 292,
+ 8803, 8405, 306,
+ 8803, 8405, 332,
+ 8803, 8405, 364,
+ 8803, 8405, 392,
+ 8803, 8405, 440,
+ 8803, 8405, 462,
+ 8803, 8405, 510,
+ 8803, 8405, 524,
+ 8803, 8405, 556,
+ 8803, 8405, 606,
+ 8803, 8405, 610,
+ 8803, 8405, 652,
+ 8803, 8405, 792,
+ 8803, 8405, 884,
+ 8803, 8405, 974,
+ 8803, 8405, 996,
+ 8803, 8405, 1080,
+ 8803, 8405, 1260,
+ 8803, 8405, 1512,
+ 8803, 8405, 1612,
+ 8803, 8405, 1796,
+ 8803, 8405, 2030,
+ 8803, 8405, 2076,
+ 8803, 8405, 2126,
+ 8803, 8405, 2212,
+ 8803, 8405, 2438,
+ 8803, 8405, 2516,
+ 8803, 8405, 2566,
+ 8803, 8405, 2678,
+ 8803, 8405, 2732,
+ 8803, 8405, 2746,
+ 8803, 8405, 4016,
+ 8803, 8405, 5994,
+ 8803, 8405, 9827, 22,
+ 8803, 8405, 9827, 34,
+ 8803, 8405, 9827, 344,
+ 8803, 8405, 9827, 518,
+ 8803, 10203, 6689, 2171, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 2171, 1177, 4173, 8611, 429, 4214,
+ 8803, 10203, 6689, 2779, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 2779, 1177, 4173, 8611, 429, 4214,
+ 8803, 10203, 6689, 6261, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 7695, 1177, 2161, 8611, 429, 4214,
+ 8803, 10203, 6689, 7695, 1177, 4173, 8611, 429, 4214,
+ 8811, 7650,
+ 8811, 8405, 568,
+ 8811, 8405, 678,
+ 8811, 8405, 748,
+ 8811, 8405, 1338,
+ 8811, 8405, 1982,
+ 8811, 8405, 2378,
+ 8811, 8405, 3006,
+ 8811, 8405, 3120,
+ 8811, 8405, 3240,
+ 8811, 8405, 4412,
+ 8811, 8405, 4734,
+ 8811, 8405, 5906,
+ 8811, 8405, 5988,
+ 8811, 8405, 6402,
+ 8811, 8405, 6766,
+ 8811, 8405, 6814,
+ 8811, 8405, 7016,
+ 8811, 8405, 7070,
+ 8811, 8405, 7140,
+ 8811, 8405, 7268,
+ 8811, 8405, 7400,
+ 8811, 8405, 7498,
+ 8811, 8405, 7780,
+ 8811, 8405, 7806,
+ 8811, 8405, 8084,
+ 8811, 8405, 8110,
+ 8811, 8405, 8256,
+ 8811, 8405, 8656,
+ 8811, 8405, 8698,
+ 8811, 8405, 8808,
+ 8811, 8405, 9986,
+ 8811, 8405, 10278,
+ 8811, 8405, 10414,
+ 8811, 8405, 10612,
+ 8811, 8405, 10690,
+ 8811, 8405, 10760,
+ 8811, 8405, 11020,
+ 8811, 8405, 11100,
+ 8811, 8405, 11236,
+ 8811, 8968,
+ 8811, 9254,
+ 8811, 9348,
+ 8811, 9526,
+ 8811, 9804,
+ 8811, 10694,
+ 8811, 10964,
+ 8811, 10986,
+ 8811, 11144,
+ 8811, 11146,
+ 8849, 5444,
+ 8849, 6611, 10374,
+ 8849, 7390,
+ 8849, 7708,
+ 8849, 8509, 11098,
+ 8849, 8509, 12472,
+ 8849, 9719, 7995, 10476,
+ 8849, 10260,
+ 8849, 10677, 761, 6121, 11649, 8758,
+ 8849, 10677, 761, 7443, 11378,
+ 8849, 10677, 761, 7995, 10476,
+ 8849, 10677, 761, 10794,
+ 8849, 11649, 761, 6121, 8153, 10677, 8758,
+ 8849, 11649, 761, 6121, 8849, 10677, 8758,
+ 8865, 5758,
+ 8869, 2091, 5758,
+ 8869, 6408,
+ 8869, 6879, 7593, 8405, 4614,
+ 8869, 7593, 10,
+ 8869, 9063, 10,
+ 8869, 10708,
+ 8869, 11767, 9063, 12,
+ 8869, 11767, 9063, 22,
+ 8869, 11767, 9063, 48,
+ 8875, 9601, 6505, 5830,
+ 8900,
+ 8913, 445, 6623, 9610,
+ 8923, 10260,
+ 8927, 10203, 2171, 4388,
+ 8927, 10203, 2171, 6782,
+ 8927, 10203, 2171, 7574,
+ 8927, 10203, 2171, 7686,
+ 8927, 10203, 2171, 8158,
+ 8927, 10203, 2171, 9614,
+ 8927, 10203, 2779, 8200,
+ 8927, 10203, 2779, 8818,
+ 8927, 10203, 4201, 8718,
+ 8927, 10203, 4201, 9258,
+ 8927, 10203, 4215, 8200,
+ 8927, 10203, 7509, 9258,
+ 8927, 10203, 7695, 8200,
+ 8927, 10203, 7695, 9258,
+ 8927, 10203, 7695, 10466,
+ 8939, 9610,
+ 8975, 428,
+ 8981, 5758,
+ 8990,
+ 9011, 5758,
+ 9034,
+ 9039, 93, 8399, 4926,
+ 9039, 5759, 7282,
+ 9039, 5759, 8916,
+ 9039, 5759, 9824,
+ 9039, 5759, 9870,
+ 9039, 5759, 9904,
+ 9039, 5759, 11900,
+ 9039, 6689, 2170,
+ 9039, 6689, 2540,
+ 9039, 6689, 2778,
+ 9039, 6689, 4200,
+ 9039, 6689, 4214,
+ 9039, 6689, 5190,
+ 9039, 6689, 6260,
+ 9039, 6689, 6722,
+ 9039, 6689, 7508,
+ 9039, 6689, 7694,
+ 9039, 7469, 4926,
+ 9039, 7469, 5758,
+ 9039, 7803, 5759, 8,
+ 9039, 7803, 5759, 16,
+ 9039, 7803, 5759, 28,
+ 9039, 7803, 5759, 40,
+ 9039, 7803, 5759, 58,
+ 9039, 7803, 5759, 72,
+ 9039, 7803, 5759, 92,
+ 9039, 7803, 5759, 266,
+ 9039, 7803, 5759, 606,
+ 9039, 7803, 5759, 9827, 22,
+ 9039, 7803, 5759, 9827, 34,
+ 9039, 7803, 5759, 9827, 344,
+ 9039, 7803, 5759, 9827, 518,
+ 9039, 8322,
+ 9039, 8405, 0,
+ 9039, 8405, 8,
+ 9039, 8405, 16,
+ 9039, 8405, 28,
+ 9039, 8405, 40,
+ 9039, 8405, 58,
+ 9039, 8405, 72,
+ 9039, 8405, 92,
+ 9039, 8405, 100,
+ 9039, 8405, 116,
+ 9039, 8405, 138,
+ 9039, 8405, 216,
+ 9039, 8405, 236,
+ 9039, 8405, 266,
+ 9039, 8405, 292,
+ 9039, 8405, 306,
+ 9039, 8405, 332,
+ 9039, 8405, 364,
+ 9039, 8405, 392,
+ 9039, 8405, 462,
+ 9039, 8405, 510,
+ 9039, 8405, 511, 6121, 7121, 10000,
+ 9039, 8405, 511, 6121, 8473, 10000,
+ 9039, 8405, 524,
+ 9039, 8405, 556,
+ 9039, 8405, 606,
+ 9039, 8405, 652,
+ 9039, 8405, 792,
+ 9039, 8405, 884,
+ 9039, 8405, 974,
+ 9039, 8405, 996,
+ 9039, 8405, 1260,
+ 9039, 8405, 1512,
+ 9039, 8405, 1612,
+ 9039, 8405, 2030,
+ 9039, 8405, 2076,
+ 9039, 8405, 2126,
+ 9039, 8405, 2212,
+ 9039, 8405, 2410,
+ 9039, 8405, 2438,
+ 9039, 8405, 2516,
+ 9039, 8405, 2566,
+ 9039, 8405, 2678,
+ 9039, 8405, 2746,
+ 9039, 8405, 3110,
+ 9039, 8405, 4016,
+ 9039, 8405, 5994,
+ 9039, 8405, 8357, 556,
+ 9039, 8405, 9827, 22,
+ 9039, 8405, 9827, 34,
+ 9039, 8405, 9827, 344,
+ 9039, 8405, 9827, 518,
+ 9039, 9971, 11143, 2170,
+ 9039, 9971, 11143, 2171, 4853, 5913, 2681, 11932,
+ 9039, 9971, 11143, 2778,
+ 9039, 9971, 11143, 4214,
+ 9039, 9971, 11143, 7694,
+ 9039, 9971, 11933, 9700,
+ 9041, 5550,
+ 9041, 5551, 6121, 8056,
+ 9042,
+ 9053, 9575, 6508,
+ 9053, 9575, 8134,
+ 9053, 9575, 8136,
+ 9053, 9575, 8138,
+ 9053, 9575, 8140,
+ 9053, 9575, 8142,
+ 9053, 9575, 8144,
+ 9053, 9575, 8146,
+ 9053, 9575, 8148,
+ 9053, 9575, 9186,
+ 9053, 9575, 9188,
+ 9053, 9575, 9190,
+ 9053, 9575, 9192,
+ 9053, 9575, 9194,
+ 9053, 9575, 9196,
+ 9053, 9575, 9198,
+ 9053, 9575, 9200,
+ 9053, 9575, 9202,
+ 9053, 9575, 9204,
+ 9053, 9575, 9206,
+ 9053, 9575, 9208,
+ 9053, 9575, 9210,
+ 9053, 9575, 9212,
+ 9053, 9575, 9214,
+ 9053, 9575, 9216,
+ 9053, 9575, 9218,
+ 9053, 9575, 9220,
+ 9053, 9575, 9222,
+ 9053, 9575, 9224,
+ 9053, 9575, 9226,
+ 9053, 9575, 9228,
+ 9053, 9575, 9230,
+ 9053, 9575, 9232,
+ 9053, 9575, 9234,
+ 9053, 9575, 9236,
+ 9053, 9575, 9238,
+ 9053, 9575, 9240,
+ 9053, 9575, 10020,
+ 9053, 9575, 10022,
+ 9053, 9575, 10024,
+ 9053, 9575, 10026,
+ 9053, 9575, 10028,
+ 9053, 9575, 10030,
+ 9053, 9575, 10032,
+ 9053, 9575, 10034,
+ 9053, 9575, 10036,
+ 9053, 9575, 10038,
+ 9053, 9575, 10040,
+ 9053, 9575, 10042,
+ 9053, 9575, 10044,
+ 9053, 9575, 10046,
+ 9053, 9575, 10048,
+ 9053, 9575, 10050,
+ 9053, 9575, 10052,
+ 9053, 9575, 10054,
+ 9053, 9575, 10056,
+ 9053, 9575, 10058,
+ 9053, 9575, 10060,
+ 9053, 9575, 10062,
+ 9053, 9575, 10064,
+ 9053, 9575, 10066,
+ 9053, 9575, 10068,
+ 9053, 9575, 10070,
+ 9053, 9575, 10072,
+ 9053, 9575, 10074,
+ 9053, 9575, 10076,
+ 9053, 9575, 10078,
+ 9053, 9575, 10080,
+ 9053, 9575, 10082,
+ 9053, 9575, 10084,
+ 9053, 9575, 10086,
+ 9053, 9575, 10088,
+ 9053, 9575, 10090,
+ 9053, 9575, 10092,
+ 9053, 9575, 10094,
+ 9053, 9575, 10096,
+ 9053, 9575, 10098,
+ 9053, 9575, 10100,
+ 9053, 9575, 10102,
+ 9053, 9575, 10104,
+ 9053, 9575, 10106,
+ 9053, 9575, 10108,
+ 9053, 9575, 10110,
+ 9053, 9575, 10112,
+ 9053, 9575, 10114,
+ 9053, 9575, 10116,
+ 9053, 9575, 10118,
+ 9053, 9575, 10120,
+ 9053, 9575, 10122,
+ 9053, 9575, 10124,
+ 9053, 9575, 10126,
+ 9053, 9575, 10128,
+ 9053, 9575, 10130,
+ 9053, 9575, 10818,
+ 9053, 9575, 10820,
+ 9053, 9575, 10822,
+ 9053, 9575, 10824,
+ 9053, 9575, 10826,
+ 9053, 9575, 10828,
+ 9053, 9575, 10830,
+ 9053, 9575, 10832,
+ 9053, 9575, 10834,
+ 9053, 9575, 10836,
+ 9053, 9575, 10838,
+ 9053, 9575, 10840,
+ 9053, 9575, 10842,
+ 9053, 9575, 10844,
+ 9053, 9575, 10846,
+ 9053, 9575, 10848,
+ 9053, 9575, 10850,
+ 9053, 9575, 10852,
+ 9053, 9575, 10854,
+ 9053, 9575, 10856,
+ 9053, 9575, 10858,
+ 9053, 9575, 10860,
+ 9053, 9575, 10862,
+ 9053, 9575, 10864,
+ 9053, 9575, 10866,
+ 9053, 9575, 10868,
+ 9053, 9575, 10870,
+ 9053, 9575, 10872,
+ 9053, 9575, 10874,
+ 9053, 9575, 10876,
+ 9053, 9575, 10878,
+ 9053, 9575, 10880,
+ 9053, 9575, 10882,
+ 9053, 9575, 10884,
+ 9053, 9575, 10886,
+ 9053, 9575, 10888,
+ 9053, 9575, 10890,
+ 9053, 9575, 10892,
+ 9053, 9575, 10894,
+ 9053, 9575, 10896,
+ 9053, 9575, 10898,
+ 9053, 9575, 10900,
+ 9053, 9575, 10902,
+ 9053, 9575, 10904,
+ 9053, 9575, 10906,
+ 9053, 9575, 10908,
+ 9053, 9575, 10910,
+ 9053, 9575, 10912,
+ 9053, 9575, 10914,
+ 9053, 9575, 10916,
+ 9053, 9575, 10918,
+ 9053, 9575, 10920,
+ 9053, 9575, 10922,
+ 9053, 9575, 10924,
+ 9053, 9575, 10926,
+ 9053, 9575, 10928,
+ 9053, 9575, 10930,
+ 9053, 9575, 10932,
+ 9053, 9575, 10934,
+ 9053, 9575, 10936,
+ 9053, 9575, 10938,
+ 9053, 9575, 10940,
+ 9053, 9575, 10942,
+ 9053, 9575, 10944,
+ 9053, 9575, 10946,
+ 9053, 9575, 10948,
+ 9053, 9575, 10950,
+ 9053, 9575, 10952,
+ 9053, 9575, 10954,
+ 9053, 9575, 10956,
+ 9053, 9575, 11490,
+ 9053, 9575, 11492,
+ 9053, 9575, 11494,
+ 9053, 9575, 11496,
+ 9053, 9575, 11498,
+ 9053, 9575, 11500,
+ 9053, 9575, 11502,
+ 9053, 9575, 11504,
+ 9053, 9575, 11506,
+ 9053, 9575, 11508,
+ 9053, 9575, 11510,
+ 9053, 9575, 11512,
+ 9053, 9575, 11514,
+ 9053, 9575, 11516,
+ 9053, 9575, 11518,
+ 9053, 9575, 11520,
+ 9053, 9575, 11522,
+ 9053, 9575, 11524,
+ 9053, 9575, 11526,
+ 9053, 9575, 11528,
+ 9053, 9575, 11530,
+ 9053, 9575, 11532,
+ 9053, 9575, 11534,
+ 9053, 9575, 11536,
+ 9053, 9575, 11538,
+ 9053, 9575, 11540,
+ 9053, 9575, 11542,
+ 9053, 9575, 11544,
+ 9053, 9575, 11546,
+ 9053, 9575, 11548,
+ 9053, 9575, 11550,
+ 9053, 9575, 11552,
+ 9053, 9575, 11554,
+ 9053, 9575, 11556,
+ 9053, 9575, 11558,
+ 9053, 9575, 11560,
+ 9053, 9575, 11562,
+ 9053, 9575, 11564,
+ 9053, 9575, 11566,
+ 9053, 9575, 11568,
+ 9053, 9575, 11570,
+ 9053, 9575, 11572,
+ 9053, 9575, 11574,
+ 9053, 9575, 11576,
+ 9053, 9575, 11578,
+ 9053, 9575, 11580,
+ 9053, 9575, 11582,
+ 9053, 9575, 11584,
+ 9053, 9575, 11586,
+ 9053, 9575, 11588,
+ 9053, 9575, 11590,
+ 9053, 9575, 11592,
+ 9053, 9575, 11594,
+ 9053, 9575, 11596,
+ 9053, 9575, 11598,
+ 9053, 9575, 11600,
+ 9053, 9575, 11950,
+ 9053, 9575, 11952,
+ 9053, 9575, 11954,
+ 9053, 9575, 11956,
+ 9053, 9575, 11958,
+ 9053, 9575, 11960,
+ 9053, 9575, 11962,
+ 9053, 9575, 11964,
+ 9053, 9575, 11966,
+ 9053, 9575, 11968,
+ 9053, 9575, 11970,
+ 9053, 9575, 11972,
+ 9053, 9575, 11974,
+ 9053, 9575, 11976,
+ 9053, 9575, 11978,
+ 9053, 9575, 11980,
+ 9053, 9575, 11982,
+ 9053, 9575, 11984,
+ 9053, 9575, 11986,
+ 9053, 9575, 11988,
+ 9053, 9575, 11990,
+ 9053, 9575, 11992,
+ 9053, 9575, 11994,
+ 9053, 9575, 11996,
+ 9053, 9575, 11998,
+ 9053, 9575, 12000,
+ 9053, 9575, 12002,
+ 9053, 9575, 12004,
+ 9053, 9575, 12444,
+ 9053, 9575, 12446,
+ 9053, 9575, 12448,
+ 9053, 9575, 12450,
+ 9053, 9575, 12452,
+ 9053, 9575, 12454,
+ 9053, 9575, 12456,
+ 9053, 9575, 12458,
+ 9053, 9575, 12926,
+ 9069, 5758,
+ 9072,
+ 9095, 1045, 10374,
+ 9095, 3992,
+ 9095, 5385, 8037, 6723, 9601, 5830,
+ 9095, 5444,
+ 9095, 5551, 10374,
+ 9095, 6689, 2170,
+ 9095, 6689, 2540,
+ 9095, 6689, 2778,
+ 9095, 6689, 4200,
+ 9095, 6689, 4214,
+ 9095, 6689, 5190,
+ 9095, 6689, 6260,
+ 9095, 6689, 6722,
+ 9095, 6689, 7508,
+ 9095, 6689, 7694,
+ 9095, 6909, 7821, 11765, 6434,
+ 9095, 7089, 7593, 8405, 0,
+ 9095, 7089, 7593, 8405, 2,
+ 9095, 7089, 7593, 8405, 4,
+ 9095, 7089, 7593, 8405, 6,
+ 9095, 7089, 7593, 8405, 8,
+ 9095, 7089, 7593, 8405, 10,
+ 9095, 7089, 7593, 8405, 12,
+ 9095, 7089, 7593, 8405, 14,
+ 9095, 7089, 7593, 8405, 16,
+ 9095, 7089, 7593, 8405, 18,
+ 9095, 7089, 7593, 8405, 20,
+ 9095, 7089, 7593, 8405, 22,
+ 9095, 7089, 7593, 8405, 24,
+ 9095, 7089, 7593, 8405, 26,
+ 9095, 7089, 7593, 8405, 28,
+ 9095, 7089, 7593, 8405, 30,
+ 9095, 7089, 7593, 8405, 32,
+ 9095, 7089, 7593, 8405, 34,
+ 9095, 7089, 7593, 8405, 36,
+ 9095, 7089, 7593, 8405, 38,
+ 9095, 7089, 7593, 8405, 40,
+ 9095, 7089, 7593, 8405, 42,
+ 9095, 7089, 7593, 8405, 44,
+ 9095, 7089, 7593, 8405, 46,
+ 9095, 7089, 7593, 8405, 48,
+ 9095, 7089, 7593, 8405, 50,
+ 9095, 7089, 9063, 8405, 0,
+ 9095, 7089, 9063, 8405, 2,
+ 9095, 7089, 9063, 8405, 4,
+ 9095, 7089, 9063, 8405, 6,
+ 9095, 7089, 9063, 8405, 8,
+ 9095, 7089, 9063, 8405, 10,
+ 9095, 7089, 9063, 8405, 12,
+ 9095, 7089, 9063, 8405, 14,
+ 9095, 7089, 9063, 8405, 16,
+ 9095, 7089, 9063, 8405, 18,
+ 9095, 7089, 9063, 8405, 20,
+ 9095, 7089, 9063, 8405, 22,
+ 9095, 7089, 9063, 8405, 24,
+ 9095, 7089, 9063, 8405, 26,
+ 9095, 7089, 9063, 8405, 28,
+ 9095, 7089, 9063, 8405, 30,
+ 9095, 7089, 9063, 8405, 32,
+ 9095, 7089, 9063, 8405, 34,
+ 9095, 7089, 9063, 8405, 36,
+ 9095, 7089, 9063, 8405, 38,
+ 9095, 7089, 9063, 8405, 40,
+ 9095, 7089, 9063, 8405, 42,
+ 9095, 7089, 9063, 8405, 44,
+ 9095, 7089, 9063, 8405, 46,
+ 9095, 7089, 9063, 8405, 48,
+ 9095, 7089, 9063, 8405, 50,
+ 9095, 7172,
+ 9095, 7710,
+ 9095, 7821, 5830,
+ 9095, 7821, 8022,
+ 9095, 8022,
+ 9095, 8166,
+ 9095, 8287, 5770,
+ 9095, 8287, 5771, 0,
+ 9095, 8287, 6594,
+ 9095, 8287, 6595, 0,
+ 9095, 8287, 6912,
+ 9095, 8287, 6913, 0,
+ 9095, 8287, 6982,
+ 9095, 8287, 6983, 0,
+ 9095, 8287, 6983, 40,
+ 9095, 8287, 7166,
+ 9095, 8287, 7167, 0,
+ 9095, 8287, 7244,
+ 9095, 8287, 7245, 0,
+ 9095, 8287, 7372,
+ 9095, 8287, 7373, 0,
+ 9095, 8287, 7440,
+ 9095, 8287, 7441, 0,
+ 9095, 8287, 8362,
+ 9095, 8287, 8363, 0,
+ 9095, 8287, 8828,
+ 9095, 8287, 8829, 0,
+ 9095, 8287, 9086,
+ 9095, 8287, 9087, 0,
+ 9095, 8287, 9400,
+ 9095, 8287, 9401, 0,
+ 9095, 8287, 9588,
+ 9095, 8287, 9589, 0,
+ 9095, 8287, 9780,
+ 9095, 8287, 9781, 0,
+ 9095, 8371, 10759, 7014,
+ 9095, 8371, 10759, 8040,
+ 9095, 8525, 2670,
+ 9095, 8525, 6784,
+ 9095, 8525, 6804,
+ 9095, 8525, 6805, 2170,
+ 9095, 8525, 6805, 2540,
+ 9095, 8525, 6805, 2778,
+ 9095, 8525, 6805, 4200,
+ 9095, 8525, 6805, 4214,
+ 9095, 8525, 6805, 5190,
+ 9095, 8525, 6805, 6722,
+ 9095, 8525, 6805, 7508,
+ 9095, 8525, 6805, 7694,
+ 9095, 8525, 8162,
+ 9095, 8525, 8820,
+ 9095, 8525, 8821, 2170,
+ 9095, 8525, 8821, 2540,
+ 9095, 8525, 8821, 2778,
+ 9095, 8525, 8821, 4200,
+ 9095, 8525, 8821, 4214,
+ 9095, 8525, 8821, 5190,
+ 9095, 8525, 8821, 6722,
+ 9095, 8525, 8821, 7508,
+ 9095, 8525, 8821, 7694,
+ 9095, 8525, 8874,
+ 9095, 8525, 8876,
+ 9095, 8525, 8877, 2170,
+ 9095, 8525, 8877, 2540,
+ 9095, 8525, 8877, 2778,
+ 9095, 8525, 8877, 4200,
+ 9095, 8525, 8877, 4214,
+ 9095, 8525, 8877, 5190,
+ 9095, 8525, 8877, 6722,
+ 9095, 8525, 8877, 7508,
+ 9095, 8525, 8877, 7694,
+ 9095, 8525, 9286,
+ 9095, 8525, 9700,
+ 9095, 8525, 10150,
+ 9095, 8525, 10200,
+ 9095, 8525, 10360,
+ 9095, 8525, 10622,
+ 9095, 8525, 11232,
+ 9095, 8609, 4926,
+ 9095, 9633, 9718,
+ 9095, 9899, 10374,
+ 9095, 10017, 5758,
+ 9095, 10017, 7580,
+ 9095, 10283, 0,
+ 9095, 10283, 8,
+ 9095, 10283, 16,
+ 9095, 10283, 28,
+ 9095, 10283, 40,
+ 9095, 10283, 236,
+ 9095, 10283, 238,
+ 9095, 10283, 242,
+ 9095, 10283, 246,
+ 9095, 10283, 250,
+ 9095, 10283, 306,
+ 9095, 10283, 310,
+ 9095, 10283, 314,
+ 9095, 10283, 322,
+ 9095, 10283, 326,
+ 9095, 10283, 364,
+ 9095, 10283, 368,
+ 9095, 10283, 374,
+ 9095, 10283, 380,
+ 9095, 10283, 384,
+ 9095, 10283, 392,
+ 9095, 10283, 396,
+ 9095, 10283, 404,
+ 9095, 10283, 412,
+ 9095, 10283, 416,
+ 9095, 10283, 510,
+ 9095, 10283, 512,
+ 9095, 10283, 514,
+ 9095, 10283, 516,
+ 9095, 10283, 520,
+ 9095, 10283, 524,
+ 9095, 10283, 526,
+ 9095, 10283, 532,
+ 9095, 10283, 536,
+ 9095, 10283, 546,
+ 9095, 10283, 556,
+ 9095, 10283, 560,
+ 9095, 10283, 564,
+ 9095, 10283, 568,
+ 9095, 10283, 576,
+ 9095, 10283, 622,
+ 9095, 10283, 626,
+ 9095, 10283, 630,
+ 9095, 10283, 632,
+ 9095, 10283, 652,
+ 9095, 10283, 660,
+ 9095, 10283, 664,
+ 9095, 10410,
+ 9095, 10643, 4116,
+ 9095, 10677, 760,
+ 9095, 11043, 1808,
+ 9095, 11043, 2170,
+ 9095, 11043, 2540,
+ 9095, 11043, 2586,
+ 9095, 11043, 2670,
+ 9095, 11043, 2778,
+ 9095, 11043, 3956,
+ 9095, 11043, 4194,
+ 9095, 11043, 4200,
+ 9095, 11043, 4214,
+ 9095, 11043, 4396,
+ 9095, 11043, 4422,
+ 9095, 11043, 4620,
+ 9095, 11043, 4848,
+ 9095, 11043, 4922,
+ 9095, 11043, 5012,
+ 9095, 11043, 5046,
+ 9095, 11043, 5190,
+ 9095, 11043, 5540,
+ 9095, 11043, 6122,
+ 9095, 11043, 6716,
+ 9095, 11043, 6722,
+ 9095, 11043, 7072,
+ 9095, 11043, 7146,
+ 9095, 11043, 7246,
+ 9095, 11043, 7392,
+ 9095, 11043, 7442,
+ 9095, 11043, 7508,
+ 9095, 11043, 7640,
+ 9095, 11043, 7646,
+ 9095, 11043, 7694,
+ 9095, 11043, 7812,
+ 9095, 11043, 8036,
+ 9095, 11043, 8196,
+ 9095, 11043, 8682,
+ 9095, 11043, 9122,
+ 9095, 11043, 9714,
+ 9095, 11043, 9724,
+ 9095, 11043, 9862,
+ 9095, 11043, 10328,
+ 9095, 11043, 10478,
+ 9095, 11043, 10484,
+ 9095, 11043, 10576,
+ 9095, 11043, 10726,
+ 9095, 11043, 10980,
+ 9095, 11043, 10992,
+ 9095, 11043, 11266,
+ 9095, 11043, 11612,
+ 9095, 11043, 13050,
+ 9095, 11098,
+ 9095, 11649, 761, 6121, 7272,
+ 9095, 12472,
+ 9095, 12990,
+ 9095, 13061, 5759, 6121, 11449, 7908,
+ 9095, 13411, 10017, 5758,
+ 9109, 7666,
+ 9115, 10260,
+ 9127, 8770,
+ 9137, 10585, 0,
+ 9137, 10585, 8,
+ 9137, 10585, 16,
+ 9137, 10585, 28,
+ 9137, 10585, 40,
+ 9137, 10585, 292,
+ 9137, 10585, 298,
+ 9137, 10585, 306,
+ 9137, 10585, 310,
+ 9137, 10585, 314,
+ 9137, 10585, 322,
+ 9137, 10585, 326,
+ 9137, 10585, 332,
+ 9137, 10585, 336,
+ 9137, 10585, 340,
+ 9137, 10585, 350,
+ 9137, 10585, 354,
+ 9137, 10585, 364,
+ 9137, 10585, 368,
+ 9137, 10585, 374,
+ 9137, 10585, 380,
+ 9137, 10585, 384,
+ 9137, 10585, 392,
+ 9137, 10585, 396,
+ 9137, 10585, 404,
+ 9137, 10585, 412,
+ 9137, 10585, 416,
+ 9137, 10585, 462,
+ 9137, 10585, 468,
+ 9137, 10585, 476,
+ 9137, 10585, 480,
+ 9137, 10585, 486,
+ 9137, 10585, 510,
+ 9137, 10585, 512,
+ 9137, 10585, 514,
+ 9137, 10585, 516,
+ 9137, 10585, 520,
+ 9137, 10585, 524,
+ 9137, 10585, 526,
+ 9137, 10585, 532,
+ 9137, 10585, 536,
+ 9137, 10585, 546,
+ 9137, 10585, 556,
+ 9137, 10585, 560,
+ 9137, 10585, 564,
+ 9137, 10585, 568,
+ 9137, 10585, 576,
+ 9137, 10585, 622,
+ 9137, 10585, 626,
+ 9137, 10585, 630,
+ 9137, 10585, 632,
+ 9137, 10585, 638,
+ 9137, 10585, 640,
+ 9137, 10585, 670,
+ 9137, 10585, 678,
+ 9151, 11229, 1611, 8774,
+ 9155, 7593, 8405, 14,
+ 9155, 7593, 8405, 98,
+ 9155, 7593, 8405, 164,
+ 9155, 7593, 8405, 172,
+ 9155, 7593, 8405, 174,
+ 9155, 7593, 8405, 176,
+ 9155, 7593, 8405, 182,
+ 9155, 7593, 8405, 184,
+ 9155, 7593, 8405, 192,
+ 9155, 7593, 8405, 432,
+ 9155, 7593, 8405, 454,
+ 9155, 7593, 8405, 634,
+ 9155, 7593, 8405, 778,
+ 9155, 7593, 8405, 984,
+ 9155, 7593, 8405, 1110,
+ 9155, 7593, 8405, 1124,
+ 9155, 7593, 8405, 1130,
+ 9155, 7593, 8405, 1226,
+ 9155, 7593, 8405, 1506,
+ 9155, 7593, 8405, 1596,
+ 9155, 7593, 8405, 2204,
+ 9155, 7593, 8405, 2666,
+ 9155, 7593, 8405, 2856,
+ 9155, 7593, 8405, 3050,
+ 9155, 7593, 8405, 3138,
+ 9155, 7593, 8405, 3890,
+ 9155, 7593, 8405, 4895, 0,
+ 9155, 7593, 8405, 4895, 8,
+ 9155, 7593, 8405, 4895, 16,
+ 9155, 7593, 8405, 4895, 28,
+ 9155, 7593, 8405, 4895, 70,
+ 9155, 7593, 8405, 4895, 440,
+ 9155, 7593, 8405, 5914,
+ 9155, 7593, 8405, 6274,
+ 9155, 7593, 8405, 7551, 0,
+ 9155, 7593, 8405, 7551, 8,
+ 9155, 7593, 8405, 7551, 16,
+ 9155, 7593, 8405, 7551, 28,
+ 9155, 7593, 8405, 7551, 70,
+ 9155, 7593, 8405, 7551, 440,
+ 9155, 9063, 8405, 14,
+ 9155, 9063, 8405, 98,
+ 9155, 9063, 8405, 164,
+ 9155, 9063, 8405, 172,
+ 9155, 9063, 8405, 174,
+ 9155, 9063, 8405, 176,
+ 9155, 9063, 8405, 182,
+ 9155, 9063, 8405, 184,
+ 9155, 9063, 8405, 192,
+ 9155, 9063, 8405, 432,
+ 9155, 9063, 8405, 454,
+ 9155, 9063, 8405, 634,
+ 9155, 9063, 8405, 778,
+ 9155, 9063, 8405, 984,
+ 9155, 9063, 8405, 1110,
+ 9155, 9063, 8405, 1124,
+ 9155, 9063, 8405, 1130,
+ 9155, 9063, 8405, 1226,
+ 9155, 9063, 8405, 1506,
+ 9155, 9063, 8405, 1596,
+ 9155, 9063, 8405, 2204,
+ 9155, 9063, 8405, 2666,
+ 9155, 9063, 8405, 2856,
+ 9155, 9063, 8405, 3050,
+ 9155, 9063, 8405, 3138,
+ 9155, 9063, 8405, 3890,
+ 9155, 9063, 8405, 4895, 0,
+ 9155, 9063, 8405, 4895, 8,
+ 9155, 9063, 8405, 4895, 16,
+ 9155, 9063, 8405, 4895, 28,
+ 9155, 9063, 8405, 4895, 70,
+ 9155, 9063, 8405, 4895, 440,
+ 9155, 9063, 8405, 5914,
+ 9155, 9063, 8405, 6274,
+ 9155, 9063, 8405, 7551, 0,
+ 9155, 9063, 8405, 7551, 8,
+ 9155, 9063, 8405, 7551, 16,
+ 9155, 9063, 8405, 7551, 28,
+ 9155, 9063, 8405, 7551, 70,
+ 9155, 9063, 8405, 7551, 440,
+ 9159, 6121, 2725, 4389, 6504,
+ 9159, 6121, 4849, 4389, 6504,
+ 9159, 6121, 7443, 4389, 6504,
+ 9159, 6121, 8005, 4389, 6504,
+ 9159, 10374,
+ 9171, 9095, 11767, 6689, 2170,
+ 9171, 9095, 11767, 6689, 2540,
+ 9171, 9095, 11767, 6689, 2778,
+ 9171, 9095, 11767, 6689, 4200,
+ 9171, 9095, 11767, 6689, 4214,
+ 9171, 9095, 11767, 6689, 5190,
+ 9171, 9095, 11767, 6689, 6722,
+ 9171, 9095, 11767, 6689, 7508,
+ 9171, 9095, 11767, 6689, 7694,
+ 9171, 9095, 11767, 8525, 2670,
+ 9171, 10357, 9095, 6689, 2170,
+ 9171, 10357, 9095, 6689, 2540,
+ 9171, 10357, 9095, 6689, 2778,
+ 9171, 10357, 9095, 6689, 4200,
+ 9171, 10357, 9095, 6689, 4214,
+ 9171, 10357, 9095, 6689, 5190,
+ 9171, 10357, 9095, 6689, 6722,
+ 9171, 10357, 9095, 6689, 7508,
+ 9171, 10357, 9095, 6689, 7694,
+ 9171, 10357, 9095, 8525, 2670,
+ 9171, 10357, 9095, 11767, 6689, 2170,
+ 9171, 10357, 9095, 11767, 6689, 2540,
+ 9171, 10357, 9095, 11767, 6689, 2778,
+ 9171, 10357, 9095, 11767, 6689, 4200,
+ 9171, 10357, 9095, 11767, 6689, 4214,
+ 9171, 10357, 9095, 11767, 6689, 5190,
+ 9171, 10357, 9095, 11767, 6689, 6722,
+ 9171, 10357, 9095, 11767, 6689, 7508,
+ 9171, 10357, 9095, 11767, 6689, 7694,
+ 9171, 10357, 9095, 11767, 8525, 2670,
+ 9180,
+ 9183, 8774,
+ 9243, 4923, 5758,
+ 9243, 8197, 5758,
+ 9245, 5758,
+ 9263, 428,
+ 9263, 429, 6121, 1045, 6376,
+ 9263, 429, 6121, 2779, 11649, 9744,
+ 9263, 429, 6121, 4895, 11649, 8758,
+ 9263, 429, 6121, 9546,
+ 9263, 429, 6121, 10666,
+ 9263, 429, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 9263, 429, 9537, 9810,
+ 9263, 429, 9537, 10958,
+ 9279, 10001, 9967, 7271, 4153, 6434,
+ 9279, 10001, 9967, 8649, 10000,
+ 9288,
+ 9292,
+ 9297, 2830,
+ 9317, 5758,
+ 9325, 5759, 10400,
+ 9325, 7803, 5759, 16,
+ 9325, 7803, 5759, 40,
+ 9325, 8405, 0,
+ 9325, 8405, 16,
+ 9325, 8405, 40,
+ 9325, 8405, 100,
+ 9325, 8405, 138,
+ 9325, 8405, 216,
+ 9325, 8405, 236,
+ 9325, 8405, 306,
+ 9325, 8405, 332,
+ 9325, 8405, 364,
+ 9325, 8405, 392,
+ 9325, 8405, 462,
+ 9325, 8405, 510,
+ 9325, 8405, 524,
+ 9325, 8405, 556,
+ 9325, 8405, 622,
+ 9325, 8405, 652,
+ 9325, 8405, 2030,
+ 9343, 5758,
+ 9361, 7931, 4213, 9680,
+ 9361, 11345, 10582,
+ 9367, 7821, 8056,
+ 9367, 8022,
+ 9380,
+ 9385, 73, 8399, 4926,
+ 9385, 5759, 7282,
+ 9385, 5759, 8916,
+ 9385, 5759, 9824,
+ 9385, 5759, 9870,
+ 9385, 5759, 9904,
+ 9385, 5759, 12066,
+ 9385, 5759, 12384,
+ 9385, 6689, 2170,
+ 9385, 6689, 2540,
+ 9385, 6689, 2778,
+ 9385, 6689, 4200,
+ 9385, 6689, 4214,
+ 9385, 6689, 5190,
+ 9385, 6689, 6260,
+ 9385, 6689, 6722,
+ 9385, 6689, 7508,
+ 9385, 6689, 7694,
+ 9385, 7803, 5759, 8,
+ 9385, 7803, 5759, 16,
+ 9385, 7803, 5759, 28,
+ 9385, 7803, 5759, 40,
+ 9385, 7803, 5759, 58,
+ 9385, 7803, 5759, 72,
+ 9385, 7803, 5759, 92,
+ 9385, 7803, 5759, 162,
+ 9385, 7803, 5759, 266,
+ 9385, 7803, 5759, 440,
+ 9385, 7803, 5759, 606,
+ 9385, 7803, 5759, 9827, 22,
+ 9385, 7803, 5759, 9827, 34,
+ 9385, 7803, 5759, 9827, 344,
+ 9385, 7803, 5759, 9827, 518,
+ 9385, 8399, 4926,
+ 9385, 8405, 0,
+ 9385, 8405, 8,
+ 9385, 8405, 16,
+ 9385, 8405, 28,
+ 9385, 8405, 40,
+ 9385, 8405, 58,
+ 9385, 8405, 72,
+ 9385, 8405, 92,
+ 9385, 8405, 100,
+ 9385, 8405, 116,
+ 9385, 8405, 138,
+ 9385, 8405, 162,
+ 9385, 8405, 196,
+ 9385, 8405, 216,
+ 9385, 8405, 236,
+ 9385, 8405, 266,
+ 9385, 8405, 292,
+ 9385, 8405, 306,
+ 9385, 8405, 332,
+ 9385, 8405, 364,
+ 9385, 8405, 392,
+ 9385, 8405, 440,
+ 9385, 8405, 462,
+ 9385, 8405, 510,
+ 9385, 8405, 524,
+ 9385, 8405, 556,
+ 9385, 8405, 606,
+ 9385, 8405, 610,
+ 9385, 8405, 652,
+ 9385, 8405, 792,
+ 9385, 8405, 884,
+ 9385, 8405, 974,
+ 9385, 8405, 996,
+ 9385, 8405, 1260,
+ 9385, 8405, 1512,
+ 9385, 8405, 1612,
+ 9385, 8405, 1796,
+ 9385, 8405, 2030,
+ 9385, 8405, 2076,
+ 9385, 8405, 2126,
+ 9385, 8405, 2212,
+ 9385, 8405, 2438,
+ 9385, 8405, 2516,
+ 9385, 8405, 2566,
+ 9385, 8405, 2678,
+ 9385, 8405, 2746,
+ 9385, 8405, 4016,
+ 9385, 8405, 5994,
+ 9385, 8405, 9827, 22,
+ 9385, 8405, 9827, 34,
+ 9385, 8405, 9827, 344,
+ 9385, 8405, 9827, 518,
+ 9431, 11103, 5758,
+ 9437, 444,
+ 9437, 445, 6121, 1045, 6376,
+ 9437, 445, 6121, 8153, 9546,
+ 9437, 445, 6121, 8153, 10666,
+ 9437, 445, 6121, 8473, 5832,
+ 9437, 445, 6121, 11649, 3992,
+ 9437, 445, 12105, 9437, 720,
+ 9437, 720,
+ 9437, 721, 6121, 1045, 6376,
+ 9437, 721, 6121, 8153, 9546,
+ 9437, 721, 6121, 8153, 10666,
+ 9437, 721, 6121, 8473, 5832,
+ 9437, 721, 6121, 10666,
+ 9437, 721, 6121, 11649, 3992,
+ 9438,
+ 9439, 9177, 115, 11649, 5606,
+ 9443, 5941, 2171, 429, 9020,
+ 9443, 5941, 2171, 429, 9096,
+ 9443, 5941, 2171, 429, 11446,
+ 9443, 5941, 2401, 8154,
+ 9443, 5941, 2541, 429, 9020,
+ 9443, 5941, 2541, 429, 9096,
+ 9443, 5941, 2541, 429, 11446,
+ 9443, 5941, 2779, 429, 9020,
+ 9443, 5941, 2779, 429, 9096,
+ 9443, 5941, 2779, 429, 11446,
+ 9443, 5941, 3696,
+ 9443, 5941, 4153, 6116,
+ 9443, 5941, 4201, 429, 9020,
+ 9443, 5941, 4201, 429, 9096,
+ 9443, 5941, 4201, 429, 11446,
+ 9443, 5941, 4215, 429, 9020,
+ 9443, 5941, 4215, 429, 9096,
+ 9443, 5941, 4215, 429, 11446,
+ 9443, 5941, 5191, 429, 9020,
+ 9443, 5941, 5191, 429, 9096,
+ 9443, 5941, 5191, 429, 11446,
+ 9443, 5941, 5442,
+ 9443, 5941, 6113, 6116,
+ 9443, 5941, 6723, 429, 9020,
+ 9443, 5941, 6723, 429, 9096,
+ 9443, 5941, 6723, 429, 11446,
+ 9443, 5941, 6881, 8154,
+ 9443, 5941, 7010,
+ 9443, 5941, 7271, 6116,
+ 9443, 5941, 7509, 429, 9020,
+ 9443, 5941, 7509, 429, 9096,
+ 9443, 5941, 7509, 429, 11446,
+ 9443, 5941, 7607, 6116,
+ 9443, 5941, 7695, 429, 9020,
+ 9443, 5941, 7695, 429, 9096,
+ 9443, 5941, 7695, 429, 11446,
+ 9443, 5941, 7821, 8154,
+ 9443, 5941, 7960,
+ 9443, 5941, 7974,
+ 9443, 5941, 8546,
+ 9443, 5941, 8738,
+ 9443, 5941, 8766,
+ 9443, 5941, 8934,
+ 9443, 5941, 12912,
+ 9453, 6622,
+ 9472,
+ 9475, 11649, 10154,
+ 9483, 8775, 5, 3946,
+ 9483, 8775, 11, 3946,
+ 9483, 8775, 11, 3947, 8553, 3254,
+ 9483, 8775, 11, 3947, 8553, 6468,
+ 9483, 8775, 13, 3946,
+ 9483, 8775, 13, 3947, 8553, 3254,
+ 9483, 8775, 13, 3947, 8553, 6468,
+ 9483, 8775, 47, 10366,
+ 9483, 8775, 50,
+ 9483, 8775, 139, 3846,
+ 9483, 8775, 570,
+ 9483, 8775, 933, 5942,
+ 9483, 8775, 961, 7500,
+ 9483, 8775, 1109, 429, 8750,
+ 9483, 8775, 1109, 2690,
+ 9483, 8775, 1109, 3760,
+ 9483, 8775, 1109, 5776,
+ 9483, 8775, 1109, 8584,
+ 9483, 8775, 2171, 9345, 13031, 5244,
+ 9483, 8775, 2171, 9345, 13031, 5540,
+ 9483, 8775, 2211, 11838,
+ 9483, 8775, 3950,
+ 9483, 8775, 3984,
+ 9483, 8775, 3985, 718,
+ 9483, 8775, 4121, 8058,
+ 9483, 8775, 4121, 8060,
+ 9483, 8775, 4205, 600,
+ 9483, 8775, 4205, 4116,
+ 9483, 8775, 4227, 6504,
+ 9483, 8775, 4227, 7820,
+ 9483, 8775, 4389, 5244,
+ 9483, 8775, 4389, 5540,
+ 9483, 8775, 4389, 7351, 4926,
+ 9483, 8775, 4849, 8641, 5758,
+ 9483, 8775, 5013, 10367, 6504,
+ 9483, 8775, 5013, 10367, 7820,
+ 9483, 8775, 5281, 10366,
+ 9483, 8775, 5445, 10366,
+ 9483, 8775, 6020,
+ 9483, 8775, 6021, 600,
+ 9483, 8775, 6021, 7580,
+ 9483, 8775, 6093, 10366,
+ 9483, 8775, 6121, 12018,
+ 9483, 8775, 6485, 2690,
+ 9483, 8775, 6485, 3760,
+ 9483, 8775, 6485, 5776,
+ 9483, 8775, 6485, 8584,
+ 9483, 8775, 6514,
+ 9483, 8775, 6516,
+ 9483, 8775, 6620,
+ 9483, 8775, 6789, 9022,
+ 9483, 8775, 6802,
+ 9483, 8775, 6869, 5245, 413, 7580,
+ 9483, 8775, 6869, 5245, 7580,
+ 9483, 8775, 7112,
+ 9483, 8775, 7113, 10423, 5540,
+ 9483, 8775, 7113, 11659, 5540,
+ 9483, 8775, 7150,
+ 9483, 8775, 7191, 5540,
+ 9483, 8775, 7351, 601, 4926,
+ 9483, 8775, 7351, 4926,
+ 9483, 8775, 7368,
+ 9483, 8775, 7443, 8641, 5758,
+ 9483, 8775, 7500,
+ 9483, 8775, 7519, 600,
+ 9483, 8775, 7519, 4116,
+ 9483, 8775, 7551, 9022,
+ 9483, 8775, 7796,
+ 9483, 8775, 7823, 5244,
+ 9483, 8775, 7823, 5540,
+ 9483, 8775, 8011, 4926,
+ 9483, 8775, 8012,
+ 9483, 8775, 8013, 5540,
+ 9483, 8775, 8057, 47, 10366,
+ 9483, 8775, 8062,
+ 9483, 8775, 8073, 5942,
+ 9483, 8775, 8097, 9022,
+ 9483, 8775, 8101, 7580,
+ 9483, 8775, 8153, 4204,
+ 9483, 8775, 8153, 7518,
+ 9483, 8775, 8153, 9022,
+ 9483, 8775, 8159, 5244,
+ 9483, 8775, 8159, 5540,
+ 9483, 8775, 8458,
+ 9483, 8775, 8478,
+ 9483, 8775, 8479, 5540,
+ 9483, 8775, 8479, 6504,
+ 9483, 8775, 8553, 3254,
+ 9483, 8775, 8553, 6468,
+ 9483, 8775, 8641, 4112,
+ 9483, 8775, 8717, 9022,
+ 9483, 8775, 8745, 2,
+ 9483, 8775, 8745, 10367, 6504,
+ 9483, 8775, 8745, 10367, 7820,
+ 9483, 8775, 8760,
+ 9483, 8775, 8805, 11167, 925, 11739, 10422,
+ 9483, 8775, 8805, 11167, 925, 11739, 10423, 12438,
+ 9483, 8775, 8805, 11167, 925, 11739, 11658,
+ 9483, 8775, 8805, 12051, 925, 11739, 10422,
+ 9483, 8775, 8805, 12051, 925, 11739, 11658,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12438,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12440,
+ 9483, 8775, 8805, 12051, 925, 11739, 11659, 12442,
+ 9483, 8775, 9050,
+ 9483, 8775, 9060,
+ 9483, 8775, 9105, 10367, 6504,
+ 9483, 8775, 9105, 10367, 7820,
+ 9483, 8775, 9284,
+ 9483, 8775, 9285, 6490,
+ 9483, 8775, 9491, 600,
+ 9483, 8775, 9491, 4116,
+ 9483, 8775, 9598,
+ 9483, 8775, 9615, 5244,
+ 9483, 8775, 9615, 5540,
+ 9483, 8775, 9615, 5965, 4204,
+ 9483, 8775, 9615, 5965, 7518,
+ 9483, 8775, 9633, 6789, 9022,
+ 9483, 8775, 9950,
+ 9483, 8775, 10189, 11366,
+ 9483, 8775, 10189, 11368,
+ 9483, 8775, 10189, 11370,
+ 9483, 8775, 10267, 6020,
+ 9483, 8775, 10349, 9467, 5540,
+ 9483, 8775, 10367, 6504,
+ 9483, 8775, 10373, 7626,
+ 9483, 8775, 10381, 10554,
+ 9483, 8775, 10381, 10556,
+ 9483, 8775, 10381, 10558,
+ 9483, 8775, 10381, 10560,
+ 9483, 8775, 10381, 10562,
+ 9483, 8775, 10381, 10564,
+ 9483, 8775, 10381, 10566,
+ 9483, 8775, 10381, 10568,
+ 9483, 8775, 10381, 10570,
+ 9483, 8775, 10381, 11252,
+ 9483, 8775, 10381, 11254,
+ 9483, 8775, 10483, 10182,
+ 9483, 8775, 10483, 10184,
+ 9483, 8775, 10483, 10186,
+ 9483, 8775, 10527, 7626,
+ 9483, 8775, 10634,
+ 9483, 8775, 10635, 11212,
+ 9483, 8775, 10643, 10367, 601, 6504,
+ 9483, 8775, 10643, 10367, 601, 7443, 6504,
+ 9483, 8775, 10643, 10367, 601, 7443, 7820,
+ 9483, 8775, 10643, 10367, 601, 7820,
+ 9483, 8775, 10643, 10367, 4117, 6504,
+ 9483, 8775, 10643, 10367, 4117, 7820,
+ 9483, 8775, 10643, 10367, 4849, 6504,
+ 9483, 8775, 10643, 10367, 4849, 7820,
+ 9483, 8775, 10643, 10367, 7443, 6504,
+ 9483, 8775, 10643, 10367, 7443, 7820,
+ 9483, 8775, 10659, 7626,
+ 9483, 8775, 10767, 601, 824,
+ 9483, 8775, 10767, 2418,
+ 9483, 8775, 10767, 3772,
+ 9483, 8775, 10767, 4104,
+ 9483, 8775, 10767, 4117, 824,
+ 9483, 8775, 10767, 4206,
+ 9483, 8775, 10767, 5779, 11174,
+ 9483, 8775, 10767, 5832,
+ 9483, 8775, 10767, 7116,
+ 9483, 8775, 10767, 7596,
+ 9483, 8775, 10767, 7908,
+ 9483, 8775, 10767, 8153, 8844,
+ 9483, 8775, 10767, 8210,
+ 9483, 8775, 10767, 8212,
+ 9483, 8775, 10767, 8214,
+ 9483, 8775, 10767, 8216,
+ 9483, 8775, 10767, 8218,
+ 9483, 8775, 10767, 8806,
+ 9483, 8775, 10767, 8849, 8844,
+ 9483, 8775, 10767, 9458,
+ 9483, 8775, 10767, 10236,
+ 9483, 8775, 10767, 10534,
+ 9483, 8775, 10767, 11366,
+ 9483, 8775, 10767, 11368,
+ 9483, 8775, 10767, 11370,
+ 9483, 8775, 10767, 12407, 1044,
+ 9483, 8775, 10767, 12871, 5832,
+ 9483, 8775, 10767, 13016,
+ 9483, 8775, 10767, 13184,
+ 9483, 8775, 10767, 13340,
+ 9483, 8775, 10784,
+ 9483, 8775, 10995, 7626,
+ 9483, 8775, 11005, 7626,
+ 9483, 8775, 11019, 600,
+ 9483, 8775, 11019, 4116,
+ 9483, 8775, 11027, 5, 3946,
+ 9483, 8775, 11027, 11, 3946,
+ 9483, 8775, 11176,
+ 9483, 8775, 11177, 8220,
+ 9483, 8775, 11220,
+ 9483, 8775, 11221, 8220,
+ 9483, 8775, 11241, 5244,
+ 9483, 8775, 11241, 5540,
+ 9483, 8775, 11429, 600,
+ 9483, 8775, 11429, 4116,
+ 9483, 8775, 11789, 5540,
+ 9483, 8775, 11789, 6504,
+ 9483, 8775, 11789, 7820,
+ 9483, 8775, 11795, 5540,
+ 9483, 8775, 11795, 6504,
+ 9483, 8775, 11795, 7820,
+ 9483, 8775, 11821, 11006,
+ 9483, 8775, 11857, 7626,
+ 9483, 8775, 11928,
+ 9483, 8775, 12023, 11006,
+ 9483, 8775, 12028,
+ 9483, 8775, 12092,
+ 9483, 8775, 12115, 10366,
+ 9483, 8775, 12152,
+ 9483, 8775, 12531, 3254,
+ 9483, 8775, 12531, 6468,
+ 9483, 8775, 12867, 5244,
+ 9483, 8775, 12867, 5540,
+ 9483, 8775, 13025, 5244,
+ 9483, 8775, 13025, 5540,
+ 9483, 8775, 13081, 10367, 4117, 6504,
+ 9483, 8775, 13081, 10367, 4117, 7820,
+ 9485, 5671, 6689, 2170,
+ 9485, 5671, 6689, 2540,
+ 9485, 5671, 6689, 2778,
+ 9485, 5671, 6689, 4200,
+ 9485, 5671, 6689, 4214,
+ 9485, 5671, 6689, 5190,
+ 9485, 5671, 6689, 6260,
+ 9485, 5671, 6689, 6722,
+ 9485, 5671, 6689, 7508,
+ 9485, 5671, 6689, 7694,
+ 9485, 5759, 1045, 6490,
+ 9485, 5759, 3278,
+ 9485, 5759, 5671, 8834,
+ 9485, 5759, 5671, 8836,
+ 9485, 5759, 5671, 8840,
+ 9485, 5759, 5671, 8842,
+ 9485, 5759, 5671, 9125, 8834,
+ 9485, 5759, 5671, 9125, 8836,
+ 9485, 5759, 5671, 9125, 10159, 5964,
+ 9485, 5759, 7465, 9555, 8840,
+ 9485, 5759, 8425, 9664,
+ 9485, 5759, 8916,
+ 9485, 5759, 9664,
+ 9485, 5759, 9824,
+ 9485, 5759, 9839, 2273, 7025, 8832,
+ 9485, 5759, 9839, 2273, 7025, 8834,
+ 9485, 5759, 9839, 2273, 7025, 8836,
+ 9485, 5759, 9839, 2273, 7025, 8838,
+ 9485, 5759, 9839, 2273, 7025, 8840,
+ 9485, 5759, 9870,
+ 9485, 5965, 4927, 5657, 7025, 311, 2218,
+ 9485, 5965, 4927, 5657, 7025, 6902,
+ 9485, 6689, 2170,
+ 9485, 6689, 2540,
+ 9485, 6689, 2778,
+ 9485, 6689, 4200,
+ 9485, 6689, 4214,
+ 9485, 6689, 5190,
+ 9485, 6689, 6260,
+ 9485, 6689, 6722,
+ 9485, 6689, 7508,
+ 9485, 6689, 7694,
+ 9485, 7803, 5759, 8,
+ 9485, 7803, 5759, 9, 6376,
+ 9485, 7803, 5759, 16,
+ 9485, 7803, 5759, 40,
+ 9485, 7803, 5759, 58,
+ 9485, 7803, 5759, 72,
+ 9485, 7803, 5759, 266,
+ 9485, 7803, 5759, 606,
+ 9485, 7803, 5759, 1937, 28,
+ 9485, 7803, 5759, 1937, 266,
+ 9485, 7803, 5759, 4263, 7025, 16,
+ 9485, 7803, 5759, 5657, 7025, 188,
+ 9485, 7803, 5759, 5671, 8,
+ 9485, 7803, 5759, 5671, 9, 6376,
+ 9485, 7803, 5759, 5671, 58,
+ 9485, 7803, 5759, 5671, 6789, 48,
+ 9485, 7803, 5759, 5885, 58,
+ 9485, 7803, 5759, 7031, 40,
+ 9485, 7803, 5759, 7031, 162,
+ 9485, 7803, 5759, 7031, 426,
+ 9485, 7803, 5759, 9827, 22,
+ 9485, 7803, 5759, 9827, 34,
+ 9485, 7803, 5759, 9827, 344,
+ 9485, 7803, 5759, 9827, 518,
+ 9485, 7803, 5759, 9839, 2273, 7025, 188,
+ 9485, 7803, 5759, 9839, 2273, 7025, 590,
+ 9485, 8405, 0,
+ 9485, 8405, 8,
+ 9485, 8405, 16,
+ 9485, 8405, 28,
+ 9485, 8405, 40,
+ 9485, 8405, 92,
+ 9485, 8405, 100,
+ 9485, 8405, 116,
+ 9485, 8405, 138,
+ 9485, 8405, 216,
+ 9485, 8405, 236,
+ 9485, 8405, 266,
+ 9485, 8405, 292,
+ 9485, 8405, 306,
+ 9485, 8405, 332,
+ 9485, 8405, 364,
+ 9485, 8405, 392,
+ 9485, 8405, 462,
+ 9485, 8405, 510,
+ 9485, 8405, 524,
+ 9485, 8405, 556,
+ 9485, 8405, 606,
+ 9485, 8405, 622,
+ 9485, 8405, 652,
+ 9485, 8405, 792,
+ 9485, 8405, 884,
+ 9485, 8405, 974,
+ 9485, 8405, 996,
+ 9485, 8405, 1260,
+ 9485, 8405, 1512,
+ 9485, 8405, 1612,
+ 9485, 8405, 1796,
+ 9485, 8405, 1937, 8,
+ 9485, 8405, 1937, 766,
+ 9485, 8405, 1937, 768,
+ 9485, 8405, 1937, 1512,
+ 9485, 8405, 1937, 2030,
+ 9485, 8405, 2030,
+ 9485, 8405, 2076,
+ 9485, 8405, 2126,
+ 9485, 8405, 2212,
+ 9485, 8405, 2516,
+ 9485, 8405, 2566,
+ 9485, 8405, 2678,
+ 9485, 8405, 2746,
+ 9485, 8405, 4016,
+ 9485, 8405, 5236,
+ 9485, 8405, 5657, 7025, 2516,
+ 9485, 8405, 5671, 0,
+ 9485, 8405, 5671, 100,
+ 9485, 8405, 5671, 116,
+ 9485, 8405, 5671, 138,
+ 9485, 8405, 5671, 196,
+ 9485, 8405, 5671, 216,
+ 9485, 8405, 5671, 236,
+ 9485, 8405, 5671, 306,
+ 9485, 8405, 5671, 392,
+ 9485, 8405, 5671, 670,
+ 9485, 8405, 5671, 1612,
+ 9485, 8405, 5671, 2126,
+ 9485, 8405, 5671, 2212,
+ 9485, 8405, 5671, 2678,
+ 9485, 8405, 5994,
+ 9485, 8405, 6877, 524,
+ 9485, 8405, 7465, 9555, 196,
+ 9485, 8405, 9253, 2273, 7025, 2076,
+ 9485, 8405, 9253, 2273, 7025, 3102,
+ 9485, 8405, 9253, 2273, 7025, 4322,
+ 9485, 8405, 9827, 22,
+ 9485, 8405, 9827, 34,
+ 9485, 8405, 9827, 344,
+ 9485, 8405, 9827, 518,
+ 9485, 8405, 9839, 2273, 7025, 2266,
+ 9485, 8405, 9839, 2273, 7025, 2678,
+ 9485, 8775, 5671, 2170,
+ 9485, 8775, 5671, 12016,
+ 9485, 8775, 10218,
+ 9485, 8775, 10304,
+ 9485, 8775, 10768,
+ 9485, 8775, 13040,
+ 9485, 10775, 5759, 1937, 8461, 332,
+ 9485, 10775, 5759, 1937, 8461, 364,
+ 9485, 10775, 5759, 1937, 8461, 392,
+ 9485, 10775, 5759, 5671, 8461, 622,
+ 9485, 10775, 5759, 8461, 236,
+ 9485, 10775, 5759, 8461, 510,
+ 9485, 10775, 5759, 8461, 622,
+ 9485, 10775, 5759, 8461, 652,
+ 9495, 8153, 10677, 761, 8153, 7443, 11378,
+ 9497, 1, 8763, 429, 2089, 6741, 568,
+ 9497, 1, 10579, 429, 2089, 6741, 568,
+ 9497, 11099, 2089, 6741, 568,
+ 9497, 11099, 2089, 11621, 568,
+ 9497, 11099, 2089, 12472,
+ 9497, 12473, 2089, 6741, 568,
+ 9497, 12473, 2089, 11098,
+ 9497, 12473, 2089, 11621, 568,
+ 9497, 12903, 2089, 9855, 6741, 568,
+ 9498,
+ 9509, 6689, 8696,
+ 9511, 7121, 13069, 7821, 11765, 6434,
+ 9511, 7773, 13069, 7821, 11765, 6434,
+ 9525, 6409, 9537, 600,
+ 9525, 6409, 9537, 4116,
+ 9541, 6689, 2170,
+ 9541, 6689, 2540,
+ 9541, 6689, 2778,
+ 9541, 6689, 4200,
+ 9541, 6689, 4214,
+ 9541, 6689, 5190,
+ 9541, 6689, 6260,
+ 9541, 6689, 6722,
+ 9541, 6689, 7508,
+ 9541, 6689, 7694,
+ 9541, 8405, 0,
+ 9541, 8405, 8,
+ 9541, 8405, 16,
+ 9541, 8405, 28,
+ 9541, 8405, 40,
+ 9541, 8405, 58,
+ 9541, 8405, 100,
+ 9541, 8405, 162,
+ 9541, 8405, 196,
+ 9541, 8405, 216,
+ 9541, 8405, 236,
+ 9541, 8405, 292,
+ 9541, 8405, 440,
+ 9541, 8405, 510,
+ 9541, 8405, 524,
+ 9541, 8405, 556,
+ 9541, 8405, 638,
+ 9541, 8405, 652,
+ 9541, 8405, 996,
+ 9541, 8405, 1612,
+ 9541, 8405, 2918,
+ 9541, 8405, 3244,
+ 9541, 8405, 3854,
+ 9541, 8405, 4050,
+ 9541, 8405, 4698,
+ 9541, 8405, 4820,
+ 9541, 8405, 5000,
+ 9541, 8405, 5288,
+ 9541, 8405, 5470,
+ 9541, 8405, 7540,
+ 9573, 12432,
+ 9581, 5758,
+ 9595, 5758,
+ 9615, 5244,
+ 9617, 8775, 8004,
+ 9633, 7709, 10375, 6377, 11097, 6434,
+ 9633, 7709, 10375, 6377, 11765, 6434,
+ 9633, 9718,
+ 9633, 9719, 6121, 11649, 8758,
+ 9633, 9719, 10374,
+ 9633, 9719, 11183, 8762,
+ 9641, 6909, 6505, 6907, 8022,
+ 9641, 8225, 6907, 8022,
+ 9641, 9063, 32,
+ 9650,
+ 9660,
+ 9665, 5758,
+ 9666,
+ 9671, 4926,
+ 9676,
+ 9683, 8405, 70,
+ 9683, 8405, 260,
+ 9683, 8405, 438,
+ 9683, 8405, 444,
+ 9683, 8405, 536,
+ 9683, 8405, 600,
+ 9683, 8405, 706,
+ 9683, 8405, 708,
+ 9683, 8405, 712,
+ 9683, 8405, 732,
+ 9683, 8405, 736,
+ 9683, 8405, 740,
+ 9683, 8405, 802,
+ 9683, 8405, 1090,
+ 9683, 8405, 1092,
+ 9683, 8405, 1100,
+ 9683, 8405, 1120,
+ 9683, 8405, 1150,
+ 9683, 8405, 1210,
+ 9683, 8405, 1472,
+ 9683, 8405, 1474,
+ 9683, 8405, 2110,
+ 9683, 8405, 2154,
+ 9683, 8405, 2164,
+ 9683, 8405, 2186,
+ 9683, 8405, 2726,
+ 9683, 8405, 2884,
+ 9683, 8405, 2938,
+ 9683, 8405, 3048,
+ 9683, 8405, 3060,
+ 9683, 8405, 3178,
+ 9683, 8405, 4048,
+ 9683, 8405, 4548,
+ 9683, 8405, 4754,
+ 9683, 8405, 4892,
+ 9683, 8405, 5004,
+ 9683, 8405, 5382,
+ 9683, 8405, 5406,
+ 9683, 8405, 5560,
+ 9683, 8405, 5854,
+ 9683, 8405, 5922,
+ 9683, 8405, 6124,
+ 9683, 8405, 6432,
+ 9683, 8405, 6886,
+ 9683, 8405, 7012,
+ 9683, 8405, 7684,
+ 9683, 8405, 8054,
+ 9683, 8405, 9466,
+ 9689, 9610,
+ 9693, 445, 11098,
+ 9693, 445, 12472,
+ 9693, 6377, 11099, 6377, 8167, 5758,
+ 9693, 6377, 12473, 6377, 8167, 5758,
+ 9693, 7173, 9692,
+ 9695, 5759, 10702,
+ 9695, 5759, 11392,
+ 9695, 5759, 11418,
+ 9695, 7803, 5759, 4087, 9406,
+ 9695, 7803, 5759, 4087, 10272,
+ 9695, 7803, 5759, 4087, 11150,
+ 9695, 7803, 5759, 4087, 11406,
+ 9695, 7803, 5759, 4087, 12024,
+ 9695, 7803, 5759, 4087, 12468,
+ 9695, 7803, 5759, 7043, 10272,
+ 9695, 7803, 5759, 7043, 11150,
+ 9695, 7803, 5759, 7043, 11406,
+ 9695, 7803, 5759, 7059, 4056,
+ 9695, 7803, 5759, 9406,
+ 9695, 7803, 5759, 9407, 1339, 4087, 11408,
+ 9695, 7803, 5759, 9407, 1339, 11408,
+ 9695, 7803, 5759, 9407, 1339, 12024,
+ 9695, 7803, 5759, 11408,
+ 9695, 7803, 5759, 12024,
+ 9695, 7803, 5759, 12468,
+ 9695, 8405, 3259, 9032,
+ 9695, 8405, 7962,
+ 9695, 8405, 8176,
+ 9695, 8405, 8326,
+ 9695, 8405, 8558,
+ 9695, 8405, 8904,
+ 9695, 8405, 8966,
+ 9695, 8405, 8978,
+ 9695, 8405, 8988,
+ 9695, 8405, 9012,
+ 9695, 8405, 9141, 9424,
+ 9695, 8405, 9141, 9492,
+ 9695, 8405, 9141, 9656,
+ 9695, 8405, 9256,
+ 9695, 8405, 9280,
+ 9695, 8405, 9330,
+ 9695, 8405, 9352,
+ 9695, 8405, 9387, 11692,
+ 9695, 8405, 9464,
+ 9695, 8405, 9534,
+ 9695, 8405, 9622,
+ 9695, 8405, 9655, 9146,
+ 9695, 8405, 9655, 9302,
+ 9695, 8405, 9655, 9376,
+ 9695, 8405, 9655, 9988,
+ 9695, 8405, 9759, 9656,
+ 9695, 8405, 9759, 10499, 12090,
+ 9695, 8405, 9759, 11692,
+ 9695, 8405, 9812,
+ 9695, 8405, 9818,
+ 9695, 8405, 9844,
+ 9695, 8405, 9856,
+ 9695, 8405, 10248,
+ 9695, 8405, 10270,
+ 9695, 8405, 11044,
+ 9695, 8405, 11064,
+ 9695, 8405, 11133, 9424,
+ 9695, 8405, 11133, 9492,
+ 9695, 8405, 11133, 9656,
+ 9695, 8405, 11411, 9032,
+ 9695, 8405, 11411, 9070,
+ 9695, 8405, 11411, 9146,
+ 9695, 8405, 11411, 9302,
+ 9695, 8405, 11411, 9376,
+ 9695, 8405, 11411, 9392,
+ 9695, 8405, 11411, 9576,
+ 9695, 8405, 11411, 9768,
+ 9695, 8405, 11411, 9988,
+ 9695, 8405, 11411, 10652,
+ 9695, 8405, 12077, 9032,
+ 9695, 8405, 12077, 9070,
+ 9695, 8405, 12077, 9146,
+ 9695, 8405, 12077, 9302,
+ 9695, 8405, 12077, 9376,
+ 9695, 8405, 12077, 9392,
+ 9695, 8405, 12077, 9576,
+ 9695, 8405, 12077, 9768,
+ 9695, 8405, 12077, 9988,
+ 9695, 8405, 12077, 10652,
+ 9695, 12133, 11670,
+ 9701, 9601, 9898,
+ 9705, 6741, 569, 445, 11098,
+ 9705, 6741, 569, 445, 11099, 6121, 1045, 8318,
+ 9705, 6741, 569, 445, 12472,
+ 9705, 6741, 569, 445, 12473, 6121, 1045, 8318,
+ 9707, 7085, 444,
+ 9707, 7085, 720,
+ 9709, 5912,
+ 9709, 5913, 445, 6741, 568,
+ 9712,
+ 9718,
+ 9719, 6121, 9546,
+ 9722,
+ 9733, 1045, 10374,
+ 9733, 4215, 1045, 12132,
+ 9733, 5444,
+ 9733, 7172,
+ 9733, 7593, 8056,
+ 9733, 7710,
+ 9733, 8649, 10001, 7580,
+ 9733, 8744,
+ 9733, 9279, 10001, 7580,
+ 9733, 9898,
+ 9753, 10260,
+ 9761, 5759, 8916,
+ 9761, 7803, 5759, 16,
+ 9761, 7803, 5759, 40,
+ 9761, 8405, 0,
+ 9761, 8405, 16,
+ 9761, 8405, 40,
+ 9761, 8405, 100,
+ 9761, 8405, 138,
+ 9761, 8405, 216,
+ 9761, 8405, 236,
+ 9761, 8405, 306,
+ 9761, 8405, 332,
+ 9761, 8405, 364,
+ 9761, 8405, 392,
+ 9761, 8405, 462,
+ 9761, 8405, 524,
+ 9761, 8405, 556,
+ 9761, 8405, 622,
+ 9761, 8405, 652,
+ 9761, 8405, 2030,
+ 9783, 12369, 11765, 10716,
+ 9783, 13049, 11765, 10716,
+ 9789, 327, 521, 1612,
+ 9789, 327, 521, 1613, 3831, 1915, 858,
+ 9789, 4927, 723, 7045, 4376,
+ 9789, 4927, 723, 7045, 4382,
+ 9789, 4927, 887, 1904,
+ 9789, 4927, 1307, 7463, 4376,
+ 9789, 4927, 1307, 7463, 4382,
+ 9789, 4927, 2417, 3895, 8743, 5668,
+ 9789, 4927, 2733, 6374,
+ 9789, 4927, 3067, 1905, 7745, 5669, 364,
+ 9789, 4927, 3793, 5709, 3067, 1904,
+ 9789, 4927, 4355, 3067, 1905, 685, 4355, 7745, 364,
+ 9789, 4927, 4355, 3067, 1905, 685, 5559, 3759, 364,
+ 9789, 4927, 4355, 3067, 1905, 11377, 0,
+ 9789, 4927, 4355, 7744,
+ 9789, 4927, 5141, 6539, 2133, 3174,
+ 9789, 4927, 5141, 6539, 5659, 7462,
+ 9789, 4927, 5307, 5668,
+ 9789, 4927, 5307, 7744,
+ 9789, 4927, 5307, 7745, 5668,
+ 9789, 4927, 5543, 4351, 5668,
+ 9789, 4927, 5668,
+ 9789, 4927, 6523, 7462,
+ 9789, 4927, 6525, 5709, 225, 1905, 7436,
+ 9789, 4927, 6527, 3067, 1904,
+ 9789, 4927, 6543, 3067, 1905, 5421, 5669, 364,
+ 9789, 4927, 6543, 6373, 7463, 369, 4895, 858,
+ 9789, 4927, 6543, 6373, 7463, 3831, 1915, 858,
+ 9789, 4927, 7179, 3067, 225, 1905, 7436,
+ 9789, 4927, 7493, 5668,
+ 9789, 4927, 7745, 5668,
+ 9789, 4927, 8564,
+ 9789, 4927, 9099, 3067, 1905, 5655, 364,
+ 9789, 4927, 9099, 3809, 8653, 3067, 1905, 5655, 364,
+ 9789, 4927, 9320,
+ 9789, 4927, 9363, 3067, 1905, 4939, 364,
+ 9789, 4927, 9363, 3809, 8653, 3067, 1905, 4939, 364,
+ 9789, 4927, 10795, 7745, 6528,
+ 9789, 4927, 12955, 7744,
+ 9789, 5759, 1301, 859, 9634,
+ 9789, 5759, 1301, 1889, 9634,
+ 9789, 5759, 1753, 2733, 858,
+ 9789, 5759, 1755, 7462,
+ 9789, 5759, 1865, 7746,
+ 9789, 5759, 2133, 3175, 1983, 138,
+ 9789, 5759, 2547, 4842,
+ 9789, 5759, 3035, 7746,
+ 9789, 5759, 4937, 858,
+ 9789, 5759, 5531, 1985, 4256,
+ 9789, 5759, 5531, 1985, 4352,
+ 9789, 5759, 5531, 1985, 5531, 4096,
+ 9789, 5759, 5531, 1985, 6862,
+ 9789, 5759, 5531, 4097, 4256,
+ 9789, 5759, 5531, 4097, 4352,
+ 9789, 5759, 5531, 4097, 5531, 1984,
+ 9789, 5759, 5531, 4097, 6862,
+ 9789, 5759, 5557, 547, 2031, 516,
+ 9789, 5759, 5559, 3758,
+ 9789, 5759, 6179, 7462,
+ 9789, 6689, 2170,
+ 9789, 6689, 2540,
+ 9789, 6689, 2778,
+ 9789, 6689, 4200,
+ 9789, 6689, 4214,
+ 9789, 6689, 4389, 2170,
+ 9789, 6689, 4389, 2540,
+ 9789, 6689, 4389, 2778,
+ 9789, 6689, 4389, 4200,
+ 9789, 6689, 4389, 4214,
+ 9789, 6689, 4389, 5190,
+ 9789, 6689, 4389, 6260,
+ 9789, 6689, 4389, 6722,
+ 9789, 6689, 4389, 7508,
+ 9789, 6689, 4389, 7694,
+ 9789, 6689, 5190,
+ 9789, 6689, 6260,
+ 9789, 6689, 6722,
+ 9789, 6689, 7508,
+ 9789, 6689, 7694,
+ 9789, 7803, 5759, 8,
+ 9789, 7803, 5759, 16,
+ 9789, 7803, 5759, 28,
+ 9789, 7803, 5759, 40,
+ 9789, 7803, 5759, 58,
+ 9789, 7803, 5759, 162,
+ 9789, 7803, 5759, 266,
+ 9789, 7803, 5759, 440,
+ 9789, 7803, 5759, 606,
+ 9789, 7803, 5759, 9827, 22,
+ 9789, 7803, 5759, 9827, 34,
+ 9789, 7803, 5759, 9827, 344,
+ 9789, 7803, 5759, 9827, 518,
+ 9789, 7803, 5759, 10489, 16,
+ 9789, 7803, 5759, 10489, 266,
+ 9789, 8405, 0,
+ 9789, 8405, 52,
+ 9789, 8405, 100,
+ 9789, 8405, 116,
+ 9789, 8405, 138,
+ 9789, 8405, 216,
+ 9789, 8405, 236,
+ 9789, 8405, 292,
+ 9789, 8405, 306,
+ 9789, 8405, 332,
+ 9789, 8405, 364,
+ 9789, 8405, 392,
+ 9789, 8405, 462,
+ 9789, 8405, 510,
+ 9789, 8405, 524,
+ 9789, 8405, 556,
+ 9789, 8405, 622,
+ 9789, 8405, 652,
+ 9789, 8405, 670,
+ 9789, 8405, 792,
+ 9789, 8405, 884,
+ 9789, 8405, 974,
+ 9789, 8405, 996,
+ 9789, 8405, 1080,
+ 9789, 8405, 1260,
+ 9789, 8405, 1612,
+ 9789, 8405, 1642,
+ 9789, 8405, 2030,
+ 9789, 8405, 2076,
+ 9789, 8405, 2126,
+ 9789, 8405, 2212,
+ 9789, 8405, 2438,
+ 9789, 8405, 2516,
+ 9789, 8405, 2566,
+ 9789, 8405, 2678,
+ 9789, 8405, 2732,
+ 9789, 8405, 2746,
+ 9789, 8405, 3146,
+ 9789, 8405, 4016,
+ 9789, 8405, 4140,
+ 9789, 8405, 4782,
+ 9789, 8405, 5978,
+ 9789, 8405, 5994,
+ 9789, 8405, 11631, 510,
+ 9789, 8775, 2089, 112,
+ 9789, 8775, 2089, 113, 3831, 7904,
+ 9789, 8775, 2089, 113, 4353, 7904,
+ 9789, 8775, 2089, 113, 5307, 7904,
+ 9789, 8775, 2399, 2420,
+ 9789, 8775, 2399, 2421, 5543, 4350,
+ 9789, 8775, 4119, 112,
+ 9789, 8775, 5421, 462,
+ 9789, 8775, 7333, 4258,
+ 9789, 10307, 5759, 3877, 7462,
+ 9789, 10307, 5759, 4859, 7462,
+ 9789, 10585, 436,
+ 9789, 11257, 8405, 0,
+ 9789, 11257, 8405, 52,
+ 9789, 11257, 8405, 100,
+ 9789, 11257, 8405, 116,
+ 9789, 11257, 8405, 138,
+ 9789, 11257, 8405, 216,
+ 9789, 11257, 8405, 236,
+ 9789, 11257, 8405, 292,
+ 9789, 11257, 8405, 306,
+ 9789, 11257, 8405, 332,
+ 9789, 11257, 8405, 364,
+ 9789, 11257, 8405, 392,
+ 9789, 11257, 8405, 462,
+ 9789, 11257, 8405, 510,
+ 9789, 11257, 8405, 524,
+ 9789, 11257, 8405, 556,
+ 9789, 11257, 8405, 622,
+ 9789, 11257, 8405, 652,
+ 9789, 11257, 8405, 670,
+ 9789, 11257, 8405, 792,
+ 9789, 11257, 8405, 884,
+ 9789, 11257, 8405, 974,
+ 9789, 11257, 8405, 996,
+ 9789, 11257, 8405, 1080,
+ 9789, 11257, 8405, 1260,
+ 9789, 11257, 8405, 1612,
+ 9789, 11257, 8405, 2030,
+ 9789, 11257, 8405, 2076,
+ 9789, 11257, 8405, 2126,
+ 9789, 11257, 8405, 2212,
+ 9789, 11257, 8405, 2516,
+ 9789, 11257, 8405, 2566,
+ 9789, 11257, 8405, 2678,
+ 9789, 11257, 8405, 2732,
+ 9789, 11257, 8405, 2746,
+ 9789, 11257, 8405, 3146,
+ 9789, 11257, 8405, 4016,
+ 9789, 11257, 8405, 4140,
+ 9789, 11257, 8405, 4782,
+ 9789, 11257, 8405, 5978,
+ 9789, 11257, 8405, 5994,
+ 9789, 11257, 8405, 11631, 510,
+ 9789, 11257, 8405, 11631, 622,
+ 9789, 11257, 8405, 11631, 652,
+ 9789, 12405, 5759, 5661, 4255, 6371, 7462,
+ 9789, 12405, 5759, 7497, 8858,
+ 9789, 12405, 5759, 7907, 462,
+ 9789, 12423, 5759, 3845, 5892,
+ 9789, 12423, 5759, 5641, 6368,
+ 9789, 12423, 5759, 6909, 3764,
+ 9789, 12423, 5759, 7101, 3764,
+ 9793, 1177, 4194,
+ 9793, 1177, 4830,
+ 9793, 1177, 6116,
+ 9793, 1177, 6716,
+ 9793, 1177, 7812,
+ 9793, 1177, 8290,
+ 9793, 1177, 9786,
+ 9793, 1177, 10344,
+ 9811, 2779, 8289, 6434,
+ 9811, 6434,
+ 9811, 6435, 569, 760,
+ 9811, 6435, 4221, 760,
+ 9811, 6435, 6121, 2697, 11096,
+ 9811, 6435, 6121, 2697, 11764,
+ 9811, 6435, 6121, 8153, 8758,
+ 9811, 6435, 6121, 11649, 8758,
+ 9811, 6435, 11097, 429, 10959, 6434,
+ 9811, 6505, 6434,
+ 9811, 7821, 6434,
+ 9811, 7821, 6435, 439, 10416,
+ 9811, 7821, 6435, 439, 10417, 6121, 10677, 760,
+ 9811, 7821, 6435, 439, 10417, 6121, 11649, 760,
+ 9811, 7821, 6435, 4221, 760,
+ 9811, 7821, 8153, 6434,
+ 9811, 7821, 8153, 6435, 439, 10416,
+ 9811, 7924,
+ 9811, 8097, 6434,
+ 9811, 8153, 6434,
+ 9811, 8561, 7944,
+ 9811, 8849, 6434,
+ 9811, 9327, 6121, 3713, 4849, 569, 760,
+ 9811, 9327, 6121, 3713, 4849, 4221, 760,
+ 9811, 9327, 6121, 3713, 4849, 7991, 9811, 9327, 6121, 3713, 7442,
+ 9811, 9327, 6121, 3713, 4849, 7991, 10959, 9327, 6121, 3713, 7442,
+ 9811, 9327, 6121, 3713, 7443, 569, 760,
+ 9811, 9327, 6121, 3713, 7443, 4221, 760,
+ 9811, 9327, 6121, 3713, 11096,
+ 9811, 9327, 6121, 3713, 11764,
+ 9811, 11191, 6434,
+ 9811, 11875, 6435, 4221, 7593, 8056,
+ 9821, 4390,
+ 9835, 5758,
+ 9843, 4390,
+ 9853, 7931, 4213, 9680,
+ 9853, 11345, 10582,
+ 9858,
+ 9867, 5758,
+ 9880,
+ 9891, 4223, 5836,
+ 9891, 6616,
+ 9891, 7593, 8405, 116,
+ 9891, 7593, 8405, 130,
+ 9891, 7593, 8405, 138,
+ 9891, 7593, 8405, 166,
+ 9891, 7593, 8405, 186,
+ 9891, 7593, 8405, 246,
+ 9891, 7593, 8405, 292,
+ 9891, 7593, 8405, 430,
+ 9891, 7593, 8405, 510,
+ 9891, 7593, 8405, 568,
+ 9891, 7593, 8405, 616,
+ 9891, 7593, 8405, 656,
+ 9891, 7593, 8405, 670,
+ 9891, 7593, 8405, 744,
+ 9891, 7593, 8405, 784,
+ 9891, 7593, 8405, 884,
+ 9891, 7593, 8405, 1094,
+ 9891, 7593, 8405, 1152,
+ 9891, 7593, 8405, 1276,
+ 9891, 7593, 8405, 1488,
+ 9891, 7593, 8405, 1600,
+ 9891, 7593, 8405, 1602,
+ 9891, 7593, 8405, 1894,
+ 9891, 7593, 8405, 2092,
+ 9891, 7593, 8405, 2206,
+ 9891, 7593, 8405, 2404,
+ 9891, 7593, 8405, 2506,
+ 9891, 7593, 8405, 2516,
+ 9891, 7593, 8405, 2862,
+ 9891, 7593, 8405, 2958,
+ 9891, 7593, 8405, 3148,
+ 9891, 7593, 8405, 3892,
+ 9891, 7593, 8405, 4314,
+ 9891, 7593, 8405, 4636,
+ 9891, 7593, 8405, 4886,
+ 9891, 7593, 8405, 5434,
+ 9891, 7593, 8405, 5948,
+ 9891, 7593, 8405, 6214,
+ 9891, 7593, 10301, 1095, 6214,
+ 9891, 7593, 10301, 1895, 1094,
+ 9891, 7593, 10301, 1895, 1488,
+ 9891, 7593, 10301, 1895, 2092,
+ 9891, 7593, 10301, 1895, 2958,
+ 9891, 7593, 10301, 2863, 2092,
+ 9891, 8306,
+ 9891, 9063, 8405, 116,
+ 9891, 9063, 8405, 130,
+ 9891, 9063, 8405, 138,
+ 9891, 9063, 8405, 166,
+ 9891, 9063, 8405, 186,
+ 9891, 9063, 8405, 246,
+ 9891, 9063, 8405, 292,
+ 9891, 9063, 8405, 430,
+ 9891, 9063, 8405, 510,
+ 9891, 9063, 8405, 568,
+ 9891, 9063, 8405, 616,
+ 9891, 9063, 8405, 656,
+ 9891, 9063, 8405, 670,
+ 9891, 9063, 8405, 744,
+ 9891, 9063, 8405, 784,
+ 9891, 9063, 8405, 884,
+ 9891, 9063, 8405, 1094,
+ 9891, 9063, 8405, 1152,
+ 9891, 9063, 8405, 1276,
+ 9891, 9063, 8405, 1488,
+ 9891, 9063, 8405, 1600,
+ 9891, 9063, 8405, 1602,
+ 9891, 9063, 8405, 1894,
+ 9891, 9063, 8405, 2092,
+ 9891, 9063, 8405, 2206,
+ 9891, 9063, 8405, 2404,
+ 9891, 9063, 8405, 2506,
+ 9891, 9063, 8405, 2516,
+ 9891, 9063, 8405, 2862,
+ 9891, 9063, 8405, 2958,
+ 9891, 9063, 8405, 3148,
+ 9891, 9063, 8405, 3892,
+ 9891, 9063, 8405, 4314,
+ 9891, 9063, 8405, 4636,
+ 9891, 9063, 8405, 4886,
+ 9891, 9063, 8405, 5434,
+ 9891, 9063, 8405, 5948,
+ 9891, 9063, 8405, 6214,
+ 9891, 10157, 4926,
+ 9891, 10339, 8405, 4849, 4389, 5550,
+ 9891, 10469, 4926,
+ 9891, 11424,
+ 9891, 12017, 4926,
+ 9891, 12391, 4926,
+ 9898,
+ 9899, 10374,
+ 9900,
+ 9907, 3229, 3228,
+ 9907, 5759, 2811, 7438,
+ 9907, 5759, 2811, 8030,
+ 9907, 5759, 6502,
+ 9907, 5759, 6556,
+ 9907, 5759, 8768,
+ 9907, 5759, 9628,
+ 9907, 6545, 5762,
+ 9907, 6545, 9570,
+ 9907, 6545, 11156,
+ 9907, 6689, 2170,
+ 9907, 6689, 2540,
+ 9907, 6689, 2778,
+ 9907, 6689, 4200,
+ 9907, 6689, 4214,
+ 9907, 6689, 5190,
+ 9907, 6689, 6260,
+ 9907, 6689, 6722,
+ 9907, 6689, 7508,
+ 9907, 6689, 7694,
+ 9907, 7334,
+ 9907, 7803, 5759, 333, 7094,
+ 9907, 7803, 5759, 333, 7095, 8796,
+ 9907, 7803, 5759, 511, 5536,
+ 9907, 7803, 5759, 511, 5537, 8796,
+ 9907, 7803, 5759, 2810,
+ 9907, 7803, 5759, 2811, 5638,
+ 9907, 7803, 5759, 5844,
+ 9907, 7803, 5759, 5845, 4602,
+ 9907, 7803, 5759, 7362,
+ 9907, 7803, 5759, 7363, 8796,
+ 9907, 7803, 5759, 8788,
+ 9907, 7803, 5759, 8789, 5536,
+ 9907, 7803, 5759, 8789, 5537, 8796,
+ 9907, 7803, 5759, 8789, 8796,
+ 9907, 7803, 5759, 8796,
+ 9907, 7826,
+ 9907, 8405, 100,
+ 9907, 8405, 101, 9396,
+ 9907, 8405, 116,
+ 9907, 8405, 117, 4822,
+ 9907, 8405, 138,
+ 9907, 8405, 139, 4920,
+ 9907, 8405, 139, 7195, 10704,
+ 9907, 8405, 139, 7195, 11106,
+ 9907, 8405, 165, 7488,
+ 9907, 8405, 216,
+ 9907, 8405, 217, 4346,
+ 9907, 8405, 236,
+ 9907, 8405, 292,
+ 9907, 8405, 293, 4632,
+ 9907, 8405, 306,
+ 9907, 8405, 307, 11106,
+ 9907, 8405, 332,
+ 9907, 8405, 333, 7094,
+ 9907, 8405, 333, 7095, 8796,
+ 9907, 8405, 364,
+ 9907, 8405, 392,
+ 9907, 8405, 393, 8632,
+ 9907, 8405, 462,
+ 9907, 8405, 463, 7020,
+ 9907, 8405, 510,
+ 9907, 8405, 511, 5536,
+ 9907, 8405, 511, 5537, 8796,
+ 9907, 8405, 524,
+ 9907, 8405, 525, 5626,
+ 9907, 8405, 525, 5634,
+ 9907, 8405, 556,
+ 9907, 8405, 557, 5888,
+ 9907, 8405, 557, 7086,
+ 9907, 8405, 557, 7195, 11106,
+ 9907, 8405, 613, 7488,
+ 9907, 8405, 622,
+ 9907, 8405, 652,
+ 9907, 8405, 1579, 7488,
+ 9907, 8405, 2030,
+ 9907, 8405, 2126,
+ 9907, 8405, 3129, 7488,
+ 9907, 8405, 4753, 7488,
+ 9907, 8405, 6037, 7488,
+ 9907, 8405, 6390,
+ 9907, 8405, 6391, 8796,
+ 9907, 8405, 6726,
+ 9907, 8405, 6986,
+ 9907, 8405, 6987, 8796,
+ 9907, 8405, 7312,
+ 9907, 8405, 7313, 8796,
+ 9907, 8405, 7760,
+ 9907, 8405, 7761, 8796,
+ 9907, 8405, 7914,
+ 9907, 8405, 7957, 7488,
+ 9907, 8566,
+ 9907, 9483, 8775, 3986,
+ 9907, 9483, 8775, 3987, 4266,
+ 9907, 9483, 8775, 3987, 8768,
+ 9907, 9483, 8775, 4060,
+ 9907, 9483, 8775, 4090,
+ 9907, 9483, 8775, 4106,
+ 9907, 9483, 8775, 4128,
+ 9907, 9483, 8775, 6632,
+ 9907, 9483, 8775, 6638,
+ 9907, 9483, 8775, 6678,
+ 9907, 9483, 8775, 10767, 4344,
+ 9907, 9483, 8775, 10767, 6492,
+ 9907, 9483, 8775, 10767, 6732,
+ 9907, 9483, 8775, 10767, 7670,
+ 9907, 9483, 8775, 10767, 8350,
+ 9907, 9483, 8775, 10767, 8351, 6121, 9378,
+ 9907, 9483, 8775, 10767, 8352,
+ 9907, 9483, 8775, 10767, 8353, 6121, 9378,
+ 9907, 9483, 8775, 10767, 9378,
+ 9907, 9483, 8775, 11091, 5385, 5396,
+ 9907, 9483, 8775, 11091, 5385, 5432,
+ 9907, 9483, 8775, 11091, 5385, 5452,
+ 9907, 9483, 8775, 11091, 8065, 5436,
+ 9907, 9483, 8775, 11091, 8065, 5440,
+ 9907, 9483, 8775, 11761, 5385, 958,
+ 9907, 9483, 8775, 11761, 5385, 1052,
+ 9907, 9483, 8775, 11761, 8065, 2644,
+ 9907, 9483, 8775, 11761, 8065, 2758,
+ 9907, 10398,
+ 9919, 6789, 8405, 14,
+ 9919, 6789, 8405, 20,
+ 9919, 6789, 8405, 30,
+ 9919, 6789, 8405, 38,
+ 9919, 8405, 0,
+ 9919, 8405, 2,
+ 9919, 8405, 4,
+ 9919, 8405, 6,
+ 9919, 8405, 8,
+ 9919, 8405, 10,
+ 9919, 8405, 12,
+ 9919, 8405, 14,
+ 9919, 8405, 16,
+ 9919, 8405, 18,
+ 9919, 8405, 20,
+ 9919, 8405, 22,
+ 9919, 8405, 24,
+ 9919, 8405, 26,
+ 9919, 8405, 28,
+ 9919, 8405, 30,
+ 9919, 8405, 32,
+ 9919, 8405, 34,
+ 9919, 8405, 36,
+ 9919, 8405, 38,
+ 9919, 8405, 40,
+ 9919, 8405, 42,
+ 9919, 8405, 46,
+ 9919, 8405, 50,
+ 9919, 8405, 72,
+ 9919, 8405, 78,
+ 9919, 8405, 80,
+ 9919, 8405, 92,
+ 9919, 8405, 112,
+ 9919, 8405, 124,
+ 9919, 8405, 162,
+ 9919, 8405, 166,
+ 9919, 8405, 168,
+ 9919, 8405, 176,
+ 9919, 8405, 182,
+ 9919, 8405, 226,
+ 9919, 8405, 230,
+ 9919, 8405, 264,
+ 9919, 8405, 272,
+ 9919, 8405, 280,
+ 9919, 8405, 286,
+ 9919, 8405, 296,
+ 9919, 8405, 400,
+ 9919, 8405, 436,
+ 9919, 8405, 440,
+ 9919, 8405, 450,
+ 9919, 8405, 530,
+ 9919, 8405, 674,
+ 9919, 8405, 676,
+ 9919, 8405, 722,
+ 9919, 8405, 724,
+ 9919, 8405, 1110,
+ 9919, 8405, 1112,
+ 9919, 8405, 1490,
+ 9919, 8405, 2034,
+ 9919, 8405, 2172,
+ 9919, 8405, 2174,
+ 9919, 8405, 2814,
+ 9919, 8405, 3238,
+ 9919, 8405, 3286,
+ 9919, 8405, 4610,
+ 9923, 1109, 429, 9664,
+ 9923, 7803, 5759, 8,
+ 9923, 7803, 5759, 16,
+ 9923, 7803, 5759, 28,
+ 9923, 7803, 5759, 40,
+ 9923, 7803, 5759, 66,
+ 9923, 8405, 0,
+ 9923, 8405, 100,
+ 9923, 8405, 116,
+ 9923, 8405, 138,
+ 9923, 8405, 216,
+ 9923, 8405, 236,
+ 9923, 8405, 292,
+ 9923, 8405, 306,
+ 9923, 8405, 332,
+ 9923, 8405, 364,
+ 9923, 8405, 392,
+ 9923, 8405, 462,
+ 9923, 8405, 510,
+ 9923, 8405, 524,
+ 9923, 8405, 556,
+ 9923, 8405, 610,
+ 9923, 8405, 652,
+ 9923, 8405, 1946,
+ 9923, 8405, 2030,
+ 9923, 8405, 2096,
+ 9923, 8405, 2126,
+ 9923, 8405, 5166,
+ 9923, 8405, 5294,
+ 9923, 9556,
+ 9924,
+ 9928,
+ 9931, 11269, 0,
+ 9931, 11269, 4,
+ 9931, 11269, 8,
+ 9931, 11269, 10,
+ 9931, 11269, 16,
+ 9931, 11269, 20,
+ 9931, 11269, 22,
+ 9931, 11269, 24,
+ 9931, 11269, 26,
+ 9931, 11269, 28,
+ 9931, 11269, 30,
+ 9931, 11269, 32,
+ 9931, 11269, 34,
+ 9931, 11269, 36,
+ 9931, 11269, 38,
+ 9931, 11269, 48,
+ 9931, 11269, 58,
+ 9931, 11269, 72,
+ 9931, 11269, 80,
+ 9931, 11269, 116,
+ 9931, 11269, 122,
+ 9931, 11269, 126,
+ 9931, 11269, 130,
+ 9931, 11269, 176,
+ 9931, 11269, 196,
+ 9931, 11269, 198,
+ 9931, 11269, 202,
+ 9931, 11269, 208,
+ 9931, 11269, 244,
+ 9931, 11269, 266,
+ 9931, 11269, 274,
+ 9931, 11269, 306,
+ 9931, 11269, 310,
+ 9931, 11269, 314,
+ 9931, 11269, 322,
+ 9931, 11269, 330,
+ 9931, 11269, 332,
+ 9931, 11269, 336,
+ 9931, 11269, 338,
+ 9931, 11269, 340,
+ 9931, 11269, 350,
+ 9931, 11269, 364,
+ 9931, 11269, 368,
+ 9931, 11269, 372,
+ 9931, 11269, 374,
+ 9931, 11269, 380,
+ 9931, 11269, 392,
+ 9931, 11269, 396,
+ 9931, 11269, 400,
+ 9931, 11269, 402,
+ 9931, 11269, 404,
+ 9931, 11269, 412,
+ 9931, 11269, 438,
+ 9931, 11269, 440,
+ 9931, 11269, 462,
+ 9931, 11269, 468,
+ 9931, 11269, 476,
+ 9931, 11269, 480,
+ 9931, 11269, 496,
+ 9931, 11269, 500,
+ 9931, 11269, 502,
+ 9931, 11269, 510,
+ 9931, 11269, 512,
+ 9931, 11269, 514,
+ 9931, 11269, 516,
+ 9931, 11269, 524,
+ 9931, 11269, 526,
+ 9931, 11269, 530,
+ 9931, 11269, 532,
+ 9931, 11269, 536,
+ 9931, 11269, 550,
+ 9931, 11269, 556,
+ 9931, 11269, 560,
+ 9931, 11269, 562,
+ 9931, 11269, 564,
+ 9931, 11269, 568,
+ 9931, 11269, 622,
+ 9931, 11269, 626,
+ 9931, 11269, 630,
+ 9931, 11269, 632,
+ 9931, 11269, 652,
+ 9931, 11269, 654,
+ 9931, 11269, 656,
+ 9931, 11269, 660,
+ 9931, 11269, 690,
+ 9931, 11269, 854,
+ 9931, 11269, 889, 5758,
+ 9931, 11269, 898,
+ 9931, 11269, 914,
+ 9931, 11269, 936,
+ 9931, 11269, 938,
+ 9931, 11269, 940,
+ 9931, 11269, 942,
+ 9931, 11269, 1140,
+ 9931, 11269, 1160,
+ 9931, 11269, 1172,
+ 9931, 11269, 1574,
+ 9931, 11269, 1630,
+ 9931, 11269, 1660,
+ 9931, 11269, 1704,
+ 9931, 11269, 1706,
+ 9931, 11269, 1708,
+ 9931, 11269, 1710,
+ 9931, 11269, 1732,
+ 9931, 11269, 1770,
+ 9931, 11269, 1774,
+ 9931, 11269, 1776,
+ 9931, 11269, 1784,
+ 9931, 11269, 1802,
+ 9931, 11269, 1834,
+ 9931, 11269, 1836,
+ 9931, 11269, 1838,
+ 9931, 11269, 1840,
+ 9931, 11269, 1854,
+ 9931, 11269, 1916,
+ 9931, 11269, 1938,
+ 9931, 11269, 1964,
+ 9931, 11269, 1966,
+ 9931, 11269, 1968,
+ 9931, 11269, 1970,
+ 9931, 11269, 1982,
+ 9931, 11269, 2030,
+ 9931, 11269, 2036,
+ 9931, 11269, 2038,
+ 9931, 11269, 2052,
+ 9931, 11269, 2078,
+ 9931, 11269, 2084,
+ 9931, 11269, 2122,
+ 9931, 11269, 2124,
+ 9931, 11269, 2188,
+ 9931, 11269, 2226,
+ 9931, 11269, 2238,
+ 9931, 11269, 2266,
+ 9931, 11269, 2268,
+ 9931, 11269, 2270,
+ 9931, 11269, 2272,
+ 9931, 11269, 2282,
+ 9931, 11269, 2286,
+ 9931, 11269, 2308,
+ 9931, 11269, 2320,
+ 9931, 11269, 2378,
+ 9931, 11269, 2414,
+ 9931, 11269, 2430,
+ 9931, 11269, 2482,
+ 9931, 11269, 2516,
+ 9931, 11269, 2518,
+ 9931, 11269, 2520,
+ 9931, 11269, 2522,
+ 9931, 11269, 2532,
+ 9931, 11269, 2554,
+ 9931, 11269, 2598,
+ 9931, 11269, 2600,
+ 9931, 11269, 2604,
+ 9931, 11269, 2606,
+ 9931, 11269, 2634,
+ 9931, 11269, 2678,
+ 9931, 11269, 2680,
+ 9931, 11269, 2682,
+ 9931, 11269, 2684,
+ 9931, 11269, 2692,
+ 9931, 11269, 2722,
+ 9931, 11269, 2746,
+ 9931, 11269, 2748,
+ 9931, 11269, 2750,
+ 9931, 11269, 2752,
+ 9931, 11269, 2754,
+ 9931, 11269, 2772,
+ 9931, 11269, 2774,
+ 9931, 11269, 2776,
+ 9931, 11269, 2778,
+ 9931, 11269, 2780,
+ 9931, 11269, 2782,
+ 9931, 11269, 2784,
+ 9931, 11269, 2786,
+ 9931, 11269, 2906,
+ 9931, 11269, 2932,
+ 9931, 11269, 2942,
+ 9931, 11269, 3006,
+ 9931, 11269, 3068,
+ 9931, 11269, 3082,
+ 9931, 11269, 3102,
+ 9931, 11269, 3104,
+ 9931, 11269, 3106,
+ 9931, 11269, 3108,
+ 9931, 11269, 3836,
+ 9931, 11269, 3970,
+ 9931, 11269, 3972,
+ 9931, 11269, 3974,
+ 9931, 11269, 4176,
+ 9931, 11269, 4223, 5836,
+ 9931, 11269, 4230,
+ 9931, 11269, 4700,
+ 9931, 11269, 4796,
+ 9931, 11269, 4800,
+ 9931, 11269, 4802,
+ 9931, 11269, 4818,
+ 9931, 11269, 4856,
+ 9931, 11269, 4862,
+ 9931, 11269, 4864,
+ 9931, 11269, 4910,
+ 9931, 11269, 4912,
+ 9931, 11269, 4914,
+ 9931, 11269, 4918,
+ 9931, 11269, 5032,
+ 9931, 11269, 5036,
+ 9931, 11269, 5038,
+ 9931, 11269, 5040,
+ 9931, 11269, 5132,
+ 9931, 11269, 5134,
+ 9931, 11269, 5164,
+ 9931, 11269, 5170,
+ 9931, 11269, 5228,
+ 9931, 11269, 5230,
+ 9931, 11269, 5232,
+ 9931, 11269, 5290,
+ 9931, 11269, 5390,
+ 9931, 11269, 5460,
+ 9931, 11269, 5464,
+ 9931, 11269, 5466,
+ 9931, 11269, 5472,
+ 9931, 11269, 5518,
+ 9931, 11269, 5616,
+ 9931, 11269, 5622,
+ 9931, 11269, 5666,
+ 9931, 11269, 5694,
+ 9931, 11269, 5710,
+ 9931, 11269, 5732,
+ 9931, 11269, 5734,
+ 9931, 11269, 5736,
+ 9931, 11269, 5738,
+ 9931, 11269, 5858,
+ 9931, 11269, 5860,
+ 9931, 11269, 5862,
+ 9931, 11269, 5874,
+ 9931, 11269, 5906,
+ 9931, 11269, 5924,
+ 9931, 11269, 5930,
+ 9931, 11269, 5952,
+ 9931, 11269, 5954,
+ 9931, 11269, 5956,
+ 9931, 11269, 5958,
+ 9931, 11269, 5994,
+ 9931, 11269, 5996,
+ 9931, 11269, 5998,
+ 9931, 11269, 6000,
+ 9931, 11269, 6024,
+ 9931, 11269, 6026,
+ 9931, 11269, 6028,
+ 9931, 11269, 6160,
+ 9931, 11269, 6246,
+ 9931, 11269, 6248,
+ 9931, 11269, 6250,
+ 9931, 11269, 6789, 2725, 4389, 5550,
+ 9931, 11269, 6789, 4117, 5876,
+ 9931, 11269, 6789, 5444,
+ 9931, 11269, 6789, 5550,
+ 9931, 11269, 6789, 6378,
+ 9931, 11269, 6789, 6874,
+ 9931, 11269, 6789, 7443, 4389, 5550,
+ 9931, 11269, 6789, 7551, 11649, 8758,
+ 9931, 11269, 6789, 8005, 4389, 5550,
+ 9931, 11269, 6789, 8153, 6378,
+ 9931, 11269, 6789, 8153, 7551, 10677, 9744,
+ 9931, 11269, 6789, 8473, 1044,
+ 9931, 11269, 7226,
+ 9931, 11269, 7262,
+ 9931, 11269, 7264,
+ 9931, 11269, 7266,
+ 9931, 11269, 7558,
+ 9931, 11269, 7560,
+ 9931, 11269, 7562,
+ 9931, 11269, 7700,
+ 9931, 11269, 8461, 22,
+ 9931, 11269, 8461, 34,
+ 9931, 11269, 8497, 2680,
+ 9931, 11269, 8497, 2682,
+ 9931, 11269, 8497, 5924,
+ 9931, 11269, 8629, 512,
+ 9931, 11269, 8671, 24,
+ 9931, 11269, 8671, 236,
+ 9931, 11269, 8671, 238,
+ 9931, 11269, 8671, 242,
+ 9931, 11269, 8671, 246,
+ 9931, 11269, 8671, 296,
+ 9931, 11269, 8671, 300,
+ 9931, 11269, 8671, 562,
+ 9931, 11269, 8671, 656,
+ 9931, 11269, 8671, 2516,
+ 9931, 11269, 8671, 2518,
+ 9931, 11269, 8671, 2520,
+ 9931, 11269, 8671, 2522,
+ 9931, 11269, 8943, 44,
+ 9931, 11269, 8943, 440,
+ 9931, 11269, 8943, 914,
+ 9931, 11269, 8943, 1660,
+ 9931, 11269, 8943, 1802,
+ 9931, 11269, 8943, 1938,
+ 9931, 11269, 8943, 2084,
+ 9931, 11269, 8943, 2238,
+ 9931, 11269, 8943, 2554,
+ 9931, 11269, 8943, 2722,
+ 9931, 11269, 8943, 3082,
+ 9931, 11269, 8943, 5460,
+ 9931, 11269, 8987, 2,
+ 9931, 11269, 9067, 14,
+ 9931, 11269, 9067, 16,
+ 9931, 11269, 9067, 30,
+ 9931, 11269, 9067, 50,
+ 9931, 11269, 9067, 144,
+ 9931, 11269, 9067, 162,
+ 9931, 11269, 9067, 216,
+ 9931, 11269, 9067, 220,
+ 9931, 11269, 9067, 224,
+ 9931, 11269, 9067, 228,
+ 9931, 11269, 9067, 230,
+ 9931, 11269, 9067, 242,
+ 9931, 11269, 9067, 292,
+ 9931, 11269, 9067, 294,
+ 9931, 11269, 9067, 296,
+ 9931, 11269, 9067, 298,
+ 9931, 11269, 9067, 300,
+ 9931, 11269, 9067, 316,
+ 9931, 11269, 9067, 332,
+ 9931, 11269, 9067, 336,
+ 9931, 11269, 9067, 340,
+ 9931, 11269, 9067, 350,
+ 9931, 11269, 9067, 354,
+ 9931, 11269, 9067, 364,
+ 9931, 11269, 9067, 368,
+ 9931, 11269, 9067, 374,
+ 9931, 11269, 9067, 380,
+ 9931, 11269, 9067, 384,
+ 9931, 11269, 9067, 392,
+ 9931, 11269, 9067, 396,
+ 9931, 11269, 9067, 400,
+ 9931, 11269, 9067, 404,
+ 9931, 11269, 9067, 412,
+ 9931, 11269, 9067, 416,
+ 9931, 11269, 9067, 462,
+ 9931, 11269, 9067, 468,
+ 9931, 11269, 9067, 476,
+ 9931, 11269, 9067, 480,
+ 9931, 11269, 9067, 486,
+ 9931, 11269, 9067, 510,
+ 9931, 11269, 9067, 512,
+ 9931, 11269, 9067, 514,
+ 9931, 11269, 9067, 516,
+ 9931, 11269, 9067, 520,
+ 9931, 11269, 9067, 524,
+ 9931, 11269, 9067, 526,
+ 9931, 11269, 9067, 530,
+ 9931, 11269, 9067, 532,
+ 9931, 11269, 9067, 536,
+ 9931, 11269, 9067, 546,
+ 9931, 11269, 9067, 622,
+ 9931, 11269, 9067, 626,
+ 9931, 11269, 9067, 630,
+ 9931, 11269, 9067, 632,
+ 9931, 11269, 9067, 634,
+ 9931, 11269, 9067, 652,
+ 9931, 11269, 9067, 654,
+ 9931, 11269, 9067, 656,
+ 9931, 11269, 9067, 660,
+ 9931, 11269, 9067, 664,
+ 9931, 11269, 9067, 670,
+ 9931, 11269, 9067, 672,
+ 9931, 11269, 9067, 676,
+ 9931, 11269, 9067, 678,
+ 9931, 11269, 9067, 680,
+ 9931, 11269, 9067, 884,
+ 9931, 11269, 9067, 886,
+ 9931, 11269, 9067, 888,
+ 9931, 11269, 9067, 890,
+ 9931, 11269, 9067, 892,
+ 9931, 11269, 9067, 984,
+ 9931, 11269, 9067, 1024,
+ 9931, 11269, 9067, 1026,
+ 9931, 11269, 9067, 1028,
+ 9931, 11269, 9067, 1030,
+ 9931, 11269, 9067, 1032,
+ 9931, 11269, 9067, 1080,
+ 9931, 11269, 9067, 1082,
+ 9931, 11269, 9067, 1084,
+ 9931, 11269, 9067, 1086,
+ 9931, 11269, 9067, 1088,
+ 9931, 11269, 9067, 1238,
+ 9931, 11269, 9067, 1260,
+ 9931, 11269, 9067, 1262,
+ 9931, 11269, 9067, 1264,
+ 9931, 11269, 9067, 1266,
+ 9931, 11269, 9067, 1268,
+ 9931, 11269, 9067, 1356,
+ 9931, 11269, 9067, 1440,
+ 9931, 11269, 9067, 1442,
+ 9931, 11269, 9067, 1444,
+ 9931, 11269, 9067, 1446,
+ 9931, 11269, 9067, 1448,
+ 9931, 11269, 9067, 1506,
+ 9931, 11269, 9067, 1528,
+ 9931, 11269, 9067, 1530,
+ 9931, 11269, 9067, 1532,
+ 9931, 11269, 9067, 1534,
+ 9931, 11269, 9067, 1536,
+ 9931, 11269, 9067, 1612,
+ 9931, 11269, 9067, 1614,
+ 9931, 11269, 9067, 1616,
+ 9931, 11269, 9067, 1618,
+ 9931, 11269, 9067, 1620,
+ 9931, 11269, 9067, 1642,
+ 9931, 11269, 9067, 1644,
+ 9931, 11269, 9067, 1646,
+ 9931, 11269, 9067, 1648,
+ 9931, 11269, 9067, 1650,
+ 9931, 11269, 9067, 1758,
+ 9931, 11269, 9067, 1770,
+ 9931, 11269, 9067, 1772,
+ 9931, 11269, 9067, 1774,
+ 9931, 11269, 9067, 1776,
+ 9931, 11269, 9067, 1778,
+ 9931, 11269, 9067, 1890,
+ 9931, 11269, 9067, 2016,
+ 9931, 11269, 9067, 2204,
+ 9931, 11269, 9067, 2402,
+ 9931, 11269, 9067, 2504,
+ 9931, 11269, 9067, 2516,
+ 9931, 11269, 9067, 2518,
+ 9931, 11269, 9067, 2520,
+ 9931, 11269, 9067, 2522,
+ 9931, 11269, 9067, 2524,
+ 9931, 11269, 9067, 2678,
+ 9931, 11269, 9067, 2680,
+ 9931, 11269, 9067, 2682,
+ 9931, 11269, 9067, 2684,
+ 9931, 11269, 9067, 2686,
+ 9931, 11269, 9067, 2706,
+ 9931, 11269, 9067, 2708,
+ 9931, 11269, 9067, 2710,
+ 9931, 11269, 9067, 2712,
+ 9931, 11269, 9067, 2714,
+ 9931, 11269, 9067, 2732,
+ 9931, 11269, 9067, 2734,
+ 9931, 11269, 9067, 2736,
+ 9931, 11269, 9067, 2738,
+ 9931, 11269, 9067, 2740,
+ 9931, 11269, 9067, 2746,
+ 9931, 11269, 9067, 2748,
+ 9931, 11269, 9067, 2752,
+ 9931, 11269, 9067, 2754,
+ 9931, 11269, 9067, 2756,
+ 9931, 11269, 9067, 2922,
+ 9931, 11269, 9067, 3050,
+ 9931, 11269, 9067, 3138,
+ 9931, 11269, 9067, 3890,
+ 9931, 11269, 9067, 4098,
+ 9931, 11269, 9067, 4138,
+ 9931, 11269, 9067, 4318,
+ 9931, 11269, 9067, 4556,
+ 9931, 11269, 9067, 4644,
+ 9931, 11269, 9067, 4744,
+ 9931, 11269, 9067, 4766,
+ 9931, 11269, 9067, 4860,
+ 9931, 11269, 9067, 5678,
+ 9931, 11269, 9067, 5914,
+ 9931, 11269, 9067, 5950,
+ 9931, 11269, 9067, 5952,
+ 9931, 11269, 9067, 5954,
+ 9931, 11269, 9067, 5956,
+ 9931, 11269, 9067, 5958,
+ 9931, 11269, 9067, 5960,
+ 9931, 11269, 9067, 5976,
+ 9931, 11269, 9067, 5990,
+ 9931, 11269, 9067, 6002,
+ 9931, 11269, 9067, 6004,
+ 9931, 11269, 9067, 6006,
+ 9931, 11269, 9067, 6008,
+ 9931, 11269, 9067, 6010,
+ 9931, 11269, 9067, 7720,
+ 9931, 11269, 9067, 7748,
+ 9931, 11269, 9067, 9363, 50,
+ 9931, 11269, 9313, 5836,
+ 9931, 11269, 9489, 2480,
+ 9931, 11269, 9489, 2544,
+ 9931, 11269, 9489, 2906,
+ 9931, 11269, 9489, 2942,
+ 9931, 11269, 9489, 3970,
+ 9931, 11269, 9489, 4796,
+ 9931, 11269, 9489, 5032,
+ 9931, 11269, 9489, 5290,
+ 9931, 11269, 9489, 5644,
+ 9931, 11269, 9489, 5774,
+ 9931, 11269, 9489, 5784,
+ 9931, 11269, 9489, 5838,
+ 9931, 11269, 9489, 5858,
+ 9931, 11269, 9489, 6024,
+ 9931, 11269, 9489, 6246,
+ 9931, 11269, 9517, 14,
+ 9931, 11269, 9517, 236,
+ 9931, 11269, 9517, 238,
+ 9931, 11269, 9517, 242,
+ 9931, 11269, 9517, 246,
+ 9931, 11269, 9517, 1338,
+ 9931, 11269, 9517, 1382,
+ 9931, 11269, 9517, 1424,
+ 9931, 11269, 9519, 14,
+ 9931, 11269, 9777, 562,
+ 9931, 11269, 9777, 2678,
+ 9931, 11269, 9777, 2680,
+ 9931, 11269, 9777, 2682,
+ 9931, 11269, 9777, 2684,
+ 9931, 11269, 9777, 5906,
+ 9931, 11269, 9777, 5924,
+ 9931, 11269, 9777, 5930,
+ 9931, 11269, 10743, 0,
+ 9931, 11269, 10743, 8,
+ 9931, 11269, 10743, 16,
+ 9931, 11269, 10743, 28,
+ 9931, 11269, 10743, 36,
+ 9931, 11269, 10743, 306,
+ 9931, 11269, 10743, 310,
+ 9931, 11269, 10743, 314,
+ 9931, 11269, 10743, 322,
+ 9931, 11269, 10743, 392,
+ 9931, 11269, 10743, 396,
+ 9931, 11269, 10743, 404,
+ 9931, 11269, 10743, 412,
+ 9931, 11269, 10743, 622,
+ 9931, 11269, 10743, 626,
+ 9931, 11269, 10743, 630,
+ 9931, 11269, 10743, 632,
+ 9931, 11269, 11399, 22,
+ 9931, 11269, 11399, 24,
+ 9931, 11269, 11399, 30,
+ 9931, 11269, 11399, 34,
+ 9931, 11269, 11399, 48,
+ 9931, 11269, 11399, 332,
+ 9931, 11269, 11399, 336,
+ 9931, 11269, 11399, 350,
+ 9931, 11269, 11399, 510,
+ 9931, 11269, 11399, 512,
+ 9931, 11269, 11399, 514,
+ 9931, 11269, 11399, 516,
+ 9931, 11269, 11399, 622,
+ 9931, 11269, 11399, 626,
+ 9931, 11269, 11399, 630,
+ 9931, 11269, 11399, 632,
+ 9931, 11269, 11399, 936,
+ 9931, 11269, 11399, 938,
+ 9931, 11269, 11399, 940,
+ 9931, 11269, 11399, 942,
+ 9931, 11269, 11399, 1704,
+ 9931, 11269, 11399, 1706,
+ 9931, 11269, 11399, 1708,
+ 9931, 11269, 11399, 1710,
+ 9931, 11269, 11399, 1834,
+ 9931, 11269, 11399, 1836,
+ 9931, 11269, 11399, 1838,
+ 9931, 11269, 11399, 1840,
+ 9931, 11269, 11399, 1964,
+ 9931, 11269, 11399, 1966,
+ 9931, 11269, 11399, 1968,
+ 9931, 11269, 11399, 1970,
+ 9931, 11269, 11399, 2122,
+ 9931, 11269, 11399, 2124,
+ 9931, 11269, 11399, 2266,
+ 9931, 11269, 11399, 2268,
+ 9931, 11269, 11399, 2270,
+ 9931, 11269, 11399, 2272,
+ 9931, 11269, 11399, 2598,
+ 9931, 11269, 11399, 2600,
+ 9931, 11269, 11399, 2604,
+ 9931, 11269, 11399, 2606,
+ 9931, 11269, 11399, 2772,
+ 9931, 11269, 11399, 2774,
+ 9931, 11269, 11399, 2776,
+ 9931, 11269, 11399, 2778,
+ 9931, 11269, 11399, 2906,
+ 9931, 11269, 11399, 2932,
+ 9931, 11269, 11399, 2942,
+ 9931, 11269, 11399, 3102,
+ 9931, 11269, 11399, 3104,
+ 9931, 11269, 11399, 3106,
+ 9931, 11269, 11399, 3108,
+ 9931, 11269, 11399, 3970,
+ 9931, 11269, 11399, 3972,
+ 9931, 11269, 11399, 3974,
+ 9931, 11269, 11399, 4230,
+ 9931, 11269, 11399, 4796,
+ 9931, 11269, 11399, 4800,
+ 9931, 11269, 11399, 4802,
+ 9931, 11269, 11399, 4910,
+ 9931, 11269, 11399, 4912,
+ 9931, 11269, 11399, 4914,
+ 9931, 11269, 11399, 5032,
+ 9931, 11269, 11399, 5036,
+ 9931, 11269, 11399, 5038,
+ 9931, 11269, 11399, 5290,
+ 9931, 11269, 11399, 5460,
+ 9931, 11269, 11399, 5464,
+ 9931, 11269, 11399, 5466,
+ 9931, 11269, 11399, 5616,
+ 9931, 11269, 11399, 5732,
+ 9931, 11269, 11399, 5734,
+ 9931, 11269, 11399, 5736,
+ 9931, 11269, 11399, 5738,
+ 9931, 11269, 11399, 5858,
+ 9931, 11269, 11399, 5860,
+ 9931, 11269, 11399, 5862,
+ 9931, 11269, 11399, 6024,
+ 9931, 11269, 11399, 6026,
+ 9931, 11269, 11399, 6028,
+ 9931, 11269, 11399, 6246,
+ 9931, 11269, 11399, 6248,
+ 9931, 11269, 11399, 6250,
+ 9931, 11269, 11399, 7558,
+ 9931, 11269, 11399, 7560,
+ 9931, 11269, 11399, 7562,
+ 9931, 11269, 11399, 7700,
+ 9931, 11269, 11435, 24,
+ 9931, 11269, 11435, 36,
+ 9931, 11269, 11443, 48,
+ 9931, 11269, 11689, 534,
+ 9931, 11269, 11883, 562,
+ 9931, 11269, 11883, 2678,
+ 9931, 11269, 11883, 2680,
+ 9931, 11269, 11883, 2682,
+ 9931, 11269, 11883, 2684,
+ 9931, 11269, 12869, 1580,
+ 9931, 11269, 12869, 1600,
+ 9931, 11269, 12869, 1628,
+ 9931, 11269, 12869, 1656,
+ 9941, 8405, 0,
+ 9941, 8405, 8,
+ 9941, 8405, 16,
+ 9941, 8405, 28,
+ 9941, 8405, 36,
+ 9941, 8405, 40,
+ 9941, 8405, 42,
+ 9941, 8405, 138,
+ 9941, 8405, 142,
+ 9941, 8405, 144,
+ 9941, 8405, 150,
+ 9941, 8405, 152,
+ 9941, 8405, 154,
+ 9941, 8405, 216,
+ 9941, 8405, 220,
+ 9941, 8405, 224,
+ 9941, 8405, 228,
+ 9941, 8405, 230,
+ 9941, 8405, 232,
+ 9941, 8405, 236,
+ 9941, 8405, 238,
+ 9941, 8405, 242,
+ 9941, 8405, 246,
+ 9941, 8405, 250,
+ 9941, 8405, 252,
+ 9941, 8405, 306,
+ 9941, 8405, 332,
+ 9941, 8405, 336,
+ 9941, 8405, 340,
+ 9941, 8405, 350,
+ 9941, 8405, 354,
+ 9941, 8405, 356,
+ 9941, 8405, 364,
+ 9941, 8405, 368,
+ 9941, 8405, 374,
+ 9941, 8405, 380,
+ 9941, 8405, 384,
+ 9941, 8405, 392,
+ 9941, 8405, 396,
+ 9941, 8405, 404,
+ 9941, 8405, 412,
+ 9941, 8405, 416,
+ 9941, 8405, 418,
+ 9941, 8405, 524,
+ 9941, 8405, 526,
+ 9941, 8405, 532,
+ 9941, 8405, 536,
+ 9941, 8405, 546,
+ 9941, 8405, 548,
+ 9941, 8405, 556,
+ 9941, 8405, 560,
+ 9941, 8405, 564,
+ 9941, 8405, 622,
+ 9941, 8405, 626,
+ 9941, 8405, 630,
+ 9941, 8405, 632,
+ 9941, 8405, 634,
+ 9941, 8405, 636,
+ 9941, 8405, 652,
+ 9941, 8405, 654,
+ 9941, 8405, 656,
+ 9941, 8405, 660,
+ 9941, 8405, 664,
+ 9941, 8405, 666,
+ 9941, 8405, 1024,
+ 9941, 8405, 1412,
+ 9941, 8405, 1986,
+ 9941, 8405, 2328,
+ 9941, 8405, 2330,
+ 9941, 8405, 2332,
+ 9941, 8405, 2336,
+ 9941, 8405, 2344,
+ 9941, 8405, 2346,
+ 9941, 8405, 2706,
+ 9941, 8405, 2708,
+ 9941, 8405, 2710,
+ 9941, 8405, 2712,
+ 9941, 8405, 2714,
+ 9941, 8405, 2716,
+ 9941, 8405, 2732,
+ 9941, 8405, 2734,
+ 9941, 8405, 2736,
+ 9941, 8405, 2738,
+ 9941, 8405, 2740,
+ 9941, 8405, 2742,
+ 9959, 89, 8466,
+ 9959, 89, 8521, 10572,
+ 9959, 89, 8521, 10573, 445, 6741, 568,
+ 9959, 6121, 4895, 11649, 8758,
+ 9959, 6121, 9546,
+ 9959, 6121, 10677, 761, 91, 1109, 429, 11649, 8758,
+ 9961, 2429, 5895, 6689, 2170,
+ 9961, 2429, 5895, 6689, 2540,
+ 9961, 2429, 5895, 6689, 2778,
+ 9961, 2429, 5895, 6689, 4200,
+ 9961, 2429, 5895, 6689, 4214,
+ 9961, 2429, 5895, 6689, 5190,
+ 9961, 2429, 5895, 6689, 6722,
+ 9961, 2429, 5895, 6689, 7508,
+ 9961, 2429, 5895, 6689, 7694,
+ 9961, 2429, 6053, 6689, 2170,
+ 9961, 2429, 6053, 6689, 2540,
+ 9961, 2429, 6053, 6689, 2778,
+ 9961, 2429, 6053, 6689, 4200,
+ 9961, 2429, 6053, 6689, 4214,
+ 9961, 2429, 6053, 6689, 5190,
+ 9961, 2429, 6053, 6689, 6722,
+ 9961, 2429, 6053, 6689, 7508,
+ 9961, 2429, 6053, 6689, 7694,
+ 9969, 5758,
+ 9971, 5758,
+ 9977, 7593, 8405, 0,
+ 9977, 7593, 8405, 1, 6121, 6516,
+ 9977, 7593, 8405, 1, 6121, 10804,
+ 9977, 7593, 8405, 8,
+ 9977, 7593, 8405, 9, 6121, 10804,
+ 9977, 7593, 8405, 16,
+ 9977, 7593, 8405, 17, 6121, 6874,
+ 9977, 7593, 8405, 17, 6121, 8432,
+ 9977, 7593, 8405, 17, 6121, 10804,
+ 9977, 7593, 8405, 28,
+ 9977, 7593, 8405, 29, 6121, 10804,
+ 9977, 7593, 8405, 40,
+ 9977, 7593, 8405, 41, 6121, 8153, 6378,
+ 9977, 7593, 8405, 41, 6121, 8432,
+ 9977, 7593, 8405, 41, 6121, 10804,
+ 9977, 7593, 8405, 102,
+ 9977, 7593, 8405, 142,
+ 9977, 7593, 8405, 164,
+ 9977, 7593, 8405, 172,
+ 9977, 7593, 8405, 173, 6121, 4530,
+ 9977, 7593, 8405, 173, 6121, 5878,
+ 9977, 7593, 8405, 173, 6121, 8473, 4530,
+ 9977, 7593, 8405, 174,
+ 9977, 7593, 8405, 175, 6121, 5878,
+ 9977, 7593, 8405, 176,
+ 9977, 7593, 8405, 177, 6121, 4530,
+ 9977, 7593, 8405, 177, 6121, 5878,
+ 9977, 7593, 8405, 177, 6121, 8473, 4530,
+ 9977, 7593, 8405, 177, 6121, 10802,
+ 9977, 7593, 8405, 182,
+ 9977, 7593, 8405, 183, 6121, 5934,
+ 9977, 7593, 8405, 184,
+ 9977, 7593, 8405, 185, 6121, 10802,
+ 9977, 7593, 8405, 236,
+ 9977, 7593, 8405, 237, 6121, 4530,
+ 9977, 7593, 8405, 237, 6121, 8758,
+ 9977, 7593, 8405, 237, 6121, 10802,
+ 9977, 7593, 8405, 258,
+ 9977, 7593, 8405, 259, 6121, 6516,
+ 9977, 7593, 8405, 259, 6121, 6874,
+ 9977, 7593, 8405, 276,
+ 9977, 7593, 8405, 294,
+ 9977, 7593, 8405, 306,
+ 9977, 7593, 8405, 307, 6121, 4530,
+ 9977, 7593, 8405, 307, 6121, 8758,
+ 9977, 7593, 8405, 307, 6121, 10677, 8758,
+ 9977, 7593, 8405, 307, 6121, 10802,
+ 9977, 7593, 8405, 448,
+ 9977, 7593, 8405, 468,
+ 9977, 7593, 8405, 469, 6121, 8473, 4530,
+ 9977, 7593, 8405, 496,
+ 9977, 7593, 8405, 560,
+ 9977, 7593, 8405, 561, 6121, 8473, 4530,
+ 9977, 7593, 8405, 561, 6121, 10802,
+ 9977, 7593, 8405, 592,
+ 9977, 7593, 8405, 612,
+ 9977, 7593, 8405, 626,
+ 9977, 7593, 8405, 652,
+ 9977, 7593, 8405, 656,
+ 9977, 7593, 8405, 658,
+ 9977, 7593, 8405, 664,
+ 9977, 7593, 8405, 672,
+ 9977, 7593, 8405, 673, 6121, 10802,
+ 9977, 7593, 8405, 673, 6121, 10804,
+ 9977, 7593, 8405, 807, 3096,
+ 9977, 7593, 8405, 886,
+ 9977, 7593, 8405, 887, 6121, 10677, 8758,
+ 9977, 7593, 8405, 887, 6121, 10802,
+ 9977, 7593, 8405, 887, 6121, 10804,
+ 9977, 7593, 8405, 1022,
+ 9977, 7593, 8405, 1074,
+ 9977, 7593, 8405, 1082,
+ 9977, 7593, 8405, 1262,
+ 9977, 7593, 8405, 1263, 6121, 8473, 4530,
+ 9977, 7593, 8405, 1263, 6121, 8758,
+ 9977, 7593, 8405, 1263, 6121, 8759, 721, 4530,
+ 9977, 7593, 8405, 1263, 6121, 8896,
+ 9977, 7593, 8405, 1263, 6121, 10802,
+ 9977, 7593, 8405, 1284,
+ 9977, 7593, 8405, 1442,
+ 9977, 7593, 8405, 1640,
+ 9977, 7593, 8405, 1680,
+ 9977, 7593, 8405, 1770,
+ 9977, 7593, 8405, 1794,
+ 9977, 7593, 8405, 2064,
+ 9977, 7593, 8405, 2250,
+ 9977, 7593, 8405, 2410,
+ 9977, 7593, 8405, 2516,
+ 9977, 7593, 8405, 2734,
+ 9977, 7593, 8405, 2774,
+ 9977, 7593, 8405, 3012,
+ 9977, 7593, 8405, 3038,
+ 9977, 7593, 8405, 3148,
+ 9977, 7593, 8405, 3149, 6121, 6516,
+ 9977, 7593, 8405, 3149, 6121, 10802,
+ 9977, 7593, 8405, 3149, 6121, 10804,
+ 9977, 7593, 8405, 3862,
+ 9977, 7593, 8405, 4142,
+ 9977, 7593, 8405, 4146,
+ 9977, 7593, 8405, 4148,
+ 9977, 7593, 8405, 4198,
+ 9977, 7593, 8405, 4393, 5758,
+ 9977, 7593, 8405, 4614,
+ 9977, 7593, 8405, 4771, 142,
+ 9977, 7593, 8405, 4771, 1022,
+ 9977, 7593, 8405, 4771, 1794,
+ 9977, 7593, 8405, 4771, 2064,
+ 9977, 7593, 8405, 4771, 2542,
+ 9977, 7593, 8405, 4771, 2704,
+ 9977, 7593, 8405, 4771, 3172,
+ 9977, 7593, 8405, 4771, 4144,
+ 9977, 7593, 8405, 5690,
+ 9977, 7593, 8405, 5734,
+ 9977, 7593, 8405, 5781, 142,
+ 9977, 7593, 8405, 5781, 172,
+ 9977, 7593, 8405, 5781, 174,
+ 9977, 7593, 8405, 5781, 5758,
+ 9977, 7593, 8405, 5890,
+ 9977, 7593, 8405, 5980,
+ 9977, 7593, 8405, 5982,
+ 9977, 7593, 8405, 5986,
+ 9977, 7593, 8405, 6200,
+ 9977, 7593, 8405, 6201, 6121, 3697, 3058,
+ 9977, 7593, 8405, 6201, 6121, 10804,
+ 9977, 7593, 8405, 6302,
+ 9977, 7593, 8405, 6399, 306,
+ 9977, 7593, 8405, 6519, 7316,
+ 9977, 7593, 8405, 6696,
+ 9977, 7593, 8405, 6710,
+ 9977, 7593, 8405, 7062,
+ 9977, 7593, 8405, 7316,
+ 9977, 7593, 8405, 7317, 6121, 7716,
+ 9977, 7593, 8405, 7455, 7316,
+ 9977, 7593, 8405, 7494,
+ 9977, 7593, 8405, 7495, 6121, 10804,
+ 9977, 7593, 8405, 7522,
+ 9977, 7593, 8405, 7551, 16,
+ 9977, 7593, 8405, 7551, 17, 6121, 5878,
+ 9977, 7593, 8405, 7551, 40,
+ 9977, 7593, 8405, 7981, 28,
+ 9977, 7593, 8405, 7981, 29, 6121, 10804,
+ 9977, 7593, 8405, 8065, 8425, 3096,
+ 9977, 7593, 8405, 8153, 11125, 28,
+ 9977, 7593, 8405, 8425, 3096,
+ 9977, 7593, 8405, 8960,
+ 9977, 7593, 8405, 9029, 306,
+ 9977, 7593, 8405, 9049, 3096,
+ 9977, 7593, 8405, 9372,
+ 9977, 7593, 8405, 9373, 6121, 8153, 6875, 7908,
+ 9977, 7593, 8405, 9501, 3058,
+ 9977, 7593, 8405, 10269, 0,
+ 9977, 7593, 8405, 10269, 8,
+ 9977, 7593, 8405, 10269, 807, 3096,
+ 9977, 7593, 8405, 10269, 3038,
+ 9977, 7593, 8405, 10269, 8065, 8425, 3096,
+ 9977, 7593, 8405, 10269, 8425, 3096,
+ 9977, 7593, 8405, 10396,
+ 9977, 7593, 8405, 10489, 664,
+ 9977, 7593, 8405, 10489, 672,
+ 9977, 7593, 8405, 10489, 1082,
+ 9977, 7593, 8405, 10509, 5758,
+ 9977, 7593, 8405, 10545, 40,
+ 9977, 7593, 8405, 10545, 41, 6121, 8758,
+ 9977, 7593, 8405, 10697, 236,
+ 9977, 7593, 8405, 10697, 886,
+ 9977, 7593, 8405, 10697, 887, 6121, 10802,
+ 9977, 7593, 8405, 10697, 1082,
+ 9977, 7593, 8405, 10735, 28,
+ 9977, 7593, 8405, 11125, 28,
+ 9977, 7593, 8405, 11127, 592,
+ 9977, 7593, 8405, 11383, 258,
+ 9977, 7593, 8405, 11665, 886,
+ 9977, 7593, 8405, 13415, 16,
+ 9977, 7593, 10301, 1, 258,
+ 9977, 7593, 10301, 177, 1262,
+ 9977, 7593, 10301, 561, 2734,
+ 9977, 8342,
+ 9977, 8405, 7593, 9063, 172,
+ 9977, 8405, 10396,
+ 9977, 8405, 12087, 28,
+ 9977, 9063, 8405, 0,
+ 9977, 9063, 8405, 1, 6121, 6516,
+ 9977, 9063, 8405, 1, 6121, 10804,
+ 9977, 9063, 8405, 8,
+ 9977, 9063, 8405, 9, 6121, 10804,
+ 9977, 9063, 8405, 16,
+ 9977, 9063, 8405, 17, 6121, 6874,
+ 9977, 9063, 8405, 17, 6121, 8432,
+ 9977, 9063, 8405, 17, 6121, 10804,
+ 9977, 9063, 8405, 28,
+ 9977, 9063, 8405, 29, 6121, 10804,
+ 9977, 9063, 8405, 40,
+ 9977, 9063, 8405, 41, 6121, 8153, 6378,
+ 9977, 9063, 8405, 41, 6121, 8432,
+ 9977, 9063, 8405, 41, 6121, 10804,
+ 9977, 9063, 8405, 102,
+ 9977, 9063, 8405, 142,
+ 9977, 9063, 8405, 164,
+ 9977, 9063, 8405, 172,
+ 9977, 9063, 8405, 173, 6121, 4530,
+ 9977, 9063, 8405, 173, 6121, 5878,
+ 9977, 9063, 8405, 173, 6121, 8473, 4530,
+ 9977, 9063, 8405, 174,
+ 9977, 9063, 8405, 175, 6121, 5878,
+ 9977, 9063, 8405, 176,
+ 9977, 9063, 8405, 177, 6121, 4530,
+ 9977, 9063, 8405, 177, 6121, 5878,
+ 9977, 9063, 8405, 177, 6121, 8473, 4530,
+ 9977, 9063, 8405, 177, 6121, 10802,
+ 9977, 9063, 8405, 182,
+ 9977, 9063, 8405, 183, 6121, 5934,
+ 9977, 9063, 8405, 184,
+ 9977, 9063, 8405, 185, 6121, 10802,
+ 9977, 9063, 8405, 236,
+ 9977, 9063, 8405, 237, 6121, 4530,
+ 9977, 9063, 8405, 237, 6121, 8758,
+ 9977, 9063, 8405, 237, 6121, 10802,
+ 9977, 9063, 8405, 258,
+ 9977, 9063, 8405, 259, 6121, 6516,
+ 9977, 9063, 8405, 259, 6121, 6874,
+ 9977, 9063, 8405, 276,
+ 9977, 9063, 8405, 294,
+ 9977, 9063, 8405, 306,
+ 9977, 9063, 8405, 307, 6121, 4530,
+ 9977, 9063, 8405, 307, 6121, 8758,
+ 9977, 9063, 8405, 307, 6121, 10677, 8758,
+ 9977, 9063, 8405, 307, 6121, 10802,
+ 9977, 9063, 8405, 448,
+ 9977, 9063, 8405, 468,
+ 9977, 9063, 8405, 469, 6121, 8473, 4530,
+ 9977, 9063, 8405, 496,
+ 9977, 9063, 8405, 560,
+ 9977, 9063, 8405, 561, 6121, 8473, 4530,
+ 9977, 9063, 8405, 561, 6121, 10802,
+ 9977, 9063, 8405, 592,
+ 9977, 9063, 8405, 612,
+ 9977, 9063, 8405, 626,
+ 9977, 9063, 8405, 652,
+ 9977, 9063, 8405, 656,
+ 9977, 9063, 8405, 658,
+ 9977, 9063, 8405, 664,
+ 9977, 9063, 8405, 672,
+ 9977, 9063, 8405, 673, 6121, 10802,
+ 9977, 9063, 8405, 673, 6121, 10804,
+ 9977, 9063, 8405, 807, 3096,
+ 9977, 9063, 8405, 886,
+ 9977, 9063, 8405, 887, 6121, 10677, 8758,
+ 9977, 9063, 8405, 887, 6121, 10802,
+ 9977, 9063, 8405, 887, 6121, 10804,
+ 9977, 9063, 8405, 1022,
+ 9977, 9063, 8405, 1074,
+ 9977, 9063, 8405, 1082,
+ 9977, 9063, 8405, 1262,
+ 9977, 9063, 8405, 1263, 6121, 8473, 4530,
+ 9977, 9063, 8405, 1263, 6121, 8758,
+ 9977, 9063, 8405, 1263, 6121, 8759, 721, 4530,
+ 9977, 9063, 8405, 1263, 6121, 8896,
+ 9977, 9063, 8405, 1263, 6121, 10802,
+ 9977, 9063, 8405, 1284,
+ 9977, 9063, 8405, 1442,
+ 9977, 9063, 8405, 1640,
+ 9977, 9063, 8405, 1680,
+ 9977, 9063, 8405, 1770,
+ 9977, 9063, 8405, 1794,
+ 9977, 9063, 8405, 2064,
+ 9977, 9063, 8405, 2250,
+ 9977, 9063, 8405, 2410,
+ 9977, 9063, 8405, 2516,
+ 9977, 9063, 8405, 2734,
+ 9977, 9063, 8405, 2774,
+ 9977, 9063, 8405, 3012,
+ 9977, 9063, 8405, 3038,
+ 9977, 9063, 8405, 3148,
+ 9977, 9063, 8405, 3149, 6121, 6516,
+ 9977, 9063, 8405, 3149, 6121, 10802,
+ 9977, 9063, 8405, 3149, 6121, 10804,
+ 9977, 9063, 8405, 3862,
+ 9977, 9063, 8405, 4142,
+ 9977, 9063, 8405, 4146,
+ 9977, 9063, 8405, 4148,
+ 9977, 9063, 8405, 4198,
+ 9977, 9063, 8405, 4393, 5758,
+ 9977, 9063, 8405, 4614,
+ 9977, 9063, 8405, 4771, 142,
+ 9977, 9063, 8405, 4771, 1022,
+ 9977, 9063, 8405, 4771, 1794,
+ 9977, 9063, 8405, 4771, 2064,
+ 9977, 9063, 8405, 4771, 2542,
+ 9977, 9063, 8405, 4771, 2704,
+ 9977, 9063, 8405, 4771, 3172,
+ 9977, 9063, 8405, 4771, 4144,
+ 9977, 9063, 8405, 5690,
+ 9977, 9063, 8405, 5734,
+ 9977, 9063, 8405, 5781, 142,
+ 9977, 9063, 8405, 5781, 172,
+ 9977, 9063, 8405, 5781, 174,
+ 9977, 9063, 8405, 5781, 5758,
+ 9977, 9063, 8405, 5890,
+ 9977, 9063, 8405, 5980,
+ 9977, 9063, 8405, 5982,
+ 9977, 9063, 8405, 5986,
+ 9977, 9063, 8405, 6200,
+ 9977, 9063, 8405, 6201, 6121, 3697, 3058,
+ 9977, 9063, 8405, 6201, 6121, 10804,
+ 9977, 9063, 8405, 6302,
+ 9977, 9063, 8405, 6399, 306,
+ 9977, 9063, 8405, 6519, 7316,
+ 9977, 9063, 8405, 6696,
+ 9977, 9063, 8405, 6710,
+ 9977, 9063, 8405, 7062,
+ 9977, 9063, 8405, 7316,
+ 9977, 9063, 8405, 7317, 6121, 7716,
+ 9977, 9063, 8405, 7455, 7316,
+ 9977, 9063, 8405, 7494,
+ 9977, 9063, 8405, 7495, 6121, 10804,
+ 9977, 9063, 8405, 7522,
+ 9977, 9063, 8405, 7551, 16,
+ 9977, 9063, 8405, 7551, 17, 6121, 5878,
+ 9977, 9063, 8405, 7551, 40,
+ 9977, 9063, 8405, 7981, 28,
+ 9977, 9063, 8405, 7981, 29, 6121, 10804,
+ 9977, 9063, 8405, 8065, 8425, 3096,
+ 9977, 9063, 8405, 8153, 11125, 28,
+ 9977, 9063, 8405, 8425, 3096,
+ 9977, 9063, 8405, 8960,
+ 9977, 9063, 8405, 9029, 306,
+ 9977, 9063, 8405, 9049, 3096,
+ 9977, 9063, 8405, 9372,
+ 9977, 9063, 8405, 9373, 6121, 8153, 6875, 7908,
+ 9977, 9063, 8405, 9501, 3058,
+ 9977, 9063, 8405, 10269, 0,
+ 9977, 9063, 8405, 10269, 8,
+ 9977, 9063, 8405, 10269, 807, 3096,
+ 9977, 9063, 8405, 10269, 3038,
+ 9977, 9063, 8405, 10269, 8065, 8425, 3096,
+ 9977, 9063, 8405, 10269, 8425, 3096,
+ 9977, 9063, 8405, 10489, 664,
+ 9977, 9063, 8405, 10489, 672,
+ 9977, 9063, 8405, 10489, 1082,
+ 9977, 9063, 8405, 10509, 5758,
+ 9977, 9063, 8405, 10545, 40,
+ 9977, 9063, 8405, 10545, 41, 6121, 8758,
+ 9977, 9063, 8405, 10697, 236,
+ 9977, 9063, 8405, 10697, 886,
+ 9977, 9063, 8405, 10697, 887, 6121, 10802,
+ 9977, 9063, 8405, 10697, 1082,
+ 9977, 9063, 8405, 10735, 28,
+ 9977, 9063, 8405, 11125, 28,
+ 9977, 9063, 8405, 11127, 592,
+ 9977, 9063, 8405, 11383, 258,
+ 9977, 9063, 8405, 11665, 886,
+ 9977, 9063, 8405, 13415, 16,
+ 9977, 9063, 10301, 1, 258,
+ 9977, 9063, 10301, 177, 1262,
+ 9977, 9063, 10301, 561, 2734,
+ 9977, 9578,
+ 9977, 11363, 5758,
+ 10003, 5758,
+ 10017, 5758,
+ 10017, 7580,
+ 10017, 7710,
+ 10141, 7383, 11765, 6434,
+ 10153, 6434,
+ 10157, 8774,
+ 10162,
+ 10171, 4223, 5836,
+ 10171, 6610,
+ 10171, 6616,
+ 10171, 6689, 2170,
+ 10171, 6689, 2540,
+ 10171, 6689, 2778,
+ 10171, 6689, 4200,
+ 10171, 6689, 4214,
+ 10171, 6689, 5190,
+ 10171, 6689, 6722,
+ 10171, 6689, 7508,
+ 10171, 6689, 7694,
+ 10171, 7723, 4927, 4790,
+ 10171, 7723, 4927, 6676,
+ 10171, 7723, 4927, 6686,
+ 10171, 7723, 4927, 6910,
+ 10171, 7723, 4927, 7038,
+ 10171, 7723, 4927, 7551, 8646,
+ 10171, 7723, 4927, 7860,
+ 10171, 7723, 4927, 8046,
+ 10171, 7723, 4927, 8646,
+ 10171, 7723, 4927, 11934,
+ 10171, 8525, 2670,
+ 10171, 8525, 2671, 10624,
+ 10171, 8525, 6784,
+ 10171, 8525, 6804,
+ 10171, 8525, 7576,
+ 10171, 8525, 8160,
+ 10171, 8525, 8514,
+ 10171, 8525, 8820,
+ 10171, 8525, 8876,
+ 10171, 8525, 9344,
+ 10171, 8525, 9672,
+ 10171, 9607, 6610,
+ 10171, 9665, 4926,
+ 10171, 10469, 4926,
+ 10171, 10585, 100,
+ 10171, 10585, 102,
+ 10171, 10585, 106,
+ 10171, 10585, 108,
+ 10171, 10585, 112,
+ 10171, 10585, 116,
+ 10171, 10585, 122,
+ 10171, 10585, 126,
+ 10171, 10585, 130,
+ 10171, 10585, 132,
+ 10171, 10585, 138,
+ 10171, 10585, 142,
+ 10171, 10585, 144,
+ 10171, 10585, 150,
+ 10171, 10585, 152,
+ 10171, 10585, 196,
+ 10171, 10585, 198,
+ 10171, 10585, 202,
+ 10171, 10585, 208,
+ 10171, 10585, 210,
+ 10171, 10585, 216,
+ 10171, 10585, 220,
+ 10171, 10585, 224,
+ 10171, 10585, 228,
+ 10171, 10585, 230,
+ 10171, 10585, 236,
+ 10171, 10585, 238,
+ 10171, 10585, 242,
+ 10171, 10585, 246,
+ 10171, 10585, 250,
+ 10171, 10585, 292,
+ 10171, 10585, 294,
+ 10171, 10585, 296,
+ 10171, 10585, 298,
+ 10171, 10585, 300,
+ 10171, 10585, 306,
+ 10171, 10585, 310,
+ 10171, 10585, 314,
+ 10171, 10585, 322,
+ 10171, 10585, 326,
+ 10171, 10585, 332,
+ 10171, 10585, 336,
+ 10171, 10585, 340,
+ 10171, 10585, 350,
+ 10171, 10585, 354,
+ 10171, 10585, 364,
+ 10171, 10585, 368,
+ 10171, 10585, 374,
+ 10171, 10585, 380,
+ 10171, 10585, 384,
+ 10171, 10585, 392,
+ 10171, 10585, 396,
+ 10171, 10585, 404,
+ 10171, 10585, 412,
+ 10171, 10585, 416,
+ 10171, 10585, 462,
+ 10171, 10585, 468,
+ 10171, 10585, 476,
+ 10171, 10585, 480,
+ 10171, 10585, 486,
+ 10171, 10585, 496,
+ 10171, 10585, 498,
+ 10171, 10585, 500,
+ 10171, 10585, 502,
+ 10171, 10585, 506,
+ 10171, 10585, 510,
+ 10171, 10585, 512,
+ 10171, 10585, 514,
+ 10171, 10585, 516,
+ 10171, 10585, 520,
+ 10171, 10585, 524,
+ 10171, 10585, 526,
+ 10171, 10585, 532,
+ 10171, 10585, 536,
+ 10171, 10585, 546,
+ 10171, 10585, 556,
+ 10171, 10585, 560,
+ 10171, 10585, 564,
+ 10171, 10585, 568,
+ 10171, 10585, 576,
+ 10171, 10585, 610,
+ 10171, 10585, 612,
+ 10171, 10585, 614,
+ 10171, 10585, 616,
+ 10171, 10585, 618,
+ 10171, 10585, 622,
+ 10171, 10585, 626,
+ 10171, 10585, 630,
+ 10171, 10585, 632,
+ 10171, 10585, 634,
+ 10171, 10585, 638,
+ 10171, 10585, 640,
+ 10171, 10585, 644,
+ 10171, 10585, 646,
+ 10171, 10585, 648,
+ 10171, 10585, 652,
+ 10171, 10585, 654,
+ 10171, 10585, 656,
+ 10171, 10585, 660,
+ 10171, 10585, 664,
+ 10171, 10585, 670,
+ 10171, 10585, 672,
+ 10171, 10585, 676,
+ 10171, 10585, 678,
+ 10171, 10585, 680,
+ 10171, 10585, 748,
+ 10171, 10585, 778,
+ 10171, 10585, 816,
+ 10171, 10585, 838,
+ 10171, 10585, 840,
+ 10171, 10585, 842,
+ 10171, 10585, 854,
+ 10171, 10585, 866,
+ 10171, 10585, 868,
+ 10171, 10585, 870,
+ 10171, 10585, 872,
+ 10171, 10585, 874,
+ 10171, 10585, 876,
+ 10171, 10585, 884,
+ 10171, 10585, 886,
+ 10171, 10585, 888,
+ 10171, 10585, 890,
+ 10171, 10585, 892,
+ 10171, 10585, 910,
+ 10171, 10585, 936,
+ 10171, 10585, 954,
+ 10171, 10585, 974,
+ 10171, 10585, 976,
+ 10171, 10585, 978,
+ 10171, 10585, 980,
+ 10171, 10585, 982,
+ 10171, 10585, 984,
+ 10171, 10585, 1034,
+ 10171, 10585, 1072,
+ 10171, 10585, 1140,
+ 10171, 10585, 1150,
+ 10171, 10585, 1188,
+ 10171, 10585, 1190,
+ 10171, 10585, 1192,
+ 10171, 10585, 1194,
+ 10171, 10585, 1204,
+ 10171, 10585, 1238,
+ 10171, 10585, 1250,
+ 10171, 10585, 1252,
+ 10171, 10585, 1254,
+ 10171, 10585, 1256,
+ 10171, 10585, 1258,
+ 10171, 10585, 1288,
+ 10171, 10585, 1322,
+ 10171, 10585, 1324,
+ 10171, 10585, 1326,
+ 10171, 10585, 1328,
+ 10171, 10585, 1330,
+ 10171, 10585, 1332,
+ 10171, 10585, 1334,
+ 10171, 10585, 1336,
+ 10171, 10585, 1338,
+ 10171, 10585, 1356,
+ 10171, 10585, 1370,
+ 10171, 10585, 1372,
+ 10171, 10585, 1374,
+ 10171, 10585, 1376,
+ 10171, 10585, 1378,
+ 10171, 10585, 1418,
+ 10171, 10585, 1502,
+ 10171, 10585, 1506,
+ 10171, 10585, 1540,
+ 10171, 10585, 1562,
+ 10171, 10585, 1574,
+ 10171, 10585, 1598,
+ 10171, 10585, 1654,
+ 10171, 10585, 1704,
+ 10171, 10585, 1706,
+ 10171, 10585, 1708,
+ 10171, 10585, 1712,
+ 10171, 10585, 1714,
+ 10171, 10585, 1716,
+ 10171, 10585, 1718,
+ 10171, 10585, 1720,
+ 10171, 10585, 1722,
+ 10171, 10585, 1724,
+ 10171, 10585, 1726,
+ 10171, 10585, 1728,
+ 10171, 10585, 1730,
+ 10171, 10585, 1732,
+ 10171, 10585, 1758,
+ 10171, 10585, 1798,
+ 10171, 10585, 1834,
+ 10171, 10585, 1854,
+ 10171, 10585, 1890,
+ 10171, 10585, 1932,
+ 10171, 10585, 1964,
+ 10171, 10585, 1966,
+ 10171, 10585, 1968,
+ 10171, 10585, 1972,
+ 10171, 10585, 1982,
+ 10171, 10585, 2016,
+ 10171, 10585, 2082,
+ 10171, 10585, 2122,
+ 10171, 10585, 2126,
+ 10171, 10585, 2130,
+ 10171, 10585, 2132,
+ 10171, 10585, 2134,
+ 10171, 10585, 2136,
+ 10171, 10585, 2188,
+ 10171, 10585, 2204,
+ 10171, 10585, 2212,
+ 10171, 10585, 2214,
+ 10171, 10585, 2216,
+ 10171, 10585, 2218,
+ 10171, 10585, 2220,
+ 10171, 10585, 2236,
+ 10171, 10585, 2266,
+ 10171, 10585, 2268,
+ 10171, 10585, 2270,
+ 10171, 10585, 2282,
+ 10171, 10585, 2294,
+ 10171, 10585, 2296,
+ 10171, 10585, 2298,
+ 10171, 10585, 2300,
+ 10171, 10585, 2302,
+ 10171, 10585, 2304,
+ 10171, 10585, 2316,
+ 10171, 10585, 2350,
+ 10171, 10585, 2352,
+ 10171, 10585, 2354,
+ 10171, 10585, 2356,
+ 10171, 10585, 2358,
+ 10171, 10585, 2360,
+ 10171, 10585, 2362,
+ 10171, 10585, 2370,
+ 10171, 10585, 2378,
+ 10171, 10585, 2402,
+ 10171, 10585, 2424,
+ 10171, 10585, 2466,
+ 10171, 10585, 2468,
+ 10171, 10585, 2482,
+ 10171, 10585, 2504,
+ 10171, 10585, 2516,
+ 10171, 10585, 2518,
+ 10171, 10585, 2520,
+ 10171, 10585, 2522,
+ 10171, 10585, 2524,
+ 10171, 10585, 2548,
+ 10171, 10585, 2566,
+ 10171, 10585, 2568,
+ 10171, 10585, 2570,
+ 10171, 10585, 2572,
+ 10171, 10585, 2574,
+ 10171, 10585, 2598,
+ 10171, 10585, 2620,
+ 10171, 10585, 2622,
+ 10171, 10585, 2624,
+ 10171, 10585, 2626,
+ 10171, 10585, 2628,
+ 10171, 10585, 2634,
+ 10171, 10585, 2666,
+ 10171, 10585, 2678,
+ 10171, 10585, 2680,
+ 10171, 10585, 2682,
+ 10171, 10585, 2684,
+ 10171, 10585, 2686,
+ 10171, 10585, 2718,
+ 10171, 10585, 2732,
+ 10171, 10585, 2734,
+ 10171, 10585, 2736,
+ 10171, 10585, 2738,
+ 10171, 10585, 2740,
+ 10171, 10585, 2772,
+ 10171, 10585, 2790,
+ 10171, 10585, 2792,
+ 10171, 10585, 2794,
+ 10171, 10585, 2796,
+ 10171, 10585, 2798,
+ 10171, 10585, 2844,
+ 10171, 10585, 2856,
+ 10171, 10585, 2896,
+ 10171, 10585, 2906,
+ 10171, 10585, 2922,
+ 10171, 10585, 2936,
+ 10171, 10585, 2952,
+ 10171, 10585, 2956,
+ 10171, 10585, 2968,
+ 10171, 10585, 2982,
+ 10171, 10585, 2984,
+ 10171, 10585, 2986,
+ 10171, 10585, 2988,
+ 10171, 10585, 2990,
+ 10171, 10585, 2992,
+ 10171, 10585, 2994,
+ 10171, 10585, 3002,
+ 10171, 10585, 3006,
+ 10171, 10585, 3050,
+ 10171, 10585, 3078,
+ 10171, 10585, 3120,
+ 10171, 10585, 3138,
+ 10171, 10585, 3146,
+ 10171, 10585, 3148,
+ 10171, 10585, 3150,
+ 10171, 10585, 3152,
+ 10171, 10585, 3154,
+ 10171, 10585, 3176,
+ 10171, 10585, 3202,
+ 10171, 10585, 3212,
+ 10171, 10585, 3214,
+ 10171, 10585, 3216,
+ 10171, 10585, 3218,
+ 10171, 10585, 3220,
+ 10171, 10585, 3826,
+ 10171, 10585, 3856,
+ 10171, 10585, 3858,
+ 10171, 10585, 3860,
+ 10171, 10585, 3862,
+ 10171, 10585, 3864,
+ 10171, 10585, 3866,
+ 10171, 10585, 3868,
+ 10171, 10585, 3874,
+ 10171, 10585, 3890,
+ 10171, 10585, 3906,
+ 10171, 10585, 3924,
+ 10171, 10585, 3998,
+ 10171, 10585, 4010,
+ 10171, 10585, 4028,
+ 10171, 10585, 4046,
+ 10171, 10585, 4232,
+ 10171, 10585, 4270,
+ 10171, 10585, 4278,
+ 10171, 10585, 4308,
+ 10171, 10585, 4310,
+ 10171, 10585, 4312,
+ 10171, 10585, 4370,
+ 10171, 10585, 4372,
+ 10171, 10585, 4374,
+ 10171, 10585, 4378,
+ 10171, 10585, 4412,
+ 10171, 10585, 4414,
+ 10171, 10585, 4416,
+ 10171, 10585, 4796,
+ 10171, 10585, 4798,
+ 10171, 10585, 4804,
+ 10171, 10585, 4806,
+ 10171, 10585, 4808,
+ 10171, 10585, 4810,
+ 10171, 10585, 4812,
+ 10171, 10585, 4814,
+ 10171, 10585, 4816,
+ 10171, 10585, 5034,
+ 10171, 10585, 5292,
+ 10171, 10585, 5296,
+ 10171, 10585, 5314,
+ 10171, 10585, 5332,
+ 10171, 10585, 5410,
+ 10171, 10585, 5416,
+ 10171, 10585, 5418,
+ 10171, 10585, 5422,
+ 10171, 10585, 5462,
+ 10171, 10585, 5478,
+ 10171, 10585, 5480,
+ 10171, 10585, 5482,
+ 10171, 10585, 5484,
+ 10171, 10585, 5486,
+ 10171, 10585, 5508,
+ 10171, 10585, 5510,
+ 10171, 10585, 5512,
+ 10171, 10585, 5514,
+ 10171, 10585, 5666,
+ 10171, 10585, 5678,
+ 10171, 10585, 5704,
+ 10171, 10585, 5732,
+ 10171, 10585, 5786,
+ 10171, 10585, 5794,
+ 10171, 10585, 5866,
+ 10171, 10585, 5868,
+ 10171, 10585, 5870,
+ 10171, 10585, 5906,
+ 10171, 10585, 5914,
+ 10171, 10585, 5928,
+ 10171, 10585, 5932,
+ 10171, 10585, 5974,
+ 10171, 10585, 5976,
+ 10171, 10585, 5984,
+ 10171, 10585, 6032,
+ 10171, 10585, 6034,
+ 10171, 10585, 6038,
+ 10171, 10585, 6148,
+ 10171, 10585, 6150,
+ 10171, 10585, 6152,
+ 10171, 10585, 6154,
+ 10171, 10585, 6264,
+ 10171, 10585, 6274,
+ 10171, 10585, 6300,
+ 10171, 10585, 6328,
+ 10171, 10585, 6336,
+ 10171, 10585, 6550,
+ 10171, 10585, 6552,
+ 10171, 10585, 6846,
+ 10171, 10585, 6848,
+ 10171, 10585, 7066,
+ 10171, 10585, 7068,
+ 10171, 10585, 7406,
+ 10171, 10585, 7408,
+ 10171, 10585, 9313, 0,
+ 10171, 10585, 9313, 8,
+ 10171, 10585, 9313, 16,
+ 10171, 10585, 9313, 28,
+ 10171, 10585, 9313, 40,
+ 10171, 10585, 9313, 58,
+ 10171, 10585, 9313, 162,
+ 10171, 10585, 9313, 422,
+ 10171, 10585, 9313, 622,
+ 10171, 10585, 11223, 838,
+ 10171, 10585, 11223, 1188,
+ 10171, 10585, 11223, 1964,
+ 10171, 10585, 11223, 2266,
+ 10171, 10585, 11723, 0,
+ 10171, 10585, 11723, 8,
+ 10171, 10585, 11723, 16,
+ 10171, 10585, 11723, 28,
+ 10171, 10585, 11723, 40,
+ 10171, 10585, 11723, 58,
+ 10171, 10585, 11723, 162,
+ 10171, 10767, 11639, 4926,
+ 10171, 11163, 11228,
+ 10171, 11224,
+ 10171, 11400,
+ 10173, 12403, 6689, 2170,
+ 10173, 12403, 6689, 2540,
+ 10173, 12403, 6689, 2778,
+ 10173, 12403, 6689, 4200,
+ 10173, 12403, 6689, 4214,
+ 10173, 12403, 6689, 5190,
+ 10173, 12403, 6689, 6260,
+ 10173, 12403, 6689, 6722,
+ 10173, 12403, 6689, 7508,
+ 10173, 12403, 6689, 7694,
+ 10179, 9539, 11054,
+ 10192,
+ 10203, 7580,
+ 10203, 11143, 2170,
+ 10213, 11894,
+ 10221, 7593, 8405, 80,
+ 10221, 7593, 8405, 176,
+ 10221, 7593, 8405, 238,
+ 10221, 7593, 8405, 274,
+ 10221, 7593, 8405, 438,
+ 10221, 7593, 8405, 596,
+ 10221, 7593, 8405, 626,
+ 10221, 7593, 8405, 756,
+ 10221, 7593, 8405, 858,
+ 10221, 7593, 8405, 900,
+ 10221, 7593, 8405, 1038,
+ 10221, 7593, 8405, 1216,
+ 10221, 7593, 8405, 1340,
+ 10221, 7593, 8405, 1350,
+ 10221, 7593, 8405, 1380,
+ 10221, 7593, 8405, 1420,
+ 10221, 7593, 8405, 1520,
+ 10221, 7593, 8405, 1588,
+ 10221, 7593, 8405, 1744,
+ 10221, 7593, 8405, 1860,
+ 10221, 7593, 8405, 1992,
+ 10221, 7593, 8405, 2196,
+ 10221, 7593, 8405, 2290,
+ 10221, 7593, 8405, 2384,
+ 10221, 7593, 8405, 2490,
+ 10221, 7593, 8405, 2648,
+ 10221, 7593, 8405, 2654,
+ 10221, 7593, 8405, 2868,
+ 10221, 7593, 8405, 2954,
+ 10221, 7593, 8405, 3140,
+ 10221, 7593, 8405, 3884,
+ 10221, 7593, 8405, 3904,
+ 10221, 7593, 8405, 4316,
+ 10221, 7593, 8405, 4634,
+ 10221, 7593, 8405, 4742,
+ 10221, 7593, 8405, 5414,
+ 10221, 7593, 8405, 5698,
+ 10221, 7593, 8405, 6268,
+ 10221, 8405, 80,
+ 10221, 8405, 176,
+ 10221, 8405, 202,
+ 10221, 8405, 238,
+ 10221, 8405, 274,
+ 10221, 8405, 438,
+ 10221, 8405, 596,
+ 10221, 8405, 626,
+ 10221, 8405, 658,
+ 10221, 8405, 710,
+ 10221, 8405, 756,
+ 10221, 8405, 858,
+ 10221, 8405, 900,
+ 10221, 8405, 1038,
+ 10221, 8405, 1216,
+ 10221, 8405, 1340,
+ 10221, 8405, 1350,
+ 10221, 8405, 1380,
+ 10221, 8405, 1420,
+ 10221, 8405, 1520,
+ 10221, 8405, 1588,
+ 10221, 8405, 1744,
+ 10221, 8405, 1860,
+ 10221, 8405, 1992,
+ 10221, 8405, 2196,
+ 10221, 8405, 2290,
+ 10221, 8405, 2384,
+ 10221, 8405, 2490,
+ 10221, 8405, 2648,
+ 10221, 8405, 2654,
+ 10221, 8405, 2868,
+ 10221, 8405, 2954,
+ 10221, 8405, 3140,
+ 10221, 8405, 3884,
+ 10221, 8405, 3904,
+ 10221, 8405, 4316,
+ 10221, 8405, 4634,
+ 10221, 8405, 4742,
+ 10221, 8405, 5414,
+ 10221, 8405, 5698,
+ 10221, 8405, 6268,
+ 10221, 8405, 6728,
+ 10221, 8405, 8869, 1216,
+ 10221, 9063, 8405, 80,
+ 10221, 9063, 8405, 176,
+ 10221, 9063, 8405, 238,
+ 10221, 9063, 8405, 274,
+ 10221, 9063, 8405, 438,
+ 10221, 9063, 8405, 596,
+ 10221, 9063, 8405, 626,
+ 10221, 9063, 8405, 756,
+ 10221, 9063, 8405, 858,
+ 10221, 9063, 8405, 900,
+ 10221, 9063, 8405, 1038,
+ 10221, 9063, 8405, 1216,
+ 10221, 9063, 8405, 1340,
+ 10221, 9063, 8405, 1350,
+ 10221, 9063, 8405, 1380,
+ 10221, 9063, 8405, 1420,
+ 10221, 9063, 8405, 1520,
+ 10221, 9063, 8405, 1588,
+ 10221, 9063, 8405, 1744,
+ 10221, 9063, 8405, 1860,
+ 10221, 9063, 8405, 1992,
+ 10221, 9063, 8405, 2196,
+ 10221, 9063, 8405, 2290,
+ 10221, 9063, 8405, 2384,
+ 10221, 9063, 8405, 2490,
+ 10221, 9063, 8405, 2648,
+ 10221, 9063, 8405, 2654,
+ 10221, 9063, 8405, 2868,
+ 10221, 9063, 8405, 2954,
+ 10221, 9063, 8405, 3140,
+ 10221, 9063, 8405, 3884,
+ 10221, 9063, 8405, 3904,
+ 10221, 9063, 8405, 4316,
+ 10221, 9063, 8405, 4634,
+ 10221, 9063, 8405, 4742,
+ 10221, 9063, 8405, 5414,
+ 10221, 9063, 8405, 5698,
+ 10221, 9063, 8405, 6268,
+ 10221, 11163, 11228,
+ 10225, 436,
+ 10225, 5759, 7282,
+ 10225, 5759, 8916,
+ 10225, 5759, 9824,
+ 10225, 5759, 9870,
+ 10225, 5759, 9904,
+ 10225, 5759, 11900,
+ 10225, 6689, 2170,
+ 10225, 6689, 2540,
+ 10225, 6689, 2778,
+ 10225, 6689, 4200,
+ 10225, 6689, 4214,
+ 10225, 6689, 5190,
+ 10225, 6689, 6260,
+ 10225, 6689, 6722,
+ 10225, 6689, 7508,
+ 10225, 6689, 7694,
+ 10225, 7469, 5758,
+ 10225, 7803, 5759, 8,
+ 10225, 7803, 5759, 16,
+ 10225, 7803, 5759, 28,
+ 10225, 7803, 5759, 40,
+ 10225, 7803, 5759, 58,
+ 10225, 7803, 5759, 72,
+ 10225, 7803, 5759, 92,
+ 10225, 7803, 5759, 266,
+ 10225, 7803, 5759, 606,
+ 10225, 7803, 5759, 8031, 8,
+ 10225, 7803, 5759, 8031, 28,
+ 10225, 7803, 5759, 9827, 22,
+ 10225, 7803, 5759, 9827, 34,
+ 10225, 7803, 5759, 9827, 344,
+ 10225, 7803, 5759, 9827, 518,
+ 10225, 7803, 8031, 8,
+ 10225, 7803, 8031, 28,
+ 10225, 8405, 0,
+ 10225, 8405, 8,
+ 10225, 8405, 16,
+ 10225, 8405, 28,
+ 10225, 8405, 40,
+ 10225, 8405, 58,
+ 10225, 8405, 72,
+ 10225, 8405, 92,
+ 10225, 8405, 100,
+ 10225, 8405, 116,
+ 10225, 8405, 138,
+ 10225, 8405, 216,
+ 10225, 8405, 236,
+ 10225, 8405, 266,
+ 10225, 8405, 292,
+ 10225, 8405, 306,
+ 10225, 8405, 332,
+ 10225, 8405, 364,
+ 10225, 8405, 392,
+ 10225, 8405, 462,
+ 10225, 8405, 510,
+ 10225, 8405, 524,
+ 10225, 8405, 556,
+ 10225, 8405, 606,
+ 10225, 8405, 610,
+ 10225, 8405, 652,
+ 10225, 8405, 792,
+ 10225, 8405, 884,
+ 10225, 8405, 974,
+ 10225, 8405, 996,
+ 10225, 8405, 1260,
+ 10225, 8405, 1512,
+ 10225, 8405, 1612,
+ 10225, 8405, 1796,
+ 10225, 8405, 2030,
+ 10225, 8405, 2076,
+ 10225, 8405, 2126,
+ 10225, 8405, 2212,
+ 10225, 8405, 2516,
+ 10225, 8405, 2566,
+ 10225, 8405, 2678,
+ 10225, 8405, 2746,
+ 10225, 8405, 4016,
+ 10225, 8405, 5994,
+ 10225, 8405, 9827, 22,
+ 10225, 8405, 9827, 34,
+ 10225, 8405, 9827, 344,
+ 10225, 8405, 9827, 518,
+ 10227, 171, 7318,
+ 10227, 1496,
+ 10227, 2826,
+ 10227, 5759, 3227, 6498,
+ 10227, 5759, 6498,
+ 10227, 5759, 7282,
+ 10227, 5759, 7758,
+ 10227, 5759, 8916,
+ 10227, 5759, 8944,
+ 10227, 5759, 9824,
+ 10227, 6380,
+ 10227, 6689, 2170,
+ 10227, 6689, 2540,
+ 10227, 6689, 2778,
+ 10227, 6689, 4200,
+ 10227, 6689, 4214,
+ 10227, 6689, 5190,
+ 10227, 6689, 6260,
+ 10227, 6689, 6722,
+ 10227, 6689, 7508,
+ 10227, 6689, 7694,
+ 10227, 7714,
+ 10227, 7803, 5759, 16,
+ 10227, 7803, 5759, 40,
+ 10227, 7803, 5759, 58,
+ 10227, 7803, 5759, 72,
+ 10227, 7803, 5759, 92,
+ 10227, 7803, 5759, 162,
+ 10227, 7803, 5759, 266,
+ 10227, 7803, 5759, 440,
+ 10227, 7803, 5759, 606,
+ 10227, 8405, 0,
+ 10227, 8405, 16,
+ 10227, 8405, 40,
+ 10227, 8405, 58,
+ 10227, 8405, 72,
+ 10227, 8405, 92,
+ 10227, 8405, 100,
+ 10227, 8405, 116,
+ 10227, 8405, 138,
+ 10227, 8405, 162,
+ 10227, 8405, 196,
+ 10227, 8405, 216,
+ 10227, 8405, 236,
+ 10227, 8405, 266,
+ 10227, 8405, 292,
+ 10227, 8405, 306,
+ 10227, 8405, 332,
+ 10227, 8405, 364,
+ 10227, 8405, 392,
+ 10227, 8405, 440,
+ 10227, 8405, 462,
+ 10227, 8405, 510,
+ 10227, 8405, 524,
+ 10227, 8405, 556,
+ 10227, 8405, 606,
+ 10227, 8405, 610,
+ 10227, 8405, 652,
+ 10227, 8405, 670,
+ 10227, 8405, 792,
+ 10227, 8405, 884,
+ 10227, 8405, 974,
+ 10227, 8405, 996,
+ 10227, 8405, 1260,
+ 10227, 8405, 1512,
+ 10227, 8405, 1612,
+ 10227, 8405, 1796,
+ 10227, 8405, 2030,
+ 10227, 8405, 2076,
+ 10227, 8405, 2126,
+ 10227, 8405, 2212,
+ 10227, 8405, 2438,
+ 10227, 8405, 2516,
+ 10227, 8405, 2678,
+ 10227, 8405, 2746,
+ 10227, 8405, 4016,
+ 10227, 8405, 4320,
+ 10227, 8405, 4748,
+ 10227, 8405, 5994,
+ 10231, 9513, 2170,
+ 10231, 9513, 2540,
+ 10231, 9513, 2670,
+ 10231, 9513, 2778,
+ 10231, 9513, 4200,
+ 10231, 9513, 4214,
+ 10231, 9513, 5190,
+ 10231, 9513, 6722,
+ 10231, 9513, 7508,
+ 10231, 9513, 7694,
+ 10231, 9513, 8820,
+ 10231, 9513, 8876,
+ 10241, 1177, 2681, 3276,
+ 10241, 1177, 2681, 6110,
+ 10241, 1177, 2681, 8192,
+ 10241, 1177, 2681, 8251, 6116,
+ 10241, 1177, 2681, 8333, 4830,
+ 10241, 1177, 2681, 8971, 7812,
+ 10241, 1177, 2681, 9395, 7639, 10344,
+ 10241, 1177, 2681, 9893, 9786,
+ 10241, 1177, 2681, 9934,
+ 10241, 1177, 2681, 9953, 4194,
+ 10241, 1177, 2681, 9963, 8290,
+ 10241, 1177, 2681, 10323, 8436,
+ 10241, 1177, 2681, 10680,
+ 10241, 1177, 2681, 11199, 6716,
+ 10241, 1177, 6131, 439, 2681, 9148,
+ 10241, 1177, 6383, 11454,
+ 10241, 1177, 6868,
+ 10241, 1177, 6877, 7388,
+ 10241, 1177, 6877, 8790,
+ 10241, 1177, 6877, 11732,
+ 10241, 1177, 6877, 13000,
+ 10241, 1177, 6995, 7738,
+ 10241, 1177, 7187, 9118,
+ 10241, 1177, 7348,
+ 10241, 1177, 7593, 8790,
+ 10241, 1177, 7593, 13000,
+ 10241, 1177, 7987, 11454,
+ 10241, 1177, 7999, 9784,
+ 10241, 1177, 8071, 569, 4944,
+ 10241, 1177, 8642,
+ 10241, 1177, 9341, 10632,
+ 10241, 1177, 9478,
+ 10241, 1177, 9613, 8898,
+ 10241, 1177, 9630,
+ 10241, 1177, 9832,
+ 10241, 1177, 9878,
+ 10241, 1177, 9954,
+ 10241, 1177, 9992,
+ 10241, 1177, 10146,
+ 10241, 1177, 10252,
+ 10241, 1177, 10458,
+ 10241, 1177, 10638,
+ 10241, 1177, 10689, 6796,
+ 10241, 1177, 10698,
+ 10241, 1177, 10793, 429, 2681, 7100,
+ 10241, 1177, 10998,
+ 10241, 1177, 11013, 10632,
+ 10241, 1177, 11056,
+ 10241, 1177, 11058,
+ 10241, 1177, 11247, 6416,
+ 10241, 1177, 11481, 91, 2681, 10732,
+ 10241, 1177, 11482,
+ 10241, 1177, 11614,
+ 10241, 1177, 11628,
+ 10241, 1177, 11678,
+ 10241, 1177, 11702,
+ 10241, 1177, 11704,
+ 10241, 1177, 11756,
+ 10241, 1177, 11836,
+ 10241, 1177, 11930,
+ 10241, 1177, 11938,
+ 10241, 1177, 12100,
+ 10241, 1177, 12414,
+ 10241, 1177, 12918,
+ 10243, 8405, 0,
+ 10243, 8405, 8,
+ 10243, 8405, 16,
+ 10243, 8405, 26,
+ 10243, 8405, 28,
+ 10243, 8405, 40,
+ 10243, 8405, 100,
+ 10243, 8405, 102,
+ 10243, 8405, 106,
+ 10243, 8405, 108,
+ 10243, 8405, 112,
+ 10243, 8405, 138,
+ 10243, 8405, 142,
+ 10243, 8405, 144,
+ 10243, 8405, 150,
+ 10243, 8405, 152,
+ 10243, 8405, 216,
+ 10243, 8405, 220,
+ 10243, 8405, 224,
+ 10243, 8405, 228,
+ 10243, 8405, 230,
+ 10243, 8405, 236,
+ 10243, 8405, 238,
+ 10243, 8405, 242,
+ 10243, 8405, 246,
+ 10243, 8405, 250,
+ 10243, 8405, 306,
+ 10243, 8405, 310,
+ 10243, 8405, 314,
+ 10243, 8405, 322,
+ 10243, 8405, 326,
+ 10243, 8405, 364,
+ 10243, 8405, 368,
+ 10243, 8405, 374,
+ 10243, 8405, 380,
+ 10243, 8405, 384,
+ 10243, 8405, 392,
+ 10243, 8405, 396,
+ 10243, 8405, 404,
+ 10243, 8405, 412,
+ 10243, 8405, 416,
+ 10243, 8405, 462,
+ 10243, 8405, 468,
+ 10243, 8405, 476,
+ 10243, 8405, 480,
+ 10243, 8405, 486,
+ 10243, 8405, 510,
+ 10243, 8405, 512,
+ 10243, 8405, 514,
+ 10243, 8405, 516,
+ 10243, 8405, 520,
+ 10243, 8405, 524,
+ 10243, 8405, 526,
+ 10243, 8405, 532,
+ 10243, 8405, 536,
+ 10243, 8405, 546,
+ 10243, 8405, 556,
+ 10243, 8405, 560,
+ 10243, 8405, 564,
+ 10243, 8405, 568,
+ 10243, 8405, 576,
+ 10243, 8405, 618,
+ 10243, 8405, 622,
+ 10243, 8405, 626,
+ 10243, 8405, 630,
+ 10243, 8405, 632,
+ 10243, 8405, 652,
+ 10243, 8405, 660,
+ 10243, 8405, 664,
+ 10243, 8405, 670,
+ 10243, 8405, 672,
+ 10243, 8405, 676,
+ 10243, 8405, 678,
+ 10243, 8405, 680,
+ 10243, 8405, 7593, 0,
+ 10243, 8405, 7593, 8,
+ 10243, 8405, 7593, 16,
+ 10243, 8405, 7593, 28,
+ 10243, 8405, 7593, 40,
+ 10243, 8405, 7593, 306,
+ 10243, 8405, 7593, 310,
+ 10243, 8405, 7593, 576,
+ 10243, 8405, 7593, 622,
+ 10243, 8405, 7593, 652,
+ 10243, 8405, 7593, 660,
+ 10243, 8405, 7593, 664,
+ 10243, 8921, 11067, 4926,
+ 10243, 9165, 6224,
+ 10243, 11067, 4926,
+ 10256,
+ 10257, 9495, 6121, 10677, 760,
+ 10260,
+ 10261, 6121, 7711, 5758,
+ 10261, 6121, 7768,
+ 10261, 6121, 8153, 8758,
+ 10261, 6121, 9546,
+ 10261, 6121, 10666,
+ 10261, 6121, 11097, 6435, 6121, 4530,
+ 10261, 6121, 12492,
+ 10261, 7939, 1, 7383, 10374,
+ 10261, 9015, 6121, 7580,
+ 10261, 10982,
+ 10265, 9610,
+ 10267, 2163, 5758,
+ 10267, 4841, 36,
+ 10267, 10469, 4926,
+ 10267, 10670,
+ 10267, 12017, 4926,
+ 10267, 12064,
+ 10277, 11663, 10539, 8774,
+ 10283, 8405, 0,
+ 10283, 8405, 8,
+ 10283, 8405, 16,
+ 10283, 8405, 26,
+ 10283, 8405, 28,
+ 10283, 8405, 40,
+ 10283, 8405, 100,
+ 10283, 8405, 102,
+ 10283, 8405, 106,
+ 10283, 8405, 108,
+ 10283, 8405, 112,
+ 10283, 8405, 138,
+ 10283, 8405, 142,
+ 10283, 8405, 144,
+ 10283, 8405, 150,
+ 10283, 8405, 152,
+ 10283, 8405, 216,
+ 10283, 8405, 220,
+ 10283, 8405, 224,
+ 10283, 8405, 228,
+ 10283, 8405, 230,
+ 10283, 8405, 236,
+ 10283, 8405, 238,
+ 10283, 8405, 242,
+ 10283, 8405, 246,
+ 10283, 8405, 250,
+ 10283, 8405, 306,
+ 10283, 8405, 310,
+ 10283, 8405, 314,
+ 10283, 8405, 322,
+ 10283, 8405, 326,
+ 10283, 8405, 364,
+ 10283, 8405, 368,
+ 10283, 8405, 374,
+ 10283, 8405, 380,
+ 10283, 8405, 384,
+ 10283, 8405, 392,
+ 10283, 8405, 396,
+ 10283, 8405, 404,
+ 10283, 8405, 412,
+ 10283, 8405, 416,
+ 10283, 8405, 462,
+ 10283, 8405, 468,
+ 10283, 8405, 476,
+ 10283, 8405, 480,
+ 10283, 8405, 486,
+ 10283, 8405, 510,
+ 10283, 8405, 512,
+ 10283, 8405, 514,
+ 10283, 8405, 516,
+ 10283, 8405, 520,
+ 10283, 8405, 524,
+ 10283, 8405, 526,
+ 10283, 8405, 532,
+ 10283, 8405, 536,
+ 10283, 8405, 546,
+ 10283, 8405, 556,
+ 10283, 8405, 560,
+ 10283, 8405, 564,
+ 10283, 8405, 568,
+ 10283, 8405, 576,
+ 10283, 8405, 610,
+ 10283, 8405, 612,
+ 10283, 8405, 614,
+ 10283, 8405, 616,
+ 10283, 8405, 618,
+ 10283, 8405, 622,
+ 10283, 8405, 626,
+ 10283, 8405, 630,
+ 10283, 8405, 632,
+ 10283, 8405, 652,
+ 10283, 8405, 660,
+ 10283, 8405, 664,
+ 10283, 8405, 670,
+ 10283, 8405, 672,
+ 10283, 8405, 676,
+ 10283, 8405, 678,
+ 10283, 8405, 680,
+ 10283, 8405, 7593, 0,
+ 10283, 8405, 7593, 8,
+ 10283, 8405, 7593, 16,
+ 10283, 8405, 7593, 28,
+ 10283, 8405, 7593, 40,
+ 10283, 8405, 7593, 236,
+ 10283, 8405, 7593, 238,
+ 10283, 8405, 7593, 242,
+ 10283, 8405, 7593, 246,
+ 10283, 8405, 7593, 250,
+ 10283, 8405, 7593, 306,
+ 10283, 8405, 7593, 310,
+ 10283, 8405, 7593, 326,
+ 10283, 8405, 7593, 384,
+ 10283, 8405, 7593, 416,
+ 10283, 8405, 7593, 510,
+ 10283, 8405, 7593, 512,
+ 10283, 8405, 7593, 514,
+ 10283, 8405, 7593, 516,
+ 10283, 8405, 7593, 520,
+ 10283, 8405, 7593, 532,
+ 10283, 8405, 7593, 546,
+ 10283, 8405, 7593, 568,
+ 10283, 8405, 7593, 576,
+ 10283, 8405, 7593, 622,
+ 10283, 8405, 7593, 652,
+ 10283, 8405, 7593, 660,
+ 10283, 8405, 7593, 664,
+ 10283, 8473, 1044,
+ 10283, 8921, 11067, 4926,
+ 10283, 9165, 4772,
+ 10283, 11067, 4926,
+ 10286,
+ 10297, 2638,
+ 10321, 8774,
+ 10327, 114,
+ 10327, 6408,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 601, 721, 4848,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 601, 721, 7442,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4117, 721, 4848,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4117, 721, 7442,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4849, 721, 600,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 4849, 721, 4116,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 7443, 721, 600,
+ 10327, 6409, 6121, 5385, 735, 8165, 275, 6435, 10441, 7443, 721, 4116,
+ 10327, 6409, 9537, 4848,
+ 10327, 7443, 6409, 6121, 1044,
+ 10333, 2779, 8709, 5387, 4894,
+ 10333, 2779, 8709, 8328,
+ 10333, 4895, 5387, 2779, 8708,
+ 10333, 4895, 5387, 7550,
+ 10333, 6516,
+ 10333, 7551, 5387, 4894,
+ 10333, 9796,
+ 10333, 11164,
+ 10333, 11358,
+ 10339, 8405, 601, 5876,
+ 10339, 8405, 601, 10716,
+ 10339, 8405, 604,
+ 10339, 8405, 1045, 7580,
+ 10339, 8405, 1045, 10677, 760,
+ 10339, 8405, 1045, 11649, 760,
+ 10339, 8405, 1109, 1809, 5964,
+ 10339, 8405, 1109, 4423, 5964,
+ 10339, 8405, 1809, 601, 10716,
+ 10339, 8405, 1809, 4117, 10716,
+ 10339, 8405, 1809, 4849, 6434,
+ 10339, 8405, 1809, 4849, 10716,
+ 10339, 8405, 1809, 5550,
+ 10339, 8405, 1809, 5965, 760,
+ 10339, 8405, 1809, 6379, 7908,
+ 10339, 8405, 1809, 6875, 7908,
+ 10339, 8405, 1809, 7443, 10716,
+ 10339, 8405, 1809, 7708,
+ 10339, 8405, 1809, 8151, 5965, 760,
+ 10339, 8405, 1809, 8151, 11095, 5965, 760,
+ 10339, 8405, 1809, 8432,
+ 10339, 8405, 1809, 10267, 12017, 4926,
+ 10339, 8405, 1809, 10677, 4876,
+ 10339, 8405, 1809, 11095, 5965, 760,
+ 10339, 8405, 1809, 11449, 7908,
+ 10339, 8405, 1911, 5965, 760,
+ 10339, 8405, 1911, 8151, 5965, 760,
+ 10339, 8405, 1911, 8151, 11095, 5965, 760,
+ 10339, 8405, 1911, 11095, 5965, 760,
+ 10339, 8405, 3071, 10799, 5965, 4926,
+ 10339, 8405, 4117, 5876,
+ 10339, 8405, 4117, 10716,
+ 10339, 8405, 4389, 11859, 6610,
+ 10339, 8405, 4423, 5965, 760,
+ 10339, 8405, 4423, 8151, 5965, 760,
+ 10339, 8405, 4423, 8151, 11095, 5965, 760,
+ 10339, 8405, 4423, 11095, 5965, 760,
+ 10339, 8405, 4849, 4389, 5550,
+ 10339, 8405, 4849, 10716,
+ 10339, 8405, 5385, 7530,
+ 10339, 8405, 5445, 5758,
+ 10339, 8405, 6179, 10799, 5965, 4926,
+ 10339, 8405, 6379, 7908,
+ 10339, 8405, 6485, 1809, 5964,
+ 10339, 8405, 6485, 4423, 5964,
+ 10339, 8405, 6610,
+ 10339, 8405, 6623, 7908,
+ 10339, 8405, 6875, 7908,
+ 10339, 8405, 7121, 7443, 8077, 6408,
+ 10339, 8405, 7173, 5758,
+ 10339, 8405, 7390,
+ 10339, 8405, 7443, 4389, 5550,
+ 10339, 8405, 7443, 10716,
+ 10339, 8405, 7530,
+ 10339, 8405, 7551, 8167, 5758,
+ 10339, 8405, 7593, 0,
+ 10339, 8405, 7593, 2,
+ 10339, 8405, 7593, 4,
+ 10339, 8405, 7593, 5, 6121, 3966,
+ 10339, 8405, 7593, 6,
+ 10339, 8405, 7593, 8,
+ 10339, 8405, 7593, 10,
+ 10339, 8405, 7593, 12,
+ 10339, 8405, 7593, 14,
+ 10339, 8405, 7593, 15, 6121, 4530,
+ 10339, 8405, 7593, 17, 6121, 8758,
+ 10339, 8405, 7593, 18,
+ 10339, 8405, 7593, 19, 6121, 12426,
+ 10339, 8405, 7593, 20,
+ 10339, 8405, 7593, 22,
+ 10339, 8405, 7593, 23, 6121, 9553, 4530,
+ 10339, 8405, 7593, 23, 6121, 11215, 4530,
+ 10339, 8405, 7593, 24,
+ 10339, 8405, 7593, 25, 6121, 4530,
+ 10339, 8405, 7593, 27, 6121, 4849, 4530,
+ 10339, 8405, 7593, 27, 6121, 11215, 4530,
+ 10339, 8405, 7593, 28,
+ 10339, 8405, 7593, 30,
+ 10339, 8405, 7593, 34,
+ 10339, 8405, 7593, 36,
+ 10339, 8405, 7593, 37, 6121, 4530,
+ 10339, 8405, 7593, 38,
+ 10339, 8405, 7593, 39, 6121, 9553, 4530,
+ 10339, 8405, 7593, 40,
+ 10339, 8405, 7593, 41, 760,
+ 10339, 8405, 7593, 42,
+ 10339, 8405, 7593, 43, 6121, 4530,
+ 10339, 8405, 7593, 44,
+ 10339, 8405, 7593, 46,
+ 10339, 8405, 7593, 48,
+ 10339, 8405, 7593, 50,
+ 10339, 8405, 7593, 51, 6121, 3966,
+ 10339, 8405, 7593, 51, 6121, 11215, 4530,
+ 10339, 8405, 7593, 710,
+ 10339, 8405, 7593, 888,
+ 10339, 8405, 7593, 1110,
+ 10339, 8405, 7593, 1124,
+ 10339, 8405, 7593, 1130,
+ 10339, 8405, 7593, 1138,
+ 10339, 8405, 7593, 2216,
+ 10339, 8405, 7593, 2725, 4389, 28,
+ 10339, 8405, 7593, 3774,
+ 10339, 8405, 7593, 4614,
+ 10339, 8405, 7593, 5385, 8,
+ 10339, 8405, 7593, 5385, 28,
+ 10339, 8405, 7593, 6406,
+ 10339, 8405, 7593, 6674,
+ 10339, 8405, 7593, 6824,
+ 10339, 8405, 7593, 6879, 2216,
+ 10339, 8405, 7593, 6879, 6824,
+ 10339, 8405, 7593, 7494,
+ 10339, 8405, 7593, 7682,
+ 10339, 8405, 7593, 7981, 28,
+ 10339, 8405, 7593, 8005, 4389, 28,
+ 10339, 8405, 7593, 8679, 12,
+ 10339, 8405, 7593, 8869, 0,
+ 10339, 8405, 7593, 8869, 14,
+ 10339, 8405, 7593, 8869, 16,
+ 10339, 8405, 7593, 8869, 24,
+ 10339, 8405, 7593, 8869, 25, 6121, 4895, 1760,
+ 10339, 8405, 7593, 8869, 34,
+ 10339, 8405, 7593, 8869, 35, 6121, 4530,
+ 10339, 8405, 7593, 8869, 42,
+ 10339, 8405, 7593, 8869, 66,
+ 10339, 8405, 7593, 8869, 5385, 8,
+ 10339, 8405, 7593, 8869, 6406,
+ 10339, 8405, 7593, 9063, 16,
+ 10339, 8405, 7593, 9063, 17, 6121, 8758,
+ 10339, 8405, 7593, 9063, 22,
+ 10339, 8405, 7593, 9063, 26,
+ 10339, 8405, 7593, 9063, 40,
+ 10339, 8405, 7593, 9063, 10267, 34,
+ 10339, 8405, 7593, 9185, 19, 6121, 8758,
+ 10339, 8405, 7593, 9808,
+ 10339, 8405, 7593, 10489, 5385, 8,
+ 10339, 8405, 7593, 10489, 9313, 5836,
+ 10339, 8405, 7593, 10523, 40,
+ 10339, 8405, 8153, 7390,
+ 10339, 8405, 8153, 11424,
+ 10339, 8405, 8432,
+ 10339, 8405, 8473, 6875, 7908,
+ 10339, 8405, 8473, 8153, 6379, 7908,
+ 10339, 8405, 8473, 8153, 6875, 7908,
+ 10339, 8405, 8631, 601, 6434,
+ 10339, 8405, 8631, 4117, 6434,
+ 10339, 8405, 8631, 6610,
+ 10339, 8405, 8631, 10267, 12017, 4926,
+ 10339, 8405, 8631, 12017, 4926,
+ 10339, 8405, 8645, 4530,
+ 10339, 8405, 8755, 721, 1809, 5964,
+ 10339, 8405, 8755, 721, 4423, 5964,
+ 10339, 8405, 8869, 6616,
+ 10339, 8405, 9063, 0,
+ 10339, 8405, 9063, 2,
+ 10339, 8405, 9063, 6,
+ 10339, 8405, 9063, 8,
+ 10339, 8405, 9063, 12,
+ 10339, 8405, 9063, 14,
+ 10339, 8405, 9063, 16,
+ 10339, 8405, 9063, 18,
+ 10339, 8405, 9063, 20,
+ 10339, 8405, 9063, 22,
+ 10339, 8405, 9063, 24,
+ 10339, 8405, 9063, 26,
+ 10339, 8405, 9063, 28,
+ 10339, 8405, 9063, 30,
+ 10339, 8405, 9063, 34,
+ 10339, 8405, 9063, 38,
+ 10339, 8405, 9063, 40,
+ 10339, 8405, 9063, 42,
+ 10339, 8405, 9063, 44,
+ 10339, 8405, 9063, 66,
+ 10339, 8405, 9063, 450,
+ 10339, 8405, 9063, 7981, 2,
+ 10339, 8405, 9063, 10489, 8,
+ 10339, 8405, 9063, 10489, 26,
+ 10339, 8405, 9079, 4849, 4389, 5550,
+ 10339, 8405, 9079, 7443, 4389, 5550,
+ 10339, 8405, 9089, 5965, 3071, 506,
+ 10339, 8405, 9089, 5965, 3071, 520,
+ 10339, 8405, 9089, 5965, 3071, 5432,
+ 10339, 8405, 9089, 5965, 3071, 7514,
+ 10339, 8405, 9089, 5965, 6179, 506,
+ 10339, 8405, 9089, 5965, 6179, 520,
+ 10339, 8405, 9089, 5965, 6179, 5432,
+ 10339, 8405, 9089, 5965, 6179, 7514,
+ 10339, 8405, 9313, 5836,
+ 10339, 8405, 9828,
+ 10339, 8405, 9977, 176,
+ 10339, 8405, 10221, 1992,
+ 10339, 8405, 10489, 6616,
+ 10339, 8405, 10489, 9313, 5836,
+ 10339, 8405, 10677, 4876,
+ 10339, 8405, 10985, 5965, 760,
+ 10339, 8405, 10985, 8151, 5965, 760,
+ 10339, 8405, 10985, 8151, 11095, 5965, 760,
+ 10339, 8405, 10985, 11095, 5965, 760,
+ 10339, 8405, 11424,
+ 10339, 8405, 11449, 7908,
+ 10339, 8405, 11625, 5965, 760,
+ 10339, 8405, 11625, 8151, 5965, 760,
+ 10339, 8405, 11625, 8151, 11095, 5965, 760,
+ 10339, 8405, 11625, 11095, 5965, 760,
+ 10339, 8405, 11859, 6610,
+ 10339, 8405, 12380,
+ 10343, 1177, 3070,
+ 10343, 1177, 6178,
+ 10343, 1177, 6716,
+ 10346,
+ 10350,
+ 10351, 7768,
+ 10351, 13060,
+ 10353, 6689, 8696,
+ 10357, 9095, 6689, 6260,
+ 10357, 9095, 8525, 8162,
+ 10357, 9095, 8525, 8874,
+ 10357, 9095, 8525, 8876,
+ 10357, 9095, 8525, 9286,
+ 10357, 9095, 8525, 9700,
+ 10357, 9095, 8525, 10150,
+ 10357, 9095, 8525, 10200,
+ 10357, 9095, 8525, 10360,
+ 10357, 9095, 8525, 10622,
+ 10357, 9095, 8525, 11232,
+ 10363, 7608,
+ 10379, 428,
+ 10383, 6622,
+ 10385, 6505, 5830,
+ 10385, 6879, 6622,
+ 10385, 7089, 6622,
+ 10385, 7821, 5830,
+ 10388,
+ 10411, 568,
+ 10411, 6121, 7709, 10374,
+ 10411, 6121, 11649, 8758,
+ 10429, 4927, 5668,
+ 10429, 4927, 8153, 5668,
+ 10429, 8153, 4399, 4926,
+ 10429, 8405, 0,
+ 10429, 8405, 8,
+ 10429, 8405, 16,
+ 10429, 8405, 28,
+ 10429, 8405, 40,
+ 10429, 8405, 100,
+ 10429, 8405, 116,
+ 10429, 8405, 138,
+ 10429, 8405, 162,
+ 10429, 8405, 196,
+ 10429, 8405, 216,
+ 10429, 8405, 236,
+ 10429, 8405, 292,
+ 10429, 8405, 306,
+ 10429, 8405, 332,
+ 10429, 8405, 364,
+ 10429, 8405, 392,
+ 10429, 8405, 462,
+ 10429, 8405, 496,
+ 10429, 8405, 510,
+ 10429, 8405, 524,
+ 10429, 8405, 556,
+ 10429, 8405, 622,
+ 10429, 8405, 638,
+ 10429, 8405, 652,
+ 10429, 8405, 670,
+ 10429, 8405, 884,
+ 10429, 8405, 974,
+ 10429, 8405, 1080,
+ 10429, 8405, 1250,
+ 10429, 8405, 1612,
+ 10429, 8405, 2030,
+ 10429, 8405, 2076,
+ 10429, 8405, 2126,
+ 10429, 8405, 2212,
+ 10429, 8405, 2516,
+ 10429, 8405, 2678,
+ 10429, 8405, 2732,
+ 10429, 8405, 2746,
+ 10429, 8405, 3146,
+ 10429, 8405, 5978,
+ 10429, 8405, 5994,
+ 10429, 8405, 7593, 0,
+ 10429, 8405, 8921, 236,
+ 10429, 8405, 10707, 652,
+ 10429, 8405, 10721, 196,
+ 10429, 8405, 11395, 2516,
+ 10429, 8405, 11900,
+ 10429, 8717, 4399, 4926,
+ 10429, 11257, 8405, 510,
+ 10429, 11257, 8405, 622,
+ 10429, 11257, 8405, 652,
+ 10429, 11843, 8405, 510,
+ 10431, 4093, 5759, 457, 3696,
+ 10431, 4093, 5759, 778,
+ 10431, 4093, 5759, 824,
+ 10431, 4093, 5759, 862,
+ 10431, 4093, 5759, 1780,
+ 10431, 4093, 5759, 2386,
+ 10431, 4093, 5759, 2498,
+ 10431, 4093, 5759, 3948,
+ 10431, 4093, 5759, 3954,
+ 10431, 4093, 5759, 4114,
+ 10431, 4093, 5759, 4418,
+ 10431, 4093, 5759, 4536,
+ 10431, 4093, 5759, 4874,
+ 10431, 4093, 5759, 5700,
+ 10431, 4093, 5759, 6090,
+ 10431, 4093, 5759, 6107, 3706,
+ 10431, 4093, 5759, 6434,
+ 10431, 4093, 5759, 6533, 1760,
+ 10431, 4093, 5759, 6574,
+ 10431, 4093, 5759, 6712,
+ 10431, 4093, 5759, 6794,
+ 10431, 4093, 5759, 7379, 5968,
+ 10431, 4093, 5759, 7586,
+ 10431, 4093, 5759, 7593, 742,
+ 10431, 4093, 5759, 7702,
+ 10431, 4093, 5759, 7752,
+ 10431, 4093, 5759, 7830,
+ 10431, 4093, 5759, 8068,
+ 10431, 4093, 5759, 8126,
+ 10431, 4093, 5759, 8270,
+ 10431, 4093, 5759, 8296,
+ 10431, 4093, 5759, 8599, 4398,
+ 10431, 4093, 5759, 8704,
+ 10431, 4093, 5759, 9036,
+ 10431, 4093, 5759, 9064,
+ 10431, 4093, 5759, 9462,
+ 10431, 4093, 5759, 9568,
+ 10431, 4093, 5759, 9638,
+ 10431, 4093, 5759, 10216,
+ 10431, 4093, 5759, 10316,
+ 10431, 4093, 5759, 10546,
+ 10431, 4093, 5759, 10611, 4398,
+ 10431, 4093, 5759, 10744,
+ 10431, 4093, 5759, 10753, 7378,
+ 10431, 4093, 5759, 10767, 9525, 8758,
+ 10431, 4093, 5759, 11718,
+ 10433, 5830,
+ 10445, 11054,
+ 10452,
+ 10453, 445, 6741, 568,
+ 10453, 445, 11621, 568,
+ 10453, 835, 2091, 11621, 568,
+ 10453, 6377, 2091, 6741, 568,
+ 10453, 6377, 2091, 7919, 6741, 568,
+ 10453, 6377, 7919, 6741, 568,
+ 10453, 6377, 8167, 5758,
+ 10453, 6377, 12345, 2091, 6741, 568,
+ 10453, 6377, 12345, 8167, 5758,
+ 10453, 7767, 10476,
+ 10455, 5392,
+ 10461, 4876,
+ 10465, 7121, 4848,
+ 10465, 7121, 7442,
+ 10465, 7773, 4848,
+ 10465, 7773, 4849, 721, 7121, 4849, 721, 7121, 7442,
+ 10465, 7773, 4849, 721, 7121, 7442,
+ 10465, 7773, 4849, 721, 7773, 7443, 721, 7121, 4848,
+ 10465, 7773, 4849, 721, 7773, 7443, 721, 7121, 7442,
+ 10465, 7773, 7442,
+ 10465, 7773, 7443, 721, 7121, 4848,
+ 10465, 7773, 7443, 721, 7121, 4849, 721, 7121, 7442,
+ 10469, 4926,
+ 10469, 12017, 4926,
+ 10470,
+ 10475, 7337, 8774,
+ 10486,
+ 10489, 2091, 5758,
+ 10489, 6408,
+ 10489, 6409, 6121, 10666,
+ 10489, 6731, 2510,
+ 10489, 7390,
+ 10489, 7708,
+ 10489, 7709, 8166,
+ 10489, 8153, 7390,
+ 10489, 8153, 7391, 11195, 4926,
+ 10489, 8153, 8759, 2091, 5758,
+ 10489, 8231, 12108,
+ 10489, 8849, 7390,
+ 10489, 9595, 5758,
+ 10489, 9641, 8225, 6907, 8022,
+ 10489, 10469, 4926,
+ 10489, 11224,
+ 10489, 11767, 9063, 22,
+ 10504,
+ 10513, 7821, 5830,
+ 10513, 7821, 7089, 6622,
+ 10513, 7821, 8056,
+ 10514,
+ 10529, 9898,
+ 10553, 11621, 568,
+ 10574,
+ 10575, 445, 6741, 568,
+ 10575, 445, 11621, 568,
+ 10575, 835, 2091, 11621, 568,
+ 10575, 6377, 2091, 6741, 568,
+ 10575, 6377, 2091, 7919, 6741, 568,
+ 10575, 6377, 7919, 6741, 568,
+ 10575, 6377, 8167, 5758,
+ 10575, 6377, 12345, 2091, 6741, 568,
+ 10575, 6377, 12345, 8167, 5758,
+ 10575, 7767, 10476,
+ 10579, 428,
+ 10579, 429, 445, 6741, 568,
+ 10579, 429, 445, 6741, 569, 6121, 1045, 6376,
+ 10579, 429, 6121, 2091, 6741, 568,
+ 10579, 429, 6377, 2091, 6741, 568,
+ 10579, 429, 6377, 7709, 10374,
+ 10579, 429, 6377, 7919, 6741, 568,
+ 10579, 429, 6377, 8167, 5758,
+ 10579, 6121, 1044,
+ 10579, 6121, 5445, 5759, 6490,
+ 10579, 6121, 13061, 5759, 6490,
+ 10579, 6377, 8762,
+ 10579, 6377, 10578,
+ 10579, 6377, 11097, 6434,
+ 10579, 7991, 721, 8329, 115, 3993, 6121, 8762,
+ 10579, 7991, 8762,
+ 10579, 11183, 9718,
+ 10604,
+ 10607, 7803, 5759, 16,
+ 10607, 7803, 5759, 40,
+ 10607, 8405, 0,
+ 10607, 8405, 16,
+ 10607, 8405, 40,
+ 10607, 8405, 100,
+ 10607, 8405, 138,
+ 10607, 8405, 216,
+ 10607, 8405, 306,
+ 10607, 8405, 332,
+ 10607, 8405, 364,
+ 10607, 8405, 392,
+ 10607, 8405, 462,
+ 10607, 8405, 524,
+ 10607, 8405, 556,
+ 10607, 8405, 622,
+ 10607, 8405, 652,
+ 10607, 8405, 2030,
+ 10629, 8405, 652,
+ 10629, 8405, 656,
+ 10629, 8405, 664,
+ 10629, 8405, 3006,
+ 10629, 8405, 3008,
+ 10629, 8405, 3010,
+ 10629, 8405, 3014,
+ 10629, 8405, 3016,
+ 10629, 8405, 3018,
+ 10629, 8405, 3020,
+ 10629, 8405, 3022,
+ 10629, 8405, 3024,
+ 10629, 8405, 3026,
+ 10629, 8405, 3028,
+ 10629, 8405, 3030,
+ 10629, 8405, 3032,
+ 10629, 8405, 3034,
+ 10629, 8405, 3036,
+ 10629, 8405, 3038,
+ 10629, 8405, 3040,
+ 10629, 8405, 3042,
+ 10629, 8405, 3044,
+ 10629, 8405, 3046,
+ 10629, 8405, 3062,
+ 10629, 8405, 3291, 6170,
+ 10629, 8405, 6162,
+ 10629, 8405, 6164,
+ 10629, 8405, 6166,
+ 10629, 8405, 6168,
+ 10629, 8405, 6170,
+ 10629, 8405, 6174,
+ 10629, 8405, 6176,
+ 10629, 8405, 6180,
+ 10629, 8405, 6182,
+ 10629, 8405, 6184,
+ 10629, 8405, 6186,
+ 10629, 8405, 6190,
+ 10629, 8405, 6192,
+ 10629, 8405, 6194,
+ 10629, 8405, 7844,
+ 10629, 8405, 7846,
+ 10629, 8405, 7848,
+ 10629, 8405, 7989, 8973, 3018,
+ 10629, 8405, 7989, 8973, 3020,
+ 10629, 8405, 8863, 3018,
+ 10629, 8405, 8863, 3022,
+ 10629, 8405, 8863, 3032,
+ 10629, 8405, 8863, 6170,
+ 10629, 8405, 8863, 6172,
+ 10629, 8405, 8863, 6176,
+ 10629, 8405, 8863, 6178,
+ 10629, 8405, 8863, 6192,
+ 10629, 8405, 8985, 6192,
+ 10629, 8405, 11849, 3046,
+ 10629, 10339, 8405, 12965, 4926,
+ 10631, 5759, 186,
+ 10643, 6121, 1045, 6376,
+ 10643, 6121, 8689, 91, 8004,
+ 10643, 6121, 10666,
+ 10644,
+ 10661, 6129, 9178,
+ 10661, 8405, 16,
+ 10661, 8405, 40,
+ 10661, 8405, 246,
+ 10661, 8405, 486,
+ 10661, 8405, 568,
+ 10661, 8405, 632,
+ 10661, 8405, 680,
+ 10661, 8405, 710,
+ 10661, 8405, 1578,
+ 10661, 8405, 1612,
+ 10661, 8405, 1892,
+ 10661, 8405, 2110,
+ 10661, 8405, 2574,
+ 10661, 8405, 2674,
+ 10661, 8405, 3080,
+ 10661, 8405, 3252,
+ 10661, 8405, 3774,
+ 10661, 8405, 4066,
+ 10661, 8405, 4538,
+ 10661, 8405, 5494,
+ 10661, 8405, 5624,
+ 10661, 8405, 5698,
+ 10661, 8405, 6262,
+ 10661, 8405, 6674,
+ 10661, 8405, 6822,
+ 10661, 8405, 6850,
+ 10661, 8405, 7080,
+ 10661, 8405, 7422,
+ 10661, 8405, 7482,
+ 10661, 8405, 8814,
+ 10664,
+ 10665, 6121, 5525, 6706,
+ 10670,
+ 10674,
+ 10677, 761, 6121, 11649, 8758,
+ 10677, 761, 7991, 7443, 10642,
+ 10677, 761, 8153, 4849, 11378,
+ 10677, 761, 8849, 7443, 11378,
+ 10677, 4215, 4112,
+ 10677, 4719, 8641, 4926,
+ 10677, 4719, 8641, 4927, 7121, 4388,
+ 10677, 4719, 8641, 4927, 7773, 4388,
+ 10677, 4719, 8641, 6121, 8921, 7605, 4926,
+ 10677, 4719, 8641, 6121, 8921, 7605, 4927, 7773, 4388,
+ 10677, 4876,
+ 10677, 4877, 6121, 8057, 6376,
+ 10677, 4877, 6121, 8057, 6490,
+ 10677, 4877, 6121, 8473, 1044,
+ 10677, 4877, 10982,
+ 10677, 4923, 6121, 8759, 5758,
+ 10677, 7708,
+ 10677, 8963, 4876,
+ 10677, 10154,
+ 10677, 12043, 11067, 4926,
+ 10679, 8744,
+ 10701, 569, 2681, 9746,
+ 10708,
+ 10719, 5238,
+ 10722,
+ 10737, 5758,
+ 10749, 9483, 8775, 1078,
+ 10749, 9483, 8775, 1135, 12010,
+ 10749, 9483, 8775, 3268,
+ 10749, 9483, 8775, 4619, 2020,
+ 10749, 9483, 8775, 4619, 9884,
+ 10749, 9483, 8775, 5048,
+ 10749, 9483, 8775, 5921, 1583, 9000,
+ 10749, 9483, 8775, 5970,
+ 10749, 9483, 8775, 6203, 726,
+ 10749, 9483, 8775, 6203, 4728,
+ 10749, 9483, 8775, 6387, 3274,
+ 10749, 9483, 8775, 6387, 4952,
+ 10749, 9483, 8775, 6387, 5449, 3274,
+ 10749, 9483, 8775, 6387, 5449, 6866,
+ 10749, 9483, 8775, 6387, 6866,
+ 10749, 9483, 8775, 6387, 8470,
+ 10749, 9483, 8775, 6387, 9886,
+ 10749, 9483, 8775, 6387, 11022,
+ 10749, 9483, 8775, 6419, 1135, 2020,
+ 10749, 9483, 8775, 6419, 12010,
+ 10749, 9483, 8775, 6426,
+ 10749, 9483, 8775, 6581, 7892,
+ 10749, 9483, 8775, 6581, 8366,
+ 10749, 9483, 8775, 6581, 8728,
+ 10749, 9483, 8775, 6690,
+ 10749, 9483, 8775, 6691, 9884,
+ 10749, 9483, 8775, 7092,
+ 10749, 9483, 8775, 7329, 2020,
+ 10749, 9483, 8775, 7329, 6690,
+ 10749, 9483, 8775, 7329, 12010,
+ 10749, 9483, 8775, 7398,
+ 10749, 9483, 8775, 7434,
+ 10749, 9483, 8775, 7660,
+ 10749, 9483, 8775, 7678,
+ 10749, 9483, 8775, 7679, 7928,
+ 10749, 9483, 8775, 7688,
+ 10749, 9483, 8775, 7788,
+ 10749, 9483, 8775, 7837, 8364,
+ 10749, 9483, 8775, 8094,
+ 10749, 9483, 8775, 8115, 3269, 1079, 10018,
+ 10749, 9483, 8775, 8115, 10815, 195, 10018,
+ 10749, 9483, 8775, 8115, 11863, 5377, 10018,
+ 10749, 9483, 8775, 8115, 12085, 9775, 10018,
+ 10749, 9483, 8775, 8115, 12372,
+ 10749, 9483, 8775, 8115, 13020,
+ 10749, 9483, 8775, 8171, 12110,
+ 10749, 9483, 8775, 8171, 12904,
+ 10749, 9483, 8775, 8199, 9703, 8053, 7786,
+ 10749, 9483, 8775, 8237, 17, 8949, 13020,
+ 10749, 9483, 8775, 8237, 5055, 6978,
+ 10749, 9483, 8775, 8237, 8506,
+ 10749, 9483, 8775, 8237, 9451, 8053, 10008,
+ 10749, 9483, 8775, 8237, 9451, 8053, 11684,
+ 10749, 9483, 8775, 8237, 9703, 8053, 8776,
+ 10749, 9483, 8775, 8237, 9703, 10007, 144,
+ 10749, 9483, 8775, 8237, 9884,
+ 10749, 9483, 8775, 8237, 9885, 9999, 6980,
+ 10749, 9483, 8775, 8237, 10811, 144,
+ 10749, 9483, 8775, 8237, 10811, 310,
+ 10749, 9483, 8775, 8237, 10811, 405, 726,
+ 10749, 9483, 8775, 8237, 10811, 405, 4728,
+ 10749, 9483, 8775, 8237, 10811, 462,
+ 10749, 9483, 8775, 8237, 10811, 678,
+ 10749, 9483, 8775, 8237, 10811, 5048,
+ 10749, 9483, 8775, 8237, 11609, 10710,
+ 10749, 9483, 8775, 8249, 8114,
+ 10749, 9483, 8775, 8249, 8948,
+ 10749, 9483, 8775, 8265, 2021, 726,
+ 10749, 9483, 8775, 8265, 2021, 4728,
+ 10749, 9483, 8775, 8265, 9884,
+ 10749, 9483, 8775, 8265, 12989, 6680,
+ 10749, 9483, 8775, 8265, 12989, 9888,
+ 10749, 9483, 8775, 8321, 8801, 11038,
+ 10749, 9483, 8775, 8341, 10648,
+ 10749, 9483, 8775, 8364,
+ 10749, 9483, 8775, 8365, 726,
+ 10749, 9483, 8775, 8365, 4728,
+ 10749, 9483, 8775, 8397, 1079, 9090,
+ 10749, 9483, 8775, 8397, 4159, 9092,
+ 10749, 9483, 8775, 8397, 7735, 9090,
+ 10749, 9483, 8775, 8397, 9359, 9092,
+ 10749, 9483, 8775, 8397, 10615, 9090,
+ 10749, 9483, 8775, 8475, 4618,
+ 10749, 9483, 8775, 8537, 2020,
+ 10749, 9483, 8775, 8537, 9884,
+ 10749, 9483, 8775, 8538,
+ 10749, 9483, 8775, 8557, 9884,
+ 10749, 9483, 8775, 8587, 2020,
+ 10749, 9483, 8775, 8587, 9884,
+ 10749, 9483, 8775, 8614,
+ 10749, 9483, 8775, 8686,
+ 10749, 9483, 8775, 8687, 2020,
+ 10749, 9483, 8775, 8748,
+ 10749, 9483, 8775, 8798,
+ 10749, 9483, 8775, 8850,
+ 10749, 9483, 8775, 8909, 2020,
+ 10749, 9483, 8775, 8909, 6690,
+ 10749, 9483, 8775, 8909, 12010,
+ 10749, 9483, 8775, 8949, 3269, 1079, 10018,
+ 10749, 9483, 8775, 8949, 10815, 195, 10018,
+ 10749, 9483, 8775, 8949, 11863, 5377, 10018,
+ 10749, 9483, 8775, 8949, 12085, 9775, 10018,
+ 10749, 9483, 8775, 8949, 12372,
+ 10749, 9483, 8775, 8954,
+ 10749, 9483, 8775, 9009, 144,
+ 10749, 9483, 8775, 9009, 216,
+ 10749, 9483, 8775, 9009, 310,
+ 10749, 9483, 8775, 9009, 404,
+ 10749, 9483, 8775, 9009, 462,
+ 10749, 9483, 8775, 9009, 678,
+ 10749, 9483, 8775, 9009, 2882,
+ 10749, 9483, 8775, 9080,
+ 10749, 9483, 8775, 9160,
+ 10749, 9483, 8775, 9260,
+ 10749, 9483, 8775, 9267, 1583, 8237, 2882,
+ 10749, 9483, 8775, 9350,
+ 10749, 9483, 8775, 9399, 2021, 726,
+ 10749, 9483, 8775, 9399, 2021, 4728,
+ 10749, 9483, 8775, 9399, 2021, 4954,
+ 10749, 9483, 8775, 9399, 9884,
+ 10749, 9483, 8775, 9412,
+ 10749, 9483, 8775, 9415, 2020,
+ 10749, 9483, 8775, 9415, 3250,
+ 10749, 9483, 8775, 9415, 9884,
+ 10749, 9483, 8775, 9420,
+ 10749, 9483, 8775, 9440,
+ 10749, 9483, 8775, 9584,
+ 10749, 9483, 8775, 9586,
+ 10749, 9483, 8775, 9620,
+ 10749, 9483, 8775, 9740,
+ 10749, 9483, 8775, 9741, 9874,
+ 10749, 9483, 8775, 9755, 2020,
+ 10749, 9483, 8775, 9755, 4957, 9742,
+ 10749, 9483, 8775, 9755, 9884,
+ 10749, 9483, 8775, 9756,
+ 10749, 9483, 8775, 9774,
+ 10749, 9483, 8775, 9790,
+ 10749, 9483, 8775, 9815, 9884,
+ 10749, 9483, 8775, 9848,
+ 10749, 9483, 8775, 9873, 2020,
+ 10749, 9483, 8775, 9873, 9884,
+ 10749, 9483, 8775, 9876,
+ 10749, 9483, 8775, 9936,
+ 10749, 9483, 8775, 9943, 2020,
+ 10749, 9483, 8775, 9943, 9884,
+ 10749, 9483, 8775, 10005, 3269, 7168,
+ 10749, 9483, 8775, 10005, 3269, 8464,
+ 10749, 9483, 8775, 10005, 6690,
+ 10749, 9483, 8775, 10005, 9778,
+ 10749, 9483, 8775, 10010,
+ 10749, 9483, 8775, 10011, 12989, 6680,
+ 10749, 9483, 8775, 10011, 12989, 9889, 726,
+ 10749, 9483, 8775, 10011, 12989, 9889, 4728,
+ 10749, 9483, 8775, 10013, 222,
+ 10749, 9483, 8775, 10164,
+ 10749, 9483, 8775, 10250,
+ 10749, 9483, 8775, 10284,
+ 10749, 9483, 8775, 10288,
+ 10749, 9483, 8775, 10289, 3250,
+ 10749, 9483, 8775, 10290,
+ 10749, 9483, 8775, 10292,
+ 10749, 9483, 8775, 10325, 3249, 8613, 6978,
+ 10749, 9483, 8775, 10325, 3249, 9997, 6978,
+ 10749, 9483, 8775, 10325, 7785, 6978,
+ 10749, 9483, 8775, 10325, 8613, 6978,
+ 10749, 9483, 8775, 10325, 8855, 6978,
+ 10749, 9483, 8775, 10325, 9429, 6978,
+ 10749, 9483, 8775, 10325, 9597, 6978,
+ 10749, 9483, 8775, 10325, 9597, 10617, 6978,
+ 10749, 9483, 8775, 10325, 9997, 6978,
+ 10749, 9483, 8775, 10325, 10617, 6978,
+ 10749, 9483, 8775, 10325, 10617, 9429, 6978,
+ 10749, 9483, 8775, 10325, 11372,
+ 10749, 9483, 8775, 10325, 11743, 6978,
+ 10749, 9483, 8775, 10412,
+ 10749, 9483, 8775, 10418,
+ 10749, 9483, 8775, 10419, 2020,
+ 10749, 9483, 8775, 10500,
+ 10749, 9483, 8775, 10525, 7946,
+ 10749, 9483, 8775, 10525, 7947, 9174,
+ 10749, 9483, 8775, 10525, 7947, 10646,
+ 10749, 9483, 8775, 10525, 7947, 11852,
+ 10749, 9483, 8775, 10525, 9778,
+ 10749, 9483, 8775, 10525, 9779, 9174,
+ 10749, 9483, 8775, 10525, 9779, 10646,
+ 10749, 9483, 8775, 10525, 9779, 11852,
+ 10749, 9483, 8775, 10618,
+ 10749, 9483, 8775, 10649, 2020,
+ 10749, 9483, 8775, 10649, 3250,
+ 10749, 9483, 8775, 10649, 9884,
+ 10749, 9483, 8775, 10813, 450,
+ 10749, 9483, 8775, 10974,
+ 10749, 9483, 8775, 10991, 10008,
+ 10749, 9483, 8775, 10991, 11684,
+ 10749, 9483, 8775, 10991, 12360,
+ 10749, 9483, 8775, 11046,
+ 10749, 9483, 8775, 11074,
+ 10749, 9483, 8775, 11078,
+ 10749, 9483, 8775, 11079, 2021, 726,
+ 10749, 9483, 8775, 11079, 2021, 4728,
+ 10749, 9483, 8775, 11079, 2021, 4954,
+ 10749, 9483, 8775, 11079, 9884,
+ 10749, 9483, 8775, 11082,
+ 10749, 9483, 8775, 11149, 2020,
+ 10749, 9483, 8775, 11149, 9884,
+ 10749, 9483, 8775, 11188,
+ 10749, 9483, 8775, 11189, 2020,
+ 10749, 9483, 8775, 11348,
+ 10749, 9483, 8775, 11374,
+ 10749, 9483, 8775, 11402,
+ 10749, 9483, 8775, 11403, 6690,
+ 10749, 9483, 8775, 11416,
+ 10749, 9483, 8775, 11421, 8801, 11038,
+ 10749, 9483, 8775, 11421, 11347, 2020,
+ 10749, 9483, 8775, 11422,
+ 10749, 9483, 8775, 11423, 2020,
+ 10749, 9483, 8775, 11423, 6690,
+ 10749, 9483, 8775, 11602,
+ 10749, 9483, 8775, 11643, 27, 7928,
+ 10749, 9483, 8775, 11643, 27, 9172,
+ 10749, 9483, 8775, 11654,
+ 10749, 9483, 8775, 11656,
+ 10749, 9483, 8775, 12111, 2020,
+ 10749, 9483, 8775, 12111, 9884,
+ 10749, 9483, 8775, 12112,
+ 10749, 9483, 8775, 12113, 2020,
+ 10749, 9483, 8775, 12113, 9884,
+ 10749, 9483, 8775, 12120,
+ 10749, 9483, 8775, 12365, 1126,
+ 10749, 9483, 8775, 12365, 1134,
+ 10749, 9483, 8775, 12400,
+ 10749, 9483, 8775, 12474,
+ 10749, 9483, 8775, 12872,
+ 10749, 9483, 8775, 12904,
+ 10749, 9483, 8775, 13052,
+ 10749, 9483, 8775, 13082,
+ 10749, 9483, 8775, 13084,
+ 10749, 9483, 8775, 13186,
+ 10749, 9483, 8775, 13206,
+ 10749, 9483, 8775, 13208,
+ 10749, 9483, 8775, 13216,
+ 10749, 9483, 8775, 13220,
+ 10749, 9483, 8775, 13222,
+ 10749, 9483, 8775, 13352,
+ 10749, 9483, 8775, 13400,
+ 10749, 9483, 8775, 13404,
+ 10750,
+ 10759, 2690,
+ 10763, 2725, 11791, 6434,
+ 10763, 5385, 8057, 6434,
+ 10763, 8065, 8057, 6434,
+ 10763, 8241, 8057, 6434,
+ 10763, 9115, 10260,
+ 10763, 10260,
+ 10767, 47, 6376,
+ 10767, 47, 6490,
+ 10767, 283, 6490,
+ 10767, 601, 5877, 6490,
+ 10767, 603, 6376,
+ 10767, 605, 6376,
+ 10767, 1045, 6376,
+ 10767, 1045, 6377, 7442,
+ 10767, 1045, 6490,
+ 10767, 1809, 4876,
+ 10767, 2091, 7709, 6376,
+ 10767, 4117, 5877, 6490,
+ 10767, 4215, 4113, 6376,
+ 10767, 4531, 6376,
+ 10767, 4536,
+ 10767, 4849, 4389, 5551, 6376,
+ 10767, 4849, 4389, 5551, 6490,
+ 10767, 4849, 5877, 6490,
+ 10767, 4849, 6409, 6376,
+ 10767, 4849, 6409, 6490,
+ 10767, 4849, 6435, 6376,
+ 10767, 4849, 6435, 6490,
+ 10767, 4849, 7443, 6435, 6376,
+ 10767, 4849, 7443, 6435, 6490,
+ 10767, 4849, 9327, 6376,
+ 10767, 4849, 10717, 6376,
+ 10767, 4849, 10717, 6490,
+ 10767, 4895, 8153, 9719, 9548,
+ 10767, 4895, 8759, 9548,
+ 10767, 4895, 9719, 9548,
+ 10767, 4895, 10677, 4877, 9548,
+ 10767, 5445, 5759, 6490,
+ 10767, 5551, 6376,
+ 10767, 5551, 6490,
+ 10767, 5551, 9548,
+ 10767, 6115, 8015, 6376,
+ 10767, 6379, 5965, 4926,
+ 10767, 6379, 7908,
+ 10767, 6379, 7909, 6490,
+ 10767, 6516,
+ 10767, 6517, 6490,
+ 10767, 6546,
+ 10767, 6547, 6490,
+ 10767, 6617, 6376,
+ 10767, 6617, 6377, 7442,
+ 10767, 6617, 6490,
+ 10767, 6875, 5965, 4926,
+ 10767, 6875, 7908,
+ 10767, 6875, 7909, 6490,
+ 10767, 6879, 9412,
+ 10767, 6879, 9483, 9796,
+ 10767, 6879, 9483, 11164,
+ 10767, 6879, 9483, 11358,
+ 10767, 6879, 10809, 7724,
+ 10767, 6879, 12120,
+ 10767, 6879, 13036,
+ 10767, 7089, 7593, 8405, 0,
+ 10767, 7089, 7593, 8405, 4,
+ 10767, 7089, 7593, 8405, 5, 9072,
+ 10767, 7089, 7593, 8405, 6,
+ 10767, 7089, 7593, 8405, 8,
+ 10767, 7089, 7593, 8405, 12,
+ 10767, 7089, 7593, 8405, 14,
+ 10767, 7089, 7593, 8405, 16,
+ 10767, 7089, 7593, 8405, 20,
+ 10767, 7089, 7593, 8405, 22,
+ 10767, 7089, 7593, 8405, 24,
+ 10767, 7089, 7593, 8405, 26,
+ 10767, 7089, 7593, 8405, 28,
+ 10767, 7089, 7593, 8405, 34,
+ 10767, 7089, 7593, 8405, 35, 6490,
+ 10767, 7089, 7593, 8405, 35, 9642,
+ 10767, 7089, 7593, 8405, 36,
+ 10767, 7089, 7593, 8405, 38,
+ 10767, 7089, 7593, 8405, 40,
+ 10767, 7089, 7593, 8405, 42,
+ 10767, 7089, 7593, 8405, 46,
+ 10767, 7089, 7593, 8405, 50,
+ 10767, 7089, 7593, 8405, 66,
+ 10767, 7089, 7593, 8405, 82,
+ 10767, 7089, 7593, 8405, 94,
+ 10767, 7089, 7593, 8405, 1130,
+ 10767, 7089, 7593, 8405, 4895, 36,
+ 10767, 7089, 7593, 8405, 9365, 6,
+ 10767, 7089, 7593, 8405, 10997, 5385, 1, 6376,
+ 10767, 7089, 8405, 7593, 9063, 12,
+ 10767, 7089, 8405, 7593, 9063, 22,
+ 10767, 7089, 8405, 7593, 9063, 24,
+ 10767, 7089, 8405, 7593, 9063, 26,
+ 10767, 7089, 8405, 7593, 9063, 34,
+ 10767, 7173, 5759, 6490,
+ 10767, 7443, 4389, 5551, 6376,
+ 10767, 7443, 4389, 5551, 6490,
+ 10767, 7443, 5877, 6490,
+ 10767, 7443, 6435, 6376,
+ 10767, 7443, 6435, 6490,
+ 10767, 7443, 9327, 6376,
+ 10767, 7443, 10717, 721, 601, 10717, 6490,
+ 10767, 7443, 10717, 721, 4117, 10717, 6490,
+ 10767, 7443, 10717, 6376,
+ 10767, 7443, 10717, 6490,
+ 10767, 7551, 8759, 9548,
+ 10767, 7551, 9719, 9548,
+ 10767, 7551, 10677, 4877, 9548,
+ 10767, 7601, 6490,
+ 10767, 7695, 4113, 6376,
+ 10767, 7708,
+ 10767, 7709, 6490,
+ 10767, 7709, 9548,
+ 10767, 7919, 6741, 569, 6376,
+ 10767, 8015, 6376,
+ 10767, 8015, 6490,
+ 10767, 8151, 6379, 7908,
+ 10767, 8151, 6875, 7908,
+ 10767, 8153, 1809, 4876,
+ 10767, 8153, 5551, 6490,
+ 10767, 8153, 6379, 7908,
+ 10767, 8153, 6516,
+ 10767, 8153, 6517, 6490,
+ 10767, 8153, 6875, 7908,
+ 10767, 8153, 7708,
+ 10767, 8153, 7709, 4849, 4388,
+ 10767, 8153, 7709, 7443, 4388,
+ 10767, 8153, 8432,
+ 10767, 8153, 8433, 6490,
+ 10767, 8153, 10267, 6516,
+ 10767, 8153, 10388,
+ 10767, 8153, 10677, 4877, 6376,
+ 10767, 8153, 10677, 4877, 6490,
+ 10767, 8153, 10677, 8759, 9548,
+ 10767, 8153, 11449, 6376,
+ 10767, 8153, 11765, 6435, 6490,
+ 10767, 8167, 5759, 6490,
+ 10767, 8432,
+ 10767, 8433, 4849, 4388,
+ 10767, 8433, 6490,
+ 10767, 8433, 7443, 4388,
+ 10767, 8534,
+ 10767, 8535, 6376,
+ 10767, 8745, 6490,
+ 10767, 8849, 10668,
+ 10767, 8869, 6617, 6376,
+ 10767, 8963, 6376,
+ 10767, 8963, 6490,
+ 10767, 8999, 8774,
+ 10767, 9072,
+ 10767, 9284,
+ 10767, 9633, 9719, 9548,
+ 10767, 9663, 6490,
+ 10767, 9811, 6435, 6490,
+ 10767, 9899, 6376,
+ 10767, 9899, 6490,
+ 10767, 9977, 2671, 10335, 5758,
+ 10767, 9977, 6655, 10438,
+ 10767, 9977, 7399, 10438,
+ 10767, 9977, 7716,
+ 10767, 9977, 7804,
+ 10767, 9977, 8342,
+ 10767, 9977, 8405, 0,
+ 10767, 9977, 8405, 28,
+ 10767, 9977, 8405, 102,
+ 10767, 9977, 8405, 142,
+ 10767, 9977, 8405, 172,
+ 10767, 9977, 8405, 174,
+ 10767, 9977, 8405, 176,
+ 10767, 9977, 8405, 182,
+ 10767, 9977, 8405, 184,
+ 10767, 9977, 8405, 236,
+ 10767, 9977, 8405, 258,
+ 10767, 9977, 8405, 306,
+ 10767, 9977, 8405, 468,
+ 10767, 9977, 8405, 560,
+ 10767, 9977, 8405, 612,
+ 10767, 9977, 8405, 664,
+ 10767, 9977, 8405, 672,
+ 10767, 9977, 8405, 807, 3096,
+ 10767, 9977, 8405, 886,
+ 10767, 9977, 8405, 1262,
+ 10767, 9977, 8405, 2516,
+ 10767, 9977, 8405, 2734,
+ 10767, 9977, 8405, 3038,
+ 10767, 9977, 8405, 3148,
+ 10767, 9977, 8405, 4198,
+ 10767, 9977, 8405, 6696,
+ 10767, 9977, 8405, 6748,
+ 10767, 9977, 8405, 7522,
+ 10767, 9977, 8405, 8425, 3096,
+ 10767, 9977, 8405, 10269, 0,
+ 10767, 9977, 8405, 10269, 807, 3096,
+ 10767, 9977, 8405, 11127, 592,
+ 10767, 9977, 9345, 10335, 5758,
+ 10767, 9977, 9345, 11363, 5758,
+ 10767, 9977, 9578,
+ 10767, 9977, 10335, 5758,
+ 10767, 9977, 10442,
+ 10767, 9977, 10625, 10335, 5758,
+ 10767, 9977, 13062,
+ 10767, 10223, 8330,
+ 10767, 10267, 6516,
+ 10767, 10267, 6517, 6490,
+ 10767, 10267, 8015, 6490,
+ 10767, 10267, 8153, 3273, 6490,
+ 10767, 10301, 4849, 4388,
+ 10767, 10301, 7443, 4388,
+ 10767, 10388,
+ 10767, 10489, 6617, 6376,
+ 10767, 10677, 4877, 6376,
+ 10767, 10677, 4877, 6490,
+ 10767, 10677, 7708,
+ 10767, 10763, 5551, 9548,
+ 10767, 10763, 6435, 6376,
+ 10767, 10804,
+ 10767, 10805, 6490,
+ 10767, 10969, 8056,
+ 10767, 10969, 8057, 10728,
+ 10767, 10969, 8354,
+ 10767, 10969, 8676,
+ 10767, 10969, 8744,
+ 10767, 10969, 8899, 10441, 10642,
+ 10767, 10969, 9158,
+ 10767, 11097, 6435, 9548,
+ 10767, 11097, 9327, 6121, 3713, 10958,
+ 10767, 11215, 4531, 6490,
+ 10767, 11449, 7908,
+ 10767, 11449, 7909, 6490,
+ 10767, 11459, 8432,
+ 10767, 11647, 6376,
+ 10767, 11765, 9327, 6121, 3713, 10958,
+ 10767, 11845, 4926,
+ 10767, 11900,
+ 10767, 12107, 4531, 6490,
+ 10767, 12394,
+ 10767, 12416,
+ 10767, 12470,
+ 10767, 12498,
+ 10767, 12500,
+ 10767, 12502,
+ 10767, 12901, 5551, 9548,
+ 10767, 12901, 6435, 6376,
+ 10767, 13356,
+ 10767, 13360,
+ 10767, 13365, 8921, 7605, 4926,
+ 10767, 13365, 12341, 7605, 4926,
+ 10771, 6121, 1045, 6376,
+ 10783, 5758,
+ 10789, 5759, 0,
+ 10789, 5759, 1, 7711, 0,
+ 10789, 5759, 1, 7711, 236,
+ 10789, 5759, 1, 7711, 750,
+ 10789, 5759, 1, 7711, 1482,
+ 10789, 5759, 1, 7711, 2486,
+ 10789, 5759, 1, 7711, 4241, 5898,
+ 10789, 5759, 1, 7711, 5030,
+ 10789, 5759, 1, 7711, 7077, 4358,
+ 10789, 5759, 8,
+ 10789, 5759, 9, 5387, 9, 2111, 5387, 2110,
+ 10789, 5759, 9, 7711, 2194,
+ 10789, 5759, 16,
+ 10789, 5759, 17, 0,
+ 10789, 5759, 40,
+ 10789, 5759, 41, 41, 40,
+ 10789, 5759, 41, 1304,
+ 10789, 5759, 41, 5387, 41, 41, 10489, 5387, 41, 10488,
+ 10789, 5759, 41, 5387, 41, 463, 5387, 463, 1221, 5387, 1220,
+ 10789, 5759, 41, 5387, 41, 2593, 5387, 2592,
+ 10789, 5759, 54,
+ 10789, 5759, 60,
+ 10789, 5759, 61, 4358,
+ 10789, 5759, 61, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 61, 7711, 236,
+ 10789, 5759, 61, 7711, 1212,
+ 10789, 5759, 61, 7711, 1483, 4358,
+ 10789, 5759, 61, 7711, 3280,
+ 10789, 5759, 61, 7711, 4125, 4358,
+ 10789, 5759, 61, 7711, 4241, 5898,
+ 10789, 5759, 61, 7711, 4606,
+ 10789, 5759, 61, 7711, 7074,
+ 10789, 5759, 61, 7711, 7534,
+ 10789, 5759, 64,
+ 10789, 5759, 74,
+ 10789, 5759, 75, 7711, 6746,
+ 10789, 5759, 75, 7711, 7545, 5445, 4338,
+ 10789, 5759, 76,
+ 10789, 5759, 77, 7711, 76,
+ 10789, 5759, 77, 7711, 236,
+ 10789, 5759, 77, 7711, 314,
+ 10789, 5759, 77, 7711, 2518,
+ 10789, 5759, 77, 7711, 2836,
+ 10789, 5759, 77, 7711, 4088,
+ 10789, 5759, 77, 7711, 4338,
+ 10789, 5759, 77, 7711, 4706,
+ 10789, 5759, 80,
+ 10789, 5759, 81, 5387, 80,
+ 10789, 5759, 81, 5445, 5043, 9732,
+ 10789, 5759, 81, 5445, 5043, 10377, 81, 5445, 5042,
+ 10789, 5759, 81, 7695, 7710,
+ 10789, 5759, 100,
+ 10789, 5759, 106,
+ 10789, 5759, 107, 7711, 0,
+ 10789, 5759, 107, 7711, 1220,
+ 10789, 5759, 107, 7711, 1483, 4358,
+ 10789, 5759, 112,
+ 10789, 5759, 113, 5387, 113, 60,
+ 10789, 5759, 113, 5387, 113, 596,
+ 10789, 5759, 113, 9967, 112,
+ 10789, 5759, 138,
+ 10789, 5759, 144,
+ 10789, 5759, 152,
+ 10789, 5759, 153, 4358,
+ 10789, 5759, 153, 5387, 152,
+ 10789, 5759, 153, 9684,
+ 10789, 5759, 158,
+ 10789, 5759, 159, 7711, 1, 5445, 237, 5445, 138,
+ 10789, 5759, 159, 7711, 40,
+ 10789, 5759, 159, 7711, 374,
+ 10789, 5759, 159, 7711, 1220,
+ 10789, 5759, 159, 7711, 2488,
+ 10789, 5759, 159, 7711, 2518,
+ 10789, 5759, 172,
+ 10789, 5759, 176,
+ 10789, 5759, 177, 7711, 368,
+ 10789, 5759, 177, 7711, 4240,
+ 10789, 5759, 177, 7711, 4241, 5898,
+ 10789, 5759, 177, 9732,
+ 10789, 5759, 177, 9967, 176,
+ 10789, 5759, 177, 10377, 176,
+ 10789, 5759, 216,
+ 10789, 5759, 217, 4358,
+ 10789, 5759, 224,
+ 10789, 5759, 225, 7711, 8,
+ 10789, 5759, 225, 7711, 40,
+ 10789, 5759, 225, 9967, 224,
+ 10789, 5759, 230,
+ 10789, 5759, 231, 9967, 230,
+ 10789, 5759, 236,
+ 10789, 5759, 237, 4358,
+ 10789, 5759, 237, 5898,
+ 10789, 5759, 242,
+ 10789, 5759, 243, 7711, 40,
+ 10789, 5759, 243, 7711, 736,
+ 10789, 5759, 243, 7711, 750,
+ 10789, 5759, 243, 7711, 1206,
+ 10789, 5759, 243, 7711, 1632,
+ 10789, 5759, 243, 7711, 2110,
+ 10789, 5759, 243, 7711, 2518,
+ 10789, 5759, 243, 7711, 3280,
+ 10789, 5759, 243, 7711, 4094,
+ 10789, 5759, 250,
+ 10789, 5759, 256,
+ 10789, 5759, 262,
+ 10789, 5759, 270,
+ 10789, 5759, 271, 7711, 4241, 5898,
+ 10789, 5759, 272,
+ 10789, 5759, 273, 7711, 5880,
+ 10789, 5759, 273, 9732,
+ 10789, 5759, 273, 9967, 272,
+ 10789, 5759, 273, 10377, 272,
+ 10789, 5759, 274,
+ 10789, 5759, 280,
+ 10789, 5759, 306,
+ 10789, 5759, 307, 7711, 0,
+ 10789, 5759, 307, 7711, 40,
+ 10789, 5759, 307, 7711, 64,
+ 10789, 5759, 307, 7711, 65, 5445, 1682,
+ 10789, 5759, 307, 7711, 106,
+ 10789, 5759, 307, 7711, 216,
+ 10789, 5759, 307, 7711, 224,
+ 10789, 5759, 307, 7711, 230,
+ 10789, 5759, 307, 7711, 272,
+ 10789, 5759, 307, 7711, 314,
+ 10789, 5759, 307, 7711, 340,
+ 10789, 5759, 307, 7711, 354,
+ 10789, 5759, 307, 7711, 368,
+ 10789, 5759, 307, 7711, 369, 5445, 152,
+ 10789, 5759, 307, 7711, 369, 5445, 224,
+ 10789, 5759, 307, 7711, 369, 5445, 560,
+ 10789, 5759, 307, 7711, 374,
+ 10789, 5759, 307, 7711, 375, 5445, 7284,
+ 10789, 5759, 307, 7711, 396,
+ 10789, 5759, 307, 7711, 476,
+ 10789, 5759, 307, 7711, 520,
+ 10789, 5759, 307, 7711, 524,
+ 10789, 5759, 307, 7711, 580,
+ 10789, 5759, 307, 7711, 588,
+ 10789, 5759, 307, 7711, 676,
+ 10789, 5759, 307, 7711, 750,
+ 10789, 5759, 307, 7711, 760,
+ 10789, 5759, 307, 7711, 1212,
+ 10789, 5759, 307, 7711, 1220,
+ 10789, 5759, 307, 7711, 1221, 5445, 5663, 5445, 0,
+ 10789, 5759, 307, 7711, 1482,
+ 10789, 5759, 307, 7711, 1584,
+ 10789, 5759, 307, 7711, 1624,
+ 10789, 5759, 307, 7711, 2110,
+ 10789, 5759, 307, 7711, 2494,
+ 10789, 5759, 307, 7711, 2516,
+ 10789, 5759, 307, 7711, 2518,
+ 10789, 5759, 307, 7711, 2524,
+ 10789, 5759, 307, 7711, 2530,
+ 10789, 5759, 307, 7711, 2654,
+ 10789, 5759, 307, 7711, 2836,
+ 10789, 5759, 307, 7711, 3280,
+ 10789, 5759, 307, 7711, 4166,
+ 10789, 5759, 307, 7711, 4241, 5898,
+ 10789, 5759, 307, 7711, 4334,
+ 10789, 5759, 307, 7711, 4339, 5445, 2494,
+ 10789, 5759, 307, 7711, 4339, 9967, 4338,
+ 10789, 5759, 307, 7711, 4366,
+ 10789, 5759, 307, 7711, 5692,
+ 10789, 5759, 307, 7711, 6049, 7711, 462,
+ 10789, 5759, 307, 7711, 6464,
+ 10789, 5759, 307, 7711, 6746,
+ 10789, 5759, 307, 7711, 7648,
+ 10789, 5759, 314,
+ 10789, 5759, 315, 7711, 40,
+ 10789, 5759, 315, 7711, 588,
+ 10789, 5759, 315, 7711, 750,
+ 10789, 5759, 326,
+ 10789, 5759, 327, 5387, 243, 7711, 3281, 327, 5387, 243, 7711, 3280,
+ 10789, 5759, 332,
+ 10789, 5759, 340,
+ 10789, 5759, 354,
+ 10789, 5759, 355, 7711, 750,
+ 10789, 5759, 364,
+ 10789, 5759, 365, 4358,
+ 10789, 5759, 365, 7711, 5880,
+ 10789, 5759, 368,
+ 10789, 5759, 374,
+ 10789, 5759, 384,
+ 10789, 5759, 385, 5387, 384,
+ 10789, 5759, 392,
+ 10789, 5759, 396,
+ 10789, 5759, 397, 7711, 0,
+ 10789, 5759, 397, 7711, 588,
+ 10789, 5759, 397, 9684,
+ 10789, 5759, 404,
+ 10789, 5759, 405, 7711, 8,
+ 10789, 5759, 416,
+ 10789, 5759, 462,
+ 10789, 5759, 476,
+ 10789, 5759, 477, 7711, 0,
+ 10789, 5759, 477, 7711, 8,
+ 10789, 5759, 477, 7711, 16,
+ 10789, 5759, 477, 7711, 40,
+ 10789, 5759, 477, 7711, 60,
+ 10789, 5759, 477, 7711, 106,
+ 10789, 5759, 477, 7711, 112,
+ 10789, 5759, 477, 7711, 256,
+ 10789, 5759, 477, 7711, 580,
+ 10789, 5759, 477, 9967, 476,
+ 10789, 5759, 510,
+ 10789, 5759, 514,
+ 10789, 5759, 520,
+ 10789, 5759, 524,
+ 10789, 5759, 532,
+ 10789, 5759, 533, 4358,
+ 10789, 5759, 546,
+ 10789, 5759, 547, 5387, 546,
+ 10789, 5759, 556,
+ 10789, 5759, 557, 4358,
+ 10789, 5759, 557, 7711, 242,
+ 10789, 5759, 557, 7711, 374,
+ 10789, 5759, 557, 9898,
+ 10789, 5759, 560,
+ 10789, 5759, 561, 4358,
+ 10789, 5759, 564,
+ 10789, 5759, 565, 5898,
+ 10789, 5759, 576,
+ 10789, 5759, 580,
+ 10789, 5759, 584,
+ 10789, 5759, 588,
+ 10789, 5759, 589, 4358,
+ 10789, 5759, 589, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 589, 7711, 41, 5445, 41, 5445, 41, 4358,
+ 10789, 5759, 589, 7711, 374,
+ 10789, 5759, 589, 7711, 750,
+ 10789, 5759, 589, 8374,
+ 10789, 5759, 589, 9684,
+ 10789, 5759, 589, 9685, 7711, 750,
+ 10789, 5759, 594,
+ 10789, 5759, 595, 7711, 40,
+ 10789, 5759, 595, 7711, 369, 5445, 138,
+ 10789, 5759, 595, 7711, 5662,
+ 10789, 5759, 595, 7711, 7074,
+ 10789, 5759, 596,
+ 10789, 5759, 597, 4358,
+ 10789, 5759, 602,
+ 10789, 5759, 603, 9684,
+ 10789, 5759, 603, 9967, 602,
+ 10789, 5759, 670,
+ 10789, 5759, 671, 5898,
+ 10789, 5759, 671, 9733, 7711, 1696,
+ 10789, 5759, 676,
+ 10789, 5759, 677, 5387, 676,
+ 10789, 5759, 680,
+ 10789, 5759, 702,
+ 10789, 5759, 703, 7711, 369, 5445, 176,
+ 10789, 5759, 703, 7711, 4241, 5898,
+ 10789, 5759, 703, 7711, 5662,
+ 10789, 5759, 703, 7711, 5880,
+ 10789, 5759, 703, 7711, 6464,
+ 10789, 5759, 736,
+ 10789, 5759, 737, 4703, 5898,
+ 10789, 5759, 737, 5387, 737, 5387, 736,
+ 10789, 5759, 737, 5387, 737, 5387, 737, 9967, 737, 5387, 737, 5387, 736,
+ 10789, 5759, 737, 5387, 737, 6013, 5387, 6013, 6013, 5387, 6013, 2194,
+ 10789, 5759, 737, 6313, 5898,
+ 10789, 5759, 750,
+ 10789, 5759, 754,
+ 10789, 5759, 755, 5387, 754,
+ 10789, 5759, 760,
+ 10789, 5759, 832,
+ 10789, 5759, 958,
+ 10789, 5759, 959, 8361, 7711, 1, 5445, 4928,
+ 10789, 5759, 959, 8361, 7711, 106,
+ 10789, 5759, 959, 8361, 7711, 216,
+ 10789, 5759, 959, 8361, 7711, 217, 5445, 4928,
+ 10789, 5759, 959, 8361, 7711, 224,
+ 10789, 5759, 959, 8361, 7711, 236,
+ 10789, 5759, 959, 8361, 7711, 280,
+ 10789, 5759, 959, 8361, 7711, 281, 5445, 354,
+ 10789, 5759, 959, 8361, 7711, 332,
+ 10789, 5759, 959, 8361, 7711, 354,
+ 10789, 5759, 959, 8361, 7711, 355, 5445, 7138,
+ 10789, 5759, 959, 8361, 7711, 396,
+ 10789, 5759, 959, 8361, 7711, 532,
+ 10789, 5759, 959, 8361, 7711, 581, 5445, 4334,
+ 10789, 5759, 959, 8361, 7711, 1304,
+ 10789, 5759, 959, 8361, 7711, 1584,
+ 10789, 5759, 959, 8361, 7711, 1822,
+ 10789, 5759, 959, 8361, 7711, 2195, 5445, 2194,
+ 10789, 5759, 959, 8361, 7711, 2836,
+ 10789, 5759, 959, 8361, 7711, 3256,
+ 10789, 5759, 959, 8361, 7711, 4334,
+ 10789, 5759, 959, 8361, 7711, 5880,
+ 10789, 5759, 959, 8361, 7711, 6464,
+ 10789, 5759, 962,
+ 10789, 5759, 966,
+ 10789, 5759, 1006,
+ 10789, 5759, 1010,
+ 10789, 5759, 1011, 7711, 2518,
+ 10789, 5759, 1012,
+ 10789, 5759, 1013, 8339, 41, 4359, 4094,
+ 10789, 5759, 1050,
+ 10789, 5759, 1051, 7711, 4166,
+ 10789, 5759, 1052,
+ 10789, 5759, 1054,
+ 10789, 5759, 1060,
+ 10789, 5759, 1202,
+ 10789, 5759, 1203, 5387, 1202,
+ 10789, 5759, 1203, 7711, 1, 5445, 139, 5445, 236,
+ 10789, 5759, 1203, 7711, 1, 5445, 236,
+ 10789, 5759, 1203, 7711, 1, 5445, 1482,
+ 10789, 5759, 1203, 7711, 40,
+ 10789, 5759, 1203, 7711, 80,
+ 10789, 5759, 1203, 7711, 138,
+ 10789, 5759, 1203, 7711, 144,
+ 10789, 5759, 1203, 7711, 172,
+ 10789, 5759, 1203, 7711, 173, 5445, 332,
+ 10789, 5759, 1203, 7711, 176,
+ 10789, 5759, 1203, 7711, 177, 7711, 4241, 5898,
+ 10789, 5759, 1203, 7711, 224,
+ 10789, 5759, 1203, 7711, 237, 5445, 355, 5445, 4166,
+ 10789, 5759, 1203, 7711, 243, 5445, 340,
+ 10789, 5759, 1203, 7711, 332,
+ 10789, 5759, 1203, 7711, 369, 5445, 176,
+ 10789, 5759, 1203, 7711, 374,
+ 10789, 5759, 1203, 7711, 462,
+ 10789, 5759, 1203, 7711, 588,
+ 10789, 5759, 1203, 7711, 589, 5445, 152,
+ 10789, 5759, 1203, 7711, 703, 5899, 5445, 2636,
+ 10789, 5759, 1203, 7711, 736,
+ 10789, 5759, 1203, 7711, 750,
+ 10789, 5759, 1203, 7711, 761, 5445, 510,
+ 10789, 5759, 1203, 7711, 832,
+ 10789, 5759, 1203, 7711, 833, 5445, 510,
+ 10789, 5759, 1203, 7711, 1011, 7711, 2518,
+ 10789, 5759, 1203, 7711, 1050,
+ 10789, 5759, 1203, 7711, 1220,
+ 10789, 5759, 1203, 7711, 1272,
+ 10789, 5759, 1203, 7711, 1273, 5445, 0,
+ 10789, 5759, 1203, 7711, 1344,
+ 10789, 5759, 1203, 7711, 1345, 5445, 332,
+ 10789, 5759, 1203, 7711, 1483, 4358,
+ 10789, 5759, 1203, 7711, 1499, 5445, 251, 5445, 736,
+ 10789, 5759, 1203, 7711, 1584,
+ 10789, 5759, 1203, 7711, 1624,
+ 10789, 5759, 1203, 7711, 1625, 5445, 1736,
+ 10789, 5759, 1203, 7711, 1683, 5445, 80,
+ 10789, 5759, 1203, 7711, 2110,
+ 10789, 5759, 1203, 7711, 2111, 5387, 2110,
+ 10789, 5759, 1203, 7711, 2488,
+ 10789, 5759, 1203, 7711, 2494,
+ 10789, 5759, 1203, 7711, 2518,
+ 10789, 5759, 1203, 7711, 2519, 5445, 2766,
+ 10789, 5759, 1203, 7711, 2584,
+ 10789, 5759, 1203, 7711, 3281, 5445, 1212,
+ 10789, 5759, 1203, 7711, 4241, 5898,
+ 10789, 5759, 1203, 7711, 4335, 5445, 546,
+ 10789, 5759, 1203, 7711, 4544,
+ 10789, 5759, 1203, 7711, 5692,
+ 10789, 5759, 1203, 7711, 5880,
+ 10789, 5759, 1203, 7711, 8338,
+ 10789, 5759, 1206,
+ 10789, 5759, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 1212,
+ 10789, 5759, 1213, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 1214,
+ 10789, 5759, 1216,
+ 10789, 5759, 1220,
+ 10789, 5759, 1272,
+ 10789, 5759, 1273, 5387, 1272,
+ 10789, 5759, 1273, 9967, 1272,
+ 10789, 5759, 1302,
+ 10789, 5759, 1303, 4358,
+ 10789, 5759, 1303, 7711, 1584,
+ 10789, 5759, 1303, 7711, 1585, 7711, 1483, 4358,
+ 10789, 5759, 1303, 7711, 2110,
+ 10789, 5759, 1303, 7711, 2489, 5445, 6012,
+ 10789, 5759, 1304,
+ 10789, 5759, 1305, 5387, 1305, 7122,
+ 10789, 5759, 1305, 7711, 1, 5445, 1696,
+ 10789, 5759, 1305, 7711, 1696,
+ 10789, 5759, 1308,
+ 10789, 5759, 1310,
+ 10789, 5759, 1311, 7711, 2518,
+ 10789, 5759, 1316,
+ 10789, 5759, 1344,
+ 10789, 5759, 1482,
+ 10789, 5759, 1483, 514,
+ 10789, 5759, 1483, 1006,
+ 10789, 5759, 1483, 4358,
+ 10789, 5759, 1483, 5387, 1483, 5703, 5387, 5703, 589, 5387, 588,
+ 10789, 5759, 1484,
+ 10789, 5759, 1498,
+ 10789, 5759, 1572,
+ 10789, 5759, 1573, 9967, 1572,
+ 10789, 5759, 1576,
+ 10789, 5759, 1584,
+ 10789, 5759, 1585, 7711, 1483, 4358,
+ 10789, 5759, 1586,
+ 10789, 5759, 1587, 7711, 750,
+ 10789, 5759, 1587, 9967, 1586,
+ 10789, 5759, 1624,
+ 10789, 5759, 1632,
+ 10789, 5759, 1682,
+ 10789, 5759, 1684,
+ 10789, 5759, 1685, 9817, 4212,
+ 10789, 5759, 1686,
+ 10789, 5759, 1688,
+ 10789, 5759, 1689, 4358,
+ 10789, 5759, 1690,
+ 10789, 5759, 1696,
+ 10789, 5759, 1697, 10377, 1696,
+ 10789, 5759, 1736,
+ 10789, 5759, 1737, 7711, 1736,
+ 10789, 5759, 1738,
+ 10789, 5759, 1739, 7711, 1696,
+ 10789, 5759, 1739, 7711, 1697, 5445, 520,
+ 10789, 5759, 1786,
+ 10789, 5759, 1812,
+ 10789, 5759, 1813, 5898,
+ 10789, 5759, 1813, 7711, 76,
+ 10789, 5759, 1813, 7711, 243, 7711, 750,
+ 10789, 5759, 1813, 7711, 272,
+ 10789, 5759, 1813, 7711, 314,
+ 10789, 5759, 1813, 7711, 333, 5445, 736,
+ 10789, 5759, 1813, 7711, 369, 5445, 176,
+ 10789, 5759, 1813, 7711, 396,
+ 10789, 5759, 1813, 7711, 416,
+ 10789, 5759, 1813, 7711, 533, 5445, 736,
+ 10789, 5759, 1813, 7711, 750,
+ 10789, 5759, 1813, 7711, 4166,
+ 10789, 5759, 1813, 7711, 4167, 5898,
+ 10789, 5759, 1813, 7711, 4241, 5898,
+ 10789, 5759, 1813, 7711, 4704,
+ 10789, 5759, 1813, 7711, 4706,
+ 10789, 5759, 1813, 7711, 4707, 5445, 736,
+ 10789, 5759, 1813, 7711, 5761, 5445, 112,
+ 10789, 5759, 1813, 7711, 6012,
+ 10789, 5759, 1813, 7711, 7074,
+ 10789, 5759, 1813, 9684,
+ 10789, 5759, 1813, 9732,
+ 10789, 5759, 1813, 9967, 1812,
+ 10789, 5759, 1813, 10377, 1812,
+ 10789, 5759, 1814,
+ 10789, 5759, 1818,
+ 10789, 5759, 1820,
+ 10789, 5759, 1822,
+ 10789, 5759, 1823, 5387, 1822,
+ 10789, 5759, 1823, 5387, 1823, 1221, 5387, 1220,
+ 10789, 5759, 1852,
+ 10789, 5759, 1856,
+ 10789, 5759, 1864,
+ 10789, 5759, 1896,
+ 10789, 5759, 1922,
+ 10789, 5759, 1950,
+ 10789, 5759, 1951, 4358,
+ 10789, 5759, 1980,
+ 10789, 5759, 1988,
+ 10789, 5759, 1989, 9520,
+ 10789, 5759, 2044,
+ 10789, 5759, 2054,
+ 10789, 5759, 2055, 7711, 1221, 5445, 4241, 5898,
+ 10789, 5759, 2055, 7711, 4241, 5898,
+ 10789, 5759, 2110,
+ 10789, 5759, 2111, 5387, 2110,
+ 10789, 5759, 2111, 5898,
+ 10789, 5759, 2111, 7077, 7711, 1220,
+ 10789, 5759, 2111, 7077, 7711, 2488,
+ 10789, 5759, 2111, 7077, 7711, 2489, 5387, 2111, 7077, 7711, 2488,
+ 10789, 5759, 2111, 7077, 7711, 2836,
+ 10789, 5759, 2111, 7077, 7711, 4928,
+ 10789, 5759, 2111, 9967, 2110,
+ 10789, 5759, 2111, 9967, 2111, 7077, 5387, 7076,
+ 10789, 5759, 2190,
+ 10789, 5759, 2192,
+ 10789, 5759, 2194,
+ 10789, 5759, 2380,
+ 10789, 5759, 2486,
+ 10789, 5759, 2487, 4358,
+ 10789, 5759, 2487, 5387, 2486,
+ 10789, 5759, 2487, 7711, 0,
+ 10789, 5759, 2487, 7711, 152,
+ 10789, 5759, 2487, 7711, 236,
+ 10789, 5759, 2487, 7711, 374,
+ 10789, 5759, 2487, 7711, 580,
+ 10789, 5759, 2487, 7711, 584,
+ 10789, 5759, 2487, 7711, 594,
+ 10789, 5759, 2487, 7711, 602,
+ 10789, 5759, 2487, 7711, 1050,
+ 10789, 5759, 2487, 7711, 1584,
+ 10789, 5759, 2487, 7711, 1696,
+ 10789, 5759, 2487, 7711, 1822,
+ 10789, 5759, 2487, 7711, 2110,
+ 10789, 5759, 2487, 7711, 2488,
+ 10789, 5759, 2487, 7711, 2636,
+ 10789, 5759, 2487, 7711, 2836,
+ 10789, 5759, 2487, 7711, 5692,
+ 10789, 5759, 2487, 9520,
+ 10789, 5759, 2488,
+ 10789, 5759, 2489, 7075, 7711, 3280,
+ 10789, 5759, 2494,
+ 10789, 5759, 2516,
+ 10789, 5759, 2518,
+ 10789, 5759, 2519, 250,
+ 10789, 5759, 2519, 5387, 2519, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 2519, 5387, 2519, 2637, 5387, 2637, 1221, 5387, 1220,
+ 10789, 5759, 2524,
+ 10789, 5759, 2525, 5387, 10267, 2524,
+ 10789, 5759, 2530,
+ 10789, 5759, 2582,
+ 10789, 5759, 2584,
+ 10789, 5759, 2592,
+ 10789, 5759, 2636,
+ 10789, 5759, 2637, 5387, 2637, 405, 5387, 405, 4095, 5387, 4094,
+ 10789, 5759, 2637, 9732,
+ 10789, 5759, 2638,
+ 10789, 5759, 2639, 7711, 106,
+ 10789, 5759, 2639, 7711, 588,
+ 10789, 5759, 2639, 7711, 1304,
+ 10789, 5759, 2639, 7711, 2518,
+ 10789, 5759, 2639, 7711, 2524,
+ 10789, 5759, 2639, 7711, 6012,
+ 10789, 5759, 2654,
+ 10789, 5759, 2694,
+ 10789, 5759, 2698,
+ 10789, 5759, 2699, 5387, 2698,
+ 10789, 5759, 2699, 5387, 2699, 1207, 5387, 1207, 1221, 5387, 1220,
+ 10789, 5759, 2699, 7711, 5880,
+ 10789, 5759, 2758,
+ 10789, 5759, 2760,
+ 10789, 5759, 2766,
+ 10789, 5759, 2767, 5387, 2767, 671, 5387, 670,
+ 10789, 5759, 2822,
+ 10789, 5759, 2823, 7711, 1, 5445, 236,
+ 10789, 5759, 2823, 7711, 1, 5445, 392,
+ 10789, 5759, 2823, 7711, 76,
+ 10789, 5759, 2823, 7711, 236,
+ 10789, 5759, 2823, 7711, 580,
+ 10789, 5759, 2823, 7711, 581, 5445, 106,
+ 10789, 5759, 2823, 7711, 581, 5445, 736,
+ 10789, 5759, 2823, 7711, 2110,
+ 10789, 5759, 2824,
+ 10789, 5759, 2828,
+ 10789, 5759, 2832,
+ 10789, 5759, 2833, 7711, 0,
+ 10789, 5759, 2833, 7711, 41, 5445, 1304,
+ 10789, 5759, 2833, 7711, 216,
+ 10789, 5759, 2833, 7711, 230,
+ 10789, 5759, 2833, 7711, 236,
+ 10789, 5759, 2833, 7711, 272,
+ 10789, 5759, 2833, 7711, 314,
+ 10789, 5759, 2833, 7711, 462,
+ 10789, 5759, 2833, 7711, 576,
+ 10789, 5759, 2833, 7711, 588,
+ 10789, 5759, 2833, 7711, 760,
+ 10789, 5759, 2833, 7711, 1060,
+ 10789, 5759, 2833, 7711, 1212,
+ 10789, 5759, 2833, 7711, 1220,
+ 10789, 5759, 2833, 7711, 1482,
+ 10789, 5759, 2833, 7711, 1498,
+ 10789, 5759, 2833, 7711, 1822,
+ 10789, 5759, 2833, 7711, 1922,
+ 10789, 5759, 2833, 7711, 2518,
+ 10789, 5759, 2833, 7711, 4241, 5898,
+ 10789, 5759, 2833, 7711, 5756,
+ 10789, 5759, 2833, 7711, 7774,
+ 10789, 5759, 2833, 7711, 7954,
+ 10789, 5759, 2836,
+ 10789, 5759, 2837, 7711, 0,
+ 10789, 5759, 2837, 7711, 326,
+ 10789, 5759, 2837, 7711, 1696,
+ 10789, 5759, 2837, 7711, 5880,
+ 10789, 5759, 2840,
+ 10789, 5759, 2841, 7711, 8338,
+ 10789, 5759, 2842,
+ 10789, 5759, 3122,
+ 10789, 5759, 3136,
+ 10789, 5759, 3158,
+ 10789, 5759, 3160,
+ 10789, 5759, 3161, 4703, 5898,
+ 10789, 5759, 3164,
+ 10789, 5759, 3188,
+ 10789, 5759, 3189, 7711, 0,
+ 10789, 5759, 3190,
+ 10789, 5759, 3242,
+ 10789, 5759, 3256,
+ 10789, 5759, 3257, 7711, 2518,
+ 10789, 5759, 3266,
+ 10789, 5759, 3270,
+ 10789, 5759, 3271, 7711, 1696,
+ 10789, 5759, 3280,
+ 10789, 5759, 3698,
+ 10789, 5759, 3820,
+ 10789, 5759, 4088,
+ 10789, 5759, 4094,
+ 10789, 5759, 4122,
+ 10789, 5759, 4124,
+ 10789, 5759, 4125, 4358,
+ 10789, 5759, 4125, 4359, 4358,
+ 10789, 5759, 4126,
+ 10789, 5759, 4132,
+ 10789, 5759, 4154,
+ 10789, 5759, 4156,
+ 10789, 5759, 4164,
+ 10789, 5759, 4166,
+ 10789, 5759, 4174,
+ 10789, 5759, 4175, 7711, 0,
+ 10789, 5759, 4175, 7711, 1, 5445, 1736,
+ 10789, 5759, 4175, 7711, 1, 5445, 1737, 7711, 1736,
+ 10789, 5759, 4175, 7711, 80,
+ 10789, 5759, 4175, 7711, 236,
+ 10789, 5759, 4175, 7711, 237, 4358,
+ 10789, 5759, 4175, 7711, 332,
+ 10789, 5759, 4175, 7711, 340,
+ 10789, 5759, 4175, 7711, 354,
+ 10789, 5759, 4175, 7711, 580,
+ 10789, 5759, 4175, 7711, 588,
+ 10789, 5759, 4175, 7711, 750,
+ 10789, 5759, 4175, 7711, 1483, 4358,
+ 10789, 5759, 4175, 7711, 1682,
+ 10789, 5759, 4175, 7711, 1737, 7711, 1736,
+ 10789, 5759, 4175, 7711, 4125, 4358,
+ 10789, 5759, 4175, 7711, 4125, 4359, 4358,
+ 10789, 5759, 4175, 7711, 8338,
+ 10789, 5759, 4175, 7711, 8339, 9732,
+ 10789, 5759, 4234,
+ 10789, 5759, 4235, 9967, 4234,
+ 10789, 5759, 4240,
+ 10789, 5759, 4241, 5387, 4240,
+ 10789, 5759, 4241, 5898,
+ 10789, 5759, 4241, 9967, 4240,
+ 10789, 5759, 4242,
+ 10789, 5759, 4334,
+ 10789, 5759, 4335, 4358,
+ 10789, 5759, 4336,
+ 10789, 5759, 4337, 7711, 1, 5445, 1482,
+ 10789, 5759, 4337, 7711, 355, 5445, 1482,
+ 10789, 5759, 4337, 7711, 462,
+ 10789, 5759, 4337, 7711, 1482,
+ 10789, 5759, 4337, 7711, 4241, 5898,
+ 10789, 5759, 4338,
+ 10789, 5759, 4339, 5898,
+ 10789, 5759, 4339, 7711, 750,
+ 10789, 5759, 4339, 7711, 5880,
+ 10789, 5759, 4339, 9967, 4338,
+ 10789, 5759, 4366,
+ 10789, 5759, 4544,
+ 10789, 5759, 4545, 7711, 80,
+ 10789, 5759, 4545, 7711, 588,
+ 10789, 5759, 4545, 7711, 1344,
+ 10789, 5759, 4545, 7711, 4884,
+ 10789, 5759, 4545, 7711, 8338,
+ 10789, 5759, 4546,
+ 10789, 5759, 4596,
+ 10789, 5759, 4597, 5387, 4597, 832,
+ 10789, 5759, 4597, 5387, 4597, 9732,
+ 10789, 5759, 4606,
+ 10789, 5759, 4704,
+ 10789, 5759, 4706,
+ 10789, 5759, 4708,
+ 10789, 5759, 4710,
+ 10789, 5759, 4711, 5387, 4710,
+ 10789, 5759, 4714,
+ 10789, 5759, 4716,
+ 10789, 5759, 4764,
+ 10789, 5759, 4884,
+ 10789, 5759, 4928,
+ 10789, 5759, 5030,
+ 10789, 5759, 5031, 5387, 5030,
+ 10789, 5759, 5031, 5387, 5031, 7711, 1, 5445, 392,
+ 10789, 5759, 5031, 7711, 0,
+ 10789, 5759, 5031, 7711, 670,
+ 10789, 5759, 5031, 7711, 1696,
+ 10789, 5759, 5031, 9967, 5030,
+ 10789, 5759, 5042,
+ 10789, 5759, 5043, 7711, 2525, 5898,
+ 10789, 5759, 5043, 10266,
+ 10789, 5759, 5043, 10377, 5042,
+ 10789, 5759, 5044,
+ 10789, 5759, 5278,
+ 10789, 5759, 5662,
+ 10789, 5759, 5663, 7711, 0,
+ 10789, 5759, 5663, 7711, 40,
+ 10789, 5759, 5663, 7711, 41, 5445, 0,
+ 10789, 5759, 5663, 7711, 396,
+ 10789, 5759, 5663, 7711, 750,
+ 10789, 5759, 5663, 7711, 2766,
+ 10789, 5759, 5663, 7711, 4338,
+ 10789, 5759, 5663, 7711, 5720,
+ 10789, 5759, 5664,
+ 10789, 5759, 5682,
+ 10789, 5759, 5692,
+ 10789, 5759, 5693, 7711, 0,
+ 10789, 5759, 5693, 7711, 272,
+ 10789, 5759, 5696,
+ 10789, 5759, 5697, 7711, 0,
+ 10789, 5759, 5697, 7711, 754,
+ 10789, 5759, 5697, 7711, 1012,
+ 10789, 5759, 5697, 7711, 1220,
+ 10789, 5759, 5697, 7711, 1482,
+ 10789, 5759, 5697, 7711, 1483, 4358,
+ 10789, 5759, 5697, 7711, 1820,
+ 10789, 5759, 5697, 7711, 1950,
+ 10789, 5759, 5697, 7711, 2488,
+ 10789, 5759, 5697, 7711, 6534,
+ 10789, 5759, 5697, 7711, 8374,
+ 10789, 5759, 5702,
+ 10789, 5759, 5703, 5387, 5703, 833, 5387, 832,
+ 10789, 5759, 5703, 5898,
+ 10789, 5759, 5720,
+ 10789, 5759, 5756,
+ 10789, 5759, 5757, 5387, 5757, 5720,
+ 10789, 5759, 5760,
+ 10789, 5759, 5840,
+ 10789, 5759, 5852,
+ 10789, 5759, 5880,
+ 10789, 5759, 6012,
+ 10789, 5759, 6046,
+ 10789, 5759, 6048,
+ 10789, 5759, 6049, 7711, 462,
+ 10789, 5759, 6049, 7711, 8338,
+ 10789, 5759, 6054,
+ 10789, 5759, 6062,
+ 10789, 5759, 6064,
+ 10789, 5759, 6256,
+ 10789, 5759, 6318,
+ 10789, 5759, 6396,
+ 10789, 5759, 6412,
+ 10789, 5759, 6430,
+ 10789, 5759, 6436,
+ 10789, 5759, 6464,
+ 10789, 5759, 6466,
+ 10789, 5759, 6534,
+ 10789, 5759, 6535, 5387, 6534,
+ 10789, 5759, 6648,
+ 10789, 5759, 6650,
+ 10789, 5759, 6708,
+ 10789, 5759, 6746,
+ 10789, 5759, 6818,
+ 10789, 5759, 6854,
+ 10789, 5759, 6860,
+ 10789, 5759, 6884,
+ 10789, 5759, 7040,
+ 10789, 5759, 7054,
+ 10789, 5759, 7074,
+ 10789, 5759, 7075, 7711, 0,
+ 10789, 5759, 7075, 7711, 1, 5445, 139, 5445, 236,
+ 10789, 5759, 7075, 7711, 1, 5445, 1220,
+ 10789, 5759, 7075, 7711, 1, 5445, 1736,
+ 10789, 5759, 7075, 7711, 40,
+ 10789, 5759, 7075, 7711, 41, 5445, 0,
+ 10789, 5759, 7075, 7711, 41, 5445, 41, 5445, 40,
+ 10789, 5759, 7075, 7711, 76,
+ 10789, 5759, 7075, 7711, 80,
+ 10789, 5759, 7075, 7711, 106,
+ 10789, 5759, 7075, 7711, 176,
+ 10789, 5759, 7075, 7711, 216,
+ 10789, 5759, 7075, 7711, 236,
+ 10789, 5759, 7075, 7711, 243, 7711, 2110,
+ 10789, 5759, 7075, 7711, 272,
+ 10789, 5759, 7075, 7711, 273, 5445, 236,
+ 10789, 5759, 7075, 7711, 273, 5445, 354,
+ 10789, 5759, 7075, 7711, 314,
+ 10789, 5759, 7075, 7711, 354,
+ 10789, 5759, 7075, 7711, 368,
+ 10789, 5759, 7075, 7711, 369, 5445, 176,
+ 10789, 5759, 7075, 7711, 396,
+ 10789, 5759, 7075, 7711, 561, 5445, 1, 5445, 547, 5445, 392,
+ 10789, 5759, 7075, 7711, 581, 5445, 736,
+ 10789, 5759, 7075, 7711, 588,
+ 10789, 5759, 7075, 7711, 737, 6313, 5898,
+ 10789, 5759, 7075, 7711, 750,
+ 10789, 5759, 7075, 7711, 966,
+ 10789, 5759, 7075, 7711, 1220,
+ 10789, 5759, 7075, 7711, 1304,
+ 10789, 5759, 7075, 7711, 1305, 5445, 1304,
+ 10789, 5759, 7075, 7711, 1344,
+ 10789, 5759, 7075, 7711, 1483, 4358,
+ 10789, 5759, 7075, 7711, 1632,
+ 10789, 5759, 7075, 7711, 1682,
+ 10789, 5759, 7075, 7711, 1688,
+ 10789, 5759, 7075, 7711, 1689, 5445, 243, 5445, 0,
+ 10789, 5759, 7075, 7711, 1820,
+ 10789, 5759, 7075, 7711, 2519, 5445, 2584,
+ 10789, 5759, 7075, 7711, 2584,
+ 10789, 5759, 7075, 7711, 2638,
+ 10789, 5759, 7075, 7711, 2836,
+ 10789, 5759, 7075, 7711, 4884,
+ 10789, 5759, 7075, 7711, 5030,
+ 10789, 5759, 7075, 7711, 5720,
+ 10789, 5759, 7075, 7711, 5721, 5445, 5720,
+ 10789, 5759, 7075, 7711, 5880,
+ 10789, 5759, 7075, 7711, 7074,
+ 10789, 5759, 7075, 7711, 7545, 5445, 4339, 5445, 6746,
+ 10789, 5759, 7075, 7711, 7545, 5445, 4339, 5898,
+ 10789, 5759, 7075, 9732,
+ 10789, 5759, 7076,
+ 10789, 5759, 7077, 4358,
+ 10789, 5759, 7077, 4359, 5387, 7077, 4359, 2518,
+ 10789, 5759, 7077, 7711, 2518,
+ 10789, 5759, 7077, 7711, 2519, 5445, 2584,
+ 10789, 5759, 7122,
+ 10789, 5759, 7123, 5387, 7122,
+ 10789, 5759, 7123, 9684,
+ 10789, 5759, 7123, 10377, 7122,
+ 10789, 5759, 7138,
+ 10789, 5759, 7196,
+ 10789, 5759, 7197, 4358,
+ 10789, 5759, 7197, 7711, 0,
+ 10789, 5759, 7197, 7711, 1, 5445, 144,
+ 10789, 5759, 7197, 7711, 144,
+ 10789, 5759, 7204,
+ 10789, 5759, 7248,
+ 10789, 5759, 7284,
+ 10789, 5759, 7285, 703, 7711, 106,
+ 10789, 5759, 7285, 703, 7711, 332,
+ 10789, 5759, 7285, 703, 7711, 396,
+ 10789, 5759, 7285, 703, 7711, 580,
+ 10789, 5759, 7285, 703, 7711, 1052,
+ 10789, 5759, 7285, 703, 7711, 1304,
+ 10789, 5759, 7285, 703, 7711, 1483, 4358,
+ 10789, 5759, 7285, 703, 7711, 4706,
+ 10789, 5759, 7285, 703, 7711, 7572,
+ 10789, 5759, 7285, 703, 7711, 7954,
+ 10789, 5759, 7285, 8361, 7711, 106,
+ 10789, 5759, 7285, 8361, 7711, 107, 40,
+ 10789, 5759, 7364,
+ 10789, 5759, 7374,
+ 10789, 5759, 7375, 7711, 588,
+ 10789, 5759, 7375, 7711, 670,
+ 10789, 5759, 7375, 7711, 1586,
+ 10789, 5759, 7375, 10377, 7374,
+ 10789, 5759, 7510,
+ 10789, 5759, 7516,
+ 10789, 5759, 7528,
+ 10789, 5759, 7534,
+ 10789, 5759, 7544,
+ 10789, 5759, 7572,
+ 10789, 5759, 7648,
+ 10789, 5759, 7762,
+ 10789, 5759, 7774,
+ 10789, 5759, 7775, 7711, 40,
+ 10789, 5759, 7778,
+ 10789, 5759, 7890,
+ 10789, 5759, 7954,
+ 10789, 5759, 7966,
+ 10789, 5759, 8242,
+ 10789, 5759, 8276,
+ 10789, 5759, 8338,
+ 10789, 5759, 8339, 5387, 8339, 7075, 7711, 41, 5387, 7075, 7711, 40,
+ 10789, 5759, 8339, 7075, 7711, 41, 5387, 7075, 7711, 40,
+ 10789, 5759, 8360,
+ 10789, 5759, 8361, 5387, 8360,
+ 10789, 5759, 8374,
+ 10789, 5759, 8376,
+ 10789, 5759, 8382,
+ 10789, 5759, 8408,
+ 10789, 5759, 8490,
+ 10789, 5759, 8494,
+ 10789, 5759, 8512,
+ 10789, 5759, 8513, 7711, 80,
+ 10789, 5759, 8513, 7711, 369, 5445, 4241, 5898,
+ 10789, 5759, 8513, 7711, 396,
+ 10789, 5759, 8513, 7711, 581, 5445, 736,
+ 10789, 5759, 8513, 7711, 736,
+ 10789, 5759, 8513, 7711, 737, 5445, 736,
+ 10789, 5759, 8513, 7711, 1304,
+ 10789, 5759, 8513, 7711, 2110,
+ 10789, 5759, 8513, 7711, 2518,
+ 10789, 5759, 8513, 7711, 2519, 5445, 1, 80,
+ 10789, 5759, 8513, 7711, 2519, 5445, 736,
+ 10789, 5759, 8513, 7711, 2519, 5445, 737, 5445, 736,
+ 10789, 5759, 8513, 7711, 2836,
+ 10789, 5759, 8664,
+ 10789, 5759, 8702,
+ 10789, 5759, 8706,
+ 10789, 5759, 8710,
+ 10789, 5759, 8764,
+ 10789, 5759, 8902,
+ 10789, 5759, 9306,
+ 10789, 5759, 9307, 7711, 1696,
+ 10789, 5759, 10518,
+ 10789, 9515, 5759, 2167, 9897, 2171, 7574,
+ 10789, 9515, 5759, 2167, 9897, 2171, 9614,
+ 10789, 9515, 5759, 2171, 3704,
+ 10789, 9515, 5759, 2171, 3822,
+ 10789, 9515, 5759, 2171, 6756,
+ 10789, 9515, 5759, 2171, 6830,
+ 10789, 9515, 5759, 2171, 6832,
+ 10789, 9515, 5759, 2171, 7520,
+ 10789, 9515, 5759, 2171, 7687, 4094,
+ 10789, 9515, 5759, 2171, 7687, 9817, 4213, 0,
+ 10789, 9515, 5759, 2171, 8159, 736,
+ 10789, 9515, 5759, 2171, 9615, 736,
+ 10789, 9515, 5759, 2541, 40,
+ 10789, 9515, 5759, 2541, 736,
+ 10789, 9515, 5759, 2541, 737, 5898,
+ 10789, 9515, 5759, 2541, 4094,
+ 10789, 9515, 5759, 2541, 6830,
+ 10789, 9515, 5759, 2541, 7516,
+ 10789, 9515, 5759, 2541, 9817, 4213, 3282,
+ 10789, 9515, 5759, 2779, 736,
+ 10789, 9515, 5759, 2779, 737, 5898,
+ 10789, 9515, 5759, 2779, 3704,
+ 10789, 9515, 5759, 2779, 3822,
+ 10789, 9515, 5759, 2779, 6756,
+ 10789, 9515, 5759, 2779, 6830,
+ 10789, 9515, 5759, 2779, 6832,
+ 10789, 9515, 5759, 2779, 7516,
+ 10789, 9515, 5759, 2779, 7520,
+ 10789, 9515, 5759, 2779, 8819, 4094,
+ 10789, 9515, 5759, 2779, 8819, 9817, 4213, 0,
+ 10789, 9515, 5759, 4201, 40,
+ 10789, 9515, 5759, 4201, 736,
+ 10789, 9515, 5759, 4201, 737, 5898,
+ 10789, 9515, 5759, 4201, 3704,
+ 10789, 9515, 5759, 4201, 3705, 9817, 4212,
+ 10789, 9515, 5759, 4201, 3822,
+ 10789, 9515, 5759, 4201, 4094,
+ 10789, 9515, 5759, 4201, 6830,
+ 10789, 9515, 5759, 4201, 6832,
+ 10789, 9515, 5759, 4201, 7516,
+ 10789, 9515, 5759, 4201, 7520,
+ 10789, 9515, 5759, 4201, 8719, 4094,
+ 10789, 9515, 5759, 4215, 40,
+ 10789, 9515, 5759, 4215, 736,
+ 10789, 9515, 5759, 4215, 737, 5898,
+ 10789, 9515, 5759, 4215, 3704,
+ 10789, 9515, 5759, 4215, 3705, 9817, 4212,
+ 10789, 9515, 5759, 4215, 3822,
+ 10789, 9515, 5759, 4215, 4094,
+ 10789, 9515, 5759, 4215, 6830,
+ 10789, 9515, 5759, 4215, 6832,
+ 10789, 9515, 5759, 4215, 7516,
+ 10789, 9515, 5759, 4215, 7520,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7106,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7107, 0,
+ 10789, 9515, 5759, 4215, 9817, 4213, 7107, 2,
+ 10789, 9515, 5759, 4215, 9817, 4213, 8410,
+ 10789, 9515, 5759, 5191, 40,
+ 10789, 9515, 5759, 5191, 736,
+ 10789, 9515, 5759, 5191, 4094,
+ 10789, 9515, 5759, 5191, 6830,
+ 10789, 9515, 5759, 5191, 7516,
+ 10789, 9515, 5759, 5191, 9817, 4213, 8310,
+ 10789, 9515, 5759, 5191, 9817, 4213, 8311, 0,
+ 10789, 9515, 5759, 5191, 9817, 4213, 9354,
+ 10789, 9515, 5759, 5191, 9817, 4213, 9356,
+ 10789, 9515, 5759, 6723, 40,
+ 10789, 9515, 5759, 6723, 736,
+ 10789, 9515, 5759, 6723, 4094,
+ 10789, 9515, 5759, 6723, 6830,
+ 10789, 9515, 5759, 6723, 7516,
+ 10789, 9515, 5759, 6723, 9817, 4213, 6066,
+ 10789, 9515, 5759, 6723, 9817, 4213, 7776,
+ 10789, 9515, 5759, 7509, 40,
+ 10789, 9515, 5759, 7509, 736,
+ 10789, 9515, 5759, 7509, 4094,
+ 10789, 9515, 5759, 7509, 6830,
+ 10789, 9515, 5759, 7509, 7516,
+ 10789, 9515, 5759, 7509, 9817, 4213, 4607, 0,
+ 10789, 9515, 5759, 7509, 9817, 4213, 4607, 2,
+ 10789, 9515, 5759, 7509, 9817, 4213, 6990,
+ 10789, 9515, 5759, 7517, 7711, 1213, 5445, 1922,
+ 10789, 9515, 5759, 7517, 7711, 1213, 5445, 4094,
+ 10789, 9515, 5759, 7695, 736,
+ 10789, 9515, 5759, 7695, 737, 5898,
+ 10789, 9515, 5759, 7695, 3704,
+ 10789, 9515, 5759, 7695, 3822,
+ 10789, 9515, 5759, 7695, 3823, 9817, 4212,
+ 10789, 9515, 5759, 7695, 4094,
+ 10789, 9515, 5759, 7695, 6830,
+ 10789, 9515, 5759, 7695, 6832,
+ 10789, 9515, 5759, 7695, 7516,
+ 10789, 9515, 5759, 7695, 7517, 9817, 4212,
+ 10789, 9515, 5759, 7695, 7520,
+ 10789, 9515, 5759, 7695, 7521, 9817, 4212,
+ 10789, 9515, 5759, 7695, 9817, 4213, 6752,
+ 10789, 9515, 5759, 7695, 9817, 4213, 6754,
+ 10789, 9515, 5759, 11136,
+ 10789, 9515, 5759, 11138,
+ 10789, 12133, 5759, 2167, 9897, 6129, 9178,
+ 10789, 12133, 5759, 10001, 6610,
+ 10789, 12133, 5759, 10001, 10644,
+ 10789, 12133, 5759, 10677, 6610,
+ 10797, 8775, 7101, 601, 721, 11648,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 6104,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 8056,
+ 10797, 8775, 7101, 601, 721, 11649, 6121, 10642,
+ 10797, 8775, 7101, 4117, 721, 11648,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 6104,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 8056,
+ 10797, 8775, 7101, 4117, 721, 11649, 6121, 10642,
+ 10797, 8775, 7101, 10677, 721, 2725, 4848,
+ 10797, 8775, 7101, 10677, 721, 2725, 7442,
+ 10797, 8775, 7101, 10677, 721, 6104,
+ 10797, 8775, 7101, 10677, 721, 8005, 4848,
+ 10797, 8775, 7101, 10677, 721, 8005, 7442,
+ 10797, 8775, 7101, 10677, 6121, 8056,
+ 10797, 8775, 7101, 10677, 6121, 10642,
+ 10804,
+ 10817, 8548,
+ 10959, 2779, 8289, 6434,
+ 10959, 6434,
+ 10959, 6435, 569, 760,
+ 10959, 6435, 4221, 760,
+ 10959, 6435, 6121, 2697, 11096,
+ 10959, 6435, 6121, 2697, 11764,
+ 10959, 6435, 6121, 8077, 11096,
+ 10959, 6435, 6121, 8153, 8758,
+ 10959, 6435, 6121, 11649, 8758,
+ 10959, 6435, 11097, 429, 9811, 6434,
+ 10959, 6505, 6434,
+ 10959, 7821, 6434,
+ 10959, 7924,
+ 10959, 8097, 6434,
+ 10959, 8153, 6434,
+ 10959, 8561, 7944,
+ 10959, 8849, 6434,
+ 10959, 8963, 6434,
+ 10959, 9327, 6121, 3713, 4849, 569, 760,
+ 10959, 9327, 6121, 3713, 4849, 4221, 760,
+ 10959, 9327, 6121, 3713, 4849, 7991, 9811, 9327, 6121, 3713, 7442,
+ 10959, 9327, 6121, 3713, 4849, 7991, 10959, 9327, 6121, 3713, 7442,
+ 10959, 9327, 6121, 3713, 7443, 569, 760,
+ 10959, 9327, 6121, 3713, 7443, 4221, 760,
+ 10959, 9327, 6121, 3713, 11096,
+ 10959, 9327, 6121, 3713, 11764,
+ 10959, 11191, 6434,
+ 10963, 9120,
+ 10977, 8774,
+ 10978,
+ 10989, 5758,
+ 11011, 1809, 4876,
+ 11011, 2091, 5758,
+ 11011, 2941, 5758,
+ 11011, 3055, 5758,
+ 11011, 3873, 5758,
+ 11011, 4223, 5836,
+ 11011, 4849, 6627, 9050,
+ 11011, 4849, 7821, 12114,
+ 11011, 4849, 8745, 9050,
+ 11011, 4849, 12114,
+ 11011, 5445, 5758,
+ 11011, 6610,
+ 11011, 6616,
+ 11011, 6689, 2170,
+ 11011, 6689, 2540,
+ 11011, 6689, 2778,
+ 11011, 6689, 4200,
+ 11011, 6689, 4214,
+ 11011, 6689, 5190,
+ 11011, 6689, 6260,
+ 11011, 6689, 6722,
+ 11011, 6689, 7508,
+ 11011, 6689, 7694,
+ 11011, 6875, 7908,
+ 11011, 7089, 7593, 8405, 0,
+ 11011, 7089, 7593, 8405, 2,
+ 11011, 7089, 7593, 8405, 4,
+ 11011, 7089, 7593, 8405, 6,
+ 11011, 7089, 7593, 8405, 8,
+ 11011, 7089, 7593, 8405, 10,
+ 11011, 7089, 7593, 8405, 12,
+ 11011, 7089, 7593, 8405, 14,
+ 11011, 7089, 7593, 8405, 16,
+ 11011, 7089, 7593, 8405, 18,
+ 11011, 7089, 7593, 8405, 20,
+ 11011, 7089, 7593, 8405, 22,
+ 11011, 7089, 7593, 8405, 24,
+ 11011, 7089, 7593, 8405, 26,
+ 11011, 7089, 7593, 8405, 28,
+ 11011, 7089, 7593, 8405, 30,
+ 11011, 7089, 7593, 8405, 32,
+ 11011, 7089, 7593, 8405, 34,
+ 11011, 7089, 7593, 8405, 36,
+ 11011, 7089, 7593, 8405, 38,
+ 11011, 7089, 7593, 8405, 40,
+ 11011, 7089, 7593, 8405, 42,
+ 11011, 7089, 7593, 8405, 44,
+ 11011, 7089, 7593, 8405, 46,
+ 11011, 7089, 7593, 8405, 48,
+ 11011, 7089, 7593, 8405, 50,
+ 11011, 7089, 9063, 8405, 0,
+ 11011, 7089, 9063, 8405, 2,
+ 11011, 7089, 9063, 8405, 4,
+ 11011, 7089, 9063, 8405, 6,
+ 11011, 7089, 9063, 8405, 8,
+ 11011, 7089, 9063, 8405, 10,
+ 11011, 7089, 9063, 8405, 12,
+ 11011, 7089, 9063, 8405, 14,
+ 11011, 7089, 9063, 8405, 16,
+ 11011, 7089, 9063, 8405, 18,
+ 11011, 7089, 9063, 8405, 20,
+ 11011, 7089, 9063, 8405, 22,
+ 11011, 7089, 9063, 8405, 24,
+ 11011, 7089, 9063, 8405, 26,
+ 11011, 7089, 9063, 8405, 28,
+ 11011, 7089, 9063, 8405, 30,
+ 11011, 7089, 9063, 8405, 32,
+ 11011, 7089, 9063, 8405, 34,
+ 11011, 7089, 9063, 8405, 36,
+ 11011, 7089, 9063, 8405, 38,
+ 11011, 7089, 9063, 8405, 40,
+ 11011, 7089, 9063, 8405, 42,
+ 11011, 7089, 9063, 8405, 44,
+ 11011, 7089, 9063, 8405, 46,
+ 11011, 7089, 9063, 8405, 48,
+ 11011, 7089, 9063, 8405, 50,
+ 11011, 7387, 5758,
+ 11011, 7443, 6627, 9050,
+ 11011, 7443, 7821, 12114,
+ 11011, 7443, 8745, 9050,
+ 11011, 7443, 12114,
+ 11011, 7708,
+ 11011, 8017, 760,
+ 11011, 8129, 5758,
+ 11011, 8167, 5758,
+ 11011, 8432,
+ 11011, 8525, 5758,
+ 11011, 9581, 5758,
+ 11011, 9633, 9718,
+ 11011, 9718,
+ 11011, 9898,
+ 11011, 10469, 4926,
+ 11011, 10677, 4876,
+ 11011, 10708,
+ 11011, 11099, 5758,
+ 11011, 11195, 4926,
+ 11011, 11224,
+ 11011, 11424,
+ 11011, 11449, 7908,
+ 11011, 11451, 90,
+ 11011, 12017, 4926,
+ 11011, 12473, 5758,
+ 11011, 12478,
+ 11015, 11740,
+ 11031, 4849, 8077, 9050,
+ 11031, 6505, 8744,
+ 11031, 6801, 7101, 10676,
+ 11031, 7443, 8077, 9050,
+ 11031, 7821, 8056,
+ 11031, 8287, 8206,
+ 11031, 8287, 8405, 0,
+ 11031, 8287, 8405, 8,
+ 11031, 8287, 8405, 16,
+ 11031, 8287, 8405, 28,
+ 11031, 8287, 8405, 40,
+ 11031, 8287, 8405, 66,
+ 11031, 8287, 8405, 178,
+ 11031, 8287, 8405, 188,
+ 11031, 8287, 8405, 426,
+ 11031, 8287, 8405, 622,
+ 11031, 8287, 8405, 626,
+ 11031, 8287, 8405, 630,
+ 11031, 8287, 8405, 652,
+ 11031, 8287, 8405, 654,
+ 11031, 8287, 8405, 656,
+ 11031, 8287, 8405, 660,
+ 11031, 8287, 8405, 664,
+ 11031, 8287, 8405, 2908,
+ 11031, 8287, 8405, 2926,
+ 11031, 8287, 8405, 3012,
+ 11031, 8287, 8405, 3056,
+ 11031, 8287, 8405, 5770,
+ 11031, 8287, 8405, 6594,
+ 11031, 8287, 8405, 6912,
+ 11031, 8287, 8405, 6982,
+ 11031, 8287, 8405, 7166,
+ 11031, 8287, 8405, 7244,
+ 11031, 8287, 8405, 7372,
+ 11031, 8287, 8405, 7440,
+ 11031, 8287, 8405, 8362,
+ 11031, 8287, 8405, 8828,
+ 11031, 8287, 8405, 9086,
+ 11031, 8287, 8405, 9400,
+ 11031, 8287, 8405, 9588,
+ 11031, 8287, 8405, 9780,
+ 11031, 8287, 8405, 11248,
+ 11031, 8287, 8405, 11728,
+ 11031, 8287, 8405, 11758,
+ 11031, 8287, 8405, 11824,
+ 11031, 8287, 8405, 11832,
+ 11031, 8287, 8405, 12070,
+ 11031, 8287, 8405, 12094,
+ 11031, 8287, 8405, 12096,
+ 11031, 8287, 8405, 12144,
+ 11031, 8287, 8405, 12146,
+ 11031, 8287, 8405, 12150,
+ 11031, 8287, 8405, 12350,
+ 11031, 8287, 8405, 12352,
+ 11031, 8287, 8405, 12532,
+ 11031, 8287, 8405, 13006,
+ 11031, 8287, 8405, 13008,
+ 11031, 9811, 6434,
+ 11031, 10283, 8405, 0,
+ 11031, 10283, 8405, 8,
+ 11031, 10283, 8405, 16,
+ 11031, 10283, 8405, 26,
+ 11031, 10283, 8405, 28,
+ 11031, 10283, 8405, 40,
+ 11031, 10283, 8405, 236,
+ 11031, 10283, 8405, 238,
+ 11031, 10283, 8405, 242,
+ 11031, 10283, 8405, 246,
+ 11031, 10283, 8405, 250,
+ 11031, 10283, 8405, 306,
+ 11031, 10283, 8405, 310,
+ 11031, 10283, 8405, 314,
+ 11031, 10283, 8405, 322,
+ 11031, 10283, 8405, 326,
+ 11031, 10283, 8405, 364,
+ 11031, 10283, 8405, 368,
+ 11031, 10283, 8405, 374,
+ 11031, 10283, 8405, 380,
+ 11031, 10283, 8405, 384,
+ 11031, 10283, 8405, 392,
+ 11031, 10283, 8405, 396,
+ 11031, 10283, 8405, 404,
+ 11031, 10283, 8405, 412,
+ 11031, 10283, 8405, 416,
+ 11031, 10283, 8405, 510,
+ 11031, 10283, 8405, 512,
+ 11031, 10283, 8405, 514,
+ 11031, 10283, 8405, 516,
+ 11031, 10283, 8405, 520,
+ 11031, 10283, 8405, 524,
+ 11031, 10283, 8405, 526,
+ 11031, 10283, 8405, 532,
+ 11031, 10283, 8405, 536,
+ 11031, 10283, 8405, 546,
+ 11031, 10283, 8405, 556,
+ 11031, 10283, 8405, 560,
+ 11031, 10283, 8405, 564,
+ 11031, 10283, 8405, 568,
+ 11031, 10283, 8405, 576,
+ 11031, 10283, 8405, 622,
+ 11031, 10283, 8405, 632,
+ 11031, 10283, 8405, 652,
+ 11031, 10283, 8405, 660,
+ 11031, 10283, 8405, 664,
+ 11031, 10283, 8405, 7593, 0,
+ 11031, 10283, 8405, 7593, 8,
+ 11031, 10283, 8405, 7593, 16,
+ 11031, 10283, 8405, 7593, 28,
+ 11031, 10283, 8405, 7593, 40,
+ 11031, 10283, 8405, 7593, 576,
+ 11031, 10283, 8405, 7593, 652,
+ 11031, 10283, 8405, 7593, 660,
+ 11031, 10283, 8405, 7593, 664,
+ 11031, 10283, 8473, 1044,
+ 11031, 10283, 8921, 7605, 4926,
+ 11031, 10283, 12341, 7605, 4926,
+ 11031, 10959, 6434,
+ 11031, 11097, 6434,
+ 11031, 11765, 6434,
+ 11031, 12043, 4223, 5836,
+ 11031, 12043, 6616,
+ 11031, 13365, 11185, 7605, 4926,
+ 11035, 10773, 8456,
+ 11036,
+ 11041, 568,
+ 11041, 569, 721, 9705, 10410,
+ 11041, 6121, 1045, 6376,
+ 11051, 88,
+ 11052,
+ 11061, 8774,
+ 11063, 5444,
+ 11063, 7710,
+ 11063, 11228,
+ 11093, 731, 12901, 6434,
+ 11097, 2779, 8289, 6434,
+ 11097, 6105, 6434,
+ 11097, 6434,
+ 11097, 6435, 569, 760,
+ 11097, 6435, 569, 761, 5387, 11765, 6435, 569, 760,
+ 11097, 6435, 569, 6505, 9158,
+ 11097, 6435, 4221, 760,
+ 11097, 6435, 4221, 761, 569, 6505, 9158,
+ 11097, 6435, 5387, 11765, 6434,
+ 11097, 6435, 6121, 2697, 9810,
+ 11097, 6435, 6121, 2697, 10958,
+ 11097, 6435, 6121, 4530,
+ 11097, 6435, 6121, 4896,
+ 11097, 6435, 6121, 5445, 6490,
+ 11097, 6435, 6121, 5878,
+ 11097, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11097, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11097, 6435, 6121, 8151, 5832,
+ 11097, 6435, 6121, 8153, 10677, 8758,
+ 11097, 6435, 6121, 8758,
+ 11097, 6435, 6121, 10677, 8758,
+ 11097, 6435, 6377, 7551, 11765, 6434,
+ 11097, 6435, 6377, 7709, 10374,
+ 11097, 6435, 6377, 7919, 6741, 568,
+ 11097, 6435, 6377, 9633, 7709, 10374,
+ 11097, 6435, 6377, 9633, 7919, 6741, 568,
+ 11097, 6435, 9785, 46,
+ 11097, 6435, 9785, 8762,
+ 11097, 6435, 9785, 11098,
+ 11097, 6505, 6434,
+ 11097, 7821, 6434,
+ 11097, 8097, 6434,
+ 11097, 8153, 3993, 6434,
+ 11097, 8153, 6434,
+ 11097, 8153, 6435, 4221, 760,
+ 11097, 8153, 6435, 6121, 8758,
+ 11097, 8153, 6435, 6121, 10677, 8758,
+ 11097, 8153, 11430,
+ 11097, 8561, 7944,
+ 11097, 8849, 3993, 6434,
+ 11097, 8849, 6434,
+ 11097, 9327, 5387, 11765, 9326,
+ 11097, 9327, 6121, 3713, 601, 569, 760,
+ 11097, 9327, 6121, 3713, 601, 4221, 760,
+ 11097, 9327, 6121, 3713, 601, 6377, 4895, 3992,
+ 11097, 9327, 6121, 3713, 601, 6377, 11097, 9327, 6121, 3713, 4116,
+ 11097, 9327, 6121, 3713, 601, 6377, 11765, 9327, 6121, 3713, 600,
+ 11097, 9327, 6121, 3713, 4117, 569, 760,
+ 11097, 9327, 6121, 3713, 4117, 4221, 760,
+ 11097, 9327, 6121, 3713, 4117, 6377, 11765, 9327, 6121, 3713, 4116,
+ 11097, 9327, 6121, 3713, 4117, 6491, 4895, 3992,
+ 11097, 9327, 6121, 3713, 9810,
+ 11097, 9327, 6121, 3713, 10958,
+ 11097, 10531, 6434,
+ 11097, 11191, 6434,
+ 11097, 11430,
+ 11097, 11875, 6435, 4221, 760,
+ 11097, 11875, 6435, 6121, 5878,
+ 11097, 11875, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11097, 11875, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11097, 11875, 6435, 6121, 8153, 10677, 8758,
+ 11097, 11875, 6435, 6121, 10677, 8758,
+ 11097, 11875, 8849, 3993, 6434,
+ 11097, 12103, 6434,
+ 11099, 445, 6741, 568,
+ 11099, 445, 9705, 6741, 568,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 6376,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 6377, 7442,
+ 11099, 445, 9705, 6741, 569, 6121, 1045, 8318,
+ 11099, 445, 11621, 568,
+ 11099, 445, 11896,
+ 11099, 445, 12472,
+ 11099, 721, 2091, 11896,
+ 11099, 721, 12345, 2091, 6741, 568,
+ 11099, 835, 2091, 6741, 568,
+ 11099, 835, 2091, 11621, 568,
+ 11099, 5387, 6741, 568,
+ 11099, 5758,
+ 11099, 6121, 1044,
+ 11099, 6121, 8057, 8318,
+ 11099, 6121, 10469, 4927, 6376,
+ 11099, 6377, 9693, 445, 6740,
+ 11099, 6377, 9693, 6377, 12472,
+ 11099, 6377, 9705, 6741, 6377, 12473, 6377, 9705, 6740,
+ 11099, 6377, 11097, 6434,
+ 11099, 6377, 12007, 6741, 6377, 12472,
+ 11099, 6377, 12473, 6377, 12007, 6740,
+ 11099, 6741, 569, 445, 12472,
+ 11099, 8065, 115, 6628,
+ 11099, 8065, 115, 6629, 6377, 9705, 6740,
+ 11104,
+ 11111, 93, 8399, 4926,
+ 11111, 3997, 4926,
+ 11111, 5759, 8916,
+ 11111, 5759, 9824,
+ 11111, 5759, 9870,
+ 11111, 5759, 9904,
+ 11111, 6689, 2170,
+ 11111, 6689, 2540,
+ 11111, 6689, 2778,
+ 11111, 6689, 4200,
+ 11111, 6689, 4214,
+ 11111, 6689, 5190,
+ 11111, 6689, 6260,
+ 11111, 6689, 6722,
+ 11111, 6689, 7508,
+ 11111, 6689, 7694,
+ 11111, 7803, 5759, 8,
+ 11111, 7803, 5759, 16,
+ 11111, 7803, 5759, 28,
+ 11111, 7803, 5759, 40,
+ 11111, 7803, 5759, 58,
+ 11111, 7803, 5759, 72,
+ 11111, 7803, 5759, 92,
+ 11111, 7803, 5759, 162,
+ 11111, 7803, 5759, 266,
+ 11111, 7803, 5759, 440,
+ 11111, 7803, 5759, 606,
+ 11111, 7803, 5759, 9827, 22,
+ 11111, 7803, 5759, 9827, 34,
+ 11111, 7803, 5759, 9827, 344,
+ 11111, 7803, 5759, 9827, 518,
+ 11111, 8405, 0,
+ 11111, 8405, 8,
+ 11111, 8405, 16,
+ 11111, 8405, 28,
+ 11111, 8405, 40,
+ 11111, 8405, 58,
+ 11111, 8405, 72,
+ 11111, 8405, 92,
+ 11111, 8405, 100,
+ 11111, 8405, 116,
+ 11111, 8405, 138,
+ 11111, 8405, 162,
+ 11111, 8405, 216,
+ 11111, 8405, 236,
+ 11111, 8405, 266,
+ 11111, 8405, 292,
+ 11111, 8405, 306,
+ 11111, 8405, 332,
+ 11111, 8405, 364,
+ 11111, 8405, 392,
+ 11111, 8405, 440,
+ 11111, 8405, 462,
+ 11111, 8405, 510,
+ 11111, 8405, 524,
+ 11111, 8405, 556,
+ 11111, 8405, 606,
+ 11111, 8405, 610,
+ 11111, 8405, 652,
+ 11111, 8405, 792,
+ 11111, 8405, 884,
+ 11111, 8405, 974,
+ 11111, 8405, 996,
+ 11111, 8405, 1260,
+ 11111, 8405, 1512,
+ 11111, 8405, 1612,
+ 11111, 8405, 1796,
+ 11111, 8405, 2030,
+ 11111, 8405, 2076,
+ 11111, 8405, 2126,
+ 11111, 8405, 2212,
+ 11111, 8405, 2438,
+ 11111, 8405, 2516,
+ 11111, 8405, 2566,
+ 11111, 8405, 2678,
+ 11111, 8405, 2746,
+ 11111, 8405, 4016,
+ 11111, 8405, 4888,
+ 11111, 8405, 5994,
+ 11111, 8405, 8045, 20,
+ 11111, 8405, 8045, 22,
+ 11111, 8405, 8045, 26,
+ 11111, 8405, 8045, 344,
+ 11111, 8405, 8045, 410,
+ 11111, 8405, 8045, 518,
+ 11111, 8405, 9827, 22,
+ 11111, 8405, 9827, 34,
+ 11111, 8405, 9827, 344,
+ 11111, 8405, 9827, 518,
+ 11111, 8525, 2171, 9344,
+ 11111, 8525, 2171, 10624,
+ 11111, 8525, 2670,
+ 11111, 10203, 2171, 4388,
+ 11111, 10203, 2171, 9614,
+ 11111, 10203, 7695, 10466,
+ 11113, 9539, 11054,
+ 11123, 4215, 4112,
+ 11123, 4217, 11391, 10507, 2170,
+ 11123, 4217, 11391, 10507, 2778,
+ 11123, 4217, 11391, 10507, 7694,
+ 11123, 4223, 5836,
+ 11123, 5751, 10585, 9921, 8450,
+ 11123, 5963, 5781, 8306,
+ 11123, 6500,
+ 11123, 6610,
+ 11123, 6616,
+ 11123, 6689, 2170,
+ 11123, 6689, 2540,
+ 11123, 6689, 2778,
+ 11123, 6689, 4200,
+ 11123, 6689, 4214,
+ 11123, 6689, 5190,
+ 11123, 6689, 6260,
+ 11123, 6689, 6722,
+ 11123, 6689, 7508,
+ 11123, 6689, 7694,
+ 11123, 7803, 11228,
+ 11123, 8405, 0,
+ 11123, 8405, 8,
+ 11123, 8405, 16,
+ 11123, 8405, 28,
+ 11123, 8405, 40,
+ 11123, 8405, 100,
+ 11123, 8405, 138,
+ 11123, 8405, 162,
+ 11123, 8405, 196,
+ 11123, 8405, 216,
+ 11123, 8405, 292,
+ 11123, 8405, 306,
+ 11123, 8405, 332,
+ 11123, 8405, 364,
+ 11123, 8405, 392,
+ 11123, 8405, 426,
+ 11123, 8405, 462,
+ 11123, 8405, 496,
+ 11123, 8405, 510,
+ 11123, 8405, 524,
+ 11123, 8405, 556,
+ 11123, 8405, 590,
+ 11123, 8405, 622,
+ 11123, 8405, 652,
+ 11123, 8405, 670,
+ 11123, 8405, 717, 4237, 0,
+ 11123, 8405, 717, 4237, 16,
+ 11123, 8405, 717, 4237, 70,
+ 11123, 8405, 717, 4237, 116,
+ 11123, 8405, 717, 4237, 138,
+ 11123, 8405, 717, 4237, 306,
+ 11123, 8405, 717, 4237, 462,
+ 11123, 8405, 717, 4237, 556,
+ 11123, 8405, 717, 4237, 670,
+ 11123, 8405, 717, 4237, 974,
+ 11123, 8405, 717, 4237, 2030,
+ 11123, 8405, 717, 4237, 2076,
+ 11123, 8405, 717, 4237, 2212,
+ 11123, 8405, 717, 4237, 2566,
+ 11123, 8405, 717, 4237, 2746,
+ 11123, 8405, 717, 4237, 3146,
+ 11123, 8405, 717, 4237, 4389, 40,
+ 11123, 8405, 717, 4237, 4389, 652,
+ 11123, 8405, 717, 4237, 5994,
+ 11123, 8405, 717, 4237, 7695, 7972,
+ 11123, 8405, 717, 4237, 7972,
+ 11123, 8405, 717, 4237, 8092,
+ 11123, 8405, 717, 4237, 9138,
+ 11123, 8405, 717, 4237, 9802,
+ 11123, 8405, 717, 4237, 9825, 2170,
+ 11123, 8405, 717, 4237, 9871, 2170,
+ 11123, 8405, 717, 4237, 10267, 9802,
+ 11123, 8405, 722,
+ 11123, 8405, 884,
+ 11123, 8405, 888,
+ 11123, 8405, 1338,
+ 11123, 8405, 1612,
+ 11123, 8405, 1770,
+ 11123, 8405, 2516,
+ 11123, 8405, 2732,
+ 11123, 8405, 3150,
+ 11123, 8405, 3186,
+ 11123, 8405, 5751, 8,
+ 11123, 8405, 5751, 16,
+ 11123, 8405, 5751, 40,
+ 11123, 8405, 5751, 138,
+ 11123, 8405, 5751, 196,
+ 11123, 8405, 5751, 216,
+ 11123, 8405, 5751, 236,
+ 11123, 8405, 5751, 290,
+ 11123, 8405, 5751, 292,
+ 11123, 8405, 5751, 306,
+ 11123, 8405, 5751, 462,
+ 11123, 8405, 5751, 556,
+ 11123, 8405, 5751, 590,
+ 11123, 8405, 5751, 670,
+ 11123, 8405, 5751, 722,
+ 11123, 8405, 5751, 884,
+ 11123, 8405, 5751, 1204,
+ 11123, 8405, 5751, 1338,
+ 11123, 8405, 5751, 2378,
+ 11123, 8405, 5751, 2516,
+ 11123, 8405, 5751, 2732,
+ 11123, 8405, 5751, 3146,
+ 11123, 8405, 5963, 8,
+ 11123, 8405, 5963, 16,
+ 11123, 8405, 5963, 28,
+ 11123, 8405, 5963, 40,
+ 11123, 8405, 5963, 100,
+ 11123, 8405, 5963, 138,
+ 11123, 8405, 5963, 216,
+ 11123, 8405, 5963, 292,
+ 11123, 8405, 5963, 306,
+ 11123, 8405, 5963, 364,
+ 11123, 8405, 5963, 426,
+ 11123, 8405, 5963, 462,
+ 11123, 8405, 5963, 496,
+ 11123, 8405, 5963, 556,
+ 11123, 8405, 5963, 590,
+ 11123, 8405, 5963, 622,
+ 11123, 8405, 5963, 652,
+ 11123, 8405, 5963, 717, 4237, 556,
+ 11123, 8405, 5963, 717, 4237, 3146,
+ 11123, 8405, 5963, 722,
+ 11123, 8405, 5963, 884,
+ 11123, 8405, 5963, 1080,
+ 11123, 8405, 5963, 1204,
+ 11123, 8405, 5963, 1338,
+ 11123, 8405, 5963, 1516,
+ 11123, 8405, 5963, 2046,
+ 11123, 8405, 5963, 2732,
+ 11123, 8405, 5963, 4895, 7803, 5758,
+ 11123, 8405, 8439, 16,
+ 11123, 8405, 8439, 196,
+ 11123, 8405, 8439, 306,
+ 11123, 8405, 8439, 510,
+ 11123, 8405, 8439, 717, 4237, 116,
+ 11123, 8405, 8439, 717, 4237, 556,
+ 11123, 8405, 8439, 717, 4237, 670,
+ 11123, 8405, 8439, 717, 4237, 792,
+ 11123, 8405, 8439, 717, 4237, 944,
+ 11123, 8405, 8439, 717, 4237, 996,
+ 11123, 8405, 8439, 717, 4237, 1260,
+ 11123, 8405, 8439, 717, 4237, 1512,
+ 11123, 8405, 8439, 717, 4237, 1770,
+ 11123, 8405, 8439, 717, 4237, 2030,
+ 11123, 8405, 8439, 717, 4237, 2566,
+ 11123, 8405, 8439, 717, 4237, 2746,
+ 11123, 8405, 8439, 717, 4237, 3146,
+ 11123, 8405, 8439, 717, 4237, 4016,
+ 11123, 8405, 8439, 3146,
+ 11123, 8439, 4223, 5836,
+ 11123, 8439, 6616,
+ 11123, 8516,
+ 11123, 10154,
+ 11163, 11228,
+ 11169, 7337, 5758,
+ 11172,
+ 11173, 6121, 2667, 2724,
+ 11191, 7390,
+ 11191, 10261, 10374,
+ 11195, 4926,
+ 11205, 8775, 1177, 8879, 10434,
+ 11205, 8775, 1177, 8881, 10434,
+ 11205, 8775, 1177, 8883, 10434,
+ 11205, 8775, 1177, 8885, 10434,
+ 11205, 8775, 1177, 8887, 10434,
+ 11205, 8775, 1177, 8889, 10434,
+ 11205, 8775, 1177, 8891, 10434,
+ 11205, 8775, 1177, 9305, 11114,
+ 11207, 4926,
+ 11217, 10265, 9610,
+ 11224,
+ 11242,
+ 11245, 6408,
+ 11245, 6409, 9537, 600,
+ 11245, 6409, 9537, 4848,
+ 11261, 2170,
+ 11261, 2540,
+ 11261, 2778,
+ 11261, 4200,
+ 11261, 4214,
+ 11261, 4849, 12114,
+ 11261, 5190,
+ 11261, 5445, 5758,
+ 11261, 6260,
+ 11261, 6722,
+ 11261, 7172,
+ 11261, 7443, 12114,
+ 11261, 7508,
+ 11261, 7694,
+ 11261, 8167, 5758,
+ 11263, 2724,
+ 11263, 6121, 10260,
+ 11263, 8004,
+ 11265, 5759, 9558,
+ 11265, 5759, 10408,
+ 11265, 5759, 11158,
+ 11265, 5759, 11160,
+ 11265, 6689, 2170,
+ 11265, 6689, 2540,
+ 11265, 6689, 2778,
+ 11265, 6689, 4200,
+ 11265, 6689, 4214,
+ 11265, 6689, 5190,
+ 11265, 6689, 6260,
+ 11265, 6689, 6722,
+ 11265, 6689, 7508,
+ 11265, 6689, 7694,
+ 11265, 7803, 5759, 9560,
+ 11265, 7803, 5759, 9566,
+ 11265, 7803, 5759, 10402,
+ 11265, 7803, 5759, 10404,
+ 11265, 7803, 5759, 11710,
+ 11265, 7803, 5759, 11712,
+ 11265, 8405, 0,
+ 11265, 8405, 8,
+ 11265, 8405, 16,
+ 11265, 8405, 28,
+ 11265, 8405, 40,
+ 11265, 8405, 66,
+ 11265, 8405, 100,
+ 11265, 8405, 116,
+ 11265, 8405, 138,
+ 11265, 8405, 188,
+ 11265, 8405, 196,
+ 11265, 8405, 216,
+ 11265, 8405, 236,
+ 11265, 8405, 292,
+ 11265, 8405, 306,
+ 11265, 8405, 332,
+ 11265, 8405, 364,
+ 11265, 8405, 392,
+ 11265, 8405, 462,
+ 11265, 8405, 496,
+ 11265, 8405, 510,
+ 11265, 8405, 524,
+ 11265, 8405, 556,
+ 11265, 8405, 610,
+ 11265, 8405, 622,
+ 11265, 8405, 638,
+ 11265, 8405, 652,
+ 11265, 8405, 670,
+ 11265, 8405, 1612,
+ 11265, 8405, 2030,
+ 11265, 8405, 2126,
+ 11265, 8405, 2610,
+ 11265, 10775, 5759, 9564,
+ 11265, 10775, 5759, 10406,
+ 11265, 10775, 5759, 11154,
+ 11355, 5758,
+ 11355, 10303, 5758,
+ 11355, 10472,
+ 11357, 1177, 439, 2681, 7790,
+ 11357, 1177, 1550,
+ 11357, 1177, 1749, 445, 7180,
+ 11357, 1177, 3803, 11754,
+ 11357, 1177, 4150,
+ 11357, 1177, 4223, 8056,
+ 11357, 1177, 6702,
+ 11357, 1177, 6865, 569, 4944,
+ 11357, 1177, 6994,
+ 11357, 1177, 7174,
+ 11357, 1177, 7428,
+ 11357, 1177, 7644,
+ 11357, 1177, 7770,
+ 11357, 1177, 7810,
+ 11357, 1177, 7952,
+ 11357, 1177, 8036,
+ 11357, 1177, 8042,
+ 11357, 1177, 8065, 7186,
+ 11357, 1177, 8156,
+ 11357, 1177, 8222,
+ 11357, 1177, 8394,
+ 11357, 1177, 8618,
+ 11357, 1177, 8650,
+ 11357, 1177, 8976,
+ 11357, 1177, 9026,
+ 11357, 1177, 9100,
+ 11357, 1177, 9110,
+ 11357, 1177, 9168,
+ 11357, 1177, 9276,
+ 11357, 1177, 9341, 3696,
+ 11357, 1177, 9395, 7592,
+ 11357, 1177, 9402,
+ 11357, 1177, 9460,
+ 11357, 1177, 9466,
+ 11357, 1177, 9550,
+ 11357, 1177, 9574,
+ 11357, 1177, 9626,
+ 11357, 1177, 9696,
+ 11357, 1177, 9832,
+ 11357, 1177, 10168,
+ 11357, 1177, 10210,
+ 11357, 1177, 10232,
+ 11357, 1177, 10252,
+ 11357, 1177, 10486,
+ 11357, 1177, 10540,
+ 11357, 1177, 10550,
+ 11357, 1177, 10673, 445, 9836,
+ 11357, 1177, 10747, 2186,
+ 11357, 1177, 10764,
+ 11357, 1177, 10776,
+ 11357, 1177, 10792,
+ 11357, 1177, 10800,
+ 11357, 1177, 10972,
+ 11357, 1177, 10998,
+ 11357, 1177, 11002,
+ 11357, 1177, 11012,
+ 11357, 1177, 11013, 274,
+ 11357, 1177, 11024,
+ 11357, 1177, 11086,
+ 11357, 1177, 11210,
+ 11357, 1177, 11234,
+ 11357, 1177, 11454,
+ 11357, 1177, 11456,
+ 11357, 1177, 11462,
+ 11357, 1177, 11486,
+ 11357, 1177, 11610,
+ 11357, 1177, 11622,
+ 11357, 1177, 11702,
+ 11357, 1177, 11752,
+ 11357, 1177, 11888,
+ 11357, 1177, 11916,
+ 11357, 1177, 12012,
+ 11357, 1177, 12026,
+ 11357, 1177, 12118,
+ 11357, 1177, 12392,
+ 11357, 1177, 12430,
+ 11357, 1177, 12434,
+ 11357, 1177, 12436,
+ 11357, 1177, 12898,
+ 11357, 1177, 12923, 445, 11484,
+ 11357, 1177, 12936,
+ 11360,
+ 11387, 11205, 8774,
+ 11389, 12117, 8774,
+ 11391, 11770,
+ 11391, 11772,
+ 11391, 11774,
+ 11391, 11776,
+ 11391, 11778,
+ 11391, 11780,
+ 11391, 11782,
+ 11391, 11784,
+ 11391, 11786,
+ 11391, 12160,
+ 11391, 12162,
+ 11391, 12164,
+ 11391, 12166,
+ 11391, 12168,
+ 11391, 12170,
+ 11391, 12172,
+ 11391, 12174,
+ 11391, 12176,
+ 11391, 12178,
+ 11391, 12180,
+ 11391, 12182,
+ 11391, 12184,
+ 11391, 12186,
+ 11391, 12188,
+ 11391, 12190,
+ 11391, 12192,
+ 11391, 12194,
+ 11391, 12196,
+ 11391, 12198,
+ 11391, 12200,
+ 11391, 12202,
+ 11391, 12204,
+ 11391, 12206,
+ 11391, 12208,
+ 11391, 12210,
+ 11391, 12212,
+ 11391, 12214,
+ 11391, 12216,
+ 11391, 12218,
+ 11391, 12220,
+ 11391, 12222,
+ 11391, 12224,
+ 11391, 12226,
+ 11391, 12228,
+ 11391, 12230,
+ 11391, 12232,
+ 11391, 12234,
+ 11391, 12236,
+ 11391, 12238,
+ 11391, 12240,
+ 11391, 12242,
+ 11391, 12244,
+ 11391, 12246,
+ 11391, 12248,
+ 11391, 12250,
+ 11391, 12252,
+ 11391, 12254,
+ 11391, 12256,
+ 11391, 12258,
+ 11391, 12260,
+ 11391, 12262,
+ 11391, 12264,
+ 11391, 12266,
+ 11391, 12268,
+ 11391, 12270,
+ 11391, 12272,
+ 11391, 12274,
+ 11391, 12276,
+ 11391, 12278,
+ 11391, 12280,
+ 11391, 12282,
+ 11391, 12284,
+ 11391, 12286,
+ 11391, 12288,
+ 11391, 12290,
+ 11391, 12292,
+ 11391, 12294,
+ 11391, 12296,
+ 11391, 12298,
+ 11391, 12300,
+ 11391, 12302,
+ 11391, 12304,
+ 11391, 12306,
+ 11391, 12308,
+ 11391, 12310,
+ 11391, 12312,
+ 11391, 12314,
+ 11391, 12316,
+ 11391, 12318,
+ 11391, 12320,
+ 11391, 12322,
+ 11391, 12324,
+ 11391, 12326,
+ 11391, 12328,
+ 11391, 12330,
+ 11391, 12332,
+ 11391, 12334,
+ 11391, 12336,
+ 11391, 12338,
+ 11391, 12542,
+ 11391, 12544,
+ 11391, 12546,
+ 11391, 12548,
+ 11391, 12550,
+ 11391, 12552,
+ 11391, 12554,
+ 11391, 12556,
+ 11391, 12558,
+ 11391, 12560,
+ 11391, 12562,
+ 11391, 12564,
+ 11391, 12566,
+ 11391, 12568,
+ 11391, 12570,
+ 11391, 12572,
+ 11391, 12574,
+ 11391, 12576,
+ 11391, 12578,
+ 11391, 12580,
+ 11391, 12582,
+ 11391, 12584,
+ 11391, 12586,
+ 11391, 12588,
+ 11391, 12590,
+ 11391, 12592,
+ 11391, 12594,
+ 11391, 12596,
+ 11391, 12598,
+ 11391, 12600,
+ 11391, 12602,
+ 11391, 12604,
+ 11391, 12606,
+ 11391, 12608,
+ 11391, 12610,
+ 11391, 12612,
+ 11391, 12614,
+ 11391, 12616,
+ 11391, 12618,
+ 11391, 12620,
+ 11391, 12622,
+ 11391, 12624,
+ 11391, 12626,
+ 11391, 12628,
+ 11391, 12630,
+ 11391, 12632,
+ 11391, 12634,
+ 11391, 12636,
+ 11391, 12638,
+ 11391, 12640,
+ 11391, 12642,
+ 11391, 12644,
+ 11391, 12646,
+ 11391, 12648,
+ 11391, 12650,
+ 11391, 12652,
+ 11391, 12654,
+ 11391, 12656,
+ 11391, 12658,
+ 11391, 12660,
+ 11391, 12662,
+ 11391, 12664,
+ 11391, 12666,
+ 11391, 12668,
+ 11391, 12670,
+ 11391, 12672,
+ 11391, 12674,
+ 11391, 12676,
+ 11391, 12678,
+ 11391, 12680,
+ 11391, 12682,
+ 11391, 12684,
+ 11391, 12686,
+ 11391, 12688,
+ 11391, 12690,
+ 11391, 12692,
+ 11391, 12694,
+ 11391, 12696,
+ 11391, 12698,
+ 11391, 12700,
+ 11391, 12702,
+ 11391, 12704,
+ 11391, 12706,
+ 11391, 12708,
+ 11391, 12710,
+ 11391, 12712,
+ 11391, 12714,
+ 11391, 12716,
+ 11391, 12718,
+ 11391, 12720,
+ 11391, 12722,
+ 11391, 12724,
+ 11391, 12726,
+ 11391, 12728,
+ 11391, 12730,
+ 11391, 12732,
+ 11391, 12734,
+ 11391, 12736,
+ 11391, 12738,
+ 11391, 12740,
+ 11391, 12742,
+ 11391, 12744,
+ 11391, 12746,
+ 11391, 12748,
+ 11391, 12750,
+ 11391, 12752,
+ 11391, 12754,
+ 11391, 12756,
+ 11391, 12758,
+ 11391, 12760,
+ 11391, 12762,
+ 11391, 12764,
+ 11391, 12766,
+ 11391, 12768,
+ 11391, 12770,
+ 11391, 12772,
+ 11391, 12774,
+ 11391, 12776,
+ 11391, 12778,
+ 11391, 12780,
+ 11391, 12782,
+ 11391, 12784,
+ 11391, 12786,
+ 11391, 12788,
+ 11391, 12790,
+ 11391, 12792,
+ 11391, 12794,
+ 11391, 12796,
+ 11391, 12798,
+ 11391, 12800,
+ 11391, 12802,
+ 11391, 12804,
+ 11391, 12806,
+ 11391, 12808,
+ 11391, 12810,
+ 11391, 12812,
+ 11391, 12814,
+ 11391, 12816,
+ 11391, 12818,
+ 11391, 12820,
+ 11391, 12822,
+ 11391, 12824,
+ 11391, 12826,
+ 11391, 12828,
+ 11391, 12830,
+ 11391, 12832,
+ 11391, 12834,
+ 11391, 12836,
+ 11391, 12838,
+ 11391, 12840,
+ 11391, 12842,
+ 11391, 12844,
+ 11391, 12846,
+ 11391, 12848,
+ 11391, 12850,
+ 11391, 12852,
+ 11391, 12854,
+ 11424,
+ 11427, 2681, 7104,
+ 11445, 1809, 4876,
+ 11445, 10388,
+ 11449, 7908,
+ 11451, 90,
+ 11451, 7173, 5758,
+ 11452,
+ 11465, 11385, 8774,
+ 11475, 5238,
+ 11477, 436,
+ 11477, 5759, 4423, 9721, 1044,
+ 11477, 5759, 7282,
+ 11477, 5759, 8916,
+ 11477, 5759, 9824,
+ 11477, 5759, 9870,
+ 11477, 5759, 9904,
+ 11477, 5759, 11900,
+ 11477, 6379, 7908,
+ 11477, 6646,
+ 11477, 6689, 2170,
+ 11477, 6689, 2540,
+ 11477, 6689, 2778,
+ 11477, 6689, 4200,
+ 11477, 6689, 4214,
+ 11477, 6689, 5190,
+ 11477, 6689, 6260,
+ 11477, 6689, 6722,
+ 11477, 6689, 7508,
+ 11477, 6689, 7694,
+ 11477, 6875, 7908,
+ 11477, 7803, 5759, 8,
+ 11477, 7803, 5759, 16,
+ 11477, 7803, 5759, 28,
+ 11477, 7803, 5759, 40,
+ 11477, 7803, 5759, 58,
+ 11477, 7803, 5759, 72,
+ 11477, 7803, 5759, 92,
+ 11477, 7803, 5759, 266,
+ 11477, 7803, 5759, 606,
+ 11477, 7803, 5759, 7551, 8,
+ 11477, 7803, 5759, 7551, 28,
+ 11477, 7803, 5759, 8031, 8,
+ 11477, 7803, 5759, 8031, 28,
+ 11477, 7803, 5759, 9827, 22,
+ 11477, 7803, 5759, 9827, 34,
+ 11477, 7803, 5759, 9827, 344,
+ 11477, 7803, 5759, 9827, 518,
+ 11477, 8153, 6646,
+ 11477, 8405, 0,
+ 11477, 8405, 8,
+ 11477, 8405, 16,
+ 11477, 8405, 28,
+ 11477, 8405, 40,
+ 11477, 8405, 58,
+ 11477, 8405, 72,
+ 11477, 8405, 92,
+ 11477, 8405, 100,
+ 11477, 8405, 116,
+ 11477, 8405, 138,
+ 11477, 8405, 196,
+ 11477, 8405, 216,
+ 11477, 8405, 236,
+ 11477, 8405, 266,
+ 11477, 8405, 292,
+ 11477, 8405, 306,
+ 11477, 8405, 332,
+ 11477, 8405, 364,
+ 11477, 8405, 392,
+ 11477, 8405, 462,
+ 11477, 8405, 496,
+ 11477, 8405, 510,
+ 11477, 8405, 524,
+ 11477, 8405, 556,
+ 11477, 8405, 606,
+ 11477, 8405, 610,
+ 11477, 8405, 652,
+ 11477, 8405, 670,
+ 11477, 8405, 766,
+ 11477, 8405, 792,
+ 11477, 8405, 884,
+ 11477, 8405, 974,
+ 11477, 8405, 996,
+ 11477, 8405, 1250,
+ 11477, 8405, 1260,
+ 11477, 8405, 1512,
+ 11477, 8405, 1528,
+ 11477, 8405, 1612,
+ 11477, 8405, 1796,
+ 11477, 8405, 2030,
+ 11477, 8405, 2076,
+ 11477, 8405, 2126,
+ 11477, 8405, 2212,
+ 11477, 8405, 2410,
+ 11477, 8405, 2438,
+ 11477, 8405, 2516,
+ 11477, 8405, 2566,
+ 11477, 8405, 2678,
+ 11477, 8405, 2746,
+ 11477, 8405, 3110,
+ 11477, 8405, 4008,
+ 11477, 8405, 4016,
+ 11477, 8405, 4320,
+ 11477, 8405, 4748,
+ 11477, 8405, 4888,
+ 11477, 8405, 5234,
+ 11477, 8405, 5994,
+ 11477, 8405, 6658,
+ 11477, 8405, 7551, 0,
+ 11477, 8405, 7551, 8,
+ 11477, 8405, 7551, 28,
+ 11477, 8405, 8031, 0,
+ 11477, 8405, 8031, 8,
+ 11477, 8405, 8031, 28,
+ 11477, 8405, 9313, 5836,
+ 11477, 8405, 9827, 22,
+ 11477, 8405, 9827, 34,
+ 11477, 8405, 9827, 344,
+ 11477, 8405, 9827, 518,
+ 11477, 8755, 5759, 8892,
+ 11477, 8755, 5759, 9868,
+ 11477, 12391, 5758,
+ 11479, 9042,
+ 11605, 12492,
+ 11621, 568,
+ 11621, 6121, 4215, 4113, 6376,
+ 11641, 7593, 8405, 16,
+ 11641, 7593, 8405, 468,
+ 11641, 7593, 8405, 660,
+ 11641, 7593, 8405, 664,
+ 11641, 7593, 8405, 746,
+ 11641, 7593, 8405, 807, 3096,
+ 11641, 7593, 8405, 2176,
+ 11641, 7593, 8405, 2184,
+ 11641, 7593, 8405, 2516,
+ 11641, 7593, 8405, 2736,
+ 11641, 7593, 8405, 2808,
+ 11641, 7593, 8405, 3810,
+ 11641, 7593, 8405, 4198,
+ 11641, 7593, 8405, 4406,
+ 11641, 7593, 8405, 4626,
+ 11641, 7593, 8405, 4712,
+ 11641, 7593, 8405, 5718,
+ 11641, 7593, 8405, 6076,
+ 11641, 7593, 8405, 6188,
+ 11641, 7593, 8405, 6198,
+ 11641, 7593, 8405, 6200,
+ 11641, 7593, 8405, 6698,
+ 11641, 7593, 8405, 6710,
+ 11641, 7593, 8405, 6810,
+ 11641, 7593, 8405, 7210,
+ 11641, 7593, 8405, 7444,
+ 11641, 7593, 8405, 7590,
+ 11641, 7593, 8405, 7593, 3096,
+ 11641, 7593, 8405, 7593, 3097, 6121, 5878,
+ 11641, 7593, 8405, 7856,
+ 11641, 7593, 8405, 8050,
+ 11641, 7593, 8405, 8124,
+ 11641, 7593, 8405, 8606,
+ 11641, 7593, 8405, 8872,
+ 11641, 7593, 8405, 8958,
+ 11641, 7593, 8405, 9310,
+ 11641, 7593, 8405, 9363, 4626,
+ 11641, 7593, 8405, 9371, 807, 3096,
+ 11641, 7593, 8405, 9371, 7593, 3096,
+ 11641, 7593, 8405, 9372,
+ 11641, 7593, 8405, 9434,
+ 11641, 7593, 8405, 9486,
+ 11641, 7593, 8405, 9686,
+ 11641, 7593, 8405, 9727, 236,
+ 11641, 7593, 8405, 9850,
+ 11641, 7593, 8405, 10299, 9486,
+ 11641, 7593, 8405, 11867, 0,
+ 11641, 9063, 8405, 16,
+ 11641, 9063, 8405, 468,
+ 11641, 9063, 8405, 660,
+ 11641, 9063, 8405, 664,
+ 11641, 9063, 8405, 746,
+ 11641, 9063, 8405, 807, 3096,
+ 11641, 9063, 8405, 2176,
+ 11641, 9063, 8405, 2184,
+ 11641, 9063, 8405, 2516,
+ 11641, 9063, 8405, 2736,
+ 11641, 9063, 8405, 2808,
+ 11641, 9063, 8405, 3810,
+ 11641, 9063, 8405, 4198,
+ 11641, 9063, 8405, 4406,
+ 11641, 9063, 8405, 4626,
+ 11641, 9063, 8405, 4712,
+ 11641, 9063, 8405, 5718,
+ 11641, 9063, 8405, 6076,
+ 11641, 9063, 8405, 6188,
+ 11641, 9063, 8405, 6198,
+ 11641, 9063, 8405, 6200,
+ 11641, 9063, 8405, 6698,
+ 11641, 9063, 8405, 6710,
+ 11641, 9063, 8405, 6810,
+ 11641, 9063, 8405, 7210,
+ 11641, 9063, 8405, 7444,
+ 11641, 9063, 8405, 7590,
+ 11641, 9063, 8405, 7593, 3096,
+ 11641, 9063, 8405, 7593, 3097, 6121, 5878,
+ 11641, 9063, 8405, 7856,
+ 11641, 9063, 8405, 8050,
+ 11641, 9063, 8405, 8124,
+ 11641, 9063, 8405, 8606,
+ 11641, 9063, 8405, 8872,
+ 11641, 9063, 8405, 8958,
+ 11641, 9063, 8405, 9310,
+ 11641, 9063, 8405, 9363, 4626,
+ 11641, 9063, 8405, 9371, 807, 3096,
+ 11641, 9063, 8405, 9371, 7593, 3096,
+ 11641, 9063, 8405, 9372,
+ 11641, 9063, 8405, 9434,
+ 11641, 9063, 8405, 9486,
+ 11641, 9063, 8405, 9686,
+ 11641, 9063, 8405, 9727, 236,
+ 11641, 9063, 8405, 9850,
+ 11641, 9063, 8405, 10299, 9486,
+ 11641, 9063, 8405, 11867, 0,
+ 11646,
+ 11649, 760,
+ 11649, 4877, 10982,
+ 11649, 4923, 6121, 8759, 5758,
+ 11649, 5643, 8412,
+ 11649, 5643, 8414,
+ 11649, 5643, 8416,
+ 11649, 5643, 8418,
+ 11649, 6505, 9338,
+ 11649, 10154,
+ 11651, 8774,
+ 11661, 10256,
+ 11667, 5759, 761, 6376,
+ 11667, 5759, 1045, 6490,
+ 11667, 5759, 6548,
+ 11667, 5759, 8153, 5551, 6490,
+ 11667, 5759, 9824,
+ 11667, 5759, 9870,
+ 11667, 6689, 2170,
+ 11667, 6689, 2778,
+ 11667, 6689, 4214,
+ 11667, 6689, 7694,
+ 11667, 7803, 5759, 8,
+ 11667, 7803, 5759, 16,
+ 11667, 7803, 5759, 28,
+ 11667, 7803, 5759, 40,
+ 11667, 7803, 5759, 9827, 34,
+ 11667, 7803, 8399, 4926,
+ 11667, 8405, 0,
+ 11667, 8405, 100,
+ 11667, 8405, 116,
+ 11667, 8405, 138,
+ 11667, 8405, 216,
+ 11667, 8405, 236,
+ 11667, 8405, 292,
+ 11667, 8405, 306,
+ 11667, 8405, 332,
+ 11667, 8405, 364,
+ 11667, 8405, 392,
+ 11667, 8405, 462,
+ 11667, 8405, 510,
+ 11667, 8405, 524,
+ 11667, 8405, 556,
+ 11667, 8405, 610,
+ 11667, 8405, 652,
+ 11667, 8405, 670,
+ 11667, 8405, 792,
+ 11667, 8405, 884,
+ 11667, 8405, 974,
+ 11667, 8405, 996,
+ 11667, 8405, 1260,
+ 11667, 8405, 1612,
+ 11667, 8405, 1642,
+ 11667, 8405, 2076,
+ 11667, 8405, 2126,
+ 11667, 8405, 2212,
+ 11667, 8405, 2516,
+ 11667, 8405, 2566,
+ 11667, 8405, 2678,
+ 11667, 8405, 2746,
+ 11667, 8405, 4016,
+ 11667, 8405, 5994,
+ 11667, 8405, 7750,
+ 11667, 8525, 2171, 9344,
+ 11667, 8525, 2171, 10624,
+ 11667, 8525, 2670,
+ 11667, 8525, 8876,
+ 11667, 8916,
+ 11667, 12133, 1044,
+ 11667, 12133, 6646,
+ 11667, 12133, 7108,
+ 11667, 12133, 7114,
+ 11667, 12133, 7593, 8056,
+ 11667, 12133, 8056,
+ 11667, 12133, 8153, 6646,
+ 11667, 12133, 9965, 760,
+ 11667, 12133, 10318,
+ 11687, 8774,
+ 11700,
+ 11702,
+ 11725, 8153, 12132,
+ 11725, 8717, 12132,
+ 11727, 6129, 11228,
+ 11727, 8405, 238,
+ 11727, 8405, 468,
+ 11727, 8405, 710,
+ 11727, 8405, 714,
+ 11727, 8405, 788,
+ 11727, 8405, 1366,
+ 11727, 8405, 1578,
+ 11727, 8405, 1892,
+ 11727, 8405, 2110,
+ 11727, 8405, 2318,
+ 11727, 8405, 2658,
+ 11727, 8405, 2674,
+ 11727, 8405, 2916,
+ 11727, 8405, 3080,
+ 11727, 8405, 3126,
+ 11727, 8405, 4058,
+ 11727, 8405, 4238,
+ 11727, 8405, 4832,
+ 11727, 8405, 5568,
+ 11727, 8405, 5624,
+ 11727, 8405, 5652,
+ 11727, 8405, 5698,
+ 11727, 8525, 2170,
+ 11727, 8525, 2171, 9344,
+ 11727, 8525, 2670,
+ 11727, 8525, 8876,
+ 11731, 5758,
+ 11736,
+ 11740,
+ 11745, 10261, 10374,
+ 11747, 6741, 568,
+ 11749, 5758,
+ 11763, 731, 10763, 6434,
+ 11765, 2779, 8289, 6434,
+ 11765, 6105, 6434,
+ 11765, 6434,
+ 11765, 6435, 569, 760,
+ 11765, 6435, 569, 6505, 9158,
+ 11765, 6435, 4221, 760,
+ 11765, 6435, 4221, 761, 569, 6505, 9158,
+ 11765, 6435, 5387, 11097, 6434,
+ 11765, 6435, 6121, 2697, 9810,
+ 11765, 6435, 6121, 2697, 10958,
+ 11765, 6435, 6121, 4530,
+ 11765, 6435, 6121, 4896,
+ 11765, 6435, 6121, 5445, 6490,
+ 11765, 6435, 6121, 5878,
+ 11765, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11765, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11765, 6435, 6121, 8077, 10958,
+ 11765, 6435, 6121, 8151, 5832,
+ 11765, 6435, 6121, 8153, 10677, 8758,
+ 11765, 6435, 6121, 8758,
+ 11765, 6435, 6121, 10677, 8758,
+ 11765, 6435, 6377, 7551, 11097, 6434,
+ 11765, 6435, 6377, 7709, 10374,
+ 11765, 6435, 6377, 7919, 6741, 568,
+ 11765, 6435, 6377, 9633, 7709, 10374,
+ 11765, 6435, 6377, 9633, 7919, 6741, 568,
+ 11765, 6435, 9785, 46,
+ 11765, 6435, 9785, 10578,
+ 11765, 6435, 9785, 12472,
+ 11765, 7821, 6434,
+ 11765, 7821, 6435, 4221, 6102,
+ 11765, 8097, 6434,
+ 11765, 8153, 3993, 6434,
+ 11765, 8153, 6434,
+ 11765, 8153, 6435, 4221, 760,
+ 11765, 8153, 6435, 6121, 8758,
+ 11765, 8153, 6435, 6121, 10677, 8758,
+ 11765, 8153, 11430,
+ 11765, 8561, 7944,
+ 11765, 8849, 3993, 6434,
+ 11765, 8849, 6434,
+ 11765, 9327, 5387, 11097, 9326,
+ 11765, 9327, 6121, 3713, 601, 569, 760,
+ 11765, 9327, 6121, 3713, 601, 4221, 760,
+ 11765, 9327, 6121, 3713, 601, 6377, 4895, 3992,
+ 11765, 9327, 6121, 3713, 601, 6377, 11097, 9327, 6121, 3713, 600,
+ 11765, 9327, 6121, 3713, 601, 6377, 11765, 9327, 6121, 3713, 4116,
+ 11765, 9327, 6121, 3713, 4117, 569, 760,
+ 11765, 9327, 6121, 3713, 4117, 4221, 760,
+ 11765, 9327, 6121, 3713, 4117, 6377, 11097, 9327, 6121, 3713, 4116,
+ 11765, 9327, 6121, 3713, 4117, 6491, 4895, 3992,
+ 11765, 9327, 6121, 3713, 9810,
+ 11765, 9327, 6121, 3713, 10958,
+ 11765, 10531, 6434,
+ 11765, 11191, 6434,
+ 11765, 11430,
+ 11765, 11875, 6435, 4221, 760,
+ 11765, 11875, 6435, 6121, 5878,
+ 11765, 11875, 6435, 6121, 5879, 6121, 8153, 10677, 8758,
+ 11765, 11875, 6435, 6121, 5879, 6121, 10677, 8758,
+ 11765, 11875, 6435, 6121, 8153, 10677, 8758,
+ 11765, 11875, 6435, 6121, 10677, 8758,
+ 11765, 11875, 8849, 3993, 6434,
+ 11765, 12103, 6434,
+ 11769, 5759, 8916,
+ 11769, 5759, 9824,
+ 11769, 5759, 9870,
+ 11769, 6646,
+ 11769, 6689, 2170,
+ 11769, 6689, 2540,
+ 11769, 6689, 2778,
+ 11769, 6689, 4200,
+ 11769, 6689, 4214,
+ 11769, 6689, 5190,
+ 11769, 6689, 6260,
+ 11769, 6689, 6722,
+ 11769, 6689, 7508,
+ 11769, 6689, 7694,
+ 11769, 7803, 5759, 8,
+ 11769, 7803, 5759, 16,
+ 11769, 7803, 5759, 28,
+ 11769, 7803, 5759, 40,
+ 11769, 7803, 5759, 58,
+ 11769, 7803, 5759, 72,
+ 11769, 7803, 5759, 92,
+ 11769, 7803, 5759, 162,
+ 11769, 7803, 5759, 266,
+ 11769, 7803, 5759, 440,
+ 11769, 7803, 5759, 606,
+ 11769, 7803, 5759, 9827, 22,
+ 11769, 7803, 5759, 9827, 34,
+ 11769, 7803, 5759, 9827, 344,
+ 11769, 7803, 5759, 9827, 518,
+ 11769, 8153, 6646,
+ 11769, 8405, 0,
+ 11769, 8405, 8,
+ 11769, 8405, 16,
+ 11769, 8405, 28,
+ 11769, 8405, 40,
+ 11769, 8405, 58,
+ 11769, 8405, 72,
+ 11769, 8405, 92,
+ 11769, 8405, 100,
+ 11769, 8405, 116,
+ 11769, 8405, 138,
+ 11769, 8405, 162,
+ 11769, 8405, 216,
+ 11769, 8405, 236,
+ 11769, 8405, 266,
+ 11769, 8405, 292,
+ 11769, 8405, 306,
+ 11769, 8405, 332,
+ 11769, 8405, 364,
+ 11769, 8405, 392,
+ 11769, 8405, 440,
+ 11769, 8405, 462,
+ 11769, 8405, 510,
+ 11769, 8405, 524,
+ 11769, 8405, 556,
+ 11769, 8405, 606,
+ 11769, 8405, 610,
+ 11769, 8405, 652,
+ 11769, 8405, 792,
+ 11769, 8405, 884,
+ 11769, 8405, 974,
+ 11769, 8405, 996,
+ 11769, 8405, 1260,
+ 11769, 8405, 1512,
+ 11769, 8405, 1612,
+ 11769, 8405, 1796,
+ 11769, 8405, 2030,
+ 11769, 8405, 2076,
+ 11769, 8405, 2126,
+ 11769, 8405, 2212,
+ 11769, 8405, 2516,
+ 11769, 8405, 2566,
+ 11769, 8405, 2678,
+ 11769, 8405, 2746,
+ 11769, 8405, 4016,
+ 11769, 8405, 5994,
+ 11769, 8405, 9827, 22,
+ 11769, 8405, 9827, 34,
+ 11769, 8405, 9827, 344,
+ 11769, 8405, 9827, 518,
+ 11769, 10775, 5759, 6888,
+ 11793, 9611, 6121, 8005, 8064,
+ 11801, 5385, 826,
+ 11819, 7608,
+ 11859, 8022,
+ 11881, 8774,
+ 11893, 1611, 8774,
+ 11899, 10513, 7821, 11765, 6434,
+ 11905, 10212,
+ 11909, 8774,
+ 11910,
+ 11921, 568,
+ 11922,
+ 11924,
+ 12007, 6741, 569, 445, 11098,
+ 12007, 6741, 569, 445, 12472,
+ 12007, 9705, 6741, 569, 445, 11098,
+ 12007, 9705, 6741, 569, 445, 12472,
+ 12007, 9705, 11099, 445, 6741, 568,
+ 12007, 9705, 12473, 445, 6741, 568,
+ 12015, 568,
+ 12017, 4926,
+ 12017, 10469, 4926,
+ 12021, 7608,
+ 12041, 7382,
+ 12043, 4223, 5836,
+ 12043, 4389, 4193, 7608,
+ 12043, 6616,
+ 12043, 7097, 5965, 4926,
+ 12043, 7608,
+ 12043, 8525, 6260,
+ 12043, 8649, 5965, 4926,
+ 12043, 9099, 4926,
+ 12043, 10161, 5965, 4926,
+ 12043, 10799, 5965, 4926,
+ 12043, 11067, 4926,
+ 12043, 11353, 4877, 4183, 11229, 8774,
+ 12043, 11353, 8775, 1177, 973, 2170,
+ 12043, 11353, 8775, 1177, 973, 2540,
+ 12043, 11353, 8775, 1177, 973, 2670,
+ 12043, 11353, 8775, 1177, 973, 2778,
+ 12043, 11353, 8775, 1177, 973, 4200,
+ 12043, 11353, 8775, 1177, 973, 4214,
+ 12043, 11353, 8775, 1177, 973, 5190,
+ 12043, 11353, 8775, 1177, 973, 6722,
+ 12043, 11353, 8775, 1177, 973, 7508,
+ 12043, 11353, 8775, 1177, 973, 7694,
+ 12043, 11353, 8775, 1177, 973, 8162,
+ 12043, 11353, 8775, 1177, 973, 8820,
+ 12043, 11353, 8775, 1177, 973, 8874,
+ 12043, 11353, 8775, 1177, 973, 8876,
+ 12043, 11353, 8775, 1177, 973, 9286,
+ 12043, 11353, 8775, 1177, 973, 9700,
+ 12043, 11353, 8775, 1177, 973, 10150,
+ 12043, 11353, 8775, 1177, 973, 10200,
+ 12043, 11353, 8775, 1177, 973, 10360,
+ 12043, 11353, 8775, 1177, 973, 10622,
+ 12043, 11353, 8775, 1177, 973, 11232,
+ 12043, 11353, 8775, 1177, 973, 11854,
+ 12043, 11353, 8775, 1177, 973, 11868,
+ 12043, 11353, 8775, 1177, 973, 11870,
+ 12043, 11353, 8775, 1177, 973, 11872,
+ 12043, 11353, 8775, 1177, 973, 12374,
+ 12043, 11353, 8775, 1177, 973, 12376,
+ 12043, 11353, 8775, 1177, 973, 12378,
+ 12043, 11353, 8775, 1177, 973, 12888,
+ 12043, 11353, 8775, 1177, 973, 12890,
+ 12043, 11353, 8775, 1177, 973, 12892,
+ 12043, 11353, 8775, 1177, 1870,
+ 12043, 11353, 8775, 1177, 4541, 2170,
+ 12043, 11353, 8775, 1177, 4541, 2540,
+ 12043, 11353, 8775, 1177, 4541, 2670,
+ 12043, 11353, 8775, 1177, 4541, 2778,
+ 12043, 11353, 8775, 1177, 4541, 4200,
+ 12043, 11353, 8775, 1177, 4541, 4214,
+ 12043, 11353, 8775, 1177, 4541, 5190,
+ 12043, 11353, 8775, 1177, 4541, 6260,
+ 12043, 11353, 8775, 1177, 4541, 6722,
+ 12043, 11353, 8775, 1177, 4541, 7508,
+ 12043, 11353, 8775, 1177, 4541, 7694,
+ 12043, 11353, 8775, 1177, 4541, 8162,
+ 12043, 11353, 8775, 1177, 4541, 8874,
+ 12043, 11353, 8775, 1177, 4541, 8876,
+ 12043, 11353, 8775, 1177, 4541, 9286,
+ 12043, 11353, 8775, 1177, 4541, 9700,
+ 12043, 11353, 8775, 1177, 4541, 10150,
+ 12043, 11353, 8775, 1177, 4541, 10200,
+ 12043, 11353, 8775, 1177, 4541, 10360,
+ 12043, 11353, 8775, 1177, 4541, 10622,
+ 12043, 11353, 8775, 1177, 4541, 11232,
+ 12043, 11353, 8775, 1177, 4541, 11868,
+ 12043, 11353, 8775, 1177, 4541, 11872,
+ 12043, 11353, 8775, 1177, 4541, 12376,
+ 12043, 11353, 8775, 1177, 4541, 12892,
+ 12043, 11353, 8775, 1177, 4682,
+ 12043, 11353, 8775, 1177, 4684,
+ 12043, 11353, 8775, 1177, 6420,
+ 12043, 11353, 8775, 1177, 7136,
+ 12043, 11353, 8775, 1177, 7958,
+ 12043, 11353, 8775, 1177, 9374,
+ 12043, 11353, 8775, 1177, 9528,
+ 12043, 11353, 8775, 1177, 9990,
+ 12043, 11353, 8775, 1177, 10176,
+ 12043, 11353, 8775, 1177, 10368,
+ 12043, 11353, 8775, 1177, 11230,
+ 12043, 11391, 11054,
+ 12043, 11415, 1861, 4926,
+ 12043, 11415, 2171, 4926,
+ 12043, 11415, 2725, 4926,
+ 12043, 11415, 2779, 4926,
+ 12043, 11415, 4215, 4926,
+ 12043, 11415, 6717, 4926,
+ 12043, 11415, 6791, 4926,
+ 12043, 11415, 7687, 4926,
+ 12043, 11415, 7695, 4926,
+ 12043, 11415, 8005, 4926,
+ 12043, 11415, 8233, 4926,
+ 12043, 11415, 8291, 4926,
+ 12043, 11415, 8473, 4926,
+ 12043, 11415, 8681, 4926,
+ 12043, 11415, 9433, 4926,
+ 12043, 11415, 9633, 4926,
+ 12043, 11937, 10759, 4223, 10580,
+ 12043, 11937, 10759, 4849, 569, 7442,
+ 12043, 11937, 10759, 4849, 569, 8473, 721, 7442,
+ 12043, 11937, 10759, 6377, 569, 6490,
+ 12043, 11937, 10759, 6377, 569, 8473, 721, 6490,
+ 12043, 11937, 10759, 10386,
+ 12043, 11937, 10759, 10581, 4221, 4848,
+ 12043, 11937, 10759, 10581, 4221, 6376,
+ 12043, 11937, 10759, 10581, 4221, 6490,
+ 12043, 11937, 10759, 10581, 4221, 7121, 4848,
+ 12043, 11937, 10759, 10581, 4221, 7773, 4848,
+ 12043, 11937, 10759, 10581, 4221, 7773, 7442,
+ 12055, 8724,
+ 12058,
+ 12061, 11415, 7922,
+ 12061, 11415, 11228,
+ 12061, 11415, 11850,
+ 12063, 8197, 721, 4923, 5758,
+ 12064,
+ 12075, 7821, 11765, 6434,
+ 12108,
+ 12117, 5758,
+ 12122,
+ 12133, 7608,
+ 12135, 5758,
+ 12143, 10758,
+ 12156,
+ 12342,
+ 12355, 2170,
+ 12355, 2540,
+ 12355, 2778,
+ 12355, 4200,
+ 12355, 4214,
+ 12355, 4849, 12114,
+ 12355, 5190,
+ 12355, 5445, 5758,
+ 12355, 6260,
+ 12355, 6722,
+ 12355, 7089, 7593, 8405, 16,
+ 12355, 7089, 7593, 8405, 26,
+ 12355, 7172,
+ 12355, 7443, 12114,
+ 12355, 7508,
+ 12355, 7694,
+ 12355, 8167, 5758,
+ 12371, 12492,
+ 12383, 10643, 6121, 4849, 4389, 6504,
+ 12383, 10643, 6121, 7443, 4389, 6504,
+ 12396,
+ 12399, 445, 10780,
+ 12403, 2209, 2671, 10625, 5758,
+ 12403, 2209, 7171, 5758,
+ 12403, 3961, 5566,
+ 12403, 6689, 2170,
+ 12403, 6689, 2540,
+ 12403, 6689, 2778,
+ 12403, 6689, 4200,
+ 12403, 6689, 4214,
+ 12403, 6689, 5190,
+ 12403, 6689, 6260,
+ 12403, 6689, 6722,
+ 12403, 6689, 7508,
+ 12403, 6689, 7694,
+ 12403, 8233, 5566,
+ 12413, 9063, 4,
+ 12413, 9063, 14,
+ 12413, 9063, 16,
+ 12413, 9063, 34,
+ 12413, 9063, 50,
+ 12428,
+ 12461, 10346,
+ 12463, 6505, 8056,
+ 12463, 6505, 8744,
+ 12463, 6505, 9158,
+ 12463, 7821, 8056,
+ 12463, 7821, 8744,
+ 12463, 7821, 9158,
+ 12464,
+ 12467, 10513, 7821, 11765, 6434,
+ 12473, 445, 6741, 568,
+ 12473, 445, 9705, 6741, 568,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 6376,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 6377, 4848,
+ 12473, 445, 9705, 6741, 569, 6121, 1045, 8318,
+ 12473, 445, 11098,
+ 12473, 445, 11621, 568,
+ 12473, 445, 11896,
+ 12473, 721, 2091, 11896,
+ 12473, 721, 12345, 2091, 6741, 568,
+ 12473, 835, 2091, 6741, 568,
+ 12473, 835, 2091, 11621, 568,
+ 12473, 5387, 6741, 568,
+ 12473, 5758,
+ 12473, 6121, 1044,
+ 12473, 6121, 8057, 8318,
+ 12473, 6121, 10469, 4927, 6376,
+ 12473, 6377, 9693, 445, 6740,
+ 12473, 6377, 9693, 6377, 11098,
+ 12473, 6377, 9705, 6741, 6377, 11099, 6377, 9705, 6740,
+ 12473, 6377, 11099, 6377, 12007, 6740,
+ 12473, 6377, 11765, 6434,
+ 12473, 6377, 12007, 6741, 6377, 11098,
+ 12473, 6741, 569, 445, 11098,
+ 12473, 7991, 11098,
+ 12473, 8065, 115, 6628,
+ 12473, 8065, 115, 6629, 6377, 9705, 6740,
+ 12473, 12105, 11098,
+ 12478,
+ 12480,
+ 12492,
+ 12493, 6121, 1044,
+ 12493, 6121, 9437, 720,
+ 12493, 6121, 9546,
+ 12493, 6377, 761, 6377, 7768,
+ 12493, 6377, 7768,
+ 12493, 7991, 721, 8329, 6121, 12492,
+ 12505, 3803, 477, 8774,
+ 12505, 3803, 2217, 8774,
+ 12505, 3803, 2413, 8774,
+ 12505, 3803, 6689, 2170,
+ 12505, 3803, 6689, 2540,
+ 12505, 3803, 6689, 2778,
+ 12505, 3803, 6689, 4200,
+ 12505, 3803, 6689, 4214,
+ 12505, 3803, 6689, 5190,
+ 12505, 3803, 6689, 6260,
+ 12505, 3803, 6689, 6722,
+ 12505, 3803, 6689, 7508,
+ 12505, 3803, 6689, 7694,
+ 12505, 3803, 7023, 8774,
+ 12505, 3803, 7202,
+ 12505, 3803, 7593, 0,
+ 12505, 3803, 7593, 2,
+ 12505, 3803, 7593, 4,
+ 12505, 3803, 7593, 6,
+ 12505, 3803, 7593, 8,
+ 12505, 3803, 7593, 10,
+ 12505, 3803, 7593, 12,
+ 12505, 3803, 7593, 14,
+ 12505, 3803, 7593, 16,
+ 12505, 3803, 7593, 18,
+ 12505, 3803, 7593, 20,
+ 12505, 3803, 7593, 22,
+ 12505, 3803, 7593, 24,
+ 12505, 3803, 7593, 26,
+ 12505, 3803, 7593, 28,
+ 12505, 3803, 7593, 30,
+ 12505, 3803, 7593, 32,
+ 12505, 3803, 7593, 34,
+ 12505, 3803, 7593, 36,
+ 12505, 3803, 7593, 38,
+ 12505, 3803, 7593, 40,
+ 12505, 3803, 7593, 42,
+ 12505, 3803, 7593, 44,
+ 12505, 3803, 7593, 46,
+ 12505, 3803, 7593, 48,
+ 12505, 3803, 7593, 50,
+ 12505, 3803, 7593, 384,
+ 12505, 3803, 7593, 416,
+ 12505, 3803, 7593, 476,
+ 12505, 3803, 7593, 644,
+ 12505, 3803, 7593, 888,
+ 12505, 3803, 7593, 1128,
+ 12505, 3803, 7593, 2216,
+ 12505, 3803, 7593, 2250,
+ 12505, 3803, 7593, 2412,
+ 12505, 3803, 7593, 2658,
+ 12505, 3803, 7593, 3774,
+ 12505, 3803, 7593, 4614,
+ 12505, 3803, 7593, 6262,
+ 12505, 3803, 7593, 6406,
+ 12505, 3803, 7593, 6674,
+ 12505, 3803, 7593, 6789, 7568,
+ 12505, 3803, 7593, 6824,
+ 12505, 3803, 7593, 7022,
+ 12505, 3803, 7593, 7080,
+ 12505, 3803, 7593, 7316,
+ 12505, 3803, 7593, 7568,
+ 12505, 3803, 7593, 7682,
+ 12505, 3803, 7593, 9162,
+ 12505, 3803, 7593, 9270,
+ 12505, 3803, 7593, 9530,
+ 12505, 3803, 7593, 9808,
+ 12505, 3803, 7683, 8774,
+ 12505, 3803, 8325, 477, 8774,
+ 12505, 3803, 8325, 2217, 8774,
+ 12505, 3803, 8325, 2413, 8774,
+ 12505, 3803, 8325, 7023, 8774,
+ 12505, 3803, 8325, 7202,
+ 12505, 3803, 8325, 7593, 0,
+ 12505, 3803, 8325, 7593, 2,
+ 12505, 3803, 8325, 7593, 4,
+ 12505, 3803, 8325, 7593, 6,
+ 12505, 3803, 8325, 7593, 8,
+ 12505, 3803, 8325, 7593, 10,
+ 12505, 3803, 8325, 7593, 12,
+ 12505, 3803, 8325, 7593, 14,
+ 12505, 3803, 8325, 7593, 16,
+ 12505, 3803, 8325, 7593, 18,
+ 12505, 3803, 8325, 7593, 20,
+ 12505, 3803, 8325, 7593, 22,
+ 12505, 3803, 8325, 7593, 24,
+ 12505, 3803, 8325, 7593, 26,
+ 12505, 3803, 8325, 7593, 28,
+ 12505, 3803, 8325, 7593, 30,
+ 12505, 3803, 8325, 7593, 32,
+ 12505, 3803, 8325, 7593, 34,
+ 12505, 3803, 8325, 7593, 36,
+ 12505, 3803, 8325, 7593, 38,
+ 12505, 3803, 8325, 7593, 40,
+ 12505, 3803, 8325, 7593, 42,
+ 12505, 3803, 8325, 7593, 44,
+ 12505, 3803, 8325, 7593, 46,
+ 12505, 3803, 8325, 7593, 48,
+ 12505, 3803, 8325, 7593, 50,
+ 12505, 3803, 8325, 7593, 384,
+ 12505, 3803, 8325, 7593, 416,
+ 12505, 3803, 8325, 7593, 476,
+ 12505, 3803, 8325, 7593, 644,
+ 12505, 3803, 8325, 7593, 888,
+ 12505, 3803, 8325, 7593, 1128,
+ 12505, 3803, 8325, 7593, 2216,
+ 12505, 3803, 8325, 7593, 2250,
+ 12505, 3803, 8325, 7593, 2412,
+ 12505, 3803, 8325, 7593, 2658,
+ 12505, 3803, 8325, 7593, 3774,
+ 12505, 3803, 8325, 7593, 4614,
+ 12505, 3803, 8325, 7593, 6262,
+ 12505, 3803, 8325, 7593, 6406,
+ 12505, 3803, 8325, 7593, 6674,
+ 12505, 3803, 8325, 7593, 6789, 7568,
+ 12505, 3803, 8325, 7593, 6824,
+ 12505, 3803, 8325, 7593, 7022,
+ 12505, 3803, 8325, 7593, 7080,
+ 12505, 3803, 8325, 7593, 7316,
+ 12505, 3803, 8325, 7593, 7568,
+ 12505, 3803, 8325, 7593, 7682,
+ 12505, 3803, 8325, 7593, 9270,
+ 12505, 3803, 8325, 7593, 9530,
+ 12505, 3803, 8325, 7593, 9808,
+ 12505, 3803, 8325, 7683, 8774,
+ 12505, 3803, 8325, 9063, 0,
+ 12505, 3803, 8325, 9063, 2,
+ 12505, 3803, 8325, 9063, 4,
+ 12505, 3803, 8325, 9063, 6,
+ 12505, 3803, 8325, 9063, 8,
+ 12505, 3803, 8325, 9063, 10,
+ 12505, 3803, 8325, 9063, 12,
+ 12505, 3803, 8325, 9063, 14,
+ 12505, 3803, 8325, 9063, 16,
+ 12505, 3803, 8325, 9063, 18,
+ 12505, 3803, 8325, 9063, 20,
+ 12505, 3803, 8325, 9063, 22,
+ 12505, 3803, 8325, 9063, 24,
+ 12505, 3803, 8325, 9063, 26,
+ 12505, 3803, 8325, 9063, 28,
+ 12505, 3803, 8325, 9063, 30,
+ 12505, 3803, 8325, 9063, 32,
+ 12505, 3803, 8325, 9063, 34,
+ 12505, 3803, 8325, 9063, 36,
+ 12505, 3803, 8325, 9063, 38,
+ 12505, 3803, 8325, 9063, 40,
+ 12505, 3803, 8325, 9063, 42,
+ 12505, 3803, 8325, 9063, 44,
+ 12505, 3803, 8325, 9063, 46,
+ 12505, 3803, 8325, 9063, 48,
+ 12505, 3803, 8325, 9063, 50,
+ 12505, 3803, 8325, 9063, 384,
+ 12505, 3803, 8325, 9063, 416,
+ 12505, 3803, 8325, 9063, 476,
+ 12505, 3803, 8325, 9063, 644,
+ 12505, 3803, 8325, 9063, 888,
+ 12505, 3803, 8325, 9063, 1128,
+ 12505, 3803, 8325, 9063, 2216,
+ 12505, 3803, 8325, 9063, 2250,
+ 12505, 3803, 8325, 9063, 2412,
+ 12505, 3803, 8325, 9063, 2658,
+ 12505, 3803, 8325, 9063, 3774,
+ 12505, 3803, 8325, 9063, 4614,
+ 12505, 3803, 8325, 9063, 6262,
+ 12505, 3803, 8325, 9063, 6406,
+ 12505, 3803, 8325, 9063, 6674,
+ 12505, 3803, 8325, 9063, 6824,
+ 12505, 3803, 8325, 9063, 7022,
+ 12505, 3803, 8325, 9063, 7080,
+ 12505, 3803, 8325, 9063, 7316,
+ 12505, 3803, 8325, 9063, 7568,
+ 12505, 3803, 8325, 9063, 7682,
+ 12505, 3803, 8325, 9063, 7683, 8774,
+ 12505, 3803, 8325, 9063, 9270,
+ 12505, 3803, 8325, 9063, 9530,
+ 12505, 3803, 8325, 9063, 9808,
+ 12505, 3803, 8325, 9271, 8774,
+ 12505, 3803, 8325, 9573, 12432,
+ 12505, 3803, 8679, 7593, 0,
+ 12505, 3803, 8679, 7593, 2,
+ 12505, 3803, 8679, 7593, 4,
+ 12505, 3803, 8679, 7593, 6,
+ 12505, 3803, 8679, 7593, 8,
+ 12505, 3803, 8679, 7593, 10,
+ 12505, 3803, 8679, 7593, 12,
+ 12505, 3803, 8679, 7593, 14,
+ 12505, 3803, 8679, 7593, 16,
+ 12505, 3803, 8679, 7593, 18,
+ 12505, 3803, 8679, 7593, 20,
+ 12505, 3803, 8679, 7593, 22,
+ 12505, 3803, 8679, 7593, 24,
+ 12505, 3803, 8679, 7593, 26,
+ 12505, 3803, 8679, 7593, 28,
+ 12505, 3803, 8679, 7593, 30,
+ 12505, 3803, 8679, 7593, 32,
+ 12505, 3803, 8679, 7593, 34,
+ 12505, 3803, 8679, 7593, 36,
+ 12505, 3803, 8679, 7593, 38,
+ 12505, 3803, 8679, 7593, 40,
+ 12505, 3803, 8679, 7593, 42,
+ 12505, 3803, 8679, 7593, 44,
+ 12505, 3803, 8679, 7593, 46,
+ 12505, 3803, 8679, 7593, 48,
+ 12505, 3803, 8679, 7593, 50,
+ 12505, 3803, 8679, 9063, 0,
+ 12505, 3803, 8679, 9063, 2,
+ 12505, 3803, 8679, 9063, 4,
+ 12505, 3803, 8679, 9063, 6,
+ 12505, 3803, 8679, 9063, 8,
+ 12505, 3803, 8679, 9063, 10,
+ 12505, 3803, 8679, 9063, 12,
+ 12505, 3803, 8679, 9063, 14,
+ 12505, 3803, 8679, 9063, 16,
+ 12505, 3803, 8679, 9063, 18,
+ 12505, 3803, 8679, 9063, 20,
+ 12505, 3803, 8679, 9063, 22,
+ 12505, 3803, 8679, 9063, 24,
+ 12505, 3803, 8679, 9063, 26,
+ 12505, 3803, 8679, 9063, 28,
+ 12505, 3803, 8679, 9063, 30,
+ 12505, 3803, 8679, 9063, 32,
+ 12505, 3803, 8679, 9063, 34,
+ 12505, 3803, 8679, 9063, 36,
+ 12505, 3803, 8679, 9063, 38,
+ 12505, 3803, 8679, 9063, 40,
+ 12505, 3803, 8679, 9063, 42,
+ 12505, 3803, 8679, 9063, 44,
+ 12505, 3803, 8679, 9063, 46,
+ 12505, 3803, 8679, 9063, 48,
+ 12505, 3803, 8679, 9063, 50,
+ 12505, 3803, 9063, 0,
+ 12505, 3803, 9063, 2,
+ 12505, 3803, 9063, 4,
+ 12505, 3803, 9063, 6,
+ 12505, 3803, 9063, 8,
+ 12505, 3803, 9063, 10,
+ 12505, 3803, 9063, 12,
+ 12505, 3803, 9063, 14,
+ 12505, 3803, 9063, 16,
+ 12505, 3803, 9063, 18,
+ 12505, 3803, 9063, 20,
+ 12505, 3803, 9063, 22,
+ 12505, 3803, 9063, 24,
+ 12505, 3803, 9063, 26,
+ 12505, 3803, 9063, 28,
+ 12505, 3803, 9063, 30,
+ 12505, 3803, 9063, 32,
+ 12505, 3803, 9063, 34,
+ 12505, 3803, 9063, 36,
+ 12505, 3803, 9063, 38,
+ 12505, 3803, 9063, 40,
+ 12505, 3803, 9063, 42,
+ 12505, 3803, 9063, 44,
+ 12505, 3803, 9063, 46,
+ 12505, 3803, 9063, 48,
+ 12505, 3803, 9063, 50,
+ 12505, 3803, 9063, 384,
+ 12505, 3803, 9063, 416,
+ 12505, 3803, 9063, 476,
+ 12505, 3803, 9063, 644,
+ 12505, 3803, 9063, 888,
+ 12505, 3803, 9063, 1128,
+ 12505, 3803, 9063, 2216,
+ 12505, 3803, 9063, 2250,
+ 12505, 3803, 9063, 2412,
+ 12505, 3803, 9063, 2658,
+ 12505, 3803, 9063, 3774,
+ 12505, 3803, 9063, 4614,
+ 12505, 3803, 9063, 6262,
+ 12505, 3803, 9063, 6406,
+ 12505, 3803, 9063, 6674,
+ 12505, 3803, 9063, 6824,
+ 12505, 3803, 9063, 7022,
+ 12505, 3803, 9063, 7080,
+ 12505, 3803, 9063, 7316,
+ 12505, 3803, 9063, 7568,
+ 12505, 3803, 9063, 7682,
+ 12505, 3803, 9063, 7683, 8774,
+ 12505, 3803, 9063, 9162,
+ 12505, 3803, 9063, 9270,
+ 12505, 3803, 9063, 9530,
+ 12505, 3803, 9063, 9808,
+ 12505, 3803, 9271, 8774,
+ 12505, 3803, 9295, 7593, 0,
+ 12505, 3803, 9295, 7593, 2,
+ 12505, 3803, 9295, 7593, 4,
+ 12505, 3803, 9295, 7593, 6,
+ 12505, 3803, 9295, 7593, 8,
+ 12505, 3803, 9295, 7593, 10,
+ 12505, 3803, 9295, 7593, 12,
+ 12505, 3803, 9295, 7593, 14,
+ 12505, 3803, 9295, 7593, 16,
+ 12505, 3803, 9295, 7593, 18,
+ 12505, 3803, 9295, 7593, 20,
+ 12505, 3803, 9295, 7593, 22,
+ 12505, 3803, 9295, 7593, 24,
+ 12505, 3803, 9295, 7593, 26,
+ 12505, 3803, 9295, 7593, 28,
+ 12505, 3803, 9295, 7593, 30,
+ 12505, 3803, 9295, 7593, 32,
+ 12505, 3803, 9295, 7593, 34,
+ 12505, 3803, 9295, 7593, 36,
+ 12505, 3803, 9295, 7593, 38,
+ 12505, 3803, 9295, 7593, 40,
+ 12505, 3803, 9295, 7593, 42,
+ 12505, 3803, 9295, 7593, 44,
+ 12505, 3803, 9295, 7593, 46,
+ 12505, 3803, 9295, 7593, 48,
+ 12505, 3803, 9295, 7593, 50,
+ 12505, 3803, 9295, 9063, 0,
+ 12505, 3803, 9295, 9063, 2,
+ 12505, 3803, 9295, 9063, 4,
+ 12505, 3803, 9295, 9063, 6,
+ 12505, 3803, 9295, 9063, 8,
+ 12505, 3803, 9295, 9063, 10,
+ 12505, 3803, 9295, 9063, 12,
+ 12505, 3803, 9295, 9063, 14,
+ 12505, 3803, 9295, 9063, 16,
+ 12505, 3803, 9295, 9063, 18,
+ 12505, 3803, 9295, 9063, 20,
+ 12505, 3803, 9295, 9063, 22,
+ 12505, 3803, 9295, 9063, 24,
+ 12505, 3803, 9295, 9063, 26,
+ 12505, 3803, 9295, 9063, 28,
+ 12505, 3803, 9295, 9063, 30,
+ 12505, 3803, 9295, 9063, 32,
+ 12505, 3803, 9295, 9063, 34,
+ 12505, 3803, 9295, 9063, 36,
+ 12505, 3803, 9295, 9063, 38,
+ 12505, 3803, 9295, 9063, 40,
+ 12505, 3803, 9295, 9063, 42,
+ 12505, 3803, 9295, 9063, 44,
+ 12505, 3803, 9295, 9063, 46,
+ 12505, 3803, 9295, 9063, 48,
+ 12505, 3803, 9295, 9063, 50,
+ 12505, 3803, 9573, 12432,
+ 12505, 4849, 6409, 9050,
+ 12505, 4849, 7821, 8745, 9050,
+ 12505, 4849, 7821, 10637, 7533, 9050,
+ 12505, 4849, 8153, 6409, 9050,
+ 12505, 4849, 10997, 12114,
+ 12505, 7443, 6409, 9050,
+ 12505, 7443, 7821, 8745, 9050,
+ 12505, 7443, 7821, 10637, 7533, 9050,
+ 12505, 7443, 8153, 6409, 9050,
+ 12505, 7443, 10997, 12114,
+ 12505, 8325, 477, 8774,
+ 12505, 8325, 2217, 8774,
+ 12505, 8325, 2413, 8774,
+ 12505, 8325, 7023, 8774,
+ 12505, 8325, 7202,
+ 12505, 8325, 7593, 0,
+ 12505, 8325, 7593, 2,
+ 12505, 8325, 7593, 4,
+ 12505, 8325, 7593, 6,
+ 12505, 8325, 7593, 8,
+ 12505, 8325, 7593, 10,
+ 12505, 8325, 7593, 12,
+ 12505, 8325, 7593, 16,
+ 12505, 8325, 7593, 18,
+ 12505, 8325, 7593, 20,
+ 12505, 8325, 7593, 22,
+ 12505, 8325, 7593, 24,
+ 12505, 8325, 7593, 26,
+ 12505, 8325, 7593, 28,
+ 12505, 8325, 7593, 30,
+ 12505, 8325, 7593, 32,
+ 12505, 8325, 7593, 34,
+ 12505, 8325, 7593, 36,
+ 12505, 8325, 7593, 38,
+ 12505, 8325, 7593, 40,
+ 12505, 8325, 7593, 42,
+ 12505, 8325, 7593, 44,
+ 12505, 8325, 7593, 46,
+ 12505, 8325, 7593, 48,
+ 12505, 8325, 7593, 50,
+ 12505, 8325, 7593, 384,
+ 12505, 8325, 7593, 416,
+ 12505, 8325, 7593, 476,
+ 12505, 8325, 7593, 644,
+ 12505, 8325, 7593, 888,
+ 12505, 8325, 7593, 1128,
+ 12505, 8325, 7593, 2216,
+ 12505, 8325, 7593, 2250,
+ 12505, 8325, 7593, 2412,
+ 12505, 8325, 7593, 2658,
+ 12505, 8325, 7593, 3774,
+ 12505, 8325, 7593, 4614,
+ 12505, 8325, 7593, 6262,
+ 12505, 8325, 7593, 6406,
+ 12505, 8325, 7593, 6674,
+ 12505, 8325, 7593, 6789, 7568,
+ 12505, 8325, 7593, 6824,
+ 12505, 8325, 7593, 7022,
+ 12505, 8325, 7593, 7080,
+ 12505, 8325, 7593, 7316,
+ 12505, 8325, 7593, 7568,
+ 12505, 8325, 7593, 7682,
+ 12505, 8325, 7593, 9185, 16,
+ 12505, 8325, 7593, 9185, 18,
+ 12505, 8325, 7593, 9270,
+ 12505, 8325, 7593, 9530,
+ 12505, 8325, 7593, 9808,
+ 12505, 8325, 7683, 8774,
+ 12505, 8325, 9063, 0,
+ 12505, 8325, 9063, 2,
+ 12505, 8325, 9063, 4,
+ 12505, 8325, 9063, 6,
+ 12505, 8325, 9063, 8,
+ 12505, 8325, 9063, 10,
+ 12505, 8325, 9063, 12,
+ 12505, 8325, 9063, 14,
+ 12505, 8325, 9063, 16,
+ 12505, 8325, 9063, 18,
+ 12505, 8325, 9063, 20,
+ 12505, 8325, 9063, 22,
+ 12505, 8325, 9063, 24,
+ 12505, 8325, 9063, 26,
+ 12505, 8325, 9063, 28,
+ 12505, 8325, 9063, 30,
+ 12505, 8325, 9063, 32,
+ 12505, 8325, 9063, 34,
+ 12505, 8325, 9063, 36,
+ 12505, 8325, 9063, 38,
+ 12505, 8325, 9063, 40,
+ 12505, 8325, 9063, 42,
+ 12505, 8325, 9063, 44,
+ 12505, 8325, 9063, 46,
+ 12505, 8325, 9063, 48,
+ 12505, 8325, 9063, 50,
+ 12505, 8325, 9063, 384,
+ 12505, 8325, 9063, 416,
+ 12505, 8325, 9063, 476,
+ 12505, 8325, 9063, 644,
+ 12505, 8325, 9063, 888,
+ 12505, 8325, 9063, 1128,
+ 12505, 8325, 9063, 2216,
+ 12505, 8325, 9063, 2250,
+ 12505, 8325, 9063, 2412,
+ 12505, 8325, 9063, 2658,
+ 12505, 8325, 9063, 3774,
+ 12505, 8325, 9063, 4614,
+ 12505, 8325, 9063, 6262,
+ 12505, 8325, 9063, 6406,
+ 12505, 8325, 9063, 6674,
+ 12505, 8325, 9063, 6824,
+ 12505, 8325, 9063, 7022,
+ 12505, 8325, 9063, 7080,
+ 12505, 8325, 9063, 7316,
+ 12505, 8325, 9063, 7568,
+ 12505, 8325, 9063, 7682,
+ 12505, 8325, 9063, 7683, 8774,
+ 12505, 8325, 9063, 9270,
+ 12505, 8325, 9063, 9530,
+ 12505, 8325, 9063, 9808,
+ 12505, 8325, 9271, 8774,
+ 12505, 8325, 9573, 12432,
+ 12505, 8679, 7593, 0,
+ 12505, 8679, 7593, 2,
+ 12505, 8679, 7593, 4,
+ 12505, 8679, 7593, 6,
+ 12505, 8679, 7593, 10,
+ 12505, 8679, 7593, 14,
+ 12505, 8679, 7593, 16,
+ 12505, 8679, 7593, 18,
+ 12505, 8679, 7593, 20,
+ 12505, 8679, 7593, 22,
+ 12505, 8679, 7593, 24,
+ 12505, 8679, 7593, 26,
+ 12505, 8679, 7593, 30,
+ 12505, 8679, 7593, 32,
+ 12505, 8679, 7593, 34,
+ 12505, 8679, 7593, 36,
+ 12505, 8679, 7593, 38,
+ 12505, 8679, 7593, 40,
+ 12505, 8679, 7593, 42,
+ 12505, 8679, 7593, 44,
+ 12505, 8679, 7593, 46,
+ 12505, 8679, 7593, 48,
+ 12505, 8679, 7593, 50,
+ 12505, 8679, 9063, 0,
+ 12505, 8679, 9063, 4,
+ 12505, 8679, 9063, 6,
+ 12505, 8679, 9063, 12,
+ 12505, 8679, 9063, 18,
+ 12505, 8679, 9063, 20,
+ 12505, 8679, 9063, 26,
+ 12505, 8679, 9063, 28,
+ 12505, 8679, 9063, 30,
+ 12505, 8679, 9063, 32,
+ 12505, 8679, 9063, 36,
+ 12505, 8679, 9063, 38,
+ 12505, 8679, 9063, 40,
+ 12505, 8679, 9063, 42,
+ 12505, 8679, 9063, 44,
+ 12505, 8679, 9063, 46,
+ 12505, 8679, 9063, 48,
+ 12505, 8679, 9063, 50,
+ 12505, 9295, 7593, 0,
+ 12505, 9295, 7593, 2,
+ 12505, 9295, 7593, 4,
+ 12505, 9295, 7593, 6,
+ 12505, 9295, 7593, 8,
+ 12505, 9295, 7593, 10,
+ 12505, 9295, 7593, 12,
+ 12505, 9295, 7593, 14,
+ 12505, 9295, 7593, 16,
+ 12505, 9295, 7593, 18,
+ 12505, 9295, 7593, 20,
+ 12505, 9295, 7593, 22,
+ 12505, 9295, 7593, 24,
+ 12505, 9295, 7593, 26,
+ 12505, 9295, 7593, 28,
+ 12505, 9295, 7593, 30,
+ 12505, 9295, 7593, 32,
+ 12505, 9295, 7593, 34,
+ 12505, 9295, 7593, 36,
+ 12505, 9295, 7593, 38,
+ 12505, 9295, 7593, 40,
+ 12505, 9295, 7593, 42,
+ 12505, 9295, 7593, 44,
+ 12505, 9295, 7593, 46,
+ 12505, 9295, 7593, 48,
+ 12505, 9295, 7593, 50,
+ 12505, 9295, 9063, 0,
+ 12505, 9295, 9063, 2,
+ 12505, 9295, 9063, 6,
+ 12505, 9295, 9063, 8,
+ 12505, 9295, 9063, 10,
+ 12505, 9295, 9063, 12,
+ 12505, 9295, 9063, 18,
+ 12505, 9295, 9063, 20,
+ 12505, 9295, 9063, 22,
+ 12505, 9295, 9063, 24,
+ 12505, 9295, 9063, 26,
+ 12505, 9295, 9063, 28,
+ 12505, 9295, 9063, 30,
+ 12505, 9295, 9063, 32,
+ 12505, 9295, 9063, 36,
+ 12505, 9295, 9063, 38,
+ 12505, 9295, 9063, 40,
+ 12505, 9295, 9063, 42,
+ 12505, 9295, 9063, 44,
+ 12505, 9295, 9063, 46,
+ 12505, 9295, 9063, 48,
+ 12505, 11129, 6689, 2170,
+ 12505, 11129, 6689, 2540,
+ 12505, 11129, 6689, 2778,
+ 12505, 11129, 6689, 4200,
+ 12505, 11129, 6689, 4214,
+ 12505, 11129, 6689, 5190,
+ 12505, 11129, 6689, 6260,
+ 12505, 11129, 6689, 6722,
+ 12505, 11129, 6689, 7508,
+ 12505, 11129, 6689, 7694,
+ 12505, 11129, 7593, 0,
+ 12505, 11129, 7593, 2,
+ 12505, 11129, 7593, 4,
+ 12505, 11129, 7593, 6,
+ 12505, 11129, 7593, 8,
+ 12505, 11129, 7593, 10,
+ 12505, 11129, 7593, 12,
+ 12505, 11129, 7593, 14,
+ 12505, 11129, 7593, 16,
+ 12505, 11129, 7593, 18,
+ 12505, 11129, 7593, 20,
+ 12505, 11129, 7593, 22,
+ 12505, 11129, 7593, 24,
+ 12505, 11129, 7593, 26,
+ 12505, 11129, 7593, 28,
+ 12505, 11129, 7593, 30,
+ 12505, 11129, 7593, 32,
+ 12505, 11129, 7593, 34,
+ 12505, 11129, 7593, 36,
+ 12505, 11129, 7593, 38,
+ 12505, 11129, 7593, 40,
+ 12505, 11129, 7593, 42,
+ 12505, 11129, 7593, 44,
+ 12505, 11129, 7593, 46,
+ 12505, 11129, 7593, 48,
+ 12505, 11129, 7593, 50,
+ 12505, 11129, 9063, 0,
+ 12505, 11129, 9063, 2,
+ 12505, 11129, 9063, 4,
+ 12505, 11129, 9063, 6,
+ 12505, 11129, 9063, 8,
+ 12505, 11129, 9063, 10,
+ 12505, 11129, 9063, 12,
+ 12505, 11129, 9063, 14,
+ 12505, 11129, 9063, 16,
+ 12505, 11129, 9063, 18,
+ 12505, 11129, 9063, 20,
+ 12505, 11129, 9063, 22,
+ 12505, 11129, 9063, 24,
+ 12505, 11129, 9063, 26,
+ 12505, 11129, 9063, 28,
+ 12505, 11129, 9063, 30,
+ 12505, 11129, 9063, 32,
+ 12505, 11129, 9063, 34,
+ 12505, 11129, 9063, 36,
+ 12505, 11129, 9063, 38,
+ 12505, 11129, 9063, 40,
+ 12505, 11129, 9063, 42,
+ 12505, 11129, 9063, 44,
+ 12505, 11129, 9063, 46,
+ 12505, 11129, 9063, 48,
+ 12505, 11129, 9063, 50,
+ 12505, 11767, 3803, 477, 8774,
+ 12505, 11767, 3803, 2217, 8774,
+ 12505, 11767, 3803, 2413, 8774,
+ 12505, 11767, 3803, 6689, 2170,
+ 12505, 11767, 3803, 6689, 2540,
+ 12505, 11767, 3803, 6689, 2778,
+ 12505, 11767, 3803, 6689, 4200,
+ 12505, 11767, 3803, 6689, 4214,
+ 12505, 11767, 3803, 6689, 5190,
+ 12505, 11767, 3803, 6689, 6260,
+ 12505, 11767, 3803, 6689, 6722,
+ 12505, 11767, 3803, 6689, 7508,
+ 12505, 11767, 3803, 6689, 7694,
+ 12505, 11767, 3803, 7023, 8774,
+ 12505, 11767, 3803, 7202,
+ 12505, 11767, 3803, 7593, 0,
+ 12505, 11767, 3803, 7593, 2,
+ 12505, 11767, 3803, 7593, 4,
+ 12505, 11767, 3803, 7593, 6,
+ 12505, 11767, 3803, 7593, 8,
+ 12505, 11767, 3803, 7593, 10,
+ 12505, 11767, 3803, 7593, 12,
+ 12505, 11767, 3803, 7593, 14,
+ 12505, 11767, 3803, 7593, 16,
+ 12505, 11767, 3803, 7593, 18,
+ 12505, 11767, 3803, 7593, 20,
+ 12505, 11767, 3803, 7593, 22,
+ 12505, 11767, 3803, 7593, 24,
+ 12505, 11767, 3803, 7593, 26,
+ 12505, 11767, 3803, 7593, 28,
+ 12505, 11767, 3803, 7593, 30,
+ 12505, 11767, 3803, 7593, 32,
+ 12505, 11767, 3803, 7593, 34,
+ 12505, 11767, 3803, 7593, 36,
+ 12505, 11767, 3803, 7593, 38,
+ 12505, 11767, 3803, 7593, 40,
+ 12505, 11767, 3803, 7593, 42,
+ 12505, 11767, 3803, 7593, 44,
+ 12505, 11767, 3803, 7593, 46,
+ 12505, 11767, 3803, 7593, 48,
+ 12505, 11767, 3803, 7593, 50,
+ 12505, 11767, 3803, 7593, 384,
+ 12505, 11767, 3803, 7593, 416,
+ 12505, 11767, 3803, 7593, 476,
+ 12505, 11767, 3803, 7593, 644,
+ 12505, 11767, 3803, 7593, 888,
+ 12505, 11767, 3803, 7593, 1128,
+ 12505, 11767, 3803, 7593, 2216,
+ 12505, 11767, 3803, 7593, 2250,
+ 12505, 11767, 3803, 7593, 2412,
+ 12505, 11767, 3803, 7593, 2658,
+ 12505, 11767, 3803, 7593, 3774,
+ 12505, 11767, 3803, 7593, 4614,
+ 12505, 11767, 3803, 7593, 6262,
+ 12505, 11767, 3803, 7593, 6406,
+ 12505, 11767, 3803, 7593, 6674,
+ 12505, 11767, 3803, 7593, 6789, 7568,
+ 12505, 11767, 3803, 7593, 6824,
+ 12505, 11767, 3803, 7593, 7022,
+ 12505, 11767, 3803, 7593, 7080,
+ 12505, 11767, 3803, 7593, 7316,
+ 12505, 11767, 3803, 7593, 7568,
+ 12505, 11767, 3803, 7593, 7682,
+ 12505, 11767, 3803, 7593, 9270,
+ 12505, 11767, 3803, 7593, 9530,
+ 12505, 11767, 3803, 7593, 9808,
+ 12505, 11767, 3803, 7683, 8774,
+ 12505, 11767, 3803, 8325, 477, 8774,
+ 12505, 11767, 3803, 8325, 2217, 8774,
+ 12505, 11767, 3803, 8325, 2413, 8774,
+ 12505, 11767, 3803, 8325, 7023, 8774,
+ 12505, 11767, 3803, 8325, 7202,
+ 12505, 11767, 3803, 8325, 7593, 0,
+ 12505, 11767, 3803, 8325, 7593, 2,
+ 12505, 11767, 3803, 8325, 7593, 4,
+ 12505, 11767, 3803, 8325, 7593, 6,
+ 12505, 11767, 3803, 8325, 7593, 8,
+ 12505, 11767, 3803, 8325, 7593, 10,
+ 12505, 11767, 3803, 8325, 7593, 12,
+ 12505, 11767, 3803, 8325, 7593, 14,
+ 12505, 11767, 3803, 8325, 7593, 16,
+ 12505, 11767, 3803, 8325, 7593, 18,
+ 12505, 11767, 3803, 8325, 7593, 20,
+ 12505, 11767, 3803, 8325, 7593, 22,
+ 12505, 11767, 3803, 8325, 7593, 24,
+ 12505, 11767, 3803, 8325, 7593, 26,
+ 12505, 11767, 3803, 8325, 7593, 28,
+ 12505, 11767, 3803, 8325, 7593, 30,
+ 12505, 11767, 3803, 8325, 7593, 32,
+ 12505, 11767, 3803, 8325, 7593, 34,
+ 12505, 11767, 3803, 8325, 7593, 36,
+ 12505, 11767, 3803, 8325, 7593, 38,
+ 12505, 11767, 3803, 8325, 7593, 40,
+ 12505, 11767, 3803, 8325, 7593, 42,
+ 12505, 11767, 3803, 8325, 7593, 44,
+ 12505, 11767, 3803, 8325, 7593, 46,
+ 12505, 11767, 3803, 8325, 7593, 48,
+ 12505, 11767, 3803, 8325, 7593, 50,
+ 12505, 11767, 3803, 8325, 7593, 384,
+ 12505, 11767, 3803, 8325, 7593, 416,
+ 12505, 11767, 3803, 8325, 7593, 476,
+ 12505, 11767, 3803, 8325, 7593, 644,
+ 12505, 11767, 3803, 8325, 7593, 888,
+ 12505, 11767, 3803, 8325, 7593, 1128,
+ 12505, 11767, 3803, 8325, 7593, 2216,
+ 12505, 11767, 3803, 8325, 7593, 2250,
+ 12505, 11767, 3803, 8325, 7593, 2412,
+ 12505, 11767, 3803, 8325, 7593, 2658,
+ 12505, 11767, 3803, 8325, 7593, 3774,
+ 12505, 11767, 3803, 8325, 7593, 4614,
+ 12505, 11767, 3803, 8325, 7593, 6262,
+ 12505, 11767, 3803, 8325, 7593, 6406,
+ 12505, 11767, 3803, 8325, 7593, 6674,
+ 12505, 11767, 3803, 8325, 7593, 6789, 7568,
+ 12505, 11767, 3803, 8325, 7593, 6824,
+ 12505, 11767, 3803, 8325, 7593, 7022,
+ 12505, 11767, 3803, 8325, 7593, 7080,
+ 12505, 11767, 3803, 8325, 7593, 7316,
+ 12505, 11767, 3803, 8325, 7593, 7568,
+ 12505, 11767, 3803, 8325, 7593, 7682,
+ 12505, 11767, 3803, 8325, 7593, 9270,
+ 12505, 11767, 3803, 8325, 7593, 9530,
+ 12505, 11767, 3803, 8325, 7593, 9808,
+ 12505, 11767, 3803, 8325, 7683, 8774,
+ 12505, 11767, 3803, 8325, 9063, 0,
+ 12505, 11767, 3803, 8325, 9063, 2,
+ 12505, 11767, 3803, 8325, 9063, 4,
+ 12505, 11767, 3803, 8325, 9063, 6,
+ 12505, 11767, 3803, 8325, 9063, 8,
+ 12505, 11767, 3803, 8325, 9063, 10,
+ 12505, 11767, 3803, 8325, 9063, 12,
+ 12505, 11767, 3803, 8325, 9063, 14,
+ 12505, 11767, 3803, 8325, 9063, 16,
+ 12505, 11767, 3803, 8325, 9063, 18,
+ 12505, 11767, 3803, 8325, 9063, 20,
+ 12505, 11767, 3803, 8325, 9063, 22,
+ 12505, 11767, 3803, 8325, 9063, 24,
+ 12505, 11767, 3803, 8325, 9063, 26,
+ 12505, 11767, 3803, 8325, 9063, 28,
+ 12505, 11767, 3803, 8325, 9063, 30,
+ 12505, 11767, 3803, 8325, 9063, 32,
+ 12505, 11767, 3803, 8325, 9063, 34,
+ 12505, 11767, 3803, 8325, 9063, 36,
+ 12505, 11767, 3803, 8325, 9063, 38,
+ 12505, 11767, 3803, 8325, 9063, 40,
+ 12505, 11767, 3803, 8325, 9063, 42,
+ 12505, 11767, 3803, 8325, 9063, 44,
+ 12505, 11767, 3803, 8325, 9063, 46,
+ 12505, 11767, 3803, 8325, 9063, 48,
+ 12505, 11767, 3803, 8325, 9063, 50,
+ 12505, 11767, 3803, 8325, 9063, 384,
+ 12505, 11767, 3803, 8325, 9063, 416,
+ 12505, 11767, 3803, 8325, 9063, 476,
+ 12505, 11767, 3803, 8325, 9063, 644,
+ 12505, 11767, 3803, 8325, 9063, 888,
+ 12505, 11767, 3803, 8325, 9063, 1128,
+ 12505, 11767, 3803, 8325, 9063, 2216,
+ 12505, 11767, 3803, 8325, 9063, 2250,
+ 12505, 11767, 3803, 8325, 9063, 2412,
+ 12505, 11767, 3803, 8325, 9063, 2658,
+ 12505, 11767, 3803, 8325, 9063, 3774,
+ 12505, 11767, 3803, 8325, 9063, 4614,
+ 12505, 11767, 3803, 8325, 9063, 6262,
+ 12505, 11767, 3803, 8325, 9063, 6406,
+ 12505, 11767, 3803, 8325, 9063, 6674,
+ 12505, 11767, 3803, 8325, 9063, 6824,
+ 12505, 11767, 3803, 8325, 9063, 7022,
+ 12505, 11767, 3803, 8325, 9063, 7080,
+ 12505, 11767, 3803, 8325, 9063, 7316,
+ 12505, 11767, 3803, 8325, 9063, 7568,
+ 12505, 11767, 3803, 8325, 9063, 7682,
+ 12505, 11767, 3803, 8325, 9063, 7683, 8774,
+ 12505, 11767, 3803, 8325, 9063, 9270,
+ 12505, 11767, 3803, 8325, 9063, 9530,
+ 12505, 11767, 3803, 8325, 9063, 9808,
+ 12505, 11767, 3803, 8325, 9271, 8774,
+ 12505, 11767, 3803, 8325, 9573, 12432,
+ 12505, 11767, 3803, 9063, 0,
+ 12505, 11767, 3803, 9063, 2,
+ 12505, 11767, 3803, 9063, 4,
+ 12505, 11767, 3803, 9063, 6,
+ 12505, 11767, 3803, 9063, 8,
+ 12505, 11767, 3803, 9063, 10,
+ 12505, 11767, 3803, 9063, 12,
+ 12505, 11767, 3803, 9063, 14,
+ 12505, 11767, 3803, 9063, 16,
+ 12505, 11767, 3803, 9063, 18,
+ 12505, 11767, 3803, 9063, 20,
+ 12505, 11767, 3803, 9063, 22,
+ 12505, 11767, 3803, 9063, 24,
+ 12505, 11767, 3803, 9063, 26,
+ 12505, 11767, 3803, 9063, 28,
+ 12505, 11767, 3803, 9063, 30,
+ 12505, 11767, 3803, 9063, 32,
+ 12505, 11767, 3803, 9063, 34,
+ 12505, 11767, 3803, 9063, 36,
+ 12505, 11767, 3803, 9063, 38,
+ 12505, 11767, 3803, 9063, 40,
+ 12505, 11767, 3803, 9063, 42,
+ 12505, 11767, 3803, 9063, 44,
+ 12505, 11767, 3803, 9063, 46,
+ 12505, 11767, 3803, 9063, 48,
+ 12505, 11767, 3803, 9063, 50,
+ 12505, 11767, 3803, 9063, 384,
+ 12505, 11767, 3803, 9063, 416,
+ 12505, 11767, 3803, 9063, 476,
+ 12505, 11767, 3803, 9063, 644,
+ 12505, 11767, 3803, 9063, 888,
+ 12505, 11767, 3803, 9063, 1128,
+ 12505, 11767, 3803, 9063, 2216,
+ 12505, 11767, 3803, 9063, 2250,
+ 12505, 11767, 3803, 9063, 2412,
+ 12505, 11767, 3803, 9063, 2658,
+ 12505, 11767, 3803, 9063, 3774,
+ 12505, 11767, 3803, 9063, 4614,
+ 12505, 11767, 3803, 9063, 6262,
+ 12505, 11767, 3803, 9063, 6406,
+ 12505, 11767, 3803, 9063, 6674,
+ 12505, 11767, 3803, 9063, 6824,
+ 12505, 11767, 3803, 9063, 7022,
+ 12505, 11767, 3803, 9063, 7080,
+ 12505, 11767, 3803, 9063, 7316,
+ 12505, 11767, 3803, 9063, 7568,
+ 12505, 11767, 3803, 9063, 7682,
+ 12505, 11767, 3803, 9063, 7683, 8774,
+ 12505, 11767, 3803, 9063, 9270,
+ 12505, 11767, 3803, 9063, 9530,
+ 12505, 11767, 3803, 9063, 9808,
+ 12505, 11767, 3803, 9271, 8774,
+ 12505, 11767, 3803, 9573, 12432,
+ 12505, 11767, 6689, 2170,
+ 12505, 11767, 6689, 2540,
+ 12505, 11767, 6689, 2778,
+ 12505, 11767, 6689, 4200,
+ 12505, 11767, 6689, 4214,
+ 12505, 11767, 6689, 5190,
+ 12505, 11767, 6689, 6260,
+ 12505, 11767, 6689, 6722,
+ 12505, 11767, 6689, 7508,
+ 12505, 11767, 6689, 7694,
+ 12505, 11767, 7593, 0,
+ 12505, 11767, 7593, 2,
+ 12505, 11767, 7593, 4,
+ 12505, 11767, 7593, 6,
+ 12505, 11767, 7593, 8,
+ 12505, 11767, 7593, 10,
+ 12505, 11767, 7593, 12,
+ 12505, 11767, 7593, 14,
+ 12505, 11767, 7593, 16,
+ 12505, 11767, 7593, 18,
+ 12505, 11767, 7593, 20,
+ 12505, 11767, 7593, 22,
+ 12505, 11767, 7593, 24,
+ 12505, 11767, 7593, 26,
+ 12505, 11767, 7593, 28,
+ 12505, 11767, 7593, 30,
+ 12505, 11767, 7593, 32,
+ 12505, 11767, 7593, 34,
+ 12505, 11767, 7593, 36,
+ 12505, 11767, 7593, 38,
+ 12505, 11767, 7593, 40,
+ 12505, 11767, 7593, 42,
+ 12505, 11767, 7593, 44,
+ 12505, 11767, 7593, 46,
+ 12505, 11767, 7593, 48,
+ 12505, 11767, 7593, 50,
+ 12505, 11767, 8325, 7593, 0,
+ 12505, 11767, 8325, 7593, 2,
+ 12505, 11767, 8325, 7593, 4,
+ 12505, 11767, 8325, 7593, 6,
+ 12505, 11767, 8325, 7593, 8,
+ 12505, 11767, 8325, 7593, 10,
+ 12505, 11767, 8325, 7593, 12,
+ 12505, 11767, 8325, 7593, 14,
+ 12505, 11767, 8325, 7593, 16,
+ 12505, 11767, 8325, 7593, 18,
+ 12505, 11767, 8325, 7593, 20,
+ 12505, 11767, 8325, 7593, 22,
+ 12505, 11767, 8325, 7593, 24,
+ 12505, 11767, 8325, 7593, 26,
+ 12505, 11767, 8325, 7593, 28,
+ 12505, 11767, 8325, 7593, 30,
+ 12505, 11767, 8325, 7593, 32,
+ 12505, 11767, 8325, 7593, 34,
+ 12505, 11767, 8325, 7593, 36,
+ 12505, 11767, 8325, 7593, 38,
+ 12505, 11767, 8325, 7593, 40,
+ 12505, 11767, 8325, 7593, 42,
+ 12505, 11767, 8325, 7593, 44,
+ 12505, 11767, 8325, 7593, 46,
+ 12505, 11767, 8325, 7593, 48,
+ 12505, 11767, 8325, 7593, 50,
+ 12505, 11767, 8325, 9063, 0,
+ 12505, 11767, 8325, 9063, 2,
+ 12505, 11767, 8325, 9063, 4,
+ 12505, 11767, 8325, 9063, 6,
+ 12505, 11767, 8325, 9063, 8,
+ 12505, 11767, 8325, 9063, 10,
+ 12505, 11767, 8325, 9063, 12,
+ 12505, 11767, 8325, 9063, 14,
+ 12505, 11767, 8325, 9063, 16,
+ 12505, 11767, 8325, 9063, 18,
+ 12505, 11767, 8325, 9063, 20,
+ 12505, 11767, 8325, 9063, 22,
+ 12505, 11767, 8325, 9063, 24,
+ 12505, 11767, 8325, 9063, 26,
+ 12505, 11767, 8325, 9063, 28,
+ 12505, 11767, 8325, 9063, 30,
+ 12505, 11767, 8325, 9063, 32,
+ 12505, 11767, 8325, 9063, 34,
+ 12505, 11767, 8325, 9063, 36,
+ 12505, 11767, 8325, 9063, 38,
+ 12505, 11767, 8325, 9063, 40,
+ 12505, 11767, 8325, 9063, 42,
+ 12505, 11767, 8325, 9063, 44,
+ 12505, 11767, 8325, 9063, 46,
+ 12505, 11767, 8325, 9063, 48,
+ 12505, 11767, 8325, 9063, 50,
+ 12505, 11767, 9063, 0,
+ 12505, 11767, 9063, 2,
+ 12505, 11767, 9063, 4,
+ 12505, 11767, 9063, 6,
+ 12505, 11767, 9063, 8,
+ 12505, 11767, 9063, 10,
+ 12505, 11767, 9063, 12,
+ 12505, 11767, 9063, 14,
+ 12505, 11767, 9063, 16,
+ 12505, 11767, 9063, 18,
+ 12505, 11767, 9063, 20,
+ 12505, 11767, 9063, 22,
+ 12505, 11767, 9063, 24,
+ 12505, 11767, 9063, 26,
+ 12505, 11767, 9063, 28,
+ 12505, 11767, 9063, 30,
+ 12505, 11767, 9063, 32,
+ 12505, 11767, 9063, 34,
+ 12505, 11767, 9063, 36,
+ 12505, 11767, 9063, 38,
+ 12505, 11767, 9063, 40,
+ 12505, 11767, 9063, 42,
+ 12505, 11767, 9063, 44,
+ 12505, 11767, 9063, 46,
+ 12505, 11767, 9063, 48,
+ 12505, 11767, 9063, 50,
+ 12505, 12929, 6689, 2170,
+ 12505, 12929, 6689, 2540,
+ 12505, 12929, 6689, 2778,
+ 12505, 12929, 6689, 4200,
+ 12505, 12929, 6689, 4214,
+ 12505, 12929, 6689, 5190,
+ 12505, 12929, 6689, 6260,
+ 12505, 12929, 6689, 6722,
+ 12505, 12929, 6689, 7508,
+ 12505, 12929, 6689, 7694,
+ 12505, 12929, 7593, 0,
+ 12505, 12929, 7593, 2,
+ 12505, 12929, 7593, 4,
+ 12505, 12929, 7593, 6,
+ 12505, 12929, 7593, 8,
+ 12505, 12929, 7593, 10,
+ 12505, 12929, 7593, 12,
+ 12505, 12929, 7593, 14,
+ 12505, 12929, 7593, 16,
+ 12505, 12929, 7593, 18,
+ 12505, 12929, 7593, 20,
+ 12505, 12929, 7593, 22,
+ 12505, 12929, 7593, 24,
+ 12505, 12929, 7593, 26,
+ 12505, 12929, 7593, 28,
+ 12505, 12929, 7593, 30,
+ 12505, 12929, 7593, 32,
+ 12505, 12929, 7593, 34,
+ 12505, 12929, 7593, 36,
+ 12505, 12929, 7593, 38,
+ 12505, 12929, 7593, 40,
+ 12505, 12929, 7593, 42,
+ 12505, 12929, 7593, 44,
+ 12505, 12929, 7593, 46,
+ 12505, 12929, 7593, 48,
+ 12505, 12929, 7593, 50,
+ 12505, 12929, 9063, 0,
+ 12505, 12929, 9063, 2,
+ 12505, 12929, 9063, 6,
+ 12505, 12929, 9063, 8,
+ 12505, 12929, 9063, 10,
+ 12505, 12929, 9063, 12,
+ 12505, 12929, 9063, 16,
+ 12505, 12929, 9063, 18,
+ 12505, 12929, 9063, 20,
+ 12505, 12929, 9063, 22,
+ 12505, 12929, 9063, 24,
+ 12505, 12929, 9063, 28,
+ 12505, 12929, 9063, 36,
+ 12505, 12929, 9063, 38,
+ 12505, 12929, 9063, 40,
+ 12505, 12929, 9063, 42,
+ 12505, 12929, 9063, 44,
+ 12505, 12929, 9063, 46,
+ 12505, 12929, 9063, 48,
+ 12517, 8306,
+ 12525, 5882,
+ 12527, 4213, 1177, 10677, 175, 3992,
+ 12527, 4213, 1177, 10677, 177, 3992,
+ 12527, 4213, 1177, 10677, 1809, 4876,
+ 12527, 4213, 1177, 10677, 2779, 1045, 8392,
+ 12527, 4213, 1177, 10677, 4849, 6409, 9050,
+ 12527, 4213, 1177, 10677, 4849, 6505, 11677, 9050,
+ 12527, 4213, 1177, 10677, 4849, 6627, 9050,
+ 12527, 4213, 1177, 10677, 4849, 7821, 8077, 9050,
+ 12527, 4213, 1177, 10677, 4849, 7821, 11677, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8077, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8153, 6409, 9050,
+ 12527, 4213, 1177, 10677, 4849, 8745, 9050,
+ 12527, 4213, 1177, 10677, 4849, 10637, 7533, 9050,
+ 12527, 4213, 1177, 10677, 4849, 12114,
+ 12527, 4213, 1177, 10677, 6107, 1809, 4876,
+ 12527, 4213, 1177, 10677, 6610,
+ 12527, 4213, 1177, 10677, 6616,
+ 12527, 4213, 1177, 10677, 7443, 6409, 9050,
+ 12527, 4213, 1177, 10677, 7443, 6505, 11677, 9050,
+ 12527, 4213, 1177, 10677, 7443, 6627, 9050,
+ 12527, 4213, 1177, 10677, 7443, 7821, 8077, 9050,
+ 12527, 4213, 1177, 10677, 7443, 7821, 11677, 9054,
+ 12527, 4213, 1177, 10677, 7443, 8077, 9050,
+ 12527, 4213, 1177, 10677, 7443, 8153, 6409, 9050,
+ 12527, 4213, 1177, 10677, 7443, 8745, 9050,
+ 12527, 4213, 1177, 10677, 7443, 10637, 7533, 9050,
+ 12527, 4213, 1177, 10677, 7443, 12114,
+ 12527, 4213, 1177, 10677, 10469, 4926,
+ 12527, 4213, 1177, 10677, 11224,
+ 12527, 4213, 1177, 10677, 11649, 10154,
+ 12527, 4213, 1177, 10677, 12017, 4926,
+ 12527, 4213, 1177, 10677, 12043, 4223, 5836,
+ 12527, 4213, 1177, 10677, 12043, 6616,
+ 12529, 568,
+ 12537, 7821, 11765, 6434,
+ 12540,
+ 12874,
+ 12881, 7608,
+ 12882,
+ 12895, 11765, 6434,
+ 12901, 2725, 11791, 6434,
+ 12901, 5385, 8057, 6434,
+ 12901, 8065, 8057, 6434,
+ 12901, 8241, 8057, 6434,
+ 12901, 9115, 10260,
+ 12901, 12056,
+ 12903, 835, 2091, 9855, 6741, 568,
+ 12903, 6741, 445, 6741, 568,
+ 12903, 6741, 568,
+ 12903, 6741, 569, 445, 2681, 6989, 428,
+ 12925, 11385, 8774,
+ 12929, 7201, 11262,
+ 12929, 7593, 476,
+ 12929, 7593, 6824,
+ 12929, 8325, 7593, 6,
+ 12929, 8325, 7593, 8,
+ 12929, 8325, 7593, 16,
+ 12929, 8325, 7593, 18,
+ 12929, 8325, 9063, 6,
+ 12929, 9063, 4,
+ 12929, 9063, 14,
+ 12929, 9063, 26,
+ 12929, 9063, 30,
+ 12929, 9063, 32,
+ 12929, 9063, 34,
+ 12929, 9063, 50,
+ 12929, 9063, 476,
+ 12929, 9063, 6824,
+ 12931, 10643, 6121, 4849, 4389, 6504,
+ 12931, 10643, 6121, 7443, 4389, 6504,
+ 12939, 5758,
+ 12941, 6741, 568,
+ 12941, 11621, 568,
+ 12967, 6409, 9050,
+ 12967, 8083, 6409, 9050,
+ 12967, 8153, 6409, 11195, 4926,
+ 12969, 4926,
+ 12969, 10390,
+ 12969, 10966,
+ 12975, 5758,
+ 12983, 11765, 6434,
+ 12987, 6689, 2170,
+ 12987, 6689, 2540,
+ 12987, 6689, 2778,
+ 12987, 6689, 4200,
+ 12987, 6689, 4214,
+ 12987, 6689, 5190,
+ 12987, 6689, 6722,
+ 12987, 6689, 7508,
+ 12987, 6689, 7694,
+ 12987, 7089, 7593, 8405, 0,
+ 12987, 7089, 7593, 8405, 2,
+ 12987, 7089, 7593, 8405, 4,
+ 12987, 7089, 7593, 8405, 6,
+ 12987, 7089, 7593, 8405, 8,
+ 12987, 7089, 7593, 8405, 10,
+ 12987, 7089, 7593, 8405, 12,
+ 12987, 7089, 7593, 8405, 14,
+ 12987, 7089, 7593, 8405, 16,
+ 12987, 7089, 7593, 8405, 18,
+ 12987, 7089, 7593, 8405, 20,
+ 12987, 7089, 7593, 8405, 22,
+ 12987, 7089, 7593, 8405, 24,
+ 12987, 7089, 7593, 8405, 26,
+ 12987, 7089, 7593, 8405, 28,
+ 12987, 7089, 7593, 8405, 30,
+ 12987, 7089, 7593, 8405, 32,
+ 12987, 7089, 7593, 8405, 34,
+ 12987, 7089, 7593, 8405, 36,
+ 12987, 7089, 7593, 8405, 38,
+ 12987, 7089, 7593, 8405, 40,
+ 12987, 7089, 7593, 8405, 42,
+ 12987, 7089, 7593, 8405, 44,
+ 12987, 7089, 7593, 8405, 46,
+ 12987, 7089, 7593, 8405, 48,
+ 12987, 7089, 7593, 8405, 50,
+ 12987, 8287, 5770,
+ 12987, 8287, 5771, 0,
+ 12987, 8287, 6594,
+ 12987, 8287, 6595, 0,
+ 12987, 8287, 6595, 40,
+ 12987, 8287, 6912,
+ 12987, 8287, 6913, 0,
+ 12987, 8287, 6982,
+ 12987, 8287, 6983, 0,
+ 12987, 8287, 7166,
+ 12987, 8287, 7167, 0,
+ 12987, 8287, 7244,
+ 12987, 8287, 7245, 0,
+ 12987, 8287, 7372,
+ 12987, 8287, 7373, 0,
+ 12987, 8287, 7440,
+ 12987, 8287, 7441, 0,
+ 12987, 8287, 8362,
+ 12987, 8287, 8363, 0,
+ 12987, 8287, 8828,
+ 12987, 8287, 8829, 0,
+ 12987, 8287, 9086,
+ 12987, 8287, 9087, 0,
+ 12987, 8287, 9400,
+ 12987, 8287, 9401, 0,
+ 12987, 8287, 9588,
+ 12987, 8287, 9589, 0,
+ 12987, 8287, 9780,
+ 12987, 8287, 9781, 0,
+ 12987, 8371, 10759, 29, 250,
+ 12987, 8371, 10759, 7310,
+ 12987, 8525, 2670,
+ 12987, 8525, 8162,
+ 12987, 8525, 8874,
+ 12987, 8525, 8876,
+ 12987, 8525, 9286,
+ 12987, 8525, 9700,
+ 12987, 8525, 10150,
+ 12987, 8525, 10200,
+ 12987, 8525, 10360,
+ 12987, 8525, 10622,
+ 12987, 8525, 11232,
+ 12987, 11043, 2170,
+ 12987, 11043, 2540,
+ 12987, 11043, 2586,
+ 12987, 11043, 2670,
+ 12987, 11043, 2778,
+ 12987, 11043, 3842,
+ 12987, 11043, 4194,
+ 12987, 11043, 4200,
+ 12987, 11043, 4214,
+ 12987, 11043, 4396,
+ 12987, 11043, 5012,
+ 12987, 11043, 5046,
+ 12987, 11043, 5190,
+ 12987, 11043, 5540,
+ 12987, 11043, 5650,
+ 12987, 11043, 6122,
+ 12987, 11043, 6716,
+ 12987, 11043, 6722,
+ 12987, 11043, 7072,
+ 12987, 11043, 7146,
+ 12987, 11043, 7428,
+ 12987, 11043, 7508,
+ 12987, 11043, 7640,
+ 12987, 11043, 7646,
+ 12987, 11043, 7694,
+ 12987, 11043, 7812,
+ 12987, 11043, 9714,
+ 12987, 11043, 9724,
+ 12987, 11043, 9862,
+ 12987, 11043, 10180,
+ 12987, 11043, 10484,
+ 12987, 11043, 10992,
+ 12987, 11043, 11208,
+ 12987, 11043, 11266,
+ 12987, 11043, 11612,
+ 12987, 11043, 13050,
+ 12990,
+ 12991, 6121, 36,
+ 13011, 4926,
+ 13011, 10390,
+ 13011, 10966,
+ 13022,
+ 13045, 6741, 568,
+ 13047, 9898,
+ 13061, 46,
+ 13061, 5758,
+ 13061, 5759, 275, 4849, 4389, 8056,
+ 13061, 5759, 275, 7443, 4389, 8056,
+ 13061, 5759, 275, 8153, 8056,
+ 13061, 5759, 275, 10642,
+ 13061, 5759, 6121, 1045, 6376,
+ 13061, 5759, 6121, 10666,
+ 13067, 6409, 9050,
+ 13067, 8083, 6409, 9050,
+ 13067, 8153, 6409, 11195, 4926,
+ 13070,
+ 13191, 7271, 4153, 6434,
+ 13191, 7607, 4153, 6434,
+ 13191, 11765, 6434,
+ 13231, 11765, 6434,
+ 13233, 9898,
+ 13235, 11765, 6434,
+ 13237, 11765, 6434,
+ 13365, 8153, 8306,
+ 13365, 8921, 7605, 4926,
+ 13365, 11185, 7605, 4926,
+ 13365, 12341, 7605, 4926,
+ 13381, 8774,
+ 13393, 7337, 8774,
+ 13403, 8279, 8774,
+ 13403, 8381, 8774,
+ 13417, 8774,
+ 13419, 8774,
+};
+static const struct { uint16_t code; uint32_t name:24; }
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+__attribute__((__packed__))
+#endif
+unicode_name_to_code[18242] = {
+ { 0x2114, 0 },
+ { 0x29CC, 4 },
+ { 0x2327, 7 },
+ { 0x22FF, 12 },
+ { 0x2987, 16 },
+ { 0x2989, 21 },
+ { 0x2981, 26 },
+ { 0x2982, 29 },
+ { 0x2A65, 33 },
+ { 0x2988, 37 },
+ { 0x298A, 42 },
+ { 0x2A64, 47 },
+ { 0x2A20, 51 },
+ { 0x2A21, 55 },
+ { 0x2A1F, 59 },
+ { 0x2A3E, 63 },
+ { 0x23E6, 67 },
+ { 0x2014, 69 },
+ { 0x2001, 71 },
+ { 0x2003, 73 },
+ { 0x2013, 75 },
+ { 0x2000, 77 },
+ { 0x2002, 79 },
+ { 0x1C78, 81 },
+ { 0x1C7D, 85 },
+ { 0x1C51, 88 },
+ { 0x1C56, 92 },
+ { 0x1C52, 96 },
+ { 0x1C55, 100 },
+ { 0x1C54, 104 },
+ { 0x1C59, 108 },
+ { 0x1C50, 112 },
+ { 0x1C58, 116 },
+ { 0x1C57, 120 },
+ { 0x1C53, 124 },
+ { 0x1C7B, 128 },
+ { 0x1C5C, 131 },
+ { 0x1C5E, 135 },
+ { 0x1C5B, 139 },
+ { 0x1C71, 143 },
+ { 0x1C6F, 147 },
+ { 0x1C66, 151 },
+ { 0x1C68, 155 },
+ { 0x1C65, 159 },
+ { 0x1C5A, 163 },
+ { 0x1C6E, 167 },
+ { 0x1C64, 171 },
+ { 0x1C73, 175 },
+ { 0x1C69, 179 },
+ { 0x1C75, 183 },
+ { 0x1C77, 187 },
+ { 0x1C76, 191 },
+ { 0x1C6A, 195 },
+ { 0x1C6B, 199 },
+ { 0x1C6D, 203 },
+ { 0x1C61, 207 },
+ { 0x1C60, 211 },
+ { 0x1C62, 215 },
+ { 0x1C63, 219 },
+ { 0x1C5D, 223 },
+ { 0x1C70, 227 },
+ { 0x1C72, 231 },
+ { 0x1C67, 235 },
+ { 0x1C5F, 239 },
+ { 0x1C74, 243 },
+ { 0x1C6C, 247 },
+ { 0x1C79, 251 },
+ { 0x1C7C, 255 },
+ { 0x1C7A, 258 },
+ { 0x1C7F, 262 },
+ { 0x1C7E, 267 },
+ { 0x27C7, 271 },
+ { 0x2951, 275 },
+ { 0x294D, 282 },
+ { 0x294C, 289 },
+ { 0x294F, 296 },
+ { 0x2195, 303 },
+ { 0x21A8, 306 },
+ { 0x2B0D, 311 },
+ { 0x21F3, 315 },
+ { 0x21D5, 319 },
+ { 0x297E, 323 },
+ { 0x22A5, 326 },
+ { 0x27DF, 328 },
+ { 0x29BD, 333 },
+ { 0x22F0, 337 },
+ { 0x2303, 341 },
+ { 0x2324, 343 },
+ { 0x54BC, 349 },
+ { 0x54B9, 352 },
+ { 0x54A1, 355 },
+ { 0x54B3, 358 },
+ { 0x54C6, 361 },
+ { 0x5491, 364 },
+ { 0x5498, 367 },
+ { 0x54A9, 370 },
+ { 0x54A8, 373 },
+ { 0x54B8, 376 },
+ { 0x549D, 379 },
+ { 0x54B2, 382 },
+ { 0x54A5, 385 },
+ { 0x54C3, 388 },
+ { 0x54BE, 391 },
+ { 0x5494, 394 },
+ { 0x54A3, 397 },
+ { 0x5497, 400 },
+ { 0x54B6, 403 },
+ { 0x54AD, 406 },
+ { 0x54B5, 409 },
+ { 0x5492, 412 },
+ { 0x54BB, 415 },
+ { 0x549A, 418 },
+ { 0x549C, 421 },
+ { 0x549E, 424 },
+ { 0x54AC, 427 },
+ { 0x5490, 430 },
+ { 0x54B0, 433 },
+ { 0x5495, 436 },
+ { 0x54A0, 439 },
+ { 0x54B1, 442 },
+ { 0x54AF, 445 },
+ { 0x54AE, 448 },
+ { 0x54AB, 451 },
+ { 0x54A2, 454 },
+ { 0x54C1, 457 },
+ { 0x549B, 460 },
+ { 0x54BD, 463 },
+ { 0x54A4, 466 },
+ { 0x5496, 469 },
+ { 0x54A6, 472 },
+ { 0x5499, 475 },
+ { 0x54BF, 478 },
+ { 0x549F, 481 },
+ { 0x54B7, 484 },
+ { 0x54AA, 487 },
+ { 0x54C5, 490 },
+ { 0x5493, 493 },
+ { 0x54A7, 496 },
+ { 0x54B4, 499 },
+ { 0x54C0, 502 },
+ { 0x54C2, 505 },
+ { 0x54BA, 508 },
+ { 0x54C4, 511 },
+ { 0x500A, 514 },
+ { 0x5014, 517 },
+ { 0x5002, 520 },
+ { 0x5011, 523 },
+ { 0x500B, 526 },
+ { 0x5008, 529 },
+ { 0x5009, 532 },
+ { 0x5020, 535 },
+ { 0x502A, 538 },
+ { 0x5018, 541 },
+ { 0x5027, 544 },
+ { 0x502E, 547 },
+ { 0x5034, 550 },
+ { 0x52B8, 553 },
+ { 0x52C2, 556 },
+ { 0x52B0, 559 },
+ { 0x52BF, 562 },
+ { 0x52C6, 565 },
+ { 0x52CC, 568 },
+ { 0x5109, 571 },
+ { 0x5112, 574 },
+ { 0x5102, 577 },
+ { 0x510F, 580 },
+ { 0x5116, 583 },
+ { 0x5013, 586 },
+ { 0x50D3, 589 },
+ { 0x50CF, 592 },
+ { 0x50D6, 595 },
+ { 0x50DA, 598 },
+ { 0x50E0, 601 },
+ { 0x51E4, 604 },
+ { 0x51F0, 607 },
+ { 0x51DC, 610 },
+ { 0x51EC, 613 },
+ { 0x51F4, 616 },
+ { 0x5273, 619 },
+ { 0x527E, 622 },
+ { 0x527B, 625 },
+ { 0x5006, 628 },
+ { 0x5003, 631 },
+ { 0x5000, 634 },
+ { 0x5001, 637 },
+ { 0x53E2, 640 },
+ { 0x53EE, 643 },
+ { 0x53F2, 646 },
+ { 0x53F8, 649 },
+ { 0x5201, 652 },
+ { 0x520C, 655 },
+ { 0x51FA, 658 },
+ { 0x5208, 661 },
+ { 0x5210, 664 },
+ { 0x51C1, 667 },
+ { 0x51CC, 670 },
+ { 0x51B9, 673 },
+ { 0x51C9, 676 },
+ { 0x51D0, 679 },
+ { 0x51D6, 682 },
+ { 0x50B7, 685 },
+ { 0x50C2, 688 },
+ { 0x50B0, 691 },
+ { 0x50BF, 694 },
+ { 0x50C5, 697 },
+ { 0x50CB, 700 },
+ { 0x5185, 703 },
+ { 0x518F, 706 },
+ { 0x517F, 709 },
+ { 0x518C, 712 },
+ { 0x5193, 715 },
+ { 0x5012, 718 },
+ { 0x500F, 721 },
+ { 0x5010, 724 },
+ { 0x5041, 727 },
+ { 0x503A, 730 },
+ { 0x5048, 733 },
+ { 0x504C, 736 },
+ { 0x5052, 739 },
+ { 0x53FE, 742 },
+ { 0x540A, 745 },
+ { 0x540E, 748 },
+ { 0x5414, 751 },
+ { 0x53C8, 754 },
+ { 0x53D2, 757 },
+ { 0x53CF, 760 },
+ { 0x53D6, 763 },
+ { 0x53DC, 766 },
+ { 0x5312, 769 },
+ { 0x531C, 772 },
+ { 0x530B, 775 },
+ { 0x5319, 778 },
+ { 0x5320, 781 },
+ { 0x5326, 784 },
+ { 0x5123, 787 },
+ { 0x512E, 790 },
+ { 0x511C, 793 },
+ { 0x512B, 796 },
+ { 0x5132, 799 },
+ { 0x500D, 802 },
+ { 0x50EC, 805 },
+ { 0x50E4, 808 },
+ { 0x50F0, 811 },
+ { 0x50F6, 814 },
+ { 0x50FC, 817 },
+ { 0x5282, 820 },
+ { 0x528B, 823 },
+ { 0x5288, 826 },
+ { 0x5015, 829 },
+ { 0x545F, 832 },
+ { 0x5469, 835 },
+ { 0x546D, 838 },
+ { 0x5473, 841 },
+ { 0x547F, 844 },
+ { 0x5483, 847 },
+ { 0x5489, 850 },
+ { 0x5296, 853 },
+ { 0x52A0, 856 },
+ { 0x528F, 859 },
+ { 0x529D, 862 },
+ { 0x52A4, 865 },
+ { 0x52AA, 868 },
+ { 0x5021, 871 },
+ { 0x501E, 874 },
+ { 0x501F, 877 },
+ { 0x5060, 880 },
+ { 0x506A, 883 },
+ { 0x5058, 886 },
+ { 0x5067, 889 },
+ { 0x506E, 892 },
+ { 0x5074, 895 },
+ { 0x502B, 898 },
+ { 0x5029, 901 },
+ { 0x501C, 904 },
+ { 0x5019, 907 },
+ { 0x5016, 910 },
+ { 0x5017, 913 },
+ { 0x5028, 916 },
+ { 0x5025, 919 },
+ { 0x5026, 922 },
+ { 0x5023, 925 },
+ { 0x502F, 928 },
+ { 0x5031, 931 },
+ { 0x502C, 934 },
+ { 0x502D, 937 },
+ { 0x5035, 940 },
+ { 0x5037, 943 },
+ { 0x5032, 946 },
+ { 0x5033, 949 },
+ { 0x52B9, 952 },
+ { 0x52B6, 955 },
+ { 0x52B7, 958 },
+ { 0x52C3, 961 },
+ { 0x52C1, 964 },
+ { 0x5363, 967 },
+ { 0x536F, 970 },
+ { 0x536B, 973 },
+ { 0x5372, 976 },
+ { 0x5378, 979 },
+ { 0x52B4, 982 },
+ { 0x52B1, 985 },
+ { 0x52AE, 988 },
+ { 0x52AF, 991 },
+ { 0x52C0, 994 },
+ { 0x52BD, 997 },
+ { 0x52BE, 1000 },
+ { 0x52BB, 1003 },
+ { 0x52C7, 1006 },
+ { 0x52C9, 1009 },
+ { 0x52C4, 1012 },
+ { 0x52C5, 1015 },
+ { 0x52CD, 1018 },
+ { 0x52CF, 1021 },
+ { 0x52CA, 1024 },
+ { 0x52CB, 1027 },
+ { 0x510A, 1030 },
+ { 0x5107, 1033 },
+ { 0x5108, 1036 },
+ { 0x513F, 1039 },
+ { 0x5149, 1042 },
+ { 0x5138, 1045 },
+ { 0x5146, 1048 },
+ { 0x514D, 1051 },
+ { 0x5113, 1054 },
+ { 0x5111, 1057 },
+ { 0x5105, 1060 },
+ { 0x5103, 1063 },
+ { 0x5100, 1066 },
+ { 0x5101, 1069 },
+ { 0x5110, 1072 },
+ { 0x510D, 1075 },
+ { 0x510E, 1078 },
+ { 0x510C, 1081 },
+ { 0x5117, 1084 },
+ { 0x5119, 1087 },
+ { 0x5114, 1090 },
+ { 0x5115, 1093 },
+ { 0x50D4, 1096 },
+ { 0x50D1, 1099 },
+ { 0x50D2, 1102 },
+ { 0x50D0, 1105 },
+ { 0x50CD, 1108 },
+ { 0x50CE, 1111 },
+ { 0x50D7, 1114 },
+ { 0x50D5, 1117 },
+ { 0x50DB, 1120 },
+ { 0x50DD, 1123 },
+ { 0x50D8, 1126 },
+ { 0x50D9, 1129 },
+ { 0x50E1, 1132 },
+ { 0x50DE, 1135 },
+ { 0x50DF, 1138 },
+ { 0x51E5, 1141 },
+ { 0x51E2, 1144 },
+ { 0x51E3, 1147 },
+ { 0x51F1, 1150 },
+ { 0x51EE, 1153 },
+ { 0x51EF, 1156 },
+ { 0x521C, 1159 },
+ { 0x5228, 1162 },
+ { 0x5216, 1165 },
+ { 0x5224, 1168 },
+ { 0x522C, 1171 },
+ { 0x51E0, 1174 },
+ { 0x51DD, 1177 },
+ { 0x51DA, 1180 },
+ { 0x51DB, 1183 },
+ { 0x51ED, 1186 },
+ { 0x51EA, 1189 },
+ { 0x51EB, 1192 },
+ { 0x51E8, 1195 },
+ { 0x51F5, 1198 },
+ { 0x51F7, 1201 },
+ { 0x51F2, 1204 },
+ { 0x51F3, 1207 },
+ { 0x5274, 1210 },
+ { 0x5271, 1213 },
+ { 0x5272, 1216 },
+ { 0x527F, 1219 },
+ { 0x527D, 1222 },
+ { 0x5270, 1225 },
+ { 0x526E, 1228 },
+ { 0x51A0, 1231 },
+ { 0x51A9, 1234 },
+ { 0x5199, 1237 },
+ { 0x51A6, 1240 },
+ { 0x51AD, 1243 },
+ { 0x51B3, 1246 },
+ { 0x509A, 1249 },
+ { 0x5093, 1252 },
+ { 0x50A1, 1255 },
+ { 0x50A5, 1258 },
+ { 0x50AA, 1261 },
+ { 0x5172, 1264 },
+ { 0x517A, 1267 },
+ { 0x516A, 1270 },
+ { 0x527C, 1273 },
+ { 0x5279, 1276 },
+ { 0x527A, 1279 },
+ { 0x5277, 1282 },
+ { 0x5250, 1285 },
+ { 0x525B, 1288 },
+ { 0x5248, 1291 },
+ { 0x5258, 1294 },
+ { 0x5007, 1297 },
+ { 0x5004, 1300 },
+ { 0x5005, 1303 },
+ { 0x53E6, 1306 },
+ { 0x53E3, 1309 },
+ { 0x53E0, 1312 },
+ { 0x53E1, 1315 },
+ { 0x541A, 1318 },
+ { 0x5425, 1321 },
+ { 0x5429, 1324 },
+ { 0x542F, 1327 },
+ { 0x53EF, 1330 },
+ { 0x53EC, 1333 },
+ { 0x53ED, 1336 },
+ { 0x53EA, 1339 },
+ { 0x53F3, 1342 },
+ { 0x53F5, 1345 },
+ { 0x53F0, 1348 },
+ { 0x53F1, 1351 },
+ { 0x53F9, 1354 },
+ { 0x53FB, 1357 },
+ { 0x53F6, 1360 },
+ { 0x53F7, 1363 },
+ { 0x5202, 1366 },
+ { 0x51FF, 1369 },
+ { 0x5200, 1372 },
+ { 0x520D, 1375 },
+ { 0x520A, 1378 },
+ { 0x520B, 1381 },
+ { 0x51FD, 1384 },
+ { 0x51FB, 1387 },
+ { 0x51F8, 1390 },
+ { 0x51F9, 1393 },
+ { 0x5209, 1396 },
+ { 0x5206, 1399 },
+ { 0x5207, 1402 },
+ { 0x5204, 1405 },
+ { 0x5211, 1408 },
+ { 0x5213, 1411 },
+ { 0x520E, 1414 },
+ { 0x520F, 1417 },
+ { 0x51C2, 1420 },
+ { 0x51BF, 1423 },
+ { 0x51C0, 1426 },
+ { 0x51CD, 1429 },
+ { 0x51CB, 1432 },
+ { 0x51BD, 1435 },
+ { 0x51BA, 1438 },
+ { 0x51B7, 1441 },
+ { 0x51B8, 1444 },
+ { 0x51CA, 1447 },
+ { 0x51C7, 1450 },
+ { 0x51C8, 1453 },
+ { 0x51C5, 1456 },
+ { 0x51D1, 1459 },
+ { 0x51D3, 1462 },
+ { 0x51CE, 1465 },
+ { 0x51CF, 1468 },
+ { 0x51D7, 1471 },
+ { 0x51D9, 1474 },
+ { 0x51D4, 1477 },
+ { 0x51D5, 1480 },
+ { 0x50B8, 1483 },
+ { 0x50B5, 1486 },
+ { 0x50B6, 1489 },
+ { 0x50C1, 1492 },
+ { 0x5234, 1495 },
+ { 0x523E, 1498 },
+ { 0x523B, 1501 },
+ { 0x5242, 1504 },
+ { 0x50B3, 1507 },
+ { 0x50B1, 1510 },
+ { 0x50AE, 1513 },
+ { 0x50AF, 1516 },
+ { 0x50C0, 1519 },
+ { 0x50BD, 1522 },
+ { 0x50BE, 1525 },
+ { 0x50BB, 1528 },
+ { 0x50C6, 1531 },
+ { 0x50C8, 1534 },
+ { 0x50C3, 1537 },
+ { 0x50C4, 1540 },
+ { 0x50CC, 1543 },
+ { 0x50C9, 1546 },
+ { 0x50CA, 1549 },
+ { 0x5186, 1552 },
+ { 0x5184, 1555 },
+ { 0x507F, 1558 },
+ { 0x5078, 1561 },
+ { 0x5083, 1564 },
+ { 0x5087, 1567 },
+ { 0x508D, 1570 },
+ { 0x5159, 1573 },
+ { 0x5160, 1576 },
+ { 0x5153, 1579 },
+ { 0x515D, 1582 },
+ { 0x5164, 1585 },
+ { 0x5190, 1588 },
+ { 0x518E, 1591 },
+ { 0x5262, 1594 },
+ { 0x526C, 1597 },
+ { 0x5269, 1600 },
+ { 0x5182, 1603 },
+ { 0x5180, 1606 },
+ { 0x517D, 1609 },
+ { 0x517E, 1612 },
+ { 0x5433, 1615 },
+ { 0x543D, 1618 },
+ { 0x5440, 1621 },
+ { 0x5446, 1624 },
+ { 0x518D, 1627 },
+ { 0x518A, 1630 },
+ { 0x518B, 1633 },
+ { 0x5396, 1636 },
+ { 0x539D, 1639 },
+ { 0x5399, 1642 },
+ { 0x53A1, 1645 },
+ { 0x53A7, 1648 },
+ { 0x5188, 1651 },
+ { 0x5194, 1654 },
+ { 0x5196, 1657 },
+ { 0x5191, 1660 },
+ { 0x5192, 1663 },
+ { 0x544C, 1666 },
+ { 0x5457, 1669 },
+ { 0x545B, 1672 },
+ { 0x52F6, 1675 },
+ { 0x52FD, 1678 },
+ { 0x52EF, 1681 },
+ { 0x52FF, 1684 },
+ { 0x5305, 1687 },
+ { 0x5042, 1690 },
+ { 0x503F, 1693 },
+ { 0x5040, 1696 },
+ { 0x503D, 1699 },
+ { 0x503B, 1702 },
+ { 0x5038, 1705 },
+ { 0x5039, 1708 },
+ { 0x5049, 1711 },
+ { 0x5046, 1714 },
+ { 0x5047, 1717 },
+ { 0x5044, 1720 },
+ { 0x504D, 1723 },
+ { 0x504F, 1726 },
+ { 0x504A, 1729 },
+ { 0x504B, 1732 },
+ { 0x5053, 1735 },
+ { 0x5055, 1738 },
+ { 0x5050, 1741 },
+ { 0x5051, 1744 },
+ { 0x5402, 1747 },
+ { 0x53FF, 1750 },
+ { 0x53FC, 1753 },
+ { 0x53FD, 1756 },
+ { 0x540B, 1759 },
+ { 0x5408, 1762 },
+ { 0x5409, 1765 },
+ { 0x5406, 1768 },
+ { 0x540F, 1771 },
+ { 0x5411, 1774 },
+ { 0x540C, 1777 },
+ { 0x540D, 1780 },
+ { 0x5415, 1783 },
+ { 0x5417, 1786 },
+ { 0x5412, 1789 },
+ { 0x5413, 1792 },
+ { 0x53C9, 1795 },
+ { 0x53C6, 1798 },
+ { 0x53C7, 1801 },
+ { 0x53D3, 1804 },
+ { 0x53D1, 1807 },
+ { 0x53D0, 1810 },
+ { 0x53CD, 1813 },
+ { 0x53CE, 1816 },
+ { 0x537D, 1819 },
+ { 0x5386, 1822 },
+ { 0x5382, 1825 },
+ { 0x538A, 1828 },
+ { 0x5390, 1831 },
+ { 0x53CB, 1834 },
+ { 0x53D7, 1837 },
+ { 0x53D9, 1840 },
+ { 0x53D4, 1843 },
+ { 0x53D5, 1846 },
+ { 0x53DD, 1849 },
+ { 0x53DF, 1852 },
+ { 0x53DA, 1855 },
+ { 0x53DB, 1858 },
+ { 0x5313, 1861 },
+ { 0x5310, 1864 },
+ { 0x5311, 1867 },
+ { 0x531D, 1870 },
+ { 0x531B, 1873 },
+ { 0x53AD, 1876 },
+ { 0x53B8, 1879 },
+ { 0x53B4, 1882 },
+ { 0x53BC, 1885 },
+ { 0x53C2, 1888 },
+ { 0x530E, 1891 },
+ { 0x530C, 1894 },
+ { 0x5309, 1897 },
+ { 0x530A, 1900 },
+ { 0x531A, 1903 },
+ { 0x5317, 1906 },
+ { 0x5318, 1909 },
+ { 0x5333, 1912 },
+ { 0x533A, 1915 },
+ { 0x532C, 1918 },
+ { 0x5337, 1921 },
+ { 0x533E, 1924 },
+ { 0x5342, 1927 },
+ { 0x5315, 1930 },
+ { 0x5321, 1933 },
+ { 0x5323, 1936 },
+ { 0x531E, 1939 },
+ { 0x531F, 1942 },
+ { 0x5327, 1945 },
+ { 0x5329, 1948 },
+ { 0x5324, 1951 },
+ { 0x5325, 1954 },
+ { 0x5124, 1957 },
+ { 0x5121, 1960 },
+ { 0x5122, 1963 },
+ { 0x512F, 1966 },
+ { 0x512D, 1969 },
+ { 0x511F, 1972 },
+ { 0x511D, 1975 },
+ { 0x511A, 1978 },
+ { 0x511B, 1981 },
+ { 0x512C, 1984 },
+ { 0x5129, 1987 },
+ { 0x512A, 1990 },
+ { 0x5127, 1993 },
+ { 0x5133, 1996 },
+ { 0x5135, 1999 },
+ { 0x5130, 2002 },
+ { 0x5131, 2005 },
+ { 0x500E, 2008 },
+ { 0x500C, 2011 },
+ { 0x50ED, 2014 },
+ { 0x50EA, 2017 },
+ { 0x50EB, 2020 },
+ { 0x50F3, 2023 },
+ { 0x50F2, 2026 },
+ { 0x50E8, 2029 },
+ { 0x50E5, 2032 },
+ { 0x50E2, 2035 },
+ { 0x50E3, 2038 },
+ { 0x50F1, 2041 },
+ { 0x50EE, 2044 },
+ { 0x50EF, 2047 },
+ { 0x50F7, 2050 },
+ { 0x50F9, 2053 },
+ { 0x50F4, 2056 },
+ { 0x50F5, 2059 },
+ { 0x50FD, 2062 },
+ { 0x50FF, 2065 },
+ { 0x50FA, 2068 },
+ { 0x50FB, 2071 },
+ { 0x5283, 2074 },
+ { 0x5280, 2077 },
+ { 0x5281, 2080 },
+ { 0x528C, 2083 },
+ { 0x528A, 2086 },
+ { 0x5289, 2089 },
+ { 0x5287, 2092 },
+ { 0x5285, 2095 },
+ { 0x5463, 2098 },
+ { 0x5460, 2101 },
+ { 0x545D, 2104 },
+ { 0x545E, 2107 },
+ { 0x546A, 2110 },
+ { 0x5467, 2113 },
+ { 0x5468, 2116 },
+ { 0x5466, 2119 },
+ { 0x546E, 2122 },
+ { 0x5470, 2125 },
+ { 0x546B, 2128 },
+ { 0x546C, 2131 },
+ { 0x5477, 2134 },
+ { 0x5474, 2137 },
+ { 0x5471, 2140 },
+ { 0x5472, 2143 },
+ { 0x5480, 2146 },
+ { 0x547D, 2149 },
+ { 0x547E, 2152 },
+ { 0x547B, 2155 },
+ { 0x5484, 2158 },
+ { 0x5486, 2161 },
+ { 0x5481, 2164 },
+ { 0x5482, 2167 },
+ { 0x548A, 2170 },
+ { 0x548C, 2173 },
+ { 0x5487, 2176 },
+ { 0x5488, 2179 },
+ { 0x5297, 2182 },
+ { 0x5294, 2185 },
+ { 0x5295, 2188 },
+ { 0x52A1, 2191 },
+ { 0x529F, 2194 },
+ { 0x5348, 2197 },
+ { 0x5353, 2200 },
+ { 0x534F, 2203 },
+ { 0x5357, 2206 },
+ { 0x535D, 2209 },
+ { 0x5292, 2212 },
+ { 0x5290, 2215 },
+ { 0x528D, 2218 },
+ { 0x528E, 2221 },
+ { 0x529E, 2224 },
+ { 0x529B, 2227 },
+ { 0x529C, 2230 },
+ { 0x5299, 2233 },
+ { 0x52A5, 2236 },
+ { 0x52A7, 2239 },
+ { 0x52A2, 2242 },
+ { 0x52A3, 2245 },
+ { 0x52AB, 2248 },
+ { 0x52AD, 2251 },
+ { 0x52A8, 2254 },
+ { 0x52A9, 2257 },
+ { 0x52DA, 2260 },
+ { 0x52E0, 2263 },
+ { 0x52D2, 2266 },
+ { 0x52DD, 2269 },
+ { 0x52E3, 2272 },
+ { 0x52E9, 2275 },
+ { 0x5061, 2278 },
+ { 0x505E, 2281 },
+ { 0x505F, 2284 },
+ { 0x506B, 2287 },
+ { 0x5069, 2290 },
+ { 0x505C, 2293 },
+ { 0x5059, 2296 },
+ { 0x5056, 2299 },
+ { 0x5057, 2302 },
+ { 0x5068, 2305 },
+ { 0x5065, 2308 },
+ { 0x5066, 2311 },
+ { 0x5063, 2314 },
+ { 0x506F, 2317 },
+ { 0x5071, 2320 },
+ { 0x506C, 2323 },
+ { 0x506D, 2326 },
+ { 0x5075, 2329 },
+ { 0x5072, 2332 },
+ { 0x5073, 2335 },
+ { 0x501D, 2338 },
+ { 0x501A, 2341 },
+ { 0x501B, 2344 },
+ { 0x5024, 2347 },
+ { 0x5022, 2350 },
+ { 0x5030, 2353 },
+ { 0x5036, 2356 },
+ { 0x5364, 2359 },
+ { 0x5361, 2362 },
+ { 0x5362, 2365 },
+ { 0x5370, 2368 },
+ { 0x536D, 2371 },
+ { 0x536E, 2374 },
+ { 0x536C, 2377 },
+ { 0x5369, 2380 },
+ { 0x536A, 2383 },
+ { 0x5367, 2386 },
+ { 0x5373, 2389 },
+ { 0x5375, 2392 },
+ { 0x5371, 2395 },
+ { 0x5379, 2398 },
+ { 0x537B, 2401 },
+ { 0x5376, 2404 },
+ { 0x5377, 2407 },
+ { 0x52B5, 2410 },
+ { 0x52B2, 2413 },
+ { 0x52B3, 2416 },
+ { 0x52BC, 2419 },
+ { 0x52BA, 2422 },
+ { 0x52C8, 2425 },
+ { 0x52CE, 2428 },
+ { 0x5140, 2431 },
+ { 0x513D, 2434 },
+ { 0x513E, 2437 },
+ { 0x514A, 2440 },
+ { 0x5148, 2443 },
+ { 0x513B, 2446 },
+ { 0x5139, 2449 },
+ { 0x5136, 2452 },
+ { 0x5137, 2455 },
+ { 0x5147, 2458 },
+ { 0x5144, 2461 },
+ { 0x5145, 2464 },
+ { 0x5142, 2467 },
+ { 0x514E, 2470 },
+ { 0x5150, 2473 },
+ { 0x514B, 2476 },
+ { 0x514C, 2479 },
+ { 0x5106, 2482 },
+ { 0x5104, 2485 },
+ { 0x510B, 2488 },
+ { 0x5118, 2491 },
+ { 0x50DC, 2494 },
+ { 0x521D, 2497 },
+ { 0x521A, 2500 },
+ { 0x521B, 2503 },
+ { 0x5229, 2506 },
+ { 0x5226, 2509 },
+ { 0x5227, 2512 },
+ { 0x5218, 2515 },
+ { 0x5214, 2518 },
+ { 0x5215, 2521 },
+ { 0x5225, 2524 },
+ { 0x5222, 2527 },
+ { 0x5223, 2530 },
+ { 0x5220, 2533 },
+ { 0x522D, 2536 },
+ { 0x522F, 2539 },
+ { 0x522A, 2542 },
+ { 0x522B, 2545 },
+ { 0x51E1, 2548 },
+ { 0x51DE, 2551 },
+ { 0x51DF, 2554 },
+ { 0x51E9, 2557 },
+ { 0x51E6, 2560 },
+ { 0x51E7, 2563 },
+ { 0x51F6, 2566 },
+ { 0x526F, 2569 },
+ { 0x51A1, 2572 },
+ { 0x519E, 2575 },
+ { 0x519F, 2578 },
+ { 0x51AA, 2581 },
+ { 0x51A8, 2584 },
+ { 0x519C, 2587 },
+ { 0x519A, 2590 },
+ { 0x5197, 2593 },
+ { 0x5198, 2596 },
+ { 0x51A7, 2599 },
+ { 0x51A5, 2602 },
+ { 0x51A3, 2605 },
+ { 0x51AE, 2608 },
+ { 0x51B0, 2611 },
+ { 0x51AB, 2614 },
+ { 0x51AC, 2617 },
+ { 0x51B4, 2620 },
+ { 0x51B6, 2623 },
+ { 0x51B1, 2626 },
+ { 0x51B2, 2629 },
+ { 0x509B, 2632 },
+ { 0x5098, 2635 },
+ { 0x5099, 2638 },
+ { 0x5096, 2641 },
+ { 0x5094, 2644 },
+ { 0x5091, 2647 },
+ { 0x5092, 2650 },
+ { 0x50A2, 2653 },
+ { 0x509F, 2656 },
+ { 0x50A0, 2659 },
+ { 0x509D, 2662 },
+ { 0x50A6, 2665 },
+ { 0x50A8, 2668 },
+ { 0x50A3, 2671 },
+ { 0x50A4, 2674 },
+ { 0x50AB, 2677 },
+ { 0x50AD, 2680 },
+ { 0x50A9, 2683 },
+ { 0x5173, 2686 },
+ { 0x5170, 2689 },
+ { 0x5171, 2692 },
+ { 0x517B, 2695 },
+ { 0x5179, 2698 },
+ { 0x516E, 2701 },
+ { 0x516B, 2704 },
+ { 0x5168, 2707 },
+ { 0x5169, 2710 },
+ { 0x5178, 2713 },
+ { 0x5176, 2716 },
+ { 0x5177, 2719 },
+ { 0x5175, 2722 },
+ { 0x517C, 2725 },
+ { 0x5278, 2728 },
+ { 0x5275, 2731 },
+ { 0x5276, 2734 },
+ { 0x5251, 2737 },
+ { 0x524E, 2740 },
+ { 0x524F, 2743 },
+ { 0x525C, 2746 },
+ { 0x525A, 2749 },
+ { 0x524C, 2752 },
+ { 0x5249, 2755 },
+ { 0x5246, 2758 },
+ { 0x5247, 2761 },
+ { 0x5259, 2764 },
+ { 0x5256, 2767 },
+ { 0x5257, 2770 },
+ { 0x5254, 2773 },
+ { 0x53E7, 2776 },
+ { 0x53E4, 2779 },
+ { 0x53E5, 2782 },
+ { 0x541E, 2785 },
+ { 0x541B, 2788 },
+ { 0x5418, 2791 },
+ { 0x5419, 2794 },
+ { 0x5426, 2797 },
+ { 0x5423, 2800 },
+ { 0x5424, 2803 },
+ { 0x5421, 2806 },
+ { 0x542A, 2809 },
+ { 0x542C, 2812 },
+ { 0x5427, 2815 },
+ { 0x5428, 2818 },
+ { 0x5430, 2821 },
+ { 0x542D, 2824 },
+ { 0x542E, 2827 },
+ { 0x53EB, 2830 },
+ { 0x53E8, 2833 },
+ { 0x53E9, 2836 },
+ { 0x53F4, 2839 },
+ { 0x53FA, 2842 },
+ { 0x51FE, 2845 },
+ { 0x51FC, 2848 },
+ { 0x5205, 2851 },
+ { 0x5203, 2854 },
+ { 0x5212, 2857 },
+ { 0x51BE, 2860 },
+ { 0x51BB, 2863 },
+ { 0x51BC, 2866 },
+ { 0x51C6, 2869 },
+ { 0x51C3, 2872 },
+ { 0x51C4, 2875 },
+ { 0x51D2, 2878 },
+ { 0x51D8, 2881 },
+ { 0x5235, 2884 },
+ { 0x5232, 2887 },
+ { 0x5233, 2890 },
+ { 0x523F, 2893 },
+ { 0x523D, 2896 },
+ { 0x5231, 2899 },
+ { 0x523C, 2902 },
+ { 0x5239, 2905 },
+ { 0x523A, 2908 },
+ { 0x5237, 2911 },
+ { 0x5243, 2914 },
+ { 0x5245, 2917 },
+ { 0x5240, 2920 },
+ { 0x5241, 2923 },
+ { 0x50B4, 2926 },
+ { 0x50B2, 2929 },
+ { 0x50BC, 2932 },
+ { 0x50B9, 2935 },
+ { 0x50BA, 2938 },
+ { 0x50C7, 2941 },
+ { 0x5080, 2944 },
+ { 0x507D, 2947 },
+ { 0x507E, 2950 },
+ { 0x507B, 2953 },
+ { 0x5079, 2956 },
+ { 0x5076, 2959 },
+ { 0x5077, 2962 },
+ { 0x5084, 2965 },
+ { 0x5081, 2968 },
+ { 0x5082, 2971 },
+ { 0x5088, 2974 },
+ { 0x508A, 2977 },
+ { 0x5085, 2980 },
+ { 0x5086, 2983 },
+ { 0x508E, 2986 },
+ { 0x5090, 2989 },
+ { 0x508B, 2992 },
+ { 0x508C, 2995 },
+ { 0x515A, 2998 },
+ { 0x5157, 3001 },
+ { 0x5158, 3004 },
+ { 0x5161, 3007 },
+ { 0x515F, 3010 },
+ { 0x5156, 3013 },
+ { 0x5154, 3016 },
+ { 0x5151, 3019 },
+ { 0x5152, 3022 },
+ { 0x515E, 3025 },
+ { 0x515B, 3028 },
+ { 0x515C, 3031 },
+ { 0x5165, 3034 },
+ { 0x5167, 3037 },
+ { 0x5162, 3040 },
+ { 0x5163, 3043 },
+ { 0x5263, 3046 },
+ { 0x5260, 3049 },
+ { 0x5261, 3052 },
+ { 0x526D, 3055 },
+ { 0x526B, 3058 },
+ { 0x525E, 3061 },
+ { 0x526A, 3064 },
+ { 0x5267, 3067 },
+ { 0x5268, 3070 },
+ { 0x5266, 3073 },
+ { 0x5183, 3076 },
+ { 0x5181, 3079 },
+ { 0x5437, 3082 },
+ { 0x5434, 3085 },
+ { 0x5431, 3088 },
+ { 0x5432, 3091 },
+ { 0x543E, 3094 },
+ { 0x543B, 3097 },
+ { 0x543C, 3100 },
+ { 0x543A, 3103 },
+ { 0x5441, 3106 },
+ { 0x5443, 3109 },
+ { 0x543F, 3112 },
+ { 0x5447, 3115 },
+ { 0x5449, 3118 },
+ { 0x5444, 3121 },
+ { 0x5445, 3124 },
+ { 0x5397, 3127 },
+ { 0x5394, 3130 },
+ { 0x5395, 3133 },
+ { 0x539E, 3136 },
+ { 0x539B, 3139 },
+ { 0x539C, 3142 },
+ { 0x539A, 3145 },
+ { 0x5398, 3148 },
+ { 0x53A2, 3151 },
+ { 0x53A4, 3154 },
+ { 0x539F, 3157 },
+ { 0x53A0, 3160 },
+ { 0x53A8, 3163 },
+ { 0x53AA, 3166 },
+ { 0x53A5, 3169 },
+ { 0x53A6, 3172 },
+ { 0x5189, 3175 },
+ { 0x5187, 3178 },
+ { 0x5195, 3181 },
+ { 0x5450, 3184 },
+ { 0x544D, 3187 },
+ { 0x544A, 3190 },
+ { 0x544B, 3193 },
+ { 0x5458, 3196 },
+ { 0x5455, 3199 },
+ { 0x5456, 3202 },
+ { 0x5453, 3205 },
+ { 0x545C, 3208 },
+ { 0x5459, 3211 },
+ { 0x545A, 3214 },
+ { 0x52F7, 3217 },
+ { 0x52F4, 3220 },
+ { 0x52F5, 3223 },
+ { 0x52FC, 3226 },
+ { 0x52F2, 3229 },
+ { 0x52F0, 3232 },
+ { 0x52ED, 3235 },
+ { 0x52EE, 3238 },
+ { 0x52FB, 3241 },
+ { 0x52FA, 3244 },
+ { 0x52F9, 3247 },
+ { 0x5300, 3250 },
+ { 0x5302, 3253 },
+ { 0x52FE, 3256 },
+ { 0x5306, 3259 },
+ { 0x5308, 3262 },
+ { 0x5303, 3265 },
+ { 0x5304, 3268 },
+ { 0x503E, 3271 },
+ { 0x503C, 3274 },
+ { 0x5045, 3277 },
+ { 0x5043, 3280 },
+ { 0x504E, 3283 },
+ { 0x5054, 3286 },
+ { 0x5403, 3289 },
+ { 0x5400, 3292 },
+ { 0x5401, 3295 },
+ { 0x5407, 3298 },
+ { 0x5404, 3301 },
+ { 0x5405, 3304 },
+ { 0x5410, 3307 },
+ { 0x5416, 3310 },
+ { 0x537C, 3313 },
+ { 0x5387, 3316 },
+ { 0x5384, 3319 },
+ { 0x5385, 3322 },
+ { 0x5383, 3325 },
+ { 0x5380, 3328 },
+ { 0x5381, 3331 },
+ { 0x537F, 3334 },
+ { 0x538B, 3337 },
+ { 0x538D, 3340 },
+ { 0x5388, 3343 },
+ { 0x5389, 3346 },
+ { 0x5391, 3349 },
+ { 0x5393, 3352 },
+ { 0x538E, 3355 },
+ { 0x538F, 3358 },
+ { 0x53CC, 3361 },
+ { 0x53CA, 3364 },
+ { 0x53D8, 3367 },
+ { 0x53DE, 3370 },
+ { 0x53AE, 3373 },
+ { 0x53AB, 3376 },
+ { 0x53AC, 3379 },
+ { 0x53B9, 3382 },
+ { 0x53B6, 3385 },
+ { 0x53B7, 3388 },
+ { 0x53B5, 3391 },
+ { 0x53B2, 3394 },
+ { 0x53B3, 3397 },
+ { 0x53B0, 3400 },
+ { 0x53BD, 3403 },
+ { 0x53BF, 3406 },
+ { 0x53BA, 3409 },
+ { 0x53BB, 3412 },
+ { 0x53C3, 3415 },
+ { 0x53C5, 3418 },
+ { 0x53C0, 3421 },
+ { 0x53C1, 3424 },
+ { 0x530F, 3427 },
+ { 0x530D, 3430 },
+ { 0x5334, 3433 },
+ { 0x5331, 3436 },
+ { 0x5332, 3439 },
+ { 0x533B, 3442 },
+ { 0x5339, 3445 },
+ { 0x532F, 3448 },
+ { 0x532D, 3451 },
+ { 0x532A, 3454 },
+ { 0x532B, 3457 },
+ { 0x5338, 3460 },
+ { 0x5335, 3463 },
+ { 0x5336, 3466 },
+ { 0x533F, 3469 },
+ { 0x533C, 3472 },
+ { 0x533D, 3475 },
+ { 0x5343, 3478 },
+ { 0x5345, 3481 },
+ { 0x5340, 3484 },
+ { 0x5341, 3487 },
+ { 0x5316, 3490 },
+ { 0x5314, 3493 },
+ { 0x5322, 3496 },
+ { 0x5328, 3499 },
+ { 0x5120, 3502 },
+ { 0x511E, 3505 },
+ { 0x5128, 3508 },
+ { 0x5125, 3511 },
+ { 0x5126, 3514 },
+ { 0x5134, 3517 },
+ { 0x50E9, 3520 },
+ { 0x50E6, 3523 },
+ { 0x50E7, 3526 },
+ { 0x50F8, 3529 },
+ { 0x50FE, 3532 },
+ { 0x5286, 3535 },
+ { 0x5284, 3538 },
+ { 0x5464, 3541 },
+ { 0x5461, 3544 },
+ { 0x5462, 3547 },
+ { 0x5465, 3550 },
+ { 0x546F, 3553 },
+ { 0x5478, 3556 },
+ { 0x5475, 3559 },
+ { 0x5476, 3562 },
+ { 0x547C, 3565 },
+ { 0x5479, 3568 },
+ { 0x547A, 3571 },
+ { 0x5485, 3574 },
+ { 0x548B, 3577 },
+ { 0x5349, 3580 },
+ { 0x5346, 3583 },
+ { 0x5347, 3586 },
+ { 0x5354, 3589 },
+ { 0x5351, 3592 },
+ { 0x5352, 3595 },
+ { 0x5350, 3598 },
+ { 0x534D, 3601 },
+ { 0x534E, 3604 },
+ { 0x534B, 3607 },
+ { 0x5358, 3610 },
+ { 0x535A, 3613 },
+ { 0x5355, 3616 },
+ { 0x5356, 3619 },
+ { 0x535E, 3622 },
+ { 0x5360, 3625 },
+ { 0x535B, 3628 },
+ { 0x535C, 3631 },
+ { 0x5293, 3634 },
+ { 0x5291, 3637 },
+ { 0x529A, 3640 },
+ { 0x5298, 3643 },
+ { 0x52A6, 3646 },
+ { 0x52AC, 3649 },
+ { 0x52DB, 3652 },
+ { 0x52D8, 3655 },
+ { 0x52D9, 3658 },
+ { 0x52E1, 3661 },
+ { 0x52DF, 3664 },
+ { 0x52D6, 3667 },
+ { 0x52D3, 3670 },
+ { 0x52D0, 3673 },
+ { 0x52D1, 3676 },
+ { 0x52DE, 3679 },
+ { 0x52DC, 3682 },
+ { 0x52E4, 3685 },
+ { 0x52E6, 3688 },
+ { 0x52E2, 3691 },
+ { 0x52EA, 3694 },
+ { 0x52EC, 3697 },
+ { 0x52E7, 3700 },
+ { 0x52E8, 3703 },
+ { 0x505D, 3706 },
+ { 0x505A, 3709 },
+ { 0x505B, 3712 },
+ { 0x5064, 3715 },
+ { 0x5062, 3718 },
+ { 0x5070, 3721 },
+ { 0x5368, 3724 },
+ { 0x5365, 3727 },
+ { 0x5366, 3730 },
+ { 0x5374, 3733 },
+ { 0x537A, 3736 },
+ { 0x513C, 3739 },
+ { 0x513A, 3742 },
+ { 0x5143, 3745 },
+ { 0x5141, 3748 },
+ { 0x514F, 3751 },
+ { 0x5219, 3754 },
+ { 0x5217, 3757 },
+ { 0x5221, 3760 },
+ { 0x521E, 3763 },
+ { 0x521F, 3766 },
+ { 0x522E, 3769 },
+ { 0x519D, 3772 },
+ { 0x519B, 3775 },
+ { 0x51A4, 3778 },
+ { 0x51A2, 3781 },
+ { 0x51AF, 3784 },
+ { 0x51B5, 3787 },
+ { 0x5097, 3790 },
+ { 0x5095, 3793 },
+ { 0x509E, 3796 },
+ { 0x509C, 3799 },
+ { 0x50A7, 3802 },
+ { 0x50AC, 3805 },
+ { 0x516F, 3808 },
+ { 0x516C, 3811 },
+ { 0x516D, 3814 },
+ { 0x5174, 3817 },
+ { 0x524D, 3820 },
+ { 0x524A, 3823 },
+ { 0x524B, 3826 },
+ { 0x5255, 3829 },
+ { 0x5252, 3832 },
+ { 0x5253, 3835 },
+ { 0x541F, 3838 },
+ { 0x541C, 3841 },
+ { 0x541D, 3844 },
+ { 0x5422, 3847 },
+ { 0x5420, 3850 },
+ { 0x542B, 3853 },
+ { 0x5230, 3856 },
+ { 0x5238, 3859 },
+ { 0x5236, 3862 },
+ { 0x5244, 3865 },
+ { 0x507C, 3868 },
+ { 0x507A, 3871 },
+ { 0x5089, 3874 },
+ { 0x508F, 3877 },
+ { 0x5155, 3880 },
+ { 0x5166, 3883 },
+ { 0x525F, 3886 },
+ { 0x525D, 3889 },
+ { 0x5264, 3892 },
+ { 0x5265, 3895 },
+ { 0x5438, 3898 },
+ { 0x5435, 3901 },
+ { 0x5436, 3904 },
+ { 0x5439, 3907 },
+ { 0x5442, 3910 },
+ { 0x5448, 3913 },
+ { 0x53A3, 3916 },
+ { 0x53A9, 3919 },
+ { 0x5451, 3922 },
+ { 0x544E, 3925 },
+ { 0x544F, 3928 },
+ { 0x5454, 3931 },
+ { 0x5452, 3934 },
+ { 0x52F3, 3937 },
+ { 0x52F1, 3940 },
+ { 0x52F8, 3943 },
+ { 0x5301, 3946 },
+ { 0x5307, 3949 },
+ { 0x537E, 3952 },
+ { 0x538C, 3955 },
+ { 0x5392, 3958 },
+ { 0x53B1, 3961 },
+ { 0x53AF, 3964 },
+ { 0x53BE, 3967 },
+ { 0x53C4, 3970 },
+ { 0x5330, 3973 },
+ { 0x532E, 3976 },
+ { 0x5344, 3979 },
+ { 0x534C, 3982 },
+ { 0x534A, 3985 },
+ { 0x5359, 3988 },
+ { 0x535F, 3991 },
+ { 0x52D7, 3994 },
+ { 0x52D4, 3997 },
+ { 0x52D5, 4000 },
+ { 0x52E5, 4003 },
+ { 0x52EB, 4006 },
+ { 0x262C, 4009 },
+ { 0x224C, 4011 },
+ { 0x232E, 4014 },
+ { 0x27D1, 4016 },
+ { 0x235D, 4019 },
+ { 0x2355, 4025 },
+ { 0x2351, 4031 },
+ { 0x2361, 4037 },
+ { 0x2372, 4043 },
+ { 0x2352, 4049 },
+ { 0x236B, 4054 },
+ { 0x2362, 4059 },
+ { 0x235B, 4064 },
+ { 0x2364, 4069 },
+ { 0x2374, 4074 },
+ { 0x2366, 4078 },
+ { 0x234E, 4084 },
+ { 0x234A, 4090 },
+ { 0x2371, 4096 },
+ { 0x2373, 4102 },
+ { 0x2378, 4106 },
+ { 0x2367, 4111 },
+ { 0x2395, 4117 },
+ { 0x2353, 4121 },
+ { 0x2354, 4127 },
+ { 0x233B, 4132 },
+ { 0x236F, 4137 },
+ { 0x234C, 4143 },
+ { 0x2360, 4149 },
+ { 0x234D, 4154 },
+ { 0x2338, 4159 },
+ { 0x2341, 4164 },
+ { 0x233C, 4169 },
+ { 0x2339, 4174 },
+ { 0x233A, 4179 },
+ { 0x2350, 4184 },
+ { 0x2370, 4190 },
+ { 0x2342, 4195 },
+ { 0x2357, 4200 },
+ { 0x2347, 4206 },
+ { 0x2343, 4212 },
+ { 0x2348, 4217 },
+ { 0x2344, 4223 },
+ { 0x2363, 4228 },
+ { 0x237A, 4233 },
+ { 0x2376, 4237 },
+ { 0x236A, 4242 },
+ { 0x234B, 4247 },
+ { 0x2359, 4252 },
+ { 0x2375, 4257 },
+ { 0x2379, 4261 },
+ { 0x235E, 4266 },
+ { 0x2358, 4271 },
+ { 0x233F, 4276 },
+ { 0x236D, 4281 },
+ { 0x2368, 4286 },
+ { 0x236C, 4291 },
+ { 0x233E, 4295 },
+ { 0x235F, 4300 },
+ { 0x233D, 4305 },
+ { 0x235C, 4310 },
+ { 0x2349, 4315 },
+ { 0x2365, 4320 },
+ { 0x2336, 4325 },
+ { 0x2337, 4329 },
+ { 0x235A, 4334 },
+ { 0x2377, 4339 },
+ { 0x234F, 4344 },
+ { 0x2340, 4349 },
+ { 0x2356, 4354 },
+ { 0x2345, 4359 },
+ { 0x236E, 4364 },
+ { 0x2346, 4369 },
+ { 0x2369, 4374 },
+ { 0x2312, 4379 },
+ { 0x2136, 4380 },
+ { 0x29F9, 4382 },
+ { 0x29F8, 4385 },
+ { 0x2540, 4387 },
+ { 0x2526, 4395 },
+ { 0x251A, 4403 },
+ { 0x251E, 4410 },
+ { 0x2516, 4418 },
+ { 0x2538, 4425 },
+ { 0x2548, 4432 },
+ { 0x252A, 4440 },
+ { 0x2519, 4448 },
+ { 0x2522, 4455 },
+ { 0x2515, 4463 },
+ { 0x2537, 4470 },
+ { 0x255C, 4477 },
+ { 0x2559, 4484 },
+ { 0x2568, 4491 },
+ { 0x255B, 4498 },
+ { 0x2558, 4505 },
+ { 0x2567, 4512 },
+ { 0x2541, 4519 },
+ { 0x2527, 4527 },
+ { 0x2512, 4535 },
+ { 0x251F, 4542 },
+ { 0x250E, 4550 },
+ { 0x2530, 4557 },
+ { 0x2547, 4564 },
+ { 0x2529, 4572 },
+ { 0x2511, 4580 },
+ { 0x2521, 4587 },
+ { 0x250D, 4595 },
+ { 0x252F, 4602 },
+ { 0x2556, 4609 },
+ { 0x2553, 4616 },
+ { 0x2565, 4623 },
+ { 0x2555, 4630 },
+ { 0x2552, 4637 },
+ { 0x2564, 4644 },
+ { 0x2543, 4651 },
+ { 0x2545, 4660 },
+ { 0x2535, 4669 },
+ { 0x252D, 4677 },
+ { 0x253D, 4685 },
+ { 0x253A, 4693 },
+ { 0x2532, 4701 },
+ { 0x254A, 4709 },
+ { 0x2579, 4717 },
+ { 0x251B, 4721 },
+ { 0x257F, 4727 },
+ { 0x2517, 4734 },
+ { 0x253B, 4740 },
+ { 0x257B, 4746 },
+ { 0x2513, 4750 },
+ { 0x250F, 4756 },
+ { 0x2533, 4762 },
+ { 0x2578, 4768 },
+ { 0x257E, 4772 },
+ { 0x257A, 4779 },
+ { 0x254F, 4783 },
+ { 0x254D, 4789 },
+ { 0x2507, 4795 },
+ { 0x2505, 4801 },
+ { 0x2503, 4807 },
+ { 0x252B, 4811 },
+ { 0x2523, 4817 },
+ { 0x254B, 4823 },
+ { 0x250B, 4829 },
+ { 0x2509, 4835 },
+ { 0x2501, 4841 },
+ { 0x2575, 4845 },
+ { 0x2518, 4849 },
+ { 0x257D, 4855 },
+ { 0x2514, 4862 },
+ { 0x2534, 4868 },
+ { 0x256F, 4874 },
+ { 0x2570, 4881 },
+ { 0x256E, 4888 },
+ { 0x256D, 4895 },
+ { 0x2577, 4902 },
+ { 0x2510, 4906 },
+ { 0x250C, 4912 },
+ { 0x252C, 4918 },
+ { 0x2574, 4924 },
+ { 0x257C, 4928 },
+ { 0x2576, 4935 },
+ { 0x254E, 4939 },
+ { 0x254C, 4945 },
+ { 0x2506, 4951 },
+ { 0x2504, 4957 },
+ { 0x2573, 4963 },
+ { 0x2572, 4968 },
+ { 0x2571, 4977 },
+ { 0x2502, 4986 },
+ { 0x2524, 4990 },
+ { 0x251C, 4996 },
+ { 0x253C, 5002 },
+ { 0x250A, 5008 },
+ { 0x2508, 5014 },
+ { 0x2500, 5020 },
+ { 0x2544, 5024 },
+ { 0x2546, 5033 },
+ { 0x2536, 5042 },
+ { 0x252E, 5050 },
+ { 0x253E, 5058 },
+ { 0x2539, 5066 },
+ { 0x2531, 5074 },
+ { 0x2549, 5082 },
+ { 0x255D, 5090 },
+ { 0x255A, 5096 },
+ { 0x2569, 5102 },
+ { 0x2557, 5108 },
+ { 0x2554, 5114 },
+ { 0x2566, 5120 },
+ { 0x2551, 5126 },
+ { 0x2563, 5130 },
+ { 0x2560, 5136 },
+ { 0x256C, 5142 },
+ { 0x2550, 5148 },
+ { 0x2528, 5152 },
+ { 0x2520, 5159 },
+ { 0x2542, 5166 },
+ { 0x2525, 5173 },
+ { 0x251D, 5180 },
+ { 0x253F, 5187 },
+ { 0x2562, 5194 },
+ { 0x255F, 5201 },
+ { 0x256B, 5208 },
+ { 0x2561, 5215 },
+ { 0x255E, 5222 },
+ { 0x256A, 5229 },
+ { 0x2627, 5236 },
+ { 0x31D4, 5238 },
+ { 0x31D0, 5241 },
+ { 0x31CF, 5244 },
+ { 0x31D2, 5247 },
+ { 0x31E3, 5250 },
+ { 0x31D1, 5253 },
+ { 0x31C0, 5256 },
+ { 0x31D6, 5259 },
+ { 0x31C7, 5262 },
+ { 0x31D5, 5265 },
+ { 0x31DB, 5268 },
+ { 0x31E2, 5271 },
+ { 0x31DC, 5274 },
+ { 0x31DA, 5277 },
+ { 0x31D3, 5280 },
+ { 0x31D9, 5283 },
+ { 0x31C4, 5286 },
+ { 0x31D7, 5289 },
+ { 0x31DD, 5292 },
+ { 0x31C1, 5295 },
+ { 0x31C2, 5298 },
+ { 0x31C3, 5301 },
+ { 0x31C6, 5304 },
+ { 0x31CA, 5307 },
+ { 0x31CD, 5310 },
+ { 0x31C5, 5313 },
+ { 0x31DF, 5316 },
+ { 0x31D8, 5319 },
+ { 0x31DE, 5322 },
+ { 0x31CC, 5325 },
+ { 0x31E0, 5328 },
+ { 0x31C8, 5331 },
+ { 0x31CB, 5334 },
+ { 0x31CE, 5337 },
+ { 0x31C9, 5340 },
+ { 0x31E1, 5343 },
+ { 0x2E86, 5346 },
+ { 0x2EA7, 5349 },
+ { 0x2EA8, 5352 },
+ { 0x2EDD, 5355 },
+ { 0x2EDE, 5359 },
+ { 0x2EDF, 5363 },
+ { 0x2EB8, 5367 },
+ { 0x2EAB, 5370 },
+ { 0x2EB1, 5373 },
+ { 0x2EB2, 5377 },
+ { 0x2EB4, 5381 },
+ { 0x2EB3, 5385 },
+ { 0x2EB9, 5389 },
+ { 0x2EA4, 5392 },
+ { 0x2EA5, 5396 },
+ { 0x2EB7, 5400 },
+ { 0x2E99, 5403 },
+ { 0x2E9C, 5406 },
+ { 0x2ED8, 5409 },
+ { 0x2EAA, 5412 },
+ { 0x2EE3, 5417 },
+ { 0x2ECF, 5420 },
+ { 0x2EA3, 5423 },
+ { 0x2ECA, 5426 },
+ { 0x2E98, 5429 },
+ { 0x2EE1, 5432 },
+ { 0x2EC7, 5435 },
+ { 0x2EA9, 5438 },
+ { 0x2E8E, 5441 },
+ { 0x2E8F, 5445 },
+ { 0x2E91, 5449 },
+ { 0x2E90, 5453 },
+ { 0x2ED1, 5457 },
+ { 0x2ED2, 5461 },
+ { 0x2EBC, 5465 },
+ { 0x2EB5, 5468 },
+ { 0x2E9D, 5471 },
+ { 0x2ED7, 5474 },
+ { 0x2E8B, 5477 },
+ { 0x2EAF, 5480 },
+ { 0x2ECD, 5483 },
+ { 0x2ECE, 5487 },
+ { 0x2EC3, 5491 },
+ { 0x2EC4, 5495 },
+ { 0x2EBA, 5499 },
+ { 0x2EBB, 5503 },
+ { 0x2E9B, 5507 },
+ { 0x2E81, 5510 },
+ { 0x2E9E, 5513 },
+ { 0x2EE4, 5516 },
+ { 0x2EBE, 5519 },
+ { 0x2EBF, 5523 },
+ { 0x2EC0, 5527 },
+ { 0x2E96, 5531 },
+ { 0x2E97, 5535 },
+ { 0x2E88, 5539 },
+ { 0x2E89, 5543 },
+ { 0x2ED5, 5547 },
+ { 0x2ED6, 5551 },
+ { 0x2EB6, 5555 },
+ { 0x2E8C, 5558 },
+ { 0x2E8D, 5562 },
+ { 0x2E92, 5566 },
+ { 0x2E94, 5569 },
+ { 0x2E95, 5573 },
+ { 0x2E87, 5577 },
+ { 0x2EC1, 5580 },
+ { 0x2EA1, 5583 },
+ { 0x2EA2, 5587 },
+ { 0x2EAE, 5591 },
+ { 0x2EBD, 5594 },
+ { 0x2E9F, 5597 },
+ { 0x2E85, 5600 },
+ { 0x2E80, 5603 },
+ { 0x2E82, 5606 },
+ { 0x2E83, 5610 },
+ { 0x2E84, 5614 },
+ { 0x2EAC, 5618 },
+ { 0x2EAD, 5622 },
+ { 0x2E93, 5626 },
+ { 0x2EF1, 5629 },
+ { 0x2EC2, 5632 },
+ { 0x2EA0, 5635 },
+ { 0x2E8A, 5638 },
+ { 0x2EA6, 5641 },
+ { 0x2EC6, 5647 },
+ { 0x2ECC, 5651 },
+ { 0x2EE8, 5655 },
+ { 0x2EE9, 5659 },
+ { 0x2EE0, 5663 },
+ { 0x2EDC, 5667 },
+ { 0x2EC5, 5671 },
+ { 0x2EE6, 5675 },
+ { 0x2ECB, 5679 },
+ { 0x2EEC, 5683 },
+ { 0x2EE5, 5687 },
+ { 0x2EEA, 5691 },
+ { 0x2ED4, 5695 },
+ { 0x2ED0, 5699 },
+ { 0x2EDA, 5703 },
+ { 0x2ED3, 5707 },
+ { 0x2EE7, 5711 },
+ { 0x2EB0, 5715 },
+ { 0x2EDB, 5719 },
+ { 0x2EE2, 5723 },
+ { 0x2EC9, 5727 },
+ { 0x2EEE, 5731 },
+ { 0x2EF0, 5735 },
+ { 0x2EC8, 5739 },
+ { 0x2ED9, 5743 },
+ { 0x2EF3, 5748 },
+ { 0x2EEB, 5752 },
+ { 0x2EED, 5756 },
+ { 0x2EEF, 5760 },
+ { 0x2EF2, 5764 },
+ { 0x2680, 5768 },
+ { 0x2681, 5770 },
+ { 0x2682, 5772 },
+ { 0x2683, 5774 },
+ { 0x2684, 5776 },
+ { 0x2685, 5778 },
+ { 0x2214, 5780 },
+ { 0x02D9, 5782 },
+ { 0x2238, 5784 },
+ { 0x22C5, 5786 },
+ { 0x220E, 5788 },
+ { 0x2200, 5791 },
+ { 0x2668, 5793 },
+ { 0x2615, 5795 },
+ { 0x20AD, 5797 },
+ { 0x0EDD, 5799 },
+ { 0x0EDC, 5802 },
+ { 0x0EC6, 5805 },
+ { 0x0EC8, 5808 },
+ { 0x0ECA, 5812 },
+ { 0x0EC9, 5816 },
+ { 0x0ECB, 5820 },
+ { 0x0ED1, 5824 },
+ { 0x0ED6, 5827 },
+ { 0x0ED2, 5830 },
+ { 0x0ED5, 5833 },
+ { 0x0ED4, 5836 },
+ { 0x0ED9, 5839 },
+ { 0x0ED0, 5842 },
+ { 0x0ED8, 5845 },
+ { 0x0ED7, 5848 },
+ { 0x0ED3, 5851 },
+ { 0x0EB0, 5854 },
+ { 0x0EC0, 5858 },
+ { 0x0EB4, 5862 },
+ { 0x0EC2, 5866 },
+ { 0x0EB8, 5870 },
+ { 0x0EB6, 5874 },
+ { 0x0EB2, 5878 },
+ { 0x0EC4, 5882 },
+ { 0x0EB3, 5886 },
+ { 0x0EC3, 5890 },
+ { 0x0EC1, 5894 },
+ { 0x0EB5, 5898 },
+ { 0x0EB9, 5902 },
+ { 0x0EB7, 5906 },
+ { 0x0EB1, 5910 },
+ { 0x0EBB, 5915 },
+ { 0x0EAD, 5920 },
+ { 0x0E9A, 5923 },
+ { 0x0E88, 5926 },
+ { 0x0E94, 5929 },
+ { 0x0E9D, 5932 },
+ { 0x0E9F, 5936 },
+ { 0x0EAE, 5940 },
+ { 0x0EAB, 5944 },
+ { 0x0E81, 5948 },
+ { 0x0EA3, 5951 },
+ { 0x0EA5, 5955 },
+ { 0x0EA1, 5959 },
+ { 0x0E99, 5962 },
+ { 0x0E9B, 5965 },
+ { 0x0E8A, 5968 },
+ { 0x0EAA, 5972 },
+ { 0x0E95, 5976 },
+ { 0x0EA7, 5979 },
+ { 0x0EA2, 5982 },
+ { 0x0E84, 5985 },
+ { 0x0E82, 5989 },
+ { 0x0E87, 5993 },
+ { 0x0E8D, 5996 },
+ { 0x0E9E, 5999 },
+ { 0x0E9C, 6003 },
+ { 0x0E97, 6007 },
+ { 0x0E96, 6011 },
+ { 0x0EAF, 6015 },
+ { 0x0ECD, 6017 },
+ { 0x0EBC, 6019 },
+ { 0x0EBD, 6023 },
+ { 0x0ECC, 6027 },
+ { 0x264C, 6030 },
+ { 0x005F, 6031 },
+ { 0x301F, 6033 },
+ { 0x204E, 6038 },
+ { 0x19DE, 6040 },
+ { 0x19DF, 6045 },
+ { 0x19C8, 6050 },
+ { 0x19C9, 6055 },
+ { 0x19D1, 6060 },
+ { 0x19D6, 6065 },
+ { 0x19D2, 6070 },
+ { 0x19D5, 6075 },
+ { 0x19D4, 6080 },
+ { 0x19D9, 6085 },
+ { 0x19D0, 6090 },
+ { 0x19D8, 6095 },
+ { 0x19D7, 6100 },
+ { 0x19D3, 6105 },
+ { 0x19B5, 6110 },
+ { 0x19B7, 6116 },
+ { 0x19B3, 6122 },
+ { 0x19B1, 6128 },
+ { 0x19B6, 6134 },
+ { 0x19BA, 6140 },
+ { 0x19B2, 6146 },
+ { 0x19C0, 6152 },
+ { 0x19B8, 6158 },
+ { 0x19BD, 6164 },
+ { 0x19B9, 6170 },
+ { 0x19B4, 6176 },
+ { 0x19BC, 6182 },
+ { 0x19BB, 6188 },
+ { 0x19BE, 6194 },
+ { 0x19BF, 6200 },
+ { 0x19B0, 6206 },
+ { 0x19A5, 6213 },
+ { 0x19A4, 6219 },
+ { 0x199D, 6225 },
+ { 0x19A3, 6231 },
+ { 0x1985, 6237 },
+ { 0x199F, 6243 },
+ { 0x1999, 6249 },
+ { 0x1993, 6255 },
+ { 0x1997, 6261 },
+ { 0x1981, 6267 },
+ { 0x198C, 6273 },
+ { 0x1991, 6279 },
+ { 0x199E, 6285 },
+ { 0x1986, 6291 },
+ { 0x198D, 6297 },
+ { 0x19A8, 6303 },
+ { 0x1987, 6309 },
+ { 0x1998, 6315 },
+ { 0x1992, 6321 },
+ { 0x198B, 6327 },
+ { 0x19A9, 6333 },
+ { 0x19A2, 6339 },
+ { 0x19A1, 6345 },
+ { 0x199A, 6351 },
+ { 0x19A0, 6357 },
+ { 0x1982, 6363 },
+ { 0x199C, 6369 },
+ { 0x1996, 6375 },
+ { 0x1990, 6381 },
+ { 0x1994, 6387 },
+ { 0x1980, 6393 },
+ { 0x1989, 6399 },
+ { 0x198E, 6405 },
+ { 0x199B, 6411 },
+ { 0x1983, 6417 },
+ { 0x198A, 6423 },
+ { 0x19A6, 6429 },
+ { 0x1984, 6435 },
+ { 0x1995, 6441 },
+ { 0x198F, 6447 },
+ { 0x1988, 6453 },
+ { 0x19A7, 6459 },
+ { 0x19C7, 6465 },
+ { 0x19C6, 6471 },
+ { 0x19C5, 6477 },
+ { 0x19C4, 6483 },
+ { 0x19C3, 6489 },
+ { 0x19C1, 6495 },
+ { 0x19C2, 6501 },
+ { 0x20AA, 6507 },
+ { 0x07F5, 6510 },
+ { 0x07F4, 6514 },
+ { 0x07F8, 6518 },
+ { 0x07C1, 6520 },
+ { 0x07C6, 6523 },
+ { 0x07C2, 6526 },
+ { 0x07C5, 6529 },
+ { 0x07C4, 6532 },
+ { 0x07C9, 6535 },
+ { 0x07C0, 6538 },
+ { 0x07C8, 6541 },
+ { 0x07C7, 6544 },
+ { 0x07C3, 6547 },
+ { 0x07CA, 6550 },
+ { 0x07CD, 6553 },
+ { 0x07CC, 6556 },
+ { 0x07D2, 6559 },
+ { 0x07D0, 6562 },
+ { 0x07CE, 6565 },
+ { 0x07D3, 6568 },
+ { 0x07D8, 6571 },
+ { 0x07CB, 6574 },
+ { 0x07DD, 6577 },
+ { 0x07E4, 6580 },
+ { 0x07D6, 6583 },
+ { 0x07DE, 6586 },
+ { 0x07DF, 6589 },
+ { 0x07E1, 6592 },
+ { 0x07E3, 6595 },
+ { 0x07E0, 6598 },
+ { 0x07CF, 6602 },
+ { 0x07D4, 6605 },
+ { 0x07D9, 6608 },
+ { 0x07DB, 6611 },
+ { 0x07D5, 6614 },
+ { 0x07E5, 6617 },
+ { 0x07E6, 6620 },
+ { 0x07D7, 6623 },
+ { 0x07DC, 6626 },
+ { 0x07E2, 6629 },
+ { 0x07E7, 6632 },
+ { 0x07DA, 6636 },
+ { 0x07E8, 6639 },
+ { 0x07EA, 6643 },
+ { 0x07E9, 6647 },
+ { 0x07D1, 6651 },
+ { 0x07F6, 6654 },
+ { 0x07F7, 6658 },
+ { 0x07F0, 6661 },
+ { 0x07EF, 6666 },
+ { 0x07F1, 6671 },
+ { 0x07EE, 6676 },
+ { 0x07EC, 6681 },
+ { 0x07EB, 6686 },
+ { 0x07ED, 6691 },
+ { 0x07F3, 6696 },
+ { 0x07F2, 6701 },
+ { 0x07FA, 6705 },
+ { 0x07F9, 6707 },
+ { 0x22BD, 6710 },
+ { 0x2284, 6711 },
+ { 0x2285, 6715 },
+ { 0x2209, 6719 },
+ { 0x00AC, 6723 },
+ { 0x22AD, 6725 },
+ { 0x237B, 6727 },
+ { 0x2260, 6730 },
+ { 0x2241, 6733 },
+ { 0x2249, 6735 },
+ { 0x22EA, 6739 },
+ { 0x22EC, 6743 },
+ { 0x22E2, 6750 },
+ { 0x22E3, 6757 },
+ { 0x2226, 6764 },
+ { 0x2262, 6767 },
+ { 0x226E, 6770 },
+ { 0x226D, 6772 },
+ { 0x226F, 6775 },
+ { 0x2244, 6777 },
+ { 0x2445, 6781 },
+ { 0x2444, 6784 },
+ { 0x2448, 6787 },
+ { 0x2442, 6789 },
+ { 0x2440, 6791 },
+ { 0x2441, 6793 },
+ { 0x2447, 6795 },
+ { 0x2446, 6799 },
+ { 0x244A, 6803 },
+ { 0x2449, 6806 },
+ { 0x2443, 6810 },
+ { 0x2126, 6813 },
+ { 0x7300, 6815 },
+ { 0x7304, 6819 },
+ { 0x7309, 6823 },
+ { 0x730F, 6827 },
+ { 0x7316, 6831 },
+ { 0x7301, 6835 },
+ { 0x7303, 6839 },
+ { 0x731A, 6843 },
+ { 0x730B, 6847 },
+ { 0x730C, 6851 },
+ { 0x730D, 6855 },
+ { 0x7313, 6859 },
+ { 0x7314, 6863 },
+ { 0x7307, 6867 },
+ { 0x731D, 6871 },
+ { 0x730A, 6875 },
+ { 0x7302, 6879 },
+ { 0x7312, 6883 },
+ { 0x7310, 6887 },
+ { 0x7315, 6891 },
+ { 0x731E, 6895 },
+ { 0x7305, 6899 },
+ { 0x7306, 6903 },
+ { 0x731C, 6907 },
+ { 0x7317, 6911 },
+ { 0x731B, 6915 },
+ { 0x730E, 6919 },
+ { 0x7319, 6923 },
+ { 0x7318, 6927 },
+ { 0x7311, 6931 },
+ { 0x7308, 6935 },
+ { 0x7320, 6939 },
+ { 0x7322, 6943 },
+ { 0x7321, 6947 },
+ { 0x7323, 6951 },
+ { 0x73A0, 6955 },
+ { 0x73A1, 6959 },
+ { 0x73A2, 6963 },
+ { 0x73B2, 6967 },
+ { 0x73A8, 6971 },
+ { 0x73AD, 6975 },
+ { 0x73AE, 6979 },
+ { 0x73AF, 6983 },
+ { 0x73B3, 6987 },
+ { 0x73A5, 6991 },
+ { 0x73A6, 6995 },
+ { 0x73C3, 6999 },
+ { 0x73A9, 7003 },
+ { 0x73AA, 7007 },
+ { 0x73A3, 7011 },
+ { 0x73A4, 7015 },
+ { 0x73BE, 7019 },
+ { 0x73B6, 7023 },
+ { 0x73B7, 7027 },
+ { 0x73B8, 7031 },
+ { 0x73B4, 7035 },
+ { 0x73B5, 7039 },
+ { 0x73B1, 7043 },
+ { 0x73BC, 7047 },
+ { 0x73BD, 7051 },
+ { 0x73BF, 7055 },
+ { 0x73AB, 7059 },
+ { 0x73AC, 7063 },
+ { 0x73BA, 7067 },
+ { 0x73BB, 7071 },
+ { 0x73A7, 7075 },
+ { 0x73B9, 7079 },
+ { 0x73C0, 7083 },
+ { 0x73C1, 7087 },
+ { 0x73C2, 7091 },
+ { 0x73B0, 7095 },
+ { 0x73CE, 7099 },
+ { 0x73CF, 7103 },
+ { 0x73CC, 7107 },
+ { 0x73C8, 7111 },
+ { 0x73CD, 7115 },
+ { 0x73C9, 7119 },
+ { 0x73CA, 7123 },
+ { 0x73CB, 7127 },
+ { 0x73D0, 7131 },
+ { 0x73D1, 7135 },
+ { 0x73D3, 7139 },
+ { 0x73D2, 7143 },
+ { 0x73D4, 7147 },
+ { 0x73D5, 7151 },
+ { 0x2E2B, 7155 },
+ { 0x2024, 7161 },
+ { 0x2031, 7164 },
+ { 0x214C, 7168 },
+ { 0x2030, 7170 },
+ { 0x202C, 7173 },
+ { 0x2216, 7176 },
+ { 0x2736, 7178 },
+ { 0x273E, 7182 },
+ { 0x2609, 7188 },
+ { 0xC05F, 7189 },
+ { 0xC02E, 7192 },
+ { 0xC07B, 7195 },
+ { 0xC05B, 7199 },
+ { 0xC028, 7203 },
+ { 0xC02B, 7206 },
+ { 0xC03A, 7209 },
+ { 0xC02C, 7211 },
+ { 0xC031, 7213 },
+ { 0xC036, 7216 },
+ { 0xC032, 7219 },
+ { 0xC035, 7222 },
+ { 0xC034, 7225 },
+ { 0xC039, 7228 },
+ { 0xC030, 7231 },
+ { 0xC038, 7234 },
+ { 0xC037, 7237 },
+ { 0xC033, 7240 },
+ { 0xC060, 7243 },
+ { 0xC061, 7246 },
+ { 0xC062, 7251 },
+ { 0xC063, 7256 },
+ { 0xC064, 7261 },
+ { 0xC065, 7266 },
+ { 0xC066, 7271 },
+ { 0xC067, 7276 },
+ { 0xC068, 7281 },
+ { 0xC069, 7286 },
+ { 0xC06A, 7291 },
+ { 0xC06B, 7296 },
+ { 0xC06C, 7301 },
+ { 0xC06D, 7306 },
+ { 0xC06E, 7311 },
+ { 0xC06F, 7316 },
+ { 0xC070, 7321 },
+ { 0xC071, 7326 },
+ { 0xC072, 7331 },
+ { 0xC073, 7336 },
+ { 0xC074, 7341 },
+ { 0xC075, 7346 },
+ { 0xC076, 7351 },
+ { 0xC077, 7356 },
+ { 0xC078, 7361 },
+ { 0xC079, 7366 },
+ { 0xC07A, 7371 },
+ { 0xC041, 7376 },
+ { 0xC042, 7381 },
+ { 0xC043, 7386 },
+ { 0xC044, 7391 },
+ { 0xC045, 7396 },
+ { 0xC046, 7401 },
+ { 0xC047, 7406 },
+ { 0xC048, 7411 },
+ { 0xC049, 7416 },
+ { 0xC04A, 7421 },
+ { 0xC04B, 7426 },
+ { 0xC04C, 7431 },
+ { 0xC04D, 7436 },
+ { 0xC04E, 7441 },
+ { 0xC04F, 7446 },
+ { 0xC050, 7451 },
+ { 0xC051, 7456 },
+ { 0xC052, 7461 },
+ { 0xC053, 7466 },
+ { 0xC054, 7471 },
+ { 0xC055, 7476 },
+ { 0xC056, 7481 },
+ { 0xC057, 7486 },
+ { 0xC058, 7491 },
+ { 0xC059, 7496 },
+ { 0xC05A, 7501 },
+ { 0xC07D, 7506 },
+ { 0xC05D, 7510 },
+ { 0xC029, 7514 },
+ { 0xC020, 7517 },
+ { 0xC07E, 7519 },
+ { 0xC024, 7521 },
+ { 0xC03D, 7524 },
+ { 0xC023, 7527 },
+ { 0xC025, 7530 },
+ { 0xC05C, 7533 },
+ { 0xC02F, 7536 },
+ { 0xC02A, 7538 },
+ { 0xC03F, 7540 },
+ { 0xC07C, 7543 },
+ { 0xC026, 7546 },
+ { 0xC03C, 7548 },
+ { 0xC022, 7551 },
+ { 0xC03B, 7554 },
+ { 0xC027, 7556 },
+ { 0xC05E, 7558 },
+ { 0xC040, 7561 },
+ { 0xC021, 7564 },
+ { 0xC03E, 7567 },
+ { 0xC02D, 7570 },
+ { 0x1963, 7572 },
+ { 0x196B, 7576 },
+ { 0x1964, 7580 },
+ { 0x1969, 7584 },
+ { 0x1967, 7588 },
+ { 0x196D, 7592 },
+ { 0x1965, 7596 },
+ { 0x1966, 7600 },
+ { 0x195C, 7604 },
+ { 0x195E, 7608 },
+ { 0x1950, 7612 },
+ { 0x1958, 7616 },
+ { 0x195B, 7620 },
+ { 0x1962, 7624 },
+ { 0x1968, 7628 },
+ { 0x1959, 7632 },
+ { 0x195F, 7636 },
+ { 0x1954, 7640 },
+ { 0x1956, 7644 },
+ { 0x196A, 7648 },
+ { 0x195D, 7652 },
+ { 0x1951, 7656 },
+ { 0x1955, 7660 },
+ { 0x196C, 7664 },
+ { 0x1960, 7668 },
+ { 0x1952, 7672 },
+ { 0x195A, 7676 },
+ { 0x1957, 7680 },
+ { 0x1953, 7684 },
+ { 0x1961, 7688 },
+ { 0x1970, 7692 },
+ { 0x1971, 7696 },
+ { 0x1972, 7700 },
+ { 0x1973, 7704 },
+ { 0x1974, 7708 },
+ { 0x29DD, 7712 },
+ { 0x293C, 7715 },
+ { 0x293A, 7721 },
+ { 0x293D, 7725 },
+ { 0x2320, 7731 },
+ { 0x230F, 7734 },
+ { 0x2E22, 7737 },
+ { 0x231C, 7741 },
+ { 0x23DE, 7744 },
+ { 0x230E, 7747 },
+ { 0x2E23, 7750 },
+ { 0x231D, 7754 },
+ { 0x23B4, 7757 },
+ { 0x23E0, 7760 },
+ { 0x23DC, 7764 },
+ { 0x2025, 7766 },
+ { 0x205A, 7769 },
+ { 0x2E2A, 7772 },
+ { 0x29C9, 7778 },
+ { 0x2A08, 7781 },
+ { 0x2A07, 7785 },
+ { 0x2051, 7789 },
+ { 0x2A75, 7793 },
+ { 0x2A56, 7797 },
+ { 0x2A55, 7801 },
+ { 0x560E, 7805 },
+ { 0x560D, 7808 },
+ { 0x5621, 7810 },
+ { 0x5626, 7813 },
+ { 0x5622, 7816 },
+ { 0x5625, 7819 },
+ { 0x5624, 7822 },
+ { 0x5629, 7825 },
+ { 0x5620, 7828 },
+ { 0x5628, 7831 },
+ { 0x5627, 7834 },
+ { 0x5623, 7837 },
+ { 0x5618, 7840 },
+ { 0x5616, 7843 },
+ { 0x5619, 7846 },
+ { 0x5617, 7849 },
+ { 0x561A, 7852 },
+ { 0x561E, 7855 },
+ { 0x561F, 7858 },
+ { 0x561C, 7861 },
+ { 0x5615, 7864 },
+ { 0x561D, 7867 },
+ { 0x561B, 7870 },
+ { 0x5613, 7873 },
+ { 0x5614, 7876 },
+ { 0x560F, 7879 },
+ { 0x5549, 7882 },
+ { 0x55E1, 7885 },
+ { 0x5524, 7888 },
+ { 0x55BA, 7891 },
+ { 0x5595, 7894 },
+ { 0x554A, 7897 },
+ { 0x5552, 7900 },
+ { 0x55EA, 7903 },
+ { 0x552C, 7906 },
+ { 0x55C3, 7909 },
+ { 0x559D, 7912 },
+ { 0x5566, 7915 },
+ { 0x55FF, 7918 },
+ { 0x553F, 7921 },
+ { 0x55D7, 7924 },
+ { 0x55B0, 7927 },
+ { 0x5560, 7930 },
+ { 0x55F9, 7933 },
+ { 0x5539, 7936 },
+ { 0x55D1, 7939 },
+ { 0x55AA, 7942 },
+ { 0x5500, 7945 },
+ { 0x55E2, 7948 },
+ { 0x5558, 7951 },
+ { 0x55F1, 7954 },
+ { 0x5531, 7957 },
+ { 0x55C9, 7960 },
+ { 0x55A2, 7963 },
+ { 0x556D, 7966 },
+ { 0x5606, 7969 },
+ { 0x5545, 7972 },
+ { 0x55DD, 7975 },
+ { 0x55B6, 7978 },
+ { 0x554C, 7981 },
+ { 0x55E4, 7984 },
+ { 0x5526, 7987 },
+ { 0x55BD, 7990 },
+ { 0x5597, 7993 },
+ { 0x5525, 7996 },
+ { 0x5567, 7999 },
+ { 0x5600, 8002 },
+ { 0x5540, 8005 },
+ { 0x55D8, 8008 },
+ { 0x55B1, 8011 },
+ { 0x556A, 8014 },
+ { 0x5603, 8017 },
+ { 0x5543, 8020 },
+ { 0x55DB, 8023 },
+ { 0x55B4, 8026 },
+ { 0x555E, 8029 },
+ { 0x55F7, 8032 },
+ { 0x5537, 8035 },
+ { 0x55CF, 8038 },
+ { 0x55A8, 8041 },
+ { 0x556E, 8044 },
+ { 0x5608, 8047 },
+ { 0x5546, 8050 },
+ { 0x55DE, 8053 },
+ { 0x55B7, 8056 },
+ { 0x556F, 8059 },
+ { 0x5609, 8062 },
+ { 0x560B, 8065 },
+ { 0x5547, 8068 },
+ { 0x55DF, 8071 },
+ { 0x55B8, 8074 },
+ { 0x55BB, 8077 },
+ { 0x5571, 8080 },
+ { 0x5550, 8083 },
+ { 0x55E8, 8086 },
+ { 0x552A, 8089 },
+ { 0x55C1, 8092 },
+ { 0x559B, 8095 },
+ { 0x555F, 8098 },
+ { 0x55F8, 8101 },
+ { 0x5538, 8104 },
+ { 0x55D0, 8107 },
+ { 0x55A9, 8110 },
+ { 0x5562, 8113 },
+ { 0x55FB, 8116 },
+ { 0x553B, 8119 },
+ { 0x55D3, 8122 },
+ { 0x55AC, 8125 },
+ { 0x555A, 8128 },
+ { 0x55F3, 8131 },
+ { 0x5533, 8134 },
+ { 0x55CB, 8137 },
+ { 0x55A4, 8140 },
+ { 0x5596, 8143 },
+ { 0x5559, 8146 },
+ { 0x55F2, 8149 },
+ { 0x5532, 8152 },
+ { 0x55CA, 8155 },
+ { 0x55A3, 8158 },
+ { 0x554E, 8161 },
+ { 0x55E6, 8164 },
+ { 0x5528, 8167 },
+ { 0x55BF, 8170 },
+ { 0x5599, 8173 },
+ { 0x5569, 8176 },
+ { 0x5602, 8179 },
+ { 0x5542, 8182 },
+ { 0x55DA, 8185 },
+ { 0x55B3, 8188 },
+ { 0x5564, 8191 },
+ { 0x55FD, 8194 },
+ { 0x553D, 8197 },
+ { 0x55D5, 8200 },
+ { 0x55AE, 8203 },
+ { 0x5507, 8206 },
+ { 0x5551, 8209 },
+ { 0x55E9, 8212 },
+ { 0x552B, 8215 },
+ { 0x55C2, 8218 },
+ { 0x559C, 8221 },
+ { 0x5578, 8224 },
+ { 0x551A, 8227 },
+ { 0x558B, 8230 },
+ { 0x5514, 8233 },
+ { 0x555C, 8236 },
+ { 0x55F5, 8239 },
+ { 0x5535, 8242 },
+ { 0x55CD, 8245 },
+ { 0x55A6, 8248 },
+ { 0x5585, 8251 },
+ { 0x5501, 8254 },
+ { 0x550C, 8257 },
+ { 0x557D, 8260 },
+ { 0x5557, 8263 },
+ { 0x55EF, 8266 },
+ { 0x5530, 8269 },
+ { 0x55C7, 8272 },
+ { 0x55A1, 8275 },
+ { 0x5520, 8278 },
+ { 0x5607, 8281 },
+ { 0x5591, 8284 },
+ { 0x554D, 8287 },
+ { 0x5502, 8290 },
+ { 0x55E5, 8293 },
+ { 0x5527, 8296 },
+ { 0x55BE, 8299 },
+ { 0x5573, 8302 },
+ { 0x5598, 8305 },
+ { 0x551B, 8308 },
+ { 0x558C, 8311 },
+ { 0x556B, 8314 },
+ { 0x551E, 8317 },
+ { 0x558F, 8320 },
+ { 0x5554, 8323 },
+ { 0x55EC, 8326 },
+ { 0x552E, 8329 },
+ { 0x55C5, 8332 },
+ { 0x559F, 8335 },
+ { 0x5512, 8338 },
+ { 0x5583, 8341 },
+ { 0x5553, 8344 },
+ { 0x55EB, 8347 },
+ { 0x552D, 8350 },
+ { 0x55C4, 8353 },
+ { 0x559E, 8356 },
+ { 0x5521, 8359 },
+ { 0x5592, 8362 },
+ { 0x5561, 8365 },
+ { 0x55FA, 8368 },
+ { 0x553A, 8371 },
+ { 0x55D2, 8374 },
+ { 0x55AB, 8377 },
+ { 0x5522, 8380 },
+ { 0x5568, 8383 },
+ { 0x5601, 8386 },
+ { 0x5541, 8389 },
+ { 0x55D9, 8392 },
+ { 0x55B2, 8395 },
+ { 0x5593, 8398 },
+ { 0x5570, 8401 },
+ { 0x560A, 8404 },
+ { 0x5548, 8407 },
+ { 0x55E0, 8410 },
+ { 0x55B9, 8413 },
+ { 0x5572, 8416 },
+ { 0x5505, 8419 },
+ { 0x5576, 8422 },
+ { 0x5513, 8425 },
+ { 0x5584, 8428 },
+ { 0x5516, 8431 },
+ { 0x5563, 8434 },
+ { 0x55FC, 8437 },
+ { 0x553C, 8440 },
+ { 0x55D4, 8443 },
+ { 0x55AD, 8446 },
+ { 0x5587, 8449 },
+ { 0x550E, 8452 },
+ { 0x555B, 8455 },
+ { 0x55F4, 8458 },
+ { 0x5534, 8461 },
+ { 0x55CC, 8464 },
+ { 0x55A5, 8467 },
+ { 0x557F, 8470 },
+ { 0x550D, 8473 },
+ { 0x557E, 8476 },
+ { 0x554F, 8479 },
+ { 0x5503, 8482 },
+ { 0x55E7, 8485 },
+ { 0x5529, 8488 },
+ { 0x55C0, 8491 },
+ { 0x5574, 8494 },
+ { 0x559A, 8497 },
+ { 0x551D, 8500 },
+ { 0x558E, 8503 },
+ { 0x5518, 8506 },
+ { 0x5565, 8509 },
+ { 0x55FE, 8512 },
+ { 0x553E, 8515 },
+ { 0x55D6, 8518 },
+ { 0x55AF, 8521 },
+ { 0x5589, 8524 },
+ { 0x5506, 8527 },
+ { 0x5577, 8530 },
+ { 0x5510, 8533 },
+ { 0x555D, 8536 },
+ { 0x55F6, 8539 },
+ { 0x5536, 8542 },
+ { 0x55CE, 8545 },
+ { 0x55A7, 8548 },
+ { 0x5581, 8551 },
+ { 0x550B, 8554 },
+ { 0x55F0, 8557 },
+ { 0x55C8, 8560 },
+ { 0x557C, 8563 },
+ { 0x5555, 8566 },
+ { 0x5509, 8569 },
+ { 0x55ED, 8572 },
+ { 0x557A, 8575 },
+ { 0x5508, 8578 },
+ { 0x5579, 8581 },
+ { 0x5556, 8584 },
+ { 0x55EE, 8587 },
+ { 0x552F, 8590 },
+ { 0x55C6, 8593 },
+ { 0x55A0, 8596 },
+ { 0x5515, 8599 },
+ { 0x5586, 8602 },
+ { 0x554B, 8605 },
+ { 0x55E3, 8608 },
+ { 0x556C, 8611 },
+ { 0x5604, 8614 },
+ { 0x5544, 8617 },
+ { 0x55DC, 8620 },
+ { 0x55B5, 8623 },
+ { 0x55BC, 8626 },
+ { 0x551C, 8629 },
+ { 0x558D, 8632 },
+ { 0x5523, 8635 },
+ { 0x5594, 8638 },
+ { 0x5517, 8641 },
+ { 0x5588, 8644 },
+ { 0x550F, 8647 },
+ { 0x5580, 8650 },
+ { 0x5504, 8653 },
+ { 0x5575, 8656 },
+ { 0x5519, 8659 },
+ { 0x558A, 8662 },
+ { 0x5511, 8665 },
+ { 0x5582, 8668 },
+ { 0x550A, 8671 },
+ { 0x557B, 8674 },
+ { 0x562B, 8677 },
+ { 0x5610, 8681 },
+ { 0x5611, 8685 },
+ { 0x562A, 8689 },
+ { 0x5612, 8693 },
+ { 0x551F, 8697 },
+ { 0x5605, 8700 },
+ { 0x5590, 8703 },
+ { 0x560C, 8706 },
+ { 0x20A9, 8709 },
+ { 0x22BB, 8711 },
+ { 0x00A5, 8712 },
+ { 0x262F, 8714 },
+ { 0x2135, 8716 },
+ { 0x2625, 8718 },
+ { 0x269B, 8719 },
+ { 0x237E, 8721 },
+ { 0x2106, 8723 },
+ { 0x2105, 8725 },
+ { 0x20B5, 8727 },
+ { 0x00A2, 8729 },
+ { 0x5A51, 8731 },
+ { 0x5A56, 8734 },
+ { 0x5A52, 8737 },
+ { 0x5A55, 8740 },
+ { 0x5A54, 8743 },
+ { 0x5A59, 8746 },
+ { 0x5A50, 8749 },
+ { 0x5A58, 8752 },
+ { 0x5A57, 8755 },
+ { 0x5A53, 8758 },
+ { 0x5A2A, 8761 },
+ { 0x5A2F, 8765 },
+ { 0x5A2D, 8769 },
+ { 0x5A29, 8773 },
+ { 0x5A30, 8777 },
+ { 0x5A31, 8781 },
+ { 0x5A2C, 8785 },
+ { 0x5A2B, 8789 },
+ { 0x5A2E, 8793 },
+ { 0x5A32, 8797 },
+ { 0x5A00, 8801 },
+ { 0x5A03, 8804 },
+ { 0x5A01, 8807 },
+ { 0x5A05, 8810 },
+ { 0x5A02, 8813 },
+ { 0x5A04, 8816 },
+ { 0x5A1D, 8819 },
+ { 0x5A15, 8822 },
+ { 0x5A08, 8825 },
+ { 0x5A28, 8828 },
+ { 0x5A0E, 8831 },
+ { 0x5A06, 8834 },
+ { 0x5A24, 8837 },
+ { 0x5A20, 8840 },
+ { 0x5A18, 8843 },
+ { 0x5A1A, 8846 },
+ { 0x5A23, 8849 },
+ { 0x5A27, 8852 },
+ { 0x5A13, 8855 },
+ { 0x5A25, 8858 },
+ { 0x5A22, 8861 },
+ { 0x5A21, 8864 },
+ { 0x5A1E, 8867 },
+ { 0x5A0C, 8870 },
+ { 0x5A19, 8873 },
+ { 0x5A16, 8876 },
+ { 0x5A09, 8879 },
+ { 0x5A0F, 8882 },
+ { 0x5A07, 8885 },
+ { 0x5A1F, 8888 },
+ { 0x5A0B, 8891 },
+ { 0x5A11, 8894 },
+ { 0x5A17, 8897 },
+ { 0x5A1C, 8900 },
+ { 0x5A1B, 8903 },
+ { 0x5A26, 8906 },
+ { 0x5A14, 8909 },
+ { 0x5A0D, 8912 },
+ { 0x5A0A, 8915 },
+ { 0x5A12, 8918 },
+ { 0x5A10, 8921 },
+ { 0x5A41, 8924 },
+ { 0x5A40, 8928 },
+ { 0x5A4A, 8932 },
+ { 0x5A46, 8936 },
+ { 0x5A47, 8940 },
+ { 0x5A49, 8944 },
+ { 0x5A45, 8948 },
+ { 0x5A48, 8952 },
+ { 0x5A44, 8956 },
+ { 0x5A42, 8960 },
+ { 0x5A4B, 8964 },
+ { 0x5A35, 8968 },
+ { 0x5A34, 8972 },
+ { 0x5A36, 8976 },
+ { 0x5A33, 8980 },
+ { 0x5A4D, 8984 },
+ { 0x5A4C, 8989 },
+ { 0x5A43, 8994 },
+ { 0x5A5D, 8999 },
+ { 0x5A5E, 9002 },
+ { 0x5A5C, 9006 },
+ { 0x5A5F, 9009 },
+ { 0x221B, 9013 },
+ { 0x2593, 9015 },
+ { 0x22AE, 9017 },
+ { 0x22AC, 9020 },
+ { 0x2224, 9023 },
+ { 0x2AEE, 9026 },
+ { 0x220C, 9033 },
+ { 0x22EB, 9038 },
+ { 0x22ED, 9044 },
+ { 0x2280, 9052 },
+ { 0x22E0, 9055 },
+ { 0x2281, 9060 },
+ { 0x22E1, 9063 },
+ { 0x20AB, 9068 },
+ { 0x297F, 9070 },
+ { 0x22A4, 9073 },
+ { 0x2AF1, 9075 },
+ { 0x22F1, 9080 },
+ { 0x2304, 9084 },
+ { 0x2671, 9086 },
+ { 0x20AC, 9089 },
+ { 0x2E2D, 9091 },
+ { 0x2059, 9094 },
+ { 0x205B, 9097 },
+ { 0x2058, 9100 },
+ { 0x2725, 9103 },
+ { 0x2723, 9106 },
+ { 0x2722, 9109 },
+ { 0x002E, 9112 },
+ { 0x2588, 9114 },
+ { 0x27D7, 9116 },
+ { 0x23DB, 9119 },
+ { 0x2699, 9120 },
+ { 0x3013, 9121 },
+ { 0x200A, 9123 },
+ { 0x2388, 9125 },
+ { 0x26A1, 9127 },
+ { 0x2A1D, 9130 },
+ { 0x26B5, 9131 },
+ { 0x263E, 9132 },
+ { 0x27DB, 9135 },
+ { 0x27DA, 9139 },
+ { 0x2993, 9144 },
+ { 0x2E1C, 9148 },
+ { 0x258F, 9152 },
+ { 0x258E, 9156 },
+ { 0x294E, 9160 },
+ { 0x294A, 9167 },
+ { 0x294B, 9174 },
+ { 0x2950, 9181 },
+ { 0x297C, 9188 },
+ { 0x258B, 9191 },
+ { 0x25D6, 9195 },
+ { 0x258C, 9199 },
+ { 0x22A3, 9202 },
+ { 0x3008, 9204 },
+ { 0x2991, 9207 },
+ { 0x2B30, 9212 },
+ { 0x2B32, 9217 },
+ { 0x2997, 9222 },
+ { 0x3010, 9227 },
+ { 0x007B, 9231 },
+ { 0x23A9, 9234 },
+ { 0x23A7, 9239 },
+ { 0x23A8, 9244 },
+ { 0x230A, 9249 },
+ { 0x27D5, 9251 },
+ { 0x21AD, 9254 },
+ { 0x2194, 9258 },
+ { 0x21FC, 9261 },
+ { 0x21AE, 9268 },
+ { 0x21F9, 9273 },
+ { 0x2948, 9279 },
+ { 0x2B0C, 9285 },
+ { 0x2B04, 9289 },
+ { 0x21D4, 9293 },
+ { 0x21CE, 9297 },
+ { 0x2904, 9303 },
+ { 0x21FF, 9310 },
+ { 0x2589, 9314 },
+ { 0x258D, 9318 },
+ { 0x258A, 9322 },
+ { 0x2983, 9326 },
+ { 0x300E, 9330 },
+ { 0x301A, 9334 },
+ { 0x3018, 9338 },
+ { 0x3016, 9343 },
+ { 0x2985, 9347 },
+ { 0x300C, 9350 },
+ { 0x2E04, 9353 },
+ { 0x300A, 9357 },
+ { 0x29DA, 9361 },
+ { 0x201C, 9365 },
+ { 0x2E28, 9369 },
+ { 0x22C9, 9372 },
+ { 0x2E0C, 9377 },
+ { 0x2018, 9381 },
+ { 0x005B, 9385 },
+ { 0x298D, 9388 },
+ { 0x298F, 9396 },
+ { 0x2045, 9404 },
+ { 0x298B, 9409 },
+ { 0x23A3, 9414 },
+ { 0x23A1, 9419 },
+ { 0x23A2, 9424 },
+ { 0x29D8, 9428 },
+ { 0x2308, 9431 },
+ { 0x27DC, 9433 },
+ { 0x27C5, 9435 },
+ { 0x2E26, 9439 },
+ { 0x3014, 9443 },
+ { 0x29CF, 9447 },
+ { 0x2E20, 9452 },
+ { 0x23B8, 9457 },
+ { 0x22CB, 9461 },
+ { 0x0028, 9464 },
+ { 0x239D, 9466 },
+ { 0x239B, 9470 },
+ { 0x239C, 9474 },
+ { 0x2E02, 9477 },
+ { 0x2E09, 9480 },
+ { 0x2028, 9483 },
+ { 0x2A14, 9485 },
+ { 0x2A12, 9491 },
+ { 0x2A13, 9498 },
+ { 0x20A4, 9505 },
+ { 0x2AE6, 9507 },
+ { 0x27DE, 9515 },
+ { 0x27F7, 9518 },
+ { 0x27FA, 9522 },
+ { 0x27DD, 9527 },
+ { 0x27CC, 9530 },
+ { 0x27F5, 9532 },
+ { 0x27FB, 9535 },
+ { 0x27F8, 9540 },
+ { 0x27FD, 9544 },
+ { 0x2B33, 9550 },
+ { 0x27F6, 9554 },
+ { 0x27FC, 9557 },
+ { 0x27F9, 9562 },
+ { 0x27FE, 9566 },
+ { 0x27FF, 9572 },
+ { 0x26A5, 9576 },
+ { 0x2642, 9580 },
+ { 0x26A7, 9582 },
+ { 0x26A6, 9590 },
+ { 0x303C, 9594 },
+ { 0x20A5, 9596 },
+ { 0x29FF, 9598 },
+ { 0x226A, 9599 },
+ { 0x226B, 9601 },
+ { 0x22BC, 9603 },
+ { 0x2398, 9604 },
+ { 0x2423, 9606 },
+ { 0x272B, 9608 },
+ { 0x271B, 9612 },
+ { 0x2732, 9615 },
+ { 0x273C, 9618 },
+ { 0x27C3, 9622 },
+ { 0x27C4, 9624 },
+ { 0x2E19, 9626 },
+ { 0x303D, 9628 },
+ { 0x20B1, 9631 },
+ { 0x002B, 9633 },
+ { 0x2A2D, 9635 },
+ { 0x2A2E, 9641 },
+ { 0x2A39, 9647 },
+ { 0x2A25, 9651 },
+ { 0x2A28, 9656 },
+ { 0x2A22, 9661 },
+ { 0x2A24, 9667 },
+ { 0x2A26, 9672 },
+ { 0x2A27, 9677 },
+ { 0x2A23, 9682 },
+ { 0x2A72, 9688 },
+ { 0x6DFC, 9693 },
+ { 0x2256, 9695 },
+ { 0x02DA, 9699 },
+ { 0x2257, 9701 },
+ { 0x2E30, 9704 },
+ { 0x2218, 9706 },
+ { 0x223F, 9708 },
+ { 0x00AD, 9710 },
+ { 0x2721, 9712 },
+ { 0x262A, 9715 },
+ { 0x225B, 9718 },
+ { 0x22C6, 9720 },
+ { 0x2707, 9722 },
+ { 0x0E51, 9724 },
+ { 0x0E56, 9727 },
+ { 0x0E52, 9730 },
+ { 0x0E55, 9733 },
+ { 0x0E54, 9736 },
+ { 0x0E59, 9739 },
+ { 0x0E50, 9742 },
+ { 0x0E58, 9745 },
+ { 0x0E57, 9748 },
+ { 0x0E53, 9751 },
+ { 0x0E3F, 9754 },
+ { 0x0E2D, 9758 },
+ { 0x0E1A, 9762 },
+ { 0x0E14, 9766 },
+ { 0x0E0E, 9770 },
+ { 0x0E1D, 9774 },
+ { 0x0E1F, 9778 },
+ { 0x0E2B, 9782 },
+ { 0x0E2E, 9786 },
+ { 0x0E01, 9790 },
+ { 0x0E25, 9794 },
+ { 0x0E2C, 9798 },
+ { 0x0E26, 9802 },
+ { 0x0E21, 9805 },
+ { 0x0E19, 9809 },
+ { 0x0E13, 9813 },
+ { 0x0E1B, 9817 },
+ { 0x0E23, 9821 },
+ { 0x0E24, 9825 },
+ { 0x0E0B, 9828 },
+ { 0x0E2A, 9832 },
+ { 0x0E29, 9836 },
+ { 0x0E28, 9840 },
+ { 0x0E15, 9844 },
+ { 0x0E0F, 9848 },
+ { 0x0E27, 9852 },
+ { 0x0E22, 9856 },
+ { 0x0E0D, 9860 },
+ { 0x0E08, 9864 },
+ { 0x0E0C, 9868 },
+ { 0x0E0A, 9872 },
+ { 0x0E09, 9876 },
+ { 0x0E02, 9880 },
+ { 0x0E05, 9884 },
+ { 0x0E03, 9888 },
+ { 0x0E04, 9892 },
+ { 0x0E06, 9896 },
+ { 0x0E48, 9900 },
+ { 0x0E49, 9904 },
+ { 0x0E4A, 9908 },
+ { 0x0E4B, 9912 },
+ { 0x0E31, 9916 },
+ { 0x0E07, 9920 },
+ { 0x0E1E, 9924 },
+ { 0x0E1C, 9928 },
+ { 0x0E20, 9932 },
+ { 0x0E10, 9936 },
+ { 0x0E18, 9940 },
+ { 0x0E16, 9944 },
+ { 0x0E17, 9948 },
+ { 0x0E12, 9952 },
+ { 0x0E11, 9956 },
+ { 0x0E30, 9960 },
+ { 0x0E40, 9964 },
+ { 0x0E34, 9968 },
+ { 0x0E42, 9972 },
+ { 0x0E38, 9976 },
+ { 0x0E32, 9980 },
+ { 0x0E41, 9984 },
+ { 0x0E43, 9988 },
+ { 0x0E44, 9993 },
+ { 0x0E33, 9998 },
+ { 0x0E35, 10002 },
+ { 0x0E36, 10006 },
+ { 0x0E39, 10010 },
+ { 0x0E37, 10014 },
+ { 0x0E5B, 10018 },
+ { 0x0E4F, 10021 },
+ { 0x0E3A, 10024 },
+ { 0x0E46, 10027 },
+ { 0x0E4D, 10030 },
+ { 0x0E4E, 10033 },
+ { 0x0E47, 10036 },
+ { 0x0E2F, 10039 },
+ { 0x0E5A, 10042 },
+ { 0x0E45, 10045 },
+ { 0x0E4C, 10048 },
+ { 0x2009, 10051 },
+ { 0x29FE, 10053 },
+ { 0x22A8, 10054 },
+ { 0x238C, 10055 },
+ { 0x22D8, 10057 },
+ { 0x22D9, 10060 },
+ { 0x301C, 10063 },
+ { 0x2B3F, 10065 },
+ { 0x2933, 10070 },
+ { 0x6E4F, 10075 },
+ { 0x3030, 10078 },
+ { 0x2307, 10080 },
+ { 0x6E4B, 10082 },
+ { 0x2670, 10084 },
+ { 0x2060, 10087 },
+ { 0x200B, 10089 },
+ { 0x200D, 10092 },
+ { 0x6EFF, 10095 },
+ { 0x200C, 10099 },
+ { 0x299F, 10102 },
+ { 0x00B4, 10104 },
+ { 0x2220, 10106 },
+ { 0x299E, 10107 },
+ { 0x29A4, 10111 },
+ { 0x2648, 10114 },
+ { 0x2936, 10115 },
+ { 0x2937, 10121 },
+ { 0x2934, 10127 },
+ { 0x2935, 10133 },
+ { 0x2712, 10139 },
+ { 0x2600, 10141 },
+ { 0x2663, 10145 },
+ { 0x2691, 10148 },
+ { 0x2726, 10150 },
+ { 0x261A, 10154 },
+ { 0x26B8, 10158 },
+ { 0x2605, 10161 },
+ { 0x2B1D, 10163 },
+ { 0x265A, 10167 },
+ { 0x265F, 10170 },
+ { 0x265C, 10173 },
+ { 0x265B, 10176 },
+ { 0x265D, 10179 },
+ { 0x265E, 10182 },
+ { 0x2665, 10185 },
+ { 0x2B24, 10188 },
+ { 0x2B1B, 10191 },
+ { 0x25E3, 10194 },
+ { 0x25E2, 10198 },
+ { 0x261B, 10202 },
+ { 0x2617, 10206 },
+ { 0x2B51, 10209 },
+ { 0x25AA, 10212 },
+ { 0x2B29, 10215 },
+ { 0x2B2A, 10218 },
+ { 0x2660, 10221 },
+ { 0x25E4, 10224 },
+ { 0x25E5, 10228 },
+ { 0x29D3, 10232 },
+ { 0x272C, 10234 },
+ { 0x25CF, 10238 },
+ { 0x2689, 10240 },
+ { 0x29ED, 10246 },
+ { 0x2688, 10251 },
+ { 0x25FE, 10257 },
+ { 0x25FC, 10261 },
+ { 0x2B25, 10264 },
+ { 0x2B27, 10267 },
+ { 0x25A0, 10270 },
+ { 0x25C6, 10272 },
+ { 0x2666, 10274 },
+ { 0x29EA, 10277 },
+ { 0x2756, 10282 },
+ { 0x2B22, 10287 },
+ { 0x29EB, 10289 },
+ { 0x263B, 10291 },
+ { 0x26C2, 10294 },
+ { 0x26C3, 10297 },
+ { 0x273F, 10300 },
+ { 0x2B1F, 10302 },
+ { 0x2702, 10304 },
+ { 0x2B2E, 10306 },
+ { 0x25AE, 10309 },
+ { 0x29D7, 10312 },
+ { 0x204C, 10314 },
+ { 0x25AC, 10317 },
+ { 0x260E, 10319 },
+ { 0x267B, 10321 },
+ { 0x2B2C, 10325 },
+ { 0x27A1, 10328 },
+ { 0x204D, 10331 },
+ { 0x27A4, 10334 },
+ { 0x25B4, 10337 },
+ { 0x25B2, 10341 },
+ { 0x25BE, 10344 },
+ { 0x25BC, 10348 },
+ { 0x25C2, 10351 },
+ { 0x25C4, 10355 },
+ { 0x25C0, 10358 },
+ { 0x25B0, 10361 },
+ { 0x25B8, 10363 },
+ { 0x25BA, 10367 },
+ { 0x2B53, 10370 },
+ { 0x25B6, 10373 },
+ { 0x2422, 10376 },
+ { 0x02D8, 10378 },
+ { 0x1752, 10379 },
+ { 0x1753, 10383 },
+ { 0x1740, 10387 },
+ { 0x1741, 10390 },
+ { 0x1742, 10393 },
+ { 0x174A, 10396 },
+ { 0x1747, 10399 },
+ { 0x1744, 10402 },
+ { 0x1751, 10405 },
+ { 0x1743, 10408 },
+ { 0x174E, 10411 },
+ { 0x174B, 10414 },
+ { 0x1748, 10417 },
+ { 0x1749, 10420 },
+ { 0x174D, 10423 },
+ { 0x1750, 10426 },
+ { 0x1746, 10429 },
+ { 0x174F, 10432 },
+ { 0x174C, 10435 },
+ { 0x1745, 10438 },
+ { 0x2038, 10441 },
+ { 0x2041, 10442 },
+ { 0x02C7, 10445 },
+ { 0x26B3, 10446 },
+ { 0x2713, 10447 },
+ { 0x239A, 10449 },
+ { 0x2050, 10452 },
+ { 0x2601, 10454 },
+ { 0x003A, 10455 },
+ { 0x20A1, 10456 },
+ { 0x2254, 10458 },
+ { 0x2604, 10460 },
+ { 0x002C, 10461 },
+ { 0x2628, 10462 },
+ { 0x2629, 10465 },
+ { 0x23AA, 10468 },
+ { 0x22CE, 10471 },
+ { 0x22CF, 10474 },
+ { 0x2138, 10477 },
+ { 0x225C, 10479 },
+ { 0x0031, 10482 },
+ { 0x2488, 10484 },
+ { 0x0036, 10488 },
+ { 0x248D, 10490 },
+ { 0x0032, 10494 },
+ { 0x2489, 10496 },
+ { 0x0035, 10500 },
+ { 0x248C, 10502 },
+ { 0x0034, 10506 },
+ { 0x248B, 10508 },
+ { 0x0039, 10512 },
+ { 0x2490, 10514 },
+ { 0x0030, 10518 },
+ { 0x0038, 10520 },
+ { 0x248F, 10522 },
+ { 0x0037, 10526 },
+ { 0x248E, 10528 },
+ { 0x0033, 10532 },
+ { 0x248A, 10534 },
+ { 0x3003, 10538 },
+ { 0x2641, 10540 },
+ { 0x23DA, 10541 },
+ { 0x2733, 10543 },
+ { 0x2734, 10546 },
+ { 0x2735, 10550 },
+ { 0x2737, 10554 },
+ { 0x2741, 10559 },
+ { 0x274A, 10564 },
+ { 0x23CF, 10568 },
+ { 0x2205, 10570 },
+ { 0x29B4, 10572 },
+ { 0x29B3, 10578 },
+ { 0x29B2, 10584 },
+ { 0x29B1, 10590 },
+ { 0x2386, 10594 },
+ { 0x225D, 10596 },
+ { 0x22DE, 10600 },
+ { 0x22DF, 10604 },
+ { 0x22DC, 10608 },
+ { 0x22DD, 10612 },
+ { 0x22D5, 10616 },
+ { 0x232B, 10620 },
+ { 0x2326, 10624 },
+ { 0x2107, 10628 },
+ { 0x262B, 10630 },
+ { 0x263D, 10632 },
+ { 0x2322, 10635 },
+ { 0x2137, 10636 },
+ { 0x0060, 10638 },
+ { 0x03D6, 10640 },
+ { 0x0387, 10643 },
+ { 0x03D7, 10646 },
+ { 0x7175, 10649 },
+ { 0x7176, 10653 },
+ { 0x03D5, 10659 },
+ { 0x03FC, 10662 },
+ { 0x03F1, 10667 },
+ { 0x717D, 10670 },
+ { 0x7177, 10674 },
+ { 0x03D0, 10678 },
+ { 0x7180, 10681 },
+ { 0x717F, 10685 },
+ { 0x717C, 10689 },
+ { 0x1FFD, 10692 },
+ { 0x7179, 10694 },
+ { 0x718A, 10697 },
+ { 0x1FFE, 10700 },
+ { 0x1FDE, 10702 },
+ { 0x1FDD, 10706 },
+ { 0x1FDF, 10710 },
+ { 0x03F0, 10714 },
+ { 0x7183, 10717 },
+ { 0x0375, 10720 },
+ { 0x1FBF, 10724 },
+ { 0x1FCE, 10726 },
+ { 0x1FCD, 10730 },
+ { 0x1FCF, 10734 },
+ { 0x037C, 10738 },
+ { 0x03BC, 10744 },
+ { 0x03BD, 10748 },
+ { 0x03C0, 10752 },
+ { 0x03BE, 10756 },
+ { 0x03C7, 10760 },
+ { 0x03B7, 10764 },
+ { 0x1F75, 10768 },
+ { 0x1FC4, 10774 },
+ { 0x1F21, 10782 },
+ { 0x1F25, 10788 },
+ { 0x1F95, 10796 },
+ { 0x1F23, 10806 },
+ { 0x1F93, 10814 },
+ { 0x1F27, 10824 },
+ { 0x1F97, 10832 },
+ { 0x1F91, 10842 },
+ { 0x1F20, 10850 },
+ { 0x1F24, 10856 },
+ { 0x1F94, 10864 },
+ { 0x1F22, 10874 },
+ { 0x1F92, 10882 },
+ { 0x1F26, 10892 },
+ { 0x1F96, 10900 },
+ { 0x1F90, 10910 },
+ { 0x03AE, 10918 },
+ { 0x1F74, 10924 },
+ { 0x1FC2, 10930 },
+ { 0x1FC6, 10938 },
+ { 0x1FC7, 10944 },
+ { 0x1FC3, 10952 },
+ { 0x03C6, 10958 },
+ { 0x03C8, 10962 },
+ { 0x03C1, 10966 },
+ { 0x1FE5, 10970 },
+ { 0x1FE4, 10976 },
+ { 0x03FB, 10982 },
+ { 0x03F8, 10986 },
+ { 0x03C4, 10990 },
+ { 0x03B2, 10994 },
+ { 0x0371, 10998 },
+ { 0x03B9, 11002 },
+ { 0x1F77, 11006 },
+ { 0x1F31, 11012 },
+ { 0x1F35, 11018 },
+ { 0x1F33, 11026 },
+ { 0x1F37, 11034 },
+ { 0x1F30, 11042 },
+ { 0x1F34, 11048 },
+ { 0x1F32, 11056 },
+ { 0x1F36, 11064 },
+ { 0x03AF, 11072 },
+ { 0x1F76, 11078 },
+ { 0x1FD1, 11084 },
+ { 0x1FD0, 11090 },
+ { 0x03CA, 11096 },
+ { 0x1FD3, 11102 },
+ { 0x0390, 11110 },
+ { 0x1FD2, 11118 },
+ { 0x1FD7, 11126 },
+ { 0x1FD6, 11134 },
+ { 0x03B6, 11140 },
+ { 0x03B1, 11144 },
+ { 0x1F71, 11148 },
+ { 0x1FB4, 11154 },
+ { 0x1F01, 11162 },
+ { 0x1F05, 11168 },
+ { 0x1F85, 11176 },
+ { 0x1F03, 11186 },
+ { 0x1F83, 11194 },
+ { 0x1F07, 11204 },
+ { 0x1F87, 11212 },
+ { 0x1F81, 11222 },
+ { 0x1F00, 11230 },
+ { 0x1F04, 11236 },
+ { 0x1F84, 11244 },
+ { 0x1F02, 11254 },
+ { 0x1F82, 11262 },
+ { 0x1F06, 11272 },
+ { 0x1F86, 11280 },
+ { 0x1F80, 11290 },
+ { 0x03AC, 11298 },
+ { 0x1F70, 11304 },
+ { 0x1FB2, 11310 },
+ { 0x1FB1, 11318 },
+ { 0x1FB0, 11324 },
+ { 0x1FB6, 11330 },
+ { 0x1FB7, 11336 },
+ { 0x1FB3, 11344 },
+ { 0x03B4, 11350 },
+ { 0x03C2, 11354 },
+ { 0x03B3, 11359 },
+ { 0x03BA, 11363 },
+ { 0x03DF, 11367 },
+ { 0x03BB, 11371 },
+ { 0x03C9, 11375 },
+ { 0x1F7D, 11379 },
+ { 0x1FF4, 11385 },
+ { 0x1F61, 11393 },
+ { 0x1F65, 11399 },
+ { 0x1FA5, 11407 },
+ { 0x1F63, 11417 },
+ { 0x1FA3, 11425 },
+ { 0x1F67, 11435 },
+ { 0x1FA7, 11443 },
+ { 0x1FA1, 11453 },
+ { 0x1F60, 11461 },
+ { 0x1F64, 11467 },
+ { 0x1FA4, 11475 },
+ { 0x1F62, 11485 },
+ { 0x1FA2, 11493 },
+ { 0x1F66, 11503 },
+ { 0x1FA6, 11511 },
+ { 0x1FA0, 11521 },
+ { 0x03CE, 11529 },
+ { 0x1F7C, 11535 },
+ { 0x1FF2, 11541 },
+ { 0x1FF6, 11549 },
+ { 0x1FF7, 11555 },
+ { 0x1FF3, 11563 },
+ { 0x03E1, 11569 },
+ { 0x03C3, 11573 },
+ { 0x03B8, 11577 },
+ { 0x03DB, 11581 },
+ { 0x03D9, 11585 },
+ { 0x0373, 11590 },
+ { 0x03DD, 11595 },
+ { 0x03B5, 11599 },
+ { 0x1F73, 11603 },
+ { 0x1F11, 11609 },
+ { 0x1F15, 11615 },
+ { 0x1F13, 11623 },
+ { 0x1F10, 11631 },
+ { 0x1F14, 11637 },
+ { 0x1F12, 11645 },
+ { 0x03AD, 11653 },
+ { 0x1F72, 11659 },
+ { 0x03BF, 11665 },
+ { 0x1F79, 11669 },
+ { 0x1F41, 11675 },
+ { 0x1F45, 11681 },
+ { 0x1F43, 11689 },
+ { 0x1F40, 11697 },
+ { 0x1F44, 11703 },
+ { 0x1F42, 11711 },
+ { 0x03CC, 11719 },
+ { 0x1F78, 11725 },
+ { 0x03C5, 11731 },
+ { 0x1F7B, 11735 },
+ { 0x1F51, 11741 },
+ { 0x1F55, 11747 },
+ { 0x1F53, 11755 },
+ { 0x1F57, 11763 },
+ { 0x1F50, 11771 },
+ { 0x1F54, 11777 },
+ { 0x1F52, 11785 },
+ { 0x1F56, 11793 },
+ { 0x03CD, 11801 },
+ { 0x1F7A, 11807 },
+ { 0x1FE1, 11813 },
+ { 0x1FE0, 11819 },
+ { 0x03CB, 11825 },
+ { 0x1FE3, 11831 },
+ { 0x03B0, 11839 },
+ { 0x1FE2, 11847 },
+ { 0x1FE7, 11855 },
+ { 0x1FE6, 11863 },
+ { 0x0377, 11869 },
+ { 0x037D, 11874 },
+ { 0x037B, 11881 },
+ { 0x03D1, 11887 },
+ { 0x717E, 11890 },
+ { 0x7178, 11894 },
+ { 0x0384, 11898 },
+ { 0x1FEF, 11900 },
+ { 0x9200, 11902 },
+ { 0x9201, 11906 },
+ { 0x9202, 11910 },
+ { 0x9203, 11914 },
+ { 0x9204, 11918 },
+ { 0x9205, 11922 },
+ { 0x9206, 11926 },
+ { 0x9207, 11930 },
+ { 0x9208, 11934 },
+ { 0x9209, 11938 },
+ { 0x920A, 11942 },
+ { 0x920B, 11946 },
+ { 0x920C, 11950 },
+ { 0x920D, 11954 },
+ { 0x920E, 11958 },
+ { 0x920F, 11962 },
+ { 0x9210, 11966 },
+ { 0x9211, 11970 },
+ { 0x9212, 11974 },
+ { 0x9213, 11978 },
+ { 0x9214, 11982 },
+ { 0x9215, 11986 },
+ { 0x9216, 11990 },
+ { 0x9217, 11994 },
+ { 0x9218, 11998 },
+ { 0x9219, 12002 },
+ { 0x921A, 12006 },
+ { 0x921B, 12010 },
+ { 0x921C, 12014 },
+ { 0x7187, 12018 },
+ { 0x7186, 12021 },
+ { 0x7188, 12024 },
+ { 0x03F3, 12027 },
+ { 0x03DE, 12030 },
+ { 0x03E0, 12033 },
+ { 0x1D28, 12036 },
+ { 0x1D2A, 12041 },
+ { 0x1D29, 12046 },
+ { 0x1D26, 12051 },
+ { 0x1D27, 12056 },
+ { 0x03DA, 12061 },
+ { 0x03D8, 12064 },
+ { 0x03DC, 12068 },
+ { 0x03F2, 12071 },
+ { 0x03F5, 12075 },
+ { 0x7184, 12079 },
+ { 0x717A, 12082 },
+ { 0x7185, 12085 },
+ { 0x03CF, 12088 },
+ { 0x03F4, 12092 },
+ { 0x03FE, 12096 },
+ { 0x039C, 12102 },
+ { 0x039D, 12106 },
+ { 0x03A0, 12110 },
+ { 0x039E, 12114 },
+ { 0x03A7, 12118 },
+ { 0x0397, 12122 },
+ { 0x1FCB, 12126 },
+ { 0x1F29, 12132 },
+ { 0x1F2D, 12138 },
+ { 0x1F9D, 12146 },
+ { 0x1F2B, 12156 },
+ { 0x1F9B, 12164 },
+ { 0x1F2F, 12174 },
+ { 0x1F9F, 12182 },
+ { 0x1F99, 12192 },
+ { 0x1F28, 12200 },
+ { 0x1F2C, 12206 },
+ { 0x1F9C, 12214 },
+ { 0x1F2A, 12224 },
+ { 0x1F9A, 12232 },
+ { 0x1F2E, 12242 },
+ { 0x1F9E, 12250 },
+ { 0x1F98, 12260 },
+ { 0x0389, 12268 },
+ { 0x1FCA, 12274 },
+ { 0x1FCC, 12280 },
+ { 0x03A6, 12286 },
+ { 0x03A8, 12290 },
+ { 0x03A1, 12294 },
+ { 0x1FEC, 12298 },
+ { 0x03FA, 12304 },
+ { 0x03F7, 12308 },
+ { 0x03A4, 12312 },
+ { 0x0392, 12316 },
+ { 0x0370, 12320 },
+ { 0x0399, 12324 },
+ { 0x1FDB, 12328 },
+ { 0x1F39, 12334 },
+ { 0x1F3D, 12340 },
+ { 0x1F3B, 12348 },
+ { 0x1F3F, 12356 },
+ { 0x1F38, 12364 },
+ { 0x1F3C, 12370 },
+ { 0x1F3A, 12378 },
+ { 0x1F3E, 12386 },
+ { 0x038A, 12394 },
+ { 0x1FDA, 12400 },
+ { 0x1FD9, 12406 },
+ { 0x1FD8, 12412 },
+ { 0x03AA, 12418 },
+ { 0x0396, 12424 },
+ { 0x0391, 12428 },
+ { 0x1FBB, 12432 },
+ { 0x1F09, 12438 },
+ { 0x1F0D, 12444 },
+ { 0x1F8D, 12452 },
+ { 0x1F0B, 12462 },
+ { 0x1F8B, 12470 },
+ { 0x1F0F, 12480 },
+ { 0x1F8F, 12488 },
+ { 0x1F89, 12498 },
+ { 0x1F08, 12506 },
+ { 0x1F0C, 12512 },
+ { 0x1F8C, 12520 },
+ { 0x1F0A, 12530 },
+ { 0x1F8A, 12538 },
+ { 0x1F0E, 12548 },
+ { 0x1F8E, 12556 },
+ { 0x1F88, 12566 },
+ { 0x0386, 12574 },
+ { 0x1FBA, 12580 },
+ { 0x1FB9, 12586 },
+ { 0x1FB8, 12592 },
+ { 0x1FBC, 12598 },
+ { 0x0394, 12604 },
+ { 0x0393, 12608 },
+ { 0x039A, 12612 },
+ { 0x039B, 12616 },
+ { 0x03A9, 12620 },
+ { 0x1FFB, 12624 },
+ { 0x1F69, 12630 },
+ { 0x1F6D, 12636 },
+ { 0x1FAD, 12644 },
+ { 0x1F6B, 12654 },
+ { 0x1FAB, 12662 },
+ { 0x1F6F, 12672 },
+ { 0x1FAF, 12680 },
+ { 0x1FA9, 12690 },
+ { 0x1F68, 12698 },
+ { 0x1F6C, 12704 },
+ { 0x1FAC, 12712 },
+ { 0x1F6A, 12722 },
+ { 0x1FAA, 12730 },
+ { 0x1F6E, 12740 },
+ { 0x1FAE, 12748 },
+ { 0x1FA8, 12758 },
+ { 0x038F, 12766 },
+ { 0x1FFA, 12772 },
+ { 0x1FFC, 12778 },
+ { 0x03A3, 12784 },
+ { 0x0398, 12788 },
+ { 0x0372, 12792 },
+ { 0x0395, 12797 },
+ { 0x1FC9, 12801 },
+ { 0x1F19, 12807 },
+ { 0x1F1D, 12813 },
+ { 0x1F1B, 12821 },
+ { 0x1F18, 12829 },
+ { 0x1F1C, 12835 },
+ { 0x1F1A, 12843 },
+ { 0x0388, 12851 },
+ { 0x1FC8, 12857 },
+ { 0x039F, 12863 },
+ { 0x1FF9, 12867 },
+ { 0x1F49, 12873 },
+ { 0x1F4D, 12879 },
+ { 0x1F4B, 12887 },
+ { 0x1F48, 12895 },
+ { 0x1F4C, 12901 },
+ { 0x1F4A, 12909 },
+ { 0x038C, 12917 },
+ { 0x1FF8, 12923 },
+ { 0x03A5, 12929 },
+ { 0x1FEB, 12933 },
+ { 0x1F59, 12939 },
+ { 0x1F5D, 12945 },
+ { 0x1F5B, 12953 },
+ { 0x1F5F, 12961 },
+ { 0x038E, 12969 },
+ { 0x1FEA, 12975 },
+ { 0x1FE9, 12981 },
+ { 0x1FE8, 12987 },
+ { 0x03AB, 12993 },
+ { 0x0376, 12999 },
+ { 0x03F9, 13004 },
+ { 0x03FF, 13009 },
+ { 0x03FD, 13016 },
+ { 0x717B, 13022 },
+ { 0x1FBD, 13025 },
+ { 0x7182, 13027 },
+ { 0x9245, 13031 },
+ { 0x0374, 13034 },
+ { 0x03D2, 13037 },
+ { 0x03D3, 13042 },
+ { 0x03D4, 13049 },
+ { 0x7181, 13056 },
+ { 0x037E, 13059 },
+ { 0x03F6, 13062 },
+ { 0x7189, 13067 },
+ { 0x1FEE, 13071 },
+ { 0x1FED, 13075 },
+ { 0x1FC1, 13079 },
+ { 0x0385, 13083 },
+ { 0x1D6A, 13086 },
+ { 0x1D69, 13091 },
+ { 0x1D68, 13096 },
+ { 0x1D66, 13101 },
+ { 0x1D67, 13106 },
+ { 0x7141, 13111 },
+ { 0x7142, 13116 },
+ { 0x7152, 13121 },
+ { 0x714B, 13127 },
+ { 0x7140, 13133 },
+ { 0x7154, 13138 },
+ { 0x714D, 13144 },
+ { 0x7157, 13150 },
+ { 0x7150, 13155 },
+ { 0x7149, 13160 },
+ { 0x7155, 13165 },
+ { 0x7143, 13171 },
+ { 0x7145, 13175 },
+ { 0x7153, 13180 },
+ { 0x714C, 13186 },
+ { 0x714F, 13192 },
+ { 0x7148, 13197 },
+ { 0x7146, 13202 },
+ { 0x714E, 13207 },
+ { 0x7144, 13213 },
+ { 0x7151, 13217 },
+ { 0x714A, 13222 },
+ { 0x7147, 13227 },
+ { 0x7156, 13232 },
+ { 0x7170, 13238 },
+ { 0x7173, 13243 },
+ { 0x7158, 13248 },
+ { 0x715D, 13253 },
+ { 0x7174, 13258 },
+ { 0x7159, 13263 },
+ { 0x716A, 13267 },
+ { 0x7171, 13272 },
+ { 0x7164, 13277 },
+ { 0x715C, 13281 },
+ { 0x716E, 13285 },
+ { 0x7172, 13290 },
+ { 0x7169, 13295 },
+ { 0x716B, 13299 },
+ { 0x7165, 13304 },
+ { 0x716F, 13308 },
+ { 0x7163, 13313 },
+ { 0x715B, 13317 },
+ { 0x715E, 13321 },
+ { 0x716C, 13326 },
+ { 0x715A, 13331 },
+ { 0x7162, 13335 },
+ { 0x7168, 13339 },
+ { 0x7160, 13343 },
+ { 0x7161, 13347 },
+ { 0x715F, 13353 },
+ { 0x716D, 13357 },
+ { 0x7166, 13362 },
+ { 0x7167, 13366 },
+ { 0x1FC0, 13372 },
+ { 0x921D, 13374 },
+ { 0x921E, 13378 },
+ { 0x921F, 13382 },
+ { 0x9220, 13386 },
+ { 0x9221, 13390 },
+ { 0x9222, 13394 },
+ { 0x9223, 13398 },
+ { 0x9224, 13402 },
+ { 0x9225, 13406 },
+ { 0x9226, 13410 },
+ { 0x9227, 13414 },
+ { 0x9228, 13418 },
+ { 0x9229, 13422 },
+ { 0x922A, 13426 },
+ { 0x922B, 13430 },
+ { 0x922C, 13434 },
+ { 0x922D, 13438 },
+ { 0x922E, 13442 },
+ { 0x922F, 13446 },
+ { 0x9230, 13450 },
+ { 0x9231, 13454 },
+ { 0x9232, 13458 },
+ { 0x9233, 13462 },
+ { 0x9234, 13466 },
+ { 0x9235, 13470 },
+ { 0x9236, 13474 },
+ { 0x9237, 13478 },
+ { 0x9238, 13482 },
+ { 0x9239, 13486 },
+ { 0x923A, 13490 },
+ { 0x923B, 13494 },
+ { 0x923C, 13498 },
+ { 0x923D, 13502 },
+ { 0x923E, 13506 },
+ { 0x923F, 13510 },
+ { 0x9240, 13514 },
+ { 0x9241, 13518 },
+ { 0x037A, 13522 },
+ { 0x1FBE, 13524 },
+ { 0x2724, 13526 },
+ { 0x271C, 13530 },
+ { 0x2764, 13534 },
+ { 0x27A6, 13537 },
+ { 0x27A5, 13544 },
+ { 0x2714, 13551 },
+ { 0x2738, 13554 },
+ { 0x274B, 13560 },
+ { 0x271A, 13565 },
+ { 0x2763, 13568 },
+ { 0x27AD, 13573 },
+ { 0x279A, 13579 },
+ { 0x2798, 13583 },
+ { 0x27AE, 13587 },
+ { 0x2718, 13593 },
+ { 0x27A0, 13596 },
+ { 0x275E, 13601 },
+ { 0x275D, 13607 },
+ { 0x275C, 13614 },
+ { 0x275B, 13620 },
+ { 0x2746, 13627 },
+ { 0x2748, 13630 },
+ { 0x2731, 13632 },
+ { 0x272E, 13634 },
+ { 0x275A, 13638 },
+ { 0x2799, 13641 },
+ { 0x2762, 13644 },
+ { 0x2794, 13648 },
+ { 0x279C, 13652 },
+ { 0x27BD, 13656 },
+ { 0x2770, 13660 },
+ { 0x276E, 13665 },
+ { 0x2716, 13671 },
+ { 0x2771, 13674 },
+ { 0x276F, 13679 },
+ { 0x27B9, 13685 },
+ { 0x27B7, 13690 },
+ { 0x27B8, 13695 },
+ { 0x27A8, 13699 },
+ { 0x273D, 13704 },
+ { 0x2743, 13707 },
+ { 0x279E, 13711 },
+ { 0x27BB, 13715 },
+ { 0x2302, 13719 },
+ { 0x22B7, 13720 },
+ { 0x2253, 13722 },
+ { 0x592E, 13728 },
+ { 0x592F, 13732 },
+ { 0x592C, 13736 },
+ { 0x592D, 13740 },
+ { 0x592B, 13745 },
+ { 0x5901, 13749 },
+ { 0x5906, 13753 },
+ { 0x5902, 13757 },
+ { 0x5905, 13761 },
+ { 0x5904, 13765 },
+ { 0x5909, 13769 },
+ { 0x5900, 13773 },
+ { 0x5908, 13777 },
+ { 0x5907, 13781 },
+ { 0x5903, 13785 },
+ { 0x5927, 13789 },
+ { 0x592A, 13793 },
+ { 0x5928, 13797 },
+ { 0x5929, 13801 },
+ { 0x5926, 13805 },
+ { 0x5922, 13809 },
+ { 0x5924, 13813 },
+ { 0x5919, 13817 },
+ { 0x5921, 13821 },
+ { 0x5918, 13825 },
+ { 0x590C, 13829 },
+ { 0x591F, 13833 },
+ { 0x590A, 13837 },
+ { 0x591C, 13841 },
+ { 0x5917, 13845 },
+ { 0x5914, 13849 },
+ { 0x5923, 13853 },
+ { 0x5925, 13857 },
+ { 0x5915, 13861 },
+ { 0x591A, 13865 },
+ { 0x590E, 13869 },
+ { 0x5912, 13873 },
+ { 0x5920, 13877 },
+ { 0x591D, 13881 },
+ { 0x591B, 13885 },
+ { 0x5910, 13889 },
+ { 0x5913, 13893 },
+ { 0x590B, 13897 },
+ { 0x590D, 13901 },
+ { 0x5911, 13905 },
+ { 0x5916, 13909 },
+ { 0x590F, 13913 },
+ { 0x591E, 13917 },
+ { 0x17D7, 13921 },
+ { 0x17D4, 13925 },
+ { 0x17CF, 13928 },
+ { 0x17D2, 13931 },
+ { 0x17CC, 13934 },
+ { 0x17CB, 13937 },
+ { 0x17D8, 13940 },
+ { 0x17D6, 13943 },
+ { 0x17D9, 13948 },
+ { 0x17D0, 13952 },
+ { 0x17D1, 13956 },
+ { 0x17CE, 13959 },
+ { 0x17DA, 13962 },
+ { 0x17C6, 13965 },
+ { 0x17C7, 13968 },
+ { 0x17CA, 13971 },
+ { 0x17DD, 13974 },
+ { 0x17D5, 13977 },
+ { 0x17D3, 13980 },
+ { 0x17C9, 13983 },
+ { 0x17CD, 13986 },
+ { 0x17DC, 13989 },
+ { 0x17C8, 13992 },
+ { 0x17E1, 13995 },
+ { 0x17E6, 13998 },
+ { 0x17E2, 14001 },
+ { 0x17E5, 14004 },
+ { 0x17E4, 14007 },
+ { 0x17E9, 14010 },
+ { 0x17E0, 14013 },
+ { 0x17E8, 14016 },
+ { 0x17E7, 14019 },
+ { 0x17E3, 14022 },
+ { 0x17C1, 14025 },
+ { 0x17B7, 14029 },
+ { 0x17BB, 14033 },
+ { 0x17B9, 14037 },
+ { 0x17B6, 14041 },
+ { 0x17C2, 14045 },
+ { 0x17C3, 14049 },
+ { 0x17C5, 14053 },
+ { 0x17C0, 14057 },
+ { 0x17B8, 14061 },
+ { 0x17BE, 14065 },
+ { 0x17C4, 14069 },
+ { 0x17BD, 14073 },
+ { 0x17BC, 14077 },
+ { 0x17BF, 14081 },
+ { 0x17BA, 14085 },
+ { 0x17B5, 14089 },
+ { 0x17B4, 14093 },
+ { 0x1794, 14097 },
+ { 0x1785, 14100 },
+ { 0x1787, 14103 },
+ { 0x178A, 14106 },
+ { 0x178C, 14109 },
+ { 0x17A0, 14112 },
+ { 0x1780, 14115 },
+ { 0x1782, 14118 },
+ { 0x17A1, 14121 },
+ { 0x179B, 14124 },
+ { 0x1798, 14127 },
+ { 0x1793, 14130 },
+ { 0x1796, 14133 },
+ { 0x17A2, 14136 },
+ { 0x179A, 14139 },
+ { 0x179F, 14142 },
+ { 0x178F, 14145 },
+ { 0x1791, 14148 },
+ { 0x179C, 14151 },
+ { 0x1799, 14154 },
+ { 0x1786, 14157 },
+ { 0x1788, 14160 },
+ { 0x1781, 14163 },
+ { 0x1783, 14166 },
+ { 0x1784, 14169 },
+ { 0x178E, 14172 },
+ { 0x1789, 14175 },
+ { 0x1795, 14178 },
+ { 0x1797, 14181 },
+ { 0x179D, 14184 },
+ { 0x179E, 14187 },
+ { 0x1790, 14190 },
+ { 0x1792, 14193 },
+ { 0x178B, 14196 },
+ { 0x178D, 14199 },
+ { 0x19F3, 14202 },
+ { 0x19E3, 14206 },
+ { 0x19FA, 14210 },
+ { 0x19EA, 14214 },
+ { 0x17F3, 14218 },
+ { 0x17F2, 14223 },
+ { 0x17F0, 14228 },
+ { 0x17F4, 14233 },
+ { 0x17F1, 14238 },
+ { 0x17F5, 14243 },
+ { 0x17F8, 14248 },
+ { 0x17F7, 14253 },
+ { 0x17F9, 14258 },
+ { 0x17F6, 14263 },
+ { 0x19F2, 14268 },
+ { 0x19E2, 14272 },
+ { 0x19F4, 14276 },
+ { 0x19E4, 14280 },
+ { 0x19F1, 14284 },
+ { 0x19E1, 14288 },
+ { 0x19F5, 14292 },
+ { 0x19E5, 14296 },
+ { 0x19FD, 14300 },
+ { 0x19ED, 14304 },
+ { 0x19FC, 14308 },
+ { 0x19EC, 14312 },
+ { 0x19FE, 14316 },
+ { 0x19EE, 14320 },
+ { 0x19FB, 14324 },
+ { 0x19EB, 14328 },
+ { 0x19FF, 14332 },
+ { 0x19EF, 14336 },
+ { 0x19F8, 14340 },
+ { 0x19E8, 14344 },
+ { 0x19F7, 14348 },
+ { 0x19E7, 14352 },
+ { 0x19F9, 14356 },
+ { 0x19E9, 14360 },
+ { 0x19F6, 14364 },
+ { 0x19E6, 14368 },
+ { 0x19F0, 14372 },
+ { 0x19E0, 14375 },
+ { 0x17DB, 14378 },
+ { 0x17AD, 14382 },
+ { 0x17AF, 14386 },
+ { 0x17A5, 14390 },
+ { 0x17A7, 14394 },
+ { 0x17AB, 14398 },
+ { 0x17AE, 14402 },
+ { 0x17A4, 14406 },
+ { 0x17B0, 14410 },
+ { 0x17A3, 14414 },
+ { 0x17B3, 14418 },
+ { 0x17A6, 14422 },
+ { 0x17B1, 14426 },
+ { 0x17B2, 14432 },
+ { 0x17A8, 14438 },
+ { 0x17A9, 14442 },
+ { 0x17AC, 14446 },
+ { 0x17AA, 14450 },
+ { 0x27D8, 14454 },
+ { 0x27D9, 14457 },
+ { 0x2A1E, 14460 },
+ { 0x25EF, 14464 },
+ { 0x2AFC, 14466 },
+ { 0x271D, 14471 },
+ { 0x0061, 14473 },
+ { 0x0227, 14477 },
+ { 0x01E1, 14484 },
+ { 0x1EA1, 14493 },
+ { 0x1EA3, 14500 },
+ { 0x00E5, 14507 },
+ { 0x01FB, 14514 },
+ { 0x1E01, 14523 },
+ { 0x00E1, 14530 },
+ { 0x0103, 14536 },
+ { 0x1EB7, 14542 },
+ { 0x1EB3, 14551 },
+ { 0x1EAF, 14560 },
+ { 0x1EB1, 14568 },
+ { 0x1EB5, 14576 },
+ { 0x01CE, 14584 },
+ { 0x00E0, 14590 },
+ { 0x1E9A, 14596 },
+ { 0x00E3, 14604 },
+ { 0x0201, 14610 },
+ { 0x0101, 14617 },
+ { 0x0105, 14623 },
+ { 0x2C65, 14629 },
+ { 0x0203, 14635 },
+ { 0x00E4, 14642 },
+ { 0x01DF, 14648 },
+ { 0x1D8F, 14656 },
+ { 0x00E2, 14663 },
+ { 0x1EAD, 14669 },
+ { 0x1EA9, 14678 },
+ { 0x1EA5, 14687 },
+ { 0x1EA7, 14695 },
+ { 0x1EAB, 14703 },
+ { 0x0062, 14711 },
+ { 0x1E03, 14715 },
+ { 0x1E05, 14722 },
+ { 0x0253, 14729 },
+ { 0x1E07, 14735 },
+ { 0x1D6C, 14742 },
+ { 0x0180, 14749 },
+ { 0x0183, 14755 },
+ { 0x1D80, 14761 },
+ { 0x0063, 14768 },
+ { 0x010B, 14772 },
+ { 0x0255, 14779 },
+ { 0x0188, 14785 },
+ { 0x0107, 14791 },
+ { 0x010D, 14797 },
+ { 0x023C, 14803 },
+ { 0x00E7, 14809 },
+ { 0x1E09, 14815 },
+ { 0x0109, 14823 },
+ { 0x0064, 14829 },
+ { 0x1E0B, 14833 },
+ { 0x1E0D, 14840 },
+ { 0x0221, 14847 },
+ { 0x0257, 14853 },
+ { 0x1D91, 14859 },
+ { 0x1E0F, 14867 },
+ { 0x0256, 14874 },
+ { 0x010F, 14880 },
+ { 0x1D6D, 14886 },
+ { 0x0111, 14893 },
+ { 0x018C, 14899 },
+ { 0x1E11, 14905 },
+ { 0x1D81, 14911 },
+ { 0x1E13, 14918 },
+ { 0x0065, 14925 },
+ { 0x0117, 14929 },
+ { 0x1EB9, 14936 },
+ { 0x1EBB, 14943 },
+ { 0x00E9, 14950 },
+ { 0x0115, 14956 },
+ { 0x011B, 14962 },
+ { 0x00E8, 14968 },
+ { 0x2C78, 14974 },
+ { 0x1EBD, 14980 },
+ { 0x1E1B, 14986 },
+ { 0x0205, 14993 },
+ { 0x0113, 15000 },
+ { 0x1E17, 15006 },
+ { 0x1E15, 15014 },
+ { 0x0119, 15022 },
+ { 0x0247, 15028 },
+ { 0x0229, 15034 },
+ { 0x1E1D, 15040 },
+ { 0x0207, 15048 },
+ { 0x00EB, 15055 },
+ { 0x1D92, 15061 },
+ { 0x00EA, 15068 },
+ { 0x1EC7, 15074 },
+ { 0x1EC3, 15083 },
+ { 0x1EBF, 15092 },
+ { 0x1EC1, 15100 },
+ { 0x1EC5, 15108 },
+ { 0x1E19, 15116 },
+ { 0x0066, 15123 },
+ { 0x1E1F, 15127 },
+ { 0x0192, 15134 },
+ { 0x1D6E, 15140 },
+ { 0x1D82, 15147 },
+ { 0x0067, 15154 },
+ { 0x0121, 15158 },
+ { 0x0260, 15165 },
+ { 0x01F5, 15171 },
+ { 0x011F, 15177 },
+ { 0x01E7, 15183 },
+ { 0x1E21, 15189 },
+ { 0x01E5, 15195 },
+ { 0x0123, 15201 },
+ { 0x1D83, 15207 },
+ { 0x011D, 15214 },
+ { 0x0068, 15220 },
+ { 0x1E23, 15224 },
+ { 0x1E25, 15231 },
+ { 0x0266, 15238 },
+ { 0x1E96, 15244 },
+ { 0x1E2B, 15251 },
+ { 0x021F, 15258 },
+ { 0x0127, 15264 },
+ { 0x1E29, 15270 },
+ { 0x2C68, 15276 },
+ { 0x1E27, 15282 },
+ { 0x0125, 15288 },
+ { 0x0069, 15294 },
+ { 0x1ECB, 15298 },
+ { 0x1EC9, 15305 },
+ { 0x00ED, 15312 },
+ { 0x012D, 15318 },
+ { 0x01D0, 15324 },
+ { 0x00EC, 15330 },
+ { 0x0129, 15336 },
+ { 0x1E2D, 15342 },
+ { 0x0209, 15349 },
+ { 0x012B, 15356 },
+ { 0x012F, 15362 },
+ { 0x0268, 15368 },
+ { 0x020B, 15374 },
+ { 0x00EF, 15381 },
+ { 0x1E2F, 15387 },
+ { 0x1D96, 15395 },
+ { 0x00EE, 15402 },
+ { 0x006A, 15408 },
+ { 0x01F0, 15412 },
+ { 0x0249, 15418 },
+ { 0x0135, 15424 },
+ { 0x029D, 15430 },
+ { 0x006B, 15436 },
+ { 0x1E33, 15440 },
+ { 0x0199, 15447 },
+ { 0x1E35, 15453 },
+ { 0x1E31, 15460 },
+ { 0x01E9, 15466 },
+ { 0x5741, 15472 },
+ { 0x5745, 15478 },
+ { 0x0137, 15487 },
+ { 0x1D84, 15493 },
+ { 0x5743, 15500 },
+ { 0x2C6A, 15507 },
+ { 0x006C, 15513 },
+ { 0x019A, 15517 },
+ { 0x1E37, 15523 },
+ { 0x1E39, 15530 },
+ { 0x026C, 15539 },
+ { 0x0234, 15545 },
+ { 0x5749, 15551 },
+ { 0x1E3B, 15558 },
+ { 0x013A, 15565 },
+ { 0x013E, 15571 },
+ { 0x2C61, 15577 },
+ { 0x0140, 15584 },
+ { 0x026B, 15591 },
+ { 0x0142, 15598 },
+ { 0x013C, 15604 },
+ { 0x1D85, 15610 },
+ { 0x026D, 15617 },
+ { 0x1E3D, 15624 },
+ { 0x006D, 15631 },
+ { 0x1E41, 15635 },
+ { 0x1E43, 15642 },
+ { 0x0271, 15649 },
+ { 0x1E3F, 15655 },
+ { 0x1D6F, 15661 },
+ { 0x1D86, 15668 },
+ { 0x006E, 15675 },
+ { 0x1E45, 15679 },
+ { 0x1E47, 15686 },
+ { 0x0235, 15693 },
+ { 0x0272, 15699 },
+ { 0x1E49, 15706 },
+ { 0x019E, 15713 },
+ { 0x0144, 15721 },
+ { 0x0148, 15727 },
+ { 0x01F9, 15733 },
+ { 0x00F1, 15739 },
+ { 0x1D70, 15745 },
+ { 0x0146, 15752 },
+ { 0x1D87, 15758 },
+ { 0x0273, 15765 },
+ { 0x1E4B, 15772 },
+ { 0x0149, 15779 },
+ { 0x006F, 15786 },
+ { 0x022F, 15790 },
+ { 0x0231, 15797 },
+ { 0x1ECD, 15806 },
+ { 0x2C7A, 15813 },
+ { 0x1ECF, 15821 },
+ { 0x01A1, 15828 },
+ { 0x1EE3, 15834 },
+ { 0x1EDF, 15843 },
+ { 0x1EDB, 15852 },
+ { 0x1EDD, 15860 },
+ { 0x1EE1, 15868 },
+ { 0x574B, 15876 },
+ { 0x574D, 15884 },
+ { 0x00F3, 15890 },
+ { 0x014F, 15896 },
+ { 0x01D2, 15902 },
+ { 0x00F2, 15908 },
+ { 0x00F5, 15914 },
+ { 0x1E4D, 15920 },
+ { 0x022D, 15928 },
+ { 0x1E4F, 15936 },
+ { 0x0151, 15944 },
+ { 0x020D, 15951 },
+ { 0x014D, 15958 },
+ { 0x1E53, 15964 },
+ { 0x1E51, 15972 },
+ { 0x01EB, 15980 },
+ { 0x01ED, 15986 },
+ { 0x00F8, 15994 },
+ { 0x01FF, 16000 },
+ { 0x020F, 16008 },
+ { 0x00F6, 16015 },
+ { 0x022B, 16021 },
+ { 0x00F4, 16029 },
+ { 0x1ED9, 16035 },
+ { 0x1ED5, 16044 },
+ { 0x1ED1, 16053 },
+ { 0x1ED3, 16061 },
+ { 0x1ED7, 16069 },
+ { 0x0070, 16077 },
+ { 0x1E57, 16081 },
+ { 0x01A5, 16088 },
+ { 0x1E55, 16094 },
+ { 0x1D71, 16100 },
+ { 0x1D7D, 16107 },
+ { 0x5751, 16113 },
+ { 0x1D88, 16121 },
+ { 0x5753, 16128 },
+ { 0x5755, 16134 },
+ { 0x0071, 16141 },
+ { 0x02A0, 16145 },
+ { 0x024B, 16151 },
+ { 0x5757, 16158 },
+ { 0x5759, 16166 },
+ { 0x0072, 16173 },
+ { 0x1E59, 16177 },
+ { 0x1E5B, 16184 },
+ { 0x1E5D, 16191 },
+ { 0x1E5F, 16200 },
+ { 0x027C, 16207 },
+ { 0x027D, 16214 },
+ { 0x0155, 16220 },
+ { 0x0159, 16226 },
+ { 0x0211, 16232 },
+ { 0x1D72, 16239 },
+ { 0x024D, 16246 },
+ { 0x0157, 16252 },
+ { 0x1D89, 16258 },
+ { 0x027E, 16265 },
+ { 0x1D73, 16271 },
+ { 0x0213, 16280 },
+ { 0x575B, 16287 },
+ { 0x0073, 16292 },
+ { 0x1E61, 16296 },
+ { 0x1E63, 16303 },
+ { 0x1E69, 16310 },
+ { 0x0282, 16320 },
+ { 0x015B, 16326 },
+ { 0x1E65, 16332 },
+ { 0x0161, 16341 },
+ { 0x1E67, 16347 },
+ { 0x0219, 16356 },
+ { 0x023F, 16363 },
+ { 0x1D74, 16370 },
+ { 0x015F, 16377 },
+ { 0x1D8A, 16383 },
+ { 0x015D, 16390 },
+ { 0x0074, 16396 },
+ { 0x1E6B, 16400 },
+ { 0x1E6D, 16407 },
+ { 0x0236, 16414 },
+ { 0x01AD, 16420 },
+ { 0x1E6F, 16426 },
+ { 0x0165, 16433 },
+ { 0x021B, 16439 },
+ { 0x1D75, 16446 },
+ { 0x0167, 16453 },
+ { 0x0163, 16459 },
+ { 0x01AB, 16465 },
+ { 0x2C66, 16472 },
+ { 0x1E97, 16479 },
+ { 0x0288, 16485 },
+ { 0x1E71, 16492 },
+ { 0x0075, 16499 },
+ { 0x0289, 16503 },
+ { 0x1EE5, 16508 },
+ { 0x1EE7, 16515 },
+ { 0x01B0, 16522 },
+ { 0x1EF1, 16528 },
+ { 0x1EED, 16537 },
+ { 0x1EE9, 16546 },
+ { 0x1EEB, 16554 },
+ { 0x1EEF, 16562 },
+ { 0x016F, 16570 },
+ { 0x00FA, 16577 },
+ { 0x016D, 16583 },
+ { 0x01D4, 16589 },
+ { 0x00F9, 16595 },
+ { 0x0169, 16601 },
+ { 0x1E79, 16607 },
+ { 0x1E75, 16615 },
+ { 0x0171, 16622 },
+ { 0x0215, 16629 },
+ { 0x016B, 16636 },
+ { 0x1E7B, 16642 },
+ { 0x0173, 16650 },
+ { 0x0217, 16656 },
+ { 0x00FC, 16663 },
+ { 0x01D8, 16669 },
+ { 0x01DA, 16677 },
+ { 0x01DC, 16685 },
+ { 0x01D6, 16693 },
+ { 0x1E73, 16701 },
+ { 0x1D99, 16708 },
+ { 0x00FB, 16715 },
+ { 0x1E77, 16721 },
+ { 0x0076, 16728 },
+ { 0x1E7F, 16732 },
+ { 0x2C74, 16739 },
+ { 0x028B, 16745 },
+ { 0x2C71, 16751 },
+ { 0x1E7D, 16758 },
+ { 0x1D8C, 16764 },
+ { 0x575F, 16771 },
+ { 0x0077, 16778 },
+ { 0x1E87, 16782 },
+ { 0x1E89, 16789 },
+ { 0x2C73, 16796 },
+ { 0x1E98, 16802 },
+ { 0x1E83, 16809 },
+ { 0x1E81, 16815 },
+ { 0x1E85, 16821 },
+ { 0x0175, 16827 },
+ { 0x0078, 16833 },
+ { 0x1E8B, 16837 },
+ { 0x1D8D, 16844 },
+ { 0x1E8D, 16851 },
+ { 0x0079, 16857 },
+ { 0x1E8F, 16861 },
+ { 0x1EF5, 16868 },
+ { 0x01B4, 16875 },
+ { 0x1EF7, 16881 },
+ { 0x1EFF, 16888 },
+ { 0x1E99, 16894 },
+ { 0x00FD, 16901 },
+ { 0x1EF3, 16907 },
+ { 0x1EF9, 16913 },
+ { 0x0233, 16919 },
+ { 0x024F, 16925 },
+ { 0x00FF, 16931 },
+ { 0x0177, 16937 },
+ { 0x007A, 16943 },
+ { 0x017C, 16947 },
+ { 0x1E93, 16954 },
+ { 0x0291, 16961 },
+ { 0x0225, 16967 },
+ { 0x1E95, 16973 },
+ { 0x017A, 16980 },
+ { 0x017E, 16986 },
+ { 0x0240, 16992 },
+ { 0x1D76, 16999 },
+ { 0x01B6, 17006 },
+ { 0x1D8E, 17012 },
+ { 0x2C6C, 17019 },
+ { 0x0290, 17025 },
+ { 0x1E91, 17032 },
+ { 0x5733, 17038 },
+ { 0x00E6, 17042 },
+ { 0x01FD, 17046 },
+ { 0x01E3, 17052 },
+ { 0x5735, 17058 },
+ { 0x5737, 17062 },
+ { 0x5739, 17066 },
+ { 0x573B, 17070 },
+ { 0x573D, 17077 },
+ { 0x0238, 17081 },
+ { 0x01F3, 17086 },
+ { 0x01C6, 17090 },
+ { 0x02A3, 17096 },
+ { 0x02A5, 17101 },
+ { 0x576B, 17108 },
+ { 0x0195, 17112 },
+ { 0x576D, 17116 },
+ { 0x01C9, 17120 },
+ { 0x02AA, 17124 },
+ { 0x02AB, 17129 },
+ { 0x01CC, 17134 },
+ { 0x01A3, 17138 },
+ { 0x574F, 17142 },
+ { 0x0223, 17146 },
+ { 0x0239, 17150 },
+ { 0x02A8, 17155 },
+ { 0x1D7A, 17162 },
+ { 0x02A6, 17168 },
+ { 0x5729, 17173 },
+ { 0x1D6B, 17177 },
+ { 0x5778, 17181 },
+ { 0x5761, 17185 },
+ { 0x576F, 17189 },
+ { 0x5771, 17193 },
+ { 0x014B, 17197 },
+ { 0x0283, 17201 },
+ { 0x0286, 17205 },
+ { 0x1D8B, 17211 },
+ { 0x1D98, 17218 },
+ { 0x00F0, 17225 },
+ { 0x0292, 17229 },
+ { 0x0293, 17233 },
+ { 0x01BA, 17239 },
+ { 0x01EF, 17245 },
+ { 0x1D9A, 17251 },
+ { 0x01B9, 17258 },
+ { 0x0138, 17263 },
+ { 0x5772, 17267 },
+ { 0x5773, 17271 },
+ { 0x5774, 17275 },
+ { 0x0278, 17279 },
+ { 0x5775, 17283 },
+ { 0x575D, 17287 },
+ { 0x1D16, 17292 },
+ { 0x5777, 17298 },
+ { 0x02A4, 17302 },
+ { 0x02A9, 17307 },
+ { 0x2C76, 17312 },
+ { 0x5727, 17317 },
+ { 0x0267, 17321 },
+ { 0x0269, 17327 },
+ { 0x1D7C, 17331 },
+ { 0x026E, 17337 },
+ { 0x017F, 17341 },
+ { 0x1E9B, 17346 },
+ { 0x1E9D, 17354 },
+ { 0x1E9C, 17362 },
+ { 0x025B, 17370 },
+ { 0x1D93, 17375 },
+ { 0x0254, 17383 },
+ { 0x1D97, 17388 },
+ { 0x0264, 17396 },
+ { 0x02A7, 17401 },
+ { 0x0185, 17406 },
+ { 0x01A8, 17411 },
+ { 0x01BD, 17416 },
+ { 0x5769, 17421 },
+ { 0x021D, 17425 },
+ { 0x0251, 17429 },
+ { 0x1D90, 17433 },
+ { 0x1E9F, 17440 },
+ { 0x0263, 17444 },
+ { 0x0259, 17448 },
+ { 0x025A, 17452 },
+ { 0x1D95, 17458 },
+ { 0x00DF, 17465 },
+ { 0x0285, 17470 },
+ { 0x00FE, 17476 },
+ { 0x5765, 17480 },
+ { 0x5767, 17486 },
+ { 0x0275, 17494 },
+ { 0x1D17, 17499 },
+ { 0x5747, 17505 },
+ { 0x029A, 17510 },
+ { 0x0277, 17516 },
+ { 0x025E, 17521 },
+ { 0x019B, 17528 },
+ { 0x0261, 17534 },
+ { 0x0250, 17539 },
+ { 0x01DD, 17544 },
+ { 0x1D77, 17549 },
+ { 0x0265, 17554 },
+ { 0x02AE, 17559 },
+ { 0x02AF, 17566 },
+ { 0x1D09, 17575 },
+ { 0x029E, 17580 },
+ { 0x5781, 17585 },
+ { 0x026F, 17590 },
+ { 0x0270, 17595 },
+ { 0x0279, 17603 },
+ { 0x027B, 17608 },
+ { 0x027A, 17615 },
+ { 0x2C79, 17623 },
+ { 0x0287, 17630 },
+ { 0x028C, 17635 },
+ { 0x028D, 17640 },
+ { 0x028E, 17645 },
+ { 0x1D02, 17650 },
+ { 0x1D14, 17655 },
+ { 0x1D08, 17660 },
+ { 0x0252, 17666 },
+ { 0x018D, 17671 },
+ { 0x577F, 17676 },
+ { 0x0131, 17682 },
+ { 0x0237, 17687 },
+ { 0x025F, 17692 },
+ { 0x0284, 17699 },
+ { 0x0242, 17708 },
+ { 0x577A, 17713 },
+ { 0x577C, 17718 },
+ { 0x1D79, 17723 },
+ { 0x5783, 17728 },
+ { 0x5785, 17733 },
+ { 0x5787, 17738 },
+ { 0x028A, 17743 },
+ { 0x1D7F, 17747 },
+ { 0x2184, 17753 },
+ { 0x573F, 17758 },
+ { 0x0258, 17765 },
+ { 0x027F, 17770 },
+ { 0x025C, 17777 },
+ { 0x025D, 17783 },
+ { 0x1D94, 17791 },
+ { 0x578C, 17800 },
+ { 0x1D11, 17804 },
+ { 0x1D13, 17809 },
+ { 0x1D1D, 17816 },
+ { 0x1D12, 17821 },
+ { 0x1D1F, 17827 },
+ { 0x1D1E, 17833 },
+ { 0x2C77, 17839 },
+ { 0x572B, 17844 },
+ { 0x572D, 17848 },
+ { 0x572F, 17852 },
+ { 0x5763, 17858 },
+ { 0x1EFD, 17863 },
+ { 0x1EFB, 17868 },
+ { 0x5725, 17873 },
+ { 0x5723, 17878 },
+ { 0x1D7B, 17883 },
+ { 0x1D7E, 17890 },
+ { 0x6B00, 17897 },
+ { 0x6B01, 17901 },
+ { 0x6B02, 17905 },
+ { 0x0133, 17909 },
+ { 0x0153, 17913 },
+ { 0x6B06, 17917 },
+ { 0x6B03, 17921 },
+ { 0x6B04, 17925 },
+ { 0x6B05, 17929 },
+ { 0x01A6, 17935 },
+ { 0x1D25, 17938 },
+ { 0x01BB, 17941 },
+ { 0x01BF, 17946 },
+ { 0x1D00, 17949 },
+ { 0x0299, 17954 },
+ { 0x1D04, 17959 },
+ { 0x1D05, 17964 },
+ { 0x1D07, 17969 },
+ { 0x5730, 17974 },
+ { 0x0262, 17979 },
+ { 0x029B, 17984 },
+ { 0x029C, 17991 },
+ { 0x026A, 17996 },
+ { 0x1D0A, 18001 },
+ { 0x1D0B, 18006 },
+ { 0x029F, 18011 },
+ { 0x1D0C, 18016 },
+ { 0x1D0D, 18023 },
+ { 0x0274, 18028 },
+ { 0x1D0F, 18033 },
+ { 0x1D18, 18038 },
+ { 0x0280, 18043 },
+ { 0x5731, 18048 },
+ { 0x1D1B, 18053 },
+ { 0x1D1C, 18058 },
+ { 0x1D20, 18063 },
+ { 0x1D21, 18068 },
+ { 0x028F, 18073 },
+ { 0x1D22, 18078 },
+ { 0x1D01, 18083 },
+ { 0x0276, 18088 },
+ { 0x1D15, 18093 },
+ { 0x1D06, 18098 },
+ { 0x1D23, 18103 },
+ { 0x5776, 18108 },
+ { 0x1D10, 18113 },
+ { 0x1D03, 18119 },
+ { 0x2C7B, 18125 },
+ { 0x1D1A, 18131 },
+ { 0x0281, 18137 },
+ { 0x1D0E, 18143 },
+ { 0x1D19, 18149 },
+ { 0x01C0, 18155 },
+ { 0x1D24, 18159 },
+ { 0x0294, 18164 },
+ { 0x02A1, 18168 },
+ { 0x01C1, 18174 },
+ { 0x01C2, 18178 },
+ { 0x02AD, 18182 },
+ { 0x0298, 18186 },
+ { 0x02AC, 18190 },
+ { 0x0296, 18194 },
+ { 0x01BE, 18199 },
+ { 0x01AA, 18206 },
+ { 0x02A2, 18211 },
+ { 0x01C3, 18218 },
+ { 0x0297, 18222 },
+ { 0x0295, 18226 },
+ { 0x0041, 18231 },
+ { 0x0226, 18235 },
+ { 0x01E0, 18242 },
+ { 0x1EA0, 18251 },
+ { 0x1EA2, 18258 },
+ { 0x00C5, 18265 },
+ { 0x01FA, 18272 },
+ { 0x1E00, 18281 },
+ { 0x00C1, 18288 },
+ { 0x0102, 18294 },
+ { 0x1EB6, 18300 },
+ { 0x1EB2, 18309 },
+ { 0x1EAE, 18318 },
+ { 0x1EB0, 18326 },
+ { 0x1EB4, 18334 },
+ { 0x01CD, 18342 },
+ { 0x00C0, 18348 },
+ { 0x00C3, 18354 },
+ { 0x0200, 18360 },
+ { 0x0100, 18367 },
+ { 0x0104, 18373 },
+ { 0x023A, 18379 },
+ { 0x0202, 18385 },
+ { 0x00C4, 18392 },
+ { 0x01DE, 18398 },
+ { 0x00C2, 18406 },
+ { 0x1EAC, 18412 },
+ { 0x1EA8, 18421 },
+ { 0x1EA4, 18430 },
+ { 0x1EA6, 18438 },
+ { 0x1EAA, 18446 },
+ { 0x0042, 18454 },
+ { 0x1E02, 18458 },
+ { 0x1E04, 18465 },
+ { 0x0181, 18472 },
+ { 0x1E06, 18478 },
+ { 0x0243, 18485 },
+ { 0x0182, 18491 },
+ { 0x0043, 18497 },
+ { 0x010A, 18501 },
+ { 0x0187, 18508 },
+ { 0x0106, 18514 },
+ { 0x010C, 18520 },
+ { 0x023B, 18526 },
+ { 0x00C7, 18532 },
+ { 0x1E08, 18538 },
+ { 0x0108, 18546 },
+ { 0x0044, 18552 },
+ { 0x1E0A, 18556 },
+ { 0x1E0C, 18563 },
+ { 0x018A, 18570 },
+ { 0x1E0E, 18576 },
+ { 0x010E, 18583 },
+ { 0x01F2, 18589 },
+ { 0x01C5, 18597 },
+ { 0x0110, 18607 },
+ { 0x018B, 18613 },
+ { 0x1E10, 18619 },
+ { 0x1E12, 18625 },
+ { 0x0045, 18632 },
+ { 0x0116, 18636 },
+ { 0x1EB8, 18643 },
+ { 0x1EBA, 18650 },
+ { 0x00C9, 18657 },
+ { 0x0114, 18663 },
+ { 0x011A, 18669 },
+ { 0x00C8, 18675 },
+ { 0x1EBC, 18681 },
+ { 0x1E1A, 18687 },
+ { 0x0204, 18694 },
+ { 0x0112, 18701 },
+ { 0x1E16, 18707 },
+ { 0x1E14, 18715 },
+ { 0x0118, 18723 },
+ { 0x0246, 18729 },
+ { 0x0228, 18735 },
+ { 0x1E1C, 18741 },
+ { 0x0206, 18749 },
+ { 0x00CB, 18756 },
+ { 0x00CA, 18762 },
+ { 0x1EC6, 18768 },
+ { 0x1EC2, 18777 },
+ { 0x1EBE, 18786 },
+ { 0x1EC0, 18794 },
+ { 0x1EC4, 18802 },
+ { 0x1E18, 18810 },
+ { 0x0046, 18817 },
+ { 0x1E1E, 18821 },
+ { 0x0191, 18828 },
+ { 0x0047, 18834 },
+ { 0x0120, 18838 },
+ { 0x0193, 18845 },
+ { 0x01F4, 18851 },
+ { 0x011E, 18857 },
+ { 0x01E6, 18863 },
+ { 0x1E20, 18869 },
+ { 0x01E4, 18875 },
+ { 0x0122, 18881 },
+ { 0x011C, 18887 },
+ { 0x0048, 18893 },
+ { 0x1E22, 18897 },
+ { 0x1E24, 18904 },
+ { 0x1E2A, 18911 },
+ { 0x021E, 18918 },
+ { 0x0126, 18924 },
+ { 0x1E28, 18930 },
+ { 0x2C67, 18936 },
+ { 0x1E26, 18942 },
+ { 0x0124, 18948 },
+ { 0x0049, 18954 },
+ { 0x0130, 18958 },
+ { 0x1ECA, 18965 },
+ { 0x1EC8, 18972 },
+ { 0x00CD, 18979 },
+ { 0x012C, 18985 },
+ { 0x01CF, 18991 },
+ { 0x00CC, 18997 },
+ { 0x0128, 19003 },
+ { 0x1E2C, 19009 },
+ { 0x0208, 19016 },
+ { 0x012A, 19023 },
+ { 0x012E, 19029 },
+ { 0x0197, 19035 },
+ { 0x020A, 19041 },
+ { 0x00CF, 19048 },
+ { 0x1E2E, 19054 },
+ { 0x00CE, 19062 },
+ { 0x004A, 19068 },
+ { 0x0248, 19072 },
+ { 0x0134, 19078 },
+ { 0x004B, 19084 },
+ { 0x1E32, 19088 },
+ { 0x0198, 19095 },
+ { 0x1E34, 19101 },
+ { 0x1E30, 19108 },
+ { 0x01E8, 19114 },
+ { 0x5740, 19120 },
+ { 0x5744, 19126 },
+ { 0x0136, 19135 },
+ { 0x5742, 19141 },
+ { 0x2C69, 19148 },
+ { 0x004C, 19154 },
+ { 0x023D, 19158 },
+ { 0x1E36, 19164 },
+ { 0x1E38, 19171 },
+ { 0x5748, 19180 },
+ { 0x1E3A, 19187 },
+ { 0x0139, 19194 },
+ { 0x013D, 19200 },
+ { 0x01C8, 19206 },
+ { 0x2C60, 19214 },
+ { 0x013F, 19221 },
+ { 0x2C62, 19228 },
+ { 0x0141, 19235 },
+ { 0x013B, 19241 },
+ { 0x1E3C, 19247 },
+ { 0x004D, 19254 },
+ { 0x1E40, 19258 },
+ { 0x1E42, 19265 },
+ { 0x2C6E, 19272 },
+ { 0x1E3E, 19278 },
+ { 0x004E, 19284 },
+ { 0x1E44, 19288 },
+ { 0x1E46, 19295 },
+ { 0x019D, 19302 },
+ { 0x1E48, 19309 },
+ { 0x0220, 19316 },
+ { 0x0143, 19324 },
+ { 0x0147, 19330 },
+ { 0x01F8, 19336 },
+ { 0x01CB, 19342 },
+ { 0x00D1, 19350 },
+ { 0x0145, 19356 },
+ { 0x1E4A, 19362 },
+ { 0x004F, 19369 },
+ { 0x022E, 19373 },
+ { 0x0230, 19380 },
+ { 0x1ECC, 19389 },
+ { 0x1ECE, 19396 },
+ { 0x01A0, 19403 },
+ { 0x1EE2, 19409 },
+ { 0x1EDE, 19418 },
+ { 0x1EDA, 19427 },
+ { 0x1EDC, 19435 },
+ { 0x1EE0, 19443 },
+ { 0x574A, 19451 },
+ { 0x574C, 19459 },
+ { 0x00D3, 19465 },
+ { 0x014E, 19471 },
+ { 0x01D1, 19477 },
+ { 0x00D2, 19483 },
+ { 0x00D5, 19489 },
+ { 0x1E4C, 19495 },
+ { 0x022C, 19503 },
+ { 0x1E4E, 19511 },
+ { 0x0150, 19519 },
+ { 0x020C, 19526 },
+ { 0x014C, 19533 },
+ { 0x1E52, 19539 },
+ { 0x1E50, 19547 },
+ { 0x019F, 19555 },
+ { 0x01EA, 19562 },
+ { 0x01EC, 19568 },
+ { 0x00D8, 19576 },
+ { 0x01FE, 19582 },
+ { 0x020E, 19590 },
+ { 0x00D6, 19597 },
+ { 0x022A, 19603 },
+ { 0x00D4, 19611 },
+ { 0x1ED8, 19617 },
+ { 0x1ED4, 19626 },
+ { 0x1ED0, 19635 },
+ { 0x1ED2, 19643 },
+ { 0x1ED6, 19651 },
+ { 0x0050, 19659 },
+ { 0x1E56, 19663 },
+ { 0x01A4, 19670 },
+ { 0x1E54, 19676 },
+ { 0x2C63, 19682 },
+ { 0x5750, 19688 },
+ { 0x5752, 19696 },
+ { 0x5754, 19702 },
+ { 0x0051, 19709 },
+ { 0x5756, 19713 },
+ { 0x5758, 19721 },
+ { 0x0052, 19728 },
+ { 0x1E58, 19732 },
+ { 0x1E5A, 19739 },
+ { 0x1E5C, 19746 },
+ { 0x1E5E, 19755 },
+ { 0x2C64, 19762 },
+ { 0x0154, 19768 },
+ { 0x0158, 19774 },
+ { 0x0210, 19780 },
+ { 0x024C, 19787 },
+ { 0x0156, 19793 },
+ { 0x0212, 19799 },
+ { 0x575A, 19806 },
+ { 0x0053, 19811 },
+ { 0x1E60, 19815 },
+ { 0x1E62, 19822 },
+ { 0x1E68, 19829 },
+ { 0x015A, 19839 },
+ { 0x1E64, 19845 },
+ { 0x0160, 19854 },
+ { 0x1E66, 19860 },
+ { 0x0218, 19869 },
+ { 0x015E, 19876 },
+ { 0x015C, 19882 },
+ { 0x0054, 19888 },
+ { 0x1E6A, 19892 },
+ { 0x1E6C, 19899 },
+ { 0x01AC, 19906 },
+ { 0x1E6E, 19912 },
+ { 0x0164, 19919 },
+ { 0x021A, 19925 },
+ { 0x0166, 19932 },
+ { 0x0162, 19938 },
+ { 0x023E, 19944 },
+ { 0x01AE, 19951 },
+ { 0x1E70, 19958 },
+ { 0x0055, 19965 },
+ { 0x0244, 19969 },
+ { 0x1EE4, 19974 },
+ { 0x1EE6, 19981 },
+ { 0x01AF, 19988 },
+ { 0x1EF0, 19994 },
+ { 0x1EEC, 20003 },
+ { 0x1EE8, 20012 },
+ { 0x1EEA, 20020 },
+ { 0x1EEE, 20028 },
+ { 0x016E, 20036 },
+ { 0x00DA, 20043 },
+ { 0x016C, 20049 },
+ { 0x01D3, 20055 },
+ { 0x00D9, 20061 },
+ { 0x0168, 20067 },
+ { 0x1E78, 20073 },
+ { 0x1E74, 20081 },
+ { 0x0170, 20088 },
+ { 0x0214, 20095 },
+ { 0x016A, 20102 },
+ { 0x1E7A, 20108 },
+ { 0x0172, 20116 },
+ { 0x0216, 20122 },
+ { 0x00DC, 20129 },
+ { 0x01D7, 20135 },
+ { 0x01D9, 20143 },
+ { 0x01DB, 20151 },
+ { 0x01D5, 20159 },
+ { 0x1E72, 20167 },
+ { 0x00DB, 20174 },
+ { 0x1E76, 20180 },
+ { 0x0056, 20187 },
+ { 0x1E7E, 20191 },
+ { 0x01B2, 20198 },
+ { 0x1E7C, 20204 },
+ { 0x575E, 20210 },
+ { 0x0057, 20217 },
+ { 0x1E86, 20221 },
+ { 0x1E88, 20228 },
+ { 0x2C72, 20235 },
+ { 0x1E82, 20241 },
+ { 0x1E80, 20247 },
+ { 0x1E84, 20253 },
+ { 0x0174, 20259 },
+ { 0x0058, 20265 },
+ { 0x1E8A, 20269 },
+ { 0x1E8C, 20276 },
+ { 0x0059, 20282 },
+ { 0x1E8E, 20286 },
+ { 0x1EF4, 20293 },
+ { 0x01B3, 20300 },
+ { 0x1EF6, 20306 },
+ { 0x1EFE, 20313 },
+ { 0x00DD, 20319 },
+ { 0x1EF2, 20325 },
+ { 0x1EF8, 20331 },
+ { 0x0232, 20337 },
+ { 0x024E, 20343 },
+ { 0x0178, 20349 },
+ { 0x0176, 20355 },
+ { 0x005A, 20361 },
+ { 0x017B, 20365 },
+ { 0x1E92, 20372 },
+ { 0x0224, 20379 },
+ { 0x1E94, 20385 },
+ { 0x0179, 20392 },
+ { 0x017D, 20398 },
+ { 0x01B5, 20404 },
+ { 0x2C6B, 20410 },
+ { 0x1E90, 20416 },
+ { 0x5732, 20422 },
+ { 0x00C6, 20426 },
+ { 0x01FC, 20430 },
+ { 0x01E2, 20436 },
+ { 0x5734, 20442 },
+ { 0x5736, 20446 },
+ { 0x5738, 20450 },
+ { 0x573A, 20454 },
+ { 0x573C, 20461 },
+ { 0x01F1, 20465 },
+ { 0x01C4, 20469 },
+ { 0x576A, 20475 },
+ { 0x576C, 20479 },
+ { 0x01C7, 20483 },
+ { 0x01CA, 20487 },
+ { 0x01A2, 20491 },
+ { 0x574E, 20495 },
+ { 0x0222, 20499 },
+ { 0x5728, 20503 },
+ { 0x5760, 20507 },
+ { 0x576E, 20511 },
+ { 0x014A, 20515 },
+ { 0x01A9, 20519 },
+ { 0x00D0, 20523 },
+ { 0x01B7, 20527 },
+ { 0x01EE, 20531 },
+ { 0x01B8, 20537 },
+ { 0x575C, 20542 },
+ { 0x2C75, 20547 },
+ { 0x5726, 20552 },
+ { 0x0196, 20556 },
+ { 0x0190, 20560 },
+ { 0x0186, 20565 },
+ { 0x0184, 20570 },
+ { 0x01A7, 20575 },
+ { 0x01BC, 20580 },
+ { 0x5768, 20585 },
+ { 0x01F7, 20589 },
+ { 0x021C, 20593 },
+ { 0x2C6D, 20597 },
+ { 0x0194, 20601 },
+ { 0x01F6, 20605 },
+ { 0x018F, 20609 },
+ { 0x1E9E, 20613 },
+ { 0x024A, 20618 },
+ { 0x00DE, 20626 },
+ { 0x5764, 20630 },
+ { 0x5766, 20636 },
+ { 0x5746, 20644 },
+ { 0x2C6F, 20649 },
+ { 0x5780, 20654 },
+ { 0x019C, 20659 },
+ { 0x0245, 20664 },
+ { 0x577E, 20669 },
+ { 0x0189, 20675 },
+ { 0x0241, 20680 },
+ { 0x5779, 20685 },
+ { 0x577B, 20690 },
+ { 0x577D, 20695 },
+ { 0x5782, 20700 },
+ { 0x5784, 20705 },
+ { 0x5786, 20710 },
+ { 0x01B1, 20715 },
+ { 0x573E, 20719 },
+ { 0x018E, 20726 },
+ { 0x578B, 20731 },
+ { 0x572A, 20735 },
+ { 0x572C, 20739 },
+ { 0x572E, 20743 },
+ { 0x5762, 20749 },
+ { 0x1EFC, 20754 },
+ { 0x1EFA, 20759 },
+ { 0x5724, 20764 },
+ { 0x5722, 20769 },
+ { 0x0132, 20774 },
+ { 0x0152, 20778 },
+ { 0x2090, 20782 },
+ { 0x2091, 20787 },
+ { 0x1D62, 20792 },
+ { 0x2C7C, 20797 },
+ { 0x2092, 20802 },
+ { 0x1D63, 20807 },
+ { 0x1D64, 20812 },
+ { 0x1D65, 20817 },
+ { 0x2093, 20822 },
+ { 0x2094, 20827 },
+ { 0x57FE, 20832 },
+ { 0x57FF, 20837 },
+ { 0x57FD, 20842 },
+ { 0x57FB, 20847 },
+ { 0x57FC, 20852 },
+ { 0x264E, 20857 },
+ { 0x2772, 20858 },
+ { 0x2773, 20864 },
+ { 0x2591, 20870 },
+ { 0x2758, 20872 },
+ { 0x1940, 20875 },
+ { 0x193B, 20878 },
+ { 0x193A, 20881 },
+ { 0x1939, 20884 },
+ { 0x1947, 20887 },
+ { 0x194C, 20890 },
+ { 0x1948, 20893 },
+ { 0x194B, 20896 },
+ { 0x194A, 20899 },
+ { 0x194F, 20902 },
+ { 0x1946, 20905 },
+ { 0x194E, 20908 },
+ { 0x194D, 20911 },
+ { 0x1949, 20914 },
+ { 0x1930, 20917 },
+ { 0x1938, 20921 },
+ { 0x1936, 20925 },
+ { 0x1934, 20929 },
+ { 0x1935, 20933 },
+ { 0x1937, 20937 },
+ { 0x1933, 20941 },
+ { 0x1931, 20945 },
+ { 0x1932, 20949 },
+ { 0x1920, 20953 },
+ { 0x1927, 20957 },
+ { 0x1921, 20961 },
+ { 0x1928, 20965 },
+ { 0x1922, 20969 },
+ { 0x1924, 20973 },
+ { 0x1926, 20977 },
+ { 0x1923, 20981 },
+ { 0x1925, 20985 },
+ { 0x1912, 20989 },
+ { 0x1906, 20992 },
+ { 0x190D, 20995 },
+ { 0x1903, 20998 },
+ { 0x191C, 21001 },
+ { 0x1908, 21004 },
+ { 0x1901, 21007 },
+ { 0x1917, 21010 },
+ { 0x1914, 21013 },
+ { 0x190F, 21016 },
+ { 0x1910, 21019 },
+ { 0x1916, 21022 },
+ { 0x191B, 21025 },
+ { 0x190B, 21028 },
+ { 0x1918, 21031 },
+ { 0x1915, 21034 },
+ { 0x1913, 21037 },
+ { 0x1907, 21040 },
+ { 0x190E, 21043 },
+ { 0x1904, 21046 },
+ { 0x1909, 21049 },
+ { 0x1902, 21052 },
+ { 0x1905, 21055 },
+ { 0x1911, 21058 },
+ { 0x1919, 21061 },
+ { 0x191A, 21064 },
+ { 0x190C, 21067 },
+ { 0x190A, 21070 },
+ { 0x1945, 21073 },
+ { 0x192A, 21076 },
+ { 0x192B, 21080 },
+ { 0x1929, 21084 },
+ { 0x1944, 21088 },
+ { 0x1900, 21091 },
+ { 0x2581, 21094 },
+ { 0x2582, 21098 },
+ { 0x2585, 21102 },
+ { 0x2584, 21106 },
+ { 0x25E1, 21109 },
+ { 0x25DB, 21112 },
+ { 0x25DF, 21117 },
+ { 0x25FA, 21122 },
+ { 0x293F, 21125 },
+ { 0x2703, 21130 },
+ { 0x27D3, 21133 },
+ { 0x270E, 21138 },
+ { 0x25DE, 21141 },
+ { 0x2751, 21146 },
+ { 0x25FF, 21151 },
+ { 0x293E, 21154 },
+ { 0x274F, 21159 },
+ { 0x2587, 21164 },
+ { 0x2583, 21168 },
+ { 0x2586, 21172 },
+ { 0x00B5, 21176 },
+ { 0x2212, 21178 },
+ { 0x2A3A, 21180 },
+ { 0x2A2A, 21184 },
+ { 0x2A29, 21189 },
+ { 0x2A2C, 21194 },
+ { 0x2A2B, 21199 },
+ { 0x2242, 21204 },
+ { 0x266D, 21206 },
+ { 0x266F, 21209 },
+ { 0x266E, 21212 },
+ { 0x2A09, 21215 },
+ { 0x22C3, 21218 },
+ { 0x2A03, 21220 },
+ { 0x2A04, 21225 },
+ { 0x2AFF, 21230 },
+ { 0x2A06, 21234 },
+ { 0x2A05, 21238 },
+ { 0x2A00, 21242 },
+ { 0x2A01, 21246 },
+ { 0x2A02, 21250 },
+ { 0x22C1, 21254 },
+ { 0x22C0, 21257 },
+ { 0x220F, 21260 },
+ { 0x2210, 21262 },
+ { 0x2211, 21264 },
+ { 0x22C2, 21266 },
+ { 0x2207, 21268 },
+ { 0x20A6, 21269 },
+ { 0x2922, 21271 },
+ { 0x2197, 21277 },
+ { 0x2928, 21280 },
+ { 0x2924, 21287 },
+ { 0x2931, 21292 },
+ { 0x292E, 21299 },
+ { 0x2B08, 21306 },
+ { 0x2B00, 21310 },
+ { 0x21D7, 21314 },
+ { 0x2921, 21318 },
+ { 0x2196, 21324 },
+ { 0x21B8, 21327 },
+ { 0x21F1, 21333 },
+ { 0x2927, 21338 },
+ { 0x2923, 21345 },
+ { 0x2932, 21350 },
+ { 0x2B09, 21357 },
+ { 0x2B01, 21361 },
+ { 0x21D6, 21365 },
+ { 0x1680, 21369 },
+ { 0x1696, 21372 },
+ { 0x1692, 21375 },
+ { 0x1691, 21378 },
+ { 0x1690, 21381 },
+ { 0x1689, 21384 },
+ { 0x1687, 21387 },
+ { 0x168C, 21390 },
+ { 0x1698, 21393 },
+ { 0x1682, 21396 },
+ { 0x168B, 21399 },
+ { 0x1685, 21402 },
+ { 0x168F, 21405 },
+ { 0x1684, 21408 },
+ { 0x1686, 21411 },
+ { 0x1681, 21414 },
+ { 0x168A, 21417 },
+ { 0x1683, 21420 },
+ { 0x169A, 21423 },
+ { 0x1688, 21426 },
+ { 0x168E, 21429 },
+ { 0x1695, 21432 },
+ { 0x1693, 21435 },
+ { 0x1694, 21438 },
+ { 0x168D, 21441 },
+ { 0x1697, 21444 },
+ { 0x1699, 21447 },
+ { 0x169B, 21450 },
+ { 0x169C, 21453 },
+ { 0x0B56, 21457 },
+ { 0x0B57, 21461 },
+ { 0x0B3C, 21465 },
+ { 0x0B4D, 21468 },
+ { 0x0B03, 21471 },
+ { 0x0B02, 21474 },
+ { 0x0B3D, 21477 },
+ { 0x0B01, 21480 },
+ { 0x0B67, 21483 },
+ { 0x0B6C, 21486 },
+ { 0x0B68, 21489 },
+ { 0x0B6B, 21492 },
+ { 0x0B6A, 21495 },
+ { 0x0B6F, 21498 },
+ { 0x0B66, 21501 },
+ { 0x0B6E, 21504 },
+ { 0x0B6D, 21507 },
+ { 0x0B69, 21510 },
+ { 0x0B47, 21513 },
+ { 0x0B3F, 21517 },
+ { 0x0B4B, 21521 },
+ { 0x0B41, 21525 },
+ { 0x0B3E, 21529 },
+ { 0x0B48, 21533 },
+ { 0x0B4C, 21537 },
+ { 0x0B40, 21541 },
+ { 0x0B42, 21545 },
+ { 0x0B62, 21549 },
+ { 0x0B43, 21554 },
+ { 0x0B63, 21559 },
+ { 0x0B44, 21564 },
+ { 0x0B70, 21569 },
+ { 0x0B05, 21571 },
+ { 0x0B0F, 21574 },
+ { 0x0B07, 21577 },
+ { 0x0B13, 21580 },
+ { 0x0B09, 21583 },
+ { 0x0B06, 21586 },
+ { 0x0B10, 21589 },
+ { 0x0B14, 21592 },
+ { 0x0B2C, 21595 },
+ { 0x0B1A, 21598 },
+ { 0x0B26, 21601 },
+ { 0x0B17, 21604 },
+ { 0x0B39, 21607 },
+ { 0x0B08, 21610 },
+ { 0x0B1C, 21613 },
+ { 0x0B15, 21616 },
+ { 0x0B32, 21619 },
+ { 0x0B2E, 21622 },
+ { 0x0B28, 21625 },
+ { 0x0B2A, 21628 },
+ { 0x0B30, 21631 },
+ { 0x0B38, 21634 },
+ { 0x0B24, 21637 },
+ { 0x0B0A, 21640 },
+ { 0x0B35, 21643 },
+ { 0x0B71, 21646 },
+ { 0x0B2F, 21649 },
+ { 0x0B2D, 21652 },
+ { 0x0B1B, 21655 },
+ { 0x0B21, 21658 },
+ { 0x0B27, 21661 },
+ { 0x0B18, 21664 },
+ { 0x0B1D, 21667 },
+ { 0x0B16, 21670 },
+ { 0x0B33, 21673 },
+ { 0x0B19, 21676 },
+ { 0x0B23, 21679 },
+ { 0x0B1E, 21682 },
+ { 0x0B2B, 21685 },
+ { 0x0B5D, 21688 },
+ { 0x0B5C, 21691 },
+ { 0x0B36, 21694 },
+ { 0x0B37, 21697 },
+ { 0x0B25, 21700 },
+ { 0x0B1F, 21703 },
+ { 0x0B5F, 21706 },
+ { 0x0B22, 21709 },
+ { 0x0B20, 21712 },
+ { 0x0B0C, 21715 },
+ { 0x0B0B, 21719 },
+ { 0x0B61, 21723 },
+ { 0x0B60, 21727 },
+ { 0x2125, 21731 },
+ { 0x262E, 21733 },
+ { 0x2318, 21735 },
+ { 0x2647, 21739 },
+ { 0x00A3, 21740 },
+ { 0x2032, 21742 },
+ { 0x2399, 21743 },
+ { 0x2236, 21746 },
+ { 0x2994, 21747 },
+ { 0x2E1D, 21751 },
+ { 0x2595, 21755 },
+ { 0x297D, 21759 },
+ { 0x25D7, 21762 },
+ { 0x2590, 21766 },
+ { 0x22A2, 21769 },
+ { 0x221F, 21771 },
+ { 0x22BE, 21773 },
+ { 0x237C, 21777 },
+ { 0x2E01, 21783 },
+ { 0x3009, 21788 },
+ { 0x2992, 21791 },
+ { 0x299C, 21796 },
+ { 0x2E00, 21801 },
+ { 0x21F4, 21805 },
+ { 0x27F4, 21810 },
+ { 0x2998, 21815 },
+ { 0x3011, 21820 },
+ { 0x007D, 21824 },
+ { 0x23AD, 21827 },
+ { 0x23AB, 21832 },
+ { 0x23AC, 21837 },
+ { 0x230B, 21842 },
+ { 0x27D6, 21844 },
+ { 0x2984, 21847 },
+ { 0x300F, 21851 },
+ { 0x301B, 21855 },
+ { 0x3019, 21859 },
+ { 0x3017, 21864 },
+ { 0x2986, 21868 },
+ { 0x300D, 21871 },
+ { 0x2E05, 21874 },
+ { 0x300B, 21878 },
+ { 0x2970, 21882 },
+ { 0x29DB, 21888 },
+ { 0x201D, 21892 },
+ { 0x2E29, 21896 },
+ { 0x22CA, 21899 },
+ { 0x2E0D, 21904 },
+ { 0x2019, 21908 },
+ { 0x005D, 21912 },
+ { 0x2990, 21915 },
+ { 0x298E, 21923 },
+ { 0x2046, 21931 },
+ { 0x298C, 21936 },
+ { 0x23A6, 21941 },
+ { 0x23A4, 21946 },
+ { 0x23A5, 21951 },
+ { 0x29D9, 21955 },
+ { 0x2309, 21958 },
+ { 0x27C6, 21960 },
+ { 0x2E27, 21964 },
+ { 0x3015, 21968 },
+ { 0x22BF, 21972 },
+ { 0x29CE, 21974 },
+ { 0x2E21, 21979 },
+ { 0x23B9, 21984 },
+ { 0x22CC, 21988 },
+ { 0x0029, 21991 },
+ { 0x23A0, 21993 },
+ { 0x239E, 21997 },
+ { 0x239F, 22001 },
+ { 0x2E03, 22004 },
+ { 0x2E0A, 22007 },
+ { 0x719A, 22010 },
+ { 0x7191, 22013 },
+ { 0x7194, 22016 },
+ { 0x2160, 22020 },
+ { 0x216D, 22023 },
+ { 0x2188, 22027 },
+ { 0x216F, 22032 },
+ { 0x2180, 22036 },
+ { 0x2165, 22042 },
+ { 0x2185, 22045 },
+ { 0x2169, 22050 },
+ { 0x2182, 22053 },
+ { 0x2161, 22057 },
+ { 0x2164, 22060 },
+ { 0x216E, 22063 },
+ { 0x2181, 22067 },
+ { 0x2163, 22071 },
+ { 0x2168, 22074 },
+ { 0x2167, 22077 },
+ { 0x216C, 22080 },
+ { 0x2186, 22083 },
+ { 0x2187, 22088 },
+ { 0x2166, 22092 },
+ { 0x2162, 22095 },
+ { 0x216A, 22098 },
+ { 0x216B, 22101 },
+ { 0x2183, 22104 },
+ { 0x7190, 22109 },
+ { 0x7193, 22112 },
+ { 0x7195, 22115 },
+ { 0x7196, 22118 },
+ { 0x7192, 22121 },
+ { 0x719B, 22124 },
+ { 0x7199, 22127 },
+ { 0x7197, 22130 },
+ { 0x7198, 22133 },
+ { 0x16ED, 22136 },
+ { 0x16EE, 22139 },
+ { 0x16CD, 22142 },
+ { 0x16D1, 22145 },
+ { 0x16C2, 22148 },
+ { 0x16B5, 22151 },
+ { 0x16AE, 22154 },
+ { 0x16E9, 22157 },
+ { 0x16A1, 22160 },
+ { 0x16A5, 22163 },
+ { 0x16EA, 22166 },
+ { 0x16A4, 22169 },
+ { 0x16CE, 22172 },
+ { 0x16AA, 22175 },
+ { 0x16AF, 22179 },
+ { 0x16B0, 22182 },
+ { 0x16A9, 22185 },
+ { 0x16A3, 22189 },
+ { 0x16B3, 22192 },
+ { 0x16E0, 22195 },
+ { 0x16B6, 22198 },
+ { 0x16A7, 22201 },
+ { 0x16B8, 22204 },
+ { 0x16C4, 22207 },
+ { 0x16DD, 22210 },
+ { 0x16E1, 22213 },
+ { 0x16AB, 22216 },
+ { 0x16E3, 22219 },
+ { 0x16A0, 22222 },
+ { 0x16B7, 22228 },
+ { 0x16C1, 22233 },
+ { 0x16C7, 22239 },
+ { 0x16B4, 22243 },
+ { 0x16E5, 22247 },
+ { 0x16A2, 22250 },
+ { 0x16C9, 22255 },
+ { 0x16A8, 22259 },
+ { 0x16E4, 22263 },
+ { 0x16DE, 22266 },
+ { 0x16D6, 22271 },
+ { 0x16BB, 22276 },
+ { 0x16C3, 22280 },
+ { 0x16B2, 22284 },
+ { 0x16B1, 22287 },
+ { 0x16CB, 22293 },
+ { 0x16CF, 22298 },
+ { 0x16B9, 22304 },
+ { 0x16BA, 22309 },
+ { 0x16DC, 22313 },
+ { 0x16DA, 22316 },
+ { 0x16D7, 22322 },
+ { 0x16BE, 22327 },
+ { 0x16D5, 22333 },
+ { 0x16C8, 22336 },
+ { 0x16CA, 22341 },
+ { 0x16E2, 22345 },
+ { 0x16DF, 22348 },
+ { 0x16D2, 22353 },
+ { 0x16DB, 22359 },
+ { 0x16C0, 22362 },
+ { 0x16D4, 22365 },
+ { 0x16A6, 22368 },
+ { 0x16E8, 22373 },
+ { 0x16C6, 22376 },
+ { 0x16E7, 22380 },
+ { 0x16C5, 22383 },
+ { 0x16E6, 22387 },
+ { 0x16AD, 22390 },
+ { 0x16CC, 22394 },
+ { 0x16D0, 22398 },
+ { 0x16AC, 22402 },
+ { 0x16D9, 22406 },
+ { 0x16BF, 22410 },
+ { 0x16D8, 22414 },
+ { 0x16BD, 22418 },
+ { 0x16BC, 22422 },
+ { 0x16D3, 22426 },
+ { 0x16EB, 22430 },
+ { 0x16F0, 22433 },
+ { 0x16EC, 22436 },
+ { 0x16EF, 22439 },
+ { 0x20A8, 22442 },
+ { 0x2AE0, 22444 },
+ { 0x2AE8, 22447 },
+ { 0x2AE9, 22452 },
+ { 0x2ADF, 22459 },
+ { 0x2AE7, 22462 },
+ { 0x2ADE, 22467 },
+ { 0x2944, 22470 },
+ { 0x2620, 22476 },
+ { 0x2333, 22479 },
+ { 0x6E58, 22480 },
+ { 0x2A61, 22483 },
+ { 0x6E52, 22487 },
+ { 0x6E5B, 22490 },
+ { 0x6E5D, 22494 },
+ { 0x6E59, 22499 },
+ { 0x6E62, 22502 },
+ { 0x6E55, 22505 },
+ { 0x6E50, 22507 },
+ { 0x6E5C, 22509 },
+ { 0x6E5E, 22513 },
+ { 0x6E5A, 22518 },
+ { 0x2170, 22521 },
+ { 0x217D, 22525 },
+ { 0x217F, 22530 },
+ { 0x2175, 22535 },
+ { 0x2179, 22539 },
+ { 0x2171, 22543 },
+ { 0x2174, 22547 },
+ { 0x217E, 22551 },
+ { 0x2173, 22556 },
+ { 0x2178, 22560 },
+ { 0x2177, 22564 },
+ { 0x217C, 22568 },
+ { 0x2176, 22572 },
+ { 0x2172, 22576 },
+ { 0x217A, 22580 },
+ { 0x217B, 22584 },
+ { 0x02DC, 22588 },
+ { 0x6E69, 22590 },
+ { 0x6E66, 22593 },
+ { 0x6E5F, 22596 },
+ { 0x220A, 22599 },
+ { 0x22F7, 22602 },
+ { 0x22F4, 22607 },
+ { 0x6E6A, 22618 },
+ { 0x6E68, 22621 },
+ { 0x6E61, 22624 },
+ { 0x220D, 22626 },
+ { 0x22FE, 22630 },
+ { 0x22FC, 22634 },
+ { 0x6E56, 22644 },
+ { 0x6E60, 22647 },
+ { 0x6E64, 22649 },
+ { 0x6E54, 22652 },
+ { 0x6E6B, 22654 },
+ { 0x6E57, 22657 },
+ { 0x6E51, 22660 },
+ { 0x6E65, 22663 },
+ { 0x6E63, 22666 },
+ { 0x2A33, 22668 },
+ { 0x2323, 22670 },
+ { 0x2117, 22671 },
+ { 0x2198, 22674 },
+ { 0x21F2, 22677 },
+ { 0x2929, 22682 },
+ { 0x2925, 22689 },
+ { 0x292D, 22694 },
+ { 0x2B0A, 22701 },
+ { 0x2B02, 22705 },
+ { 0x21D8, 22709 },
+ { 0x2199, 22713 },
+ { 0x292A, 22716 },
+ { 0x2926, 22723 },
+ { 0x2B0B, 22728 },
+ { 0x2B03, 22732 },
+ { 0x21D9, 22736 },
+ { 0x0020, 22740 },
+ { 0x27A7, 22741 },
+ { 0x269A, 22745 },
+ { 0x2695, 22748 },
+ { 0x2053, 22751 },
+ { 0x0BF8, 22753 },
+ { 0x0BD7, 22757 },
+ { 0x0BD0, 22761 },
+ { 0x0BF3, 22763 },
+ { 0x0BCD, 22766 },
+ { 0x0B83, 22769 },
+ { 0x0B82, 22772 },
+ { 0x0BF5, 22775 },
+ { 0x0BF6, 22778 },
+ { 0x0BE7, 22781 },
+ { 0x0BEC, 22784 },
+ { 0x0BE8, 22787 },
+ { 0x0BEB, 22790 },
+ { 0x0BEA, 22793 },
+ { 0x0BEF, 22796 },
+ { 0x0BE6, 22799 },
+ { 0x0BEE, 22802 },
+ { 0x0BED, 22805 },
+ { 0x0BE9, 22808 },
+ { 0x0BF4, 22811 },
+ { 0x0BF9, 22814 },
+ { 0x0BC6, 22817 },
+ { 0x0BBF, 22821 },
+ { 0x0BCA, 22825 },
+ { 0x0BC1, 22829 },
+ { 0x0BBE, 22833 },
+ { 0x0BC8, 22837 },
+ { 0x0BCC, 22841 },
+ { 0x0BC7, 22845 },
+ { 0x0BC0, 22849 },
+ { 0x0BCB, 22853 },
+ { 0x0BC2, 22857 },
+ { 0x0BF7, 22861 },
+ { 0x0B85, 22864 },
+ { 0x0B8E, 22867 },
+ { 0x0B87, 22870 },
+ { 0x0B92, 22873 },
+ { 0x0B89, 22876 },
+ { 0x0B86, 22879 },
+ { 0x0B90, 22882 },
+ { 0x0B94, 22885 },
+ { 0x0B9A, 22888 },
+ { 0x0B8F, 22891 },
+ { 0x0BB9, 22894 },
+ { 0x0B88, 22897 },
+ { 0x0B9C, 22900 },
+ { 0x0B95, 22903 },
+ { 0x0BB2, 22906 },
+ { 0x0BAE, 22909 },
+ { 0x0BA8, 22912 },
+ { 0x0B93, 22915 },
+ { 0x0BAA, 22918 },
+ { 0x0BB0, 22921 },
+ { 0x0BB8, 22924 },
+ { 0x0BA4, 22927 },
+ { 0x0B8A, 22930 },
+ { 0x0BB5, 22933 },
+ { 0x0BAF, 22936 },
+ { 0x0BB3, 22939 },
+ { 0x0B99, 22942 },
+ { 0x0BA3, 22945 },
+ { 0x0B9E, 22948 },
+ { 0x0BB1, 22951 },
+ { 0x0BB6, 22954 },
+ { 0x0BB7, 22957 },
+ { 0x0B9F, 22960 },
+ { 0x0BB4, 22963 },
+ { 0x0BA9, 22966 },
+ { 0x0BF1, 22969 },
+ { 0x0BF2, 22973 },
+ { 0x0BF0, 22977 },
+ { 0x0BFA, 22980 },
+ { 0x2204, 22983 },
+ { 0x2203, 22987 },
+ { 0x2056, 22989 },
+ { 0x2B31, 22992 },
+ { 0x21F6, 22995 },
+ { 0x2A76, 22998 },
+ { 0x27C0, 23002 },
+ { 0x2745, 23005 },
+ { 0x007E, 23008 },
+ { 0x2E1E, 23009 },
+ { 0x2E1F, 23013 },
+ { 0x2E1B, 23017 },
+ { 0x223C, 23021 },
+ { 0x2A6A, 23023 },
+ { 0x2A6B, 23028 },
+ { 0x2B49, 23033 },
+ { 0x2972, 23038 },
+ { 0x29D4, 23043 },
+ { 0x29D5, 23048 },
+ { 0x2330, 23053 },
+ { 0x2122, 23055 },
+ { 0x222A, 23058 },
+ { 0x2A41, 23059 },
+ { 0x2A45, 23063 },
+ { 0x2A42, 23067 },
+ { 0x2A48, 23070 },
+ { 0x2A46, 23075 },
+ { 0x2A4A, 23078 },
+ { 0x2594, 23084 },
+ { 0x2580, 23088 },
+ { 0x25E0, 23091 },
+ { 0x25DA, 23094 },
+ { 0x23B0, 23099 },
+ { 0x27D4, 23107 },
+ { 0x25DC, 23112 },
+ { 0x25F8, 23117 },
+ { 0x2701, 23120 },
+ { 0x23B1, 23123 },
+ { 0x2710, 23131 },
+ { 0x25DD, 23134 },
+ { 0x2752, 23139 },
+ { 0x25F9, 23144 },
+ { 0x2750, 23147 },
+ { 0x26B6, 23152 },
+ { 0x264D, 23153 },
+ { 0x231A, 23154 },
+ { 0x2638, 23155 },
+ { 0x261D, 23158 },
+ { 0x2711, 23162 },
+ { 0x263C, 23164 },
+ { 0x2667, 23168 },
+ { 0x261F, 23171 },
+ { 0x2690, 23175 },
+ { 0x2727, 23177 },
+ { 0x261C, 23181 },
+ { 0x2606, 23185 },
+ { 0x2B1E, 23187 },
+ { 0x2654, 23191 },
+ { 0x2659, 23194 },
+ { 0x2656, 23197 },
+ { 0x2655, 23200 },
+ { 0x2657, 23203 },
+ { 0x2658, 23206 },
+ { 0x2661, 23209 },
+ { 0x2B1C, 23212 },
+ { 0x261E, 23215 },
+ { 0x2616, 23219 },
+ { 0x2B52, 23222 },
+ { 0x25AB, 23225 },
+ { 0x2B2B, 23228 },
+ { 0x2664, 23231 },
+ { 0x25E6, 23234 },
+ { 0x25CB, 23236 },
+ { 0x2686, 23238 },
+ { 0x2687, 23243 },
+ { 0x29EC, 23248 },
+ { 0x25F5, 23253 },
+ { 0x25F6, 23259 },
+ { 0x25F4, 23265 },
+ { 0x25F7, 23271 },
+ { 0x2B50, 23277 },
+ { 0x25FD, 23280 },
+ { 0x25FB, 23284 },
+ { 0x2B26, 23287 },
+ { 0x2B28, 23290 },
+ { 0x6E46, 23293 },
+ { 0x25A1, 23296 },
+ { 0x25F1, 23298 },
+ { 0x25F2, 23304 },
+ { 0x25F0, 23310 },
+ { 0x25F3, 23316 },
+ { 0x2385, 23322 },
+ { 0x25A2, 23328 },
+ { 0x25EB, 23333 },
+ { 0x27E4, 23339 },
+ { 0x27E5, 23344 },
+ { 0x25A3, 23349 },
+ { 0x25C7, 23355 },
+ { 0x2662, 23357 },
+ { 0x27D0, 23360 },
+ { 0x25C8, 23365 },
+ { 0x2B21, 23371 },
+ { 0x263A, 23373 },
+ { 0x26C0, 23376 },
+ { 0x26C1, 23379 },
+ { 0x2740, 23382 },
+ { 0x2639, 23384 },
+ { 0x2B20, 23387 },
+ { 0x2704, 23389 },
+ { 0x27C1, 23391 },
+ { 0x2AFE, 23397 },
+ { 0x2B2F, 23400 },
+ { 0x25AF, 23403 },
+ { 0x29D6, 23406 },
+ { 0x25AD, 23408 },
+ { 0x260F, 23410 },
+ { 0x23E2, 23412 },
+ { 0x2B2D, 23414 },
+ { 0x25B5, 23417 },
+ { 0x25B3, 23421 },
+ { 0x25EC, 23424 },
+ { 0x27E1, 23429 },
+ { 0x27E2, 23432 },
+ { 0x27E3, 23438 },
+ { 0x25BF, 23444 },
+ { 0x25BD, 23448 },
+ { 0x25C3, 23451 },
+ { 0x25C5, 23455 },
+ { 0x25C1, 23458 },
+ { 0x25B1, 23461 },
+ { 0x25B9, 23463 },
+ { 0x25BB, 23467 },
+ { 0x2B54, 23470 },
+ { 0x25B7, 23473 },
+ { 0x713C, 23476 },
+ { 0x7101, 23481 },
+ { 0x7100, 23485 },
+ { 0x7102, 23489 },
+ { 0x713D, 23492 },
+ { 0x7107, 23497 },
+ { 0x7119, 23500 },
+ { 0x7122, 23504 },
+ { 0x710C, 23508 },
+ { 0x711E, 23511 },
+ { 0x7127, 23515 },
+ { 0x7110, 23519 },
+ { 0x712B, 23522 },
+ { 0x7108, 23526 },
+ { 0x711A, 23529 },
+ { 0x7123, 23533 },
+ { 0x710B, 23537 },
+ { 0x711D, 23540 },
+ { 0x7126, 23544 },
+ { 0x710A, 23548 },
+ { 0x711C, 23551 },
+ { 0x7125, 23555 },
+ { 0x710F, 23559 },
+ { 0x7121, 23562 },
+ { 0x712A, 23566 },
+ { 0x710E, 23570 },
+ { 0x7120, 23573 },
+ { 0x7129, 23577 },
+ { 0x7114, 23581 },
+ { 0x712F, 23584 },
+ { 0x7113, 23588 },
+ { 0x712E, 23591 },
+ { 0x710D, 23595 },
+ { 0x711F, 23598 },
+ { 0x7128, 23602 },
+ { 0x7115, 23606 },
+ { 0x7130, 23609 },
+ { 0x7109, 23613 },
+ { 0x711B, 23616 },
+ { 0x7124, 23620 },
+ { 0x7117, 23624 },
+ { 0x7132, 23627 },
+ { 0x7118, 23631 },
+ { 0x7133, 23634 },
+ { 0x7112, 23638 },
+ { 0x712D, 23641 },
+ { 0x7111, 23645 },
+ { 0x712C, 23648 },
+ { 0x7116, 23652 },
+ { 0x7131, 23655 },
+ { 0x7137, 23659 },
+ { 0x7138, 23663 },
+ { 0x713A, 23667 },
+ { 0x713B, 23671 },
+ { 0x7139, 23675 },
+ { 0x713F, 23679 },
+ { 0x713E, 23683 },
+ { 0x224A, 23687 },
+ { 0x2248, 23692 },
+ { 0x2A6F, 23695 },
+ { 0x2693, 23701 },
+ { 0x06DD, 23702 },
+ { 0x0608, 23706 },
+ { 0x060D, 23708 },
+ { 0x066D, 23711 },
+ { 0x06D4, 23715 },
+ { 0x0658, 23718 },
+ { 0x0613, 23722 },
+ { 0x060F, 23727 },
+ { 0x0603, 23730 },
+ { 0x0601, 23733 },
+ { 0x0611, 23736 },
+ { 0x06FD, 23740 },
+ { 0x06FE, 23744 },
+ { 0x0614, 23749 },
+ { 0x0612, 23752 },
+ { 0x0610, 23756 },
+ { 0x6E73, 23761 },
+ { 0x060C, 23764 },
+ { 0x064F, 23766 },
+ { 0x6E79, 23768 },
+ { 0x6E78, 23772 },
+ { 0x06EA, 23776 },
+ { 0x06EB, 23781 },
+ { 0x064E, 23786 },
+ { 0x065E, 23788 },
+ { 0x6E77, 23793 },
+ { 0x6E76, 23797 },
+ { 0x0654, 23801 },
+ { 0x0655, 23804 },
+ { 0x0650, 23807 },
+ { 0x6E7B, 23809 },
+ { 0x6E7A, 23813 },
+ { 0x06E9, 23817 },
+ { 0x06ED, 23821 },
+ { 0x06E3, 23825 },
+ { 0x06E5, 23829 },
+ { 0x06E6, 23832 },
+ { 0x06D9, 23835 },
+ { 0x0615, 23840 },
+ { 0x06E7, 23844 },
+ { 0x06DA, 23848 },
+ { 0x06D8, 23852 },
+ { 0x06E2, 23858 },
+ { 0x06E8, 23864 },
+ { 0x06DC, 23868 },
+ { 0x0617, 23872 },
+ { 0x06E4, 23876 },
+ { 0x06DB, 23880 },
+ { 0x06E1, 23885 },
+ { 0x06DF, 23892 },
+ { 0x06E0, 23897 },
+ { 0x06D7, 23903 },
+ { 0x06D6, 23913 },
+ { 0x0616, 23923 },
+ { 0x0619, 23932 },
+ { 0x0618, 23935 },
+ { 0x061A, 23938 },
+ { 0x06DE, 23941 },
+ { 0x0652, 23947 },
+ { 0x6E7F, 23949 },
+ { 0x6E7E, 23953 },
+ { 0x065C, 23957 },
+ { 0x065A, 23962 },
+ { 0x065B, 23968 },
+ { 0x06D0, 23975 },
+ { 0x6BE5, 23978 },
+ { 0x6BE7, 23983 },
+ { 0x6BE6, 23988 },
+ { 0x6BE4, 23993 },
+ { 0x06C7, 23998 },
+ { 0x0677, 24001 },
+ { 0x6BDD, 24007 },
+ { 0x6BD8, 24015 },
+ { 0x6BD7, 24020 },
+ { 0x06D5, 24025 },
+ { 0x06AD, 24028 },
+ { 0x6BD4, 24031 },
+ { 0x6BD6, 24036 },
+ { 0x6BD5, 24041 },
+ { 0x6BD3, 24046 },
+ { 0x06C6, 24051 },
+ { 0x6BDA, 24054 },
+ { 0x6BD9, 24059 },
+ { 0x06CB, 24064 },
+ { 0x6BDF, 24067 },
+ { 0x6BDE, 24072 },
+ { 0x06C8, 24077 },
+ { 0x6BDC, 24080 },
+ { 0x6BDB, 24085 },
+ { 0x0639, 24090 },
+ { 0x075D, 24093 },
+ { 0x075F, 24100 },
+ { 0x06A0, 24108 },
+ { 0x075E, 24115 },
+ { 0x6ECA, 24124 },
+ { 0x6ECC, 24129 },
+ { 0x6ECB, 24134 },
+ { 0x6EC9, 24139 },
+ { 0x0628, 24144 },
+ { 0x0751, 24147 },
+ { 0x0754, 24157 },
+ { 0x0756, 24167 },
+ { 0x0752, 24173 },
+ { 0x0753, 24182 },
+ { 0x0750, 24195 },
+ { 0x0755, 24203 },
+ { 0x6E90, 24211 },
+ { 0x6E92, 24216 },
+ { 0x6E91, 24221 },
+ { 0x6E8F, 24226 },
+ { 0x0636, 24231 },
+ { 0x06FB, 24234 },
+ { 0x6EBE, 24240 },
+ { 0x6EC0, 24245 },
+ { 0x6EBF, 24250 },
+ { 0x6EBD, 24255 },
+ { 0x062F, 24260 },
+ { 0x068A, 24263 },
+ { 0x068B, 24269 },
+ { 0x0759, 24278 },
+ { 0x0690, 24289 },
+ { 0x0689, 24296 },
+ { 0x068F, 24301 },
+ { 0x06EE, 24309 },
+ { 0x075A, 24315 },
+ { 0x6EAA, 24323 },
+ { 0x6EA9, 24328 },
+ { 0x068E, 24333 },
+ { 0x6B87, 24336 },
+ { 0x6B86, 24341 },
+ { 0x0641, 24346 },
+ { 0x06A3, 24349 },
+ { 0x06A2, 24355 },
+ { 0x0760, 24362 },
+ { 0x06A5, 24369 },
+ { 0x0761, 24376 },
+ { 0x6ED2, 24385 },
+ { 0x6ED4, 24390 },
+ { 0x6ED3, 24395 },
+ { 0x6ED1, 24400 },
+ { 0x06AF, 24405 },
+ { 0x06B2, 24408 },
+ { 0x06B0, 24415 },
+ { 0x06B4, 24420 },
+ { 0x6B93, 24427 },
+ { 0x6B95, 24432 },
+ { 0x6B94, 24437 },
+ { 0x6B92, 24442 },
+ { 0x062D, 24447 },
+ { 0x0757, 24450 },
+ { 0x0682, 24457 },
+ { 0x0681, 24465 },
+ { 0x076F, 24471 },
+ { 0x0772, 24482 },
+ { 0x076E, 24491 },
+ { 0x0685, 24500 },
+ { 0x0758, 24507 },
+ { 0x077C, 24516 },
+ { 0x6EA2, 24525 },
+ { 0x6EA4, 24530 },
+ { 0x6EA3, 24535 },
+ { 0x6EA1, 24540 },
+ { 0x0647, 24545 },
+ { 0x06C1, 24548 },
+ { 0x06C2, 24552 },
+ { 0x6BA7, 24559 },
+ { 0x6BA9, 24565 },
+ { 0x6BA8, 24571 },
+ { 0x6BA6, 24577 },
+ { 0x06C0, 24583 },
+ { 0x6BA5, 24589 },
+ { 0x6BA4, 24597 },
+ { 0x06FF, 24605 },
+ { 0x6EEA, 24611 },
+ { 0x6EEC, 24616 },
+ { 0x6EEB, 24621 },
+ { 0x6EE9, 24626 },
+ { 0x06BE, 24631 },
+ { 0x6BAB, 24635 },
+ { 0x6BAD, 24641 },
+ { 0x6BAC, 24647 },
+ { 0x6BAA, 24653 },
+ { 0x0698, 24659 },
+ { 0x6B8B, 24662 },
+ { 0x6B8A, 24667 },
+ { 0x0643, 24672 },
+ { 0x06AC, 24675 },
+ { 0x077F, 24681 },
+ { 0x06AB, 24688 },
+ { 0x06AE, 24693 },
+ { 0x6EDA, 24700 },
+ { 0x6EDC, 24705 },
+ { 0x6EDB, 24710 },
+ { 0x6ED9, 24715 },
+ { 0x0644, 24720 },
+ { 0x076A, 24723 },
+ { 0x06B6, 24728 },
+ { 0x06B5, 24734 },
+ { 0x06B7, 24740 },
+ { 0x06B8, 24747 },
+ { 0x6EDE, 24754 },
+ { 0x6EE0, 24759 },
+ { 0x6EDF, 24764 },
+ { 0x6EDD, 24769 },
+ { 0x067E, 24774 },
+ { 0x6B57, 24777 },
+ { 0x6B59, 24782 },
+ { 0x6B58, 24787 },
+ { 0x6B56, 24792 },
+ { 0x0642, 24797 },
+ { 0x06A7, 24800 },
+ { 0x06A8, 24806 },
+ { 0x6ED6, 24813 },
+ { 0x6ED8, 24818 },
+ { 0x6ED7, 24823 },
+ { 0x6ED5, 24828 },
+ { 0x0631, 24833 },
+ { 0x0694, 24836 },
+ { 0x0696, 24842 },
+ { 0x0697, 24851 },
+ { 0x076B, 24858 },
+ { 0x0699, 24866 },
+ { 0x0693, 24873 },
+ { 0x076C, 24878 },
+ { 0x0692, 24884 },
+ { 0x0695, 24890 },
+ { 0x0771, 24897 },
+ { 0x075B, 24908 },
+ { 0x06EF, 24913 },
+ { 0x6EAE, 24919 },
+ { 0x6EAD, 24924 },
+ { 0x0635, 24929 },
+ { 0x069D, 24932 },
+ { 0x069E, 24939 },
+ { 0x6EBA, 24946 },
+ { 0x6EBC, 24951 },
+ { 0x6EBB, 24956 },
+ { 0x6EB9, 24961 },
+ { 0x0637, 24966 },
+ { 0x069F, 24969 },
+ { 0x6EC2, 24976 },
+ { 0x6EC4, 24981 },
+ { 0x6EC3, 24986 },
+ { 0x6EC1, 24991 },
+ { 0x062A, 24996 },
+ { 0x067C, 24999 },
+ { 0x067D, 25004 },
+ { 0x6E96, 25012 },
+ { 0x6E98, 25017 },
+ { 0x6E97, 25022 },
+ { 0x0629, 25027 },
+ { 0x06C3, 25031 },
+ { 0x6E94, 25036 },
+ { 0x6E93, 25042 },
+ { 0x6E95, 25048 },
+ { 0x06A4, 25053 },
+ { 0x6B6B, 25056 },
+ { 0x6B6D, 25061 },
+ { 0x6B6C, 25066 },
+ { 0x6B6A, 25071 },
+ { 0x0648, 25076 },
+ { 0x06CF, 25079 },
+ { 0x06CA, 25085 },
+ { 0x06C4, 25092 },
+ { 0x0624, 25097 },
+ { 0x6E86, 25103 },
+ { 0x6E85, 25111 },
+ { 0x0778, 25119 },
+ { 0x0779, 25128 },
+ { 0x6EEE, 25137 },
+ { 0x6EED, 25142 },
+ { 0x064A, 25147 },
+ { 0x06CD, 25150 },
+ { 0x0626, 25155 },
+ { 0x6E8A, 25161 },
+ { 0x6E8C, 25169 },
+ { 0x6E8B, 25177 },
+ { 0x6E89, 25185 },
+ { 0x06CE, 25193 },
+ { 0x06D1, 25199 },
+ { 0x6EF2, 25206 },
+ { 0x06D2, 25211 },
+ { 0x06D3, 25215 },
+ { 0x6BB1, 25222 },
+ { 0x6BB0, 25231 },
+ { 0x077A, 25240 },
+ { 0x077B, 25250 },
+ { 0x6BAF, 25260 },
+ { 0x6BAE, 25266 },
+ { 0x6EF4, 25272 },
+ { 0x6EF3, 25277 },
+ { 0x6EF1, 25282 },
+ { 0x0638, 25287 },
+ { 0x6EC6, 25290 },
+ { 0x6EC8, 25295 },
+ { 0x6EC7, 25300 },
+ { 0x6EC5, 25305 },
+ { 0x0627, 25310 },
+ { 0x0672, 25313 },
+ { 0x0673, 25320 },
+ { 0x0623, 25327 },
+ { 0x6E84, 25333 },
+ { 0x6E83, 25341 },
+ { 0x0625, 25349 },
+ { 0x6E88, 25355 },
+ { 0x6E87, 25363 },
+ { 0x0622, 25371 },
+ { 0x6E82, 25377 },
+ { 0x6E81, 25385 },
+ { 0x0773, 25393 },
+ { 0x0774, 25402 },
+ { 0x6E8E, 25411 },
+ { 0x0671, 25416 },
+ { 0x6B51, 25420 },
+ { 0x6B50, 25426 },
+ { 0x0649, 25432 },
+ { 0x6EF0, 25436 },
+ { 0x6EEF, 25442 },
+ { 0x6E8D, 25448 },
+ { 0x067B, 25453 },
+ { 0x6B53, 25456 },
+ { 0x6B55, 25461 },
+ { 0x6B54, 25466 },
+ { 0x6B52, 25471 },
+ { 0x0688, 25476 },
+ { 0x6B89, 25479 },
+ { 0x6B88, 25484 },
+ { 0x0684, 25489 },
+ { 0x6B73, 25492 },
+ { 0x6B75, 25497 },
+ { 0x6B74, 25502 },
+ { 0x6B72, 25507 },
+ { 0x06B3, 25512 },
+ { 0x6B97, 25515 },
+ { 0x6B99, 25520 },
+ { 0x6B98, 25525 },
+ { 0x6B96, 25530 },
+ { 0x0674, 25535 },
+ { 0x0676, 25539 },
+ { 0x0678, 25544 },
+ { 0x0675, 25549 },
+ { 0x062C, 25554 },
+ { 0x6E9E, 25557 },
+ { 0x6EA0, 25562 },
+ { 0x6E9F, 25567 },
+ { 0x6E9D, 25572 },
+ { 0x062E, 25577 },
+ { 0x6EA6, 25580 },
+ { 0x6EA8, 25585 },
+ { 0x6EA7, 25590 },
+ { 0x6EA5, 25595 },
+ { 0x0645, 25600 },
+ { 0x0765, 25603 },
+ { 0x0766, 25609 },
+ { 0x6EE2, 25615 },
+ { 0x6EE4, 25620 },
+ { 0x6EE3, 25625 },
+ { 0x6EE1, 25630 },
+ { 0x0646, 25635 },
+ { 0x06B9, 25638 },
+ { 0x0767, 25644 },
+ { 0x06BC, 25651 },
+ { 0x0769, 25656 },
+ { 0x0768, 25662 },
+ { 0x06BD, 25668 },
+ { 0x6EE6, 25675 },
+ { 0x06BA, 25680 },
+ { 0x6B9F, 25684 },
+ { 0x6B9E, 25690 },
+ { 0x6EE8, 25696 },
+ { 0x6EE7, 25701 },
+ { 0x6EE5, 25706 },
+ { 0x0683, 25711 },
+ { 0x6B77, 25714 },
+ { 0x6B79, 25719 },
+ { 0x6B78, 25724 },
+ { 0x6B76, 25729 },
+ { 0x0691, 25734 },
+ { 0x6B8D, 25737 },
+ { 0x6B8C, 25742 },
+ { 0x0633, 25747 },
+ { 0x069A, 25750 },
+ { 0x076D, 25759 },
+ { 0x075C, 25767 },
+ { 0x0770, 25774 },
+ { 0x069B, 25785 },
+ { 0x069C, 25792 },
+ { 0x077D, 25803 },
+ { 0x077E, 25812 },
+ { 0x6EB2, 25818 },
+ { 0x6EB4, 25823 },
+ { 0x6EB3, 25828 },
+ { 0x6EB1, 25833 },
+ { 0x0630, 25838 },
+ { 0x6EAC, 25841 },
+ { 0x6EAB, 25846 },
+ { 0x062B, 25851 },
+ { 0x6E9A, 25854 },
+ { 0x6E9C, 25859 },
+ { 0x6E9B, 25864 },
+ { 0x6E99, 25869 },
+ { 0x0679, 25874 },
+ { 0x6B67, 25877 },
+ { 0x6B69, 25882 },
+ { 0x6B68, 25887 },
+ { 0x6B66, 25892 },
+ { 0x0632, 25897 },
+ { 0x6EB0, 25900 },
+ { 0x6EAF, 25905 },
+ { 0x0680, 25910 },
+ { 0x6B5B, 25913 },
+ { 0x6B5D, 25918 },
+ { 0x6B5C, 25923 },
+ { 0x6B5A, 25928 },
+ { 0x068C, 25933 },
+ { 0x6B85, 25936 },
+ { 0x6B84, 25941 },
+ { 0x06CC, 25946 },
+ { 0x063E, 25950 },
+ { 0x063F, 25958 },
+ { 0x0775, 25966 },
+ { 0x0777, 25976 },
+ { 0x0776, 25986 },
+ { 0x063D, 25996 },
+ { 0x6BFD, 26003 },
+ { 0x6BFF, 26009 },
+ { 0x6BFE, 26015 },
+ { 0x6BFC, 26021 },
+ { 0x063A, 26027 },
+ { 0x06FC, 26030 },
+ { 0x6ECE, 26036 },
+ { 0x6ED0, 26041 },
+ { 0x6ECF, 26046 },
+ { 0x6ECD, 26051 },
+ { 0x0621, 26056 },
+ { 0x6E80, 26059 },
+ { 0x06A9, 26064 },
+ { 0x0762, 26067 },
+ { 0x063B, 26073 },
+ { 0x0763, 26080 },
+ { 0x063C, 26087 },
+ { 0x0764, 26094 },
+ { 0x6B8F, 26103 },
+ { 0x6B91, 26108 },
+ { 0x6B90, 26113 },
+ { 0x6B8E, 26118 },
+ { 0x06B1, 26123 },
+ { 0x6B9B, 26126 },
+ { 0x6B9D, 26131 },
+ { 0x6B9C, 26136 },
+ { 0x6B9A, 26141 },
+ { 0x06A6, 26146 },
+ { 0x6B6F, 26149 },
+ { 0x6B71, 26154 },
+ { 0x6B70, 26159 },
+ { 0x6B6E, 26164 },
+ { 0x06BB, 26169 },
+ { 0x6BA1, 26172 },
+ { 0x6BA3, 26177 },
+ { 0x6BA2, 26182 },
+ { 0x6BA0, 26187 },
+ { 0x0634, 26192 },
+ { 0x06FA, 26195 },
+ { 0x6EB6, 26201 },
+ { 0x6EB8, 26206 },
+ { 0x6EB7, 26211 },
+ { 0x6EB5, 26216 },
+ { 0x06AA, 26221 },
+ { 0x0686, 26225 },
+ { 0x06BF, 26228 },
+ { 0x6B7B, 26234 },
+ { 0x6B7D, 26239 },
+ { 0x6B7C, 26244 },
+ { 0x6B7A, 26249 },
+ { 0x067F, 26254 },
+ { 0x6B63, 26257 },
+ { 0x6B65, 26262 },
+ { 0x6B64, 26267 },
+ { 0x6B62, 26272 },
+ { 0x068D, 26277 },
+ { 0x6B83, 26280 },
+ { 0x6B82, 26285 },
+ { 0x067A, 26290 },
+ { 0x6B5F, 26293 },
+ { 0x6B61, 26298 },
+ { 0x6B60, 26303 },
+ { 0x6B5E, 26308 },
+ { 0x6BE9, 26313 },
+ { 0x6BE8, 26322 },
+ { 0x066E, 26331 },
+ { 0x06A1, 26335 },
+ { 0x066F, 26339 },
+ { 0x06C5, 26343 },
+ { 0x6BE1, 26347 },
+ { 0x6BE0, 26353 },
+ { 0x06C9, 26359 },
+ { 0x6BE3, 26363 },
+ { 0x6BE2, 26369 },
+ { 0x0687, 26375 },
+ { 0x6B7F, 26378 },
+ { 0x6B81, 26383 },
+ { 0x6B80, 26388 },
+ { 0x6B7E, 26393 },
+ { 0x0670, 26398 },
+ { 0x0653, 26402 },
+ { 0x0600, 26405 },
+ { 0x060E, 26408 },
+ { 0x0651, 26412 },
+ { 0x6E7D, 26414 },
+ { 0x6E7C, 26418 },
+ { 0x061E, 26422 },
+ { 0x066B, 26427 },
+ { 0x066A, 26430 },
+ { 0x06EC, 26433 },
+ { 0x0640, 26440 },
+ { 0x6E71, 26442 },
+ { 0x064C, 26447 },
+ { 0x6E72, 26449 },
+ { 0x064B, 26453 },
+ { 0x6E70, 26455 },
+ { 0x0602, 26459 },
+ { 0x0657, 26462 },
+ { 0x064D, 26465 },
+ { 0x6E74, 26467 },
+ { 0x6D14, 26471 },
+ { 0x6CF8, 26478 },
+ { 0x6D13, 26485 },
+ { 0x6CF7, 26493 },
+ { 0x6D75, 26501 },
+ { 0x6DC4, 26510 },
+ { 0x6CBA, 26519 },
+ { 0x6C29, 26526 },
+ { 0x6DB6, 26533 },
+ { 0x6D78, 26542 },
+ { 0x6D76, 26552 },
+ { 0x6D77, 26561 },
+ { 0x6CBB, 26570 },
+ { 0x6C2A, 26577 },
+ { 0x6DC2, 26584 },
+ { 0x6C9D, 26593 },
+ { 0x6C06, 26600 },
+ { 0x6CE2, 26607 },
+ { 0x6CA0, 26614 },
+ { 0x6C6A, 26621 },
+ { 0x6C6F, 26628 },
+ { 0x6C0A, 26635 },
+ { 0x6C6E, 26642 },
+ { 0x6C09, 26650 },
+ { 0x6C9C, 26658 },
+ { 0x6C05, 26665 },
+ { 0x6D9E, 26672 },
+ { 0x6C9E, 26681 },
+ { 0x6C07, 26688 },
+ { 0x6C6C, 26695 },
+ { 0x6CE1, 26702 },
+ { 0x6C9F, 26709 },
+ { 0x6C08, 26716 },
+ { 0x6C6D, 26723 },
+ { 0x6C6B, 26730 },
+ { 0x6DAB, 26737 },
+ { 0x6D6E, 26746 },
+ { 0x6CB5, 26756 },
+ { 0x6C23, 26763 },
+ { 0x6D2C, 26770 },
+ { 0x6D10, 26777 },
+ { 0x6D24, 26784 },
+ { 0x6D08, 26791 },
+ { 0x6D23, 26798 },
+ { 0x6D07, 26806 },
+ { 0x6CB4, 26814 },
+ { 0x6C22, 26821 },
+ { 0x6D6F, 26828 },
+ { 0x6D70, 26837 },
+ { 0x6CB6, 26846 },
+ { 0x6C24, 26853 },
+ { 0x6CB7, 26860 },
+ { 0x6C25, 26867 },
+ { 0x6CBF, 26874 },
+ { 0x6C2E, 26881 },
+ { 0x6C7D, 26888 },
+ { 0x6C32, 26895 },
+ { 0x6C7C, 26902 },
+ { 0x6C31, 26910 },
+ { 0x6CBE, 26918 },
+ { 0x6C2D, 26925 },
+ { 0x6D7C, 26932 },
+ { 0x6D7D, 26941 },
+ { 0x6CC0, 26950 },
+ { 0x6C2F, 26957 },
+ { 0x6DC1, 26964 },
+ { 0x6CC1, 26973 },
+ { 0x6C30, 26980 },
+ { 0x6D1C, 26987 },
+ { 0x6D00, 26994 },
+ { 0x6D1B, 27001 },
+ { 0x6CFF, 27009 },
+ { 0x6DBF, 27017 },
+ { 0x6CA9, 27026 },
+ { 0x6C17, 27033 },
+ { 0x6D5A, 27040 },
+ { 0x6D5B, 27049 },
+ { 0x6CAA, 27059 },
+ { 0x6C18, 27066 },
+ { 0x6C54, 27073 },
+ { 0x6C53, 27080 },
+ { 0x6CD7, 27088 },
+ { 0x6C51, 27095 },
+ { 0x6D93, 27102 },
+ { 0x6D94, 27111 },
+ { 0x6CD8, 27120 },
+ { 0x6C52, 27127 },
+ { 0x6CD9, 27134 },
+ { 0x6CC5, 27142 },
+ { 0x6C39, 27149 },
+ { 0x6C81, 27156 },
+ { 0x6CEB, 27163 },
+ { 0x6CC7, 27170 },
+ { 0x6C3B, 27177 },
+ { 0x6C84, 27184 },
+ { 0x6C3E, 27191 },
+ { 0x6C80, 27198 },
+ { 0x6C83, 27205 },
+ { 0x6C3D, 27213 },
+ { 0x6C37, 27221 },
+ { 0x6CC4, 27228 },
+ { 0x6C38, 27235 },
+ { 0x6CC6, 27242 },
+ { 0x6C3A, 27249 },
+ { 0x6DB7, 27256 },
+ { 0x6DBB, 27265 },
+ { 0x6DC3, 27274 },
+ { 0x6C82, 27283 },
+ { 0x6CEC, 27290 },
+ { 0x6CC8, 27297 },
+ { 0x6C3C, 27304 },
+ { 0x6D81, 27311 },
+ { 0x6D82, 27320 },
+ { 0x6D80, 27330 },
+ { 0x6DB5, 27339 },
+ { 0x6CCA, 27348 },
+ { 0x6C40, 27355 },
+ { 0x6CCD, 27362 },
+ { 0x6C87, 27369 },
+ { 0x6C44, 27376 },
+ { 0x6EF8, 27383 },
+ { 0x6EF7, 27393 },
+ { 0x6EFA, 27403 },
+ { 0x6EF9, 27413 },
+ { 0x6EF6, 27423 },
+ { 0x6EF5, 27433 },
+ { 0x6EFC, 27443 },
+ { 0x6C86, 27450 },
+ { 0x6C43, 27458 },
+ { 0x6EFB, 27466 },
+ { 0x6DAC, 27473 },
+ { 0x6D84, 27482 },
+ { 0x6D83, 27491 },
+ { 0x6DBC, 27500 },
+ { 0x6DBA, 27509 },
+ { 0x6CC9, 27518 },
+ { 0x6C3F, 27525 },
+ { 0x6D85, 27532 },
+ { 0x6D86, 27541 },
+ { 0x6CCB, 27550 },
+ { 0x6C41, 27557 },
+ { 0x6D87, 27564 },
+ { 0x6D88, 27573 },
+ { 0x6DAD, 27582 },
+ { 0x6C85, 27591 },
+ { 0x6CED, 27598 },
+ { 0x6CCC, 27605 },
+ { 0x6C42, 27612 },
+ { 0x6CC2, 27619 },
+ { 0x6C33, 27626 },
+ { 0x6C7F, 27633 },
+ { 0x6C36, 27640 },
+ { 0x6C7E, 27647 },
+ { 0x6C35, 27655 },
+ { 0x6D7E, 27663 },
+ { 0x6DB4, 27672 },
+ { 0x6DB2, 27681 },
+ { 0x6D7F, 27690 },
+ { 0x6CC3, 27699 },
+ { 0x6C34, 27706 },
+ { 0x6C5C, 27713 },
+ { 0x6D64, 27721 },
+ { 0x6D65, 27730 },
+ { 0x6DA9, 27739 },
+ { 0x6CB1, 27748 },
+ { 0x6C20, 27755 },
+ { 0x6D2B, 27762 },
+ { 0x6D0F, 27769 },
+ { 0x6D22, 27776 },
+ { 0x6D06, 27783 },
+ { 0x6D21, 27790 },
+ { 0x6D05, 27798 },
+ { 0x6CB2, 27806 },
+ { 0x6D66, 27813 },
+ { 0x6DC5, 27822 },
+ { 0x6CB3, 27831 },
+ { 0x6C21, 27838 },
+ { 0x6CB8, 27845 },
+ { 0x6C26, 27852 },
+ { 0x6D12, 27859 },
+ { 0x6CF6, 27866 },
+ { 0x6D11, 27873 },
+ { 0x6CF5, 27881 },
+ { 0x6D71, 27889 },
+ { 0x6D72, 27898 },
+ { 0x6D74, 27907 },
+ { 0x6D73, 27916 },
+ { 0x6D3A, 27925 },
+ { 0x6D33, 27932 },
+ { 0x6C27, 27939 },
+ { 0x6D51, 27946 },
+ { 0x6D52, 27955 },
+ { 0x6D53, 27964 },
+ { 0x6CA2, 27973 },
+ { 0x6C0C, 27980 },
+ { 0x6CE4, 27987 },
+ { 0x6CA5, 27994 },
+ { 0x6C70, 28001 },
+ { 0x6C75, 28008 },
+ { 0x6C10, 28015 },
+ { 0x6C74, 28022 },
+ { 0x6C0F, 28030 },
+ { 0x6D9F, 28038 },
+ { 0x6DA0, 28047 },
+ { 0x6D50, 28057 },
+ { 0x6CA1, 28066 },
+ { 0x6C0B, 28073 },
+ { 0x6DA1, 28080 },
+ { 0x6DA2, 28089 },
+ { 0x6D54, 28099 },
+ { 0x6CA3, 28108 },
+ { 0x6C0D, 28115 },
+ { 0x6D56, 28122 },
+ { 0x6DA3, 28131 },
+ { 0x6DA4, 28140 },
+ { 0x6D55, 28150 },
+ { 0x6D57, 28159 },
+ { 0x6C72, 28168 },
+ { 0x6CE3, 28175 },
+ { 0x6CA4, 28182 },
+ { 0x6C0E, 28189 },
+ { 0x6C73, 28196 },
+ { 0x6C71, 28203 },
+ { 0x6DAE, 28210 },
+ { 0x6CDB, 28219 },
+ { 0x6C56, 28226 },
+ { 0x6CF1, 28233 },
+ { 0x6CDE, 28240 },
+ { 0x6C91, 28247 },
+ { 0x6C96, 28254 },
+ { 0x6C5A, 28261 },
+ { 0x6C95, 28268 },
+ { 0x6C59, 28276 },
+ { 0x6DAF, 28284 },
+ { 0x6CDA, 28293 },
+ { 0x6C55, 28300 },
+ { 0x6CDC, 28307 },
+ { 0x6C57, 28314 },
+ { 0x6DB0, 28321 },
+ { 0x6D9C, 28330 },
+ { 0x6D9D, 28339 },
+ { 0x6C93, 28348 },
+ { 0x6CF0, 28355 },
+ { 0x6CDD, 28362 },
+ { 0x6C58, 28369 },
+ { 0x6C94, 28376 },
+ { 0x6C92, 28383 },
+ { 0x6BF7, 28390 },
+ { 0x6BF8, 28400 },
+ { 0x6BF6, 28410 },
+ { 0x6BF1, 28420 },
+ { 0x6BF0, 28430 },
+ { 0x6BED, 28440 },
+ { 0x6BEC, 28450 },
+ { 0x6BF3, 28460 },
+ { 0x6BF2, 28470 },
+ { 0x6BF5, 28480 },
+ { 0x6BF4, 28490 },
+ { 0x6C98, 28500 },
+ { 0x6C01, 28510 },
+ { 0x6CE0, 28520 },
+ { 0x6C9B, 28530 },
+ { 0x6C64, 28540 },
+ { 0x6BEF, 28550 },
+ { 0x6BEE, 28560 },
+ { 0x6C69, 28570 },
+ { 0x6C04, 28580 },
+ { 0x6BEB, 28590 },
+ { 0x6C68, 28600 },
+ { 0x6C03, 28611 },
+ { 0x6BEA, 28622 },
+ { 0x6C97, 28632 },
+ { 0x6C00, 28642 },
+ { 0x6C99, 28652 },
+ { 0x6C66, 28662 },
+ { 0x6CDF, 28672 },
+ { 0x6C9A, 28682 },
+ { 0x6C02, 28692 },
+ { 0x6C67, 28702 },
+ { 0x6C65, 28712 },
+ { 0x6D3B, 28722 },
+ { 0x6CB9, 28729 },
+ { 0x6C28, 28736 },
+ { 0x6D3C, 28743 },
+ { 0x6D3D, 28750 },
+ { 0x6C90, 28757 },
+ { 0x6C5D, 28766 },
+ { 0x6DBE, 28775 },
+ { 0x6DA6, 28784 },
+ { 0x6CA7, 28794 },
+ { 0x6C15, 28801 },
+ { 0x6D1E, 28808 },
+ { 0x6D02, 28815 },
+ { 0x6D1D, 28822 },
+ { 0x6D01, 28830 },
+ { 0x6D58, 28838 },
+ { 0x6D59, 28847 },
+ { 0x6DA5, 28856 },
+ { 0x6DA7, 28865 },
+ { 0x6CA8, 28875 },
+ { 0x6C16, 28882 },
+ { 0x6C1A, 28889 },
+ { 0x6D20, 28896 },
+ { 0x6D04, 28903 },
+ { 0x6D1F, 28910 },
+ { 0x6D03, 28918 },
+ { 0x6CAB, 28926 },
+ { 0x6C19, 28933 },
+ { 0x6CAC, 28940 },
+ { 0x6C1B, 28947 },
+ { 0x6D8B, 28954 },
+ { 0x6D89, 28963 },
+ { 0x6D8A, 28972 },
+ { 0x6CCF, 28981 },
+ { 0x6C46, 28988 },
+ { 0x6C4A, 28995 },
+ { 0x6C88, 29002 },
+ { 0x6C49, 29009 },
+ { 0x6D8C, 29017 },
+ { 0x6DC0, 29026 },
+ { 0x6D92, 29035 },
+ { 0x6D8D, 29044 },
+ { 0x6CCE, 29053 },
+ { 0x6C45, 29060 },
+ { 0x6DB9, 29067 },
+ { 0x6D8E, 29076 },
+ { 0x6D8F, 29085 },
+ { 0x6CD0, 29094 },
+ { 0x6C47, 29101 },
+ { 0x6DB1, 29108 },
+ { 0x6C89, 29117 },
+ { 0x6CD1, 29124 },
+ { 0x6C48, 29131 },
+ { 0x6DB3, 29138 },
+ { 0x6D96, 29147 },
+ { 0x6D95, 29157 },
+ { 0x6CD3, 29166 },
+ { 0x6C4C, 29173 },
+ { 0x6CEF, 29180 },
+ { 0x6CD6, 29187 },
+ { 0x6C8A, 29194 },
+ { 0x6C8F, 29201 },
+ { 0x6C50, 29208 },
+ { 0x6C8E, 29215 },
+ { 0x6C4F, 29223 },
+ { 0x6DBD, 29231 },
+ { 0x6DB8, 29240 },
+ { 0x6DC7, 29249 },
+ { 0x6D99, 29258 },
+ { 0x6D97, 29268 },
+ { 0x6D98, 29277 },
+ { 0x6CD2, 29286 },
+ { 0x6C4B, 29293 },
+ { 0x6CD4, 29300 },
+ { 0x6C4D, 29307 },
+ { 0x6D9A, 29314 },
+ { 0x6D9B, 29323 },
+ { 0x6C8C, 29333 },
+ { 0x6CEE, 29340 },
+ { 0x6CD5, 29347 },
+ { 0x6C4E, 29354 },
+ { 0x6C8D, 29361 },
+ { 0x6C8B, 29368 },
+ { 0x6DF1, 29375 },
+ { 0x6D5C, 29385 },
+ { 0x6D35, 29394 },
+ { 0x6CAE, 29401 },
+ { 0x6C1D, 29408 },
+ { 0x6CE8, 29415 },
+ { 0x6D31, 29422 },
+ { 0x6D2A, 29429 },
+ { 0x6D0E, 29436 },
+ { 0x6D18, 29443 },
+ { 0x6CFC, 29450 },
+ { 0x6D17, 29457 },
+ { 0x6CFB, 29465 },
+ { 0x6D5D, 29473 },
+ { 0x6D5E, 29482 },
+ { 0x6D34, 29492 },
+ { 0x6CAD, 29499 },
+ { 0x6C1C, 29506 },
+ { 0x6DC6, 29513 },
+ { 0x6DA8, 29522 },
+ { 0x6D36, 29532 },
+ { 0x6CAF, 29539 },
+ { 0x6C1E, 29546 },
+ { 0x6D5F, 29553 },
+ { 0x6D60, 29562 },
+ { 0x6D61, 29571 },
+ { 0x6D62, 29580 },
+ { 0x6D63, 29589 },
+ { 0x6CE7, 29598 },
+ { 0x6CB0, 29605 },
+ { 0x6C1F, 29612 },
+ { 0x6C5B, 29619 },
+ { 0x6CE6, 29627 },
+ { 0x6C76, 29634 },
+ { 0x6C7B, 29641 },
+ { 0x6C14, 29648 },
+ { 0x6C7A, 29655 },
+ { 0x6C13, 29663 },
+ { 0x6C11, 29671 },
+ { 0x6C78, 29678 },
+ { 0x6CE5, 29685 },
+ { 0x6CA6, 29692 },
+ { 0x6C12, 29699 },
+ { 0x6C79, 29706 },
+ { 0x6C77, 29713 },
+ { 0x6DF3, 29720 },
+ { 0x6DF2, 29725 },
+ { 0x6D16, 29730 },
+ { 0x6CFA, 29737 },
+ { 0x6D15, 29744 },
+ { 0x6CF9, 29752 },
+ { 0x6CBC, 29760 },
+ { 0x6C2B, 29767 },
+ { 0x6D7A, 29774 },
+ { 0x6D7B, 29783 },
+ { 0x6D79, 29793 },
+ { 0x6CBD, 29802 },
+ { 0x6C2C, 29809 },
+ { 0x6DF5, 29816 },
+ { 0x6DF0, 29821 },
+ { 0x6DF9, 29831 },
+ { 0x6DAA, 29836 },
+ { 0x6D67, 29845 },
+ { 0x6D68, 29854 },
+ { 0x6D26, 29863 },
+ { 0x6D38, 29870 },
+ { 0x6D2E, 29877 },
+ { 0x6D0A, 29884 },
+ { 0x6CEA, 29891 },
+ { 0x6D32, 29898 },
+ { 0x6D29, 29905 },
+ { 0x6D0D, 29912 },
+ { 0x6D1A, 29919 },
+ { 0x6CFE, 29926 },
+ { 0x6D19, 29933 },
+ { 0x6CFD, 29941 },
+ { 0x6D69, 29949 },
+ { 0x6D25, 29958 },
+ { 0x6D37, 29965 },
+ { 0x6D2D, 29972 },
+ { 0x6D09, 29979 },
+ { 0x6D27, 29986 },
+ { 0x6D39, 29993 },
+ { 0x6D2F, 30000 },
+ { 0x6D0B, 30007 },
+ { 0x6D6A, 30014 },
+ { 0x6D6B, 30023 },
+ { 0x6D6C, 30032 },
+ { 0x6D6D, 30041 },
+ { 0x6D28, 30050 },
+ { 0x6CE9, 30057 },
+ { 0x6D30, 30064 },
+ { 0x6D0C, 30071 },
+ { 0x6DF7, 30078 },
+ { 0x6DF6, 30083 },
+ { 0x6CF3, 30088 },
+ { 0x6C61, 30095 },
+ { 0x6CF2, 30102 },
+ { 0x6C60, 30109 },
+ { 0x6CF4, 30116 },
+ { 0x6C62, 30123 },
+ { 0x6C5E, 30130 },
+ { 0x6C5F, 30137 },
+ { 0x6C63, 30144 },
+ { 0x6BFA, 30152 },
+ { 0x6BFB, 30165 },
+ { 0x6BF9, 30178 },
+ { 0x6DF4, 30191 },
+ { 0x6DF8, 30196 },
+ { 0x6DFD, 30201 },
+ { 0x6DFA, 30206 },
+ { 0x6DFB, 30211 },
+ { 0x061F, 30214 },
+ { 0x065D, 30217 },
+ { 0x0659, 30220 },
+ { 0x061B, 30222 },
+ { 0x0656, 30224 },
+ { 0x066C, 30227 },
+ { 0x2717, 30230 },
+ { 0x2610, 30232 },
+ { 0x2612, 30234 },
+ { 0x2611, 30238 },
+ { 0x266B, 30242 },
+ { 0x266C, 30245 },
+ { 0x293B, 30248 },
+ { 0x2321, 30252 },
+ { 0x230D, 30255 },
+ { 0x2E24, 30258 },
+ { 0x231E, 30262 },
+ { 0x23DF, 30265 },
+ { 0x230C, 30268 },
+ { 0x2E25, 30271 },
+ { 0x231F, 30275 },
+ { 0x23B5, 30278 },
+ { 0x23B6, 30281 },
+ { 0x23E1, 30288 },
+ { 0x23DD, 30292 },
+ { 0x22C8, 30294 },
+ { 0x29D1, 30295 },
+ { 0x29D2, 30300 },
+ { 0x00A6, 30305 },
+ { 0x238B, 30307 },
+ { 0x2022, 30312 },
+ { 0x2219, 30313 },
+ { 0xC07F, 30315 },
+ { 0x264B, 30317 },
+ { 0x72A0, 30318 },
+ { 0x72A9, 30321 },
+ { 0x72A2, 30324 },
+ { 0x72BA, 30327 },
+ { 0x72C0, 30330 },
+ { 0x72B9, 30333 },
+ { 0x72BC, 30336 },
+ { 0x72A3, 30339 },
+ { 0x72AA, 30342 },
+ { 0x72B5, 30345 },
+ { 0x72AB, 30348 },
+ { 0x72B7, 30351 },
+ { 0x72A8, 30354 },
+ { 0x72A5, 30357 },
+ { 0x72B0, 30360 },
+ { 0x72AD, 30363 },
+ { 0x72B2, 30366 },
+ { 0x72B4, 30369 },
+ { 0x72A7, 30372 },
+ { 0x72AC, 30375 },
+ { 0x72CF, 30378 },
+ { 0x72C1, 30381 },
+ { 0x72C5, 30384 },
+ { 0x72BD, 30387 },
+ { 0x72A6, 30390 },
+ { 0x72CA, 30393 },
+ { 0x72BE, 30396 },
+ { 0x72C4, 30399 },
+ { 0x72B3, 30402 },
+ { 0x72A1, 30405 },
+ { 0x72C9, 30408 },
+ { 0x72AE, 30411 },
+ { 0x72B8, 30414 },
+ { 0x72C2, 30417 },
+ { 0x72C7, 30420 },
+ { 0x72BF, 30423 },
+ { 0x72CE, 30426 },
+ { 0x72CB, 30429 },
+ { 0x72CC, 30432 },
+ { 0x72CD, 30435 },
+ { 0x72AF, 30438 },
+ { 0x72C3, 30441 },
+ { 0x72B6, 30444 },
+ { 0x72A4, 30447 },
+ { 0x72B1, 30450 },
+ { 0x72C6, 30453 },
+ { 0x72C8, 30456 },
+ { 0x72D0, 30459 },
+ { 0x72BB, 30462 },
+ { 0x2104, 30465 },
+ { 0x26B7, 30468 },
+ { 0x25D5, 30469 },
+ { 0x29C3, 30477 },
+ { 0x25D0, 30485 },
+ { 0x25D2, 30490 },
+ { 0x25D1, 30495 },
+ { 0x29C2, 30500 },
+ { 0x25D3, 30507 },
+ { 0x25D4, 30512 },
+ { 0x25CD, 30518 },
+ { 0x29B5, 30522 },
+ { 0x29BB, 30526 },
+ { 0x29BA, 30530 },
+ { 0x2A4C, 30542 },
+ { 0x2A50, 30546 },
+ { 0x2ACF, 30553 },
+ { 0x2AD1, 30555 },
+ { 0x2AD0, 30560 },
+ { 0x2AD2, 30562 },
+ { 0x2A4D, 30567 },
+ { 0x26B0, 30571 },
+ { 0x2CF9, 30572 },
+ { 0x2CFC, 30577 },
+ { 0x2CFA, 30582 },
+ { 0x2CFB, 30588 },
+ { 0x2CFE, 30594 },
+ { 0x2C9F, 30597 },
+ { 0x2CAB, 30601 },
+ { 0x2C99, 30605 },
+ { 0x2C9B, 30609 },
+ { 0x2CA1, 30613 },
+ { 0x2CA3, 30617 },
+ { 0x2CA9, 30621 },
+ { 0x03EF, 30625 },
+ { 0x2C89, 30629 },
+ { 0x03E5, 30633 },
+ { 0x2CAD, 30637 },
+ { 0x2C9D, 30641 },
+ { 0x2CCF, 30645 },
+ { 0x2CB5, 30651 },
+ { 0x2CD9, 30657 },
+ { 0x2CC7, 30663 },
+ { 0x2CD5, 30669 },
+ { 0x2CD3, 30675 },
+ { 0x2CBF, 30681 },
+ { 0x2CCD, 30687 },
+ { 0x2CC5, 30693 },
+ { 0x2CDB, 30699 },
+ { 0x2CD7, 30705 },
+ { 0x2CDF, 30711 },
+ { 0x2CE1, 30717 },
+ { 0x2CE3, 30723 },
+ { 0x2CDD, 30729 },
+ { 0x2CB1, 30735 },
+ { 0x2CAF, 30739 },
+ { 0x2C8B, 30743 },
+ { 0x2CA7, 30747 },
+ { 0x2C81, 30751 },
+ { 0x2C8F, 30755 },
+ { 0x03E9, 30759 },
+ { 0x2C95, 30763 },
+ { 0x03E7, 30767 },
+ { 0x03E3, 30771 },
+ { 0x2CA5, 30775 },
+ { 0x2C83, 30779 },
+ { 0x2C8D, 30783 },
+ { 0x2C87, 30787 },
+ { 0x2C85, 30791 },
+ { 0x2C93, 30795 },
+ { 0x2C97, 30799 },
+ { 0x2CC1, 30803 },
+ { 0x03ED, 30807 },
+ { 0x03EB, 30811 },
+ { 0x2C91, 30815 },
+ { 0x2CC3, 30819 },
+ { 0x2CC9, 30824 },
+ { 0x2CD1, 30829 },
+ { 0x2CBB, 30834 },
+ { 0x2CB3, 30839 },
+ { 0x2CCB, 30844 },
+ { 0x2CB9, 30849 },
+ { 0x2CBD, 30854 },
+ { 0x2CB7, 30859 },
+ { 0x2CE5, 30864 },
+ { 0x2CE6, 30868 },
+ { 0x2CE4, 30872 },
+ { 0x2CE9, 30875 },
+ { 0x2CE8, 30879 },
+ { 0x2CEA, 30883 },
+ { 0x2CE7, 30887 },
+ { 0x2C9E, 30890 },
+ { 0x2CAA, 30894 },
+ { 0x2C98, 30898 },
+ { 0x2C9A, 30902 },
+ { 0x2CA0, 30906 },
+ { 0x2CA2, 30910 },
+ { 0x2CA8, 30914 },
+ { 0x03EE, 30918 },
+ { 0x2C88, 30922 },
+ { 0x03E4, 30926 },
+ { 0x2CAC, 30930 },
+ { 0x2C9C, 30934 },
+ { 0x2CCE, 30938 },
+ { 0x2CB4, 30944 },
+ { 0x2CD8, 30950 },
+ { 0x2CC6, 30956 },
+ { 0x2CD4, 30962 },
+ { 0x2CD2, 30968 },
+ { 0x2CBE, 30974 },
+ { 0x2CCC, 30980 },
+ { 0x2CC4, 30986 },
+ { 0x2CDA, 30992 },
+ { 0x2CD6, 30998 },
+ { 0x2CDE, 31004 },
+ { 0x2CE0, 31010 },
+ { 0x2CE2, 31016 },
+ { 0x2CDC, 31022 },
+ { 0x2CB0, 31028 },
+ { 0x2CAE, 31032 },
+ { 0x2C8A, 31036 },
+ { 0x2CA6, 31040 },
+ { 0x2C80, 31044 },
+ { 0x2C8E, 31048 },
+ { 0x03E8, 31052 },
+ { 0x2C94, 31056 },
+ { 0x03E6, 31060 },
+ { 0x03E2, 31064 },
+ { 0x2CA4, 31068 },
+ { 0x2C82, 31072 },
+ { 0x2C8C, 31076 },
+ { 0x2C86, 31080 },
+ { 0x2C84, 31084 },
+ { 0x2C92, 31088 },
+ { 0x2C96, 31092 },
+ { 0x2CC0, 31096 },
+ { 0x03EC, 31100 },
+ { 0x03EA, 31104 },
+ { 0x2C90, 31108 },
+ { 0x2CC2, 31112 },
+ { 0x2CC8, 31117 },
+ { 0x2CD0, 31122 },
+ { 0x2CBA, 31127 },
+ { 0x2CB2, 31132 },
+ { 0x2CCA, 31137 },
+ { 0x2CB8, 31142 },
+ { 0x2CBC, 31147 },
+ { 0x2CB6, 31152 },
+ { 0x2CFD, 31157 },
+ { 0x2CFF, 31161 },
+ { 0x2761, 31164 },
+ { 0x2020, 31169 },
+ { 0x6E4D, 31170 },
+ { 0x6E49, 31173 },
+ { 0x279F, 31175 },
+ { 0x00B0, 31179 },
+ { 0x2103, 31181 },
+ { 0x2109, 31183 },
+ { 0x9305, 31185 },
+ { 0x9302, 31188 },
+ { 0x268D, 31192 },
+ { 0x268E, 31196 },
+ { 0x9304, 31200 },
+ { 0x9303, 31204 },
+ { 0x268F, 31208 },
+ { 0x268C, 31212 },
+ { 0x9301, 31216 },
+ { 0x2393, 31220 },
+ { 0x0024, 31225 },
+ { 0xA062, 31227 },
+ { 0xA030, 31231 },
+ { 0xA063, 31235 },
+ { 0xA064, 31238 },
+ { 0xA065, 31241 },
+ { 0xA066, 31244 },
+ { 0xA067, 31247 },
+ { 0xA068, 31250 },
+ { 0xA069, 31253 },
+ { 0xA06A, 31256 },
+ { 0xA06B, 31259 },
+ { 0xA06C, 31262 },
+ { 0xA06D, 31265 },
+ { 0xA06E, 31268 },
+ { 0xA06F, 31271 },
+ { 0xA070, 31274 },
+ { 0xA071, 31277 },
+ { 0xA072, 31280 },
+ { 0xA073, 31283 },
+ { 0xA074, 31286 },
+ { 0xA075, 31289 },
+ { 0xA076, 31292 },
+ { 0xA077, 31295 },
+ { 0xA078, 31298 },
+ { 0xA079, 31301 },
+ { 0xA07A, 31304 },
+ { 0xA07B, 31307 },
+ { 0xA07C, 31310 },
+ { 0xA07D, 31313 },
+ { 0xA07E, 31316 },
+ { 0xA07F, 31319 },
+ { 0xA080, 31322 },
+ { 0xA081, 31325 },
+ { 0xA082, 31328 },
+ { 0xA083, 31331 },
+ { 0xA084, 31334 },
+ { 0xA085, 31337 },
+ { 0xA086, 31340 },
+ { 0xA087, 31343 },
+ { 0xA088, 31346 },
+ { 0xA089, 31349 },
+ { 0xA08A, 31352 },
+ { 0xA08B, 31355 },
+ { 0xA08C, 31358 },
+ { 0xA08D, 31361 },
+ { 0xA08E, 31364 },
+ { 0xA08F, 31367 },
+ { 0xA090, 31370 },
+ { 0xA091, 31373 },
+ { 0xA092, 31376 },
+ { 0xA093, 31379 },
+ { 0xA031, 31382 },
+ { 0xA032, 31385 },
+ { 0xA033, 31388 },
+ { 0xA034, 31391 },
+ { 0xA035, 31394 },
+ { 0xA036, 31397 },
+ { 0xA037, 31400 },
+ { 0xA038, 31403 },
+ { 0xA039, 31406 },
+ { 0xA03A, 31409 },
+ { 0xA03B, 31412 },
+ { 0xA03C, 31415 },
+ { 0xA03D, 31418 },
+ { 0xA03E, 31421 },
+ { 0xA03F, 31424 },
+ { 0xA040, 31427 },
+ { 0xA041, 31430 },
+ { 0xA042, 31433 },
+ { 0xA043, 31436 },
+ { 0xA044, 31439 },
+ { 0xA045, 31442 },
+ { 0xA046, 31445 },
+ { 0xA047, 31448 },
+ { 0xA048, 31451 },
+ { 0xA049, 31454 },
+ { 0xA04A, 31457 },
+ { 0xA04B, 31460 },
+ { 0xA04C, 31463 },
+ { 0xA04D, 31466 },
+ { 0xA04E, 31469 },
+ { 0xA04F, 31472 },
+ { 0xA050, 31475 },
+ { 0xA051, 31478 },
+ { 0xA052, 31481 },
+ { 0xA053, 31484 },
+ { 0xA054, 31487 },
+ { 0xA055, 31490 },
+ { 0xA056, 31493 },
+ { 0xA057, 31496 },
+ { 0xA058, 31499 },
+ { 0xA059, 31502 },
+ { 0xA05A, 31505 },
+ { 0xA05B, 31508 },
+ { 0xA05C, 31511 },
+ { 0xA05D, 31514 },
+ { 0xA05E, 31517 },
+ { 0xA05F, 31520 },
+ { 0xA060, 31523 },
+ { 0xA061, 31526 },
+ { 0x205C, 31529 },
+ { 0x2999, 31531 },
+ { 0x25CC, 31533 },
+ { 0x2E13, 31535 },
+ { 0x2B1A, 31537 },
+ { 0x2E08, 31539 },
+ { 0x2E16, 31542 },
+ { 0x2AEB, 31545 },
+ { 0x2017, 31548 },
+ { 0x2AEA, 31551 },
+ { 0x2995, 31554 },
+ { 0x29FA, 31559 },
+ { 0x6E4C, 31561 },
+ { 0x02DD, 31564 },
+ { 0x2A74, 31567 },
+ { 0x201E, 31570 },
+ { 0x2033, 31574 },
+ { 0x301E, 31576 },
+ { 0x2996, 31580 },
+ { 0x22D3, 31585 },
+ { 0x2021, 31587 },
+ { 0x2AA1, 31589 },
+ { 0x2AA3, 31592 },
+ { 0x2AA2, 31597 },
+ { 0x2A4F, 31600 },
+ { 0x2A4E, 31603 },
+ { 0x2AEC, 31606 },
+ { 0x22D0, 31610 },
+ { 0x24F5, 31612 },
+ { 0x24FA, 31616 },
+ { 0x24F6, 31620 },
+ { 0x24F9, 31624 },
+ { 0x24F8, 31628 },
+ { 0x24FD, 31632 },
+ { 0x24FC, 31636 },
+ { 0x24FB, 31640 },
+ { 0x24F7, 31644 },
+ { 0x24FE, 31648 },
+ { 0x2A54, 31652 },
+ { 0x2A53, 31655 },
+ { 0x2E17, 31658 },
+ { 0x2AFD, 31661 },
+ { 0x222C, 31664 },
+ { 0x2ABB, 31666 },
+ { 0x2047, 31668 },
+ { 0x2ABC, 31671 },
+ { 0x22D1, 31673 },
+ { 0x2AE3, 31675 },
+ { 0x2AE5, 31680 },
+ { 0x22AB, 31686 },
+ { 0x2016, 31692 },
+ { 0x203C, 31695 },
+ { 0x22D2, 31698 },
+ { 0x201F, 31700 },
+ { 0x266A, 31704 },
+ { 0x003D, 31706 },
+ { 0x29E3, 31708 },
+ { 0x29E4, 31713 },
+ { 0x2A66, 31721 },
+ { 0x2A77, 31726 },
+ { 0x2AAE, 31736 },
+ { 0x2A71, 31741 },
+ { 0x2A73, 31746 },
+ { 0x2B40, 31751 },
+ { 0x2971, 31756 },
+ { 0x2A6E, 31761 },
+ { 0x2255, 31764 },
+ { 0x2239, 31766 },
+ { 0x2640, 31767 },
+ { 0x2012, 31769 },
+ { 0x2007, 31771 },
+ { 0x2A0D, 31773 },
+ { 0x2766, 31776 },
+ { 0x2698, 31778 },
+ { 0x2055, 31779 },
+ { 0x22A9, 31782 },
+ { 0x2E10, 31783 },
+ { 0x221C, 31785 },
+ { 0x20A3, 31787 },
+ { 0x264A, 31790 },
+ { 0x20B0, 31791 },
+ { 0x29E6, 31794 },
+ { 0x7339, 31796 },
+ { 0x733E, 31799 },
+ { 0x7330, 31802 },
+ { 0x7333, 31805 },
+ { 0x7332, 31808 },
+ { 0x7337, 31811 },
+ { 0x7336, 31814 },
+ { 0x734A, 31817 },
+ { 0x733F, 31821 },
+ { 0x7346, 31824 },
+ { 0x7348, 31827 },
+ { 0x7347, 31830 },
+ { 0x733A, 31833 },
+ { 0x733B, 31836 },
+ { 0x733C, 31839 },
+ { 0x7349, 31842 },
+ { 0x7342, 31845 },
+ { 0x7343, 31848 },
+ { 0x7344, 31851 },
+ { 0x7345, 31854 },
+ { 0x7334, 31857 },
+ { 0x733D, 31860 },
+ { 0x7341, 31863 },
+ { 0x7338, 31866 },
+ { 0x7331, 31869 },
+ { 0x7340, 31872 },
+ { 0x7335, 31875 },
+ { 0x2692, 31878 },
+ { 0x262D, 31881 },
+ { 0x302F, 31884 },
+ { 0x3164, 31889 },
+ { 0x314F, 31891 },
+ { 0x3154, 31894 },
+ { 0x3163, 31897 },
+ { 0x3157, 31900 },
+ { 0x315C, 31903 },
+ { 0x3150, 31906 },
+ { 0x3153, 31909 },
+ { 0x3161, 31912 },
+ { 0x315A, 31915 },
+ { 0x3158, 31918 },
+ { 0x315E, 31921 },
+ { 0x315F, 31924 },
+ { 0x3151, 31927 },
+ { 0x3156, 31930 },
+ { 0x3162, 31933 },
+ { 0x315B, 31936 },
+ { 0x3160, 31939 },
+ { 0x3159, 31942 },
+ { 0x315D, 31945 },
+ { 0x3152, 31948 },
+ { 0x3155, 31951 },
+ { 0x3145, 31954 },
+ { 0x3189, 31957 },
+ { 0x318C, 31960 },
+ { 0x318D, 31963 },
+ { 0x3148, 31966 },
+ { 0x314E, 31969 },
+ { 0x3147, 31972 },
+ { 0x3141, 31975 },
+ { 0x3134, 31978 },
+ { 0x3142, 31981 },
+ { 0x3139, 31984 },
+ { 0x3187, 31987 },
+ { 0x318B, 31990 },
+ { 0x318E, 31993 },
+ { 0x3131, 31996 },
+ { 0x3137, 31999 },
+ { 0x3188, 32002 },
+ { 0x318A, 32005 },
+ { 0x314A, 32008 },
+ { 0x314B, 32011 },
+ { 0x317F, 32014 },
+ { 0x314D, 32017 },
+ { 0x314C, 32020 },
+ { 0x3181, 32023 },
+ { 0x3146, 32026 },
+ { 0x316F, 32029 },
+ { 0x3167, 32032 },
+ { 0x3144, 32035 },
+ { 0x313D, 32038 },
+ { 0x317E, 32041 },
+ { 0x317B, 32044 },
+ { 0x317D, 32047 },
+ { 0x3149, 32050 },
+ { 0x3185, 32053 },
+ { 0x3180, 32056 },
+ { 0x3165, 32059 },
+ { 0x3143, 32062 },
+ { 0x3133, 32065 },
+ { 0x316E, 32068 },
+ { 0x3135, 32071 },
+ { 0x3136, 32074 },
+ { 0x3176, 32077 },
+ { 0x3140, 32080 },
+ { 0x313B, 32083 },
+ { 0x313C, 32086 },
+ { 0x317A, 32089 },
+ { 0x317C, 32092 },
+ { 0x3132, 32095 },
+ { 0x3138, 32098 },
+ { 0x3186, 32101 },
+ { 0x3166, 32104 },
+ { 0x3172, 32107 },
+ { 0x3173, 32110 },
+ { 0x313A, 32113 },
+ { 0x316A, 32116 },
+ { 0x3171, 32119 },
+ { 0x3178, 32122 },
+ { 0x3170, 32125 },
+ { 0x3168, 32128 },
+ { 0x3177, 32131 },
+ { 0x316C, 32134 },
+ { 0x313F, 32137 },
+ { 0x313E, 32140 },
+ { 0x3182, 32143 },
+ { 0x3184, 32146 },
+ { 0x316B, 32149 },
+ { 0x3183, 32152 },
+ { 0x3174, 32155 },
+ { 0x3175, 32158 },
+ { 0x3169, 32161 },
+ { 0x316D, 32164 },
+ { 0x3179, 32167 },
+ { 0x302E, 32170 },
+ { 0x1109, 32175 },
+ { 0x110C, 32178 },
+ { 0x1112, 32181 },
+ { 0x110B, 32184 },
+ { 0x1106, 32187 },
+ { 0x1102, 32190 },
+ { 0x1107, 32193 },
+ { 0x1105, 32196 },
+ { 0x115F, 32199 },
+ { 0x1100, 32202 },
+ { 0x1103, 32205 },
+ { 0x110E, 32208 },
+ { 0x110F, 32211 },
+ { 0x1140, 32214 },
+ { 0x1111, 32217 },
+ { 0x1110, 32220 },
+ { 0x114C, 32223 },
+ { 0x110A, 32226 },
+ { 0x1145, 32229 },
+ { 0x1121, 32232 },
+ { 0x1136, 32235 },
+ { 0x113B, 32238 },
+ { 0x1135, 32241 },
+ { 0x1131, 32244 },
+ { 0x112E, 32247 },
+ { 0x1132, 32250 },
+ { 0x1130, 32253 },
+ { 0x110D, 32256 },
+ { 0x1158, 32259 },
+ { 0x1147, 32262 },
+ { 0x1114, 32265 },
+ { 0x1108, 32268 },
+ { 0x1119, 32271 },
+ { 0x114D, 32274 },
+ { 0x1148, 32277 },
+ { 0x1143, 32280 },
+ { 0x1144, 32283 },
+ { 0x111C, 32286 },
+ { 0x1116, 32289 },
+ { 0x1127, 32292 },
+ { 0x111F, 32295 },
+ { 0x111A, 32298 },
+ { 0x1118, 32301 },
+ { 0x112D, 32304 },
+ { 0x112F, 32307 },
+ { 0x1101, 32310 },
+ { 0x1104, 32313 },
+ { 0x1159, 32316 },
+ { 0x113C, 32319 },
+ { 0x1141, 32322 },
+ { 0x1142, 32325 },
+ { 0x1113, 32328 },
+ { 0x1115, 32331 },
+ { 0x111E, 32334 },
+ { 0x1120, 32337 },
+ { 0x1137, 32340 },
+ { 0x1138, 32343 },
+ { 0x113A, 32346 },
+ { 0x1139, 32349 },
+ { 0x1153, 32352 },
+ { 0x114E, 32355 },
+ { 0x1149, 32358 },
+ { 0x1146, 32361 },
+ { 0x114B, 32364 },
+ { 0x114A, 32367 },
+ { 0x111D, 32370 },
+ { 0x112B, 32373 },
+ { 0x111B, 32376 },
+ { 0x1156, 32379 },
+ { 0x1128, 32382 },
+ { 0x112A, 32385 },
+ { 0x1129, 32388 },
+ { 0x1117, 32391 },
+ { 0x1134, 32394 },
+ { 0x113E, 32397 },
+ { 0x1152, 32400 },
+ { 0x1154, 32403 },
+ { 0x1157, 32406 },
+ { 0x1125, 32409 },
+ { 0x1150, 32412 },
+ { 0x1126, 32415 },
+ { 0x1124, 32418 },
+ { 0x113D, 32421 },
+ { 0x1122, 32424 },
+ { 0x1123, 32427 },
+ { 0x1133, 32430 },
+ { 0x1155, 32433 },
+ { 0x114F, 32436 },
+ { 0x112C, 32439 },
+ { 0x113F, 32442 },
+ { 0x1151, 32445 },
+ { 0x11BA, 32448 },
+ { 0x11BD, 32451 },
+ { 0x11C2, 32454 },
+ { 0x11BC, 32457 },
+ { 0x11B7, 32460 },
+ { 0x11AB, 32463 },
+ { 0x11B8, 32466 },
+ { 0x11AF, 32469 },
+ { 0x11A8, 32472 },
+ { 0x11AE, 32475 },
+ { 0x11BE, 32478 },
+ { 0x11BF, 32481 },
+ { 0x11EB, 32484 },
+ { 0x11C1, 32487 },
+ { 0x11C0, 32490 },
+ { 0x11F0, 32493 },
+ { 0x11BB, 32496 },
+ { 0x11DD, 32499 },
+ { 0x11C7, 32502 },
+ { 0x11B9, 32505 },
+ { 0x11B3, 32508 },
+ { 0x11EA, 32511 },
+ { 0x11E9, 32514 },
+ { 0x11EE, 32517 },
+ { 0x11D0, 32520 },
+ { 0x11F7, 32523 },
+ { 0x11F5, 32526 },
+ { 0x11F8, 32529 },
+ { 0x11F6, 32532 },
+ { 0x11AA, 32535 },
+ { 0x11E1, 32538 },
+ { 0x11DC, 32541 },
+ { 0x11DB, 32544 },
+ { 0x11AC, 32547 },
+ { 0x11AD, 32550 },
+ { 0x11E5, 32553 },
+ { 0x11E3, 32556 },
+ { 0x11B6, 32559 },
+ { 0x11B1, 32562 },
+ { 0x11CD, 32565 },
+ { 0x11B2, 32568 },
+ { 0x11E7, 32571 },
+ { 0x11E8, 32574 },
+ { 0x11A9, 32577 },
+ { 0x11F9, 32580 },
+ { 0x11EC, 32583 },
+ { 0x11C3, 32586 },
+ { 0x11DA, 32589 },
+ { 0x11C5, 32592 },
+ { 0x11C6, 32595 },
+ { 0x11B0, 32598 },
+ { 0x11CE, 32601 },
+ { 0x11CB, 32604 },
+ { 0x11EF, 32607 },
+ { 0x11E2, 32610 },
+ { 0x11E6, 32613 },
+ { 0x11E0, 32616 },
+ { 0x11DF, 32619 },
+ { 0x11C8, 32622 },
+ { 0x11C9, 32625 },
+ { 0x11F3, 32628 },
+ { 0x11E4, 32631 },
+ { 0x11D8, 32634 },
+ { 0x11D7, 32637 },
+ { 0x11B5, 32640 },
+ { 0x11B4, 32643 },
+ { 0x11CA, 32646 },
+ { 0x11F1, 32649 },
+ { 0x11F4, 32652 },
+ { 0x11DE, 32655 },
+ { 0x11D6, 32658 },
+ { 0x11D2, 32661 },
+ { 0x11D3, 32664 },
+ { 0x11F2, 32667 },
+ { 0x11ED, 32670 },
+ { 0x11CC, 32673 },
+ { 0x11D4, 32676 },
+ { 0x11D9, 32679 },
+ { 0x11C4, 32682 },
+ { 0x11D1, 32685 },
+ { 0x11CF, 32688 },
+ { 0x11D5, 32691 },
+ { 0x1161, 32694 },
+ { 0x1166, 32697 },
+ { 0x1175, 32700 },
+ { 0x1169, 32703 },
+ { 0x116E, 32706 },
+ { 0x1162, 32709 },
+ { 0x1165, 32712 },
+ { 0x1173, 32715 },
+ { 0x116C, 32718 },
+ { 0x116A, 32721 },
+ { 0x1170, 32724 },
+ { 0x1171, 32727 },
+ { 0x1163, 32730 },
+ { 0x1168, 32733 },
+ { 0x1174, 32736 },
+ { 0x116D, 32739 },
+ { 0x1172, 32742 },
+ { 0x1176, 32745 },
+ { 0x1177, 32748 },
+ { 0x1198, 32751 },
+ { 0x119A, 32754 },
+ { 0x119B, 32757 },
+ { 0x1180, 32760 },
+ { 0x1182, 32763 },
+ { 0x1183, 32766 },
+ { 0x1189, 32769 },
+ { 0x118D, 32772 },
+ { 0x116B, 32775 },
+ { 0x116F, 32778 },
+ { 0x1164, 32781 },
+ { 0x1167, 32784 },
+ { 0x117A, 32787 },
+ { 0x117B, 32790 },
+ { 0x1195, 32793 },
+ { 0x119C, 32796 },
+ { 0x1199, 32799 },
+ { 0x117F, 32802 },
+ { 0x1181, 32805 },
+ { 0x118A, 32808 },
+ { 0x118C, 32811 },
+ { 0x1178, 32814 },
+ { 0x1197, 32817 },
+ { 0x1188, 32820 },
+ { 0x1187, 32823 },
+ { 0x118E, 32826 },
+ { 0x1190, 32829 },
+ { 0x1194, 32832 },
+ { 0x1193, 32835 },
+ { 0x119E, 32838 },
+ { 0x117C, 32841 },
+ { 0x1196, 32844 },
+ { 0x1179, 32847 },
+ { 0x117D, 32850 },
+ { 0x117E, 32853 },
+ { 0x1184, 32856 },
+ { 0x118F, 32859 },
+ { 0x1192, 32862 },
+ { 0x1160, 32865 },
+ { 0x1185, 32868 },
+ { 0x1186, 32871 },
+ { 0x1191, 32874 },
+ { 0x11A1, 32877 },
+ { 0x11A0, 32880 },
+ { 0x119D, 32883 },
+ { 0x118B, 32886 },
+ { 0x119F, 32889 },
+ { 0x11A2, 32892 },
+ { 0x05C5, 32895 },
+ { 0x05C4, 32899 },
+ { 0x05AF, 32903 },
+ { 0x05C2, 32907 },
+ { 0x05BF, 32911 },
+ { 0x05C1, 32914 },
+ { 0x05B2, 32918 },
+ { 0x05B1, 32922 },
+ { 0x05B3, 32926 },
+ { 0x05B4, 32930 },
+ { 0x05B9, 32933 },
+ { 0x05BA, 32936 },
+ { 0x05BD, 32942 },
+ { 0x05B7, 32945 },
+ { 0x05B6, 32948 },
+ { 0x05B0, 32951 },
+ { 0x05B5, 32954 },
+ { 0x05BC, 32957 },
+ { 0x05B8, 32962 },
+ { 0x05C7, 32965 },
+ { 0x05BB, 32969 },
+ { 0x6B1E, 32972 },
+ { 0x05AB, 32976 },
+ { 0x05AD, 32979 },
+ { 0x05AC, 32982 },
+ { 0x05A2, 32985 },
+ { 0x05A7, 32989 },
+ { 0x05A3, 32992 },
+ { 0x05A1, 32995 },
+ { 0x05A8, 32998 },
+ { 0x0597, 33001 },
+ { 0x0592, 33004 },
+ { 0x059B, 33007 },
+ { 0x05AA, 33010 },
+ { 0x059A, 33015 },
+ { 0x0595, 33018 },
+ { 0x0594, 33022 },
+ { 0x0598, 33026 },
+ { 0x05AE, 33029 },
+ { 0x059C, 33032 },
+ { 0x059D, 33035 },
+ { 0x05A5, 33039 },
+ { 0x05A6, 33042 },
+ { 0x0599, 33046 },
+ { 0x059F, 33049 },
+ { 0x0596, 33053 },
+ { 0x0591, 33056 },
+ { 0x05A0, 33059 },
+ { 0x05A9, 33063 },
+ { 0x05A4, 33067 },
+ { 0x059E, 33070 },
+ { 0x0593, 33073 },
+ { 0x05D4, 33076 },
+ { 0x6B34, 33079 },
+ { 0x05E4, 33084 },
+ { 0x6B4E, 33087 },
+ { 0x6B44, 33092 },
+ { 0x05D1, 33097 },
+ { 0x6B4C, 33100 },
+ { 0x6B31, 33105 },
+ { 0x05D7, 33110 },
+ { 0x05DB, 33113 },
+ { 0x6B4D, 33116 },
+ { 0x6B3B, 33121 },
+ { 0x05DE, 33126 },
+ { 0x6B3E, 33129 },
+ { 0x05E0, 33134 },
+ { 0x6B40, 33137 },
+ { 0x05E7, 33142 },
+ { 0x6B47, 33145 },
+ { 0x05EA, 33150 },
+ { 0x6B4A, 33153 },
+ { 0x05D8, 33158 },
+ { 0x6B38, 33161 },
+ { 0x05D5, 33166 },
+ { 0x6B4B, 33169 },
+ { 0x6B35, 33174 },
+ { 0x05D9, 33179 },
+ { 0x6B1D, 33182 },
+ { 0x6B39, 33187 },
+ { 0x05D0, 33192 },
+ { 0x6B30, 33195 },
+ { 0x6B2E, 33200 },
+ { 0x6B2F, 33205 },
+ { 0x05E2, 33210 },
+ { 0x05E8, 33213 },
+ { 0x6B48, 33216 },
+ { 0x05E9, 33221 },
+ { 0x6B2B, 33224 },
+ { 0x6B2A, 33230 },
+ { 0x6B49, 33236 },
+ { 0x6B2D, 33241 },
+ { 0x6B2C, 33249 },
+ { 0x6B23, 33257 },
+ { 0x6B24, 33261 },
+ { 0x6B28, 33265 },
+ { 0x6B21, 33269 },
+ { 0x6B27, 33273 },
+ { 0x6B22, 33277 },
+ { 0x6B26, 33281 },
+ { 0x6B25, 33286 },
+ { 0x05D3, 33290 },
+ { 0x6B33, 33293 },
+ { 0x05E3, 33298 },
+ { 0x6B43, 33302 },
+ { 0x05DA, 33308 },
+ { 0x6B3A, 33312 },
+ { 0x05DD, 33318 },
+ { 0x05DF, 33322 },
+ { 0x05E5, 33326 },
+ { 0x05D2, 33330 },
+ { 0x6B32, 33333 },
+ { 0x05DC, 33338 },
+ { 0x6B3C, 33341 },
+ { 0x05E6, 33346 },
+ { 0x6B46, 33349 },
+ { 0x05D6, 33354 },
+ { 0x6B36, 33357 },
+ { 0x05E1, 33362 },
+ { 0x6B41, 33365 },
+ { 0x6B20, 33370 },
+ { 0x6B29, 33374 },
+ { 0x6B4F, 33379 },
+ { 0x05F1, 33383 },
+ { 0x6B1F, 33388 },
+ { 0x05F0, 33394 },
+ { 0x05F2, 33399 },
+ { 0x05C6, 33404 },
+ { 0x05C3, 33408 },
+ { 0x05BE, 33412 },
+ { 0x05C0, 33415 },
+ { 0x05F3, 33418 },
+ { 0x05F4, 33421 },
+ { 0x2010, 33424 },
+ { 0x2E1A, 33425 },
+ { 0x2043, 33428 },
+ { 0x2F4F, 33430 },
+ { 0x2F21, 33434 },
+ { 0x2F22, 33437 },
+ { 0x2F7D, 33441 },
+ { 0x2F44, 33444 },
+ { 0x2F24, 33447 },
+ { 0x2F38, 33450 },
+ { 0x2F5C, 33453 },
+ { 0x2F5D, 33456 },
+ { 0x2F02, 33459 },
+ { 0x2F32, 33462 },
+ { 0x2F7F, 33465 },
+ { 0x2FB7, 33468 },
+ { 0x2F6C, 33471 },
+ { 0x2FB6, 33474 },
+ { 0x2F51, 33477 },
+ { 0x2F0E, 33480 },
+ { 0x2F78, 33483 },
+ { 0x2F07, 33486 },
+ { 0x2F08, 33489 },
+ { 0x2F79, 33492 },
+ { 0x2F46, 33495 },
+ { 0x2F7C, 33498 },
+ { 0x2F00, 33501 },
+ { 0x2F97, 33504 },
+ { 0x2F41, 33507 },
+ { 0x2FCF, 33510 },
+ { 0x2F9A, 33513 },
+ { 0x2F9B, 33516 },
+ { 0x2F48, 33519 },
+ { 0x2F92, 33522 },
+ { 0x2F47, 33525 },
+ { 0x2F17, 33528 },
+ { 0x2F06, 33531 },
+ { 0x2F36, 33534 },
+ { 0x2F64, 33538 },
+ { 0x2F96, 33541 },
+ { 0x2FC3, 33544 },
+ { 0x2FAD, 33547 },
+ { 0x2F88, 33550 },
+ { 0x2F9D, 33553 },
+ { 0x2F66, 33556 },
+ { 0x2FBB, 33561 },
+ { 0x2F9E, 33564 },
+ { 0x2F73, 33567 },
+ { 0x2FA2, 33570 },
+ { 0x2F52, 33573 },
+ { 0x2F56, 33576 },
+ { 0x2FC5, 33579 },
+ { 0x2F6B, 33582 },
+ { 0x2F3E, 33585 },
+ { 0x2F0C, 33588 },
+ { 0x2FCE, 33592 },
+ { 0x2FD1, 33595 },
+ { 0x2FAF, 33598 },
+ { 0x2F5B, 33601 },
+ { 0x2F55, 33604 },
+ { 0x2FC2, 33607 },
+ { 0x2F9C, 33610 },
+ { 0x2FCC, 33613 },
+ { 0x2FA8, 33616 },
+ { 0x2FA6, 33619 },
+ { 0x2FBD, 33622 },
+ { 0x2F59, 33625 },
+ { 0x2F3F, 33630 },
+ { 0x2FB8, 33633 },
+ { 0x2FC7, 33636 },
+ { 0x2F05, 33639 },
+ { 0x2F93, 33642 },
+ { 0x2F28, 33645 },
+ { 0x2F5F, 33648 },
+ { 0x2F4B, 33651 },
+ { 0x2F2A, 33654 },
+ { 0x2FB4, 33657 },
+ { 0x2FB2, 33660 },
+ { 0x2F09, 33663 },
+ { 0x2F63, 33666 },
+ { 0x2F01, 33669 },
+ { 0x2FA7, 33672 },
+ { 0x2F35, 33675 },
+ { 0x2F81, 33679 },
+ { 0x2F49, 33682 },
+ { 0x2FD0, 33685 },
+ { 0x2F10, 33688 },
+ { 0x2F7E, 33692 },
+ { 0x2FAC, 33695 },
+ { 0x2F76, 33698 },
+ { 0x2F27, 33701 },
+ { 0x2FC4, 33704 },
+ { 0x2F19, 33707 },
+ { 0x2F83, 33710 },
+ { 0x2F77, 33713 },
+ { 0x2F6A, 33716 },
+ { 0x2F3B, 33719 },
+ { 0x2F4C, 33722 },
+ { 0x2FBC, 33725 },
+ { 0x2F61, 33728 },
+ { 0x2F4A, 33731 },
+ { 0x2FA1, 33734 },
+ { 0x2F8F, 33737 },
+ { 0x2F91, 33741 },
+ { 0x2FB5, 33744 },
+ { 0x2FA3, 33747 },
+ { 0x2F2F, 33750 },
+ { 0x2F13, 33753 },
+ { 0x2F1C, 33756 },
+ { 0x2F6E, 33759 },
+ { 0x2FCA, 33762 },
+ { 0x2F8E, 33765 },
+ { 0x2F80, 33768 },
+ { 0x2F26, 33771 },
+ { 0x2F1A, 33774 },
+ { 0x2F8A, 33777 },
+ { 0x2F0D, 33780 },
+ { 0x2F4D, 33783 },
+ { 0x2F1F, 33786 },
+ { 0x2F0B, 33789 },
+ { 0x2F0A, 33792 },
+ { 0x2F65, 33795 },
+ { 0x2FBE, 33798 },
+ { 0x2FD5, 33801 },
+ { 0x2FC1, 33804 },
+ { 0x2F72, 33807 },
+ { 0x2F8B, 33810 },
+ { 0x2F3C, 33813 },
+ { 0x2FBA, 33816 },
+ { 0x2F11, 33819 },
+ { 0x2F60, 33822 },
+ { 0x2FA9, 33825 },
+ { 0x2F1D, 33828 },
+ { 0x2F12, 33831 },
+ { 0x2F15, 33834 },
+ { 0x2F2E, 33839 },
+ { 0x2F7A, 33842 },
+ { 0x2F99, 33845 },
+ { 0x2F37, 33848 },
+ { 0x2FAB, 33851 },
+ { 0x2F33, 33856 },
+ { 0x2F03, 33860 },
+ { 0x2FAA, 33863 },
+ { 0x2F5A, 33866 },
+ { 0x2F29, 33869 },
+ { 0x2F39, 33872 },
+ { 0x2FB3, 33875 },
+ { 0x2F6D, 33878 },
+ { 0x2F14, 33881 },
+ { 0x2F74, 33884 },
+ { 0x2F53, 33887 },
+ { 0x2F6F, 33890 },
+ { 0x2F62, 33893 },
+ { 0x2F0F, 33896 },
+ { 0x2F8C, 33899 },
+ { 0x2FD2, 33902 },
+ { 0x2F71, 33905 },
+ { 0x2F54, 33908 },
+ { 0x2FC6, 33911 },
+ { 0x2F69, 33914 },
+ { 0x2F25, 33917 },
+ { 0x2FAE, 33920 },
+ { 0x2F84, 33923 },
+ { 0x2F98, 33926 },
+ { 0x2F75, 33929 },
+ { 0x2F9F, 33932 },
+ { 0x2F40, 33935 },
+ { 0x2F2B, 33938 },
+ { 0x2F43, 33941 },
+ { 0x2F68, 33944 },
+ { 0x2F34, 33948 },
+ { 0x2F58, 33952 },
+ { 0x2FD3, 33956 },
+ { 0x2F57, 33959 },
+ { 0x2F16, 33962 },
+ { 0x2F8D, 33966 },
+ { 0x2FC9, 33969 },
+ { 0x2F85, 33972 },
+ { 0x2F87, 33975 },
+ { 0x2F42, 33978 },
+ { 0x2F04, 33981 },
+ { 0x2F94, 33984 },
+ { 0x2F70, 33987 },
+ { 0x2F2C, 33990 },
+ { 0x2F45, 33993 },
+ { 0x2FB1, 33996 },
+ { 0x2F86, 34000 },
+ { 0x2FCD, 34003 },
+ { 0x2F31, 34006 },
+ { 0x2FD4, 34009 },
+ { 0x2F95, 34012 },
+ { 0x2F4E, 34015 },
+ { 0x2FC8, 34018 },
+ { 0x2F3A, 34021 },
+ { 0x2F90, 34024 },
+ { 0x2F50, 34027 },
+ { 0x2F23, 34030 },
+ { 0x2F7B, 34033 },
+ { 0x2F3D, 34036 },
+ { 0x2FB0, 34039 },
+ { 0x2FA0, 34042 },
+ { 0x2F30, 34045 },
+ { 0x2F1B, 34048 },
+ { 0x2F20, 34051 },
+ { 0x2FA5, 34054 },
+ { 0x2FC0, 34057 },
+ { 0x2FB9, 34060 },
+ { 0x2F82, 34063 },
+ { 0x2F2D, 34066 },
+ { 0x2F5E, 34069 },
+ { 0x2F67, 34072 },
+ { 0x2F89, 34075 },
+ { 0x2F1E, 34078 },
+ { 0x2F18, 34081 },
+ { 0x2FCB, 34084 },
+ { 0x2FA4, 34087 },
+ { 0x2FBF, 34090 },
+ { 0x212A, 34094 },
+ { 0x327F, 34096 },
+ { 0x2AAB, 34099 },
+ { 0x2AAD, 34101 },
+ { 0x1C36, 34106 },
+ { 0x1C37, 34109 },
+ { 0x1C41, 34112 },
+ { 0x1C46, 34115 },
+ { 0x1C42, 34118 },
+ { 0x1C45, 34121 },
+ { 0x1C44, 34124 },
+ { 0x1C49, 34127 },
+ { 0x1C40, 34130 },
+ { 0x1C48, 34133 },
+ { 0x1C47, 34136 },
+ { 0x1C43, 34139 },
+ { 0x1C2C, 34142 },
+ { 0x1C27, 34146 },
+ { 0x1C28, 34150 },
+ { 0x1C2A, 34154 },
+ { 0x1C26, 34158 },
+ { 0x1C29, 34162 },
+ { 0x1C2B, 34166 },
+ { 0x1C23, 34170 },
+ { 0x1C13, 34173 },
+ { 0x1C06, 34176 },
+ { 0x1C0C, 34179 },
+ { 0x1C11, 34182 },
+ { 0x1C03, 34185 },
+ { 0x1C1D, 34188 },
+ { 0x1C08, 34191 },
+ { 0x1C00, 34194 },
+ { 0x1C1C, 34197 },
+ { 0x1C15, 34200 },
+ { 0x1C0D, 34203 },
+ { 0x1C0E, 34206 },
+ { 0x1C1B, 34209 },
+ { 0x1C20, 34212 },
+ { 0x1C0A, 34215 },
+ { 0x1C1F, 34218 },
+ { 0x1C22, 34221 },
+ { 0x1C1A, 34224 },
+ { 0x1C14, 34227 },
+ { 0x1C07, 34230 },
+ { 0x1C4F, 34233 },
+ { 0x1C19, 34236 },
+ { 0x1C12, 34239 },
+ { 0x1C04, 34242 },
+ { 0x1C1E, 34245 },
+ { 0x1C02, 34248 },
+ { 0x1C01, 34251 },
+ { 0x1C16, 34254 },
+ { 0x1C05, 34257 },
+ { 0x1C09, 34260 },
+ { 0x1C10, 34263 },
+ { 0x1C0F, 34266 },
+ { 0x1C21, 34269 },
+ { 0x1C0B, 34272 },
+ { 0x1C17, 34275 },
+ { 0x1C4D, 34278 },
+ { 0x1C18, 34281 },
+ { 0x1C4E, 34284 },
+ { 0x1C2D, 34287 },
+ { 0x1C2F, 34291 },
+ { 0x1C2E, 34295 },
+ { 0x1C30, 34299 },
+ { 0x1C31, 34303 },
+ { 0x1C32, 34307 },
+ { 0x1C33, 34311 },
+ { 0x1C35, 34315 },
+ { 0x1C34, 34319 },
+ { 0x1C25, 34323 },
+ { 0x1C24, 34327 },
+ { 0x1C3C, 34331 },
+ { 0x1C3D, 34336 },
+ { 0x1C3B, 34339 },
+ { 0x1C3F, 34342 },
+ { 0x1C3E, 34345 },
+ { 0x7050, 34349 },
+ { 0x7051, 34353 },
+ { 0x7052, 34357 },
+ { 0x7053, 34361 },
+ { 0x7054, 34365 },
+ { 0x7055, 34369 },
+ { 0x7056, 34373 },
+ { 0x7057, 34377 },
+ { 0x7058, 34381 },
+ { 0x7059, 34385 },
+ { 0x705A, 34389 },
+ { 0x705B, 34393 },
+ { 0x705C, 34397 },
+ { 0x705D, 34401 },
+ { 0x7080, 34405 },
+ { 0x7081, 34410 },
+ { 0x7082, 34415 },
+ { 0x7083, 34420 },
+ { 0x708E, 34425 },
+ { 0x708F, 34430 },
+ { 0x7090, 34435 },
+ { 0x7091, 34440 },
+ { 0x7092, 34445 },
+ { 0x7095, 34450 },
+ { 0x7096, 34455 },
+ { 0x7097, 34460 },
+ { 0x709A, 34464 },
+ { 0x709B, 34469 },
+ { 0x709C, 34474 },
+ { 0x709D, 34478 },
+ { 0x709E, 34483 },
+ { 0x709F, 34487 },
+ { 0x70A0, 34491 },
+ { 0x70A1, 34496 },
+ { 0x70A2, 34500 },
+ { 0x70A3, 34504 },
+ { 0x70A5, 34508 },
+ { 0x70A6, 34512 },
+ { 0x70A7, 34516 },
+ { 0x70A8, 34521 },
+ { 0x70A9, 34525 },
+ { 0x70AA, 34529 },
+ { 0x70AB, 34534 },
+ { 0x70AC, 34539 },
+ { 0x70AD, 34543 },
+ { 0x70AE, 34547 },
+ { 0x70AF, 34551 },
+ { 0x70B0, 34555 },
+ { 0x70B1, 34559 },
+ { 0x70B2, 34563 },
+ { 0x70B3, 34567 },
+ { 0x70B4, 34571 },
+ { 0x70B5, 34575 },
+ { 0x70B6, 34580 },
+ { 0x70B7, 34584 },
+ { 0x70B8, 34589 },
+ { 0x70B9, 34593 },
+ { 0x70BA, 34597 },
+ { 0x70BB, 34601 },
+ { 0x70BC, 34605 },
+ { 0x70BD, 34609 },
+ { 0x70BE, 34613 },
+ { 0x70BF, 34617 },
+ { 0x70C0, 34621 },
+ { 0x70C1, 34625 },
+ { 0x70C2, 34629 },
+ { 0x70C3, 34633 },
+ { 0x70C4, 34638 },
+ { 0x70C5, 34643 },
+ { 0x70C6, 34648 },
+ { 0x70C7, 34653 },
+ { 0x70C8, 34658 },
+ { 0x70C9, 34662 },
+ { 0x70CA, 34667 },
+ { 0x70CB, 34671 },
+ { 0x70CC, 34675 },
+ { 0x70CD, 34681 },
+ { 0x70CE, 34686 },
+ { 0x70CF, 34692 },
+ { 0x70D0, 34697 },
+ { 0x70D1, 34701 },
+ { 0x70D3, 34705 },
+ { 0x70D4, 34709 },
+ { 0x70D5, 34713 },
+ { 0x70D6, 34717 },
+ { 0x70D7, 34721 },
+ { 0x70D8, 34725 },
+ { 0x70D9, 34730 },
+ { 0x70DA, 34734 },
+ { 0x70DB, 34738 },
+ { 0x70DC, 34742 },
+ { 0x70DD, 34746 },
+ { 0x7084, 34750 },
+ { 0x7085, 34755 },
+ { 0x7086, 34760 },
+ { 0x7087, 34765 },
+ { 0x7088, 34770 },
+ { 0x7089, 34775 },
+ { 0x708A, 34780 },
+ { 0x708B, 34785 },
+ { 0x708C, 34790 },
+ { 0x708D, 34795 },
+ { 0x70DE, 34800 },
+ { 0x70DF, 34805 },
+ { 0x70E0, 34810 },
+ { 0x70E1, 34815 },
+ { 0x70E2, 34820 },
+ { 0x70E3, 34825 },
+ { 0x70E4, 34830 },
+ { 0x70E5, 34835 },
+ { 0x70E6, 34840 },
+ { 0x70E7, 34845 },
+ { 0x70E8, 34850 },
+ { 0x70E9, 34855 },
+ { 0x70EA, 34860 },
+ { 0x70EB, 34865 },
+ { 0x70EC, 34870 },
+ { 0x70ED, 34875 },
+ { 0x70EE, 34880 },
+ { 0x70EF, 34885 },
+ { 0x70F0, 34890 },
+ { 0x70F1, 34895 },
+ { 0x70F2, 34900 },
+ { 0x70F3, 34905 },
+ { 0x70F4, 34910 },
+ { 0x70F5, 34915 },
+ { 0x70F6, 34920 },
+ { 0x70F7, 34925 },
+ { 0x70F8, 34930 },
+ { 0x70F9, 34935 },
+ { 0x70FA, 34940 },
+ { 0x7093, 34945 },
+ { 0x7094, 34950 },
+ { 0x7098, 34955 },
+ { 0x7099, 34960 },
+ { 0x70A4, 34965 },
+ { 0x70D2, 34970 },
+ { 0x7005, 34975 },
+ { 0x702B, 34980 },
+ { 0x701E, 34985 },
+ { 0x7033, 34990 },
+ { 0x7035, 34995 },
+ { 0x7019, 35000 },
+ { 0x7007, 35005 },
+ { 0x7000, 35010 },
+ { 0x702E, 35015 },
+ { 0x7004, 35020 },
+ { 0x7021, 35025 },
+ { 0x7030, 35030 },
+ { 0x7015, 35035 },
+ { 0x7008, 35040 },
+ { 0x7017, 35045 },
+ { 0x7023, 35050 },
+ { 0x703C, 35055 },
+ { 0x703F, 35060 },
+ { 0x7025, 35065 },
+ { 0x7018, 35070 },
+ { 0x701A, 35075 },
+ { 0x7040, 35080 },
+ { 0x702C, 35085 },
+ { 0x7029, 35090 },
+ { 0x7002, 35095 },
+ { 0x7046, 35100 },
+ { 0x701B, 35105 },
+ { 0x702D, 35110 },
+ { 0x7026, 35115 },
+ { 0x7049, 35120 },
+ { 0x700D, 35125 },
+ { 0x7034, 35130 },
+ { 0x7001, 35135 },
+ { 0x7020, 35140 },
+ { 0x7039, 35145 },
+ { 0x702F, 35150 },
+ { 0x703A, 35155 },
+ { 0x7041, 35160 },
+ { 0x7010, 35165 },
+ { 0x7006, 35170 },
+ { 0x700B, 35175 },
+ { 0x7045, 35180 },
+ { 0x7022, 35185 },
+ { 0x7009, 35190 },
+ { 0x701C, 35195 },
+ { 0x702A, 35200 },
+ { 0x7037, 35205 },
+ { 0x701D, 35210 },
+ { 0x700A, 35215 },
+ { 0x7031, 35220 },
+ { 0x7032, 35225 },
+ { 0x7028, 35230 },
+ { 0x7003, 35235 },
+ { 0x7047, 35240 },
+ { 0x700E, 35245 },
+ { 0x704B, 35250 },
+ { 0x7011, 35255 },
+ { 0x704A, 35260 },
+ { 0x7036, 35265 },
+ { 0x7012, 35270 },
+ { 0x7043, 35275 },
+ { 0x701F, 35280 },
+ { 0x7016, 35285 },
+ { 0x703D, 35290 },
+ { 0x7038, 35295 },
+ { 0x7048, 35300 },
+ { 0x700F, 35305 },
+ { 0x7024, 35310 },
+ { 0x7014, 35315 },
+ { 0x7013, 35320 },
+ { 0x7042, 35325 },
+ { 0x704C, 35330 },
+ { 0x7044, 35335 },
+ { 0x704D, 35340 },
+ { 0x7280, 35345 },
+ { 0x7282, 35348 },
+ { 0x7285, 35351 },
+ { 0x7281, 35354 },
+ { 0x7284, 35357 },
+ { 0x729B, 35360 },
+ { 0x7286, 35363 },
+ { 0x728A, 35366 },
+ { 0x728B, 35369 },
+ { 0x728D, 35372 },
+ { 0x728E, 35375 },
+ { 0x728F, 35378 },
+ { 0x7293, 35381 },
+ { 0x728C, 35384 },
+ { 0x7295, 35387 },
+ { 0x7296, 35390 },
+ { 0x7297, 35393 },
+ { 0x7292, 35396 },
+ { 0x7287, 35399 },
+ { 0x729C, 35402 },
+ { 0x7288, 35405 },
+ { 0x7299, 35408 },
+ { 0x7283, 35411 },
+ { 0x729A, 35414 },
+ { 0x7294, 35417 },
+ { 0x7290, 35420 },
+ { 0x7291, 35423 },
+ { 0x7289, 35426 },
+ { 0x7298, 35429 },
+ { 0x7920, 35432 },
+ { 0x7921, 35435 },
+ { 0x7939, 35438 },
+ { 0x7923, 35441 },
+ { 0x7924, 35444 },
+ { 0x7931, 35447 },
+ { 0x7922, 35450 },
+ { 0x7926, 35453 },
+ { 0x7928, 35456 },
+ { 0x7929, 35459 },
+ { 0x792A, 35462 },
+ { 0x792B, 35465 },
+ { 0x792C, 35468 },
+ { 0x7932, 35471 },
+ { 0x792D, 35474 },
+ { 0x7933, 35477 },
+ { 0x792F, 35480 },
+ { 0x7930, 35483 },
+ { 0x7925, 35486 },
+ { 0x7927, 35489 },
+ { 0x7935, 35492 },
+ { 0x7936, 35495 },
+ { 0x7937, 35498 },
+ { 0x7938, 35501 },
+ { 0x792E, 35504 },
+ { 0x7934, 35507 },
+ { 0x793F, 35510 },
+ { 0x00AF, 35513 },
+ { 0x2774, 35514 },
+ { 0x2768, 35519 },
+ { 0x26AB, 35523 },
+ { 0x2775, 35526 },
+ { 0x2769, 35531 },
+ { 0x2592, 35535 },
+ { 0x26AC, 35537 },
+ { 0x26AA, 35541 },
+ { 0x2759, 35544 },
+ { 0x276A, 35547 },
+ { 0x276B, 35552 },
+ { 0x205F, 35557 },
+ { 0x276C, 35560 },
+ { 0x276D, 35565 },
+ { 0x00B7, 35570 },
+ { 0x22A7, 35572 },
+ { 0x2A0A, 35573 },
+ { 0x202F, 35576 },
+ { 0x26B2, 35579 },
+ { 0x22B2, 35580 },
+ { 0x22B4, 35583 },
+ { 0x2491, 35589 },
+ { 0x0023, 35593 },
+ { 0x2492, 35595 },
+ { 0x2493, 35599 },
+ { 0x249B, 35603 },
+ { 0x2496, 35607 },
+ { 0x2497, 35611 },
+ { 0x2499, 35615 },
+ { 0x2495, 35619 },
+ { 0x249A, 35623 },
+ { 0x2494, 35627 },
+ { 0x2498, 35631 },
+ { 0x2116, 35635 },
+ { 0x6FFC, 35637 },
+ { 0x02DB, 35640 },
+ { 0x2325, 35641 },
+ { 0x6D3E, 35643 },
+ { 0x6D3F, 35646 },
+ { 0x26B4, 35649 },
+ { 0x270F, 35650 },
+ { 0x20A7, 35651 },
+ { 0x2653, 35653 },
+ { 0x210E, 35654 },
+ { 0x210F, 35656 },
+ { 0x3012, 35661 },
+ { 0x3020, 35663 },
+ { 0x2E07, 35666 },
+ { 0x2E0B, 35670 },
+ { 0x2E06, 35672 },
+ { 0x5949, 35675 },
+ { 0x5947, 35679 },
+ { 0x594B, 35683 },
+ { 0x5948, 35687 },
+ { 0x594A, 35691 },
+ { 0x594C, 35695 },
+ { 0x594E, 35699 },
+ { 0x594D, 35703 },
+ { 0x5946, 35707 },
+ { 0x5937, 35710 },
+ { 0x5939, 35713 },
+ { 0x5934, 35716 },
+ { 0x5931, 35719 },
+ { 0x5941, 35722 },
+ { 0x593A, 35725 },
+ { 0x5930, 35728 },
+ { 0x593E, 35731 },
+ { 0x5938, 35734 },
+ { 0x5935, 35737 },
+ { 0x5936, 35740 },
+ { 0x593D, 35743 },
+ { 0x593C, 35746 },
+ { 0x5933, 35749 },
+ { 0x5940, 35752 },
+ { 0x593F, 35755 },
+ { 0x5942, 35758 },
+ { 0x5944, 35761 },
+ { 0x5932, 35764 },
+ { 0x593B, 35767 },
+ { 0x5943, 35770 },
+ { 0x5945, 35773 },
+ { 0x5953, 35776 },
+ { 0x595F, 35778 },
+ { 0x5952, 35781 },
+ { 0x5950, 35785 },
+ { 0x5951, 35789 },
+ { 0x594F, 35793 },
+ { 0x23CE, 35797 },
+ { 0x2930, 35799 },
+ { 0x292B, 35805 },
+ { 0x2644, 35810 },
+ { 0x2696, 35811 },
+ { 0x212F, 35812 },
+ { 0x210A, 35815 },
+ { 0x2113, 35818 },
+ { 0x2134, 35821 },
+ { 0x212C, 35824 },
+ { 0x2130, 35827 },
+ { 0x2131, 35830 },
+ { 0x210B, 35833 },
+ { 0x2110, 35836 },
+ { 0x2112, 35839 },
+ { 0x2133, 35842 },
+ { 0x2118, 35845 },
+ { 0x211B, 35848 },
+ { 0x2314, 35851 },
+ { 0x6E45, 35852 },
+ { 0x201A, 35854 },
+ { 0x2039, 35858 },
+ { 0x203A, 35863 },
+ { 0x201B, 35868 },
+ { 0x33DF, 35872 },
+ { 0x33C6, 35876 },
+ { 0x33C0, 35880 },
+ { 0x33C1, 35883 },
+ { 0x33A7, 35886 },
+ { 0x33A8, 35890 },
+ { 0x33A5, 35895 },
+ { 0x33A1, 35898 },
+ { 0x33DE, 35901 },
+ { 0x33C2, 35905 },
+ { 0x3373, 35907 },
+ { 0x33C3, 35909 },
+ { 0x33C4, 35911 },
+ { 0x33C5, 35913 },
+ { 0x339D, 35915 },
+ { 0x33A4, 35917 },
+ { 0x33A0, 35920 },
+ { 0x33C7, 35923 },
+ { 0x3372, 35925 },
+ { 0x33C8, 35927 },
+ { 0x3397, 35929 },
+ { 0x3377, 35931 },
+ { 0x3379, 35933 },
+ { 0x3378, 35936 },
+ { 0x32CE, 35939 },
+ { 0x3399, 35941 },
+ { 0x3387, 35943 },
+ { 0x33C9, 35945 },
+ { 0x33CA, 35947 },
+ { 0x32CC, 35949 },
+ { 0x33CB, 35951 },
+ { 0x3390, 35953 },
+ { 0x33CC, 35955 },
+ { 0x337A, 35957 },
+ { 0x3384, 35959 },
+ { 0x3385, 35961 },
+ { 0x338F, 35963 },
+ { 0x33CD, 35965 },
+ { 0x3398, 35967 },
+ { 0x339E, 35969 },
+ { 0x33A6, 35971 },
+ { 0x33CE, 35974 },
+ { 0x33A2, 35977 },
+ { 0x33CF, 35980 },
+ { 0x33B8, 35982 },
+ { 0x33BE, 35984 },
+ { 0x33D0, 35986 },
+ { 0x33D1, 35988 },
+ { 0x33D3, 35990 },
+ { 0x3383, 35992 },
+ { 0x3386, 35994 },
+ { 0x33D4, 35996 },
+ { 0x338E, 35999 },
+ { 0x3396, 36001 },
+ { 0x339C, 36003 },
+ { 0x33A3, 36005 },
+ { 0x339F, 36008 },
+ { 0x33B3, 36011 },
+ { 0x3382, 36013 },
+ { 0x338C, 36016 },
+ { 0x338D, 36019 },
+ { 0x3395, 36022 },
+ { 0x339B, 36025 },
+ { 0x33B2, 36028 },
+ { 0x33B6, 36031 },
+ { 0x33BC, 36034 },
+ { 0x33B7, 36037 },
+ { 0x33B9, 36039 },
+ { 0x33BD, 36042 },
+ { 0x33BF, 36044 },
+ { 0x3381, 36047 },
+ { 0x338B, 36049 },
+ { 0x339A, 36051 },
+ { 0x33B1, 36053 },
+ { 0x33B5, 36055 },
+ { 0x33BB, 36057 },
+ { 0x3375, 36059 },
+ { 0x33A9, 36061 },
+ { 0x3380, 36063 },
+ { 0x3376, 36066 },
+ { 0x338A, 36068 },
+ { 0x33D7, 36070 },
+ { 0x33D8, 36072 },
+ { 0x33DA, 36074 },
+ { 0x33B0, 36076 },
+ { 0x33B4, 36078 },
+ { 0x33BA, 36080 },
+ { 0x33DB, 36082 },
+ { 0x33DC, 36084 },
+ { 0x33DD, 36086 },
+ { 0x3374, 36088 },
+ { 0x3388, 36090 },
+ { 0x2293, 36092 },
+ { 0x2294, 36094 },
+ { 0x337E, 36096 },
+ { 0x337B, 36100 },
+ { 0x337C, 36104 },
+ { 0x337D, 36108 },
+ { 0x32CD, 36112 },
+ { 0x33FF, 36114 },
+ { 0x3393, 36116 },
+ { 0x33AC, 36118 },
+ { 0x333F, 36120 },
+ { 0x3371, 36122 },
+ { 0x3391, 36124 },
+ { 0x33AA, 36126 },
+ { 0x33D2, 36128 },
+ { 0x3392, 36130 },
+ { 0x33D5, 36132 },
+ { 0x33D6, 36134 },
+ { 0x33AB, 36136 },
+ { 0x33D9, 36138 },
+ { 0x33AD, 36140 },
+ { 0x33AE, 36142 },
+ { 0x33AF, 36146 },
+ { 0x3394, 36151 },
+ { 0x3327, 36153 },
+ { 0x3306, 36155 },
+ { 0x3303, 36157 },
+ { 0x3331, 36159 },
+ { 0x3325, 36161 },
+ { 0x3326, 36163 },
+ { 0x23CD, 36165 },
+ { 0x3310, 36167 },
+ { 0x3342, 36169 },
+ { 0x3305, 36171 },
+ { 0x3389, 36173 },
+ { 0x3314, 36175 },
+ { 0x2ACD, 36177 },
+ { 0x334B, 36182 },
+ { 0x3349, 36184 },
+ { 0x3328, 36186 },
+ { 0x3309, 36188 },
+ { 0x330A, 36190 },
+ { 0x3337, 36192 },
+ { 0x3330, 36194 },
+ { 0x3355, 36196 },
+ { 0x3352, 36198 },
+ { 0x221A, 36200 },
+ { 0x2B12, 36202 },
+ { 0x25E7, 36207 },
+ { 0x2B15, 36212 },
+ { 0x25EA, 36219 },
+ { 0x25E8, 36226 },
+ { 0x25A7, 36231 },
+ { 0x25E9, 36239 },
+ { 0x25A8, 36246 },
+ { 0x2B14, 36254 },
+ { 0x2B13, 36261 },
+ { 0x25A9, 36266 },
+ { 0x25A5, 36271 },
+ { 0x29E0, 36275 },
+ { 0x25A4, 36279 },
+ { 0x25A6, 36283 },
+ { 0x3350, 36288 },
+ { 0x3302, 36290 },
+ { 0x333C, 36292 },
+ { 0x3324, 36294 },
+ { 0x3308, 36296 },
+ { 0x330F, 36298 },
+ { 0x330E, 36300 },
+ { 0x3311, 36302 },
+ { 0x332A, 36304 },
+ { 0x3341, 36306 },
+ { 0x3335, 36308 },
+ { 0x228F, 36310 },
+ { 0x22E4, 36313 },
+ { 0x2291, 36320 },
+ { 0x330B, 36326 },
+ { 0x331C, 36328 },
+ { 0x331E, 36330 },
+ { 0x3345, 36332 },
+ { 0x3344, 36334 },
+ { 0x3329, 36336 },
+ { 0x332C, 36338 },
+ { 0x333B, 36340 },
+ { 0x333A, 36342 },
+ { 0x3340, 36344 },
+ { 0x2ACE, 36346 },
+ { 0x3353, 36351 },
+ { 0x3322, 36353 },
+ { 0x3323, 36355 },
+ { 0x3357, 36357 },
+ { 0x334E, 36359 },
+ { 0x334F, 36361 },
+ { 0x3300, 36363 },
+ { 0x3301, 36365 },
+ { 0x333E, 36367 },
+ { 0x3318, 36369 },
+ { 0x3339, 36371 },
+ { 0x3333, 36373 },
+ { 0x3304, 36375 },
+ { 0x331D, 36377 },
+ { 0x3312, 36379 },
+ { 0x3346, 36381 },
+ { 0x3338, 36383 },
+ { 0x332F, 36385 },
+ { 0x333D, 36387 },
+ { 0x332D, 36389 },
+ { 0x3313, 36391 },
+ { 0x330C, 36393 },
+ { 0x330D, 36395 },
+ { 0x331B, 36397 },
+ { 0x2311, 36399 },
+ { 0x3343, 36401 },
+ { 0x3347, 36403 },
+ { 0x334D, 36405 },
+ { 0x334C, 36407 },
+ { 0x3348, 36409 },
+ { 0x3351, 36411 },
+ { 0x3354, 36413 },
+ { 0x331F, 36415 },
+ { 0x3321, 36417 },
+ { 0x3334, 36419 },
+ { 0x3307, 36421 },
+ { 0x3332, 36423 },
+ { 0x2290, 36425 },
+ { 0x22E5, 36428 },
+ { 0x2292, 36435 },
+ { 0x332B, 36441 },
+ { 0x3356, 36443 },
+ { 0x3320, 36445 },
+ { 0x3319, 36447 },
+ { 0x3336, 36449 },
+ { 0x3317, 36451 },
+ { 0x331A, 36453 },
+ { 0x334A, 36455 },
+ { 0x332E, 36457 },
+ { 0x3315, 36459 },
+ { 0x337F, 36461 },
+ { 0x3316, 36463 },
+ { 0x2729, 36465 },
+ { 0x2282, 36469 },
+ { 0x2286, 36471 },
+ { 0x2AC3, 36476 },
+ { 0x228A, 36484 },
+ { 0x2ACB, 36490 },
+ { 0x2AC7, 36496 },
+ { 0x2AC9, 36501 },
+ { 0x2AC5, 36507 },
+ { 0x2ABD, 36512 },
+ { 0x2ABF, 36515 },
+ { 0x2AC1, 36520 },
+ { 0x2AD5, 36525 },
+ { 0x2AD3, 36528 },
+ { 0x2979, 36531 },
+ { 0x5806, 36535 },
+ { 0x580B, 36539 },
+ { 0x5802, 36543 },
+ { 0x5823, 36547 },
+ { 0x5826, 36552 },
+ { 0x5824, 36557 },
+ { 0x5825, 36562 },
+ { 0x5827, 36567 },
+ { 0x5800, 36572 },
+ { 0x5804, 36576 },
+ { 0x5801, 36580 },
+ { 0x5805, 36584 },
+ { 0x5803, 36588 },
+ { 0x581B, 36592 },
+ { 0x580C, 36596 },
+ { 0x5816, 36600 },
+ { 0x5809, 36604 },
+ { 0x5822, 36608 },
+ { 0x580E, 36612 },
+ { 0x5807, 36616 },
+ { 0x581F, 36620 },
+ { 0x581D, 36624 },
+ { 0x5818, 36628 },
+ { 0x5819, 36632 },
+ { 0x581E, 36636 },
+ { 0x5821, 36640 },
+ { 0x5814, 36644 },
+ { 0x581C, 36648 },
+ { 0x580D, 36652 },
+ { 0x5812, 36656 },
+ { 0x5817, 36660 },
+ { 0x580A, 36664 },
+ { 0x580F, 36668 },
+ { 0x5808, 36672 },
+ { 0x581A, 36676 },
+ { 0x5820, 36680 },
+ { 0x5815, 36684 },
+ { 0x5810, 36688 },
+ { 0x5813, 36692 },
+ { 0x5811, 36696 },
+ { 0x5828, 36700 },
+ { 0x5829, 36704 },
+ { 0x582A, 36708 },
+ { 0x582B, 36712 },
+ { 0x2403, 36716 },
+ { 0x2419, 36721 },
+ { 0x2404, 36726 },
+ { 0x2417, 36731 },
+ { 0x2407, 36737 },
+ { 0x2410, 36740 },
+ { 0x241C, 36745 },
+ { 0x240C, 36749 },
+ { 0x240A, 36753 },
+ { 0x2400, 36757 },
+ { 0x241F, 36760 },
+ { 0x241D, 36764 },
+ { 0x240F, 36768 },
+ { 0x240E, 36772 },
+ { 0x2420, 36776 },
+ { 0x2402, 36779 },
+ { 0x2401, 36784 },
+ { 0x2418, 36789 },
+ { 0x2421, 36792 },
+ { 0x2425, 36795 },
+ { 0x2411, 36800 },
+ { 0x2412, 36805 },
+ { 0x2414, 36810 },
+ { 0x2413, 36815 },
+ { 0x241B, 36820 },
+ { 0x241E, 36823 },
+ { 0x2405, 36827 },
+ { 0x2424, 36830 },
+ { 0x240D, 36833 },
+ { 0x2415, 36837 },
+ { 0x240B, 36841 },
+ { 0x2408, 36845 },
+ { 0x214F, 36848 },
+ { 0x2409, 36852 },
+ { 0x241A, 36856 },
+ { 0x2426, 36859 },
+ { 0x2406, 36864 },
+ { 0x2416, 36867 },
+ { 0x0700, 36871 },
+ { 0x0743, 36875 },
+ { 0x0744, 36880 },
+ { 0x0706, 36885 },
+ { 0x0707, 36889 },
+ { 0x073D, 36893 },
+ { 0x073E, 36896 },
+ { 0x073A, 36899 },
+ { 0x073B, 36902 },
+ { 0x0749, 36905 },
+ { 0x0736, 36907 },
+ { 0x0737, 36910 },
+ { 0x073F, 36913 },
+ { 0x0745, 36915 },
+ { 0x0746, 36919 },
+ { 0x0739, 36923 },
+ { 0x0738, 36927 },
+ { 0x0725, 36931 },
+ { 0x0717, 36934 },
+ { 0x0726, 36937 },
+ { 0x0721, 36940 },
+ { 0x0722, 36943 },
+ { 0x072C, 36946 },
+ { 0x0718, 36949 },
+ { 0x0712, 36952 },
+ { 0x071A, 36955 },
+ { 0x071F, 36958 },
+ { 0x0729, 36961 },
+ { 0x072A, 36964 },
+ { 0x072B, 36967 },
+ { 0x071B, 36970 },
+ { 0x071C, 36973 },
+ { 0x071D, 36977 },
+ { 0x071E, 36980 },
+ { 0x0719, 36984 },
+ { 0x0710, 36987 },
+ { 0x0724, 36990 },
+ { 0x0713, 36994 },
+ { 0x0714, 36997 },
+ { 0x0728, 37001 },
+ { 0x0715, 37004 },
+ { 0x0720, 37007 },
+ { 0x0716, 37010 },
+ { 0x072D, 37015 },
+ { 0x072E, 37019 },
+ { 0x072F, 37023 },
+ { 0x0723, 37027 },
+ { 0x074F, 37030 },
+ { 0x074E, 37034 },
+ { 0x074D, 37038 },
+ { 0x0727, 37042 },
+ { 0x0711, 37046 },
+ { 0x0730, 37050 },
+ { 0x0731, 37053 },
+ { 0x0732, 37056 },
+ { 0x0733, 37059 },
+ { 0x0734, 37062 },
+ { 0x0735, 37065 },
+ { 0x074A, 37068 },
+ { 0x0747, 37070 },
+ { 0x0748, 37074 },
+ { 0x0740, 37078 },
+ { 0x070B, 37081 },
+ { 0x070C, 37084 },
+ { 0x070D, 37087 },
+ { 0x0742, 37090 },
+ { 0x0741, 37092 },
+ { 0x0702, 37094 },
+ { 0x0704, 37098 },
+ { 0x0709, 37101 },
+ { 0x0705, 37106 },
+ { 0x070A, 37109 },
+ { 0x073C, 37111 },
+ { 0x0701, 37114 },
+ { 0x0703, 37118 },
+ { 0x0708, 37121 },
+ { 0x070F, 37126 },
+ { 0x2649, 37129 },
+ { 0x0C56, 37130 },
+ { 0x0C7F, 37134 },
+ { 0x0C4D, 37137 },
+ { 0x0C03, 37140 },
+ { 0x0C02, 37143 },
+ { 0x0C3D, 37146 },
+ { 0x0C01, 37149 },
+ { 0x0C67, 37152 },
+ { 0x0C6C, 37155 },
+ { 0x0C68, 37158 },
+ { 0x0C6B, 37161 },
+ { 0x0C6A, 37164 },
+ { 0x0C6F, 37167 },
+ { 0x0C66, 37170 },
+ { 0x0C6E, 37173 },
+ { 0x0C6D, 37176 },
+ { 0x0C69, 37179 },
+ { 0x0C46, 37182 },
+ { 0x0C3F, 37186 },
+ { 0x0C4A, 37190 },
+ { 0x0C41, 37194 },
+ { 0x0C3E, 37198 },
+ { 0x0C48, 37202 },
+ { 0x0C4C, 37206 },
+ { 0x0C47, 37210 },
+ { 0x0C40, 37214 },
+ { 0x0C4B, 37218 },
+ { 0x0C42, 37222 },
+ { 0x0C62, 37226 },
+ { 0x0C43, 37231 },
+ { 0x0C63, 37236 },
+ { 0x0C44, 37241 },
+ { 0x0C55, 37246 },
+ { 0x0C05, 37249 },
+ { 0x0C0E, 37252 },
+ { 0x0C07, 37255 },
+ { 0x0C12, 37258 },
+ { 0x0C09, 37261 },
+ { 0x0C06, 37264 },
+ { 0x0C10, 37267 },
+ { 0x0C14, 37270 },
+ { 0x0C2C, 37273 },
+ { 0x0C1A, 37276 },
+ { 0x0C26, 37279 },
+ { 0x0C0F, 37282 },
+ { 0x0C17, 37285 },
+ { 0x0C39, 37288 },
+ { 0x0C08, 37291 },
+ { 0x0C1C, 37294 },
+ { 0x0C15, 37297 },
+ { 0x0C32, 37300 },
+ { 0x0C2E, 37303 },
+ { 0x0C28, 37306 },
+ { 0x0C13, 37309 },
+ { 0x0C2A, 37312 },
+ { 0x0C30, 37315 },
+ { 0x0C38, 37318 },
+ { 0x0C24, 37321 },
+ { 0x0C0A, 37324 },
+ { 0x0C35, 37327 },
+ { 0x0C2F, 37330 },
+ { 0x0C2D, 37333 },
+ { 0x0C1B, 37336 },
+ { 0x0C21, 37339 },
+ { 0x0C27, 37342 },
+ { 0x0C59, 37345 },
+ { 0x0C18, 37348 },
+ { 0x0C1D, 37351 },
+ { 0x0C16, 37354 },
+ { 0x0C33, 37357 },
+ { 0x0C19, 37360 },
+ { 0x0C23, 37363 },
+ { 0x0C1E, 37366 },
+ { 0x0C2B, 37369 },
+ { 0x0C31, 37372 },
+ { 0x0C36, 37375 },
+ { 0x0C37, 37378 },
+ { 0x0C25, 37381 },
+ { 0x0C58, 37384 },
+ { 0x0C1F, 37387 },
+ { 0x0C22, 37390 },
+ { 0x0C20, 37393 },
+ { 0x0C0C, 37396 },
+ { 0x0C0B, 37400 },
+ { 0x0C61, 37404 },
+ { 0x0C60, 37408 },
+ { 0x0C79, 37412 },
+ { 0x0C7C, 37421 },
+ { 0x0C7A, 37430 },
+ { 0x0C7D, 37439 },
+ { 0x0C78, 37448 },
+ { 0x0C7B, 37457 },
+ { 0x0C7E, 37466 },
+ { 0x07B0, 37475 },
+ { 0x07A0, 37477 },
+ { 0x07A1, 37480 },
+ { 0x0784, 37483 },
+ { 0x0780, 37486 },
+ { 0x07B1, 37489 },
+ { 0x0783, 37492 },
+ { 0x0794, 37495 },
+ { 0x079C, 37498 },
+ { 0x07A2, 37501 },
+ { 0x0799, 37504 },
+ { 0x079A, 37507 },
+ { 0x078C, 37510 },
+ { 0x0798, 37513 },
+ { 0x0787, 37516 },
+ { 0x078A, 37519 },
+ { 0x078E, 37522 },
+ { 0x0786, 37525 },
+ { 0x078D, 37528 },
+ { 0x0789, 37531 },
+ { 0x0782, 37534 },
+ { 0x07A4, 37537 },
+ { 0x0790, 37540 },
+ { 0x0788, 37543 },
+ { 0x07A5, 37546 },
+ { 0x079F, 37549 },
+ { 0x078B, 37552 },
+ { 0x07A3, 37555 },
+ { 0x079E, 37558 },
+ { 0x079D, 37561 },
+ { 0x079B, 37564 },
+ { 0x0791, 37567 },
+ { 0x0796, 37570 },
+ { 0x0795, 37573 },
+ { 0x0793, 37576 },
+ { 0x0792, 37579 },
+ { 0x0797, 37582 },
+ { 0x078F, 37585 },
+ { 0x0785, 37588 },
+ { 0x0781, 37591 },
+ { 0x07A6, 37594 },
+ { 0x07AC, 37596 },
+ { 0x07A8, 37598 },
+ { 0x07AE, 37600 },
+ { 0x07AA, 37602 },
+ { 0x07A7, 37604 },
+ { 0x07A9, 37606 },
+ { 0x07AD, 37608 },
+ { 0x07AF, 37610 },
+ { 0x07AB, 37612 },
+ { 0x29FB, 37614 },
+ { 0x2AF6, 37616 },
+ { 0x2034, 37619 },
+ { 0x224B, 37621 },
+ { 0x2AF7, 37623 },
+ { 0x2AF8, 37626 },
+ { 0x2AFB, 37629 },
+ { 0x222D, 37633 },
+ { 0x2AF5, 37635 },
+ { 0x22AA, 37641 },
+ { 0x2AF4, 37646 },
+ { 0x2980, 37651 },
+ { 0x2A68, 37655 },
+ { 0x2A69, 37662 },
+ { 0x20AE, 37669 },
+ { 0x2319, 37671 },
+ { 0x29A2, 37674 },
+ { 0x2129, 37676 },
+ { 0x214E, 37681 },
+ { 0x2132, 37684 },
+ { 0x214B, 37687 },
+ { 0x2141, 37689 },
+ { 0x2142, 37693 },
+ { 0x2144, 37697 },
+ { 0x2739, 37701 },
+ { 0x2645, 37705 },
+ { 0x2A2F, 37706 },
+ { 0x2230, 37710 },
+ { 0x00BD, 37712 },
+ { 0x2155, 37716 },
+ { 0x2159, 37720 },
+ { 0x2153, 37724 },
+ { 0x215B, 37728 },
+ { 0x00BC, 37732 },
+ { 0x2156, 37736 },
+ { 0x2154, 37740 },
+ { 0x215A, 37744 },
+ { 0x215D, 37748 },
+ { 0x2158, 37752 },
+ { 0x215E, 37756 },
+ { 0x2157, 37760 },
+ { 0x215C, 37764 },
+ { 0x00BE, 37768 },
+ { 0x2240, 37772 },
+ { 0x2100, 37774 },
+ { 0x060B, 37776 },
+ { 0x2697, 37778 },
+ { 0x20B3, 37779 },
+ { 0x2235, 37781 },
+ { 0x09D7, 37782 },
+ { 0x09BC, 37786 },
+ { 0x09CD, 37789 },
+ { 0x0983, 37792 },
+ { 0x0982, 37795 },
+ { 0x09BD, 37798 },
+ { 0x0981, 37801 },
+ { 0x09E7, 37804 },
+ { 0x09EC, 37807 },
+ { 0x09E8, 37810 },
+ { 0x09EB, 37813 },
+ { 0x09EA, 37816 },
+ { 0x09EF, 37819 },
+ { 0x09E6, 37822 },
+ { 0x09EE, 37825 },
+ { 0x09ED, 37828 },
+ { 0x09E9, 37831 },
+ { 0x09F2, 37834 },
+ { 0x09F3, 37837 },
+ { 0x09C7, 37840 },
+ { 0x09BF, 37844 },
+ { 0x09CB, 37848 },
+ { 0x09C1, 37852 },
+ { 0x09BE, 37856 },
+ { 0x09C8, 37860 },
+ { 0x09CC, 37864 },
+ { 0x09C0, 37868 },
+ { 0x09C2, 37872 },
+ { 0x09E2, 37876 },
+ { 0x09C3, 37881 },
+ { 0x09E3, 37886 },
+ { 0x09C4, 37891 },
+ { 0x09FA, 37896 },
+ { 0x0985, 37898 },
+ { 0x098F, 37901 },
+ { 0x0987, 37904 },
+ { 0x0993, 37907 },
+ { 0x0989, 37910 },
+ { 0x0986, 37913 },
+ { 0x0990, 37916 },
+ { 0x0994, 37919 },
+ { 0x09AC, 37922 },
+ { 0x099A, 37925 },
+ { 0x09A6, 37928 },
+ { 0x0997, 37931 },
+ { 0x09B9, 37934 },
+ { 0x0988, 37937 },
+ { 0x099C, 37940 },
+ { 0x0995, 37943 },
+ { 0x09B2, 37946 },
+ { 0x09AE, 37949 },
+ { 0x09A8, 37952 },
+ { 0x09AA, 37955 },
+ { 0x09B0, 37958 },
+ { 0x09F1, 37961 },
+ { 0x09F0, 37967 },
+ { 0x09B8, 37973 },
+ { 0x09A4, 37976 },
+ { 0x098A, 37979 },
+ { 0x09AF, 37982 },
+ { 0x09AD, 37985 },
+ { 0x099B, 37988 },
+ { 0x09A1, 37991 },
+ { 0x09A7, 37994 },
+ { 0x0998, 37997 },
+ { 0x099D, 38000 },
+ { 0x0996, 38003 },
+ { 0x0999, 38006 },
+ { 0x09A3, 38009 },
+ { 0x099E, 38012 },
+ { 0x09AB, 38015 },
+ { 0x09DD, 38018 },
+ { 0x09DC, 38021 },
+ { 0x09B6, 38024 },
+ { 0x09B7, 38027 },
+ { 0x09A5, 38030 },
+ { 0x099F, 38033 },
+ { 0x09DF, 38036 },
+ { 0x09A2, 38039 },
+ { 0x09A0, 38042 },
+ { 0x09CE, 38045 },
+ { 0x098C, 38049 },
+ { 0x098B, 38053 },
+ { 0x09E1, 38057 },
+ { 0x09E0, 38061 },
+ { 0x09F4, 38065 },
+ { 0x09F8, 38069 },
+ { 0x09F5, 38077 },
+ { 0x09F7, 38081 },
+ { 0x09F6, 38085 },
+ { 0x09F9, 38089 },
+ { 0x232C, 38093 },
+ { 0x23E3, 38095 },
+ { 0x226C, 38099 },
+ { 0x2800, 38100 },
+ { 0x2801, 38103 },
+ { 0x2802, 38106 },
+ { 0x2804, 38109 },
+ { 0x2808, 38112 },
+ { 0x2810, 38115 },
+ { 0x2820, 38118 },
+ { 0x2840, 38121 },
+ { 0x2880, 38124 },
+ { 0x2803, 38127 },
+ { 0x2805, 38130 },
+ { 0x2809, 38133 },
+ { 0x2811, 38136 },
+ { 0x2821, 38139 },
+ { 0x2841, 38142 },
+ { 0x2881, 38145 },
+ { 0x2806, 38148 },
+ { 0x280A, 38151 },
+ { 0x2812, 38154 },
+ { 0x2822, 38157 },
+ { 0x2842, 38160 },
+ { 0x2882, 38163 },
+ { 0x280C, 38166 },
+ { 0x2814, 38169 },
+ { 0x2824, 38172 },
+ { 0x2844, 38175 },
+ { 0x2884, 38178 },
+ { 0x2818, 38181 },
+ { 0x2828, 38184 },
+ { 0x2848, 38187 },
+ { 0x2888, 38190 },
+ { 0x2830, 38193 },
+ { 0x2850, 38196 },
+ { 0x2890, 38199 },
+ { 0x2860, 38202 },
+ { 0x28A0, 38205 },
+ { 0x28C0, 38208 },
+ { 0x2807, 38211 },
+ { 0x280B, 38214 },
+ { 0x2813, 38217 },
+ { 0x2823, 38220 },
+ { 0x2843, 38223 },
+ { 0x2883, 38226 },
+ { 0x280D, 38229 },
+ { 0x2815, 38232 },
+ { 0x2825, 38235 },
+ { 0x2845, 38238 },
+ { 0x2885, 38241 },
+ { 0x2819, 38244 },
+ { 0x2829, 38247 },
+ { 0x2849, 38250 },
+ { 0x2889, 38253 },
+ { 0x2831, 38256 },
+ { 0x2851, 38259 },
+ { 0x2891, 38262 },
+ { 0x2861, 38265 },
+ { 0x28A1, 38268 },
+ { 0x28C1, 38271 },
+ { 0x280E, 38274 },
+ { 0x2816, 38277 },
+ { 0x2826, 38280 },
+ { 0x2846, 38283 },
+ { 0x2886, 38286 },
+ { 0x281A, 38289 },
+ { 0x282A, 38292 },
+ { 0x284A, 38295 },
+ { 0x288A, 38298 },
+ { 0x2832, 38301 },
+ { 0x2852, 38304 },
+ { 0x2892, 38307 },
+ { 0x2862, 38310 },
+ { 0x28A2, 38313 },
+ { 0x28C2, 38316 },
+ { 0x281C, 38319 },
+ { 0x282C, 38322 },
+ { 0x284C, 38325 },
+ { 0x288C, 38328 },
+ { 0x2834, 38331 },
+ { 0x2854, 38334 },
+ { 0x2894, 38337 },
+ { 0x2864, 38340 },
+ { 0x28A4, 38343 },
+ { 0x28C4, 38346 },
+ { 0x2838, 38349 },
+ { 0x2858, 38352 },
+ { 0x2898, 38355 },
+ { 0x2868, 38358 },
+ { 0x28A8, 38361 },
+ { 0x28C8, 38364 },
+ { 0x2870, 38367 },
+ { 0x28B0, 38370 },
+ { 0x28D0, 38373 },
+ { 0x28E0, 38376 },
+ { 0x280F, 38379 },
+ { 0x2817, 38382 },
+ { 0x2827, 38385 },
+ { 0x2847, 38388 },
+ { 0x2887, 38391 },
+ { 0x281B, 38394 },
+ { 0x282B, 38397 },
+ { 0x284B, 38400 },
+ { 0x288B, 38403 },
+ { 0x2833, 38406 },
+ { 0x2853, 38409 },
+ { 0x2893, 38412 },
+ { 0x2863, 38415 },
+ { 0x28A3, 38418 },
+ { 0x28C3, 38421 },
+ { 0x281D, 38424 },
+ { 0x282D, 38427 },
+ { 0x284D, 38430 },
+ { 0x288D, 38433 },
+ { 0x2835, 38436 },
+ { 0x2855, 38439 },
+ { 0x2895, 38442 },
+ { 0x2865, 38445 },
+ { 0x28A5, 38448 },
+ { 0x28C5, 38451 },
+ { 0x2839, 38454 },
+ { 0x2859, 38457 },
+ { 0x2899, 38460 },
+ { 0x2869, 38463 },
+ { 0x28A9, 38466 },
+ { 0x28C9, 38469 },
+ { 0x2871, 38472 },
+ { 0x28B1, 38475 },
+ { 0x28D1, 38478 },
+ { 0x28E1, 38481 },
+ { 0x281E, 38484 },
+ { 0x282E, 38487 },
+ { 0x284E, 38490 },
+ { 0x288E, 38493 },
+ { 0x2836, 38496 },
+ { 0x2856, 38499 },
+ { 0x2896, 38502 },
+ { 0x2866, 38505 },
+ { 0x28A6, 38508 },
+ { 0x28C6, 38511 },
+ { 0x283A, 38514 },
+ { 0x285A, 38517 },
+ { 0x289A, 38520 },
+ { 0x286A, 38523 },
+ { 0x28AA, 38526 },
+ { 0x28CA, 38529 },
+ { 0x2872, 38532 },
+ { 0x28B2, 38535 },
+ { 0x28D2, 38538 },
+ { 0x28E2, 38541 },
+ { 0x283C, 38544 },
+ { 0x285C, 38547 },
+ { 0x289C, 38550 },
+ { 0x286C, 38553 },
+ { 0x28AC, 38556 },
+ { 0x28CC, 38559 },
+ { 0x2874, 38562 },
+ { 0x28B4, 38565 },
+ { 0x28D4, 38568 },
+ { 0x28E4, 38571 },
+ { 0x2878, 38574 },
+ { 0x28B8, 38577 },
+ { 0x28D8, 38580 },
+ { 0x28E8, 38583 },
+ { 0x28F0, 38586 },
+ { 0x281F, 38589 },
+ { 0x282F, 38592 },
+ { 0x284F, 38595 },
+ { 0x288F, 38598 },
+ { 0x2837, 38601 },
+ { 0x2857, 38604 },
+ { 0x2897, 38607 },
+ { 0x2867, 38610 },
+ { 0x28A7, 38613 },
+ { 0x28C7, 38616 },
+ { 0x283B, 38619 },
+ { 0x285B, 38622 },
+ { 0x289B, 38625 },
+ { 0x286B, 38628 },
+ { 0x28AB, 38631 },
+ { 0x28CB, 38634 },
+ { 0x2873, 38637 },
+ { 0x28B3, 38640 },
+ { 0x28D3, 38643 },
+ { 0x28E3, 38646 },
+ { 0x283D, 38649 },
+ { 0x285D, 38652 },
+ { 0x289D, 38655 },
+ { 0x286D, 38658 },
+ { 0x28AD, 38661 },
+ { 0x28CD, 38664 },
+ { 0x2875, 38667 },
+ { 0x28B5, 38670 },
+ { 0x28D5, 38673 },
+ { 0x28E5, 38676 },
+ { 0x2879, 38679 },
+ { 0x28B9, 38682 },
+ { 0x28D9, 38685 },
+ { 0x28E9, 38688 },
+ { 0x28F1, 38691 },
+ { 0x283E, 38694 },
+ { 0x285E, 38697 },
+ { 0x289E, 38700 },
+ { 0x286E, 38703 },
+ { 0x28AE, 38706 },
+ { 0x28CE, 38709 },
+ { 0x2876, 38712 },
+ { 0x28B6, 38715 },
+ { 0x28D6, 38718 },
+ { 0x28E6, 38721 },
+ { 0x287A, 38724 },
+ { 0x28BA, 38727 },
+ { 0x28DA, 38730 },
+ { 0x28EA, 38733 },
+ { 0x28F2, 38736 },
+ { 0x287C, 38739 },
+ { 0x28BC, 38742 },
+ { 0x28DC, 38745 },
+ { 0x28EC, 38748 },
+ { 0x28F4, 38751 },
+ { 0x28F8, 38754 },
+ { 0x283F, 38757 },
+ { 0x285F, 38760 },
+ { 0x289F, 38763 },
+ { 0x286F, 38766 },
+ { 0x28AF, 38769 },
+ { 0x28CF, 38772 },
+ { 0x2877, 38775 },
+ { 0x28B7, 38778 },
+ { 0x28D7, 38781 },
+ { 0x28E7, 38784 },
+ { 0x287B, 38787 },
+ { 0x28BB, 38790 },
+ { 0x28DB, 38793 },
+ { 0x28EB, 38796 },
+ { 0x28F3, 38799 },
+ { 0x287D, 38802 },
+ { 0x28BD, 38805 },
+ { 0x28DD, 38808 },
+ { 0x28ED, 38811 },
+ { 0x28F5, 38814 },
+ { 0x28F9, 38817 },
+ { 0x287E, 38820 },
+ { 0x28BE, 38823 },
+ { 0x28DE, 38826 },
+ { 0x28EE, 38829 },
+ { 0x28F6, 38832 },
+ { 0x28FA, 38835 },
+ { 0x28FC, 38838 },
+ { 0x287F, 38841 },
+ { 0x28BF, 38844 },
+ { 0x28DF, 38847 },
+ { 0x28EF, 38850 },
+ { 0x28F7, 38853 },
+ { 0x28FB, 38856 },
+ { 0x28FD, 38859 },
+ { 0x28FE, 38862 },
+ { 0x28FF, 38865 },
+ { 0x2621, 38868 },
+ { 0x00B8, 38870 },
+ { 0x2299, 38871 },
+ { 0x229D, 38874 },
+ { 0x2742, 38876 },
+ { 0x2295, 38882 },
+ { 0x229A, 38884 },
+ { 0x2460, 38887 },
+ { 0x2465, 38890 },
+ { 0x2461, 38893 },
+ { 0x2464, 38896 },
+ { 0x2463, 38899 },
+ { 0x2468, 38902 },
+ { 0x24EA, 38905 },
+ { 0x2467, 38908 },
+ { 0x2466, 38911 },
+ { 0x2462, 38914 },
+ { 0x27B2, 38917 },
+ { 0x24D0, 38922 },
+ { 0x24D1, 38927 },
+ { 0x24D2, 38932 },
+ { 0x24D3, 38937 },
+ { 0x24D4, 38942 },
+ { 0x24D5, 38947 },
+ { 0x24D6, 38952 },
+ { 0x24D7, 38957 },
+ { 0x24D8, 38962 },
+ { 0x24D9, 38967 },
+ { 0x24DA, 38972 },
+ { 0x24DB, 38977 },
+ { 0x24DC, 38982 },
+ { 0x24DD, 38987 },
+ { 0x24DE, 38992 },
+ { 0x24DF, 38997 },
+ { 0x24E0, 39002 },
+ { 0x24E1, 39007 },
+ { 0x24E2, 39012 },
+ { 0x24E3, 39017 },
+ { 0x24E4, 39022 },
+ { 0x24E5, 39027 },
+ { 0x24E6, 39032 },
+ { 0x24E7, 39037 },
+ { 0x24E8, 39042 },
+ { 0x24E9, 39047 },
+ { 0x24B6, 39052 },
+ { 0x24B7, 39057 },
+ { 0x24B8, 39062 },
+ { 0x24B9, 39067 },
+ { 0x24BA, 39072 },
+ { 0x24BB, 39077 },
+ { 0x24BC, 39082 },
+ { 0x24BD, 39087 },
+ { 0x24BE, 39092 },
+ { 0x24BF, 39097 },
+ { 0x24C0, 39102 },
+ { 0x24C1, 39107 },
+ { 0x24C2, 39112 },
+ { 0x24C3, 39117 },
+ { 0x24C4, 39122 },
+ { 0x24C5, 39127 },
+ { 0x24C6, 39132 },
+ { 0x24C7, 39137 },
+ { 0x24C8, 39142 },
+ { 0x24C9, 39147 },
+ { 0x24CA, 39152 },
+ { 0x24CB, 39157 },
+ { 0x24CC, 39162 },
+ { 0x24CD, 39167 },
+ { 0x24CE, 39172 },
+ { 0x24CF, 39177 },
+ { 0x2296, 39182 },
+ { 0x2297, 39184 },
+ { 0x272A, 39186 },
+ { 0x29BE, 39189 },
+ { 0x29BF, 39192 },
+ { 0x229C, 39194 },
+ { 0x3266, 39196 },
+ { 0x3274, 39199 },
+ { 0x3268, 39203 },
+ { 0x3276, 39206 },
+ { 0x326D, 39210 },
+ { 0x327B, 39213 },
+ { 0x3267, 39217 },
+ { 0x3275, 39220 },
+ { 0x327E, 39224 },
+ { 0x3264, 39228 },
+ { 0x3272, 39231 },
+ { 0x3261, 39235 },
+ { 0x326F, 39238 },
+ { 0x3265, 39242 },
+ { 0x3273, 39245 },
+ { 0x3263, 39249 },
+ { 0x3271, 39252 },
+ { 0x3260, 39256 },
+ { 0x326E, 39259 },
+ { 0x3262, 39263 },
+ { 0x3270, 39266 },
+ { 0x3269, 39270 },
+ { 0x3277, 39273 },
+ { 0x326A, 39277 },
+ { 0x3278, 39280 },
+ { 0x326C, 39284 },
+ { 0x327A, 39287 },
+ { 0x326B, 39291 },
+ { 0x3279, 39294 },
+ { 0x327D, 39298 },
+ { 0x327C, 39302 },
+ { 0x2469, 39306 },
+ { 0x32BF, 39309 },
+ { 0x32B5, 39312 },
+ { 0x32B6, 39315 },
+ { 0x32BB, 39319 },
+ { 0x32B7, 39323 },
+ { 0x32BA, 39327 },
+ { 0x32B9, 39331 },
+ { 0x32BE, 39335 },
+ { 0x32BD, 39339 },
+ { 0x32BC, 39343 },
+ { 0x32B8, 39347 },
+ { 0x246A, 39351 },
+ { 0x325A, 39354 },
+ { 0x325B, 39357 },
+ { 0x32B1, 39361 },
+ { 0x325C, 39365 },
+ { 0x325F, 39369 },
+ { 0x325E, 39373 },
+ { 0x32B4, 39377 },
+ { 0x32B3, 39381 },
+ { 0x32B2, 39385 },
+ { 0x325D, 39389 },
+ { 0x246B, 39393 },
+ { 0x2473, 39396 },
+ { 0x3251, 39399 },
+ { 0x3256, 39403 },
+ { 0x3252, 39407 },
+ { 0x3255, 39411 },
+ { 0x3254, 39415 },
+ { 0x3259, 39419 },
+ { 0x3258, 39423 },
+ { 0x3257, 39427 },
+ { 0x3253, 39431 },
+ { 0x246E, 39435 },
+ { 0x246F, 39438 },
+ { 0x2471, 39441 },
+ { 0x246D, 39444 },
+ { 0x2472, 39447 },
+ { 0x246C, 39450 },
+ { 0x2470, 39453 },
+ { 0x3036, 39456 },
+ { 0x29B8, 39459 },
+ { 0x229B, 39462 },
+ { 0x2A38, 39465 },
+ { 0x2298, 39468 },
+ { 0x32D0, 39471 },
+ { 0x32D3, 39474 },
+ { 0x32D1, 39477 },
+ { 0x32D4, 39480 },
+ { 0x32D2, 39483 },
+ { 0x32E9, 39486 },
+ { 0x32EC, 39489 },
+ { 0x32EA, 39492 },
+ { 0x32ED, 39495 },
+ { 0x32EB, 39498 },
+ { 0x32D5, 39501 },
+ { 0x32D8, 39504 },
+ { 0x32D6, 39507 },
+ { 0x32D9, 39510 },
+ { 0x32D7, 39513 },
+ { 0x32EE, 39516 },
+ { 0x32F1, 39519 },
+ { 0x32EF, 39522 },
+ { 0x32F2, 39525 },
+ { 0x32F0, 39528 },
+ { 0x32E4, 39531 },
+ { 0x32E7, 39534 },
+ { 0x32E5, 39537 },
+ { 0x32E8, 39540 },
+ { 0x32E6, 39543 },
+ { 0x32F6, 39546 },
+ { 0x32F9, 39549 },
+ { 0x32F7, 39552 },
+ { 0x32FA, 39555 },
+ { 0x32F8, 39558 },
+ { 0x32DA, 39561 },
+ { 0x32DD, 39564 },
+ { 0x32DB, 39567 },
+ { 0x32DE, 39570 },
+ { 0x32DC, 39573 },
+ { 0x32DF, 39576 },
+ { 0x32E2, 39579 },
+ { 0x32E0, 39582 },
+ { 0x32E3, 39585 },
+ { 0x32E1, 39588 },
+ { 0x32FB, 39591 },
+ { 0x32FD, 39594 },
+ { 0x32FC, 39597 },
+ { 0x32FE, 39600 },
+ { 0x32F3, 39603 },
+ { 0x32F5, 39606 },
+ { 0x32F4, 39609 },
+ { 0x29B7, 39612 },
+ { 0x238A, 39614 },
+ { 0x29B6, 39617 },
+ { 0x32A6, 39620 },
+ { 0x3280, 39623 },
+ { 0x3285, 39626 },
+ { 0x3290, 39629 },
+ { 0x3289, 39632 },
+ { 0x3281, 39635 },
+ { 0x32A2, 39638 },
+ { 0x328B, 39641 },
+ { 0x3284, 39644 },
+ { 0x3283, 39647 },
+ { 0x3292, 39650 },
+ { 0x32A4, 39653 },
+ { 0x32A0, 39656 },
+ { 0x32A7, 39659 },
+ { 0x329A, 39662 },
+ { 0x328A, 39665 },
+ { 0x3294, 39668 },
+ { 0x3288, 39671 },
+ { 0x32A1, 39674 },
+ { 0x328D, 39677 },
+ { 0x328F, 39680 },
+ { 0x3287, 39683 },
+ { 0x3298, 39686 },
+ { 0x328E, 39689 },
+ { 0x32B0, 39692 },
+ { 0x329E, 39695 },
+ { 0x32A8, 39698 },
+ { 0x3286, 39701 },
+ { 0x3291, 39704 },
+ { 0x32AB, 39707 },
+ { 0x3282, 39710 },
+ { 0x328C, 39713 },
+ { 0x32A5, 39716 },
+ { 0x329B, 39719 },
+ { 0x3299, 39722 },
+ { 0x32A3, 39725 },
+ { 0x3293, 39728 },
+ { 0x3295, 39731 },
+ { 0x32AF, 39734 },
+ { 0x32A9, 39737 },
+ { 0x32AA, 39740 },
+ { 0x32AE, 39743 },
+ { 0x329C, 39746 },
+ { 0x329F, 39749 },
+ { 0x329D, 39752 },
+ { 0x3296, 39755 },
+ { 0x32AC, 39758 },
+ { 0x32AD, 39761 },
+ { 0x3297, 39764 },
+ { 0x29C0, 39767 },
+ { 0x2389, 39769 },
+ { 0x29C1, 39774 },
+ { 0x29B9, 39776 },
+ { 0x2A36, 39778 },
+ { 0x29BC, 39784 },
+ { 0x2332, 39788 },
+ { 0x222E, 39790 },
+ { 0x2694, 39792 },
+ { 0x7800, 39794 },
+ { 0x7801, 39797 },
+ { 0x7802, 39800 },
+ { 0x7803, 39803 },
+ { 0x7804, 39806 },
+ { 0x7805, 39809 },
+ { 0x7808, 39812 },
+ { 0x780A, 39815 },
+ { 0x780B, 39818 },
+ { 0x780C, 39821 },
+ { 0x780D, 39824 },
+ { 0x780E, 39827 },
+ { 0x780F, 39830 },
+ { 0x7810, 39833 },
+ { 0x7811, 39836 },
+ { 0x7812, 39839 },
+ { 0x7813, 39842 },
+ { 0x7814, 39845 },
+ { 0x7815, 39848 },
+ { 0x7816, 39851 },
+ { 0x7817, 39854 },
+ { 0x7818, 39857 },
+ { 0x7819, 39860 },
+ { 0x781A, 39863 },
+ { 0x781B, 39866 },
+ { 0x781C, 39869 },
+ { 0x781D, 39872 },
+ { 0x781E, 39875 },
+ { 0x781F, 39878 },
+ { 0x7820, 39881 },
+ { 0x7821, 39884 },
+ { 0x7822, 39887 },
+ { 0x7823, 39890 },
+ { 0x7824, 39893 },
+ { 0x7825, 39896 },
+ { 0x7826, 39899 },
+ { 0x7827, 39902 },
+ { 0x7828, 39905 },
+ { 0x7829, 39908 },
+ { 0x782A, 39911 },
+ { 0x782B, 39914 },
+ { 0x782C, 39917 },
+ { 0x782D, 39920 },
+ { 0x782E, 39923 },
+ { 0x782F, 39926 },
+ { 0x7830, 39929 },
+ { 0x7831, 39932 },
+ { 0x7832, 39935 },
+ { 0x7833, 39938 },
+ { 0x7834, 39941 },
+ { 0x7835, 39944 },
+ { 0x7837, 39947 },
+ { 0x7838, 39950 },
+ { 0x783C, 39953 },
+ { 0x783F, 39956 },
+ { 0x2396, 39959 },
+ { 0x7438, 39963 },
+ { 0x7434, 39967 },
+ { 0x7441, 39971 },
+ { 0x744A, 39975 },
+ { 0x744B, 39979 },
+ { 0x744C, 39983 },
+ { 0x7449, 39987 },
+ { 0x7445, 39991 },
+ { 0x744F, 39995 },
+ { 0x744E, 39999 },
+ { 0x7435, 40003 },
+ { 0x7436, 40007 },
+ { 0x743A, 40011 },
+ { 0x743C, 40015 },
+ { 0x744D, 40019 },
+ { 0x7447, 40023 },
+ { 0x7443, 40027 },
+ { 0x7440, 40031 },
+ { 0x743E, 40035 },
+ { 0x743F, 40039 },
+ { 0x7439, 40043 },
+ { 0x743B, 40047 },
+ { 0x7442, 40051 },
+ { 0x7437, 40055 },
+ { 0x7446, 40059 },
+ { 0x743D, 40063 },
+ { 0x742A, 40067 },
+ { 0x7429, 40072 },
+ { 0x7428, 40077 },
+ { 0x742C, 40082 },
+ { 0x742B, 40087 },
+ { 0x742D, 40092 },
+ { 0x7444, 40097 },
+ { 0x7448, 40101 },
+ { 0x7430, 40105 },
+ { 0x742F, 40110 },
+ { 0x742E, 40115 },
+ { 0x7432, 40120 },
+ { 0x7431, 40125 },
+ { 0x7433, 40130 },
+ { 0x7410, 40135 },
+ { 0x740C, 40139 },
+ { 0x7419, 40143 },
+ { 0x7422, 40147 },
+ { 0x7423, 40151 },
+ { 0x7424, 40155 },
+ { 0x7421, 40159 },
+ { 0x741D, 40163 },
+ { 0x7427, 40167 },
+ { 0x7426, 40171 },
+ { 0x740D, 40175 },
+ { 0x740E, 40179 },
+ { 0x7412, 40183 },
+ { 0x7414, 40187 },
+ { 0x7425, 40191 },
+ { 0x741F, 40195 },
+ { 0x741B, 40199 },
+ { 0x7418, 40203 },
+ { 0x7416, 40207 },
+ { 0x7417, 40211 },
+ { 0x7411, 40215 },
+ { 0x7413, 40219 },
+ { 0x741A, 40223 },
+ { 0x740F, 40227 },
+ { 0x741E, 40231 },
+ { 0x7415, 40235 },
+ { 0x7402, 40239 },
+ { 0x7401, 40244 },
+ { 0x7400, 40249 },
+ { 0x7404, 40254 },
+ { 0x7403, 40259 },
+ { 0x7405, 40264 },
+ { 0x741C, 40269 },
+ { 0x7420, 40273 },
+ { 0x7408, 40277 },
+ { 0x7407, 40282 },
+ { 0x7406, 40287 },
+ { 0x740A, 40292 },
+ { 0x7409, 40297 },
+ { 0x740B, 40302 },
+ { 0x2B18, 40307 },
+ { 0x2B16, 40312 },
+ { 0x2B17, 40317 },
+ { 0x2B19, 40322 },
+ { 0x22C4, 40327 },
+ { 0x2780, 40329 },
+ { 0x2785, 40334 },
+ { 0x2781, 40339 },
+ { 0x2784, 40344 },
+ { 0x2783, 40349 },
+ { 0x2788, 40354 },
+ { 0x2787, 40359 },
+ { 0x2786, 40364 },
+ { 0x2782, 40369 },
+ { 0x2789, 40374 },
+ { 0x2776, 40379 },
+ { 0x277B, 40384 },
+ { 0x2777, 40389 },
+ { 0x277A, 40394 },
+ { 0x2779, 40399 },
+ { 0x277E, 40404 },
+ { 0x277D, 40409 },
+ { 0x277C, 40414 },
+ { 0x2778, 40419 },
+ { 0x277F, 40424 },
+ { 0x278A, 40429 },
+ { 0x278F, 40435 },
+ { 0x278B, 40441 },
+ { 0x278E, 40447 },
+ { 0x278D, 40453 },
+ { 0x2792, 40459 },
+ { 0x2791, 40465 },
+ { 0x2790, 40471 },
+ { 0x278C, 40477 },
+ { 0x2793, 40483 },
+ { 0x2223, 40489 },
+ { 0x26AE, 40490 },
+ { 0x26A3, 40492 },
+ { 0x26A2, 40495 },
+ { 0x20AF, 40498 },
+ { 0x2208, 40500 },
+ { 0x22F5, 40502 },
+ { 0x22F9, 40507 },
+ { 0x22F2, 40513 },
+ { 0x22F6, 40519 },
+ { 0x22F8, 40523 },
+ { 0x22F3, 40527 },
+ { 0x27D2, 40537 },
+ { 0x2AD9, 40541 },
+ { 0x292F, 40545 },
+ { 0x292C, 40551 },
+ { 0x25C9, 40556 },
+ { 0x2ADC, 40557 },
+ { 0x26B1, 40558 },
+ { 0x20B2, 40560 },
+ { 0x1734, 40562 },
+ { 0x1732, 40565 },
+ { 0x1733, 40569 },
+ { 0x1720, 40573 },
+ { 0x1721, 40576 },
+ { 0x1722, 40579 },
+ { 0x172A, 40582 },
+ { 0x1727, 40585 },
+ { 0x1724, 40588 },
+ { 0x1731, 40591 },
+ { 0x1723, 40594 },
+ { 0x172E, 40597 },
+ { 0x172B, 40600 },
+ { 0x1728, 40603 },
+ { 0x1729, 40606 },
+ { 0x172D, 40609 },
+ { 0x1730, 40612 },
+ { 0x1726, 40615 },
+ { 0x172F, 40618 },
+ { 0x172C, 40621 },
+ { 0x1725, 40624 },
+ { 0x20B4, 40627 },
+ { 0x206C, 40629 },
+ { 0x206A, 40633 },
+ { 0x25D9, 40636 },
+ { 0x25D8, 40639 },
+ { 0x2643, 40641 },
+ { 0x0CD6, 40642 },
+ { 0x0CBC, 40646 },
+ { 0x0CCD, 40649 },
+ { 0x0C83, 40652 },
+ { 0x0C82, 40655 },
+ { 0x0CBD, 40658 },
+ { 0x0CF1, 40661 },
+ { 0x0CF2, 40664 },
+ { 0x0CE7, 40667 },
+ { 0x0CEC, 40670 },
+ { 0x0CE8, 40673 },
+ { 0x0CEB, 40676 },
+ { 0x0CEA, 40679 },
+ { 0x0CEF, 40682 },
+ { 0x0CE6, 40685 },
+ { 0x0CEE, 40688 },
+ { 0x0CED, 40691 },
+ { 0x0CE9, 40694 },
+ { 0x0CC6, 40697 },
+ { 0x0CBF, 40701 },
+ { 0x0CCA, 40705 },
+ { 0x0CC1, 40709 },
+ { 0x0CBE, 40713 },
+ { 0x0CC8, 40717 },
+ { 0x0CCC, 40721 },
+ { 0x0CC7, 40725 },
+ { 0x0CC0, 40729 },
+ { 0x0CCB, 40733 },
+ { 0x0CC2, 40737 },
+ { 0x0CE2, 40741 },
+ { 0x0CC3, 40746 },
+ { 0x0CE3, 40751 },
+ { 0x0CC4, 40756 },
+ { 0x0CD5, 40761 },
+ { 0x0C85, 40764 },
+ { 0x0C8E, 40767 },
+ { 0x0C87, 40770 },
+ { 0x0C92, 40773 },
+ { 0x0C89, 40776 },
+ { 0x0C86, 40779 },
+ { 0x0C90, 40782 },
+ { 0x0C94, 40785 },
+ { 0x0CAC, 40788 },
+ { 0x0C9A, 40791 },
+ { 0x0CA6, 40794 },
+ { 0x0C8F, 40797 },
+ { 0x0CDE, 40800 },
+ { 0x0C97, 40803 },
+ { 0x0CB9, 40806 },
+ { 0x0C88, 40809 },
+ { 0x0C9C, 40812 },
+ { 0x0C95, 40815 },
+ { 0x0CB2, 40818 },
+ { 0x0CAE, 40821 },
+ { 0x0CA8, 40824 },
+ { 0x0C93, 40827 },
+ { 0x0CAA, 40830 },
+ { 0x0CB0, 40833 },
+ { 0x0CB8, 40836 },
+ { 0x0CA4, 40839 },
+ { 0x0C8A, 40842 },
+ { 0x0CB5, 40845 },
+ { 0x0CAF, 40848 },
+ { 0x0CAD, 40851 },
+ { 0x0C9B, 40854 },
+ { 0x0CA1, 40857 },
+ { 0x0CA7, 40860 },
+ { 0x0C98, 40863 },
+ { 0x0C9D, 40866 },
+ { 0x0C96, 40869 },
+ { 0x0CB3, 40872 },
+ { 0x0C99, 40875 },
+ { 0x0CA3, 40878 },
+ { 0x0C9E, 40881 },
+ { 0x0CAB, 40884 },
+ { 0x0CB1, 40887 },
+ { 0x0CB6, 40890 },
+ { 0x0CB7, 40893 },
+ { 0x0CA5, 40896 },
+ { 0x0C9F, 40899 },
+ { 0x0CA2, 40902 },
+ { 0x0CA0, 40905 },
+ { 0x0C8C, 40908 },
+ { 0x0C8B, 40912 },
+ { 0x0CE1, 40916 },
+ { 0x0CE0, 40920 },
+ { 0x32CF, 40924 },
+ { 0x2228, 40927 },
+ { 0x2A52, 40929 },
+ { 0x2A62, 40934 },
+ { 0x2A63, 40939 },
+ { 0x2A5B, 40944 },
+ { 0x2A5D, 40949 },
+ { 0x2A59, 40954 },
+ { 0x2227, 40959 },
+ { 0x2A51, 40961 },
+ { 0x2A5E, 40966 },
+ { 0x2A60, 40971 },
+ { 0x2A5A, 40976 },
+ { 0x2A5F, 40981 },
+ { 0x2A5C, 40985 },
+ { 0x25CA, 40990 },
+ { 0x27E0, 40991 },
+ { 0xA010, 40996 },
+ { 0xA019, 41001 },
+ { 0xA007, 41006 },
+ { 0xA004, 41011 },
+ { 0xA015, 41015 },
+ { 0xA01E, 41020 },
+ { 0xA00C, 41025 },
+ { 0xA011, 41030 },
+ { 0xA01A, 41035 },
+ { 0xA008, 41040 },
+ { 0xA02B, 41045 },
+ { 0xA000, 41048 },
+ { 0xA014, 41052 },
+ { 0xA01D, 41057 },
+ { 0xA00B, 41062 },
+ { 0xA013, 41067 },
+ { 0xA01C, 41072 },
+ { 0xA00A, 41077 },
+ { 0xA018, 41082 },
+ { 0xA021, 41087 },
+ { 0xA00F, 41092 },
+ { 0xA022, 41097 },
+ { 0xA002, 41100 },
+ { 0xA017, 41104 },
+ { 0xA020, 41109 },
+ { 0xA00E, 41114 },
+ { 0xA005, 41119 },
+ { 0xA02A, 41123 },
+ { 0xA003, 41126 },
+ { 0xA016, 41130 },
+ { 0xA01F, 41135 },
+ { 0xA00D, 41140 },
+ { 0xA001, 41145 },
+ { 0xA012, 41149 },
+ { 0xA01B, 41154 },
+ { 0xA009, 41159 },
+ { 0xA006, 41164 },
+ { 0xA028, 41168 },
+ { 0xA024, 41171 },
+ { 0xA023, 41174 },
+ { 0xA026, 41177 },
+ { 0xA027, 41180 },
+ { 0xA029, 41183 },
+ { 0xA025, 41186 },
+ { 0x2720, 41189 },
+ { 0x263F, 41191 },
+ { 0x22EF, 41192 },
+ { 0x9121, 41195 },
+ { 0x9122, 41199 },
+ { 0x9123, 41203 },
+ { 0x9124, 41209 },
+ { 0x911E, 41215 },
+ { 0x911F, 41219 },
+ { 0x9120, 41225 },
+ { 0x9143, 41231 },
+ { 0x918E, 41235 },
+ { 0x910A, 41238 },
+ { 0x9196, 41242 },
+ { 0x9135, 41245 },
+ { 0x9109, 41249 },
+ { 0x91A8, 41253 },
+ { 0x9176, 41258 },
+ { 0x9174, 41262 },
+ { 0x9178, 41266 },
+ { 0x917A, 41270 },
+ { 0x9164, 41274 },
+ { 0x9142, 41280 },
+ { 0x91DD, 41286 },
+ { 0x910C, 41290 },
+ { 0x91B4, 41293 },
+ { 0x91B5, 41296 },
+ { 0x9125, 41300 },
+ { 0x9126, 41304 },
+ { 0x912C, 41308 },
+ { 0x912D, 41312 },
+ { 0x91C0, 41316 },
+ { 0x91BF, 41320 },
+ { 0x915E, 41324 },
+ { 0x913C, 41328 },
+ { 0x91B0, 41332 },
+ { 0x9106, 41337 },
+ { 0x9153, 41342 },
+ { 0x9152, 41347 },
+ { 0x9159, 41352 },
+ { 0x9144, 41356 },
+ { 0x9197, 41360 },
+ { 0x919A, 41363 },
+ { 0x9199, 41367 },
+ { 0x9157, 41371 },
+ { 0x91B3, 41375 },
+ { 0x9175, 41379 },
+ { 0x9173, 41383 },
+ { 0x9177, 41387 },
+ { 0x9179, 41391 },
+ { 0x9114, 41395 },
+ { 0x915C, 41398 },
+ { 0x91CF, 41401 },
+ { 0x9102, 41404 },
+ { 0x9191, 41408 },
+ { 0x9195, 41411 },
+ { 0x9194, 41417 },
+ { 0x91B7, 41422 },
+ { 0x91C1, 41425 },
+ { 0x91C2, 41430 },
+ { 0x9190, 41435 },
+ { 0x913A, 41438 },
+ { 0x91AF, 41442 },
+ { 0x91AE, 41447 },
+ { 0x918F, 41451 },
+ { 0x9107, 41454 },
+ { 0x910B, 41459 },
+ { 0x9130, 41462 },
+ { 0x9131, 41466 },
+ { 0x9105, 41470 },
+ { 0x91D3, 41474 },
+ { 0x915D, 41477 },
+ { 0x913B, 41481 },
+ { 0x9112, 41485 },
+ { 0x91B8, 41489 },
+ { 0x91C3, 41492 },
+ { 0x9145, 41496 },
+ { 0x91D5, 41501 },
+ { 0x9134, 41504 },
+ { 0x9104, 41508 },
+ { 0x91A9, 41512 },
+ { 0x912B, 41516 },
+ { 0x912A, 41520 },
+ { 0x9101, 41524 },
+ { 0x9160, 41528 },
+ { 0x913E, 41532 },
+ { 0x91B6, 41536 },
+ { 0x91BB, 41539 },
+ { 0x91C5, 41542 },
+ { 0x91BC, 41546 },
+ { 0x9136, 41550 },
+ { 0x9137, 41554 },
+ { 0x9108, 41558 },
+ { 0x9100, 41562 },
+ { 0x91D2, 41566 },
+ { 0x9147, 41570 },
+ { 0x9146, 41575 },
+ { 0x918D, 41580 },
+ { 0x91C7, 41583 },
+ { 0x91C9, 41590 },
+ { 0x91C8, 41598 },
+ { 0x91CA, 41605 },
+ { 0x91CB, 41612 },
+ { 0x91CC, 41619 },
+ { 0x91CD, 41627 },
+ { 0x91CE, 41635 },
+ { 0x9115, 41643 },
+ { 0x9113, 41646 },
+ { 0x915B, 41649 },
+ { 0x915A, 41654 },
+ { 0x9110, 41659 },
+ { 0x9111, 41662 },
+ { 0x912E, 41666 },
+ { 0x912F, 41670 },
+ { 0x91D4, 41674 },
+ { 0x915F, 41677 },
+ { 0x913D, 41681 },
+ { 0x9133, 41685 },
+ { 0x9132, 41690 },
+ { 0x9103, 41695 },
+ { 0x91D7, 41700 },
+ { 0x916A, 41703 },
+ { 0x916B, 41707 },
+ { 0x916C, 41711 },
+ { 0x9198, 41715 },
+ { 0x9129, 41719 },
+ { 0x9158, 41724 },
+ { 0x9116, 41728 },
+ { 0x919B, 41732 },
+ { 0x919C, 41736 },
+ { 0x919D, 41740 },
+ { 0x919E, 41744 },
+ { 0x919F, 41748 },
+ { 0x91A0, 41752 },
+ { 0x91A1, 41756 },
+ { 0x91A2, 41760 },
+ { 0x91A3, 41764 },
+ { 0x91A4, 41768 },
+ { 0x91A5, 41772 },
+ { 0x910D, 41776 },
+ { 0x910E, 41780 },
+ { 0x910F, 41784 },
+ { 0x911B, 41788 },
+ { 0x91D8, 41792 },
+ { 0x91DC, 41795 },
+ { 0x9149, 41799 },
+ { 0x9151, 41805 },
+ { 0x9150, 41812 },
+ { 0x9148, 41819 },
+ { 0x914F, 41825 },
+ { 0x914E, 41831 },
+ { 0x914B, 41837 },
+ { 0x914A, 41843 },
+ { 0x914D, 41849 },
+ { 0x914C, 41855 },
+ { 0x9117, 41861 },
+ { 0x91AB, 41865 },
+ { 0x9186, 41870 },
+ { 0x9189, 41874 },
+ { 0x9185, 41878 },
+ { 0x91AA, 41882 },
+ { 0x9187, 41887 },
+ { 0x91AD, 41891 },
+ { 0x9165, 41896 },
+ { 0x9182, 41900 },
+ { 0x9188, 41904 },
+ { 0x917B, 41908 },
+ { 0x918A, 41912 },
+ { 0x916E, 41917 },
+ { 0x916F, 41921 },
+ { 0x9170, 41925 },
+ { 0x9171, 41929 },
+ { 0x9172, 41933 },
+ { 0x917D, 41937 },
+ { 0x918B, 41941 },
+ { 0x917F, 41946 },
+ { 0x91AC, 41950 },
+ { 0x917C, 41954 },
+ { 0x9167, 41958 },
+ { 0x9168, 41962 },
+ { 0x9169, 41966 },
+ { 0x916D, 41970 },
+ { 0x9166, 41975 },
+ { 0x917E, 41980 },
+ { 0x9181, 41984 },
+ { 0x9180, 41988 },
+ { 0x9192, 41992 },
+ { 0x911A, 41995 },
+ { 0x9119, 41999 },
+ { 0x91B1, 42003 },
+ { 0x91B2, 42007 },
+ { 0x91D0, 42011 },
+ { 0x91D1, 42016 },
+ { 0x91D9, 42021 },
+ { 0x91DA, 42024 },
+ { 0x91D6, 42028 },
+ { 0x91DB, 42031 },
+ { 0x9161, 42035 },
+ { 0x913F, 42039 },
+ { 0x9183, 42043 },
+ { 0x9184, 42047 },
+ { 0x91C4, 42051 },
+ { 0x91BA, 42055 },
+ { 0x91B9, 42059 },
+ { 0x91C6, 42063 },
+ { 0x91BE, 42067 },
+ { 0x91BD, 42071 },
+ { 0x911C, 42075 },
+ { 0x9118, 42079 },
+ { 0x9193, 42083 },
+ { 0x911D, 42086 },
+ { 0x91A6, 42090 },
+ { 0x91A7, 42093 },
+ { 0x9156, 42096 },
+ { 0x918C, 42100 },
+ { 0x9138, 42103 },
+ { 0x9139, 42107 },
+ { 0x9163, 42111 },
+ { 0x9141, 42115 },
+ { 0x9162, 42119 },
+ { 0x9140, 42123 },
+ { 0x9155, 42127 },
+ { 0x9154, 42133 },
+ { 0x1091, 42139 },
+ { 0x1096, 42143 },
+ { 0x1092, 42147 },
+ { 0x1095, 42151 },
+ { 0x1094, 42155 },
+ { 0x1099, 42159 },
+ { 0x1090, 42163 },
+ { 0x1098, 42167 },
+ { 0x1097, 42171 },
+ { 0x1093, 42175 },
+ { 0x1037, 42179 },
+ { 0x103A, 42183 },
+ { 0x1087, 42186 },
+ { 0x1088, 42190 },
+ { 0x1089, 42194 },
+ { 0x108A, 42198 },
+ { 0x108B, 42202 },
+ { 0x108C, 42207 },
+ { 0x108D, 42212 },
+ { 0x108F, 42218 },
+ { 0x104A, 42223 },
+ { 0x1039, 42227 },
+ { 0x104B, 42230 },
+ { 0x1038, 42233 },
+ { 0x1069, 42236 },
+ { 0x106A, 42242 },
+ { 0x106B, 42248 },
+ { 0x106C, 42254 },
+ { 0x106D, 42260 },
+ { 0x1036, 42266 },
+ { 0x1064, 42269 },
+ { 0x1063, 42276 },
+ { 0x1041, 42282 },
+ { 0x1046, 42285 },
+ { 0x1042, 42288 },
+ { 0x1045, 42291 },
+ { 0x1044, 42294 },
+ { 0x1049, 42297 },
+ { 0x1040, 42300 },
+ { 0x1048, 42303 },
+ { 0x1047, 42306 },
+ { 0x1043, 42309 },
+ { 0x1031, 42312 },
+ { 0x1035, 42316 },
+ { 0x102D, 42321 },
+ { 0x102F, 42325 },
+ { 0x102C, 42329 },
+ { 0x1032, 42333 },
+ { 0x102E, 42337 },
+ { 0x1030, 42341 },
+ { 0x1034, 42345 },
+ { 0x1033, 42350 },
+ { 0x1071, 42355 },
+ { 0x1062, 42361 },
+ { 0x1084, 42367 },
+ { 0x1085, 42372 },
+ { 0x1083, 42378 },
+ { 0x1086, 42383 },
+ { 0x102B, 42389 },
+ { 0x1073, 42394 },
+ { 0x1074, 42399 },
+ { 0x1072, 42404 },
+ { 0x1058, 42409 },
+ { 0x1056, 42414 },
+ { 0x1059, 42419 },
+ { 0x1057, 42424 },
+ { 0x1067, 42429 },
+ { 0x1068, 42436 },
+ { 0x1021, 42443 },
+ { 0x1027, 42446 },
+ { 0x1023, 42449 },
+ { 0x1029, 42452 },
+ { 0x1025, 42455 },
+ { 0x102A, 42458 },
+ { 0x1017, 42461 },
+ { 0x1005, 42464 },
+ { 0x1012, 42467 },
+ { 0x1002, 42470 },
+ { 0x101F, 42473 },
+ { 0x1024, 42476 },
+ { 0x1007, 42479 },
+ { 0x1000, 42482 },
+ { 0x101C, 42485 },
+ { 0x1019, 42488 },
+ { 0x1014, 42491 },
+ { 0x1015, 42494 },
+ { 0x101B, 42497 },
+ { 0x101E, 42500 },
+ { 0x1010, 42503 },
+ { 0x1026, 42506 },
+ { 0x101D, 42509 },
+ { 0x101A, 42512 },
+ { 0x1018, 42515 },
+ { 0x1006, 42518 },
+ { 0x100D, 42521 },
+ { 0x1013, 42524 },
+ { 0x1003, 42527 },
+ { 0x1008, 42530 },
+ { 0x1001, 42533 },
+ { 0x1020, 42536 },
+ { 0x1028, 42539 },
+ { 0x105C, 42543 },
+ { 0x105D, 42547 },
+ { 0x105B, 42551 },
+ { 0x105A, 42555 },
+ { 0x1004, 42559 },
+ { 0x100F, 42562 },
+ { 0x1009, 42565 },
+ { 0x1016, 42568 },
+ { 0x1050, 42571 },
+ { 0x1051, 42574 },
+ { 0x1011, 42577 },
+ { 0x100B, 42580 },
+ { 0x100E, 42583 },
+ { 0x100A, 42586 },
+ { 0x1061, 42589 },
+ { 0x1022, 42594 },
+ { 0x107F, 42598 },
+ { 0x1078, 42602 },
+ { 0x107B, 42606 },
+ { 0x107E, 42610 },
+ { 0x1077, 42614 },
+ { 0x1081, 42618 },
+ { 0x1075, 42622 },
+ { 0x107C, 42626 },
+ { 0x1079, 42630 },
+ { 0x1076, 42634 },
+ { 0x107A, 42638 },
+ { 0x107D, 42642 },
+ { 0x1080, 42646 },
+ { 0x100C, 42650 },
+ { 0x103F, 42653 },
+ { 0x108E, 42657 },
+ { 0x106E, 42662 },
+ { 0x106F, 42668 },
+ { 0x1070, 42674 },
+ { 0x1054, 42680 },
+ { 0x1052, 42684 },
+ { 0x1055, 42688 },
+ { 0x1053, 42692 },
+ { 0x1066, 42696 },
+ { 0x1065, 42702 },
+ { 0x109E, 42708 },
+ { 0x109F, 42712 },
+ { 0x104F, 42716 },
+ { 0x104C, 42719 },
+ { 0x104D, 42722 },
+ { 0x104E, 42725 },
+ { 0x1060, 42728 },
+ { 0x105F, 42734 },
+ { 0x105E, 42740 },
+ { 0x1082, 42746 },
+ { 0x103E, 42752 },
+ { 0x103C, 42757 },
+ { 0x103D, 42762 },
+ { 0x103B, 42767 },
+ { 0x22AF, 42772 },
+ { 0x2288, 42779 },
+ { 0x2289, 42786 },
+ { 0x2270, 42793 },
+ { 0x2274, 42798 },
+ { 0x2278, 42803 },
+ { 0x2271, 42807 },
+ { 0x2279, 42812 },
+ { 0x2275, 42816 },
+ { 0x2247, 42821 },
+ { 0x2646, 42827 },
+ { 0x206F, 42828 },
+ { 0x27AF, 42831 },
+ { 0x27B1, 42837 },
+ { 0x29A6, 42843 },
+ { 0x29A7, 42847 },
+ { 0x74A1, 42851 },
+ { 0x74A6, 42854 },
+ { 0x74A2, 42857 },
+ { 0x74A5, 42860 },
+ { 0x74A4, 42863 },
+ { 0x74A9, 42866 },
+ { 0x74A0, 42869 },
+ { 0x74A8, 42872 },
+ { 0x74A7, 42875 },
+ { 0x74A3, 42878 },
+ { 0x7496, 42881 },
+ { 0x7497, 42884 },
+ { 0x7498, 42887 },
+ { 0x7499, 42890 },
+ { 0x749A, 42893 },
+ { 0x749B, 42896 },
+ { 0x7481, 42899 },
+ { 0x749C, 42902 },
+ { 0x748D, 42905 },
+ { 0x748C, 42908 },
+ { 0x7494, 42911 },
+ { 0x7483, 42914 },
+ { 0x749D, 42917 },
+ { 0x7487, 42920 },
+ { 0x7488, 42923 },
+ { 0x7482, 42926 },
+ { 0x7484, 42929 },
+ { 0x7495, 42932 },
+ { 0x748A, 42935 },
+ { 0x7485, 42938 },
+ { 0x7493, 42941 },
+ { 0x7480, 42944 },
+ { 0x748B, 42947 },
+ { 0x7486, 42950 },
+ { 0x748F, 42953 },
+ { 0x7490, 42956 },
+ { 0x7491, 42959 },
+ { 0x7492, 42962 },
+ { 0x748E, 42965 },
+ { 0x7489, 42968 },
+ { 0x2202, 42971 },
+ { 0x0025, 42973 },
+ { 0x00B6, 42975 },
+ { 0x2669, 42977 },
+ { 0x23B7, 42979 },
+ { 0x2B41, 42982 },
+ { 0x2B47, 42988 },
+ { 0x005C, 42994 },
+ { 0x29F7, 42996 },
+ { 0x29F5, 43001 },
+ { 0x27C8, 43004 },
+ { 0x2765, 43008 },
+ { 0x2767, 43013 },
+ { 0x213A, 43017 },
+ { 0x2613, 43020 },
+ { 0x2108, 43021 },
+ { 0x00A7, 43022 },
+ { 0x2313, 43024 },
+ { 0x2120, 43025 },
+ { 0x26B9, 43027 },
+ { 0x746D, 43028 },
+ { 0x7466, 43031 },
+ { 0x746A, 43034 },
+ { 0x7479, 43037 },
+ { 0x7455, 43040 },
+ { 0x7473, 43043 },
+ { 0x7469, 43046 },
+ { 0x7471, 43049 },
+ { 0x747A, 43052 },
+ { 0x7478, 43055 },
+ { 0x7468, 43058 },
+ { 0x7477, 43061 },
+ { 0x745A, 43064 },
+ { 0x747D, 43067 },
+ { 0x7470, 43070 },
+ { 0x7467, 43073 },
+ { 0x747B, 43076 },
+ { 0x7453, 43079 },
+ { 0x745C, 43082 },
+ { 0x747E, 43085 },
+ { 0x7472, 43088 },
+ { 0x746F, 43091 },
+ { 0x7474, 43094 },
+ { 0x7476, 43097 },
+ { 0x746C, 43100 },
+ { 0x7451, 43103 },
+ { 0x745D, 43106 },
+ { 0x7462, 43109 },
+ { 0x7458, 43112 },
+ { 0x747F, 43115 },
+ { 0x745F, 43118 },
+ { 0x745B, 43121 },
+ { 0x7459, 43124 },
+ { 0x7452, 43127 },
+ { 0x7464, 43130 },
+ { 0x7465, 43133 },
+ { 0x7475, 43136 },
+ { 0x7450, 43139 },
+ { 0x746E, 43142 },
+ { 0x7456, 43145 },
+ { 0x745E, 43148 },
+ { 0x746B, 43151 },
+ { 0x747C, 43154 },
+ { 0x7463, 43157 },
+ { 0x7461, 43160 },
+ { 0x7454, 43163 },
+ { 0x7457, 43166 },
+ { 0x7460, 43169 },
+ { 0x29E2, 43172 },
+ { 0x2A9D, 43174 },
+ { 0x2A9E, 43177 },
+ { 0x2A9F, 43180 },
+ { 0x2AA0, 43186 },
+ { 0x2A6C, 43192 },
+ { 0x0DCA, 43195 },
+ { 0x0D83, 43198 },
+ { 0x0D82, 43201 },
+ { 0x0DDA, 43204 },
+ { 0x0DD3, 43209 },
+ { 0x0DD6, 43214 },
+ { 0x0DD1, 43219 },
+ { 0x0DF3, 43224 },
+ { 0x0DF2, 43229 },
+ { 0x0DD2, 43234 },
+ { 0x0DD4, 43239 },
+ { 0x0DD0, 43244 },
+ { 0x0DDB, 43249 },
+ { 0x0DD9, 43254 },
+ { 0x0DDD, 43258 },
+ { 0x0DDC, 43265 },
+ { 0x0DDE, 43271 },
+ { 0x0DCF, 43277 },
+ { 0x0DDF, 43281 },
+ { 0x0DD8, 43285 },
+ { 0x0DB9, 43289 },
+ { 0x0D85, 43293 },
+ { 0x0D91, 43296 },
+ { 0x0D89, 43299 },
+ { 0x0D94, 43302 },
+ { 0x0D8B, 43305 },
+ { 0x0D86, 43308 },
+ { 0x0D87, 43311 },
+ { 0x0D93, 43314 },
+ { 0x0D96, 43317 },
+ { 0x0DBD, 43320 },
+ { 0x0DB1, 43324 },
+ { 0x0DC3, 43328 },
+ { 0x0D92, 43332 },
+ { 0x0DC6, 43335 },
+ { 0x0DC4, 43338 },
+ { 0x0D8A, 43341 },
+ { 0x0D9E, 43344 },
+ { 0x0DB8, 43348 },
+ { 0x0D95, 43351 },
+ { 0x0DBB, 43354 },
+ { 0x0DB3, 43357 },
+ { 0x0D9F, 43361 },
+ { 0x0DA6, 43365 },
+ { 0x0DAC, 43369 },
+ { 0x0DC1, 43373 },
+ { 0x0DA5, 43377 },
+ { 0x0DA4, 43382 },
+ { 0x0D8C, 43386 },
+ { 0x0DC0, 43389 },
+ { 0x0DBA, 43392 },
+ { 0x0D88, 43395 },
+ { 0x0D8F, 43398 },
+ { 0x0D8D, 43401 },
+ { 0x0D90, 43404 },
+ { 0x0D8E, 43407 },
+ { 0x0DC5, 43410 },
+ { 0x0DAB, 43414 },
+ { 0x0DC2, 43418 },
+ { 0x0DB6, 43422 },
+ { 0x0DA0, 43426 },
+ { 0x0DAF, 43430 },
+ { 0x0D9C, 43434 },
+ { 0x0DA2, 43438 },
+ { 0x0D9A, 43442 },
+ { 0x0DB4, 43446 },
+ { 0x0DAD, 43450 },
+ { 0x0DA9, 43454 },
+ { 0x0DA7, 43458 },
+ { 0x0DB7, 43462 },
+ { 0x0DA1, 43466 },
+ { 0x0DB0, 43470 },
+ { 0x0D9D, 43474 },
+ { 0x0DA3, 43478 },
+ { 0x0D9B, 43482 },
+ { 0x0DB5, 43486 },
+ { 0x0DAE, 43490 },
+ { 0x0DAA, 43494 },
+ { 0x0DA8, 43498 },
+ { 0x0DF4, 43502 },
+ { 0x273A, 43505 },
+ { 0x2A95, 43508 },
+ { 0x2A97, 43513 },
+ { 0x2A96, 43521 },
+ { 0x2A98, 43526 },
+ { 0x2A57, 43534 },
+ { 0x2A58, 43537 },
+ { 0x2AAA, 43540 },
+ { 0x2AAC, 43542 },
+ { 0x2603, 43547 },
+ { 0x002F, 43548 },
+ { 0x29F6, 43549 },
+ { 0x2747, 43552 },
+ { 0x22A1, 43553 },
+ { 0x2E2C, 43556 },
+ { 0x229E, 43560 },
+ { 0x229F, 43562 },
+ { 0x29C7, 43564 },
+ { 0x22A0, 43567 },
+ { 0x29C4, 43569 },
+ { 0x29C8, 43573 },
+ { 0x29C5, 43575 },
+ { 0x29C6, 43579 },
+ { 0x222F, 43581 },
+ { 0x1714, 43583 },
+ { 0x1712, 43586 },
+ { 0x1713, 43590 },
+ { 0x1700, 43594 },
+ { 0x1701, 43597 },
+ { 0x1702, 43600 },
+ { 0x170A, 43603 },
+ { 0x1707, 43606 },
+ { 0x1704, 43609 },
+ { 0x1711, 43612 },
+ { 0x1703, 43615 },
+ { 0x170E, 43618 },
+ { 0x170B, 43621 },
+ { 0x1708, 43624 },
+ { 0x1709, 43627 },
+ { 0x1710, 43630 },
+ { 0x1706, 43633 },
+ { 0x170F, 43636 },
+ { 0x170C, 43639 },
+ { 0x1705, 43642 },
+ { 0x27A2, 43645 },
+ { 0x27A3, 43649 },
+ { 0x0FBE, 43653 },
+ { 0x0FBF, 43657 },
+ { 0x0F3D, 43664 },
+ { 0x0F3C, 43669 },
+ { 0x0F38, 43674 },
+ { 0x0F3B, 43678 },
+ { 0x0F3A, 43683 },
+ { 0x0F11, 43688 },
+ { 0x0F39, 43694 },
+ { 0x0F07, 43698 },
+ { 0x0F0A, 43705 },
+ { 0x0F03, 43711 },
+ { 0x0F02, 43720 },
+ { 0x0F01, 43729 },
+ { 0x0F14, 43736 },
+ { 0x0F35, 43740 },
+ { 0x0F37, 43746 },
+ { 0x0F0E, 43752 },
+ { 0x0FD2, 43756 },
+ { 0x0F10, 43760 },
+ { 0x0F12, 43765 },
+ { 0x0F0D, 43770 },
+ { 0x0F34, 43773 },
+ { 0x0FD0, 43777 },
+ { 0x0F09, 43784 },
+ { 0x0F06, 43789 },
+ { 0x0F13, 43797 },
+ { 0x0F36, 43805 },
+ { 0x0FD1, 43813 },
+ { 0x0F08, 43820 },
+ { 0x0F0F, 43824 },
+ { 0x0F85, 43828 },
+ { 0x0F05, 43831 },
+ { 0x0FD4, 43838 },
+ { 0x0F84, 43847 },
+ { 0x0F04, 43850 },
+ { 0x0FD3, 43857 },
+ { 0x0F0C, 43866 },
+ { 0x0F0B, 43871 },
+ { 0x0F8A, 43875 },
+ { 0x0F8B, 43880 },
+ { 0x0F88, 43885 },
+ { 0x0F86, 43890 },
+ { 0x0F3F, 43894 },
+ { 0x0F82, 43898 },
+ { 0x0F83, 43904 },
+ { 0x0F3E, 43908 },
+ { 0x0F89, 43912 },
+ { 0x0F1D, 43916 },
+ { 0x0FCF, 43921 },
+ { 0x0FCE, 43926 },
+ { 0x0F1E, 43932 },
+ { 0x0F1A, 43937 },
+ { 0x0F1C, 43942 },
+ { 0x0F1F, 43947 },
+ { 0x0F1B, 43953 },
+ { 0x0F7E, 43958 },
+ { 0x0F7F, 43964 },
+ { 0x0F87, 43968 },
+ { 0x0F21, 43972 },
+ { 0x0F26, 43975 },
+ { 0x0F22, 43978 },
+ { 0x0F25, 43981 },
+ { 0x0F24, 43984 },
+ { 0x0F2A, 43987 },
+ { 0x0F2F, 43991 },
+ { 0x0F2B, 43995 },
+ { 0x0F2E, 43999 },
+ { 0x0F2D, 44003 },
+ { 0x0F32, 44007 },
+ { 0x0F33, 44011 },
+ { 0x0F31, 44015 },
+ { 0x0F30, 44019 },
+ { 0x0F2C, 44023 },
+ { 0x0F29, 44027 },
+ { 0x0F20, 44030 },
+ { 0x0F28, 44033 },
+ { 0x0F27, 44036 },
+ { 0x0F23, 44039 },
+ { 0x0F7A, 44042 },
+ { 0x0F72, 44046 },
+ { 0x0F7C, 44050 },
+ { 0x0F74, 44054 },
+ { 0x0F71, 44058 },
+ { 0x0F7B, 44062 },
+ { 0x0F73, 44066 },
+ { 0x0F7D, 44070 },
+ { 0x0F75, 44074 },
+ { 0x0F78, 44078 },
+ { 0x0F76, 44083 },
+ { 0x0F79, 44088 },
+ { 0x0F77, 44093 },
+ { 0x0F80, 44098 },
+ { 0x0F81, 44103 },
+ { 0x0F68, 44108 },
+ { 0x0F60, 44111 },
+ { 0x0F56, 44114 },
+ { 0x0F45, 44117 },
+ { 0x0F51, 44120 },
+ { 0x0F42, 44123 },
+ { 0x0F67, 44126 },
+ { 0x0F47, 44129 },
+ { 0x0F40, 44132 },
+ { 0x0F63, 44135 },
+ { 0x0F58, 44138 },
+ { 0x0F53, 44141 },
+ { 0x0F54, 44144 },
+ { 0x0F62, 44147 },
+ { 0x0F66, 44150 },
+ { 0x0F4F, 44153 },
+ { 0x0F5D, 44156 },
+ { 0x0F61, 44159 },
+ { 0x0F5F, 44162 },
+ { 0x0F57, 44165 },
+ { 0x0F46, 44168 },
+ { 0x0F4C, 44171 },
+ { 0x0F52, 44174 },
+ { 0x0F5B, 44177 },
+ { 0x0F43, 44180 },
+ { 0x0F41, 44183 },
+ { 0x0F6B, 44186 },
+ { 0x0F44, 44189 },
+ { 0x0F4E, 44192 },
+ { 0x0F49, 44195 },
+ { 0x0F55, 44198 },
+ { 0x0F6C, 44201 },
+ { 0x0F64, 44204 },
+ { 0x0F65, 44207 },
+ { 0x0F50, 44210 },
+ { 0x0F59, 44213 },
+ { 0x0F4A, 44216 },
+ { 0x0F5E, 44219 },
+ { 0x0F4D, 44222 },
+ { 0x0F5C, 44225 },
+ { 0x0F69, 44228 },
+ { 0x0F5A, 44231 },
+ { 0x0F4B, 44234 },
+ { 0x0F6A, 44237 },
+ { 0x0FC9, 44241 },
+ { 0x0FCC, 44245 },
+ { 0x0FCB, 44251 },
+ { 0x0FCA, 44257 },
+ { 0x0FC5, 44263 },
+ { 0x0FC7, 44267 },
+ { 0x0FC4, 44273 },
+ { 0x0FC8, 44277 },
+ { 0x0FC6, 44281 },
+ { 0x0F15, 44285 },
+ { 0x0F16, 44290 },
+ { 0x0F00, 44295 },
+ { 0x0FB8, 44298 },
+ { 0x0FB0, 44302 },
+ { 0x0FA6, 44306 },
+ { 0x0F95, 44310 },
+ { 0x0FA1, 44314 },
+ { 0x0F92, 44318 },
+ { 0x0FB7, 44322 },
+ { 0x0F97, 44326 },
+ { 0x0F90, 44330 },
+ { 0x0FB3, 44334 },
+ { 0x0FA8, 44338 },
+ { 0x0FA3, 44342 },
+ { 0x0FA4, 44346 },
+ { 0x0FB2, 44350 },
+ { 0x0FB6, 44354 },
+ { 0x0F9F, 44358 },
+ { 0x0FAD, 44362 },
+ { 0x0FB1, 44366 },
+ { 0x0FAF, 44370 },
+ { 0x0FA7, 44374 },
+ { 0x0F96, 44378 },
+ { 0x0F9C, 44382 },
+ { 0x0FA2, 44386 },
+ { 0x0FAB, 44390 },
+ { 0x0F93, 44394 },
+ { 0x0F91, 44398 },
+ { 0x0F94, 44402 },
+ { 0x0F9E, 44406 },
+ { 0x0F99, 44410 },
+ { 0x0FA5, 44414 },
+ { 0x0FB4, 44418 },
+ { 0x0FB5, 44422 },
+ { 0x0FA0, 44426 },
+ { 0x0FA9, 44430 },
+ { 0x0F9A, 44434 },
+ { 0x0FAE, 44438 },
+ { 0x0F9D, 44442 },
+ { 0x0FAC, 44446 },
+ { 0x0FB9, 44450 },
+ { 0x0FAA, 44454 },
+ { 0x0F9B, 44458 },
+ { 0x0FBC, 44462 },
+ { 0x0FBA, 44467 },
+ { 0x0FBB, 44472 },
+ { 0x0F17, 44477 },
+ { 0x0F19, 44484 },
+ { 0x0F18, 44489 },
+ { 0x0FC2, 44494 },
+ { 0x0FC3, 44499 },
+ { 0x0FC0, 44504 },
+ { 0x0FC1, 44509 },
+ { 0x2632, 44514 },
+ { 0x2631, 44517 },
+ { 0x2634, 44520 },
+ { 0x2637, 44523 },
+ { 0x2635, 44526 },
+ { 0x2630, 44529 },
+ { 0x2633, 44532 },
+ { 0x2636, 44535 },
+ { 0x219F, 44538 },
+ { 0x2191, 44542 },
+ { 0x2912, 44544 },
+ { 0x21A5, 44548 },
+ { 0x21B0, 44552 },
+ { 0x21B1, 44557 },
+ { 0x21DE, 44562 },
+ { 0x2909, 44567 },
+ { 0x21C5, 44572 },
+ { 0x2B06, 44578 },
+ { 0x21E7, 44581 },
+ { 0x21EB, 44584 },
+ { 0x21ED, 44589 },
+ { 0x21EC, 44597 },
+ { 0x21EA, 44605 },
+ { 0x21EE, 44610 },
+ { 0x21EF, 44614 },
+ { 0x2E15, 44620 },
+ { 0x21E1, 44622 },
+ { 0x21D1, 44625 },
+ { 0x21C8, 44628 },
+ { 0x290A, 44631 },
+ { 0x2958, 44634 },
+ { 0x2960, 44641 },
+ { 0x2963, 44648 },
+ { 0x296E, 44659 },
+ { 0x2954, 44670 },
+ { 0x295C, 44677 },
+ { 0x21BF, 44684 },
+ { 0x21BE, 44689 },
+ { 0x27F0, 44694 },
+ { 0x2949, 44697 },
+ { 0x270C, 44703 },
+ { 0x26A0, 44705 },
+ { 0x270D, 44707 },
+ { 0x206D, 44709 },
+ { 0x206B, 44713 },
+ { 0x2708, 44716 },
+ { 0x212B, 44717 },
+ { 0x2652, 44719 },
+ { 0x0589, 44720 },
+ { 0x055D, 44723 },
+ { 0x056E, 44725 },
+ { 0x0581, 44729 },
+ { 0x0564, 44733 },
+ { 0x0567, 44737 },
+ { 0x0568, 44741 },
+ { 0x0570, 44745 },
+ { 0x0571, 44749 },
+ { 0x0585, 44753 },
+ { 0x057C, 44757 },
+ { 0x0569, 44761 },
+ { 0x0578, 44765 },
+ { 0x0575, 44769 },
+ { 0x0566, 44773 },
+ { 0x0561, 44777 },
+ { 0x0562, 44781 },
+ { 0x0579, 44785 },
+ { 0x0565, 44789 },
+ { 0x0586, 44793 },
+ { 0x0563, 44797 },
+ { 0x056B, 44801 },
+ { 0x0584, 44805 },
+ { 0x056F, 44809 },
+ { 0x0574, 44813 },
+ { 0x0576, 44817 },
+ { 0x057A, 44821 },
+ { 0x0580, 44825 },
+ { 0x057D, 44829 },
+ { 0x0577, 44833 },
+ { 0x057E, 44837 },
+ { 0x056D, 44841 },
+ { 0x056A, 44845 },
+ { 0x0573, 44849 },
+ { 0x0572, 44853 },
+ { 0x057B, 44857 },
+ { 0x056C, 44861 },
+ { 0x0583, 44865 },
+ { 0x057F, 44869 },
+ { 0x0582, 44873 },
+ { 0x0587, 44877 },
+ { 0x6B14, 44882 },
+ { 0x6B15, 44887 },
+ { 0x6B13, 44892 },
+ { 0x6B17, 44897 },
+ { 0x6B16, 44902 },
+ { 0x058A, 44907 },
+ { 0x053E, 44909 },
+ { 0x0551, 44913 },
+ { 0x0534, 44917 },
+ { 0x0537, 44921 },
+ { 0x0538, 44925 },
+ { 0x0540, 44929 },
+ { 0x0541, 44933 },
+ { 0x0555, 44937 },
+ { 0x054C, 44941 },
+ { 0x0539, 44945 },
+ { 0x0548, 44949 },
+ { 0x0545, 44953 },
+ { 0x0536, 44957 },
+ { 0x0531, 44961 },
+ { 0x0532, 44965 },
+ { 0x0549, 44969 },
+ { 0x0535, 44973 },
+ { 0x0556, 44977 },
+ { 0x0533, 44981 },
+ { 0x053B, 44985 },
+ { 0x0554, 44989 },
+ { 0x053F, 44993 },
+ { 0x0544, 44997 },
+ { 0x0546, 45001 },
+ { 0x054A, 45005 },
+ { 0x0550, 45009 },
+ { 0x054D, 45013 },
+ { 0x0547, 45017 },
+ { 0x054E, 45021 },
+ { 0x053D, 45025 },
+ { 0x053A, 45029 },
+ { 0x0543, 45033 },
+ { 0x0542, 45037 },
+ { 0x054B, 45041 },
+ { 0x053C, 45045 },
+ { 0x0553, 45049 },
+ { 0x054F, 45053 },
+ { 0x0552, 45057 },
+ { 0x055B, 45061 },
+ { 0x0559, 45064 },
+ { 0x055E, 45070 },
+ { 0x055A, 45073 },
+ { 0x055C, 45075 },
+ { 0x055F, 45078 },
+ { 0x002A, 45081 },
+ { 0x2217, 45082 },
+ { 0x2042, 45084 },
+ { 0x1B44, 45085 },
+ { 0x1B00, 45088 },
+ { 0x1B01, 45092 },
+ { 0x1B04, 45096 },
+ { 0x1B02, 45099 },
+ { 0x1B03, 45102 },
+ { 0x1B34, 45105 },
+ { 0x1B5E, 45108 },
+ { 0x1B5F, 45111 },
+ { 0x1B5D, 45114 },
+ { 0x1B51, 45117 },
+ { 0x1B56, 45120 },
+ { 0x1B52, 45123 },
+ { 0x1B55, 45126 },
+ { 0x1B54, 45129 },
+ { 0x1B59, 45132 },
+ { 0x1B50, 45135 },
+ { 0x1B58, 45138 },
+ { 0x1B57, 45141 },
+ { 0x1B53, 45144 },
+ { 0x1B5A, 45147 },
+ { 0x1B3C, 45149 },
+ { 0x1B3D, 45154 },
+ { 0x1B3A, 45160 },
+ { 0x1B3B, 45165 },
+ { 0x1B36, 45171 },
+ { 0x1B37, 45175 },
+ { 0x1B38, 45180 },
+ { 0x1B39, 45184 },
+ { 0x1B42, 45189 },
+ { 0x1B43, 45193 },
+ { 0x1B3E, 45198 },
+ { 0x1B3F, 45202 },
+ { 0x1B41, 45207 },
+ { 0x1B40, 45213 },
+ { 0x1B35, 45218 },
+ { 0x1B5C, 45222 },
+ { 0x1B29, 45224 },
+ { 0x1B2A, 45227 },
+ { 0x1B18, 45231 },
+ { 0x1B19, 45234 },
+ { 0x1B24, 45238 },
+ { 0x1B25, 45241 },
+ { 0x1B1F, 45245 },
+ { 0x1B20, 45250 },
+ { 0x1B48, 45255 },
+ { 0x1B15, 45259 },
+ { 0x1B16, 45262 },
+ { 0x1B33, 45266 },
+ { 0x1B1A, 45269 },
+ { 0x1B1B, 45272 },
+ { 0x1B13, 45276 },
+ { 0x1B14, 45279 },
+ { 0x1B2E, 45283 },
+ { 0x1B0D, 45286 },
+ { 0x1B0E, 45290 },
+ { 0x1B2B, 45295 },
+ { 0x1B26, 45298 },
+ { 0x1B21, 45301 },
+ { 0x1B27, 45305 },
+ { 0x1B28, 45308 },
+ { 0x1B2D, 45312 },
+ { 0x1B0B, 45315 },
+ { 0x1B0C, 45319 },
+ { 0x1B32, 45324 },
+ { 0x1B30, 45327 },
+ { 0x1B31, 45331 },
+ { 0x1B22, 45335 },
+ { 0x1B23, 45338 },
+ { 0x1B1D, 45342 },
+ { 0x1B1E, 45346 },
+ { 0x1B49, 45351 },
+ { 0x1B2F, 45355 },
+ { 0x1B2C, 45358 },
+ { 0x1B45, 45361 },
+ { 0x1B17, 45365 },
+ { 0x1B1C, 45368 },
+ { 0x1B4A, 45371 },
+ { 0x1B46, 45375 },
+ { 0x1B47, 45379 },
+ { 0x1B05, 45383 },
+ { 0x1B06, 45386 },
+ { 0x1B0F, 45390 },
+ { 0x1B07, 45393 },
+ { 0x1B08, 45396 },
+ { 0x1B11, 45400 },
+ { 0x1B12, 45403 },
+ { 0x1B09, 45407 },
+ { 0x1B0A, 45410 },
+ { 0x1B10, 45414 },
+ { 0x1B4B, 45417 },
+ { 0x1B5B, 45421 },
+ { 0x1B64, 45423 },
+ { 0x1B6A, 45427 },
+ { 0x1B65, 45432 },
+ { 0x1B62, 45437 },
+ { 0x1B66, 45441 },
+ { 0x1B61, 45445 },
+ { 0x1B63, 45449 },
+ { 0x1B67, 45453 },
+ { 0x1B69, 45457 },
+ { 0x1B68, 45461 },
+ { 0x1B73, 45465 },
+ { 0x1B72, 45470 },
+ { 0x1B6C, 45475 },
+ { 0x1B6B, 45480 },
+ { 0x1B6E, 45485 },
+ { 0x1B71, 45490 },
+ { 0x1B6D, 45497 },
+ { 0x1B70, 45502 },
+ { 0x1B6F, 45509 },
+ { 0x1B78, 45514 },
+ { 0x1B7C, 45520 },
+ { 0x1B79, 45526 },
+ { 0x1B7A, 45532 },
+ { 0x1B7B, 45538 },
+ { 0x1B75, 45544 },
+ { 0x1B74, 45550 },
+ { 0x1B77, 45556 },
+ { 0x1B76, 45562 },
+ { 0x1B60, 45568 },
+ { 0x31B7, 45570 },
+ { 0x31B6, 45574 },
+ { 0x31B4, 45578 },
+ { 0x31B5, 45582 },
+ { 0x311A, 45586 },
+ { 0x3105, 45589 },
+ { 0x3118, 45592 },
+ { 0x3109, 45595 },
+ { 0x311C, 45598 },
+ { 0x3108, 45601 },
+ { 0x310D, 45604 },
+ { 0x310F, 45607 },
+ { 0x3127, 45610 },
+ { 0x3110, 45613 },
+ { 0x310E, 45616 },
+ { 0x310C, 45619 },
+ { 0x3107, 45622 },
+ { 0x310B, 45625 },
+ { 0x311B, 45628 },
+ { 0x3106, 45631 },
+ { 0x3111, 45634 },
+ { 0x3116, 45637 },
+ { 0x3119, 45640 },
+ { 0x310A, 45643 },
+ { 0x3128, 45646 },
+ { 0x312A, 45649 },
+ { 0x3112, 45652 },
+ { 0x3117, 45655 },
+ { 0x311E, 45658 },
+ { 0x31B0, 45661 },
+ { 0x3122, 45664 },
+ { 0x3120, 45667 },
+ { 0x31A0, 45670 },
+ { 0x3114, 45673 },
+ { 0x31A4, 45676 },
+ { 0x311D, 45679 },
+ { 0x311F, 45682 },
+ { 0x3123, 45685 },
+ { 0x3126, 45688 },
+ { 0x312C, 45691 },
+ { 0x31A3, 45694 },
+ { 0x312D, 45697 },
+ { 0x31AC, 45700 },
+ { 0x31A8, 45703 },
+ { 0x3129, 45706 },
+ { 0x31A2, 45709 },
+ { 0x312B, 45712 },
+ { 0x31B1, 45715 },
+ { 0x31A6, 45718 },
+ { 0x3121, 45721 },
+ { 0x3115, 45724 },
+ { 0x3113, 45727 },
+ { 0x31A1, 45730 },
+ { 0x3124, 45733 },
+ { 0x31A9, 45736 },
+ { 0x3125, 45739 },
+ { 0x31A5, 45742 },
+ { 0x31AA, 45745 },
+ { 0x31AD, 45748 },
+ { 0x31B2, 45751 },
+ { 0x31A7, 45754 },
+ { 0x31AB, 45757 },
+ { 0x31AE, 45760 },
+ { 0x31AF, 45763 },
+ { 0x31B3, 45766 },
+ { 0x1A1F, 45769 },
+ { 0x1A19, 45773 },
+ { 0x1A17, 45777 },
+ { 0x1A1A, 45781 },
+ { 0x1A18, 45785 },
+ { 0x1A1B, 45789 },
+ { 0x1A15, 45793 },
+ { 0x1A05, 45796 },
+ { 0x1A0C, 45799 },
+ { 0x1A09, 45802 },
+ { 0x1A01, 45805 },
+ { 0x1A16, 45808 },
+ { 0x1A0D, 45811 },
+ { 0x1A00, 45814 },
+ { 0x1A12, 45817 },
+ { 0x1A06, 45820 },
+ { 0x1A0A, 45823 },
+ { 0x1A04, 45826 },
+ { 0x1A11, 45829 },
+ { 0x1A14, 45832 },
+ { 0x1A08, 45835 },
+ { 0x1A13, 45838 },
+ { 0x1A10, 45841 },
+ { 0x1A07, 45844 },
+ { 0x1A02, 45847 },
+ { 0x1A0B, 45850 },
+ { 0x1A0E, 45853 },
+ { 0x1A03, 45856 },
+ { 0x1A0F, 45859 },
+ { 0x1A1E, 45862 },
+ { 0x25CE, 45864 },
+ { 0x2624, 45865 },
+ { 0x140A, 45866 },
+ { 0x14A1, 45869 },
+ { 0x1401, 45872 },
+ { 0x155D, 45875 },
+ { 0x1403, 45878 },
+ { 0x1483, 45881 },
+ { 0x14EA, 45884 },
+ { 0x14BB, 45887 },
+ { 0x14D0, 45890 },
+ { 0x1405, 45893 },
+ { 0x1449, 45896 },
+ { 0x1585, 45899 },
+ { 0x1550, 45902 },
+ { 0x1505, 45905 },
+ { 0x1466, 45908 },
+ { 0x153E, 45911 },
+ { 0x140B, 45914 },
+ { 0x141C, 45917 },
+ { 0x142E, 45920 },
+ { 0x1490, 45923 },
+ { 0x1489, 45926 },
+ { 0x148B, 45929 },
+ { 0x148D, 45932 },
+ { 0x142B, 45935 },
+ { 0x1559, 45938 },
+ { 0x1553, 45941 },
+ { 0x1555, 45944 },
+ { 0x1557, 45947 },
+ { 0x157D, 45950 },
+ { 0x1404, 45953 },
+ { 0x142C, 45956 },
+ { 0x1472, 45959 },
+ { 0x146B, 45962 },
+ { 0x146D, 45965 },
+ { 0x146F, 45968 },
+ { 0x1484, 45971 },
+ { 0x14DA, 45974 },
+ { 0x14D3, 45977 },
+ { 0x15A6, 45980 },
+ { 0x14D5, 45983 },
+ { 0x14D7, 45986 },
+ { 0x14AA, 45989 },
+ { 0x14A3, 45992 },
+ { 0x14BD, 45995 },
+ { 0x14A5, 45998 },
+ { 0x14A7, 46001 },
+ { 0x14C7, 46004 },
+ { 0x14C0, 46007 },
+ { 0x1595, 46010 },
+ { 0x14D2, 46013 },
+ { 0x14C2, 46016 },
+ { 0x14C4, 46019 },
+ { 0x142D, 46022 },
+ { 0x1406, 46025 },
+ { 0x1438, 46028 },
+ { 0x142F, 46031 },
+ { 0x1431, 46034 },
+ { 0x1433, 46037 },
+ { 0x1583, 46040 },
+ { 0x157F, 46043 },
+ { 0x1581, 46046 },
+ { 0x154B, 46049 },
+ { 0x1542, 46052 },
+ { 0x1546, 46055 },
+ { 0x1548, 46058 },
+ { 0x14F4, 46061 },
+ { 0x14ED, 46064 },
+ { 0x1525, 46067 },
+ { 0x14EF, 46070 },
+ { 0x14F1, 46073 },
+ { 0x1507, 46076 },
+ { 0x1455, 46079 },
+ { 0x144C, 46082 },
+ { 0x156A, 46085 },
+ { 0x144E, 46088 },
+ { 0x1450, 46091 },
+ { 0x1417, 46094 },
+ { 0x140C, 46097 },
+ { 0x140E, 46100 },
+ { 0x1412, 46103 },
+ { 0x152D, 46106 },
+ { 0x1526, 46109 },
+ { 0x1528, 46112 },
+ { 0x152A, 46115 },
+ { 0x1402, 46118 },
+ { 0x1491, 46121 },
+ { 0x166D, 46124 },
+ { 0x148C, 46128 },
+ { 0x148E, 46131 },
+ { 0x149C, 46134 },
+ { 0x1492, 46137 },
+ { 0x1494, 46140 },
+ { 0x1498, 46143 },
+ { 0x155A, 46146 },
+ { 0x1556, 46149 },
+ { 0x1558, 46152 },
+ { 0x1473, 46155 },
+ { 0x146E, 46158 },
+ { 0x1470, 46161 },
+ { 0x147E, 46164 },
+ { 0x1474, 46167 },
+ { 0x1476, 46170 },
+ { 0x147A, 46173 },
+ { 0x14DB, 46176 },
+ { 0x15A4, 46179 },
+ { 0x15A0, 46182 },
+ { 0x15A2, 46185 },
+ { 0x14D6, 46188 },
+ { 0x14D8, 46191 },
+ { 0x14E6, 46194 },
+ { 0x14DC, 46197 },
+ { 0x14DE, 46200 },
+ { 0x14E2, 46203 },
+ { 0x14AB, 46206 },
+ { 0x14A6, 46209 },
+ { 0x14A8, 46212 },
+ { 0x14B6, 46215 },
+ { 0x14AC, 46218 },
+ { 0x14AE, 46221 },
+ { 0x14B2, 46224 },
+ { 0x14C8, 46227 },
+ { 0x1593, 46230 },
+ { 0x158F, 46233 },
+ { 0x1591, 46236 },
+ { 0x14C3, 46239 },
+ { 0x1596, 46242 },
+ { 0x14C5, 46245 },
+ { 0x14CB, 46248 },
+ { 0x14C9, 46251 },
+ { 0x1439, 46254 },
+ { 0x1432, 46257 },
+ { 0x1434, 46260 },
+ { 0x1444, 46263 },
+ { 0x143A, 46266 },
+ { 0x143C, 46269 },
+ { 0x1440, 46272 },
+ { 0x1584, 46275 },
+ { 0x166F, 46278 },
+ { 0x1580, 46281 },
+ { 0x1582, 46284 },
+ { 0x154C, 46287 },
+ { 0x1547, 46290 },
+ { 0x1549, 46293 },
+ { 0x14F5, 46296 },
+ { 0x1515, 46299 },
+ { 0x1510, 46302 },
+ { 0x1511, 46305 },
+ { 0x1513, 46308 },
+ { 0x14F0, 46311 },
+ { 0x14F2, 46314 },
+ { 0x1500, 46317 },
+ { 0x14F6, 46320 },
+ { 0x14F8, 46323 },
+ { 0x14FC, 46326 },
+ { 0x1456, 46329 },
+ { 0x1566, 46332 },
+ { 0x155E, 46335 },
+ { 0x1560, 46338 },
+ { 0x1564, 46341 },
+ { 0x144F, 46344 },
+ { 0x1451, 46347 },
+ { 0x146A, 46350 },
+ { 0x1467, 46353 },
+ { 0x156F, 46356 },
+ { 0x1468, 46359 },
+ { 0x1469, 46362 },
+ { 0x1461, 46365 },
+ { 0x1457, 46368 },
+ { 0x1459, 46371 },
+ { 0x145D, 46374 },
+ { 0x1573, 46377 },
+ { 0x1570, 46380 },
+ { 0x1571, 46383 },
+ { 0x1572, 46386 },
+ { 0x1419, 46389 },
+ { 0x1410, 46392 },
+ { 0x1414, 46395 },
+ { 0x152E, 46398 },
+ { 0x1529, 46401 },
+ { 0x152B, 46404 },
+ { 0x1539, 46407 },
+ { 0x152F, 46410 },
+ { 0x1531, 46413 },
+ { 0x1535, 46416 },
+ { 0x148A, 46419 },
+ { 0x149E, 46422 },
+ { 0x1496, 46425 },
+ { 0x149A, 46428 },
+ { 0x1554, 46431 },
+ { 0x166E, 46434 },
+ { 0x155B, 46438 },
+ { 0x146C, 46441 },
+ { 0x1480, 46444 },
+ { 0x1478, 46447 },
+ { 0x147C, 46450 },
+ { 0x14D4, 46453 },
+ { 0x15A5, 46456 },
+ { 0x15A1, 46459 },
+ { 0x15A3, 46462 },
+ { 0x14E8, 46465 },
+ { 0x14E0, 46468 },
+ { 0x14E4, 46471 },
+ { 0x14A4, 46474 },
+ { 0x14B8, 46477 },
+ { 0x14B0, 46480 },
+ { 0x14B4, 46483 },
+ { 0x14C1, 46486 },
+ { 0x1594, 46489 },
+ { 0x1670, 46492 },
+ { 0x1590, 46495 },
+ { 0x1592, 46498 },
+ { 0x1675, 46501 },
+ { 0x1671, 46504 },
+ { 0x1673, 46507 },
+ { 0x14CD, 46510 },
+ { 0x1430, 46513 },
+ { 0x1446, 46516 },
+ { 0x143E, 46519 },
+ { 0x1442, 46522 },
+ { 0x157E, 46525 },
+ { 0x1545, 46528 },
+ { 0x154E, 46531 },
+ { 0x14EE, 46534 },
+ { 0x1516, 46537 },
+ { 0x1512, 46540 },
+ { 0x1514, 46543 },
+ { 0x1521, 46546 },
+ { 0x1517, 46549 },
+ { 0x1519, 46552 },
+ { 0x151D, 46555 },
+ { 0x1502, 46558 },
+ { 0x14FA, 46561 },
+ { 0x14FE, 46564 },
+ { 0x144D, 46567 },
+ { 0x1567, 46570 },
+ { 0x1562, 46573 },
+ { 0x1565, 46576 },
+ { 0x1589, 46579 },
+ { 0x1586, 46582 },
+ { 0x1587, 46585 },
+ { 0x1588, 46588 },
+ { 0x156E, 46591 },
+ { 0x156B, 46594 },
+ { 0x156C, 46597 },
+ { 0x156D, 46600 },
+ { 0x1463, 46603 },
+ { 0x145B, 46606 },
+ { 0x145F, 46609 },
+ { 0x1527, 46612 },
+ { 0x153B, 46615 },
+ { 0x1533, 46618 },
+ { 0x1537, 46621 },
+ { 0x1422, 46624 },
+ { 0x142A, 46630 },
+ { 0x1429, 46635 },
+ { 0x1424, 46639 },
+ { 0x141F, 46643 },
+ { 0x1420, 46647 },
+ { 0x1423, 46651 },
+ { 0x1428, 46657 },
+ { 0x1421, 46663 },
+ { 0x1425, 46669 },
+ { 0x1426, 46674 },
+ { 0x1427, 46681 },
+ { 0x158E, 46686 },
+ { 0x1676, 46689 },
+ { 0x1672, 46692 },
+ { 0x1674, 46695 },
+ { 0x1523, 46698 },
+ { 0x151B, 46701 },
+ { 0x151F, 46704 },
+ { 0x1568, 46707 },
+ { 0x14EC, 46710 },
+ { 0x1552, 46714 },
+ { 0x155F, 46718 },
+ { 0x1561, 46722 },
+ { 0x1563, 46726 },
+ { 0x1543, 46730 },
+ { 0x14BF, 46734 },
+ { 0x15C3, 46738 },
+ { 0x15C0, 46742 },
+ { 0x15C1, 46746 },
+ { 0x15C2, 46750 },
+ { 0x161A, 46754 },
+ { 0x1615, 46758 },
+ { 0x14A2, 46762 },
+ { 0x1541, 46766 },
+ { 0x159A, 46770 },
+ { 0x1597, 46774 },
+ { 0x1598, 46778 },
+ { 0x1599, 46782 },
+ { 0x141D, 46786 },
+ { 0x1407, 46790 },
+ { 0x148F, 46794 },
+ { 0x1471, 46798 },
+ { 0x14D9, 46802 },
+ { 0x14A9, 46806 },
+ { 0x14C6, 46810 },
+ { 0x1435, 46814 },
+ { 0x14F3, 46818 },
+ { 0x1452, 46822 },
+ { 0x152C, 46826 },
+ { 0x1448, 46830 },
+ { 0x15AF, 46834 },
+ { 0x144B, 46838 },
+ { 0x1409, 46842 },
+ { 0x15EE, 46846 },
+ { 0x1646, 46850 },
+ { 0x1454, 46854 },
+ { 0x1408, 46858 },
+ { 0x15F4, 46862 },
+ { 0x15F1, 46866 },
+ { 0x15F3, 46870 },
+ { 0x15F0, 46874 },
+ { 0x15EF, 46878 },
+ { 0x1437, 46882 },
+ { 0x161B, 46886 },
+ { 0x1617, 46890 },
+ { 0x1619, 46894 },
+ { 0x1616, 46898 },
+ { 0x1614, 46902 },
+ { 0x1601, 46906 },
+ { 0x1627, 46910 },
+ { 0x1624, 46914 },
+ { 0x1626, 46918 },
+ { 0x1623, 46922 },
+ { 0x1622, 46926 },
+ { 0x160D, 46930 },
+ { 0x160A, 46934 },
+ { 0x160C, 46938 },
+ { 0x1609, 46942 },
+ { 0x1608, 46946 },
+ { 0x1607, 46950 },
+ { 0x1604, 46954 },
+ { 0x14D1, 46958 },
+ { 0x1606, 46962 },
+ { 0x1603, 46966 },
+ { 0x1602, 46970 },
+ { 0x15ED, 46974 },
+ { 0x15EA, 46978 },
+ { 0x15EC, 46982 },
+ { 0x15E9, 46986 },
+ { 0x15E8, 46990 },
+ { 0x15CF, 46994 },
+ { 0x15CC, 46998 },
+ { 0x15CE, 47002 },
+ { 0x15CB, 47006 },
+ { 0x15CA, 47010 },
+ { 0x1653, 47014 },
+ { 0x1650, 47018 },
+ { 0x165A, 47022 },
+ { 0x1652, 47026 },
+ { 0x164F, 47030 },
+ { 0x164E, 47034 },
+ { 0x15D5, 47038 },
+ { 0x15D2, 47042 },
+ { 0x15D4, 47046 },
+ { 0x15D1, 47050 },
+ { 0x15D0, 47054 },
+ { 0x1613, 47058 },
+ { 0x1610, 47062 },
+ { 0x1612, 47066 },
+ { 0x160F, 47070 },
+ { 0x160E, 47074 },
+ { 0x1645, 47078 },
+ { 0x1642, 47082 },
+ { 0x1644, 47086 },
+ { 0x1641, 47090 },
+ { 0x1640, 47094 },
+ { 0x1666, 47098 },
+ { 0x1663, 47102 },
+ { 0x1665, 47106 },
+ { 0x1662, 47110 },
+ { 0x1661, 47114 },
+ { 0x1453, 47118 },
+ { 0x162D, 47122 },
+ { 0x162A, 47126 },
+ { 0x162C, 47130 },
+ { 0x1629, 47134 },
+ { 0x1628, 47138 },
+ { 0x164D, 47142 },
+ { 0x164A, 47146 },
+ { 0x164C, 47150 },
+ { 0x1649, 47154 },
+ { 0x1648, 47158 },
+ { 0x15F2, 47162 },
+ { 0x15C9, 47166 },
+ { 0x15C6, 47170 },
+ { 0x15C8, 47174 },
+ { 0x15C5, 47178 },
+ { 0x15C4, 47182 },
+ { 0x1436, 47186 },
+ { 0x15DB, 47190 },
+ { 0x15D8, 47194 },
+ { 0x15DA, 47198 },
+ { 0x15D7, 47202 },
+ { 0x15D6, 47206 },
+ { 0x1618, 47210 },
+ { 0x1621, 47214 },
+ { 0x161E, 47218 },
+ { 0x1620, 47222 },
+ { 0x161D, 47226 },
+ { 0x161C, 47230 },
+ { 0x15FA, 47234 },
+ { 0x15F7, 47238 },
+ { 0x15F9, 47242 },
+ { 0x15F6, 47246 },
+ { 0x15F5, 47250 },
+ { 0x1600, 47254 },
+ { 0x15FD, 47258 },
+ { 0x15FF, 47262 },
+ { 0x15FC, 47266 },
+ { 0x15FB, 47270 },
+ { 0x1625, 47274 },
+ { 0x1633, 47278 },
+ { 0x1630, 47282 },
+ { 0x1632, 47286 },
+ { 0x162F, 47290 },
+ { 0x162E, 47294 },
+ { 0x160B, 47298 },
+ { 0x1605, 47302 },
+ { 0x15EB, 47306 },
+ { 0x15CD, 47310 },
+ { 0x1651, 47314 },
+ { 0x1659, 47318 },
+ { 0x1656, 47322 },
+ { 0x1658, 47326 },
+ { 0x1655, 47330 },
+ { 0x1654, 47334 },
+ { 0x15E1, 47338 },
+ { 0x15DE, 47342 },
+ { 0x15E0, 47346 },
+ { 0x15DD, 47350 },
+ { 0x15DC, 47354 },
+ { 0x163F, 47358 },
+ { 0x163C, 47362 },
+ { 0x163E, 47366 },
+ { 0x163B, 47370 },
+ { 0x163A, 47374 },
+ { 0x1660, 47378 },
+ { 0x165D, 47382 },
+ { 0x165F, 47386 },
+ { 0x165C, 47390 },
+ { 0x165B, 47394 },
+ { 0x15E7, 47398 },
+ { 0x15E4, 47402 },
+ { 0x15E6, 47406 },
+ { 0x15E3, 47410 },
+ { 0x15E2, 47414 },
+ { 0x15D3, 47418 },
+ { 0x1611, 47422 },
+ { 0x1643, 47426 },
+ { 0x1664, 47430 },
+ { 0x162B, 47434 },
+ { 0x164B, 47438 },
+ { 0x15C7, 47442 },
+ { 0x15D9, 47446 },
+ { 0x161F, 47450 },
+ { 0x15F8, 47454 },
+ { 0x15FE, 47458 },
+ { 0x1631, 47462 },
+ { 0x1657, 47466 },
+ { 0x15DF, 47470 },
+ { 0x163D, 47474 },
+ { 0x1639, 47478 },
+ { 0x1636, 47482 },
+ { 0x1638, 47486 },
+ { 0x1635, 47490 },
+ { 0x1634, 47494 },
+ { 0x165E, 47498 },
+ { 0x15E5, 47502 },
+ { 0x166C, 47506 },
+ { 0x1669, 47510 },
+ { 0x166B, 47514 },
+ { 0x1668, 47518 },
+ { 0x1667, 47522 },
+ { 0x1637, 47526 },
+ { 0x166A, 47530 },
+ { 0x1647, 47534 },
+ { 0x141E, 47539 },
+ { 0x150B, 47543 },
+ { 0x150A, 47547 },
+ { 0x141B, 47551 },
+ { 0x1416, 47555 },
+ { 0x14A0, 47559 },
+ { 0x1482, 47563 },
+ { 0x14BA, 47567 },
+ { 0x14CF, 47571 },
+ { 0x150F, 47575 },
+ { 0x150E, 47579 },
+ { 0x150C, 47583 },
+ { 0x150D, 47587 },
+ { 0x1504, 47591 },
+ { 0x1465, 47595 },
+ { 0x153D, 47599 },
+ { 0x157B, 47603 },
+ { 0x1579, 47607 },
+ { 0x1574, 47611 },
+ { 0x1575, 47615 },
+ { 0x1577, 47619 },
+ { 0x157A, 47623 },
+ { 0x1576, 47627 },
+ { 0x1578, 47631 },
+ { 0x157C, 47635 },
+ { 0x15AE, 47639 },
+ { 0x15AC, 47643 },
+ { 0x15A7, 47647 },
+ { 0x15A8, 47651 },
+ { 0x15AA, 47655 },
+ { 0x15AD, 47659 },
+ { 0x15A9, 47663 },
+ { 0x15AB, 47667 },
+ { 0x15B3, 47671 },
+ { 0x15B0, 47675 },
+ { 0x15B1, 47679 },
+ { 0x15B2, 47683 },
+ { 0x1508, 47687 },
+ { 0x15BF, 47691 },
+ { 0x15BC, 47695 },
+ { 0x15BD, 47699 },
+ { 0x15BE, 47703 },
+ { 0x15BB, 47707 },
+ { 0x15B8, 47711 },
+ { 0x15B9, 47715 },
+ { 0x15BA, 47719 },
+ { 0x15B7, 47723 },
+ { 0x15B4, 47727 },
+ { 0x15B5, 47731 },
+ { 0x15B6, 47735 },
+ { 0x14EB, 47739 },
+ { 0x14BC, 47743 },
+ { 0x144A, 47747 },
+ { 0x1551, 47751 },
+ { 0x1540, 47755 },
+ { 0x154D, 47759 },
+ { 0x1544, 47763 },
+ { 0x154A, 47767 },
+ { 0x158D, 47771 },
+ { 0x158A, 47775 },
+ { 0x158B, 47779 },
+ { 0x158C, 47783 },
+ { 0x1418, 47787 },
+ { 0x140D, 47791 },
+ { 0x140F, 47795 },
+ { 0x1413, 47799 },
+ { 0x149D, 47803 },
+ { 0x1493, 47807 },
+ { 0x1495, 47811 },
+ { 0x1499, 47815 },
+ { 0x147F, 47819 },
+ { 0x1475, 47823 },
+ { 0x1477, 47827 },
+ { 0x147B, 47831 },
+ { 0x14E7, 47835 },
+ { 0x14DD, 47839 },
+ { 0x14DF, 47843 },
+ { 0x14E3, 47847 },
+ { 0x14B7, 47851 },
+ { 0x14AD, 47855 },
+ { 0x14AF, 47859 },
+ { 0x14B3, 47863 },
+ { 0x14CC, 47867 },
+ { 0x14CA, 47871 },
+ { 0x1445, 47875 },
+ { 0x143B, 47879 },
+ { 0x143D, 47883 },
+ { 0x1441, 47887 },
+ { 0x1501, 47891 },
+ { 0x14F7, 47895 },
+ { 0x14F9, 47899 },
+ { 0x14FD, 47903 },
+ { 0x1462, 47907 },
+ { 0x1458, 47911 },
+ { 0x145A, 47915 },
+ { 0x145E, 47919 },
+ { 0x141A, 47923 },
+ { 0x1411, 47927 },
+ { 0x1415, 47931 },
+ { 0x153A, 47935 },
+ { 0x1530, 47939 },
+ { 0x1532, 47943 },
+ { 0x1536, 47947 },
+ { 0x149F, 47951 },
+ { 0x1497, 47955 },
+ { 0x149B, 47959 },
+ { 0x155C, 47963 },
+ { 0x1481, 47967 },
+ { 0x1479, 47971 },
+ { 0x147D, 47975 },
+ { 0x14E9, 47979 },
+ { 0x14E1, 47983 },
+ { 0x14E5, 47987 },
+ { 0x14B9, 47991 },
+ { 0x14B1, 47995 },
+ { 0x14B5, 47999 },
+ { 0x14CE, 48003 },
+ { 0x1447, 48007 },
+ { 0x143F, 48011 },
+ { 0x1443, 48015 },
+ { 0x154F, 48019 },
+ { 0x1522, 48023 },
+ { 0x1518, 48027 },
+ { 0x151A, 48031 },
+ { 0x151E, 48035 },
+ { 0x1503, 48039 },
+ { 0x14FB, 48043 },
+ { 0x14FF, 48047 },
+ { 0x1464, 48051 },
+ { 0x145C, 48055 },
+ { 0x1460, 48059 },
+ { 0x153C, 48063 },
+ { 0x1534, 48067 },
+ { 0x1538, 48071 },
+ { 0x1524, 48075 },
+ { 0x151C, 48079 },
+ { 0x1520, 48083 },
+ { 0x1569, 48087 },
+ { 0x14BE, 48091 },
+ { 0x1506, 48095 },
+ { 0x153F, 48099 },
+ { 0x1509, 48103 },
+ { 0x159F, 48107 },
+ { 0x159E, 48111 },
+ { 0x159B, 48115 },
+ { 0x159C, 48119 },
+ { 0x159D, 48123 },
+ { 0x1488, 48127 },
+ { 0x1485, 48131 },
+ { 0x1486, 48135 },
+ { 0x1487, 48139 },
+ { 0x13A0, 48143 },
+ { 0x13A1, 48146 },
+ { 0x13A2, 48149 },
+ { 0x13A3, 48152 },
+ { 0x13CD, 48155 },
+ { 0x13A4, 48158 },
+ { 0x13A5, 48161 },
+ { 0x13D3, 48164 },
+ { 0x13D5, 48167 },
+ { 0x13D7, 48170 },
+ { 0x13D9, 48173 },
+ { 0x13DA, 48176 },
+ { 0x13DB, 48179 },
+ { 0x13A6, 48182 },
+ { 0x13A8, 48185 },
+ { 0x13A9, 48188 },
+ { 0x13AA, 48191 },
+ { 0x13AB, 48194 },
+ { 0x13AC, 48197 },
+ { 0x13AD, 48200 },
+ { 0x13AE, 48203 },
+ { 0x13AF, 48206 },
+ { 0x13B0, 48209 },
+ { 0x13B1, 48212 },
+ { 0x13B2, 48215 },
+ { 0x13A7, 48218 },
+ { 0x13B3, 48221 },
+ { 0x13B4, 48224 },
+ { 0x13B5, 48227 },
+ { 0x13B6, 48230 },
+ { 0x13B7, 48233 },
+ { 0x13B8, 48236 },
+ { 0x13B9, 48239 },
+ { 0x13BA, 48242 },
+ { 0x13BB, 48245 },
+ { 0x13BC, 48248 },
+ { 0x13BD, 48251 },
+ { 0x13BE, 48254 },
+ { 0x13C1, 48257 },
+ { 0x13C2, 48260 },
+ { 0x13C3, 48263 },
+ { 0x13C4, 48266 },
+ { 0x13C5, 48269 },
+ { 0x13CC, 48272 },
+ { 0x13CE, 48275 },
+ { 0x13CF, 48278 },
+ { 0x13D0, 48281 },
+ { 0x13D1, 48284 },
+ { 0x13D2, 48287 },
+ { 0x13D4, 48290 },
+ { 0x13D6, 48293 },
+ { 0x13D8, 48296 },
+ { 0x13E9, 48299 },
+ { 0x13EA, 48302 },
+ { 0x13EB, 48305 },
+ { 0x13EC, 48308 },
+ { 0x13ED, 48311 },
+ { 0x13EE, 48314 },
+ { 0x13EF, 48317 },
+ { 0x13F0, 48320 },
+ { 0x13F1, 48323 },
+ { 0x13F2, 48326 },
+ { 0x13F3, 48329 },
+ { 0x13F4, 48332 },
+ { 0x13DC, 48335 },
+ { 0x13BF, 48338 },
+ { 0x13C0, 48341 },
+ { 0x13C6, 48344 },
+ { 0x13C7, 48347 },
+ { 0x13C8, 48350 },
+ { 0x13C9, 48353 },
+ { 0x13CA, 48356 },
+ { 0x13CB, 48359 },
+ { 0x13DD, 48362 },
+ { 0x13DE, 48365 },
+ { 0x13DF, 48368 },
+ { 0x13E0, 48371 },
+ { 0x13E1, 48374 },
+ { 0x13E2, 48377 },
+ { 0x13E3, 48380 },
+ { 0x13E4, 48383 },
+ { 0x13E5, 48386 },
+ { 0x13E6, 48389 },
+ { 0x13E7, 48392 },
+ { 0x13E8, 48395 },
+ { 0x220B, 48398 },
+ { 0x22B3, 48401 },
+ { 0x22B5, 48405 },
+ { 0x22FA, 48412 },
+ { 0x22FD, 48417 },
+ { 0x22FB, 48420 },
+ { 0x9369, 48429 },
+ { 0x936E, 48434 },
+ { 0x936A, 48439 },
+ { 0x936D, 48444 },
+ { 0x936C, 48449 },
+ { 0x9371, 48454 },
+ { 0x9370, 48459 },
+ { 0x936F, 48464 },
+ { 0x936B, 48469 },
+ { 0x9360, 48474 },
+ { 0x9365, 48479 },
+ { 0x9361, 48484 },
+ { 0x9364, 48489 },
+ { 0x9363, 48494 },
+ { 0x9368, 48499 },
+ { 0x9367, 48504 },
+ { 0x9366, 48509 },
+ { 0x9362, 48514 },
+ { 0x20A2, 48519 },
+ { 0x00A4, 48521 },
+ { 0x0430, 48523 },
+ { 0x04D1, 48527 },
+ { 0x04D3, 48533 },
+ { 0x044D, 48539 },
+ { 0x04ED, 48543 },
+ { 0x0438, 48549 },
+ { 0x045D, 48553 },
+ { 0x04E3, 48559 },
+ { 0x04E5, 48565 },
+ { 0x043E, 48571 },
+ { 0x04E7, 48575 },
+ { 0x0443, 48581 },
+ { 0x04F3, 48585 },
+ { 0x04EF, 48592 },
+ { 0x04F1, 48598 },
+ { 0x0431, 48604 },
+ { 0x0434, 48608 },
+ { 0x0444, 48612 },
+ { 0x043B, 48616 },
+ { 0x0513, 48620 },
+ { 0x04C6, 48626 },
+ { 0x0521, 48632 },
+ { 0x043C, 48639 },
+ { 0x04CE, 48643 },
+ { 0x043D, 48649 },
+ { 0x04C8, 48653 },
+ { 0x04CA, 48659 },
+ { 0x0523, 48665 },
+ { 0x04A3, 48672 },
+ { 0x0440, 48678 },
+ { 0x048F, 48682 },
+ { 0x0441, 48688 },
+ { 0x04AB, 48692 },
+ { 0x0445, 48698 },
+ { 0x04FD, 48702 },
+ { 0x04FF, 48708 },
+ { 0x04B3, 48714 },
+ { 0x0435, 48720 },
+ { 0x04D7, 48724 },
+ { 0x0450, 48730 },
+ { 0x0451, 48736 },
+ { 0x0458, 48740 },
+ { 0x043A, 48744 },
+ { 0x04C4, 48748 },
+ { 0x049F, 48754 },
+ { 0x049D, 48760 },
+ { 0x049B, 48767 },
+ { 0x047F, 48773 },
+ { 0x043F, 48777 },
+ { 0x04A7, 48781 },
+ { 0x051B, 48788 },
+ { 0x0442, 48792 },
+ { 0x568B, 48796 },
+ { 0x04AD, 48803 },
+ { 0x0479, 48809 },
+ { 0x0432, 48813 },
+ { 0x051D, 48817 },
+ { 0x044F, 48821 },
+ { 0x0457, 48825 },
+ { 0x565F, 48829 },
+ { 0x044E, 48833 },
+ { 0x0437, 48837 },
+ { 0x0499, 48841 },
+ { 0x04DF, 48847 },
+ { 0x046B, 48853 },
+ { 0x0447, 48858 },
+ { 0x04B9, 48862 },
+ { 0x04B7, 48869 },
+ { 0x04F5, 48875 },
+ { 0x0452, 48881 },
+ { 0x5681, 48885 },
+ { 0x0455, 48889 },
+ { 0x0433, 48893 },
+ { 0x0495, 48897 },
+ { 0x0493, 48904 },
+ { 0x04FB, 48910 },
+ { 0x0491, 48918 },
+ { 0x04F7, 48924 },
+ { 0x0453, 48930 },
+ { 0x5695, 48934 },
+ { 0x045C, 48938 },
+ { 0x046F, 48942 },
+ { 0x0515, 48946 },
+ { 0x0459, 48950 },
+ { 0x045A, 48954 },
+ { 0x0471, 48958 },
+ { 0x0517, 48962 },
+ { 0x0448, 48966 },
+ { 0x0446, 48970 },
+ { 0x568D, 48974 },
+ { 0x0519, 48978 },
+ { 0x0463, 48982 },
+ { 0x0436, 48986 },
+ { 0x04C2, 48990 },
+ { 0x0497, 48996 },
+ { 0x04DD, 49002 },
+ { 0x5687, 49008 },
+ { 0x045F, 49012 },
+ { 0x5683, 49016 },
+ { 0x5689, 49020 },
+ { 0x0473, 49024 },
+ { 0x044A, 49028 },
+ { 0x5647, 49033 },
+ { 0x0501, 49037 },
+ { 0x0503, 49042 },
+ { 0x0509, 49047 },
+ { 0x050B, 49052 },
+ { 0x050D, 49057 },
+ { 0x050F, 49062 },
+ { 0x0505, 49067 },
+ { 0x0507, 49072 },
+ { 0x04BB, 49077 },
+ { 0x5697, 49081 },
+ { 0x5663, 49085 },
+ { 0x5665, 49090 },
+ { 0x5667, 49095 },
+ { 0x044C, 49100 },
+ { 0x5693, 49105 },
+ { 0x045B, 49109 },
+ { 0x5691, 49113 },
+ { 0x568F, 49117 },
+ { 0x044B, 49121 },
+ { 0x5651, 49125 },
+ { 0x04F9, 49132 },
+ { 0x5685, 49138 },
+ { 0x051F, 49142 },
+ { 0x564D, 49147 },
+ { 0x5649, 49152 },
+ { 0x5643, 49156 },
+ { 0x0481, 49160 },
+ { 0x0461, 49164 },
+ { 0x047D, 49168 },
+ { 0x047B, 49174 },
+ { 0x04D9, 49179 },
+ { 0x04DB, 49183 },
+ { 0x0449, 49189 },
+ { 0x0439, 49193 },
+ { 0x048B, 49198 },
+ { 0x045E, 49205 },
+ { 0x04E9, 49210 },
+ { 0x04EB, 49215 },
+ { 0x5659, 49222 },
+ { 0x566D, 49228 },
+ { 0x0467, 49234 },
+ { 0x5641, 49239 },
+ { 0x04A1, 49243 },
+ { 0x565B, 49248 },
+ { 0x0475, 49253 },
+ { 0x0477, 49257 },
+ { 0x564F, 49265 },
+ { 0x5657, 49270 },
+ { 0x0465, 49275 },
+ { 0x046D, 49280 },
+ { 0x5653, 49286 },
+ { 0x565D, 49291 },
+ { 0x0469, 49298 },
+ { 0x04CF, 49304 },
+ { 0x5655, 49308 },
+ { 0x0511, 49313 },
+ { 0x5645, 49318 },
+ { 0x048D, 49323 },
+ { 0x04AF, 49328 },
+ { 0x04B1, 49333 },
+ { 0x04A9, 49340 },
+ { 0x04BD, 49345 },
+ { 0x04BF, 49350 },
+ { 0x04E1, 49357 },
+ { 0x566B, 49362 },
+ { 0x5669, 49367 },
+ { 0x564B, 49372 },
+ { 0x0454, 49377 },
+ { 0x04CC, 49382 },
+ { 0x0456, 49387 },
+ { 0x04D5, 49392 },
+ { 0x04A5, 49397 },
+ { 0x04B5, 49402 },
+ { 0x567E, 49407 },
+ { 0x1D2B, 49409 },
+ { 0x04C0, 49414 },
+ { 0x566E, 49417 },
+ { 0x0410, 49421 },
+ { 0x04D0, 49425 },
+ { 0x04D2, 49431 },
+ { 0x042D, 49437 },
+ { 0x04EC, 49441 },
+ { 0x0418, 49447 },
+ { 0x040D, 49451 },
+ { 0x04E2, 49457 },
+ { 0x04E4, 49463 },
+ { 0x041E, 49469 },
+ { 0x04E6, 49473 },
+ { 0x0423, 49479 },
+ { 0x04F2, 49483 },
+ { 0x04EE, 49490 },
+ { 0x04F0, 49496 },
+ { 0x0411, 49502 },
+ { 0x0414, 49506 },
+ { 0x0424, 49510 },
+ { 0x041B, 49514 },
+ { 0x0512, 49518 },
+ { 0x04C5, 49524 },
+ { 0x0520, 49530 },
+ { 0x041C, 49537 },
+ { 0x04CD, 49541 },
+ { 0x041D, 49547 },
+ { 0x04C7, 49551 },
+ { 0x04C9, 49557 },
+ { 0x0522, 49563 },
+ { 0x04A2, 49570 },
+ { 0x0420, 49576 },
+ { 0x048E, 49580 },
+ { 0x0421, 49586 },
+ { 0x04AA, 49590 },
+ { 0x0425, 49596 },
+ { 0x04FC, 49600 },
+ { 0x04FE, 49606 },
+ { 0x04B2, 49612 },
+ { 0x0415, 49618 },
+ { 0x04D6, 49622 },
+ { 0x0400, 49628 },
+ { 0x0401, 49634 },
+ { 0x0408, 49638 },
+ { 0x041A, 49642 },
+ { 0x04C3, 49646 },
+ { 0x049E, 49652 },
+ { 0x049C, 49658 },
+ { 0x049A, 49665 },
+ { 0x047E, 49671 },
+ { 0x041F, 49675 },
+ { 0x04A6, 49679 },
+ { 0x051A, 49686 },
+ { 0x0422, 49690 },
+ { 0x568A, 49694 },
+ { 0x04AC, 49701 },
+ { 0x0478, 49707 },
+ { 0x0412, 49711 },
+ { 0x051C, 49715 },
+ { 0x042F, 49719 },
+ { 0x0407, 49723 },
+ { 0x565E, 49727 },
+ { 0x042E, 49731 },
+ { 0x0417, 49735 },
+ { 0x0498, 49739 },
+ { 0x04DE, 49745 },
+ { 0x046A, 49751 },
+ { 0x0427, 49756 },
+ { 0x04B8, 49760 },
+ { 0x04B6, 49767 },
+ { 0x04F4, 49773 },
+ { 0x0402, 49779 },
+ { 0x5680, 49783 },
+ { 0x0405, 49787 },
+ { 0x0413, 49791 },
+ { 0x0494, 49795 },
+ { 0x0492, 49802 },
+ { 0x04FA, 49808 },
+ { 0x0490, 49816 },
+ { 0x04F6, 49822 },
+ { 0x0403, 49828 },
+ { 0x5694, 49832 },
+ { 0x040C, 49836 },
+ { 0x046E, 49840 },
+ { 0x0514, 49844 },
+ { 0x0409, 49848 },
+ { 0x040A, 49852 },
+ { 0x0470, 49856 },
+ { 0x0516, 49860 },
+ { 0x0428, 49864 },
+ { 0x0426, 49868 },
+ { 0x568C, 49872 },
+ { 0x0518, 49876 },
+ { 0x0462, 49880 },
+ { 0x0416, 49884 },
+ { 0x04C1, 49888 },
+ { 0x0496, 49894 },
+ { 0x04DC, 49900 },
+ { 0x5686, 49906 },
+ { 0x040F, 49910 },
+ { 0x5682, 49914 },
+ { 0x5688, 49918 },
+ { 0x0472, 49922 },
+ { 0x042A, 49926 },
+ { 0x5646, 49931 },
+ { 0x0500, 49935 },
+ { 0x0502, 49940 },
+ { 0x0508, 49945 },
+ { 0x050A, 49950 },
+ { 0x050C, 49955 },
+ { 0x050E, 49960 },
+ { 0x0504, 49965 },
+ { 0x0506, 49970 },
+ { 0x04BA, 49975 },
+ { 0x5696, 49979 },
+ { 0x5662, 49983 },
+ { 0x5664, 49988 },
+ { 0x5666, 49993 },
+ { 0x042C, 49998 },
+ { 0x5692, 50003 },
+ { 0x040B, 50007 },
+ { 0x5690, 50011 },
+ { 0x568E, 50015 },
+ { 0x042B, 50019 },
+ { 0x5650, 50023 },
+ { 0x04F8, 50030 },
+ { 0x5684, 50036 },
+ { 0x051E, 50040 },
+ { 0x564C, 50045 },
+ { 0x5648, 50050 },
+ { 0x5642, 50054 },
+ { 0x0480, 50058 },
+ { 0x0460, 50062 },
+ { 0x047C, 50066 },
+ { 0x047A, 50072 },
+ { 0x04D8, 50077 },
+ { 0x04DA, 50081 },
+ { 0x0429, 50087 },
+ { 0x0419, 50091 },
+ { 0x048A, 50096 },
+ { 0x040E, 50103 },
+ { 0x04E8, 50108 },
+ { 0x04EA, 50113 },
+ { 0x5658, 50120 },
+ { 0x566C, 50126 },
+ { 0x0466, 50132 },
+ { 0x5640, 50137 },
+ { 0x04A0, 50141 },
+ { 0x565A, 50146 },
+ { 0x0474, 50151 },
+ { 0x0476, 50155 },
+ { 0x564E, 50163 },
+ { 0x5656, 50168 },
+ { 0x0464, 50173 },
+ { 0x046C, 50178 },
+ { 0x5652, 50184 },
+ { 0x565C, 50189 },
+ { 0x0468, 50196 },
+ { 0x5654, 50202 },
+ { 0x0510, 50207 },
+ { 0x5644, 50212 },
+ { 0x048C, 50217 },
+ { 0x04AE, 50222 },
+ { 0x04B0, 50227 },
+ { 0x04A8, 50234 },
+ { 0x04BC, 50239 },
+ { 0x04BE, 50244 },
+ { 0x04E0, 50251 },
+ { 0x566A, 50256 },
+ { 0x5668, 50261 },
+ { 0x564A, 50266 },
+ { 0x0404, 50271 },
+ { 0x04CB, 50276 },
+ { 0x0406, 50281 },
+ { 0x04D4, 50286 },
+ { 0x04A4, 50291 },
+ { 0x04B4, 50296 },
+ { 0x567F, 50301 },
+ { 0x0482, 50303 },
+ { 0x2300, 50306 },
+ { 0x00F7, 50308 },
+ { 0x2215, 50310 },
+ { 0x22C7, 50312 },
+ { 0x279B, 50314 },
+ { 0x2301, 50318 },
+ { 0x2383, 50320 },
+ { 0x2709, 50322 },
+ { 0x1362, 50323 },
+ { 0x1365, 50326 },
+ { 0x1363, 50328 },
+ { 0x1369, 50330 },
+ { 0x136E, 50333 },
+ { 0x136A, 50336 },
+ { 0x136D, 50339 },
+ { 0x136C, 50342 },
+ { 0x1371, 50345 },
+ { 0x1370, 50348 },
+ { 0x136F, 50351 },
+ { 0x136B, 50354 },
+ { 0x1399, 50357 },
+ { 0x1391, 50361 },
+ { 0x1394, 50365 },
+ { 0x1397, 50369 },
+ { 0x1395, 50373 },
+ { 0x1393, 50377 },
+ { 0x1390, 50382 },
+ { 0x1396, 50386 },
+ { 0x1392, 50390 },
+ { 0x1398, 50394 },
+ { 0x1372, 50398 },
+ { 0x137C, 50401 },
+ { 0x1376, 50405 },
+ { 0x1375, 50408 },
+ { 0x1377, 50411 },
+ { 0x1379, 50414 },
+ { 0x137A, 50417 },
+ { 0x1374, 50420 },
+ { 0x1373, 50423 },
+ { 0x137B, 50426 },
+ { 0x1378, 50429 },
+ { 0x1366, 50432 },
+ { 0x1360, 50435 },
+ { 0x1367, 50438 },
+ { 0x1260, 50441 },
+ { 0x1265, 50444 },
+ { 0x1262, 50447 },
+ { 0x1266, 50450 },
+ { 0x1261, 50453 },
+ { 0x1278, 50456 },
+ { 0x127D, 50459 },
+ { 0x127A, 50462 },
+ { 0x127E, 50465 },
+ { 0x1279, 50468 },
+ { 0x12F0, 50471 },
+ { 0x12F5, 50474 },
+ { 0x12F2, 50477 },
+ { 0x12F6, 50480 },
+ { 0x12F1, 50483 },
+ { 0x1348, 50486 },
+ { 0x134D, 50489 },
+ { 0x134A, 50492 },
+ { 0x134E, 50495 },
+ { 0x1349, 50498 },
+ { 0x1308, 50501 },
+ { 0x130D, 50504 },
+ { 0x130A, 50507 },
+ { 0x130E, 50510 },
+ { 0x1309, 50513 },
+ { 0x1200, 50516 },
+ { 0x1205, 50519 },
+ { 0x1202, 50522 },
+ { 0x1206, 50525 },
+ { 0x1201, 50528 },
+ { 0x1300, 50531 },
+ { 0x1305, 50534 },
+ { 0x1302, 50537 },
+ { 0x1306, 50540 },
+ { 0x1301, 50543 },
+ { 0x12A8, 50546 },
+ { 0x12AD, 50549 },
+ { 0x12AA, 50552 },
+ { 0x12AE, 50555 },
+ { 0x12A9, 50558 },
+ { 0x1208, 50561 },
+ { 0x120D, 50564 },
+ { 0x120A, 50567 },
+ { 0x120E, 50570 },
+ { 0x1209, 50573 },
+ { 0x1218, 50576 },
+ { 0x121D, 50579 },
+ { 0x121A, 50582 },
+ { 0x121E, 50585 },
+ { 0x1219, 50588 },
+ { 0x1290, 50591 },
+ { 0x1295, 50594 },
+ { 0x1292, 50597 },
+ { 0x1296, 50600 },
+ { 0x1291, 50603 },
+ { 0x1350, 50606 },
+ { 0x1355, 50609 },
+ { 0x1352, 50612 },
+ { 0x1356, 50615 },
+ { 0x1351, 50618 },
+ { 0x1240, 50621 },
+ { 0x1245, 50624 },
+ { 0x1242, 50627 },
+ { 0x1246, 50630 },
+ { 0x1241, 50633 },
+ { 0x1228, 50636 },
+ { 0x122D, 50639 },
+ { 0x122A, 50642 },
+ { 0x122E, 50645 },
+ { 0x1229, 50648 },
+ { 0x1230, 50651 },
+ { 0x1235, 50654 },
+ { 0x1232, 50657 },
+ { 0x1236, 50660 },
+ { 0x1231, 50663 },
+ { 0x1270, 50666 },
+ { 0x1275, 50669 },
+ { 0x1272, 50672 },
+ { 0x1276, 50675 },
+ { 0x1271, 50678 },
+ { 0x1268, 50681 },
+ { 0x126D, 50684 },
+ { 0x126A, 50687 },
+ { 0x126E, 50690 },
+ { 0x1269, 50693 },
+ { 0x12C8, 50696 },
+ { 0x12CD, 50699 },
+ { 0x12CA, 50702 },
+ { 0x12CE, 50705 },
+ { 0x12C9, 50708 },
+ { 0x1280, 50711 },
+ { 0x1285, 50714 },
+ { 0x1282, 50717 },
+ { 0x1286, 50720 },
+ { 0x1281, 50723 },
+ { 0x12E8, 50726 },
+ { 0x12ED, 50729 },
+ { 0x12EA, 50732 },
+ { 0x12EE, 50735 },
+ { 0x12E9, 50738 },
+ { 0x12D8, 50741 },
+ { 0x12DD, 50744 },
+ { 0x12DA, 50747 },
+ { 0x12DE, 50750 },
+ { 0x12D9, 50753 },
+ { 0x1263, 50756 },
+ { 0x1264, 50759 },
+ { 0x2D85, 50762 },
+ { 0x1267, 50765 },
+ { 0x1387, 50768 },
+ { 0x1385, 50771 },
+ { 0x127B, 50774 },
+ { 0x2DA8, 50777 },
+ { 0x2DAD, 50780 },
+ { 0x2DAA, 50783 },
+ { 0x2DAE, 50786 },
+ { 0x2DA9, 50789 },
+ { 0x127C, 50792 },
+ { 0x1328, 50795 },
+ { 0x132D, 50798 },
+ { 0x132A, 50801 },
+ { 0x132E, 50804 },
+ { 0x1329, 50807 },
+ { 0x2D87, 50810 },
+ { 0x127F, 50813 },
+ { 0x12F3, 50816 },
+ { 0x12F8, 50819 },
+ { 0x12FD, 50822 },
+ { 0x12FA, 50825 },
+ { 0x12FE, 50828 },
+ { 0x12F9, 50831 },
+ { 0x12F4, 50834 },
+ { 0x2D8C, 50837 },
+ { 0x12F7, 50840 },
+ { 0x134B, 50843 },
+ { 0x134C, 50846 },
+ { 0x134F, 50849 },
+ { 0x138B, 50852 },
+ { 0x1389, 50855 },
+ { 0x135A, 50858 },
+ { 0x130B, 50861 },
+ { 0x130C, 50864 },
+ { 0x1318, 50867 },
+ { 0x131D, 50870 },
+ { 0x131A, 50873 },
+ { 0x131E, 50876 },
+ { 0x1319, 50879 },
+ { 0x130F, 50882 },
+ { 0x1310, 50885 },
+ { 0x1315, 50888 },
+ { 0x1312, 50891 },
+ { 0x2DD8, 50894 },
+ { 0x2DDD, 50897 },
+ { 0x2DDA, 50900 },
+ { 0x2DDE, 50903 },
+ { 0x2DD9, 50906 },
+ { 0x1203, 50909 },
+ { 0x1204, 50912 },
+ { 0x1210, 50915 },
+ { 0x1215, 50918 },
+ { 0x1212, 50921 },
+ { 0x1216, 50924 },
+ { 0x1211, 50927 },
+ { 0x1207, 50930 },
+ { 0x1303, 50933 },
+ { 0x1304, 50936 },
+ { 0x2D8E, 50939 },
+ { 0x1307, 50942 },
+ { 0x12AB, 50945 },
+ { 0x12AC, 50948 },
+ { 0x12AF, 50951 },
+ { 0x12B0, 50954 },
+ { 0x12B5, 50957 },
+ { 0x12B2, 50960 },
+ { 0x12B8, 50963 },
+ { 0x12BD, 50966 },
+ { 0x12BA, 50969 },
+ { 0x12BE, 50972 },
+ { 0x12B9, 50975 },
+ { 0x2DC8, 50978 },
+ { 0x2DCD, 50981 },
+ { 0x2DCA, 50984 },
+ { 0x2DCE, 50987 },
+ { 0x2DC9, 50990 },
+ { 0x120B, 50993 },
+ { 0x120C, 50996 },
+ { 0x2D80, 50999 },
+ { 0x120F, 51002 },
+ { 0x121B, 51005 },
+ { 0x121C, 51008 },
+ { 0x2D81, 51011 },
+ { 0x121F, 51014 },
+ { 0x1383, 51017 },
+ { 0x1381, 51020 },
+ { 0x1359, 51023 },
+ { 0x1293, 51026 },
+ { 0x1294, 51029 },
+ { 0x2D88, 51032 },
+ { 0x1297, 51035 },
+ { 0x1298, 51038 },
+ { 0x129D, 51041 },
+ { 0x129A, 51044 },
+ { 0x129E, 51047 },
+ { 0x1299, 51050 },
+ { 0x1353, 51053 },
+ { 0x1354, 51056 },
+ { 0x1330, 51059 },
+ { 0x1335, 51062 },
+ { 0x1332, 51065 },
+ { 0x1336, 51068 },
+ { 0x1331, 51071 },
+ { 0x2D92, 51074 },
+ { 0x1357, 51077 },
+ { 0x138F, 51080 },
+ { 0x138D, 51083 },
+ { 0x1243, 51086 },
+ { 0x1244, 51089 },
+ { 0x1250, 51092 },
+ { 0x1255, 51095 },
+ { 0x1252, 51098 },
+ { 0x1256, 51101 },
+ { 0x1251, 51104 },
+ { 0x1247, 51107 },
+ { 0x1248, 51110 },
+ { 0x124D, 51113 },
+ { 0x124A, 51116 },
+ { 0x2DC0, 51119 },
+ { 0x2DC5, 51122 },
+ { 0x2DC2, 51125 },
+ { 0x2DC6, 51128 },
+ { 0x2DC1, 51131 },
+ { 0x122B, 51134 },
+ { 0x122C, 51137 },
+ { 0x2D82, 51140 },
+ { 0x122F, 51143 },
+ { 0x1358, 51146 },
+ { 0x1233, 51149 },
+ { 0x1234, 51152 },
+ { 0x1238, 51155 },
+ { 0x123D, 51158 },
+ { 0x123A, 51161 },
+ { 0x123E, 51164 },
+ { 0x1239, 51167 },
+ { 0x2D83, 51170 },
+ { 0x2DA0, 51173 },
+ { 0x2DA5, 51176 },
+ { 0x2DA2, 51179 },
+ { 0x2DA6, 51182 },
+ { 0x2DA1, 51185 },
+ { 0x1237, 51188 },
+ { 0x1220, 51191 },
+ { 0x1225, 51194 },
+ { 0x1222, 51197 },
+ { 0x1226, 51200 },
+ { 0x1221, 51203 },
+ { 0x1273, 51206 },
+ { 0x1274, 51209 },
+ { 0x1320, 51212 },
+ { 0x1325, 51215 },
+ { 0x1322, 51218 },
+ { 0x1326, 51221 },
+ { 0x1321, 51224 },
+ { 0x2D86, 51227 },
+ { 0x1338, 51230 },
+ { 0x133D, 51233 },
+ { 0x133A, 51236 },
+ { 0x133E, 51239 },
+ { 0x1339, 51242 },
+ { 0x1277, 51245 },
+ { 0x1340, 51248 },
+ { 0x1345, 51251 },
+ { 0x1342, 51254 },
+ { 0x1346, 51257 },
+ { 0x1341, 51260 },
+ { 0x126B, 51263 },
+ { 0x126C, 51266 },
+ { 0x126F, 51269 },
+ { 0x12CB, 51272 },
+ { 0x12CC, 51275 },
+ { 0x12CF, 51278 },
+ { 0x1283, 51281 },
+ { 0x1284, 51284 },
+ { 0x1287, 51287 },
+ { 0x1288, 51290 },
+ { 0x128D, 51293 },
+ { 0x128A, 51296 },
+ { 0x2DD0, 51299 },
+ { 0x2DD5, 51302 },
+ { 0x2DD2, 51305 },
+ { 0x2DD6, 51308 },
+ { 0x2DD1, 51311 },
+ { 0x12EB, 51314 },
+ { 0x12EC, 51317 },
+ { 0x12EF, 51320 },
+ { 0x12DB, 51323 },
+ { 0x12DC, 51326 },
+ { 0x12E0, 51329 },
+ { 0x12E5, 51332 },
+ { 0x12E2, 51335 },
+ { 0x12E6, 51338 },
+ { 0x12E1, 51341 },
+ { 0x2D8B, 51344 },
+ { 0x12DF, 51347 },
+ { 0x2DB0, 51350 },
+ { 0x2DB5, 51353 },
+ { 0x2DB2, 51356 },
+ { 0x2DB6, 51359 },
+ { 0x2DB1, 51362 },
+ { 0x1386, 51365 },
+ { 0x2DAB, 51368 },
+ { 0x2DAC, 51371 },
+ { 0x2DB8, 51374 },
+ { 0x2DBD, 51377 },
+ { 0x2DBA, 51380 },
+ { 0x2DBE, 51383 },
+ { 0x2DB9, 51386 },
+ { 0x132B, 51389 },
+ { 0x132C, 51392 },
+ { 0x2D90, 51395 },
+ { 0x132F, 51398 },
+ { 0x12FB, 51401 },
+ { 0x12FC, 51404 },
+ { 0x2D8D, 51407 },
+ { 0x12FF, 51410 },
+ { 0x138A, 51413 },
+ { 0x131B, 51416 },
+ { 0x131C, 51419 },
+ { 0x2D93, 51422 },
+ { 0x2D96, 51425 },
+ { 0x2D94, 51428 },
+ { 0x1313, 51431 },
+ { 0x1314, 51434 },
+ { 0x2DDB, 51437 },
+ { 0x2DDC, 51440 },
+ { 0x1213, 51443 },
+ { 0x1214, 51446 },
+ { 0x1217, 51449 },
+ { 0x12B3, 51452 },
+ { 0x12B4, 51455 },
+ { 0x12BB, 51458 },
+ { 0x12BC, 51461 },
+ { 0x12C0, 51464 },
+ { 0x12C5, 51467 },
+ { 0x12C2, 51470 },
+ { 0x2DCB, 51473 },
+ { 0x2DCC, 51476 },
+ { 0x1382, 51479 },
+ { 0x129B, 51482 },
+ { 0x129C, 51485 },
+ { 0x2D89, 51488 },
+ { 0x129F, 51491 },
+ { 0x1333, 51494 },
+ { 0x1334, 51497 },
+ { 0x2D91, 51500 },
+ { 0x1337, 51503 },
+ { 0x138E, 51506 },
+ { 0x1253, 51509 },
+ { 0x1254, 51512 },
+ { 0x1258, 51515 },
+ { 0x125D, 51518 },
+ { 0x125A, 51521 },
+ { 0x124B, 51524 },
+ { 0x124C, 51527 },
+ { 0x2DC3, 51530 },
+ { 0x2DC4, 51533 },
+ { 0x123B, 51536 },
+ { 0x123C, 51539 },
+ { 0x2D84, 51542 },
+ { 0x123F, 51545 },
+ { 0x2DA3, 51548 },
+ { 0x2DA4, 51551 },
+ { 0x1223, 51554 },
+ { 0x1224, 51557 },
+ { 0x1227, 51560 },
+ { 0x1323, 51563 },
+ { 0x1324, 51566 },
+ { 0x2D8F, 51569 },
+ { 0x1327, 51572 },
+ { 0x133B, 51575 },
+ { 0x133C, 51578 },
+ { 0x133F, 51581 },
+ { 0x1343, 51584 },
+ { 0x1344, 51587 },
+ { 0x1347, 51590 },
+ { 0x128B, 51593 },
+ { 0x128C, 51596 },
+ { 0x2DD3, 51599 },
+ { 0x2DD4, 51602 },
+ { 0x12E3, 51605 },
+ { 0x12E4, 51608 },
+ { 0x12E7, 51611 },
+ { 0x2DB3, 51614 },
+ { 0x2DB4, 51617 },
+ { 0x2DBB, 51620 },
+ { 0x2DBC, 51623 },
+ { 0x131F, 51626 },
+ { 0x2D95, 51629 },
+ { 0x12C3, 51632 },
+ { 0x12C4, 51635 },
+ { 0x125B, 51638 },
+ { 0x125C, 51641 },
+ { 0x12A0, 51644 },
+ { 0x12A5, 51648 },
+ { 0x12A2, 51652 },
+ { 0x12A6, 51656 },
+ { 0x12A1, 51660 },
+ { 0x12A3, 51664 },
+ { 0x12A4, 51668 },
+ { 0x2D8A, 51672 },
+ { 0x12A7, 51676 },
+ { 0x1384, 51680 },
+ { 0x1388, 51684 },
+ { 0x1380, 51688 },
+ { 0x138C, 51692 },
+ { 0x12D0, 51696 },
+ { 0x12D5, 51700 },
+ { 0x12D2, 51704 },
+ { 0x12D6, 51708 },
+ { 0x12D1, 51712 },
+ { 0x12D3, 51716 },
+ { 0x12D4, 51720 },
+ { 0x135F, 51724 },
+ { 0x1368, 51728 },
+ { 0x1364, 51731 },
+ { 0x1361, 51733 },
+ { 0x06F1, 51735 },
+ { 0x06F6, 51739 },
+ { 0x06F2, 51743 },
+ { 0x06F5, 51747 },
+ { 0x06F4, 51751 },
+ { 0x06F9, 51755 },
+ { 0x06F0, 51759 },
+ { 0x06F8, 51763 },
+ { 0x06F7, 51767 },
+ { 0x06F3, 51771 },
+ { 0x00AA, 51775 },
+ { 0x23E5, 51778 },
+ { 0x2044, 51779 },
+ { 0x215F, 51781 },
+ { 0x2061, 51784 },
+ { 0x2D00, 51786 },
+ { 0x2D04, 51790 },
+ { 0x2D21, 51794 },
+ { 0x2D08, 51798 },
+ { 0x2D0D, 51802 },
+ { 0x2D13, 51806 },
+ { 0x2D23, 51810 },
+ { 0x2D01, 51814 },
+ { 0x2D1A, 51818 },
+ { 0x2D1C, 51822 },
+ { 0x2D03, 51826 },
+ { 0x2D02, 51830 },
+ { 0x2D20, 51834 },
+ { 0x2D24, 51838 },
+ { 0x2D22, 51842 },
+ { 0x2D25, 51846 },
+ { 0x2D1B, 51850 },
+ { 0x2D09, 51854 },
+ { 0x2D0A, 51858 },
+ { 0x2D0B, 51862 },
+ { 0x2D0C, 51866 },
+ { 0x2D0E, 51870 },
+ { 0x2D17, 51874 },
+ { 0x2D10, 51878 },
+ { 0x2D11, 51882 },
+ { 0x2D07, 51886 },
+ { 0x2D12, 51890 },
+ { 0x2D05, 51894 },
+ { 0x2D1E, 51898 },
+ { 0x2D06, 51902 },
+ { 0x2D1D, 51906 },
+ { 0x2D19, 51910 },
+ { 0x2D16, 51914 },
+ { 0x2D1F, 51918 },
+ { 0x2D15, 51922 },
+ { 0x2D14, 51926 },
+ { 0x2D18, 51930 },
+ { 0x2D0F, 51934 },
+ { 0x10D0, 51938 },
+ { 0x10D4, 51941 },
+ { 0x10F6, 51944 },
+ { 0x10F1, 51947 },
+ { 0x10D8, 51950 },
+ { 0x10DD, 51953 },
+ { 0x10E3, 51956 },
+ { 0x10F3, 51959 },
+ { 0x10F7, 51962 },
+ { 0x10FA, 51965 },
+ { 0x10D1, 51968 },
+ { 0x10EA, 51971 },
+ { 0x10EC, 51974 },
+ { 0x10D3, 51977 },
+ { 0x10D2, 51980 },
+ { 0x10F0, 51983 },
+ { 0x10F4, 51986 },
+ { 0x10F2, 51989 },
+ { 0x10F5, 51992 },
+ { 0x10EB, 51995 },
+ { 0x10D9, 51998 },
+ { 0x10DA, 52001 },
+ { 0x10DB, 52004 },
+ { 0x10DC, 52007 },
+ { 0x10DE, 52010 },
+ { 0x10E7, 52013 },
+ { 0x10E0, 52016 },
+ { 0x10E1, 52019 },
+ { 0x10D7, 52022 },
+ { 0x10E2, 52025 },
+ { 0x10D5, 52028 },
+ { 0x10EE, 52031 },
+ { 0x10D6, 52034 },
+ { 0x10ED, 52037 },
+ { 0x10E9, 52040 },
+ { 0x10E6, 52043 },
+ { 0x10EF, 52046 },
+ { 0x10E5, 52049 },
+ { 0x10E4, 52052 },
+ { 0x10E8, 52055 },
+ { 0x10DF, 52058 },
+ { 0x10F8, 52061 },
+ { 0x10F9, 52064 },
+ { 0x10A0, 52068 },
+ { 0x10A4, 52072 },
+ { 0x10C1, 52076 },
+ { 0x10A8, 52080 },
+ { 0x10AD, 52084 },
+ { 0x10B3, 52088 },
+ { 0x10C3, 52092 },
+ { 0x10A1, 52096 },
+ { 0x10BA, 52100 },
+ { 0x10BC, 52104 },
+ { 0x10A3, 52108 },
+ { 0x10A2, 52112 },
+ { 0x10C0, 52116 },
+ { 0x10C4, 52120 },
+ { 0x10C2, 52124 },
+ { 0x10C5, 52128 },
+ { 0x10BB, 52132 },
+ { 0x10A9, 52136 },
+ { 0x10AA, 52140 },
+ { 0x10AB, 52144 },
+ { 0x10AC, 52148 },
+ { 0x10AE, 52152 },
+ { 0x10B7, 52156 },
+ { 0x10B0, 52160 },
+ { 0x10B1, 52164 },
+ { 0x10A7, 52168 },
+ { 0x10B2, 52172 },
+ { 0x10A5, 52176 },
+ { 0x10BE, 52180 },
+ { 0x10A6, 52184 },
+ { 0x10BD, 52188 },
+ { 0x10B9, 52192 },
+ { 0x10B6, 52196 },
+ { 0x10BF, 52200 },
+ { 0x10B5, 52204 },
+ { 0x10B4, 52208 },
+ { 0x10B8, 52212 },
+ { 0x10AF, 52216 },
+ { 0x10FB, 52220 },
+ { 0x0AD0, 52223 },
+ { 0x0ABC, 52225 },
+ { 0x0ACD, 52228 },
+ { 0x0A83, 52231 },
+ { 0x0A82, 52234 },
+ { 0x0ABD, 52237 },
+ { 0x0A81, 52240 },
+ { 0x0AE7, 52243 },
+ { 0x0AEC, 52246 },
+ { 0x0AE8, 52249 },
+ { 0x0AEB, 52252 },
+ { 0x0AEA, 52255 },
+ { 0x0AEF, 52258 },
+ { 0x0AE6, 52261 },
+ { 0x0AEE, 52264 },
+ { 0x0AED, 52267 },
+ { 0x0AE9, 52270 },
+ { 0x0AF1, 52273 },
+ { 0x0AC7, 52276 },
+ { 0x0ABF, 52280 },
+ { 0x0ACB, 52284 },
+ { 0x0AC1, 52288 },
+ { 0x0ABE, 52292 },
+ { 0x0AC8, 52296 },
+ { 0x0ACC, 52300 },
+ { 0x0AC0, 52304 },
+ { 0x0AC2, 52308 },
+ { 0x0AC5, 52312 },
+ { 0x0AC9, 52317 },
+ { 0x0AE2, 52322 },
+ { 0x0AC3, 52327 },
+ { 0x0AE3, 52332 },
+ { 0x0AC4, 52337 },
+ { 0x0A8D, 52342 },
+ { 0x0A91, 52346 },
+ { 0x0A85, 52350 },
+ { 0x0A8F, 52353 },
+ { 0x0A87, 52356 },
+ { 0x0A93, 52359 },
+ { 0x0A89, 52362 },
+ { 0x0A86, 52365 },
+ { 0x0A90, 52368 },
+ { 0x0A94, 52371 },
+ { 0x0AAC, 52374 },
+ { 0x0A9A, 52377 },
+ { 0x0AA6, 52380 },
+ { 0x0A97, 52383 },
+ { 0x0AB9, 52386 },
+ { 0x0A88, 52389 },
+ { 0x0A9C, 52392 },
+ { 0x0A95, 52395 },
+ { 0x0AB2, 52398 },
+ { 0x0AAE, 52401 },
+ { 0x0AA8, 52404 },
+ { 0x0AAA, 52407 },
+ { 0x0AB0, 52410 },
+ { 0x0AB8, 52413 },
+ { 0x0AA4, 52416 },
+ { 0x0A8A, 52419 },
+ { 0x0AB5, 52422 },
+ { 0x0AAF, 52425 },
+ { 0x0AAD, 52428 },
+ { 0x0A9B, 52431 },
+ { 0x0AA1, 52434 },
+ { 0x0AA7, 52437 },
+ { 0x0A98, 52440 },
+ { 0x0A9D, 52443 },
+ { 0x0A96, 52446 },
+ { 0x0AB3, 52449 },
+ { 0x0A99, 52452 },
+ { 0x0AA3, 52455 },
+ { 0x0A9E, 52458 },
+ { 0x0AAB, 52461 },
+ { 0x0AB6, 52464 },
+ { 0x0AB7, 52467 },
+ { 0x0AA5, 52470 },
+ { 0x0A9F, 52473 },
+ { 0x0AA2, 52476 },
+ { 0x0AA0, 52479 },
+ { 0x0A8C, 52482 },
+ { 0x0A8B, 52486 },
+ { 0x0AE1, 52490 },
+ { 0x0AE0, 52494 },
+ { 0x0A74, 52498 },
+ { 0x0A72, 52501 },
+ { 0x0A73, 52503 },
+ { 0x0A01, 52505 },
+ { 0x0A02, 52509 },
+ { 0x0A3C, 52512 },
+ { 0x0A51, 52515 },
+ { 0x0A4D, 52518 },
+ { 0x0A75, 52521 },
+ { 0x0A03, 52524 },
+ { 0x0A71, 52527 },
+ { 0x0A67, 52529 },
+ { 0x0A6C, 52532 },
+ { 0x0A68, 52535 },
+ { 0x0A6B, 52538 },
+ { 0x0A6A, 52541 },
+ { 0x0A6F, 52544 },
+ { 0x0A66, 52547 },
+ { 0x0A6E, 52550 },
+ { 0x0A6D, 52553 },
+ { 0x0A69, 52556 },
+ { 0x0A70, 52559 },
+ { 0x0A3F, 52561 },
+ { 0x0A41, 52565 },
+ { 0x0A3E, 52569 },
+ { 0x0A48, 52573 },
+ { 0x0A4C, 52577 },
+ { 0x0A47, 52581 },
+ { 0x0A40, 52585 },
+ { 0x0A4B, 52589 },
+ { 0x0A42, 52593 },
+ { 0x0A05, 52597 },
+ { 0x0A07, 52600 },
+ { 0x0A09, 52603 },
+ { 0x0A06, 52606 },
+ { 0x0A10, 52609 },
+ { 0x0A14, 52612 },
+ { 0x0A2C, 52615 },
+ { 0x0A1A, 52618 },
+ { 0x0A26, 52621 },
+ { 0x0A0F, 52624 },
+ { 0x0A5E, 52627 },
+ { 0x0A17, 52630 },
+ { 0x0A39, 52633 },
+ { 0x0A08, 52636 },
+ { 0x0A1C, 52639 },
+ { 0x0A15, 52642 },
+ { 0x0A32, 52645 },
+ { 0x0A2E, 52648 },
+ { 0x0A28, 52651 },
+ { 0x0A13, 52654 },
+ { 0x0A2A, 52657 },
+ { 0x0A30, 52660 },
+ { 0x0A38, 52663 },
+ { 0x0A24, 52666 },
+ { 0x0A0A, 52669 },
+ { 0x0A35, 52672 },
+ { 0x0A2F, 52675 },
+ { 0x0A5B, 52678 },
+ { 0x0A2D, 52681 },
+ { 0x0A1B, 52684 },
+ { 0x0A21, 52687 },
+ { 0x0A27, 52690 },
+ { 0x0A18, 52693 },
+ { 0x0A1D, 52696 },
+ { 0x0A16, 52699 },
+ { 0x0A33, 52702 },
+ { 0x0A19, 52705 },
+ { 0x0A23, 52708 },
+ { 0x0A1E, 52711 },
+ { 0x0A2B, 52714 },
+ { 0x0A5C, 52717 },
+ { 0x0A36, 52720 },
+ { 0x0A25, 52723 },
+ { 0x0A1F, 52726 },
+ { 0x0A22, 52729 },
+ { 0x0A5A, 52732 },
+ { 0x0A59, 52735 },
+ { 0x0A20, 52738 },
+ { 0x3021, 52741 },
+ { 0x3026, 52744 },
+ { 0x3038, 52747 },
+ { 0x3022, 52750 },
+ { 0x3025, 52753 },
+ { 0x3024, 52756 },
+ { 0x3029, 52759 },
+ { 0x3028, 52762 },
+ { 0x3027, 52765 },
+ { 0x3023, 52768 },
+ { 0x303A, 52771 },
+ { 0x3039, 52774 },
+ { 0x4DC6, 52777 },
+ { 0x4DEF, 52781 },
+ { 0x4DE4, 52785 },
+ { 0x4DF8, 52789 },
+ { 0x4DF9, 52794 },
+ { 0x4DDC, 52799 },
+ { 0x4DF3, 52804 },
+ { 0x4DF2, 52810 },
+ { 0x4DF1, 52815 },
+ { 0x4DDD, 52819 },
+ { 0x4DC0, 52824 },
+ { 0x4DF5, 52829 },
+ { 0x4DF7, 52834 },
+ { 0x4DC1, 52838 },
+ { 0x4DD1, 52843 },
+ { 0x4DFE, 52849 },
+ { 0x4DD5, 52853 },
+ { 0x4DE1, 52856 },
+ { 0x4DD9, 52860 },
+ { 0x4DCD, 52864 },
+ { 0x4DDB, 52868 },
+ { 0x4DFC, 52872 },
+ { 0x4DDA, 52876 },
+ { 0x4DCA, 52880 },
+ { 0x4DC8, 52883 },
+ { 0x4DFD, 52887 },
+ { 0x4DFF, 52891 },
+ { 0x4DD4, 52895 },
+ { 0x4DEB, 52899 },
+ { 0x4DD7, 52904 },
+ { 0x4DC7, 52907 },
+ { 0x4DCE, 52911 },
+ { 0x4DED, 52914 },
+ { 0x4DE0, 52918 },
+ { 0x4DC4, 52921 },
+ { 0x4DD2, 52924 },
+ { 0x4DC5, 52927 },
+ { 0x4DE8, 52930 },
+ { 0x4DDF, 52933 },
+ { 0x4DE9, 52936 },
+ { 0x4DE2, 52939 },
+ { 0x4DC9, 52942 },
+ { 0x4DC3, 52945 },
+ { 0x4DF6, 52949 },
+ { 0x4DE3, 52952 },
+ { 0x4DD0, 52958 },
+ { 0x4DEC, 52961 },
+ { 0x4DDE, 52965 },
+ { 0x4DD8, 52968 },
+ { 0x4DD6, 52971 },
+ { 0x4DC2, 52975 },
+ { 0x4DFA, 52981 },
+ { 0x4DCF, 52984 },
+ { 0x4DCC, 52987 },
+ { 0x4DFB, 52990 },
+ { 0x4DE5, 52993 },
+ { 0x4DEE, 52996 },
+ { 0x4DF0, 52999 },
+ { 0x4DCB, 53002 },
+ { 0x4DE7, 53005 },
+ { 0x4DF4, 53008 },
+ { 0x4DE6, 53011 },
+ { 0x4DEA, 53014 },
+ { 0x4DD3, 53017 },
+ { 0x3042, 53020 },
+ { 0x3048, 53023 },
+ { 0x3044, 53026 },
+ { 0x3093, 53029 },
+ { 0x304A, 53032 },
+ { 0x3046, 53035 },
+ { 0x3070, 53038 },
+ { 0x3079, 53041 },
+ { 0x3073, 53044 },
+ { 0x307C, 53047 },
+ { 0x3076, 53050 },
+ { 0x3060, 53053 },
+ { 0x3067, 53056 },
+ { 0x3062, 53059 },
+ { 0x3069, 53062 },
+ { 0x3065, 53065 },
+ { 0x304C, 53068 },
+ { 0x3052, 53071 },
+ { 0x304E, 53074 },
+ { 0x3054, 53077 },
+ { 0x3050, 53080 },
+ { 0x306F, 53083 },
+ { 0x3078, 53086 },
+ { 0x3072, 53089 },
+ { 0x307B, 53092 },
+ { 0x3075, 53095 },
+ { 0x304B, 53098 },
+ { 0x3051, 53101 },
+ { 0x304D, 53104 },
+ { 0x3053, 53107 },
+ { 0x304F, 53110 },
+ { 0x307E, 53113 },
+ { 0x3081, 53116 },
+ { 0x307F, 53119 },
+ { 0x3082, 53122 },
+ { 0x3080, 53125 },
+ { 0x306A, 53128 },
+ { 0x306D, 53131 },
+ { 0x306B, 53134 },
+ { 0x306E, 53137 },
+ { 0x306C, 53140 },
+ { 0x3071, 53143 },
+ { 0x307A, 53146 },
+ { 0x3074, 53149 },
+ { 0x307D, 53152 },
+ { 0x3077, 53155 },
+ { 0x3089, 53158 },
+ { 0x308C, 53161 },
+ { 0x308A, 53164 },
+ { 0x308D, 53167 },
+ { 0x308B, 53170 },
+ { 0x3055, 53173 },
+ { 0x305B, 53176 },
+ { 0x3057, 53179 },
+ { 0x305D, 53182 },
+ { 0x3059, 53185 },
+ { 0x305F, 53188 },
+ { 0x3066, 53191 },
+ { 0x3061, 53194 },
+ { 0x3068, 53197 },
+ { 0x3064, 53200 },
+ { 0x3094, 53203 },
+ { 0x308F, 53206 },
+ { 0x3091, 53209 },
+ { 0x3090, 53212 },
+ { 0x3092, 53215 },
+ { 0x3084, 53218 },
+ { 0x3088, 53221 },
+ { 0x3086, 53224 },
+ { 0x3056, 53227 },
+ { 0x305C, 53230 },
+ { 0x3058, 53233 },
+ { 0x305E, 53236 },
+ { 0x305A, 53239 },
+ { 0x3041, 53242 },
+ { 0x3047, 53246 },
+ { 0x3043, 53250 },
+ { 0x3049, 53254 },
+ { 0x3045, 53258 },
+ { 0x3095, 53262 },
+ { 0x3096, 53266 },
+ { 0x3063, 53270 },
+ { 0x308E, 53274 },
+ { 0x3083, 53278 },
+ { 0x3087, 53282 },
+ { 0x3085, 53286 },
+ { 0x309E, 53290 },
+ { 0x309F, 53294 },
+ { 0x309D, 53297 },
+ { 0x221E, 53300 },
+ { 0x29DE, 53301 },
+ { 0x222B, 53306 },
+ { 0x2A18, 53307 },
+ { 0x2A1A, 53311 },
+ { 0x2A0E, 53314 },
+ { 0x2A1B, 53318 },
+ { 0x2A1C, 53321 },
+ { 0x2A17, 53324 },
+ { 0x2A19, 53330 },
+ { 0x2A15, 53333 },
+ { 0x2A0F, 53338 },
+ { 0x23AE, 53342 },
+ { 0x2A3C, 53344 },
+ { 0x2127, 53346 },
+ { 0x223E, 53349 },
+ { 0x00BF, 53352 },
+ { 0x2054, 53355 },
+ { 0x00A1, 53357 },
+ { 0x2E18, 53360 },
+ { 0x3004, 53362 },
+ { 0x30A2, 53366 },
+ { 0x30A8, 53369 },
+ { 0x30A4, 53372 },
+ { 0x30F3, 53375 },
+ { 0x30AA, 53378 },
+ { 0x30A6, 53381 },
+ { 0x30D0, 53384 },
+ { 0x30D9, 53387 },
+ { 0x30D3, 53390 },
+ { 0x30DC, 53393 },
+ { 0x30D6, 53396 },
+ { 0x30C0, 53399 },
+ { 0x30C7, 53402 },
+ { 0x30C2, 53405 },
+ { 0x30C9, 53408 },
+ { 0x30C5, 53411 },
+ { 0x30AC, 53414 },
+ { 0x30B2, 53417 },
+ { 0x30AE, 53420 },
+ { 0x30B4, 53423 },
+ { 0x30B0, 53426 },
+ { 0x30CF, 53429 },
+ { 0x30D8, 53432 },
+ { 0x30D2, 53435 },
+ { 0x30DB, 53438 },
+ { 0x30D5, 53441 },
+ { 0x30AB, 53444 },
+ { 0x30B1, 53447 },
+ { 0x30AD, 53450 },
+ { 0x30B3, 53453 },
+ { 0x30AF, 53456 },
+ { 0x30DE, 53459 },
+ { 0x30E1, 53462 },
+ { 0x30DF, 53465 },
+ { 0x30E2, 53468 },
+ { 0x30E0, 53471 },
+ { 0x30CA, 53474 },
+ { 0x30CD, 53477 },
+ { 0x30CB, 53480 },
+ { 0x30CE, 53483 },
+ { 0x30CC, 53486 },
+ { 0x30D1, 53489 },
+ { 0x30DA, 53492 },
+ { 0x30D4, 53495 },
+ { 0x30DD, 53498 },
+ { 0x30D7, 53501 },
+ { 0x30E9, 53504 },
+ { 0x30EC, 53507 },
+ { 0x30EA, 53510 },
+ { 0x30ED, 53513 },
+ { 0x30EB, 53516 },
+ { 0x30B5, 53519 },
+ { 0x30BB, 53522 },
+ { 0x30B7, 53525 },
+ { 0x30BD, 53528 },
+ { 0x30B9, 53531 },
+ { 0x30BF, 53534 },
+ { 0x30C6, 53537 },
+ { 0x30C1, 53540 },
+ { 0x30C8, 53543 },
+ { 0x30C4, 53546 },
+ { 0x30F7, 53549 },
+ { 0x30F9, 53552 },
+ { 0x30F8, 53555 },
+ { 0x30FA, 53558 },
+ { 0x30F4, 53561 },
+ { 0x30EF, 53564 },
+ { 0x30F1, 53567 },
+ { 0x30F0, 53570 },
+ { 0x30F2, 53573 },
+ { 0x30E4, 53576 },
+ { 0x30E8, 53579 },
+ { 0x30E6, 53582 },
+ { 0x30B6, 53585 },
+ { 0x30BC, 53588 },
+ { 0x30B8, 53591 },
+ { 0x30BE, 53594 },
+ { 0x30BA, 53597 },
+ { 0x30A1, 53600 },
+ { 0x30A7, 53604 },
+ { 0x30A3, 53608 },
+ { 0x30A9, 53612 },
+ { 0x30A5, 53616 },
+ { 0x31F5, 53620 },
+ { 0x31F8, 53624 },
+ { 0x31F6, 53628 },
+ { 0x31F9, 53632 },
+ { 0x31F7, 53636 },
+ { 0x30F5, 53640 },
+ { 0x30F6, 53644 },
+ { 0x31F0, 53648 },
+ { 0x31FA, 53652 },
+ { 0x31F4, 53656 },
+ { 0x31FB, 53660 },
+ { 0x31FE, 53664 },
+ { 0x31FC, 53668 },
+ { 0x31FF, 53672 },
+ { 0x31FD, 53676 },
+ { 0x31F1, 53680 },
+ { 0x31F2, 53684 },
+ { 0x31F3, 53688 },
+ { 0x30C3, 53692 },
+ { 0x30EE, 53696 },
+ { 0x30E3, 53700 },
+ { 0x30E7, 53704 },
+ { 0x30E5, 53708 },
+ { 0x30FB, 53712 },
+ { 0x30FE, 53715 },
+ { 0x30FF, 53719 },
+ { 0x30FD, 53722 },
+ { 0x2328, 53725 },
+ { 0xC001, 53726 },
+ { 0x26AD, 53728 },
+ { 0x225E, 53730 },
+ { 0x2221, 53732 },
+ { 0x29A9, 53734 },
+ { 0x29A8, 53746 },
+ { 0x29AB, 53758 },
+ { 0x29AA, 53770 },
+ { 0x29AD, 53782 },
+ { 0x29AF, 53794 },
+ { 0x29AC, 53806 },
+ { 0x29AE, 53818 },
+ { 0x299B, 53830 },
+ { 0x299D, 53834 },
+ { 0x23D5, 53839 },
+ { 0x23D6, 53844 },
+ { 0x23D4, 53848 },
+ { 0x23D2, 53853 },
+ { 0x23D1, 53857 },
+ { 0x23D3, 53859 },
+ { 0x23D7, 53863 },
+ { 0x23D9, 53865 },
+ { 0x23D8, 53867 },
+ { 0x02D4, 53869 },
+ { 0x02C4, 53873 },
+ { 0x5770, 53877 },
+ { 0x5718, 53880 },
+ { 0x5717, 53884 },
+ { 0x5719, 53889 },
+ { 0x02FC, 53894 },
+ { 0x02FA, 53899 },
+ { 0x02F0, 53904 },
+ { 0x02EF, 53909 },
+ { 0x02FF, 53914 },
+ { 0x02F1, 53919 },
+ { 0x02F3, 53924 },
+ { 0x02E8, 53928 },
+ { 0x02CF, 53933 },
+ { 0x02CE, 53938 },
+ { 0x02F2, 53943 },
+ { 0x02F7, 53948 },
+ { 0x570B, 53952 },
+ { 0x5710, 53958 },
+ { 0x02CD, 53965 },
+ { 0x571F, 53969 },
+ { 0x02CC, 53975 },
+ { 0x5715, 53980 },
+ { 0x5788, 53986 },
+ { 0x02E7, 53991 },
+ { 0x570A, 53996 },
+ { 0x570F, 54002 },
+ { 0x5714, 54009 },
+ { 0x02EA, 54015 },
+ { 0x02D5, 54021 },
+ { 0x02C5, 54025 },
+ { 0x02D1, 54029 },
+ { 0x02E6, 54034 },
+ { 0x5709, 54039 },
+ { 0x570E, 54045 },
+ { 0x5713, 54052 },
+ { 0x02BF, 54058 },
+ { 0x02C2, 54063 },
+ { 0x02FE, 54067 },
+ { 0x02D6, 54071 },
+ { 0x02EB, 54075 },
+ { 0x02CA, 54081 },
+ { 0x02FB, 54085 },
+ { 0x02F9, 54090 },
+ { 0x5789, 54095 },
+ { 0x02DF, 54098 },
+ { 0x02CB, 54102 },
+ { 0x571A, 54106 },
+ { 0x02D7, 54112 },
+ { 0x02B9, 54116 },
+ { 0x02BE, 54119 },
+ { 0x02C3, 54124 },
+ { 0x02FD, 54128 },
+ { 0x578A, 54131 },
+ { 0x1D43, 54136 },
+ { 0x1D47, 54140 },
+ { 0x1D9C, 54144 },
+ { 0x1D9D, 54148 },
+ { 0x1D48, 54154 },
+ { 0x1D49, 54158 },
+ { 0x1DA0, 54162 },
+ { 0x1D4D, 54166 },
+ { 0x02B0, 54170 },
+ { 0x02B1, 54174 },
+ { 0x1DA4, 54180 },
+ { 0x02B2, 54186 },
+ { 0x1DA8, 54190 },
+ { 0x1D4F, 54196 },
+ { 0x02E1, 54200 },
+ { 0x1DAA, 54204 },
+ { 0x1DA9, 54211 },
+ { 0x1D50, 54218 },
+ { 0x1DAC, 54222 },
+ { 0x1DAE, 54228 },
+ { 0x1DAF, 54235 },
+ { 0x1D52, 54242 },
+ { 0x1D56, 54246 },
+ { 0x02B3, 54250 },
+ { 0x02E2, 54254 },
+ { 0x1DB3, 54258 },
+ { 0x1D57, 54264 },
+ { 0x1DB5, 54268 },
+ { 0x1D58, 54275 },
+ { 0x1DB6, 54279 },
+ { 0x1D5B, 54284 },
+ { 0x1DB9, 54288 },
+ { 0x02B7, 54294 },
+ { 0x02E3, 54298 },
+ { 0x02B8, 54302 },
+ { 0x1DBB, 54306 },
+ { 0x1DBD, 54310 },
+ { 0x1DBC, 54316 },
+ { 0x1D5C, 54323 },
+ { 0x1D61, 54327 },
+ { 0x1D51, 54331 },
+ { 0x1DB4, 54335 },
+ { 0x1D9E, 54339 },
+ { 0x1DBE, 54343 },
+ { 0x1DB2, 54347 },
+ { 0x1D54, 54351 },
+ { 0x1D5D, 54357 },
+ { 0x1DA5, 54361 },
+ { 0x1D4B, 54365 },
+ { 0x1D53, 54370 },
+ { 0x1D45, 54375 },
+ { 0x1D5F, 54379 },
+ { 0x02E0, 54383 },
+ { 0x1D60, 54387 },
+ { 0x1D5E, 54392 },
+ { 0x1D4A, 54397 },
+ { 0x1DBF, 54401 },
+ { 0x1DB1, 54405 },
+ { 0x1D55, 54410 },
+ { 0x1DA2, 54416 },
+ { 0x1D44, 54421 },
+ { 0x1DA3, 54426 },
+ { 0x1D4E, 54431 },
+ { 0x1D5A, 54436 },
+ { 0x1DAD, 54441 },
+ { 0x02B4, 54449 },
+ { 0x02B5, 54454 },
+ { 0x1DBA, 54461 },
+ { 0x1D46, 54466 },
+ { 0x1D4C, 54471 },
+ { 0x1D9B, 54477 },
+ { 0x1DA6, 54482 },
+ { 0x1DA7, 54487 },
+ { 0x1DAB, 54494 },
+ { 0x1DB0, 54499 },
+ { 0x1DB8, 54504 },
+ { 0x02B6, 54509 },
+ { 0x1DA1, 54515 },
+ { 0x1DB7, 54522 },
+ { 0x1D9F, 54526 },
+ { 0x02E4, 54532 },
+ { 0x1D59, 54538 },
+ { 0x02BA, 54543 },
+ { 0x02EE, 54547 },
+ { 0x02C9, 54551 },
+ { 0x02F4, 54554 },
+ { 0x02F6, 54559 },
+ { 0x02F5, 54565 },
+ { 0x571B, 54571 },
+ { 0x571C, 54576 },
+ { 0x02F8, 54581 },
+ { 0x571E, 54585 },
+ { 0x571D, 54591 },
+ { 0x02DE, 54596 },
+ { 0x5721, 54600 },
+ { 0x5720, 54606 },
+ { 0x02BB, 54612 },
+ { 0x1D2C, 54616 },
+ { 0x1D2E, 54620 },
+ { 0x1D30, 54624 },
+ { 0x1D31, 54628 },
+ { 0x1D33, 54632 },
+ { 0x1D34, 54636 },
+ { 0x1D35, 54640 },
+ { 0x1D36, 54644 },
+ { 0x1D37, 54648 },
+ { 0x1D38, 54652 },
+ { 0x1D39, 54656 },
+ { 0x1D3A, 54660 },
+ { 0x1D3C, 54664 },
+ { 0x1D3E, 54668 },
+ { 0x1D3F, 54672 },
+ { 0x1D40, 54676 },
+ { 0x1D41, 54680 },
+ { 0x2C7D, 54684 },
+ { 0x1D42, 54688 },
+ { 0x1D2D, 54692 },
+ { 0x1D3D, 54696 },
+ { 0x1D2F, 54700 },
+ { 0x1D32, 54705 },
+ { 0x1D3B, 54710 },
+ { 0x02D3, 54715 },
+ { 0x02D2, 54721 },
+ { 0x5704, 54727 },
+ { 0x5706, 54733 },
+ { 0x5700, 54739 },
+ { 0x5702, 54745 },
+ { 0x5705, 54751 },
+ { 0x5707, 54757 },
+ { 0x5701, 54763 },
+ { 0x5703, 54769 },
+ { 0x02C0, 54775 },
+ { 0x02EC, 54779 },
+ { 0x1D78, 54782 },
+ { 0x10FC, 54786 },
+ { 0x02BD, 54790 },
+ { 0x02C1, 54794 },
+ { 0x02C8, 54799 },
+ { 0x02E9, 54803 },
+ { 0x570C, 54808 },
+ { 0x5711, 54814 },
+ { 0x5716, 54821 },
+ { 0x02BC, 54827 },
+ { 0x02C6, 54830 },
+ { 0x02E5, 54834 },
+ { 0x5708, 54839 },
+ { 0x570D, 54845 },
+ { 0x5712, 54852 },
+ { 0x02D0, 54858 },
+ { 0x02ED, 54862 },
+ { 0x268B, 54865 },
+ { 0x268A, 54868 },
+ { 0x9300, 54871 },
+ { 0x22B8, 54874 },
+ { 0x228C, 54875 },
+ { 0x228E, 54876 },
+ { 0x228D, 54878 },
+ { 0x206E, 54880 },
+ { 0x24FF, 54883 },
+ { 0x24EB, 54887 },
+ { 0x24EC, 54891 },
+ { 0x24F4, 54895 },
+ { 0x24EF, 54899 },
+ { 0x24F0, 54903 },
+ { 0x24F2, 54907 },
+ { 0x24EE, 54911 },
+ { 0x24F3, 54915 },
+ { 0x24ED, 54919 },
+ { 0x24F1, 54923 },
+ { 0x00A0, 54927 },
+ { 0x22B6, 54929 },
+ { 0x2626, 54931 },
+ { 0x272D, 54933 },
+ { 0x2719, 54936 },
+ { 0x271F, 54939 },
+ { 0x269D, 54942 },
+ { 0x203E, 54945 },
+ { 0x2225, 54946 },
+ { 0x2AF3, 54948 },
+ { 0x2AF2, 54952 },
+ { 0x5876, 54956 },
+ { 0x5877, 54959 },
+ { 0x5875, 54963 },
+ { 0x585D, 54967 },
+ { 0x5860, 54970 },
+ { 0x585E, 54973 },
+ { 0x5861, 54976 },
+ { 0x585F, 54979 },
+ { 0x584E, 54982 },
+ { 0x5844, 54985 },
+ { 0x584A, 54988 },
+ { 0x5866, 54991 },
+ { 0x5864, 54994 },
+ { 0x5842, 54997 },
+ { 0x585C, 55000 },
+ { 0x5846, 55003 },
+ { 0x5840, 55006 },
+ { 0x5859, 55009 },
+ { 0x584F, 55012 },
+ { 0x584B, 55015 },
+ { 0x584C, 55018 },
+ { 0x5862, 55021 },
+ { 0x5858, 55024 },
+ { 0x585B, 55027 },
+ { 0x5848, 55030 },
+ { 0x5853, 55033 },
+ { 0x5863, 55036 },
+ { 0x5857, 55039 },
+ { 0x5855, 55042 },
+ { 0x5845, 55045 },
+ { 0x586B, 55048 },
+ { 0x5852, 55051 },
+ { 0x5865, 55054 },
+ { 0x5841, 55057 },
+ { 0x5843, 55060 },
+ { 0x586C, 55063 },
+ { 0x5847, 55066 },
+ { 0x584D, 55069 },
+ { 0x585A, 55072 },
+ { 0x5849, 55075 },
+ { 0x5850, 55078 },
+ { 0x5869, 55081 },
+ { 0x5854, 55084 },
+ { 0x5851, 55087 },
+ { 0x586A, 55090 },
+ { 0x5856, 55093 },
+ { 0x586F, 55097 },
+ { 0x586D, 55101 },
+ { 0x5870, 55105 },
+ { 0x586E, 55109 },
+ { 0x5873, 55113 },
+ { 0x5874, 55116 },
+ { 0x5871, 55120 },
+ { 0x5867, 55124 },
+ { 0x5868, 55128 },
+ { 0x5872, 55132 },
+ { 0x71F7, 55136 },
+ { 0x71F1, 55141 },
+ { 0x71DA, 55145 },
+ { 0x71EC, 55149 },
+ { 0x71E0, 55153 },
+ { 0x71ED, 55157 },
+ { 0x71DF, 55161 },
+ { 0x71DC, 55165 },
+ { 0x71E4, 55169 },
+ { 0x71EF, 55173 },
+ { 0x71EA, 55177 },
+ { 0x71E9, 55181 },
+ { 0x71F6, 55185 },
+ { 0x71E8, 55189 },
+ { 0x71F3, 55193 },
+ { 0x71FC, 55197 },
+ { 0x71D9, 55202 },
+ { 0x71EB, 55206 },
+ { 0x71D4, 55211 },
+ { 0x71EE, 55215 },
+ { 0x71F8, 55219 },
+ { 0x71F2, 55223 },
+ { 0x71E5, 55228 },
+ { 0x71FB, 55232 },
+ { 0x71D8, 55237 },
+ { 0x71F0, 55241 },
+ { 0x71D5, 55245 },
+ { 0x71E6, 55249 },
+ { 0x71E3, 55253 },
+ { 0x71F9, 55257 },
+ { 0x71D6, 55261 },
+ { 0x71D1, 55265 },
+ { 0x71DB, 55270 },
+ { 0x71E7, 55274 },
+ { 0x71D3, 55278 },
+ { 0x71DE, 55282 },
+ { 0x71F4, 55286 },
+ { 0x71F5, 55290 },
+ { 0x71D7, 55294 },
+ { 0x71DD, 55298 },
+ { 0x71FA, 55302 },
+ { 0x71D2, 55306 },
+ { 0x71E1, 55311 },
+ { 0x71E2, 55315 },
+ { 0x71FD, 55320 },
+ { 0x71D0, 55326 },
+ { 0x272F, 55330 },
+ { 0x2316, 55332 },
+ { 0x227A, 55334 },
+ { 0x227C, 55335 },
+ { 0x227E, 55339 },
+ { 0x22E8, 55343 },
+ { 0x2AB5, 55348 },
+ { 0x2AB9, 55353 },
+ { 0x2AB7, 55359 },
+ { 0x2AB3, 55364 },
+ { 0x2AB1, 55368 },
+ { 0x2AAF, 55374 },
+ { 0x22B0, 55379 },
+ { 0x2397, 55382 },
+ { 0x214A, 55384 },
+ { 0x2596, 55386 },
+ { 0x2597, 55389 },
+ { 0x2598, 55392 },
+ { 0x2599, 55395 },
+ { 0x259A, 55404 },
+ { 0x259B, 55410 },
+ { 0x259C, 55419 },
+ { 0x259D, 55428 },
+ { 0x259E, 55431 },
+ { 0x259F, 55437 },
+ { 0x003F, 55446 },
+ { 0x2048, 55448 },
+ { 0x26BB, 55451 },
+ { 0x267C, 55452 },
+ { 0x211F, 55455 },
+ { 0x2310, 55456 },
+ { 0x29A3, 55459 },
+ { 0x29A5, 55461 },
+ { 0x29B0, 55465 },
+ { 0x2035, 55468 },
+ { 0x223D, 55470 },
+ { 0x22CD, 55472 },
+ { 0x2036, 55475 },
+ { 0x301D, 55478 },
+ { 0x2AED, 55483 },
+ { 0x2E11, 55488 },
+ { 0x2037, 55491 },
+ { 0x204B, 55494 },
+ { 0x2619, 55497 },
+ { 0x2E2E, 55502 },
+ { 0x204F, 55505 },
+ { 0x2143, 55507 },
+ { 0x264F, 55511 },
+ { 0x2730, 55512 },
+ { 0x271E, 55515 },
+ { 0x274D, 55519 },
+ { 0x2618, 55522 },
+ { 0x5673, 55523 },
+ { 0x2263, 55525 },
+ { 0x227B, 55528 },
+ { 0x227D, 55529 },
+ { 0x227F, 55533 },
+ { 0x22E9, 55537 },
+ { 0x2AB6, 55542 },
+ { 0x2ABA, 55547 },
+ { 0x2AB8, 55553 },
+ { 0x2AB4, 55558 },
+ { 0x2AB2, 55562 },
+ { 0x2AB0, 55568 },
+ { 0x22B1, 55573 },
+ { 0x2283, 55576 },
+ { 0x2287, 55578 },
+ { 0x2AC4, 55583 },
+ { 0x228B, 55591 },
+ { 0x2ACC, 55597 },
+ { 0x2AC8, 55603 },
+ { 0x2ACA, 55608 },
+ { 0x2AC6, 55614 },
+ { 0x2ABE, 55619 },
+ { 0x2AC0, 55622 },
+ { 0x2AC2, 55627 },
+ { 0x2AD4, 55632 },
+ { 0x2AD6, 55635 },
+ { 0x297B, 55638 },
+ { 0x2AD8, 55642 },
+ { 0x2AD7, 55650 },
+ { 0x27C9, 55653 },
+ { 0x232F, 55656 },
+ { 0x1772, 55657 },
+ { 0x1773, 55661 },
+ { 0x1760, 55665 },
+ { 0x1761, 55668 },
+ { 0x1762, 55671 },
+ { 0x176A, 55674 },
+ { 0x1767, 55677 },
+ { 0x1764, 55680 },
+ { 0x1763, 55683 },
+ { 0x176E, 55686 },
+ { 0x176B, 55689 },
+ { 0x1768, 55692 },
+ { 0x1769, 55695 },
+ { 0x1770, 55698 },
+ { 0x1766, 55701 },
+ { 0x176F, 55704 },
+ { 0x176C, 55707 },
+ { 0x1765, 55710 },
+ { 0x2D30, 55713 },
+ { 0x2D49, 55716 },
+ { 0x2D53, 55719 },
+ { 0x2D44, 55722 },
+ { 0x2D31, 55725 },
+ { 0x2D37, 55728 },
+ { 0x2D3C, 55731 },
+ { 0x2D33, 55734 },
+ { 0x2D40, 55737 },
+ { 0x2D36, 55740 },
+ { 0x2D3D, 55743 },
+ { 0x2D4D, 55746 },
+ { 0x2D4E, 55749 },
+ { 0x2D4F, 55752 },
+ { 0x2D52, 55755 },
+ { 0x2D47, 55758 },
+ { 0x2D54, 55761 },
+ { 0x2D59, 55764 },
+ { 0x2D5C, 55767 },
+ { 0x2D60, 55770 },
+ { 0x2D61, 55773 },
+ { 0x2D62, 55776 },
+ { 0x2D63, 55779 },
+ { 0x2D3B, 55782 },
+ { 0x2D58, 55785 },
+ { 0x2D32, 55789 },
+ { 0x2D5E, 55792 },
+ { 0x2D39, 55795 },
+ { 0x2D38, 55798 },
+ { 0x2D56, 55801 },
+ { 0x2D43, 55804 },
+ { 0x2D45, 55807 },
+ { 0x2D55, 55810 },
+ { 0x2D5B, 55813 },
+ { 0x2D5A, 55816 },
+ { 0x2D5D, 55819 },
+ { 0x2D5F, 55822 },
+ { 0x2D4A, 55825 },
+ { 0x2D65, 55828 },
+ { 0x2D3A, 55831 },
+ { 0x2D34, 55834 },
+ { 0x2D3F, 55837 },
+ { 0x2D41, 55840 },
+ { 0x2D35, 55845 },
+ { 0x2D42, 55850 },
+ { 0x2D3E, 55854 },
+ { 0x2D48, 55858 },
+ { 0x2D57, 55862 },
+ { 0x2D50, 55866 },
+ { 0x2D46, 55870 },
+ { 0x2D51, 55874 },
+ { 0x2D4C, 55878 },
+ { 0x2D4B, 55882 },
+ { 0x2D64, 55886 },
+ { 0x2D6F, 55890 },
+ { 0x204A, 55895 },
+ { 0x29CA, 55898 },
+ { 0x29CD, 55902 },
+ { 0x29CB, 55907 },
+ { 0x205D, 55910 },
+ { 0x739F, 55911 },
+ { 0x739B, 55914 },
+ { 0x739C, 55917 },
+ { 0x7385, 55920 },
+ { 0x7394, 55923 },
+ { 0x739A, 55926 },
+ { 0x7386, 55929 },
+ { 0x7391, 55932 },
+ { 0x7393, 55935 },
+ { 0x738B, 55938 },
+ { 0x7383, 55941 },
+ { 0x738E, 55944 },
+ { 0x7390, 55947 },
+ { 0x739D, 55950 },
+ { 0x7389, 55953 },
+ { 0x738A, 55956 },
+ { 0x7380, 55959 },
+ { 0x7381, 55962 },
+ { 0x738F, 55965 },
+ { 0x7388, 55968 },
+ { 0x7396, 55971 },
+ { 0x7395, 55974 },
+ { 0x738C, 55977 },
+ { 0x7387, 55980 },
+ { 0x7384, 55983 },
+ { 0x7382, 55986 },
+ { 0x7399, 55989 },
+ { 0x738D, 55992 },
+ { 0x7397, 55995 },
+ { 0x7392, 55998 },
+ { 0x7398, 56001 },
+ { 0x2602, 56004 },
+ { 0x2614, 56005 },
+ { 0x203F, 56009 },
+ { 0x2123, 56010 },
+ { 0x27CA, 56011 },
+ { 0x29D0, 56016 },
+ { 0x2AE4, 56021 },
+ { 0x2AE2, 56026 },
+ { 0x205E, 56031 },
+ { 0x3031, 56034 },
+ { 0x3035, 56038 },
+ { 0x3033, 56044 },
+ { 0x3032, 56050 },
+ { 0x3034, 56057 },
+ { 0x007C, 56066 },
+ { 0x2AEF, 56068 },
+ { 0x2AF0, 56073 },
+ { 0x237F, 56078 },
+ { 0x23D0, 56083 },
+ { 0x26A8, 56086 },
+ { 0x2E2F, 56091 },
+ { 0x299A, 56093 },
+ { 0x22EE, 56096 },
+ { 0x303B, 56098 },
+ { 0x2317, 56102 },
+ { 0x2101, 56104 },
+ { 0x0026, 56108 },
+ { 0x260A, 56109 },
+ { 0x22A6, 56111 },
+ { 0x2623, 56112 },
+ { 0x902F, 56114 },
+ { 0x900E, 56118 },
+ { 0x9085, 56123 },
+ { 0x9046, 56127 },
+ { 0x901A, 56132 },
+ { 0x9040, 56137 },
+ { 0x9079, 56141 },
+ { 0x9030, 56147 },
+ { 0x907D, 56151 },
+ { 0x907C, 56156 },
+ { 0x909C, 56161 },
+ { 0x909E, 56166 },
+ { 0x909A, 56171 },
+ { 0x90A1, 56177 },
+ { 0x909F, 56183 },
+ { 0x909D, 56188 },
+ { 0x909B, 56193 },
+ { 0x90A0, 56198 },
+ { 0x9033, 56203 },
+ { 0x900D, 56209 },
+ { 0x9097, 56214 },
+ { 0x90C8, 56218 },
+ { 0x90C9, 56223 },
+ { 0x90CA, 56228 },
+ { 0x9086, 56233 },
+ { 0x9080, 56237 },
+ { 0x902E, 56242 },
+ { 0x9048, 56246 },
+ { 0x9004, 56251 },
+ { 0x9003, 56256 },
+ { 0x9000, 56261 },
+ { 0x9025, 56265 },
+ { 0x9066, 56269 },
+ { 0x902D, 56273 },
+ { 0x9078, 56277 },
+ { 0x9014, 56282 },
+ { 0x9019, 56286 },
+ { 0x906A, 56290 },
+ { 0x9001, 56295 },
+ { 0x90D0, 56299 },
+ { 0x90D2, 56306 },
+ { 0x90D3, 56313 },
+ { 0x90D1, 56320 },
+ { 0x90CE, 56327 },
+ { 0x90CF, 56332 },
+ { 0x9060, 56337 },
+ { 0x9074, 56342 },
+ { 0x90C5, 56347 },
+ { 0x90CB, 56354 },
+ { 0x90BC, 56361 },
+ { 0x90C7, 56367 },
+ { 0x90C3, 56372 },
+ { 0x90C4, 56379 },
+ { 0x90C6, 56386 },
+ { 0x90BE, 56393 },
+ { 0x9034, 56400 },
+ { 0x90B9, 56405 },
+ { 0x90BD, 56412 },
+ { 0x90BF, 56418 },
+ { 0x90C2, 56424 },
+ { 0x90C1, 56431 },
+ { 0x90BA, 56438 },
+ { 0x90C0, 56444 },
+ { 0x90BB, 56450 },
+ { 0x90CC, 56456 },
+ { 0x90D8, 56462 },
+ { 0x90D9, 56467 },
+ { 0x908F, 56472 },
+ { 0x90F5, 56478 },
+ { 0x9016, 56484 },
+ { 0x9091, 56489 },
+ { 0x9090, 56495 },
+ { 0x90AC, 56501 },
+ { 0x9037, 56507 },
+ { 0x9024, 56512 },
+ { 0x907F, 56516 },
+ { 0x90F4, 56521 },
+ { 0x908B, 56526 },
+ { 0x908A, 56532 },
+ { 0x908C, 56538 },
+ { 0x908E, 56544 },
+ { 0x908D, 56550 },
+ { 0x9057, 56556 },
+ { 0x9047, 56561 },
+ { 0x9015, 56566 },
+ { 0x905B, 56571 },
+ { 0x9020, 56575 },
+ { 0x9059, 56580 },
+ { 0x9026, 56585 },
+ { 0x9017, 56590 },
+ { 0x9029, 56594 },
+ { 0x9069, 56598 },
+ { 0x90E8, 56603 },
+ { 0x900F, 56607 },
+ { 0x9087, 56611 },
+ { 0x9058, 56615 },
+ { 0x9006, 56620 },
+ { 0x9005, 56625 },
+ { 0x90D4, 56630 },
+ { 0x90D6, 56637 },
+ { 0x90D7, 56644 },
+ { 0x90D5, 56651 },
+ { 0x90CD, 56658 },
+ { 0x9050, 56663 },
+ { 0x90EC, 56667 },
+ { 0x90EB, 56672 },
+ { 0x90ED, 56677 },
+ { 0x90EF, 56682 },
+ { 0x90E9, 56687 },
+ { 0x90EE, 56692 },
+ { 0x90EA, 56697 },
+ { 0x9056, 56702 },
+ { 0x9099, 56706 },
+ { 0x9055, 56710 },
+ { 0x90B6, 56714 },
+ { 0x903F, 56721 },
+ { 0x904F, 56725 },
+ { 0x90F3, 56731 },
+ { 0x90F1, 56737 },
+ { 0x901B, 56743 },
+ { 0x9089, 56748 },
+ { 0x9083, 56752 },
+ { 0x9082, 56757 },
+ { 0x9081, 56762 },
+ { 0x9061, 56767 },
+ { 0x905D, 56771 },
+ { 0x9041, 56775 },
+ { 0x9049, 56779 },
+ { 0x903C, 56783 },
+ { 0x907E, 56787 },
+ { 0x901F, 56791 },
+ { 0x9065, 56796 },
+ { 0x902B, 56801 },
+ { 0x902A, 56807 },
+ { 0x9013, 56812 },
+ { 0x9031, 56816 },
+ { 0x9027, 56820 },
+ { 0x9021, 56824 },
+ { 0x9053, 56829 },
+ { 0x9084, 56833 },
+ { 0x9022, 56838 },
+ { 0x9023, 56843 },
+ { 0x9018, 56847 },
+ { 0x9067, 56851 },
+ { 0x903B, 56856 },
+ { 0x90DA, 56861 },
+ { 0x90DB, 56867 },
+ { 0x90DC, 56873 },
+ { 0x90DD, 56878 },
+ { 0x9092, 56883 },
+ { 0x9095, 56887 },
+ { 0x9094, 56893 },
+ { 0x9093, 56900 },
+ { 0x90E6, 56907 },
+ { 0x9068, 56912 },
+ { 0x90B7, 56916 },
+ { 0x9007, 56920 },
+ { 0x903A, 56924 },
+ { 0x9042, 56928 },
+ { 0x904A, 56933 },
+ { 0x900C, 56937 },
+ { 0x90A3, 56941 },
+ { 0x90A5, 56948 },
+ { 0x90B1, 56955 },
+ { 0x90A2, 56961 },
+ { 0x90A6, 56967 },
+ { 0x90AA, 56973 },
+ { 0x90AB, 56979 },
+ { 0x90B3, 56985 },
+ { 0x90A4, 56992 },
+ { 0x90A8, 56998 },
+ { 0x90A9, 57004 },
+ { 0x90A7, 57011 },
+ { 0x90B2, 57016 },
+ { 0x901E, 57022 },
+ { 0x9038, 57026 },
+ { 0x904D, 57030 },
+ { 0x901D, 57035 },
+ { 0x90E2, 57039 },
+ { 0x90E3, 57044 },
+ { 0x90E4, 57050 },
+ { 0x90E5, 57056 },
+ { 0x90DE, 57062 },
+ { 0x90DF, 57067 },
+ { 0x90E0, 57073 },
+ { 0x90E1, 57079 },
+ { 0x9088, 57085 },
+ { 0x9063, 57089 },
+ { 0x9043, 57094 },
+ { 0x9036, 57099 },
+ { 0x90E7, 57104 },
+ { 0x907B, 57109 },
+ { 0x90B0, 57113 },
+ { 0x90AF, 57118 },
+ { 0x90AE, 57123 },
+ { 0x9035, 57128 },
+ { 0x907A, 57132 },
+ { 0x9010, 57136 },
+ { 0x904E, 57140 },
+ { 0x90F2, 57146 },
+ { 0x90F0, 57152 },
+ { 0x901C, 57158 },
+ { 0x9032, 57163 },
+ { 0x9075, 57167 },
+ { 0x902C, 57172 },
+ { 0x9039, 57177 },
+ { 0x905A, 57181 },
+ { 0x9008, 57186 },
+ { 0x9096, 57190 },
+ { 0x900A, 57194 },
+ { 0x900B, 57198 },
+ { 0x905C, 57203 },
+ { 0x90AD, 57207 },
+ { 0x9052, 57213 },
+ { 0x9011, 57219 },
+ { 0x9051, 57223 },
+ { 0x9012, 57228 },
+ { 0x9064, 57233 },
+ { 0x90B4, 57237 },
+ { 0x90B5, 57243 },
+ { 0x9098, 57249 },
+ { 0x90B8, 57253 },
+ { 0x905F, 57257 },
+ { 0x903D, 57262 },
+ { 0x9009, 57267 },
+ { 0x905E, 57271 },
+ { 0x903E, 57276 },
+ { 0x9002, 57281 },
+ { 0x9076, 57285 },
+ { 0x9077, 57290 },
+ { 0x9028, 57295 },
+ { 0x9045, 57299 },
+ { 0x9044, 57303 },
+ { 0x9073, 57307 },
+ { 0x9072, 57311 },
+ { 0x906D, 57315 },
+ { 0x9070, 57319 },
+ { 0x9062, 57323 },
+ { 0x904C, 57327 },
+ { 0x9054, 57331 },
+ { 0x904B, 57335 },
+ { 0x906C, 57339 },
+ { 0x9071, 57343 },
+ { 0x906B, 57347 },
+ { 0x906E, 57351 },
+ { 0x906F, 57355 },
+ { 0x2651, 57359 },
+ { 0x2040, 57360 },
+ { 0x21B7, 57362 },
+ { 0x21BB, 57366 },
+ { 0x2941, 57370 },
+ { 0x27F3, 57374 },
+ { 0x2232, 57378 },
+ { 0x2231, 57381 },
+ { 0x033D, 57383 },
+ { 0x0353, 57386 },
+ { 0x1DD0, 57389 },
+ { 0x031D, 57392 },
+ { 0x1DD1, 57396 },
+ { 0x1DD2, 57399 },
+ { 0x0307, 57402 },
+ { 0x0358, 57405 },
+ { 0x0323, 57409 },
+ { 0x0332, 57412 },
+ { 0x034A, 57415 },
+ { 0x031E, 57419 },
+ { 0x20DC, 57423 },
+ { 0x0309, 57427 },
+ { 0x031B, 57430 },
+ { 0x0351, 57432 },
+ { 0x031C, 57437 },
+ { 0x0318, 57442 },
+ { 0x031A, 57446 },
+ { 0x0349, 57450 },
+ { 0x20D6, 57454 },
+ { 0x20EE, 57458 },
+ { 0x20E1, 57462 },
+ { 0x034D, 57467 },
+ { 0x20D0, 57472 },
+ { 0x1DFE, 57476 },
+ { 0x0354, 57480 },
+ { 0x20EB, 57484 },
+ { 0x0336, 57489 },
+ { 0x0338, 57493 },
+ { 0x20D2, 57497 },
+ { 0x031F, 57502 },
+ { 0x030A, 57506 },
+ { 0x0325, 57509 },
+ { 0x20D8, 57512 },
+ { 0x20E9, 57515 },
+ { 0x0341, 57519 },
+ { 0x0301, 57523 },
+ { 0x0317, 57526 },
+ { 0x0306, 57530 },
+ { 0x032E, 57532 },
+ { 0x030C, 57535 },
+ { 0x032C, 57537 },
+ { 0x0313, 57540 },
+ { 0x0315, 57543 },
+ { 0x0326, 57547 },
+ { 0x0340, 57550 },
+ { 0x0300, 57554 },
+ { 0x0316, 57557 },
+ { 0x0343, 57561 },
+ { 0x9242, 57564 },
+ { 0x9244, 57568 },
+ { 0x9243, 57572 },
+ { 0x0344, 57576 },
+ { 0x0342, 57580 },
+ { 0x0345, 57583 },
+ { 0x0363, 57586 },
+ { 0x0368, 57591 },
+ { 0x1DD7, 57596 },
+ { 0x0369, 57602 },
+ { 0x0364, 57607 },
+ { 0x1DDA, 57612 },
+ { 0x036A, 57617 },
+ { 0x0365, 57622 },
+ { 0x1DDC, 57627 },
+ { 0x1DDD, 57632 },
+ { 0x036B, 57637 },
+ { 0x1DE0, 57642 },
+ { 0x0366, 57647 },
+ { 0x036C, 57652 },
+ { 0x1DCA, 57657 },
+ { 0x1DE3, 57663 },
+ { 0x1DE4, 57669 },
+ { 0x036D, 57674 },
+ { 0x0367, 57679 },
+ { 0x036E, 57684 },
+ { 0x036F, 57689 },
+ { 0x1DE6, 57694 },
+ { 0x1DD4, 57699 },
+ { 0x1DD5, 57704 },
+ { 0x1DD6, 57709 },
+ { 0x1DD9, 57714 },
+ { 0x1DE5, 57719 },
+ { 0x1DD8, 57725 },
+ { 0x1DD3, 57731 },
+ { 0x1DDB, 57739 },
+ { 0x1DDE, 57745 },
+ { 0x1DDF, 57751 },
+ { 0x1DE1, 57757 },
+ { 0x1DE2, 57763 },
+ { 0x0320, 57769 },
+ { 0x0357, 57773 },
+ { 0x0339, 57778 },
+ { 0x0319, 57783 },
+ { 0x20D7, 57787 },
+ { 0x20EF, 57791 },
+ { 0x20D1, 57795 },
+ { 0x0356, 57799 },
+ { 0x1DFF, 57806 },
+ { 0x0350, 57813 },
+ { 0x0355, 57817 },
+ { 0x0335, 57821 },
+ { 0x0337, 57825 },
+ { 0x20D3, 57829 },
+ { 0x1DC2, 57834 },
+ { 0x20DB, 57837 },
+ { 0x0303, 57841 },
+ { 0x0330, 57843 },
+ { 0x0334, 57846 },
+ { 0x034C, 57849 },
+ { 0x0346, 57854 },
+ { 0x032A, 57857 },
+ { 0x1DC1, 57860 },
+ { 0x1DC0, 57864 },
+ { 0x0333, 57868 },
+ { 0x035A, 57872 },
+ { 0x030B, 57876 },
+ { 0x035D, 57880 },
+ { 0x035C, 57883 },
+ { 0x030F, 57887 },
+ { 0x0360, 57891 },
+ { 0x6E22, 57894 },
+ { 0x6E23, 57899 },
+ { 0x035E, 57904 },
+ { 0x035F, 57907 },
+ { 0x0361, 57911 },
+ { 0x033F, 57915 },
+ { 0x030E, 57918 },
+ { 0x0348, 57923 },
+ { 0x20E6, 57928 },
+ { 0x1DCD, 57933 },
+ { 0x0362, 57937 },
+ { 0x0347, 57942 },
+ { 0x0304, 57946 },
+ { 0x6E24, 57948 },
+ { 0x0331, 57952 },
+ { 0x6E25, 57955 },
+ { 0x0328, 57959 },
+ { 0x1DCE, 57961 },
+ { 0x033B, 57964 },
+ { 0x20E8, 57967 },
+ { 0x0312, 57970 },
+ { 0x035B, 57974 },
+ { 0x1DCF, 57977 },
+ { 0x20E7, 57980 },
+ { 0x0327, 57983 },
+ { 0x0352, 57985 },
+ { 0x20E5, 57987 },
+ { 0x033C, 57991 },
+ { 0x034E, 57994 },
+ { 0x20F0, 57998 },
+ { 0x0359, 58001 },
+ { 0x5670, 58004 },
+ { 0x0485, 58009 },
+ { 0x0486, 58013 },
+ { 0x0483, 58017 },
+ { 0x566F, 58020 },
+ { 0x567C, 58023 },
+ { 0x2DF6, 58026 },
+ { 0x2DEA, 58030 },
+ { 0x2DE0, 58034 },
+ { 0x2DE3, 58038 },
+ { 0x2DE7, 58042 },
+ { 0x2DE8, 58046 },
+ { 0x2DE9, 58050 },
+ { 0x2DEC, 58054 },
+ { 0x2DED, 58058 },
+ { 0x2DEF, 58062 },
+ { 0x2DF7, 58066 },
+ { 0x2DE6, 58070 },
+ { 0x2DEB, 58074 },
+ { 0x2DEE, 58078 },
+ { 0x2DE1, 58082 },
+ { 0x2DFB, 58086 },
+ { 0x2DE5, 58090 },
+ { 0x2DFE, 58094 },
+ { 0x2DF1, 58099 },
+ { 0x2DE2, 58103 },
+ { 0x2DF2, 58107 },
+ { 0x2DF0, 58111 },
+ { 0x2DFA, 58115 },
+ { 0x2DE4, 58119 },
+ { 0x2DF4, 58123 },
+ { 0x2DF8, 58127 },
+ { 0x2DF5, 58131 },
+ { 0x2DF3, 58135 },
+ { 0x2DFD, 58139 },
+ { 0x2DFC, 58144 },
+ { 0x2DFF, 58149 },
+ { 0x2DF9, 58155 },
+ { 0x5671, 58160 },
+ { 0x0488, 58165 },
+ { 0x567D, 58170 },
+ { 0x0489, 58173 },
+ { 0x0487, 58177 },
+ { 0x5672, 58180 },
+ { 0x0484, 58185 },
+ { 0x034F, 58188 },
+ { 0x0311, 58191 },
+ { 0x032F, 58194 },
+ { 0x033A, 58198 },
+ { 0x032B, 58202 },
+ { 0x6E20, 58207 },
+ { 0x6E21, 58211 },
+ { 0x0305, 58215 },
+ { 0x0314, 58217 },
+ { 0x030D, 58221 },
+ { 0x0329, 58225 },
+ { 0x033E, 58229 },
+ { 0x20D9, 58232 },
+ { 0x20D5, 58236 },
+ { 0x0308, 58240 },
+ { 0x0324, 58242 },
+ { 0x20DD, 58245 },
+ { 0x20E0, 58248 },
+ { 0x20E3, 58252 },
+ { 0x20E2, 58255 },
+ { 0x20DE, 58258 },
+ { 0x20E4, 58261 },
+ { 0x20DF, 58266 },
+ { 0x20EA, 58269 },
+ { 0x20ED, 58273 },
+ { 0x0322, 58279 },
+ { 0x0302, 58283 },
+ { 0x032D, 58286 },
+ { 0x6E26, 58290 },
+ { 0x034B, 58293 },
+ { 0x20EC, 58296 },
+ { 0x1DC3, 58302 },
+ { 0x0310, 58305 },
+ { 0x0321, 58307 },
+ { 0x1DC7, 58311 },
+ { 0x1DCB, 58313 },
+ { 0x1DC5, 58315 },
+ { 0x1DC4, 58317 },
+ { 0x1DCC, 58319 },
+ { 0x1DC6, 58321 },
+ { 0x20DA, 58323 },
+ { 0x20D4, 58327 },
+ { 0x1DC9, 58331 },
+ { 0x1DC8, 58333 },
+ { 0x3099, 58335 },
+ { 0x309A, 58340 },
+ { 0x2A6D, 58345 },
+ { 0x00A9, 58349 },
+ { 0x8000, 58351 },
+ { 0x8001, 58354 },
+ { 0x8004, 58359 },
+ { 0x8002, 58364 },
+ { 0x8005, 58369 },
+ { 0x8008, 58374 },
+ { 0x8003, 58379 },
+ { 0x8007, 58385 },
+ { 0x8006, 58390 },
+ { 0x808A, 58396 },
+ { 0x808C, 58399 },
+ { 0x808B, 58407 },
+ { 0x813F, 58412 },
+ { 0x8140, 58415 },
+ { 0x830B, 58419 },
+ { 0x830D, 58422 },
+ { 0x830C, 58427 },
+ { 0x8310, 58431 },
+ { 0x830E, 58441 },
+ { 0x830F, 58452 },
+ { 0x8009, 58460 },
+ { 0x800A, 58463 },
+ { 0x8015, 58466 },
+ { 0x8014, 58470 },
+ { 0x800F, 58479 },
+ { 0x800D, 58484 },
+ { 0x8010, 58489 },
+ { 0x800B, 58495 },
+ { 0x800C, 58500 },
+ { 0x800E, 58506 },
+ { 0x8011, 58512 },
+ { 0x8012, 58517 },
+ { 0x8013, 58522 },
+ { 0x801C, 58527 },
+ { 0x801D, 58530 },
+ { 0x801E, 58533 },
+ { 0x801F, 58538 },
+ { 0x8020, 58545 },
+ { 0x8021, 58548 },
+ { 0x8024, 58553 },
+ { 0x8026, 58558 },
+ { 0x8027, 58563 },
+ { 0x8028, 58568 },
+ { 0x8022, 58573 },
+ { 0x8023, 58578 },
+ { 0x8025, 58583 },
+ { 0x802D, 58588 },
+ { 0x802E, 58591 },
+ { 0x8031, 58596 },
+ { 0x8030, 58602 },
+ { 0x802F, 58611 },
+ { 0x8040, 58616 },
+ { 0x8049, 58619 },
+ { 0x804A, 58622 },
+ { 0x804B, 58627 },
+ { 0x804C, 58632 },
+ { 0x804D, 58638 },
+ { 0x804E, 58641 },
+ { 0x804F, 58647 },
+ { 0x8050, 58653 },
+ { 0x8055, 58658 },
+ { 0x8072, 58661 },
+ { 0x807A, 58664 },
+ { 0x807C, 58667 },
+ { 0x807B, 58671 },
+ { 0x807D, 58676 },
+ { 0x808D, 58680 },
+ { 0x808E, 58683 },
+ { 0x8093, 58692 },
+ { 0x8090, 58697 },
+ { 0x808F, 58702 },
+ { 0x8091, 58707 },
+ { 0x8092, 58712 },
+ { 0x8096, 58717 },
+ { 0x8097, 58720 },
+ { 0x809A, 58723 },
+ { 0x8098, 58728 },
+ { 0x8099, 58733 },
+ { 0x809D, 58739 },
+ { 0x809B, 58743 },
+ { 0x809C, 58748 },
+ { 0x80B5, 58753 },
+ { 0x80B6, 58756 },
+ { 0x8100, 58760 },
+ { 0x8101, 58763 },
+ { 0x8102, 58768 },
+ { 0x8103, 58773 },
+ { 0x8116, 58778 },
+ { 0x8117, 58781 },
+ { 0x8129, 58786 },
+ { 0x812B, 58789 },
+ { 0x812A, 58793 },
+ { 0x812D, 58797 },
+ { 0x8136, 58800 },
+ { 0x812E, 58805 },
+ { 0x8130, 58810 },
+ { 0x8132, 58815 },
+ { 0x8133, 58820 },
+ { 0x8134, 58825 },
+ { 0x8135, 58830 },
+ { 0x812F, 58835 },
+ { 0x8131, 58840 },
+ { 0x8137, 58845 },
+ { 0x8141, 58848 },
+ { 0x8145, 58851 },
+ { 0x814B, 58854 },
+ { 0x814C, 58857 },
+ { 0x814E, 58863 },
+ { 0x814F, 58866 },
+ { 0x8152, 58871 },
+ { 0x8150, 58875 },
+ { 0x8151, 58880 },
+ { 0x8154, 58885 },
+ { 0x8155, 58888 },
+ { 0x8157, 58891 },
+ { 0x8158, 58894 },
+ { 0x8187, 58899 },
+ { 0x8159, 58904 },
+ { 0x815A, 58909 },
+ { 0x815F, 58916 },
+ { 0x8162, 58921 },
+ { 0x8167, 58926 },
+ { 0x816B, 58931 },
+ { 0x816E, 58936 },
+ { 0x8170, 58941 },
+ { 0x8172, 58946 },
+ { 0x8173, 58951 },
+ { 0x8174, 58956 },
+ { 0x8175, 58961 },
+ { 0x8176, 58968 },
+ { 0x8177, 58975 },
+ { 0x8178, 58982 },
+ { 0x8179, 58987 },
+ { 0x817A, 58994 },
+ { 0x817C, 58999 },
+ { 0x817D, 59004 },
+ { 0x817E, 59009 },
+ { 0x8188, 59014 },
+ { 0x8189, 59019 },
+ { 0x818C, 59024 },
+ { 0x815C, 59029 },
+ { 0x815E, 59034 },
+ { 0x8163, 59039 },
+ { 0x8165, 59044 },
+ { 0x8166, 59049 },
+ { 0x816D, 59058 },
+ { 0x816F, 59063 },
+ { 0x8171, 59068 },
+ { 0x817B, 59073 },
+ { 0x817F, 59078 },
+ { 0x8180, 59083 },
+ { 0x8181, 59088 },
+ { 0x8183, 59093 },
+ { 0x8184, 59098 },
+ { 0x8186, 59103 },
+ { 0x818B, 59108 },
+ { 0x815B, 59113 },
+ { 0x8161, 59118 },
+ { 0x8164, 59123 },
+ { 0x8168, 59129 },
+ { 0x8169, 59134 },
+ { 0x816A, 59141 },
+ { 0x816C, 59148 },
+ { 0x8182, 59153 },
+ { 0x818A, 59158 },
+ { 0x815D, 59165 },
+ { 0x8160, 59170 },
+ { 0x8185, 59175 },
+ { 0x81A0, 59180 },
+ { 0x81A2, 59183 },
+ { 0x81A3, 59188 },
+ { 0x81A1, 59193 },
+ { 0x81AA, 59198 },
+ { 0x81AB, 59201 },
+ { 0x81B7, 59213 },
+ { 0x81F7, 59216 },
+ { 0x81FB, 59219 },
+ { 0x81FC, 59222 },
+ { 0x8220, 59227 },
+ { 0x8222, 59230 },
+ { 0x8221, 59234 },
+ { 0x8228, 59239 },
+ { 0x822A, 59242 },
+ { 0x822C, 59245 },
+ { 0x822D, 59248 },
+ { 0x823E, 59253 },
+ { 0x8248, 59256 },
+ { 0x8249, 59259 },
+ { 0x824A, 59264 },
+ { 0x824B, 59269 },
+ { 0x824C, 59273 },
+ { 0x824D, 59276 },
+ { 0x8261, 59281 },
+ { 0x827A, 59284 },
+ { 0x827F, 59287 },
+ { 0x8280, 59290 },
+ { 0x8284, 59295 },
+ { 0x8285, 59300 },
+ { 0x8287, 59305 },
+ { 0x8281, 59310 },
+ { 0x8282, 59315 },
+ { 0x8283, 59320 },
+ { 0x8286, 59325 },
+ { 0x8288, 59330 },
+ { 0x8289, 59335 },
+ { 0x828F, 59340 },
+ { 0x8291, 59343 },
+ { 0x8292, 59346 },
+ { 0x8293, 59349 },
+ { 0x82DB, 59352 },
+ { 0x82DC, 59355 },
+ { 0x82E2, 59359 },
+ { 0x82E3, 59362 },
+ { 0x82EB, 59367 },
+ { 0x82EF, 59370 },
+ { 0x82ED, 59374 },
+ { 0x82EE, 59379 },
+ { 0x82EC, 59384 },
+ { 0x82FC, 59388 },
+ { 0x82FD, 59391 },
+ { 0x82FE, 59395 },
+ { 0x82FF, 59398 },
+ { 0x8305, 59402 },
+ { 0x8311, 59405 },
+ { 0x8312, 59408 },
+ { 0x8313, 59411 },
+ { 0x8319, 59414 },
+ { 0x8317, 59418 },
+ { 0x8318, 59427 },
+ { 0x8316, 59437 },
+ { 0x8315, 59442 },
+ { 0x8314, 59447 },
+ { 0x831A, 59451 },
+ { 0x831B, 59455 },
+ { 0x831D, 59461 },
+ { 0x8321, 59464 },
+ { 0x831F, 59469 },
+ { 0x8320, 59476 },
+ { 0x831E, 59481 },
+ { 0x8326, 59486 },
+ { 0x8327, 59489 },
+ { 0x8328, 59493 },
+ { 0x832A, 59496 },
+ { 0x8329, 59500 },
+ { 0x835D, 59505 },
+ { 0x835E, 59508 },
+ { 0x835F, 59512 },
+ { 0x8363, 59518 },
+ { 0x8364, 59521 },
+ { 0x836A, 59526 },
+ { 0x8016, 59529 },
+ { 0x8019, 59532 },
+ { 0x8018, 59539 },
+ { 0x801A, 59545 },
+ { 0x801B, 59550 },
+ { 0x8017, 59555 },
+ { 0x8038, 59560 },
+ { 0x803A, 59563 },
+ { 0x803C, 59568 },
+ { 0x803D, 59575 },
+ { 0x803B, 59588 },
+ { 0x8039, 59600 },
+ { 0x8041, 59605 },
+ { 0x8044, 59608 },
+ { 0x8045, 59611 },
+ { 0x8047, 59616 },
+ { 0x8053, 59619 },
+ { 0x8056, 59622 },
+ { 0x8057, 59625 },
+ { 0x805A, 59633 },
+ { 0x805B, 59639 },
+ { 0x805C, 59645 },
+ { 0x805D, 59653 },
+ { 0x8060, 59659 },
+ { 0x8061, 59665 },
+ { 0x8062, 59671 },
+ { 0x8064, 59679 },
+ { 0x8065, 59685 },
+ { 0x8066, 59691 },
+ { 0x8068, 59699 },
+ { 0x806A, 59705 },
+ { 0x806C, 59711 },
+ { 0x805F, 59719 },
+ { 0x8063, 59725 },
+ { 0x8067, 59731 },
+ { 0x8069, 59737 },
+ { 0x806D, 59745 },
+ { 0x8058, 59751 },
+ { 0x805E, 59757 },
+ { 0x806B, 59763 },
+ { 0x8059, 59769 },
+ { 0x806E, 59775 },
+ { 0x806F, 59778 },
+ { 0x8073, 59781 },
+ { 0x8074, 59784 },
+ { 0x8075, 59787 },
+ { 0x8077, 59792 },
+ { 0x8078, 59795 },
+ { 0x807E, 59802 },
+ { 0x807F, 59805 },
+ { 0x8081, 59810 },
+ { 0x8083, 59813 },
+ { 0x8084, 59816 },
+ { 0x80B7, 59819 },
+ { 0x80ED, 59822 },
+ { 0x80B8, 59827 },
+ { 0x80B9, 59836 },
+ { 0x80BA, 59843 },
+ { 0x80EA, 59850 },
+ { 0x80BC, 59855 },
+ { 0x80C3, 59860 },
+ { 0x80C4, 59865 },
+ { 0x80C7, 59870 },
+ { 0x80C8, 59875 },
+ { 0x80C9, 59882 },
+ { 0x80CA, 59887 },
+ { 0x80CD, 59895 },
+ { 0x80D1, 59900 },
+ { 0x80D4, 59909 },
+ { 0x80DD, 59916 },
+ { 0x80DE, 59921 },
+ { 0x80DF, 59928 },
+ { 0x80E2, 59933 },
+ { 0x80EB, 59938 },
+ { 0x80EC, 59943 },
+ { 0x80BB, 59950 },
+ { 0x80BD, 59958 },
+ { 0x80BF, 59963 },
+ { 0x80C0, 59968 },
+ { 0x80C1, 59975 },
+ { 0x80C2, 59980 },
+ { 0x80C5, 59987 },
+ { 0x80C6, 59994 },
+ { 0x80CC, 59999 },
+ { 0x80CE, 60004 },
+ { 0x80CF, 60009 },
+ { 0x80D2, 60016 },
+ { 0x80D3, 60021 },
+ { 0x80D6, 60028 },
+ { 0x80D7, 60034 },
+ { 0x80D8, 60043 },
+ { 0x80DA, 60048 },
+ { 0x80DB, 60053 },
+ { 0x80DC, 60060 },
+ { 0x80E0, 60067 },
+ { 0x80E1, 60072 },
+ { 0x80E3, 60079 },
+ { 0x80E4, 60084 },
+ { 0x80E5, 60089 },
+ { 0x80E6, 60094 },
+ { 0x80E8, 60101 },
+ { 0x80BE, 60106 },
+ { 0x80CB, 60113 },
+ { 0x80D0, 60119 },
+ { 0x80D5, 60126 },
+ { 0x80E7, 60131 },
+ { 0x80E9, 60136 },
+ { 0x80D9, 60141 },
+ { 0x80F0, 60146 },
+ { 0x80F1, 60149 },
+ { 0x80F2, 60157 },
+ { 0x80F3, 60160 },
+ { 0x80F5, 60169 },
+ { 0x80F6, 60172 },
+ { 0x80FB, 60175 },
+ { 0x8104, 60178 },
+ { 0x8105, 60181 },
+ { 0x8106, 60186 },
+ { 0x8118, 60191 },
+ { 0x811D, 60194 },
+ { 0x8119, 60198 },
+ { 0x811A, 60203 },
+ { 0x811B, 60211 },
+ { 0x811C, 60216 },
+ { 0x811E, 60223 },
+ { 0x8121, 60226 },
+ { 0x811F, 60232 },
+ { 0x8120, 60239 },
+ { 0x8122, 60244 },
+ { 0x8123, 60247 },
+ { 0x8124, 60250 },
+ { 0x8125, 60255 },
+ { 0x812C, 60258 },
+ { 0x8146, 60261 },
+ { 0x8148, 60264 },
+ { 0x8147, 60268 },
+ { 0x814A, 60272 },
+ { 0x8149, 60276 },
+ { 0x814D, 60287 },
+ { 0x8156, 60290 },
+ { 0x818D, 60293 },
+ { 0x818E, 60296 },
+ { 0x818F, 60301 },
+ { 0x8195, 60304 },
+ { 0x8196, 60307 },
+ { 0x8197, 60313 },
+ { 0x8198, 60316 },
+ { 0x8199, 60321 },
+ { 0x81A4, 60326 },
+ { 0x81A5, 60329 },
+ { 0x81AC, 60332 },
+ { 0x81AD, 60335 },
+ { 0x81AE, 60338 },
+ { 0x81AF, 60343 },
+ { 0x81B0, 60346 },
+ { 0x81B1, 60349 },
+ { 0x81B2, 60353 },
+ { 0x81B3, 60356 },
+ { 0x81B4, 60359 },
+ { 0x81F2, 60364 },
+ { 0x81F3, 60367 },
+ { 0x81F4, 60372 },
+ { 0x81F5, 60375 },
+ { 0x81F6, 60380 },
+ { 0x81F8, 60387 },
+ { 0x81FD, 60390 },
+ { 0x8211, 60393 },
+ { 0x81FE, 60397 },
+ { 0x8203, 60402 },
+ { 0x8204, 60409 },
+ { 0x8208, 60414 },
+ { 0x8209, 60419 },
+ { 0x820B, 60426 },
+ { 0x820C, 60433 },
+ { 0x820D, 60438 },
+ { 0x820E, 60443 },
+ { 0x81FF, 60450 },
+ { 0x8200, 60455 },
+ { 0x8201, 60460 },
+ { 0x8202, 60466 },
+ { 0x8205, 60472 },
+ { 0x8206, 60477 },
+ { 0x8207, 60482 },
+ { 0x820F, 60489 },
+ { 0x8210, 60496 },
+ { 0x820A, 60501 },
+ { 0x8215, 60506 },
+ { 0x8214, 60510 },
+ { 0x8212, 60514 },
+ { 0x8213, 60519 },
+ { 0x8216, 60524 },
+ { 0x821B, 60527 },
+ { 0x821C, 60530 },
+ { 0x821D, 60533 },
+ { 0x821E, 60536 },
+ { 0x821F, 60541 },
+ { 0x8223, 60549 },
+ { 0x8224, 60552 },
+ { 0x8225, 60555 },
+ { 0x8229, 60558 },
+ { 0x822B, 60561 },
+ { 0x822E, 60564 },
+ { 0x822F, 60567 },
+ { 0x823F, 60571 },
+ { 0x8246, 60574 },
+ { 0x8245, 60577 },
+ { 0x824E, 60581 },
+ { 0x824F, 60584 },
+ { 0x8251, 60587 },
+ { 0x8250, 60595 },
+ { 0x8263, 60601 },
+ { 0x826A, 60604 },
+ { 0x8269, 60609 },
+ { 0x8264, 60613 },
+ { 0x8266, 60619 },
+ { 0x8267, 60625 },
+ { 0x8268, 60636 },
+ { 0x8265, 60642 },
+ { 0x826B, 60648 },
+ { 0x826C, 60653 },
+ { 0x827B, 60661 },
+ { 0x827C, 60664 },
+ { 0x827D, 60667 },
+ { 0x8290, 60670 },
+ { 0x8295, 60673 },
+ { 0x82A8, 60676 },
+ { 0x82A7, 60680 },
+ { 0x8296, 60685 },
+ { 0x8297, 60690 },
+ { 0x8299, 60695 },
+ { 0x829D, 60700 },
+ { 0x82A2, 60705 },
+ { 0x82A3, 60710 },
+ { 0x82A4, 60715 },
+ { 0x82A5, 60720 },
+ { 0x8298, 60725 },
+ { 0x829A, 60730 },
+ { 0x829B, 60735 },
+ { 0x829C, 60740 },
+ { 0x829E, 60745 },
+ { 0x829F, 60750 },
+ { 0x82A1, 60755 },
+ { 0x82A6, 60760 },
+ { 0x82A0, 60765 },
+ { 0x8294, 60770 },
+ { 0x82A9, 60774 },
+ { 0x82AA, 60777 },
+ { 0x82AC, 60783 },
+ { 0x82AD, 60786 },
+ { 0x82BA, 60789 },
+ { 0x82BB, 60792 },
+ { 0x82BC, 60796 },
+ { 0x82BD, 60807 },
+ { 0x82D7, 60818 },
+ { 0x82D8, 60821 },
+ { 0x82DD, 60827 },
+ { 0x82E4, 60830 },
+ { 0x82E7, 60833 },
+ { 0x82E9, 60836 },
+ { 0x82F0, 60839 },
+ { 0x82F1, 60842 },
+ { 0x82F2, 60853 },
+ { 0x82F3, 60857 },
+ { 0x82F4, 60860 },
+ { 0x82F9, 60865 },
+ { 0x82F5, 60870 },
+ { 0x82F6, 60875 },
+ { 0x82F7, 60880 },
+ { 0x82F8, 60885 },
+ { 0x82FB, 60890 },
+ { 0x8300, 60893 },
+ { 0x8301, 60896 },
+ { 0x8303, 60899 },
+ { 0x8304, 60904 },
+ { 0x8302, 60915 },
+ { 0x8307, 60920 },
+ { 0x8308, 60923 },
+ { 0x8309, 60926 },
+ { 0x830A, 60929 },
+ { 0x832B, 60937 },
+ { 0x832C, 60940 },
+ { 0x832D, 60947 },
+ { 0x832E, 60954 },
+ { 0x832F, 60959 },
+ { 0x8331, 60964 },
+ { 0x8333, 60969 },
+ { 0x8332, 60976 },
+ { 0x8330, 60983 },
+ { 0x8334, 60988 },
+ { 0x8335, 60991 },
+ { 0x8337, 60994 },
+ { 0x8338, 60997 },
+ { 0x834C, 61002 },
+ { 0x833C, 61009 },
+ { 0x8340, 61014 },
+ { 0x8341, 61019 },
+ { 0x8343, 61024 },
+ { 0x8345, 61029 },
+ { 0x8348, 61034 },
+ { 0x834B, 61039 },
+ { 0x834D, 61044 },
+ { 0x833A, 61049 },
+ { 0x833B, 61054 },
+ { 0x833D, 61059 },
+ { 0x833F, 61064 },
+ { 0x8342, 61069 },
+ { 0x8344, 61074 },
+ { 0x8346, 61079 },
+ { 0x8347, 61084 },
+ { 0x8349, 61089 },
+ { 0x833E, 61094 },
+ { 0x834A, 61100 },
+ { 0x834E, 61105 },
+ { 0x8339, 61110 },
+ { 0x8351, 61115 },
+ { 0x8352, 61118 },
+ { 0x8353, 61123 },
+ { 0x8354, 61128 },
+ { 0x8355, 61133 },
+ { 0x835A, 61138 },
+ { 0x835B, 61141 },
+ { 0x835C, 61146 },
+ { 0x8360, 61149 },
+ { 0x8362, 61152 },
+ { 0x8365, 61155 },
+ { 0x8366, 61158 },
+ { 0x8367, 61161 },
+ { 0x8368, 61166 },
+ { 0x836B, 61169 },
+ { 0x836C, 61172 },
+ { 0x836E, 61177 },
+ { 0x8029, 61180 },
+ { 0x802B, 61183 },
+ { 0x802C, 61186 },
+ { 0x8033, 61191 },
+ { 0x8034, 61194 },
+ { 0x8035, 61197 },
+ { 0x803E, 61202 },
+ { 0x8042, 61205 },
+ { 0x8054, 61208 },
+ { 0x8076, 61211 },
+ { 0x8079, 61214 },
+ { 0x8080, 61217 },
+ { 0x8085, 61220 },
+ { 0x8086, 61223 },
+ { 0x8087, 61227 },
+ { 0x8088, 61232 },
+ { 0x8089, 61235 },
+ { 0x8094, 61238 },
+ { 0x8095, 61241 },
+ { 0x809E, 61244 },
+ { 0x80A0, 61247 },
+ { 0x80A1, 61250 },
+ { 0x80A2, 61253 },
+ { 0x80A3, 61258 },
+ { 0x80A4, 61265 },
+ { 0x80A5, 61274 },
+ { 0x80A9, 61279 },
+ { 0x80AA, 61284 },
+ { 0x80AF, 61290 },
+ { 0x80B1, 61295 },
+ { 0x80B2, 61300 },
+ { 0x80B3, 61305 },
+ { 0x80B4, 61310 },
+ { 0x80A6, 61315 },
+ { 0x80AB, 61320 },
+ { 0x80AE, 61326 },
+ { 0x80B0, 61331 },
+ { 0x80A7, 61338 },
+ { 0x80A8, 61344 },
+ { 0x80AC, 61351 },
+ { 0x80AD, 61356 },
+ { 0x80EE, 61362 },
+ { 0x80EF, 61365 },
+ { 0x80F7, 61370 },
+ { 0x80F9, 61373 },
+ { 0x80F8, 61378 },
+ { 0x80FA, 61382 },
+ { 0x80FC, 61387 },
+ { 0x8108, 61390 },
+ { 0x8109, 61393 },
+ { 0x810A, 61397 },
+ { 0x810B, 61400 },
+ { 0x810E, 61407 },
+ { 0x810F, 61414 },
+ { 0x810D, 61419 },
+ { 0x810C, 61424 },
+ { 0x8111, 61430 },
+ { 0x8115, 61433 },
+ { 0x8113, 61437 },
+ { 0x8114, 61442 },
+ { 0x8112, 61447 },
+ { 0x8126, 61452 },
+ { 0x8138, 61455 },
+ { 0x8139, 61458 },
+ { 0x813D, 61463 },
+ { 0x813A, 61468 },
+ { 0x813C, 61473 },
+ { 0x813B, 61478 },
+ { 0x813E, 61483 },
+ { 0x8142, 61486 },
+ { 0x8143, 61489 },
+ { 0x8144, 61495 },
+ { 0x8153, 61501 },
+ { 0x8190, 61504 },
+ { 0x8191, 61507 },
+ { 0x8192, 61510 },
+ { 0x8193, 61513 },
+ { 0x8194, 61516 },
+ { 0x819A, 61521 },
+ { 0x819B, 61524 },
+ { 0x81A7, 61527 },
+ { 0x81FA, 61530 },
+ { 0x8226, 61533 },
+ { 0x8232, 61536 },
+ { 0x8236, 61539 },
+ { 0x8237, 61544 },
+ { 0x8233, 61553 },
+ { 0x8235, 61558 },
+ { 0x8234, 61563 },
+ { 0x8238, 61568 },
+ { 0x8240, 61573 },
+ { 0x8242, 61576 },
+ { 0x8241, 61582 },
+ { 0x8243, 61586 },
+ { 0x8247, 61591 },
+ { 0x8262, 61594 },
+ { 0x82AE, 61597 },
+ { 0x82AF, 61600 },
+ { 0x82B5, 61605 },
+ { 0x82B6, 61610 },
+ { 0x82B2, 61617 },
+ { 0x82B0, 61622 },
+ { 0x82B4, 61627 },
+ { 0x82B1, 61632 },
+ { 0x82B3, 61637 },
+ { 0x82B7, 61642 },
+ { 0x82BF, 61645 },
+ { 0x82C3, 61648 },
+ { 0x82C4, 61651 },
+ { 0x82C5, 61656 },
+ { 0x82C6, 61661 },
+ { 0x82C7, 61664 },
+ { 0x82C8, 61669 },
+ { 0x82CA, 61674 },
+ { 0x82CB, 61679 },
+ { 0x82CC, 61684 },
+ { 0x82CD, 61689 },
+ { 0x82CF, 61695 },
+ { 0x82D0, 61700 },
+ { 0x82D1, 61705 },
+ { 0x82C9, 61710 },
+ { 0x82CE, 61715 },
+ { 0x82D3, 61720 },
+ { 0x82D5, 61723 },
+ { 0x82D4, 61731 },
+ { 0x82D9, 61735 },
+ { 0x82DE, 61738 },
+ { 0x82DF, 61741 },
+ { 0x82E0, 61747 },
+ { 0x82E5, 61750 },
+ { 0x82EA, 61753 },
+ { 0x82FA, 61756 },
+ { 0x8306, 61759 },
+ { 0x831C, 61762 },
+ { 0x8323, 61765 },
+ { 0x8325, 61768 },
+ { 0x8324, 61773 },
+ { 0x8336, 61778 },
+ { 0x8357, 61781 },
+ { 0x8356, 61784 },
+ { 0x8361, 61787 },
+ { 0x8369, 61790 },
+ { 0x802A, 61793 },
+ { 0x8032, 61796 },
+ { 0x8036, 61799 },
+ { 0x8037, 61802 },
+ { 0x8046, 61805 },
+ { 0x8048, 61808 },
+ { 0x8051, 61811 },
+ { 0x8052, 61814 },
+ { 0x8070, 61819 },
+ { 0x8071, 61822 },
+ { 0x8082, 61825 },
+ { 0x809F, 61828 },
+ { 0x80F4, 61831 },
+ { 0x8107, 61834 },
+ { 0x8110, 61837 },
+ { 0x8127, 61840 },
+ { 0x819F, 61843 },
+ { 0x81A6, 61846 },
+ { 0x81B8, 61849 },
+ { 0x81B9, 61852 },
+ { 0x81BA, 61857 },
+ { 0x81BB, 61866 },
+ { 0x81BC, 61873 },
+ { 0x81E5, 61880 },
+ { 0x81E6, 61885 },
+ { 0x81E7, 61892 },
+ { 0x81BD, 61901 },
+ { 0x81BE, 61906 },
+ { 0x81C1, 61911 },
+ { 0x81C3, 61916 },
+ { 0x81C4, 61921 },
+ { 0x81C8, 61926 },
+ { 0x81CA, 61931 },
+ { 0x81CC, 61938 },
+ { 0x81CD, 61943 },
+ { 0x81CE, 61950 },
+ { 0x81CF, 61957 },
+ { 0x81D6, 61962 },
+ { 0x81D8, 61967 },
+ { 0x81D9, 61972 },
+ { 0x81DB, 61979 },
+ { 0x81E4, 61984 },
+ { 0x81E8, 61995 },
+ { 0x81E9, 62002 },
+ { 0x81BF, 62007 },
+ { 0x81C0, 62014 },
+ { 0x81C2, 62019 },
+ { 0x81C5, 62024 },
+ { 0x81C6, 62029 },
+ { 0x81C7, 62034 },
+ { 0x81C9, 62041 },
+ { 0x81CB, 62046 },
+ { 0x81D0, 62052 },
+ { 0x81D1, 62057 },
+ { 0x81D2, 62062 },
+ { 0x81D3, 62067 },
+ { 0x81D7, 62076 },
+ { 0x81DC, 62081 },
+ { 0x81E1, 62088 },
+ { 0x81E2, 62093 },
+ { 0x81EA, 62098 },
+ { 0x81D5, 62103 },
+ { 0x81DA, 62108 },
+ { 0x81DF, 62113 },
+ { 0x81E0, 62118 },
+ { 0x81E3, 62125 },
+ { 0x81D4, 62130 },
+ { 0x81DD, 62135 },
+ { 0x81DE, 62144 },
+ { 0x81EB, 62152 },
+ { 0x81EC, 62156 },
+ { 0x81EF, 62159 },
+ { 0x81F0, 62163 },
+ { 0x81ED, 62171 },
+ { 0x81EE, 62176 },
+ { 0x8217, 62183 },
+ { 0x8218, 62186 },
+ { 0x821A, 62191 },
+ { 0x8219, 62195 },
+ { 0x8227, 62200 },
+ { 0x8239, 62203 },
+ { 0x823D, 62206 },
+ { 0x823A, 62210 },
+ { 0x823B, 62215 },
+ { 0x823C, 62222 },
+ { 0x8244, 62227 },
+ { 0x8260, 62230 },
+ { 0x826D, 62233 },
+ { 0x826F, 62236 },
+ { 0x8274, 62242 },
+ { 0x8275, 62248 },
+ { 0x8277, 62254 },
+ { 0x8270, 62260 },
+ { 0x8271, 62266 },
+ { 0x8272, 62272 },
+ { 0x8273, 62279 },
+ { 0x8276, 62285 },
+ { 0x826E, 62291 },
+ { 0x8278, 62297 },
+ { 0x8279, 62303 },
+ { 0x827E, 62310 },
+ { 0x828A, 62313 },
+ { 0x828C, 62316 },
+ { 0x828D, 62321 },
+ { 0x828B, 62326 },
+ { 0x828E, 62331 },
+ { 0x82B8, 62336 },
+ { 0x82B9, 62339 },
+ { 0x82BE, 62342 },
+ { 0x82C0, 62345 },
+ { 0x82D6, 62348 },
+ { 0x82E1, 62351 },
+ { 0x82E6, 62354 },
+ { 0x8322, 62357 },
+ { 0x834F, 62360 },
+ { 0x8350, 62363 },
+ { 0x8359, 62368 },
+ { 0x836D, 62371 },
+ { 0x803F, 62374 },
+ { 0x8043, 62377 },
+ { 0x80FD, 62380 },
+ { 0x8128, 62383 },
+ { 0x819C, 62386 },
+ { 0x819E, 62389 },
+ { 0x819D, 62401 },
+ { 0x81A8, 62411 },
+ { 0x81A9, 62414 },
+ { 0x81B5, 62419 },
+ { 0x81B6, 62422 },
+ { 0x81F1, 62425 },
+ { 0x81F9, 62428 },
+ { 0x8230, 62431 },
+ { 0x8231, 62434 },
+ { 0x8252, 62437 },
+ { 0x8253, 62440 },
+ { 0x8257, 62445 },
+ { 0x8258, 62453 },
+ { 0x825E, 62458 },
+ { 0x8254, 62465 },
+ { 0x8255, 62470 },
+ { 0x8256, 62477 },
+ { 0x8259, 62482 },
+ { 0x825A, 62487 },
+ { 0x825B, 62492 },
+ { 0x825C, 62500 },
+ { 0x825D, 62507 },
+ { 0x825F, 62516 },
+ { 0x82AB, 62521 },
+ { 0x82C1, 62524 },
+ { 0x82D2, 62527 },
+ { 0x82DA, 62530 },
+ { 0x82E8, 62533 },
+ { 0x8358, 62536 },
+ { 0x80FE, 62539 },
+ { 0x80FF, 62542 },
+ { 0x82C2, 62547 },
+ { 0x8461, 62550 },
+ { 0x8462, 62557 },
+ { 0x844F, 62564 },
+ { 0x8434, 62569 },
+ { 0x8458, 62574 },
+ { 0x8415, 62579 },
+ { 0x841E, 62584 },
+ { 0x842C, 62589 },
+ { 0x845A, 62594 },
+ { 0x845D, 62600 },
+ { 0x845F, 62608 },
+ { 0x8460, 62614 },
+ { 0x8411, 62620 },
+ { 0x8404, 62625 },
+ { 0x844E, 62630 },
+ { 0x840B, 62636 },
+ { 0x841A, 62641 },
+ { 0x8428, 62646 },
+ { 0x8440, 62651 },
+ { 0x8400, 62658 },
+ { 0x844A, 62663 },
+ { 0x8450, 62669 },
+ { 0x8435, 62674 },
+ { 0x8459, 62679 },
+ { 0x8416, 62684 },
+ { 0x841F, 62689 },
+ { 0x8423, 62694 },
+ { 0x842D, 62699 },
+ { 0x845B, 62704 },
+ { 0x845E, 62710 },
+ { 0x8410, 62718 },
+ { 0x8403, 62723 },
+ { 0x844D, 62728 },
+ { 0x8454, 62734 },
+ { 0x8455, 62739 },
+ { 0x8439, 62746 },
+ { 0x840A, 62751 },
+ { 0x8419, 62756 },
+ { 0x8422, 62761 },
+ { 0x8427, 62766 },
+ { 0x8431, 62771 },
+ { 0x845C, 62776 },
+ { 0x840F, 62782 },
+ { 0x8402, 62787 },
+ { 0x844C, 62792 },
+ { 0x8452, 62798 },
+ { 0x8453, 62803 },
+ { 0x8438, 62810 },
+ { 0x8409, 62815 },
+ { 0x8418, 62820 },
+ { 0x8421, 62825 },
+ { 0x8426, 62830 },
+ { 0x8430, 62835 },
+ { 0x843C, 62840 },
+ { 0x843E, 62847 },
+ { 0x843F, 62855 },
+ { 0x843D, 62863 },
+ { 0x8414, 62870 },
+ { 0x8407, 62875 },
+ { 0x840E, 62880 },
+ { 0x841D, 62885 },
+ { 0x842B, 62890 },
+ { 0x8446, 62895 },
+ { 0x8449, 62902 },
+ { 0x8447, 62910 },
+ { 0x8448, 62917 },
+ { 0x8413, 62924 },
+ { 0x8406, 62929 },
+ { 0x840D, 62934 },
+ { 0x841C, 62939 },
+ { 0x842A, 62944 },
+ { 0x8444, 62949 },
+ { 0x8445, 62956 },
+ { 0x8412, 62963 },
+ { 0x8405, 62968 },
+ { 0x840C, 62973 },
+ { 0x841B, 62978 },
+ { 0x8429, 62983 },
+ { 0x8442, 62988 },
+ { 0x8443, 62996 },
+ { 0x8441, 63004 },
+ { 0x8433, 63011 },
+ { 0x8432, 63019 },
+ { 0x8401, 63027 },
+ { 0x844B, 63032 },
+ { 0x8451, 63038 },
+ { 0x8436, 63043 },
+ { 0x8437, 63048 },
+ { 0x8408, 63055 },
+ { 0x8417, 63060 },
+ { 0x8420, 63065 },
+ { 0x8424, 63070 },
+ { 0x8425, 63075 },
+ { 0x842E, 63082 },
+ { 0x842F, 63087 },
+ { 0x843A, 63094 },
+ { 0x843B, 63101 },
+ { 0x8457, 63108 },
+ { 0x8456, 63112 },
+ { 0x8470, 63116 },
+ { 0x8472, 63123 },
+ { 0x8473, 63128 },
+ { 0x8471, 63133 },
+ { 0x23CA, 63138 },
+ { 0x23C8, 63144 },
+ { 0x23C2, 63152 },
+ { 0x23C5, 63160 },
+ { 0x23C9, 63168 },
+ { 0x23C7, 63174 },
+ { 0x23C1, 63182 },
+ { 0x23C4, 63190 },
+ { 0x23CB, 63198 },
+ { 0x23BE, 63205 },
+ { 0x23C6, 63212 },
+ { 0x23CC, 63218 },
+ { 0x23BF, 63225 },
+ { 0x23C0, 63232 },
+ { 0x23C3, 63238 },
+ { 0x00A8, 63244 },
+ { 0x2331, 63245 },
+ { 0x21A1, 63247 },
+ { 0x2193, 63251 },
+ { 0x2913, 63253 },
+ { 0x21A7, 63257 },
+ { 0x21B2, 63261 },
+ { 0x21B3, 63266 },
+ { 0x21B5, 63271 },
+ { 0x21DF, 63276 },
+ { 0x2908, 63281 },
+ { 0x21F5, 63286 },
+ { 0x2B07, 63292 },
+ { 0x21E9, 63295 },
+ { 0x2E14, 63298 },
+ { 0x21E3, 63300 },
+ { 0x21D3, 63303 },
+ { 0x21CA, 63306 },
+ { 0x290B, 63309 },
+ { 0x21AF, 63312 },
+ { 0x2959, 63315 },
+ { 0x2961, 63322 },
+ { 0x296F, 63329 },
+ { 0x2965, 63340 },
+ { 0x2955, 63351 },
+ { 0x295D, 63358 },
+ { 0x21C3, 63365 },
+ { 0x21C2, 63370 },
+ { 0x27F1, 63375 },
+ { 0x2E0E, 63378 },
+ { 0x212E, 63380 },
+ { 0x2259, 63382 },
+ { 0x213B, 63383 },
+ { 0x6F3F, 63385 },
+ { 0x6FE2, 63388 },
+ { 0x6FE6, 63391 },
+ { 0x6FE5, 63394 },
+ { 0x6FE0, 63397 },
+ { 0x6F0E, 63400 },
+ { 0x6F5B, 63403 },
+ { 0x6F5F, 63407 },
+ { 0x6F3B, 63411 },
+ { 0x6F08, 63415 },
+ { 0x6F0B, 63418 },
+ { 0x6F1A, 63421 },
+ { 0x6F0C, 63423 },
+ { 0x6F11, 63425 },
+ { 0x6F16, 63428 },
+ { 0x6F12, 63431 },
+ { 0x6F15, 63434 },
+ { 0x6F14, 63437 },
+ { 0x6F19, 63440 },
+ { 0x6F10, 63443 },
+ { 0x6F18, 63446 },
+ { 0x6F17, 63449 },
+ { 0x6F13, 63452 },
+ { 0x6F40, 63455 },
+ { 0x6F41, 63458 },
+ { 0x6F42, 63463 },
+ { 0x6F43, 63468 },
+ { 0x6F44, 63473 },
+ { 0x6F45, 63478 },
+ { 0x6F46, 63483 },
+ { 0x6F47, 63488 },
+ { 0x6F48, 63493 },
+ { 0x6F49, 63498 },
+ { 0x6F4A, 63503 },
+ { 0x6F4B, 63508 },
+ { 0x6F4C, 63513 },
+ { 0x6F4D, 63518 },
+ { 0x6F4E, 63523 },
+ { 0x6F4F, 63528 },
+ { 0x6F50, 63533 },
+ { 0x6F51, 63538 },
+ { 0x6F52, 63543 },
+ { 0x6F53, 63548 },
+ { 0x6F54, 63553 },
+ { 0x6F55, 63558 },
+ { 0x6F56, 63563 },
+ { 0x6F57, 63568 },
+ { 0x6F58, 63573 },
+ { 0x6F59, 63578 },
+ { 0x6F5A, 63583 },
+ { 0x6F21, 63588 },
+ { 0x6F22, 63593 },
+ { 0x6F23, 63598 },
+ { 0x6F24, 63603 },
+ { 0x6F25, 63608 },
+ { 0x6F26, 63613 },
+ { 0x6F27, 63618 },
+ { 0x6F28, 63623 },
+ { 0x6F29, 63628 },
+ { 0x6F2A, 63633 },
+ { 0x6F2B, 63638 },
+ { 0x6F2C, 63643 },
+ { 0x6F2D, 63648 },
+ { 0x6F2E, 63653 },
+ { 0x6F2F, 63658 },
+ { 0x6F30, 63663 },
+ { 0x6F31, 63668 },
+ { 0x6F32, 63673 },
+ { 0x6F33, 63678 },
+ { 0x6F34, 63683 },
+ { 0x6F35, 63688 },
+ { 0x6F36, 63693 },
+ { 0x6F37, 63698 },
+ { 0x6F38, 63703 },
+ { 0x6F39, 63708 },
+ { 0x6F3A, 63713 },
+ { 0x6FE1, 63718 },
+ { 0x6F5D, 63721 },
+ { 0x6F60, 63725 },
+ { 0x6F3D, 63729 },
+ { 0x6F09, 63733 },
+ { 0x6F5E, 63736 },
+ { 0x6FE4, 63738 },
+ { 0x6F04, 63741 },
+ { 0x6F1D, 63744 },
+ { 0x6FE3, 63747 },
+ { 0x6F03, 63749 },
+ { 0x6F05, 63752 },
+ { 0x6F3C, 63755 },
+ { 0x6F0F, 63758 },
+ { 0x6F0A, 63760 },
+ { 0x6F1F, 63762 },
+ { 0x6F5C, 63765 },
+ { 0x6F06, 63768 },
+ { 0x6F1C, 63770 },
+ { 0x6F02, 63773 },
+ { 0x6F1B, 63776 },
+ { 0x6F07, 63778 },
+ { 0x6F3E, 63780 },
+ { 0x6F20, 63783 },
+ { 0x6F01, 63786 },
+ { 0x6F1E, 63789 },
+ { 0x6F0D, 63792 },
+ { 0x223A, 63794 },
+ { 0x6F62, 63796 },
+ { 0x6FED, 63800 },
+ { 0x6FE8, 63803 },
+ { 0x6F63, 63807 },
+ { 0x6FEE, 63811 },
+ { 0x6FA0, 63814 },
+ { 0x6FC2, 63817 },
+ { 0x6FC7, 63821 },
+ { 0x6FDC, 63825 },
+ { 0x6FCC, 63829 },
+ { 0x6FD3, 63833 },
+ { 0x6FC3, 63837 },
+ { 0x6FC6, 63841 },
+ { 0x6FDA, 63845 },
+ { 0x6FCF, 63849 },
+ { 0x6FCD, 63853 },
+ { 0x6FD5, 63857 },
+ { 0x6FD6, 63861 },
+ { 0x6FC4, 63865 },
+ { 0x6FCB, 63869 },
+ { 0x6FDB, 63873 },
+ { 0x6FD2, 63877 },
+ { 0x6FD7, 63881 },
+ { 0x6FCE, 63885 },
+ { 0x6FD4, 63889 },
+ { 0x6FC5, 63893 },
+ { 0x6FCA, 63897 },
+ { 0x6FB5, 63901 },
+ { 0x6FB8, 63905 },
+ { 0x6FBE, 63909 },
+ { 0x6FB7, 63913 },
+ { 0x6FB1, 63917 },
+ { 0x6FA4, 63921 },
+ { 0x6FB2, 63925 },
+ { 0x6FA9, 63929 },
+ { 0x6FA1, 63933 },
+ { 0x6FA7, 63937 },
+ { 0x6FBA, 63941 },
+ { 0x6FBB, 63945 },
+ { 0x6FBD, 63949 },
+ { 0x6FBC, 63953 },
+ { 0x6FB6, 63957 },
+ { 0x6FB4, 63961 },
+ { 0x6FAD, 63965 },
+ { 0x6FB9, 63969 },
+ { 0x6FB3, 63973 },
+ { 0x6FA3, 63977 },
+ { 0x6FA5, 63981 },
+ { 0x6FA6, 63985 },
+ { 0x6FB0, 63989 },
+ { 0x6FAB, 63993 },
+ { 0x6FAC, 63997 },
+ { 0x6FA2, 64001 },
+ { 0x6FA8, 64005 },
+ { 0x6FAA, 64009 },
+ { 0x6FAF, 64013 },
+ { 0x6FAE, 64017 },
+ { 0x6FEA, 64021 },
+ { 0x6F71, 64024 },
+ { 0x6F74, 64028 },
+ { 0x6F72, 64032 },
+ { 0x6F9D, 64036 },
+ { 0x6F75, 64040 },
+ { 0x6F73, 64044 },
+ { 0x6F8A, 64048 },
+ { 0x6F8D, 64052 },
+ { 0x6F8B, 64056 },
+ { 0x6F8E, 64060 },
+ { 0x6F8C, 64064 },
+ { 0x6F76, 64068 },
+ { 0x6F79, 64072 },
+ { 0x6F77, 64076 },
+ { 0x6F7A, 64080 },
+ { 0x6F78, 64084 },
+ { 0x6F8F, 64088 },
+ { 0x6F92, 64092 },
+ { 0x6F90, 64096 },
+ { 0x6F93, 64100 },
+ { 0x6F91, 64104 },
+ { 0x6F85, 64108 },
+ { 0x6F88, 64112 },
+ { 0x6F86, 64116 },
+ { 0x6F89, 64120 },
+ { 0x6F87, 64124 },
+ { 0x6F97, 64128 },
+ { 0x6F9A, 64132 },
+ { 0x6F98, 64136 },
+ { 0x6F9B, 64140 },
+ { 0x6F99, 64144 },
+ { 0x6F7B, 64148 },
+ { 0x6F7E, 64152 },
+ { 0x6F7C, 64156 },
+ { 0x6F7F, 64160 },
+ { 0x6F7D, 64164 },
+ { 0x6F80, 64168 },
+ { 0x6F83, 64172 },
+ { 0x6F81, 64176 },
+ { 0x6F84, 64180 },
+ { 0x6F82, 64184 },
+ { 0x6F9C, 64188 },
+ { 0x6F66, 64192 },
+ { 0x6F94, 64196 },
+ { 0x6F96, 64200 },
+ { 0x6F95, 64204 },
+ { 0x6F67, 64208 },
+ { 0x6F6A, 64213 },
+ { 0x6F68, 64218 },
+ { 0x6F6B, 64223 },
+ { 0x6F69, 64228 },
+ { 0x6F6F, 64233 },
+ { 0x6F6C, 64238 },
+ { 0x6F6E, 64243 },
+ { 0x6F6D, 64248 },
+ { 0x6F65, 64253 },
+ { 0x6F9E, 64257 },
+ { 0x6F9F, 64262 },
+ { 0x6FEC, 64267 },
+ { 0x6FE9, 64270 },
+ { 0x6FEB, 64273 },
+ { 0x6F61, 64276 },
+ { 0x6F64, 64280 },
+ { 0x6F70, 64283 },
+ { 0x22B9, 64288 },
+ { 0x231B, 64291 },
+ { 0x2261, 64292 },
+ { 0x29E5, 64294 },
+ { 0x2A67, 64299 },
+ { 0x29E1, 64303 },
+ { 0x2206, 64305 },
+ { 0x2380, 64306 },
+ { 0x2064, 64308 },
+ { 0x2062, 64310 },
+ { 0x2063, 64312 },
+ { 0x2939, 64314 },
+ { 0x219E, 64318 },
+ { 0x219C, 64322 },
+ { 0x2190, 64325 },
+ { 0x21E4, 64327 },
+ { 0x21B9, 64331 },
+ { 0x291D, 64340 },
+ { 0x21A4, 64345 },
+ { 0x291F, 64349 },
+ { 0x21C6, 64356 },
+ { 0x2B11, 64361 },
+ { 0x2B10, 64366 },
+ { 0x21A9, 64371 },
+ { 0x21AB, 64375 },
+ { 0x2946, 64379 },
+ { 0x21A2, 64384 },
+ { 0x2B3A, 64388 },
+ { 0x2B39, 64396 },
+ { 0x2B38, 64403 },
+ { 0x21FA, 64408 },
+ { 0x219A, 64414 },
+ { 0x21F7, 64418 },
+ { 0x2943, 64423 },
+ { 0x2973, 64429 },
+ { 0x2B4A, 64434 },
+ { 0x2B4B, 64440 },
+ { 0x2B42, 64446 },
+ { 0x2B3E, 64453 },
+ { 0x297A, 64457 },
+ { 0x2977, 64461 },
+ { 0x2B05, 64465 },
+ { 0x21E6, 64468 },
+ { 0x21E0, 64471 },
+ { 0x290C, 64474 },
+ { 0x21D0, 64478 },
+ { 0x2906, 64481 },
+ { 0x21CD, 64486 },
+ { 0x2902, 64491 },
+ { 0x291B, 64497 },
+ { 0x21C7, 64500 },
+ { 0x290E, 64503 },
+ { 0x21DA, 64507 },
+ { 0x21CB, 64510 },
+ { 0x2952, 64515 },
+ { 0x295A, 64522 },
+ { 0x296A, 64529 },
+ { 0x2962, 64537 },
+ { 0x2966, 64548 },
+ { 0x2956, 64559 },
+ { 0x295E, 64566 },
+ { 0x2967, 64573 },
+ { 0x296B, 64584 },
+ { 0x21BC, 64592 },
+ { 0x21BD, 64597 },
+ { 0x21DC, 64602 },
+ { 0x2B45, 64605 },
+ { 0x2919, 64608 },
+ { 0x2B36, 64610 },
+ { 0x2B3B, 64615 },
+ { 0x2B3D, 64620 },
+ { 0x2B3C, 64629 },
+ { 0x2B35, 64637 },
+ { 0x2B34, 64644 },
+ { 0x2B37, 64650 },
+ { 0x21FD, 64655 },
+ { 0x2264, 64658 },
+ { 0x2A7D, 64662 },
+ { 0x2A81, 64667 },
+ { 0x2A83, 64675 },
+ { 0x2A7F, 64684 },
+ { 0x2272, 64692 },
+ { 0x2A85, 64696 },
+ { 0x2276, 64699 },
+ { 0x2A89, 64702 },
+ { 0x2A87, 64706 },
+ { 0x2268, 64712 },
+ { 0x22E6, 64717 },
+ { 0x2266, 64722 },
+ { 0x003C, 64726 },
+ { 0x22D6, 64728 },
+ { 0x2A79, 64731 },
+ { 0x2A7B, 64735 },
+ { 0x2A8D, 64740 },
+ { 0x2A8F, 64745 },
+ { 0x2A93, 64750 },
+ { 0x2976, 64759 },
+ { 0x2A8B, 64763 },
+ { 0x2A91, 64769 },
+ { 0x22DA, 64775 },
+ { 0x2AA6, 64780 },
+ { 0x2AA8, 64784 },
+ { 0x2607, 64791 },
+ { 0x0D57, 64792 },
+ { 0x0D79, 64796 },
+ { 0x0D4D, 64799 },
+ { 0x0D03, 64802 },
+ { 0x0D02, 64805 },
+ { 0x0D3D, 64808 },
+ { 0x0D67, 64811 },
+ { 0x0D6C, 64814 },
+ { 0x0D68, 64817 },
+ { 0x0D6B, 64820 },
+ { 0x0D6A, 64823 },
+ { 0x0D6F, 64826 },
+ { 0x0D66, 64829 },
+ { 0x0D6E, 64832 },
+ { 0x0D6D, 64835 },
+ { 0x0D69, 64838 },
+ { 0x0D46, 64841 },
+ { 0x0D3F, 64845 },
+ { 0x0D4A, 64849 },
+ { 0x0D41, 64853 },
+ { 0x0D3E, 64857 },
+ { 0x0D48, 64861 },
+ { 0x0D4C, 64865 },
+ { 0x0D47, 64869 },
+ { 0x0D40, 64873 },
+ { 0x0D4B, 64877 },
+ { 0x0D42, 64881 },
+ { 0x0D62, 64885 },
+ { 0x0D43, 64890 },
+ { 0x0D63, 64895 },
+ { 0x0D44, 64900 },
+ { 0x0D05, 64905 },
+ { 0x0D0E, 64908 },
+ { 0x0D07, 64911 },
+ { 0x0D12, 64914 },
+ { 0x0D09, 64917 },
+ { 0x0D06, 64920 },
+ { 0x0D10, 64923 },
+ { 0x0D14, 64926 },
+ { 0x0D2C, 64929 },
+ { 0x0D1A, 64932 },
+ { 0x0D26, 64935 },
+ { 0x0D0F, 64938 },
+ { 0x0D17, 64941 },
+ { 0x0D39, 64944 },
+ { 0x0D08, 64947 },
+ { 0x0D1C, 64950 },
+ { 0x0D15, 64953 },
+ { 0x0D32, 64956 },
+ { 0x0D2E, 64959 },
+ { 0x0D28, 64962 },
+ { 0x0D13, 64965 },
+ { 0x0D2A, 64968 },
+ { 0x0D30, 64971 },
+ { 0x0D38, 64974 },
+ { 0x0D24, 64977 },
+ { 0x0D0A, 64980 },
+ { 0x0D35, 64983 },
+ { 0x0D2F, 64986 },
+ { 0x0D2D, 64989 },
+ { 0x0D1B, 64992 },
+ { 0x0D21, 64995 },
+ { 0x0D27, 64998 },
+ { 0x0D18, 65001 },
+ { 0x0D1D, 65004 },
+ { 0x0D16, 65007 },
+ { 0x0D33, 65010 },
+ { 0x0D19, 65013 },
+ { 0x0D23, 65016 },
+ { 0x0D1E, 65019 },
+ { 0x0D2B, 65022 },
+ { 0x0D31, 65025 },
+ { 0x0D36, 65028 },
+ { 0x0D37, 65031 },
+ { 0x0D25, 65034 },
+ { 0x0D1F, 65037 },
+ { 0x0D22, 65040 },
+ { 0x0D34, 65043 },
+ { 0x0D20, 65046 },
+ { 0x0D7F, 65049 },
+ { 0x0D7D, 65053 },
+ { 0x0D7B, 65057 },
+ { 0x0D7E, 65061 },
+ { 0x0D7A, 65065 },
+ { 0x0D7C, 65069 },
+ { 0x0D0C, 65073 },
+ { 0x0D0B, 65077 },
+ { 0x0D61, 65081 },
+ { 0x0D60, 65085 },
+ { 0x0D71, 65089 },
+ { 0x0D72, 65093 },
+ { 0x0D70, 65097 },
+ { 0x0D74, 65100 },
+ { 0x0D73, 65104 },
+ { 0x0D75, 65108 },
+ { 0x00BA, 65112 },
+ { 0x1805, 65115 },
+ { 0x180B, 65118 },
+ { 0x180C, 65123 },
+ { 0x180D, 65128 },
+ { 0x1803, 65133 },
+ { 0x1807, 65136 },
+ { 0x1806, 65141 },
+ { 0x1800, 65145 },
+ { 0x1804, 65147 },
+ { 0x1802, 65149 },
+ { 0x1811, 65151 },
+ { 0x1816, 65154 },
+ { 0x1812, 65157 },
+ { 0x1815, 65160 },
+ { 0x1814, 65163 },
+ { 0x1819, 65166 },
+ { 0x1810, 65169 },
+ { 0x1818, 65172 },
+ { 0x1817, 65175 },
+ { 0x1813, 65178 },
+ { 0x180E, 65181 },
+ { 0x1820, 65184 },
+ { 0x1821, 65187 },
+ { 0x1822, 65190 },
+ { 0x1823, 65193 },
+ { 0x1824, 65196 },
+ { 0x182A, 65199 },
+ { 0x1833, 65202 },
+ { 0x1827, 65205 },
+ { 0x1839, 65208 },
+ { 0x182D, 65211 },
+ { 0x1835, 65214 },
+ { 0x183A, 65217 },
+ { 0x182F, 65220 },
+ { 0x182E, 65223 },
+ { 0x1828, 65226 },
+ { 0x1825, 65229 },
+ { 0x182B, 65232 },
+ { 0x182C, 65235 },
+ { 0x1837, 65238 },
+ { 0x1830, 65241 },
+ { 0x1832, 65244 },
+ { 0x1826, 65247 },
+ { 0x1838, 65250 },
+ { 0x1836, 65253 },
+ { 0x183D, 65256 },
+ { 0x1887, 65259 },
+ { 0x1888, 65264 },
+ { 0x1897, 65269 },
+ { 0x188B, 65274 },
+ { 0x1891, 65279 },
+ { 0x1889, 65284 },
+ { 0x1892, 65289 },
+ { 0x1890, 65294 },
+ { 0x1896, 65299 },
+ { 0x188E, 65304 },
+ { 0x188A, 65309 },
+ { 0x188F, 65314 },
+ { 0x1893, 65319 },
+ { 0x1894, 65324 },
+ { 0x188C, 65329 },
+ { 0x1895, 65334 },
+ { 0x18A6, 65339 },
+ { 0x18A7, 65345 },
+ { 0x188D, 65351 },
+ { 0x1886, 65356 },
+ { 0x1885, 65362 },
+ { 0x1882, 65367 },
+ { 0x18A9, 65372 },
+ { 0x1883, 65377 },
+ { 0x1881, 65382 },
+ { 0x1880, 65388 },
+ { 0x1884, 65394 },
+ { 0x1829, 65400 },
+ { 0x1834, 65403 },
+ { 0x1842, 65406 },
+ { 0x183E, 65409 },
+ { 0x183B, 65412 },
+ { 0x1840, 65415 },
+ { 0x1831, 65418 },
+ { 0x183C, 65421 },
+ { 0x1841, 65424 },
+ { 0x183F, 65427 },
+ { 0x185D, 65430 },
+ { 0x185E, 65434 },
+ { 0x1861, 65438 },
+ { 0x1869, 65442 },
+ { 0x186B, 65446 },
+ { 0x1864, 65450 },
+ { 0x1865, 65454 },
+ { 0x185F, 65458 },
+ { 0x186A, 65462 },
+ { 0x1863, 65466 },
+ { 0x1866, 65470 },
+ { 0x1868, 65474 },
+ { 0x1860, 65478 },
+ { 0x186F, 65482 },
+ { 0x1862, 65486 },
+ { 0x1871, 65490 },
+ { 0x186C, 65494 },
+ { 0x186D, 65498 },
+ { 0x1870, 65502 },
+ { 0x1867, 65506 },
+ { 0x186E, 65510 },
+ { 0x1872, 65514 },
+ { 0x1844, 65518 },
+ { 0x1845, 65522 },
+ { 0x1846, 65526 },
+ { 0x1847, 65530 },
+ { 0x184B, 65534 },
+ { 0x1851, 65538 },
+ { 0x184E, 65542 },
+ { 0x1853, 65546 },
+ { 0x1857, 65550 },
+ { 0x184F, 65554 },
+ { 0x1848, 65558 },
+ { 0x184C, 65562 },
+ { 0x184D, 65566 },
+ { 0x1850, 65570 },
+ { 0x1849, 65574 },
+ { 0x1856, 65578 },
+ { 0x1855, 65582 },
+ { 0x1898, 65586 },
+ { 0x1899, 65592 },
+ { 0x184A, 65598 },
+ { 0x1852, 65602 },
+ { 0x185C, 65606 },
+ { 0x1858, 65610 },
+ { 0x1859, 65614 },
+ { 0x185A, 65618 },
+ { 0x185B, 65622 },
+ { 0x1854, 65626 },
+ { 0x1843, 65630 },
+ { 0x1873, 65636 },
+ { 0x1876, 65640 },
+ { 0x1874, 65644 },
+ { 0x1875, 65648 },
+ { 0x189C, 65652 },
+ { 0x18A0, 65658 },
+ { 0x18A5, 65664 },
+ { 0x18A8, 65670 },
+ { 0x18A3, 65676 },
+ { 0x18A1, 65682 },
+ { 0x189A, 65688 },
+ { 0x189D, 65694 },
+ { 0x18AA, 65700 },
+ { 0x189B, 65706 },
+ { 0x18A2, 65712 },
+ { 0x189E, 65718 },
+ { 0x18A4, 65724 },
+ { 0x189F, 65730 },
+ { 0x1877, 65736 },
+ { 0x1809, 65740 },
+ { 0x1808, 65744 },
+ { 0x180A, 65747 },
+ { 0x1801, 65749 },
+ { 0x2029, 65751 },
+ { 0x267E, 65753 },
+ { 0x22D4, 65756 },
+ { 0x2ADA, 65757 },
+ { 0x2057, 65761 },
+ { 0x2A0C, 65763 },
+ { 0x0022, 65766 },
+ { 0x2673, 65768 },
+ { 0x2674, 65773 },
+ { 0x2675, 65778 },
+ { 0x2676, 65783 },
+ { 0x2677, 65788 },
+ { 0x2678, 65793 },
+ { 0x2679, 65798 },
+ { 0x267A, 65803 },
+ { 0x203B, 65808 },
+ { 0x2A3D, 65810 },
+ { 0x003B, 65813 },
+ { 0x2744, 65814 },
+ { 0x2222, 65815 },
+ { 0x29A1, 65817 },
+ { 0x29A0, 65821 },
+ { 0x2081, 65825 },
+ { 0x2086, 65827 },
+ { 0x2082, 65829 },
+ { 0x2085, 65831 },
+ { 0x2084, 65833 },
+ { 0x208D, 65835 },
+ { 0x2089, 65838 },
+ { 0x208A, 65840 },
+ { 0x2080, 65843 },
+ { 0x2088, 65845 },
+ { 0x208B, 65847 },
+ { 0x208E, 65849 },
+ { 0x2087, 65852 },
+ { 0x2083, 65854 },
+ { 0x208C, 65856 },
+ { 0x23B2, 65859 },
+ { 0x2A0B, 65861 },
+ { 0x23B3, 65864 },
+ { 0x1BAA, 65866 },
+ { 0x1B80, 65869 },
+ { 0x1B81, 65872 },
+ { 0x1B82, 65875 },
+ { 0x1BB1, 65878 },
+ { 0x1BB6, 65881 },
+ { 0x1BB2, 65884 },
+ { 0x1BB5, 65887 },
+ { 0x1BB4, 65890 },
+ { 0x1BB9, 65893 },
+ { 0x1BB0, 65896 },
+ { 0x1BB8, 65899 },
+ { 0x1BB7, 65902 },
+ { 0x1BB3, 65905 },
+ { 0x1BA8, 65908 },
+ { 0x1BA5, 65912 },
+ { 0x1BA4, 65916 },
+ { 0x1BA7, 65920 },
+ { 0x1BA6, 65924 },
+ { 0x1BA9, 65928 },
+ { 0x1B83, 65932 },
+ { 0x1B88, 65935 },
+ { 0x1B84, 65938 },
+ { 0x1B87, 65941 },
+ { 0x1B85, 65944 },
+ { 0x1B86, 65947 },
+ { 0x1B98, 65950 },
+ { 0x1B8E, 65953 },
+ { 0x1B93, 65956 },
+ { 0x1B89, 65959 },
+ { 0x1B96, 65962 },
+ { 0x1B8C, 65965 },
+ { 0x1BA0, 65968 },
+ { 0x1B8F, 65971 },
+ { 0x1B8A, 65974 },
+ { 0x1B9C, 65977 },
+ { 0x1B99, 65980 },
+ { 0x1B94, 65983 },
+ { 0x1B95, 65986 },
+ { 0x1B8B, 65989 },
+ { 0x1B9B, 65992 },
+ { 0x1B9E, 65995 },
+ { 0x1B92, 65998 },
+ { 0x1B97, 66001 },
+ { 0x1B9D, 66004 },
+ { 0x1B9F, 66007 },
+ { 0x1B9A, 66010 },
+ { 0x1B90, 66013 },
+ { 0x1BAE, 66016 },
+ { 0x1B8D, 66019 },
+ { 0x1B91, 66022 },
+ { 0x1BAF, 66025 },
+ { 0x1BA3, 66028 },
+ { 0x1BA2, 66032 },
+ { 0x1BA1, 66036 },
+ { 0x2121, 66040 },
+ { 0x2706, 66042 },
+ { 0x2315, 66045 },
+ { 0x9353, 66047 },
+ { 0x931D, 66052 },
+ { 0x932D, 66055 },
+ { 0x9323, 66060 },
+ { 0x931C, 66064 },
+ { 0x9307, 66067 },
+ { 0x9343, 66071 },
+ { 0x932F, 66074 },
+ { 0x9346, 66079 },
+ { 0x9308, 66082 },
+ { 0x9314, 66085 },
+ { 0x9331, 66088 },
+ { 0x933B, 66091 },
+ { 0x9344, 66094 },
+ { 0x930C, 66097 },
+ { 0x9306, 66100 },
+ { 0x9321, 66103 },
+ { 0x933D, 66106 },
+ { 0x9320, 66110 },
+ { 0x9336, 66113 },
+ { 0x9325, 66116 },
+ { 0x932A, 66119 },
+ { 0x9335, 66122 },
+ { 0x9319, 66125 },
+ { 0x9309, 66128 },
+ { 0x934F, 66131 },
+ { 0x9315, 66134 },
+ { 0x9349, 66137 },
+ { 0x9350, 66140 },
+ { 0x9316, 66143 },
+ { 0x930A, 66147 },
+ { 0x9327, 66151 },
+ { 0x9340, 66154 },
+ { 0x9339, 66157 },
+ { 0x9324, 66160 },
+ { 0x9334, 66163 },
+ { 0x931A, 66166 },
+ { 0x9345, 66169 },
+ { 0x9317, 66172 },
+ { 0x933A, 66175 },
+ { 0x932B, 66178 },
+ { 0x934D, 66181 },
+ { 0x9312, 66184 },
+ { 0x932E, 66187 },
+ { 0x934C, 66190 },
+ { 0x9329, 66193 },
+ { 0x9337, 66196 },
+ { 0x930E, 66201 },
+ { 0x9326, 66205 },
+ { 0x9338, 66208 },
+ { 0x9348, 66211 },
+ { 0x9347, 66214 },
+ { 0x931F, 66217 },
+ { 0x9318, 66220 },
+ { 0x9356, 66223 },
+ { 0x9328, 66226 },
+ { 0x933F, 66229 },
+ { 0x9332, 66233 },
+ { 0x9355, 66236 },
+ { 0x932C, 66239 },
+ { 0x934B, 66242 },
+ { 0x934E, 66245 },
+ { 0x9352, 66248 },
+ { 0x931E, 66251 },
+ { 0x9310, 66254 },
+ { 0x9330, 66257 },
+ { 0x934A, 66260 },
+ { 0x930D, 66263 },
+ { 0x931B, 66266 },
+ { 0x9351, 66269 },
+ { 0x930B, 66272 },
+ { 0x9333, 66275 },
+ { 0x933E, 66278 },
+ { 0x9313, 66281 },
+ { 0x9341, 66284 },
+ { 0x9322, 66287 },
+ { 0x9354, 66290 },
+ { 0x933C, 66293 },
+ { 0x9311, 66296 },
+ { 0x930F, 66299 },
+ { 0x9342, 66304 },
+ { 0x2234, 66307 },
+ { 0x2672, 66308 },
+ { 0x26AF, 66311 },
+ { 0x6E00, 66314 },
+ { 0x6E01, 66316 },
+ { 0x6E02, 66318 },
+ { 0x6E03, 66320 },
+ { 0x6E04, 66322 },
+ { 0x6E05, 66324 },
+ { 0x6E06, 66326 },
+ { 0x6E07, 66328 },
+ { 0x6E08, 66330 },
+ { 0x6E09, 66332 },
+ { 0x6E0A, 66334 },
+ { 0x6E0B, 66336 },
+ { 0x6E0C, 66338 },
+ { 0x6E0D, 66340 },
+ { 0x6E0E, 66342 },
+ { 0x6E0F, 66344 },
+ { 0xC100, 66346 },
+ { 0xC101, 66348 },
+ { 0xC102, 66350 },
+ { 0xC103, 66352 },
+ { 0xC104, 66354 },
+ { 0xC105, 66356 },
+ { 0xC106, 66358 },
+ { 0xC107, 66360 },
+ { 0xC108, 66362 },
+ { 0xC109, 66364 },
+ { 0xC10A, 66366 },
+ { 0xC10B, 66368 },
+ { 0xC10C, 66370 },
+ { 0xC10D, 66372 },
+ { 0xC10E, 66374 },
+ { 0xC10F, 66376 },
+ { 0xC110, 66378 },
+ { 0xC111, 66380 },
+ { 0xC112, 66382 },
+ { 0xC113, 66384 },
+ { 0xC114, 66386 },
+ { 0xC115, 66388 },
+ { 0xC116, 66390 },
+ { 0xC117, 66392 },
+ { 0xC118, 66394 },
+ { 0xC119, 66396 },
+ { 0xC11A, 66398 },
+ { 0xC11B, 66400 },
+ { 0xC11C, 66402 },
+ { 0xC11D, 66404 },
+ { 0xC11E, 66406 },
+ { 0xC11F, 66408 },
+ { 0xC120, 66410 },
+ { 0xC121, 66412 },
+ { 0xC122, 66414 },
+ { 0xC123, 66416 },
+ { 0xC124, 66418 },
+ { 0xC125, 66420 },
+ { 0xC126, 66422 },
+ { 0xC127, 66424 },
+ { 0xC128, 66426 },
+ { 0xC129, 66428 },
+ { 0xC12A, 66430 },
+ { 0xC12B, 66432 },
+ { 0xC12C, 66434 },
+ { 0xC12D, 66436 },
+ { 0xC12E, 66438 },
+ { 0xC12F, 66440 },
+ { 0xC130, 66442 },
+ { 0xC131, 66444 },
+ { 0xC132, 66446 },
+ { 0xC133, 66448 },
+ { 0xC134, 66450 },
+ { 0xC135, 66452 },
+ { 0xC136, 66454 },
+ { 0xC137, 66456 },
+ { 0xC138, 66458 },
+ { 0xC139, 66460 },
+ { 0xC13A, 66462 },
+ { 0xC13B, 66464 },
+ { 0xC13C, 66466 },
+ { 0xC13D, 66468 },
+ { 0xC13E, 66470 },
+ { 0xC13F, 66472 },
+ { 0xC140, 66474 },
+ { 0xC141, 66476 },
+ { 0xC142, 66478 },
+ { 0xC143, 66480 },
+ { 0xC144, 66482 },
+ { 0xC145, 66484 },
+ { 0xC146, 66486 },
+ { 0xC147, 66488 },
+ { 0xC148, 66490 },
+ { 0xC149, 66492 },
+ { 0xC14A, 66494 },
+ { 0xC14B, 66496 },
+ { 0xC14C, 66498 },
+ { 0xC14D, 66500 },
+ { 0xC14E, 66502 },
+ { 0xC14F, 66504 },
+ { 0xC150, 66506 },
+ { 0xC151, 66508 },
+ { 0xC152, 66510 },
+ { 0xC153, 66512 },
+ { 0xC154, 66514 },
+ { 0xC155, 66516 },
+ { 0xC156, 66518 },
+ { 0xC157, 66520 },
+ { 0xC158, 66522 },
+ { 0xC159, 66524 },
+ { 0xC15A, 66526 },
+ { 0xC15B, 66528 },
+ { 0xC15C, 66530 },
+ { 0xC15D, 66532 },
+ { 0xC15E, 66534 },
+ { 0xC15F, 66536 },
+ { 0xC160, 66538 },
+ { 0xC161, 66540 },
+ { 0xC162, 66542 },
+ { 0xC163, 66544 },
+ { 0xC164, 66546 },
+ { 0xC165, 66548 },
+ { 0xC166, 66550 },
+ { 0xC167, 66552 },
+ { 0xC168, 66554 },
+ { 0xC169, 66556 },
+ { 0xC16A, 66558 },
+ { 0xC16B, 66560 },
+ { 0xC16C, 66562 },
+ { 0xC16D, 66564 },
+ { 0xC16E, 66566 },
+ { 0xC16F, 66568 },
+ { 0xC170, 66570 },
+ { 0xC171, 66572 },
+ { 0xC172, 66574 },
+ { 0xC173, 66576 },
+ { 0xC174, 66578 },
+ { 0xC175, 66580 },
+ { 0xC176, 66582 },
+ { 0xC177, 66584 },
+ { 0xC178, 66586 },
+ { 0xC179, 66588 },
+ { 0xC17A, 66590 },
+ { 0xC17B, 66592 },
+ { 0xC17C, 66594 },
+ { 0xC17D, 66596 },
+ { 0xC17E, 66598 },
+ { 0xC17F, 66600 },
+ { 0xC180, 66602 },
+ { 0xC181, 66604 },
+ { 0xC182, 66606 },
+ { 0xC183, 66608 },
+ { 0xC184, 66610 },
+ { 0xC185, 66612 },
+ { 0xC186, 66614 },
+ { 0xC187, 66616 },
+ { 0xC188, 66618 },
+ { 0xC189, 66620 },
+ { 0xC18A, 66622 },
+ { 0xC18B, 66624 },
+ { 0xC18C, 66626 },
+ { 0xC18D, 66628 },
+ { 0xC18E, 66630 },
+ { 0xC18F, 66632 },
+ { 0xC190, 66634 },
+ { 0xC191, 66636 },
+ { 0xC192, 66638 },
+ { 0xC193, 66640 },
+ { 0xC194, 66642 },
+ { 0xC195, 66644 },
+ { 0xC196, 66646 },
+ { 0xC197, 66648 },
+ { 0xC198, 66650 },
+ { 0xC199, 66652 },
+ { 0xC19A, 66654 },
+ { 0xC19B, 66656 },
+ { 0xC19C, 66658 },
+ { 0xC19D, 66660 },
+ { 0xC19E, 66662 },
+ { 0xC19F, 66664 },
+ { 0xC1A0, 66666 },
+ { 0xC1A1, 66668 },
+ { 0xC1A2, 66670 },
+ { 0xC1A3, 66672 },
+ { 0xC1A4, 66674 },
+ { 0xC1A5, 66676 },
+ { 0xC1A6, 66678 },
+ { 0xC1A7, 66680 },
+ { 0xC1A8, 66682 },
+ { 0xC1A9, 66684 },
+ { 0xC1AA, 66686 },
+ { 0xC1AB, 66688 },
+ { 0xC1AC, 66690 },
+ { 0xC1AD, 66692 },
+ { 0xC1AE, 66694 },
+ { 0xC1AF, 66696 },
+ { 0xC1B0, 66698 },
+ { 0xC1B1, 66700 },
+ { 0xC1B2, 66702 },
+ { 0xC1B3, 66704 },
+ { 0xC1B4, 66706 },
+ { 0xC1B5, 66708 },
+ { 0xC1B6, 66710 },
+ { 0xC1B7, 66712 },
+ { 0xC1B8, 66714 },
+ { 0xC1B9, 66716 },
+ { 0xC1BA, 66718 },
+ { 0xC1BB, 66720 },
+ { 0xC1BC, 66722 },
+ { 0xC1BD, 66724 },
+ { 0xC1BE, 66726 },
+ { 0xC1BF, 66728 },
+ { 0xC1C0, 66730 },
+ { 0xC1C1, 66732 },
+ { 0xC1C2, 66734 },
+ { 0xC1C3, 66736 },
+ { 0xC1C4, 66738 },
+ { 0xC1C5, 66740 },
+ { 0xC1C6, 66742 },
+ { 0xC1C7, 66744 },
+ { 0xC1C8, 66746 },
+ { 0xC1C9, 66748 },
+ { 0xC1CA, 66750 },
+ { 0xC1CB, 66752 },
+ { 0xC1CC, 66754 },
+ { 0xC1CD, 66756 },
+ { 0xC1CE, 66758 },
+ { 0xC1CF, 66760 },
+ { 0xC1D0, 66762 },
+ { 0xC1D1, 66764 },
+ { 0xC1D2, 66766 },
+ { 0xC1D3, 66768 },
+ { 0xC1D4, 66770 },
+ { 0xC1D5, 66772 },
+ { 0xC1D6, 66774 },
+ { 0xC1D7, 66776 },
+ { 0xC1D8, 66778 },
+ { 0xC1D9, 66780 },
+ { 0xC1DA, 66782 },
+ { 0xC1DB, 66784 },
+ { 0xC1DC, 66786 },
+ { 0xC1DD, 66788 },
+ { 0xC1DE, 66790 },
+ { 0xC1DF, 66792 },
+ { 0xC1E0, 66794 },
+ { 0xC1E1, 66796 },
+ { 0xC1E2, 66798 },
+ { 0xC1E3, 66800 },
+ { 0xC1E4, 66802 },
+ { 0xC1E5, 66804 },
+ { 0xC1E6, 66806 },
+ { 0xC1E7, 66808 },
+ { 0xC1E8, 66810 },
+ { 0xC1E9, 66812 },
+ { 0xC1EA, 66814 },
+ { 0xC1EB, 66816 },
+ { 0xC1EC, 66818 },
+ { 0xC1ED, 66820 },
+ { 0xC1EE, 66822 },
+ { 0xC1EF, 66824 },
+ { 0x0027, 66826 },
+ { 0x2250, 66827 },
+ { 0x6E4E, 66830 },
+ { 0x6E4A, 66833 },
+ { 0x005E, 66835 },
+ { 0x0040, 66837 },
+ { 0x2052, 66839 },
+ { 0x2201, 66842 },
+ { 0x2381, 66843 },
+ { 0x260B, 66846 },
+ { 0x0950, 66848 },
+ { 0x0971, 66850 },
+ { 0x093C, 66855 },
+ { 0x094D, 66858 },
+ { 0x0903, 66861 },
+ { 0x0902, 66864 },
+ { 0x093D, 66867 },
+ { 0x0901, 66870 },
+ { 0x0954, 66873 },
+ { 0x0964, 66876 },
+ { 0x0967, 66878 },
+ { 0x096C, 66881 },
+ { 0x0968, 66884 },
+ { 0x096B, 66887 },
+ { 0x096A, 66890 },
+ { 0x096F, 66893 },
+ { 0x0966, 66896 },
+ { 0x096E, 66899 },
+ { 0x096D, 66902 },
+ { 0x0969, 66905 },
+ { 0x0953, 66908 },
+ { 0x0947, 66911 },
+ { 0x093F, 66915 },
+ { 0x094B, 66919 },
+ { 0x0941, 66923 },
+ { 0x093E, 66927 },
+ { 0x0948, 66931 },
+ { 0x094C, 66935 },
+ { 0x0940, 66939 },
+ { 0x0942, 66943 },
+ { 0x0946, 66947 },
+ { 0x094A, 66952 },
+ { 0x0945, 66957 },
+ { 0x0949, 66962 },
+ { 0x0962, 66967 },
+ { 0x0943, 66972 },
+ { 0x0963, 66977 },
+ { 0x0944, 66982 },
+ { 0x0965, 66987 },
+ { 0x0905, 66990 },
+ { 0x090F, 66993 },
+ { 0x0907, 66996 },
+ { 0x0913, 66999 },
+ { 0x0909, 67002 },
+ { 0x0906, 67005 },
+ { 0x0910, 67008 },
+ { 0x0914, 67011 },
+ { 0x092C, 67014 },
+ { 0x091A, 67017 },
+ { 0x0926, 67020 },
+ { 0x095E, 67023 },
+ { 0x0917, 67026 },
+ { 0x0939, 67029 },
+ { 0x0908, 67032 },
+ { 0x091C, 67035 },
+ { 0x0915, 67038 },
+ { 0x0932, 67041 },
+ { 0x092E, 67044 },
+ { 0x0928, 67047 },
+ { 0x092A, 67050 },
+ { 0x0958, 67053 },
+ { 0x0930, 67056 },
+ { 0x0938, 67059 },
+ { 0x0924, 67062 },
+ { 0x090A, 67065 },
+ { 0x0935, 67068 },
+ { 0x092F, 67071 },
+ { 0x095B, 67074 },
+ { 0x097F, 67077 },
+ { 0x092D, 67080 },
+ { 0x091B, 67083 },
+ { 0x0921, 67086 },
+ { 0x0927, 67089 },
+ { 0x097B, 67092 },
+ { 0x0918, 67095 },
+ { 0x091D, 67098 },
+ { 0x097C, 67101 },
+ { 0x0916, 67104 },
+ { 0x0933, 67107 },
+ { 0x0919, 67110 },
+ { 0x0923, 67113 },
+ { 0x091E, 67116 },
+ { 0x092B, 67119 },
+ { 0x095D, 67122 },
+ { 0x0931, 67125 },
+ { 0x0936, 67128 },
+ { 0x0937, 67131 },
+ { 0x0925, 67134 },
+ { 0x091F, 67137 },
+ { 0x095F, 67140 },
+ { 0x097E, 67143 },
+ { 0x0922, 67146 },
+ { 0x095A, 67149 },
+ { 0x0959, 67152 },
+ { 0x0934, 67155 },
+ { 0x0929, 67158 },
+ { 0x0920, 67161 },
+ { 0x095C, 67164 },
+ { 0x0904, 67167 },
+ { 0x090E, 67171 },
+ { 0x0912, 67175 },
+ { 0x0972, 67179 },
+ { 0x090D, 67183 },
+ { 0x0911, 67187 },
+ { 0x097D, 67191 },
+ { 0x090C, 67195 },
+ { 0x090B, 67199 },
+ { 0x0961, 67203 },
+ { 0x0960, 67207 },
+ { 0x0951, 67211 },
+ { 0x0952, 67215 },
+ { 0x0970, 67219 },
+ { 0x224F, 67222 },
+ { 0x23E7, 67224 },
+ { 0x224D, 67226 },
+ { 0x2A78, 67228 },
+ { 0x2C3B, 67233 },
+ { 0x2C4A, 67237 },
+ { 0x2C56, 67241 },
+ { 0x2C53, 67245 },
+ { 0x2C30, 67249 },
+ { 0x2C58, 67253 },
+ { 0x2C41, 67258 },
+ { 0x2C49, 67262 },
+ { 0x2C4E, 67266 },
+ { 0x2C4C, 67270 },
+ { 0x2C46, 67274 },
+ { 0x2C31, 67278 },
+ { 0x2C5A, 67282 },
+ { 0x2C48, 67286 },
+ { 0x2C39, 67290 },
+ { 0x2C3D, 67294 },
+ { 0x2C4B, 67298 },
+ { 0x2C32, 67302 },
+ { 0x2C51, 67306 },
+ { 0x2C50, 67310 },
+ { 0x2C4F, 67314 },
+ { 0x2C34, 67318 },
+ { 0x2C37, 67322 },
+ { 0x2C47, 67326 },
+ { 0x2C40, 67330 },
+ { 0x2C43, 67334 },
+ { 0x2C44, 67338 },
+ { 0x2C54, 67342 },
+ { 0x2C55, 67347 },
+ { 0x2C35, 67354 },
+ { 0x2C4D, 67358 },
+ { 0x2C3C, 67362 },
+ { 0x2C42, 67366 },
+ { 0x2C45, 67370 },
+ { 0x2C38, 67374 },
+ { 0x2C33, 67378 },
+ { 0x2C3A, 67382 },
+ { 0x2C59, 67387 },
+ { 0x2C57, 67393 },
+ { 0x2C5B, 67399 },
+ { 0x2C3E, 67403 },
+ { 0x2C3F, 67407 },
+ { 0x2C5C, 67411 },
+ { 0x2C52, 67415 },
+ { 0x2C36, 67420 },
+ { 0x2C5E, 67424 },
+ { 0x2C5D, 67429 },
+ { 0x2C0B, 67434 },
+ { 0x2C1A, 67438 },
+ { 0x2C26, 67442 },
+ { 0x2C23, 67446 },
+ { 0x2C00, 67450 },
+ { 0x2C28, 67454 },
+ { 0x2C11, 67459 },
+ { 0x2C19, 67463 },
+ { 0x2C1E, 67467 },
+ { 0x2C1C, 67471 },
+ { 0x2C16, 67475 },
+ { 0x2C01, 67479 },
+ { 0x2C2A, 67483 },
+ { 0x2C18, 67487 },
+ { 0x2C09, 67491 },
+ { 0x2C0D, 67495 },
+ { 0x2C1B, 67499 },
+ { 0x2C02, 67503 },
+ { 0x2C21, 67507 },
+ { 0x2C20, 67511 },
+ { 0x2C1F, 67515 },
+ { 0x2C04, 67519 },
+ { 0x2C07, 67523 },
+ { 0x2C17, 67527 },
+ { 0x2C10, 67531 },
+ { 0x2C13, 67535 },
+ { 0x2C14, 67539 },
+ { 0x2C24, 67543 },
+ { 0x2C25, 67548 },
+ { 0x2C05, 67555 },
+ { 0x2C1D, 67559 },
+ { 0x2C0C, 67563 },
+ { 0x2C12, 67567 },
+ { 0x2C15, 67571 },
+ { 0x2C08, 67575 },
+ { 0x2C03, 67579 },
+ { 0x2C0A, 67583 },
+ { 0x2C29, 67588 },
+ { 0x2C27, 67594 },
+ { 0x2C2B, 67600 },
+ { 0x2C0E, 67604 },
+ { 0x2C0F, 67608 },
+ { 0x2C2C, 67612 },
+ { 0x2C22, 67616 },
+ { 0x2C06, 67621 },
+ { 0x2C2E, 67625 },
+ { 0x2C2D, 67630 },
+ { 0x223B, 67635 },
+ { 0x2015, 67636 },
+ { 0x23AF, 67638 },
+ { 0x26A9, 67641 },
+ { 0x23BA, 67646 },
+ { 0x23BB, 67649 },
+ { 0x23BC, 67652 },
+ { 0x23BD, 67655 },
+ { 0x2B23, 67658 },
+ { 0x2026, 67661 },
+ { 0x238E, 67663 },
+ { 0x29DC, 67665 },
+ { 0x7A38, 67667 },
+ { 0x7A3A, 67671 },
+ { 0x7A39, 67675 },
+ { 0x7A0D, 67678 },
+ { 0x7A0F, 67683 },
+ { 0x7A0E, 67686 },
+ { 0x7A40, 67689 },
+ { 0x7A41, 67692 },
+ { 0x7A43, 67695 },
+ { 0x7A42, 67698 },
+ { 0x7A05, 67701 },
+ { 0x7A01, 67705 },
+ { 0x7A06, 67709 },
+ { 0x7A02, 67713 },
+ { 0x7A03, 67717 },
+ { 0x7A0C, 67722 },
+ { 0x7A00, 67726 },
+ { 0x7A26, 67729 },
+ { 0x7A15, 67732 },
+ { 0x7A21, 67735 },
+ { 0x7A12, 67738 },
+ { 0x7A31, 67741 },
+ { 0x7A17, 67744 },
+ { 0x7A10, 67747 },
+ { 0x7A2B, 67750 },
+ { 0x7A28, 67753 },
+ { 0x7A23, 67756 },
+ { 0x7A24, 67759 },
+ { 0x7A2A, 67762 },
+ { 0x7A2F, 67765 },
+ { 0x7A1F, 67768 },
+ { 0x7A2C, 67771 },
+ { 0x7A29, 67774 },
+ { 0x7A30, 67777 },
+ { 0x7A27, 67780 },
+ { 0x7A16, 67783 },
+ { 0x7A1C, 67786 },
+ { 0x7A22, 67789 },
+ { 0x7A13, 67792 },
+ { 0x7A11, 67795 },
+ { 0x7A32, 67798 },
+ { 0x7A1E, 67801 },
+ { 0x7A19, 67804 },
+ { 0x7A25, 67807 },
+ { 0x7A2D, 67810 },
+ { 0x7A2E, 67813 },
+ { 0x7A20, 67816 },
+ { 0x7A1A, 67819 },
+ { 0x7A1D, 67822 },
+ { 0x7A1B, 67825 },
+ { 0x7A33, 67828 },
+ { 0x7A46, 67831 },
+ { 0x7A47, 67835 },
+ { 0x7A44, 67839 },
+ { 0x7A45, 67842 },
+ { 0x7A3F, 67845 },
+ { 0x7A50, 67847 },
+ { 0x7A56, 67850 },
+ { 0x7A58, 67853 },
+ { 0x7A55, 67856 },
+ { 0x7A51, 67859 },
+ { 0x7A52, 67863 },
+ { 0x7A57, 67866 },
+ { 0x7A53, 67870 },
+ { 0x7A54, 67874 },
+ { 0x238D, 67877 },
+ { 0x2ADD, 67879 },
+ { 0x260D, 67880 },
+ { 0x1736, 67881 },
+ { 0x1735, 67884 },
+ { 0x791F, 67887 },
+ { 0x7904, 67890 },
+ { 0x7910, 67893 },
+ { 0x790F, 67896 },
+ { 0x7900, 67899 },
+ { 0x7901, 67902 },
+ { 0x7907, 67905 },
+ { 0x790A, 67908 },
+ { 0x790C, 67911 },
+ { 0x790D, 67914 },
+ { 0x7912, 67917 },
+ { 0x7915, 67920 },
+ { 0x7908, 67923 },
+ { 0x7905, 67926 },
+ { 0x7909, 67929 },
+ { 0x7906, 67932 },
+ { 0x7903, 67935 },
+ { 0x7902, 67938 },
+ { 0x790B, 67941 },
+ { 0x7913, 67944 },
+ { 0x7911, 67947 },
+ { 0x790E, 67950 },
+ { 0x7914, 67953 },
+ { 0x7916, 67956 },
+ { 0x7919, 67959 },
+ { 0x7917, 67963 },
+ { 0x7918, 67966 },
+ { 0x00B1, 67969 },
+ { 0x2305, 67971 },
+ { 0x2237, 67972 },
+ { 0x2A16, 67973 },
+ { 0x225F, 67976 },
+ { 0x00AE, 67979 },
+ { 0x2938, 67981 },
+ { 0x21A0, 67985 },
+ { 0x219D, 67989 },
+ { 0x2192, 67992 },
+ { 0x21E5, 67994 },
+ { 0x291E, 67998 },
+ { 0x21A6, 68003 },
+ { 0x2920, 68007 },
+ { 0x21C4, 68014 },
+ { 0x2B0F, 68019 },
+ { 0x2B0E, 68024 },
+ { 0x21AA, 68029 },
+ { 0x21AC, 68033 },
+ { 0x2945, 68037 },
+ { 0x21A3, 68042 },
+ { 0x2915, 68046 },
+ { 0x2914, 68054 },
+ { 0x21B4, 68061 },
+ { 0x2911, 68066 },
+ { 0x21FB, 68071 },
+ { 0x219B, 68077 },
+ { 0x21F8, 68081 },
+ { 0x2942, 68086 },
+ { 0x2974, 68092 },
+ { 0x2975, 68097 },
+ { 0x2B4C, 68103 },
+ { 0x2B48, 68109 },
+ { 0x2947, 68116 },
+ { 0x2B44, 68120 },
+ { 0x2B43, 68124 },
+ { 0x21E8, 68128 },
+ { 0x21F0, 68131 },
+ { 0x21E2, 68136 },
+ { 0x290D, 68139 },
+ { 0x21D2, 68143 },
+ { 0x2907, 68146 },
+ { 0x21CF, 68151 },
+ { 0x2903, 68156 },
+ { 0x291C, 68162 },
+ { 0x21C9, 68165 },
+ { 0x290F, 68168 },
+ { 0x21DB, 68172 },
+ { 0x21CC, 68175 },
+ { 0x2953, 68180 },
+ { 0x295B, 68187 },
+ { 0x296C, 68194 },
+ { 0x2968, 68202 },
+ { 0x2964, 68213 },
+ { 0x2957, 68224 },
+ { 0x295F, 68231 },
+ { 0x2969, 68238 },
+ { 0x296D, 68249 },
+ { 0x21C0, 68257 },
+ { 0x21C1, 68262 },
+ { 0x21DD, 68267 },
+ { 0x2B46, 68270 },
+ { 0x291A, 68273 },
+ { 0x2905, 68275 },
+ { 0x2916, 68280 },
+ { 0x2918, 68285 },
+ { 0x2917, 68294 },
+ { 0x2901, 68302 },
+ { 0x2900, 68309 },
+ { 0x2910, 68315 },
+ { 0x21FE, 68320 },
+ { 0x58C4, 68323 },
+ { 0x5881, 68326 },
+ { 0x5880, 68329 },
+ { 0x58CE, 68332 },
+ { 0x58D1, 68334 },
+ { 0x58D6, 68337 },
+ { 0x58D2, 68340 },
+ { 0x58D5, 68343 },
+ { 0x58D4, 68346 },
+ { 0x58D9, 68349 },
+ { 0x58D0, 68352 },
+ { 0x58D8, 68355 },
+ { 0x58D7, 68358 },
+ { 0x58D3, 68361 },
+ { 0x58BE, 68364 },
+ { 0x58B6, 68368 },
+ { 0x58C1, 68372 },
+ { 0x58B8, 68376 },
+ { 0x58B5, 68380 },
+ { 0x58C0, 68384 },
+ { 0x58C3, 68388 },
+ { 0x58BF, 68392 },
+ { 0x58B7, 68396 },
+ { 0x58C2, 68400 },
+ { 0x58B9, 68404 },
+ { 0x58BC, 68408 },
+ { 0x58BA, 68413 },
+ { 0x58BD, 68418 },
+ { 0x58BB, 68423 },
+ { 0x58CF, 68428 },
+ { 0x5882, 68431 },
+ { 0x588C, 68434 },
+ { 0x5884, 68437 },
+ { 0x588F, 68440 },
+ { 0x5886, 68443 },
+ { 0x5883, 68446 },
+ { 0x588E, 68449 },
+ { 0x5891, 68452 },
+ { 0x58A8, 68455 },
+ { 0x5897, 68458 },
+ { 0x58A3, 68461 },
+ { 0x588D, 68464 },
+ { 0x5894, 68467 },
+ { 0x58B2, 68470 },
+ { 0x5885, 68473 },
+ { 0x5899, 68476 },
+ { 0x5892, 68479 },
+ { 0x58AD, 68482 },
+ { 0x58AA, 68485 },
+ { 0x58A5, 68488 },
+ { 0x5890, 68491 },
+ { 0x58A6, 68494 },
+ { 0x58AC, 68497 },
+ { 0x58B1, 68500 },
+ { 0x58A1, 68503 },
+ { 0x5887, 68506 },
+ { 0x58AE, 68509 },
+ { 0x58AB, 68512 },
+ { 0x58A9, 68515 },
+ { 0x5898, 68518 },
+ { 0x589E, 68521 },
+ { 0x58A4, 68524 },
+ { 0x5895, 68527 },
+ { 0x589A, 68530 },
+ { 0x5893, 68533 },
+ { 0x58B3, 68536 },
+ { 0x5896, 68539 },
+ { 0x58A0, 68542 },
+ { 0x589B, 68545 },
+ { 0x58A7, 68548 },
+ { 0x58AF, 68551 },
+ { 0x58B0, 68554 },
+ { 0x58A2, 68557 },
+ { 0x589C, 68560 },
+ { 0x589F, 68563 },
+ { 0x589D, 68566 },
+ { 0x588A, 68569 },
+ { 0x5888, 68573 },
+ { 0x588B, 68577 },
+ { 0x5889, 68581 },
+ { 0x58B4, 68585 },
+ { 0x2A32, 68589 },
+ { 0x237D, 68594 },
+ { 0x2006, 68597 },
+ { 0x2023, 68599 },
+ { 0x267F, 68601 },
+ { 0x2387, 68603 },
+ { 0x27AB, 68606 },
+ { 0x2A10, 68611 },
+ { 0x2384, 68613 },
+ { 0x260C, 68615 },
+ { 0x2258, 68616 },
+ { 0x2334, 68618 },
+ { 0x2335, 68619 },
+ { 0x2A99, 68620 },
+ { 0x2A9A, 68625 },
+ { 0x2A9B, 68630 },
+ { 0x2A9C, 68636 },
+ { 0x2AF9, 68642 },
+ { 0x2AFA, 68648 },
+ { 0x225A, 68654 },
+ { 0x0021, 68656 },
+ { 0x2049, 68658 },
+ { 0x2005, 68661 },
+ { 0x2027, 68663 },
+ { 0x3002, 68665 },
+ { 0x303F, 68668 },
+ { 0x3001, 68672 },
+ { 0x302A, 68674 },
+ { 0x3000, 68678 },
+ { 0x3007, 68680 },
+ { 0x302B, 68683 },
+ { 0x3006, 68687 },
+ { 0x302D, 68690 },
+ { 0x302C, 68694 },
+ { 0x3005, 68698 },
+ { 0x3037, 68701 },
+ { 0x33E0, 68707 },
+ { 0x33E5, 68713 },
+ { 0x33E9, 68719 },
+ { 0x33E1, 68725 },
+ { 0x33E4, 68731 },
+ { 0x33E3, 68737 },
+ { 0x33E8, 68743 },
+ { 0x33E7, 68749 },
+ { 0x33E6, 68755 },
+ { 0x33E2, 68761 },
+ { 0x33EA, 68767 },
+ { 0x33FD, 68773 },
+ { 0x33EB, 68779 },
+ { 0x33F3, 68785 },
+ { 0x33EE, 68791 },
+ { 0x33EF, 68797 },
+ { 0x33F1, 68803 },
+ { 0x33ED, 68809 },
+ { 0x33F2, 68815 },
+ { 0x33EC, 68821 },
+ { 0x33F0, 68827 },
+ { 0x33FE, 68833 },
+ { 0x33F4, 68839 },
+ { 0x33F9, 68845 },
+ { 0x33F5, 68851 },
+ { 0x33F8, 68857 },
+ { 0x33F7, 68863 },
+ { 0x33FC, 68869 },
+ { 0x33FB, 68875 },
+ { 0x33FA, 68881 },
+ { 0x33F6, 68887 },
+ { 0x32C4, 68893 },
+ { 0x3359, 68898 },
+ { 0x335E, 68904 },
+ { 0x3362, 68910 },
+ { 0x335A, 68916 },
+ { 0x335D, 68922 },
+ { 0x335C, 68928 },
+ { 0x3361, 68934 },
+ { 0x3358, 68940 },
+ { 0x3360, 68946 },
+ { 0x335F, 68952 },
+ { 0x335B, 68958 },
+ { 0x3363, 68964 },
+ { 0x3364, 68970 },
+ { 0x336C, 68976 },
+ { 0x3367, 68982 },
+ { 0x3368, 68988 },
+ { 0x336A, 68994 },
+ { 0x3366, 69000 },
+ { 0x336B, 69006 },
+ { 0x3365, 69012 },
+ { 0x3369, 69018 },
+ { 0x336D, 69024 },
+ { 0x336E, 69030 },
+ { 0x3370, 69036 },
+ { 0x336F, 69042 },
+ { 0x32C6, 69048 },
+ { 0x32C5, 69053 },
+ { 0x32C3, 69058 },
+ { 0x32C2, 69063 },
+ { 0x32C7, 69068 },
+ { 0x32C0, 69073 },
+ { 0x32C9, 69078 },
+ { 0x32CB, 69083 },
+ { 0x32C1, 69088 },
+ { 0x32CA, 69093 },
+ { 0x32C8, 69098 },
+ { 0x303E, 69103 },
+ { 0x319F, 69106 },
+ { 0x3192, 69110 },
+ { 0x3196, 69114 },
+ { 0x3193, 69118 },
+ { 0x3195, 69122 },
+ { 0x319E, 69126 },
+ { 0x3199, 69130 },
+ { 0x319B, 69134 },
+ { 0x3194, 69138 },
+ { 0x3198, 69142 },
+ { 0x319C, 69146 },
+ { 0x319D, 69150 },
+ { 0x3197, 69154 },
+ { 0x319A, 69158 },
+ { 0x3190, 69162 },
+ { 0x3191, 69166 },
+ { 0x2FF4, 69170 },
+ { 0x2FF0, 69175 },
+ { 0x2FF2, 69181 },
+ { 0x2FF1, 69189 },
+ { 0x2FF3, 69195 },
+ { 0x2FFB, 69203 },
+ { 0x2FF7, 69207 },
+ { 0x2FF5, 69213 },
+ { 0x2FF6, 69219 },
+ { 0x2FFA, 69225 },
+ { 0x2FF8, 69232 },
+ { 0x2FF9, 69239 },
+ { 0x2139, 69246 },
+ { 0x22BA, 69248 },
+ { 0x6FF9, 69249 },
+ { 0x6FFA, 69252 },
+ { 0x6FFB, 69255 },
+ { 0x26A4, 69258 },
+ { 0x203D, 69263 },
+ { 0x27AA, 69264 },
+ { 0x2E0F, 69268 },
+ { 0x3250, 69269 },
+ { 0x2306, 69271 },
+ { 0x2008, 69272 },
+ { 0x2622, 69274 },
+ { 0x6FFD, 69276 },
+ { 0x2650, 69278 },
+ { 0x26BA, 69279 },
+ { 0x00B9, 69280 },
+ { 0x2076, 69282 },
+ { 0x00B2, 69284 },
+ { 0x2075, 69286 },
+ { 0x2074, 69288 },
+ { 0x207D, 69290 },
+ { 0x2079, 69293 },
+ { 0x207A, 69295 },
+ { 0x2070, 69298 },
+ { 0x2078, 69300 },
+ { 0x2071, 69302 },
+ { 0x207F, 69307 },
+ { 0x207B, 69312 },
+ { 0x207E, 69314 },
+ { 0x2077, 69317 },
+ { 0x00B3, 69319 },
+ { 0x207C, 69321 },
+ { 0x2ADB, 69324 },
+ { 0x25ED, 69326 },
+ { 0x25EE, 69332 },
+ { 0x214D, 69338 },
+ { 0x2A3F, 69339 },
+ { 0x060A, 69342 },
+ { 0x0609, 69347 },
+ { 0x0606, 69351 },
+ { 0x0661, 69354 },
+ { 0x0666, 69357 },
+ { 0x0662, 69360 },
+ { 0x0665, 69363 },
+ { 0x0664, 69366 },
+ { 0x0669, 69369 },
+ { 0x0660, 69372 },
+ { 0x0668, 69375 },
+ { 0x0667, 69378 },
+ { 0x0663, 69381 },
+ { 0x0607, 69384 },
+ { 0x212D, 69387 },
+ { 0x210C, 69390 },
+ { 0x2111, 69393 },
+ { 0x211C, 69396 },
+ { 0x2128, 69399 },
+ { 0x232D, 69402 },
+ { 0x29DF, 69403 },
+ { 0x29F3, 69405 },
+ { 0x29EF, 69408 },
+ { 0x29F1, 69411 },
+ { 0x29F2, 69414 },
+ { 0x29EE, 69417 },
+ { 0x29F0, 69420 },
+ { 0x269C, 69423 },
+ { 0x27AC, 69424 },
+ { 0x2265, 69429 },
+ { 0x2A7E, 69433 },
+ { 0x2A82, 69438 },
+ { 0x2A84, 69446 },
+ { 0x2A80, 69455 },
+ { 0x2277, 69463 },
+ { 0x2273, 69466 },
+ { 0x2A86, 69470 },
+ { 0x2A8A, 69473 },
+ { 0x2A88, 69477 },
+ { 0x2269, 69483 },
+ { 0x22E7, 69488 },
+ { 0x2267, 69493 },
+ { 0x003E, 69497 },
+ { 0x22D7, 69499 },
+ { 0x2A7A, 69502 },
+ { 0x2A7C, 69506 },
+ { 0x2A8E, 69511 },
+ { 0x2A90, 69516 },
+ { 0x2A94, 69521 },
+ { 0x2A92, 69530 },
+ { 0x2978, 69536 },
+ { 0x2A8C, 69540 },
+ { 0x22DB, 69546 },
+ { 0x2AA5, 69551 },
+ { 0x2AA7, 69554 },
+ { 0x2AA9, 69558 },
+ { 0x2AA4, 69565 },
+ { 0x002D, 69568 },
+ { 0x2E12, 69569 },
+ { 0x2229, 69570 },
+ { 0x2A40, 69571 },
+ { 0x2A44, 69574 },
+ { 0x2A43, 69578 },
+ { 0x2A49, 69581 },
+ { 0x2A47, 69586 },
+ { 0x2A4B, 69589 },
+ { 0x96E1, 69595 },
+ { 0x96DF, 69599 },
+ { 0x96E0, 69603 },
+ { 0x97CF, 69607 },
+ { 0x97D4, 69611 },
+ { 0x97D0, 69615 },
+ { 0x97D3, 69619 },
+ { 0x97D2, 69623 },
+ { 0x97D7, 69627 },
+ { 0x97CE, 69631 },
+ { 0x97D6, 69635 },
+ { 0x97D5, 69639 },
+ { 0x97D1, 69643 },
+ { 0x96DE, 69647 },
+ { 0x96C1, 69651 },
+ { 0x941A, 69654 },
+ { 0x941B, 69658 },
+ { 0x941C, 69662 },
+ { 0x941D, 69666 },
+ { 0x941E, 69670 },
+ { 0x941F, 69674 },
+ { 0x9420, 69678 },
+ { 0x9421, 69682 },
+ { 0x9422, 69686 },
+ { 0x9423, 69690 },
+ { 0x9424, 69694 },
+ { 0x9425, 69698 },
+ { 0x9426, 69702 },
+ { 0x9427, 69706 },
+ { 0x9428, 69710 },
+ { 0x9429, 69714 },
+ { 0x942A, 69718 },
+ { 0x942B, 69722 },
+ { 0x942C, 69726 },
+ { 0x942D, 69730 },
+ { 0x942E, 69734 },
+ { 0x942F, 69738 },
+ { 0x9430, 69742 },
+ { 0x9431, 69746 },
+ { 0x9432, 69750 },
+ { 0x9433, 69754 },
+ { 0x96CD, 69758 },
+ { 0x96CE, 69762 },
+ { 0x96D1, 69766 },
+ { 0x96CF, 69770 },
+ { 0x96D8, 69774 },
+ { 0x96C8, 69778 },
+ { 0x96D7, 69782 },
+ { 0x96D9, 69786 },
+ { 0x96D2, 69790 },
+ { 0x96D5, 69794 },
+ { 0x96C3, 69798 },
+ { 0x96CA, 69802 },
+ { 0x96C7, 69806 },
+ { 0x96C2, 69810 },
+ { 0x96C5, 69814 },
+ { 0x96D3, 69818 },
+ { 0x96C4, 69823 },
+ { 0x96CB, 69827 },
+ { 0x96CC, 69831 },
+ { 0x96DA, 69835 },
+ { 0x96D4, 69839 },
+ { 0x96C9, 69843 },
+ { 0x97CB, 69847 },
+ { 0x96C6, 69851 },
+ { 0x96D0, 69855 },
+ { 0x96D6, 69859 },
+ { 0x96DD, 69863 },
+ { 0x9755, 69867 },
+ { 0x9753, 69872 },
+ { 0x9754, 69877 },
+ { 0x9752, 69882 },
+ { 0x9735, 69887 },
+ { 0x9482, 69891 },
+ { 0x9483, 69896 },
+ { 0x9484, 69901 },
+ { 0x9485, 69906 },
+ { 0x9486, 69911 },
+ { 0x9487, 69916 },
+ { 0x9488, 69921 },
+ { 0x9489, 69926 },
+ { 0x948A, 69931 },
+ { 0x948B, 69936 },
+ { 0x948C, 69941 },
+ { 0x948D, 69946 },
+ { 0x948E, 69951 },
+ { 0x948F, 69956 },
+ { 0x9490, 69961 },
+ { 0x9491, 69966 },
+ { 0x9492, 69971 },
+ { 0x9493, 69976 },
+ { 0x9494, 69981 },
+ { 0x9495, 69986 },
+ { 0x9496, 69991 },
+ { 0x9497, 69996 },
+ { 0x9498, 70001 },
+ { 0x9499, 70006 },
+ { 0x949A, 70011 },
+ { 0x949B, 70016 },
+ { 0x9741, 70021 },
+ { 0x9742, 70026 },
+ { 0x9745, 70031 },
+ { 0x9743, 70036 },
+ { 0x974C, 70041 },
+ { 0x973C, 70046 },
+ { 0x974B, 70051 },
+ { 0x974D, 70056 },
+ { 0x9746, 70061 },
+ { 0x9749, 70066 },
+ { 0x9737, 70071 },
+ { 0x973E, 70076 },
+ { 0x973B, 70081 },
+ { 0x9736, 70086 },
+ { 0x9739, 70091 },
+ { 0x9747, 70096 },
+ { 0x9738, 70102 },
+ { 0x973F, 70107 },
+ { 0x9740, 70112 },
+ { 0x974E, 70117 },
+ { 0x9748, 70122 },
+ { 0x973D, 70127 },
+ { 0x973A, 70132 },
+ { 0x9744, 70137 },
+ { 0x974A, 70142 },
+ { 0x9751, 70147 },
+ { 0x9468, 70152 },
+ { 0x9469, 70157 },
+ { 0x946A, 70162 },
+ { 0x946B, 70167 },
+ { 0x946C, 70172 },
+ { 0x946D, 70177 },
+ { 0x946E, 70182 },
+ { 0x946F, 70187 },
+ { 0x9470, 70192 },
+ { 0x9471, 70197 },
+ { 0x9472, 70202 },
+ { 0x9473, 70207 },
+ { 0x9474, 70212 },
+ { 0x9475, 70217 },
+ { 0x9476, 70222 },
+ { 0x9477, 70227 },
+ { 0x9478, 70232 },
+ { 0x9479, 70237 },
+ { 0x947A, 70242 },
+ { 0x947B, 70247 },
+ { 0x947C, 70252 },
+ { 0x947D, 70257 },
+ { 0x947E, 70262 },
+ { 0x947F, 70267 },
+ { 0x9480, 70272 },
+ { 0x9481, 70277 },
+ { 0x9727, 70282 },
+ { 0x9728, 70287 },
+ { 0x972B, 70292 },
+ { 0x9729, 70297 },
+ { 0x9732, 70302 },
+ { 0x9722, 70307 },
+ { 0x9731, 70312 },
+ { 0x9733, 70317 },
+ { 0x972C, 70322 },
+ { 0x972F, 70327 },
+ { 0x971D, 70332 },
+ { 0x9724, 70337 },
+ { 0x9721, 70342 },
+ { 0x971C, 70347 },
+ { 0x971F, 70352 },
+ { 0x971E, 70357 },
+ { 0x9725, 70362 },
+ { 0x9726, 70367 },
+ { 0x9734, 70372 },
+ { 0x972E, 70377 },
+ { 0x9723, 70382 },
+ { 0x972D, 70387 },
+ { 0x9720, 70393 },
+ { 0x972A, 70398 },
+ { 0x9730, 70403 },
+ { 0x9750, 70408 },
+ { 0x974F, 70413 },
+ { 0x94EA, 70418 },
+ { 0x94EB, 70423 },
+ { 0x94EC, 70428 },
+ { 0x94ED, 70433 },
+ { 0x94EE, 70438 },
+ { 0x94EF, 70443 },
+ { 0x94F0, 70448 },
+ { 0x94F1, 70453 },
+ { 0x94F2, 70458 },
+ { 0x94F3, 70463 },
+ { 0x94F4, 70468 },
+ { 0x94F5, 70473 },
+ { 0x94F6, 70478 },
+ { 0x94F7, 70483 },
+ { 0x94F8, 70488 },
+ { 0x94F9, 70493 },
+ { 0x94FA, 70498 },
+ { 0x94FB, 70503 },
+ { 0x94FC, 70508 },
+ { 0x94FD, 70513 },
+ { 0x94FE, 70518 },
+ { 0x94FF, 70523 },
+ { 0x9500, 70528 },
+ { 0x9501, 70533 },
+ { 0x9502, 70538 },
+ { 0x9503, 70543 },
+ { 0x94D0, 70548 },
+ { 0x94D1, 70553 },
+ { 0x94D2, 70558 },
+ { 0x94D3, 70563 },
+ { 0x94D4, 70568 },
+ { 0x94D5, 70573 },
+ { 0x94D6, 70578 },
+ { 0x94D7, 70583 },
+ { 0x94D8, 70588 },
+ { 0x94D9, 70593 },
+ { 0x94DA, 70598 },
+ { 0x94DB, 70603 },
+ { 0x94DC, 70608 },
+ { 0x94DD, 70613 },
+ { 0x94DE, 70618 },
+ { 0x94DF, 70623 },
+ { 0x94E0, 70628 },
+ { 0x94E1, 70633 },
+ { 0x94E2, 70638 },
+ { 0x94E3, 70643 },
+ { 0x94E4, 70648 },
+ { 0x94E5, 70653 },
+ { 0x94E6, 70658 },
+ { 0x94E7, 70663 },
+ { 0x94E8, 70668 },
+ { 0x94E9, 70673 },
+ { 0x9400, 70678 },
+ { 0x9401, 70682 },
+ { 0x9402, 70686 },
+ { 0x9403, 70690 },
+ { 0x9404, 70694 },
+ { 0x9405, 70698 },
+ { 0x9406, 70702 },
+ { 0x9407, 70706 },
+ { 0x9408, 70710 },
+ { 0x9409, 70714 },
+ { 0x940A, 70718 },
+ { 0x940B, 70722 },
+ { 0x940C, 70726 },
+ { 0x940D, 70730 },
+ { 0x940E, 70734 },
+ { 0x940F, 70738 },
+ { 0x9410, 70742 },
+ { 0x9411, 70746 },
+ { 0x9412, 70750 },
+ { 0x9413, 70754 },
+ { 0x9414, 70758 },
+ { 0x9415, 70762 },
+ { 0x9416, 70766 },
+ { 0x9417, 70770 },
+ { 0x9418, 70774 },
+ { 0x9419, 70778 },
+ { 0x96B3, 70782 },
+ { 0x96B4, 70786 },
+ { 0x96B7, 70790 },
+ { 0x96B5, 70794 },
+ { 0x96BE, 70798 },
+ { 0x96AE, 70802 },
+ { 0x96BD, 70806 },
+ { 0x96BF, 70810 },
+ { 0x96B8, 70814 },
+ { 0x96BB, 70818 },
+ { 0x96A9, 70822 },
+ { 0x96B0, 70826 },
+ { 0x96AD, 70830 },
+ { 0x96A8, 70834 },
+ { 0x96AB, 70838 },
+ { 0x96AA, 70842 },
+ { 0x96B1, 70846 },
+ { 0x96B2, 70850 },
+ { 0x96C0, 70854 },
+ { 0x96BA, 70858 },
+ { 0x96AF, 70862 },
+ { 0x96B9, 70866 },
+ { 0x97CA, 70871 },
+ { 0x96AC, 70875 },
+ { 0x96B6, 70879 },
+ { 0x96BC, 70883 },
+ { 0x96DC, 70887 },
+ { 0x9586, 70891 },
+ { 0x9587, 70896 },
+ { 0x9588, 70901 },
+ { 0x9589, 70906 },
+ { 0x958A, 70911 },
+ { 0x958B, 70916 },
+ { 0x958C, 70921 },
+ { 0x958D, 70926 },
+ { 0x958E, 70931 },
+ { 0x958F, 70936 },
+ { 0x9590, 70941 },
+ { 0x9591, 70946 },
+ { 0x9592, 70951 },
+ { 0x9593, 70956 },
+ { 0x9594, 70961 },
+ { 0x9595, 70966 },
+ { 0x9596, 70971 },
+ { 0x9597, 70976 },
+ { 0x9598, 70981 },
+ { 0x9599, 70986 },
+ { 0x959A, 70991 },
+ { 0x959B, 70996 },
+ { 0x959C, 71001 },
+ { 0x959D, 71006 },
+ { 0x959E, 71011 },
+ { 0x959F, 71016 },
+ { 0x956C, 71021 },
+ { 0x956D, 71026 },
+ { 0x956E, 71031 },
+ { 0x956F, 71036 },
+ { 0x9570, 71041 },
+ { 0x9571, 71046 },
+ { 0x9572, 71051 },
+ { 0x9573, 71056 },
+ { 0x9574, 71061 },
+ { 0x9575, 71066 },
+ { 0x9576, 71071 },
+ { 0x9577, 71076 },
+ { 0x9578, 71081 },
+ { 0x9579, 71086 },
+ { 0x957A, 71091 },
+ { 0x957B, 71096 },
+ { 0x957C, 71101 },
+ { 0x957D, 71106 },
+ { 0x957E, 71111 },
+ { 0x957F, 71116 },
+ { 0x9580, 71121 },
+ { 0x9581, 71126 },
+ { 0x9582, 71131 },
+ { 0x9583, 71136 },
+ { 0x9584, 71141 },
+ { 0x9585, 71146 },
+ { 0x96DB, 71151 },
+ { 0x27E8, 71155 },
+ { 0x27E6, 71159 },
+ { 0x27EC, 71164 },
+ { 0x27EA, 71170 },
+ { 0x27EE, 71175 },
+ { 0x27E9, 71179 },
+ { 0x27E7, 71183 },
+ { 0x27ED, 71188 },
+ { 0x27EB, 71194 },
+ { 0x27EF, 71199 },
+ { 0x971B, 71203 },
+ { 0x9719, 71207 },
+ { 0x971A, 71211 },
+ { 0x9718, 71215 },
+ { 0x96FB, 71219 },
+ { 0x944E, 71222 },
+ { 0x944F, 71226 },
+ { 0x9450, 71230 },
+ { 0x9451, 71234 },
+ { 0x9452, 71238 },
+ { 0x9453, 71242 },
+ { 0x9454, 71246 },
+ { 0x9456, 71250 },
+ { 0x9457, 71254 },
+ { 0x9458, 71258 },
+ { 0x9459, 71262 },
+ { 0x945A, 71266 },
+ { 0x945B, 71270 },
+ { 0x945C, 71274 },
+ { 0x945D, 71278 },
+ { 0x945E, 71282 },
+ { 0x945F, 71286 },
+ { 0x9460, 71290 },
+ { 0x9461, 71294 },
+ { 0x9462, 71298 },
+ { 0x9463, 71302 },
+ { 0x9464, 71306 },
+ { 0x9465, 71310 },
+ { 0x9466, 71314 },
+ { 0x9467, 71318 },
+ { 0x9707, 71322 },
+ { 0x9708, 71326 },
+ { 0x970B, 71330 },
+ { 0x9709, 71334 },
+ { 0x9712, 71338 },
+ { 0x9702, 71342 },
+ { 0x9711, 71346 },
+ { 0x9713, 71350 },
+ { 0x970C, 71354 },
+ { 0x970F, 71358 },
+ { 0x96FD, 71362 },
+ { 0x9704, 71366 },
+ { 0x9701, 71370 },
+ { 0x96FC, 71374 },
+ { 0x96FF, 71378 },
+ { 0x970D, 71382 },
+ { 0x96FE, 71387 },
+ { 0x9705, 71391 },
+ { 0x9706, 71395 },
+ { 0x9714, 71399 },
+ { 0x970E, 71403 },
+ { 0x9703, 71407 },
+ { 0x96A4, 71411 },
+ { 0x96A5, 71416 },
+ { 0x9700, 71421 },
+ { 0x970A, 71425 },
+ { 0x9710, 71429 },
+ { 0x9717, 71433 },
+ { 0x9434, 71437 },
+ { 0x9435, 71441 },
+ { 0x9436, 71445 },
+ { 0x9437, 71449 },
+ { 0x9438, 71453 },
+ { 0x9439, 71457 },
+ { 0x943A, 71461 },
+ { 0x943B, 71465 },
+ { 0x943C, 71469 },
+ { 0x943D, 71473 },
+ { 0x943E, 71477 },
+ { 0x943F, 71481 },
+ { 0x9440, 71485 },
+ { 0x9441, 71489 },
+ { 0x9442, 71493 },
+ { 0x9443, 71497 },
+ { 0x9444, 71501 },
+ { 0x9445, 71505 },
+ { 0x9446, 71509 },
+ { 0x9447, 71513 },
+ { 0x9448, 71517 },
+ { 0x9449, 71521 },
+ { 0x944A, 71525 },
+ { 0x944B, 71529 },
+ { 0x944C, 71533 },
+ { 0x944D, 71537 },
+ { 0x96ED, 71541 },
+ { 0x96EE, 71545 },
+ { 0x96F1, 71549 },
+ { 0x96EF, 71553 },
+ { 0x96F8, 71557 },
+ { 0x96E8, 71561 },
+ { 0x96F7, 71565 },
+ { 0x96F9, 71569 },
+ { 0x96F2, 71573 },
+ { 0x96F5, 71577 },
+ { 0x96E3, 71581 },
+ { 0x96EA, 71585 },
+ { 0x96E7, 71589 },
+ { 0x96E2, 71593 },
+ { 0x96E5, 71597 },
+ { 0x96E4, 71601 },
+ { 0x96EB, 71605 },
+ { 0x96EC, 71609 },
+ { 0x96FA, 71613 },
+ { 0x96F4, 71617 },
+ { 0x96E9, 71621 },
+ { 0x96F3, 71625 },
+ { 0x96E6, 71630 },
+ { 0x96F0, 71634 },
+ { 0x96F6, 71638 },
+ { 0x9716, 71642 },
+ { 0x9715, 71646 },
+ { 0x94B6, 71650 },
+ { 0x94B7, 71654 },
+ { 0x94B8, 71658 },
+ { 0x94B9, 71662 },
+ { 0x94BB, 71666 },
+ { 0x94BD, 71670 },
+ { 0x94BE, 71674 },
+ { 0x94BF, 71678 },
+ { 0x94C0, 71682 },
+ { 0x94C1, 71686 },
+ { 0x94C2, 71690 },
+ { 0x94C3, 71694 },
+ { 0x94C5, 71698 },
+ { 0x94C6, 71702 },
+ { 0x94C7, 71706 },
+ { 0x94C8, 71710 },
+ { 0x94C9, 71714 },
+ { 0x94CA, 71718 },
+ { 0x94CB, 71722 },
+ { 0x94CC, 71726 },
+ { 0x94CD, 71730 },
+ { 0x94CE, 71734 },
+ { 0x94CF, 71738 },
+ { 0x949C, 71742 },
+ { 0x949E, 71746 },
+ { 0x949F, 71750 },
+ { 0x94A2, 71754 },
+ { 0x94A5, 71758 },
+ { 0x94A6, 71762 },
+ { 0x94A9, 71766 },
+ { 0x94AA, 71770 },
+ { 0x94AB, 71774 },
+ { 0x94AC, 71778 },
+ { 0x94AE, 71782 },
+ { 0x94AF, 71786 },
+ { 0x94B0, 71790 },
+ { 0x94B1, 71794 },
+ { 0x94B2, 71798 },
+ { 0x94B3, 71802 },
+ { 0x94B4, 71806 },
+ { 0x94B5, 71810 },
+ { 0x951E, 71814 },
+ { 0x951F, 71818 },
+ { 0x9520, 71822 },
+ { 0x9521, 71826 },
+ { 0x9522, 71830 },
+ { 0x9523, 71834 },
+ { 0x9524, 71838 },
+ { 0x9525, 71842 },
+ { 0x9526, 71846 },
+ { 0x9527, 71850 },
+ { 0x9528, 71854 },
+ { 0x9529, 71858 },
+ { 0x952A, 71862 },
+ { 0x952B, 71866 },
+ { 0x952C, 71870 },
+ { 0x952D, 71874 },
+ { 0x952E, 71878 },
+ { 0x952F, 71882 },
+ { 0x9530, 71886 },
+ { 0x9531, 71890 },
+ { 0x9532, 71894 },
+ { 0x9533, 71898 },
+ { 0x9534, 71902 },
+ { 0x9535, 71906 },
+ { 0x9536, 71910 },
+ { 0x9537, 71914 },
+ { 0x9504, 71918 },
+ { 0x9505, 71922 },
+ { 0x9507, 71926 },
+ { 0x9508, 71930 },
+ { 0x9509, 71934 },
+ { 0x950A, 71938 },
+ { 0x950D, 71942 },
+ { 0x950E, 71946 },
+ { 0x950F, 71950 },
+ { 0x9510, 71954 },
+ { 0x9511, 71958 },
+ { 0x9512, 71962 },
+ { 0x9513, 71966 },
+ { 0x9514, 71970 },
+ { 0x9516, 71974 },
+ { 0x9517, 71978 },
+ { 0x9518, 71982 },
+ { 0x9519, 71986 },
+ { 0x951A, 71990 },
+ { 0x951B, 71994 },
+ { 0x951C, 71998 },
+ { 0x97F7, 72002 },
+ { 0x97FC, 72006 },
+ { 0x97F8, 72010 },
+ { 0x97FB, 72014 },
+ { 0x97FA, 72018 },
+ { 0x97FF, 72022 },
+ { 0x97F6, 72026 },
+ { 0x97FE, 72030 },
+ { 0x97FD, 72034 },
+ { 0x97F9, 72038 },
+ { 0x968A, 72042 },
+ { 0x968B, 72046 },
+ { 0x968C, 72050 },
+ { 0x968D, 72054 },
+ { 0x968E, 72058 },
+ { 0x968F, 72062 },
+ { 0x9690, 72066 },
+ { 0x9691, 72070 },
+ { 0x9692, 72074 },
+ { 0x9693, 72078 },
+ { 0x9694, 72082 },
+ { 0x9695, 72086 },
+ { 0x9696, 72090 },
+ { 0x9697, 72094 },
+ { 0x9698, 72098 },
+ { 0x9699, 72102 },
+ { 0x969A, 72106 },
+ { 0x969B, 72110 },
+ { 0x969C, 72114 },
+ { 0x969D, 72118 },
+ { 0x969E, 72122 },
+ { 0x969F, 72126 },
+ { 0x96A0, 72130 },
+ { 0x96A1, 72134 },
+ { 0x96A2, 72138 },
+ { 0x96A3, 72142 },
+ { 0x9670, 72146 },
+ { 0x9671, 72150 },
+ { 0x9672, 72154 },
+ { 0x9673, 72158 },
+ { 0x9674, 72162 },
+ { 0x9675, 72166 },
+ { 0x9676, 72170 },
+ { 0x9677, 72174 },
+ { 0x9678, 72178 },
+ { 0x9679, 72182 },
+ { 0x967A, 72186 },
+ { 0x967B, 72190 },
+ { 0x967C, 72194 },
+ { 0x967D, 72198 },
+ { 0x967E, 72202 },
+ { 0x967F, 72206 },
+ { 0x9680, 72210 },
+ { 0x9681, 72214 },
+ { 0x9682, 72218 },
+ { 0x9683, 72222 },
+ { 0x9684, 72226 },
+ { 0x9685, 72230 },
+ { 0x9686, 72234 },
+ { 0x9687, 72238 },
+ { 0x9688, 72242 },
+ { 0x9689, 72246 },
+ { 0x978F, 72250 },
+ { 0x978D, 72255 },
+ { 0x978E, 72260 },
+ { 0x97ED, 72265 },
+ { 0x97F2, 72270 },
+ { 0x97EE, 72275 },
+ { 0x97F1, 72280 },
+ { 0x97F0, 72285 },
+ { 0x97F5, 72290 },
+ { 0x97EC, 72295 },
+ { 0x97F4, 72300 },
+ { 0x97F3, 72305 },
+ { 0x97EF, 72310 },
+ { 0x978C, 72315 },
+ { 0x976F, 72320 },
+ { 0x95EE, 72324 },
+ { 0x95EF, 72329 },
+ { 0x95F0, 72334 },
+ { 0x95F1, 72339 },
+ { 0x95F2, 72344 },
+ { 0x95F3, 72349 },
+ { 0x95F4, 72354 },
+ { 0x95F5, 72359 },
+ { 0x95F6, 72364 },
+ { 0x95F7, 72369 },
+ { 0x95F8, 72374 },
+ { 0x95F9, 72379 },
+ { 0x95FA, 72384 },
+ { 0x95FB, 72389 },
+ { 0x95FC, 72394 },
+ { 0x95FD, 72399 },
+ { 0x95FE, 72404 },
+ { 0x95FF, 72409 },
+ { 0x9600, 72414 },
+ { 0x9601, 72419 },
+ { 0x9602, 72424 },
+ { 0x9603, 72429 },
+ { 0x9604, 72434 },
+ { 0x9605, 72439 },
+ { 0x9606, 72444 },
+ { 0x9607, 72449 },
+ { 0x977B, 72454 },
+ { 0x977C, 72459 },
+ { 0x977F, 72464 },
+ { 0x977D, 72469 },
+ { 0x9786, 72474 },
+ { 0x9776, 72479 },
+ { 0x9785, 72484 },
+ { 0x9787, 72489 },
+ { 0x9780, 72494 },
+ { 0x9783, 72499 },
+ { 0x9771, 72504 },
+ { 0x9778, 72509 },
+ { 0x9775, 72514 },
+ { 0x9770, 72519 },
+ { 0x9773, 72524 },
+ { 0x9781, 72529 },
+ { 0x9772, 72535 },
+ { 0x9779, 72540 },
+ { 0x977A, 72545 },
+ { 0x9788, 72550 },
+ { 0x9782, 72555 },
+ { 0x9777, 72560 },
+ { 0x9774, 72565 },
+ { 0x977E, 72570 },
+ { 0x9784, 72575 },
+ { 0x978B, 72580 },
+ { 0x97C9, 72585 },
+ { 0x97C7, 72591 },
+ { 0x97C8, 72597 },
+ { 0x97C6, 72603 },
+ { 0x97A9, 72609 },
+ { 0x9656, 72614 },
+ { 0x9657, 72620 },
+ { 0x9658, 72626 },
+ { 0x9659, 72632 },
+ { 0x965A, 72638 },
+ { 0x965B, 72644 },
+ { 0x965C, 72650 },
+ { 0x965D, 72656 },
+ { 0x965E, 72662 },
+ { 0x965F, 72668 },
+ { 0x9660, 72674 },
+ { 0x9661, 72680 },
+ { 0x9662, 72686 },
+ { 0x9663, 72692 },
+ { 0x9664, 72698 },
+ { 0x9665, 72704 },
+ { 0x9666, 72710 },
+ { 0x9667, 72716 },
+ { 0x9668, 72722 },
+ { 0x9669, 72728 },
+ { 0x966A, 72734 },
+ { 0x966B, 72740 },
+ { 0x966C, 72746 },
+ { 0x966D, 72752 },
+ { 0x966E, 72758 },
+ { 0x966F, 72764 },
+ { 0x97B5, 72770 },
+ { 0x97B6, 72776 },
+ { 0x97B9, 72782 },
+ { 0x97B7, 72788 },
+ { 0x97C0, 72794 },
+ { 0x97B0, 72800 },
+ { 0x97BF, 72806 },
+ { 0x97C1, 72812 },
+ { 0x97BA, 72818 },
+ { 0x97BD, 72824 },
+ { 0x97AB, 72830 },
+ { 0x97B2, 72836 },
+ { 0x97AF, 72842 },
+ { 0x97AA, 72848 },
+ { 0x97AD, 72854 },
+ { 0x97BB, 72860 },
+ { 0x97AC, 72867 },
+ { 0x97B3, 72873 },
+ { 0x97B4, 72879 },
+ { 0x97C2, 72885 },
+ { 0x97BC, 72891 },
+ { 0x97B1, 72897 },
+ { 0x97AE, 72903 },
+ { 0x97B8, 72909 },
+ { 0x97BE, 72915 },
+ { 0x97C5, 72921 },
+ { 0x963C, 72927 },
+ { 0x963D, 72933 },
+ { 0x963E, 72939 },
+ { 0x963F, 72945 },
+ { 0x9640, 72951 },
+ { 0x9641, 72957 },
+ { 0x9642, 72963 },
+ { 0x9643, 72969 },
+ { 0x9644, 72975 },
+ { 0x9645, 72981 },
+ { 0x9646, 72987 },
+ { 0x9647, 72993 },
+ { 0x9648, 72999 },
+ { 0x9649, 73005 },
+ { 0x964A, 73011 },
+ { 0x964B, 73017 },
+ { 0x964C, 73023 },
+ { 0x964D, 73029 },
+ { 0x964E, 73035 },
+ { 0x964F, 73041 },
+ { 0x9650, 73047 },
+ { 0x9651, 73053 },
+ { 0x9652, 73059 },
+ { 0x9653, 73065 },
+ { 0x9654, 73071 },
+ { 0x9655, 73077 },
+ { 0x979B, 73083 },
+ { 0x979C, 73089 },
+ { 0x979F, 73095 },
+ { 0x979D, 73101 },
+ { 0x97A6, 73107 },
+ { 0x9796, 73113 },
+ { 0x97A5, 73119 },
+ { 0x97A7, 73125 },
+ { 0x97A0, 73131 },
+ { 0x97A3, 73137 },
+ { 0x9791, 73143 },
+ { 0x9798, 73149 },
+ { 0x9795, 73155 },
+ { 0x9790, 73161 },
+ { 0x9793, 73167 },
+ { 0x9792, 73173 },
+ { 0x9799, 73179 },
+ { 0x979A, 73185 },
+ { 0x97A8, 73191 },
+ { 0x97A2, 73197 },
+ { 0x9797, 73203 },
+ { 0x97A1, 73209 },
+ { 0x9794, 73216 },
+ { 0x979E, 73222 },
+ { 0x97A4, 73228 },
+ { 0x97C4, 73234 },
+ { 0x97C3, 73240 },
+ { 0x95D4, 73246 },
+ { 0x95D5, 73251 },
+ { 0x95D6, 73256 },
+ { 0x95D7, 73261 },
+ { 0x95D8, 73266 },
+ { 0x95D9, 73271 },
+ { 0x95DA, 73276 },
+ { 0x95DB, 73281 },
+ { 0x95DC, 73286 },
+ { 0x95DD, 73291 },
+ { 0x95DE, 73296 },
+ { 0x95DF, 73301 },
+ { 0x95E0, 73306 },
+ { 0x95E1, 73311 },
+ { 0x95E2, 73316 },
+ { 0x95E3, 73321 },
+ { 0x95E4, 73326 },
+ { 0x95E5, 73331 },
+ { 0x95E6, 73336 },
+ { 0x95E7, 73341 },
+ { 0x95E8, 73346 },
+ { 0x95E9, 73351 },
+ { 0x95EA, 73356 },
+ { 0x95EB, 73361 },
+ { 0x95EC, 73366 },
+ { 0x95ED, 73371 },
+ { 0x9761, 73376 },
+ { 0x9762, 73381 },
+ { 0x9765, 73386 },
+ { 0x9763, 73391 },
+ { 0x976C, 73396 },
+ { 0x975C, 73401 },
+ { 0x976B, 73406 },
+ { 0x976D, 73411 },
+ { 0x9766, 73416 },
+ { 0x9769, 73421 },
+ { 0x9757, 73426 },
+ { 0x975E, 73431 },
+ { 0x975B, 73436 },
+ { 0x9756, 73441 },
+ { 0x9759, 73446 },
+ { 0x9758, 73451 },
+ { 0x975F, 73456 },
+ { 0x9760, 73461 },
+ { 0x976E, 73466 },
+ { 0x9768, 73471 },
+ { 0x975D, 73476 },
+ { 0x9767, 73481 },
+ { 0x975A, 73487 },
+ { 0x9764, 73492 },
+ { 0x976A, 73497 },
+ { 0x978A, 73502 },
+ { 0x9789, 73507 },
+ { 0x97E3, 73512 },
+ { 0x97E8, 73516 },
+ { 0x97E4, 73520 },
+ { 0x97E7, 73524 },
+ { 0x97E6, 73528 },
+ { 0x97EB, 73532 },
+ { 0x97E2, 73536 },
+ { 0x97EA, 73540 },
+ { 0x97E9, 73544 },
+ { 0x97E5, 73548 },
+ { 0x95BA, 73552 },
+ { 0x95BB, 73556 },
+ { 0x95BC, 73560 },
+ { 0x95BD, 73564 },
+ { 0x95BE, 73568 },
+ { 0x95BF, 73572 },
+ { 0x95C0, 73576 },
+ { 0x95C1, 73580 },
+ { 0x95C2, 73584 },
+ { 0x95C3, 73588 },
+ { 0x95C4, 73592 },
+ { 0x95C5, 73596 },
+ { 0x95C6, 73600 },
+ { 0x95C7, 73604 },
+ { 0x95C8, 73608 },
+ { 0x95C9, 73612 },
+ { 0x95CA, 73616 },
+ { 0x95CB, 73620 },
+ { 0x95CC, 73624 },
+ { 0x95CD, 73628 },
+ { 0x95CE, 73632 },
+ { 0x95CF, 73636 },
+ { 0x95D0, 73640 },
+ { 0x95D1, 73644 },
+ { 0x95D2, 73648 },
+ { 0x95D3, 73652 },
+ { 0x9622, 73656 },
+ { 0x9623, 73661 },
+ { 0x9624, 73666 },
+ { 0x9625, 73671 },
+ { 0x9626, 73676 },
+ { 0x9627, 73681 },
+ { 0x9628, 73686 },
+ { 0x9629, 73691 },
+ { 0x962A, 73696 },
+ { 0x962B, 73701 },
+ { 0x962C, 73706 },
+ { 0x962D, 73711 },
+ { 0x962E, 73716 },
+ { 0x962F, 73721 },
+ { 0x9630, 73726 },
+ { 0x9631, 73731 },
+ { 0x9632, 73736 },
+ { 0x9633, 73741 },
+ { 0x9634, 73746 },
+ { 0x9635, 73751 },
+ { 0x9636, 73756 },
+ { 0x9637, 73761 },
+ { 0x9638, 73766 },
+ { 0x9639, 73771 },
+ { 0x963A, 73776 },
+ { 0x963B, 73781 },
+ { 0x9608, 73786 },
+ { 0x9609, 73791 },
+ { 0x960A, 73796 },
+ { 0x960B, 73801 },
+ { 0x960C, 73806 },
+ { 0x960D, 73811 },
+ { 0x960E, 73816 },
+ { 0x960F, 73821 },
+ { 0x9610, 73826 },
+ { 0x9611, 73831 },
+ { 0x9612, 73836 },
+ { 0x9613, 73841 },
+ { 0x9614, 73846 },
+ { 0x9615, 73851 },
+ { 0x9616, 73856 },
+ { 0x9617, 73861 },
+ { 0x9618, 73866 },
+ { 0x9619, 73871 },
+ { 0x961A, 73876 },
+ { 0x961B, 73881 },
+ { 0x961C, 73886 },
+ { 0x961D, 73891 },
+ { 0x961E, 73896 },
+ { 0x961F, 73901 },
+ { 0x9620, 73906 },
+ { 0x9621, 73911 },
+ { 0x95A0, 73916 },
+ { 0x95A1, 73920 },
+ { 0x95A2, 73924 },
+ { 0x95A3, 73928 },
+ { 0x95A4, 73932 },
+ { 0x95A5, 73936 },
+ { 0x95A6, 73940 },
+ { 0x95A7, 73944 },
+ { 0x95A8, 73948 },
+ { 0x95A9, 73952 },
+ { 0x95AA, 73956 },
+ { 0x95AB, 73960 },
+ { 0x95AC, 73964 },
+ { 0x95AD, 73968 },
+ { 0x95AE, 73972 },
+ { 0x95AF, 73976 },
+ { 0x95B0, 73980 },
+ { 0x95B1, 73984 },
+ { 0x95B2, 73988 },
+ { 0x95B3, 73992 },
+ { 0x95B4, 73996 },
+ { 0x95B5, 74000 },
+ { 0x95B6, 74004 },
+ { 0x95B7, 74008 },
+ { 0x95B8, 74012 },
+ { 0x95B9, 74016 },
+ { 0x97D9, 74020 },
+ { 0x97DE, 74024 },
+ { 0x97DA, 74028 },
+ { 0x97DD, 74032 },
+ { 0x97DC, 74036 },
+ { 0x97E1, 74040 },
+ { 0x97D8, 74044 },
+ { 0x97E0, 74048 },
+ { 0x97DF, 74052 },
+ { 0x97DB, 74056 },
+ { 0x9552, 74060 },
+ { 0x9553, 74064 },
+ { 0x9554, 74068 },
+ { 0x9555, 74072 },
+ { 0x9556, 74076 },
+ { 0x9557, 74080 },
+ { 0x9558, 74084 },
+ { 0x9559, 74088 },
+ { 0x955A, 74092 },
+ { 0x955B, 74096 },
+ { 0x955C, 74100 },
+ { 0x955D, 74104 },
+ { 0x955E, 74108 },
+ { 0x955F, 74112 },
+ { 0x9560, 74116 },
+ { 0x9561, 74120 },
+ { 0x9562, 74124 },
+ { 0x9563, 74128 },
+ { 0x9564, 74132 },
+ { 0x9565, 74136 },
+ { 0x9566, 74140 },
+ { 0x9567, 74144 },
+ { 0x9568, 74148 },
+ { 0x9569, 74152 },
+ { 0x956A, 74156 },
+ { 0x956B, 74160 },
+ { 0x9538, 74164 },
+ { 0x9539, 74168 },
+ { 0x953B, 74172 },
+ { 0x953C, 74176 },
+ { 0x953D, 74180 },
+ { 0x953E, 74184 },
+ { 0x9540, 74188 },
+ { 0x9541, 74192 },
+ { 0x9542, 74196 },
+ { 0x9543, 74200 },
+ { 0x9544, 74204 },
+ { 0x9546, 74208 },
+ { 0x954A, 74212 },
+ { 0x954B, 74216 },
+ { 0x954C, 74220 },
+ { 0x954D, 74224 },
+ { 0x954E, 74228 },
+ { 0x954F, 74232 },
+ { 0x9550, 74236 },
+ { 0x2011, 74240 },
+ { 0x211E, 74242 },
+ { 0x6E31, 74244 },
+ { 0x6E32, 74250 },
+ { 0x6E33, 74256 },
+ { 0x6E30, 74262 },
+ { 0x6E3F, 74269 },
+ { 0x6E3B, 74276 },
+ { 0x6E37, 74284 },
+ { 0x6E43, 74291 },
+ { 0x6E17, 74299 },
+ { 0x6E41, 74307 },
+ { 0x6E3D, 74314 },
+ { 0x6E47, 74322 },
+ { 0x6E39, 74329 },
+ { 0x6E35, 74337 },
+ { 0x6E34, 74343 },
+ { 0x6E13, 74350 },
+ { 0x6E10, 74355 },
+ { 0x6E40, 74360 },
+ { 0x6E3C, 74367 },
+ { 0x6E38, 74375 },
+ { 0x6E44, 74382 },
+ { 0x6E18, 74390 },
+ { 0x6E42, 74398 },
+ { 0x6E3E, 74405 },
+ { 0x6E48, 74413 },
+ { 0x6E3A, 74420 },
+ { 0x6E36, 74428 },
+ { 0x6E16, 74434 },
+ { 0x6E14, 74440 },
+ { 0x6E19, 74445 },
+ { 0x6E15, 74451 },
+ { 0x6E12, 74457 },
+ { 0x6E11, 74464 },
+ { 0x221D, 74470 },
+ { 0x27A9, 74472 },
+ { 0x29F4, 74476 },
+ { 0x23E4, 74477 },
+ { 0x2004, 74478 },
+ { 0x2608, 74480 },
+ { 0x27BC, 74481 },
+ { 0x21B6, 74484 },
+ { 0x21BA, 74488 },
+ { 0x2940, 74492 },
+ { 0x27F2, 74496 },
+ { 0x2233, 74500 },
+ { 0x2A11, 74503 },
+ { 0x2246, 74505 },
+ { 0x2A70, 74511 },
+ { 0x2245, 74516 },
+ { 0x2252, 74519 },
+ { 0x2382, 74526 },
+ { 0x2140, 74529 },
+ { 0x213C, 74532 },
+ { 0x213D, 74535 },
+ { 0x2146, 74538 },
+ { 0x2147, 74542 },
+ { 0x2148, 74546 },
+ { 0x2149, 74550 },
+ { 0x2145, 74554 },
+ { 0x2102, 74558 },
+ { 0x210D, 74561 },
+ { 0x2115, 74564 },
+ { 0x2119, 74567 },
+ { 0x211A, 74570 },
+ { 0x211D, 74573 },
+ { 0x2124, 74576 },
+ { 0x213F, 74579 },
+ { 0x213E, 74582 },
+ { 0x29E8, 74585 },
+ { 0x29E9, 74591 },
+ { 0x20A0, 74597 },
+ { 0x2251, 74599 },
+ { 0x224E, 74602 },
+ { 0x2329, 74605 },
+ { 0x29FC, 74608 },
+ { 0x00AB, 74612 },
+ { 0x200E, 74617 },
+ { 0x202D, 74619 },
+ { 0x202A, 74621 },
+ { 0x2213, 74623 },
+ { 0x27BE, 74625 },
+ { 0x2474, 74628 },
+ { 0x2479, 74631 },
+ { 0x2475, 74634 },
+ { 0x2478, 74637 },
+ { 0x2477, 74640 },
+ { 0x247C, 74643 },
+ { 0x247B, 74646 },
+ { 0x247A, 74649 },
+ { 0x2476, 74652 },
+ { 0x249C, 74655 },
+ { 0x249D, 74660 },
+ { 0x249E, 74665 },
+ { 0x249F, 74670 },
+ { 0x24A0, 74675 },
+ { 0x24A1, 74680 },
+ { 0x24A2, 74685 },
+ { 0x24A3, 74690 },
+ { 0x24A4, 74695 },
+ { 0x24A5, 74700 },
+ { 0x24A6, 74705 },
+ { 0x24A7, 74710 },
+ { 0x24A8, 74715 },
+ { 0x24A9, 74720 },
+ { 0x24AA, 74725 },
+ { 0x24AB, 74730 },
+ { 0x24AC, 74735 },
+ { 0x24AD, 74740 },
+ { 0x24AE, 74745 },
+ { 0x24AF, 74750 },
+ { 0x24B0, 74755 },
+ { 0x24B1, 74760 },
+ { 0x24B2, 74765 },
+ { 0x24B3, 74770 },
+ { 0x24B4, 74775 },
+ { 0x24B5, 74780 },
+ { 0x3206, 74785 },
+ { 0x3214, 74788 },
+ { 0x3208, 74792 },
+ { 0x3216, 74795 },
+ { 0x321C, 74799 },
+ { 0x320D, 74803 },
+ { 0x321B, 74806 },
+ { 0x3207, 74810 },
+ { 0x3215, 74813 },
+ { 0x3204, 74817 },
+ { 0x3212, 74820 },
+ { 0x3201, 74824 },
+ { 0x320F, 74827 },
+ { 0x3205, 74831 },
+ { 0x3213, 74834 },
+ { 0x3203, 74838 },
+ { 0x3211, 74841 },
+ { 0x3200, 74845 },
+ { 0x320E, 74848 },
+ { 0x3202, 74852 },
+ { 0x3210, 74855 },
+ { 0x3209, 74859 },
+ { 0x3217, 74862 },
+ { 0x320A, 74866 },
+ { 0x3218, 74869 },
+ { 0x320C, 74873 },
+ { 0x321A, 74876 },
+ { 0x320B, 74880 },
+ { 0x3219, 74883 },
+ { 0x321E, 74887 },
+ { 0x321D, 74892 },
+ { 0x247D, 74896 },
+ { 0x247E, 74899 },
+ { 0x247F, 74902 },
+ { 0x2487, 74905 },
+ { 0x2482, 74908 },
+ { 0x2483, 74911 },
+ { 0x2485, 74914 },
+ { 0x2481, 74917 },
+ { 0x2486, 74920 },
+ { 0x2480, 74923 },
+ { 0x2484, 74926 },
+ { 0x3220, 74929 },
+ { 0x3225, 74932 },
+ { 0x3230, 74935 },
+ { 0x3229, 74938 },
+ { 0x3221, 74941 },
+ { 0x323A, 74944 },
+ { 0x322B, 74947 },
+ { 0x3224, 74950 },
+ { 0x3223, 74953 },
+ { 0x3232, 74956 },
+ { 0x322A, 74959 },
+ { 0x3234, 74962 },
+ { 0x3228, 74965 },
+ { 0x3241, 74968 },
+ { 0x3242, 74971 },
+ { 0x322D, 74974 },
+ { 0x322F, 74977 },
+ { 0x3227, 74980 },
+ { 0x3238, 74983 },
+ { 0x322E, 74986 },
+ { 0x3243, 74989 },
+ { 0x3226, 74992 },
+ { 0x3231, 74995 },
+ { 0x323B, 74998 },
+ { 0x3222, 75001 },
+ { 0x322C, 75004 },
+ { 0x3233, 75007 },
+ { 0x3235, 75010 },
+ { 0x323F, 75013 },
+ { 0x3240, 75016 },
+ { 0x323E, 75019 },
+ { 0x3236, 75022 },
+ { 0x3239, 75025 },
+ { 0x323C, 75028 },
+ { 0x323D, 75031 },
+ { 0x3237, 75034 },
+ { 0x27C2, 75037 },
+ { 0x2AE1, 75038 },
+ { 0x200F, 75041 },
+ { 0x202E, 75043 },
+ { 0x202B, 75045 },
+ { 0x29E7, 75047 },
+ { 0x2243, 75048 },
+ { 0x2749, 75051 },
+ { 0x2715, 75053 },
+ { 0x00D7, 75055 },
+ { 0x2A34, 75057 },
+ { 0x2A35, 75063 },
+ { 0x2A37, 75069 },
+ { 0x2A3B, 75074 },
+ { 0x2A30, 75078 },
+ { 0x2A31, 75083 },
+ { 0x232A, 75087 },
+ { 0x29FD, 75090 },
+ { 0x00BB, 75094 },
+ { 0x26BC, 75099 },
+ { 0x27B6, 75100 },
+ { 0x27B4, 75104 },
+ { 0x27B5, 75108 },
+ { 0x27BA, 75111 },
+ { 0x273B, 75114 },
+ { 0x279D, 75116 },
+ { 0x27B3, 75119 },
+ { 0x30A0, 75122 },
+ { 0x309B, 75125 },
+ { 0x30FC, 75129 },
+ { 0x309C, 75133 },
+ { 0x2394, 75137 },
+ { 0x267D, 75139 },
+ { 0x238F, 75142 },
+ { 0x2390, 75145 },
+ { 0x2392, 75148 },
+ { 0x2391, 75150 },
+};
+static const struct { uint16_t code; uint32_t name:24; }
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+__attribute__((__packed__))
+#endif
+unicode_code_to_name[18242] = {
+ { 0x0020, 22740 },
+ { 0x0021, 68656 },
+ { 0x0022, 65766 },
+ { 0x0023, 35593 },
+ { 0x0024, 31225 },
+ { 0x0025, 42973 },
+ { 0x0026, 56108 },
+ { 0x0027, 66826 },
+ { 0x0028, 9464 },
+ { 0x0029, 21991 },
+ { 0x002A, 45081 },
+ { 0x002B, 9633 },
+ { 0x002C, 10461 },
+ { 0x002D, 69568 },
+ { 0x002E, 9112 },
+ { 0x002F, 43548 },
+ { 0x0030, 10518 },
+ { 0x0031, 10482 },
+ { 0x0032, 10494 },
+ { 0x0033, 10532 },
+ { 0x0034, 10506 },
+ { 0x0035, 10500 },
+ { 0x0036, 10488 },
+ { 0x0037, 10526 },
+ { 0x0038, 10520 },
+ { 0x0039, 10512 },
+ { 0x003A, 10455 },
+ { 0x003B, 65813 },
+ { 0x003C, 64726 },
+ { 0x003D, 31706 },
+ { 0x003E, 69497 },
+ { 0x003F, 55446 },
+ { 0x0040, 66837 },
+ { 0x0041, 18231 },
+ { 0x0042, 18454 },
+ { 0x0043, 18497 },
+ { 0x0044, 18552 },
+ { 0x0045, 18632 },
+ { 0x0046, 18817 },
+ { 0x0047, 18834 },
+ { 0x0048, 18893 },
+ { 0x0049, 18954 },
+ { 0x004A, 19068 },
+ { 0x004B, 19084 },
+ { 0x004C, 19154 },
+ { 0x004D, 19254 },
+ { 0x004E, 19284 },
+ { 0x004F, 19369 },
+ { 0x0050, 19659 },
+ { 0x0051, 19709 },
+ { 0x0052, 19728 },
+ { 0x0053, 19811 },
+ { 0x0054, 19888 },
+ { 0x0055, 19965 },
+ { 0x0056, 20187 },
+ { 0x0057, 20217 },
+ { 0x0058, 20265 },
+ { 0x0059, 20282 },
+ { 0x005A, 20361 },
+ { 0x005B, 9385 },
+ { 0x005C, 42994 },
+ { 0x005D, 21912 },
+ { 0x005E, 66835 },
+ { 0x005F, 6031 },
+ { 0x0060, 10638 },
+ { 0x0061, 14473 },
+ { 0x0062, 14711 },
+ { 0x0063, 14768 },
+ { 0x0064, 14829 },
+ { 0x0065, 14925 },
+ { 0x0066, 15123 },
+ { 0x0067, 15154 },
+ { 0x0068, 15220 },
+ { 0x0069, 15294 },
+ { 0x006A, 15408 },
+ { 0x006B, 15436 },
+ { 0x006C, 15513 },
+ { 0x006D, 15631 },
+ { 0x006E, 15675 },
+ { 0x006F, 15786 },
+ { 0x0070, 16077 },
+ { 0x0071, 16141 },
+ { 0x0072, 16173 },
+ { 0x0073, 16292 },
+ { 0x0074, 16396 },
+ { 0x0075, 16499 },
+ { 0x0076, 16728 },
+ { 0x0077, 16778 },
+ { 0x0078, 16833 },
+ { 0x0079, 16857 },
+ { 0x007A, 16943 },
+ { 0x007B, 9231 },
+ { 0x007C, 56066 },
+ { 0x007D, 21824 },
+ { 0x007E, 23008 },
+ { 0x00A0, 54927 },
+ { 0x00A1, 53357 },
+ { 0x00A2, 8729 },
+ { 0x00A3, 21740 },
+ { 0x00A4, 48521 },
+ { 0x00A5, 8712 },
+ { 0x00A6, 30305 },
+ { 0x00A7, 43022 },
+ { 0x00A8, 63244 },
+ { 0x00A9, 58349 },
+ { 0x00AA, 51775 },
+ { 0x00AB, 74612 },
+ { 0x00AC, 6723 },
+ { 0x00AD, 9710 },
+ { 0x00AE, 67979 },
+ { 0x00AF, 35513 },
+ { 0x00B0, 31179 },
+ { 0x00B1, 67969 },
+ { 0x00B2, 69284 },
+ { 0x00B3, 69319 },
+ { 0x00B4, 10104 },
+ { 0x00B5, 21176 },
+ { 0x00B6, 42975 },
+ { 0x00B7, 35570 },
+ { 0x00B8, 38870 },
+ { 0x00B9, 69280 },
+ { 0x00BA, 65112 },
+ { 0x00BB, 75094 },
+ { 0x00BC, 37732 },
+ { 0x00BD, 37712 },
+ { 0x00BE, 37768 },
+ { 0x00BF, 53352 },
+ { 0x00C0, 18348 },
+ { 0x00C1, 18288 },
+ { 0x00C2, 18406 },
+ { 0x00C3, 18354 },
+ { 0x00C4, 18392 },
+ { 0x00C5, 18265 },
+ { 0x00C6, 20426 },
+ { 0x00C7, 18532 },
+ { 0x00C8, 18675 },
+ { 0x00C9, 18657 },
+ { 0x00CA, 18762 },
+ { 0x00CB, 18756 },
+ { 0x00CC, 18997 },
+ { 0x00CD, 18979 },
+ { 0x00CE, 19062 },
+ { 0x00CF, 19048 },
+ { 0x00D0, 20523 },
+ { 0x00D1, 19350 },
+ { 0x00D2, 19483 },
+ { 0x00D3, 19465 },
+ { 0x00D4, 19611 },
+ { 0x00D5, 19489 },
+ { 0x00D6, 19597 },
+ { 0x00D7, 75055 },
+ { 0x00D8, 19576 },
+ { 0x00D9, 20061 },
+ { 0x00DA, 20043 },
+ { 0x00DB, 20174 },
+ { 0x00DC, 20129 },
+ { 0x00DD, 20319 },
+ { 0x00DE, 20626 },
+ { 0x00DF, 17465 },
+ { 0x00E0, 14590 },
+ { 0x00E1, 14530 },
+ { 0x00E2, 14663 },
+ { 0x00E3, 14604 },
+ { 0x00E4, 14642 },
+ { 0x00E5, 14507 },
+ { 0x00E6, 17042 },
+ { 0x00E7, 14809 },
+ { 0x00E8, 14968 },
+ { 0x00E9, 14950 },
+ { 0x00EA, 15068 },
+ { 0x00EB, 15055 },
+ { 0x00EC, 15330 },
+ { 0x00ED, 15312 },
+ { 0x00EE, 15402 },
+ { 0x00EF, 15381 },
+ { 0x00F0, 17225 },
+ { 0x00F1, 15739 },
+ { 0x00F2, 15908 },
+ { 0x00F3, 15890 },
+ { 0x00F4, 16029 },
+ { 0x00F5, 15914 },
+ { 0x00F6, 16015 },
+ { 0x00F7, 50308 },
+ { 0x00F8, 15994 },
+ { 0x00F9, 16595 },
+ { 0x00FA, 16577 },
+ { 0x00FB, 16715 },
+ { 0x00FC, 16663 },
+ { 0x00FD, 16901 },
+ { 0x00FE, 17476 },
+ { 0x00FF, 16931 },
+ { 0x0100, 18367 },
+ { 0x0101, 14617 },
+ { 0x0102, 18294 },
+ { 0x0103, 14536 },
+ { 0x0104, 18373 },
+ { 0x0105, 14623 },
+ { 0x0106, 18514 },
+ { 0x0107, 14791 },
+ { 0x0108, 18546 },
+ { 0x0109, 14823 },
+ { 0x010A, 18501 },
+ { 0x010B, 14772 },
+ { 0x010C, 18520 },
+ { 0x010D, 14797 },
+ { 0x010E, 18583 },
+ { 0x010F, 14880 },
+ { 0x0110, 18607 },
+ { 0x0111, 14893 },
+ { 0x0112, 18701 },
+ { 0x0113, 15000 },
+ { 0x0114, 18663 },
+ { 0x0115, 14956 },
+ { 0x0116, 18636 },
+ { 0x0117, 14929 },
+ { 0x0118, 18723 },
+ { 0x0119, 15022 },
+ { 0x011A, 18669 },
+ { 0x011B, 14962 },
+ { 0x011C, 18887 },
+ { 0x011D, 15214 },
+ { 0x011E, 18857 },
+ { 0x011F, 15177 },
+ { 0x0120, 18838 },
+ { 0x0121, 15158 },
+ { 0x0122, 18881 },
+ { 0x0123, 15201 },
+ { 0x0124, 18948 },
+ { 0x0125, 15288 },
+ { 0x0126, 18924 },
+ { 0x0127, 15264 },
+ { 0x0128, 19003 },
+ { 0x0129, 15336 },
+ { 0x012A, 19023 },
+ { 0x012B, 15356 },
+ { 0x012C, 18985 },
+ { 0x012D, 15318 },
+ { 0x012E, 19029 },
+ { 0x012F, 15362 },
+ { 0x0130, 18958 },
+ { 0x0131, 17682 },
+ { 0x0132, 20774 },
+ { 0x0133, 17909 },
+ { 0x0134, 19078 },
+ { 0x0135, 15424 },
+ { 0x0136, 19135 },
+ { 0x0137, 15487 },
+ { 0x0138, 17263 },
+ { 0x0139, 19194 },
+ { 0x013A, 15565 },
+ { 0x013B, 19241 },
+ { 0x013C, 15604 },
+ { 0x013D, 19200 },
+ { 0x013E, 15571 },
+ { 0x013F, 19221 },
+ { 0x0140, 15584 },
+ { 0x0141, 19235 },
+ { 0x0142, 15598 },
+ { 0x0143, 19324 },
+ { 0x0144, 15721 },
+ { 0x0145, 19356 },
+ { 0x0146, 15752 },
+ { 0x0147, 19330 },
+ { 0x0148, 15727 },
+ { 0x0149, 15779 },
+ { 0x014A, 20515 },
+ { 0x014B, 17197 },
+ { 0x014C, 19533 },
+ { 0x014D, 15958 },
+ { 0x014E, 19471 },
+ { 0x014F, 15896 },
+ { 0x0150, 19519 },
+ { 0x0151, 15944 },
+ { 0x0152, 20778 },
+ { 0x0153, 17913 },
+ { 0x0154, 19768 },
+ { 0x0155, 16220 },
+ { 0x0156, 19793 },
+ { 0x0157, 16252 },
+ { 0x0158, 19774 },
+ { 0x0159, 16226 },
+ { 0x015A, 19839 },
+ { 0x015B, 16326 },
+ { 0x015C, 19882 },
+ { 0x015D, 16390 },
+ { 0x015E, 19876 },
+ { 0x015F, 16377 },
+ { 0x0160, 19854 },
+ { 0x0161, 16341 },
+ { 0x0162, 19938 },
+ { 0x0163, 16459 },
+ { 0x0164, 19919 },
+ { 0x0165, 16433 },
+ { 0x0166, 19932 },
+ { 0x0167, 16453 },
+ { 0x0168, 20067 },
+ { 0x0169, 16601 },
+ { 0x016A, 20102 },
+ { 0x016B, 16636 },
+ { 0x016C, 20049 },
+ { 0x016D, 16583 },
+ { 0x016E, 20036 },
+ { 0x016F, 16570 },
+ { 0x0170, 20088 },
+ { 0x0171, 16622 },
+ { 0x0172, 20116 },
+ { 0x0173, 16650 },
+ { 0x0174, 20259 },
+ { 0x0175, 16827 },
+ { 0x0176, 20355 },
+ { 0x0177, 16937 },
+ { 0x0178, 20349 },
+ { 0x0179, 20392 },
+ { 0x017A, 16980 },
+ { 0x017B, 20365 },
+ { 0x017C, 16947 },
+ { 0x017D, 20398 },
+ { 0x017E, 16986 },
+ { 0x017F, 17341 },
+ { 0x0180, 14749 },
+ { 0x0181, 18472 },
+ { 0x0182, 18491 },
+ { 0x0183, 14755 },
+ { 0x0184, 20570 },
+ { 0x0185, 17406 },
+ { 0x0186, 20565 },
+ { 0x0187, 18508 },
+ { 0x0188, 14785 },
+ { 0x0189, 20675 },
+ { 0x018A, 18570 },
+ { 0x018B, 18613 },
+ { 0x018C, 14899 },
+ { 0x018D, 17671 },
+ { 0x018E, 20726 },
+ { 0x018F, 20609 },
+ { 0x0190, 20560 },
+ { 0x0191, 18828 },
+ { 0x0192, 15134 },
+ { 0x0193, 18845 },
+ { 0x0194, 20601 },
+ { 0x0195, 17112 },
+ { 0x0196, 20556 },
+ { 0x0197, 19035 },
+ { 0x0198, 19095 },
+ { 0x0199, 15447 },
+ { 0x019A, 15517 },
+ { 0x019B, 17528 },
+ { 0x019C, 20659 },
+ { 0x019D, 19302 },
+ { 0x019E, 15713 },
+ { 0x019F, 19555 },
+ { 0x01A0, 19403 },
+ { 0x01A1, 15828 },
+ { 0x01A2, 20491 },
+ { 0x01A3, 17138 },
+ { 0x01A4, 19670 },
+ { 0x01A5, 16088 },
+ { 0x01A6, 17935 },
+ { 0x01A7, 20575 },
+ { 0x01A8, 17411 },
+ { 0x01A9, 20519 },
+ { 0x01AA, 18206 },
+ { 0x01AB, 16465 },
+ { 0x01AC, 19906 },
+ { 0x01AD, 16420 },
+ { 0x01AE, 19951 },
+ { 0x01AF, 19988 },
+ { 0x01B0, 16522 },
+ { 0x01B1, 20715 },
+ { 0x01B2, 20198 },
+ { 0x01B3, 20300 },
+ { 0x01B4, 16875 },
+ { 0x01B5, 20404 },
+ { 0x01B6, 17006 },
+ { 0x01B7, 20527 },
+ { 0x01B8, 20537 },
+ { 0x01B9, 17258 },
+ { 0x01BA, 17239 },
+ { 0x01BB, 17941 },
+ { 0x01BC, 20580 },
+ { 0x01BD, 17416 },
+ { 0x01BE, 18199 },
+ { 0x01BF, 17946 },
+ { 0x01C0, 18155 },
+ { 0x01C1, 18174 },
+ { 0x01C2, 18178 },
+ { 0x01C3, 18218 },
+ { 0x01C4, 20469 },
+ { 0x01C5, 18597 },
+ { 0x01C6, 17090 },
+ { 0x01C7, 20483 },
+ { 0x01C8, 19206 },
+ { 0x01C9, 17120 },
+ { 0x01CA, 20487 },
+ { 0x01CB, 19342 },
+ { 0x01CC, 17134 },
+ { 0x01CD, 18342 },
+ { 0x01CE, 14584 },
+ { 0x01CF, 18991 },
+ { 0x01D0, 15324 },
+ { 0x01D1, 19477 },
+ { 0x01D2, 15902 },
+ { 0x01D3, 20055 },
+ { 0x01D4, 16589 },
+ { 0x01D5, 20159 },
+ { 0x01D6, 16693 },
+ { 0x01D7, 20135 },
+ { 0x01D8, 16669 },
+ { 0x01D9, 20143 },
+ { 0x01DA, 16677 },
+ { 0x01DB, 20151 },
+ { 0x01DC, 16685 },
+ { 0x01DD, 17544 },
+ { 0x01DE, 18398 },
+ { 0x01DF, 14648 },
+ { 0x01E0, 18242 },
+ { 0x01E1, 14484 },
+ { 0x01E2, 20436 },
+ { 0x01E3, 17052 },
+ { 0x01E4, 18875 },
+ { 0x01E5, 15195 },
+ { 0x01E6, 18863 },
+ { 0x01E7, 15183 },
+ { 0x01E8, 19114 },
+ { 0x01E9, 15466 },
+ { 0x01EA, 19562 },
+ { 0x01EB, 15980 },
+ { 0x01EC, 19568 },
+ { 0x01ED, 15986 },
+ { 0x01EE, 20531 },
+ { 0x01EF, 17245 },
+ { 0x01F0, 15412 },
+ { 0x01F1, 20465 },
+ { 0x01F2, 18589 },
+ { 0x01F3, 17086 },
+ { 0x01F4, 18851 },
+ { 0x01F5, 15171 },
+ { 0x01F6, 20605 },
+ { 0x01F7, 20589 },
+ { 0x01F8, 19336 },
+ { 0x01F9, 15733 },
+ { 0x01FA, 18272 },
+ { 0x01FB, 14514 },
+ { 0x01FC, 20430 },
+ { 0x01FD, 17046 },
+ { 0x01FE, 19582 },
+ { 0x01FF, 16000 },
+ { 0x0200, 18360 },
+ { 0x0201, 14610 },
+ { 0x0202, 18385 },
+ { 0x0203, 14635 },
+ { 0x0204, 18694 },
+ { 0x0205, 14993 },
+ { 0x0206, 18749 },
+ { 0x0207, 15048 },
+ { 0x0208, 19016 },
+ { 0x0209, 15349 },
+ { 0x020A, 19041 },
+ { 0x020B, 15374 },
+ { 0x020C, 19526 },
+ { 0x020D, 15951 },
+ { 0x020E, 19590 },
+ { 0x020F, 16008 },
+ { 0x0210, 19780 },
+ { 0x0211, 16232 },
+ { 0x0212, 19799 },
+ { 0x0213, 16280 },
+ { 0x0214, 20095 },
+ { 0x0215, 16629 },
+ { 0x0216, 20122 },
+ { 0x0217, 16656 },
+ { 0x0218, 19869 },
+ { 0x0219, 16356 },
+ { 0x021A, 19925 },
+ { 0x021B, 16439 },
+ { 0x021C, 20593 },
+ { 0x021D, 17425 },
+ { 0x021E, 18918 },
+ { 0x021F, 15258 },
+ { 0x0220, 19316 },
+ { 0x0221, 14847 },
+ { 0x0222, 20499 },
+ { 0x0223, 17146 },
+ { 0x0224, 20379 },
+ { 0x0225, 16967 },
+ { 0x0226, 18235 },
+ { 0x0227, 14477 },
+ { 0x0228, 18735 },
+ { 0x0229, 15034 },
+ { 0x022A, 19603 },
+ { 0x022B, 16021 },
+ { 0x022C, 19503 },
+ { 0x022D, 15928 },
+ { 0x022E, 19373 },
+ { 0x022F, 15790 },
+ { 0x0230, 19380 },
+ { 0x0231, 15797 },
+ { 0x0232, 20337 },
+ { 0x0233, 16919 },
+ { 0x0234, 15545 },
+ { 0x0235, 15693 },
+ { 0x0236, 16414 },
+ { 0x0237, 17687 },
+ { 0x0238, 17081 },
+ { 0x0239, 17150 },
+ { 0x023A, 18379 },
+ { 0x023B, 18526 },
+ { 0x023C, 14803 },
+ { 0x023D, 19158 },
+ { 0x023E, 19944 },
+ { 0x023F, 16363 },
+ { 0x0240, 16992 },
+ { 0x0241, 20680 },
+ { 0x0242, 17708 },
+ { 0x0243, 18485 },
+ { 0x0244, 19969 },
+ { 0x0245, 20664 },
+ { 0x0246, 18729 },
+ { 0x0247, 15028 },
+ { 0x0248, 19072 },
+ { 0x0249, 15418 },
+ { 0x024A, 20618 },
+ { 0x024B, 16151 },
+ { 0x024C, 19787 },
+ { 0x024D, 16246 },
+ { 0x024E, 20343 },
+ { 0x024F, 16925 },
+ { 0x0250, 17539 },
+ { 0x0251, 17429 },
+ { 0x0252, 17666 },
+ { 0x0253, 14729 },
+ { 0x0254, 17383 },
+ { 0x0255, 14779 },
+ { 0x0256, 14874 },
+ { 0x0257, 14853 },
+ { 0x0258, 17765 },
+ { 0x0259, 17448 },
+ { 0x025A, 17452 },
+ { 0x025B, 17370 },
+ { 0x025C, 17777 },
+ { 0x025D, 17783 },
+ { 0x025E, 17521 },
+ { 0x025F, 17692 },
+ { 0x0260, 15165 },
+ { 0x0261, 17534 },
+ { 0x0262, 17979 },
+ { 0x0263, 17444 },
+ { 0x0264, 17396 },
+ { 0x0265, 17554 },
+ { 0x0266, 15238 },
+ { 0x0267, 17321 },
+ { 0x0268, 15368 },
+ { 0x0269, 17327 },
+ { 0x026A, 17996 },
+ { 0x026B, 15591 },
+ { 0x026C, 15539 },
+ { 0x026D, 15617 },
+ { 0x026E, 17337 },
+ { 0x026F, 17590 },
+ { 0x0270, 17595 },
+ { 0x0271, 15649 },
+ { 0x0272, 15699 },
+ { 0x0273, 15765 },
+ { 0x0274, 18028 },
+ { 0x0275, 17494 },
+ { 0x0276, 18088 },
+ { 0x0277, 17516 },
+ { 0x0278, 17279 },
+ { 0x0279, 17603 },
+ { 0x027A, 17615 },
+ { 0x027B, 17608 },
+ { 0x027C, 16207 },
+ { 0x027D, 16214 },
+ { 0x027E, 16265 },
+ { 0x027F, 17770 },
+ { 0x0280, 18043 },
+ { 0x0281, 18137 },
+ { 0x0282, 16320 },
+ { 0x0283, 17201 },
+ { 0x0284, 17699 },
+ { 0x0285, 17470 },
+ { 0x0286, 17205 },
+ { 0x0287, 17630 },
+ { 0x0288, 16485 },
+ { 0x0289, 16503 },
+ { 0x028A, 17743 },
+ { 0x028B, 16745 },
+ { 0x028C, 17635 },
+ { 0x028D, 17640 },
+ { 0x028E, 17645 },
+ { 0x028F, 18073 },
+ { 0x0290, 17025 },
+ { 0x0291, 16961 },
+ { 0x0292, 17229 },
+ { 0x0293, 17233 },
+ { 0x0294, 18164 },
+ { 0x0295, 18226 },
+ { 0x0296, 18194 },
+ { 0x0297, 18222 },
+ { 0x0298, 18186 },
+ { 0x0299, 17954 },
+ { 0x029A, 17510 },
+ { 0x029B, 17984 },
+ { 0x029C, 17991 },
+ { 0x029D, 15430 },
+ { 0x029E, 17580 },
+ { 0x029F, 18011 },
+ { 0x02A0, 16145 },
+ { 0x02A1, 18168 },
+ { 0x02A2, 18211 },
+ { 0x02A3, 17096 },
+ { 0x02A4, 17302 },
+ { 0x02A5, 17101 },
+ { 0x02A6, 17168 },
+ { 0x02A7, 17401 },
+ { 0x02A8, 17155 },
+ { 0x02A9, 17307 },
+ { 0x02AA, 17124 },
+ { 0x02AB, 17129 },
+ { 0x02AC, 18190 },
+ { 0x02AD, 18182 },
+ { 0x02AE, 17559 },
+ { 0x02AF, 17566 },
+ { 0x02B0, 54170 },
+ { 0x02B1, 54174 },
+ { 0x02B2, 54186 },
+ { 0x02B3, 54250 },
+ { 0x02B4, 54449 },
+ { 0x02B5, 54454 },
+ { 0x02B6, 54509 },
+ { 0x02B7, 54294 },
+ { 0x02B8, 54302 },
+ { 0x02B9, 54116 },
+ { 0x02BA, 54543 },
+ { 0x02BB, 54612 },
+ { 0x02BC, 54827 },
+ { 0x02BD, 54790 },
+ { 0x02BE, 54119 },
+ { 0x02BF, 54058 },
+ { 0x02C0, 54775 },
+ { 0x02C1, 54794 },
+ { 0x02C2, 54063 },
+ { 0x02C3, 54124 },
+ { 0x02C4, 53873 },
+ { 0x02C5, 54025 },
+ { 0x02C6, 54830 },
+ { 0x02C7, 10445 },
+ { 0x02C8, 54799 },
+ { 0x02C9, 54551 },
+ { 0x02CA, 54081 },
+ { 0x02CB, 54102 },
+ { 0x02CC, 53975 },
+ { 0x02CD, 53965 },
+ { 0x02CE, 53938 },
+ { 0x02CF, 53933 },
+ { 0x02D0, 54858 },
+ { 0x02D1, 54029 },
+ { 0x02D2, 54721 },
+ { 0x02D3, 54715 },
+ { 0x02D4, 53869 },
+ { 0x02D5, 54021 },
+ { 0x02D6, 54071 },
+ { 0x02D7, 54112 },
+ { 0x02D8, 10378 },
+ { 0x02D9, 5782 },
+ { 0x02DA, 9699 },
+ { 0x02DB, 35640 },
+ { 0x02DC, 22588 },
+ { 0x02DD, 31564 },
+ { 0x02DE, 54596 },
+ { 0x02DF, 54098 },
+ { 0x02E0, 54383 },
+ { 0x02E1, 54200 },
+ { 0x02E2, 54254 },
+ { 0x02E3, 54298 },
+ { 0x02E4, 54532 },
+ { 0x02E5, 54834 },
+ { 0x02E6, 54034 },
+ { 0x02E7, 53991 },
+ { 0x02E8, 53928 },
+ { 0x02E9, 54803 },
+ { 0x02EA, 54015 },
+ { 0x02EB, 54075 },
+ { 0x02EC, 54779 },
+ { 0x02ED, 54862 },
+ { 0x02EE, 54547 },
+ { 0x02EF, 53909 },
+ { 0x02F0, 53904 },
+ { 0x02F1, 53919 },
+ { 0x02F2, 53943 },
+ { 0x02F3, 53924 },
+ { 0x02F4, 54554 },
+ { 0x02F5, 54565 },
+ { 0x02F6, 54559 },
+ { 0x02F7, 53948 },
+ { 0x02F8, 54581 },
+ { 0x02F9, 54090 },
+ { 0x02FA, 53899 },
+ { 0x02FB, 54085 },
+ { 0x02FC, 53894 },
+ { 0x02FD, 54128 },
+ { 0x02FE, 54067 },
+ { 0x02FF, 53914 },
+ { 0x0300, 57554 },
+ { 0x0301, 57523 },
+ { 0x0302, 58283 },
+ { 0x0303, 57841 },
+ { 0x0304, 57946 },
+ { 0x0305, 58215 },
+ { 0x0306, 57530 },
+ { 0x0307, 57402 },
+ { 0x0308, 58240 },
+ { 0x0309, 57427 },
+ { 0x030A, 57506 },
+ { 0x030B, 57876 },
+ { 0x030C, 57535 },
+ { 0x030D, 58221 },
+ { 0x030E, 57918 },
+ { 0x030F, 57887 },
+ { 0x0310, 58305 },
+ { 0x0311, 58191 },
+ { 0x0312, 57970 },
+ { 0x0313, 57540 },
+ { 0x0314, 58217 },
+ { 0x0315, 57543 },
+ { 0x0316, 57557 },
+ { 0x0317, 57526 },
+ { 0x0318, 57442 },
+ { 0x0319, 57783 },
+ { 0x031A, 57446 },
+ { 0x031B, 57430 },
+ { 0x031C, 57437 },
+ { 0x031D, 57392 },
+ { 0x031E, 57419 },
+ { 0x031F, 57502 },
+ { 0x0320, 57769 },
+ { 0x0321, 58307 },
+ { 0x0322, 58279 },
+ { 0x0323, 57409 },
+ { 0x0324, 58242 },
+ { 0x0325, 57509 },
+ { 0x0326, 57547 },
+ { 0x0327, 57983 },
+ { 0x0328, 57959 },
+ { 0x0329, 58225 },
+ { 0x032A, 57857 },
+ { 0x032B, 58202 },
+ { 0x032C, 57537 },
+ { 0x032D, 58286 },
+ { 0x032E, 57532 },
+ { 0x032F, 58194 },
+ { 0x0330, 57843 },
+ { 0x0331, 57952 },
+ { 0x0332, 57412 },
+ { 0x0333, 57868 },
+ { 0x0334, 57846 },
+ { 0x0335, 57821 },
+ { 0x0336, 57489 },
+ { 0x0337, 57825 },
+ { 0x0338, 57493 },
+ { 0x0339, 57778 },
+ { 0x033A, 58198 },
+ { 0x033B, 57964 },
+ { 0x033C, 57991 },
+ { 0x033D, 57383 },
+ { 0x033E, 58229 },
+ { 0x033F, 57915 },
+ { 0x0340, 57550 },
+ { 0x0341, 57519 },
+ { 0x0342, 57580 },
+ { 0x0343, 57561 },
+ { 0x0344, 57576 },
+ { 0x0345, 57583 },
+ { 0x0346, 57854 },
+ { 0x0347, 57942 },
+ { 0x0348, 57923 },
+ { 0x0349, 57450 },
+ { 0x034A, 57415 },
+ { 0x034B, 58293 },
+ { 0x034C, 57849 },
+ { 0x034D, 57467 },
+ { 0x034E, 57994 },
+ { 0x034F, 58188 },
+ { 0x0350, 57813 },
+ { 0x0351, 57432 },
+ { 0x0352, 57985 },
+ { 0x0353, 57386 },
+ { 0x0354, 57480 },
+ { 0x0355, 57817 },
+ { 0x0356, 57799 },
+ { 0x0357, 57773 },
+ { 0x0358, 57405 },
+ { 0x0359, 58001 },
+ { 0x035A, 57872 },
+ { 0x035B, 57974 },
+ { 0x035C, 57883 },
+ { 0x035D, 57880 },
+ { 0x035E, 57904 },
+ { 0x035F, 57907 },
+ { 0x0360, 57891 },
+ { 0x0361, 57911 },
+ { 0x0362, 57937 },
+ { 0x0363, 57586 },
+ { 0x0364, 57607 },
+ { 0x0365, 57622 },
+ { 0x0366, 57647 },
+ { 0x0367, 57679 },
+ { 0x0368, 57591 },
+ { 0x0369, 57602 },
+ { 0x036A, 57617 },
+ { 0x036B, 57637 },
+ { 0x036C, 57652 },
+ { 0x036D, 57674 },
+ { 0x036E, 57684 },
+ { 0x036F, 57689 },
+ { 0x0370, 12320 },
+ { 0x0371, 10998 },
+ { 0x0372, 12792 },
+ { 0x0373, 11590 },
+ { 0x0374, 13034 },
+ { 0x0375, 10720 },
+ { 0x0376, 12999 },
+ { 0x0377, 11869 },
+ { 0x037A, 13522 },
+ { 0x037B, 11881 },
+ { 0x037C, 10738 },
+ { 0x037D, 11874 },
+ { 0x037E, 13059 },
+ { 0x0384, 11898 },
+ { 0x0385, 13083 },
+ { 0x0386, 12574 },
+ { 0x0387, 10643 },
+ { 0x0388, 12851 },
+ { 0x0389, 12268 },
+ { 0x038A, 12394 },
+ { 0x038C, 12917 },
+ { 0x038E, 12969 },
+ { 0x038F, 12766 },
+ { 0x0390, 11110 },
+ { 0x0391, 12428 },
+ { 0x0392, 12316 },
+ { 0x0393, 12608 },
+ { 0x0394, 12604 },
+ { 0x0395, 12797 },
+ { 0x0396, 12424 },
+ { 0x0397, 12122 },
+ { 0x0398, 12788 },
+ { 0x0399, 12324 },
+ { 0x039A, 12612 },
+ { 0x039B, 12616 },
+ { 0x039C, 12102 },
+ { 0x039D, 12106 },
+ { 0x039E, 12114 },
+ { 0x039F, 12863 },
+ { 0x03A0, 12110 },
+ { 0x03A1, 12294 },
+ { 0x03A3, 12784 },
+ { 0x03A4, 12312 },
+ { 0x03A5, 12929 },
+ { 0x03A6, 12286 },
+ { 0x03A7, 12118 },
+ { 0x03A8, 12290 },
+ { 0x03A9, 12620 },
+ { 0x03AA, 12418 },
+ { 0x03AB, 12993 },
+ { 0x03AC, 11298 },
+ { 0x03AD, 11653 },
+ { 0x03AE, 10918 },
+ { 0x03AF, 11072 },
+ { 0x03B0, 11839 },
+ { 0x03B1, 11144 },
+ { 0x03B2, 10994 },
+ { 0x03B3, 11359 },
+ { 0x03B4, 11350 },
+ { 0x03B5, 11599 },
+ { 0x03B6, 11140 },
+ { 0x03B7, 10764 },
+ { 0x03B8, 11577 },
+ { 0x03B9, 11002 },
+ { 0x03BA, 11363 },
+ { 0x03BB, 11371 },
+ { 0x03BC, 10744 },
+ { 0x03BD, 10748 },
+ { 0x03BE, 10756 },
+ { 0x03BF, 11665 },
+ { 0x03C0, 10752 },
+ { 0x03C1, 10966 },
+ { 0x03C2, 11354 },
+ { 0x03C3, 11573 },
+ { 0x03C4, 10990 },
+ { 0x03C5, 11731 },
+ { 0x03C6, 10958 },
+ { 0x03C7, 10760 },
+ { 0x03C8, 10962 },
+ { 0x03C9, 11375 },
+ { 0x03CA, 11096 },
+ { 0x03CB, 11825 },
+ { 0x03CC, 11719 },
+ { 0x03CD, 11801 },
+ { 0x03CE, 11529 },
+ { 0x03CF, 12088 },
+ { 0x03D0, 10678 },
+ { 0x03D1, 11887 },
+ { 0x03D2, 13037 },
+ { 0x03D3, 13042 },
+ { 0x03D4, 13049 },
+ { 0x03D5, 10659 },
+ { 0x03D6, 10640 },
+ { 0x03D7, 10646 },
+ { 0x03D8, 12064 },
+ { 0x03D9, 11585 },
+ { 0x03DA, 12061 },
+ { 0x03DB, 11581 },
+ { 0x03DC, 12068 },
+ { 0x03DD, 11595 },
+ { 0x03DE, 12030 },
+ { 0x03DF, 11367 },
+ { 0x03E0, 12033 },
+ { 0x03E1, 11569 },
+ { 0x03E2, 31064 },
+ { 0x03E3, 30771 },
+ { 0x03E4, 30926 },
+ { 0x03E5, 30633 },
+ { 0x03E6, 31060 },
+ { 0x03E7, 30767 },
+ { 0x03E8, 31052 },
+ { 0x03E9, 30759 },
+ { 0x03EA, 31104 },
+ { 0x03EB, 30811 },
+ { 0x03EC, 31100 },
+ { 0x03ED, 30807 },
+ { 0x03EE, 30918 },
+ { 0x03EF, 30625 },
+ { 0x03F0, 10714 },
+ { 0x03F1, 10667 },
+ { 0x03F2, 12071 },
+ { 0x03F3, 12027 },
+ { 0x03F4, 12092 },
+ { 0x03F5, 12075 },
+ { 0x03F6, 13062 },
+ { 0x03F7, 12308 },
+ { 0x03F8, 10986 },
+ { 0x03F9, 13004 },
+ { 0x03FA, 12304 },
+ { 0x03FB, 10982 },
+ { 0x03FC, 10662 },
+ { 0x03FD, 13016 },
+ { 0x03FE, 12096 },
+ { 0x03FF, 13009 },
+ { 0x0400, 49628 },
+ { 0x0401, 49634 },
+ { 0x0402, 49779 },
+ { 0x0403, 49828 },
+ { 0x0404, 50271 },
+ { 0x0405, 49787 },
+ { 0x0406, 50281 },
+ { 0x0407, 49723 },
+ { 0x0408, 49638 },
+ { 0x0409, 49848 },
+ { 0x040A, 49852 },
+ { 0x040B, 50007 },
+ { 0x040C, 49836 },
+ { 0x040D, 49451 },
+ { 0x040E, 50103 },
+ { 0x040F, 49910 },
+ { 0x0410, 49421 },
+ { 0x0411, 49502 },
+ { 0x0412, 49711 },
+ { 0x0413, 49791 },
+ { 0x0414, 49506 },
+ { 0x0415, 49618 },
+ { 0x0416, 49884 },
+ { 0x0417, 49735 },
+ { 0x0418, 49447 },
+ { 0x0419, 50091 },
+ { 0x041A, 49642 },
+ { 0x041B, 49514 },
+ { 0x041C, 49537 },
+ { 0x041D, 49547 },
+ { 0x041E, 49469 },
+ { 0x041F, 49675 },
+ { 0x0420, 49576 },
+ { 0x0421, 49586 },
+ { 0x0422, 49690 },
+ { 0x0423, 49479 },
+ { 0x0424, 49510 },
+ { 0x0425, 49596 },
+ { 0x0426, 49868 },
+ { 0x0427, 49756 },
+ { 0x0428, 49864 },
+ { 0x0429, 50087 },
+ { 0x042A, 49926 },
+ { 0x042B, 50019 },
+ { 0x042C, 49998 },
+ { 0x042D, 49437 },
+ { 0x042E, 49731 },
+ { 0x042F, 49719 },
+ { 0x0430, 48523 },
+ { 0x0431, 48604 },
+ { 0x0432, 48813 },
+ { 0x0433, 48893 },
+ { 0x0434, 48608 },
+ { 0x0435, 48720 },
+ { 0x0436, 48986 },
+ { 0x0437, 48837 },
+ { 0x0438, 48549 },
+ { 0x0439, 49193 },
+ { 0x043A, 48744 },
+ { 0x043B, 48616 },
+ { 0x043C, 48639 },
+ { 0x043D, 48649 },
+ { 0x043E, 48571 },
+ { 0x043F, 48777 },
+ { 0x0440, 48678 },
+ { 0x0441, 48688 },
+ { 0x0442, 48792 },
+ { 0x0443, 48581 },
+ { 0x0444, 48612 },
+ { 0x0445, 48698 },
+ { 0x0446, 48970 },
+ { 0x0447, 48858 },
+ { 0x0448, 48966 },
+ { 0x0449, 49189 },
+ { 0x044A, 49028 },
+ { 0x044B, 49121 },
+ { 0x044C, 49100 },
+ { 0x044D, 48539 },
+ { 0x044E, 48833 },
+ { 0x044F, 48821 },
+ { 0x0450, 48730 },
+ { 0x0451, 48736 },
+ { 0x0452, 48881 },
+ { 0x0453, 48930 },
+ { 0x0454, 49377 },
+ { 0x0455, 48889 },
+ { 0x0456, 49387 },
+ { 0x0457, 48825 },
+ { 0x0458, 48740 },
+ { 0x0459, 48950 },
+ { 0x045A, 48954 },
+ { 0x045B, 49109 },
+ { 0x045C, 48938 },
+ { 0x045D, 48553 },
+ { 0x045E, 49205 },
+ { 0x045F, 49012 },
+ { 0x0460, 50062 },
+ { 0x0461, 49164 },
+ { 0x0462, 49880 },
+ { 0x0463, 48982 },
+ { 0x0464, 50173 },
+ { 0x0465, 49275 },
+ { 0x0466, 50132 },
+ { 0x0467, 49234 },
+ { 0x0468, 50196 },
+ { 0x0469, 49298 },
+ { 0x046A, 49751 },
+ { 0x046B, 48853 },
+ { 0x046C, 50178 },
+ { 0x046D, 49280 },
+ { 0x046E, 49840 },
+ { 0x046F, 48942 },
+ { 0x0470, 49856 },
+ { 0x0471, 48958 },
+ { 0x0472, 49922 },
+ { 0x0473, 49024 },
+ { 0x0474, 50151 },
+ { 0x0475, 49253 },
+ { 0x0476, 50155 },
+ { 0x0477, 49257 },
+ { 0x0478, 49707 },
+ { 0x0479, 48809 },
+ { 0x047A, 50072 },
+ { 0x047B, 49174 },
+ { 0x047C, 50066 },
+ { 0x047D, 49168 },
+ { 0x047E, 49671 },
+ { 0x047F, 48773 },
+ { 0x0480, 50058 },
+ { 0x0481, 49160 },
+ { 0x0482, 50303 },
+ { 0x0483, 58017 },
+ { 0x0484, 58185 },
+ { 0x0485, 58009 },
+ { 0x0486, 58013 },
+ { 0x0487, 58177 },
+ { 0x0488, 58165 },
+ { 0x0489, 58173 },
+ { 0x048A, 50096 },
+ { 0x048B, 49198 },
+ { 0x048C, 50217 },
+ { 0x048D, 49323 },
+ { 0x048E, 49580 },
+ { 0x048F, 48682 },
+ { 0x0490, 49816 },
+ { 0x0491, 48918 },
+ { 0x0492, 49802 },
+ { 0x0493, 48904 },
+ { 0x0494, 49795 },
+ { 0x0495, 48897 },
+ { 0x0496, 49894 },
+ { 0x0497, 48996 },
+ { 0x0498, 49739 },
+ { 0x0499, 48841 },
+ { 0x049A, 49665 },
+ { 0x049B, 48767 },
+ { 0x049C, 49658 },
+ { 0x049D, 48760 },
+ { 0x049E, 49652 },
+ { 0x049F, 48754 },
+ { 0x04A0, 50141 },
+ { 0x04A1, 49243 },
+ { 0x04A2, 49570 },
+ { 0x04A3, 48672 },
+ { 0x04A4, 50291 },
+ { 0x04A5, 49397 },
+ { 0x04A6, 49679 },
+ { 0x04A7, 48781 },
+ { 0x04A8, 50234 },
+ { 0x04A9, 49340 },
+ { 0x04AA, 49590 },
+ { 0x04AB, 48692 },
+ { 0x04AC, 49701 },
+ { 0x04AD, 48803 },
+ { 0x04AE, 50222 },
+ { 0x04AF, 49328 },
+ { 0x04B0, 50227 },
+ { 0x04B1, 49333 },
+ { 0x04B2, 49612 },
+ { 0x04B3, 48714 },
+ { 0x04B4, 50296 },
+ { 0x04B5, 49402 },
+ { 0x04B6, 49767 },
+ { 0x04B7, 48869 },
+ { 0x04B8, 49760 },
+ { 0x04B9, 48862 },
+ { 0x04BA, 49975 },
+ { 0x04BB, 49077 },
+ { 0x04BC, 50239 },
+ { 0x04BD, 49345 },
+ { 0x04BE, 50244 },
+ { 0x04BF, 49350 },
+ { 0x04C0, 49414 },
+ { 0x04C1, 49888 },
+ { 0x04C2, 48990 },
+ { 0x04C3, 49646 },
+ { 0x04C4, 48748 },
+ { 0x04C5, 49524 },
+ { 0x04C6, 48626 },
+ { 0x04C7, 49551 },
+ { 0x04C8, 48653 },
+ { 0x04C9, 49557 },
+ { 0x04CA, 48659 },
+ { 0x04CB, 50276 },
+ { 0x04CC, 49382 },
+ { 0x04CD, 49541 },
+ { 0x04CE, 48643 },
+ { 0x04CF, 49304 },
+ { 0x04D0, 49425 },
+ { 0x04D1, 48527 },
+ { 0x04D2, 49431 },
+ { 0x04D3, 48533 },
+ { 0x04D4, 50286 },
+ { 0x04D5, 49392 },
+ { 0x04D6, 49622 },
+ { 0x04D7, 48724 },
+ { 0x04D8, 50077 },
+ { 0x04D9, 49179 },
+ { 0x04DA, 50081 },
+ { 0x04DB, 49183 },
+ { 0x04DC, 49900 },
+ { 0x04DD, 49002 },
+ { 0x04DE, 49745 },
+ { 0x04DF, 48847 },
+ { 0x04E0, 50251 },
+ { 0x04E1, 49357 },
+ { 0x04E2, 49457 },
+ { 0x04E3, 48559 },
+ { 0x04E4, 49463 },
+ { 0x04E5, 48565 },
+ { 0x04E6, 49473 },
+ { 0x04E7, 48575 },
+ { 0x04E8, 50108 },
+ { 0x04E9, 49210 },
+ { 0x04EA, 50113 },
+ { 0x04EB, 49215 },
+ { 0x04EC, 49441 },
+ { 0x04ED, 48543 },
+ { 0x04EE, 49490 },
+ { 0x04EF, 48592 },
+ { 0x04F0, 49496 },
+ { 0x04F1, 48598 },
+ { 0x04F2, 49483 },
+ { 0x04F3, 48585 },
+ { 0x04F4, 49773 },
+ { 0x04F5, 48875 },
+ { 0x04F6, 49822 },
+ { 0x04F7, 48924 },
+ { 0x04F8, 50030 },
+ { 0x04F9, 49132 },
+ { 0x04FA, 49808 },
+ { 0x04FB, 48910 },
+ { 0x04FC, 49600 },
+ { 0x04FD, 48702 },
+ { 0x04FE, 49606 },
+ { 0x04FF, 48708 },
+ { 0x0500, 49935 },
+ { 0x0501, 49037 },
+ { 0x0502, 49940 },
+ { 0x0503, 49042 },
+ { 0x0504, 49965 },
+ { 0x0505, 49067 },
+ { 0x0506, 49970 },
+ { 0x0507, 49072 },
+ { 0x0508, 49945 },
+ { 0x0509, 49047 },
+ { 0x050A, 49950 },
+ { 0x050B, 49052 },
+ { 0x050C, 49955 },
+ { 0x050D, 49057 },
+ { 0x050E, 49960 },
+ { 0x050F, 49062 },
+ { 0x0510, 50207 },
+ { 0x0511, 49313 },
+ { 0x0512, 49518 },
+ { 0x0513, 48620 },
+ { 0x0514, 49844 },
+ { 0x0515, 48946 },
+ { 0x0516, 49860 },
+ { 0x0517, 48962 },
+ { 0x0518, 49876 },
+ { 0x0519, 48978 },
+ { 0x051A, 49686 },
+ { 0x051B, 48788 },
+ { 0x051C, 49715 },
+ { 0x051D, 48817 },
+ { 0x051E, 50040 },
+ { 0x051F, 49142 },
+ { 0x0520, 49530 },
+ { 0x0521, 48632 },
+ { 0x0522, 49563 },
+ { 0x0523, 48665 },
+ { 0x0531, 44961 },
+ { 0x0532, 44965 },
+ { 0x0533, 44981 },
+ { 0x0534, 44917 },
+ { 0x0535, 44973 },
+ { 0x0536, 44957 },
+ { 0x0537, 44921 },
+ { 0x0538, 44925 },
+ { 0x0539, 44945 },
+ { 0x053A, 45029 },
+ { 0x053B, 44985 },
+ { 0x053C, 45045 },
+ { 0x053D, 45025 },
+ { 0x053E, 44909 },
+ { 0x053F, 44993 },
+ { 0x0540, 44929 },
+ { 0x0541, 44933 },
+ { 0x0542, 45037 },
+ { 0x0543, 45033 },
+ { 0x0544, 44997 },
+ { 0x0545, 44953 },
+ { 0x0546, 45001 },
+ { 0x0547, 45017 },
+ { 0x0548, 44949 },
+ { 0x0549, 44969 },
+ { 0x054A, 45005 },
+ { 0x054B, 45041 },
+ { 0x054C, 44941 },
+ { 0x054D, 45013 },
+ { 0x054E, 45021 },
+ { 0x054F, 45053 },
+ { 0x0550, 45009 },
+ { 0x0551, 44913 },
+ { 0x0552, 45057 },
+ { 0x0553, 45049 },
+ { 0x0554, 44989 },
+ { 0x0555, 44937 },
+ { 0x0556, 44977 },
+ { 0x0559, 45064 },
+ { 0x055A, 45073 },
+ { 0x055B, 45061 },
+ { 0x055C, 45075 },
+ { 0x055D, 44723 },
+ { 0x055E, 45070 },
+ { 0x055F, 45078 },
+ { 0x0561, 44777 },
+ { 0x0562, 44781 },
+ { 0x0563, 44797 },
+ { 0x0564, 44733 },
+ { 0x0565, 44789 },
+ { 0x0566, 44773 },
+ { 0x0567, 44737 },
+ { 0x0568, 44741 },
+ { 0x0569, 44761 },
+ { 0x056A, 44845 },
+ { 0x056B, 44801 },
+ { 0x056C, 44861 },
+ { 0x056D, 44841 },
+ { 0x056E, 44725 },
+ { 0x056F, 44809 },
+ { 0x0570, 44745 },
+ { 0x0571, 44749 },
+ { 0x0572, 44853 },
+ { 0x0573, 44849 },
+ { 0x0574, 44813 },
+ { 0x0575, 44769 },
+ { 0x0576, 44817 },
+ { 0x0577, 44833 },
+ { 0x0578, 44765 },
+ { 0x0579, 44785 },
+ { 0x057A, 44821 },
+ { 0x057B, 44857 },
+ { 0x057C, 44757 },
+ { 0x057D, 44829 },
+ { 0x057E, 44837 },
+ { 0x057F, 44869 },
+ { 0x0580, 44825 },
+ { 0x0581, 44729 },
+ { 0x0582, 44873 },
+ { 0x0583, 44865 },
+ { 0x0584, 44805 },
+ { 0x0585, 44753 },
+ { 0x0586, 44793 },
+ { 0x0587, 44877 },
+ { 0x0589, 44720 },
+ { 0x058A, 44907 },
+ { 0x0591, 33056 },
+ { 0x0592, 33004 },
+ { 0x0593, 33073 },
+ { 0x0594, 33022 },
+ { 0x0595, 33018 },
+ { 0x0596, 33053 },
+ { 0x0597, 33001 },
+ { 0x0598, 33026 },
+ { 0x0599, 33046 },
+ { 0x059A, 33015 },
+ { 0x059B, 33007 },
+ { 0x059C, 33032 },
+ { 0x059D, 33035 },
+ { 0x059E, 33070 },
+ { 0x059F, 33049 },
+ { 0x05A0, 33059 },
+ { 0x05A1, 32995 },
+ { 0x05A2, 32985 },
+ { 0x05A3, 32992 },
+ { 0x05A4, 33067 },
+ { 0x05A5, 33039 },
+ { 0x05A6, 33042 },
+ { 0x05A7, 32989 },
+ { 0x05A8, 32998 },
+ { 0x05A9, 33063 },
+ { 0x05AA, 33010 },
+ { 0x05AB, 32976 },
+ { 0x05AC, 32982 },
+ { 0x05AD, 32979 },
+ { 0x05AE, 33029 },
+ { 0x05AF, 32903 },
+ { 0x05B0, 32951 },
+ { 0x05B1, 32922 },
+ { 0x05B2, 32918 },
+ { 0x05B3, 32926 },
+ { 0x05B4, 32930 },
+ { 0x05B5, 32954 },
+ { 0x05B6, 32948 },
+ { 0x05B7, 32945 },
+ { 0x05B8, 32962 },
+ { 0x05B9, 32933 },
+ { 0x05BA, 32936 },
+ { 0x05BB, 32969 },
+ { 0x05BC, 32957 },
+ { 0x05BD, 32942 },
+ { 0x05BE, 33412 },
+ { 0x05BF, 32911 },
+ { 0x05C0, 33415 },
+ { 0x05C1, 32914 },
+ { 0x05C2, 32907 },
+ { 0x05C3, 33408 },
+ { 0x05C4, 32899 },
+ { 0x05C5, 32895 },
+ { 0x05C6, 33404 },
+ { 0x05C7, 32965 },
+ { 0x05D0, 33192 },
+ { 0x05D1, 33097 },
+ { 0x05D2, 33330 },
+ { 0x05D3, 33290 },
+ { 0x05D4, 33076 },
+ { 0x05D5, 33166 },
+ { 0x05D6, 33354 },
+ { 0x05D7, 33110 },
+ { 0x05D8, 33158 },
+ { 0x05D9, 33179 },
+ { 0x05DA, 33308 },
+ { 0x05DB, 33113 },
+ { 0x05DC, 33338 },
+ { 0x05DD, 33318 },
+ { 0x05DE, 33126 },
+ { 0x05DF, 33322 },
+ { 0x05E0, 33134 },
+ { 0x05E1, 33362 },
+ { 0x05E2, 33210 },
+ { 0x05E3, 33298 },
+ { 0x05E4, 33084 },
+ { 0x05E5, 33326 },
+ { 0x05E6, 33346 },
+ { 0x05E7, 33142 },
+ { 0x05E8, 33213 },
+ { 0x05E9, 33221 },
+ { 0x05EA, 33150 },
+ { 0x05F0, 33394 },
+ { 0x05F1, 33383 },
+ { 0x05F2, 33399 },
+ { 0x05F3, 33418 },
+ { 0x05F4, 33421 },
+ { 0x0600, 26405 },
+ { 0x0601, 23733 },
+ { 0x0602, 26459 },
+ { 0x0603, 23730 },
+ { 0x0606, 69351 },
+ { 0x0607, 69384 },
+ { 0x0608, 23706 },
+ { 0x0609, 69347 },
+ { 0x060A, 69342 },
+ { 0x060B, 37776 },
+ { 0x060C, 23764 },
+ { 0x060D, 23708 },
+ { 0x060E, 26408 },
+ { 0x060F, 23727 },
+ { 0x0610, 23756 },
+ { 0x0611, 23736 },
+ { 0x0612, 23752 },
+ { 0x0613, 23722 },
+ { 0x0614, 23749 },
+ { 0x0615, 23840 },
+ { 0x0616, 23923 },
+ { 0x0617, 23872 },
+ { 0x0618, 23935 },
+ { 0x0619, 23932 },
+ { 0x061A, 23938 },
+ { 0x061B, 30222 },
+ { 0x061E, 26422 },
+ { 0x061F, 30214 },
+ { 0x0621, 26056 },
+ { 0x0622, 25371 },
+ { 0x0623, 25327 },
+ { 0x0624, 25097 },
+ { 0x0625, 25349 },
+ { 0x0626, 25155 },
+ { 0x0627, 25310 },
+ { 0x0628, 24144 },
+ { 0x0629, 25027 },
+ { 0x062A, 24996 },
+ { 0x062B, 25851 },
+ { 0x062C, 25554 },
+ { 0x062D, 24447 },
+ { 0x062E, 25577 },
+ { 0x062F, 24260 },
+ { 0x0630, 25838 },
+ { 0x0631, 24833 },
+ { 0x0632, 25897 },
+ { 0x0633, 25747 },
+ { 0x0634, 26192 },
+ { 0x0635, 24929 },
+ { 0x0636, 24231 },
+ { 0x0637, 24966 },
+ { 0x0638, 25287 },
+ { 0x0639, 24090 },
+ { 0x063A, 26027 },
+ { 0x063B, 26073 },
+ { 0x063C, 26087 },
+ { 0x063D, 25996 },
+ { 0x063E, 25950 },
+ { 0x063F, 25958 },
+ { 0x0640, 26440 },
+ { 0x0641, 24346 },
+ { 0x0642, 24797 },
+ { 0x0643, 24672 },
+ { 0x0644, 24720 },
+ { 0x0645, 25600 },
+ { 0x0646, 25635 },
+ { 0x0647, 24545 },
+ { 0x0648, 25076 },
+ { 0x0649, 25432 },
+ { 0x064A, 25147 },
+ { 0x064B, 26453 },
+ { 0x064C, 26447 },
+ { 0x064D, 26465 },
+ { 0x064E, 23786 },
+ { 0x064F, 23766 },
+ { 0x0650, 23807 },
+ { 0x0651, 26412 },
+ { 0x0652, 23947 },
+ { 0x0653, 26402 },
+ { 0x0654, 23801 },
+ { 0x0655, 23804 },
+ { 0x0656, 30224 },
+ { 0x0657, 26462 },
+ { 0x0658, 23718 },
+ { 0x0659, 30220 },
+ { 0x065A, 23962 },
+ { 0x065B, 23968 },
+ { 0x065C, 23957 },
+ { 0x065D, 30217 },
+ { 0x065E, 23788 },
+ { 0x0660, 69372 },
+ { 0x0661, 69354 },
+ { 0x0662, 69360 },
+ { 0x0663, 69381 },
+ { 0x0664, 69366 },
+ { 0x0665, 69363 },
+ { 0x0666, 69357 },
+ { 0x0667, 69378 },
+ { 0x0668, 69375 },
+ { 0x0669, 69369 },
+ { 0x066A, 26430 },
+ { 0x066B, 26427 },
+ { 0x066C, 30227 },
+ { 0x066D, 23711 },
+ { 0x066E, 26331 },
+ { 0x066F, 26339 },
+ { 0x0670, 26398 },
+ { 0x0671, 25416 },
+ { 0x0672, 25313 },
+ { 0x0673, 25320 },
+ { 0x0674, 25535 },
+ { 0x0675, 25549 },
+ { 0x0676, 25539 },
+ { 0x0677, 24001 },
+ { 0x0678, 25544 },
+ { 0x0679, 25874 },
+ { 0x067A, 26290 },
+ { 0x067B, 25453 },
+ { 0x067C, 24999 },
+ { 0x067D, 25004 },
+ { 0x067E, 24774 },
+ { 0x067F, 26254 },
+ { 0x0680, 25910 },
+ { 0x0681, 24465 },
+ { 0x0682, 24457 },
+ { 0x0683, 25711 },
+ { 0x0684, 25489 },
+ { 0x0685, 24500 },
+ { 0x0686, 26225 },
+ { 0x0687, 26375 },
+ { 0x0688, 25476 },
+ { 0x0689, 24296 },
+ { 0x068A, 24263 },
+ { 0x068B, 24269 },
+ { 0x068C, 25933 },
+ { 0x068D, 26277 },
+ { 0x068E, 24333 },
+ { 0x068F, 24301 },
+ { 0x0690, 24289 },
+ { 0x0691, 25734 },
+ { 0x0692, 24884 },
+ { 0x0693, 24873 },
+ { 0x0694, 24836 },
+ { 0x0695, 24890 },
+ { 0x0696, 24842 },
+ { 0x0697, 24851 },
+ { 0x0698, 24659 },
+ { 0x0699, 24866 },
+ { 0x069A, 25750 },
+ { 0x069B, 25785 },
+ { 0x069C, 25792 },
+ { 0x069D, 24932 },
+ { 0x069E, 24939 },
+ { 0x069F, 24969 },
+ { 0x06A0, 24108 },
+ { 0x06A1, 26335 },
+ { 0x06A2, 24355 },
+ { 0x06A3, 24349 },
+ { 0x06A4, 25053 },
+ { 0x06A5, 24369 },
+ { 0x06A6, 26146 },
+ { 0x06A7, 24800 },
+ { 0x06A8, 24806 },
+ { 0x06A9, 26064 },
+ { 0x06AA, 26221 },
+ { 0x06AB, 24688 },
+ { 0x06AC, 24675 },
+ { 0x06AD, 24028 },
+ { 0x06AE, 24693 },
+ { 0x06AF, 24405 },
+ { 0x06B0, 24415 },
+ { 0x06B1, 26123 },
+ { 0x06B2, 24408 },
+ { 0x06B3, 25512 },
+ { 0x06B4, 24420 },
+ { 0x06B5, 24734 },
+ { 0x06B6, 24728 },
+ { 0x06B7, 24740 },
+ { 0x06B8, 24747 },
+ { 0x06B9, 25638 },
+ { 0x06BA, 25680 },
+ { 0x06BB, 26169 },
+ { 0x06BC, 25651 },
+ { 0x06BD, 25668 },
+ { 0x06BE, 24631 },
+ { 0x06BF, 26228 },
+ { 0x06C0, 24583 },
+ { 0x06C1, 24548 },
+ { 0x06C2, 24552 },
+ { 0x06C3, 25031 },
+ { 0x06C4, 25092 },
+ { 0x06C5, 26343 },
+ { 0x06C6, 24051 },
+ { 0x06C7, 23998 },
+ { 0x06C8, 24077 },
+ { 0x06C9, 26359 },
+ { 0x06CA, 25085 },
+ { 0x06CB, 24064 },
+ { 0x06CC, 25946 },
+ { 0x06CD, 25150 },
+ { 0x06CE, 25193 },
+ { 0x06CF, 25079 },
+ { 0x06D0, 23975 },
+ { 0x06D1, 25199 },
+ { 0x06D2, 25211 },
+ { 0x06D3, 25215 },
+ { 0x06D4, 23715 },
+ { 0x06D5, 24025 },
+ { 0x06D6, 23913 },
+ { 0x06D7, 23903 },
+ { 0x06D8, 23852 },
+ { 0x06D9, 23835 },
+ { 0x06DA, 23848 },
+ { 0x06DB, 23880 },
+ { 0x06DC, 23868 },
+ { 0x06DD, 23702 },
+ { 0x06DE, 23941 },
+ { 0x06DF, 23892 },
+ { 0x06E0, 23897 },
+ { 0x06E1, 23885 },
+ { 0x06E2, 23858 },
+ { 0x06E3, 23825 },
+ { 0x06E4, 23876 },
+ { 0x06E5, 23829 },
+ { 0x06E6, 23832 },
+ { 0x06E7, 23844 },
+ { 0x06E8, 23864 },
+ { 0x06E9, 23817 },
+ { 0x06EA, 23776 },
+ { 0x06EB, 23781 },
+ { 0x06EC, 26433 },
+ { 0x06ED, 23821 },
+ { 0x06EE, 24309 },
+ { 0x06EF, 24913 },
+ { 0x06F0, 51759 },
+ { 0x06F1, 51735 },
+ { 0x06F2, 51743 },
+ { 0x06F3, 51771 },
+ { 0x06F4, 51751 },
+ { 0x06F5, 51747 },
+ { 0x06F6, 51739 },
+ { 0x06F7, 51767 },
+ { 0x06F8, 51763 },
+ { 0x06F9, 51755 },
+ { 0x06FA, 26195 },
+ { 0x06FB, 24234 },
+ { 0x06FC, 26030 },
+ { 0x06FD, 23740 },
+ { 0x06FE, 23744 },
+ { 0x06FF, 24605 },
+ { 0x0700, 36871 },
+ { 0x0701, 37114 },
+ { 0x0702, 37094 },
+ { 0x0703, 37118 },
+ { 0x0704, 37098 },
+ { 0x0705, 37106 },
+ { 0x0706, 36885 },
+ { 0x0707, 36889 },
+ { 0x0708, 37121 },
+ { 0x0709, 37101 },
+ { 0x070A, 37109 },
+ { 0x070B, 37081 },
+ { 0x070C, 37084 },
+ { 0x070D, 37087 },
+ { 0x070F, 37126 },
+ { 0x0710, 36987 },
+ { 0x0711, 37046 },
+ { 0x0712, 36952 },
+ { 0x0713, 36994 },
+ { 0x0714, 36997 },
+ { 0x0715, 37004 },
+ { 0x0716, 37010 },
+ { 0x0717, 36934 },
+ { 0x0718, 36949 },
+ { 0x0719, 36984 },
+ { 0x071A, 36955 },
+ { 0x071B, 36970 },
+ { 0x071C, 36973 },
+ { 0x071D, 36977 },
+ { 0x071E, 36980 },
+ { 0x071F, 36958 },
+ { 0x0720, 37007 },
+ { 0x0721, 36940 },
+ { 0x0722, 36943 },
+ { 0x0723, 37027 },
+ { 0x0724, 36990 },
+ { 0x0725, 36931 },
+ { 0x0726, 36937 },
+ { 0x0727, 37042 },
+ { 0x0728, 37001 },
+ { 0x0729, 36961 },
+ { 0x072A, 36964 },
+ { 0x072B, 36967 },
+ { 0x072C, 36946 },
+ { 0x072D, 37015 },
+ { 0x072E, 37019 },
+ { 0x072F, 37023 },
+ { 0x0730, 37050 },
+ { 0x0731, 37053 },
+ { 0x0732, 37056 },
+ { 0x0733, 37059 },
+ { 0x0734, 37062 },
+ { 0x0735, 37065 },
+ { 0x0736, 36907 },
+ { 0x0737, 36910 },
+ { 0x0738, 36927 },
+ { 0x0739, 36923 },
+ { 0x073A, 36899 },
+ { 0x073B, 36902 },
+ { 0x073C, 37111 },
+ { 0x073D, 36893 },
+ { 0x073E, 36896 },
+ { 0x073F, 36913 },
+ { 0x0740, 37078 },
+ { 0x0741, 37092 },
+ { 0x0742, 37090 },
+ { 0x0743, 36875 },
+ { 0x0744, 36880 },
+ { 0x0745, 36915 },
+ { 0x0746, 36919 },
+ { 0x0747, 37070 },
+ { 0x0748, 37074 },
+ { 0x0749, 36905 },
+ { 0x074A, 37068 },
+ { 0x074D, 37038 },
+ { 0x074E, 37034 },
+ { 0x074F, 37030 },
+ { 0x0750, 24195 },
+ { 0x0751, 24147 },
+ { 0x0752, 24173 },
+ { 0x0753, 24182 },
+ { 0x0754, 24157 },
+ { 0x0755, 24203 },
+ { 0x0756, 24167 },
+ { 0x0757, 24450 },
+ { 0x0758, 24507 },
+ { 0x0759, 24278 },
+ { 0x075A, 24315 },
+ { 0x075B, 24908 },
+ { 0x075C, 25767 },
+ { 0x075D, 24093 },
+ { 0x075E, 24115 },
+ { 0x075F, 24100 },
+ { 0x0760, 24362 },
+ { 0x0761, 24376 },
+ { 0x0762, 26067 },
+ { 0x0763, 26080 },
+ { 0x0764, 26094 },
+ { 0x0765, 25603 },
+ { 0x0766, 25609 },
+ { 0x0767, 25644 },
+ { 0x0768, 25662 },
+ { 0x0769, 25656 },
+ { 0x076A, 24723 },
+ { 0x076B, 24858 },
+ { 0x076C, 24878 },
+ { 0x076D, 25759 },
+ { 0x076E, 24491 },
+ { 0x076F, 24471 },
+ { 0x0770, 25774 },
+ { 0x0771, 24897 },
+ { 0x0772, 24482 },
+ { 0x0773, 25393 },
+ { 0x0774, 25402 },
+ { 0x0775, 25966 },
+ { 0x0776, 25986 },
+ { 0x0777, 25976 },
+ { 0x0778, 25119 },
+ { 0x0779, 25128 },
+ { 0x077A, 25240 },
+ { 0x077B, 25250 },
+ { 0x077C, 24516 },
+ { 0x077D, 25803 },
+ { 0x077E, 25812 },
+ { 0x077F, 24681 },
+ { 0x0780, 37486 },
+ { 0x0781, 37591 },
+ { 0x0782, 37534 },
+ { 0x0783, 37492 },
+ { 0x0784, 37483 },
+ { 0x0785, 37588 },
+ { 0x0786, 37525 },
+ { 0x0787, 37516 },
+ { 0x0788, 37543 },
+ { 0x0789, 37531 },
+ { 0x078A, 37519 },
+ { 0x078B, 37552 },
+ { 0x078C, 37510 },
+ { 0x078D, 37528 },
+ { 0x078E, 37522 },
+ { 0x078F, 37585 },
+ { 0x0790, 37540 },
+ { 0x0791, 37567 },
+ { 0x0792, 37579 },
+ { 0x0793, 37576 },
+ { 0x0794, 37495 },
+ { 0x0795, 37573 },
+ { 0x0796, 37570 },
+ { 0x0797, 37582 },
+ { 0x0798, 37513 },
+ { 0x0799, 37504 },
+ { 0x079A, 37507 },
+ { 0x079B, 37564 },
+ { 0x079C, 37498 },
+ { 0x079D, 37561 },
+ { 0x079E, 37558 },
+ { 0x079F, 37549 },
+ { 0x07A0, 37477 },
+ { 0x07A1, 37480 },
+ { 0x07A2, 37501 },
+ { 0x07A3, 37555 },
+ { 0x07A4, 37537 },
+ { 0x07A5, 37546 },
+ { 0x07A6, 37594 },
+ { 0x07A7, 37604 },
+ { 0x07A8, 37598 },
+ { 0x07A9, 37606 },
+ { 0x07AA, 37602 },
+ { 0x07AB, 37612 },
+ { 0x07AC, 37596 },
+ { 0x07AD, 37608 },
+ { 0x07AE, 37600 },
+ { 0x07AF, 37610 },
+ { 0x07B0, 37475 },
+ { 0x07B1, 37489 },
+ { 0x07C0, 6538 },
+ { 0x07C1, 6520 },
+ { 0x07C2, 6526 },
+ { 0x07C3, 6547 },
+ { 0x07C4, 6532 },
+ { 0x07C5, 6529 },
+ { 0x07C6, 6523 },
+ { 0x07C7, 6544 },
+ { 0x07C8, 6541 },
+ { 0x07C9, 6535 },
+ { 0x07CA, 6550 },
+ { 0x07CB, 6574 },
+ { 0x07CC, 6556 },
+ { 0x07CD, 6553 },
+ { 0x07CE, 6565 },
+ { 0x07CF, 6602 },
+ { 0x07D0, 6562 },
+ { 0x07D1, 6651 },
+ { 0x07D2, 6559 },
+ { 0x07D3, 6568 },
+ { 0x07D4, 6605 },
+ { 0x07D5, 6614 },
+ { 0x07D6, 6583 },
+ { 0x07D7, 6623 },
+ { 0x07D8, 6571 },
+ { 0x07D9, 6608 },
+ { 0x07DA, 6636 },
+ { 0x07DB, 6611 },
+ { 0x07DC, 6626 },
+ { 0x07DD, 6577 },
+ { 0x07DE, 6586 },
+ { 0x07DF, 6589 },
+ { 0x07E0, 6598 },
+ { 0x07E1, 6592 },
+ { 0x07E2, 6629 },
+ { 0x07E3, 6595 },
+ { 0x07E4, 6580 },
+ { 0x07E5, 6617 },
+ { 0x07E6, 6620 },
+ { 0x07E7, 6632 },
+ { 0x07E8, 6639 },
+ { 0x07E9, 6647 },
+ { 0x07EA, 6643 },
+ { 0x07EB, 6686 },
+ { 0x07EC, 6681 },
+ { 0x07ED, 6691 },
+ { 0x07EE, 6676 },
+ { 0x07EF, 6666 },
+ { 0x07F0, 6661 },
+ { 0x07F1, 6671 },
+ { 0x07F2, 6701 },
+ { 0x07F3, 6696 },
+ { 0x07F4, 6514 },
+ { 0x07F5, 6510 },
+ { 0x07F6, 6654 },
+ { 0x07F7, 6658 },
+ { 0x07F8, 6518 },
+ { 0x07F9, 6707 },
+ { 0x07FA, 6705 },
+ { 0x0901, 66870 },
+ { 0x0902, 66864 },
+ { 0x0903, 66861 },
+ { 0x0904, 67167 },
+ { 0x0905, 66990 },
+ { 0x0906, 67005 },
+ { 0x0907, 66996 },
+ { 0x0908, 67032 },
+ { 0x0909, 67002 },
+ { 0x090A, 67065 },
+ { 0x090B, 67199 },
+ { 0x090C, 67195 },
+ { 0x090D, 67183 },
+ { 0x090E, 67171 },
+ { 0x090F, 66993 },
+ { 0x0910, 67008 },
+ { 0x0911, 67187 },
+ { 0x0912, 67175 },
+ { 0x0913, 66999 },
+ { 0x0914, 67011 },
+ { 0x0915, 67038 },
+ { 0x0916, 67104 },
+ { 0x0917, 67026 },
+ { 0x0918, 67095 },
+ { 0x0919, 67110 },
+ { 0x091A, 67017 },
+ { 0x091B, 67083 },
+ { 0x091C, 67035 },
+ { 0x091D, 67098 },
+ { 0x091E, 67116 },
+ { 0x091F, 67137 },
+ { 0x0920, 67161 },
+ { 0x0921, 67086 },
+ { 0x0922, 67146 },
+ { 0x0923, 67113 },
+ { 0x0924, 67062 },
+ { 0x0925, 67134 },
+ { 0x0926, 67020 },
+ { 0x0927, 67089 },
+ { 0x0928, 67047 },
+ { 0x0929, 67158 },
+ { 0x092A, 67050 },
+ { 0x092B, 67119 },
+ { 0x092C, 67014 },
+ { 0x092D, 67080 },
+ { 0x092E, 67044 },
+ { 0x092F, 67071 },
+ { 0x0930, 67056 },
+ { 0x0931, 67125 },
+ { 0x0932, 67041 },
+ { 0x0933, 67107 },
+ { 0x0934, 67155 },
+ { 0x0935, 67068 },
+ { 0x0936, 67128 },
+ { 0x0937, 67131 },
+ { 0x0938, 67059 },
+ { 0x0939, 67029 },
+ { 0x093C, 66855 },
+ { 0x093D, 66867 },
+ { 0x093E, 66927 },
+ { 0x093F, 66915 },
+ { 0x0940, 66939 },
+ { 0x0941, 66923 },
+ { 0x0942, 66943 },
+ { 0x0943, 66972 },
+ { 0x0944, 66982 },
+ { 0x0945, 66957 },
+ { 0x0946, 66947 },
+ { 0x0947, 66911 },
+ { 0x0948, 66931 },
+ { 0x0949, 66962 },
+ { 0x094A, 66952 },
+ { 0x094B, 66919 },
+ { 0x094C, 66935 },
+ { 0x094D, 66858 },
+ { 0x0950, 66848 },
+ { 0x0951, 67211 },
+ { 0x0952, 67215 },
+ { 0x0953, 66908 },
+ { 0x0954, 66873 },
+ { 0x0958, 67053 },
+ { 0x0959, 67152 },
+ { 0x095A, 67149 },
+ { 0x095B, 67074 },
+ { 0x095C, 67164 },
+ { 0x095D, 67122 },
+ { 0x095E, 67023 },
+ { 0x095F, 67140 },
+ { 0x0960, 67207 },
+ { 0x0961, 67203 },
+ { 0x0962, 66967 },
+ { 0x0963, 66977 },
+ { 0x0964, 66876 },
+ { 0x0965, 66987 },
+ { 0x0966, 66896 },
+ { 0x0967, 66878 },
+ { 0x0968, 66884 },
+ { 0x0969, 66905 },
+ { 0x096A, 66890 },
+ { 0x096B, 66887 },
+ { 0x096C, 66881 },
+ { 0x096D, 66902 },
+ { 0x096E, 66899 },
+ { 0x096F, 66893 },
+ { 0x0970, 67219 },
+ { 0x0971, 66850 },
+ { 0x0972, 67179 },
+ { 0x097B, 67092 },
+ { 0x097C, 67101 },
+ { 0x097D, 67191 },
+ { 0x097E, 67143 },
+ { 0x097F, 67077 },
+ { 0x0981, 37801 },
+ { 0x0982, 37795 },
+ { 0x0983, 37792 },
+ { 0x0985, 37898 },
+ { 0x0986, 37913 },
+ { 0x0987, 37904 },
+ { 0x0988, 37937 },
+ { 0x0989, 37910 },
+ { 0x098A, 37979 },
+ { 0x098B, 38053 },
+ { 0x098C, 38049 },
+ { 0x098F, 37901 },
+ { 0x0990, 37916 },
+ { 0x0993, 37907 },
+ { 0x0994, 37919 },
+ { 0x0995, 37943 },
+ { 0x0996, 38003 },
+ { 0x0997, 37931 },
+ { 0x0998, 37997 },
+ { 0x0999, 38006 },
+ { 0x099A, 37925 },
+ { 0x099B, 37988 },
+ { 0x099C, 37940 },
+ { 0x099D, 38000 },
+ { 0x099E, 38012 },
+ { 0x099F, 38033 },
+ { 0x09A0, 38042 },
+ { 0x09A1, 37991 },
+ { 0x09A2, 38039 },
+ { 0x09A3, 38009 },
+ { 0x09A4, 37976 },
+ { 0x09A5, 38030 },
+ { 0x09A6, 37928 },
+ { 0x09A7, 37994 },
+ { 0x09A8, 37952 },
+ { 0x09AA, 37955 },
+ { 0x09AB, 38015 },
+ { 0x09AC, 37922 },
+ { 0x09AD, 37985 },
+ { 0x09AE, 37949 },
+ { 0x09AF, 37982 },
+ { 0x09B0, 37958 },
+ { 0x09B2, 37946 },
+ { 0x09B6, 38024 },
+ { 0x09B7, 38027 },
+ { 0x09B8, 37973 },
+ { 0x09B9, 37934 },
+ { 0x09BC, 37786 },
+ { 0x09BD, 37798 },
+ { 0x09BE, 37856 },
+ { 0x09BF, 37844 },
+ { 0x09C0, 37868 },
+ { 0x09C1, 37852 },
+ { 0x09C2, 37872 },
+ { 0x09C3, 37881 },
+ { 0x09C4, 37891 },
+ { 0x09C7, 37840 },
+ { 0x09C8, 37860 },
+ { 0x09CB, 37848 },
+ { 0x09CC, 37864 },
+ { 0x09CD, 37789 },
+ { 0x09CE, 38045 },
+ { 0x09D7, 37782 },
+ { 0x09DC, 38021 },
+ { 0x09DD, 38018 },
+ { 0x09DF, 38036 },
+ { 0x09E0, 38061 },
+ { 0x09E1, 38057 },
+ { 0x09E2, 37876 },
+ { 0x09E3, 37886 },
+ { 0x09E6, 37822 },
+ { 0x09E7, 37804 },
+ { 0x09E8, 37810 },
+ { 0x09E9, 37831 },
+ { 0x09EA, 37816 },
+ { 0x09EB, 37813 },
+ { 0x09EC, 37807 },
+ { 0x09ED, 37828 },
+ { 0x09EE, 37825 },
+ { 0x09EF, 37819 },
+ { 0x09F0, 37967 },
+ { 0x09F1, 37961 },
+ { 0x09F2, 37834 },
+ { 0x09F3, 37837 },
+ { 0x09F4, 38065 },
+ { 0x09F5, 38077 },
+ { 0x09F6, 38085 },
+ { 0x09F7, 38081 },
+ { 0x09F8, 38069 },
+ { 0x09F9, 38089 },
+ { 0x09FA, 37896 },
+ { 0x0A01, 52505 },
+ { 0x0A02, 52509 },
+ { 0x0A03, 52524 },
+ { 0x0A05, 52597 },
+ { 0x0A06, 52606 },
+ { 0x0A07, 52600 },
+ { 0x0A08, 52636 },
+ { 0x0A09, 52603 },
+ { 0x0A0A, 52669 },
+ { 0x0A0F, 52624 },
+ { 0x0A10, 52609 },
+ { 0x0A13, 52654 },
+ { 0x0A14, 52612 },
+ { 0x0A15, 52642 },
+ { 0x0A16, 52699 },
+ { 0x0A17, 52630 },
+ { 0x0A18, 52693 },
+ { 0x0A19, 52705 },
+ { 0x0A1A, 52618 },
+ { 0x0A1B, 52684 },
+ { 0x0A1C, 52639 },
+ { 0x0A1D, 52696 },
+ { 0x0A1E, 52711 },
+ { 0x0A1F, 52726 },
+ { 0x0A20, 52738 },
+ { 0x0A21, 52687 },
+ { 0x0A22, 52729 },
+ { 0x0A23, 52708 },
+ { 0x0A24, 52666 },
+ { 0x0A25, 52723 },
+ { 0x0A26, 52621 },
+ { 0x0A27, 52690 },
+ { 0x0A28, 52651 },
+ { 0x0A2A, 52657 },
+ { 0x0A2B, 52714 },
+ { 0x0A2C, 52615 },
+ { 0x0A2D, 52681 },
+ { 0x0A2E, 52648 },
+ { 0x0A2F, 52675 },
+ { 0x0A30, 52660 },
+ { 0x0A32, 52645 },
+ { 0x0A33, 52702 },
+ { 0x0A35, 52672 },
+ { 0x0A36, 52720 },
+ { 0x0A38, 52663 },
+ { 0x0A39, 52633 },
+ { 0x0A3C, 52512 },
+ { 0x0A3E, 52569 },
+ { 0x0A3F, 52561 },
+ { 0x0A40, 52585 },
+ { 0x0A41, 52565 },
+ { 0x0A42, 52593 },
+ { 0x0A47, 52581 },
+ { 0x0A48, 52573 },
+ { 0x0A4B, 52589 },
+ { 0x0A4C, 52577 },
+ { 0x0A4D, 52518 },
+ { 0x0A51, 52515 },
+ { 0x0A59, 52735 },
+ { 0x0A5A, 52732 },
+ { 0x0A5B, 52678 },
+ { 0x0A5C, 52717 },
+ { 0x0A5E, 52627 },
+ { 0x0A66, 52547 },
+ { 0x0A67, 52529 },
+ { 0x0A68, 52535 },
+ { 0x0A69, 52556 },
+ { 0x0A6A, 52541 },
+ { 0x0A6B, 52538 },
+ { 0x0A6C, 52532 },
+ { 0x0A6D, 52553 },
+ { 0x0A6E, 52550 },
+ { 0x0A6F, 52544 },
+ { 0x0A70, 52559 },
+ { 0x0A71, 52527 },
+ { 0x0A72, 52501 },
+ { 0x0A73, 52503 },
+ { 0x0A74, 52498 },
+ { 0x0A75, 52521 },
+ { 0x0A81, 52240 },
+ { 0x0A82, 52234 },
+ { 0x0A83, 52231 },
+ { 0x0A85, 52350 },
+ { 0x0A86, 52365 },
+ { 0x0A87, 52356 },
+ { 0x0A88, 52389 },
+ { 0x0A89, 52362 },
+ { 0x0A8A, 52419 },
+ { 0x0A8B, 52486 },
+ { 0x0A8C, 52482 },
+ { 0x0A8D, 52342 },
+ { 0x0A8F, 52353 },
+ { 0x0A90, 52368 },
+ { 0x0A91, 52346 },
+ { 0x0A93, 52359 },
+ { 0x0A94, 52371 },
+ { 0x0A95, 52395 },
+ { 0x0A96, 52446 },
+ { 0x0A97, 52383 },
+ { 0x0A98, 52440 },
+ { 0x0A99, 52452 },
+ { 0x0A9A, 52377 },
+ { 0x0A9B, 52431 },
+ { 0x0A9C, 52392 },
+ { 0x0A9D, 52443 },
+ { 0x0A9E, 52458 },
+ { 0x0A9F, 52473 },
+ { 0x0AA0, 52479 },
+ { 0x0AA1, 52434 },
+ { 0x0AA2, 52476 },
+ { 0x0AA3, 52455 },
+ { 0x0AA4, 52416 },
+ { 0x0AA5, 52470 },
+ { 0x0AA6, 52380 },
+ { 0x0AA7, 52437 },
+ { 0x0AA8, 52404 },
+ { 0x0AAA, 52407 },
+ { 0x0AAB, 52461 },
+ { 0x0AAC, 52374 },
+ { 0x0AAD, 52428 },
+ { 0x0AAE, 52401 },
+ { 0x0AAF, 52425 },
+ { 0x0AB0, 52410 },
+ { 0x0AB2, 52398 },
+ { 0x0AB3, 52449 },
+ { 0x0AB5, 52422 },
+ { 0x0AB6, 52464 },
+ { 0x0AB7, 52467 },
+ { 0x0AB8, 52413 },
+ { 0x0AB9, 52386 },
+ { 0x0ABC, 52225 },
+ { 0x0ABD, 52237 },
+ { 0x0ABE, 52292 },
+ { 0x0ABF, 52280 },
+ { 0x0AC0, 52304 },
+ { 0x0AC1, 52288 },
+ { 0x0AC2, 52308 },
+ { 0x0AC3, 52327 },
+ { 0x0AC4, 52337 },
+ { 0x0AC5, 52312 },
+ { 0x0AC7, 52276 },
+ { 0x0AC8, 52296 },
+ { 0x0AC9, 52317 },
+ { 0x0ACB, 52284 },
+ { 0x0ACC, 52300 },
+ { 0x0ACD, 52228 },
+ { 0x0AD0, 52223 },
+ { 0x0AE0, 52494 },
+ { 0x0AE1, 52490 },
+ { 0x0AE2, 52322 },
+ { 0x0AE3, 52332 },
+ { 0x0AE6, 52261 },
+ { 0x0AE7, 52243 },
+ { 0x0AE8, 52249 },
+ { 0x0AE9, 52270 },
+ { 0x0AEA, 52255 },
+ { 0x0AEB, 52252 },
+ { 0x0AEC, 52246 },
+ { 0x0AED, 52267 },
+ { 0x0AEE, 52264 },
+ { 0x0AEF, 52258 },
+ { 0x0AF1, 52273 },
+ { 0x0B01, 21480 },
+ { 0x0B02, 21474 },
+ { 0x0B03, 21471 },
+ { 0x0B05, 21571 },
+ { 0x0B06, 21586 },
+ { 0x0B07, 21577 },
+ { 0x0B08, 21610 },
+ { 0x0B09, 21583 },
+ { 0x0B0A, 21640 },
+ { 0x0B0B, 21719 },
+ { 0x0B0C, 21715 },
+ { 0x0B0F, 21574 },
+ { 0x0B10, 21589 },
+ { 0x0B13, 21580 },
+ { 0x0B14, 21592 },
+ { 0x0B15, 21616 },
+ { 0x0B16, 21670 },
+ { 0x0B17, 21604 },
+ { 0x0B18, 21664 },
+ { 0x0B19, 21676 },
+ { 0x0B1A, 21598 },
+ { 0x0B1B, 21655 },
+ { 0x0B1C, 21613 },
+ { 0x0B1D, 21667 },
+ { 0x0B1E, 21682 },
+ { 0x0B1F, 21703 },
+ { 0x0B20, 21712 },
+ { 0x0B21, 21658 },
+ { 0x0B22, 21709 },
+ { 0x0B23, 21679 },
+ { 0x0B24, 21637 },
+ { 0x0B25, 21700 },
+ { 0x0B26, 21601 },
+ { 0x0B27, 21661 },
+ { 0x0B28, 21625 },
+ { 0x0B2A, 21628 },
+ { 0x0B2B, 21685 },
+ { 0x0B2C, 21595 },
+ { 0x0B2D, 21652 },
+ { 0x0B2E, 21622 },
+ { 0x0B2F, 21649 },
+ { 0x0B30, 21631 },
+ { 0x0B32, 21619 },
+ { 0x0B33, 21673 },
+ { 0x0B35, 21643 },
+ { 0x0B36, 21694 },
+ { 0x0B37, 21697 },
+ { 0x0B38, 21634 },
+ { 0x0B39, 21607 },
+ { 0x0B3C, 21465 },
+ { 0x0B3D, 21477 },
+ { 0x0B3E, 21529 },
+ { 0x0B3F, 21517 },
+ { 0x0B40, 21541 },
+ { 0x0B41, 21525 },
+ { 0x0B42, 21545 },
+ { 0x0B43, 21554 },
+ { 0x0B44, 21564 },
+ { 0x0B47, 21513 },
+ { 0x0B48, 21533 },
+ { 0x0B4B, 21521 },
+ { 0x0B4C, 21537 },
+ { 0x0B4D, 21468 },
+ { 0x0B56, 21457 },
+ { 0x0B57, 21461 },
+ { 0x0B5C, 21691 },
+ { 0x0B5D, 21688 },
+ { 0x0B5F, 21706 },
+ { 0x0B60, 21727 },
+ { 0x0B61, 21723 },
+ { 0x0B62, 21549 },
+ { 0x0B63, 21559 },
+ { 0x0B66, 21501 },
+ { 0x0B67, 21483 },
+ { 0x0B68, 21489 },
+ { 0x0B69, 21510 },
+ { 0x0B6A, 21495 },
+ { 0x0B6B, 21492 },
+ { 0x0B6C, 21486 },
+ { 0x0B6D, 21507 },
+ { 0x0B6E, 21504 },
+ { 0x0B6F, 21498 },
+ { 0x0B70, 21569 },
+ { 0x0B71, 21646 },
+ { 0x0B82, 22772 },
+ { 0x0B83, 22769 },
+ { 0x0B85, 22864 },
+ { 0x0B86, 22879 },
+ { 0x0B87, 22870 },
+ { 0x0B88, 22897 },
+ { 0x0B89, 22876 },
+ { 0x0B8A, 22930 },
+ { 0x0B8E, 22867 },
+ { 0x0B8F, 22891 },
+ { 0x0B90, 22882 },
+ { 0x0B92, 22873 },
+ { 0x0B93, 22915 },
+ { 0x0B94, 22885 },
+ { 0x0B95, 22903 },
+ { 0x0B99, 22942 },
+ { 0x0B9A, 22888 },
+ { 0x0B9C, 22900 },
+ { 0x0B9E, 22948 },
+ { 0x0B9F, 22960 },
+ { 0x0BA3, 22945 },
+ { 0x0BA4, 22927 },
+ { 0x0BA8, 22912 },
+ { 0x0BA9, 22966 },
+ { 0x0BAA, 22918 },
+ { 0x0BAE, 22909 },
+ { 0x0BAF, 22936 },
+ { 0x0BB0, 22921 },
+ { 0x0BB1, 22951 },
+ { 0x0BB2, 22906 },
+ { 0x0BB3, 22939 },
+ { 0x0BB4, 22963 },
+ { 0x0BB5, 22933 },
+ { 0x0BB6, 22954 },
+ { 0x0BB7, 22957 },
+ { 0x0BB8, 22924 },
+ { 0x0BB9, 22894 },
+ { 0x0BBE, 22833 },
+ { 0x0BBF, 22821 },
+ { 0x0BC0, 22849 },
+ { 0x0BC1, 22829 },
+ { 0x0BC2, 22857 },
+ { 0x0BC6, 22817 },
+ { 0x0BC7, 22845 },
+ { 0x0BC8, 22837 },
+ { 0x0BCA, 22825 },
+ { 0x0BCB, 22853 },
+ { 0x0BCC, 22841 },
+ { 0x0BCD, 22766 },
+ { 0x0BD0, 22761 },
+ { 0x0BD7, 22757 },
+ { 0x0BE6, 22799 },
+ { 0x0BE7, 22781 },
+ { 0x0BE8, 22787 },
+ { 0x0BE9, 22808 },
+ { 0x0BEA, 22793 },
+ { 0x0BEB, 22790 },
+ { 0x0BEC, 22784 },
+ { 0x0BED, 22805 },
+ { 0x0BEE, 22802 },
+ { 0x0BEF, 22796 },
+ { 0x0BF0, 22977 },
+ { 0x0BF1, 22969 },
+ { 0x0BF2, 22973 },
+ { 0x0BF3, 22763 },
+ { 0x0BF4, 22811 },
+ { 0x0BF5, 22775 },
+ { 0x0BF6, 22778 },
+ { 0x0BF7, 22861 },
+ { 0x0BF8, 22753 },
+ { 0x0BF9, 22814 },
+ { 0x0BFA, 22980 },
+ { 0x0C01, 37149 },
+ { 0x0C02, 37143 },
+ { 0x0C03, 37140 },
+ { 0x0C05, 37249 },
+ { 0x0C06, 37264 },
+ { 0x0C07, 37255 },
+ { 0x0C08, 37291 },
+ { 0x0C09, 37261 },
+ { 0x0C0A, 37324 },
+ { 0x0C0B, 37400 },
+ { 0x0C0C, 37396 },
+ { 0x0C0E, 37252 },
+ { 0x0C0F, 37282 },
+ { 0x0C10, 37267 },
+ { 0x0C12, 37258 },
+ { 0x0C13, 37309 },
+ { 0x0C14, 37270 },
+ { 0x0C15, 37297 },
+ { 0x0C16, 37354 },
+ { 0x0C17, 37285 },
+ { 0x0C18, 37348 },
+ { 0x0C19, 37360 },
+ { 0x0C1A, 37276 },
+ { 0x0C1B, 37336 },
+ { 0x0C1C, 37294 },
+ { 0x0C1D, 37351 },
+ { 0x0C1E, 37366 },
+ { 0x0C1F, 37387 },
+ { 0x0C20, 37393 },
+ { 0x0C21, 37339 },
+ { 0x0C22, 37390 },
+ { 0x0C23, 37363 },
+ { 0x0C24, 37321 },
+ { 0x0C25, 37381 },
+ { 0x0C26, 37279 },
+ { 0x0C27, 37342 },
+ { 0x0C28, 37306 },
+ { 0x0C2A, 37312 },
+ { 0x0C2B, 37369 },
+ { 0x0C2C, 37273 },
+ { 0x0C2D, 37333 },
+ { 0x0C2E, 37303 },
+ { 0x0C2F, 37330 },
+ { 0x0C30, 37315 },
+ { 0x0C31, 37372 },
+ { 0x0C32, 37300 },
+ { 0x0C33, 37357 },
+ { 0x0C35, 37327 },
+ { 0x0C36, 37375 },
+ { 0x0C37, 37378 },
+ { 0x0C38, 37318 },
+ { 0x0C39, 37288 },
+ { 0x0C3D, 37146 },
+ { 0x0C3E, 37198 },
+ { 0x0C3F, 37186 },
+ { 0x0C40, 37214 },
+ { 0x0C41, 37194 },
+ { 0x0C42, 37222 },
+ { 0x0C43, 37231 },
+ { 0x0C44, 37241 },
+ { 0x0C46, 37182 },
+ { 0x0C47, 37210 },
+ { 0x0C48, 37202 },
+ { 0x0C4A, 37190 },
+ { 0x0C4B, 37218 },
+ { 0x0C4C, 37206 },
+ { 0x0C4D, 37137 },
+ { 0x0C55, 37246 },
+ { 0x0C56, 37130 },
+ { 0x0C58, 37384 },
+ { 0x0C59, 37345 },
+ { 0x0C60, 37408 },
+ { 0x0C61, 37404 },
+ { 0x0C62, 37226 },
+ { 0x0C63, 37236 },
+ { 0x0C66, 37170 },
+ { 0x0C67, 37152 },
+ { 0x0C68, 37158 },
+ { 0x0C69, 37179 },
+ { 0x0C6A, 37164 },
+ { 0x0C6B, 37161 },
+ { 0x0C6C, 37155 },
+ { 0x0C6D, 37176 },
+ { 0x0C6E, 37173 },
+ { 0x0C6F, 37167 },
+ { 0x0C78, 37448 },
+ { 0x0C79, 37412 },
+ { 0x0C7A, 37430 },
+ { 0x0C7B, 37457 },
+ { 0x0C7C, 37421 },
+ { 0x0C7D, 37439 },
+ { 0x0C7E, 37466 },
+ { 0x0C7F, 37134 },
+ { 0x0C82, 40655 },
+ { 0x0C83, 40652 },
+ { 0x0C85, 40764 },
+ { 0x0C86, 40779 },
+ { 0x0C87, 40770 },
+ { 0x0C88, 40809 },
+ { 0x0C89, 40776 },
+ { 0x0C8A, 40842 },
+ { 0x0C8B, 40912 },
+ { 0x0C8C, 40908 },
+ { 0x0C8E, 40767 },
+ { 0x0C8F, 40797 },
+ { 0x0C90, 40782 },
+ { 0x0C92, 40773 },
+ { 0x0C93, 40827 },
+ { 0x0C94, 40785 },
+ { 0x0C95, 40815 },
+ { 0x0C96, 40869 },
+ { 0x0C97, 40803 },
+ { 0x0C98, 40863 },
+ { 0x0C99, 40875 },
+ { 0x0C9A, 40791 },
+ { 0x0C9B, 40854 },
+ { 0x0C9C, 40812 },
+ { 0x0C9D, 40866 },
+ { 0x0C9E, 40881 },
+ { 0x0C9F, 40899 },
+ { 0x0CA0, 40905 },
+ { 0x0CA1, 40857 },
+ { 0x0CA2, 40902 },
+ { 0x0CA3, 40878 },
+ { 0x0CA4, 40839 },
+ { 0x0CA5, 40896 },
+ { 0x0CA6, 40794 },
+ { 0x0CA7, 40860 },
+ { 0x0CA8, 40824 },
+ { 0x0CAA, 40830 },
+ { 0x0CAB, 40884 },
+ { 0x0CAC, 40788 },
+ { 0x0CAD, 40851 },
+ { 0x0CAE, 40821 },
+ { 0x0CAF, 40848 },
+ { 0x0CB0, 40833 },
+ { 0x0CB1, 40887 },
+ { 0x0CB2, 40818 },
+ { 0x0CB3, 40872 },
+ { 0x0CB5, 40845 },
+ { 0x0CB6, 40890 },
+ { 0x0CB7, 40893 },
+ { 0x0CB8, 40836 },
+ { 0x0CB9, 40806 },
+ { 0x0CBC, 40646 },
+ { 0x0CBD, 40658 },
+ { 0x0CBE, 40713 },
+ { 0x0CBF, 40701 },
+ { 0x0CC0, 40729 },
+ { 0x0CC1, 40709 },
+ { 0x0CC2, 40737 },
+ { 0x0CC3, 40746 },
+ { 0x0CC4, 40756 },
+ { 0x0CC6, 40697 },
+ { 0x0CC7, 40725 },
+ { 0x0CC8, 40717 },
+ { 0x0CCA, 40705 },
+ { 0x0CCB, 40733 },
+ { 0x0CCC, 40721 },
+ { 0x0CCD, 40649 },
+ { 0x0CD5, 40761 },
+ { 0x0CD6, 40642 },
+ { 0x0CDE, 40800 },
+ { 0x0CE0, 40920 },
+ { 0x0CE1, 40916 },
+ { 0x0CE2, 40741 },
+ { 0x0CE3, 40751 },
+ { 0x0CE6, 40685 },
+ { 0x0CE7, 40667 },
+ { 0x0CE8, 40673 },
+ { 0x0CE9, 40694 },
+ { 0x0CEA, 40679 },
+ { 0x0CEB, 40676 },
+ { 0x0CEC, 40670 },
+ { 0x0CED, 40691 },
+ { 0x0CEE, 40688 },
+ { 0x0CEF, 40682 },
+ { 0x0CF1, 40661 },
+ { 0x0CF2, 40664 },
+ { 0x0D02, 64805 },
+ { 0x0D03, 64802 },
+ { 0x0D05, 64905 },
+ { 0x0D06, 64920 },
+ { 0x0D07, 64911 },
+ { 0x0D08, 64947 },
+ { 0x0D09, 64917 },
+ { 0x0D0A, 64980 },
+ { 0x0D0B, 65077 },
+ { 0x0D0C, 65073 },
+ { 0x0D0E, 64908 },
+ { 0x0D0F, 64938 },
+ { 0x0D10, 64923 },
+ { 0x0D12, 64914 },
+ { 0x0D13, 64965 },
+ { 0x0D14, 64926 },
+ { 0x0D15, 64953 },
+ { 0x0D16, 65007 },
+ { 0x0D17, 64941 },
+ { 0x0D18, 65001 },
+ { 0x0D19, 65013 },
+ { 0x0D1A, 64932 },
+ { 0x0D1B, 64992 },
+ { 0x0D1C, 64950 },
+ { 0x0D1D, 65004 },
+ { 0x0D1E, 65019 },
+ { 0x0D1F, 65037 },
+ { 0x0D20, 65046 },
+ { 0x0D21, 64995 },
+ { 0x0D22, 65040 },
+ { 0x0D23, 65016 },
+ { 0x0D24, 64977 },
+ { 0x0D25, 65034 },
+ { 0x0D26, 64935 },
+ { 0x0D27, 64998 },
+ { 0x0D28, 64962 },
+ { 0x0D2A, 64968 },
+ { 0x0D2B, 65022 },
+ { 0x0D2C, 64929 },
+ { 0x0D2D, 64989 },
+ { 0x0D2E, 64959 },
+ { 0x0D2F, 64986 },
+ { 0x0D30, 64971 },
+ { 0x0D31, 65025 },
+ { 0x0D32, 64956 },
+ { 0x0D33, 65010 },
+ { 0x0D34, 65043 },
+ { 0x0D35, 64983 },
+ { 0x0D36, 65028 },
+ { 0x0D37, 65031 },
+ { 0x0D38, 64974 },
+ { 0x0D39, 64944 },
+ { 0x0D3D, 64808 },
+ { 0x0D3E, 64857 },
+ { 0x0D3F, 64845 },
+ { 0x0D40, 64873 },
+ { 0x0D41, 64853 },
+ { 0x0D42, 64881 },
+ { 0x0D43, 64890 },
+ { 0x0D44, 64900 },
+ { 0x0D46, 64841 },
+ { 0x0D47, 64869 },
+ { 0x0D48, 64861 },
+ { 0x0D4A, 64849 },
+ { 0x0D4B, 64877 },
+ { 0x0D4C, 64865 },
+ { 0x0D4D, 64799 },
+ { 0x0D57, 64792 },
+ { 0x0D60, 65085 },
+ { 0x0D61, 65081 },
+ { 0x0D62, 64885 },
+ { 0x0D63, 64895 },
+ { 0x0D66, 64829 },
+ { 0x0D67, 64811 },
+ { 0x0D68, 64817 },
+ { 0x0D69, 64838 },
+ { 0x0D6A, 64823 },
+ { 0x0D6B, 64820 },
+ { 0x0D6C, 64814 },
+ { 0x0D6D, 64835 },
+ { 0x0D6E, 64832 },
+ { 0x0D6F, 64826 },
+ { 0x0D70, 65097 },
+ { 0x0D71, 65089 },
+ { 0x0D72, 65093 },
+ { 0x0D73, 65104 },
+ { 0x0D74, 65100 },
+ { 0x0D75, 65108 },
+ { 0x0D79, 64796 },
+ { 0x0D7A, 65065 },
+ { 0x0D7B, 65057 },
+ { 0x0D7C, 65069 },
+ { 0x0D7D, 65053 },
+ { 0x0D7E, 65061 },
+ { 0x0D7F, 65049 },
+ { 0x0D82, 43201 },
+ { 0x0D83, 43198 },
+ { 0x0D85, 43293 },
+ { 0x0D86, 43308 },
+ { 0x0D87, 43311 },
+ { 0x0D88, 43395 },
+ { 0x0D89, 43299 },
+ { 0x0D8A, 43341 },
+ { 0x0D8B, 43305 },
+ { 0x0D8C, 43386 },
+ { 0x0D8D, 43401 },
+ { 0x0D8E, 43407 },
+ { 0x0D8F, 43398 },
+ { 0x0D90, 43404 },
+ { 0x0D91, 43296 },
+ { 0x0D92, 43332 },
+ { 0x0D93, 43314 },
+ { 0x0D94, 43302 },
+ { 0x0D95, 43351 },
+ { 0x0D96, 43317 },
+ { 0x0D9A, 43442 },
+ { 0x0D9B, 43482 },
+ { 0x0D9C, 43434 },
+ { 0x0D9D, 43474 },
+ { 0x0D9E, 43344 },
+ { 0x0D9F, 43361 },
+ { 0x0DA0, 43426 },
+ { 0x0DA1, 43466 },
+ { 0x0DA2, 43438 },
+ { 0x0DA3, 43478 },
+ { 0x0DA4, 43382 },
+ { 0x0DA5, 43377 },
+ { 0x0DA6, 43365 },
+ { 0x0DA7, 43458 },
+ { 0x0DA8, 43498 },
+ { 0x0DA9, 43454 },
+ { 0x0DAA, 43494 },
+ { 0x0DAB, 43414 },
+ { 0x0DAC, 43369 },
+ { 0x0DAD, 43450 },
+ { 0x0DAE, 43490 },
+ { 0x0DAF, 43430 },
+ { 0x0DB0, 43470 },
+ { 0x0DB1, 43324 },
+ { 0x0DB3, 43357 },
+ { 0x0DB4, 43446 },
+ { 0x0DB5, 43486 },
+ { 0x0DB6, 43422 },
+ { 0x0DB7, 43462 },
+ { 0x0DB8, 43348 },
+ { 0x0DB9, 43289 },
+ { 0x0DBA, 43392 },
+ { 0x0DBB, 43354 },
+ { 0x0DBD, 43320 },
+ { 0x0DC0, 43389 },
+ { 0x0DC1, 43373 },
+ { 0x0DC2, 43418 },
+ { 0x0DC3, 43328 },
+ { 0x0DC4, 43338 },
+ { 0x0DC5, 43410 },
+ { 0x0DC6, 43335 },
+ { 0x0DCA, 43195 },
+ { 0x0DCF, 43277 },
+ { 0x0DD0, 43244 },
+ { 0x0DD1, 43219 },
+ { 0x0DD2, 43234 },
+ { 0x0DD3, 43209 },
+ { 0x0DD4, 43239 },
+ { 0x0DD6, 43214 },
+ { 0x0DD8, 43285 },
+ { 0x0DD9, 43254 },
+ { 0x0DDA, 43204 },
+ { 0x0DDB, 43249 },
+ { 0x0DDC, 43265 },
+ { 0x0DDD, 43258 },
+ { 0x0DDE, 43271 },
+ { 0x0DDF, 43281 },
+ { 0x0DF2, 43229 },
+ { 0x0DF3, 43224 },
+ { 0x0DF4, 43502 },
+ { 0x0E01, 9790 },
+ { 0x0E02, 9880 },
+ { 0x0E03, 9888 },
+ { 0x0E04, 9892 },
+ { 0x0E05, 9884 },
+ { 0x0E06, 9896 },
+ { 0x0E07, 9920 },
+ { 0x0E08, 9864 },
+ { 0x0E09, 9876 },
+ { 0x0E0A, 9872 },
+ { 0x0E0B, 9828 },
+ { 0x0E0C, 9868 },
+ { 0x0E0D, 9860 },
+ { 0x0E0E, 9770 },
+ { 0x0E0F, 9848 },
+ { 0x0E10, 9936 },
+ { 0x0E11, 9956 },
+ { 0x0E12, 9952 },
+ { 0x0E13, 9813 },
+ { 0x0E14, 9766 },
+ { 0x0E15, 9844 },
+ { 0x0E16, 9944 },
+ { 0x0E17, 9948 },
+ { 0x0E18, 9940 },
+ { 0x0E19, 9809 },
+ { 0x0E1A, 9762 },
+ { 0x0E1B, 9817 },
+ { 0x0E1C, 9928 },
+ { 0x0E1D, 9774 },
+ { 0x0E1E, 9924 },
+ { 0x0E1F, 9778 },
+ { 0x0E20, 9932 },
+ { 0x0E21, 9805 },
+ { 0x0E22, 9856 },
+ { 0x0E23, 9821 },
+ { 0x0E24, 9825 },
+ { 0x0E25, 9794 },
+ { 0x0E26, 9802 },
+ { 0x0E27, 9852 },
+ { 0x0E28, 9840 },
+ { 0x0E29, 9836 },
+ { 0x0E2A, 9832 },
+ { 0x0E2B, 9782 },
+ { 0x0E2C, 9798 },
+ { 0x0E2D, 9758 },
+ { 0x0E2E, 9786 },
+ { 0x0E2F, 10039 },
+ { 0x0E30, 9960 },
+ { 0x0E31, 9916 },
+ { 0x0E32, 9980 },
+ { 0x0E33, 9998 },
+ { 0x0E34, 9968 },
+ { 0x0E35, 10002 },
+ { 0x0E36, 10006 },
+ { 0x0E37, 10014 },
+ { 0x0E38, 9976 },
+ { 0x0E39, 10010 },
+ { 0x0E3A, 10024 },
+ { 0x0E3F, 9754 },
+ { 0x0E40, 9964 },
+ { 0x0E41, 9984 },
+ { 0x0E42, 9972 },
+ { 0x0E43, 9988 },
+ { 0x0E44, 9993 },
+ { 0x0E45, 10045 },
+ { 0x0E46, 10027 },
+ { 0x0E47, 10036 },
+ { 0x0E48, 9900 },
+ { 0x0E49, 9904 },
+ { 0x0E4A, 9908 },
+ { 0x0E4B, 9912 },
+ { 0x0E4C, 10048 },
+ { 0x0E4D, 10030 },
+ { 0x0E4E, 10033 },
+ { 0x0E4F, 10021 },
+ { 0x0E50, 9742 },
+ { 0x0E51, 9724 },
+ { 0x0E52, 9730 },
+ { 0x0E53, 9751 },
+ { 0x0E54, 9736 },
+ { 0x0E55, 9733 },
+ { 0x0E56, 9727 },
+ { 0x0E57, 9748 },
+ { 0x0E58, 9745 },
+ { 0x0E59, 9739 },
+ { 0x0E5A, 10042 },
+ { 0x0E5B, 10018 },
+ { 0x0E81, 5948 },
+ { 0x0E82, 5989 },
+ { 0x0E84, 5985 },
+ { 0x0E87, 5993 },
+ { 0x0E88, 5926 },
+ { 0x0E8A, 5968 },
+ { 0x0E8D, 5996 },
+ { 0x0E94, 5929 },
+ { 0x0E95, 5976 },
+ { 0x0E96, 6011 },
+ { 0x0E97, 6007 },
+ { 0x0E99, 5962 },
+ { 0x0E9A, 5923 },
+ { 0x0E9B, 5965 },
+ { 0x0E9C, 6003 },
+ { 0x0E9D, 5932 },
+ { 0x0E9E, 5999 },
+ { 0x0E9F, 5936 },
+ { 0x0EA1, 5959 },
+ { 0x0EA2, 5982 },
+ { 0x0EA3, 5951 },
+ { 0x0EA5, 5955 },
+ { 0x0EA7, 5979 },
+ { 0x0EAA, 5972 },
+ { 0x0EAB, 5944 },
+ { 0x0EAD, 5920 },
+ { 0x0EAE, 5940 },
+ { 0x0EAF, 6015 },
+ { 0x0EB0, 5854 },
+ { 0x0EB1, 5910 },
+ { 0x0EB2, 5878 },
+ { 0x0EB3, 5886 },
+ { 0x0EB4, 5862 },
+ { 0x0EB5, 5898 },
+ { 0x0EB6, 5874 },
+ { 0x0EB7, 5906 },
+ { 0x0EB8, 5870 },
+ { 0x0EB9, 5902 },
+ { 0x0EBB, 5915 },
+ { 0x0EBC, 6019 },
+ { 0x0EBD, 6023 },
+ { 0x0EC0, 5858 },
+ { 0x0EC1, 5894 },
+ { 0x0EC2, 5866 },
+ { 0x0EC3, 5890 },
+ { 0x0EC4, 5882 },
+ { 0x0EC6, 5805 },
+ { 0x0EC8, 5808 },
+ { 0x0EC9, 5816 },
+ { 0x0ECA, 5812 },
+ { 0x0ECB, 5820 },
+ { 0x0ECC, 6027 },
+ { 0x0ECD, 6017 },
+ { 0x0ED0, 5842 },
+ { 0x0ED1, 5824 },
+ { 0x0ED2, 5830 },
+ { 0x0ED3, 5851 },
+ { 0x0ED4, 5836 },
+ { 0x0ED5, 5833 },
+ { 0x0ED6, 5827 },
+ { 0x0ED7, 5848 },
+ { 0x0ED8, 5845 },
+ { 0x0ED9, 5839 },
+ { 0x0EDC, 5802 },
+ { 0x0EDD, 5799 },
+ { 0x0F00, 44295 },
+ { 0x0F01, 43729 },
+ { 0x0F02, 43720 },
+ { 0x0F03, 43711 },
+ { 0x0F04, 43850 },
+ { 0x0F05, 43831 },
+ { 0x0F06, 43789 },
+ { 0x0F07, 43698 },
+ { 0x0F08, 43820 },
+ { 0x0F09, 43784 },
+ { 0x0F0A, 43705 },
+ { 0x0F0B, 43871 },
+ { 0x0F0C, 43866 },
+ { 0x0F0D, 43770 },
+ { 0x0F0E, 43752 },
+ { 0x0F0F, 43824 },
+ { 0x0F10, 43760 },
+ { 0x0F11, 43688 },
+ { 0x0F12, 43765 },
+ { 0x0F13, 43797 },
+ { 0x0F14, 43736 },
+ { 0x0F15, 44285 },
+ { 0x0F16, 44290 },
+ { 0x0F17, 44477 },
+ { 0x0F18, 44489 },
+ { 0x0F19, 44484 },
+ { 0x0F1A, 43937 },
+ { 0x0F1B, 43953 },
+ { 0x0F1C, 43942 },
+ { 0x0F1D, 43916 },
+ { 0x0F1E, 43932 },
+ { 0x0F1F, 43947 },
+ { 0x0F20, 44030 },
+ { 0x0F21, 43972 },
+ { 0x0F22, 43978 },
+ { 0x0F23, 44039 },
+ { 0x0F24, 43984 },
+ { 0x0F25, 43981 },
+ { 0x0F26, 43975 },
+ { 0x0F27, 44036 },
+ { 0x0F28, 44033 },
+ { 0x0F29, 44027 },
+ { 0x0F2A, 43987 },
+ { 0x0F2B, 43995 },
+ { 0x0F2C, 44023 },
+ { 0x0F2D, 44003 },
+ { 0x0F2E, 43999 },
+ { 0x0F2F, 43991 },
+ { 0x0F30, 44019 },
+ { 0x0F31, 44015 },
+ { 0x0F32, 44007 },
+ { 0x0F33, 44011 },
+ { 0x0F34, 43773 },
+ { 0x0F35, 43740 },
+ { 0x0F36, 43805 },
+ { 0x0F37, 43746 },
+ { 0x0F38, 43674 },
+ { 0x0F39, 43694 },
+ { 0x0F3A, 43683 },
+ { 0x0F3B, 43678 },
+ { 0x0F3C, 43669 },
+ { 0x0F3D, 43664 },
+ { 0x0F3E, 43908 },
+ { 0x0F3F, 43894 },
+ { 0x0F40, 44132 },
+ { 0x0F41, 44183 },
+ { 0x0F42, 44123 },
+ { 0x0F43, 44180 },
+ { 0x0F44, 44189 },
+ { 0x0F45, 44117 },
+ { 0x0F46, 44168 },
+ { 0x0F47, 44129 },
+ { 0x0F49, 44195 },
+ { 0x0F4A, 44216 },
+ { 0x0F4B, 44234 },
+ { 0x0F4C, 44171 },
+ { 0x0F4D, 44222 },
+ { 0x0F4E, 44192 },
+ { 0x0F4F, 44153 },
+ { 0x0F50, 44210 },
+ { 0x0F51, 44120 },
+ { 0x0F52, 44174 },
+ { 0x0F53, 44141 },
+ { 0x0F54, 44144 },
+ { 0x0F55, 44198 },
+ { 0x0F56, 44114 },
+ { 0x0F57, 44165 },
+ { 0x0F58, 44138 },
+ { 0x0F59, 44213 },
+ { 0x0F5A, 44231 },
+ { 0x0F5B, 44177 },
+ { 0x0F5C, 44225 },
+ { 0x0F5D, 44156 },
+ { 0x0F5E, 44219 },
+ { 0x0F5F, 44162 },
+ { 0x0F60, 44111 },
+ { 0x0F61, 44159 },
+ { 0x0F62, 44147 },
+ { 0x0F63, 44135 },
+ { 0x0F64, 44204 },
+ { 0x0F65, 44207 },
+ { 0x0F66, 44150 },
+ { 0x0F67, 44126 },
+ { 0x0F68, 44108 },
+ { 0x0F69, 44228 },
+ { 0x0F6A, 44237 },
+ { 0x0F6B, 44186 },
+ { 0x0F6C, 44201 },
+ { 0x0F71, 44058 },
+ { 0x0F72, 44046 },
+ { 0x0F73, 44066 },
+ { 0x0F74, 44054 },
+ { 0x0F75, 44074 },
+ { 0x0F76, 44083 },
+ { 0x0F77, 44093 },
+ { 0x0F78, 44078 },
+ { 0x0F79, 44088 },
+ { 0x0F7A, 44042 },
+ { 0x0F7B, 44062 },
+ { 0x0F7C, 44050 },
+ { 0x0F7D, 44070 },
+ { 0x0F7E, 43958 },
+ { 0x0F7F, 43964 },
+ { 0x0F80, 44098 },
+ { 0x0F81, 44103 },
+ { 0x0F82, 43898 },
+ { 0x0F83, 43904 },
+ { 0x0F84, 43847 },
+ { 0x0F85, 43828 },
+ { 0x0F86, 43890 },
+ { 0x0F87, 43968 },
+ { 0x0F88, 43885 },
+ { 0x0F89, 43912 },
+ { 0x0F8A, 43875 },
+ { 0x0F8B, 43880 },
+ { 0x0F90, 44330 },
+ { 0x0F91, 44398 },
+ { 0x0F92, 44318 },
+ { 0x0F93, 44394 },
+ { 0x0F94, 44402 },
+ { 0x0F95, 44310 },
+ { 0x0F96, 44378 },
+ { 0x0F97, 44326 },
+ { 0x0F99, 44410 },
+ { 0x0F9A, 44434 },
+ { 0x0F9B, 44458 },
+ { 0x0F9C, 44382 },
+ { 0x0F9D, 44442 },
+ { 0x0F9E, 44406 },
+ { 0x0F9F, 44358 },
+ { 0x0FA0, 44426 },
+ { 0x0FA1, 44314 },
+ { 0x0FA2, 44386 },
+ { 0x0FA3, 44342 },
+ { 0x0FA4, 44346 },
+ { 0x0FA5, 44414 },
+ { 0x0FA6, 44306 },
+ { 0x0FA7, 44374 },
+ { 0x0FA8, 44338 },
+ { 0x0FA9, 44430 },
+ { 0x0FAA, 44454 },
+ { 0x0FAB, 44390 },
+ { 0x0FAC, 44446 },
+ { 0x0FAD, 44362 },
+ { 0x0FAE, 44438 },
+ { 0x0FAF, 44370 },
+ { 0x0FB0, 44302 },
+ { 0x0FB1, 44366 },
+ { 0x0FB2, 44350 },
+ { 0x0FB3, 44334 },
+ { 0x0FB4, 44418 },
+ { 0x0FB5, 44422 },
+ { 0x0FB6, 44354 },
+ { 0x0FB7, 44322 },
+ { 0x0FB8, 44298 },
+ { 0x0FB9, 44450 },
+ { 0x0FBA, 44467 },
+ { 0x0FBB, 44472 },
+ { 0x0FBC, 44462 },
+ { 0x0FBE, 43653 },
+ { 0x0FBF, 43657 },
+ { 0x0FC0, 44504 },
+ { 0x0FC1, 44509 },
+ { 0x0FC2, 44494 },
+ { 0x0FC3, 44499 },
+ { 0x0FC4, 44273 },
+ { 0x0FC5, 44263 },
+ { 0x0FC6, 44281 },
+ { 0x0FC7, 44267 },
+ { 0x0FC8, 44277 },
+ { 0x0FC9, 44241 },
+ { 0x0FCA, 44257 },
+ { 0x0FCB, 44251 },
+ { 0x0FCC, 44245 },
+ { 0x0FCE, 43926 },
+ { 0x0FCF, 43921 },
+ { 0x0FD0, 43777 },
+ { 0x0FD1, 43813 },
+ { 0x0FD2, 43756 },
+ { 0x0FD3, 43857 },
+ { 0x0FD4, 43838 },
+ { 0x1000, 42482 },
+ { 0x1001, 42533 },
+ { 0x1002, 42470 },
+ { 0x1003, 42527 },
+ { 0x1004, 42559 },
+ { 0x1005, 42464 },
+ { 0x1006, 42518 },
+ { 0x1007, 42479 },
+ { 0x1008, 42530 },
+ { 0x1009, 42565 },
+ { 0x100A, 42586 },
+ { 0x100B, 42580 },
+ { 0x100C, 42650 },
+ { 0x100D, 42521 },
+ { 0x100E, 42583 },
+ { 0x100F, 42562 },
+ { 0x1010, 42503 },
+ { 0x1011, 42577 },
+ { 0x1012, 42467 },
+ { 0x1013, 42524 },
+ { 0x1014, 42491 },
+ { 0x1015, 42494 },
+ { 0x1016, 42568 },
+ { 0x1017, 42461 },
+ { 0x1018, 42515 },
+ { 0x1019, 42488 },
+ { 0x101A, 42512 },
+ { 0x101B, 42497 },
+ { 0x101C, 42485 },
+ { 0x101D, 42509 },
+ { 0x101E, 42500 },
+ { 0x101F, 42473 },
+ { 0x1020, 42536 },
+ { 0x1021, 42443 },
+ { 0x1022, 42594 },
+ { 0x1023, 42449 },
+ { 0x1024, 42476 },
+ { 0x1025, 42455 },
+ { 0x1026, 42506 },
+ { 0x1027, 42446 },
+ { 0x1028, 42539 },
+ { 0x1029, 42452 },
+ { 0x102A, 42458 },
+ { 0x102B, 42389 },
+ { 0x102C, 42329 },
+ { 0x102D, 42321 },
+ { 0x102E, 42337 },
+ { 0x102F, 42325 },
+ { 0x1030, 42341 },
+ { 0x1031, 42312 },
+ { 0x1032, 42333 },
+ { 0x1033, 42350 },
+ { 0x1034, 42345 },
+ { 0x1035, 42316 },
+ { 0x1036, 42266 },
+ { 0x1037, 42179 },
+ { 0x1038, 42233 },
+ { 0x1039, 42227 },
+ { 0x103A, 42183 },
+ { 0x103B, 42767 },
+ { 0x103C, 42757 },
+ { 0x103D, 42762 },
+ { 0x103E, 42752 },
+ { 0x103F, 42653 },
+ { 0x1040, 42300 },
+ { 0x1041, 42282 },
+ { 0x1042, 42288 },
+ { 0x1043, 42309 },
+ { 0x1044, 42294 },
+ { 0x1045, 42291 },
+ { 0x1046, 42285 },
+ { 0x1047, 42306 },
+ { 0x1048, 42303 },
+ { 0x1049, 42297 },
+ { 0x104A, 42223 },
+ { 0x104B, 42230 },
+ { 0x104C, 42719 },
+ { 0x104D, 42722 },
+ { 0x104E, 42725 },
+ { 0x104F, 42716 },
+ { 0x1050, 42571 },
+ { 0x1051, 42574 },
+ { 0x1052, 42684 },
+ { 0x1053, 42692 },
+ { 0x1054, 42680 },
+ { 0x1055, 42688 },
+ { 0x1056, 42414 },
+ { 0x1057, 42424 },
+ { 0x1058, 42409 },
+ { 0x1059, 42419 },
+ { 0x105A, 42555 },
+ { 0x105B, 42551 },
+ { 0x105C, 42543 },
+ { 0x105D, 42547 },
+ { 0x105E, 42740 },
+ { 0x105F, 42734 },
+ { 0x1060, 42728 },
+ { 0x1061, 42589 },
+ { 0x1062, 42361 },
+ { 0x1063, 42276 },
+ { 0x1064, 42269 },
+ { 0x1065, 42702 },
+ { 0x1066, 42696 },
+ { 0x1067, 42429 },
+ { 0x1068, 42436 },
+ { 0x1069, 42236 },
+ { 0x106A, 42242 },
+ { 0x106B, 42248 },
+ { 0x106C, 42254 },
+ { 0x106D, 42260 },
+ { 0x106E, 42662 },
+ { 0x106F, 42668 },
+ { 0x1070, 42674 },
+ { 0x1071, 42355 },
+ { 0x1072, 42404 },
+ { 0x1073, 42394 },
+ { 0x1074, 42399 },
+ { 0x1075, 42622 },
+ { 0x1076, 42634 },
+ { 0x1077, 42614 },
+ { 0x1078, 42602 },
+ { 0x1079, 42630 },
+ { 0x107A, 42638 },
+ { 0x107B, 42606 },
+ { 0x107C, 42626 },
+ { 0x107D, 42642 },
+ { 0x107E, 42610 },
+ { 0x107F, 42598 },
+ { 0x1080, 42646 },
+ { 0x1081, 42618 },
+ { 0x1082, 42746 },
+ { 0x1083, 42378 },
+ { 0x1084, 42367 },
+ { 0x1085, 42372 },
+ { 0x1086, 42383 },
+ { 0x1087, 42186 },
+ { 0x1088, 42190 },
+ { 0x1089, 42194 },
+ { 0x108A, 42198 },
+ { 0x108B, 42202 },
+ { 0x108C, 42207 },
+ { 0x108D, 42212 },
+ { 0x108E, 42657 },
+ { 0x108F, 42218 },
+ { 0x1090, 42163 },
+ { 0x1091, 42139 },
+ { 0x1092, 42147 },
+ { 0x1093, 42175 },
+ { 0x1094, 42155 },
+ { 0x1095, 42151 },
+ { 0x1096, 42143 },
+ { 0x1097, 42171 },
+ { 0x1098, 42167 },
+ { 0x1099, 42159 },
+ { 0x109E, 42708 },
+ { 0x109F, 42712 },
+ { 0x10A0, 52068 },
+ { 0x10A1, 52096 },
+ { 0x10A2, 52112 },
+ { 0x10A3, 52108 },
+ { 0x10A4, 52072 },
+ { 0x10A5, 52176 },
+ { 0x10A6, 52184 },
+ { 0x10A7, 52168 },
+ { 0x10A8, 52080 },
+ { 0x10A9, 52136 },
+ { 0x10AA, 52140 },
+ { 0x10AB, 52144 },
+ { 0x10AC, 52148 },
+ { 0x10AD, 52084 },
+ { 0x10AE, 52152 },
+ { 0x10AF, 52216 },
+ { 0x10B0, 52160 },
+ { 0x10B1, 52164 },
+ { 0x10B2, 52172 },
+ { 0x10B3, 52088 },
+ { 0x10B4, 52208 },
+ { 0x10B5, 52204 },
+ { 0x10B6, 52196 },
+ { 0x10B7, 52156 },
+ { 0x10B8, 52212 },
+ { 0x10B9, 52192 },
+ { 0x10BA, 52100 },
+ { 0x10BB, 52132 },
+ { 0x10BC, 52104 },
+ { 0x10BD, 52188 },
+ { 0x10BE, 52180 },
+ { 0x10BF, 52200 },
+ { 0x10C0, 52116 },
+ { 0x10C1, 52076 },
+ { 0x10C2, 52124 },
+ { 0x10C3, 52092 },
+ { 0x10C4, 52120 },
+ { 0x10C5, 52128 },
+ { 0x10D0, 51938 },
+ { 0x10D1, 51968 },
+ { 0x10D2, 51980 },
+ { 0x10D3, 51977 },
+ { 0x10D4, 51941 },
+ { 0x10D5, 52028 },
+ { 0x10D6, 52034 },
+ { 0x10D7, 52022 },
+ { 0x10D8, 51950 },
+ { 0x10D9, 51998 },
+ { 0x10DA, 52001 },
+ { 0x10DB, 52004 },
+ { 0x10DC, 52007 },
+ { 0x10DD, 51953 },
+ { 0x10DE, 52010 },
+ { 0x10DF, 52058 },
+ { 0x10E0, 52016 },
+ { 0x10E1, 52019 },
+ { 0x10E2, 52025 },
+ { 0x10E3, 51956 },
+ { 0x10E4, 52052 },
+ { 0x10E5, 52049 },
+ { 0x10E6, 52043 },
+ { 0x10E7, 52013 },
+ { 0x10E8, 52055 },
+ { 0x10E9, 52040 },
+ { 0x10EA, 51971 },
+ { 0x10EB, 51995 },
+ { 0x10EC, 51974 },
+ { 0x10ED, 52037 },
+ { 0x10EE, 52031 },
+ { 0x10EF, 52046 },
+ { 0x10F0, 51983 },
+ { 0x10F1, 51947 },
+ { 0x10F2, 51989 },
+ { 0x10F3, 51959 },
+ { 0x10F4, 51986 },
+ { 0x10F5, 51992 },
+ { 0x10F6, 51944 },
+ { 0x10F7, 51962 },
+ { 0x10F8, 52061 },
+ { 0x10F9, 52064 },
+ { 0x10FA, 51965 },
+ { 0x10FB, 52220 },
+ { 0x10FC, 54786 },
+ { 0x1100, 32202 },
+ { 0x1101, 32310 },
+ { 0x1102, 32190 },
+ { 0x1103, 32205 },
+ { 0x1104, 32313 },
+ { 0x1105, 32196 },
+ { 0x1106, 32187 },
+ { 0x1107, 32193 },
+ { 0x1108, 32268 },
+ { 0x1109, 32175 },
+ { 0x110A, 32226 },
+ { 0x110B, 32184 },
+ { 0x110C, 32178 },
+ { 0x110D, 32256 },
+ { 0x110E, 32208 },
+ { 0x110F, 32211 },
+ { 0x1110, 32220 },
+ { 0x1111, 32217 },
+ { 0x1112, 32181 },
+ { 0x1113, 32328 },
+ { 0x1114, 32265 },
+ { 0x1115, 32331 },
+ { 0x1116, 32289 },
+ { 0x1117, 32391 },
+ { 0x1118, 32301 },
+ { 0x1119, 32271 },
+ { 0x111A, 32298 },
+ { 0x111B, 32376 },
+ { 0x111C, 32286 },
+ { 0x111D, 32370 },
+ { 0x111E, 32334 },
+ { 0x111F, 32295 },
+ { 0x1120, 32337 },
+ { 0x1121, 32232 },
+ { 0x1122, 32424 },
+ { 0x1123, 32427 },
+ { 0x1124, 32418 },
+ { 0x1125, 32409 },
+ { 0x1126, 32415 },
+ { 0x1127, 32292 },
+ { 0x1128, 32382 },
+ { 0x1129, 32388 },
+ { 0x112A, 32385 },
+ { 0x112B, 32373 },
+ { 0x112C, 32439 },
+ { 0x112D, 32304 },
+ { 0x112E, 32247 },
+ { 0x112F, 32307 },
+ { 0x1130, 32253 },
+ { 0x1131, 32244 },
+ { 0x1132, 32250 },
+ { 0x1133, 32430 },
+ { 0x1134, 32394 },
+ { 0x1135, 32241 },
+ { 0x1136, 32235 },
+ { 0x1137, 32340 },
+ { 0x1138, 32343 },
+ { 0x1139, 32349 },
+ { 0x113A, 32346 },
+ { 0x113B, 32238 },
+ { 0x113C, 32319 },
+ { 0x113D, 32421 },
+ { 0x113E, 32397 },
+ { 0x113F, 32442 },
+ { 0x1140, 32214 },
+ { 0x1141, 32322 },
+ { 0x1142, 32325 },
+ { 0x1143, 32280 },
+ { 0x1144, 32283 },
+ { 0x1145, 32229 },
+ { 0x1146, 32361 },
+ { 0x1147, 32262 },
+ { 0x1148, 32277 },
+ { 0x1149, 32358 },
+ { 0x114A, 32367 },
+ { 0x114B, 32364 },
+ { 0x114C, 32223 },
+ { 0x114D, 32274 },
+ { 0x114E, 32355 },
+ { 0x114F, 32436 },
+ { 0x1150, 32412 },
+ { 0x1151, 32445 },
+ { 0x1152, 32400 },
+ { 0x1153, 32352 },
+ { 0x1154, 32403 },
+ { 0x1155, 32433 },
+ { 0x1156, 32379 },
+ { 0x1157, 32406 },
+ { 0x1158, 32259 },
+ { 0x1159, 32316 },
+ { 0x115F, 32199 },
+ { 0x1160, 32865 },
+ { 0x1161, 32694 },
+ { 0x1162, 32709 },
+ { 0x1163, 32730 },
+ { 0x1164, 32781 },
+ { 0x1165, 32712 },
+ { 0x1166, 32697 },
+ { 0x1167, 32784 },
+ { 0x1168, 32733 },
+ { 0x1169, 32703 },
+ { 0x116A, 32721 },
+ { 0x116B, 32775 },
+ { 0x116C, 32718 },
+ { 0x116D, 32739 },
+ { 0x116E, 32706 },
+ { 0x116F, 32778 },
+ { 0x1170, 32724 },
+ { 0x1171, 32727 },
+ { 0x1172, 32742 },
+ { 0x1173, 32715 },
+ { 0x1174, 32736 },
+ { 0x1175, 32700 },
+ { 0x1176, 32745 },
+ { 0x1177, 32748 },
+ { 0x1178, 32814 },
+ { 0x1179, 32847 },
+ { 0x117A, 32787 },
+ { 0x117B, 32790 },
+ { 0x117C, 32841 },
+ { 0x117D, 32850 },
+ { 0x117E, 32853 },
+ { 0x117F, 32802 },
+ { 0x1180, 32760 },
+ { 0x1181, 32805 },
+ { 0x1182, 32763 },
+ { 0x1183, 32766 },
+ { 0x1184, 32856 },
+ { 0x1185, 32868 },
+ { 0x1186, 32871 },
+ { 0x1187, 32823 },
+ { 0x1188, 32820 },
+ { 0x1189, 32769 },
+ { 0x118A, 32808 },
+ { 0x118B, 32886 },
+ { 0x118C, 32811 },
+ { 0x118D, 32772 },
+ { 0x118E, 32826 },
+ { 0x118F, 32859 },
+ { 0x1190, 32829 },
+ { 0x1191, 32874 },
+ { 0x1192, 32862 },
+ { 0x1193, 32835 },
+ { 0x1194, 32832 },
+ { 0x1195, 32793 },
+ { 0x1196, 32844 },
+ { 0x1197, 32817 },
+ { 0x1198, 32751 },
+ { 0x1199, 32799 },
+ { 0x119A, 32754 },
+ { 0x119B, 32757 },
+ { 0x119C, 32796 },
+ { 0x119D, 32883 },
+ { 0x119E, 32838 },
+ { 0x119F, 32889 },
+ { 0x11A0, 32880 },
+ { 0x11A1, 32877 },
+ { 0x11A2, 32892 },
+ { 0x11A8, 32472 },
+ { 0x11A9, 32577 },
+ { 0x11AA, 32535 },
+ { 0x11AB, 32463 },
+ { 0x11AC, 32547 },
+ { 0x11AD, 32550 },
+ { 0x11AE, 32475 },
+ { 0x11AF, 32469 },
+ { 0x11B0, 32598 },
+ { 0x11B1, 32562 },
+ { 0x11B2, 32568 },
+ { 0x11B3, 32508 },
+ { 0x11B4, 32643 },
+ { 0x11B5, 32640 },
+ { 0x11B6, 32559 },
+ { 0x11B7, 32460 },
+ { 0x11B8, 32466 },
+ { 0x11B9, 32505 },
+ { 0x11BA, 32448 },
+ { 0x11BB, 32496 },
+ { 0x11BC, 32457 },
+ { 0x11BD, 32451 },
+ { 0x11BE, 32478 },
+ { 0x11BF, 32481 },
+ { 0x11C0, 32490 },
+ { 0x11C1, 32487 },
+ { 0x11C2, 32454 },
+ { 0x11C3, 32586 },
+ { 0x11C4, 32682 },
+ { 0x11C5, 32592 },
+ { 0x11C6, 32595 },
+ { 0x11C7, 32502 },
+ { 0x11C8, 32622 },
+ { 0x11C9, 32625 },
+ { 0x11CA, 32646 },
+ { 0x11CB, 32604 },
+ { 0x11CC, 32673 },
+ { 0x11CD, 32565 },
+ { 0x11CE, 32601 },
+ { 0x11CF, 32688 },
+ { 0x11D0, 32520 },
+ { 0x11D1, 32685 },
+ { 0x11D2, 32661 },
+ { 0x11D3, 32664 },
+ { 0x11D4, 32676 },
+ { 0x11D5, 32691 },
+ { 0x11D6, 32658 },
+ { 0x11D7, 32637 },
+ { 0x11D8, 32634 },
+ { 0x11D9, 32679 },
+ { 0x11DA, 32589 },
+ { 0x11DB, 32544 },
+ { 0x11DC, 32541 },
+ { 0x11DD, 32499 },
+ { 0x11DE, 32655 },
+ { 0x11DF, 32619 },
+ { 0x11E0, 32616 },
+ { 0x11E1, 32538 },
+ { 0x11E2, 32610 },
+ { 0x11E3, 32556 },
+ { 0x11E4, 32631 },
+ { 0x11E5, 32553 },
+ { 0x11E6, 32613 },
+ { 0x11E7, 32571 },
+ { 0x11E8, 32574 },
+ { 0x11E9, 32514 },
+ { 0x11EA, 32511 },
+ { 0x11EB, 32484 },
+ { 0x11EC, 32583 },
+ { 0x11ED, 32670 },
+ { 0x11EE, 32517 },
+ { 0x11EF, 32607 },
+ { 0x11F0, 32493 },
+ { 0x11F1, 32649 },
+ { 0x11F2, 32667 },
+ { 0x11F3, 32628 },
+ { 0x11F4, 32652 },
+ { 0x11F5, 32526 },
+ { 0x11F6, 32532 },
+ { 0x11F7, 32523 },
+ { 0x11F8, 32529 },
+ { 0x11F9, 32580 },
+ { 0x1200, 50516 },
+ { 0x1201, 50528 },
+ { 0x1202, 50522 },
+ { 0x1203, 50909 },
+ { 0x1204, 50912 },
+ { 0x1205, 50519 },
+ { 0x1206, 50525 },
+ { 0x1207, 50930 },
+ { 0x1208, 50561 },
+ { 0x1209, 50573 },
+ { 0x120A, 50567 },
+ { 0x120B, 50993 },
+ { 0x120C, 50996 },
+ { 0x120D, 50564 },
+ { 0x120E, 50570 },
+ { 0x120F, 51002 },
+ { 0x1210, 50915 },
+ { 0x1211, 50927 },
+ { 0x1212, 50921 },
+ { 0x1213, 51443 },
+ { 0x1214, 51446 },
+ { 0x1215, 50918 },
+ { 0x1216, 50924 },
+ { 0x1217, 51449 },
+ { 0x1218, 50576 },
+ { 0x1219, 50588 },
+ { 0x121A, 50582 },
+ { 0x121B, 51005 },
+ { 0x121C, 51008 },
+ { 0x121D, 50579 },
+ { 0x121E, 50585 },
+ { 0x121F, 51014 },
+ { 0x1220, 51191 },
+ { 0x1221, 51203 },
+ { 0x1222, 51197 },
+ { 0x1223, 51554 },
+ { 0x1224, 51557 },
+ { 0x1225, 51194 },
+ { 0x1226, 51200 },
+ { 0x1227, 51560 },
+ { 0x1228, 50636 },
+ { 0x1229, 50648 },
+ { 0x122A, 50642 },
+ { 0x122B, 51134 },
+ { 0x122C, 51137 },
+ { 0x122D, 50639 },
+ { 0x122E, 50645 },
+ { 0x122F, 51143 },
+ { 0x1230, 50651 },
+ { 0x1231, 50663 },
+ { 0x1232, 50657 },
+ { 0x1233, 51149 },
+ { 0x1234, 51152 },
+ { 0x1235, 50654 },
+ { 0x1236, 50660 },
+ { 0x1237, 51188 },
+ { 0x1238, 51155 },
+ { 0x1239, 51167 },
+ { 0x123A, 51161 },
+ { 0x123B, 51536 },
+ { 0x123C, 51539 },
+ { 0x123D, 51158 },
+ { 0x123E, 51164 },
+ { 0x123F, 51545 },
+ { 0x1240, 50621 },
+ { 0x1241, 50633 },
+ { 0x1242, 50627 },
+ { 0x1243, 51086 },
+ { 0x1244, 51089 },
+ { 0x1245, 50624 },
+ { 0x1246, 50630 },
+ { 0x1247, 51107 },
+ { 0x1248, 51110 },
+ { 0x124A, 51116 },
+ { 0x124B, 51524 },
+ { 0x124C, 51527 },
+ { 0x124D, 51113 },
+ { 0x1250, 51092 },
+ { 0x1251, 51104 },
+ { 0x1252, 51098 },
+ { 0x1253, 51509 },
+ { 0x1254, 51512 },
+ { 0x1255, 51095 },
+ { 0x1256, 51101 },
+ { 0x1258, 51515 },
+ { 0x125A, 51521 },
+ { 0x125B, 51638 },
+ { 0x125C, 51641 },
+ { 0x125D, 51518 },
+ { 0x1260, 50441 },
+ { 0x1261, 50453 },
+ { 0x1262, 50447 },
+ { 0x1263, 50756 },
+ { 0x1264, 50759 },
+ { 0x1265, 50444 },
+ { 0x1266, 50450 },
+ { 0x1267, 50765 },
+ { 0x1268, 50681 },
+ { 0x1269, 50693 },
+ { 0x126A, 50687 },
+ { 0x126B, 51263 },
+ { 0x126C, 51266 },
+ { 0x126D, 50684 },
+ { 0x126E, 50690 },
+ { 0x126F, 51269 },
+ { 0x1270, 50666 },
+ { 0x1271, 50678 },
+ { 0x1272, 50672 },
+ { 0x1273, 51206 },
+ { 0x1274, 51209 },
+ { 0x1275, 50669 },
+ { 0x1276, 50675 },
+ { 0x1277, 51245 },
+ { 0x1278, 50456 },
+ { 0x1279, 50468 },
+ { 0x127A, 50462 },
+ { 0x127B, 50774 },
+ { 0x127C, 50792 },
+ { 0x127D, 50459 },
+ { 0x127E, 50465 },
+ { 0x127F, 50813 },
+ { 0x1280, 50711 },
+ { 0x1281, 50723 },
+ { 0x1282, 50717 },
+ { 0x1283, 51281 },
+ { 0x1284, 51284 },
+ { 0x1285, 50714 },
+ { 0x1286, 50720 },
+ { 0x1287, 51287 },
+ { 0x1288, 51290 },
+ { 0x128A, 51296 },
+ { 0x128B, 51593 },
+ { 0x128C, 51596 },
+ { 0x128D, 51293 },
+ { 0x1290, 50591 },
+ { 0x1291, 50603 },
+ { 0x1292, 50597 },
+ { 0x1293, 51026 },
+ { 0x1294, 51029 },
+ { 0x1295, 50594 },
+ { 0x1296, 50600 },
+ { 0x1297, 51035 },
+ { 0x1298, 51038 },
+ { 0x1299, 51050 },
+ { 0x129A, 51044 },
+ { 0x129B, 51482 },
+ { 0x129C, 51485 },
+ { 0x129D, 51041 },
+ { 0x129E, 51047 },
+ { 0x129F, 51491 },
+ { 0x12A0, 51644 },
+ { 0x12A1, 51660 },
+ { 0x12A2, 51652 },
+ { 0x12A3, 51664 },
+ { 0x12A4, 51668 },
+ { 0x12A5, 51648 },
+ { 0x12A6, 51656 },
+ { 0x12A7, 51676 },
+ { 0x12A8, 50546 },
+ { 0x12A9, 50558 },
+ { 0x12AA, 50552 },
+ { 0x12AB, 50945 },
+ { 0x12AC, 50948 },
+ { 0x12AD, 50549 },
+ { 0x12AE, 50555 },
+ { 0x12AF, 50951 },
+ { 0x12B0, 50954 },
+ { 0x12B2, 50960 },
+ { 0x12B3, 51452 },
+ { 0x12B4, 51455 },
+ { 0x12B5, 50957 },
+ { 0x12B8, 50963 },
+ { 0x12B9, 50975 },
+ { 0x12BA, 50969 },
+ { 0x12BB, 51458 },
+ { 0x12BC, 51461 },
+ { 0x12BD, 50966 },
+ { 0x12BE, 50972 },
+ { 0x12C0, 51464 },
+ { 0x12C2, 51470 },
+ { 0x12C3, 51632 },
+ { 0x12C4, 51635 },
+ { 0x12C5, 51467 },
+ { 0x12C8, 50696 },
+ { 0x12C9, 50708 },
+ { 0x12CA, 50702 },
+ { 0x12CB, 51272 },
+ { 0x12CC, 51275 },
+ { 0x12CD, 50699 },
+ { 0x12CE, 50705 },
+ { 0x12CF, 51278 },
+ { 0x12D0, 51696 },
+ { 0x12D1, 51712 },
+ { 0x12D2, 51704 },
+ { 0x12D3, 51716 },
+ { 0x12D4, 51720 },
+ { 0x12D5, 51700 },
+ { 0x12D6, 51708 },
+ { 0x12D8, 50741 },
+ { 0x12D9, 50753 },
+ { 0x12DA, 50747 },
+ { 0x12DB, 51323 },
+ { 0x12DC, 51326 },
+ { 0x12DD, 50744 },
+ { 0x12DE, 50750 },
+ { 0x12DF, 51347 },
+ { 0x12E0, 51329 },
+ { 0x12E1, 51341 },
+ { 0x12E2, 51335 },
+ { 0x12E3, 51605 },
+ { 0x12E4, 51608 },
+ { 0x12E5, 51332 },
+ { 0x12E6, 51338 },
+ { 0x12E7, 51611 },
+ { 0x12E8, 50726 },
+ { 0x12E9, 50738 },
+ { 0x12EA, 50732 },
+ { 0x12EB, 51314 },
+ { 0x12EC, 51317 },
+ { 0x12ED, 50729 },
+ { 0x12EE, 50735 },
+ { 0x12EF, 51320 },
+ { 0x12F0, 50471 },
+ { 0x12F1, 50483 },
+ { 0x12F2, 50477 },
+ { 0x12F3, 50816 },
+ { 0x12F4, 50834 },
+ { 0x12F5, 50474 },
+ { 0x12F6, 50480 },
+ { 0x12F7, 50840 },
+ { 0x12F8, 50819 },
+ { 0x12F9, 50831 },
+ { 0x12FA, 50825 },
+ { 0x12FB, 51401 },
+ { 0x12FC, 51404 },
+ { 0x12FD, 50822 },
+ { 0x12FE, 50828 },
+ { 0x12FF, 51410 },
+ { 0x1300, 50531 },
+ { 0x1301, 50543 },
+ { 0x1302, 50537 },
+ { 0x1303, 50933 },
+ { 0x1304, 50936 },
+ { 0x1305, 50534 },
+ { 0x1306, 50540 },
+ { 0x1307, 50942 },
+ { 0x1308, 50501 },
+ { 0x1309, 50513 },
+ { 0x130A, 50507 },
+ { 0x130B, 50861 },
+ { 0x130C, 50864 },
+ { 0x130D, 50504 },
+ { 0x130E, 50510 },
+ { 0x130F, 50882 },
+ { 0x1310, 50885 },
+ { 0x1312, 50891 },
+ { 0x1313, 51431 },
+ { 0x1314, 51434 },
+ { 0x1315, 50888 },
+ { 0x1318, 50867 },
+ { 0x1319, 50879 },
+ { 0x131A, 50873 },
+ { 0x131B, 51416 },
+ { 0x131C, 51419 },
+ { 0x131D, 50870 },
+ { 0x131E, 50876 },
+ { 0x131F, 51626 },
+ { 0x1320, 51212 },
+ { 0x1321, 51224 },
+ { 0x1322, 51218 },
+ { 0x1323, 51563 },
+ { 0x1324, 51566 },
+ { 0x1325, 51215 },
+ { 0x1326, 51221 },
+ { 0x1327, 51572 },
+ { 0x1328, 50795 },
+ { 0x1329, 50807 },
+ { 0x132A, 50801 },
+ { 0x132B, 51389 },
+ { 0x132C, 51392 },
+ { 0x132D, 50798 },
+ { 0x132E, 50804 },
+ { 0x132F, 51398 },
+ { 0x1330, 51059 },
+ { 0x1331, 51071 },
+ { 0x1332, 51065 },
+ { 0x1333, 51494 },
+ { 0x1334, 51497 },
+ { 0x1335, 51062 },
+ { 0x1336, 51068 },
+ { 0x1337, 51503 },
+ { 0x1338, 51230 },
+ { 0x1339, 51242 },
+ { 0x133A, 51236 },
+ { 0x133B, 51575 },
+ { 0x133C, 51578 },
+ { 0x133D, 51233 },
+ { 0x133E, 51239 },
+ { 0x133F, 51581 },
+ { 0x1340, 51248 },
+ { 0x1341, 51260 },
+ { 0x1342, 51254 },
+ { 0x1343, 51584 },
+ { 0x1344, 51587 },
+ { 0x1345, 51251 },
+ { 0x1346, 51257 },
+ { 0x1347, 51590 },
+ { 0x1348, 50486 },
+ { 0x1349, 50498 },
+ { 0x134A, 50492 },
+ { 0x134B, 50843 },
+ { 0x134C, 50846 },
+ { 0x134D, 50489 },
+ { 0x134E, 50495 },
+ { 0x134F, 50849 },
+ { 0x1350, 50606 },
+ { 0x1351, 50618 },
+ { 0x1352, 50612 },
+ { 0x1353, 51053 },
+ { 0x1354, 51056 },
+ { 0x1355, 50609 },
+ { 0x1356, 50615 },
+ { 0x1357, 51077 },
+ { 0x1358, 51146 },
+ { 0x1359, 51023 },
+ { 0x135A, 50858 },
+ { 0x135F, 51724 },
+ { 0x1360, 50435 },
+ { 0x1361, 51733 },
+ { 0x1362, 50323 },
+ { 0x1363, 50328 },
+ { 0x1364, 51731 },
+ { 0x1365, 50326 },
+ { 0x1366, 50432 },
+ { 0x1367, 50438 },
+ { 0x1368, 51728 },
+ { 0x1369, 50330 },
+ { 0x136A, 50336 },
+ { 0x136B, 50354 },
+ { 0x136C, 50342 },
+ { 0x136D, 50339 },
+ { 0x136E, 50333 },
+ { 0x136F, 50351 },
+ { 0x1370, 50348 },
+ { 0x1371, 50345 },
+ { 0x1372, 50398 },
+ { 0x1373, 50423 },
+ { 0x1374, 50420 },
+ { 0x1375, 50408 },
+ { 0x1376, 50405 },
+ { 0x1377, 50411 },
+ { 0x1378, 50429 },
+ { 0x1379, 50414 },
+ { 0x137A, 50417 },
+ { 0x137B, 50426 },
+ { 0x137C, 50401 },
+ { 0x1380, 51688 },
+ { 0x1381, 51020 },
+ { 0x1382, 51479 },
+ { 0x1383, 51017 },
+ { 0x1384, 51680 },
+ { 0x1385, 50771 },
+ { 0x1386, 51365 },
+ { 0x1387, 50768 },
+ { 0x1388, 51684 },
+ { 0x1389, 50855 },
+ { 0x138A, 51413 },
+ { 0x138B, 50852 },
+ { 0x138C, 51692 },
+ { 0x138D, 51083 },
+ { 0x138E, 51506 },
+ { 0x138F, 51080 },
+ { 0x1390, 50382 },
+ { 0x1391, 50361 },
+ { 0x1392, 50390 },
+ { 0x1393, 50377 },
+ { 0x1394, 50365 },
+ { 0x1395, 50373 },
+ { 0x1396, 50386 },
+ { 0x1397, 50369 },
+ { 0x1398, 50394 },
+ { 0x1399, 50357 },
+ { 0x13A0, 48143 },
+ { 0x13A1, 48146 },
+ { 0x13A2, 48149 },
+ { 0x13A3, 48152 },
+ { 0x13A4, 48158 },
+ { 0x13A5, 48161 },
+ { 0x13A6, 48182 },
+ { 0x13A7, 48218 },
+ { 0x13A8, 48185 },
+ { 0x13A9, 48188 },
+ { 0x13AA, 48191 },
+ { 0x13AB, 48194 },
+ { 0x13AC, 48197 },
+ { 0x13AD, 48200 },
+ { 0x13AE, 48203 },
+ { 0x13AF, 48206 },
+ { 0x13B0, 48209 },
+ { 0x13B1, 48212 },
+ { 0x13B2, 48215 },
+ { 0x13B3, 48221 },
+ { 0x13B4, 48224 },
+ { 0x13B5, 48227 },
+ { 0x13B6, 48230 },
+ { 0x13B7, 48233 },
+ { 0x13B8, 48236 },
+ { 0x13B9, 48239 },
+ { 0x13BA, 48242 },
+ { 0x13BB, 48245 },
+ { 0x13BC, 48248 },
+ { 0x13BD, 48251 },
+ { 0x13BE, 48254 },
+ { 0x13BF, 48338 },
+ { 0x13C0, 48341 },
+ { 0x13C1, 48257 },
+ { 0x13C2, 48260 },
+ { 0x13C3, 48263 },
+ { 0x13C4, 48266 },
+ { 0x13C5, 48269 },
+ { 0x13C6, 48344 },
+ { 0x13C7, 48347 },
+ { 0x13C8, 48350 },
+ { 0x13C9, 48353 },
+ { 0x13CA, 48356 },
+ { 0x13CB, 48359 },
+ { 0x13CC, 48272 },
+ { 0x13CD, 48155 },
+ { 0x13CE, 48275 },
+ { 0x13CF, 48278 },
+ { 0x13D0, 48281 },
+ { 0x13D1, 48284 },
+ { 0x13D2, 48287 },
+ { 0x13D3, 48164 },
+ { 0x13D4, 48290 },
+ { 0x13D5, 48167 },
+ { 0x13D6, 48293 },
+ { 0x13D7, 48170 },
+ { 0x13D8, 48296 },
+ { 0x13D9, 48173 },
+ { 0x13DA, 48176 },
+ { 0x13DB, 48179 },
+ { 0x13DC, 48335 },
+ { 0x13DD, 48362 },
+ { 0x13DE, 48365 },
+ { 0x13DF, 48368 },
+ { 0x13E0, 48371 },
+ { 0x13E1, 48374 },
+ { 0x13E2, 48377 },
+ { 0x13E3, 48380 },
+ { 0x13E4, 48383 },
+ { 0x13E5, 48386 },
+ { 0x13E6, 48389 },
+ { 0x13E7, 48392 },
+ { 0x13E8, 48395 },
+ { 0x13E9, 48299 },
+ { 0x13EA, 48302 },
+ { 0x13EB, 48305 },
+ { 0x13EC, 48308 },
+ { 0x13ED, 48311 },
+ { 0x13EE, 48314 },
+ { 0x13EF, 48317 },
+ { 0x13F0, 48320 },
+ { 0x13F1, 48323 },
+ { 0x13F2, 48326 },
+ { 0x13F3, 48329 },
+ { 0x13F4, 48332 },
+ { 0x1401, 45872 },
+ { 0x1402, 46118 },
+ { 0x1403, 45878 },
+ { 0x1404, 45953 },
+ { 0x1405, 45893 },
+ { 0x1406, 46025 },
+ { 0x1407, 46790 },
+ { 0x1408, 46858 },
+ { 0x1409, 46842 },
+ { 0x140A, 45866 },
+ { 0x140B, 45914 },
+ { 0x140C, 46097 },
+ { 0x140D, 47791 },
+ { 0x140E, 46100 },
+ { 0x140F, 47795 },
+ { 0x1410, 46392 },
+ { 0x1411, 47927 },
+ { 0x1412, 46103 },
+ { 0x1413, 47799 },
+ { 0x1414, 46395 },
+ { 0x1415, 47931 },
+ { 0x1416, 47555 },
+ { 0x1417, 46094 },
+ { 0x1418, 47787 },
+ { 0x1419, 46389 },
+ { 0x141A, 47923 },
+ { 0x141B, 47551 },
+ { 0x141C, 45917 },
+ { 0x141D, 46786 },
+ { 0x141E, 47539 },
+ { 0x141F, 46643 },
+ { 0x1420, 46647 },
+ { 0x1421, 46663 },
+ { 0x1422, 46624 },
+ { 0x1423, 46651 },
+ { 0x1424, 46639 },
+ { 0x1425, 46669 },
+ { 0x1426, 46674 },
+ { 0x1427, 46681 },
+ { 0x1428, 46657 },
+ { 0x1429, 46635 },
+ { 0x142A, 46630 },
+ { 0x142B, 45935 },
+ { 0x142C, 45956 },
+ { 0x142D, 46022 },
+ { 0x142E, 45920 },
+ { 0x142F, 46031 },
+ { 0x1430, 46513 },
+ { 0x1431, 46034 },
+ { 0x1432, 46257 },
+ { 0x1433, 46037 },
+ { 0x1434, 46260 },
+ { 0x1435, 46814 },
+ { 0x1436, 47186 },
+ { 0x1437, 46882 },
+ { 0x1438, 46028 },
+ { 0x1439, 46254 },
+ { 0x143A, 46266 },
+ { 0x143B, 47879 },
+ { 0x143C, 46269 },
+ { 0x143D, 47883 },
+ { 0x143E, 46519 },
+ { 0x143F, 48011 },
+ { 0x1440, 46272 },
+ { 0x1441, 47887 },
+ { 0x1442, 46522 },
+ { 0x1443, 48015 },
+ { 0x1444, 46263 },
+ { 0x1445, 47875 },
+ { 0x1446, 46516 },
+ { 0x1447, 48007 },
+ { 0x1448, 46830 },
+ { 0x1449, 45896 },
+ { 0x144A, 47747 },
+ { 0x144B, 46838 },
+ { 0x144C, 46082 },
+ { 0x144D, 46567 },
+ { 0x144E, 46088 },
+ { 0x144F, 46344 },
+ { 0x1450, 46091 },
+ { 0x1451, 46347 },
+ { 0x1452, 46822 },
+ { 0x1453, 47118 },
+ { 0x1454, 46854 },
+ { 0x1455, 46079 },
+ { 0x1456, 46329 },
+ { 0x1457, 46368 },
+ { 0x1458, 47911 },
+ { 0x1459, 46371 },
+ { 0x145A, 47915 },
+ { 0x145B, 46606 },
+ { 0x145C, 48055 },
+ { 0x145D, 46374 },
+ { 0x145E, 47919 },
+ { 0x145F, 46609 },
+ { 0x1460, 48059 },
+ { 0x1461, 46365 },
+ { 0x1462, 47907 },
+ { 0x1463, 46603 },
+ { 0x1464, 48051 },
+ { 0x1465, 47595 },
+ { 0x1466, 45908 },
+ { 0x1467, 46353 },
+ { 0x1468, 46359 },
+ { 0x1469, 46362 },
+ { 0x146A, 46350 },
+ { 0x146B, 45962 },
+ { 0x146C, 46441 },
+ { 0x146D, 45965 },
+ { 0x146E, 46158 },
+ { 0x146F, 45968 },
+ { 0x1470, 46161 },
+ { 0x1471, 46798 },
+ { 0x1472, 45959 },
+ { 0x1473, 46155 },
+ { 0x1474, 46167 },
+ { 0x1475, 47823 },
+ { 0x1476, 46170 },
+ { 0x1477, 47827 },
+ { 0x1478, 46447 },
+ { 0x1479, 47971 },
+ { 0x147A, 46173 },
+ { 0x147B, 47831 },
+ { 0x147C, 46450 },
+ { 0x147D, 47975 },
+ { 0x147E, 46164 },
+ { 0x147F, 47819 },
+ { 0x1480, 46444 },
+ { 0x1481, 47967 },
+ { 0x1482, 47563 },
+ { 0x1483, 45881 },
+ { 0x1484, 45971 },
+ { 0x1485, 48131 },
+ { 0x1486, 48135 },
+ { 0x1487, 48139 },
+ { 0x1488, 48127 },
+ { 0x1489, 45926 },
+ { 0x148A, 46419 },
+ { 0x148B, 45929 },
+ { 0x148C, 46128 },
+ { 0x148D, 45932 },
+ { 0x148E, 46131 },
+ { 0x148F, 46794 },
+ { 0x1490, 45923 },
+ { 0x1491, 46121 },
+ { 0x1492, 46137 },
+ { 0x1493, 47807 },
+ { 0x1494, 46140 },
+ { 0x1495, 47811 },
+ { 0x1496, 46425 },
+ { 0x1497, 47955 },
+ { 0x1498, 46143 },
+ { 0x1499, 47815 },
+ { 0x149A, 46428 },
+ { 0x149B, 47959 },
+ { 0x149C, 46134 },
+ { 0x149D, 47803 },
+ { 0x149E, 46422 },
+ { 0x149F, 47951 },
+ { 0x14A0, 47559 },
+ { 0x14A1, 45869 },
+ { 0x14A2, 46762 },
+ { 0x14A3, 45992 },
+ { 0x14A4, 46474 },
+ { 0x14A5, 45998 },
+ { 0x14A6, 46209 },
+ { 0x14A7, 46001 },
+ { 0x14A8, 46212 },
+ { 0x14A9, 46806 },
+ { 0x14AA, 45989 },
+ { 0x14AB, 46206 },
+ { 0x14AC, 46218 },
+ { 0x14AD, 47855 },
+ { 0x14AE, 46221 },
+ { 0x14AF, 47859 },
+ { 0x14B0, 46480 },
+ { 0x14B1, 47995 },
+ { 0x14B2, 46224 },
+ { 0x14B3, 47863 },
+ { 0x14B4, 46483 },
+ { 0x14B5, 47999 },
+ { 0x14B6, 46215 },
+ { 0x14B7, 47851 },
+ { 0x14B8, 46477 },
+ { 0x14B9, 47991 },
+ { 0x14BA, 47567 },
+ { 0x14BB, 45887 },
+ { 0x14BC, 47743 },
+ { 0x14BD, 45995 },
+ { 0x14BE, 48091 },
+ { 0x14BF, 46734 },
+ { 0x14C0, 46007 },
+ { 0x14C1, 46486 },
+ { 0x14C2, 46016 },
+ { 0x14C3, 46239 },
+ { 0x14C4, 46019 },
+ { 0x14C5, 46245 },
+ { 0x14C6, 46810 },
+ { 0x14C7, 46004 },
+ { 0x14C8, 46227 },
+ { 0x14C9, 46251 },
+ { 0x14CA, 47871 },
+ { 0x14CB, 46248 },
+ { 0x14CC, 47867 },
+ { 0x14CD, 46510 },
+ { 0x14CE, 48003 },
+ { 0x14CF, 47571 },
+ { 0x14D0, 45890 },
+ { 0x14D1, 46958 },
+ { 0x14D2, 46013 },
+ { 0x14D3, 45977 },
+ { 0x14D4, 46453 },
+ { 0x14D5, 45983 },
+ { 0x14D6, 46188 },
+ { 0x14D7, 45986 },
+ { 0x14D8, 46191 },
+ { 0x14D9, 46802 },
+ { 0x14DA, 45974 },
+ { 0x14DB, 46176 },
+ { 0x14DC, 46197 },
+ { 0x14DD, 47839 },
+ { 0x14DE, 46200 },
+ { 0x14DF, 47843 },
+ { 0x14E0, 46468 },
+ { 0x14E1, 47983 },
+ { 0x14E2, 46203 },
+ { 0x14E3, 47847 },
+ { 0x14E4, 46471 },
+ { 0x14E5, 47987 },
+ { 0x14E6, 46194 },
+ { 0x14E7, 47835 },
+ { 0x14E8, 46465 },
+ { 0x14E9, 47979 },
+ { 0x14EA, 45884 },
+ { 0x14EB, 47739 },
+ { 0x14EC, 46710 },
+ { 0x14ED, 46064 },
+ { 0x14EE, 46534 },
+ { 0x14EF, 46070 },
+ { 0x14F0, 46311 },
+ { 0x14F1, 46073 },
+ { 0x14F2, 46314 },
+ { 0x14F3, 46818 },
+ { 0x14F4, 46061 },
+ { 0x14F5, 46296 },
+ { 0x14F6, 46320 },
+ { 0x14F7, 47895 },
+ { 0x14F8, 46323 },
+ { 0x14F9, 47899 },
+ { 0x14FA, 46561 },
+ { 0x14FB, 48043 },
+ { 0x14FC, 46326 },
+ { 0x14FD, 47903 },
+ { 0x14FE, 46564 },
+ { 0x14FF, 48047 },
+ { 0x1500, 46317 },
+ { 0x1501, 47891 },
+ { 0x1502, 46558 },
+ { 0x1503, 48039 },
+ { 0x1504, 47591 },
+ { 0x1505, 45905 },
+ { 0x1506, 48095 },
+ { 0x1507, 46076 },
+ { 0x1508, 47687 },
+ { 0x1509, 48103 },
+ { 0x150A, 47547 },
+ { 0x150B, 47543 },
+ { 0x150C, 47583 },
+ { 0x150D, 47587 },
+ { 0x150E, 47579 },
+ { 0x150F, 47575 },
+ { 0x1510, 46302 },
+ { 0x1511, 46305 },
+ { 0x1512, 46540 },
+ { 0x1513, 46308 },
+ { 0x1514, 46543 },
+ { 0x1515, 46299 },
+ { 0x1516, 46537 },
+ { 0x1517, 46549 },
+ { 0x1518, 48027 },
+ { 0x1519, 46552 },
+ { 0x151A, 48031 },
+ { 0x151B, 46701 },
+ { 0x151C, 48079 },
+ { 0x151D, 46555 },
+ { 0x151E, 48035 },
+ { 0x151F, 46704 },
+ { 0x1520, 48083 },
+ { 0x1521, 46546 },
+ { 0x1522, 48023 },
+ { 0x1523, 46698 },
+ { 0x1524, 48075 },
+ { 0x1525, 46067 },
+ { 0x1526, 46109 },
+ { 0x1527, 46612 },
+ { 0x1528, 46112 },
+ { 0x1529, 46401 },
+ { 0x152A, 46115 },
+ { 0x152B, 46404 },
+ { 0x152C, 46826 },
+ { 0x152D, 46106 },
+ { 0x152E, 46398 },
+ { 0x152F, 46410 },
+ { 0x1530, 47939 },
+ { 0x1531, 46413 },
+ { 0x1532, 47943 },
+ { 0x1533, 46618 },
+ { 0x1534, 48067 },
+ { 0x1535, 46416 },
+ { 0x1536, 47947 },
+ { 0x1537, 46621 },
+ { 0x1538, 48071 },
+ { 0x1539, 46407 },
+ { 0x153A, 47935 },
+ { 0x153B, 46615 },
+ { 0x153C, 48063 },
+ { 0x153D, 47599 },
+ { 0x153E, 45911 },
+ { 0x153F, 48099 },
+ { 0x1540, 47755 },
+ { 0x1541, 46766 },
+ { 0x1542, 46052 },
+ { 0x1543, 46730 },
+ { 0x1544, 47763 },
+ { 0x1545, 46528 },
+ { 0x1546, 46055 },
+ { 0x1547, 46290 },
+ { 0x1548, 46058 },
+ { 0x1549, 46293 },
+ { 0x154A, 47767 },
+ { 0x154B, 46049 },
+ { 0x154C, 46287 },
+ { 0x154D, 47759 },
+ { 0x154E, 46531 },
+ { 0x154F, 48019 },
+ { 0x1550, 45902 },
+ { 0x1551, 47751 },
+ { 0x1552, 46714 },
+ { 0x1553, 45941 },
+ { 0x1554, 46431 },
+ { 0x1555, 45944 },
+ { 0x1556, 46149 },
+ { 0x1557, 45947 },
+ { 0x1558, 46152 },
+ { 0x1559, 45938 },
+ { 0x155A, 46146 },
+ { 0x155B, 46438 },
+ { 0x155C, 47963 },
+ { 0x155D, 45875 },
+ { 0x155E, 46335 },
+ { 0x155F, 46718 },
+ { 0x1560, 46338 },
+ { 0x1561, 46722 },
+ { 0x1562, 46573 },
+ { 0x1563, 46726 },
+ { 0x1564, 46341 },
+ { 0x1565, 46576 },
+ { 0x1566, 46332 },
+ { 0x1567, 46570 },
+ { 0x1568, 46707 },
+ { 0x1569, 48087 },
+ { 0x156A, 46085 },
+ { 0x156B, 46594 },
+ { 0x156C, 46597 },
+ { 0x156D, 46600 },
+ { 0x156E, 46591 },
+ { 0x156F, 46356 },
+ { 0x1570, 46380 },
+ { 0x1571, 46383 },
+ { 0x1572, 46386 },
+ { 0x1573, 46377 },
+ { 0x1574, 47611 },
+ { 0x1575, 47615 },
+ { 0x1576, 47627 },
+ { 0x1577, 47619 },
+ { 0x1578, 47631 },
+ { 0x1579, 47607 },
+ { 0x157A, 47623 },
+ { 0x157B, 47603 },
+ { 0x157C, 47635 },
+ { 0x157D, 45950 },
+ { 0x157E, 46525 },
+ { 0x157F, 46043 },
+ { 0x1580, 46281 },
+ { 0x1581, 46046 },
+ { 0x1582, 46284 },
+ { 0x1583, 46040 },
+ { 0x1584, 46275 },
+ { 0x1585, 45899 },
+ { 0x1586, 46582 },
+ { 0x1587, 46585 },
+ { 0x1588, 46588 },
+ { 0x1589, 46579 },
+ { 0x158A, 47775 },
+ { 0x158B, 47779 },
+ { 0x158C, 47783 },
+ { 0x158D, 47771 },
+ { 0x158E, 46686 },
+ { 0x158F, 46233 },
+ { 0x1590, 46495 },
+ { 0x1591, 46236 },
+ { 0x1592, 46498 },
+ { 0x1593, 46230 },
+ { 0x1594, 46489 },
+ { 0x1595, 46010 },
+ { 0x1596, 46242 },
+ { 0x1597, 46774 },
+ { 0x1598, 46778 },
+ { 0x1599, 46782 },
+ { 0x159A, 46770 },
+ { 0x159B, 48115 },
+ { 0x159C, 48119 },
+ { 0x159D, 48123 },
+ { 0x159E, 48111 },
+ { 0x159F, 48107 },
+ { 0x15A0, 46182 },
+ { 0x15A1, 46459 },
+ { 0x15A2, 46185 },
+ { 0x15A3, 46462 },
+ { 0x15A4, 46179 },
+ { 0x15A5, 46456 },
+ { 0x15A6, 45980 },
+ { 0x15A7, 47647 },
+ { 0x15A8, 47651 },
+ { 0x15A9, 47663 },
+ { 0x15AA, 47655 },
+ { 0x15AB, 47667 },
+ { 0x15AC, 47643 },
+ { 0x15AD, 47659 },
+ { 0x15AE, 47639 },
+ { 0x15AF, 46834 },
+ { 0x15B0, 47675 },
+ { 0x15B1, 47679 },
+ { 0x15B2, 47683 },
+ { 0x15B3, 47671 },
+ { 0x15B4, 47727 },
+ { 0x15B5, 47731 },
+ { 0x15B6, 47735 },
+ { 0x15B7, 47723 },
+ { 0x15B8, 47711 },
+ { 0x15B9, 47715 },
+ { 0x15BA, 47719 },
+ { 0x15BB, 47707 },
+ { 0x15BC, 47695 },
+ { 0x15BD, 47699 },
+ { 0x15BE, 47703 },
+ { 0x15BF, 47691 },
+ { 0x15C0, 46742 },
+ { 0x15C1, 46746 },
+ { 0x15C2, 46750 },
+ { 0x15C3, 46738 },
+ { 0x15C4, 47182 },
+ { 0x15C5, 47178 },
+ { 0x15C6, 47170 },
+ { 0x15C7, 47442 },
+ { 0x15C8, 47174 },
+ { 0x15C9, 47166 },
+ { 0x15CA, 47010 },
+ { 0x15CB, 47006 },
+ { 0x15CC, 46998 },
+ { 0x15CD, 47310 },
+ { 0x15CE, 47002 },
+ { 0x15CF, 46994 },
+ { 0x15D0, 47054 },
+ { 0x15D1, 47050 },
+ { 0x15D2, 47042 },
+ { 0x15D3, 47418 },
+ { 0x15D4, 47046 },
+ { 0x15D5, 47038 },
+ { 0x15D6, 47206 },
+ { 0x15D7, 47202 },
+ { 0x15D8, 47194 },
+ { 0x15D9, 47446 },
+ { 0x15DA, 47198 },
+ { 0x15DB, 47190 },
+ { 0x15DC, 47354 },
+ { 0x15DD, 47350 },
+ { 0x15DE, 47342 },
+ { 0x15DF, 47470 },
+ { 0x15E0, 47346 },
+ { 0x15E1, 47338 },
+ { 0x15E2, 47414 },
+ { 0x15E3, 47410 },
+ { 0x15E4, 47402 },
+ { 0x15E5, 47502 },
+ { 0x15E6, 47406 },
+ { 0x15E7, 47398 },
+ { 0x15E8, 46990 },
+ { 0x15E9, 46986 },
+ { 0x15EA, 46978 },
+ { 0x15EB, 47306 },
+ { 0x15EC, 46982 },
+ { 0x15ED, 46974 },
+ { 0x15EE, 46846 },
+ { 0x15EF, 46878 },
+ { 0x15F0, 46874 },
+ { 0x15F1, 46866 },
+ { 0x15F2, 47162 },
+ { 0x15F3, 46870 },
+ { 0x15F4, 46862 },
+ { 0x15F5, 47250 },
+ { 0x15F6, 47246 },
+ { 0x15F7, 47238 },
+ { 0x15F8, 47454 },
+ { 0x15F9, 47242 },
+ { 0x15FA, 47234 },
+ { 0x15FB, 47270 },
+ { 0x15FC, 47266 },
+ { 0x15FD, 47258 },
+ { 0x15FE, 47458 },
+ { 0x15FF, 47262 },
+ { 0x1600, 47254 },
+ { 0x1601, 46906 },
+ { 0x1602, 46970 },
+ { 0x1603, 46966 },
+ { 0x1604, 46954 },
+ { 0x1605, 47302 },
+ { 0x1606, 46962 },
+ { 0x1607, 46950 },
+ { 0x1608, 46946 },
+ { 0x1609, 46942 },
+ { 0x160A, 46934 },
+ { 0x160B, 47298 },
+ { 0x160C, 46938 },
+ { 0x160D, 46930 },
+ { 0x160E, 47074 },
+ { 0x160F, 47070 },
+ { 0x1610, 47062 },
+ { 0x1611, 47422 },
+ { 0x1612, 47066 },
+ { 0x1613, 47058 },
+ { 0x1614, 46902 },
+ { 0x1615, 46758 },
+ { 0x1616, 46898 },
+ { 0x1617, 46890 },
+ { 0x1618, 47210 },
+ { 0x1619, 46894 },
+ { 0x161A, 46754 },
+ { 0x161B, 46886 },
+ { 0x161C, 47230 },
+ { 0x161D, 47226 },
+ { 0x161E, 47218 },
+ { 0x161F, 47450 },
+ { 0x1620, 47222 },
+ { 0x1621, 47214 },
+ { 0x1622, 46926 },
+ { 0x1623, 46922 },
+ { 0x1624, 46914 },
+ { 0x1625, 47274 },
+ { 0x1626, 46918 },
+ { 0x1627, 46910 },
+ { 0x1628, 47138 },
+ { 0x1629, 47134 },
+ { 0x162A, 47126 },
+ { 0x162B, 47434 },
+ { 0x162C, 47130 },
+ { 0x162D, 47122 },
+ { 0x162E, 47294 },
+ { 0x162F, 47290 },
+ { 0x1630, 47282 },
+ { 0x1631, 47462 },
+ { 0x1632, 47286 },
+ { 0x1633, 47278 },
+ { 0x1634, 47494 },
+ { 0x1635, 47490 },
+ { 0x1636, 47482 },
+ { 0x1637, 47526 },
+ { 0x1638, 47486 },
+ { 0x1639, 47478 },
+ { 0x163A, 47374 },
+ { 0x163B, 47370 },
+ { 0x163C, 47362 },
+ { 0x163D, 47474 },
+ { 0x163E, 47366 },
+ { 0x163F, 47358 },
+ { 0x1640, 47094 },
+ { 0x1641, 47090 },
+ { 0x1642, 47082 },
+ { 0x1643, 47426 },
+ { 0x1644, 47086 },
+ { 0x1645, 47078 },
+ { 0x1646, 46850 },
+ { 0x1647, 47534 },
+ { 0x1648, 47158 },
+ { 0x1649, 47154 },
+ { 0x164A, 47146 },
+ { 0x164B, 47438 },
+ { 0x164C, 47150 },
+ { 0x164D, 47142 },
+ { 0x164E, 47034 },
+ { 0x164F, 47030 },
+ { 0x1650, 47018 },
+ { 0x1651, 47314 },
+ { 0x1652, 47026 },
+ { 0x1653, 47014 },
+ { 0x1654, 47334 },
+ { 0x1655, 47330 },
+ { 0x1656, 47322 },
+ { 0x1657, 47466 },
+ { 0x1658, 47326 },
+ { 0x1659, 47318 },
+ { 0x165A, 47022 },
+ { 0x165B, 47394 },
+ { 0x165C, 47390 },
+ { 0x165D, 47382 },
+ { 0x165E, 47498 },
+ { 0x165F, 47386 },
+ { 0x1660, 47378 },
+ { 0x1661, 47114 },
+ { 0x1662, 47110 },
+ { 0x1663, 47102 },
+ { 0x1664, 47430 },
+ { 0x1665, 47106 },
+ { 0x1666, 47098 },
+ { 0x1667, 47522 },
+ { 0x1668, 47518 },
+ { 0x1669, 47510 },
+ { 0x166A, 47530 },
+ { 0x166B, 47514 },
+ { 0x166C, 47506 },
+ { 0x166D, 46124 },
+ { 0x166E, 46434 },
+ { 0x166F, 46278 },
+ { 0x1670, 46492 },
+ { 0x1671, 46504 },
+ { 0x1672, 46692 },
+ { 0x1673, 46507 },
+ { 0x1674, 46695 },
+ { 0x1675, 46501 },
+ { 0x1676, 46689 },
+ { 0x1680, 21369 },
+ { 0x1681, 21414 },
+ { 0x1682, 21396 },
+ { 0x1683, 21420 },
+ { 0x1684, 21408 },
+ { 0x1685, 21402 },
+ { 0x1686, 21411 },
+ { 0x1687, 21387 },
+ { 0x1688, 21426 },
+ { 0x1689, 21384 },
+ { 0x168A, 21417 },
+ { 0x168B, 21399 },
+ { 0x168C, 21390 },
+ { 0x168D, 21441 },
+ { 0x168E, 21429 },
+ { 0x168F, 21405 },
+ { 0x1690, 21381 },
+ { 0x1691, 21378 },
+ { 0x1692, 21375 },
+ { 0x1693, 21435 },
+ { 0x1694, 21438 },
+ { 0x1695, 21432 },
+ { 0x1696, 21372 },
+ { 0x1697, 21444 },
+ { 0x1698, 21393 },
+ { 0x1699, 21447 },
+ { 0x169A, 21423 },
+ { 0x169B, 21450 },
+ { 0x169C, 21453 },
+ { 0x16A0, 22222 },
+ { 0x16A1, 22160 },
+ { 0x16A2, 22250 },
+ { 0x16A3, 22189 },
+ { 0x16A4, 22169 },
+ { 0x16A5, 22163 },
+ { 0x16A6, 22368 },
+ { 0x16A7, 22201 },
+ { 0x16A8, 22259 },
+ { 0x16A9, 22185 },
+ { 0x16AA, 22175 },
+ { 0x16AB, 22216 },
+ { 0x16AC, 22402 },
+ { 0x16AD, 22390 },
+ { 0x16AE, 22154 },
+ { 0x16AF, 22179 },
+ { 0x16B0, 22182 },
+ { 0x16B1, 22287 },
+ { 0x16B2, 22284 },
+ { 0x16B3, 22192 },
+ { 0x16B4, 22243 },
+ { 0x16B5, 22151 },
+ { 0x16B6, 22198 },
+ { 0x16B7, 22228 },
+ { 0x16B8, 22204 },
+ { 0x16B9, 22304 },
+ { 0x16BA, 22309 },
+ { 0x16BB, 22276 },
+ { 0x16BC, 22422 },
+ { 0x16BD, 22418 },
+ { 0x16BE, 22327 },
+ { 0x16BF, 22410 },
+ { 0x16C0, 22362 },
+ { 0x16C1, 22233 },
+ { 0x16C2, 22148 },
+ { 0x16C3, 22280 },
+ { 0x16C4, 22207 },
+ { 0x16C5, 22383 },
+ { 0x16C6, 22376 },
+ { 0x16C7, 22239 },
+ { 0x16C8, 22336 },
+ { 0x16C9, 22255 },
+ { 0x16CA, 22341 },
+ { 0x16CB, 22293 },
+ { 0x16CC, 22394 },
+ { 0x16CD, 22142 },
+ { 0x16CE, 22172 },
+ { 0x16CF, 22298 },
+ { 0x16D0, 22398 },
+ { 0x16D1, 22145 },
+ { 0x16D2, 22353 },
+ { 0x16D3, 22426 },
+ { 0x16D4, 22365 },
+ { 0x16D5, 22333 },
+ { 0x16D6, 22271 },
+ { 0x16D7, 22322 },
+ { 0x16D8, 22414 },
+ { 0x16D9, 22406 },
+ { 0x16DA, 22316 },
+ { 0x16DB, 22359 },
+ { 0x16DC, 22313 },
+ { 0x16DD, 22210 },
+ { 0x16DE, 22266 },
+ { 0x16DF, 22348 },
+ { 0x16E0, 22195 },
+ { 0x16E1, 22213 },
+ { 0x16E2, 22345 },
+ { 0x16E3, 22219 },
+ { 0x16E4, 22263 },
+ { 0x16E5, 22247 },
+ { 0x16E6, 22387 },
+ { 0x16E7, 22380 },
+ { 0x16E8, 22373 },
+ { 0x16E9, 22157 },
+ { 0x16EA, 22166 },
+ { 0x16EB, 22430 },
+ { 0x16EC, 22436 },
+ { 0x16ED, 22136 },
+ { 0x16EE, 22139 },
+ { 0x16EF, 22439 },
+ { 0x16F0, 22433 },
+ { 0x1700, 43594 },
+ { 0x1701, 43597 },
+ { 0x1702, 43600 },
+ { 0x1703, 43615 },
+ { 0x1704, 43609 },
+ { 0x1705, 43642 },
+ { 0x1706, 43633 },
+ { 0x1707, 43606 },
+ { 0x1708, 43624 },
+ { 0x1709, 43627 },
+ { 0x170A, 43603 },
+ { 0x170B, 43621 },
+ { 0x170C, 43639 },
+ { 0x170E, 43618 },
+ { 0x170F, 43636 },
+ { 0x1710, 43630 },
+ { 0x1711, 43612 },
+ { 0x1712, 43586 },
+ { 0x1713, 43590 },
+ { 0x1714, 43583 },
+ { 0x1720, 40573 },
+ { 0x1721, 40576 },
+ { 0x1722, 40579 },
+ { 0x1723, 40594 },
+ { 0x1724, 40588 },
+ { 0x1725, 40624 },
+ { 0x1726, 40615 },
+ { 0x1727, 40585 },
+ { 0x1728, 40603 },
+ { 0x1729, 40606 },
+ { 0x172A, 40582 },
+ { 0x172B, 40600 },
+ { 0x172C, 40621 },
+ { 0x172D, 40609 },
+ { 0x172E, 40597 },
+ { 0x172F, 40618 },
+ { 0x1730, 40612 },
+ { 0x1731, 40591 },
+ { 0x1732, 40565 },
+ { 0x1733, 40569 },
+ { 0x1734, 40562 },
+ { 0x1735, 67884 },
+ { 0x1736, 67881 },
+ { 0x1740, 10387 },
+ { 0x1741, 10390 },
+ { 0x1742, 10393 },
+ { 0x1743, 10408 },
+ { 0x1744, 10402 },
+ { 0x1745, 10438 },
+ { 0x1746, 10429 },
+ { 0x1747, 10399 },
+ { 0x1748, 10417 },
+ { 0x1749, 10420 },
+ { 0x174A, 10396 },
+ { 0x174B, 10414 },
+ { 0x174C, 10435 },
+ { 0x174D, 10423 },
+ { 0x174E, 10411 },
+ { 0x174F, 10432 },
+ { 0x1750, 10426 },
+ { 0x1751, 10405 },
+ { 0x1752, 10379 },
+ { 0x1753, 10383 },
+ { 0x1760, 55665 },
+ { 0x1761, 55668 },
+ { 0x1762, 55671 },
+ { 0x1763, 55683 },
+ { 0x1764, 55680 },
+ { 0x1765, 55710 },
+ { 0x1766, 55701 },
+ { 0x1767, 55677 },
+ { 0x1768, 55692 },
+ { 0x1769, 55695 },
+ { 0x176A, 55674 },
+ { 0x176B, 55689 },
+ { 0x176C, 55707 },
+ { 0x176E, 55686 },
+ { 0x176F, 55704 },
+ { 0x1770, 55698 },
+ { 0x1772, 55657 },
+ { 0x1773, 55661 },
+ { 0x1780, 14115 },
+ { 0x1781, 14163 },
+ { 0x1782, 14118 },
+ { 0x1783, 14166 },
+ { 0x1784, 14169 },
+ { 0x1785, 14100 },
+ { 0x1786, 14157 },
+ { 0x1787, 14103 },
+ { 0x1788, 14160 },
+ { 0x1789, 14175 },
+ { 0x178A, 14106 },
+ { 0x178B, 14196 },
+ { 0x178C, 14109 },
+ { 0x178D, 14199 },
+ { 0x178E, 14172 },
+ { 0x178F, 14145 },
+ { 0x1790, 14190 },
+ { 0x1791, 14148 },
+ { 0x1792, 14193 },
+ { 0x1793, 14130 },
+ { 0x1794, 14097 },
+ { 0x1795, 14178 },
+ { 0x1796, 14133 },
+ { 0x1797, 14181 },
+ { 0x1798, 14127 },
+ { 0x1799, 14154 },
+ { 0x179A, 14139 },
+ { 0x179B, 14124 },
+ { 0x179C, 14151 },
+ { 0x179D, 14184 },
+ { 0x179E, 14187 },
+ { 0x179F, 14142 },
+ { 0x17A0, 14112 },
+ { 0x17A1, 14121 },
+ { 0x17A2, 14136 },
+ { 0x17A3, 14414 },
+ { 0x17A4, 14406 },
+ { 0x17A5, 14390 },
+ { 0x17A6, 14422 },
+ { 0x17A7, 14394 },
+ { 0x17A8, 14438 },
+ { 0x17A9, 14442 },
+ { 0x17AA, 14450 },
+ { 0x17AB, 14398 },
+ { 0x17AC, 14446 },
+ { 0x17AD, 14382 },
+ { 0x17AE, 14402 },
+ { 0x17AF, 14386 },
+ { 0x17B0, 14410 },
+ { 0x17B1, 14426 },
+ { 0x17B2, 14432 },
+ { 0x17B3, 14418 },
+ { 0x17B4, 14093 },
+ { 0x17B5, 14089 },
+ { 0x17B6, 14041 },
+ { 0x17B7, 14029 },
+ { 0x17B8, 14061 },
+ { 0x17B9, 14037 },
+ { 0x17BA, 14085 },
+ { 0x17BB, 14033 },
+ { 0x17BC, 14077 },
+ { 0x17BD, 14073 },
+ { 0x17BE, 14065 },
+ { 0x17BF, 14081 },
+ { 0x17C0, 14057 },
+ { 0x17C1, 14025 },
+ { 0x17C2, 14045 },
+ { 0x17C3, 14049 },
+ { 0x17C4, 14069 },
+ { 0x17C5, 14053 },
+ { 0x17C6, 13965 },
+ { 0x17C7, 13968 },
+ { 0x17C8, 13992 },
+ { 0x17C9, 13983 },
+ { 0x17CA, 13971 },
+ { 0x17CB, 13937 },
+ { 0x17CC, 13934 },
+ { 0x17CD, 13986 },
+ { 0x17CE, 13959 },
+ { 0x17CF, 13928 },
+ { 0x17D0, 13952 },
+ { 0x17D1, 13956 },
+ { 0x17D2, 13931 },
+ { 0x17D3, 13980 },
+ { 0x17D4, 13925 },
+ { 0x17D5, 13977 },
+ { 0x17D6, 13943 },
+ { 0x17D7, 13921 },
+ { 0x17D8, 13940 },
+ { 0x17D9, 13948 },
+ { 0x17DA, 13962 },
+ { 0x17DB, 14378 },
+ { 0x17DC, 13989 },
+ { 0x17DD, 13974 },
+ { 0x17E0, 14013 },
+ { 0x17E1, 13995 },
+ { 0x17E2, 14001 },
+ { 0x17E3, 14022 },
+ { 0x17E4, 14007 },
+ { 0x17E5, 14004 },
+ { 0x17E6, 13998 },
+ { 0x17E7, 14019 },
+ { 0x17E8, 14016 },
+ { 0x17E9, 14010 },
+ { 0x17F0, 14228 },
+ { 0x17F1, 14238 },
+ { 0x17F2, 14223 },
+ { 0x17F3, 14218 },
+ { 0x17F4, 14233 },
+ { 0x17F5, 14243 },
+ { 0x17F6, 14263 },
+ { 0x17F7, 14253 },
+ { 0x17F8, 14248 },
+ { 0x17F9, 14258 },
+ { 0x1800, 65145 },
+ { 0x1801, 65749 },
+ { 0x1802, 65149 },
+ { 0x1803, 65133 },
+ { 0x1804, 65147 },
+ { 0x1805, 65115 },
+ { 0x1806, 65141 },
+ { 0x1807, 65136 },
+ { 0x1808, 65744 },
+ { 0x1809, 65740 },
+ { 0x180A, 65747 },
+ { 0x180B, 65118 },
+ { 0x180C, 65123 },
+ { 0x180D, 65128 },
+ { 0x180E, 65181 },
+ { 0x1810, 65169 },
+ { 0x1811, 65151 },
+ { 0x1812, 65157 },
+ { 0x1813, 65178 },
+ { 0x1814, 65163 },
+ { 0x1815, 65160 },
+ { 0x1816, 65154 },
+ { 0x1817, 65175 },
+ { 0x1818, 65172 },
+ { 0x1819, 65166 },
+ { 0x1820, 65184 },
+ { 0x1821, 65187 },
+ { 0x1822, 65190 },
+ { 0x1823, 65193 },
+ { 0x1824, 65196 },
+ { 0x1825, 65229 },
+ { 0x1826, 65247 },
+ { 0x1827, 65205 },
+ { 0x1828, 65226 },
+ { 0x1829, 65400 },
+ { 0x182A, 65199 },
+ { 0x182B, 65232 },
+ { 0x182C, 65235 },
+ { 0x182D, 65211 },
+ { 0x182E, 65223 },
+ { 0x182F, 65220 },
+ { 0x1830, 65241 },
+ { 0x1831, 65418 },
+ { 0x1832, 65244 },
+ { 0x1833, 65202 },
+ { 0x1834, 65403 },
+ { 0x1835, 65214 },
+ { 0x1836, 65253 },
+ { 0x1837, 65238 },
+ { 0x1838, 65250 },
+ { 0x1839, 65208 },
+ { 0x183A, 65217 },
+ { 0x183B, 65412 },
+ { 0x183C, 65421 },
+ { 0x183D, 65256 },
+ { 0x183E, 65409 },
+ { 0x183F, 65427 },
+ { 0x1840, 65415 },
+ { 0x1841, 65424 },
+ { 0x1842, 65406 },
+ { 0x1843, 65630 },
+ { 0x1844, 65518 },
+ { 0x1845, 65522 },
+ { 0x1846, 65526 },
+ { 0x1847, 65530 },
+ { 0x1848, 65558 },
+ { 0x1849, 65574 },
+ { 0x184A, 65598 },
+ { 0x184B, 65534 },
+ { 0x184C, 65562 },
+ { 0x184D, 65566 },
+ { 0x184E, 65542 },
+ { 0x184F, 65554 },
+ { 0x1850, 65570 },
+ { 0x1851, 65538 },
+ { 0x1852, 65602 },
+ { 0x1853, 65546 },
+ { 0x1854, 65626 },
+ { 0x1855, 65582 },
+ { 0x1856, 65578 },
+ { 0x1857, 65550 },
+ { 0x1858, 65610 },
+ { 0x1859, 65614 },
+ { 0x185A, 65618 },
+ { 0x185B, 65622 },
+ { 0x185C, 65606 },
+ { 0x185D, 65430 },
+ { 0x185E, 65434 },
+ { 0x185F, 65458 },
+ { 0x1860, 65478 },
+ { 0x1861, 65438 },
+ { 0x1862, 65486 },
+ { 0x1863, 65466 },
+ { 0x1864, 65450 },
+ { 0x1865, 65454 },
+ { 0x1866, 65470 },
+ { 0x1867, 65506 },
+ { 0x1868, 65474 },
+ { 0x1869, 65442 },
+ { 0x186A, 65462 },
+ { 0x186B, 65446 },
+ { 0x186C, 65494 },
+ { 0x186D, 65498 },
+ { 0x186E, 65510 },
+ { 0x186F, 65482 },
+ { 0x1870, 65502 },
+ { 0x1871, 65490 },
+ { 0x1872, 65514 },
+ { 0x1873, 65636 },
+ { 0x1874, 65644 },
+ { 0x1875, 65648 },
+ { 0x1876, 65640 },
+ { 0x1877, 65736 },
+ { 0x1880, 65388 },
+ { 0x1881, 65382 },
+ { 0x1882, 65367 },
+ { 0x1883, 65377 },
+ { 0x1884, 65394 },
+ { 0x1885, 65362 },
+ { 0x1886, 65356 },
+ { 0x1887, 65259 },
+ { 0x1888, 65264 },
+ { 0x1889, 65284 },
+ { 0x188A, 65309 },
+ { 0x188B, 65274 },
+ { 0x188C, 65329 },
+ { 0x188D, 65351 },
+ { 0x188E, 65304 },
+ { 0x188F, 65314 },
+ { 0x1890, 65294 },
+ { 0x1891, 65279 },
+ { 0x1892, 65289 },
+ { 0x1893, 65319 },
+ { 0x1894, 65324 },
+ { 0x1895, 65334 },
+ { 0x1896, 65299 },
+ { 0x1897, 65269 },
+ { 0x1898, 65586 },
+ { 0x1899, 65592 },
+ { 0x189A, 65688 },
+ { 0x189B, 65706 },
+ { 0x189C, 65652 },
+ { 0x189D, 65694 },
+ { 0x189E, 65718 },
+ { 0x189F, 65730 },
+ { 0x18A0, 65658 },
+ { 0x18A1, 65682 },
+ { 0x18A2, 65712 },
+ { 0x18A3, 65676 },
+ { 0x18A4, 65724 },
+ { 0x18A5, 65664 },
+ { 0x18A6, 65339 },
+ { 0x18A7, 65345 },
+ { 0x18A8, 65670 },
+ { 0x18A9, 65372 },
+ { 0x18AA, 65700 },
+ { 0x1900, 21091 },
+ { 0x1901, 21007 },
+ { 0x1902, 21052 },
+ { 0x1903, 20998 },
+ { 0x1904, 21046 },
+ { 0x1905, 21055 },
+ { 0x1906, 20992 },
+ { 0x1907, 21040 },
+ { 0x1908, 21004 },
+ { 0x1909, 21049 },
+ { 0x190A, 21070 },
+ { 0x190B, 21028 },
+ { 0x190C, 21067 },
+ { 0x190D, 20995 },
+ { 0x190E, 21043 },
+ { 0x190F, 21016 },
+ { 0x1910, 21019 },
+ { 0x1911, 21058 },
+ { 0x1912, 20989 },
+ { 0x1913, 21037 },
+ { 0x1914, 21013 },
+ { 0x1915, 21034 },
+ { 0x1916, 21022 },
+ { 0x1917, 21010 },
+ { 0x1918, 21031 },
+ { 0x1919, 21061 },
+ { 0x191A, 21064 },
+ { 0x191B, 21025 },
+ { 0x191C, 21001 },
+ { 0x1920, 20953 },
+ { 0x1921, 20961 },
+ { 0x1922, 20969 },
+ { 0x1923, 20981 },
+ { 0x1924, 20973 },
+ { 0x1925, 20985 },
+ { 0x1926, 20977 },
+ { 0x1927, 20957 },
+ { 0x1928, 20965 },
+ { 0x1929, 21084 },
+ { 0x192A, 21076 },
+ { 0x192B, 21080 },
+ { 0x1930, 20917 },
+ { 0x1931, 20945 },
+ { 0x1932, 20949 },
+ { 0x1933, 20941 },
+ { 0x1934, 20929 },
+ { 0x1935, 20933 },
+ { 0x1936, 20925 },
+ { 0x1937, 20937 },
+ { 0x1938, 20921 },
+ { 0x1939, 20884 },
+ { 0x193A, 20881 },
+ { 0x193B, 20878 },
+ { 0x1940, 20875 },
+ { 0x1944, 21088 },
+ { 0x1945, 21073 },
+ { 0x1946, 20905 },
+ { 0x1947, 20887 },
+ { 0x1948, 20893 },
+ { 0x1949, 20914 },
+ { 0x194A, 20899 },
+ { 0x194B, 20896 },
+ { 0x194C, 20890 },
+ { 0x194D, 20911 },
+ { 0x194E, 20908 },
+ { 0x194F, 20902 },
+ { 0x1950, 7612 },
+ { 0x1951, 7656 },
+ { 0x1952, 7672 },
+ { 0x1953, 7684 },
+ { 0x1954, 7640 },
+ { 0x1955, 7660 },
+ { 0x1956, 7644 },
+ { 0x1957, 7680 },
+ { 0x1958, 7616 },
+ { 0x1959, 7632 },
+ { 0x195A, 7676 },
+ { 0x195B, 7620 },
+ { 0x195C, 7604 },
+ { 0x195D, 7652 },
+ { 0x195E, 7608 },
+ { 0x195F, 7636 },
+ { 0x1960, 7668 },
+ { 0x1961, 7688 },
+ { 0x1962, 7624 },
+ { 0x1963, 7572 },
+ { 0x1964, 7580 },
+ { 0x1965, 7596 },
+ { 0x1966, 7600 },
+ { 0x1967, 7588 },
+ { 0x1968, 7628 },
+ { 0x1969, 7584 },
+ { 0x196A, 7648 },
+ { 0x196B, 7576 },
+ { 0x196C, 7664 },
+ { 0x196D, 7592 },
+ { 0x1970, 7692 },
+ { 0x1971, 7696 },
+ { 0x1972, 7700 },
+ { 0x1973, 7704 },
+ { 0x1974, 7708 },
+ { 0x1980, 6393 },
+ { 0x1981, 6267 },
+ { 0x1982, 6363 },
+ { 0x1983, 6417 },
+ { 0x1984, 6435 },
+ { 0x1985, 6237 },
+ { 0x1986, 6291 },
+ { 0x1987, 6309 },
+ { 0x1988, 6453 },
+ { 0x1989, 6399 },
+ { 0x198A, 6423 },
+ { 0x198B, 6327 },
+ { 0x198C, 6273 },
+ { 0x198D, 6297 },
+ { 0x198E, 6405 },
+ { 0x198F, 6447 },
+ { 0x1990, 6381 },
+ { 0x1991, 6279 },
+ { 0x1992, 6321 },
+ { 0x1993, 6255 },
+ { 0x1994, 6387 },
+ { 0x1995, 6441 },
+ { 0x1996, 6375 },
+ { 0x1997, 6261 },
+ { 0x1998, 6315 },
+ { 0x1999, 6249 },
+ { 0x199A, 6351 },
+ { 0x199B, 6411 },
+ { 0x199C, 6369 },
+ { 0x199D, 6225 },
+ { 0x199E, 6285 },
+ { 0x199F, 6243 },
+ { 0x19A0, 6357 },
+ { 0x19A1, 6345 },
+ { 0x19A2, 6339 },
+ { 0x19A3, 6231 },
+ { 0x19A4, 6219 },
+ { 0x19A5, 6213 },
+ { 0x19A6, 6429 },
+ { 0x19A7, 6459 },
+ { 0x19A8, 6303 },
+ { 0x19A9, 6333 },
+ { 0x19B0, 6206 },
+ { 0x19B1, 6128 },
+ { 0x19B2, 6146 },
+ { 0x19B3, 6122 },
+ { 0x19B4, 6176 },
+ { 0x19B5, 6110 },
+ { 0x19B6, 6134 },
+ { 0x19B7, 6116 },
+ { 0x19B8, 6158 },
+ { 0x19B9, 6170 },
+ { 0x19BA, 6140 },
+ { 0x19BB, 6188 },
+ { 0x19BC, 6182 },
+ { 0x19BD, 6164 },
+ { 0x19BE, 6194 },
+ { 0x19BF, 6200 },
+ { 0x19C0, 6152 },
+ { 0x19C1, 6495 },
+ { 0x19C2, 6501 },
+ { 0x19C3, 6489 },
+ { 0x19C4, 6483 },
+ { 0x19C5, 6477 },
+ { 0x19C6, 6471 },
+ { 0x19C7, 6465 },
+ { 0x19C8, 6050 },
+ { 0x19C9, 6055 },
+ { 0x19D0, 6090 },
+ { 0x19D1, 6060 },
+ { 0x19D2, 6070 },
+ { 0x19D3, 6105 },
+ { 0x19D4, 6080 },
+ { 0x19D5, 6075 },
+ { 0x19D6, 6065 },
+ { 0x19D7, 6100 },
+ { 0x19D8, 6095 },
+ { 0x19D9, 6085 },
+ { 0x19DE, 6040 },
+ { 0x19DF, 6045 },
+ { 0x19E0, 14375 },
+ { 0x19E1, 14288 },
+ { 0x19E2, 14272 },
+ { 0x19E3, 14206 },
+ { 0x19E4, 14280 },
+ { 0x19E5, 14296 },
+ { 0x19E6, 14368 },
+ { 0x19E7, 14352 },
+ { 0x19E8, 14344 },
+ { 0x19E9, 14360 },
+ { 0x19EA, 14214 },
+ { 0x19EB, 14328 },
+ { 0x19EC, 14312 },
+ { 0x19ED, 14304 },
+ { 0x19EE, 14320 },
+ { 0x19EF, 14336 },
+ { 0x19F0, 14372 },
+ { 0x19F1, 14284 },
+ { 0x19F2, 14268 },
+ { 0x19F3, 14202 },
+ { 0x19F4, 14276 },
+ { 0x19F5, 14292 },
+ { 0x19F6, 14364 },
+ { 0x19F7, 14348 },
+ { 0x19F8, 14340 },
+ { 0x19F9, 14356 },
+ { 0x19FA, 14210 },
+ { 0x19FB, 14324 },
+ { 0x19FC, 14308 },
+ { 0x19FD, 14300 },
+ { 0x19FE, 14316 },
+ { 0x19FF, 14332 },
+ { 0x1A00, 45814 },
+ { 0x1A01, 45805 },
+ { 0x1A02, 45847 },
+ { 0x1A03, 45856 },
+ { 0x1A04, 45826 },
+ { 0x1A05, 45796 },
+ { 0x1A06, 45820 },
+ { 0x1A07, 45844 },
+ { 0x1A08, 45835 },
+ { 0x1A09, 45802 },
+ { 0x1A0A, 45823 },
+ { 0x1A0B, 45850 },
+ { 0x1A0C, 45799 },
+ { 0x1A0D, 45811 },
+ { 0x1A0E, 45853 },
+ { 0x1A0F, 45859 },
+ { 0x1A10, 45841 },
+ { 0x1A11, 45829 },
+ { 0x1A12, 45817 },
+ { 0x1A13, 45838 },
+ { 0x1A14, 45832 },
+ { 0x1A15, 45793 },
+ { 0x1A16, 45808 },
+ { 0x1A17, 45777 },
+ { 0x1A18, 45785 },
+ { 0x1A19, 45773 },
+ { 0x1A1A, 45781 },
+ { 0x1A1B, 45789 },
+ { 0x1A1E, 45862 },
+ { 0x1A1F, 45769 },
+ { 0x1B00, 45088 },
+ { 0x1B01, 45092 },
+ { 0x1B02, 45099 },
+ { 0x1B03, 45102 },
+ { 0x1B04, 45096 },
+ { 0x1B05, 45383 },
+ { 0x1B06, 45386 },
+ { 0x1B07, 45393 },
+ { 0x1B08, 45396 },
+ { 0x1B09, 45407 },
+ { 0x1B0A, 45410 },
+ { 0x1B0B, 45315 },
+ { 0x1B0C, 45319 },
+ { 0x1B0D, 45286 },
+ { 0x1B0E, 45290 },
+ { 0x1B0F, 45390 },
+ { 0x1B10, 45414 },
+ { 0x1B11, 45400 },
+ { 0x1B12, 45403 },
+ { 0x1B13, 45276 },
+ { 0x1B14, 45279 },
+ { 0x1B15, 45259 },
+ { 0x1B16, 45262 },
+ { 0x1B17, 45365 },
+ { 0x1B18, 45231 },
+ { 0x1B19, 45234 },
+ { 0x1B1A, 45269 },
+ { 0x1B1B, 45272 },
+ { 0x1B1C, 45368 },
+ { 0x1B1D, 45342 },
+ { 0x1B1E, 45346 },
+ { 0x1B1F, 45245 },
+ { 0x1B20, 45250 },
+ { 0x1B21, 45301 },
+ { 0x1B22, 45335 },
+ { 0x1B23, 45338 },
+ { 0x1B24, 45238 },
+ { 0x1B25, 45241 },
+ { 0x1B26, 45298 },
+ { 0x1B27, 45305 },
+ { 0x1B28, 45308 },
+ { 0x1B29, 45224 },
+ { 0x1B2A, 45227 },
+ { 0x1B2B, 45295 },
+ { 0x1B2C, 45358 },
+ { 0x1B2D, 45312 },
+ { 0x1B2E, 45283 },
+ { 0x1B2F, 45355 },
+ { 0x1B30, 45327 },
+ { 0x1B31, 45331 },
+ { 0x1B32, 45324 },
+ { 0x1B33, 45266 },
+ { 0x1B34, 45105 },
+ { 0x1B35, 45218 },
+ { 0x1B36, 45171 },
+ { 0x1B37, 45175 },
+ { 0x1B38, 45180 },
+ { 0x1B39, 45184 },
+ { 0x1B3A, 45160 },
+ { 0x1B3B, 45165 },
+ { 0x1B3C, 45149 },
+ { 0x1B3D, 45154 },
+ { 0x1B3E, 45198 },
+ { 0x1B3F, 45202 },
+ { 0x1B40, 45213 },
+ { 0x1B41, 45207 },
+ { 0x1B42, 45189 },
+ { 0x1B43, 45193 },
+ { 0x1B44, 45085 },
+ { 0x1B45, 45361 },
+ { 0x1B46, 45375 },
+ { 0x1B47, 45379 },
+ { 0x1B48, 45255 },
+ { 0x1B49, 45351 },
+ { 0x1B4A, 45371 },
+ { 0x1B4B, 45417 },
+ { 0x1B50, 45135 },
+ { 0x1B51, 45117 },
+ { 0x1B52, 45123 },
+ { 0x1B53, 45144 },
+ { 0x1B54, 45129 },
+ { 0x1B55, 45126 },
+ { 0x1B56, 45120 },
+ { 0x1B57, 45141 },
+ { 0x1B58, 45138 },
+ { 0x1B59, 45132 },
+ { 0x1B5A, 45147 },
+ { 0x1B5B, 45421 },
+ { 0x1B5C, 45222 },
+ { 0x1B5D, 45114 },
+ { 0x1B5E, 45108 },
+ { 0x1B5F, 45111 },
+ { 0x1B60, 45568 },
+ { 0x1B61, 45445 },
+ { 0x1B62, 45437 },
+ { 0x1B63, 45449 },
+ { 0x1B64, 45423 },
+ { 0x1B65, 45432 },
+ { 0x1B66, 45441 },
+ { 0x1B67, 45453 },
+ { 0x1B68, 45461 },
+ { 0x1B69, 45457 },
+ { 0x1B6A, 45427 },
+ { 0x1B6B, 45480 },
+ { 0x1B6C, 45475 },
+ { 0x1B6D, 45497 },
+ { 0x1B6E, 45485 },
+ { 0x1B6F, 45509 },
+ { 0x1B70, 45502 },
+ { 0x1B71, 45490 },
+ { 0x1B72, 45470 },
+ { 0x1B73, 45465 },
+ { 0x1B74, 45550 },
+ { 0x1B75, 45544 },
+ { 0x1B76, 45562 },
+ { 0x1B77, 45556 },
+ { 0x1B78, 45514 },
+ { 0x1B79, 45526 },
+ { 0x1B7A, 45532 },
+ { 0x1B7B, 45538 },
+ { 0x1B7C, 45520 },
+ { 0x1B80, 65869 },
+ { 0x1B81, 65872 },
+ { 0x1B82, 65875 },
+ { 0x1B83, 65932 },
+ { 0x1B84, 65938 },
+ { 0x1B85, 65944 },
+ { 0x1B86, 65947 },
+ { 0x1B87, 65941 },
+ { 0x1B88, 65935 },
+ { 0x1B89, 65959 },
+ { 0x1B8A, 65974 },
+ { 0x1B8B, 65989 },
+ { 0x1B8C, 65965 },
+ { 0x1B8D, 66019 },
+ { 0x1B8E, 65953 },
+ { 0x1B8F, 65971 },
+ { 0x1B90, 66013 },
+ { 0x1B91, 66022 },
+ { 0x1B92, 65998 },
+ { 0x1B93, 65956 },
+ { 0x1B94, 65983 },
+ { 0x1B95, 65986 },
+ { 0x1B96, 65962 },
+ { 0x1B97, 66001 },
+ { 0x1B98, 65950 },
+ { 0x1B99, 65980 },
+ { 0x1B9A, 66010 },
+ { 0x1B9B, 65992 },
+ { 0x1B9C, 65977 },
+ { 0x1B9D, 66004 },
+ { 0x1B9E, 65995 },
+ { 0x1B9F, 66007 },
+ { 0x1BA0, 65968 },
+ { 0x1BA1, 66036 },
+ { 0x1BA2, 66032 },
+ { 0x1BA3, 66028 },
+ { 0x1BA4, 65916 },
+ { 0x1BA5, 65912 },
+ { 0x1BA6, 65924 },
+ { 0x1BA7, 65920 },
+ { 0x1BA8, 65908 },
+ { 0x1BA9, 65928 },
+ { 0x1BAA, 65866 },
+ { 0x1BAE, 66016 },
+ { 0x1BAF, 66025 },
+ { 0x1BB0, 65896 },
+ { 0x1BB1, 65878 },
+ { 0x1BB2, 65884 },
+ { 0x1BB3, 65905 },
+ { 0x1BB4, 65890 },
+ { 0x1BB5, 65887 },
+ { 0x1BB6, 65881 },
+ { 0x1BB7, 65902 },
+ { 0x1BB8, 65899 },
+ { 0x1BB9, 65893 },
+ { 0x1C00, 34194 },
+ { 0x1C01, 34251 },
+ { 0x1C02, 34248 },
+ { 0x1C03, 34185 },
+ { 0x1C04, 34242 },
+ { 0x1C05, 34257 },
+ { 0x1C06, 34176 },
+ { 0x1C07, 34230 },
+ { 0x1C08, 34191 },
+ { 0x1C09, 34260 },
+ { 0x1C0A, 34215 },
+ { 0x1C0B, 34272 },
+ { 0x1C0C, 34179 },
+ { 0x1C0D, 34203 },
+ { 0x1C0E, 34206 },
+ { 0x1C0F, 34266 },
+ { 0x1C10, 34263 },
+ { 0x1C11, 34182 },
+ { 0x1C12, 34239 },
+ { 0x1C13, 34173 },
+ { 0x1C14, 34227 },
+ { 0x1C15, 34200 },
+ { 0x1C16, 34254 },
+ { 0x1C17, 34275 },
+ { 0x1C18, 34281 },
+ { 0x1C19, 34236 },
+ { 0x1C1A, 34224 },
+ { 0x1C1B, 34209 },
+ { 0x1C1C, 34197 },
+ { 0x1C1D, 34188 },
+ { 0x1C1E, 34245 },
+ { 0x1C1F, 34218 },
+ { 0x1C20, 34212 },
+ { 0x1C21, 34269 },
+ { 0x1C22, 34221 },
+ { 0x1C23, 34170 },
+ { 0x1C24, 34327 },
+ { 0x1C25, 34323 },
+ { 0x1C26, 34158 },
+ { 0x1C27, 34146 },
+ { 0x1C28, 34150 },
+ { 0x1C29, 34162 },
+ { 0x1C2A, 34154 },
+ { 0x1C2B, 34166 },
+ { 0x1C2C, 34142 },
+ { 0x1C2D, 34287 },
+ { 0x1C2E, 34295 },
+ { 0x1C2F, 34291 },
+ { 0x1C30, 34299 },
+ { 0x1C31, 34303 },
+ { 0x1C32, 34307 },
+ { 0x1C33, 34311 },
+ { 0x1C34, 34319 },
+ { 0x1C35, 34315 },
+ { 0x1C36, 34106 },
+ { 0x1C37, 34109 },
+ { 0x1C3B, 34339 },
+ { 0x1C3C, 34331 },
+ { 0x1C3D, 34336 },
+ { 0x1C3E, 34345 },
+ { 0x1C3F, 34342 },
+ { 0x1C40, 34130 },
+ { 0x1C41, 34112 },
+ { 0x1C42, 34118 },
+ { 0x1C43, 34139 },
+ { 0x1C44, 34124 },
+ { 0x1C45, 34121 },
+ { 0x1C46, 34115 },
+ { 0x1C47, 34136 },
+ { 0x1C48, 34133 },
+ { 0x1C49, 34127 },
+ { 0x1C4D, 34278 },
+ { 0x1C4E, 34284 },
+ { 0x1C4F, 34233 },
+ { 0x1C50, 112 },
+ { 0x1C51, 88 },
+ { 0x1C52, 96 },
+ { 0x1C53, 124 },
+ { 0x1C54, 104 },
+ { 0x1C55, 100 },
+ { 0x1C56, 92 },
+ { 0x1C57, 120 },
+ { 0x1C58, 116 },
+ { 0x1C59, 108 },
+ { 0x1C5A, 163 },
+ { 0x1C5B, 139 },
+ { 0x1C5C, 131 },
+ { 0x1C5D, 223 },
+ { 0x1C5E, 135 },
+ { 0x1C5F, 239 },
+ { 0x1C60, 211 },
+ { 0x1C61, 207 },
+ { 0x1C62, 215 },
+ { 0x1C63, 219 },
+ { 0x1C64, 171 },
+ { 0x1C65, 159 },
+ { 0x1C66, 151 },
+ { 0x1C67, 235 },
+ { 0x1C68, 155 },
+ { 0x1C69, 179 },
+ { 0x1C6A, 195 },
+ { 0x1C6B, 199 },
+ { 0x1C6C, 247 },
+ { 0x1C6D, 203 },
+ { 0x1C6E, 167 },
+ { 0x1C6F, 147 },
+ { 0x1C70, 227 },
+ { 0x1C71, 143 },
+ { 0x1C72, 231 },
+ { 0x1C73, 175 },
+ { 0x1C74, 243 },
+ { 0x1C75, 183 },
+ { 0x1C76, 191 },
+ { 0x1C77, 187 },
+ { 0x1C78, 81 },
+ { 0x1C79, 251 },
+ { 0x1C7A, 258 },
+ { 0x1C7B, 128 },
+ { 0x1C7C, 255 },
+ { 0x1C7D, 85 },
+ { 0x1C7E, 267 },
+ { 0x1C7F, 262 },
+ { 0x1D00, 17949 },
+ { 0x1D01, 18083 },
+ { 0x1D02, 17650 },
+ { 0x1D03, 18119 },
+ { 0x1D04, 17959 },
+ { 0x1D05, 17964 },
+ { 0x1D06, 18098 },
+ { 0x1D07, 17969 },
+ { 0x1D08, 17660 },
+ { 0x1D09, 17575 },
+ { 0x1D0A, 18001 },
+ { 0x1D0B, 18006 },
+ { 0x1D0C, 18016 },
+ { 0x1D0D, 18023 },
+ { 0x1D0E, 18143 },
+ { 0x1D0F, 18033 },
+ { 0x1D10, 18113 },
+ { 0x1D11, 17804 },
+ { 0x1D12, 17821 },
+ { 0x1D13, 17809 },
+ { 0x1D14, 17655 },
+ { 0x1D15, 18093 },
+ { 0x1D16, 17292 },
+ { 0x1D17, 17499 },
+ { 0x1D18, 18038 },
+ { 0x1D19, 18149 },
+ { 0x1D1A, 18131 },
+ { 0x1D1B, 18053 },
+ { 0x1D1C, 18058 },
+ { 0x1D1D, 17816 },
+ { 0x1D1E, 17833 },
+ { 0x1D1F, 17827 },
+ { 0x1D20, 18063 },
+ { 0x1D21, 18068 },
+ { 0x1D22, 18078 },
+ { 0x1D23, 18103 },
+ { 0x1D24, 18159 },
+ { 0x1D25, 17938 },
+ { 0x1D26, 12051 },
+ { 0x1D27, 12056 },
+ { 0x1D28, 12036 },
+ { 0x1D29, 12046 },
+ { 0x1D2A, 12041 },
+ { 0x1D2B, 49409 },
+ { 0x1D2C, 54616 },
+ { 0x1D2D, 54692 },
+ { 0x1D2E, 54620 },
+ { 0x1D2F, 54700 },
+ { 0x1D30, 54624 },
+ { 0x1D31, 54628 },
+ { 0x1D32, 54705 },
+ { 0x1D33, 54632 },
+ { 0x1D34, 54636 },
+ { 0x1D35, 54640 },
+ { 0x1D36, 54644 },
+ { 0x1D37, 54648 },
+ { 0x1D38, 54652 },
+ { 0x1D39, 54656 },
+ { 0x1D3A, 54660 },
+ { 0x1D3B, 54710 },
+ { 0x1D3C, 54664 },
+ { 0x1D3D, 54696 },
+ { 0x1D3E, 54668 },
+ { 0x1D3F, 54672 },
+ { 0x1D40, 54676 },
+ { 0x1D41, 54680 },
+ { 0x1D42, 54688 },
+ { 0x1D43, 54136 },
+ { 0x1D44, 54421 },
+ { 0x1D45, 54375 },
+ { 0x1D46, 54466 },
+ { 0x1D47, 54140 },
+ { 0x1D48, 54154 },
+ { 0x1D49, 54158 },
+ { 0x1D4A, 54397 },
+ { 0x1D4B, 54365 },
+ { 0x1D4C, 54471 },
+ { 0x1D4D, 54166 },
+ { 0x1D4E, 54431 },
+ { 0x1D4F, 54196 },
+ { 0x1D50, 54218 },
+ { 0x1D51, 54331 },
+ { 0x1D52, 54242 },
+ { 0x1D53, 54370 },
+ { 0x1D54, 54351 },
+ { 0x1D55, 54410 },
+ { 0x1D56, 54246 },
+ { 0x1D57, 54264 },
+ { 0x1D58, 54275 },
+ { 0x1D59, 54538 },
+ { 0x1D5A, 54436 },
+ { 0x1D5B, 54284 },
+ { 0x1D5C, 54323 },
+ { 0x1D5D, 54357 },
+ { 0x1D5E, 54392 },
+ { 0x1D5F, 54379 },
+ { 0x1D60, 54387 },
+ { 0x1D61, 54327 },
+ { 0x1D62, 20792 },
+ { 0x1D63, 20807 },
+ { 0x1D64, 20812 },
+ { 0x1D65, 20817 },
+ { 0x1D66, 13101 },
+ { 0x1D67, 13106 },
+ { 0x1D68, 13096 },
+ { 0x1D69, 13091 },
+ { 0x1D6A, 13086 },
+ { 0x1D6B, 17177 },
+ { 0x1D6C, 14742 },
+ { 0x1D6D, 14886 },
+ { 0x1D6E, 15140 },
+ { 0x1D6F, 15661 },
+ { 0x1D70, 15745 },
+ { 0x1D71, 16100 },
+ { 0x1D72, 16239 },
+ { 0x1D73, 16271 },
+ { 0x1D74, 16370 },
+ { 0x1D75, 16446 },
+ { 0x1D76, 16999 },
+ { 0x1D77, 17549 },
+ { 0x1D78, 54782 },
+ { 0x1D79, 17723 },
+ { 0x1D7A, 17162 },
+ { 0x1D7B, 17883 },
+ { 0x1D7C, 17331 },
+ { 0x1D7D, 16107 },
+ { 0x1D7E, 17890 },
+ { 0x1D7F, 17747 },
+ { 0x1D80, 14761 },
+ { 0x1D81, 14911 },
+ { 0x1D82, 15147 },
+ { 0x1D83, 15207 },
+ { 0x1D84, 15493 },
+ { 0x1D85, 15610 },
+ { 0x1D86, 15668 },
+ { 0x1D87, 15758 },
+ { 0x1D88, 16121 },
+ { 0x1D89, 16258 },
+ { 0x1D8A, 16383 },
+ { 0x1D8B, 17211 },
+ { 0x1D8C, 16764 },
+ { 0x1D8D, 16844 },
+ { 0x1D8E, 17012 },
+ { 0x1D8F, 14656 },
+ { 0x1D90, 17433 },
+ { 0x1D91, 14859 },
+ { 0x1D92, 15061 },
+ { 0x1D93, 17375 },
+ { 0x1D94, 17791 },
+ { 0x1D95, 17458 },
+ { 0x1D96, 15395 },
+ { 0x1D97, 17388 },
+ { 0x1D98, 17218 },
+ { 0x1D99, 16708 },
+ { 0x1D9A, 17251 },
+ { 0x1D9B, 54477 },
+ { 0x1D9C, 54144 },
+ { 0x1D9D, 54148 },
+ { 0x1D9E, 54339 },
+ { 0x1D9F, 54526 },
+ { 0x1DA0, 54162 },
+ { 0x1DA1, 54515 },
+ { 0x1DA2, 54416 },
+ { 0x1DA3, 54426 },
+ { 0x1DA4, 54180 },
+ { 0x1DA5, 54361 },
+ { 0x1DA6, 54482 },
+ { 0x1DA7, 54487 },
+ { 0x1DA8, 54190 },
+ { 0x1DA9, 54211 },
+ { 0x1DAA, 54204 },
+ { 0x1DAB, 54494 },
+ { 0x1DAC, 54222 },
+ { 0x1DAD, 54441 },
+ { 0x1DAE, 54228 },
+ { 0x1DAF, 54235 },
+ { 0x1DB0, 54499 },
+ { 0x1DB1, 54405 },
+ { 0x1DB2, 54347 },
+ { 0x1DB3, 54258 },
+ { 0x1DB4, 54335 },
+ { 0x1DB5, 54268 },
+ { 0x1DB6, 54279 },
+ { 0x1DB7, 54522 },
+ { 0x1DB8, 54504 },
+ { 0x1DB9, 54288 },
+ { 0x1DBA, 54461 },
+ { 0x1DBB, 54306 },
+ { 0x1DBC, 54316 },
+ { 0x1DBD, 54310 },
+ { 0x1DBE, 54343 },
+ { 0x1DBF, 54401 },
+ { 0x1DC0, 57864 },
+ { 0x1DC1, 57860 },
+ { 0x1DC2, 57834 },
+ { 0x1DC3, 58302 },
+ { 0x1DC4, 58317 },
+ { 0x1DC5, 58315 },
+ { 0x1DC6, 58321 },
+ { 0x1DC7, 58311 },
+ { 0x1DC8, 58333 },
+ { 0x1DC9, 58331 },
+ { 0x1DCA, 57657 },
+ { 0x1DCB, 58313 },
+ { 0x1DCC, 58319 },
+ { 0x1DCD, 57933 },
+ { 0x1DCE, 57961 },
+ { 0x1DCF, 57977 },
+ { 0x1DD0, 57389 },
+ { 0x1DD1, 57396 },
+ { 0x1DD2, 57399 },
+ { 0x1DD3, 57731 },
+ { 0x1DD4, 57699 },
+ { 0x1DD5, 57704 },
+ { 0x1DD6, 57709 },
+ { 0x1DD7, 57596 },
+ { 0x1DD8, 57725 },
+ { 0x1DD9, 57714 },
+ { 0x1DDA, 57612 },
+ { 0x1DDB, 57739 },
+ { 0x1DDC, 57627 },
+ { 0x1DDD, 57632 },
+ { 0x1DDE, 57745 },
+ { 0x1DDF, 57751 },
+ { 0x1DE0, 57642 },
+ { 0x1DE1, 57757 },
+ { 0x1DE2, 57763 },
+ { 0x1DE3, 57663 },
+ { 0x1DE4, 57669 },
+ { 0x1DE5, 57719 },
+ { 0x1DE6, 57694 },
+ { 0x1DFE, 57476 },
+ { 0x1DFF, 57806 },
+ { 0x1E00, 18281 },
+ { 0x1E01, 14523 },
+ { 0x1E02, 18458 },
+ { 0x1E03, 14715 },
+ { 0x1E04, 18465 },
+ { 0x1E05, 14722 },
+ { 0x1E06, 18478 },
+ { 0x1E07, 14735 },
+ { 0x1E08, 18538 },
+ { 0x1E09, 14815 },
+ { 0x1E0A, 18556 },
+ { 0x1E0B, 14833 },
+ { 0x1E0C, 18563 },
+ { 0x1E0D, 14840 },
+ { 0x1E0E, 18576 },
+ { 0x1E0F, 14867 },
+ { 0x1E10, 18619 },
+ { 0x1E11, 14905 },
+ { 0x1E12, 18625 },
+ { 0x1E13, 14918 },
+ { 0x1E14, 18715 },
+ { 0x1E15, 15014 },
+ { 0x1E16, 18707 },
+ { 0x1E17, 15006 },
+ { 0x1E18, 18810 },
+ { 0x1E19, 15116 },
+ { 0x1E1A, 18687 },
+ { 0x1E1B, 14986 },
+ { 0x1E1C, 18741 },
+ { 0x1E1D, 15040 },
+ { 0x1E1E, 18821 },
+ { 0x1E1F, 15127 },
+ { 0x1E20, 18869 },
+ { 0x1E21, 15189 },
+ { 0x1E22, 18897 },
+ { 0x1E23, 15224 },
+ { 0x1E24, 18904 },
+ { 0x1E25, 15231 },
+ { 0x1E26, 18942 },
+ { 0x1E27, 15282 },
+ { 0x1E28, 18930 },
+ { 0x1E29, 15270 },
+ { 0x1E2A, 18911 },
+ { 0x1E2B, 15251 },
+ { 0x1E2C, 19009 },
+ { 0x1E2D, 15342 },
+ { 0x1E2E, 19054 },
+ { 0x1E2F, 15387 },
+ { 0x1E30, 19108 },
+ { 0x1E31, 15460 },
+ { 0x1E32, 19088 },
+ { 0x1E33, 15440 },
+ { 0x1E34, 19101 },
+ { 0x1E35, 15453 },
+ { 0x1E36, 19164 },
+ { 0x1E37, 15523 },
+ { 0x1E38, 19171 },
+ { 0x1E39, 15530 },
+ { 0x1E3A, 19187 },
+ { 0x1E3B, 15558 },
+ { 0x1E3C, 19247 },
+ { 0x1E3D, 15624 },
+ { 0x1E3E, 19278 },
+ { 0x1E3F, 15655 },
+ { 0x1E40, 19258 },
+ { 0x1E41, 15635 },
+ { 0x1E42, 19265 },
+ { 0x1E43, 15642 },
+ { 0x1E44, 19288 },
+ { 0x1E45, 15679 },
+ { 0x1E46, 19295 },
+ { 0x1E47, 15686 },
+ { 0x1E48, 19309 },
+ { 0x1E49, 15706 },
+ { 0x1E4A, 19362 },
+ { 0x1E4B, 15772 },
+ { 0x1E4C, 19495 },
+ { 0x1E4D, 15920 },
+ { 0x1E4E, 19511 },
+ { 0x1E4F, 15936 },
+ { 0x1E50, 19547 },
+ { 0x1E51, 15972 },
+ { 0x1E52, 19539 },
+ { 0x1E53, 15964 },
+ { 0x1E54, 19676 },
+ { 0x1E55, 16094 },
+ { 0x1E56, 19663 },
+ { 0x1E57, 16081 },
+ { 0x1E58, 19732 },
+ { 0x1E59, 16177 },
+ { 0x1E5A, 19739 },
+ { 0x1E5B, 16184 },
+ { 0x1E5C, 19746 },
+ { 0x1E5D, 16191 },
+ { 0x1E5E, 19755 },
+ { 0x1E5F, 16200 },
+ { 0x1E60, 19815 },
+ { 0x1E61, 16296 },
+ { 0x1E62, 19822 },
+ { 0x1E63, 16303 },
+ { 0x1E64, 19845 },
+ { 0x1E65, 16332 },
+ { 0x1E66, 19860 },
+ { 0x1E67, 16347 },
+ { 0x1E68, 19829 },
+ { 0x1E69, 16310 },
+ { 0x1E6A, 19892 },
+ { 0x1E6B, 16400 },
+ { 0x1E6C, 19899 },
+ { 0x1E6D, 16407 },
+ { 0x1E6E, 19912 },
+ { 0x1E6F, 16426 },
+ { 0x1E70, 19958 },
+ { 0x1E71, 16492 },
+ { 0x1E72, 20167 },
+ { 0x1E73, 16701 },
+ { 0x1E74, 20081 },
+ { 0x1E75, 16615 },
+ { 0x1E76, 20180 },
+ { 0x1E77, 16721 },
+ { 0x1E78, 20073 },
+ { 0x1E79, 16607 },
+ { 0x1E7A, 20108 },
+ { 0x1E7B, 16642 },
+ { 0x1E7C, 20204 },
+ { 0x1E7D, 16758 },
+ { 0x1E7E, 20191 },
+ { 0x1E7F, 16732 },
+ { 0x1E80, 20247 },
+ { 0x1E81, 16815 },
+ { 0x1E82, 20241 },
+ { 0x1E83, 16809 },
+ { 0x1E84, 20253 },
+ { 0x1E85, 16821 },
+ { 0x1E86, 20221 },
+ { 0x1E87, 16782 },
+ { 0x1E88, 20228 },
+ { 0x1E89, 16789 },
+ { 0x1E8A, 20269 },
+ { 0x1E8B, 16837 },
+ { 0x1E8C, 20276 },
+ { 0x1E8D, 16851 },
+ { 0x1E8E, 20286 },
+ { 0x1E8F, 16861 },
+ { 0x1E90, 20416 },
+ { 0x1E91, 17032 },
+ { 0x1E92, 20372 },
+ { 0x1E93, 16954 },
+ { 0x1E94, 20385 },
+ { 0x1E95, 16973 },
+ { 0x1E96, 15244 },
+ { 0x1E97, 16479 },
+ { 0x1E98, 16802 },
+ { 0x1E99, 16894 },
+ { 0x1E9A, 14596 },
+ { 0x1E9B, 17346 },
+ { 0x1E9C, 17362 },
+ { 0x1E9D, 17354 },
+ { 0x1E9E, 20613 },
+ { 0x1E9F, 17440 },
+ { 0x1EA0, 18251 },
+ { 0x1EA1, 14493 },
+ { 0x1EA2, 18258 },
+ { 0x1EA3, 14500 },
+ { 0x1EA4, 18430 },
+ { 0x1EA5, 14687 },
+ { 0x1EA6, 18438 },
+ { 0x1EA7, 14695 },
+ { 0x1EA8, 18421 },
+ { 0x1EA9, 14678 },
+ { 0x1EAA, 18446 },
+ { 0x1EAB, 14703 },
+ { 0x1EAC, 18412 },
+ { 0x1EAD, 14669 },
+ { 0x1EAE, 18318 },
+ { 0x1EAF, 14560 },
+ { 0x1EB0, 18326 },
+ { 0x1EB1, 14568 },
+ { 0x1EB2, 18309 },
+ { 0x1EB3, 14551 },
+ { 0x1EB4, 18334 },
+ { 0x1EB5, 14576 },
+ { 0x1EB6, 18300 },
+ { 0x1EB7, 14542 },
+ { 0x1EB8, 18643 },
+ { 0x1EB9, 14936 },
+ { 0x1EBA, 18650 },
+ { 0x1EBB, 14943 },
+ { 0x1EBC, 18681 },
+ { 0x1EBD, 14980 },
+ { 0x1EBE, 18786 },
+ { 0x1EBF, 15092 },
+ { 0x1EC0, 18794 },
+ { 0x1EC1, 15100 },
+ { 0x1EC2, 18777 },
+ { 0x1EC3, 15083 },
+ { 0x1EC4, 18802 },
+ { 0x1EC5, 15108 },
+ { 0x1EC6, 18768 },
+ { 0x1EC7, 15074 },
+ { 0x1EC8, 18972 },
+ { 0x1EC9, 15305 },
+ { 0x1ECA, 18965 },
+ { 0x1ECB, 15298 },
+ { 0x1ECC, 19389 },
+ { 0x1ECD, 15806 },
+ { 0x1ECE, 19396 },
+ { 0x1ECF, 15821 },
+ { 0x1ED0, 19635 },
+ { 0x1ED1, 16053 },
+ { 0x1ED2, 19643 },
+ { 0x1ED3, 16061 },
+ { 0x1ED4, 19626 },
+ { 0x1ED5, 16044 },
+ { 0x1ED6, 19651 },
+ { 0x1ED7, 16069 },
+ { 0x1ED8, 19617 },
+ { 0x1ED9, 16035 },
+ { 0x1EDA, 19427 },
+ { 0x1EDB, 15852 },
+ { 0x1EDC, 19435 },
+ { 0x1EDD, 15860 },
+ { 0x1EDE, 19418 },
+ { 0x1EDF, 15843 },
+ { 0x1EE0, 19443 },
+ { 0x1EE1, 15868 },
+ { 0x1EE2, 19409 },
+ { 0x1EE3, 15834 },
+ { 0x1EE4, 19974 },
+ { 0x1EE5, 16508 },
+ { 0x1EE6, 19981 },
+ { 0x1EE7, 16515 },
+ { 0x1EE8, 20012 },
+ { 0x1EE9, 16546 },
+ { 0x1EEA, 20020 },
+ { 0x1EEB, 16554 },
+ { 0x1EEC, 20003 },
+ { 0x1EED, 16537 },
+ { 0x1EEE, 20028 },
+ { 0x1EEF, 16562 },
+ { 0x1EF0, 19994 },
+ { 0x1EF1, 16528 },
+ { 0x1EF2, 20325 },
+ { 0x1EF3, 16907 },
+ { 0x1EF4, 20293 },
+ { 0x1EF5, 16868 },
+ { 0x1EF6, 20306 },
+ { 0x1EF7, 16881 },
+ { 0x1EF8, 20331 },
+ { 0x1EF9, 16913 },
+ { 0x1EFA, 20759 },
+ { 0x1EFB, 17868 },
+ { 0x1EFC, 20754 },
+ { 0x1EFD, 17863 },
+ { 0x1EFE, 20313 },
+ { 0x1EFF, 16888 },
+ { 0x1F00, 11230 },
+ { 0x1F01, 11162 },
+ { 0x1F02, 11254 },
+ { 0x1F03, 11186 },
+ { 0x1F04, 11236 },
+ { 0x1F05, 11168 },
+ { 0x1F06, 11272 },
+ { 0x1F07, 11204 },
+ { 0x1F08, 12506 },
+ { 0x1F09, 12438 },
+ { 0x1F0A, 12530 },
+ { 0x1F0B, 12462 },
+ { 0x1F0C, 12512 },
+ { 0x1F0D, 12444 },
+ { 0x1F0E, 12548 },
+ { 0x1F0F, 12480 },
+ { 0x1F10, 11631 },
+ { 0x1F11, 11609 },
+ { 0x1F12, 11645 },
+ { 0x1F13, 11623 },
+ { 0x1F14, 11637 },
+ { 0x1F15, 11615 },
+ { 0x1F18, 12829 },
+ { 0x1F19, 12807 },
+ { 0x1F1A, 12843 },
+ { 0x1F1B, 12821 },
+ { 0x1F1C, 12835 },
+ { 0x1F1D, 12813 },
+ { 0x1F20, 10850 },
+ { 0x1F21, 10782 },
+ { 0x1F22, 10874 },
+ { 0x1F23, 10806 },
+ { 0x1F24, 10856 },
+ { 0x1F25, 10788 },
+ { 0x1F26, 10892 },
+ { 0x1F27, 10824 },
+ { 0x1F28, 12200 },
+ { 0x1F29, 12132 },
+ { 0x1F2A, 12224 },
+ { 0x1F2B, 12156 },
+ { 0x1F2C, 12206 },
+ { 0x1F2D, 12138 },
+ { 0x1F2E, 12242 },
+ { 0x1F2F, 12174 },
+ { 0x1F30, 11042 },
+ { 0x1F31, 11012 },
+ { 0x1F32, 11056 },
+ { 0x1F33, 11026 },
+ { 0x1F34, 11048 },
+ { 0x1F35, 11018 },
+ { 0x1F36, 11064 },
+ { 0x1F37, 11034 },
+ { 0x1F38, 12364 },
+ { 0x1F39, 12334 },
+ { 0x1F3A, 12378 },
+ { 0x1F3B, 12348 },
+ { 0x1F3C, 12370 },
+ { 0x1F3D, 12340 },
+ { 0x1F3E, 12386 },
+ { 0x1F3F, 12356 },
+ { 0x1F40, 11697 },
+ { 0x1F41, 11675 },
+ { 0x1F42, 11711 },
+ { 0x1F43, 11689 },
+ { 0x1F44, 11703 },
+ { 0x1F45, 11681 },
+ { 0x1F48, 12895 },
+ { 0x1F49, 12873 },
+ { 0x1F4A, 12909 },
+ { 0x1F4B, 12887 },
+ { 0x1F4C, 12901 },
+ { 0x1F4D, 12879 },
+ { 0x1F50, 11771 },
+ { 0x1F51, 11741 },
+ { 0x1F52, 11785 },
+ { 0x1F53, 11755 },
+ { 0x1F54, 11777 },
+ { 0x1F55, 11747 },
+ { 0x1F56, 11793 },
+ { 0x1F57, 11763 },
+ { 0x1F59, 12939 },
+ { 0x1F5B, 12953 },
+ { 0x1F5D, 12945 },
+ { 0x1F5F, 12961 },
+ { 0x1F60, 11461 },
+ { 0x1F61, 11393 },
+ { 0x1F62, 11485 },
+ { 0x1F63, 11417 },
+ { 0x1F64, 11467 },
+ { 0x1F65, 11399 },
+ { 0x1F66, 11503 },
+ { 0x1F67, 11435 },
+ { 0x1F68, 12698 },
+ { 0x1F69, 12630 },
+ { 0x1F6A, 12722 },
+ { 0x1F6B, 12654 },
+ { 0x1F6C, 12704 },
+ { 0x1F6D, 12636 },
+ { 0x1F6E, 12740 },
+ { 0x1F6F, 12672 },
+ { 0x1F70, 11304 },
+ { 0x1F71, 11148 },
+ { 0x1F72, 11659 },
+ { 0x1F73, 11603 },
+ { 0x1F74, 10924 },
+ { 0x1F75, 10768 },
+ { 0x1F76, 11078 },
+ { 0x1F77, 11006 },
+ { 0x1F78, 11725 },
+ { 0x1F79, 11669 },
+ { 0x1F7A, 11807 },
+ { 0x1F7B, 11735 },
+ { 0x1F7C, 11535 },
+ { 0x1F7D, 11379 },
+ { 0x1F80, 11290 },
+ { 0x1F81, 11222 },
+ { 0x1F82, 11262 },
+ { 0x1F83, 11194 },
+ { 0x1F84, 11244 },
+ { 0x1F85, 11176 },
+ { 0x1F86, 11280 },
+ { 0x1F87, 11212 },
+ { 0x1F88, 12566 },
+ { 0x1F89, 12498 },
+ { 0x1F8A, 12538 },
+ { 0x1F8B, 12470 },
+ { 0x1F8C, 12520 },
+ { 0x1F8D, 12452 },
+ { 0x1F8E, 12556 },
+ { 0x1F8F, 12488 },
+ { 0x1F90, 10910 },
+ { 0x1F91, 10842 },
+ { 0x1F92, 10882 },
+ { 0x1F93, 10814 },
+ { 0x1F94, 10864 },
+ { 0x1F95, 10796 },
+ { 0x1F96, 10900 },
+ { 0x1F97, 10832 },
+ { 0x1F98, 12260 },
+ { 0x1F99, 12192 },
+ { 0x1F9A, 12232 },
+ { 0x1F9B, 12164 },
+ { 0x1F9C, 12214 },
+ { 0x1F9D, 12146 },
+ { 0x1F9E, 12250 },
+ { 0x1F9F, 12182 },
+ { 0x1FA0, 11521 },
+ { 0x1FA1, 11453 },
+ { 0x1FA2, 11493 },
+ { 0x1FA3, 11425 },
+ { 0x1FA4, 11475 },
+ { 0x1FA5, 11407 },
+ { 0x1FA6, 11511 },
+ { 0x1FA7, 11443 },
+ { 0x1FA8, 12758 },
+ { 0x1FA9, 12690 },
+ { 0x1FAA, 12730 },
+ { 0x1FAB, 12662 },
+ { 0x1FAC, 12712 },
+ { 0x1FAD, 12644 },
+ { 0x1FAE, 12748 },
+ { 0x1FAF, 12680 },
+ { 0x1FB0, 11324 },
+ { 0x1FB1, 11318 },
+ { 0x1FB2, 11310 },
+ { 0x1FB3, 11344 },
+ { 0x1FB4, 11154 },
+ { 0x1FB6, 11330 },
+ { 0x1FB7, 11336 },
+ { 0x1FB8, 12592 },
+ { 0x1FB9, 12586 },
+ { 0x1FBA, 12580 },
+ { 0x1FBB, 12432 },
+ { 0x1FBC, 12598 },
+ { 0x1FBD, 13025 },
+ { 0x1FBE, 13524 },
+ { 0x1FBF, 10724 },
+ { 0x1FC0, 13372 },
+ { 0x1FC1, 13079 },
+ { 0x1FC2, 10930 },
+ { 0x1FC3, 10952 },
+ { 0x1FC4, 10774 },
+ { 0x1FC6, 10938 },
+ { 0x1FC7, 10944 },
+ { 0x1FC8, 12857 },
+ { 0x1FC9, 12801 },
+ { 0x1FCA, 12274 },
+ { 0x1FCB, 12126 },
+ { 0x1FCC, 12280 },
+ { 0x1FCD, 10730 },
+ { 0x1FCE, 10726 },
+ { 0x1FCF, 10734 },
+ { 0x1FD0, 11090 },
+ { 0x1FD1, 11084 },
+ { 0x1FD2, 11118 },
+ { 0x1FD3, 11102 },
+ { 0x1FD6, 11134 },
+ { 0x1FD7, 11126 },
+ { 0x1FD8, 12412 },
+ { 0x1FD9, 12406 },
+ { 0x1FDA, 12400 },
+ { 0x1FDB, 12328 },
+ { 0x1FDD, 10706 },
+ { 0x1FDE, 10702 },
+ { 0x1FDF, 10710 },
+ { 0x1FE0, 11819 },
+ { 0x1FE1, 11813 },
+ { 0x1FE2, 11847 },
+ { 0x1FE3, 11831 },
+ { 0x1FE4, 10976 },
+ { 0x1FE5, 10970 },
+ { 0x1FE6, 11863 },
+ { 0x1FE7, 11855 },
+ { 0x1FE8, 12987 },
+ { 0x1FE9, 12981 },
+ { 0x1FEA, 12975 },
+ { 0x1FEB, 12933 },
+ { 0x1FEC, 12298 },
+ { 0x1FED, 13075 },
+ { 0x1FEE, 13071 },
+ { 0x1FEF, 11900 },
+ { 0x1FF2, 11541 },
+ { 0x1FF3, 11563 },
+ { 0x1FF4, 11385 },
+ { 0x1FF6, 11549 },
+ { 0x1FF7, 11555 },
+ { 0x1FF8, 12923 },
+ { 0x1FF9, 12867 },
+ { 0x1FFA, 12772 },
+ { 0x1FFB, 12624 },
+ { 0x1FFC, 12778 },
+ { 0x1FFD, 10692 },
+ { 0x1FFE, 10700 },
+ { 0x2000, 77 },
+ { 0x2001, 71 },
+ { 0x2002, 79 },
+ { 0x2003, 73 },
+ { 0x2004, 74478 },
+ { 0x2005, 68661 },
+ { 0x2006, 68597 },
+ { 0x2007, 31771 },
+ { 0x2008, 69272 },
+ { 0x2009, 10051 },
+ { 0x200A, 9123 },
+ { 0x200B, 10089 },
+ { 0x200C, 10099 },
+ { 0x200D, 10092 },
+ { 0x200E, 74617 },
+ { 0x200F, 75041 },
+ { 0x2010, 33424 },
+ { 0x2011, 74240 },
+ { 0x2012, 31769 },
+ { 0x2013, 75 },
+ { 0x2014, 69 },
+ { 0x2015, 67636 },
+ { 0x2016, 31692 },
+ { 0x2017, 31548 },
+ { 0x2018, 9381 },
+ { 0x2019, 21908 },
+ { 0x201A, 35854 },
+ { 0x201B, 35868 },
+ { 0x201C, 9365 },
+ { 0x201D, 21892 },
+ { 0x201E, 31570 },
+ { 0x201F, 31700 },
+ { 0x2020, 31169 },
+ { 0x2021, 31587 },
+ { 0x2022, 30312 },
+ { 0x2023, 68599 },
+ { 0x2024, 7161 },
+ { 0x2025, 7766 },
+ { 0x2026, 67661 },
+ { 0x2027, 68663 },
+ { 0x2028, 9483 },
+ { 0x2029, 65751 },
+ { 0x202A, 74621 },
+ { 0x202B, 75045 },
+ { 0x202C, 7173 },
+ { 0x202D, 74619 },
+ { 0x202E, 75043 },
+ { 0x202F, 35576 },
+ { 0x2030, 7170 },
+ { 0x2031, 7164 },
+ { 0x2032, 21742 },
+ { 0x2033, 31574 },
+ { 0x2034, 37619 },
+ { 0x2035, 55468 },
+ { 0x2036, 55475 },
+ { 0x2037, 55491 },
+ { 0x2038, 10441 },
+ { 0x2039, 35858 },
+ { 0x203A, 35863 },
+ { 0x203B, 65808 },
+ { 0x203C, 31695 },
+ { 0x203D, 69263 },
+ { 0x203E, 54945 },
+ { 0x203F, 56009 },
+ { 0x2040, 57360 },
+ { 0x2041, 10442 },
+ { 0x2042, 45084 },
+ { 0x2043, 33428 },
+ { 0x2044, 51779 },
+ { 0x2045, 9404 },
+ { 0x2046, 21931 },
+ { 0x2047, 31668 },
+ { 0x2048, 55448 },
+ { 0x2049, 68658 },
+ { 0x204A, 55895 },
+ { 0x204B, 55494 },
+ { 0x204C, 10314 },
+ { 0x204D, 10331 },
+ { 0x204E, 6038 },
+ { 0x204F, 55505 },
+ { 0x2050, 10452 },
+ { 0x2051, 7789 },
+ { 0x2052, 66839 },
+ { 0x2053, 22751 },
+ { 0x2054, 53355 },
+ { 0x2055, 31779 },
+ { 0x2056, 22989 },
+ { 0x2057, 65761 },
+ { 0x2058, 9100 },
+ { 0x2059, 9094 },
+ { 0x205A, 7769 },
+ { 0x205B, 9097 },
+ { 0x205C, 31529 },
+ { 0x205D, 55910 },
+ { 0x205E, 56031 },
+ { 0x205F, 35557 },
+ { 0x2060, 10087 },
+ { 0x2061, 51784 },
+ { 0x2062, 64310 },
+ { 0x2063, 64312 },
+ { 0x2064, 64308 },
+ { 0x206A, 40633 },
+ { 0x206B, 44713 },
+ { 0x206C, 40629 },
+ { 0x206D, 44709 },
+ { 0x206E, 54880 },
+ { 0x206F, 42828 },
+ { 0x2070, 69298 },
+ { 0x2071, 69302 },
+ { 0x2074, 69288 },
+ { 0x2075, 69286 },
+ { 0x2076, 69282 },
+ { 0x2077, 69317 },
+ { 0x2078, 69300 },
+ { 0x2079, 69293 },
+ { 0x207A, 69295 },
+ { 0x207B, 69312 },
+ { 0x207C, 69321 },
+ { 0x207D, 69290 },
+ { 0x207E, 69314 },
+ { 0x207F, 69307 },
+ { 0x2080, 65843 },
+ { 0x2081, 65825 },
+ { 0x2082, 65829 },
+ { 0x2083, 65854 },
+ { 0x2084, 65833 },
+ { 0x2085, 65831 },
+ { 0x2086, 65827 },
+ { 0x2087, 65852 },
+ { 0x2088, 65845 },
+ { 0x2089, 65838 },
+ { 0x208A, 65840 },
+ { 0x208B, 65847 },
+ { 0x208C, 65856 },
+ { 0x208D, 65835 },
+ { 0x208E, 65849 },
+ { 0x2090, 20782 },
+ { 0x2091, 20787 },
+ { 0x2092, 20802 },
+ { 0x2093, 20822 },
+ { 0x2094, 20827 },
+ { 0x20A0, 74597 },
+ { 0x20A1, 10456 },
+ { 0x20A2, 48519 },
+ { 0x20A3, 31787 },
+ { 0x20A4, 9505 },
+ { 0x20A5, 9596 },
+ { 0x20A6, 21269 },
+ { 0x20A7, 35651 },
+ { 0x20A8, 22442 },
+ { 0x20A9, 8709 },
+ { 0x20AA, 6507 },
+ { 0x20AB, 9068 },
+ { 0x20AC, 9089 },
+ { 0x20AD, 5797 },
+ { 0x20AE, 37669 },
+ { 0x20AF, 40498 },
+ { 0x20B0, 31791 },
+ { 0x20B1, 9631 },
+ { 0x20B2, 40560 },
+ { 0x20B3, 37779 },
+ { 0x20B4, 40627 },
+ { 0x20B5, 8727 },
+ { 0x20D0, 57472 },
+ { 0x20D1, 57795 },
+ { 0x20D2, 57497 },
+ { 0x20D3, 57829 },
+ { 0x20D4, 58327 },
+ { 0x20D5, 58236 },
+ { 0x20D6, 57454 },
+ { 0x20D7, 57787 },
+ { 0x20D8, 57512 },
+ { 0x20D9, 58232 },
+ { 0x20DA, 58323 },
+ { 0x20DB, 57837 },
+ { 0x20DC, 57423 },
+ { 0x20DD, 58245 },
+ { 0x20DE, 58258 },
+ { 0x20DF, 58266 },
+ { 0x20E0, 58248 },
+ { 0x20E1, 57462 },
+ { 0x20E2, 58255 },
+ { 0x20E3, 58252 },
+ { 0x20E4, 58261 },
+ { 0x20E5, 57987 },
+ { 0x20E6, 57928 },
+ { 0x20E7, 57980 },
+ { 0x20E8, 57967 },
+ { 0x20E9, 57515 },
+ { 0x20EA, 58269 },
+ { 0x20EB, 57484 },
+ { 0x20EC, 58296 },
+ { 0x20ED, 58273 },
+ { 0x20EE, 57458 },
+ { 0x20EF, 57791 },
+ { 0x20F0, 57998 },
+ { 0x2100, 37774 },
+ { 0x2101, 56104 },
+ { 0x2102, 74558 },
+ { 0x2103, 31181 },
+ { 0x2104, 30465 },
+ { 0x2105, 8725 },
+ { 0x2106, 8723 },
+ { 0x2107, 10628 },
+ { 0x2108, 43021 },
+ { 0x2109, 31183 },
+ { 0x210A, 35815 },
+ { 0x210B, 35833 },
+ { 0x210C, 69390 },
+ { 0x210D, 74561 },
+ { 0x210E, 35654 },
+ { 0x210F, 35656 },
+ { 0x2110, 35836 },
+ { 0x2111, 69393 },
+ { 0x2112, 35839 },
+ { 0x2113, 35818 },
+ { 0x2114, 0 },
+ { 0x2115, 74564 },
+ { 0x2116, 35635 },
+ { 0x2117, 22671 },
+ { 0x2118, 35845 },
+ { 0x2119, 74567 },
+ { 0x211A, 74570 },
+ { 0x211B, 35848 },
+ { 0x211C, 69396 },
+ { 0x211D, 74573 },
+ { 0x211E, 74242 },
+ { 0x211F, 55455 },
+ { 0x2120, 43025 },
+ { 0x2121, 66040 },
+ { 0x2122, 23055 },
+ { 0x2123, 56010 },
+ { 0x2124, 74576 },
+ { 0x2125, 21731 },
+ { 0x2126, 6813 },
+ { 0x2127, 53346 },
+ { 0x2128, 69399 },
+ { 0x2129, 37676 },
+ { 0x212A, 34094 },
+ { 0x212B, 44717 },
+ { 0x212C, 35824 },
+ { 0x212D, 69387 },
+ { 0x212E, 63380 },
+ { 0x212F, 35812 },
+ { 0x2130, 35827 },
+ { 0x2131, 35830 },
+ { 0x2132, 37684 },
+ { 0x2133, 35842 },
+ { 0x2134, 35821 },
+ { 0x2135, 8716 },
+ { 0x2136, 4380 },
+ { 0x2137, 10636 },
+ { 0x2138, 10477 },
+ { 0x2139, 69246 },
+ { 0x213A, 43017 },
+ { 0x213B, 63383 },
+ { 0x213C, 74532 },
+ { 0x213D, 74535 },
+ { 0x213E, 74582 },
+ { 0x213F, 74579 },
+ { 0x2140, 74529 },
+ { 0x2141, 37689 },
+ { 0x2142, 37693 },
+ { 0x2143, 55507 },
+ { 0x2144, 37697 },
+ { 0x2145, 74554 },
+ { 0x2146, 74538 },
+ { 0x2147, 74542 },
+ { 0x2148, 74546 },
+ { 0x2149, 74550 },
+ { 0x214A, 55384 },
+ { 0x214B, 37687 },
+ { 0x214C, 7168 },
+ { 0x214D, 69338 },
+ { 0x214E, 37681 },
+ { 0x214F, 36848 },
+ { 0x2153, 37724 },
+ { 0x2154, 37740 },
+ { 0x2155, 37716 },
+ { 0x2156, 37736 },
+ { 0x2157, 37760 },
+ { 0x2158, 37752 },
+ { 0x2159, 37720 },
+ { 0x215A, 37744 },
+ { 0x215B, 37728 },
+ { 0x215C, 37764 },
+ { 0x215D, 37748 },
+ { 0x215E, 37756 },
+ { 0x215F, 51781 },
+ { 0x2160, 22020 },
+ { 0x2161, 22057 },
+ { 0x2162, 22095 },
+ { 0x2163, 22071 },
+ { 0x2164, 22060 },
+ { 0x2165, 22042 },
+ { 0x2166, 22092 },
+ { 0x2167, 22077 },
+ { 0x2168, 22074 },
+ { 0x2169, 22050 },
+ { 0x216A, 22098 },
+ { 0x216B, 22101 },
+ { 0x216C, 22080 },
+ { 0x216D, 22023 },
+ { 0x216E, 22063 },
+ { 0x216F, 22032 },
+ { 0x2170, 22521 },
+ { 0x2171, 22543 },
+ { 0x2172, 22576 },
+ { 0x2173, 22556 },
+ { 0x2174, 22547 },
+ { 0x2175, 22535 },
+ { 0x2176, 22572 },
+ { 0x2177, 22564 },
+ { 0x2178, 22560 },
+ { 0x2179, 22539 },
+ { 0x217A, 22580 },
+ { 0x217B, 22584 },
+ { 0x217C, 22568 },
+ { 0x217D, 22525 },
+ { 0x217E, 22551 },
+ { 0x217F, 22530 },
+ { 0x2180, 22036 },
+ { 0x2181, 22067 },
+ { 0x2182, 22053 },
+ { 0x2183, 22104 },
+ { 0x2184, 17753 },
+ { 0x2185, 22045 },
+ { 0x2186, 22083 },
+ { 0x2187, 22088 },
+ { 0x2188, 22027 },
+ { 0x2190, 64325 },
+ { 0x2191, 44542 },
+ { 0x2192, 67992 },
+ { 0x2193, 63251 },
+ { 0x2194, 9258 },
+ { 0x2195, 303 },
+ { 0x2196, 21324 },
+ { 0x2197, 21277 },
+ { 0x2198, 22674 },
+ { 0x2199, 22713 },
+ { 0x219A, 64414 },
+ { 0x219B, 68077 },
+ { 0x219C, 64322 },
+ { 0x219D, 67989 },
+ { 0x219E, 64318 },
+ { 0x219F, 44538 },
+ { 0x21A0, 67985 },
+ { 0x21A1, 63247 },
+ { 0x21A2, 64384 },
+ { 0x21A3, 68042 },
+ { 0x21A4, 64345 },
+ { 0x21A5, 44548 },
+ { 0x21A6, 68003 },
+ { 0x21A7, 63257 },
+ { 0x21A8, 306 },
+ { 0x21A9, 64371 },
+ { 0x21AA, 68029 },
+ { 0x21AB, 64375 },
+ { 0x21AC, 68033 },
+ { 0x21AD, 9254 },
+ { 0x21AE, 9268 },
+ { 0x21AF, 63312 },
+ { 0x21B0, 44552 },
+ { 0x21B1, 44557 },
+ { 0x21B2, 63261 },
+ { 0x21B3, 63266 },
+ { 0x21B4, 68061 },
+ { 0x21B5, 63271 },
+ { 0x21B6, 74484 },
+ { 0x21B7, 57362 },
+ { 0x21B8, 21327 },
+ { 0x21B9, 64331 },
+ { 0x21BA, 74488 },
+ { 0x21BB, 57366 },
+ { 0x21BC, 64592 },
+ { 0x21BD, 64597 },
+ { 0x21BE, 44689 },
+ { 0x21BF, 44684 },
+ { 0x21C0, 68257 },
+ { 0x21C1, 68262 },
+ { 0x21C2, 63370 },
+ { 0x21C3, 63365 },
+ { 0x21C4, 68014 },
+ { 0x21C5, 44572 },
+ { 0x21C6, 64356 },
+ { 0x21C7, 64500 },
+ { 0x21C8, 44628 },
+ { 0x21C9, 68165 },
+ { 0x21CA, 63306 },
+ { 0x21CB, 64510 },
+ { 0x21CC, 68175 },
+ { 0x21CD, 64486 },
+ { 0x21CE, 9297 },
+ { 0x21CF, 68151 },
+ { 0x21D0, 64478 },
+ { 0x21D1, 44625 },
+ { 0x21D2, 68143 },
+ { 0x21D3, 63303 },
+ { 0x21D4, 9293 },
+ { 0x21D5, 319 },
+ { 0x21D6, 21365 },
+ { 0x21D7, 21314 },
+ { 0x21D8, 22709 },
+ { 0x21D9, 22736 },
+ { 0x21DA, 64507 },
+ { 0x21DB, 68172 },
+ { 0x21DC, 64602 },
+ { 0x21DD, 68267 },
+ { 0x21DE, 44562 },
+ { 0x21DF, 63276 },
+ { 0x21E0, 64471 },
+ { 0x21E1, 44622 },
+ { 0x21E2, 68136 },
+ { 0x21E3, 63300 },
+ { 0x21E4, 64327 },
+ { 0x21E5, 67994 },
+ { 0x21E6, 64468 },
+ { 0x21E7, 44581 },
+ { 0x21E8, 68128 },
+ { 0x21E9, 63295 },
+ { 0x21EA, 44605 },
+ { 0x21EB, 44584 },
+ { 0x21EC, 44597 },
+ { 0x21ED, 44589 },
+ { 0x21EE, 44610 },
+ { 0x21EF, 44614 },
+ { 0x21F0, 68131 },
+ { 0x21F1, 21333 },
+ { 0x21F2, 22677 },
+ { 0x21F3, 315 },
+ { 0x21F4, 21805 },
+ { 0x21F5, 63286 },
+ { 0x21F6, 22995 },
+ { 0x21F7, 64418 },
+ { 0x21F8, 68081 },
+ { 0x21F9, 9273 },
+ { 0x21FA, 64408 },
+ { 0x21FB, 68071 },
+ { 0x21FC, 9261 },
+ { 0x21FD, 64655 },
+ { 0x21FE, 68320 },
+ { 0x21FF, 9310 },
+ { 0x2200, 5791 },
+ { 0x2201, 66842 },
+ { 0x2202, 42971 },
+ { 0x2203, 22987 },
+ { 0x2204, 22983 },
+ { 0x2205, 10570 },
+ { 0x2206, 64305 },
+ { 0x2207, 21268 },
+ { 0x2208, 40500 },
+ { 0x2209, 6719 },
+ { 0x220A, 22599 },
+ { 0x220B, 48398 },
+ { 0x220C, 9033 },
+ { 0x220D, 22626 },
+ { 0x220E, 5788 },
+ { 0x220F, 21260 },
+ { 0x2210, 21262 },
+ { 0x2211, 21264 },
+ { 0x2212, 21178 },
+ { 0x2213, 74623 },
+ { 0x2214, 5780 },
+ { 0x2215, 50310 },
+ { 0x2216, 7176 },
+ { 0x2217, 45082 },
+ { 0x2218, 9706 },
+ { 0x2219, 30313 },
+ { 0x221A, 36200 },
+ { 0x221B, 9013 },
+ { 0x221C, 31785 },
+ { 0x221D, 74470 },
+ { 0x221E, 53300 },
+ { 0x221F, 21771 },
+ { 0x2220, 10106 },
+ { 0x2221, 53732 },
+ { 0x2222, 65815 },
+ { 0x2223, 40489 },
+ { 0x2224, 9023 },
+ { 0x2225, 54946 },
+ { 0x2226, 6764 },
+ { 0x2227, 40959 },
+ { 0x2228, 40927 },
+ { 0x2229, 69570 },
+ { 0x222A, 23058 },
+ { 0x222B, 53306 },
+ { 0x222C, 31664 },
+ { 0x222D, 37633 },
+ { 0x222E, 39790 },
+ { 0x222F, 43581 },
+ { 0x2230, 37710 },
+ { 0x2231, 57381 },
+ { 0x2232, 57378 },
+ { 0x2233, 74500 },
+ { 0x2234, 66307 },
+ { 0x2235, 37781 },
+ { 0x2236, 21746 },
+ { 0x2237, 67972 },
+ { 0x2238, 5784 },
+ { 0x2239, 31766 },
+ { 0x223A, 63794 },
+ { 0x223B, 67635 },
+ { 0x223C, 23021 },
+ { 0x223D, 55470 },
+ { 0x223E, 53349 },
+ { 0x223F, 9708 },
+ { 0x2240, 37772 },
+ { 0x2241, 6733 },
+ { 0x2242, 21204 },
+ { 0x2243, 75048 },
+ { 0x2244, 6777 },
+ { 0x2245, 74516 },
+ { 0x2246, 74505 },
+ { 0x2247, 42821 },
+ { 0x2248, 23692 },
+ { 0x2249, 6735 },
+ { 0x224A, 23687 },
+ { 0x224B, 37621 },
+ { 0x224C, 4011 },
+ { 0x224D, 67226 },
+ { 0x224E, 74602 },
+ { 0x224F, 67222 },
+ { 0x2250, 66827 },
+ { 0x2251, 74599 },
+ { 0x2252, 74519 },
+ { 0x2253, 13722 },
+ { 0x2254, 10458 },
+ { 0x2255, 31764 },
+ { 0x2256, 9695 },
+ { 0x2257, 9701 },
+ { 0x2258, 68616 },
+ { 0x2259, 63382 },
+ { 0x225A, 68654 },
+ { 0x225B, 9718 },
+ { 0x225C, 10479 },
+ { 0x225D, 10596 },
+ { 0x225E, 53730 },
+ { 0x225F, 67976 },
+ { 0x2260, 6730 },
+ { 0x2261, 64292 },
+ { 0x2262, 6767 },
+ { 0x2263, 55525 },
+ { 0x2264, 64658 },
+ { 0x2265, 69429 },
+ { 0x2266, 64722 },
+ { 0x2267, 69493 },
+ { 0x2268, 64712 },
+ { 0x2269, 69483 },
+ { 0x226A, 9599 },
+ { 0x226B, 9601 },
+ { 0x226C, 38099 },
+ { 0x226D, 6772 },
+ { 0x226E, 6770 },
+ { 0x226F, 6775 },
+ { 0x2270, 42793 },
+ { 0x2271, 42807 },
+ { 0x2272, 64692 },
+ { 0x2273, 69466 },
+ { 0x2274, 42798 },
+ { 0x2275, 42816 },
+ { 0x2276, 64699 },
+ { 0x2277, 69463 },
+ { 0x2278, 42803 },
+ { 0x2279, 42812 },
+ { 0x227A, 55334 },
+ { 0x227B, 55528 },
+ { 0x227C, 55335 },
+ { 0x227D, 55529 },
+ { 0x227E, 55339 },
+ { 0x227F, 55533 },
+ { 0x2280, 9052 },
+ { 0x2281, 9060 },
+ { 0x2282, 36469 },
+ { 0x2283, 55576 },
+ { 0x2284, 6711 },
+ { 0x2285, 6715 },
+ { 0x2286, 36471 },
+ { 0x2287, 55578 },
+ { 0x2288, 42779 },
+ { 0x2289, 42786 },
+ { 0x228A, 36484 },
+ { 0x228B, 55591 },
+ { 0x228C, 54875 },
+ { 0x228D, 54878 },
+ { 0x228E, 54876 },
+ { 0x228F, 36310 },
+ { 0x2290, 36425 },
+ { 0x2291, 36320 },
+ { 0x2292, 36435 },
+ { 0x2293, 36092 },
+ { 0x2294, 36094 },
+ { 0x2295, 38882 },
+ { 0x2296, 39182 },
+ { 0x2297, 39184 },
+ { 0x2298, 39468 },
+ { 0x2299, 38871 },
+ { 0x229A, 38884 },
+ { 0x229B, 39462 },
+ { 0x229C, 39194 },
+ { 0x229D, 38874 },
+ { 0x229E, 43560 },
+ { 0x229F, 43562 },
+ { 0x22A0, 43567 },
+ { 0x22A1, 43553 },
+ { 0x22A2, 21769 },
+ { 0x22A3, 9202 },
+ { 0x22A4, 9073 },
+ { 0x22A5, 326 },
+ { 0x22A6, 56111 },
+ { 0x22A7, 35572 },
+ { 0x22A8, 10054 },
+ { 0x22A9, 31782 },
+ { 0x22AA, 37641 },
+ { 0x22AB, 31686 },
+ { 0x22AC, 9020 },
+ { 0x22AD, 6725 },
+ { 0x22AE, 9017 },
+ { 0x22AF, 42772 },
+ { 0x22B0, 55379 },
+ { 0x22B1, 55573 },
+ { 0x22B2, 35580 },
+ { 0x22B3, 48401 },
+ { 0x22B4, 35583 },
+ { 0x22B5, 48405 },
+ { 0x22B6, 54929 },
+ { 0x22B7, 13720 },
+ { 0x22B8, 54874 },
+ { 0x22B9, 64288 },
+ { 0x22BA, 69248 },
+ { 0x22BB, 8711 },
+ { 0x22BC, 9603 },
+ { 0x22BD, 6710 },
+ { 0x22BE, 21773 },
+ { 0x22BF, 21972 },
+ { 0x22C0, 21257 },
+ { 0x22C1, 21254 },
+ { 0x22C2, 21266 },
+ { 0x22C3, 21218 },
+ { 0x22C4, 40327 },
+ { 0x22C5, 5786 },
+ { 0x22C6, 9720 },
+ { 0x22C7, 50312 },
+ { 0x22C8, 30294 },
+ { 0x22C9, 9372 },
+ { 0x22CA, 21899 },
+ { 0x22CB, 9461 },
+ { 0x22CC, 21988 },
+ { 0x22CD, 55472 },
+ { 0x22CE, 10471 },
+ { 0x22CF, 10474 },
+ { 0x22D0, 31610 },
+ { 0x22D1, 31673 },
+ { 0x22D2, 31698 },
+ { 0x22D3, 31585 },
+ { 0x22D4, 65756 },
+ { 0x22D5, 10616 },
+ { 0x22D6, 64728 },
+ { 0x22D7, 69499 },
+ { 0x22D8, 10057 },
+ { 0x22D9, 10060 },
+ { 0x22DA, 64775 },
+ { 0x22DB, 69546 },
+ { 0x22DC, 10608 },
+ { 0x22DD, 10612 },
+ { 0x22DE, 10600 },
+ { 0x22DF, 10604 },
+ { 0x22E0, 9055 },
+ { 0x22E1, 9063 },
+ { 0x22E2, 6750 },
+ { 0x22E3, 6757 },
+ { 0x22E4, 36313 },
+ { 0x22E5, 36428 },
+ { 0x22E6, 64717 },
+ { 0x22E7, 69488 },
+ { 0x22E8, 55343 },
+ { 0x22E9, 55537 },
+ { 0x22EA, 6739 },
+ { 0x22EB, 9038 },
+ { 0x22EC, 6743 },
+ { 0x22ED, 9044 },
+ { 0x22EE, 56096 },
+ { 0x22EF, 41192 },
+ { 0x22F0, 337 },
+ { 0x22F1, 9080 },
+ { 0x22F2, 40513 },
+ { 0x22F3, 40527 },
+ { 0x22F4, 22607 },
+ { 0x22F5, 40502 },
+ { 0x22F6, 40519 },
+ { 0x22F7, 22602 },
+ { 0x22F8, 40523 },
+ { 0x22F9, 40507 },
+ { 0x22FA, 48412 },
+ { 0x22FB, 48420 },
+ { 0x22FC, 22634 },
+ { 0x22FD, 48417 },
+ { 0x22FE, 22630 },
+ { 0x22FF, 12 },
+ { 0x2300, 50306 },
+ { 0x2301, 50318 },
+ { 0x2302, 13719 },
+ { 0x2303, 341 },
+ { 0x2304, 9084 },
+ { 0x2305, 67971 },
+ { 0x2306, 69271 },
+ { 0x2307, 10080 },
+ { 0x2308, 9431 },
+ { 0x2309, 21958 },
+ { 0x230A, 9249 },
+ { 0x230B, 21842 },
+ { 0x230C, 30268 },
+ { 0x230D, 30255 },
+ { 0x230E, 7747 },
+ { 0x230F, 7734 },
+ { 0x2310, 55456 },
+ { 0x2311, 36399 },
+ { 0x2312, 4379 },
+ { 0x2313, 43024 },
+ { 0x2314, 35851 },
+ { 0x2315, 66045 },
+ { 0x2316, 55332 },
+ { 0x2317, 56102 },
+ { 0x2318, 21735 },
+ { 0x2319, 37671 },
+ { 0x231A, 23154 },
+ { 0x231B, 64291 },
+ { 0x231C, 7741 },
+ { 0x231D, 7754 },
+ { 0x231E, 30262 },
+ { 0x231F, 30275 },
+ { 0x2320, 7731 },
+ { 0x2321, 30252 },
+ { 0x2322, 10635 },
+ { 0x2323, 22670 },
+ { 0x2324, 343 },
+ { 0x2325, 35641 },
+ { 0x2326, 10624 },
+ { 0x2327, 7 },
+ { 0x2328, 53725 },
+ { 0x2329, 74605 },
+ { 0x232A, 75087 },
+ { 0x232B, 10620 },
+ { 0x232C, 38093 },
+ { 0x232D, 69402 },
+ { 0x232E, 4014 },
+ { 0x232F, 55656 },
+ { 0x2330, 23053 },
+ { 0x2331, 63245 },
+ { 0x2332, 39788 },
+ { 0x2333, 22479 },
+ { 0x2334, 68618 },
+ { 0x2335, 68619 },
+ { 0x2336, 4325 },
+ { 0x2337, 4329 },
+ { 0x2338, 4159 },
+ { 0x2339, 4174 },
+ { 0x233A, 4179 },
+ { 0x233B, 4132 },
+ { 0x233C, 4169 },
+ { 0x233D, 4305 },
+ { 0x233E, 4295 },
+ { 0x233F, 4276 },
+ { 0x2340, 4349 },
+ { 0x2341, 4164 },
+ { 0x2342, 4195 },
+ { 0x2343, 4212 },
+ { 0x2344, 4223 },
+ { 0x2345, 4359 },
+ { 0x2346, 4369 },
+ { 0x2347, 4206 },
+ { 0x2348, 4217 },
+ { 0x2349, 4315 },
+ { 0x234A, 4090 },
+ { 0x234B, 4247 },
+ { 0x234C, 4143 },
+ { 0x234D, 4154 },
+ { 0x234E, 4084 },
+ { 0x234F, 4344 },
+ { 0x2350, 4184 },
+ { 0x2351, 4031 },
+ { 0x2352, 4049 },
+ { 0x2353, 4121 },
+ { 0x2354, 4127 },
+ { 0x2355, 4025 },
+ { 0x2356, 4354 },
+ { 0x2357, 4200 },
+ { 0x2358, 4271 },
+ { 0x2359, 4252 },
+ { 0x235A, 4334 },
+ { 0x235B, 4064 },
+ { 0x235C, 4310 },
+ { 0x235D, 4019 },
+ { 0x235E, 4266 },
+ { 0x235F, 4300 },
+ { 0x2360, 4149 },
+ { 0x2361, 4037 },
+ { 0x2362, 4059 },
+ { 0x2363, 4228 },
+ { 0x2364, 4069 },
+ { 0x2365, 4320 },
+ { 0x2366, 4078 },
+ { 0x2367, 4111 },
+ { 0x2368, 4286 },
+ { 0x2369, 4374 },
+ { 0x236A, 4242 },
+ { 0x236B, 4054 },
+ { 0x236C, 4291 },
+ { 0x236D, 4281 },
+ { 0x236E, 4364 },
+ { 0x236F, 4137 },
+ { 0x2370, 4190 },
+ { 0x2371, 4096 },
+ { 0x2372, 4043 },
+ { 0x2373, 4102 },
+ { 0x2374, 4074 },
+ { 0x2375, 4257 },
+ { 0x2376, 4237 },
+ { 0x2377, 4339 },
+ { 0x2378, 4106 },
+ { 0x2379, 4261 },
+ { 0x237A, 4233 },
+ { 0x237B, 6727 },
+ { 0x237C, 21777 },
+ { 0x237D, 68594 },
+ { 0x237E, 8721 },
+ { 0x237F, 56078 },
+ { 0x2380, 64306 },
+ { 0x2381, 66843 },
+ { 0x2382, 74526 },
+ { 0x2383, 50320 },
+ { 0x2384, 68613 },
+ { 0x2385, 23322 },
+ { 0x2386, 10594 },
+ { 0x2387, 68603 },
+ { 0x2388, 9125 },
+ { 0x2389, 39769 },
+ { 0x238A, 39614 },
+ { 0x238B, 30307 },
+ { 0x238C, 10055 },
+ { 0x238D, 67877 },
+ { 0x238E, 67663 },
+ { 0x238F, 75142 },
+ { 0x2390, 75145 },
+ { 0x2391, 75150 },
+ { 0x2392, 75148 },
+ { 0x2393, 31220 },
+ { 0x2394, 75137 },
+ { 0x2395, 4117 },
+ { 0x2396, 39959 },
+ { 0x2397, 55382 },
+ { 0x2398, 9604 },
+ { 0x2399, 21743 },
+ { 0x239A, 10449 },
+ { 0x239B, 9470 },
+ { 0x239C, 9474 },
+ { 0x239D, 9466 },
+ { 0x239E, 21997 },
+ { 0x239F, 22001 },
+ { 0x23A0, 21993 },
+ { 0x23A1, 9419 },
+ { 0x23A2, 9424 },
+ { 0x23A3, 9414 },
+ { 0x23A4, 21946 },
+ { 0x23A5, 21951 },
+ { 0x23A6, 21941 },
+ { 0x23A7, 9239 },
+ { 0x23A8, 9244 },
+ { 0x23A9, 9234 },
+ { 0x23AA, 10468 },
+ { 0x23AB, 21832 },
+ { 0x23AC, 21837 },
+ { 0x23AD, 21827 },
+ { 0x23AE, 53342 },
+ { 0x23AF, 67638 },
+ { 0x23B0, 23099 },
+ { 0x23B1, 23123 },
+ { 0x23B2, 65859 },
+ { 0x23B3, 65864 },
+ { 0x23B4, 7757 },
+ { 0x23B5, 30278 },
+ { 0x23B6, 30281 },
+ { 0x23B7, 42979 },
+ { 0x23B8, 9457 },
+ { 0x23B9, 21984 },
+ { 0x23BA, 67646 },
+ { 0x23BB, 67649 },
+ { 0x23BC, 67652 },
+ { 0x23BD, 67655 },
+ { 0x23BE, 63205 },
+ { 0x23BF, 63225 },
+ { 0x23C0, 63232 },
+ { 0x23C1, 63182 },
+ { 0x23C2, 63152 },
+ { 0x23C3, 63238 },
+ { 0x23C4, 63190 },
+ { 0x23C5, 63160 },
+ { 0x23C6, 63212 },
+ { 0x23C7, 63174 },
+ { 0x23C8, 63144 },
+ { 0x23C9, 63168 },
+ { 0x23CA, 63138 },
+ { 0x23CB, 63198 },
+ { 0x23CC, 63218 },
+ { 0x23CD, 36165 },
+ { 0x23CE, 35797 },
+ { 0x23CF, 10568 },
+ { 0x23D0, 56083 },
+ { 0x23D1, 53857 },
+ { 0x23D2, 53853 },
+ { 0x23D3, 53859 },
+ { 0x23D4, 53848 },
+ { 0x23D5, 53839 },
+ { 0x23D6, 53844 },
+ { 0x23D7, 53863 },
+ { 0x23D8, 53867 },
+ { 0x23D9, 53865 },
+ { 0x23DA, 10541 },
+ { 0x23DB, 9119 },
+ { 0x23DC, 7764 },
+ { 0x23DD, 30292 },
+ { 0x23DE, 7744 },
+ { 0x23DF, 30265 },
+ { 0x23E0, 7760 },
+ { 0x23E1, 30288 },
+ { 0x23E2, 23412 },
+ { 0x23E3, 38095 },
+ { 0x23E4, 74477 },
+ { 0x23E5, 51778 },
+ { 0x23E6, 67 },
+ { 0x23E7, 67224 },
+ { 0x2400, 36757 },
+ { 0x2401, 36784 },
+ { 0x2402, 36779 },
+ { 0x2403, 36716 },
+ { 0x2404, 36726 },
+ { 0x2405, 36827 },
+ { 0x2406, 36864 },
+ { 0x2407, 36737 },
+ { 0x2408, 36845 },
+ { 0x2409, 36852 },
+ { 0x240A, 36753 },
+ { 0x240B, 36841 },
+ { 0x240C, 36749 },
+ { 0x240D, 36833 },
+ { 0x240E, 36772 },
+ { 0x240F, 36768 },
+ { 0x2410, 36740 },
+ { 0x2411, 36800 },
+ { 0x2412, 36805 },
+ { 0x2413, 36815 },
+ { 0x2414, 36810 },
+ { 0x2415, 36837 },
+ { 0x2416, 36867 },
+ { 0x2417, 36731 },
+ { 0x2418, 36789 },
+ { 0x2419, 36721 },
+ { 0x241A, 36856 },
+ { 0x241B, 36820 },
+ { 0x241C, 36745 },
+ { 0x241D, 36764 },
+ { 0x241E, 36823 },
+ { 0x241F, 36760 },
+ { 0x2420, 36776 },
+ { 0x2421, 36792 },
+ { 0x2422, 10376 },
+ { 0x2423, 9606 },
+ { 0x2424, 36830 },
+ { 0x2425, 36795 },
+ { 0x2426, 36859 },
+ { 0x2440, 6791 },
+ { 0x2441, 6793 },
+ { 0x2442, 6789 },
+ { 0x2443, 6810 },
+ { 0x2444, 6784 },
+ { 0x2445, 6781 },
+ { 0x2446, 6799 },
+ { 0x2447, 6795 },
+ { 0x2448, 6787 },
+ { 0x2449, 6806 },
+ { 0x244A, 6803 },
+ { 0x2460, 38887 },
+ { 0x2461, 38893 },
+ { 0x2462, 38914 },
+ { 0x2463, 38899 },
+ { 0x2464, 38896 },
+ { 0x2465, 38890 },
+ { 0x2466, 38911 },
+ { 0x2467, 38908 },
+ { 0x2468, 38902 },
+ { 0x2469, 39306 },
+ { 0x246A, 39351 },
+ { 0x246B, 39393 },
+ { 0x246C, 39450 },
+ { 0x246D, 39444 },
+ { 0x246E, 39435 },
+ { 0x246F, 39438 },
+ { 0x2470, 39453 },
+ { 0x2471, 39441 },
+ { 0x2472, 39447 },
+ { 0x2473, 39396 },
+ { 0x2474, 74628 },
+ { 0x2475, 74634 },
+ { 0x2476, 74652 },
+ { 0x2477, 74640 },
+ { 0x2478, 74637 },
+ { 0x2479, 74631 },
+ { 0x247A, 74649 },
+ { 0x247B, 74646 },
+ { 0x247C, 74643 },
+ { 0x247D, 74896 },
+ { 0x247E, 74899 },
+ { 0x247F, 74902 },
+ { 0x2480, 74923 },
+ { 0x2481, 74917 },
+ { 0x2482, 74908 },
+ { 0x2483, 74911 },
+ { 0x2484, 74926 },
+ { 0x2485, 74914 },
+ { 0x2486, 74920 },
+ { 0x2487, 74905 },
+ { 0x2488, 10484 },
+ { 0x2489, 10496 },
+ { 0x248A, 10534 },
+ { 0x248B, 10508 },
+ { 0x248C, 10502 },
+ { 0x248D, 10490 },
+ { 0x248E, 10528 },
+ { 0x248F, 10522 },
+ { 0x2490, 10514 },
+ { 0x2491, 35589 },
+ { 0x2492, 35595 },
+ { 0x2493, 35599 },
+ { 0x2494, 35627 },
+ { 0x2495, 35619 },
+ { 0x2496, 35607 },
+ { 0x2497, 35611 },
+ { 0x2498, 35631 },
+ { 0x2499, 35615 },
+ { 0x249A, 35623 },
+ { 0x249B, 35603 },
+ { 0x249C, 74655 },
+ { 0x249D, 74660 },
+ { 0x249E, 74665 },
+ { 0x249F, 74670 },
+ { 0x24A0, 74675 },
+ { 0x24A1, 74680 },
+ { 0x24A2, 74685 },
+ { 0x24A3, 74690 },
+ { 0x24A4, 74695 },
+ { 0x24A5, 74700 },
+ { 0x24A6, 74705 },
+ { 0x24A7, 74710 },
+ { 0x24A8, 74715 },
+ { 0x24A9, 74720 },
+ { 0x24AA, 74725 },
+ { 0x24AB, 74730 },
+ { 0x24AC, 74735 },
+ { 0x24AD, 74740 },
+ { 0x24AE, 74745 },
+ { 0x24AF, 74750 },
+ { 0x24B0, 74755 },
+ { 0x24B1, 74760 },
+ { 0x24B2, 74765 },
+ { 0x24B3, 74770 },
+ { 0x24B4, 74775 },
+ { 0x24B5, 74780 },
+ { 0x24B6, 39052 },
+ { 0x24B7, 39057 },
+ { 0x24B8, 39062 },
+ { 0x24B9, 39067 },
+ { 0x24BA, 39072 },
+ { 0x24BB, 39077 },
+ { 0x24BC, 39082 },
+ { 0x24BD, 39087 },
+ { 0x24BE, 39092 },
+ { 0x24BF, 39097 },
+ { 0x24C0, 39102 },
+ { 0x24C1, 39107 },
+ { 0x24C2, 39112 },
+ { 0x24C3, 39117 },
+ { 0x24C4, 39122 },
+ { 0x24C5, 39127 },
+ { 0x24C6, 39132 },
+ { 0x24C7, 39137 },
+ { 0x24C8, 39142 },
+ { 0x24C9, 39147 },
+ { 0x24CA, 39152 },
+ { 0x24CB, 39157 },
+ { 0x24CC, 39162 },
+ { 0x24CD, 39167 },
+ { 0x24CE, 39172 },
+ { 0x24CF, 39177 },
+ { 0x24D0, 38922 },
+ { 0x24D1, 38927 },
+ { 0x24D2, 38932 },
+ { 0x24D3, 38937 },
+ { 0x24D4, 38942 },
+ { 0x24D5, 38947 },
+ { 0x24D6, 38952 },
+ { 0x24D7, 38957 },
+ { 0x24D8, 38962 },
+ { 0x24D9, 38967 },
+ { 0x24DA, 38972 },
+ { 0x24DB, 38977 },
+ { 0x24DC, 38982 },
+ { 0x24DD, 38987 },
+ { 0x24DE, 38992 },
+ { 0x24DF, 38997 },
+ { 0x24E0, 39002 },
+ { 0x24E1, 39007 },
+ { 0x24E2, 39012 },
+ { 0x24E3, 39017 },
+ { 0x24E4, 39022 },
+ { 0x24E5, 39027 },
+ { 0x24E6, 39032 },
+ { 0x24E7, 39037 },
+ { 0x24E8, 39042 },
+ { 0x24E9, 39047 },
+ { 0x24EA, 38905 },
+ { 0x24EB, 54887 },
+ { 0x24EC, 54891 },
+ { 0x24ED, 54919 },
+ { 0x24EE, 54911 },
+ { 0x24EF, 54899 },
+ { 0x24F0, 54903 },
+ { 0x24F1, 54923 },
+ { 0x24F2, 54907 },
+ { 0x24F3, 54915 },
+ { 0x24F4, 54895 },
+ { 0x24F5, 31612 },
+ { 0x24F6, 31620 },
+ { 0x24F7, 31644 },
+ { 0x24F8, 31628 },
+ { 0x24F9, 31624 },
+ { 0x24FA, 31616 },
+ { 0x24FB, 31640 },
+ { 0x24FC, 31636 },
+ { 0x24FD, 31632 },
+ { 0x24FE, 31648 },
+ { 0x24FF, 54883 },
+ { 0x2500, 5020 },
+ { 0x2501, 4841 },
+ { 0x2502, 4986 },
+ { 0x2503, 4807 },
+ { 0x2504, 4957 },
+ { 0x2505, 4801 },
+ { 0x2506, 4951 },
+ { 0x2507, 4795 },
+ { 0x2508, 5014 },
+ { 0x2509, 4835 },
+ { 0x250A, 5008 },
+ { 0x250B, 4829 },
+ { 0x250C, 4912 },
+ { 0x250D, 4595 },
+ { 0x250E, 4550 },
+ { 0x250F, 4756 },
+ { 0x2510, 4906 },
+ { 0x2511, 4580 },
+ { 0x2512, 4535 },
+ { 0x2513, 4750 },
+ { 0x2514, 4862 },
+ { 0x2515, 4463 },
+ { 0x2516, 4418 },
+ { 0x2517, 4734 },
+ { 0x2518, 4849 },
+ { 0x2519, 4448 },
+ { 0x251A, 4403 },
+ { 0x251B, 4721 },
+ { 0x251C, 4996 },
+ { 0x251D, 5180 },
+ { 0x251E, 4410 },
+ { 0x251F, 4542 },
+ { 0x2520, 5159 },
+ { 0x2521, 4587 },
+ { 0x2522, 4455 },
+ { 0x2523, 4817 },
+ { 0x2524, 4990 },
+ { 0x2525, 5173 },
+ { 0x2526, 4395 },
+ { 0x2527, 4527 },
+ { 0x2528, 5152 },
+ { 0x2529, 4572 },
+ { 0x252A, 4440 },
+ { 0x252B, 4811 },
+ { 0x252C, 4918 },
+ { 0x252D, 4677 },
+ { 0x252E, 5050 },
+ { 0x252F, 4602 },
+ { 0x2530, 4557 },
+ { 0x2531, 5074 },
+ { 0x2532, 4701 },
+ { 0x2533, 4762 },
+ { 0x2534, 4868 },
+ { 0x2535, 4669 },
+ { 0x2536, 5042 },
+ { 0x2537, 4470 },
+ { 0x2538, 4425 },
+ { 0x2539, 5066 },
+ { 0x253A, 4693 },
+ { 0x253B, 4740 },
+ { 0x253C, 5002 },
+ { 0x253D, 4685 },
+ { 0x253E, 5058 },
+ { 0x253F, 5187 },
+ { 0x2540, 4387 },
+ { 0x2541, 4519 },
+ { 0x2542, 5166 },
+ { 0x2543, 4651 },
+ { 0x2544, 5024 },
+ { 0x2545, 4660 },
+ { 0x2546, 5033 },
+ { 0x2547, 4564 },
+ { 0x2548, 4432 },
+ { 0x2549, 5082 },
+ { 0x254A, 4709 },
+ { 0x254B, 4823 },
+ { 0x254C, 4945 },
+ { 0x254D, 4789 },
+ { 0x254E, 4939 },
+ { 0x254F, 4783 },
+ { 0x2550, 5148 },
+ { 0x2551, 5126 },
+ { 0x2552, 4637 },
+ { 0x2553, 4616 },
+ { 0x2554, 5114 },
+ { 0x2555, 4630 },
+ { 0x2556, 4609 },
+ { 0x2557, 5108 },
+ { 0x2558, 4505 },
+ { 0x2559, 4484 },
+ { 0x255A, 5096 },
+ { 0x255B, 4498 },
+ { 0x255C, 4477 },
+ { 0x255D, 5090 },
+ { 0x255E, 5222 },
+ { 0x255F, 5201 },
+ { 0x2560, 5136 },
+ { 0x2561, 5215 },
+ { 0x2562, 5194 },
+ { 0x2563, 5130 },
+ { 0x2564, 4644 },
+ { 0x2565, 4623 },
+ { 0x2566, 5120 },
+ { 0x2567, 4512 },
+ { 0x2568, 4491 },
+ { 0x2569, 5102 },
+ { 0x256A, 5229 },
+ { 0x256B, 5208 },
+ { 0x256C, 5142 },
+ { 0x256D, 4895 },
+ { 0x256E, 4888 },
+ { 0x256F, 4874 },
+ { 0x2570, 4881 },
+ { 0x2571, 4977 },
+ { 0x2572, 4968 },
+ { 0x2573, 4963 },
+ { 0x2574, 4924 },
+ { 0x2575, 4845 },
+ { 0x2576, 4935 },
+ { 0x2577, 4902 },
+ { 0x2578, 4768 },
+ { 0x2579, 4717 },
+ { 0x257A, 4779 },
+ { 0x257B, 4746 },
+ { 0x257C, 4928 },
+ { 0x257D, 4855 },
+ { 0x257E, 4772 },
+ { 0x257F, 4727 },
+ { 0x2580, 23088 },
+ { 0x2581, 21094 },
+ { 0x2582, 21098 },
+ { 0x2583, 21168 },
+ { 0x2584, 21106 },
+ { 0x2585, 21102 },
+ { 0x2586, 21172 },
+ { 0x2587, 21164 },
+ { 0x2588, 9114 },
+ { 0x2589, 9314 },
+ { 0x258A, 9322 },
+ { 0x258B, 9191 },
+ { 0x258C, 9199 },
+ { 0x258D, 9318 },
+ { 0x258E, 9156 },
+ { 0x258F, 9152 },
+ { 0x2590, 21766 },
+ { 0x2591, 20870 },
+ { 0x2592, 35535 },
+ { 0x2593, 9015 },
+ { 0x2594, 23084 },
+ { 0x2595, 21755 },
+ { 0x2596, 55386 },
+ { 0x2597, 55389 },
+ { 0x2598, 55392 },
+ { 0x2599, 55395 },
+ { 0x259A, 55404 },
+ { 0x259B, 55410 },
+ { 0x259C, 55419 },
+ { 0x259D, 55428 },
+ { 0x259E, 55431 },
+ { 0x259F, 55437 },
+ { 0x25A0, 10270 },
+ { 0x25A1, 23296 },
+ { 0x25A2, 23328 },
+ { 0x25A3, 23349 },
+ { 0x25A4, 36279 },
+ { 0x25A5, 36271 },
+ { 0x25A6, 36283 },
+ { 0x25A7, 36231 },
+ { 0x25A8, 36246 },
+ { 0x25A9, 36266 },
+ { 0x25AA, 10212 },
+ { 0x25AB, 23225 },
+ { 0x25AC, 10317 },
+ { 0x25AD, 23408 },
+ { 0x25AE, 10309 },
+ { 0x25AF, 23403 },
+ { 0x25B0, 10361 },
+ { 0x25B1, 23461 },
+ { 0x25B2, 10341 },
+ { 0x25B3, 23421 },
+ { 0x25B4, 10337 },
+ { 0x25B5, 23417 },
+ { 0x25B6, 10373 },
+ { 0x25B7, 23473 },
+ { 0x25B8, 10363 },
+ { 0x25B9, 23463 },
+ { 0x25BA, 10367 },
+ { 0x25BB, 23467 },
+ { 0x25BC, 10348 },
+ { 0x25BD, 23448 },
+ { 0x25BE, 10344 },
+ { 0x25BF, 23444 },
+ { 0x25C0, 10358 },
+ { 0x25C1, 23458 },
+ { 0x25C2, 10351 },
+ { 0x25C3, 23451 },
+ { 0x25C4, 10355 },
+ { 0x25C5, 23455 },
+ { 0x25C6, 10272 },
+ { 0x25C7, 23355 },
+ { 0x25C8, 23365 },
+ { 0x25C9, 40556 },
+ { 0x25CA, 40990 },
+ { 0x25CB, 23236 },
+ { 0x25CC, 31533 },
+ { 0x25CD, 30518 },
+ { 0x25CE, 45864 },
+ { 0x25CF, 10238 },
+ { 0x25D0, 30485 },
+ { 0x25D1, 30495 },
+ { 0x25D2, 30490 },
+ { 0x25D3, 30507 },
+ { 0x25D4, 30512 },
+ { 0x25D5, 30469 },
+ { 0x25D6, 9195 },
+ { 0x25D7, 21762 },
+ { 0x25D8, 40639 },
+ { 0x25D9, 40636 },
+ { 0x25DA, 23094 },
+ { 0x25DB, 21112 },
+ { 0x25DC, 23112 },
+ { 0x25DD, 23134 },
+ { 0x25DE, 21141 },
+ { 0x25DF, 21117 },
+ { 0x25E0, 23091 },
+ { 0x25E1, 21109 },
+ { 0x25E2, 10198 },
+ { 0x25E3, 10194 },
+ { 0x25E4, 10224 },
+ { 0x25E5, 10228 },
+ { 0x25E6, 23234 },
+ { 0x25E7, 36207 },
+ { 0x25E8, 36226 },
+ { 0x25E9, 36239 },
+ { 0x25EA, 36219 },
+ { 0x25EB, 23333 },
+ { 0x25EC, 23424 },
+ { 0x25ED, 69326 },
+ { 0x25EE, 69332 },
+ { 0x25EF, 14464 },
+ { 0x25F0, 23310 },
+ { 0x25F1, 23298 },
+ { 0x25F2, 23304 },
+ { 0x25F3, 23316 },
+ { 0x25F4, 23265 },
+ { 0x25F5, 23253 },
+ { 0x25F6, 23259 },
+ { 0x25F7, 23271 },
+ { 0x25F8, 23117 },
+ { 0x25F9, 23144 },
+ { 0x25FA, 21122 },
+ { 0x25FB, 23284 },
+ { 0x25FC, 10261 },
+ { 0x25FD, 23280 },
+ { 0x25FE, 10257 },
+ { 0x25FF, 21151 },
+ { 0x2600, 10141 },
+ { 0x2601, 10454 },
+ { 0x2602, 56004 },
+ { 0x2603, 43547 },
+ { 0x2604, 10460 },
+ { 0x2605, 10161 },
+ { 0x2606, 23185 },
+ { 0x2607, 64791 },
+ { 0x2608, 74480 },
+ { 0x2609, 7188 },
+ { 0x260A, 56109 },
+ { 0x260B, 66846 },
+ { 0x260C, 68615 },
+ { 0x260D, 67880 },
+ { 0x260E, 10319 },
+ { 0x260F, 23410 },
+ { 0x2610, 30232 },
+ { 0x2611, 30238 },
+ { 0x2612, 30234 },
+ { 0x2613, 43020 },
+ { 0x2614, 56005 },
+ { 0x2615, 5795 },
+ { 0x2616, 23219 },
+ { 0x2617, 10206 },
+ { 0x2618, 55522 },
+ { 0x2619, 55497 },
+ { 0x261A, 10154 },
+ { 0x261B, 10202 },
+ { 0x261C, 23181 },
+ { 0x261D, 23158 },
+ { 0x261E, 23215 },
+ { 0x261F, 23171 },
+ { 0x2620, 22476 },
+ { 0x2621, 38868 },
+ { 0x2622, 69274 },
+ { 0x2623, 56112 },
+ { 0x2624, 45865 },
+ { 0x2625, 8718 },
+ { 0x2626, 54931 },
+ { 0x2627, 5236 },
+ { 0x2628, 10462 },
+ { 0x2629, 10465 },
+ { 0x262A, 9715 },
+ { 0x262B, 10630 },
+ { 0x262C, 4009 },
+ { 0x262D, 31881 },
+ { 0x262E, 21733 },
+ { 0x262F, 8714 },
+ { 0x2630, 44529 },
+ { 0x2631, 44517 },
+ { 0x2632, 44514 },
+ { 0x2633, 44532 },
+ { 0x2634, 44520 },
+ { 0x2635, 44526 },
+ { 0x2636, 44535 },
+ { 0x2637, 44523 },
+ { 0x2638, 23155 },
+ { 0x2639, 23384 },
+ { 0x263A, 23373 },
+ { 0x263B, 10291 },
+ { 0x263C, 23164 },
+ { 0x263D, 10632 },
+ { 0x263E, 9132 },
+ { 0x263F, 41191 },
+ { 0x2640, 31767 },
+ { 0x2641, 10540 },
+ { 0x2642, 9580 },
+ { 0x2643, 40641 },
+ { 0x2644, 35810 },
+ { 0x2645, 37705 },
+ { 0x2646, 42827 },
+ { 0x2647, 21739 },
+ { 0x2648, 10114 },
+ { 0x2649, 37129 },
+ { 0x264A, 31790 },
+ { 0x264B, 30317 },
+ { 0x264C, 6030 },
+ { 0x264D, 23153 },
+ { 0x264E, 20857 },
+ { 0x264F, 55511 },
+ { 0x2650, 69278 },
+ { 0x2651, 57359 },
+ { 0x2652, 44719 },
+ { 0x2653, 35653 },
+ { 0x2654, 23191 },
+ { 0x2655, 23200 },
+ { 0x2656, 23197 },
+ { 0x2657, 23203 },
+ { 0x2658, 23206 },
+ { 0x2659, 23194 },
+ { 0x265A, 10167 },
+ { 0x265B, 10176 },
+ { 0x265C, 10173 },
+ { 0x265D, 10179 },
+ { 0x265E, 10182 },
+ { 0x265F, 10170 },
+ { 0x2660, 10221 },
+ { 0x2661, 23209 },
+ { 0x2662, 23357 },
+ { 0x2663, 10145 },
+ { 0x2664, 23231 },
+ { 0x2665, 10185 },
+ { 0x2666, 10274 },
+ { 0x2667, 23168 },
+ { 0x2668, 5793 },
+ { 0x2669, 42977 },
+ { 0x266A, 31704 },
+ { 0x266B, 30242 },
+ { 0x266C, 30245 },
+ { 0x266D, 21206 },
+ { 0x266E, 21212 },
+ { 0x266F, 21209 },
+ { 0x2670, 10084 },
+ { 0x2671, 9086 },
+ { 0x2672, 66308 },
+ { 0x2673, 65768 },
+ { 0x2674, 65773 },
+ { 0x2675, 65778 },
+ { 0x2676, 65783 },
+ { 0x2677, 65788 },
+ { 0x2678, 65793 },
+ { 0x2679, 65798 },
+ { 0x267A, 65803 },
+ { 0x267B, 10321 },
+ { 0x267C, 55452 },
+ { 0x267D, 75139 },
+ { 0x267E, 65753 },
+ { 0x267F, 68601 },
+ { 0x2680, 5768 },
+ { 0x2681, 5770 },
+ { 0x2682, 5772 },
+ { 0x2683, 5774 },
+ { 0x2684, 5776 },
+ { 0x2685, 5778 },
+ { 0x2686, 23238 },
+ { 0x2687, 23243 },
+ { 0x2688, 10251 },
+ { 0x2689, 10240 },
+ { 0x268A, 54868 },
+ { 0x268B, 54865 },
+ { 0x268C, 31212 },
+ { 0x268D, 31192 },
+ { 0x268E, 31196 },
+ { 0x268F, 31208 },
+ { 0x2690, 23175 },
+ { 0x2691, 10148 },
+ { 0x2692, 31878 },
+ { 0x2693, 23701 },
+ { 0x2694, 39792 },
+ { 0x2695, 22748 },
+ { 0x2696, 35811 },
+ { 0x2697, 37778 },
+ { 0x2698, 31778 },
+ { 0x2699, 9120 },
+ { 0x269A, 22745 },
+ { 0x269B, 8719 },
+ { 0x269C, 69423 },
+ { 0x269D, 54942 },
+ { 0x26A0, 44705 },
+ { 0x26A1, 9127 },
+ { 0x26A2, 40495 },
+ { 0x26A3, 40492 },
+ { 0x26A4, 69258 },
+ { 0x26A5, 9576 },
+ { 0x26A6, 9590 },
+ { 0x26A7, 9582 },
+ { 0x26A8, 56086 },
+ { 0x26A9, 67641 },
+ { 0x26AA, 35541 },
+ { 0x26AB, 35523 },
+ { 0x26AC, 35537 },
+ { 0x26AD, 53728 },
+ { 0x26AE, 40490 },
+ { 0x26AF, 66311 },
+ { 0x26B0, 30571 },
+ { 0x26B1, 40558 },
+ { 0x26B2, 35579 },
+ { 0x26B3, 10446 },
+ { 0x26B4, 35649 },
+ { 0x26B5, 9131 },
+ { 0x26B6, 23152 },
+ { 0x26B7, 30468 },
+ { 0x26B8, 10158 },
+ { 0x26B9, 43027 },
+ { 0x26BA, 69279 },
+ { 0x26BB, 55451 },
+ { 0x26BC, 75099 },
+ { 0x26C0, 23376 },
+ { 0x26C1, 23379 },
+ { 0x26C2, 10294 },
+ { 0x26C3, 10297 },
+ { 0x2701, 23120 },
+ { 0x2702, 10304 },
+ { 0x2703, 21130 },
+ { 0x2704, 23389 },
+ { 0x2706, 66042 },
+ { 0x2707, 9722 },
+ { 0x2708, 44716 },
+ { 0x2709, 50322 },
+ { 0x270C, 44703 },
+ { 0x270D, 44707 },
+ { 0x270E, 21138 },
+ { 0x270F, 35650 },
+ { 0x2710, 23131 },
+ { 0x2711, 23162 },
+ { 0x2712, 10139 },
+ { 0x2713, 10447 },
+ { 0x2714, 13551 },
+ { 0x2715, 75053 },
+ { 0x2716, 13671 },
+ { 0x2717, 30230 },
+ { 0x2718, 13593 },
+ { 0x2719, 54936 },
+ { 0x271A, 13565 },
+ { 0x271B, 9612 },
+ { 0x271C, 13530 },
+ { 0x271D, 14471 },
+ { 0x271E, 55515 },
+ { 0x271F, 54939 },
+ { 0x2720, 41189 },
+ { 0x2721, 9712 },
+ { 0x2722, 9109 },
+ { 0x2723, 9106 },
+ { 0x2724, 13526 },
+ { 0x2725, 9103 },
+ { 0x2726, 10150 },
+ { 0x2727, 23177 },
+ { 0x2729, 36465 },
+ { 0x272A, 39186 },
+ { 0x272B, 9608 },
+ { 0x272C, 10234 },
+ { 0x272D, 54933 },
+ { 0x272E, 13634 },
+ { 0x272F, 55330 },
+ { 0x2730, 55512 },
+ { 0x2731, 13632 },
+ { 0x2732, 9615 },
+ { 0x2733, 10543 },
+ { 0x2734, 10546 },
+ { 0x2735, 10550 },
+ { 0x2736, 7178 },
+ { 0x2737, 10554 },
+ { 0x2738, 13554 },
+ { 0x2739, 37701 },
+ { 0x273A, 43505 },
+ { 0x273B, 75114 },
+ { 0x273C, 9618 },
+ { 0x273D, 13704 },
+ { 0x273E, 7182 },
+ { 0x273F, 10300 },
+ { 0x2740, 23382 },
+ { 0x2741, 10559 },
+ { 0x2742, 38876 },
+ { 0x2743, 13707 },
+ { 0x2744, 65814 },
+ { 0x2745, 23005 },
+ { 0x2746, 13627 },
+ { 0x2747, 43552 },
+ { 0x2748, 13630 },
+ { 0x2749, 75051 },
+ { 0x274A, 10564 },
+ { 0x274B, 13560 },
+ { 0x274D, 55519 },
+ { 0x274F, 21159 },
+ { 0x2750, 23147 },
+ { 0x2751, 21146 },
+ { 0x2752, 23139 },
+ { 0x2756, 10282 },
+ { 0x2758, 20872 },
+ { 0x2759, 35544 },
+ { 0x275A, 13638 },
+ { 0x275B, 13620 },
+ { 0x275C, 13614 },
+ { 0x275D, 13607 },
+ { 0x275E, 13601 },
+ { 0x2761, 31164 },
+ { 0x2762, 13644 },
+ { 0x2763, 13568 },
+ { 0x2764, 13534 },
+ { 0x2765, 43008 },
+ { 0x2766, 31776 },
+ { 0x2767, 43013 },
+ { 0x2768, 35519 },
+ { 0x2769, 35531 },
+ { 0x276A, 35547 },
+ { 0x276B, 35552 },
+ { 0x276C, 35560 },
+ { 0x276D, 35565 },
+ { 0x276E, 13665 },
+ { 0x276F, 13679 },
+ { 0x2770, 13660 },
+ { 0x2771, 13674 },
+ { 0x2772, 20858 },
+ { 0x2773, 20864 },
+ { 0x2774, 35514 },
+ { 0x2775, 35526 },
+ { 0x2776, 40379 },
+ { 0x2777, 40389 },
+ { 0x2778, 40419 },
+ { 0x2779, 40399 },
+ { 0x277A, 40394 },
+ { 0x277B, 40384 },
+ { 0x277C, 40414 },
+ { 0x277D, 40409 },
+ { 0x277E, 40404 },
+ { 0x277F, 40424 },
+ { 0x2780, 40329 },
+ { 0x2781, 40339 },
+ { 0x2782, 40369 },
+ { 0x2783, 40349 },
+ { 0x2784, 40344 },
+ { 0x2785, 40334 },
+ { 0x2786, 40364 },
+ { 0x2787, 40359 },
+ { 0x2788, 40354 },
+ { 0x2789, 40374 },
+ { 0x278A, 40429 },
+ { 0x278B, 40441 },
+ { 0x278C, 40477 },
+ { 0x278D, 40453 },
+ { 0x278E, 40447 },
+ { 0x278F, 40435 },
+ { 0x2790, 40471 },
+ { 0x2791, 40465 },
+ { 0x2792, 40459 },
+ { 0x2793, 40483 },
+ { 0x2794, 13648 },
+ { 0x2798, 13583 },
+ { 0x2799, 13641 },
+ { 0x279A, 13579 },
+ { 0x279B, 50314 },
+ { 0x279C, 13652 },
+ { 0x279D, 75116 },
+ { 0x279E, 13711 },
+ { 0x279F, 31175 },
+ { 0x27A0, 13596 },
+ { 0x27A1, 10328 },
+ { 0x27A2, 43645 },
+ { 0x27A3, 43649 },
+ { 0x27A4, 10334 },
+ { 0x27A5, 13544 },
+ { 0x27A6, 13537 },
+ { 0x27A7, 22741 },
+ { 0x27A8, 13699 },
+ { 0x27A9, 74472 },
+ { 0x27AA, 69264 },
+ { 0x27AB, 68606 },
+ { 0x27AC, 69424 },
+ { 0x27AD, 13573 },
+ { 0x27AE, 13587 },
+ { 0x27AF, 42831 },
+ { 0x27B1, 42837 },
+ { 0x27B2, 38917 },
+ { 0x27B3, 75119 },
+ { 0x27B4, 75104 },
+ { 0x27B5, 75108 },
+ { 0x27B6, 75100 },
+ { 0x27B7, 13690 },
+ { 0x27B8, 13695 },
+ { 0x27B9, 13685 },
+ { 0x27BA, 75111 },
+ { 0x27BB, 13715 },
+ { 0x27BC, 74481 },
+ { 0x27BD, 13656 },
+ { 0x27BE, 74625 },
+ { 0x27C0, 23002 },
+ { 0x27C1, 23391 },
+ { 0x27C2, 75037 },
+ { 0x27C3, 9622 },
+ { 0x27C4, 9624 },
+ { 0x27C5, 9435 },
+ { 0x27C6, 21960 },
+ { 0x27C7, 271 },
+ { 0x27C8, 43004 },
+ { 0x27C9, 55653 },
+ { 0x27CA, 56011 },
+ { 0x27CC, 9530 },
+ { 0x27D0, 23360 },
+ { 0x27D1, 4016 },
+ { 0x27D2, 40537 },
+ { 0x27D3, 21133 },
+ { 0x27D4, 23107 },
+ { 0x27D5, 9251 },
+ { 0x27D6, 21844 },
+ { 0x27D7, 9116 },
+ { 0x27D8, 14454 },
+ { 0x27D9, 14457 },
+ { 0x27DA, 9139 },
+ { 0x27DB, 9135 },
+ { 0x27DC, 9433 },
+ { 0x27DD, 9527 },
+ { 0x27DE, 9515 },
+ { 0x27DF, 328 },
+ { 0x27E0, 40991 },
+ { 0x27E1, 23429 },
+ { 0x27E2, 23432 },
+ { 0x27E3, 23438 },
+ { 0x27E4, 23339 },
+ { 0x27E5, 23344 },
+ { 0x27E6, 71159 },
+ { 0x27E7, 71183 },
+ { 0x27E8, 71155 },
+ { 0x27E9, 71179 },
+ { 0x27EA, 71170 },
+ { 0x27EB, 71194 },
+ { 0x27EC, 71164 },
+ { 0x27ED, 71188 },
+ { 0x27EE, 71175 },
+ { 0x27EF, 71199 },
+ { 0x27F0, 44694 },
+ { 0x27F1, 63375 },
+ { 0x27F2, 74496 },
+ { 0x27F3, 57374 },
+ { 0x27F4, 21810 },
+ { 0x27F5, 9532 },
+ { 0x27F6, 9554 },
+ { 0x27F7, 9518 },
+ { 0x27F8, 9540 },
+ { 0x27F9, 9562 },
+ { 0x27FA, 9522 },
+ { 0x27FB, 9535 },
+ { 0x27FC, 9557 },
+ { 0x27FD, 9544 },
+ { 0x27FE, 9566 },
+ { 0x27FF, 9572 },
+ { 0x2800, 38100 },
+ { 0x2801, 38103 },
+ { 0x2802, 38106 },
+ { 0x2803, 38127 },
+ { 0x2804, 38109 },
+ { 0x2805, 38130 },
+ { 0x2806, 38148 },
+ { 0x2807, 38211 },
+ { 0x2808, 38112 },
+ { 0x2809, 38133 },
+ { 0x280A, 38151 },
+ { 0x280B, 38214 },
+ { 0x280C, 38166 },
+ { 0x280D, 38229 },
+ { 0x280E, 38274 },
+ { 0x280F, 38379 },
+ { 0x2810, 38115 },
+ { 0x2811, 38136 },
+ { 0x2812, 38154 },
+ { 0x2813, 38217 },
+ { 0x2814, 38169 },
+ { 0x2815, 38232 },
+ { 0x2816, 38277 },
+ { 0x2817, 38382 },
+ { 0x2818, 38181 },
+ { 0x2819, 38244 },
+ { 0x281A, 38289 },
+ { 0x281B, 38394 },
+ { 0x281C, 38319 },
+ { 0x281D, 38424 },
+ { 0x281E, 38484 },
+ { 0x281F, 38589 },
+ { 0x2820, 38118 },
+ { 0x2821, 38139 },
+ { 0x2822, 38157 },
+ { 0x2823, 38220 },
+ { 0x2824, 38172 },
+ { 0x2825, 38235 },
+ { 0x2826, 38280 },
+ { 0x2827, 38385 },
+ { 0x2828, 38184 },
+ { 0x2829, 38247 },
+ { 0x282A, 38292 },
+ { 0x282B, 38397 },
+ { 0x282C, 38322 },
+ { 0x282D, 38427 },
+ { 0x282E, 38487 },
+ { 0x282F, 38592 },
+ { 0x2830, 38193 },
+ { 0x2831, 38256 },
+ { 0x2832, 38301 },
+ { 0x2833, 38406 },
+ { 0x2834, 38331 },
+ { 0x2835, 38436 },
+ { 0x2836, 38496 },
+ { 0x2837, 38601 },
+ { 0x2838, 38349 },
+ { 0x2839, 38454 },
+ { 0x283A, 38514 },
+ { 0x283B, 38619 },
+ { 0x283C, 38544 },
+ { 0x283D, 38649 },
+ { 0x283E, 38694 },
+ { 0x283F, 38757 },
+ { 0x2840, 38121 },
+ { 0x2841, 38142 },
+ { 0x2842, 38160 },
+ { 0x2843, 38223 },
+ { 0x2844, 38175 },
+ { 0x2845, 38238 },
+ { 0x2846, 38283 },
+ { 0x2847, 38388 },
+ { 0x2848, 38187 },
+ { 0x2849, 38250 },
+ { 0x284A, 38295 },
+ { 0x284B, 38400 },
+ { 0x284C, 38325 },
+ { 0x284D, 38430 },
+ { 0x284E, 38490 },
+ { 0x284F, 38595 },
+ { 0x2850, 38196 },
+ { 0x2851, 38259 },
+ { 0x2852, 38304 },
+ { 0x2853, 38409 },
+ { 0x2854, 38334 },
+ { 0x2855, 38439 },
+ { 0x2856, 38499 },
+ { 0x2857, 38604 },
+ { 0x2858, 38352 },
+ { 0x2859, 38457 },
+ { 0x285A, 38517 },
+ { 0x285B, 38622 },
+ { 0x285C, 38547 },
+ { 0x285D, 38652 },
+ { 0x285E, 38697 },
+ { 0x285F, 38760 },
+ { 0x2860, 38202 },
+ { 0x2861, 38265 },
+ { 0x2862, 38310 },
+ { 0x2863, 38415 },
+ { 0x2864, 38340 },
+ { 0x2865, 38445 },
+ { 0x2866, 38505 },
+ { 0x2867, 38610 },
+ { 0x2868, 38358 },
+ { 0x2869, 38463 },
+ { 0x286A, 38523 },
+ { 0x286B, 38628 },
+ { 0x286C, 38553 },
+ { 0x286D, 38658 },
+ { 0x286E, 38703 },
+ { 0x286F, 38766 },
+ { 0x2870, 38367 },
+ { 0x2871, 38472 },
+ { 0x2872, 38532 },
+ { 0x2873, 38637 },
+ { 0x2874, 38562 },
+ { 0x2875, 38667 },
+ { 0x2876, 38712 },
+ { 0x2877, 38775 },
+ { 0x2878, 38574 },
+ { 0x2879, 38679 },
+ { 0x287A, 38724 },
+ { 0x287B, 38787 },
+ { 0x287C, 38739 },
+ { 0x287D, 38802 },
+ { 0x287E, 38820 },
+ { 0x287F, 38841 },
+ { 0x2880, 38124 },
+ { 0x2881, 38145 },
+ { 0x2882, 38163 },
+ { 0x2883, 38226 },
+ { 0x2884, 38178 },
+ { 0x2885, 38241 },
+ { 0x2886, 38286 },
+ { 0x2887, 38391 },
+ { 0x2888, 38190 },
+ { 0x2889, 38253 },
+ { 0x288A, 38298 },
+ { 0x288B, 38403 },
+ { 0x288C, 38328 },
+ { 0x288D, 38433 },
+ { 0x288E, 38493 },
+ { 0x288F, 38598 },
+ { 0x2890, 38199 },
+ { 0x2891, 38262 },
+ { 0x2892, 38307 },
+ { 0x2893, 38412 },
+ { 0x2894, 38337 },
+ { 0x2895, 38442 },
+ { 0x2896, 38502 },
+ { 0x2897, 38607 },
+ { 0x2898, 38355 },
+ { 0x2899, 38460 },
+ { 0x289A, 38520 },
+ { 0x289B, 38625 },
+ { 0x289C, 38550 },
+ { 0x289D, 38655 },
+ { 0x289E, 38700 },
+ { 0x289F, 38763 },
+ { 0x28A0, 38205 },
+ { 0x28A1, 38268 },
+ { 0x28A2, 38313 },
+ { 0x28A3, 38418 },
+ { 0x28A4, 38343 },
+ { 0x28A5, 38448 },
+ { 0x28A6, 38508 },
+ { 0x28A7, 38613 },
+ { 0x28A8, 38361 },
+ { 0x28A9, 38466 },
+ { 0x28AA, 38526 },
+ { 0x28AB, 38631 },
+ { 0x28AC, 38556 },
+ { 0x28AD, 38661 },
+ { 0x28AE, 38706 },
+ { 0x28AF, 38769 },
+ { 0x28B0, 38370 },
+ { 0x28B1, 38475 },
+ { 0x28B2, 38535 },
+ { 0x28B3, 38640 },
+ { 0x28B4, 38565 },
+ { 0x28B5, 38670 },
+ { 0x28B6, 38715 },
+ { 0x28B7, 38778 },
+ { 0x28B8, 38577 },
+ { 0x28B9, 38682 },
+ { 0x28BA, 38727 },
+ { 0x28BB, 38790 },
+ { 0x28BC, 38742 },
+ { 0x28BD, 38805 },
+ { 0x28BE, 38823 },
+ { 0x28BF, 38844 },
+ { 0x28C0, 38208 },
+ { 0x28C1, 38271 },
+ { 0x28C2, 38316 },
+ { 0x28C3, 38421 },
+ { 0x28C4, 38346 },
+ { 0x28C5, 38451 },
+ { 0x28C6, 38511 },
+ { 0x28C7, 38616 },
+ { 0x28C8, 38364 },
+ { 0x28C9, 38469 },
+ { 0x28CA, 38529 },
+ { 0x28CB, 38634 },
+ { 0x28CC, 38559 },
+ { 0x28CD, 38664 },
+ { 0x28CE, 38709 },
+ { 0x28CF, 38772 },
+ { 0x28D0, 38373 },
+ { 0x28D1, 38478 },
+ { 0x28D2, 38538 },
+ { 0x28D3, 38643 },
+ { 0x28D4, 38568 },
+ { 0x28D5, 38673 },
+ { 0x28D6, 38718 },
+ { 0x28D7, 38781 },
+ { 0x28D8, 38580 },
+ { 0x28D9, 38685 },
+ { 0x28DA, 38730 },
+ { 0x28DB, 38793 },
+ { 0x28DC, 38745 },
+ { 0x28DD, 38808 },
+ { 0x28DE, 38826 },
+ { 0x28DF, 38847 },
+ { 0x28E0, 38376 },
+ { 0x28E1, 38481 },
+ { 0x28E2, 38541 },
+ { 0x28E3, 38646 },
+ { 0x28E4, 38571 },
+ { 0x28E5, 38676 },
+ { 0x28E6, 38721 },
+ { 0x28E7, 38784 },
+ { 0x28E8, 38583 },
+ { 0x28E9, 38688 },
+ { 0x28EA, 38733 },
+ { 0x28EB, 38796 },
+ { 0x28EC, 38748 },
+ { 0x28ED, 38811 },
+ { 0x28EE, 38829 },
+ { 0x28EF, 38850 },
+ { 0x28F0, 38586 },
+ { 0x28F1, 38691 },
+ { 0x28F2, 38736 },
+ { 0x28F3, 38799 },
+ { 0x28F4, 38751 },
+ { 0x28F5, 38814 },
+ { 0x28F6, 38832 },
+ { 0x28F7, 38853 },
+ { 0x28F8, 38754 },
+ { 0x28F9, 38817 },
+ { 0x28FA, 38835 },
+ { 0x28FB, 38856 },
+ { 0x28FC, 38838 },
+ { 0x28FD, 38859 },
+ { 0x28FE, 38862 },
+ { 0x28FF, 38865 },
+ { 0x2900, 68309 },
+ { 0x2901, 68302 },
+ { 0x2902, 64491 },
+ { 0x2903, 68156 },
+ { 0x2904, 9303 },
+ { 0x2905, 68275 },
+ { 0x2906, 64481 },
+ { 0x2907, 68146 },
+ { 0x2908, 63281 },
+ { 0x2909, 44567 },
+ { 0x290A, 44631 },
+ { 0x290B, 63309 },
+ { 0x290C, 64474 },
+ { 0x290D, 68139 },
+ { 0x290E, 64503 },
+ { 0x290F, 68168 },
+ { 0x2910, 68315 },
+ { 0x2911, 68066 },
+ { 0x2912, 44544 },
+ { 0x2913, 63253 },
+ { 0x2914, 68054 },
+ { 0x2915, 68046 },
+ { 0x2916, 68280 },
+ { 0x2917, 68294 },
+ { 0x2918, 68285 },
+ { 0x2919, 64608 },
+ { 0x291A, 68273 },
+ { 0x291B, 64497 },
+ { 0x291C, 68162 },
+ { 0x291D, 64340 },
+ { 0x291E, 67998 },
+ { 0x291F, 64349 },
+ { 0x2920, 68007 },
+ { 0x2921, 21318 },
+ { 0x2922, 21271 },
+ { 0x2923, 21345 },
+ { 0x2924, 21287 },
+ { 0x2925, 22689 },
+ { 0x2926, 22723 },
+ { 0x2927, 21338 },
+ { 0x2928, 21280 },
+ { 0x2929, 22682 },
+ { 0x292A, 22716 },
+ { 0x292B, 35805 },
+ { 0x292C, 40551 },
+ { 0x292D, 22694 },
+ { 0x292E, 21299 },
+ { 0x292F, 40545 },
+ { 0x2930, 35799 },
+ { 0x2931, 21292 },
+ { 0x2932, 21350 },
+ { 0x2933, 10070 },
+ { 0x2934, 10127 },
+ { 0x2935, 10133 },
+ { 0x2936, 10115 },
+ { 0x2937, 10121 },
+ { 0x2938, 67981 },
+ { 0x2939, 64314 },
+ { 0x293A, 7721 },
+ { 0x293B, 30248 },
+ { 0x293C, 7715 },
+ { 0x293D, 7725 },
+ { 0x293E, 21154 },
+ { 0x293F, 21125 },
+ { 0x2940, 74492 },
+ { 0x2941, 57370 },
+ { 0x2942, 68086 },
+ { 0x2943, 64423 },
+ { 0x2944, 22470 },
+ { 0x2945, 68037 },
+ { 0x2946, 64379 },
+ { 0x2947, 68116 },
+ { 0x2948, 9279 },
+ { 0x2949, 44697 },
+ { 0x294A, 9167 },
+ { 0x294B, 9174 },
+ { 0x294C, 289 },
+ { 0x294D, 282 },
+ { 0x294E, 9160 },
+ { 0x294F, 296 },
+ { 0x2950, 9181 },
+ { 0x2951, 275 },
+ { 0x2952, 64515 },
+ { 0x2953, 68180 },
+ { 0x2954, 44670 },
+ { 0x2955, 63351 },
+ { 0x2956, 64559 },
+ { 0x2957, 68224 },
+ { 0x2958, 44634 },
+ { 0x2959, 63315 },
+ { 0x295A, 64522 },
+ { 0x295B, 68187 },
+ { 0x295C, 44677 },
+ { 0x295D, 63358 },
+ { 0x295E, 64566 },
+ { 0x295F, 68231 },
+ { 0x2960, 44641 },
+ { 0x2961, 63322 },
+ { 0x2962, 64537 },
+ { 0x2963, 44648 },
+ { 0x2964, 68213 },
+ { 0x2965, 63340 },
+ { 0x2966, 64548 },
+ { 0x2967, 64573 },
+ { 0x2968, 68202 },
+ { 0x2969, 68238 },
+ { 0x296A, 64529 },
+ { 0x296B, 64584 },
+ { 0x296C, 68194 },
+ { 0x296D, 68249 },
+ { 0x296E, 44659 },
+ { 0x296F, 63329 },
+ { 0x2970, 21882 },
+ { 0x2971, 31756 },
+ { 0x2972, 23038 },
+ { 0x2973, 64429 },
+ { 0x2974, 68092 },
+ { 0x2975, 68097 },
+ { 0x2976, 64759 },
+ { 0x2977, 64461 },
+ { 0x2978, 69536 },
+ { 0x2979, 36531 },
+ { 0x297A, 64457 },
+ { 0x297B, 55638 },
+ { 0x297C, 9188 },
+ { 0x297D, 21759 },
+ { 0x297E, 323 },
+ { 0x297F, 9070 },
+ { 0x2980, 37651 },
+ { 0x2981, 26 },
+ { 0x2982, 29 },
+ { 0x2983, 9326 },
+ { 0x2984, 21847 },
+ { 0x2985, 9347 },
+ { 0x2986, 21868 },
+ { 0x2987, 16 },
+ { 0x2988, 37 },
+ { 0x2989, 21 },
+ { 0x298A, 42 },
+ { 0x298B, 9409 },
+ { 0x298C, 21936 },
+ { 0x298D, 9388 },
+ { 0x298E, 21923 },
+ { 0x298F, 9396 },
+ { 0x2990, 21915 },
+ { 0x2991, 9207 },
+ { 0x2992, 21791 },
+ { 0x2993, 9144 },
+ { 0x2994, 21747 },
+ { 0x2995, 31554 },
+ { 0x2996, 31580 },
+ { 0x2997, 9222 },
+ { 0x2998, 21815 },
+ { 0x2999, 31531 },
+ { 0x299A, 56093 },
+ { 0x299B, 53830 },
+ { 0x299C, 21796 },
+ { 0x299D, 53834 },
+ { 0x299E, 10107 },
+ { 0x299F, 10102 },
+ { 0x29A0, 65821 },
+ { 0x29A1, 65817 },
+ { 0x29A2, 37674 },
+ { 0x29A3, 55459 },
+ { 0x29A4, 10111 },
+ { 0x29A5, 55461 },
+ { 0x29A6, 42843 },
+ { 0x29A7, 42847 },
+ { 0x29A8, 53746 },
+ { 0x29A9, 53734 },
+ { 0x29AA, 53770 },
+ { 0x29AB, 53758 },
+ { 0x29AC, 53806 },
+ { 0x29AD, 53782 },
+ { 0x29AE, 53818 },
+ { 0x29AF, 53794 },
+ { 0x29B0, 55465 },
+ { 0x29B1, 10590 },
+ { 0x29B2, 10584 },
+ { 0x29B3, 10578 },
+ { 0x29B4, 10572 },
+ { 0x29B5, 30522 },
+ { 0x29B6, 39617 },
+ { 0x29B7, 39612 },
+ { 0x29B8, 39459 },
+ { 0x29B9, 39776 },
+ { 0x29BA, 30530 },
+ { 0x29BB, 30526 },
+ { 0x29BC, 39784 },
+ { 0x29BD, 333 },
+ { 0x29BE, 39189 },
+ { 0x29BF, 39192 },
+ { 0x29C0, 39767 },
+ { 0x29C1, 39774 },
+ { 0x29C2, 30500 },
+ { 0x29C3, 30477 },
+ { 0x29C4, 43569 },
+ { 0x29C5, 43575 },
+ { 0x29C6, 43579 },
+ { 0x29C7, 43564 },
+ { 0x29C8, 43573 },
+ { 0x29C9, 7778 },
+ { 0x29CA, 55898 },
+ { 0x29CB, 55907 },
+ { 0x29CC, 4 },
+ { 0x29CD, 55902 },
+ { 0x29CE, 21974 },
+ { 0x29CF, 9447 },
+ { 0x29D0, 56016 },
+ { 0x29D1, 30295 },
+ { 0x29D2, 30300 },
+ { 0x29D3, 10232 },
+ { 0x29D4, 23043 },
+ { 0x29D5, 23048 },
+ { 0x29D6, 23406 },
+ { 0x29D7, 10312 },
+ { 0x29D8, 9428 },
+ { 0x29D9, 21955 },
+ { 0x29DA, 9361 },
+ { 0x29DB, 21888 },
+ { 0x29DC, 67665 },
+ { 0x29DD, 7712 },
+ { 0x29DE, 53301 },
+ { 0x29DF, 69403 },
+ { 0x29E0, 36275 },
+ { 0x29E1, 64303 },
+ { 0x29E2, 43172 },
+ { 0x29E3, 31708 },
+ { 0x29E4, 31713 },
+ { 0x29E5, 64294 },
+ { 0x29E6, 31794 },
+ { 0x29E7, 75047 },
+ { 0x29E8, 74585 },
+ { 0x29E9, 74591 },
+ { 0x29EA, 10277 },
+ { 0x29EB, 10289 },
+ { 0x29EC, 23248 },
+ { 0x29ED, 10246 },
+ { 0x29EE, 69417 },
+ { 0x29EF, 69408 },
+ { 0x29F0, 69420 },
+ { 0x29F1, 69411 },
+ { 0x29F2, 69414 },
+ { 0x29F3, 69405 },
+ { 0x29F4, 74476 },
+ { 0x29F5, 43001 },
+ { 0x29F6, 43549 },
+ { 0x29F7, 42996 },
+ { 0x29F8, 4385 },
+ { 0x29F9, 4382 },
+ { 0x29FA, 31559 },
+ { 0x29FB, 37614 },
+ { 0x29FC, 74608 },
+ { 0x29FD, 75090 },
+ { 0x29FE, 10053 },
+ { 0x29FF, 9598 },
+ { 0x2A00, 21242 },
+ { 0x2A01, 21246 },
+ { 0x2A02, 21250 },
+ { 0x2A03, 21220 },
+ { 0x2A04, 21225 },
+ { 0x2A05, 21238 },
+ { 0x2A06, 21234 },
+ { 0x2A07, 7785 },
+ { 0x2A08, 7781 },
+ { 0x2A09, 21215 },
+ { 0x2A0A, 35573 },
+ { 0x2A0B, 65861 },
+ { 0x2A0C, 65763 },
+ { 0x2A0D, 31773 },
+ { 0x2A0E, 53314 },
+ { 0x2A0F, 53338 },
+ { 0x2A10, 68611 },
+ { 0x2A11, 74503 },
+ { 0x2A12, 9491 },
+ { 0x2A13, 9498 },
+ { 0x2A14, 9485 },
+ { 0x2A15, 53333 },
+ { 0x2A16, 67973 },
+ { 0x2A17, 53324 },
+ { 0x2A18, 53307 },
+ { 0x2A19, 53330 },
+ { 0x2A1A, 53311 },
+ { 0x2A1B, 53318 },
+ { 0x2A1C, 53321 },
+ { 0x2A1D, 9130 },
+ { 0x2A1E, 14460 },
+ { 0x2A1F, 59 },
+ { 0x2A20, 51 },
+ { 0x2A21, 55 },
+ { 0x2A22, 9661 },
+ { 0x2A23, 9682 },
+ { 0x2A24, 9667 },
+ { 0x2A25, 9651 },
+ { 0x2A26, 9672 },
+ { 0x2A27, 9677 },
+ { 0x2A28, 9656 },
+ { 0x2A29, 21189 },
+ { 0x2A2A, 21184 },
+ { 0x2A2B, 21199 },
+ { 0x2A2C, 21194 },
+ { 0x2A2D, 9635 },
+ { 0x2A2E, 9641 },
+ { 0x2A2F, 37706 },
+ { 0x2A30, 75078 },
+ { 0x2A31, 75083 },
+ { 0x2A32, 68589 },
+ { 0x2A33, 22668 },
+ { 0x2A34, 75057 },
+ { 0x2A35, 75063 },
+ { 0x2A36, 39778 },
+ { 0x2A37, 75069 },
+ { 0x2A38, 39465 },
+ { 0x2A39, 9647 },
+ { 0x2A3A, 21180 },
+ { 0x2A3B, 75074 },
+ { 0x2A3C, 53344 },
+ { 0x2A3D, 65810 },
+ { 0x2A3E, 63 },
+ { 0x2A3F, 69339 },
+ { 0x2A40, 69571 },
+ { 0x2A41, 23059 },
+ { 0x2A42, 23067 },
+ { 0x2A43, 69578 },
+ { 0x2A44, 69574 },
+ { 0x2A45, 23063 },
+ { 0x2A46, 23075 },
+ { 0x2A47, 69586 },
+ { 0x2A48, 23070 },
+ { 0x2A49, 69581 },
+ { 0x2A4A, 23078 },
+ { 0x2A4B, 69589 },
+ { 0x2A4C, 30542 },
+ { 0x2A4D, 30567 },
+ { 0x2A4E, 31603 },
+ { 0x2A4F, 31600 },
+ { 0x2A50, 30546 },
+ { 0x2A51, 40961 },
+ { 0x2A52, 40929 },
+ { 0x2A53, 31655 },
+ { 0x2A54, 31652 },
+ { 0x2A55, 7801 },
+ { 0x2A56, 7797 },
+ { 0x2A57, 43534 },
+ { 0x2A58, 43537 },
+ { 0x2A59, 40954 },
+ { 0x2A5A, 40976 },
+ { 0x2A5B, 40944 },
+ { 0x2A5C, 40985 },
+ { 0x2A5D, 40949 },
+ { 0x2A5E, 40966 },
+ { 0x2A5F, 40981 },
+ { 0x2A60, 40971 },
+ { 0x2A61, 22483 },
+ { 0x2A62, 40934 },
+ { 0x2A63, 40939 },
+ { 0x2A64, 47 },
+ { 0x2A65, 33 },
+ { 0x2A66, 31721 },
+ { 0x2A67, 64299 },
+ { 0x2A68, 37655 },
+ { 0x2A69, 37662 },
+ { 0x2A6A, 23023 },
+ { 0x2A6B, 23028 },
+ { 0x2A6C, 43192 },
+ { 0x2A6D, 58345 },
+ { 0x2A6E, 31761 },
+ { 0x2A6F, 23695 },
+ { 0x2A70, 74511 },
+ { 0x2A71, 31741 },
+ { 0x2A72, 9688 },
+ { 0x2A73, 31746 },
+ { 0x2A74, 31567 },
+ { 0x2A75, 7793 },
+ { 0x2A76, 22998 },
+ { 0x2A77, 31726 },
+ { 0x2A78, 67228 },
+ { 0x2A79, 64731 },
+ { 0x2A7A, 69502 },
+ { 0x2A7B, 64735 },
+ { 0x2A7C, 69506 },
+ { 0x2A7D, 64662 },
+ { 0x2A7E, 69433 },
+ { 0x2A7F, 64684 },
+ { 0x2A80, 69455 },
+ { 0x2A81, 64667 },
+ { 0x2A82, 69438 },
+ { 0x2A83, 64675 },
+ { 0x2A84, 69446 },
+ { 0x2A85, 64696 },
+ { 0x2A86, 69470 },
+ { 0x2A87, 64706 },
+ { 0x2A88, 69477 },
+ { 0x2A89, 64702 },
+ { 0x2A8A, 69473 },
+ { 0x2A8B, 64763 },
+ { 0x2A8C, 69540 },
+ { 0x2A8D, 64740 },
+ { 0x2A8E, 69511 },
+ { 0x2A8F, 64745 },
+ { 0x2A90, 69516 },
+ { 0x2A91, 64769 },
+ { 0x2A92, 69530 },
+ { 0x2A93, 64750 },
+ { 0x2A94, 69521 },
+ { 0x2A95, 43508 },
+ { 0x2A96, 43521 },
+ { 0x2A97, 43513 },
+ { 0x2A98, 43526 },
+ { 0x2A99, 68620 },
+ { 0x2A9A, 68625 },
+ { 0x2A9B, 68630 },
+ { 0x2A9C, 68636 },
+ { 0x2A9D, 43174 },
+ { 0x2A9E, 43177 },
+ { 0x2A9F, 43180 },
+ { 0x2AA0, 43186 },
+ { 0x2AA1, 31589 },
+ { 0x2AA2, 31597 },
+ { 0x2AA3, 31592 },
+ { 0x2AA4, 69565 },
+ { 0x2AA5, 69551 },
+ { 0x2AA6, 64780 },
+ { 0x2AA7, 69554 },
+ { 0x2AA8, 64784 },
+ { 0x2AA9, 69558 },
+ { 0x2AAA, 43540 },
+ { 0x2AAB, 34099 },
+ { 0x2AAC, 43542 },
+ { 0x2AAD, 34101 },
+ { 0x2AAE, 31736 },
+ { 0x2AAF, 55374 },
+ { 0x2AB0, 55568 },
+ { 0x2AB1, 55368 },
+ { 0x2AB2, 55562 },
+ { 0x2AB3, 55364 },
+ { 0x2AB4, 55558 },
+ { 0x2AB5, 55348 },
+ { 0x2AB6, 55542 },
+ { 0x2AB7, 55359 },
+ { 0x2AB8, 55553 },
+ { 0x2AB9, 55353 },
+ { 0x2ABA, 55547 },
+ { 0x2ABB, 31666 },
+ { 0x2ABC, 31671 },
+ { 0x2ABD, 36512 },
+ { 0x2ABE, 55619 },
+ { 0x2ABF, 36515 },
+ { 0x2AC0, 55622 },
+ { 0x2AC1, 36520 },
+ { 0x2AC2, 55627 },
+ { 0x2AC3, 36476 },
+ { 0x2AC4, 55583 },
+ { 0x2AC5, 36507 },
+ { 0x2AC6, 55614 },
+ { 0x2AC7, 36496 },
+ { 0x2AC8, 55603 },
+ { 0x2AC9, 36501 },
+ { 0x2ACA, 55608 },
+ { 0x2ACB, 36490 },
+ { 0x2ACC, 55597 },
+ { 0x2ACD, 36177 },
+ { 0x2ACE, 36346 },
+ { 0x2ACF, 30553 },
+ { 0x2AD0, 30560 },
+ { 0x2AD1, 30555 },
+ { 0x2AD2, 30562 },
+ { 0x2AD3, 36528 },
+ { 0x2AD4, 55632 },
+ { 0x2AD5, 36525 },
+ { 0x2AD6, 55635 },
+ { 0x2AD7, 55650 },
+ { 0x2AD8, 55642 },
+ { 0x2AD9, 40541 },
+ { 0x2ADA, 65757 },
+ { 0x2ADB, 69324 },
+ { 0x2ADC, 40557 },
+ { 0x2ADD, 67879 },
+ { 0x2ADE, 22467 },
+ { 0x2ADF, 22459 },
+ { 0x2AE0, 22444 },
+ { 0x2AE1, 75038 },
+ { 0x2AE2, 56026 },
+ { 0x2AE3, 31675 },
+ { 0x2AE4, 56021 },
+ { 0x2AE5, 31680 },
+ { 0x2AE6, 9507 },
+ { 0x2AE7, 22462 },
+ { 0x2AE8, 22447 },
+ { 0x2AE9, 22452 },
+ { 0x2AEA, 31551 },
+ { 0x2AEB, 31545 },
+ { 0x2AEC, 31606 },
+ { 0x2AED, 55483 },
+ { 0x2AEE, 9026 },
+ { 0x2AEF, 56068 },
+ { 0x2AF0, 56073 },
+ { 0x2AF1, 9075 },
+ { 0x2AF2, 54952 },
+ { 0x2AF3, 54948 },
+ { 0x2AF4, 37646 },
+ { 0x2AF5, 37635 },
+ { 0x2AF6, 37616 },
+ { 0x2AF7, 37623 },
+ { 0x2AF8, 37626 },
+ { 0x2AF9, 68642 },
+ { 0x2AFA, 68648 },
+ { 0x2AFB, 37629 },
+ { 0x2AFC, 14466 },
+ { 0x2AFD, 31661 },
+ { 0x2AFE, 23397 },
+ { 0x2AFF, 21230 },
+ { 0x2B00, 21310 },
+ { 0x2B01, 21361 },
+ { 0x2B02, 22705 },
+ { 0x2B03, 22732 },
+ { 0x2B04, 9289 },
+ { 0x2B05, 64465 },
+ { 0x2B06, 44578 },
+ { 0x2B07, 63292 },
+ { 0x2B08, 21306 },
+ { 0x2B09, 21357 },
+ { 0x2B0A, 22701 },
+ { 0x2B0B, 22728 },
+ { 0x2B0C, 9285 },
+ { 0x2B0D, 311 },
+ { 0x2B0E, 68024 },
+ { 0x2B0F, 68019 },
+ { 0x2B10, 64366 },
+ { 0x2B11, 64361 },
+ { 0x2B12, 36202 },
+ { 0x2B13, 36261 },
+ { 0x2B14, 36254 },
+ { 0x2B15, 36212 },
+ { 0x2B16, 40312 },
+ { 0x2B17, 40317 },
+ { 0x2B18, 40307 },
+ { 0x2B19, 40322 },
+ { 0x2B1A, 31537 },
+ { 0x2B1B, 10191 },
+ { 0x2B1C, 23212 },
+ { 0x2B1D, 10163 },
+ { 0x2B1E, 23187 },
+ { 0x2B1F, 10302 },
+ { 0x2B20, 23387 },
+ { 0x2B21, 23371 },
+ { 0x2B22, 10287 },
+ { 0x2B23, 67658 },
+ { 0x2B24, 10188 },
+ { 0x2B25, 10264 },
+ { 0x2B26, 23287 },
+ { 0x2B27, 10267 },
+ { 0x2B28, 23290 },
+ { 0x2B29, 10215 },
+ { 0x2B2A, 10218 },
+ { 0x2B2B, 23228 },
+ { 0x2B2C, 10325 },
+ { 0x2B2D, 23414 },
+ { 0x2B2E, 10306 },
+ { 0x2B2F, 23400 },
+ { 0x2B30, 9212 },
+ { 0x2B31, 22992 },
+ { 0x2B32, 9217 },
+ { 0x2B33, 9550 },
+ { 0x2B34, 64644 },
+ { 0x2B35, 64637 },
+ { 0x2B36, 64610 },
+ { 0x2B37, 64650 },
+ { 0x2B38, 64403 },
+ { 0x2B39, 64396 },
+ { 0x2B3A, 64388 },
+ { 0x2B3B, 64615 },
+ { 0x2B3C, 64629 },
+ { 0x2B3D, 64620 },
+ { 0x2B3E, 64453 },
+ { 0x2B3F, 10065 },
+ { 0x2B40, 31751 },
+ { 0x2B41, 42982 },
+ { 0x2B42, 64446 },
+ { 0x2B43, 68124 },
+ { 0x2B44, 68120 },
+ { 0x2B45, 64605 },
+ { 0x2B46, 68270 },
+ { 0x2B47, 42988 },
+ { 0x2B48, 68109 },
+ { 0x2B49, 23033 },
+ { 0x2B4A, 64434 },
+ { 0x2B4B, 64440 },
+ { 0x2B4C, 68103 },
+ { 0x2B50, 23277 },
+ { 0x2B51, 10209 },
+ { 0x2B52, 23222 },
+ { 0x2B53, 10370 },
+ { 0x2B54, 23470 },
+ { 0x2C00, 67450 },
+ { 0x2C01, 67479 },
+ { 0x2C02, 67503 },
+ { 0x2C03, 67579 },
+ { 0x2C04, 67519 },
+ { 0x2C05, 67555 },
+ { 0x2C06, 67621 },
+ { 0x2C07, 67523 },
+ { 0x2C08, 67575 },
+ { 0x2C09, 67491 },
+ { 0x2C0A, 67583 },
+ { 0x2C0B, 67434 },
+ { 0x2C0C, 67563 },
+ { 0x2C0D, 67495 },
+ { 0x2C0E, 67604 },
+ { 0x2C0F, 67608 },
+ { 0x2C10, 67531 },
+ { 0x2C11, 67459 },
+ { 0x2C12, 67567 },
+ { 0x2C13, 67535 },
+ { 0x2C14, 67539 },
+ { 0x2C15, 67571 },
+ { 0x2C16, 67475 },
+ { 0x2C17, 67527 },
+ { 0x2C18, 67487 },
+ { 0x2C19, 67463 },
+ { 0x2C1A, 67438 },
+ { 0x2C1B, 67499 },
+ { 0x2C1C, 67471 },
+ { 0x2C1D, 67559 },
+ { 0x2C1E, 67467 },
+ { 0x2C1F, 67515 },
+ { 0x2C20, 67511 },
+ { 0x2C21, 67507 },
+ { 0x2C22, 67616 },
+ { 0x2C23, 67446 },
+ { 0x2C24, 67543 },
+ { 0x2C25, 67548 },
+ { 0x2C26, 67442 },
+ { 0x2C27, 67594 },
+ { 0x2C28, 67454 },
+ { 0x2C29, 67588 },
+ { 0x2C2A, 67483 },
+ { 0x2C2B, 67600 },
+ { 0x2C2C, 67612 },
+ { 0x2C2D, 67630 },
+ { 0x2C2E, 67625 },
+ { 0x2C30, 67249 },
+ { 0x2C31, 67278 },
+ { 0x2C32, 67302 },
+ { 0x2C33, 67378 },
+ { 0x2C34, 67318 },
+ { 0x2C35, 67354 },
+ { 0x2C36, 67420 },
+ { 0x2C37, 67322 },
+ { 0x2C38, 67374 },
+ { 0x2C39, 67290 },
+ { 0x2C3A, 67382 },
+ { 0x2C3B, 67233 },
+ { 0x2C3C, 67362 },
+ { 0x2C3D, 67294 },
+ { 0x2C3E, 67403 },
+ { 0x2C3F, 67407 },
+ { 0x2C40, 67330 },
+ { 0x2C41, 67258 },
+ { 0x2C42, 67366 },
+ { 0x2C43, 67334 },
+ { 0x2C44, 67338 },
+ { 0x2C45, 67370 },
+ { 0x2C46, 67274 },
+ { 0x2C47, 67326 },
+ { 0x2C48, 67286 },
+ { 0x2C49, 67262 },
+ { 0x2C4A, 67237 },
+ { 0x2C4B, 67298 },
+ { 0x2C4C, 67270 },
+ { 0x2C4D, 67358 },
+ { 0x2C4E, 67266 },
+ { 0x2C4F, 67314 },
+ { 0x2C50, 67310 },
+ { 0x2C51, 67306 },
+ { 0x2C52, 67415 },
+ { 0x2C53, 67245 },
+ { 0x2C54, 67342 },
+ { 0x2C55, 67347 },
+ { 0x2C56, 67241 },
+ { 0x2C57, 67393 },
+ { 0x2C58, 67253 },
+ { 0x2C59, 67387 },
+ { 0x2C5A, 67282 },
+ { 0x2C5B, 67399 },
+ { 0x2C5C, 67411 },
+ { 0x2C5D, 67429 },
+ { 0x2C5E, 67424 },
+ { 0x2C60, 19214 },
+ { 0x2C61, 15577 },
+ { 0x2C62, 19228 },
+ { 0x2C63, 19682 },
+ { 0x2C64, 19762 },
+ { 0x2C65, 14629 },
+ { 0x2C66, 16472 },
+ { 0x2C67, 18936 },
+ { 0x2C68, 15276 },
+ { 0x2C69, 19148 },
+ { 0x2C6A, 15507 },
+ { 0x2C6B, 20410 },
+ { 0x2C6C, 17019 },
+ { 0x2C6D, 20597 },
+ { 0x2C6E, 19272 },
+ { 0x2C6F, 20649 },
+ { 0x2C71, 16751 },
+ { 0x2C72, 20235 },
+ { 0x2C73, 16796 },
+ { 0x2C74, 16739 },
+ { 0x2C75, 20547 },
+ { 0x2C76, 17312 },
+ { 0x2C77, 17839 },
+ { 0x2C78, 14974 },
+ { 0x2C79, 17623 },
+ { 0x2C7A, 15813 },
+ { 0x2C7B, 18125 },
+ { 0x2C7C, 20797 },
+ { 0x2C7D, 54684 },
+ { 0x2C80, 31044 },
+ { 0x2C81, 30751 },
+ { 0x2C82, 31072 },
+ { 0x2C83, 30779 },
+ { 0x2C84, 31084 },
+ { 0x2C85, 30791 },
+ { 0x2C86, 31080 },
+ { 0x2C87, 30787 },
+ { 0x2C88, 30922 },
+ { 0x2C89, 30629 },
+ { 0x2C8A, 31036 },
+ { 0x2C8B, 30743 },
+ { 0x2C8C, 31076 },
+ { 0x2C8D, 30783 },
+ { 0x2C8E, 31048 },
+ { 0x2C8F, 30755 },
+ { 0x2C90, 31108 },
+ { 0x2C91, 30815 },
+ { 0x2C92, 31088 },
+ { 0x2C93, 30795 },
+ { 0x2C94, 31056 },
+ { 0x2C95, 30763 },
+ { 0x2C96, 31092 },
+ { 0x2C97, 30799 },
+ { 0x2C98, 30898 },
+ { 0x2C99, 30605 },
+ { 0x2C9A, 30902 },
+ { 0x2C9B, 30609 },
+ { 0x2C9C, 30934 },
+ { 0x2C9D, 30641 },
+ { 0x2C9E, 30890 },
+ { 0x2C9F, 30597 },
+ { 0x2CA0, 30906 },
+ { 0x2CA1, 30613 },
+ { 0x2CA2, 30910 },
+ { 0x2CA3, 30617 },
+ { 0x2CA4, 31068 },
+ { 0x2CA5, 30775 },
+ { 0x2CA6, 31040 },
+ { 0x2CA7, 30747 },
+ { 0x2CA8, 30914 },
+ { 0x2CA9, 30621 },
+ { 0x2CAA, 30894 },
+ { 0x2CAB, 30601 },
+ { 0x2CAC, 30930 },
+ { 0x2CAD, 30637 },
+ { 0x2CAE, 31032 },
+ { 0x2CAF, 30739 },
+ { 0x2CB0, 31028 },
+ { 0x2CB1, 30735 },
+ { 0x2CB2, 31132 },
+ { 0x2CB3, 30839 },
+ { 0x2CB4, 30944 },
+ { 0x2CB5, 30651 },
+ { 0x2CB6, 31152 },
+ { 0x2CB7, 30859 },
+ { 0x2CB8, 31142 },
+ { 0x2CB9, 30849 },
+ { 0x2CBA, 31127 },
+ { 0x2CBB, 30834 },
+ { 0x2CBC, 31147 },
+ { 0x2CBD, 30854 },
+ { 0x2CBE, 30974 },
+ { 0x2CBF, 30681 },
+ { 0x2CC0, 31096 },
+ { 0x2CC1, 30803 },
+ { 0x2CC2, 31112 },
+ { 0x2CC3, 30819 },
+ { 0x2CC4, 30986 },
+ { 0x2CC5, 30693 },
+ { 0x2CC6, 30956 },
+ { 0x2CC7, 30663 },
+ { 0x2CC8, 31117 },
+ { 0x2CC9, 30824 },
+ { 0x2CCA, 31137 },
+ { 0x2CCB, 30844 },
+ { 0x2CCC, 30980 },
+ { 0x2CCD, 30687 },
+ { 0x2CCE, 30938 },
+ { 0x2CCF, 30645 },
+ { 0x2CD0, 31122 },
+ { 0x2CD1, 30829 },
+ { 0x2CD2, 30968 },
+ { 0x2CD3, 30675 },
+ { 0x2CD4, 30962 },
+ { 0x2CD5, 30669 },
+ { 0x2CD6, 30998 },
+ { 0x2CD7, 30705 },
+ { 0x2CD8, 30950 },
+ { 0x2CD9, 30657 },
+ { 0x2CDA, 30992 },
+ { 0x2CDB, 30699 },
+ { 0x2CDC, 31022 },
+ { 0x2CDD, 30729 },
+ { 0x2CDE, 31004 },
+ { 0x2CDF, 30711 },
+ { 0x2CE0, 31010 },
+ { 0x2CE1, 30717 },
+ { 0x2CE2, 31016 },
+ { 0x2CE3, 30723 },
+ { 0x2CE4, 30872 },
+ { 0x2CE5, 30864 },
+ { 0x2CE6, 30868 },
+ { 0x2CE7, 30887 },
+ { 0x2CE8, 30879 },
+ { 0x2CE9, 30875 },
+ { 0x2CEA, 30883 },
+ { 0x2CF9, 30572 },
+ { 0x2CFA, 30582 },
+ { 0x2CFB, 30588 },
+ { 0x2CFC, 30577 },
+ { 0x2CFD, 31157 },
+ { 0x2CFE, 30594 },
+ { 0x2CFF, 31161 },
+ { 0x2D00, 51786 },
+ { 0x2D01, 51814 },
+ { 0x2D02, 51830 },
+ { 0x2D03, 51826 },
+ { 0x2D04, 51790 },
+ { 0x2D05, 51894 },
+ { 0x2D06, 51902 },
+ { 0x2D07, 51886 },
+ { 0x2D08, 51798 },
+ { 0x2D09, 51854 },
+ { 0x2D0A, 51858 },
+ { 0x2D0B, 51862 },
+ { 0x2D0C, 51866 },
+ { 0x2D0D, 51802 },
+ { 0x2D0E, 51870 },
+ { 0x2D0F, 51934 },
+ { 0x2D10, 51878 },
+ { 0x2D11, 51882 },
+ { 0x2D12, 51890 },
+ { 0x2D13, 51806 },
+ { 0x2D14, 51926 },
+ { 0x2D15, 51922 },
+ { 0x2D16, 51914 },
+ { 0x2D17, 51874 },
+ { 0x2D18, 51930 },
+ { 0x2D19, 51910 },
+ { 0x2D1A, 51818 },
+ { 0x2D1B, 51850 },
+ { 0x2D1C, 51822 },
+ { 0x2D1D, 51906 },
+ { 0x2D1E, 51898 },
+ { 0x2D1F, 51918 },
+ { 0x2D20, 51834 },
+ { 0x2D21, 51794 },
+ { 0x2D22, 51842 },
+ { 0x2D23, 51810 },
+ { 0x2D24, 51838 },
+ { 0x2D25, 51846 },
+ { 0x2D30, 55713 },
+ { 0x2D31, 55725 },
+ { 0x2D32, 55789 },
+ { 0x2D33, 55734 },
+ { 0x2D34, 55834 },
+ { 0x2D35, 55845 },
+ { 0x2D36, 55740 },
+ { 0x2D37, 55728 },
+ { 0x2D38, 55798 },
+ { 0x2D39, 55795 },
+ { 0x2D3A, 55831 },
+ { 0x2D3B, 55782 },
+ { 0x2D3C, 55731 },
+ { 0x2D3D, 55743 },
+ { 0x2D3E, 55854 },
+ { 0x2D3F, 55837 },
+ { 0x2D40, 55737 },
+ { 0x2D41, 55840 },
+ { 0x2D42, 55850 },
+ { 0x2D43, 55804 },
+ { 0x2D44, 55722 },
+ { 0x2D45, 55807 },
+ { 0x2D46, 55870 },
+ { 0x2D47, 55758 },
+ { 0x2D48, 55858 },
+ { 0x2D49, 55716 },
+ { 0x2D4A, 55825 },
+ { 0x2D4B, 55882 },
+ { 0x2D4C, 55878 },
+ { 0x2D4D, 55746 },
+ { 0x2D4E, 55749 },
+ { 0x2D4F, 55752 },
+ { 0x2D50, 55866 },
+ { 0x2D51, 55874 },
+ { 0x2D52, 55755 },
+ { 0x2D53, 55719 },
+ { 0x2D54, 55761 },
+ { 0x2D55, 55810 },
+ { 0x2D56, 55801 },
+ { 0x2D57, 55862 },
+ { 0x2D58, 55785 },
+ { 0x2D59, 55764 },
+ { 0x2D5A, 55816 },
+ { 0x2D5B, 55813 },
+ { 0x2D5C, 55767 },
+ { 0x2D5D, 55819 },
+ { 0x2D5E, 55792 },
+ { 0x2D5F, 55822 },
+ { 0x2D60, 55770 },
+ { 0x2D61, 55773 },
+ { 0x2D62, 55776 },
+ { 0x2D63, 55779 },
+ { 0x2D64, 55886 },
+ { 0x2D65, 55828 },
+ { 0x2D6F, 55890 },
+ { 0x2D80, 50999 },
+ { 0x2D81, 51011 },
+ { 0x2D82, 51140 },
+ { 0x2D83, 51170 },
+ { 0x2D84, 51542 },
+ { 0x2D85, 50762 },
+ { 0x2D86, 51227 },
+ { 0x2D87, 50810 },
+ { 0x2D88, 51032 },
+ { 0x2D89, 51488 },
+ { 0x2D8A, 51672 },
+ { 0x2D8B, 51344 },
+ { 0x2D8C, 50837 },
+ { 0x2D8D, 51407 },
+ { 0x2D8E, 50939 },
+ { 0x2D8F, 51569 },
+ { 0x2D90, 51395 },
+ { 0x2D91, 51500 },
+ { 0x2D92, 51074 },
+ { 0x2D93, 51422 },
+ { 0x2D94, 51428 },
+ { 0x2D95, 51629 },
+ { 0x2D96, 51425 },
+ { 0x2DA0, 51173 },
+ { 0x2DA1, 51185 },
+ { 0x2DA2, 51179 },
+ { 0x2DA3, 51548 },
+ { 0x2DA4, 51551 },
+ { 0x2DA5, 51176 },
+ { 0x2DA6, 51182 },
+ { 0x2DA8, 50777 },
+ { 0x2DA9, 50789 },
+ { 0x2DAA, 50783 },
+ { 0x2DAB, 51368 },
+ { 0x2DAC, 51371 },
+ { 0x2DAD, 50780 },
+ { 0x2DAE, 50786 },
+ { 0x2DB0, 51350 },
+ { 0x2DB1, 51362 },
+ { 0x2DB2, 51356 },
+ { 0x2DB3, 51614 },
+ { 0x2DB4, 51617 },
+ { 0x2DB5, 51353 },
+ { 0x2DB6, 51359 },
+ { 0x2DB8, 51374 },
+ { 0x2DB9, 51386 },
+ { 0x2DBA, 51380 },
+ { 0x2DBB, 51620 },
+ { 0x2DBC, 51623 },
+ { 0x2DBD, 51377 },
+ { 0x2DBE, 51383 },
+ { 0x2DC0, 51119 },
+ { 0x2DC1, 51131 },
+ { 0x2DC2, 51125 },
+ { 0x2DC3, 51530 },
+ { 0x2DC4, 51533 },
+ { 0x2DC5, 51122 },
+ { 0x2DC6, 51128 },
+ { 0x2DC8, 50978 },
+ { 0x2DC9, 50990 },
+ { 0x2DCA, 50984 },
+ { 0x2DCB, 51473 },
+ { 0x2DCC, 51476 },
+ { 0x2DCD, 50981 },
+ { 0x2DCE, 50987 },
+ { 0x2DD0, 51299 },
+ { 0x2DD1, 51311 },
+ { 0x2DD2, 51305 },
+ { 0x2DD3, 51599 },
+ { 0x2DD4, 51602 },
+ { 0x2DD5, 51302 },
+ { 0x2DD6, 51308 },
+ { 0x2DD8, 50894 },
+ { 0x2DD9, 50906 },
+ { 0x2DDA, 50900 },
+ { 0x2DDB, 51437 },
+ { 0x2DDC, 51440 },
+ { 0x2DDD, 50897 },
+ { 0x2DDE, 50903 },
+ { 0x2DE0, 58034 },
+ { 0x2DE1, 58082 },
+ { 0x2DE2, 58103 },
+ { 0x2DE3, 58038 },
+ { 0x2DE4, 58119 },
+ { 0x2DE5, 58090 },
+ { 0x2DE6, 58070 },
+ { 0x2DE7, 58042 },
+ { 0x2DE8, 58046 },
+ { 0x2DE9, 58050 },
+ { 0x2DEA, 58030 },
+ { 0x2DEB, 58074 },
+ { 0x2DEC, 58054 },
+ { 0x2DED, 58058 },
+ { 0x2DEE, 58078 },
+ { 0x2DEF, 58062 },
+ { 0x2DF0, 58111 },
+ { 0x2DF1, 58099 },
+ { 0x2DF2, 58107 },
+ { 0x2DF3, 58135 },
+ { 0x2DF4, 58123 },
+ { 0x2DF5, 58131 },
+ { 0x2DF6, 58026 },
+ { 0x2DF7, 58066 },
+ { 0x2DF8, 58127 },
+ { 0x2DF9, 58155 },
+ { 0x2DFA, 58115 },
+ { 0x2DFB, 58086 },
+ { 0x2DFC, 58144 },
+ { 0x2DFD, 58139 },
+ { 0x2DFE, 58094 },
+ { 0x2DFF, 58149 },
+ { 0x2E00, 21801 },
+ { 0x2E01, 21783 },
+ { 0x2E02, 9477 },
+ { 0x2E03, 22004 },
+ { 0x2E04, 9353 },
+ { 0x2E05, 21874 },
+ { 0x2E06, 35672 },
+ { 0x2E07, 35666 },
+ { 0x2E08, 31539 },
+ { 0x2E09, 9480 },
+ { 0x2E0A, 22007 },
+ { 0x2E0B, 35670 },
+ { 0x2E0C, 9377 },
+ { 0x2E0D, 21904 },
+ { 0x2E0E, 63378 },
+ { 0x2E0F, 69268 },
+ { 0x2E10, 31783 },
+ { 0x2E11, 55488 },
+ { 0x2E12, 69569 },
+ { 0x2E13, 31535 },
+ { 0x2E14, 63298 },
+ { 0x2E15, 44620 },
+ { 0x2E16, 31542 },
+ { 0x2E17, 31658 },
+ { 0x2E18, 53360 },
+ { 0x2E19, 9626 },
+ { 0x2E1A, 33425 },
+ { 0x2E1B, 23017 },
+ { 0x2E1C, 9148 },
+ { 0x2E1D, 21751 },
+ { 0x2E1E, 23009 },
+ { 0x2E1F, 23013 },
+ { 0x2E20, 9452 },
+ { 0x2E21, 21979 },
+ { 0x2E22, 7737 },
+ { 0x2E23, 7750 },
+ { 0x2E24, 30258 },
+ { 0x2E25, 30271 },
+ { 0x2E26, 9439 },
+ { 0x2E27, 21964 },
+ { 0x2E28, 9369 },
+ { 0x2E29, 21896 },
+ { 0x2E2A, 7772 },
+ { 0x2E2B, 7155 },
+ { 0x2E2C, 43556 },
+ { 0x2E2D, 9091 },
+ { 0x2E2E, 55502 },
+ { 0x2E2F, 56091 },
+ { 0x2E30, 9704 },
+ { 0x2E80, 5603 },
+ { 0x2E81, 5510 },
+ { 0x2E82, 5606 },
+ { 0x2E83, 5610 },
+ { 0x2E84, 5614 },
+ { 0x2E85, 5600 },
+ { 0x2E86, 5346 },
+ { 0x2E87, 5577 },
+ { 0x2E88, 5539 },
+ { 0x2E89, 5543 },
+ { 0x2E8A, 5638 },
+ { 0x2E8B, 5477 },
+ { 0x2E8C, 5558 },
+ { 0x2E8D, 5562 },
+ { 0x2E8E, 5441 },
+ { 0x2E8F, 5445 },
+ { 0x2E90, 5453 },
+ { 0x2E91, 5449 },
+ { 0x2E92, 5566 },
+ { 0x2E93, 5626 },
+ { 0x2E94, 5569 },
+ { 0x2E95, 5573 },
+ { 0x2E96, 5531 },
+ { 0x2E97, 5535 },
+ { 0x2E98, 5429 },
+ { 0x2E99, 5403 },
+ { 0x2E9B, 5507 },
+ { 0x2E9C, 5406 },
+ { 0x2E9D, 5471 },
+ { 0x2E9E, 5513 },
+ { 0x2E9F, 5597 },
+ { 0x2EA0, 5635 },
+ { 0x2EA1, 5583 },
+ { 0x2EA2, 5587 },
+ { 0x2EA3, 5423 },
+ { 0x2EA4, 5392 },
+ { 0x2EA5, 5396 },
+ { 0x2EA6, 5641 },
+ { 0x2EA7, 5349 },
+ { 0x2EA8, 5352 },
+ { 0x2EA9, 5438 },
+ { 0x2EAA, 5412 },
+ { 0x2EAB, 5370 },
+ { 0x2EAC, 5618 },
+ { 0x2EAD, 5622 },
+ { 0x2EAE, 5591 },
+ { 0x2EAF, 5480 },
+ { 0x2EB0, 5715 },
+ { 0x2EB1, 5373 },
+ { 0x2EB2, 5377 },
+ { 0x2EB3, 5385 },
+ { 0x2EB4, 5381 },
+ { 0x2EB5, 5468 },
+ { 0x2EB6, 5555 },
+ { 0x2EB7, 5400 },
+ { 0x2EB8, 5367 },
+ { 0x2EB9, 5389 },
+ { 0x2EBA, 5499 },
+ { 0x2EBB, 5503 },
+ { 0x2EBC, 5465 },
+ { 0x2EBD, 5594 },
+ { 0x2EBE, 5519 },
+ { 0x2EBF, 5523 },
+ { 0x2EC0, 5527 },
+ { 0x2EC1, 5580 },
+ { 0x2EC2, 5632 },
+ { 0x2EC3, 5491 },
+ { 0x2EC4, 5495 },
+ { 0x2EC5, 5671 },
+ { 0x2EC6, 5647 },
+ { 0x2EC7, 5435 },
+ { 0x2EC8, 5739 },
+ { 0x2EC9, 5727 },
+ { 0x2ECA, 5426 },
+ { 0x2ECB, 5679 },
+ { 0x2ECC, 5651 },
+ { 0x2ECD, 5483 },
+ { 0x2ECE, 5487 },
+ { 0x2ECF, 5420 },
+ { 0x2ED0, 5699 },
+ { 0x2ED1, 5457 },
+ { 0x2ED2, 5461 },
+ { 0x2ED3, 5707 },
+ { 0x2ED4, 5695 },
+ { 0x2ED5, 5547 },
+ { 0x2ED6, 5551 },
+ { 0x2ED7, 5474 },
+ { 0x2ED8, 5409 },
+ { 0x2ED9, 5743 },
+ { 0x2EDA, 5703 },
+ { 0x2EDB, 5719 },
+ { 0x2EDC, 5667 },
+ { 0x2EDD, 5355 },
+ { 0x2EDE, 5359 },
+ { 0x2EDF, 5363 },
+ { 0x2EE0, 5663 },
+ { 0x2EE1, 5432 },
+ { 0x2EE2, 5723 },
+ { 0x2EE3, 5417 },
+ { 0x2EE4, 5516 },
+ { 0x2EE5, 5687 },
+ { 0x2EE6, 5675 },
+ { 0x2EE7, 5711 },
+ { 0x2EE8, 5655 },
+ { 0x2EE9, 5659 },
+ { 0x2EEA, 5691 },
+ { 0x2EEB, 5752 },
+ { 0x2EEC, 5683 },
+ { 0x2EED, 5756 },
+ { 0x2EEE, 5731 },
+ { 0x2EEF, 5760 },
+ { 0x2EF0, 5735 },
+ { 0x2EF1, 5629 },
+ { 0x2EF2, 5764 },
+ { 0x2EF3, 5748 },
+ { 0x2F00, 33501 },
+ { 0x2F01, 33669 },
+ { 0x2F02, 33459 },
+ { 0x2F03, 33860 },
+ { 0x2F04, 33981 },
+ { 0x2F05, 33639 },
+ { 0x2F06, 33531 },
+ { 0x2F07, 33486 },
+ { 0x2F08, 33489 },
+ { 0x2F09, 33663 },
+ { 0x2F0A, 33792 },
+ { 0x2F0B, 33789 },
+ { 0x2F0C, 33588 },
+ { 0x2F0D, 33780 },
+ { 0x2F0E, 33480 },
+ { 0x2F0F, 33896 },
+ { 0x2F10, 33688 },
+ { 0x2F11, 33819 },
+ { 0x2F12, 33831 },
+ { 0x2F13, 33753 },
+ { 0x2F14, 33881 },
+ { 0x2F15, 33834 },
+ { 0x2F16, 33962 },
+ { 0x2F17, 33528 },
+ { 0x2F18, 34081 },
+ { 0x2F19, 33707 },
+ { 0x2F1A, 33774 },
+ { 0x2F1B, 34048 },
+ { 0x2F1C, 33756 },
+ { 0x2F1D, 33828 },
+ { 0x2F1E, 34078 },
+ { 0x2F1F, 33786 },
+ { 0x2F20, 34051 },
+ { 0x2F21, 33434 },
+ { 0x2F22, 33437 },
+ { 0x2F23, 34030 },
+ { 0x2F24, 33447 },
+ { 0x2F25, 33917 },
+ { 0x2F26, 33771 },
+ { 0x2F27, 33701 },
+ { 0x2F28, 33645 },
+ { 0x2F29, 33869 },
+ { 0x2F2A, 33654 },
+ { 0x2F2B, 33938 },
+ { 0x2F2C, 33990 },
+ { 0x2F2D, 34066 },
+ { 0x2F2E, 33839 },
+ { 0x2F2F, 33750 },
+ { 0x2F30, 34045 },
+ { 0x2F31, 34006 },
+ { 0x2F32, 33462 },
+ { 0x2F33, 33856 },
+ { 0x2F34, 33948 },
+ { 0x2F35, 33675 },
+ { 0x2F36, 33534 },
+ { 0x2F37, 33848 },
+ { 0x2F38, 33450 },
+ { 0x2F39, 33872 },
+ { 0x2F3A, 34021 },
+ { 0x2F3B, 33719 },
+ { 0x2F3C, 33813 },
+ { 0x2F3D, 34036 },
+ { 0x2F3E, 33585 },
+ { 0x2F3F, 33630 },
+ { 0x2F40, 33935 },
+ { 0x2F41, 33507 },
+ { 0x2F42, 33978 },
+ { 0x2F43, 33941 },
+ { 0x2F44, 33444 },
+ { 0x2F45, 33993 },
+ { 0x2F46, 33495 },
+ { 0x2F47, 33525 },
+ { 0x2F48, 33519 },
+ { 0x2F49, 33682 },
+ { 0x2F4A, 33731 },
+ { 0x2F4B, 33651 },
+ { 0x2F4C, 33722 },
+ { 0x2F4D, 33783 },
+ { 0x2F4E, 34015 },
+ { 0x2F4F, 33430 },
+ { 0x2F50, 34027 },
+ { 0x2F51, 33477 },
+ { 0x2F52, 33573 },
+ { 0x2F53, 33887 },
+ { 0x2F54, 33908 },
+ { 0x2F55, 33604 },
+ { 0x2F56, 33576 },
+ { 0x2F57, 33959 },
+ { 0x2F58, 33952 },
+ { 0x2F59, 33625 },
+ { 0x2F5A, 33866 },
+ { 0x2F5B, 33601 },
+ { 0x2F5C, 33453 },
+ { 0x2F5D, 33456 },
+ { 0x2F5E, 34069 },
+ { 0x2F5F, 33648 },
+ { 0x2F60, 33822 },
+ { 0x2F61, 33728 },
+ { 0x2F62, 33893 },
+ { 0x2F63, 33666 },
+ { 0x2F64, 33538 },
+ { 0x2F65, 33795 },
+ { 0x2F66, 33556 },
+ { 0x2F67, 34072 },
+ { 0x2F68, 33944 },
+ { 0x2F69, 33914 },
+ { 0x2F6A, 33716 },
+ { 0x2F6B, 33582 },
+ { 0x2F6C, 33471 },
+ { 0x2F6D, 33878 },
+ { 0x2F6E, 33759 },
+ { 0x2F6F, 33890 },
+ { 0x2F70, 33987 },
+ { 0x2F71, 33905 },
+ { 0x2F72, 33807 },
+ { 0x2F73, 33567 },
+ { 0x2F74, 33884 },
+ { 0x2F75, 33929 },
+ { 0x2F76, 33698 },
+ { 0x2F77, 33713 },
+ { 0x2F78, 33483 },
+ { 0x2F79, 33492 },
+ { 0x2F7A, 33842 },
+ { 0x2F7B, 34033 },
+ { 0x2F7C, 33498 },
+ { 0x2F7D, 33441 },
+ { 0x2F7E, 33692 },
+ { 0x2F7F, 33465 },
+ { 0x2F80, 33768 },
+ { 0x2F81, 33679 },
+ { 0x2F82, 34063 },
+ { 0x2F83, 33710 },
+ { 0x2F84, 33923 },
+ { 0x2F85, 33972 },
+ { 0x2F86, 34000 },
+ { 0x2F87, 33975 },
+ { 0x2F88, 33550 },
+ { 0x2F89, 34075 },
+ { 0x2F8A, 33777 },
+ { 0x2F8B, 33810 },
+ { 0x2F8C, 33899 },
+ { 0x2F8D, 33966 },
+ { 0x2F8E, 33765 },
+ { 0x2F8F, 33737 },
+ { 0x2F90, 34024 },
+ { 0x2F91, 33741 },
+ { 0x2F92, 33522 },
+ { 0x2F93, 33642 },
+ { 0x2F94, 33984 },
+ { 0x2F95, 34012 },
+ { 0x2F96, 33541 },
+ { 0x2F97, 33504 },
+ { 0x2F98, 33926 },
+ { 0x2F99, 33845 },
+ { 0x2F9A, 33513 },
+ { 0x2F9B, 33516 },
+ { 0x2F9C, 33610 },
+ { 0x2F9D, 33553 },
+ { 0x2F9E, 33564 },
+ { 0x2F9F, 33932 },
+ { 0x2FA0, 34042 },
+ { 0x2FA1, 33734 },
+ { 0x2FA2, 33570 },
+ { 0x2FA3, 33747 },
+ { 0x2FA4, 34087 },
+ { 0x2FA5, 34054 },
+ { 0x2FA6, 33619 },
+ { 0x2FA7, 33672 },
+ { 0x2FA8, 33616 },
+ { 0x2FA9, 33825 },
+ { 0x2FAA, 33863 },
+ { 0x2FAB, 33851 },
+ { 0x2FAC, 33695 },
+ { 0x2FAD, 33547 },
+ { 0x2FAE, 33920 },
+ { 0x2FAF, 33598 },
+ { 0x2FB0, 34039 },
+ { 0x2FB1, 33996 },
+ { 0x2FB2, 33660 },
+ { 0x2FB3, 33875 },
+ { 0x2FB4, 33657 },
+ { 0x2FB5, 33744 },
+ { 0x2FB6, 33474 },
+ { 0x2FB7, 33468 },
+ { 0x2FB8, 33633 },
+ { 0x2FB9, 34060 },
+ { 0x2FBA, 33816 },
+ { 0x2FBB, 33561 },
+ { 0x2FBC, 33725 },
+ { 0x2FBD, 33622 },
+ { 0x2FBE, 33798 },
+ { 0x2FBF, 34090 },
+ { 0x2FC0, 34057 },
+ { 0x2FC1, 33804 },
+ { 0x2FC2, 33607 },
+ { 0x2FC3, 33544 },
+ { 0x2FC4, 33704 },
+ { 0x2FC5, 33579 },
+ { 0x2FC6, 33911 },
+ { 0x2FC7, 33636 },
+ { 0x2FC8, 34018 },
+ { 0x2FC9, 33969 },
+ { 0x2FCA, 33762 },
+ { 0x2FCB, 34084 },
+ { 0x2FCC, 33613 },
+ { 0x2FCD, 34003 },
+ { 0x2FCE, 33592 },
+ { 0x2FCF, 33510 },
+ { 0x2FD0, 33685 },
+ { 0x2FD1, 33595 },
+ { 0x2FD2, 33902 },
+ { 0x2FD3, 33956 },
+ { 0x2FD4, 34009 },
+ { 0x2FD5, 33801 },
+ { 0x2FF0, 69175 },
+ { 0x2FF1, 69189 },
+ { 0x2FF2, 69181 },
+ { 0x2FF3, 69195 },
+ { 0x2FF4, 69170 },
+ { 0x2FF5, 69213 },
+ { 0x2FF6, 69219 },
+ { 0x2FF7, 69207 },
+ { 0x2FF8, 69232 },
+ { 0x2FF9, 69239 },
+ { 0x2FFA, 69225 },
+ { 0x2FFB, 69203 },
+ { 0x3000, 68678 },
+ { 0x3001, 68672 },
+ { 0x3002, 68665 },
+ { 0x3003, 10538 },
+ { 0x3004, 53362 },
+ { 0x3005, 68698 },
+ { 0x3006, 68687 },
+ { 0x3007, 68680 },
+ { 0x3008, 9204 },
+ { 0x3009, 21788 },
+ { 0x300A, 9357 },
+ { 0x300B, 21878 },
+ { 0x300C, 9350 },
+ { 0x300D, 21871 },
+ { 0x300E, 9330 },
+ { 0x300F, 21851 },
+ { 0x3010, 9227 },
+ { 0x3011, 21820 },
+ { 0x3012, 35661 },
+ { 0x3013, 9121 },
+ { 0x3014, 9443 },
+ { 0x3015, 21968 },
+ { 0x3016, 9343 },
+ { 0x3017, 21864 },
+ { 0x3018, 9338 },
+ { 0x3019, 21859 },
+ { 0x301A, 9334 },
+ { 0x301B, 21855 },
+ { 0x301C, 10063 },
+ { 0x301D, 55478 },
+ { 0x301E, 31576 },
+ { 0x301F, 6033 },
+ { 0x3020, 35663 },
+ { 0x3021, 52741 },
+ { 0x3022, 52750 },
+ { 0x3023, 52768 },
+ { 0x3024, 52756 },
+ { 0x3025, 52753 },
+ { 0x3026, 52744 },
+ { 0x3027, 52765 },
+ { 0x3028, 52762 },
+ { 0x3029, 52759 },
+ { 0x302A, 68674 },
+ { 0x302B, 68683 },
+ { 0x302C, 68694 },
+ { 0x302D, 68690 },
+ { 0x302E, 32170 },
+ { 0x302F, 31884 },
+ { 0x3030, 10078 },
+ { 0x3031, 56034 },
+ { 0x3032, 56050 },
+ { 0x3033, 56044 },
+ { 0x3034, 56057 },
+ { 0x3035, 56038 },
+ { 0x3036, 39456 },
+ { 0x3037, 68701 },
+ { 0x3038, 52747 },
+ { 0x3039, 52774 },
+ { 0x303A, 52771 },
+ { 0x303B, 56098 },
+ { 0x303C, 9594 },
+ { 0x303D, 9628 },
+ { 0x303E, 69103 },
+ { 0x303F, 68668 },
+ { 0x3041, 53242 },
+ { 0x3042, 53020 },
+ { 0x3043, 53250 },
+ { 0x3044, 53026 },
+ { 0x3045, 53258 },
+ { 0x3046, 53035 },
+ { 0x3047, 53246 },
+ { 0x3048, 53023 },
+ { 0x3049, 53254 },
+ { 0x304A, 53032 },
+ { 0x304B, 53098 },
+ { 0x304C, 53068 },
+ { 0x304D, 53104 },
+ { 0x304E, 53074 },
+ { 0x304F, 53110 },
+ { 0x3050, 53080 },
+ { 0x3051, 53101 },
+ { 0x3052, 53071 },
+ { 0x3053, 53107 },
+ { 0x3054, 53077 },
+ { 0x3055, 53173 },
+ { 0x3056, 53227 },
+ { 0x3057, 53179 },
+ { 0x3058, 53233 },
+ { 0x3059, 53185 },
+ { 0x305A, 53239 },
+ { 0x305B, 53176 },
+ { 0x305C, 53230 },
+ { 0x305D, 53182 },
+ { 0x305E, 53236 },
+ { 0x305F, 53188 },
+ { 0x3060, 53053 },
+ { 0x3061, 53194 },
+ { 0x3062, 53059 },
+ { 0x3063, 53270 },
+ { 0x3064, 53200 },
+ { 0x3065, 53065 },
+ { 0x3066, 53191 },
+ { 0x3067, 53056 },
+ { 0x3068, 53197 },
+ { 0x3069, 53062 },
+ { 0x306A, 53128 },
+ { 0x306B, 53134 },
+ { 0x306C, 53140 },
+ { 0x306D, 53131 },
+ { 0x306E, 53137 },
+ { 0x306F, 53083 },
+ { 0x3070, 53038 },
+ { 0x3071, 53143 },
+ { 0x3072, 53089 },
+ { 0x3073, 53044 },
+ { 0x3074, 53149 },
+ { 0x3075, 53095 },
+ { 0x3076, 53050 },
+ { 0x3077, 53155 },
+ { 0x3078, 53086 },
+ { 0x3079, 53041 },
+ { 0x307A, 53146 },
+ { 0x307B, 53092 },
+ { 0x307C, 53047 },
+ { 0x307D, 53152 },
+ { 0x307E, 53113 },
+ { 0x307F, 53119 },
+ { 0x3080, 53125 },
+ { 0x3081, 53116 },
+ { 0x3082, 53122 },
+ { 0x3083, 53278 },
+ { 0x3084, 53218 },
+ { 0x3085, 53286 },
+ { 0x3086, 53224 },
+ { 0x3087, 53282 },
+ { 0x3088, 53221 },
+ { 0x3089, 53158 },
+ { 0x308A, 53164 },
+ { 0x308B, 53170 },
+ { 0x308C, 53161 },
+ { 0x308D, 53167 },
+ { 0x308E, 53274 },
+ { 0x308F, 53206 },
+ { 0x3090, 53212 },
+ { 0x3091, 53209 },
+ { 0x3092, 53215 },
+ { 0x3093, 53029 },
+ { 0x3094, 53203 },
+ { 0x3095, 53262 },
+ { 0x3096, 53266 },
+ { 0x3099, 58335 },
+ { 0x309A, 58340 },
+ { 0x309B, 75125 },
+ { 0x309C, 75133 },
+ { 0x309D, 53297 },
+ { 0x309E, 53290 },
+ { 0x309F, 53294 },
+ { 0x30A0, 75122 },
+ { 0x30A1, 53600 },
+ { 0x30A2, 53366 },
+ { 0x30A3, 53608 },
+ { 0x30A4, 53372 },
+ { 0x30A5, 53616 },
+ { 0x30A6, 53381 },
+ { 0x30A7, 53604 },
+ { 0x30A8, 53369 },
+ { 0x30A9, 53612 },
+ { 0x30AA, 53378 },
+ { 0x30AB, 53444 },
+ { 0x30AC, 53414 },
+ { 0x30AD, 53450 },
+ { 0x30AE, 53420 },
+ { 0x30AF, 53456 },
+ { 0x30B0, 53426 },
+ { 0x30B1, 53447 },
+ { 0x30B2, 53417 },
+ { 0x30B3, 53453 },
+ { 0x30B4, 53423 },
+ { 0x30B5, 53519 },
+ { 0x30B6, 53585 },
+ { 0x30B7, 53525 },
+ { 0x30B8, 53591 },
+ { 0x30B9, 53531 },
+ { 0x30BA, 53597 },
+ { 0x30BB, 53522 },
+ { 0x30BC, 53588 },
+ { 0x30BD, 53528 },
+ { 0x30BE, 53594 },
+ { 0x30BF, 53534 },
+ { 0x30C0, 53399 },
+ { 0x30C1, 53540 },
+ { 0x30C2, 53405 },
+ { 0x30C3, 53692 },
+ { 0x30C4, 53546 },
+ { 0x30C5, 53411 },
+ { 0x30C6, 53537 },
+ { 0x30C7, 53402 },
+ { 0x30C8, 53543 },
+ { 0x30C9, 53408 },
+ { 0x30CA, 53474 },
+ { 0x30CB, 53480 },
+ { 0x30CC, 53486 },
+ { 0x30CD, 53477 },
+ { 0x30CE, 53483 },
+ { 0x30CF, 53429 },
+ { 0x30D0, 53384 },
+ { 0x30D1, 53489 },
+ { 0x30D2, 53435 },
+ { 0x30D3, 53390 },
+ { 0x30D4, 53495 },
+ { 0x30D5, 53441 },
+ { 0x30D6, 53396 },
+ { 0x30D7, 53501 },
+ { 0x30D8, 53432 },
+ { 0x30D9, 53387 },
+ { 0x30DA, 53492 },
+ { 0x30DB, 53438 },
+ { 0x30DC, 53393 },
+ { 0x30DD, 53498 },
+ { 0x30DE, 53459 },
+ { 0x30DF, 53465 },
+ { 0x30E0, 53471 },
+ { 0x30E1, 53462 },
+ { 0x30E2, 53468 },
+ { 0x30E3, 53700 },
+ { 0x30E4, 53576 },
+ { 0x30E5, 53708 },
+ { 0x30E6, 53582 },
+ { 0x30E7, 53704 },
+ { 0x30E8, 53579 },
+ { 0x30E9, 53504 },
+ { 0x30EA, 53510 },
+ { 0x30EB, 53516 },
+ { 0x30EC, 53507 },
+ { 0x30ED, 53513 },
+ { 0x30EE, 53696 },
+ { 0x30EF, 53564 },
+ { 0x30F0, 53570 },
+ { 0x30F1, 53567 },
+ { 0x30F2, 53573 },
+ { 0x30F3, 53375 },
+ { 0x30F4, 53561 },
+ { 0x30F5, 53640 },
+ { 0x30F6, 53644 },
+ { 0x30F7, 53549 },
+ { 0x30F8, 53555 },
+ { 0x30F9, 53552 },
+ { 0x30FA, 53558 },
+ { 0x30FB, 53712 },
+ { 0x30FC, 75129 },
+ { 0x30FD, 53722 },
+ { 0x30FE, 53715 },
+ { 0x30FF, 53719 },
+ { 0x3105, 45589 },
+ { 0x3106, 45631 },
+ { 0x3107, 45622 },
+ { 0x3108, 45601 },
+ { 0x3109, 45595 },
+ { 0x310A, 45643 },
+ { 0x310B, 45625 },
+ { 0x310C, 45619 },
+ { 0x310D, 45604 },
+ { 0x310E, 45616 },
+ { 0x310F, 45607 },
+ { 0x3110, 45613 },
+ { 0x3111, 45634 },
+ { 0x3112, 45652 },
+ { 0x3113, 45727 },
+ { 0x3114, 45673 },
+ { 0x3115, 45724 },
+ { 0x3116, 45637 },
+ { 0x3117, 45655 },
+ { 0x3118, 45592 },
+ { 0x3119, 45640 },
+ { 0x311A, 45586 },
+ { 0x311B, 45628 },
+ { 0x311C, 45598 },
+ { 0x311D, 45679 },
+ { 0x311E, 45658 },
+ { 0x311F, 45682 },
+ { 0x3120, 45667 },
+ { 0x3121, 45721 },
+ { 0x3122, 45664 },
+ { 0x3123, 45685 },
+ { 0x3124, 45733 },
+ { 0x3125, 45739 },
+ { 0x3126, 45688 },
+ { 0x3127, 45610 },
+ { 0x3128, 45646 },
+ { 0x3129, 45706 },
+ { 0x312A, 45649 },
+ { 0x312B, 45712 },
+ { 0x312C, 45691 },
+ { 0x312D, 45697 },
+ { 0x3131, 31996 },
+ { 0x3132, 32095 },
+ { 0x3133, 32065 },
+ { 0x3134, 31978 },
+ { 0x3135, 32071 },
+ { 0x3136, 32074 },
+ { 0x3137, 31999 },
+ { 0x3138, 32098 },
+ { 0x3139, 31984 },
+ { 0x313A, 32113 },
+ { 0x313B, 32083 },
+ { 0x313C, 32086 },
+ { 0x313D, 32038 },
+ { 0x313E, 32140 },
+ { 0x313F, 32137 },
+ { 0x3140, 32080 },
+ { 0x3141, 31975 },
+ { 0x3142, 31981 },
+ { 0x3143, 32062 },
+ { 0x3144, 32035 },
+ { 0x3145, 31954 },
+ { 0x3146, 32026 },
+ { 0x3147, 31972 },
+ { 0x3148, 31966 },
+ { 0x3149, 32050 },
+ { 0x314A, 32008 },
+ { 0x314B, 32011 },
+ { 0x314C, 32020 },
+ { 0x314D, 32017 },
+ { 0x314E, 31969 },
+ { 0x314F, 31891 },
+ { 0x3150, 31906 },
+ { 0x3151, 31927 },
+ { 0x3152, 31948 },
+ { 0x3153, 31909 },
+ { 0x3154, 31894 },
+ { 0x3155, 31951 },
+ { 0x3156, 31930 },
+ { 0x3157, 31900 },
+ { 0x3158, 31918 },
+ { 0x3159, 31942 },
+ { 0x315A, 31915 },
+ { 0x315B, 31936 },
+ { 0x315C, 31903 },
+ { 0x315D, 31945 },
+ { 0x315E, 31921 },
+ { 0x315F, 31924 },
+ { 0x3160, 31939 },
+ { 0x3161, 31912 },
+ { 0x3162, 31933 },
+ { 0x3163, 31897 },
+ { 0x3164, 31889 },
+ { 0x3165, 32059 },
+ { 0x3166, 32104 },
+ { 0x3167, 32032 },
+ { 0x3168, 32128 },
+ { 0x3169, 32161 },
+ { 0x316A, 32116 },
+ { 0x316B, 32149 },
+ { 0x316C, 32134 },
+ { 0x316D, 32164 },
+ { 0x316E, 32068 },
+ { 0x316F, 32029 },
+ { 0x3170, 32125 },
+ { 0x3171, 32119 },
+ { 0x3172, 32107 },
+ { 0x3173, 32110 },
+ { 0x3174, 32155 },
+ { 0x3175, 32158 },
+ { 0x3176, 32077 },
+ { 0x3177, 32131 },
+ { 0x3178, 32122 },
+ { 0x3179, 32167 },
+ { 0x317A, 32089 },
+ { 0x317B, 32044 },
+ { 0x317C, 32092 },
+ { 0x317D, 32047 },
+ { 0x317E, 32041 },
+ { 0x317F, 32014 },
+ { 0x3180, 32056 },
+ { 0x3181, 32023 },
+ { 0x3182, 32143 },
+ { 0x3183, 32152 },
+ { 0x3184, 32146 },
+ { 0x3185, 32053 },
+ { 0x3186, 32101 },
+ { 0x3187, 31987 },
+ { 0x3188, 32002 },
+ { 0x3189, 31957 },
+ { 0x318A, 32005 },
+ { 0x318B, 31990 },
+ { 0x318C, 31960 },
+ { 0x318D, 31963 },
+ { 0x318E, 31993 },
+ { 0x3190, 69162 },
+ { 0x3191, 69166 },
+ { 0x3192, 69110 },
+ { 0x3193, 69118 },
+ { 0x3194, 69138 },
+ { 0x3195, 69122 },
+ { 0x3196, 69114 },
+ { 0x3197, 69154 },
+ { 0x3198, 69142 },
+ { 0x3199, 69130 },
+ { 0x319A, 69158 },
+ { 0x319B, 69134 },
+ { 0x319C, 69146 },
+ { 0x319D, 69150 },
+ { 0x319E, 69126 },
+ { 0x319F, 69106 },
+ { 0x31A0, 45670 },
+ { 0x31A1, 45730 },
+ { 0x31A2, 45709 },
+ { 0x31A3, 45694 },
+ { 0x31A4, 45676 },
+ { 0x31A5, 45742 },
+ { 0x31A6, 45718 },
+ { 0x31A7, 45754 },
+ { 0x31A8, 45703 },
+ { 0x31A9, 45736 },
+ { 0x31AA, 45745 },
+ { 0x31AB, 45757 },
+ { 0x31AC, 45700 },
+ { 0x31AD, 45748 },
+ { 0x31AE, 45760 },
+ { 0x31AF, 45763 },
+ { 0x31B0, 45661 },
+ { 0x31B1, 45715 },
+ { 0x31B2, 45751 },
+ { 0x31B3, 45766 },
+ { 0x31B4, 45578 },
+ { 0x31B5, 45582 },
+ { 0x31B6, 45574 },
+ { 0x31B7, 45570 },
+ { 0x31C0, 5256 },
+ { 0x31C1, 5295 },
+ { 0x31C2, 5298 },
+ { 0x31C3, 5301 },
+ { 0x31C4, 5286 },
+ { 0x31C5, 5313 },
+ { 0x31C6, 5304 },
+ { 0x31C7, 5262 },
+ { 0x31C8, 5331 },
+ { 0x31C9, 5340 },
+ { 0x31CA, 5307 },
+ { 0x31CB, 5334 },
+ { 0x31CC, 5325 },
+ { 0x31CD, 5310 },
+ { 0x31CE, 5337 },
+ { 0x31CF, 5244 },
+ { 0x31D0, 5241 },
+ { 0x31D1, 5253 },
+ { 0x31D2, 5247 },
+ { 0x31D3, 5280 },
+ { 0x31D4, 5238 },
+ { 0x31D5, 5265 },
+ { 0x31D6, 5259 },
+ { 0x31D7, 5289 },
+ { 0x31D8, 5319 },
+ { 0x31D9, 5283 },
+ { 0x31DA, 5277 },
+ { 0x31DB, 5268 },
+ { 0x31DC, 5274 },
+ { 0x31DD, 5292 },
+ { 0x31DE, 5322 },
+ { 0x31DF, 5316 },
+ { 0x31E0, 5328 },
+ { 0x31E1, 5343 },
+ { 0x31E2, 5271 },
+ { 0x31E3, 5250 },
+ { 0x31F0, 53648 },
+ { 0x31F1, 53680 },
+ { 0x31F2, 53684 },
+ { 0x31F3, 53688 },
+ { 0x31F4, 53656 },
+ { 0x31F5, 53620 },
+ { 0x31F6, 53628 },
+ { 0x31F7, 53636 },
+ { 0x31F8, 53624 },
+ { 0x31F9, 53632 },
+ { 0x31FA, 53652 },
+ { 0x31FB, 53660 },
+ { 0x31FC, 53668 },
+ { 0x31FD, 53676 },
+ { 0x31FE, 53664 },
+ { 0x31FF, 53672 },
+ { 0x3200, 74845 },
+ { 0x3201, 74824 },
+ { 0x3202, 74852 },
+ { 0x3203, 74838 },
+ { 0x3204, 74817 },
+ { 0x3205, 74831 },
+ { 0x3206, 74785 },
+ { 0x3207, 74810 },
+ { 0x3208, 74792 },
+ { 0x3209, 74859 },
+ { 0x320A, 74866 },
+ { 0x320B, 74880 },
+ { 0x320C, 74873 },
+ { 0x320D, 74803 },
+ { 0x320E, 74848 },
+ { 0x320F, 74827 },
+ { 0x3210, 74855 },
+ { 0x3211, 74841 },
+ { 0x3212, 74820 },
+ { 0x3213, 74834 },
+ { 0x3214, 74788 },
+ { 0x3215, 74813 },
+ { 0x3216, 74795 },
+ { 0x3217, 74862 },
+ { 0x3218, 74869 },
+ { 0x3219, 74883 },
+ { 0x321A, 74876 },
+ { 0x321B, 74806 },
+ { 0x321C, 74799 },
+ { 0x321D, 74892 },
+ { 0x321E, 74887 },
+ { 0x3220, 74929 },
+ { 0x3221, 74941 },
+ { 0x3222, 75001 },
+ { 0x3223, 74953 },
+ { 0x3224, 74950 },
+ { 0x3225, 74932 },
+ { 0x3226, 74992 },
+ { 0x3227, 74980 },
+ { 0x3228, 74965 },
+ { 0x3229, 74938 },
+ { 0x322A, 74959 },
+ { 0x322B, 74947 },
+ { 0x322C, 75004 },
+ { 0x322D, 74974 },
+ { 0x322E, 74986 },
+ { 0x322F, 74977 },
+ { 0x3230, 74935 },
+ { 0x3231, 74995 },
+ { 0x3232, 74956 },
+ { 0x3233, 75007 },
+ { 0x3234, 74962 },
+ { 0x3235, 75010 },
+ { 0x3236, 75022 },
+ { 0x3237, 75034 },
+ { 0x3238, 74983 },
+ { 0x3239, 75025 },
+ { 0x323A, 74944 },
+ { 0x323B, 74998 },
+ { 0x323C, 75028 },
+ { 0x323D, 75031 },
+ { 0x323E, 75019 },
+ { 0x323F, 75013 },
+ { 0x3240, 75016 },
+ { 0x3241, 74968 },
+ { 0x3242, 74971 },
+ { 0x3243, 74989 },
+ { 0x3250, 69269 },
+ { 0x3251, 39399 },
+ { 0x3252, 39407 },
+ { 0x3253, 39431 },
+ { 0x3254, 39415 },
+ { 0x3255, 39411 },
+ { 0x3256, 39403 },
+ { 0x3257, 39427 },
+ { 0x3258, 39423 },
+ { 0x3259, 39419 },
+ { 0x325A, 39354 },
+ { 0x325B, 39357 },
+ { 0x325C, 39365 },
+ { 0x325D, 39389 },
+ { 0x325E, 39373 },
+ { 0x325F, 39369 },
+ { 0x3260, 39256 },
+ { 0x3261, 39235 },
+ { 0x3262, 39263 },
+ { 0x3263, 39249 },
+ { 0x3264, 39228 },
+ { 0x3265, 39242 },
+ { 0x3266, 39196 },
+ { 0x3267, 39217 },
+ { 0x3268, 39203 },
+ { 0x3269, 39270 },
+ { 0x326A, 39277 },
+ { 0x326B, 39291 },
+ { 0x326C, 39284 },
+ { 0x326D, 39210 },
+ { 0x326E, 39259 },
+ { 0x326F, 39238 },
+ { 0x3270, 39266 },
+ { 0x3271, 39252 },
+ { 0x3272, 39231 },
+ { 0x3273, 39245 },
+ { 0x3274, 39199 },
+ { 0x3275, 39220 },
+ { 0x3276, 39206 },
+ { 0x3277, 39273 },
+ { 0x3278, 39280 },
+ { 0x3279, 39294 },
+ { 0x327A, 39287 },
+ { 0x327B, 39213 },
+ { 0x327C, 39302 },
+ { 0x327D, 39298 },
+ { 0x327E, 39224 },
+ { 0x327F, 34096 },
+ { 0x3280, 39623 },
+ { 0x3281, 39635 },
+ { 0x3282, 39710 },
+ { 0x3283, 39647 },
+ { 0x3284, 39644 },
+ { 0x3285, 39626 },
+ { 0x3286, 39701 },
+ { 0x3287, 39683 },
+ { 0x3288, 39671 },
+ { 0x3289, 39632 },
+ { 0x328A, 39665 },
+ { 0x328B, 39641 },
+ { 0x328C, 39713 },
+ { 0x328D, 39677 },
+ { 0x328E, 39689 },
+ { 0x328F, 39680 },
+ { 0x3290, 39629 },
+ { 0x3291, 39704 },
+ { 0x3292, 39650 },
+ { 0x3293, 39728 },
+ { 0x3294, 39668 },
+ { 0x3295, 39731 },
+ { 0x3296, 39755 },
+ { 0x3297, 39764 },
+ { 0x3298, 39686 },
+ { 0x3299, 39722 },
+ { 0x329A, 39662 },
+ { 0x329B, 39719 },
+ { 0x329C, 39746 },
+ { 0x329D, 39752 },
+ { 0x329E, 39695 },
+ { 0x329F, 39749 },
+ { 0x32A0, 39656 },
+ { 0x32A1, 39674 },
+ { 0x32A2, 39638 },
+ { 0x32A3, 39725 },
+ { 0x32A4, 39653 },
+ { 0x32A5, 39716 },
+ { 0x32A6, 39620 },
+ { 0x32A7, 39659 },
+ { 0x32A8, 39698 },
+ { 0x32A9, 39737 },
+ { 0x32AA, 39740 },
+ { 0x32AB, 39707 },
+ { 0x32AC, 39758 },
+ { 0x32AD, 39761 },
+ { 0x32AE, 39743 },
+ { 0x32AF, 39734 },
+ { 0x32B0, 39692 },
+ { 0x32B1, 39361 },
+ { 0x32B2, 39385 },
+ { 0x32B3, 39381 },
+ { 0x32B4, 39377 },
+ { 0x32B5, 39312 },
+ { 0x32B6, 39315 },
+ { 0x32B7, 39323 },
+ { 0x32B8, 39347 },
+ { 0x32B9, 39331 },
+ { 0x32BA, 39327 },
+ { 0x32BB, 39319 },
+ { 0x32BC, 39343 },
+ { 0x32BD, 39339 },
+ { 0x32BE, 39335 },
+ { 0x32BF, 39309 },
+ { 0x32C0, 69073 },
+ { 0x32C1, 69088 },
+ { 0x32C2, 69063 },
+ { 0x32C3, 69058 },
+ { 0x32C4, 68893 },
+ { 0x32C5, 69053 },
+ { 0x32C6, 69048 },
+ { 0x32C7, 69068 },
+ { 0x32C8, 69098 },
+ { 0x32C9, 69078 },
+ { 0x32CA, 69093 },
+ { 0x32CB, 69083 },
+ { 0x32CC, 35949 },
+ { 0x32CD, 36112 },
+ { 0x32CE, 35939 },
+ { 0x32CF, 40924 },
+ { 0x32D0, 39471 },
+ { 0x32D1, 39477 },
+ { 0x32D2, 39483 },
+ { 0x32D3, 39474 },
+ { 0x32D4, 39480 },
+ { 0x32D5, 39501 },
+ { 0x32D6, 39507 },
+ { 0x32D7, 39513 },
+ { 0x32D8, 39504 },
+ { 0x32D9, 39510 },
+ { 0x32DA, 39561 },
+ { 0x32DB, 39567 },
+ { 0x32DC, 39573 },
+ { 0x32DD, 39564 },
+ { 0x32DE, 39570 },
+ { 0x32DF, 39576 },
+ { 0x32E0, 39582 },
+ { 0x32E1, 39588 },
+ { 0x32E2, 39579 },
+ { 0x32E3, 39585 },
+ { 0x32E4, 39531 },
+ { 0x32E5, 39537 },
+ { 0x32E6, 39543 },
+ { 0x32E7, 39534 },
+ { 0x32E8, 39540 },
+ { 0x32E9, 39486 },
+ { 0x32EA, 39492 },
+ { 0x32EB, 39498 },
+ { 0x32EC, 39489 },
+ { 0x32ED, 39495 },
+ { 0x32EE, 39516 },
+ { 0x32EF, 39522 },
+ { 0x32F0, 39528 },
+ { 0x32F1, 39519 },
+ { 0x32F2, 39525 },
+ { 0x32F3, 39603 },
+ { 0x32F4, 39609 },
+ { 0x32F5, 39606 },
+ { 0x32F6, 39546 },
+ { 0x32F7, 39552 },
+ { 0x32F8, 39558 },
+ { 0x32F9, 39549 },
+ { 0x32FA, 39555 },
+ { 0x32FB, 39591 },
+ { 0x32FC, 39597 },
+ { 0x32FD, 39594 },
+ { 0x32FE, 39600 },
+ { 0x3300, 36363 },
+ { 0x3301, 36365 },
+ { 0x3302, 36290 },
+ { 0x3303, 36157 },
+ { 0x3304, 36375 },
+ { 0x3305, 36171 },
+ { 0x3306, 36155 },
+ { 0x3307, 36421 },
+ { 0x3308, 36296 },
+ { 0x3309, 36188 },
+ { 0x330A, 36190 },
+ { 0x330B, 36326 },
+ { 0x330C, 36393 },
+ { 0x330D, 36395 },
+ { 0x330E, 36300 },
+ { 0x330F, 36298 },
+ { 0x3310, 36167 },
+ { 0x3311, 36302 },
+ { 0x3312, 36379 },
+ { 0x3313, 36391 },
+ { 0x3314, 36175 },
+ { 0x3315, 36459 },
+ { 0x3316, 36463 },
+ { 0x3317, 36451 },
+ { 0x3318, 36369 },
+ { 0x3319, 36447 },
+ { 0x331A, 36453 },
+ { 0x331B, 36397 },
+ { 0x331C, 36328 },
+ { 0x331D, 36377 },
+ { 0x331E, 36330 },
+ { 0x331F, 36415 },
+ { 0x3320, 36445 },
+ { 0x3321, 36417 },
+ { 0x3322, 36353 },
+ { 0x3323, 36355 },
+ { 0x3324, 36294 },
+ { 0x3325, 36161 },
+ { 0x3326, 36163 },
+ { 0x3327, 36153 },
+ { 0x3328, 36186 },
+ { 0x3329, 36336 },
+ { 0x332A, 36304 },
+ { 0x332B, 36441 },
+ { 0x332C, 36338 },
+ { 0x332D, 36389 },
+ { 0x332E, 36457 },
+ { 0x332F, 36385 },
+ { 0x3330, 36194 },
+ { 0x3331, 36159 },
+ { 0x3332, 36423 },
+ { 0x3333, 36373 },
+ { 0x3334, 36419 },
+ { 0x3335, 36308 },
+ { 0x3336, 36449 },
+ { 0x3337, 36192 },
+ { 0x3338, 36383 },
+ { 0x3339, 36371 },
+ { 0x333A, 36342 },
+ { 0x333B, 36340 },
+ { 0x333C, 36292 },
+ { 0x333D, 36387 },
+ { 0x333E, 36367 },
+ { 0x333F, 36120 },
+ { 0x3340, 36344 },
+ { 0x3341, 36306 },
+ { 0x3342, 36169 },
+ { 0x3343, 36401 },
+ { 0x3344, 36334 },
+ { 0x3345, 36332 },
+ { 0x3346, 36381 },
+ { 0x3347, 36403 },
+ { 0x3348, 36409 },
+ { 0x3349, 36184 },
+ { 0x334A, 36455 },
+ { 0x334B, 36182 },
+ { 0x334C, 36407 },
+ { 0x334D, 36405 },
+ { 0x334E, 36359 },
+ { 0x334F, 36361 },
+ { 0x3350, 36288 },
+ { 0x3351, 36411 },
+ { 0x3352, 36198 },
+ { 0x3353, 36351 },
+ { 0x3354, 36413 },
+ { 0x3355, 36196 },
+ { 0x3356, 36443 },
+ { 0x3357, 36357 },
+ { 0x3358, 68940 },
+ { 0x3359, 68898 },
+ { 0x335A, 68916 },
+ { 0x335B, 68958 },
+ { 0x335C, 68928 },
+ { 0x335D, 68922 },
+ { 0x335E, 68904 },
+ { 0x335F, 68952 },
+ { 0x3360, 68946 },
+ { 0x3361, 68934 },
+ { 0x3362, 68910 },
+ { 0x3363, 68964 },
+ { 0x3364, 68970 },
+ { 0x3365, 69012 },
+ { 0x3366, 69000 },
+ { 0x3367, 68982 },
+ { 0x3368, 68988 },
+ { 0x3369, 69018 },
+ { 0x336A, 68994 },
+ { 0x336B, 69006 },
+ { 0x336C, 68976 },
+ { 0x336D, 69024 },
+ { 0x336E, 69030 },
+ { 0x336F, 69042 },
+ { 0x3370, 69036 },
+ { 0x3371, 36122 },
+ { 0x3372, 35925 },
+ { 0x3373, 35907 },
+ { 0x3374, 36088 },
+ { 0x3375, 36059 },
+ { 0x3376, 36066 },
+ { 0x3377, 35931 },
+ { 0x3378, 35936 },
+ { 0x3379, 35933 },
+ { 0x337A, 35957 },
+ { 0x337B, 36100 },
+ { 0x337C, 36104 },
+ { 0x337D, 36108 },
+ { 0x337E, 36096 },
+ { 0x337F, 36461 },
+ { 0x3380, 36063 },
+ { 0x3381, 36047 },
+ { 0x3382, 36013 },
+ { 0x3383, 35992 },
+ { 0x3384, 35959 },
+ { 0x3385, 35961 },
+ { 0x3386, 35994 },
+ { 0x3387, 35943 },
+ { 0x3388, 36090 },
+ { 0x3389, 36173 },
+ { 0x338A, 36068 },
+ { 0x338B, 36049 },
+ { 0x338C, 36016 },
+ { 0x338D, 36019 },
+ { 0x338E, 35999 },
+ { 0x338F, 35963 },
+ { 0x3390, 35953 },
+ { 0x3391, 36124 },
+ { 0x3392, 36130 },
+ { 0x3393, 36116 },
+ { 0x3394, 36151 },
+ { 0x3395, 36022 },
+ { 0x3396, 36001 },
+ { 0x3397, 35929 },
+ { 0x3398, 35967 },
+ { 0x3399, 35941 },
+ { 0x339A, 36051 },
+ { 0x339B, 36025 },
+ { 0x339C, 36003 },
+ { 0x339D, 35915 },
+ { 0x339E, 35969 },
+ { 0x339F, 36008 },
+ { 0x33A0, 35920 },
+ { 0x33A1, 35898 },
+ { 0x33A2, 35977 },
+ { 0x33A3, 36005 },
+ { 0x33A4, 35917 },
+ { 0x33A5, 35895 },
+ { 0x33A6, 35971 },
+ { 0x33A7, 35886 },
+ { 0x33A8, 35890 },
+ { 0x33A9, 36061 },
+ { 0x33AA, 36126 },
+ { 0x33AB, 36136 },
+ { 0x33AC, 36118 },
+ { 0x33AD, 36140 },
+ { 0x33AE, 36142 },
+ { 0x33AF, 36146 },
+ { 0x33B0, 36076 },
+ { 0x33B1, 36053 },
+ { 0x33B2, 36028 },
+ { 0x33B3, 36011 },
+ { 0x33B4, 36078 },
+ { 0x33B5, 36055 },
+ { 0x33B6, 36031 },
+ { 0x33B7, 36037 },
+ { 0x33B8, 35982 },
+ { 0x33B9, 36039 },
+ { 0x33BA, 36080 },
+ { 0x33BB, 36057 },
+ { 0x33BC, 36034 },
+ { 0x33BD, 36042 },
+ { 0x33BE, 35984 },
+ { 0x33BF, 36044 },
+ { 0x33C0, 35880 },
+ { 0x33C1, 35883 },
+ { 0x33C2, 35905 },
+ { 0x33C3, 35909 },
+ { 0x33C4, 35911 },
+ { 0x33C5, 35913 },
+ { 0x33C6, 35876 },
+ { 0x33C7, 35923 },
+ { 0x33C8, 35927 },
+ { 0x33C9, 35945 },
+ { 0x33CA, 35947 },
+ { 0x33CB, 35951 },
+ { 0x33CC, 35955 },
+ { 0x33CD, 35965 },
+ { 0x33CE, 35974 },
+ { 0x33CF, 35980 },
+ { 0x33D0, 35986 },
+ { 0x33D1, 35988 },
+ { 0x33D2, 36128 },
+ { 0x33D3, 35990 },
+ { 0x33D4, 35996 },
+ { 0x33D5, 36132 },
+ { 0x33D6, 36134 },
+ { 0x33D7, 36070 },
+ { 0x33D8, 36072 },
+ { 0x33D9, 36138 },
+ { 0x33DA, 36074 },
+ { 0x33DB, 36082 },
+ { 0x33DC, 36084 },
+ { 0x33DD, 36086 },
+ { 0x33DE, 35901 },
+ { 0x33DF, 35872 },
+ { 0x33E0, 68707 },
+ { 0x33E1, 68725 },
+ { 0x33E2, 68761 },
+ { 0x33E3, 68737 },
+ { 0x33E4, 68731 },
+ { 0x33E5, 68713 },
+ { 0x33E6, 68755 },
+ { 0x33E7, 68749 },
+ { 0x33E8, 68743 },
+ { 0x33E9, 68719 },
+ { 0x33EA, 68767 },
+ { 0x33EB, 68779 },
+ { 0x33EC, 68821 },
+ { 0x33ED, 68809 },
+ { 0x33EE, 68791 },
+ { 0x33EF, 68797 },
+ { 0x33F0, 68827 },
+ { 0x33F1, 68803 },
+ { 0x33F2, 68815 },
+ { 0x33F3, 68785 },
+ { 0x33F4, 68839 },
+ { 0x33F5, 68851 },
+ { 0x33F6, 68887 },
+ { 0x33F7, 68863 },
+ { 0x33F8, 68857 },
+ { 0x33F9, 68845 },
+ { 0x33FA, 68881 },
+ { 0x33FB, 68875 },
+ { 0x33FC, 68869 },
+ { 0x33FD, 68773 },
+ { 0x33FE, 68833 },
+ { 0x33FF, 36114 },
+ { 0x4DC0, 52824 },
+ { 0x4DC1, 52838 },
+ { 0x4DC2, 52975 },
+ { 0x4DC3, 52945 },
+ { 0x4DC4, 52921 },
+ { 0x4DC5, 52927 },
+ { 0x4DC6, 52777 },
+ { 0x4DC7, 52907 },
+ { 0x4DC8, 52883 },
+ { 0x4DC9, 52942 },
+ { 0x4DCA, 52880 },
+ { 0x4DCB, 53002 },
+ { 0x4DCC, 52987 },
+ { 0x4DCD, 52864 },
+ { 0x4DCE, 52911 },
+ { 0x4DCF, 52984 },
+ { 0x4DD0, 52958 },
+ { 0x4DD1, 52843 },
+ { 0x4DD2, 52924 },
+ { 0x4DD3, 53017 },
+ { 0x4DD4, 52895 },
+ { 0x4DD5, 52853 },
+ { 0x4DD6, 52971 },
+ { 0x4DD7, 52904 },
+ { 0x4DD8, 52968 },
+ { 0x4DD9, 52860 },
+ { 0x4DDA, 52876 },
+ { 0x4DDB, 52868 },
+ { 0x4DDC, 52799 },
+ { 0x4DDD, 52819 },
+ { 0x4DDE, 52965 },
+ { 0x4DDF, 52933 },
+ { 0x4DE0, 52918 },
+ { 0x4DE1, 52856 },
+ { 0x4DE2, 52939 },
+ { 0x4DE3, 52952 },
+ { 0x4DE4, 52785 },
+ { 0x4DE5, 52993 },
+ { 0x4DE6, 53011 },
+ { 0x4DE7, 53005 },
+ { 0x4DE8, 52930 },
+ { 0x4DE9, 52936 },
+ { 0x4DEA, 53014 },
+ { 0x4DEB, 52899 },
+ { 0x4DEC, 52961 },
+ { 0x4DED, 52914 },
+ { 0x4DEE, 52996 },
+ { 0x4DEF, 52781 },
+ { 0x4DF0, 52999 },
+ { 0x4DF1, 52815 },
+ { 0x4DF2, 52810 },
+ { 0x4DF3, 52804 },
+ { 0x4DF4, 53008 },
+ { 0x4DF5, 52829 },
+ { 0x4DF6, 52949 },
+ { 0x4DF7, 52834 },
+ { 0x4DF8, 52789 },
+ { 0x4DF9, 52794 },
+ { 0x4DFA, 52981 },
+ { 0x4DFB, 52990 },
+ { 0x4DFC, 52872 },
+ { 0x4DFD, 52887 },
+ { 0x4DFE, 52849 },
+ { 0x4DFF, 52891 },
+ { 0x5000, 634 },
+ { 0x5001, 637 },
+ { 0x5002, 520 },
+ { 0x5003, 631 },
+ { 0x5004, 1300 },
+ { 0x5005, 1303 },
+ { 0x5006, 628 },
+ { 0x5007, 1297 },
+ { 0x5008, 529 },
+ { 0x5009, 532 },
+ { 0x500A, 514 },
+ { 0x500B, 526 },
+ { 0x500C, 2011 },
+ { 0x500D, 802 },
+ { 0x500E, 2008 },
+ { 0x500F, 721 },
+ { 0x5010, 724 },
+ { 0x5011, 523 },
+ { 0x5012, 718 },
+ { 0x5013, 586 },
+ { 0x5014, 517 },
+ { 0x5015, 829 },
+ { 0x5016, 910 },
+ { 0x5017, 913 },
+ { 0x5018, 541 },
+ { 0x5019, 907 },
+ { 0x501A, 2341 },
+ { 0x501B, 2344 },
+ { 0x501C, 904 },
+ { 0x501D, 2338 },
+ { 0x501E, 874 },
+ { 0x501F, 877 },
+ { 0x5020, 535 },
+ { 0x5021, 871 },
+ { 0x5022, 2350 },
+ { 0x5023, 925 },
+ { 0x5024, 2347 },
+ { 0x5025, 919 },
+ { 0x5026, 922 },
+ { 0x5027, 544 },
+ { 0x5028, 916 },
+ { 0x5029, 901 },
+ { 0x502A, 538 },
+ { 0x502B, 898 },
+ { 0x502C, 934 },
+ { 0x502D, 937 },
+ { 0x502E, 547 },
+ { 0x502F, 928 },
+ { 0x5030, 2353 },
+ { 0x5031, 931 },
+ { 0x5032, 946 },
+ { 0x5033, 949 },
+ { 0x5034, 550 },
+ { 0x5035, 940 },
+ { 0x5036, 2356 },
+ { 0x5037, 943 },
+ { 0x5038, 1705 },
+ { 0x5039, 1708 },
+ { 0x503A, 730 },
+ { 0x503B, 1702 },
+ { 0x503C, 3274 },
+ { 0x503D, 1699 },
+ { 0x503E, 3271 },
+ { 0x503F, 1693 },
+ { 0x5040, 1696 },
+ { 0x5041, 727 },
+ { 0x5042, 1690 },
+ { 0x5043, 3280 },
+ { 0x5044, 1720 },
+ { 0x5045, 3277 },
+ { 0x5046, 1714 },
+ { 0x5047, 1717 },
+ { 0x5048, 733 },
+ { 0x5049, 1711 },
+ { 0x504A, 1729 },
+ { 0x504B, 1732 },
+ { 0x504C, 736 },
+ { 0x504D, 1723 },
+ { 0x504E, 3283 },
+ { 0x504F, 1726 },
+ { 0x5050, 1741 },
+ { 0x5051, 1744 },
+ { 0x5052, 739 },
+ { 0x5053, 1735 },
+ { 0x5054, 3286 },
+ { 0x5055, 1738 },
+ { 0x5056, 2299 },
+ { 0x5057, 2302 },
+ { 0x5058, 886 },
+ { 0x5059, 2296 },
+ { 0x505A, 3709 },
+ { 0x505B, 3712 },
+ { 0x505C, 2293 },
+ { 0x505D, 3706 },
+ { 0x505E, 2281 },
+ { 0x505F, 2284 },
+ { 0x5060, 880 },
+ { 0x5061, 2278 },
+ { 0x5062, 3718 },
+ { 0x5063, 2314 },
+ { 0x5064, 3715 },
+ { 0x5065, 2308 },
+ { 0x5066, 2311 },
+ { 0x5067, 889 },
+ { 0x5068, 2305 },
+ { 0x5069, 2290 },
+ { 0x506A, 883 },
+ { 0x506B, 2287 },
+ { 0x506C, 2323 },
+ { 0x506D, 2326 },
+ { 0x506E, 892 },
+ { 0x506F, 2317 },
+ { 0x5070, 3721 },
+ { 0x5071, 2320 },
+ { 0x5072, 2332 },
+ { 0x5073, 2335 },
+ { 0x5074, 895 },
+ { 0x5075, 2329 },
+ { 0x5076, 2959 },
+ { 0x5077, 2962 },
+ { 0x5078, 1561 },
+ { 0x5079, 2956 },
+ { 0x507A, 3871 },
+ { 0x507B, 2953 },
+ { 0x507C, 3868 },
+ { 0x507D, 2947 },
+ { 0x507E, 2950 },
+ { 0x507F, 1558 },
+ { 0x5080, 2944 },
+ { 0x5081, 2968 },
+ { 0x5082, 2971 },
+ { 0x5083, 1564 },
+ { 0x5084, 2965 },
+ { 0x5085, 2980 },
+ { 0x5086, 2983 },
+ { 0x5087, 1567 },
+ { 0x5088, 2974 },
+ { 0x5089, 3874 },
+ { 0x508A, 2977 },
+ { 0x508B, 2992 },
+ { 0x508C, 2995 },
+ { 0x508D, 1570 },
+ { 0x508E, 2986 },
+ { 0x508F, 3877 },
+ { 0x5090, 2989 },
+ { 0x5091, 2647 },
+ { 0x5092, 2650 },
+ { 0x5093, 1252 },
+ { 0x5094, 2644 },
+ { 0x5095, 3793 },
+ { 0x5096, 2641 },
+ { 0x5097, 3790 },
+ { 0x5098, 2635 },
+ { 0x5099, 2638 },
+ { 0x509A, 1249 },
+ { 0x509B, 2632 },
+ { 0x509C, 3799 },
+ { 0x509D, 2662 },
+ { 0x509E, 3796 },
+ { 0x509F, 2656 },
+ { 0x50A0, 2659 },
+ { 0x50A1, 1255 },
+ { 0x50A2, 2653 },
+ { 0x50A3, 2671 },
+ { 0x50A4, 2674 },
+ { 0x50A5, 1258 },
+ { 0x50A6, 2665 },
+ { 0x50A7, 3802 },
+ { 0x50A8, 2668 },
+ { 0x50A9, 2683 },
+ { 0x50AA, 1261 },
+ { 0x50AB, 2677 },
+ { 0x50AC, 3805 },
+ { 0x50AD, 2680 },
+ { 0x50AE, 1513 },
+ { 0x50AF, 1516 },
+ { 0x50B0, 691 },
+ { 0x50B1, 1510 },
+ { 0x50B2, 2929 },
+ { 0x50B3, 1507 },
+ { 0x50B4, 2926 },
+ { 0x50B5, 1486 },
+ { 0x50B6, 1489 },
+ { 0x50B7, 685 },
+ { 0x50B8, 1483 },
+ { 0x50B9, 2935 },
+ { 0x50BA, 2938 },
+ { 0x50BB, 1528 },
+ { 0x50BC, 2932 },
+ { 0x50BD, 1522 },
+ { 0x50BE, 1525 },
+ { 0x50BF, 694 },
+ { 0x50C0, 1519 },
+ { 0x50C1, 1492 },
+ { 0x50C2, 688 },
+ { 0x50C3, 1537 },
+ { 0x50C4, 1540 },
+ { 0x50C5, 697 },
+ { 0x50C6, 1531 },
+ { 0x50C7, 2941 },
+ { 0x50C8, 1534 },
+ { 0x50C9, 1546 },
+ { 0x50CA, 1549 },
+ { 0x50CB, 700 },
+ { 0x50CC, 1543 },
+ { 0x50CD, 1108 },
+ { 0x50CE, 1111 },
+ { 0x50CF, 592 },
+ { 0x50D0, 1105 },
+ { 0x50D1, 1099 },
+ { 0x50D2, 1102 },
+ { 0x50D3, 589 },
+ { 0x50D4, 1096 },
+ { 0x50D5, 1117 },
+ { 0x50D6, 595 },
+ { 0x50D7, 1114 },
+ { 0x50D8, 1126 },
+ { 0x50D9, 1129 },
+ { 0x50DA, 598 },
+ { 0x50DB, 1120 },
+ { 0x50DC, 2494 },
+ { 0x50DD, 1123 },
+ { 0x50DE, 1135 },
+ { 0x50DF, 1138 },
+ { 0x50E0, 601 },
+ { 0x50E1, 1132 },
+ { 0x50E2, 2035 },
+ { 0x50E3, 2038 },
+ { 0x50E4, 808 },
+ { 0x50E5, 2032 },
+ { 0x50E6, 3523 },
+ { 0x50E7, 3526 },
+ { 0x50E8, 2029 },
+ { 0x50E9, 3520 },
+ { 0x50EA, 2017 },
+ { 0x50EB, 2020 },
+ { 0x50EC, 805 },
+ { 0x50ED, 2014 },
+ { 0x50EE, 2044 },
+ { 0x50EF, 2047 },
+ { 0x50F0, 811 },
+ { 0x50F1, 2041 },
+ { 0x50F2, 2026 },
+ { 0x50F3, 2023 },
+ { 0x50F4, 2056 },
+ { 0x50F5, 2059 },
+ { 0x50F6, 814 },
+ { 0x50F7, 2050 },
+ { 0x50F8, 3529 },
+ { 0x50F9, 2053 },
+ { 0x50FA, 2068 },
+ { 0x50FB, 2071 },
+ { 0x50FC, 817 },
+ { 0x50FD, 2062 },
+ { 0x50FE, 3532 },
+ { 0x50FF, 2065 },
+ { 0x5100, 1066 },
+ { 0x5101, 1069 },
+ { 0x5102, 577 },
+ { 0x5103, 1063 },
+ { 0x5104, 2485 },
+ { 0x5105, 1060 },
+ { 0x5106, 2482 },
+ { 0x5107, 1033 },
+ { 0x5108, 1036 },
+ { 0x5109, 571 },
+ { 0x510A, 1030 },
+ { 0x510B, 2488 },
+ { 0x510C, 1081 },
+ { 0x510D, 1075 },
+ { 0x510E, 1078 },
+ { 0x510F, 580 },
+ { 0x5110, 1072 },
+ { 0x5111, 1057 },
+ { 0x5112, 574 },
+ { 0x5113, 1054 },
+ { 0x5114, 1090 },
+ { 0x5115, 1093 },
+ { 0x5116, 583 },
+ { 0x5117, 1084 },
+ { 0x5118, 2491 },
+ { 0x5119, 1087 },
+ { 0x511A, 1978 },
+ { 0x511B, 1981 },
+ { 0x511C, 793 },
+ { 0x511D, 1975 },
+ { 0x511E, 3505 },
+ { 0x511F, 1972 },
+ { 0x5120, 3502 },
+ { 0x5121, 1960 },
+ { 0x5122, 1963 },
+ { 0x5123, 787 },
+ { 0x5124, 1957 },
+ { 0x5125, 3511 },
+ { 0x5126, 3514 },
+ { 0x5127, 1993 },
+ { 0x5128, 3508 },
+ { 0x5129, 1987 },
+ { 0x512A, 1990 },
+ { 0x512B, 796 },
+ { 0x512C, 1984 },
+ { 0x512D, 1969 },
+ { 0x512E, 790 },
+ { 0x512F, 1966 },
+ { 0x5130, 2002 },
+ { 0x5131, 2005 },
+ { 0x5132, 799 },
+ { 0x5133, 1996 },
+ { 0x5134, 3517 },
+ { 0x5135, 1999 },
+ { 0x5136, 2452 },
+ { 0x5137, 2455 },
+ { 0x5138, 1045 },
+ { 0x5139, 2449 },
+ { 0x513A, 3742 },
+ { 0x513B, 2446 },
+ { 0x513C, 3739 },
+ { 0x513D, 2434 },
+ { 0x513E, 2437 },
+ { 0x513F, 1039 },
+ { 0x5140, 2431 },
+ { 0x5141, 3748 },
+ { 0x5142, 2467 },
+ { 0x5143, 3745 },
+ { 0x5144, 2461 },
+ { 0x5145, 2464 },
+ { 0x5146, 1048 },
+ { 0x5147, 2458 },
+ { 0x5148, 2443 },
+ { 0x5149, 1042 },
+ { 0x514A, 2440 },
+ { 0x514B, 2476 },
+ { 0x514C, 2479 },
+ { 0x514D, 1051 },
+ { 0x514E, 2470 },
+ { 0x514F, 3751 },
+ { 0x5150, 2473 },
+ { 0x5151, 3019 },
+ { 0x5152, 3022 },
+ { 0x5153, 1579 },
+ { 0x5154, 3016 },
+ { 0x5155, 3880 },
+ { 0x5156, 3013 },
+ { 0x5157, 3001 },
+ { 0x5158, 3004 },
+ { 0x5159, 1573 },
+ { 0x515A, 2998 },
+ { 0x515B, 3028 },
+ { 0x515C, 3031 },
+ { 0x515D, 1582 },
+ { 0x515E, 3025 },
+ { 0x515F, 3010 },
+ { 0x5160, 1576 },
+ { 0x5161, 3007 },
+ { 0x5162, 3040 },
+ { 0x5163, 3043 },
+ { 0x5164, 1585 },
+ { 0x5165, 3034 },
+ { 0x5166, 3883 },
+ { 0x5167, 3037 },
+ { 0x5168, 2707 },
+ { 0x5169, 2710 },
+ { 0x516A, 1270 },
+ { 0x516B, 2704 },
+ { 0x516C, 3811 },
+ { 0x516D, 3814 },
+ { 0x516E, 2701 },
+ { 0x516F, 3808 },
+ { 0x5170, 2689 },
+ { 0x5171, 2692 },
+ { 0x5172, 1264 },
+ { 0x5173, 2686 },
+ { 0x5174, 3817 },
+ { 0x5175, 2722 },
+ { 0x5176, 2716 },
+ { 0x5177, 2719 },
+ { 0x5178, 2713 },
+ { 0x5179, 2698 },
+ { 0x517A, 1267 },
+ { 0x517B, 2695 },
+ { 0x517C, 2725 },
+ { 0x517D, 1609 },
+ { 0x517E, 1612 },
+ { 0x517F, 709 },
+ { 0x5180, 1606 },
+ { 0x5181, 3079 },
+ { 0x5182, 1603 },
+ { 0x5183, 3076 },
+ { 0x5184, 1555 },
+ { 0x5185, 703 },
+ { 0x5186, 1552 },
+ { 0x5187, 3178 },
+ { 0x5188, 1651 },
+ { 0x5189, 3175 },
+ { 0x518A, 1630 },
+ { 0x518B, 1633 },
+ { 0x518C, 712 },
+ { 0x518D, 1627 },
+ { 0x518E, 1591 },
+ { 0x518F, 706 },
+ { 0x5190, 1588 },
+ { 0x5191, 1660 },
+ { 0x5192, 1663 },
+ { 0x5193, 715 },
+ { 0x5194, 1654 },
+ { 0x5195, 3181 },
+ { 0x5196, 1657 },
+ { 0x5197, 2593 },
+ { 0x5198, 2596 },
+ { 0x5199, 1237 },
+ { 0x519A, 2590 },
+ { 0x519B, 3775 },
+ { 0x519C, 2587 },
+ { 0x519D, 3772 },
+ { 0x519E, 2575 },
+ { 0x519F, 2578 },
+ { 0x51A0, 1231 },
+ { 0x51A1, 2572 },
+ { 0x51A2, 3781 },
+ { 0x51A3, 2605 },
+ { 0x51A4, 3778 },
+ { 0x51A5, 2602 },
+ { 0x51A6, 1240 },
+ { 0x51A7, 2599 },
+ { 0x51A8, 2584 },
+ { 0x51A9, 1234 },
+ { 0x51AA, 2581 },
+ { 0x51AB, 2614 },
+ { 0x51AC, 2617 },
+ { 0x51AD, 1243 },
+ { 0x51AE, 2608 },
+ { 0x51AF, 3784 },
+ { 0x51B0, 2611 },
+ { 0x51B1, 2626 },
+ { 0x51B2, 2629 },
+ { 0x51B3, 1246 },
+ { 0x51B4, 2620 },
+ { 0x51B5, 3787 },
+ { 0x51B6, 2623 },
+ { 0x51B7, 1441 },
+ { 0x51B8, 1444 },
+ { 0x51B9, 673 },
+ { 0x51BA, 1438 },
+ { 0x51BB, 2863 },
+ { 0x51BC, 2866 },
+ { 0x51BD, 1435 },
+ { 0x51BE, 2860 },
+ { 0x51BF, 1423 },
+ { 0x51C0, 1426 },
+ { 0x51C1, 667 },
+ { 0x51C2, 1420 },
+ { 0x51C3, 2872 },
+ { 0x51C4, 2875 },
+ { 0x51C5, 1456 },
+ { 0x51C6, 2869 },
+ { 0x51C7, 1450 },
+ { 0x51C8, 1453 },
+ { 0x51C9, 676 },
+ { 0x51CA, 1447 },
+ { 0x51CB, 1432 },
+ { 0x51CC, 670 },
+ { 0x51CD, 1429 },
+ { 0x51CE, 1465 },
+ { 0x51CF, 1468 },
+ { 0x51D0, 679 },
+ { 0x51D1, 1459 },
+ { 0x51D2, 2878 },
+ { 0x51D3, 1462 },
+ { 0x51D4, 1477 },
+ { 0x51D5, 1480 },
+ { 0x51D6, 682 },
+ { 0x51D7, 1471 },
+ { 0x51D8, 2881 },
+ { 0x51D9, 1474 },
+ { 0x51DA, 1180 },
+ { 0x51DB, 1183 },
+ { 0x51DC, 610 },
+ { 0x51DD, 1177 },
+ { 0x51DE, 2551 },
+ { 0x51DF, 2554 },
+ { 0x51E0, 1174 },
+ { 0x51E1, 2548 },
+ { 0x51E2, 1144 },
+ { 0x51E3, 1147 },
+ { 0x51E4, 604 },
+ { 0x51E5, 1141 },
+ { 0x51E6, 2560 },
+ { 0x51E7, 2563 },
+ { 0x51E8, 1195 },
+ { 0x51E9, 2557 },
+ { 0x51EA, 1189 },
+ { 0x51EB, 1192 },
+ { 0x51EC, 613 },
+ { 0x51ED, 1186 },
+ { 0x51EE, 1153 },
+ { 0x51EF, 1156 },
+ { 0x51F0, 607 },
+ { 0x51F1, 1150 },
+ { 0x51F2, 1204 },
+ { 0x51F3, 1207 },
+ { 0x51F4, 616 },
+ { 0x51F5, 1198 },
+ { 0x51F6, 2566 },
+ { 0x51F7, 1201 },
+ { 0x51F8, 1390 },
+ { 0x51F9, 1393 },
+ { 0x51FA, 658 },
+ { 0x51FB, 1387 },
+ { 0x51FC, 2848 },
+ { 0x51FD, 1384 },
+ { 0x51FE, 2845 },
+ { 0x51FF, 1369 },
+ { 0x5200, 1372 },
+ { 0x5201, 652 },
+ { 0x5202, 1366 },
+ { 0x5203, 2854 },
+ { 0x5204, 1405 },
+ { 0x5205, 2851 },
+ { 0x5206, 1399 },
+ { 0x5207, 1402 },
+ { 0x5208, 661 },
+ { 0x5209, 1396 },
+ { 0x520A, 1378 },
+ { 0x520B, 1381 },
+ { 0x520C, 655 },
+ { 0x520D, 1375 },
+ { 0x520E, 1414 },
+ { 0x520F, 1417 },
+ { 0x5210, 664 },
+ { 0x5211, 1408 },
+ { 0x5212, 2857 },
+ { 0x5213, 1411 },
+ { 0x5214, 2518 },
+ { 0x5215, 2521 },
+ { 0x5216, 1165 },
+ { 0x5217, 3757 },
+ { 0x5218, 2515 },
+ { 0x5219, 3754 },
+ { 0x521A, 2500 },
+ { 0x521B, 2503 },
+ { 0x521C, 1159 },
+ { 0x521D, 2497 },
+ { 0x521E, 3763 },
+ { 0x521F, 3766 },
+ { 0x5220, 2533 },
+ { 0x5221, 3760 },
+ { 0x5222, 2527 },
+ { 0x5223, 2530 },
+ { 0x5224, 1168 },
+ { 0x5225, 2524 },
+ { 0x5226, 2509 },
+ { 0x5227, 2512 },
+ { 0x5228, 1162 },
+ { 0x5229, 2506 },
+ { 0x522A, 2542 },
+ { 0x522B, 2545 },
+ { 0x522C, 1171 },
+ { 0x522D, 2536 },
+ { 0x522E, 3769 },
+ { 0x522F, 2539 },
+ { 0x5230, 3856 },
+ { 0x5231, 2899 },
+ { 0x5232, 2887 },
+ { 0x5233, 2890 },
+ { 0x5234, 1495 },
+ { 0x5235, 2884 },
+ { 0x5236, 3862 },
+ { 0x5237, 2911 },
+ { 0x5238, 3859 },
+ { 0x5239, 2905 },
+ { 0x523A, 2908 },
+ { 0x523B, 1501 },
+ { 0x523C, 2902 },
+ { 0x523D, 2896 },
+ { 0x523E, 1498 },
+ { 0x523F, 2893 },
+ { 0x5240, 2920 },
+ { 0x5241, 2923 },
+ { 0x5242, 1504 },
+ { 0x5243, 2914 },
+ { 0x5244, 3865 },
+ { 0x5245, 2917 },
+ { 0x5246, 2758 },
+ { 0x5247, 2761 },
+ { 0x5248, 1291 },
+ { 0x5249, 2755 },
+ { 0x524A, 3823 },
+ { 0x524B, 3826 },
+ { 0x524C, 2752 },
+ { 0x524D, 3820 },
+ { 0x524E, 2740 },
+ { 0x524F, 2743 },
+ { 0x5250, 1285 },
+ { 0x5251, 2737 },
+ { 0x5252, 3832 },
+ { 0x5253, 3835 },
+ { 0x5254, 2773 },
+ { 0x5255, 3829 },
+ { 0x5256, 2767 },
+ { 0x5257, 2770 },
+ { 0x5258, 1294 },
+ { 0x5259, 2764 },
+ { 0x525A, 2749 },
+ { 0x525B, 1288 },
+ { 0x525C, 2746 },
+ { 0x525D, 3889 },
+ { 0x525E, 3061 },
+ { 0x525F, 3886 },
+ { 0x5260, 3049 },
+ { 0x5261, 3052 },
+ { 0x5262, 1594 },
+ { 0x5263, 3046 },
+ { 0x5264, 3892 },
+ { 0x5265, 3895 },
+ { 0x5266, 3073 },
+ { 0x5267, 3067 },
+ { 0x5268, 3070 },
+ { 0x5269, 1600 },
+ { 0x526A, 3064 },
+ { 0x526B, 3058 },
+ { 0x526C, 1597 },
+ { 0x526D, 3055 },
+ { 0x526E, 1228 },
+ { 0x526F, 2569 },
+ { 0x5270, 1225 },
+ { 0x5271, 1213 },
+ { 0x5272, 1216 },
+ { 0x5273, 619 },
+ { 0x5274, 1210 },
+ { 0x5275, 2731 },
+ { 0x5276, 2734 },
+ { 0x5277, 1282 },
+ { 0x5278, 2728 },
+ { 0x5279, 1276 },
+ { 0x527A, 1279 },
+ { 0x527B, 625 },
+ { 0x527C, 1273 },
+ { 0x527D, 1222 },
+ { 0x527E, 622 },
+ { 0x527F, 1219 },
+ { 0x5280, 2077 },
+ { 0x5281, 2080 },
+ { 0x5282, 820 },
+ { 0x5283, 2074 },
+ { 0x5284, 3538 },
+ { 0x5285, 2095 },
+ { 0x5286, 3535 },
+ { 0x5287, 2092 },
+ { 0x5288, 826 },
+ { 0x5289, 2089 },
+ { 0x528A, 2086 },
+ { 0x528B, 823 },
+ { 0x528C, 2083 },
+ { 0x528D, 2218 },
+ { 0x528E, 2221 },
+ { 0x528F, 859 },
+ { 0x5290, 2215 },
+ { 0x5291, 3637 },
+ { 0x5292, 2212 },
+ { 0x5293, 3634 },
+ { 0x5294, 2185 },
+ { 0x5295, 2188 },
+ { 0x5296, 853 },
+ { 0x5297, 2182 },
+ { 0x5298, 3643 },
+ { 0x5299, 2233 },
+ { 0x529A, 3640 },
+ { 0x529B, 2227 },
+ { 0x529C, 2230 },
+ { 0x529D, 862 },
+ { 0x529E, 2224 },
+ { 0x529F, 2194 },
+ { 0x52A0, 856 },
+ { 0x52A1, 2191 },
+ { 0x52A2, 2242 },
+ { 0x52A3, 2245 },
+ { 0x52A4, 865 },
+ { 0x52A5, 2236 },
+ { 0x52A6, 3646 },
+ { 0x52A7, 2239 },
+ { 0x52A8, 2254 },
+ { 0x52A9, 2257 },
+ { 0x52AA, 868 },
+ { 0x52AB, 2248 },
+ { 0x52AC, 3649 },
+ { 0x52AD, 2251 },
+ { 0x52AE, 988 },
+ { 0x52AF, 991 },
+ { 0x52B0, 559 },
+ { 0x52B1, 985 },
+ { 0x52B2, 2413 },
+ { 0x52B3, 2416 },
+ { 0x52B4, 982 },
+ { 0x52B5, 2410 },
+ { 0x52B6, 955 },
+ { 0x52B7, 958 },
+ { 0x52B8, 553 },
+ { 0x52B9, 952 },
+ { 0x52BA, 2422 },
+ { 0x52BB, 1003 },
+ { 0x52BC, 2419 },
+ { 0x52BD, 997 },
+ { 0x52BE, 1000 },
+ { 0x52BF, 562 },
+ { 0x52C0, 994 },
+ { 0x52C1, 964 },
+ { 0x52C2, 556 },
+ { 0x52C3, 961 },
+ { 0x52C4, 1012 },
+ { 0x52C5, 1015 },
+ { 0x52C6, 565 },
+ { 0x52C7, 1006 },
+ { 0x52C8, 2425 },
+ { 0x52C9, 1009 },
+ { 0x52CA, 1024 },
+ { 0x52CB, 1027 },
+ { 0x52CC, 568 },
+ { 0x52CD, 1018 },
+ { 0x52CE, 2428 },
+ { 0x52CF, 1021 },
+ { 0x52D0, 3673 },
+ { 0x52D1, 3676 },
+ { 0x52D2, 2266 },
+ { 0x52D3, 3670 },
+ { 0x52D4, 3997 },
+ { 0x52D5, 4000 },
+ { 0x52D6, 3667 },
+ { 0x52D7, 3994 },
+ { 0x52D8, 3655 },
+ { 0x52D9, 3658 },
+ { 0x52DA, 2260 },
+ { 0x52DB, 3652 },
+ { 0x52DC, 3682 },
+ { 0x52DD, 2269 },
+ { 0x52DE, 3679 },
+ { 0x52DF, 3664 },
+ { 0x52E0, 2263 },
+ { 0x52E1, 3661 },
+ { 0x52E2, 3691 },
+ { 0x52E3, 2272 },
+ { 0x52E4, 3685 },
+ { 0x52E5, 4003 },
+ { 0x52E6, 3688 },
+ { 0x52E7, 3700 },
+ { 0x52E8, 3703 },
+ { 0x52E9, 2275 },
+ { 0x52EA, 3694 },
+ { 0x52EB, 4006 },
+ { 0x52EC, 3697 },
+ { 0x52ED, 3235 },
+ { 0x52EE, 3238 },
+ { 0x52EF, 1681 },
+ { 0x52F0, 3232 },
+ { 0x52F1, 3940 },
+ { 0x52F2, 3229 },
+ { 0x52F3, 3937 },
+ { 0x52F4, 3220 },
+ { 0x52F5, 3223 },
+ { 0x52F6, 1675 },
+ { 0x52F7, 3217 },
+ { 0x52F8, 3943 },
+ { 0x52F9, 3247 },
+ { 0x52FA, 3244 },
+ { 0x52FB, 3241 },
+ { 0x52FC, 3226 },
+ { 0x52FD, 1678 },
+ { 0x52FE, 3256 },
+ { 0x52FF, 1684 },
+ { 0x5300, 3250 },
+ { 0x5301, 3946 },
+ { 0x5302, 3253 },
+ { 0x5303, 3265 },
+ { 0x5304, 3268 },
+ { 0x5305, 1687 },
+ { 0x5306, 3259 },
+ { 0x5307, 3949 },
+ { 0x5308, 3262 },
+ { 0x5309, 1897 },
+ { 0x530A, 1900 },
+ { 0x530B, 775 },
+ { 0x530C, 1894 },
+ { 0x530D, 3430 },
+ { 0x530E, 1891 },
+ { 0x530F, 3427 },
+ { 0x5310, 1864 },
+ { 0x5311, 1867 },
+ { 0x5312, 769 },
+ { 0x5313, 1861 },
+ { 0x5314, 3493 },
+ { 0x5315, 1930 },
+ { 0x5316, 3490 },
+ { 0x5317, 1906 },
+ { 0x5318, 1909 },
+ { 0x5319, 778 },
+ { 0x531A, 1903 },
+ { 0x531B, 1873 },
+ { 0x531C, 772 },
+ { 0x531D, 1870 },
+ { 0x531E, 1939 },
+ { 0x531F, 1942 },
+ { 0x5320, 781 },
+ { 0x5321, 1933 },
+ { 0x5322, 3496 },
+ { 0x5323, 1936 },
+ { 0x5324, 1951 },
+ { 0x5325, 1954 },
+ { 0x5326, 784 },
+ { 0x5327, 1945 },
+ { 0x5328, 3499 },
+ { 0x5329, 1948 },
+ { 0x532A, 3454 },
+ { 0x532B, 3457 },
+ { 0x532C, 1918 },
+ { 0x532D, 3451 },
+ { 0x532E, 3976 },
+ { 0x532F, 3448 },
+ { 0x5330, 3973 },
+ { 0x5331, 3436 },
+ { 0x5332, 3439 },
+ { 0x5333, 1912 },
+ { 0x5334, 3433 },
+ { 0x5335, 3463 },
+ { 0x5336, 3466 },
+ { 0x5337, 1921 },
+ { 0x5338, 3460 },
+ { 0x5339, 3445 },
+ { 0x533A, 1915 },
+ { 0x533B, 3442 },
+ { 0x533C, 3472 },
+ { 0x533D, 3475 },
+ { 0x533E, 1924 },
+ { 0x533F, 3469 },
+ { 0x5340, 3484 },
+ { 0x5341, 3487 },
+ { 0x5342, 1927 },
+ { 0x5343, 3478 },
+ { 0x5344, 3979 },
+ { 0x5345, 3481 },
+ { 0x5346, 3583 },
+ { 0x5347, 3586 },
+ { 0x5348, 2197 },
+ { 0x5349, 3580 },
+ { 0x534A, 3985 },
+ { 0x534B, 3607 },
+ { 0x534C, 3982 },
+ { 0x534D, 3601 },
+ { 0x534E, 3604 },
+ { 0x534F, 2203 },
+ { 0x5350, 3598 },
+ { 0x5351, 3592 },
+ { 0x5352, 3595 },
+ { 0x5353, 2200 },
+ { 0x5354, 3589 },
+ { 0x5355, 3616 },
+ { 0x5356, 3619 },
+ { 0x5357, 2206 },
+ { 0x5358, 3610 },
+ { 0x5359, 3988 },
+ { 0x535A, 3613 },
+ { 0x535B, 3628 },
+ { 0x535C, 3631 },
+ { 0x535D, 2209 },
+ { 0x535E, 3622 },
+ { 0x535F, 3991 },
+ { 0x5360, 3625 },
+ { 0x5361, 2362 },
+ { 0x5362, 2365 },
+ { 0x5363, 967 },
+ { 0x5364, 2359 },
+ { 0x5365, 3727 },
+ { 0x5366, 3730 },
+ { 0x5367, 2386 },
+ { 0x5368, 3724 },
+ { 0x5369, 2380 },
+ { 0x536A, 2383 },
+ { 0x536B, 973 },
+ { 0x536C, 2377 },
+ { 0x536D, 2371 },
+ { 0x536E, 2374 },
+ { 0x536F, 970 },
+ { 0x5370, 2368 },
+ { 0x5371, 2395 },
+ { 0x5372, 976 },
+ { 0x5373, 2389 },
+ { 0x5374, 3733 },
+ { 0x5375, 2392 },
+ { 0x5376, 2404 },
+ { 0x5377, 2407 },
+ { 0x5378, 979 },
+ { 0x5379, 2398 },
+ { 0x537A, 3736 },
+ { 0x537B, 2401 },
+ { 0x537C, 3313 },
+ { 0x537D, 1819 },
+ { 0x537E, 3952 },
+ { 0x537F, 3334 },
+ { 0x5380, 3328 },
+ { 0x5381, 3331 },
+ { 0x5382, 1825 },
+ { 0x5383, 3325 },
+ { 0x5384, 3319 },
+ { 0x5385, 3322 },
+ { 0x5386, 1822 },
+ { 0x5387, 3316 },
+ { 0x5388, 3343 },
+ { 0x5389, 3346 },
+ { 0x538A, 1828 },
+ { 0x538B, 3337 },
+ { 0x538C, 3955 },
+ { 0x538D, 3340 },
+ { 0x538E, 3355 },
+ { 0x538F, 3358 },
+ { 0x5390, 1831 },
+ { 0x5391, 3349 },
+ { 0x5392, 3958 },
+ { 0x5393, 3352 },
+ { 0x5394, 3130 },
+ { 0x5395, 3133 },
+ { 0x5396, 1636 },
+ { 0x5397, 3127 },
+ { 0x5398, 3148 },
+ { 0x5399, 1642 },
+ { 0x539A, 3145 },
+ { 0x539B, 3139 },
+ { 0x539C, 3142 },
+ { 0x539D, 1639 },
+ { 0x539E, 3136 },
+ { 0x539F, 3157 },
+ { 0x53A0, 3160 },
+ { 0x53A1, 1645 },
+ { 0x53A2, 3151 },
+ { 0x53A3, 3916 },
+ { 0x53A4, 3154 },
+ { 0x53A5, 3169 },
+ { 0x53A6, 3172 },
+ { 0x53A7, 1648 },
+ { 0x53A8, 3163 },
+ { 0x53A9, 3919 },
+ { 0x53AA, 3166 },
+ { 0x53AB, 3376 },
+ { 0x53AC, 3379 },
+ { 0x53AD, 1876 },
+ { 0x53AE, 3373 },
+ { 0x53AF, 3964 },
+ { 0x53B0, 3400 },
+ { 0x53B1, 3961 },
+ { 0x53B2, 3394 },
+ { 0x53B3, 3397 },
+ { 0x53B4, 1882 },
+ { 0x53B5, 3391 },
+ { 0x53B6, 3385 },
+ { 0x53B7, 3388 },
+ { 0x53B8, 1879 },
+ { 0x53B9, 3382 },
+ { 0x53BA, 3409 },
+ { 0x53BB, 3412 },
+ { 0x53BC, 1885 },
+ { 0x53BD, 3403 },
+ { 0x53BE, 3967 },
+ { 0x53BF, 3406 },
+ { 0x53C0, 3421 },
+ { 0x53C1, 3424 },
+ { 0x53C2, 1888 },
+ { 0x53C3, 3415 },
+ { 0x53C4, 3970 },
+ { 0x53C5, 3418 },
+ { 0x53C6, 1798 },
+ { 0x53C7, 1801 },
+ { 0x53C8, 754 },
+ { 0x53C9, 1795 },
+ { 0x53CA, 3364 },
+ { 0x53CB, 1834 },
+ { 0x53CC, 3361 },
+ { 0x53CD, 1813 },
+ { 0x53CE, 1816 },
+ { 0x53CF, 760 },
+ { 0x53D0, 1810 },
+ { 0x53D1, 1807 },
+ { 0x53D2, 757 },
+ { 0x53D3, 1804 },
+ { 0x53D4, 1843 },
+ { 0x53D5, 1846 },
+ { 0x53D6, 763 },
+ { 0x53D7, 1837 },
+ { 0x53D8, 3367 },
+ { 0x53D9, 1840 },
+ { 0x53DA, 1855 },
+ { 0x53DB, 1858 },
+ { 0x53DC, 766 },
+ { 0x53DD, 1849 },
+ { 0x53DE, 3370 },
+ { 0x53DF, 1852 },
+ { 0x53E0, 1312 },
+ { 0x53E1, 1315 },
+ { 0x53E2, 640 },
+ { 0x53E3, 1309 },
+ { 0x53E4, 2779 },
+ { 0x53E5, 2782 },
+ { 0x53E6, 1306 },
+ { 0x53E7, 2776 },
+ { 0x53E8, 2833 },
+ { 0x53E9, 2836 },
+ { 0x53EA, 1339 },
+ { 0x53EB, 2830 },
+ { 0x53EC, 1333 },
+ { 0x53ED, 1336 },
+ { 0x53EE, 643 },
+ { 0x53EF, 1330 },
+ { 0x53F0, 1348 },
+ { 0x53F1, 1351 },
+ { 0x53F2, 646 },
+ { 0x53F3, 1342 },
+ { 0x53F4, 2839 },
+ { 0x53F5, 1345 },
+ { 0x53F6, 1360 },
+ { 0x53F7, 1363 },
+ { 0x53F8, 649 },
+ { 0x53F9, 1354 },
+ { 0x53FA, 2842 },
+ { 0x53FB, 1357 },
+ { 0x53FC, 1753 },
+ { 0x53FD, 1756 },
+ { 0x53FE, 742 },
+ { 0x53FF, 1750 },
+ { 0x5400, 3292 },
+ { 0x5401, 3295 },
+ { 0x5402, 1747 },
+ { 0x5403, 3289 },
+ { 0x5404, 3301 },
+ { 0x5405, 3304 },
+ { 0x5406, 1768 },
+ { 0x5407, 3298 },
+ { 0x5408, 1762 },
+ { 0x5409, 1765 },
+ { 0x540A, 745 },
+ { 0x540B, 1759 },
+ { 0x540C, 1777 },
+ { 0x540D, 1780 },
+ { 0x540E, 748 },
+ { 0x540F, 1771 },
+ { 0x5410, 3307 },
+ { 0x5411, 1774 },
+ { 0x5412, 1789 },
+ { 0x5413, 1792 },
+ { 0x5414, 751 },
+ { 0x5415, 1783 },
+ { 0x5416, 3310 },
+ { 0x5417, 1786 },
+ { 0x5418, 2791 },
+ { 0x5419, 2794 },
+ { 0x541A, 1318 },
+ { 0x541B, 2788 },
+ { 0x541C, 3841 },
+ { 0x541D, 3844 },
+ { 0x541E, 2785 },
+ { 0x541F, 3838 },
+ { 0x5420, 3850 },
+ { 0x5421, 2806 },
+ { 0x5422, 3847 },
+ { 0x5423, 2800 },
+ { 0x5424, 2803 },
+ { 0x5425, 1321 },
+ { 0x5426, 2797 },
+ { 0x5427, 2815 },
+ { 0x5428, 2818 },
+ { 0x5429, 1324 },
+ { 0x542A, 2809 },
+ { 0x542B, 3853 },
+ { 0x542C, 2812 },
+ { 0x542D, 2824 },
+ { 0x542E, 2827 },
+ { 0x542F, 1327 },
+ { 0x5430, 2821 },
+ { 0x5431, 3088 },
+ { 0x5432, 3091 },
+ { 0x5433, 1615 },
+ { 0x5434, 3085 },
+ { 0x5435, 3901 },
+ { 0x5436, 3904 },
+ { 0x5437, 3082 },
+ { 0x5438, 3898 },
+ { 0x5439, 3907 },
+ { 0x543A, 3103 },
+ { 0x543B, 3097 },
+ { 0x543C, 3100 },
+ { 0x543D, 1618 },
+ { 0x543E, 3094 },
+ { 0x543F, 3112 },
+ { 0x5440, 1621 },
+ { 0x5441, 3106 },
+ { 0x5442, 3910 },
+ { 0x5443, 3109 },
+ { 0x5444, 3121 },
+ { 0x5445, 3124 },
+ { 0x5446, 1624 },
+ { 0x5447, 3115 },
+ { 0x5448, 3913 },
+ { 0x5449, 3118 },
+ { 0x544A, 3190 },
+ { 0x544B, 3193 },
+ { 0x544C, 1666 },
+ { 0x544D, 3187 },
+ { 0x544E, 3925 },
+ { 0x544F, 3928 },
+ { 0x5450, 3184 },
+ { 0x5451, 3922 },
+ { 0x5452, 3934 },
+ { 0x5453, 3205 },
+ { 0x5454, 3931 },
+ { 0x5455, 3199 },
+ { 0x5456, 3202 },
+ { 0x5457, 1669 },
+ { 0x5458, 3196 },
+ { 0x5459, 3211 },
+ { 0x545A, 3214 },
+ { 0x545B, 1672 },
+ { 0x545C, 3208 },
+ { 0x545D, 2104 },
+ { 0x545E, 2107 },
+ { 0x545F, 832 },
+ { 0x5460, 2101 },
+ { 0x5461, 3544 },
+ { 0x5462, 3547 },
+ { 0x5463, 2098 },
+ { 0x5464, 3541 },
+ { 0x5465, 3550 },
+ { 0x5466, 2119 },
+ { 0x5467, 2113 },
+ { 0x5468, 2116 },
+ { 0x5469, 835 },
+ { 0x546A, 2110 },
+ { 0x546B, 2128 },
+ { 0x546C, 2131 },
+ { 0x546D, 838 },
+ { 0x546E, 2122 },
+ { 0x546F, 3553 },
+ { 0x5470, 2125 },
+ { 0x5471, 2140 },
+ { 0x5472, 2143 },
+ { 0x5473, 841 },
+ { 0x5474, 2137 },
+ { 0x5475, 3559 },
+ { 0x5476, 3562 },
+ { 0x5477, 2134 },
+ { 0x5478, 3556 },
+ { 0x5479, 3568 },
+ { 0x547A, 3571 },
+ { 0x547B, 2155 },
+ { 0x547C, 3565 },
+ { 0x547D, 2149 },
+ { 0x547E, 2152 },
+ { 0x547F, 844 },
+ { 0x5480, 2146 },
+ { 0x5481, 2164 },
+ { 0x5482, 2167 },
+ { 0x5483, 847 },
+ { 0x5484, 2158 },
+ { 0x5485, 3574 },
+ { 0x5486, 2161 },
+ { 0x5487, 2176 },
+ { 0x5488, 2179 },
+ { 0x5489, 850 },
+ { 0x548A, 2170 },
+ { 0x548B, 3577 },
+ { 0x548C, 2173 },
+ { 0x5490, 430 },
+ { 0x5491, 364 },
+ { 0x5492, 412 },
+ { 0x5493, 493 },
+ { 0x5494, 394 },
+ { 0x5495, 436 },
+ { 0x5496, 469 },
+ { 0x5497, 400 },
+ { 0x5498, 367 },
+ { 0x5499, 475 },
+ { 0x549A, 418 },
+ { 0x549B, 460 },
+ { 0x549C, 421 },
+ { 0x549D, 379 },
+ { 0x549E, 424 },
+ { 0x549F, 481 },
+ { 0x54A0, 439 },
+ { 0x54A1, 355 },
+ { 0x54A2, 454 },
+ { 0x54A3, 397 },
+ { 0x54A4, 466 },
+ { 0x54A5, 385 },
+ { 0x54A6, 472 },
+ { 0x54A7, 496 },
+ { 0x54A8, 373 },
+ { 0x54A9, 370 },
+ { 0x54AA, 487 },
+ { 0x54AB, 451 },
+ { 0x54AC, 427 },
+ { 0x54AD, 406 },
+ { 0x54AE, 448 },
+ { 0x54AF, 445 },
+ { 0x54B0, 433 },
+ { 0x54B1, 442 },
+ { 0x54B2, 382 },
+ { 0x54B3, 358 },
+ { 0x54B4, 499 },
+ { 0x54B5, 409 },
+ { 0x54B6, 403 },
+ { 0x54B7, 484 },
+ { 0x54B8, 376 },
+ { 0x54B9, 352 },
+ { 0x54BA, 508 },
+ { 0x54BB, 415 },
+ { 0x54BC, 349 },
+ { 0x54BD, 463 },
+ { 0x54BE, 391 },
+ { 0x54BF, 478 },
+ { 0x54C0, 502 },
+ { 0x54C1, 457 },
+ { 0x54C2, 505 },
+ { 0x54C3, 388 },
+ { 0x54C4, 511 },
+ { 0x54C5, 490 },
+ { 0x54C6, 361 },
+ { 0x5500, 7945 },
+ { 0x5501, 8254 },
+ { 0x5502, 8290 },
+ { 0x5503, 8482 },
+ { 0x5504, 8653 },
+ { 0x5505, 8419 },
+ { 0x5506, 8527 },
+ { 0x5507, 8206 },
+ { 0x5508, 8578 },
+ { 0x5509, 8569 },
+ { 0x550A, 8671 },
+ { 0x550B, 8554 },
+ { 0x550C, 8257 },
+ { 0x550D, 8473 },
+ { 0x550E, 8452 },
+ { 0x550F, 8647 },
+ { 0x5510, 8533 },
+ { 0x5511, 8665 },
+ { 0x5512, 8338 },
+ { 0x5513, 8425 },
+ { 0x5514, 8233 },
+ { 0x5515, 8599 },
+ { 0x5516, 8431 },
+ { 0x5517, 8641 },
+ { 0x5518, 8506 },
+ { 0x5519, 8659 },
+ { 0x551A, 8227 },
+ { 0x551B, 8308 },
+ { 0x551C, 8629 },
+ { 0x551D, 8500 },
+ { 0x551E, 8317 },
+ { 0x551F, 8697 },
+ { 0x5520, 8278 },
+ { 0x5521, 8359 },
+ { 0x5522, 8380 },
+ { 0x5523, 8635 },
+ { 0x5524, 7888 },
+ { 0x5525, 7996 },
+ { 0x5526, 7987 },
+ { 0x5527, 8296 },
+ { 0x5528, 8167 },
+ { 0x5529, 8488 },
+ { 0x552A, 8089 },
+ { 0x552B, 8215 },
+ { 0x552C, 7906 },
+ { 0x552D, 8350 },
+ { 0x552E, 8329 },
+ { 0x552F, 8590 },
+ { 0x5530, 8269 },
+ { 0x5531, 7957 },
+ { 0x5532, 8152 },
+ { 0x5533, 8134 },
+ { 0x5534, 8461 },
+ { 0x5535, 8242 },
+ { 0x5536, 8542 },
+ { 0x5537, 8035 },
+ { 0x5538, 8104 },
+ { 0x5539, 7936 },
+ { 0x553A, 8371 },
+ { 0x553B, 8119 },
+ { 0x553C, 8440 },
+ { 0x553D, 8197 },
+ { 0x553E, 8515 },
+ { 0x553F, 7921 },
+ { 0x5540, 8005 },
+ { 0x5541, 8389 },
+ { 0x5542, 8182 },
+ { 0x5543, 8020 },
+ { 0x5544, 8617 },
+ { 0x5545, 7972 },
+ { 0x5546, 8050 },
+ { 0x5547, 8068 },
+ { 0x5548, 8407 },
+ { 0x5549, 7882 },
+ { 0x554A, 7897 },
+ { 0x554B, 8605 },
+ { 0x554C, 7981 },
+ { 0x554D, 8287 },
+ { 0x554E, 8161 },
+ { 0x554F, 8479 },
+ { 0x5550, 8083 },
+ { 0x5551, 8209 },
+ { 0x5552, 7900 },
+ { 0x5553, 8344 },
+ { 0x5554, 8323 },
+ { 0x5555, 8566 },
+ { 0x5556, 8584 },
+ { 0x5557, 8263 },
+ { 0x5558, 7951 },
+ { 0x5559, 8146 },
+ { 0x555A, 8128 },
+ { 0x555B, 8455 },
+ { 0x555C, 8236 },
+ { 0x555D, 8536 },
+ { 0x555E, 8029 },
+ { 0x555F, 8098 },
+ { 0x5560, 7930 },
+ { 0x5561, 8365 },
+ { 0x5562, 8113 },
+ { 0x5563, 8434 },
+ { 0x5564, 8191 },
+ { 0x5565, 8509 },
+ { 0x5566, 7915 },
+ { 0x5567, 7999 },
+ { 0x5568, 8383 },
+ { 0x5569, 8176 },
+ { 0x556A, 8014 },
+ { 0x556B, 8314 },
+ { 0x556C, 8611 },
+ { 0x556D, 7966 },
+ { 0x556E, 8044 },
+ { 0x556F, 8059 },
+ { 0x5570, 8401 },
+ { 0x5571, 8080 },
+ { 0x5572, 8416 },
+ { 0x5573, 8302 },
+ { 0x5574, 8494 },
+ { 0x5575, 8656 },
+ { 0x5576, 8422 },
+ { 0x5577, 8530 },
+ { 0x5578, 8224 },
+ { 0x5579, 8581 },
+ { 0x557A, 8575 },
+ { 0x557B, 8674 },
+ { 0x557C, 8563 },
+ { 0x557D, 8260 },
+ { 0x557E, 8476 },
+ { 0x557F, 8470 },
+ { 0x5580, 8650 },
+ { 0x5581, 8551 },
+ { 0x5582, 8668 },
+ { 0x5583, 8341 },
+ { 0x5584, 8428 },
+ { 0x5585, 8251 },
+ { 0x5586, 8602 },
+ { 0x5587, 8449 },
+ { 0x5588, 8644 },
+ { 0x5589, 8524 },
+ { 0x558A, 8662 },
+ { 0x558B, 8230 },
+ { 0x558C, 8311 },
+ { 0x558D, 8632 },
+ { 0x558E, 8503 },
+ { 0x558F, 8320 },
+ { 0x5590, 8703 },
+ { 0x5591, 8284 },
+ { 0x5592, 8362 },
+ { 0x5593, 8398 },
+ { 0x5594, 8638 },
+ { 0x5595, 7894 },
+ { 0x5596, 8143 },
+ { 0x5597, 7993 },
+ { 0x5598, 8305 },
+ { 0x5599, 8173 },
+ { 0x559A, 8497 },
+ { 0x559B, 8095 },
+ { 0x559C, 8221 },
+ { 0x559D, 7912 },
+ { 0x559E, 8356 },
+ { 0x559F, 8335 },
+ { 0x55A0, 8596 },
+ { 0x55A1, 8275 },
+ { 0x55A2, 7963 },
+ { 0x55A3, 8158 },
+ { 0x55A4, 8140 },
+ { 0x55A5, 8467 },
+ { 0x55A6, 8248 },
+ { 0x55A7, 8548 },
+ { 0x55A8, 8041 },
+ { 0x55A9, 8110 },
+ { 0x55AA, 7942 },
+ { 0x55AB, 8377 },
+ { 0x55AC, 8125 },
+ { 0x55AD, 8446 },
+ { 0x55AE, 8203 },
+ { 0x55AF, 8521 },
+ { 0x55B0, 7927 },
+ { 0x55B1, 8011 },
+ { 0x55B2, 8395 },
+ { 0x55B3, 8188 },
+ { 0x55B4, 8026 },
+ { 0x55B5, 8623 },
+ { 0x55B6, 7978 },
+ { 0x55B7, 8056 },
+ { 0x55B8, 8074 },
+ { 0x55B9, 8413 },
+ { 0x55BA, 7891 },
+ { 0x55BB, 8077 },
+ { 0x55BC, 8626 },
+ { 0x55BD, 7990 },
+ { 0x55BE, 8299 },
+ { 0x55BF, 8170 },
+ { 0x55C0, 8491 },
+ { 0x55C1, 8092 },
+ { 0x55C2, 8218 },
+ { 0x55C3, 7909 },
+ { 0x55C4, 8353 },
+ { 0x55C5, 8332 },
+ { 0x55C6, 8593 },
+ { 0x55C7, 8272 },
+ { 0x55C8, 8560 },
+ { 0x55C9, 7960 },
+ { 0x55CA, 8155 },
+ { 0x55CB, 8137 },
+ { 0x55CC, 8464 },
+ { 0x55CD, 8245 },
+ { 0x55CE, 8545 },
+ { 0x55CF, 8038 },
+ { 0x55D0, 8107 },
+ { 0x55D1, 7939 },
+ { 0x55D2, 8374 },
+ { 0x55D3, 8122 },
+ { 0x55D4, 8443 },
+ { 0x55D5, 8200 },
+ { 0x55D6, 8518 },
+ { 0x55D7, 7924 },
+ { 0x55D8, 8008 },
+ { 0x55D9, 8392 },
+ { 0x55DA, 8185 },
+ { 0x55DB, 8023 },
+ { 0x55DC, 8620 },
+ { 0x55DD, 7975 },
+ { 0x55DE, 8053 },
+ { 0x55DF, 8071 },
+ { 0x55E0, 8410 },
+ { 0x55E1, 7885 },
+ { 0x55E2, 7948 },
+ { 0x55E3, 8608 },
+ { 0x55E4, 7984 },
+ { 0x55E5, 8293 },
+ { 0x55E6, 8164 },
+ { 0x55E7, 8485 },
+ { 0x55E8, 8086 },
+ { 0x55E9, 8212 },
+ { 0x55EA, 7903 },
+ { 0x55EB, 8347 },
+ { 0x55EC, 8326 },
+ { 0x55ED, 8572 },
+ { 0x55EE, 8587 },
+ { 0x55EF, 8266 },
+ { 0x55F0, 8557 },
+ { 0x55F1, 7954 },
+ { 0x55F2, 8149 },
+ { 0x55F3, 8131 },
+ { 0x55F4, 8458 },
+ { 0x55F5, 8239 },
+ { 0x55F6, 8539 },
+ { 0x55F7, 8032 },
+ { 0x55F8, 8101 },
+ { 0x55F9, 7933 },
+ { 0x55FA, 8368 },
+ { 0x55FB, 8116 },
+ { 0x55FC, 8437 },
+ { 0x55FD, 8194 },
+ { 0x55FE, 8512 },
+ { 0x55FF, 7918 },
+ { 0x5600, 8002 },
+ { 0x5601, 8386 },
+ { 0x5602, 8179 },
+ { 0x5603, 8017 },
+ { 0x5604, 8614 },
+ { 0x5605, 8700 },
+ { 0x5606, 7969 },
+ { 0x5607, 8281 },
+ { 0x5608, 8047 },
+ { 0x5609, 8062 },
+ { 0x560A, 8404 },
+ { 0x560B, 8065 },
+ { 0x560C, 8706 },
+ { 0x560D, 7808 },
+ { 0x560E, 7805 },
+ { 0x560F, 7879 },
+ { 0x5610, 8681 },
+ { 0x5611, 8685 },
+ { 0x5612, 8693 },
+ { 0x5613, 7873 },
+ { 0x5614, 7876 },
+ { 0x5615, 7864 },
+ { 0x5616, 7843 },
+ { 0x5617, 7849 },
+ { 0x5618, 7840 },
+ { 0x5619, 7846 },
+ { 0x561A, 7852 },
+ { 0x561B, 7870 },
+ { 0x561C, 7861 },
+ { 0x561D, 7867 },
+ { 0x561E, 7855 },
+ { 0x561F, 7858 },
+ { 0x5620, 7828 },
+ { 0x5621, 7810 },
+ { 0x5622, 7816 },
+ { 0x5623, 7837 },
+ { 0x5624, 7822 },
+ { 0x5625, 7819 },
+ { 0x5626, 7813 },
+ { 0x5627, 7834 },
+ { 0x5628, 7831 },
+ { 0x5629, 7825 },
+ { 0x562A, 8689 },
+ { 0x562B, 8677 },
+ { 0x5640, 50137 },
+ { 0x5641, 49239 },
+ { 0x5642, 50054 },
+ { 0x5643, 49156 },
+ { 0x5644, 50212 },
+ { 0x5645, 49318 },
+ { 0x5646, 49931 },
+ { 0x5647, 49033 },
+ { 0x5648, 50050 },
+ { 0x5649, 49152 },
+ { 0x564A, 50266 },
+ { 0x564B, 49372 },
+ { 0x564C, 50045 },
+ { 0x564D, 49147 },
+ { 0x564E, 50163 },
+ { 0x564F, 49265 },
+ { 0x5650, 50023 },
+ { 0x5651, 49125 },
+ { 0x5652, 50184 },
+ { 0x5653, 49286 },
+ { 0x5654, 50202 },
+ { 0x5655, 49308 },
+ { 0x5656, 50168 },
+ { 0x5657, 49270 },
+ { 0x5658, 50120 },
+ { 0x5659, 49222 },
+ { 0x565A, 50146 },
+ { 0x565B, 49248 },
+ { 0x565C, 50189 },
+ { 0x565D, 49291 },
+ { 0x565E, 49727 },
+ { 0x565F, 48829 },
+ { 0x5662, 49983 },
+ { 0x5663, 49085 },
+ { 0x5664, 49988 },
+ { 0x5665, 49090 },
+ { 0x5666, 49993 },
+ { 0x5667, 49095 },
+ { 0x5668, 50261 },
+ { 0x5669, 49367 },
+ { 0x566A, 50256 },
+ { 0x566B, 49362 },
+ { 0x566C, 50126 },
+ { 0x566D, 49228 },
+ { 0x566E, 49417 },
+ { 0x566F, 58020 },
+ { 0x5670, 58004 },
+ { 0x5671, 58160 },
+ { 0x5672, 58180 },
+ { 0x5673, 55523 },
+ { 0x567C, 58023 },
+ { 0x567D, 58170 },
+ { 0x567E, 49407 },
+ { 0x567F, 50301 },
+ { 0x5680, 49783 },
+ { 0x5681, 48885 },
+ { 0x5682, 49914 },
+ { 0x5683, 49016 },
+ { 0x5684, 50036 },
+ { 0x5685, 49138 },
+ { 0x5686, 49906 },
+ { 0x5687, 49008 },
+ { 0x5688, 49918 },
+ { 0x5689, 49020 },
+ { 0x568A, 49694 },
+ { 0x568B, 48796 },
+ { 0x568C, 49872 },
+ { 0x568D, 48974 },
+ { 0x568E, 50015 },
+ { 0x568F, 49117 },
+ { 0x5690, 50011 },
+ { 0x5691, 49113 },
+ { 0x5692, 50003 },
+ { 0x5693, 49105 },
+ { 0x5694, 49832 },
+ { 0x5695, 48934 },
+ { 0x5696, 49979 },
+ { 0x5697, 49081 },
+ { 0x5700, 54739 },
+ { 0x5701, 54763 },
+ { 0x5702, 54745 },
+ { 0x5703, 54769 },
+ { 0x5704, 54727 },
+ { 0x5705, 54751 },
+ { 0x5706, 54733 },
+ { 0x5707, 54757 },
+ { 0x5708, 54839 },
+ { 0x5709, 54039 },
+ { 0x570A, 53996 },
+ { 0x570B, 53952 },
+ { 0x570C, 54808 },
+ { 0x570D, 54845 },
+ { 0x570E, 54045 },
+ { 0x570F, 54002 },
+ { 0x5710, 53958 },
+ { 0x5711, 54814 },
+ { 0x5712, 54852 },
+ { 0x5713, 54052 },
+ { 0x5714, 54009 },
+ { 0x5715, 53980 },
+ { 0x5716, 54821 },
+ { 0x5717, 53884 },
+ { 0x5718, 53880 },
+ { 0x5719, 53889 },
+ { 0x571A, 54106 },
+ { 0x571B, 54571 },
+ { 0x571C, 54576 },
+ { 0x571D, 54591 },
+ { 0x571E, 54585 },
+ { 0x571F, 53969 },
+ { 0x5720, 54606 },
+ { 0x5721, 54600 },
+ { 0x5722, 20769 },
+ { 0x5723, 17878 },
+ { 0x5724, 20764 },
+ { 0x5725, 17873 },
+ { 0x5726, 20552 },
+ { 0x5727, 17317 },
+ { 0x5728, 20503 },
+ { 0x5729, 17173 },
+ { 0x572A, 20735 },
+ { 0x572B, 17844 },
+ { 0x572C, 20739 },
+ { 0x572D, 17848 },
+ { 0x572E, 20743 },
+ { 0x572F, 17852 },
+ { 0x5730, 17974 },
+ { 0x5731, 18048 },
+ { 0x5732, 20422 },
+ { 0x5733, 17038 },
+ { 0x5734, 20442 },
+ { 0x5735, 17058 },
+ { 0x5736, 20446 },
+ { 0x5737, 17062 },
+ { 0x5738, 20450 },
+ { 0x5739, 17066 },
+ { 0x573A, 20454 },
+ { 0x573B, 17070 },
+ { 0x573C, 20461 },
+ { 0x573D, 17077 },
+ { 0x573E, 20719 },
+ { 0x573F, 17758 },
+ { 0x5740, 19120 },
+ { 0x5741, 15472 },
+ { 0x5742, 19141 },
+ { 0x5743, 15500 },
+ { 0x5744, 19126 },
+ { 0x5745, 15478 },
+ { 0x5746, 20644 },
+ { 0x5747, 17505 },
+ { 0x5748, 19180 },
+ { 0x5749, 15551 },
+ { 0x574A, 19451 },
+ { 0x574B, 15876 },
+ { 0x574C, 19459 },
+ { 0x574D, 15884 },
+ { 0x574E, 20495 },
+ { 0x574F, 17142 },
+ { 0x5750, 19688 },
+ { 0x5751, 16113 },
+ { 0x5752, 19696 },
+ { 0x5753, 16128 },
+ { 0x5754, 19702 },
+ { 0x5755, 16134 },
+ { 0x5756, 19713 },
+ { 0x5757, 16158 },
+ { 0x5758, 19721 },
+ { 0x5759, 16166 },
+ { 0x575A, 19806 },
+ { 0x575B, 16287 },
+ { 0x575C, 20542 },
+ { 0x575D, 17287 },
+ { 0x575E, 20210 },
+ { 0x575F, 16771 },
+ { 0x5760, 20507 },
+ { 0x5761, 17185 },
+ { 0x5762, 20749 },
+ { 0x5763, 17858 },
+ { 0x5764, 20630 },
+ { 0x5765, 17480 },
+ { 0x5766, 20636 },
+ { 0x5767, 17486 },
+ { 0x5768, 20585 },
+ { 0x5769, 17421 },
+ { 0x576A, 20475 },
+ { 0x576B, 17108 },
+ { 0x576C, 20479 },
+ { 0x576D, 17116 },
+ { 0x576E, 20511 },
+ { 0x576F, 17189 },
+ { 0x5770, 53877 },
+ { 0x5771, 17193 },
+ { 0x5772, 17267 },
+ { 0x5773, 17271 },
+ { 0x5774, 17275 },
+ { 0x5775, 17283 },
+ { 0x5776, 18108 },
+ { 0x5777, 17298 },
+ { 0x5778, 17181 },
+ { 0x5779, 20685 },
+ { 0x577A, 17713 },
+ { 0x577B, 20690 },
+ { 0x577C, 17718 },
+ { 0x577D, 20695 },
+ { 0x577E, 20669 },
+ { 0x577F, 17676 },
+ { 0x5780, 20654 },
+ { 0x5781, 17585 },
+ { 0x5782, 20700 },
+ { 0x5783, 17728 },
+ { 0x5784, 20705 },
+ { 0x5785, 17733 },
+ { 0x5786, 20710 },
+ { 0x5787, 17738 },
+ { 0x5788, 53986 },
+ { 0x5789, 54095 },
+ { 0x578A, 54131 },
+ { 0x578B, 20731 },
+ { 0x578C, 17800 },
+ { 0x57FB, 20847 },
+ { 0x57FC, 20852 },
+ { 0x57FD, 20842 },
+ { 0x57FE, 20832 },
+ { 0x57FF, 20837 },
+ { 0x5800, 36572 },
+ { 0x5801, 36580 },
+ { 0x5802, 36543 },
+ { 0x5803, 36588 },
+ { 0x5804, 36576 },
+ { 0x5805, 36584 },
+ { 0x5806, 36535 },
+ { 0x5807, 36616 },
+ { 0x5808, 36672 },
+ { 0x5809, 36604 },
+ { 0x580A, 36664 },
+ { 0x580B, 36539 },
+ { 0x580C, 36596 },
+ { 0x580D, 36652 },
+ { 0x580E, 36612 },
+ { 0x580F, 36668 },
+ { 0x5810, 36688 },
+ { 0x5811, 36696 },
+ { 0x5812, 36656 },
+ { 0x5813, 36692 },
+ { 0x5814, 36644 },
+ { 0x5815, 36684 },
+ { 0x5816, 36600 },
+ { 0x5817, 36660 },
+ { 0x5818, 36628 },
+ { 0x5819, 36632 },
+ { 0x581A, 36676 },
+ { 0x581B, 36592 },
+ { 0x581C, 36648 },
+ { 0x581D, 36624 },
+ { 0x581E, 36636 },
+ { 0x581F, 36620 },
+ { 0x5820, 36680 },
+ { 0x5821, 36640 },
+ { 0x5822, 36608 },
+ { 0x5823, 36547 },
+ { 0x5824, 36557 },
+ { 0x5825, 36562 },
+ { 0x5826, 36552 },
+ { 0x5827, 36567 },
+ { 0x5828, 36700 },
+ { 0x5829, 36704 },
+ { 0x582A, 36708 },
+ { 0x582B, 36712 },
+ { 0x5840, 55006 },
+ { 0x5841, 55057 },
+ { 0x5842, 54997 },
+ { 0x5843, 55060 },
+ { 0x5844, 54985 },
+ { 0x5845, 55045 },
+ { 0x5846, 55003 },
+ { 0x5847, 55066 },
+ { 0x5848, 55030 },
+ { 0x5849, 55075 },
+ { 0x584A, 54988 },
+ { 0x584B, 55015 },
+ { 0x584C, 55018 },
+ { 0x584D, 55069 },
+ { 0x584E, 54982 },
+ { 0x584F, 55012 },
+ { 0x5850, 55078 },
+ { 0x5851, 55087 },
+ { 0x5852, 55051 },
+ { 0x5853, 55033 },
+ { 0x5854, 55084 },
+ { 0x5855, 55042 },
+ { 0x5856, 55093 },
+ { 0x5857, 55039 },
+ { 0x5858, 55024 },
+ { 0x5859, 55009 },
+ { 0x585A, 55072 },
+ { 0x585B, 55027 },
+ { 0x585C, 55000 },
+ { 0x585D, 54967 },
+ { 0x585E, 54973 },
+ { 0x585F, 54979 },
+ { 0x5860, 54970 },
+ { 0x5861, 54976 },
+ { 0x5862, 55021 },
+ { 0x5863, 55036 },
+ { 0x5864, 54994 },
+ { 0x5865, 55054 },
+ { 0x5866, 54991 },
+ { 0x5867, 55124 },
+ { 0x5868, 55128 },
+ { 0x5869, 55081 },
+ { 0x586A, 55090 },
+ { 0x586B, 55048 },
+ { 0x586C, 55063 },
+ { 0x586D, 55101 },
+ { 0x586E, 55109 },
+ { 0x586F, 55097 },
+ { 0x5870, 55105 },
+ { 0x5871, 55120 },
+ { 0x5872, 55132 },
+ { 0x5873, 55113 },
+ { 0x5874, 55116 },
+ { 0x5875, 54963 },
+ { 0x5876, 54956 },
+ { 0x5877, 54959 },
+ { 0x5880, 68329 },
+ { 0x5881, 68326 },
+ { 0x5882, 68431 },
+ { 0x5883, 68446 },
+ { 0x5884, 68437 },
+ { 0x5885, 68473 },
+ { 0x5886, 68443 },
+ { 0x5887, 68506 },
+ { 0x5888, 68573 },
+ { 0x5889, 68581 },
+ { 0x588A, 68569 },
+ { 0x588B, 68577 },
+ { 0x588C, 68434 },
+ { 0x588D, 68464 },
+ { 0x588E, 68449 },
+ { 0x588F, 68440 },
+ { 0x5890, 68491 },
+ { 0x5891, 68452 },
+ { 0x5892, 68479 },
+ { 0x5893, 68533 },
+ { 0x5894, 68467 },
+ { 0x5895, 68527 },
+ { 0x5896, 68539 },
+ { 0x5897, 68458 },
+ { 0x5898, 68518 },
+ { 0x5899, 68476 },
+ { 0x589A, 68530 },
+ { 0x589B, 68545 },
+ { 0x589C, 68560 },
+ { 0x589D, 68566 },
+ { 0x589E, 68521 },
+ { 0x589F, 68563 },
+ { 0x58A0, 68542 },
+ { 0x58A1, 68503 },
+ { 0x58A2, 68557 },
+ { 0x58A3, 68461 },
+ { 0x58A4, 68524 },
+ { 0x58A5, 68488 },
+ { 0x58A6, 68494 },
+ { 0x58A7, 68548 },
+ { 0x58A8, 68455 },
+ { 0x58A9, 68515 },
+ { 0x58AA, 68485 },
+ { 0x58AB, 68512 },
+ { 0x58AC, 68497 },
+ { 0x58AD, 68482 },
+ { 0x58AE, 68509 },
+ { 0x58AF, 68551 },
+ { 0x58B0, 68554 },
+ { 0x58B1, 68500 },
+ { 0x58B2, 68470 },
+ { 0x58B3, 68536 },
+ { 0x58B4, 68585 },
+ { 0x58B5, 68380 },
+ { 0x58B6, 68368 },
+ { 0x58B7, 68396 },
+ { 0x58B8, 68376 },
+ { 0x58B9, 68404 },
+ { 0x58BA, 68413 },
+ { 0x58BB, 68423 },
+ { 0x58BC, 68408 },
+ { 0x58BD, 68418 },
+ { 0x58BE, 68364 },
+ { 0x58BF, 68392 },
+ { 0x58C0, 68384 },
+ { 0x58C1, 68372 },
+ { 0x58C2, 68400 },
+ { 0x58C3, 68388 },
+ { 0x58C4, 68323 },
+ { 0x58CE, 68332 },
+ { 0x58CF, 68428 },
+ { 0x58D0, 68352 },
+ { 0x58D1, 68334 },
+ { 0x58D2, 68340 },
+ { 0x58D3, 68361 },
+ { 0x58D4, 68346 },
+ { 0x58D5, 68343 },
+ { 0x58D6, 68337 },
+ { 0x58D7, 68358 },
+ { 0x58D8, 68355 },
+ { 0x58D9, 68349 },
+ { 0x5900, 13773 },
+ { 0x5901, 13749 },
+ { 0x5902, 13757 },
+ { 0x5903, 13785 },
+ { 0x5904, 13765 },
+ { 0x5905, 13761 },
+ { 0x5906, 13753 },
+ { 0x5907, 13781 },
+ { 0x5908, 13777 },
+ { 0x5909, 13769 },
+ { 0x590A, 13837 },
+ { 0x590B, 13897 },
+ { 0x590C, 13829 },
+ { 0x590D, 13901 },
+ { 0x590E, 13869 },
+ { 0x590F, 13913 },
+ { 0x5910, 13889 },
+ { 0x5911, 13905 },
+ { 0x5912, 13873 },
+ { 0x5913, 13893 },
+ { 0x5914, 13849 },
+ { 0x5915, 13861 },
+ { 0x5916, 13909 },
+ { 0x5917, 13845 },
+ { 0x5918, 13825 },
+ { 0x5919, 13817 },
+ { 0x591A, 13865 },
+ { 0x591B, 13885 },
+ { 0x591C, 13841 },
+ { 0x591D, 13881 },
+ { 0x591E, 13917 },
+ { 0x591F, 13833 },
+ { 0x5920, 13877 },
+ { 0x5921, 13821 },
+ { 0x5922, 13809 },
+ { 0x5923, 13853 },
+ { 0x5924, 13813 },
+ { 0x5925, 13857 },
+ { 0x5926, 13805 },
+ { 0x5927, 13789 },
+ { 0x5928, 13797 },
+ { 0x5929, 13801 },
+ { 0x592A, 13793 },
+ { 0x592B, 13745 },
+ { 0x592C, 13736 },
+ { 0x592D, 13740 },
+ { 0x592E, 13728 },
+ { 0x592F, 13732 },
+ { 0x5930, 35728 },
+ { 0x5931, 35719 },
+ { 0x5932, 35764 },
+ { 0x5933, 35749 },
+ { 0x5934, 35716 },
+ { 0x5935, 35737 },
+ { 0x5936, 35740 },
+ { 0x5937, 35710 },
+ { 0x5938, 35734 },
+ { 0x5939, 35713 },
+ { 0x593A, 35725 },
+ { 0x593B, 35767 },
+ { 0x593C, 35746 },
+ { 0x593D, 35743 },
+ { 0x593E, 35731 },
+ { 0x593F, 35755 },
+ { 0x5940, 35752 },
+ { 0x5941, 35722 },
+ { 0x5942, 35758 },
+ { 0x5943, 35770 },
+ { 0x5944, 35761 },
+ { 0x5945, 35773 },
+ { 0x5946, 35707 },
+ { 0x5947, 35679 },
+ { 0x5948, 35687 },
+ { 0x5949, 35675 },
+ { 0x594A, 35691 },
+ { 0x594B, 35683 },
+ { 0x594C, 35695 },
+ { 0x594D, 35703 },
+ { 0x594E, 35699 },
+ { 0x594F, 35793 },
+ { 0x5950, 35785 },
+ { 0x5951, 35789 },
+ { 0x5952, 35781 },
+ { 0x5953, 35776 },
+ { 0x595F, 35778 },
+ { 0x5A00, 8801 },
+ { 0x5A01, 8807 },
+ { 0x5A02, 8813 },
+ { 0x5A03, 8804 },
+ { 0x5A04, 8816 },
+ { 0x5A05, 8810 },
+ { 0x5A06, 8834 },
+ { 0x5A07, 8885 },
+ { 0x5A08, 8825 },
+ { 0x5A09, 8879 },
+ { 0x5A0A, 8915 },
+ { 0x5A0B, 8891 },
+ { 0x5A0C, 8870 },
+ { 0x5A0D, 8912 },
+ { 0x5A0E, 8831 },
+ { 0x5A0F, 8882 },
+ { 0x5A10, 8921 },
+ { 0x5A11, 8894 },
+ { 0x5A12, 8918 },
+ { 0x5A13, 8855 },
+ { 0x5A14, 8909 },
+ { 0x5A15, 8822 },
+ { 0x5A16, 8876 },
+ { 0x5A17, 8897 },
+ { 0x5A18, 8843 },
+ { 0x5A19, 8873 },
+ { 0x5A1A, 8846 },
+ { 0x5A1B, 8903 },
+ { 0x5A1C, 8900 },
+ { 0x5A1D, 8819 },
+ { 0x5A1E, 8867 },
+ { 0x5A1F, 8888 },
+ { 0x5A20, 8840 },
+ { 0x5A21, 8864 },
+ { 0x5A22, 8861 },
+ { 0x5A23, 8849 },
+ { 0x5A24, 8837 },
+ { 0x5A25, 8858 },
+ { 0x5A26, 8906 },
+ { 0x5A27, 8852 },
+ { 0x5A28, 8828 },
+ { 0x5A29, 8773 },
+ { 0x5A2A, 8761 },
+ { 0x5A2B, 8789 },
+ { 0x5A2C, 8785 },
+ { 0x5A2D, 8769 },
+ { 0x5A2E, 8793 },
+ { 0x5A2F, 8765 },
+ { 0x5A30, 8777 },
+ { 0x5A31, 8781 },
+ { 0x5A32, 8797 },
+ { 0x5A33, 8980 },
+ { 0x5A34, 8972 },
+ { 0x5A35, 8968 },
+ { 0x5A36, 8976 },
+ { 0x5A40, 8928 },
+ { 0x5A41, 8924 },
+ { 0x5A42, 8960 },
+ { 0x5A43, 8994 },
+ { 0x5A44, 8956 },
+ { 0x5A45, 8948 },
+ { 0x5A46, 8936 },
+ { 0x5A47, 8940 },
+ { 0x5A48, 8952 },
+ { 0x5A49, 8944 },
+ { 0x5A4A, 8932 },
+ { 0x5A4B, 8964 },
+ { 0x5A4C, 8989 },
+ { 0x5A4D, 8984 },
+ { 0x5A50, 8749 },
+ { 0x5A51, 8731 },
+ { 0x5A52, 8737 },
+ { 0x5A53, 8758 },
+ { 0x5A54, 8743 },
+ { 0x5A55, 8740 },
+ { 0x5A56, 8734 },
+ { 0x5A57, 8755 },
+ { 0x5A58, 8752 },
+ { 0x5A59, 8746 },
+ { 0x5A5C, 9006 },
+ { 0x5A5D, 8999 },
+ { 0x5A5E, 9002 },
+ { 0x5A5F, 9009 },
+ { 0x6B00, 17897 },
+ { 0x6B01, 17901 },
+ { 0x6B02, 17905 },
+ { 0x6B03, 17921 },
+ { 0x6B04, 17925 },
+ { 0x6B05, 17929 },
+ { 0x6B06, 17917 },
+ { 0x6B13, 44892 },
+ { 0x6B14, 44882 },
+ { 0x6B15, 44887 },
+ { 0x6B16, 44902 },
+ { 0x6B17, 44897 },
+ { 0x6B1D, 33182 },
+ { 0x6B1E, 32972 },
+ { 0x6B1F, 33388 },
+ { 0x6B20, 33370 },
+ { 0x6B21, 33269 },
+ { 0x6B22, 33277 },
+ { 0x6B23, 33257 },
+ { 0x6B24, 33261 },
+ { 0x6B25, 33286 },
+ { 0x6B26, 33281 },
+ { 0x6B27, 33273 },
+ { 0x6B28, 33265 },
+ { 0x6B29, 33374 },
+ { 0x6B2A, 33230 },
+ { 0x6B2B, 33224 },
+ { 0x6B2C, 33249 },
+ { 0x6B2D, 33241 },
+ { 0x6B2E, 33200 },
+ { 0x6B2F, 33205 },
+ { 0x6B30, 33195 },
+ { 0x6B31, 33105 },
+ { 0x6B32, 33333 },
+ { 0x6B33, 33293 },
+ { 0x6B34, 33079 },
+ { 0x6B35, 33174 },
+ { 0x6B36, 33357 },
+ { 0x6B38, 33161 },
+ { 0x6B39, 33187 },
+ { 0x6B3A, 33312 },
+ { 0x6B3B, 33121 },
+ { 0x6B3C, 33341 },
+ { 0x6B3E, 33129 },
+ { 0x6B40, 33137 },
+ { 0x6B41, 33365 },
+ { 0x6B43, 33302 },
+ { 0x6B44, 33092 },
+ { 0x6B46, 33349 },
+ { 0x6B47, 33145 },
+ { 0x6B48, 33216 },
+ { 0x6B49, 33236 },
+ { 0x6B4A, 33153 },
+ { 0x6B4B, 33169 },
+ { 0x6B4C, 33100 },
+ { 0x6B4D, 33116 },
+ { 0x6B4E, 33087 },
+ { 0x6B4F, 33379 },
+ { 0x6B50, 25426 },
+ { 0x6B51, 25420 },
+ { 0x6B52, 25471 },
+ { 0x6B53, 25456 },
+ { 0x6B54, 25466 },
+ { 0x6B55, 25461 },
+ { 0x6B56, 24792 },
+ { 0x6B57, 24777 },
+ { 0x6B58, 24787 },
+ { 0x6B59, 24782 },
+ { 0x6B5A, 25928 },
+ { 0x6B5B, 25913 },
+ { 0x6B5C, 25923 },
+ { 0x6B5D, 25918 },
+ { 0x6B5E, 26308 },
+ { 0x6B5F, 26293 },
+ { 0x6B60, 26303 },
+ { 0x6B61, 26298 },
+ { 0x6B62, 26272 },
+ { 0x6B63, 26257 },
+ { 0x6B64, 26267 },
+ { 0x6B65, 26262 },
+ { 0x6B66, 25892 },
+ { 0x6B67, 25877 },
+ { 0x6B68, 25887 },
+ { 0x6B69, 25882 },
+ { 0x6B6A, 25071 },
+ { 0x6B6B, 25056 },
+ { 0x6B6C, 25066 },
+ { 0x6B6D, 25061 },
+ { 0x6B6E, 26164 },
+ { 0x6B6F, 26149 },
+ { 0x6B70, 26159 },
+ { 0x6B71, 26154 },
+ { 0x6B72, 25507 },
+ { 0x6B73, 25492 },
+ { 0x6B74, 25502 },
+ { 0x6B75, 25497 },
+ { 0x6B76, 25729 },
+ { 0x6B77, 25714 },
+ { 0x6B78, 25724 },
+ { 0x6B79, 25719 },
+ { 0x6B7A, 26249 },
+ { 0x6B7B, 26234 },
+ { 0x6B7C, 26244 },
+ { 0x6B7D, 26239 },
+ { 0x6B7E, 26393 },
+ { 0x6B7F, 26378 },
+ { 0x6B80, 26388 },
+ { 0x6B81, 26383 },
+ { 0x6B82, 26285 },
+ { 0x6B83, 26280 },
+ { 0x6B84, 25941 },
+ { 0x6B85, 25936 },
+ { 0x6B86, 24341 },
+ { 0x6B87, 24336 },
+ { 0x6B88, 25484 },
+ { 0x6B89, 25479 },
+ { 0x6B8A, 24667 },
+ { 0x6B8B, 24662 },
+ { 0x6B8C, 25742 },
+ { 0x6B8D, 25737 },
+ { 0x6B8E, 26118 },
+ { 0x6B8F, 26103 },
+ { 0x6B90, 26113 },
+ { 0x6B91, 26108 },
+ { 0x6B92, 24442 },
+ { 0x6B93, 24427 },
+ { 0x6B94, 24437 },
+ { 0x6B95, 24432 },
+ { 0x6B96, 25530 },
+ { 0x6B97, 25515 },
+ { 0x6B98, 25525 },
+ { 0x6B99, 25520 },
+ { 0x6B9A, 26141 },
+ { 0x6B9B, 26126 },
+ { 0x6B9C, 26136 },
+ { 0x6B9D, 26131 },
+ { 0x6B9E, 25690 },
+ { 0x6B9F, 25684 },
+ { 0x6BA0, 26187 },
+ { 0x6BA1, 26172 },
+ { 0x6BA2, 26182 },
+ { 0x6BA3, 26177 },
+ { 0x6BA4, 24597 },
+ { 0x6BA5, 24589 },
+ { 0x6BA6, 24577 },
+ { 0x6BA7, 24559 },
+ { 0x6BA8, 24571 },
+ { 0x6BA9, 24565 },
+ { 0x6BAA, 24653 },
+ { 0x6BAB, 24635 },
+ { 0x6BAC, 24647 },
+ { 0x6BAD, 24641 },
+ { 0x6BAE, 25266 },
+ { 0x6BAF, 25260 },
+ { 0x6BB0, 25231 },
+ { 0x6BB1, 25222 },
+ { 0x6BD3, 24046 },
+ { 0x6BD4, 24031 },
+ { 0x6BD5, 24041 },
+ { 0x6BD6, 24036 },
+ { 0x6BD7, 24020 },
+ { 0x6BD8, 24015 },
+ { 0x6BD9, 24059 },
+ { 0x6BDA, 24054 },
+ { 0x6BDB, 24085 },
+ { 0x6BDC, 24080 },
+ { 0x6BDD, 24007 },
+ { 0x6BDE, 24072 },
+ { 0x6BDF, 24067 },
+ { 0x6BE0, 26353 },
+ { 0x6BE1, 26347 },
+ { 0x6BE2, 26369 },
+ { 0x6BE3, 26363 },
+ { 0x6BE4, 23993 },
+ { 0x6BE5, 23978 },
+ { 0x6BE6, 23988 },
+ { 0x6BE7, 23983 },
+ { 0x6BE8, 26322 },
+ { 0x6BE9, 26313 },
+ { 0x6BEA, 28622 },
+ { 0x6BEB, 28590 },
+ { 0x6BEC, 28450 },
+ { 0x6BED, 28440 },
+ { 0x6BEE, 28560 },
+ { 0x6BEF, 28550 },
+ { 0x6BF0, 28430 },
+ { 0x6BF1, 28420 },
+ { 0x6BF2, 28470 },
+ { 0x6BF3, 28460 },
+ { 0x6BF4, 28490 },
+ { 0x6BF5, 28480 },
+ { 0x6BF6, 28410 },
+ { 0x6BF7, 28390 },
+ { 0x6BF8, 28400 },
+ { 0x6BF9, 30178 },
+ { 0x6BFA, 30152 },
+ { 0x6BFB, 30165 },
+ { 0x6BFC, 26021 },
+ { 0x6BFD, 26003 },
+ { 0x6BFE, 26015 },
+ { 0x6BFF, 26009 },
+ { 0x6C00, 28642 },
+ { 0x6C01, 28510 },
+ { 0x6C02, 28692 },
+ { 0x6C03, 28611 },
+ { 0x6C04, 28580 },
+ { 0x6C05, 26665 },
+ { 0x6C06, 26600 },
+ { 0x6C07, 26688 },
+ { 0x6C08, 26716 },
+ { 0x6C09, 26650 },
+ { 0x6C0A, 26635 },
+ { 0x6C0B, 28073 },
+ { 0x6C0C, 27980 },
+ { 0x6C0D, 28115 },
+ { 0x6C0E, 28189 },
+ { 0x6C0F, 28030 },
+ { 0x6C10, 28015 },
+ { 0x6C11, 29671 },
+ { 0x6C12, 29699 },
+ { 0x6C13, 29663 },
+ { 0x6C14, 29648 },
+ { 0x6C15, 28801 },
+ { 0x6C16, 28882 },
+ { 0x6C17, 27033 },
+ { 0x6C18, 27066 },
+ { 0x6C19, 28933 },
+ { 0x6C1A, 28889 },
+ { 0x6C1B, 28947 },
+ { 0x6C1C, 29506 },
+ { 0x6C1D, 29408 },
+ { 0x6C1E, 29546 },
+ { 0x6C1F, 29612 },
+ { 0x6C20, 27755 },
+ { 0x6C21, 27838 },
+ { 0x6C22, 26821 },
+ { 0x6C23, 26763 },
+ { 0x6C24, 26853 },
+ { 0x6C25, 26867 },
+ { 0x6C26, 27852 },
+ { 0x6C27, 27939 },
+ { 0x6C28, 28736 },
+ { 0x6C29, 26526 },
+ { 0x6C2A, 26577 },
+ { 0x6C2B, 29767 },
+ { 0x6C2C, 29809 },
+ { 0x6C2D, 26925 },
+ { 0x6C2E, 26881 },
+ { 0x6C2F, 26957 },
+ { 0x6C30, 26980 },
+ { 0x6C31, 26910 },
+ { 0x6C32, 26895 },
+ { 0x6C33, 27626 },
+ { 0x6C34, 27706 },
+ { 0x6C35, 27655 },
+ { 0x6C36, 27640 },
+ { 0x6C37, 27221 },
+ { 0x6C38, 27235 },
+ { 0x6C39, 27149 },
+ { 0x6C3A, 27249 },
+ { 0x6C3B, 27177 },
+ { 0x6C3C, 27304 },
+ { 0x6C3D, 27213 },
+ { 0x6C3E, 27191 },
+ { 0x6C3F, 27525 },
+ { 0x6C40, 27355 },
+ { 0x6C41, 27557 },
+ { 0x6C42, 27612 },
+ { 0x6C43, 27458 },
+ { 0x6C44, 27376 },
+ { 0x6C45, 29060 },
+ { 0x6C46, 28988 },
+ { 0x6C47, 29101 },
+ { 0x6C48, 29131 },
+ { 0x6C49, 29009 },
+ { 0x6C4A, 28995 },
+ { 0x6C4B, 29293 },
+ { 0x6C4C, 29173 },
+ { 0x6C4D, 29307 },
+ { 0x6C4E, 29354 },
+ { 0x6C4F, 29223 },
+ { 0x6C50, 29208 },
+ { 0x6C51, 27095 },
+ { 0x6C52, 27127 },
+ { 0x6C53, 27080 },
+ { 0x6C54, 27073 },
+ { 0x6C55, 28300 },
+ { 0x6C56, 28226 },
+ { 0x6C57, 28314 },
+ { 0x6C58, 28369 },
+ { 0x6C59, 28276 },
+ { 0x6C5A, 28261 },
+ { 0x6C5B, 29619 },
+ { 0x6C5C, 27713 },
+ { 0x6C5D, 28766 },
+ { 0x6C5E, 30130 },
+ { 0x6C5F, 30137 },
+ { 0x6C60, 30109 },
+ { 0x6C61, 30095 },
+ { 0x6C62, 30123 },
+ { 0x6C63, 30144 },
+ { 0x6C64, 28540 },
+ { 0x6C65, 28712 },
+ { 0x6C66, 28662 },
+ { 0x6C67, 28702 },
+ { 0x6C68, 28600 },
+ { 0x6C69, 28570 },
+ { 0x6C6A, 26621 },
+ { 0x6C6B, 26730 },
+ { 0x6C6C, 26695 },
+ { 0x6C6D, 26723 },
+ { 0x6C6E, 26642 },
+ { 0x6C6F, 26628 },
+ { 0x6C70, 28001 },
+ { 0x6C71, 28203 },
+ { 0x6C72, 28168 },
+ { 0x6C73, 28196 },
+ { 0x6C74, 28022 },
+ { 0x6C75, 28008 },
+ { 0x6C76, 29634 },
+ { 0x6C77, 29713 },
+ { 0x6C78, 29678 },
+ { 0x6C79, 29706 },
+ { 0x6C7A, 29655 },
+ { 0x6C7B, 29641 },
+ { 0x6C7C, 26902 },
+ { 0x6C7D, 26888 },
+ { 0x6C7E, 27647 },
+ { 0x6C7F, 27633 },
+ { 0x6C80, 27198 },
+ { 0x6C81, 27156 },
+ { 0x6C82, 27283 },
+ { 0x6C83, 27205 },
+ { 0x6C84, 27184 },
+ { 0x6C85, 27591 },
+ { 0x6C86, 27450 },
+ { 0x6C87, 27369 },
+ { 0x6C88, 29002 },
+ { 0x6C89, 29117 },
+ { 0x6C8A, 29194 },
+ { 0x6C8B, 29368 },
+ { 0x6C8C, 29333 },
+ { 0x6C8D, 29361 },
+ { 0x6C8E, 29215 },
+ { 0x6C8F, 29201 },
+ { 0x6C90, 28757 },
+ { 0x6C91, 28247 },
+ { 0x6C92, 28383 },
+ { 0x6C93, 28348 },
+ { 0x6C94, 28376 },
+ { 0x6C95, 28268 },
+ { 0x6C96, 28254 },
+ { 0x6C97, 28632 },
+ { 0x6C98, 28500 },
+ { 0x6C99, 28652 },
+ { 0x6C9A, 28682 },
+ { 0x6C9B, 28530 },
+ { 0x6C9C, 26658 },
+ { 0x6C9D, 26593 },
+ { 0x6C9E, 26681 },
+ { 0x6C9F, 26709 },
+ { 0x6CA0, 26614 },
+ { 0x6CA1, 28066 },
+ { 0x6CA2, 27973 },
+ { 0x6CA3, 28108 },
+ { 0x6CA4, 28182 },
+ { 0x6CA5, 27994 },
+ { 0x6CA6, 29692 },
+ { 0x6CA7, 28794 },
+ { 0x6CA8, 28875 },
+ { 0x6CA9, 27026 },
+ { 0x6CAA, 27059 },
+ { 0x6CAB, 28926 },
+ { 0x6CAC, 28940 },
+ { 0x6CAD, 29499 },
+ { 0x6CAE, 29401 },
+ { 0x6CAF, 29539 },
+ { 0x6CB0, 29605 },
+ { 0x6CB1, 27748 },
+ { 0x6CB2, 27806 },
+ { 0x6CB3, 27831 },
+ { 0x6CB4, 26814 },
+ { 0x6CB5, 26756 },
+ { 0x6CB6, 26846 },
+ { 0x6CB7, 26860 },
+ { 0x6CB8, 27845 },
+ { 0x6CB9, 28729 },
+ { 0x6CBA, 26519 },
+ { 0x6CBB, 26570 },
+ { 0x6CBC, 29760 },
+ { 0x6CBD, 29802 },
+ { 0x6CBE, 26918 },
+ { 0x6CBF, 26874 },
+ { 0x6CC0, 26950 },
+ { 0x6CC1, 26973 },
+ { 0x6CC2, 27619 },
+ { 0x6CC3, 27699 },
+ { 0x6CC4, 27228 },
+ { 0x6CC5, 27142 },
+ { 0x6CC6, 27242 },
+ { 0x6CC7, 27170 },
+ { 0x6CC8, 27297 },
+ { 0x6CC9, 27518 },
+ { 0x6CCA, 27348 },
+ { 0x6CCB, 27550 },
+ { 0x6CCC, 27605 },
+ { 0x6CCD, 27362 },
+ { 0x6CCE, 29053 },
+ { 0x6CCF, 28981 },
+ { 0x6CD0, 29094 },
+ { 0x6CD1, 29124 },
+ { 0x6CD2, 29286 },
+ { 0x6CD3, 29166 },
+ { 0x6CD4, 29300 },
+ { 0x6CD5, 29347 },
+ { 0x6CD6, 29187 },
+ { 0x6CD7, 27088 },
+ { 0x6CD8, 27120 },
+ { 0x6CD9, 27134 },
+ { 0x6CDA, 28293 },
+ { 0x6CDB, 28219 },
+ { 0x6CDC, 28307 },
+ { 0x6CDD, 28362 },
+ { 0x6CDE, 28240 },
+ { 0x6CDF, 28672 },
+ { 0x6CE0, 28520 },
+ { 0x6CE1, 26702 },
+ { 0x6CE2, 26607 },
+ { 0x6CE3, 28175 },
+ { 0x6CE4, 27987 },
+ { 0x6CE5, 29685 },
+ { 0x6CE6, 29627 },
+ { 0x6CE7, 29598 },
+ { 0x6CE8, 29415 },
+ { 0x6CE9, 30057 },
+ { 0x6CEA, 29891 },
+ { 0x6CEB, 27163 },
+ { 0x6CEC, 27290 },
+ { 0x6CED, 27598 },
+ { 0x6CEE, 29340 },
+ { 0x6CEF, 29180 },
+ { 0x6CF0, 28355 },
+ { 0x6CF1, 28233 },
+ { 0x6CF2, 30102 },
+ { 0x6CF3, 30088 },
+ { 0x6CF4, 30116 },
+ { 0x6CF5, 27881 },
+ { 0x6CF6, 27866 },
+ { 0x6CF7, 26493 },
+ { 0x6CF8, 26478 },
+ { 0x6CF9, 29752 },
+ { 0x6CFA, 29737 },
+ { 0x6CFB, 29465 },
+ { 0x6CFC, 29450 },
+ { 0x6CFD, 29941 },
+ { 0x6CFE, 29926 },
+ { 0x6CFF, 27009 },
+ { 0x6D00, 26994 },
+ { 0x6D01, 28830 },
+ { 0x6D02, 28815 },
+ { 0x6D03, 28918 },
+ { 0x6D04, 28903 },
+ { 0x6D05, 27798 },
+ { 0x6D06, 27783 },
+ { 0x6D07, 26806 },
+ { 0x6D08, 26791 },
+ { 0x6D09, 29979 },
+ { 0x6D0A, 29884 },
+ { 0x6D0B, 30007 },
+ { 0x6D0C, 30071 },
+ { 0x6D0D, 29912 },
+ { 0x6D0E, 29436 },
+ { 0x6D0F, 27769 },
+ { 0x6D10, 26777 },
+ { 0x6D11, 27873 },
+ { 0x6D12, 27859 },
+ { 0x6D13, 26485 },
+ { 0x6D14, 26471 },
+ { 0x6D15, 29744 },
+ { 0x6D16, 29730 },
+ { 0x6D17, 29457 },
+ { 0x6D18, 29443 },
+ { 0x6D19, 29933 },
+ { 0x6D1A, 29919 },
+ { 0x6D1B, 27001 },
+ { 0x6D1C, 26987 },
+ { 0x6D1D, 28822 },
+ { 0x6D1E, 28808 },
+ { 0x6D1F, 28910 },
+ { 0x6D20, 28896 },
+ { 0x6D21, 27790 },
+ { 0x6D22, 27776 },
+ { 0x6D23, 26798 },
+ { 0x6D24, 26784 },
+ { 0x6D25, 29958 },
+ { 0x6D26, 29863 },
+ { 0x6D27, 29986 },
+ { 0x6D28, 30050 },
+ { 0x6D29, 29905 },
+ { 0x6D2A, 29429 },
+ { 0x6D2B, 27762 },
+ { 0x6D2C, 26770 },
+ { 0x6D2D, 29972 },
+ { 0x6D2E, 29877 },
+ { 0x6D2F, 30000 },
+ { 0x6D30, 30064 },
+ { 0x6D31, 29422 },
+ { 0x6D32, 29898 },
+ { 0x6D33, 27932 },
+ { 0x6D34, 29492 },
+ { 0x6D35, 29394 },
+ { 0x6D36, 29532 },
+ { 0x6D37, 29965 },
+ { 0x6D38, 29870 },
+ { 0x6D39, 29993 },
+ { 0x6D3A, 27925 },
+ { 0x6D3B, 28722 },
+ { 0x6D3C, 28743 },
+ { 0x6D3D, 28750 },
+ { 0x6D3E, 35643 },
+ { 0x6D3F, 35646 },
+ { 0x6D50, 28057 },
+ { 0x6D51, 27946 },
+ { 0x6D52, 27955 },
+ { 0x6D53, 27964 },
+ { 0x6D54, 28099 },
+ { 0x6D55, 28150 },
+ { 0x6D56, 28122 },
+ { 0x6D57, 28159 },
+ { 0x6D58, 28838 },
+ { 0x6D59, 28847 },
+ { 0x6D5A, 27040 },
+ { 0x6D5B, 27049 },
+ { 0x6D5C, 29385 },
+ { 0x6D5D, 29473 },
+ { 0x6D5E, 29482 },
+ { 0x6D5F, 29553 },
+ { 0x6D60, 29562 },
+ { 0x6D61, 29571 },
+ { 0x6D62, 29580 },
+ { 0x6D63, 29589 },
+ { 0x6D64, 27721 },
+ { 0x6D65, 27730 },
+ { 0x6D66, 27813 },
+ { 0x6D67, 29845 },
+ { 0x6D68, 29854 },
+ { 0x6D69, 29949 },
+ { 0x6D6A, 30014 },
+ { 0x6D6B, 30023 },
+ { 0x6D6C, 30032 },
+ { 0x6D6D, 30041 },
+ { 0x6D6E, 26746 },
+ { 0x6D6F, 26828 },
+ { 0x6D70, 26837 },
+ { 0x6D71, 27889 },
+ { 0x6D72, 27898 },
+ { 0x6D73, 27916 },
+ { 0x6D74, 27907 },
+ { 0x6D75, 26501 },
+ { 0x6D76, 26552 },
+ { 0x6D77, 26561 },
+ { 0x6D78, 26542 },
+ { 0x6D79, 29793 },
+ { 0x6D7A, 29774 },
+ { 0x6D7B, 29783 },
+ { 0x6D7C, 26932 },
+ { 0x6D7D, 26941 },
+ { 0x6D7E, 27663 },
+ { 0x6D7F, 27690 },
+ { 0x6D80, 27330 },
+ { 0x6D81, 27311 },
+ { 0x6D82, 27320 },
+ { 0x6D83, 27491 },
+ { 0x6D84, 27482 },
+ { 0x6D85, 27532 },
+ { 0x6D86, 27541 },
+ { 0x6D87, 27564 },
+ { 0x6D88, 27573 },
+ { 0x6D89, 28963 },
+ { 0x6D8A, 28972 },
+ { 0x6D8B, 28954 },
+ { 0x6D8C, 29017 },
+ { 0x6D8D, 29044 },
+ { 0x6D8E, 29076 },
+ { 0x6D8F, 29085 },
+ { 0x6D92, 29035 },
+ { 0x6D93, 27102 },
+ { 0x6D94, 27111 },
+ { 0x6D95, 29157 },
+ { 0x6D96, 29147 },
+ { 0x6D97, 29268 },
+ { 0x6D98, 29277 },
+ { 0x6D99, 29258 },
+ { 0x6D9A, 29314 },
+ { 0x6D9B, 29323 },
+ { 0x6D9C, 28330 },
+ { 0x6D9D, 28339 },
+ { 0x6D9E, 26672 },
+ { 0x6D9F, 28038 },
+ { 0x6DA0, 28047 },
+ { 0x6DA1, 28080 },
+ { 0x6DA2, 28089 },
+ { 0x6DA3, 28131 },
+ { 0x6DA4, 28140 },
+ { 0x6DA5, 28856 },
+ { 0x6DA6, 28784 },
+ { 0x6DA7, 28865 },
+ { 0x6DA8, 29522 },
+ { 0x6DA9, 27739 },
+ { 0x6DAA, 29836 },
+ { 0x6DAB, 26737 },
+ { 0x6DAC, 27473 },
+ { 0x6DAD, 27582 },
+ { 0x6DAE, 28210 },
+ { 0x6DAF, 28284 },
+ { 0x6DB0, 28321 },
+ { 0x6DB1, 29108 },
+ { 0x6DB2, 27681 },
+ { 0x6DB3, 29138 },
+ { 0x6DB4, 27672 },
+ { 0x6DB5, 27339 },
+ { 0x6DB6, 26533 },
+ { 0x6DB7, 27256 },
+ { 0x6DB8, 29240 },
+ { 0x6DB9, 29067 },
+ { 0x6DBA, 27509 },
+ { 0x6DBB, 27265 },
+ { 0x6DBC, 27500 },
+ { 0x6DBD, 29231 },
+ { 0x6DBE, 28775 },
+ { 0x6DBF, 27017 },
+ { 0x6DC0, 29026 },
+ { 0x6DC1, 26964 },
+ { 0x6DC2, 26584 },
+ { 0x6DC3, 27274 },
+ { 0x6DC4, 26510 },
+ { 0x6DC5, 27822 },
+ { 0x6DC6, 29513 },
+ { 0x6DC7, 29249 },
+ { 0x6DF0, 29821 },
+ { 0x6DF1, 29375 },
+ { 0x6DF2, 29725 },
+ { 0x6DF3, 29720 },
+ { 0x6DF4, 30191 },
+ { 0x6DF5, 29816 },
+ { 0x6DF6, 30083 },
+ { 0x6DF7, 30078 },
+ { 0x6DF8, 30196 },
+ { 0x6DF9, 29831 },
+ { 0x6DFA, 30206 },
+ { 0x6DFB, 30211 },
+ { 0x6DFC, 9693 },
+ { 0x6DFD, 30201 },
+ { 0x6E00, 66314 },
+ { 0x6E01, 66316 },
+ { 0x6E02, 66318 },
+ { 0x6E03, 66320 },
+ { 0x6E04, 66322 },
+ { 0x6E05, 66324 },
+ { 0x6E06, 66326 },
+ { 0x6E07, 66328 },
+ { 0x6E08, 66330 },
+ { 0x6E09, 66332 },
+ { 0x6E0A, 66334 },
+ { 0x6E0B, 66336 },
+ { 0x6E0C, 66338 },
+ { 0x6E0D, 66340 },
+ { 0x6E0E, 66342 },
+ { 0x6E0F, 66344 },
+ { 0x6E10, 74355 },
+ { 0x6E11, 74464 },
+ { 0x6E12, 74457 },
+ { 0x6E13, 74350 },
+ { 0x6E14, 74440 },
+ { 0x6E15, 74451 },
+ { 0x6E16, 74434 },
+ { 0x6E17, 74299 },
+ { 0x6E18, 74390 },
+ { 0x6E19, 74445 },
+ { 0x6E20, 58207 },
+ { 0x6E21, 58211 },
+ { 0x6E22, 57894 },
+ { 0x6E23, 57899 },
+ { 0x6E24, 57948 },
+ { 0x6E25, 57955 },
+ { 0x6E26, 58290 },
+ { 0x6E30, 74262 },
+ { 0x6E31, 74244 },
+ { 0x6E32, 74250 },
+ { 0x6E33, 74256 },
+ { 0x6E34, 74343 },
+ { 0x6E35, 74337 },
+ { 0x6E36, 74428 },
+ { 0x6E37, 74284 },
+ { 0x6E38, 74375 },
+ { 0x6E39, 74329 },
+ { 0x6E3A, 74420 },
+ { 0x6E3B, 74276 },
+ { 0x6E3C, 74367 },
+ { 0x6E3D, 74314 },
+ { 0x6E3E, 74405 },
+ { 0x6E3F, 74269 },
+ { 0x6E40, 74360 },
+ { 0x6E41, 74307 },
+ { 0x6E42, 74398 },
+ { 0x6E43, 74291 },
+ { 0x6E44, 74382 },
+ { 0x6E45, 35852 },
+ { 0x6E46, 23293 },
+ { 0x6E47, 74322 },
+ { 0x6E48, 74413 },
+ { 0x6E49, 31173 },
+ { 0x6E4A, 66833 },
+ { 0x6E4B, 10082 },
+ { 0x6E4C, 31561 },
+ { 0x6E4D, 31170 },
+ { 0x6E4E, 66830 },
+ { 0x6E4F, 10075 },
+ { 0x6E50, 22507 },
+ { 0x6E51, 22660 },
+ { 0x6E52, 22487 },
+ { 0x6E54, 22652 },
+ { 0x6E55, 22505 },
+ { 0x6E56, 22644 },
+ { 0x6E57, 22657 },
+ { 0x6E58, 22480 },
+ { 0x6E59, 22499 },
+ { 0x6E5A, 22518 },
+ { 0x6E5B, 22490 },
+ { 0x6E5C, 22509 },
+ { 0x6E5D, 22494 },
+ { 0x6E5E, 22513 },
+ { 0x6E5F, 22596 },
+ { 0x6E60, 22647 },
+ { 0x6E61, 22624 },
+ { 0x6E62, 22502 },
+ { 0x6E63, 22666 },
+ { 0x6E64, 22649 },
+ { 0x6E65, 22663 },
+ { 0x6E66, 22593 },
+ { 0x6E68, 22621 },
+ { 0x6E69, 22590 },
+ { 0x6E6A, 22618 },
+ { 0x6E6B, 22654 },
+ { 0x6E70, 26455 },
+ { 0x6E71, 26442 },
+ { 0x6E72, 26449 },
+ { 0x6E73, 23761 },
+ { 0x6E74, 26467 },
+ { 0x6E76, 23797 },
+ { 0x6E77, 23793 },
+ { 0x6E78, 23772 },
+ { 0x6E79, 23768 },
+ { 0x6E7A, 23813 },
+ { 0x6E7B, 23809 },
+ { 0x6E7C, 26418 },
+ { 0x6E7D, 26414 },
+ { 0x6E7E, 23953 },
+ { 0x6E7F, 23949 },
+ { 0x6E80, 26059 },
+ { 0x6E81, 25385 },
+ { 0x6E82, 25377 },
+ { 0x6E83, 25341 },
+ { 0x6E84, 25333 },
+ { 0x6E85, 25111 },
+ { 0x6E86, 25103 },
+ { 0x6E87, 25363 },
+ { 0x6E88, 25355 },
+ { 0x6E89, 25185 },
+ { 0x6E8A, 25161 },
+ { 0x6E8B, 25177 },
+ { 0x6E8C, 25169 },
+ { 0x6E8D, 25448 },
+ { 0x6E8E, 25411 },
+ { 0x6E8F, 24226 },
+ { 0x6E90, 24211 },
+ { 0x6E91, 24221 },
+ { 0x6E92, 24216 },
+ { 0x6E93, 25042 },
+ { 0x6E94, 25036 },
+ { 0x6E95, 25048 },
+ { 0x6E96, 25012 },
+ { 0x6E97, 25022 },
+ { 0x6E98, 25017 },
+ { 0x6E99, 25869 },
+ { 0x6E9A, 25854 },
+ { 0x6E9B, 25864 },
+ { 0x6E9C, 25859 },
+ { 0x6E9D, 25572 },
+ { 0x6E9E, 25557 },
+ { 0x6E9F, 25567 },
+ { 0x6EA0, 25562 },
+ { 0x6EA1, 24540 },
+ { 0x6EA2, 24525 },
+ { 0x6EA3, 24535 },
+ { 0x6EA4, 24530 },
+ { 0x6EA5, 25595 },
+ { 0x6EA6, 25580 },
+ { 0x6EA7, 25590 },
+ { 0x6EA8, 25585 },
+ { 0x6EA9, 24328 },
+ { 0x6EAA, 24323 },
+ { 0x6EAB, 25846 },
+ { 0x6EAC, 25841 },
+ { 0x6EAD, 24924 },
+ { 0x6EAE, 24919 },
+ { 0x6EAF, 25905 },
+ { 0x6EB0, 25900 },
+ { 0x6EB1, 25833 },
+ { 0x6EB2, 25818 },
+ { 0x6EB3, 25828 },
+ { 0x6EB4, 25823 },
+ { 0x6EB5, 26216 },
+ { 0x6EB6, 26201 },
+ { 0x6EB7, 26211 },
+ { 0x6EB8, 26206 },
+ { 0x6EB9, 24961 },
+ { 0x6EBA, 24946 },
+ { 0x6EBB, 24956 },
+ { 0x6EBC, 24951 },
+ { 0x6EBD, 24255 },
+ { 0x6EBE, 24240 },
+ { 0x6EBF, 24250 },
+ { 0x6EC0, 24245 },
+ { 0x6EC1, 24991 },
+ { 0x6EC2, 24976 },
+ { 0x6EC3, 24986 },
+ { 0x6EC4, 24981 },
+ { 0x6EC5, 25305 },
+ { 0x6EC6, 25290 },
+ { 0x6EC7, 25300 },
+ { 0x6EC8, 25295 },
+ { 0x6EC9, 24139 },
+ { 0x6ECA, 24124 },
+ { 0x6ECB, 24134 },
+ { 0x6ECC, 24129 },
+ { 0x6ECD, 26051 },
+ { 0x6ECE, 26036 },
+ { 0x6ECF, 26046 },
+ { 0x6ED0, 26041 },
+ { 0x6ED1, 24400 },
+ { 0x6ED2, 24385 },
+ { 0x6ED3, 24395 },
+ { 0x6ED4, 24390 },
+ { 0x6ED5, 24828 },
+ { 0x6ED6, 24813 },
+ { 0x6ED7, 24823 },
+ { 0x6ED8, 24818 },
+ { 0x6ED9, 24715 },
+ { 0x6EDA, 24700 },
+ { 0x6EDB, 24710 },
+ { 0x6EDC, 24705 },
+ { 0x6EDD, 24769 },
+ { 0x6EDE, 24754 },
+ { 0x6EDF, 24764 },
+ { 0x6EE0, 24759 },
+ { 0x6EE1, 25630 },
+ { 0x6EE2, 25615 },
+ { 0x6EE3, 25625 },
+ { 0x6EE4, 25620 },
+ { 0x6EE5, 25706 },
+ { 0x6EE6, 25675 },
+ { 0x6EE7, 25701 },
+ { 0x6EE8, 25696 },
+ { 0x6EE9, 24626 },
+ { 0x6EEA, 24611 },
+ { 0x6EEB, 24621 },
+ { 0x6EEC, 24616 },
+ { 0x6EED, 25142 },
+ { 0x6EEE, 25137 },
+ { 0x6EEF, 25442 },
+ { 0x6EF0, 25436 },
+ { 0x6EF1, 25282 },
+ { 0x6EF2, 25206 },
+ { 0x6EF3, 25277 },
+ { 0x6EF4, 25272 },
+ { 0x6EF5, 27433 },
+ { 0x6EF6, 27423 },
+ { 0x6EF7, 27393 },
+ { 0x6EF8, 27383 },
+ { 0x6EF9, 27413 },
+ { 0x6EFA, 27403 },
+ { 0x6EFB, 27466 },
+ { 0x6EFC, 27443 },
+ { 0x6EFF, 10095 },
+ { 0x6F01, 63786 },
+ { 0x6F02, 63773 },
+ { 0x6F03, 63749 },
+ { 0x6F04, 63741 },
+ { 0x6F05, 63752 },
+ { 0x6F06, 63768 },
+ { 0x6F07, 63778 },
+ { 0x6F08, 63415 },
+ { 0x6F09, 63733 },
+ { 0x6F0A, 63760 },
+ { 0x6F0B, 63418 },
+ { 0x6F0C, 63423 },
+ { 0x6F0D, 63792 },
+ { 0x6F0E, 63400 },
+ { 0x6F0F, 63758 },
+ { 0x6F10, 63443 },
+ { 0x6F11, 63425 },
+ { 0x6F12, 63431 },
+ { 0x6F13, 63452 },
+ { 0x6F14, 63437 },
+ { 0x6F15, 63434 },
+ { 0x6F16, 63428 },
+ { 0x6F17, 63449 },
+ { 0x6F18, 63446 },
+ { 0x6F19, 63440 },
+ { 0x6F1A, 63421 },
+ { 0x6F1B, 63776 },
+ { 0x6F1C, 63770 },
+ { 0x6F1D, 63744 },
+ { 0x6F1E, 63789 },
+ { 0x6F1F, 63762 },
+ { 0x6F20, 63783 },
+ { 0x6F21, 63588 },
+ { 0x6F22, 63593 },
+ { 0x6F23, 63598 },
+ { 0x6F24, 63603 },
+ { 0x6F25, 63608 },
+ { 0x6F26, 63613 },
+ { 0x6F27, 63618 },
+ { 0x6F28, 63623 },
+ { 0x6F29, 63628 },
+ { 0x6F2A, 63633 },
+ { 0x6F2B, 63638 },
+ { 0x6F2C, 63643 },
+ { 0x6F2D, 63648 },
+ { 0x6F2E, 63653 },
+ { 0x6F2F, 63658 },
+ { 0x6F30, 63663 },
+ { 0x6F31, 63668 },
+ { 0x6F32, 63673 },
+ { 0x6F33, 63678 },
+ { 0x6F34, 63683 },
+ { 0x6F35, 63688 },
+ { 0x6F36, 63693 },
+ { 0x6F37, 63698 },
+ { 0x6F38, 63703 },
+ { 0x6F39, 63708 },
+ { 0x6F3A, 63713 },
+ { 0x6F3B, 63411 },
+ { 0x6F3C, 63755 },
+ { 0x6F3D, 63729 },
+ { 0x6F3E, 63780 },
+ { 0x6F3F, 63385 },
+ { 0x6F40, 63455 },
+ { 0x6F41, 63458 },
+ { 0x6F42, 63463 },
+ { 0x6F43, 63468 },
+ { 0x6F44, 63473 },
+ { 0x6F45, 63478 },
+ { 0x6F46, 63483 },
+ { 0x6F47, 63488 },
+ { 0x6F48, 63493 },
+ { 0x6F49, 63498 },
+ { 0x6F4A, 63503 },
+ { 0x6F4B, 63508 },
+ { 0x6F4C, 63513 },
+ { 0x6F4D, 63518 },
+ { 0x6F4E, 63523 },
+ { 0x6F4F, 63528 },
+ { 0x6F50, 63533 },
+ { 0x6F51, 63538 },
+ { 0x6F52, 63543 },
+ { 0x6F53, 63548 },
+ { 0x6F54, 63553 },
+ { 0x6F55, 63558 },
+ { 0x6F56, 63563 },
+ { 0x6F57, 63568 },
+ { 0x6F58, 63573 },
+ { 0x6F59, 63578 },
+ { 0x6F5A, 63583 },
+ { 0x6F5B, 63403 },
+ { 0x6F5C, 63765 },
+ { 0x6F5D, 63721 },
+ { 0x6F5E, 63736 },
+ { 0x6F5F, 63407 },
+ { 0x6F60, 63725 },
+ { 0x6F61, 64276 },
+ { 0x6F62, 63796 },
+ { 0x6F63, 63807 },
+ { 0x6F64, 64280 },
+ { 0x6F65, 64253 },
+ { 0x6F66, 64192 },
+ { 0x6F67, 64208 },
+ { 0x6F68, 64218 },
+ { 0x6F69, 64228 },
+ { 0x6F6A, 64213 },
+ { 0x6F6B, 64223 },
+ { 0x6F6C, 64238 },
+ { 0x6F6D, 64248 },
+ { 0x6F6E, 64243 },
+ { 0x6F6F, 64233 },
+ { 0x6F70, 64283 },
+ { 0x6F71, 64024 },
+ { 0x6F72, 64032 },
+ { 0x6F73, 64044 },
+ { 0x6F74, 64028 },
+ { 0x6F75, 64040 },
+ { 0x6F76, 64068 },
+ { 0x6F77, 64076 },
+ { 0x6F78, 64084 },
+ { 0x6F79, 64072 },
+ { 0x6F7A, 64080 },
+ { 0x6F7B, 64148 },
+ { 0x6F7C, 64156 },
+ { 0x6F7D, 64164 },
+ { 0x6F7E, 64152 },
+ { 0x6F7F, 64160 },
+ { 0x6F80, 64168 },
+ { 0x6F81, 64176 },
+ { 0x6F82, 64184 },
+ { 0x6F83, 64172 },
+ { 0x6F84, 64180 },
+ { 0x6F85, 64108 },
+ { 0x6F86, 64116 },
+ { 0x6F87, 64124 },
+ { 0x6F88, 64112 },
+ { 0x6F89, 64120 },
+ { 0x6F8A, 64048 },
+ { 0x6F8B, 64056 },
+ { 0x6F8C, 64064 },
+ { 0x6F8D, 64052 },
+ { 0x6F8E, 64060 },
+ { 0x6F8F, 64088 },
+ { 0x6F90, 64096 },
+ { 0x6F91, 64104 },
+ { 0x6F92, 64092 },
+ { 0x6F93, 64100 },
+ { 0x6F94, 64196 },
+ { 0x6F95, 64204 },
+ { 0x6F96, 64200 },
+ { 0x6F97, 64128 },
+ { 0x6F98, 64136 },
+ { 0x6F99, 64144 },
+ { 0x6F9A, 64132 },
+ { 0x6F9B, 64140 },
+ { 0x6F9C, 64188 },
+ { 0x6F9D, 64036 },
+ { 0x6F9E, 64257 },
+ { 0x6F9F, 64262 },
+ { 0x6FA0, 63814 },
+ { 0x6FA1, 63933 },
+ { 0x6FA2, 64001 },
+ { 0x6FA3, 63977 },
+ { 0x6FA4, 63921 },
+ { 0x6FA5, 63981 },
+ { 0x6FA6, 63985 },
+ { 0x6FA7, 63937 },
+ { 0x6FA8, 64005 },
+ { 0x6FA9, 63929 },
+ { 0x6FAA, 64009 },
+ { 0x6FAB, 63993 },
+ { 0x6FAC, 63997 },
+ { 0x6FAD, 63965 },
+ { 0x6FAE, 64017 },
+ { 0x6FAF, 64013 },
+ { 0x6FB0, 63989 },
+ { 0x6FB1, 63917 },
+ { 0x6FB2, 63925 },
+ { 0x6FB3, 63973 },
+ { 0x6FB4, 63961 },
+ { 0x6FB5, 63901 },
+ { 0x6FB6, 63957 },
+ { 0x6FB7, 63913 },
+ { 0x6FB8, 63905 },
+ { 0x6FB9, 63969 },
+ { 0x6FBA, 63941 },
+ { 0x6FBB, 63945 },
+ { 0x6FBC, 63953 },
+ { 0x6FBD, 63949 },
+ { 0x6FBE, 63909 },
+ { 0x6FC2, 63817 },
+ { 0x6FC3, 63837 },
+ { 0x6FC4, 63865 },
+ { 0x6FC5, 63893 },
+ { 0x6FC6, 63841 },
+ { 0x6FC7, 63821 },
+ { 0x6FCA, 63897 },
+ { 0x6FCB, 63869 },
+ { 0x6FCC, 63829 },
+ { 0x6FCD, 63853 },
+ { 0x6FCE, 63885 },
+ { 0x6FCF, 63849 },
+ { 0x6FD2, 63877 },
+ { 0x6FD3, 63833 },
+ { 0x6FD4, 63889 },
+ { 0x6FD5, 63857 },
+ { 0x6FD6, 63861 },
+ { 0x6FD7, 63881 },
+ { 0x6FDA, 63845 },
+ { 0x6FDB, 63873 },
+ { 0x6FDC, 63825 },
+ { 0x6FE0, 63397 },
+ { 0x6FE1, 63718 },
+ { 0x6FE2, 63388 },
+ { 0x6FE3, 63747 },
+ { 0x6FE4, 63738 },
+ { 0x6FE5, 63394 },
+ { 0x6FE6, 63391 },
+ { 0x6FE8, 63803 },
+ { 0x6FE9, 64270 },
+ { 0x6FEA, 64021 },
+ { 0x6FEB, 64273 },
+ { 0x6FEC, 64267 },
+ { 0x6FED, 63800 },
+ { 0x6FEE, 63811 },
+ { 0x6FF9, 69249 },
+ { 0x6FFA, 69252 },
+ { 0x6FFB, 69255 },
+ { 0x6FFC, 35637 },
+ { 0x6FFD, 69276 },
+ { 0x7000, 35010 },
+ { 0x7001, 35135 },
+ { 0x7002, 35095 },
+ { 0x7003, 35235 },
+ { 0x7004, 35020 },
+ { 0x7005, 34975 },
+ { 0x7006, 35170 },
+ { 0x7007, 35005 },
+ { 0x7008, 35040 },
+ { 0x7009, 35190 },
+ { 0x700A, 35215 },
+ { 0x700B, 35175 },
+ { 0x700D, 35125 },
+ { 0x700E, 35245 },
+ { 0x700F, 35305 },
+ { 0x7010, 35165 },
+ { 0x7011, 35255 },
+ { 0x7012, 35270 },
+ { 0x7013, 35320 },
+ { 0x7014, 35315 },
+ { 0x7015, 35035 },
+ { 0x7016, 35285 },
+ { 0x7017, 35045 },
+ { 0x7018, 35070 },
+ { 0x7019, 35000 },
+ { 0x701A, 35075 },
+ { 0x701B, 35105 },
+ { 0x701C, 35195 },
+ { 0x701D, 35210 },
+ { 0x701E, 34985 },
+ { 0x701F, 35280 },
+ { 0x7020, 35140 },
+ { 0x7021, 35025 },
+ { 0x7022, 35185 },
+ { 0x7023, 35050 },
+ { 0x7024, 35310 },
+ { 0x7025, 35065 },
+ { 0x7026, 35115 },
+ { 0x7028, 35230 },
+ { 0x7029, 35090 },
+ { 0x702A, 35200 },
+ { 0x702B, 34980 },
+ { 0x702C, 35085 },
+ { 0x702D, 35110 },
+ { 0x702E, 35015 },
+ { 0x702F, 35150 },
+ { 0x7030, 35030 },
+ { 0x7031, 35220 },
+ { 0x7032, 35225 },
+ { 0x7033, 34990 },
+ { 0x7034, 35130 },
+ { 0x7035, 34995 },
+ { 0x7036, 35265 },
+ { 0x7037, 35205 },
+ { 0x7038, 35295 },
+ { 0x7039, 35145 },
+ { 0x703A, 35155 },
+ { 0x703C, 35055 },
+ { 0x703D, 35290 },
+ { 0x703F, 35060 },
+ { 0x7040, 35080 },
+ { 0x7041, 35160 },
+ { 0x7042, 35325 },
+ { 0x7043, 35275 },
+ { 0x7044, 35335 },
+ { 0x7045, 35180 },
+ { 0x7046, 35100 },
+ { 0x7047, 35240 },
+ { 0x7048, 35300 },
+ { 0x7049, 35120 },
+ { 0x704A, 35260 },
+ { 0x704B, 35250 },
+ { 0x704C, 35330 },
+ { 0x704D, 35340 },
+ { 0x7050, 34349 },
+ { 0x7051, 34353 },
+ { 0x7052, 34357 },
+ { 0x7053, 34361 },
+ { 0x7054, 34365 },
+ { 0x7055, 34369 },
+ { 0x7056, 34373 },
+ { 0x7057, 34377 },
+ { 0x7058, 34381 },
+ { 0x7059, 34385 },
+ { 0x705A, 34389 },
+ { 0x705B, 34393 },
+ { 0x705C, 34397 },
+ { 0x705D, 34401 },
+ { 0x7080, 34405 },
+ { 0x7081, 34410 },
+ { 0x7082, 34415 },
+ { 0x7083, 34420 },
+ { 0x7084, 34750 },
+ { 0x7085, 34755 },
+ { 0x7086, 34760 },
+ { 0x7087, 34765 },
+ { 0x7088, 34770 },
+ { 0x7089, 34775 },
+ { 0x708A, 34780 },
+ { 0x708B, 34785 },
+ { 0x708C, 34790 },
+ { 0x708D, 34795 },
+ { 0x708E, 34425 },
+ { 0x708F, 34430 },
+ { 0x7090, 34435 },
+ { 0x7091, 34440 },
+ { 0x7092, 34445 },
+ { 0x7093, 34945 },
+ { 0x7094, 34950 },
+ { 0x7095, 34450 },
+ { 0x7096, 34455 },
+ { 0x7097, 34460 },
+ { 0x7098, 34955 },
+ { 0x7099, 34960 },
+ { 0x709A, 34464 },
+ { 0x709B, 34469 },
+ { 0x709C, 34474 },
+ { 0x709D, 34478 },
+ { 0x709E, 34483 },
+ { 0x709F, 34487 },
+ { 0x70A0, 34491 },
+ { 0x70A1, 34496 },
+ { 0x70A2, 34500 },
+ { 0x70A3, 34504 },
+ { 0x70A4, 34965 },
+ { 0x70A5, 34508 },
+ { 0x70A6, 34512 },
+ { 0x70A7, 34516 },
+ { 0x70A8, 34521 },
+ { 0x70A9, 34525 },
+ { 0x70AA, 34529 },
+ { 0x70AB, 34534 },
+ { 0x70AC, 34539 },
+ { 0x70AD, 34543 },
+ { 0x70AE, 34547 },
+ { 0x70AF, 34551 },
+ { 0x70B0, 34555 },
+ { 0x70B1, 34559 },
+ { 0x70B2, 34563 },
+ { 0x70B3, 34567 },
+ { 0x70B4, 34571 },
+ { 0x70B5, 34575 },
+ { 0x70B6, 34580 },
+ { 0x70B7, 34584 },
+ { 0x70B8, 34589 },
+ { 0x70B9, 34593 },
+ { 0x70BA, 34597 },
+ { 0x70BB, 34601 },
+ { 0x70BC, 34605 },
+ { 0x70BD, 34609 },
+ { 0x70BE, 34613 },
+ { 0x70BF, 34617 },
+ { 0x70C0, 34621 },
+ { 0x70C1, 34625 },
+ { 0x70C2, 34629 },
+ { 0x70C3, 34633 },
+ { 0x70C4, 34638 },
+ { 0x70C5, 34643 },
+ { 0x70C6, 34648 },
+ { 0x70C7, 34653 },
+ { 0x70C8, 34658 },
+ { 0x70C9, 34662 },
+ { 0x70CA, 34667 },
+ { 0x70CB, 34671 },
+ { 0x70CC, 34675 },
+ { 0x70CD, 34681 },
+ { 0x70CE, 34686 },
+ { 0x70CF, 34692 },
+ { 0x70D0, 34697 },
+ { 0x70D1, 34701 },
+ { 0x70D2, 34970 },
+ { 0x70D3, 34705 },
+ { 0x70D4, 34709 },
+ { 0x70D5, 34713 },
+ { 0x70D6, 34717 },
+ { 0x70D7, 34721 },
+ { 0x70D8, 34725 },
+ { 0x70D9, 34730 },
+ { 0x70DA, 34734 },
+ { 0x70DB, 34738 },
+ { 0x70DC, 34742 },
+ { 0x70DD, 34746 },
+ { 0x70DE, 34800 },
+ { 0x70DF, 34805 },
+ { 0x70E0, 34810 },
+ { 0x70E1, 34815 },
+ { 0x70E2, 34820 },
+ { 0x70E3, 34825 },
+ { 0x70E4, 34830 },
+ { 0x70E5, 34835 },
+ { 0x70E6, 34840 },
+ { 0x70E7, 34845 },
+ { 0x70E8, 34850 },
+ { 0x70E9, 34855 },
+ { 0x70EA, 34860 },
+ { 0x70EB, 34865 },
+ { 0x70EC, 34870 },
+ { 0x70ED, 34875 },
+ { 0x70EE, 34880 },
+ { 0x70EF, 34885 },
+ { 0x70F0, 34890 },
+ { 0x70F1, 34895 },
+ { 0x70F2, 34900 },
+ { 0x70F3, 34905 },
+ { 0x70F4, 34910 },
+ { 0x70F5, 34915 },
+ { 0x70F6, 34920 },
+ { 0x70F7, 34925 },
+ { 0x70F8, 34930 },
+ { 0x70F9, 34935 },
+ { 0x70FA, 34940 },
+ { 0x7100, 23485 },
+ { 0x7101, 23481 },
+ { 0x7102, 23489 },
+ { 0x7107, 23497 },
+ { 0x7108, 23526 },
+ { 0x7109, 23613 },
+ { 0x710A, 23548 },
+ { 0x710B, 23537 },
+ { 0x710C, 23508 },
+ { 0x710D, 23595 },
+ { 0x710E, 23570 },
+ { 0x710F, 23559 },
+ { 0x7110, 23519 },
+ { 0x7111, 23645 },
+ { 0x7112, 23638 },
+ { 0x7113, 23588 },
+ { 0x7114, 23581 },
+ { 0x7115, 23606 },
+ { 0x7116, 23652 },
+ { 0x7117, 23624 },
+ { 0x7118, 23631 },
+ { 0x7119, 23500 },
+ { 0x711A, 23529 },
+ { 0x711B, 23616 },
+ { 0x711C, 23551 },
+ { 0x711D, 23540 },
+ { 0x711E, 23511 },
+ { 0x711F, 23598 },
+ { 0x7120, 23573 },
+ { 0x7121, 23562 },
+ { 0x7122, 23504 },
+ { 0x7123, 23533 },
+ { 0x7124, 23620 },
+ { 0x7125, 23555 },
+ { 0x7126, 23544 },
+ { 0x7127, 23515 },
+ { 0x7128, 23602 },
+ { 0x7129, 23577 },
+ { 0x712A, 23566 },
+ { 0x712B, 23522 },
+ { 0x712C, 23648 },
+ { 0x712D, 23641 },
+ { 0x712E, 23591 },
+ { 0x712F, 23584 },
+ { 0x7130, 23609 },
+ { 0x7131, 23655 },
+ { 0x7132, 23627 },
+ { 0x7133, 23634 },
+ { 0x7137, 23659 },
+ { 0x7138, 23663 },
+ { 0x7139, 23675 },
+ { 0x713A, 23667 },
+ { 0x713B, 23671 },
+ { 0x713C, 23476 },
+ { 0x713D, 23492 },
+ { 0x713E, 23683 },
+ { 0x713F, 23679 },
+ { 0x7140, 13133 },
+ { 0x7141, 13111 },
+ { 0x7142, 13116 },
+ { 0x7143, 13171 },
+ { 0x7144, 13213 },
+ { 0x7145, 13175 },
+ { 0x7146, 13202 },
+ { 0x7147, 13227 },
+ { 0x7148, 13197 },
+ { 0x7149, 13160 },
+ { 0x714A, 13222 },
+ { 0x714B, 13127 },
+ { 0x714C, 13186 },
+ { 0x714D, 13144 },
+ { 0x714E, 13207 },
+ { 0x714F, 13192 },
+ { 0x7150, 13155 },
+ { 0x7151, 13217 },
+ { 0x7152, 13121 },
+ { 0x7153, 13180 },
+ { 0x7154, 13138 },
+ { 0x7155, 13165 },
+ { 0x7156, 13232 },
+ { 0x7157, 13150 },
+ { 0x7158, 13248 },
+ { 0x7159, 13263 },
+ { 0x715A, 13331 },
+ { 0x715B, 13317 },
+ { 0x715C, 13281 },
+ { 0x715D, 13253 },
+ { 0x715E, 13321 },
+ { 0x715F, 13353 },
+ { 0x7160, 13343 },
+ { 0x7161, 13347 },
+ { 0x7162, 13335 },
+ { 0x7163, 13313 },
+ { 0x7164, 13277 },
+ { 0x7165, 13304 },
+ { 0x7166, 13362 },
+ { 0x7167, 13366 },
+ { 0x7168, 13339 },
+ { 0x7169, 13295 },
+ { 0x716A, 13267 },
+ { 0x716B, 13299 },
+ { 0x716C, 13326 },
+ { 0x716D, 13357 },
+ { 0x716E, 13285 },
+ { 0x716F, 13308 },
+ { 0x7170, 13238 },
+ { 0x7171, 13272 },
+ { 0x7172, 13290 },
+ { 0x7173, 13243 },
+ { 0x7174, 13258 },
+ { 0x7175, 10649 },
+ { 0x7176, 10653 },
+ { 0x7177, 10674 },
+ { 0x7178, 11894 },
+ { 0x7179, 10694 },
+ { 0x717A, 12082 },
+ { 0x717B, 13022 },
+ { 0x717C, 10689 },
+ { 0x717D, 10670 },
+ { 0x717E, 11890 },
+ { 0x717F, 10685 },
+ { 0x7180, 10681 },
+ { 0x7181, 13056 },
+ { 0x7182, 13027 },
+ { 0x7183, 10717 },
+ { 0x7184, 12079 },
+ { 0x7185, 12085 },
+ { 0x7186, 12021 },
+ { 0x7187, 12018 },
+ { 0x7188, 12024 },
+ { 0x7189, 13067 },
+ { 0x718A, 10697 },
+ { 0x7190, 22109 },
+ { 0x7191, 22013 },
+ { 0x7192, 22121 },
+ { 0x7193, 22112 },
+ { 0x7194, 22016 },
+ { 0x7195, 22115 },
+ { 0x7196, 22118 },
+ { 0x7197, 22130 },
+ { 0x7198, 22133 },
+ { 0x7199, 22127 },
+ { 0x719A, 22010 },
+ { 0x719B, 22124 },
+ { 0x71D0, 55326 },
+ { 0x71D1, 55265 },
+ { 0x71D2, 55306 },
+ { 0x71D3, 55278 },
+ { 0x71D4, 55211 },
+ { 0x71D5, 55245 },
+ { 0x71D6, 55261 },
+ { 0x71D7, 55294 },
+ { 0x71D8, 55237 },
+ { 0x71D9, 55202 },
+ { 0x71DA, 55145 },
+ { 0x71DB, 55270 },
+ { 0x71DC, 55165 },
+ { 0x71DD, 55298 },
+ { 0x71DE, 55282 },
+ { 0x71DF, 55161 },
+ { 0x71E0, 55153 },
+ { 0x71E1, 55311 },
+ { 0x71E2, 55315 },
+ { 0x71E3, 55253 },
+ { 0x71E4, 55169 },
+ { 0x71E5, 55228 },
+ { 0x71E6, 55249 },
+ { 0x71E7, 55274 },
+ { 0x71E8, 55189 },
+ { 0x71E9, 55181 },
+ { 0x71EA, 55177 },
+ { 0x71EB, 55206 },
+ { 0x71EC, 55149 },
+ { 0x71ED, 55157 },
+ { 0x71EE, 55215 },
+ { 0x71EF, 55173 },
+ { 0x71F0, 55241 },
+ { 0x71F1, 55141 },
+ { 0x71F2, 55223 },
+ { 0x71F3, 55193 },
+ { 0x71F4, 55286 },
+ { 0x71F5, 55290 },
+ { 0x71F6, 55185 },
+ { 0x71F7, 55136 },
+ { 0x71F8, 55219 },
+ { 0x71F9, 55257 },
+ { 0x71FA, 55302 },
+ { 0x71FB, 55232 },
+ { 0x71FC, 55197 },
+ { 0x71FD, 55320 },
+ { 0x7280, 35345 },
+ { 0x7281, 35354 },
+ { 0x7282, 35348 },
+ { 0x7283, 35411 },
+ { 0x7284, 35357 },
+ { 0x7285, 35351 },
+ { 0x7286, 35363 },
+ { 0x7287, 35399 },
+ { 0x7288, 35405 },
+ { 0x7289, 35426 },
+ { 0x728A, 35366 },
+ { 0x728B, 35369 },
+ { 0x728C, 35384 },
+ { 0x728D, 35372 },
+ { 0x728E, 35375 },
+ { 0x728F, 35378 },
+ { 0x7290, 35420 },
+ { 0x7291, 35423 },
+ { 0x7292, 35396 },
+ { 0x7293, 35381 },
+ { 0x7294, 35417 },
+ { 0x7295, 35387 },
+ { 0x7296, 35390 },
+ { 0x7297, 35393 },
+ { 0x7298, 35429 },
+ { 0x7299, 35408 },
+ { 0x729A, 35414 },
+ { 0x729B, 35360 },
+ { 0x729C, 35402 },
+ { 0x72A0, 30318 },
+ { 0x72A1, 30405 },
+ { 0x72A2, 30324 },
+ { 0x72A3, 30339 },
+ { 0x72A4, 30447 },
+ { 0x72A5, 30357 },
+ { 0x72A6, 30390 },
+ { 0x72A7, 30372 },
+ { 0x72A8, 30354 },
+ { 0x72A9, 30321 },
+ { 0x72AA, 30342 },
+ { 0x72AB, 30348 },
+ { 0x72AC, 30375 },
+ { 0x72AD, 30363 },
+ { 0x72AE, 30411 },
+ { 0x72AF, 30438 },
+ { 0x72B0, 30360 },
+ { 0x72B1, 30450 },
+ { 0x72B2, 30366 },
+ { 0x72B3, 30402 },
+ { 0x72B4, 30369 },
+ { 0x72B5, 30345 },
+ { 0x72B6, 30444 },
+ { 0x72B7, 30351 },
+ { 0x72B8, 30414 },
+ { 0x72B9, 30333 },
+ { 0x72BA, 30327 },
+ { 0x72BB, 30462 },
+ { 0x72BC, 30336 },
+ { 0x72BD, 30387 },
+ { 0x72BE, 30396 },
+ { 0x72BF, 30423 },
+ { 0x72C0, 30330 },
+ { 0x72C1, 30381 },
+ { 0x72C2, 30417 },
+ { 0x72C3, 30441 },
+ { 0x72C4, 30399 },
+ { 0x72C5, 30384 },
+ { 0x72C6, 30453 },
+ { 0x72C7, 30420 },
+ { 0x72C8, 30456 },
+ { 0x72C9, 30408 },
+ { 0x72CA, 30393 },
+ { 0x72CB, 30429 },
+ { 0x72CC, 30432 },
+ { 0x72CD, 30435 },
+ { 0x72CE, 30426 },
+ { 0x72CF, 30378 },
+ { 0x72D0, 30459 },
+ { 0x7300, 6815 },
+ { 0x7301, 6835 },
+ { 0x7302, 6879 },
+ { 0x7303, 6839 },
+ { 0x7304, 6819 },
+ { 0x7305, 6899 },
+ { 0x7306, 6903 },
+ { 0x7307, 6867 },
+ { 0x7308, 6935 },
+ { 0x7309, 6823 },
+ { 0x730A, 6875 },
+ { 0x730B, 6847 },
+ { 0x730C, 6851 },
+ { 0x730D, 6855 },
+ { 0x730E, 6919 },
+ { 0x730F, 6827 },
+ { 0x7310, 6887 },
+ { 0x7311, 6931 },
+ { 0x7312, 6883 },
+ { 0x7313, 6859 },
+ { 0x7314, 6863 },
+ { 0x7315, 6891 },
+ { 0x7316, 6831 },
+ { 0x7317, 6911 },
+ { 0x7318, 6927 },
+ { 0x7319, 6923 },
+ { 0x731A, 6843 },
+ { 0x731B, 6915 },
+ { 0x731C, 6907 },
+ { 0x731D, 6871 },
+ { 0x731E, 6895 },
+ { 0x7320, 6939 },
+ { 0x7321, 6947 },
+ { 0x7322, 6943 },
+ { 0x7323, 6951 },
+ { 0x7330, 31802 },
+ { 0x7331, 31869 },
+ { 0x7332, 31808 },
+ { 0x7333, 31805 },
+ { 0x7334, 31857 },
+ { 0x7335, 31875 },
+ { 0x7336, 31814 },
+ { 0x7337, 31811 },
+ { 0x7338, 31866 },
+ { 0x7339, 31796 },
+ { 0x733A, 31833 },
+ { 0x733B, 31836 },
+ { 0x733C, 31839 },
+ { 0x733D, 31860 },
+ { 0x733E, 31799 },
+ { 0x733F, 31821 },
+ { 0x7340, 31872 },
+ { 0x7341, 31863 },
+ { 0x7342, 31845 },
+ { 0x7343, 31848 },
+ { 0x7344, 31851 },
+ { 0x7345, 31854 },
+ { 0x7346, 31824 },
+ { 0x7347, 31830 },
+ { 0x7348, 31827 },
+ { 0x7349, 31842 },
+ { 0x734A, 31817 },
+ { 0x7380, 55959 },
+ { 0x7381, 55962 },
+ { 0x7382, 55986 },
+ { 0x7383, 55941 },
+ { 0x7384, 55983 },
+ { 0x7385, 55920 },
+ { 0x7386, 55929 },
+ { 0x7387, 55980 },
+ { 0x7388, 55968 },
+ { 0x7389, 55953 },
+ { 0x738A, 55956 },
+ { 0x738B, 55938 },
+ { 0x738C, 55977 },
+ { 0x738D, 55992 },
+ { 0x738E, 55944 },
+ { 0x738F, 55965 },
+ { 0x7390, 55947 },
+ { 0x7391, 55932 },
+ { 0x7392, 55998 },
+ { 0x7393, 55935 },
+ { 0x7394, 55923 },
+ { 0x7395, 55974 },
+ { 0x7396, 55971 },
+ { 0x7397, 55995 },
+ { 0x7398, 56001 },
+ { 0x7399, 55989 },
+ { 0x739A, 55926 },
+ { 0x739B, 55914 },
+ { 0x739C, 55917 },
+ { 0x739D, 55950 },
+ { 0x739F, 55911 },
+ { 0x73A0, 6955 },
+ { 0x73A1, 6959 },
+ { 0x73A2, 6963 },
+ { 0x73A3, 7011 },
+ { 0x73A4, 7015 },
+ { 0x73A5, 6991 },
+ { 0x73A6, 6995 },
+ { 0x73A7, 7075 },
+ { 0x73A8, 6971 },
+ { 0x73A9, 7003 },
+ { 0x73AA, 7007 },
+ { 0x73AB, 7059 },
+ { 0x73AC, 7063 },
+ { 0x73AD, 6975 },
+ { 0x73AE, 6979 },
+ { 0x73AF, 6983 },
+ { 0x73B0, 7095 },
+ { 0x73B1, 7043 },
+ { 0x73B2, 6967 },
+ { 0x73B3, 6987 },
+ { 0x73B4, 7035 },
+ { 0x73B5, 7039 },
+ { 0x73B6, 7023 },
+ { 0x73B7, 7027 },
+ { 0x73B8, 7031 },
+ { 0x73B9, 7079 },
+ { 0x73BA, 7067 },
+ { 0x73BB, 7071 },
+ { 0x73BC, 7047 },
+ { 0x73BD, 7051 },
+ { 0x73BE, 7019 },
+ { 0x73BF, 7055 },
+ { 0x73C0, 7083 },
+ { 0x73C1, 7087 },
+ { 0x73C2, 7091 },
+ { 0x73C3, 6999 },
+ { 0x73C8, 7111 },
+ { 0x73C9, 7119 },
+ { 0x73CA, 7123 },
+ { 0x73CB, 7127 },
+ { 0x73CC, 7107 },
+ { 0x73CD, 7115 },
+ { 0x73CE, 7099 },
+ { 0x73CF, 7103 },
+ { 0x73D0, 7131 },
+ { 0x73D1, 7135 },
+ { 0x73D2, 7143 },
+ { 0x73D3, 7139 },
+ { 0x73D4, 7147 },
+ { 0x73D5, 7151 },
+ { 0x7400, 40249 },
+ { 0x7401, 40244 },
+ { 0x7402, 40239 },
+ { 0x7403, 40259 },
+ { 0x7404, 40254 },
+ { 0x7405, 40264 },
+ { 0x7406, 40287 },
+ { 0x7407, 40282 },
+ { 0x7408, 40277 },
+ { 0x7409, 40297 },
+ { 0x740A, 40292 },
+ { 0x740B, 40302 },
+ { 0x740C, 40139 },
+ { 0x740D, 40175 },
+ { 0x740E, 40179 },
+ { 0x740F, 40227 },
+ { 0x7410, 40135 },
+ { 0x7411, 40215 },
+ { 0x7412, 40183 },
+ { 0x7413, 40219 },
+ { 0x7414, 40187 },
+ { 0x7415, 40235 },
+ { 0x7416, 40207 },
+ { 0x7417, 40211 },
+ { 0x7418, 40203 },
+ { 0x7419, 40143 },
+ { 0x741A, 40223 },
+ { 0x741B, 40199 },
+ { 0x741C, 40269 },
+ { 0x741D, 40163 },
+ { 0x741E, 40231 },
+ { 0x741F, 40195 },
+ { 0x7420, 40273 },
+ { 0x7421, 40159 },
+ { 0x7422, 40147 },
+ { 0x7423, 40151 },
+ { 0x7424, 40155 },
+ { 0x7425, 40191 },
+ { 0x7426, 40171 },
+ { 0x7427, 40167 },
+ { 0x7428, 40077 },
+ { 0x7429, 40072 },
+ { 0x742A, 40067 },
+ { 0x742B, 40087 },
+ { 0x742C, 40082 },
+ { 0x742D, 40092 },
+ { 0x742E, 40115 },
+ { 0x742F, 40110 },
+ { 0x7430, 40105 },
+ { 0x7431, 40125 },
+ { 0x7432, 40120 },
+ { 0x7433, 40130 },
+ { 0x7434, 39967 },
+ { 0x7435, 40003 },
+ { 0x7436, 40007 },
+ { 0x7437, 40055 },
+ { 0x7438, 39963 },
+ { 0x7439, 40043 },
+ { 0x743A, 40011 },
+ { 0x743B, 40047 },
+ { 0x743C, 40015 },
+ { 0x743D, 40063 },
+ { 0x743E, 40035 },
+ { 0x743F, 40039 },
+ { 0x7440, 40031 },
+ { 0x7441, 39971 },
+ { 0x7442, 40051 },
+ { 0x7443, 40027 },
+ { 0x7444, 40097 },
+ { 0x7445, 39991 },
+ { 0x7446, 40059 },
+ { 0x7447, 40023 },
+ { 0x7448, 40101 },
+ { 0x7449, 39987 },
+ { 0x744A, 39975 },
+ { 0x744B, 39979 },
+ { 0x744C, 39983 },
+ { 0x744D, 40019 },
+ { 0x744E, 39999 },
+ { 0x744F, 39995 },
+ { 0x7450, 43139 },
+ { 0x7451, 43103 },
+ { 0x7452, 43127 },
+ { 0x7453, 43079 },
+ { 0x7454, 43163 },
+ { 0x7455, 43040 },
+ { 0x7456, 43145 },
+ { 0x7457, 43166 },
+ { 0x7458, 43112 },
+ { 0x7459, 43124 },
+ { 0x745A, 43064 },
+ { 0x745B, 43121 },
+ { 0x745C, 43082 },
+ { 0x745D, 43106 },
+ { 0x745E, 43148 },
+ { 0x745F, 43118 },
+ { 0x7460, 43169 },
+ { 0x7461, 43160 },
+ { 0x7462, 43109 },
+ { 0x7463, 43157 },
+ { 0x7464, 43130 },
+ { 0x7465, 43133 },
+ { 0x7466, 43031 },
+ { 0x7467, 43073 },
+ { 0x7468, 43058 },
+ { 0x7469, 43046 },
+ { 0x746A, 43034 },
+ { 0x746B, 43151 },
+ { 0x746C, 43100 },
+ { 0x746D, 43028 },
+ { 0x746E, 43142 },
+ { 0x746F, 43091 },
+ { 0x7470, 43070 },
+ { 0x7471, 43049 },
+ { 0x7472, 43088 },
+ { 0x7473, 43043 },
+ { 0x7474, 43094 },
+ { 0x7475, 43136 },
+ { 0x7476, 43097 },
+ { 0x7477, 43061 },
+ { 0x7478, 43055 },
+ { 0x7479, 43037 },
+ { 0x747A, 43052 },
+ { 0x747B, 43076 },
+ { 0x747C, 43154 },
+ { 0x747D, 43067 },
+ { 0x747E, 43085 },
+ { 0x747F, 43115 },
+ { 0x7480, 42944 },
+ { 0x7481, 42899 },
+ { 0x7482, 42926 },
+ { 0x7483, 42914 },
+ { 0x7484, 42929 },
+ { 0x7485, 42938 },
+ { 0x7486, 42950 },
+ { 0x7487, 42920 },
+ { 0x7488, 42923 },
+ { 0x7489, 42968 },
+ { 0x748A, 42935 },
+ { 0x748B, 42947 },
+ { 0x748C, 42908 },
+ { 0x748D, 42905 },
+ { 0x748E, 42965 },
+ { 0x748F, 42953 },
+ { 0x7490, 42956 },
+ { 0x7491, 42959 },
+ { 0x7492, 42962 },
+ { 0x7493, 42941 },
+ { 0x7494, 42911 },
+ { 0x7495, 42932 },
+ { 0x7496, 42881 },
+ { 0x7497, 42884 },
+ { 0x7498, 42887 },
+ { 0x7499, 42890 },
+ { 0x749A, 42893 },
+ { 0x749B, 42896 },
+ { 0x749C, 42902 },
+ { 0x749D, 42917 },
+ { 0x74A0, 42869 },
+ { 0x74A1, 42851 },
+ { 0x74A2, 42857 },
+ { 0x74A3, 42878 },
+ { 0x74A4, 42863 },
+ { 0x74A5, 42860 },
+ { 0x74A6, 42854 },
+ { 0x74A7, 42875 },
+ { 0x74A8, 42872 },
+ { 0x74A9, 42866 },
+ { 0x7800, 39794 },
+ { 0x7801, 39797 },
+ { 0x7802, 39800 },
+ { 0x7803, 39803 },
+ { 0x7804, 39806 },
+ { 0x7805, 39809 },
+ { 0x7808, 39812 },
+ { 0x780A, 39815 },
+ { 0x780B, 39818 },
+ { 0x780C, 39821 },
+ { 0x780D, 39824 },
+ { 0x780E, 39827 },
+ { 0x780F, 39830 },
+ { 0x7810, 39833 },
+ { 0x7811, 39836 },
+ { 0x7812, 39839 },
+ { 0x7813, 39842 },
+ { 0x7814, 39845 },
+ { 0x7815, 39848 },
+ { 0x7816, 39851 },
+ { 0x7817, 39854 },
+ { 0x7818, 39857 },
+ { 0x7819, 39860 },
+ { 0x781A, 39863 },
+ { 0x781B, 39866 },
+ { 0x781C, 39869 },
+ { 0x781D, 39872 },
+ { 0x781E, 39875 },
+ { 0x781F, 39878 },
+ { 0x7820, 39881 },
+ { 0x7821, 39884 },
+ { 0x7822, 39887 },
+ { 0x7823, 39890 },
+ { 0x7824, 39893 },
+ { 0x7825, 39896 },
+ { 0x7826, 39899 },
+ { 0x7827, 39902 },
+ { 0x7828, 39905 },
+ { 0x7829, 39908 },
+ { 0x782A, 39911 },
+ { 0x782B, 39914 },
+ { 0x782C, 39917 },
+ { 0x782D, 39920 },
+ { 0x782E, 39923 },
+ { 0x782F, 39926 },
+ { 0x7830, 39929 },
+ { 0x7831, 39932 },
+ { 0x7832, 39935 },
+ { 0x7833, 39938 },
+ { 0x7834, 39941 },
+ { 0x7835, 39944 },
+ { 0x7837, 39947 },
+ { 0x7838, 39950 },
+ { 0x783C, 39953 },
+ { 0x783F, 39956 },
+ { 0x7900, 67899 },
+ { 0x7901, 67902 },
+ { 0x7902, 67938 },
+ { 0x7903, 67935 },
+ { 0x7904, 67890 },
+ { 0x7905, 67926 },
+ { 0x7906, 67932 },
+ { 0x7907, 67905 },
+ { 0x7908, 67923 },
+ { 0x7909, 67929 },
+ { 0x790A, 67908 },
+ { 0x790B, 67941 },
+ { 0x790C, 67911 },
+ { 0x790D, 67914 },
+ { 0x790E, 67950 },
+ { 0x790F, 67896 },
+ { 0x7910, 67893 },
+ { 0x7911, 67947 },
+ { 0x7912, 67917 },
+ { 0x7913, 67944 },
+ { 0x7914, 67953 },
+ { 0x7915, 67920 },
+ { 0x7916, 67956 },
+ { 0x7917, 67963 },
+ { 0x7918, 67966 },
+ { 0x7919, 67959 },
+ { 0x791F, 67887 },
+ { 0x7920, 35432 },
+ { 0x7921, 35435 },
+ { 0x7922, 35450 },
+ { 0x7923, 35441 },
+ { 0x7924, 35444 },
+ { 0x7925, 35486 },
+ { 0x7926, 35453 },
+ { 0x7927, 35489 },
+ { 0x7928, 35456 },
+ { 0x7929, 35459 },
+ { 0x792A, 35462 },
+ { 0x792B, 35465 },
+ { 0x792C, 35468 },
+ { 0x792D, 35474 },
+ { 0x792E, 35504 },
+ { 0x792F, 35480 },
+ { 0x7930, 35483 },
+ { 0x7931, 35447 },
+ { 0x7932, 35471 },
+ { 0x7933, 35477 },
+ { 0x7934, 35507 },
+ { 0x7935, 35492 },
+ { 0x7936, 35495 },
+ { 0x7937, 35498 },
+ { 0x7938, 35501 },
+ { 0x7939, 35438 },
+ { 0x793F, 35510 },
+ { 0x7A00, 67726 },
+ { 0x7A01, 67705 },
+ { 0x7A02, 67713 },
+ { 0x7A03, 67717 },
+ { 0x7A05, 67701 },
+ { 0x7A06, 67709 },
+ { 0x7A0C, 67722 },
+ { 0x7A0D, 67678 },
+ { 0x7A0E, 67686 },
+ { 0x7A0F, 67683 },
+ { 0x7A10, 67747 },
+ { 0x7A11, 67795 },
+ { 0x7A12, 67738 },
+ { 0x7A13, 67792 },
+ { 0x7A15, 67732 },
+ { 0x7A16, 67783 },
+ { 0x7A17, 67744 },
+ { 0x7A19, 67804 },
+ { 0x7A1A, 67819 },
+ { 0x7A1B, 67825 },
+ { 0x7A1C, 67786 },
+ { 0x7A1D, 67822 },
+ { 0x7A1E, 67801 },
+ { 0x7A1F, 67768 },
+ { 0x7A20, 67816 },
+ { 0x7A21, 67735 },
+ { 0x7A22, 67789 },
+ { 0x7A23, 67756 },
+ { 0x7A24, 67759 },
+ { 0x7A25, 67807 },
+ { 0x7A26, 67729 },
+ { 0x7A27, 67780 },
+ { 0x7A28, 67753 },
+ { 0x7A29, 67774 },
+ { 0x7A2A, 67762 },
+ { 0x7A2B, 67750 },
+ { 0x7A2C, 67771 },
+ { 0x7A2D, 67810 },
+ { 0x7A2E, 67813 },
+ { 0x7A2F, 67765 },
+ { 0x7A30, 67777 },
+ { 0x7A31, 67741 },
+ { 0x7A32, 67798 },
+ { 0x7A33, 67828 },
+ { 0x7A38, 67667 },
+ { 0x7A39, 67675 },
+ { 0x7A3A, 67671 },
+ { 0x7A3F, 67845 },
+ { 0x7A40, 67689 },
+ { 0x7A41, 67692 },
+ { 0x7A42, 67698 },
+ { 0x7A43, 67695 },
+ { 0x7A44, 67839 },
+ { 0x7A45, 67842 },
+ { 0x7A46, 67831 },
+ { 0x7A47, 67835 },
+ { 0x7A50, 67847 },
+ { 0x7A51, 67859 },
+ { 0x7A52, 67863 },
+ { 0x7A53, 67870 },
+ { 0x7A54, 67874 },
+ { 0x7A55, 67856 },
+ { 0x7A56, 67850 },
+ { 0x7A57, 67866 },
+ { 0x7A58, 67853 },
+ { 0x8000, 58351 },
+ { 0x8001, 58354 },
+ { 0x8002, 58364 },
+ { 0x8003, 58379 },
+ { 0x8004, 58359 },
+ { 0x8005, 58369 },
+ { 0x8006, 58390 },
+ { 0x8007, 58385 },
+ { 0x8008, 58374 },
+ { 0x8009, 58460 },
+ { 0x800A, 58463 },
+ { 0x800B, 58495 },
+ { 0x800C, 58500 },
+ { 0x800D, 58484 },
+ { 0x800E, 58506 },
+ { 0x800F, 58479 },
+ { 0x8010, 58489 },
+ { 0x8011, 58512 },
+ { 0x8012, 58517 },
+ { 0x8013, 58522 },
+ { 0x8014, 58470 },
+ { 0x8015, 58466 },
+ { 0x8016, 59529 },
+ { 0x8017, 59555 },
+ { 0x8018, 59539 },
+ { 0x8019, 59532 },
+ { 0x801A, 59545 },
+ { 0x801B, 59550 },
+ { 0x801C, 58527 },
+ { 0x801D, 58530 },
+ { 0x801E, 58533 },
+ { 0x801F, 58538 },
+ { 0x8020, 58545 },
+ { 0x8021, 58548 },
+ { 0x8022, 58573 },
+ { 0x8023, 58578 },
+ { 0x8024, 58553 },
+ { 0x8025, 58583 },
+ { 0x8026, 58558 },
+ { 0x8027, 58563 },
+ { 0x8028, 58568 },
+ { 0x8029, 61180 },
+ { 0x802A, 61793 },
+ { 0x802B, 61183 },
+ { 0x802C, 61186 },
+ { 0x802D, 58588 },
+ { 0x802E, 58591 },
+ { 0x802F, 58611 },
+ { 0x8030, 58602 },
+ { 0x8031, 58596 },
+ { 0x8032, 61796 },
+ { 0x8033, 61191 },
+ { 0x8034, 61194 },
+ { 0x8035, 61197 },
+ { 0x8036, 61799 },
+ { 0x8037, 61802 },
+ { 0x8038, 59560 },
+ { 0x8039, 59600 },
+ { 0x803A, 59563 },
+ { 0x803B, 59588 },
+ { 0x803C, 59568 },
+ { 0x803D, 59575 },
+ { 0x803E, 61202 },
+ { 0x803F, 62374 },
+ { 0x8040, 58616 },
+ { 0x8041, 59605 },
+ { 0x8042, 61205 },
+ { 0x8043, 62377 },
+ { 0x8044, 59608 },
+ { 0x8045, 59611 },
+ { 0x8046, 61805 },
+ { 0x8047, 59616 },
+ { 0x8048, 61808 },
+ { 0x8049, 58619 },
+ { 0x804A, 58622 },
+ { 0x804B, 58627 },
+ { 0x804C, 58632 },
+ { 0x804D, 58638 },
+ { 0x804E, 58641 },
+ { 0x804F, 58647 },
+ { 0x8050, 58653 },
+ { 0x8051, 61811 },
+ { 0x8052, 61814 },
+ { 0x8053, 59619 },
+ { 0x8054, 61208 },
+ { 0x8055, 58658 },
+ { 0x8056, 59622 },
+ { 0x8057, 59625 },
+ { 0x8058, 59751 },
+ { 0x8059, 59769 },
+ { 0x805A, 59633 },
+ { 0x805B, 59639 },
+ { 0x805C, 59645 },
+ { 0x805D, 59653 },
+ { 0x805E, 59757 },
+ { 0x805F, 59719 },
+ { 0x8060, 59659 },
+ { 0x8061, 59665 },
+ { 0x8062, 59671 },
+ { 0x8063, 59725 },
+ { 0x8064, 59679 },
+ { 0x8065, 59685 },
+ { 0x8066, 59691 },
+ { 0x8067, 59731 },
+ { 0x8068, 59699 },
+ { 0x8069, 59737 },
+ { 0x806A, 59705 },
+ { 0x806B, 59763 },
+ { 0x806C, 59711 },
+ { 0x806D, 59745 },
+ { 0x806E, 59775 },
+ { 0x806F, 59778 },
+ { 0x8070, 61819 },
+ { 0x8071, 61822 },
+ { 0x8072, 58661 },
+ { 0x8073, 59781 },
+ { 0x8074, 59784 },
+ { 0x8075, 59787 },
+ { 0x8076, 61211 },
+ { 0x8077, 59792 },
+ { 0x8078, 59795 },
+ { 0x8079, 61214 },
+ { 0x807A, 58664 },
+ { 0x807B, 58671 },
+ { 0x807C, 58667 },
+ { 0x807D, 58676 },
+ { 0x807E, 59802 },
+ { 0x807F, 59805 },
+ { 0x8080, 61217 },
+ { 0x8081, 59810 },
+ { 0x8082, 61825 },
+ { 0x8083, 59813 },
+ { 0x8084, 59816 },
+ { 0x8085, 61220 },
+ { 0x8086, 61223 },
+ { 0x8087, 61227 },
+ { 0x8088, 61232 },
+ { 0x8089, 61235 },
+ { 0x808A, 58396 },
+ { 0x808B, 58407 },
+ { 0x808C, 58399 },
+ { 0x808D, 58680 },
+ { 0x808E, 58683 },
+ { 0x808F, 58702 },
+ { 0x8090, 58697 },
+ { 0x8091, 58707 },
+ { 0x8092, 58712 },
+ { 0x8093, 58692 },
+ { 0x8094, 61238 },
+ { 0x8095, 61241 },
+ { 0x8096, 58717 },
+ { 0x8097, 58720 },
+ { 0x8098, 58728 },
+ { 0x8099, 58733 },
+ { 0x809A, 58723 },
+ { 0x809B, 58743 },
+ { 0x809C, 58748 },
+ { 0x809D, 58739 },
+ { 0x809E, 61244 },
+ { 0x809F, 61828 },
+ { 0x80A0, 61247 },
+ { 0x80A1, 61250 },
+ { 0x80A2, 61253 },
+ { 0x80A3, 61258 },
+ { 0x80A4, 61265 },
+ { 0x80A5, 61274 },
+ { 0x80A6, 61315 },
+ { 0x80A7, 61338 },
+ { 0x80A8, 61344 },
+ { 0x80A9, 61279 },
+ { 0x80AA, 61284 },
+ { 0x80AB, 61320 },
+ { 0x80AC, 61351 },
+ { 0x80AD, 61356 },
+ { 0x80AE, 61326 },
+ { 0x80AF, 61290 },
+ { 0x80B0, 61331 },
+ { 0x80B1, 61295 },
+ { 0x80B2, 61300 },
+ { 0x80B3, 61305 },
+ { 0x80B4, 61310 },
+ { 0x80B5, 58753 },
+ { 0x80B6, 58756 },
+ { 0x80B7, 59819 },
+ { 0x80B8, 59827 },
+ { 0x80B9, 59836 },
+ { 0x80BA, 59843 },
+ { 0x80BB, 59950 },
+ { 0x80BC, 59855 },
+ { 0x80BD, 59958 },
+ { 0x80BE, 60106 },
+ { 0x80BF, 59963 },
+ { 0x80C0, 59968 },
+ { 0x80C1, 59975 },
+ { 0x80C2, 59980 },
+ { 0x80C3, 59860 },
+ { 0x80C4, 59865 },
+ { 0x80C5, 59987 },
+ { 0x80C6, 59994 },
+ { 0x80C7, 59870 },
+ { 0x80C8, 59875 },
+ { 0x80C9, 59882 },
+ { 0x80CA, 59887 },
+ { 0x80CB, 60113 },
+ { 0x80CC, 59999 },
+ { 0x80CD, 59895 },
+ { 0x80CE, 60004 },
+ { 0x80CF, 60009 },
+ { 0x80D0, 60119 },
+ { 0x80D1, 59900 },
+ { 0x80D2, 60016 },
+ { 0x80D3, 60021 },
+ { 0x80D4, 59909 },
+ { 0x80D5, 60126 },
+ { 0x80D6, 60028 },
+ { 0x80D7, 60034 },
+ { 0x80D8, 60043 },
+ { 0x80D9, 60141 },
+ { 0x80DA, 60048 },
+ { 0x80DB, 60053 },
+ { 0x80DC, 60060 },
+ { 0x80DD, 59916 },
+ { 0x80DE, 59921 },
+ { 0x80DF, 59928 },
+ { 0x80E0, 60067 },
+ { 0x80E1, 60072 },
+ { 0x80E2, 59933 },
+ { 0x80E3, 60079 },
+ { 0x80E4, 60084 },
+ { 0x80E5, 60089 },
+ { 0x80E6, 60094 },
+ { 0x80E7, 60131 },
+ { 0x80E8, 60101 },
+ { 0x80E9, 60136 },
+ { 0x80EA, 59850 },
+ { 0x80EB, 59938 },
+ { 0x80EC, 59943 },
+ { 0x80ED, 59822 },
+ { 0x80EE, 61362 },
+ { 0x80EF, 61365 },
+ { 0x80F0, 60146 },
+ { 0x80F1, 60149 },
+ { 0x80F2, 60157 },
+ { 0x80F3, 60160 },
+ { 0x80F4, 61831 },
+ { 0x80F5, 60169 },
+ { 0x80F6, 60172 },
+ { 0x80F7, 61370 },
+ { 0x80F8, 61378 },
+ { 0x80F9, 61373 },
+ { 0x80FA, 61382 },
+ { 0x80FB, 60175 },
+ { 0x80FC, 61387 },
+ { 0x80FD, 62380 },
+ { 0x80FE, 62539 },
+ { 0x80FF, 62542 },
+ { 0x8100, 58760 },
+ { 0x8101, 58763 },
+ { 0x8102, 58768 },
+ { 0x8103, 58773 },
+ { 0x8104, 60178 },
+ { 0x8105, 60181 },
+ { 0x8106, 60186 },
+ { 0x8107, 61834 },
+ { 0x8108, 61390 },
+ { 0x8109, 61393 },
+ { 0x810A, 61397 },
+ { 0x810B, 61400 },
+ { 0x810C, 61424 },
+ { 0x810D, 61419 },
+ { 0x810E, 61407 },
+ { 0x810F, 61414 },
+ { 0x8110, 61837 },
+ { 0x8111, 61430 },
+ { 0x8112, 61447 },
+ { 0x8113, 61437 },
+ { 0x8114, 61442 },
+ { 0x8115, 61433 },
+ { 0x8116, 58778 },
+ { 0x8117, 58781 },
+ { 0x8118, 60191 },
+ { 0x8119, 60198 },
+ { 0x811A, 60203 },
+ { 0x811B, 60211 },
+ { 0x811C, 60216 },
+ { 0x811D, 60194 },
+ { 0x811E, 60223 },
+ { 0x811F, 60232 },
+ { 0x8120, 60239 },
+ { 0x8121, 60226 },
+ { 0x8122, 60244 },
+ { 0x8123, 60247 },
+ { 0x8124, 60250 },
+ { 0x8125, 60255 },
+ { 0x8126, 61452 },
+ { 0x8127, 61840 },
+ { 0x8128, 62383 },
+ { 0x8129, 58786 },
+ { 0x812A, 58793 },
+ { 0x812B, 58789 },
+ { 0x812C, 60258 },
+ { 0x812D, 58797 },
+ { 0x812E, 58805 },
+ { 0x812F, 58835 },
+ { 0x8130, 58810 },
+ { 0x8131, 58840 },
+ { 0x8132, 58815 },
+ { 0x8133, 58820 },
+ { 0x8134, 58825 },
+ { 0x8135, 58830 },
+ { 0x8136, 58800 },
+ { 0x8137, 58845 },
+ { 0x8138, 61455 },
+ { 0x8139, 61458 },
+ { 0x813A, 61468 },
+ { 0x813B, 61478 },
+ { 0x813C, 61473 },
+ { 0x813D, 61463 },
+ { 0x813E, 61483 },
+ { 0x813F, 58412 },
+ { 0x8140, 58415 },
+ { 0x8141, 58848 },
+ { 0x8142, 61486 },
+ { 0x8143, 61489 },
+ { 0x8144, 61495 },
+ { 0x8145, 58851 },
+ { 0x8146, 60261 },
+ { 0x8147, 60268 },
+ { 0x8148, 60264 },
+ { 0x8149, 60276 },
+ { 0x814A, 60272 },
+ { 0x814B, 58854 },
+ { 0x814C, 58857 },
+ { 0x814D, 60287 },
+ { 0x814E, 58863 },
+ { 0x814F, 58866 },
+ { 0x8150, 58875 },
+ { 0x8151, 58880 },
+ { 0x8152, 58871 },
+ { 0x8153, 61501 },
+ { 0x8154, 58885 },
+ { 0x8155, 58888 },
+ { 0x8156, 60290 },
+ { 0x8157, 58891 },
+ { 0x8158, 58894 },
+ { 0x8159, 58904 },
+ { 0x815A, 58909 },
+ { 0x815B, 59113 },
+ { 0x815C, 59029 },
+ { 0x815D, 59165 },
+ { 0x815E, 59034 },
+ { 0x815F, 58916 },
+ { 0x8160, 59170 },
+ { 0x8161, 59118 },
+ { 0x8162, 58921 },
+ { 0x8163, 59039 },
+ { 0x8164, 59123 },
+ { 0x8165, 59044 },
+ { 0x8166, 59049 },
+ { 0x8167, 58926 },
+ { 0x8168, 59129 },
+ { 0x8169, 59134 },
+ { 0x816A, 59141 },
+ { 0x816B, 58931 },
+ { 0x816C, 59148 },
+ { 0x816D, 59058 },
+ { 0x816E, 58936 },
+ { 0x816F, 59063 },
+ { 0x8170, 58941 },
+ { 0x8171, 59068 },
+ { 0x8172, 58946 },
+ { 0x8173, 58951 },
+ { 0x8174, 58956 },
+ { 0x8175, 58961 },
+ { 0x8176, 58968 },
+ { 0x8177, 58975 },
+ { 0x8178, 58982 },
+ { 0x8179, 58987 },
+ { 0x817A, 58994 },
+ { 0x817B, 59073 },
+ { 0x817C, 58999 },
+ { 0x817D, 59004 },
+ { 0x817E, 59009 },
+ { 0x817F, 59078 },
+ { 0x8180, 59083 },
+ { 0x8181, 59088 },
+ { 0x8182, 59153 },
+ { 0x8183, 59093 },
+ { 0x8184, 59098 },
+ { 0x8185, 59175 },
+ { 0x8186, 59103 },
+ { 0x8187, 58899 },
+ { 0x8188, 59014 },
+ { 0x8189, 59019 },
+ { 0x818A, 59158 },
+ { 0x818B, 59108 },
+ { 0x818C, 59024 },
+ { 0x818D, 60293 },
+ { 0x818E, 60296 },
+ { 0x818F, 60301 },
+ { 0x8190, 61504 },
+ { 0x8191, 61507 },
+ { 0x8192, 61510 },
+ { 0x8193, 61513 },
+ { 0x8194, 61516 },
+ { 0x8195, 60304 },
+ { 0x8196, 60307 },
+ { 0x8197, 60313 },
+ { 0x8198, 60316 },
+ { 0x8199, 60321 },
+ { 0x819A, 61521 },
+ { 0x819B, 61524 },
+ { 0x819C, 62386 },
+ { 0x819D, 62401 },
+ { 0x819E, 62389 },
+ { 0x819F, 61843 },
+ { 0x81A0, 59180 },
+ { 0x81A1, 59193 },
+ { 0x81A2, 59183 },
+ { 0x81A3, 59188 },
+ { 0x81A4, 60326 },
+ { 0x81A5, 60329 },
+ { 0x81A6, 61846 },
+ { 0x81A7, 61527 },
+ { 0x81A8, 62411 },
+ { 0x81A9, 62414 },
+ { 0x81AA, 59198 },
+ { 0x81AB, 59201 },
+ { 0x81AC, 60332 },
+ { 0x81AD, 60335 },
+ { 0x81AE, 60338 },
+ { 0x81AF, 60343 },
+ { 0x81B0, 60346 },
+ { 0x81B1, 60349 },
+ { 0x81B2, 60353 },
+ { 0x81B3, 60356 },
+ { 0x81B4, 60359 },
+ { 0x81B5, 62419 },
+ { 0x81B6, 62422 },
+ { 0x81B7, 59213 },
+ { 0x81B8, 61849 },
+ { 0x81B9, 61852 },
+ { 0x81BA, 61857 },
+ { 0x81BB, 61866 },
+ { 0x81BC, 61873 },
+ { 0x81BD, 61901 },
+ { 0x81BE, 61906 },
+ { 0x81BF, 62007 },
+ { 0x81C0, 62014 },
+ { 0x81C1, 61911 },
+ { 0x81C2, 62019 },
+ { 0x81C3, 61916 },
+ { 0x81C4, 61921 },
+ { 0x81C5, 62024 },
+ { 0x81C6, 62029 },
+ { 0x81C7, 62034 },
+ { 0x81C8, 61926 },
+ { 0x81C9, 62041 },
+ { 0x81CA, 61931 },
+ { 0x81CB, 62046 },
+ { 0x81CC, 61938 },
+ { 0x81CD, 61943 },
+ { 0x81CE, 61950 },
+ { 0x81CF, 61957 },
+ { 0x81D0, 62052 },
+ { 0x81D1, 62057 },
+ { 0x81D2, 62062 },
+ { 0x81D3, 62067 },
+ { 0x81D4, 62130 },
+ { 0x81D5, 62103 },
+ { 0x81D6, 61962 },
+ { 0x81D7, 62076 },
+ { 0x81D8, 61967 },
+ { 0x81D9, 61972 },
+ { 0x81DA, 62108 },
+ { 0x81DB, 61979 },
+ { 0x81DC, 62081 },
+ { 0x81DD, 62135 },
+ { 0x81DE, 62144 },
+ { 0x81DF, 62113 },
+ { 0x81E0, 62118 },
+ { 0x81E1, 62088 },
+ { 0x81E2, 62093 },
+ { 0x81E3, 62125 },
+ { 0x81E4, 61984 },
+ { 0x81E5, 61880 },
+ { 0x81E6, 61885 },
+ { 0x81E7, 61892 },
+ { 0x81E8, 61995 },
+ { 0x81E9, 62002 },
+ { 0x81EA, 62098 },
+ { 0x81EB, 62152 },
+ { 0x81EC, 62156 },
+ { 0x81ED, 62171 },
+ { 0x81EE, 62176 },
+ { 0x81EF, 62159 },
+ { 0x81F0, 62163 },
+ { 0x81F1, 62425 },
+ { 0x81F2, 60364 },
+ { 0x81F3, 60367 },
+ { 0x81F4, 60372 },
+ { 0x81F5, 60375 },
+ { 0x81F6, 60380 },
+ { 0x81F7, 59216 },
+ { 0x81F8, 60387 },
+ { 0x81F9, 62428 },
+ { 0x81FA, 61530 },
+ { 0x81FB, 59219 },
+ { 0x81FC, 59222 },
+ { 0x81FD, 60390 },
+ { 0x81FE, 60397 },
+ { 0x81FF, 60450 },
+ { 0x8200, 60455 },
+ { 0x8201, 60460 },
+ { 0x8202, 60466 },
+ { 0x8203, 60402 },
+ { 0x8204, 60409 },
+ { 0x8205, 60472 },
+ { 0x8206, 60477 },
+ { 0x8207, 60482 },
+ { 0x8208, 60414 },
+ { 0x8209, 60419 },
+ { 0x820A, 60501 },
+ { 0x820B, 60426 },
+ { 0x820C, 60433 },
+ { 0x820D, 60438 },
+ { 0x820E, 60443 },
+ { 0x820F, 60489 },
+ { 0x8210, 60496 },
+ { 0x8211, 60393 },
+ { 0x8212, 60514 },
+ { 0x8213, 60519 },
+ { 0x8214, 60510 },
+ { 0x8215, 60506 },
+ { 0x8216, 60524 },
+ { 0x8217, 62183 },
+ { 0x8218, 62186 },
+ { 0x8219, 62195 },
+ { 0x821A, 62191 },
+ { 0x821B, 60527 },
+ { 0x821C, 60530 },
+ { 0x821D, 60533 },
+ { 0x821E, 60536 },
+ { 0x821F, 60541 },
+ { 0x8220, 59227 },
+ { 0x8221, 59234 },
+ { 0x8222, 59230 },
+ { 0x8223, 60549 },
+ { 0x8224, 60552 },
+ { 0x8225, 60555 },
+ { 0x8226, 61533 },
+ { 0x8227, 62200 },
+ { 0x8228, 59239 },
+ { 0x8229, 60558 },
+ { 0x822A, 59242 },
+ { 0x822B, 60561 },
+ { 0x822C, 59245 },
+ { 0x822D, 59248 },
+ { 0x822E, 60564 },
+ { 0x822F, 60567 },
+ { 0x8230, 62431 },
+ { 0x8231, 62434 },
+ { 0x8232, 61536 },
+ { 0x8233, 61553 },
+ { 0x8234, 61563 },
+ { 0x8235, 61558 },
+ { 0x8236, 61539 },
+ { 0x8237, 61544 },
+ { 0x8238, 61568 },
+ { 0x8239, 62203 },
+ { 0x823A, 62210 },
+ { 0x823B, 62215 },
+ { 0x823C, 62222 },
+ { 0x823D, 62206 },
+ { 0x823E, 59253 },
+ { 0x823F, 60571 },
+ { 0x8240, 61573 },
+ { 0x8241, 61582 },
+ { 0x8242, 61576 },
+ { 0x8243, 61586 },
+ { 0x8244, 62227 },
+ { 0x8245, 60577 },
+ { 0x8246, 60574 },
+ { 0x8247, 61591 },
+ { 0x8248, 59256 },
+ { 0x8249, 59259 },
+ { 0x824A, 59264 },
+ { 0x824B, 59269 },
+ { 0x824C, 59273 },
+ { 0x824D, 59276 },
+ { 0x824E, 60581 },
+ { 0x824F, 60584 },
+ { 0x8250, 60595 },
+ { 0x8251, 60587 },
+ { 0x8252, 62437 },
+ { 0x8253, 62440 },
+ { 0x8254, 62465 },
+ { 0x8255, 62470 },
+ { 0x8256, 62477 },
+ { 0x8257, 62445 },
+ { 0x8258, 62453 },
+ { 0x8259, 62482 },
+ { 0x825A, 62487 },
+ { 0x825B, 62492 },
+ { 0x825C, 62500 },
+ { 0x825D, 62507 },
+ { 0x825E, 62458 },
+ { 0x825F, 62516 },
+ { 0x8260, 62230 },
+ { 0x8261, 59281 },
+ { 0x8262, 61594 },
+ { 0x8263, 60601 },
+ { 0x8264, 60613 },
+ { 0x8265, 60642 },
+ { 0x8266, 60619 },
+ { 0x8267, 60625 },
+ { 0x8268, 60636 },
+ { 0x8269, 60609 },
+ { 0x826A, 60604 },
+ { 0x826B, 60648 },
+ { 0x826C, 60653 },
+ { 0x826D, 62233 },
+ { 0x826E, 62291 },
+ { 0x826F, 62236 },
+ { 0x8270, 62260 },
+ { 0x8271, 62266 },
+ { 0x8272, 62272 },
+ { 0x8273, 62279 },
+ { 0x8274, 62242 },
+ { 0x8275, 62248 },
+ { 0x8276, 62285 },
+ { 0x8277, 62254 },
+ { 0x8278, 62297 },
+ { 0x8279, 62303 },
+ { 0x827A, 59284 },
+ { 0x827B, 60661 },
+ { 0x827C, 60664 },
+ { 0x827D, 60667 },
+ { 0x827E, 62310 },
+ { 0x827F, 59287 },
+ { 0x8280, 59290 },
+ { 0x8281, 59310 },
+ { 0x8282, 59315 },
+ { 0x8283, 59320 },
+ { 0x8284, 59295 },
+ { 0x8285, 59300 },
+ { 0x8286, 59325 },
+ { 0x8287, 59305 },
+ { 0x8288, 59330 },
+ { 0x8289, 59335 },
+ { 0x828A, 62313 },
+ { 0x828B, 62326 },
+ { 0x828C, 62316 },
+ { 0x828D, 62321 },
+ { 0x828E, 62331 },
+ { 0x828F, 59340 },
+ { 0x8290, 60670 },
+ { 0x8291, 59343 },
+ { 0x8292, 59346 },
+ { 0x8293, 59349 },
+ { 0x8294, 60770 },
+ { 0x8295, 60673 },
+ { 0x8296, 60685 },
+ { 0x8297, 60690 },
+ { 0x8298, 60725 },
+ { 0x8299, 60695 },
+ { 0x829A, 60730 },
+ { 0x829B, 60735 },
+ { 0x829C, 60740 },
+ { 0x829D, 60700 },
+ { 0x829E, 60745 },
+ { 0x829F, 60750 },
+ { 0x82A0, 60765 },
+ { 0x82A1, 60755 },
+ { 0x82A2, 60705 },
+ { 0x82A3, 60710 },
+ { 0x82A4, 60715 },
+ { 0x82A5, 60720 },
+ { 0x82A6, 60760 },
+ { 0x82A7, 60680 },
+ { 0x82A8, 60676 },
+ { 0x82A9, 60774 },
+ { 0x82AA, 60777 },
+ { 0x82AB, 62521 },
+ { 0x82AC, 60783 },
+ { 0x82AD, 60786 },
+ { 0x82AE, 61597 },
+ { 0x82AF, 61600 },
+ { 0x82B0, 61622 },
+ { 0x82B1, 61632 },
+ { 0x82B2, 61617 },
+ { 0x82B3, 61637 },
+ { 0x82B4, 61627 },
+ { 0x82B5, 61605 },
+ { 0x82B6, 61610 },
+ { 0x82B7, 61642 },
+ { 0x82B8, 62336 },
+ { 0x82B9, 62339 },
+ { 0x82BA, 60789 },
+ { 0x82BB, 60792 },
+ { 0x82BC, 60796 },
+ { 0x82BD, 60807 },
+ { 0x82BE, 62342 },
+ { 0x82BF, 61645 },
+ { 0x82C0, 62345 },
+ { 0x82C1, 62524 },
+ { 0x82C2, 62547 },
+ { 0x82C3, 61648 },
+ { 0x82C4, 61651 },
+ { 0x82C5, 61656 },
+ { 0x82C6, 61661 },
+ { 0x82C7, 61664 },
+ { 0x82C8, 61669 },
+ { 0x82C9, 61710 },
+ { 0x82CA, 61674 },
+ { 0x82CB, 61679 },
+ { 0x82CC, 61684 },
+ { 0x82CD, 61689 },
+ { 0x82CE, 61715 },
+ { 0x82CF, 61695 },
+ { 0x82D0, 61700 },
+ { 0x82D1, 61705 },
+ { 0x82D2, 62527 },
+ { 0x82D3, 61720 },
+ { 0x82D4, 61731 },
+ { 0x82D5, 61723 },
+ { 0x82D6, 62348 },
+ { 0x82D7, 60818 },
+ { 0x82D8, 60821 },
+ { 0x82D9, 61735 },
+ { 0x82DA, 62530 },
+ { 0x82DB, 59352 },
+ { 0x82DC, 59355 },
+ { 0x82DD, 60827 },
+ { 0x82DE, 61738 },
+ { 0x82DF, 61741 },
+ { 0x82E0, 61747 },
+ { 0x82E1, 62351 },
+ { 0x82E2, 59359 },
+ { 0x82E3, 59362 },
+ { 0x82E4, 60830 },
+ { 0x82E5, 61750 },
+ { 0x82E6, 62354 },
+ { 0x82E7, 60833 },
+ { 0x82E8, 62533 },
+ { 0x82E9, 60836 },
+ { 0x82EA, 61753 },
+ { 0x82EB, 59367 },
+ { 0x82EC, 59384 },
+ { 0x82ED, 59374 },
+ { 0x82EE, 59379 },
+ { 0x82EF, 59370 },
+ { 0x82F0, 60839 },
+ { 0x82F1, 60842 },
+ { 0x82F2, 60853 },
+ { 0x82F3, 60857 },
+ { 0x82F4, 60860 },
+ { 0x82F5, 60870 },
+ { 0x82F6, 60875 },
+ { 0x82F7, 60880 },
+ { 0x82F8, 60885 },
+ { 0x82F9, 60865 },
+ { 0x82FA, 61756 },
+ { 0x82FB, 60890 },
+ { 0x82FC, 59388 },
+ { 0x82FD, 59391 },
+ { 0x82FE, 59395 },
+ { 0x82FF, 59398 },
+ { 0x8300, 60893 },
+ { 0x8301, 60896 },
+ { 0x8302, 60915 },
+ { 0x8303, 60899 },
+ { 0x8304, 60904 },
+ { 0x8305, 59402 },
+ { 0x8306, 61759 },
+ { 0x8307, 60920 },
+ { 0x8308, 60923 },
+ { 0x8309, 60926 },
+ { 0x830A, 60929 },
+ { 0x830B, 58419 },
+ { 0x830C, 58427 },
+ { 0x830D, 58422 },
+ { 0x830E, 58441 },
+ { 0x830F, 58452 },
+ { 0x8310, 58431 },
+ { 0x8311, 59405 },
+ { 0x8312, 59408 },
+ { 0x8313, 59411 },
+ { 0x8314, 59447 },
+ { 0x8315, 59442 },
+ { 0x8316, 59437 },
+ { 0x8317, 59418 },
+ { 0x8318, 59427 },
+ { 0x8319, 59414 },
+ { 0x831A, 59451 },
+ { 0x831B, 59455 },
+ { 0x831C, 61762 },
+ { 0x831D, 59461 },
+ { 0x831E, 59481 },
+ { 0x831F, 59469 },
+ { 0x8320, 59476 },
+ { 0x8321, 59464 },
+ { 0x8322, 62357 },
+ { 0x8323, 61765 },
+ { 0x8324, 61773 },
+ { 0x8325, 61768 },
+ { 0x8326, 59486 },
+ { 0x8327, 59489 },
+ { 0x8328, 59493 },
+ { 0x8329, 59500 },
+ { 0x832A, 59496 },
+ { 0x832B, 60937 },
+ { 0x832C, 60940 },
+ { 0x832D, 60947 },
+ { 0x832E, 60954 },
+ { 0x832F, 60959 },
+ { 0x8330, 60983 },
+ { 0x8331, 60964 },
+ { 0x8332, 60976 },
+ { 0x8333, 60969 },
+ { 0x8334, 60988 },
+ { 0x8335, 60991 },
+ { 0x8336, 61778 },
+ { 0x8337, 60994 },
+ { 0x8338, 60997 },
+ { 0x8339, 61110 },
+ { 0x833A, 61049 },
+ { 0x833B, 61054 },
+ { 0x833C, 61009 },
+ { 0x833D, 61059 },
+ { 0x833E, 61094 },
+ { 0x833F, 61064 },
+ { 0x8340, 61014 },
+ { 0x8341, 61019 },
+ { 0x8342, 61069 },
+ { 0x8343, 61024 },
+ { 0x8344, 61074 },
+ { 0x8345, 61029 },
+ { 0x8346, 61079 },
+ { 0x8347, 61084 },
+ { 0x8348, 61034 },
+ { 0x8349, 61089 },
+ { 0x834A, 61100 },
+ { 0x834B, 61039 },
+ { 0x834C, 61002 },
+ { 0x834D, 61044 },
+ { 0x834E, 61105 },
+ { 0x834F, 62360 },
+ { 0x8350, 62363 },
+ { 0x8351, 61115 },
+ { 0x8352, 61118 },
+ { 0x8353, 61123 },
+ { 0x8354, 61128 },
+ { 0x8355, 61133 },
+ { 0x8356, 61784 },
+ { 0x8357, 61781 },
+ { 0x8358, 62536 },
+ { 0x8359, 62368 },
+ { 0x835A, 61138 },
+ { 0x835B, 61141 },
+ { 0x835C, 61146 },
+ { 0x835D, 59505 },
+ { 0x835E, 59508 },
+ { 0x835F, 59512 },
+ { 0x8360, 61149 },
+ { 0x8361, 61787 },
+ { 0x8362, 61152 },
+ { 0x8363, 59518 },
+ { 0x8364, 59521 },
+ { 0x8365, 61155 },
+ { 0x8366, 61158 },
+ { 0x8367, 61161 },
+ { 0x8368, 61166 },
+ { 0x8369, 61790 },
+ { 0x836A, 59526 },
+ { 0x836B, 61169 },
+ { 0x836C, 61172 },
+ { 0x836D, 62371 },
+ { 0x836E, 61177 },
+ { 0x8400, 62658 },
+ { 0x8401, 63027 },
+ { 0x8402, 62787 },
+ { 0x8403, 62723 },
+ { 0x8404, 62625 },
+ { 0x8405, 62968 },
+ { 0x8406, 62929 },
+ { 0x8407, 62875 },
+ { 0x8408, 63055 },
+ { 0x8409, 62815 },
+ { 0x840A, 62751 },
+ { 0x840B, 62636 },
+ { 0x840C, 62973 },
+ { 0x840D, 62934 },
+ { 0x840E, 62880 },
+ { 0x840F, 62782 },
+ { 0x8410, 62718 },
+ { 0x8411, 62620 },
+ { 0x8412, 62963 },
+ { 0x8413, 62924 },
+ { 0x8414, 62870 },
+ { 0x8415, 62579 },
+ { 0x8416, 62684 },
+ { 0x8417, 63060 },
+ { 0x8418, 62820 },
+ { 0x8419, 62756 },
+ { 0x841A, 62641 },
+ { 0x841B, 62978 },
+ { 0x841C, 62939 },
+ { 0x841D, 62885 },
+ { 0x841E, 62584 },
+ { 0x841F, 62689 },
+ { 0x8420, 63065 },
+ { 0x8421, 62825 },
+ { 0x8422, 62761 },
+ { 0x8423, 62694 },
+ { 0x8424, 63070 },
+ { 0x8425, 63075 },
+ { 0x8426, 62830 },
+ { 0x8427, 62766 },
+ { 0x8428, 62646 },
+ { 0x8429, 62983 },
+ { 0x842A, 62944 },
+ { 0x842B, 62890 },
+ { 0x842C, 62589 },
+ { 0x842D, 62699 },
+ { 0x842E, 63082 },
+ { 0x842F, 63087 },
+ { 0x8430, 62835 },
+ { 0x8431, 62771 },
+ { 0x8432, 63019 },
+ { 0x8433, 63011 },
+ { 0x8434, 62569 },
+ { 0x8435, 62674 },
+ { 0x8436, 63043 },
+ { 0x8437, 63048 },
+ { 0x8438, 62810 },
+ { 0x8439, 62746 },
+ { 0x843A, 63094 },
+ { 0x843B, 63101 },
+ { 0x843C, 62840 },
+ { 0x843D, 62863 },
+ { 0x843E, 62847 },
+ { 0x843F, 62855 },
+ { 0x8440, 62651 },
+ { 0x8441, 63004 },
+ { 0x8442, 62988 },
+ { 0x8443, 62996 },
+ { 0x8444, 62949 },
+ { 0x8445, 62956 },
+ { 0x8446, 62895 },
+ { 0x8447, 62910 },
+ { 0x8448, 62917 },
+ { 0x8449, 62902 },
+ { 0x844A, 62663 },
+ { 0x844B, 63032 },
+ { 0x844C, 62792 },
+ { 0x844D, 62728 },
+ { 0x844E, 62630 },
+ { 0x844F, 62564 },
+ { 0x8450, 62669 },
+ { 0x8451, 63038 },
+ { 0x8452, 62798 },
+ { 0x8453, 62803 },
+ { 0x8454, 62734 },
+ { 0x8455, 62739 },
+ { 0x8456, 63112 },
+ { 0x8457, 63108 },
+ { 0x8458, 62574 },
+ { 0x8459, 62679 },
+ { 0x845A, 62594 },
+ { 0x845B, 62704 },
+ { 0x845C, 62776 },
+ { 0x845D, 62600 },
+ { 0x845E, 62710 },
+ { 0x845F, 62608 },
+ { 0x8460, 62614 },
+ { 0x8461, 62550 },
+ { 0x8462, 62557 },
+ { 0x8470, 63116 },
+ { 0x8471, 63133 },
+ { 0x8472, 63123 },
+ { 0x8473, 63128 },
+ { 0x9000, 56261 },
+ { 0x9001, 56295 },
+ { 0x9002, 57281 },
+ { 0x9003, 56256 },
+ { 0x9004, 56251 },
+ { 0x9005, 56625 },
+ { 0x9006, 56620 },
+ { 0x9007, 56920 },
+ { 0x9008, 57186 },
+ { 0x9009, 57267 },
+ { 0x900A, 57194 },
+ { 0x900B, 57198 },
+ { 0x900C, 56937 },
+ { 0x900D, 56209 },
+ { 0x900E, 56118 },
+ { 0x900F, 56607 },
+ { 0x9010, 57136 },
+ { 0x9011, 57219 },
+ { 0x9012, 57228 },
+ { 0x9013, 56812 },
+ { 0x9014, 56282 },
+ { 0x9015, 56566 },
+ { 0x9016, 56484 },
+ { 0x9017, 56590 },
+ { 0x9018, 56847 },
+ { 0x9019, 56286 },
+ { 0x901A, 56132 },
+ { 0x901B, 56743 },
+ { 0x901C, 57158 },
+ { 0x901D, 57035 },
+ { 0x901E, 57022 },
+ { 0x901F, 56791 },
+ { 0x9020, 56575 },
+ { 0x9021, 56824 },
+ { 0x9022, 56838 },
+ { 0x9023, 56843 },
+ { 0x9024, 56512 },
+ { 0x9025, 56265 },
+ { 0x9026, 56585 },
+ { 0x9027, 56820 },
+ { 0x9028, 57295 },
+ { 0x9029, 56594 },
+ { 0x902A, 56807 },
+ { 0x902B, 56801 },
+ { 0x902C, 57172 },
+ { 0x902D, 56273 },
+ { 0x902E, 56242 },
+ { 0x902F, 56114 },
+ { 0x9030, 56147 },
+ { 0x9031, 56816 },
+ { 0x9032, 57163 },
+ { 0x9033, 56203 },
+ { 0x9034, 56400 },
+ { 0x9035, 57128 },
+ { 0x9036, 57099 },
+ { 0x9037, 56507 },
+ { 0x9038, 57026 },
+ { 0x9039, 57177 },
+ { 0x903A, 56924 },
+ { 0x903B, 56856 },
+ { 0x903C, 56783 },
+ { 0x903D, 57262 },
+ { 0x903E, 57276 },
+ { 0x903F, 56721 },
+ { 0x9040, 56137 },
+ { 0x9041, 56775 },
+ { 0x9042, 56928 },
+ { 0x9043, 57094 },
+ { 0x9044, 57303 },
+ { 0x9045, 57299 },
+ { 0x9046, 56127 },
+ { 0x9047, 56561 },
+ { 0x9048, 56246 },
+ { 0x9049, 56779 },
+ { 0x904A, 56933 },
+ { 0x904B, 57335 },
+ { 0x904C, 57327 },
+ { 0x904D, 57030 },
+ { 0x904E, 57140 },
+ { 0x904F, 56725 },
+ { 0x9050, 56663 },
+ { 0x9051, 57223 },
+ { 0x9052, 57213 },
+ { 0x9053, 56829 },
+ { 0x9054, 57331 },
+ { 0x9055, 56710 },
+ { 0x9056, 56702 },
+ { 0x9057, 56556 },
+ { 0x9058, 56615 },
+ { 0x9059, 56580 },
+ { 0x905A, 57181 },
+ { 0x905B, 56571 },
+ { 0x905C, 57203 },
+ { 0x905D, 56771 },
+ { 0x905E, 57271 },
+ { 0x905F, 57257 },
+ { 0x9060, 56337 },
+ { 0x9061, 56767 },
+ { 0x9062, 57323 },
+ { 0x9063, 57089 },
+ { 0x9064, 57233 },
+ { 0x9065, 56796 },
+ { 0x9066, 56269 },
+ { 0x9067, 56851 },
+ { 0x9068, 56912 },
+ { 0x9069, 56598 },
+ { 0x906A, 56290 },
+ { 0x906B, 57347 },
+ { 0x906C, 57339 },
+ { 0x906D, 57315 },
+ { 0x906E, 57351 },
+ { 0x906F, 57355 },
+ { 0x9070, 57319 },
+ { 0x9071, 57343 },
+ { 0x9072, 57311 },
+ { 0x9073, 57307 },
+ { 0x9074, 56342 },
+ { 0x9075, 57167 },
+ { 0x9076, 57285 },
+ { 0x9077, 57290 },
+ { 0x9078, 56277 },
+ { 0x9079, 56141 },
+ { 0x907A, 57132 },
+ { 0x907B, 57109 },
+ { 0x907C, 56156 },
+ { 0x907D, 56151 },
+ { 0x907E, 56787 },
+ { 0x907F, 56516 },
+ { 0x9080, 56237 },
+ { 0x9081, 56762 },
+ { 0x9082, 56757 },
+ { 0x9083, 56752 },
+ { 0x9084, 56833 },
+ { 0x9085, 56123 },
+ { 0x9086, 56233 },
+ { 0x9087, 56611 },
+ { 0x9088, 57085 },
+ { 0x9089, 56748 },
+ { 0x908A, 56532 },
+ { 0x908B, 56526 },
+ { 0x908C, 56538 },
+ { 0x908D, 56550 },
+ { 0x908E, 56544 },
+ { 0x908F, 56472 },
+ { 0x9090, 56495 },
+ { 0x9091, 56489 },
+ { 0x9092, 56883 },
+ { 0x9093, 56900 },
+ { 0x9094, 56893 },
+ { 0x9095, 56887 },
+ { 0x9096, 57190 },
+ { 0x9097, 56214 },
+ { 0x9098, 57249 },
+ { 0x9099, 56706 },
+ { 0x909A, 56171 },
+ { 0x909B, 56193 },
+ { 0x909C, 56161 },
+ { 0x909D, 56188 },
+ { 0x909E, 56166 },
+ { 0x909F, 56183 },
+ { 0x90A0, 56198 },
+ { 0x90A1, 56177 },
+ { 0x90A2, 56961 },
+ { 0x90A3, 56941 },
+ { 0x90A4, 56992 },
+ { 0x90A5, 56948 },
+ { 0x90A6, 56967 },
+ { 0x90A7, 57011 },
+ { 0x90A8, 56998 },
+ { 0x90A9, 57004 },
+ { 0x90AA, 56973 },
+ { 0x90AB, 56979 },
+ { 0x90AC, 56501 },
+ { 0x90AD, 57207 },
+ { 0x90AE, 57123 },
+ { 0x90AF, 57118 },
+ { 0x90B0, 57113 },
+ { 0x90B1, 56955 },
+ { 0x90B2, 57016 },
+ { 0x90B3, 56985 },
+ { 0x90B4, 57237 },
+ { 0x90B5, 57243 },
+ { 0x90B6, 56714 },
+ { 0x90B7, 56916 },
+ { 0x90B8, 57253 },
+ { 0x90B9, 56405 },
+ { 0x90BA, 56438 },
+ { 0x90BB, 56450 },
+ { 0x90BC, 56361 },
+ { 0x90BD, 56412 },
+ { 0x90BE, 56393 },
+ { 0x90BF, 56418 },
+ { 0x90C0, 56444 },
+ { 0x90C1, 56431 },
+ { 0x90C2, 56424 },
+ { 0x90C3, 56372 },
+ { 0x90C4, 56379 },
+ { 0x90C5, 56347 },
+ { 0x90C6, 56386 },
+ { 0x90C7, 56367 },
+ { 0x90C8, 56218 },
+ { 0x90C9, 56223 },
+ { 0x90CA, 56228 },
+ { 0x90CB, 56354 },
+ { 0x90CC, 56456 },
+ { 0x90CD, 56658 },
+ { 0x90CE, 56327 },
+ { 0x90CF, 56332 },
+ { 0x90D0, 56299 },
+ { 0x90D1, 56320 },
+ { 0x90D2, 56306 },
+ { 0x90D3, 56313 },
+ { 0x90D4, 56630 },
+ { 0x90D5, 56651 },
+ { 0x90D6, 56637 },
+ { 0x90D7, 56644 },
+ { 0x90D8, 56462 },
+ { 0x90D9, 56467 },
+ { 0x90DA, 56861 },
+ { 0x90DB, 56867 },
+ { 0x90DC, 56873 },
+ { 0x90DD, 56878 },
+ { 0x90DE, 57062 },
+ { 0x90DF, 57067 },
+ { 0x90E0, 57073 },
+ { 0x90E1, 57079 },
+ { 0x90E2, 57039 },
+ { 0x90E3, 57044 },
+ { 0x90E4, 57050 },
+ { 0x90E5, 57056 },
+ { 0x90E6, 56907 },
+ { 0x90E7, 57104 },
+ { 0x90E8, 56603 },
+ { 0x90E9, 56687 },
+ { 0x90EA, 56697 },
+ { 0x90EB, 56672 },
+ { 0x90EC, 56667 },
+ { 0x90ED, 56677 },
+ { 0x90EE, 56692 },
+ { 0x90EF, 56682 },
+ { 0x90F0, 57152 },
+ { 0x90F1, 56737 },
+ { 0x90F2, 57146 },
+ { 0x90F3, 56731 },
+ { 0x90F4, 56521 },
+ { 0x90F5, 56478 },
+ { 0x9100, 41562 },
+ { 0x9101, 41524 },
+ { 0x9102, 41404 },
+ { 0x9103, 41695 },
+ { 0x9104, 41508 },
+ { 0x9105, 41470 },
+ { 0x9106, 41337 },
+ { 0x9107, 41454 },
+ { 0x9108, 41558 },
+ { 0x9109, 41249 },
+ { 0x910A, 41238 },
+ { 0x910B, 41459 },
+ { 0x910C, 41290 },
+ { 0x910D, 41776 },
+ { 0x910E, 41780 },
+ { 0x910F, 41784 },
+ { 0x9110, 41659 },
+ { 0x9111, 41662 },
+ { 0x9112, 41485 },
+ { 0x9113, 41646 },
+ { 0x9114, 41395 },
+ { 0x9115, 41643 },
+ { 0x9116, 41728 },
+ { 0x9117, 41861 },
+ { 0x9118, 42079 },
+ { 0x9119, 41999 },
+ { 0x911A, 41995 },
+ { 0x911B, 41788 },
+ { 0x911C, 42075 },
+ { 0x911D, 42086 },
+ { 0x911E, 41215 },
+ { 0x911F, 41219 },
+ { 0x9120, 41225 },
+ { 0x9121, 41195 },
+ { 0x9122, 41199 },
+ { 0x9123, 41203 },
+ { 0x9124, 41209 },
+ { 0x9125, 41300 },
+ { 0x9126, 41304 },
+ { 0x9129, 41719 },
+ { 0x912A, 41520 },
+ { 0x912B, 41516 },
+ { 0x912C, 41308 },
+ { 0x912D, 41312 },
+ { 0x912E, 41666 },
+ { 0x912F, 41670 },
+ { 0x9130, 41462 },
+ { 0x9131, 41466 },
+ { 0x9132, 41690 },
+ { 0x9133, 41685 },
+ { 0x9134, 41504 },
+ { 0x9135, 41245 },
+ { 0x9136, 41550 },
+ { 0x9137, 41554 },
+ { 0x9138, 42103 },
+ { 0x9139, 42107 },
+ { 0x913A, 41438 },
+ { 0x913B, 41481 },
+ { 0x913C, 41328 },
+ { 0x913D, 41681 },
+ { 0x913E, 41532 },
+ { 0x913F, 42039 },
+ { 0x9140, 42123 },
+ { 0x9141, 42115 },
+ { 0x9142, 41280 },
+ { 0x9143, 41231 },
+ { 0x9144, 41356 },
+ { 0x9145, 41496 },
+ { 0x9146, 41575 },
+ { 0x9147, 41570 },
+ { 0x9148, 41819 },
+ { 0x9149, 41799 },
+ { 0x914A, 41843 },
+ { 0x914B, 41837 },
+ { 0x914C, 41855 },
+ { 0x914D, 41849 },
+ { 0x914E, 41831 },
+ { 0x914F, 41825 },
+ { 0x9150, 41812 },
+ { 0x9151, 41805 },
+ { 0x9152, 41347 },
+ { 0x9153, 41342 },
+ { 0x9154, 42133 },
+ { 0x9155, 42127 },
+ { 0x9156, 42096 },
+ { 0x9157, 41371 },
+ { 0x9158, 41724 },
+ { 0x9159, 41352 },
+ { 0x915A, 41654 },
+ { 0x915B, 41649 },
+ { 0x915C, 41398 },
+ { 0x915D, 41477 },
+ { 0x915E, 41324 },
+ { 0x915F, 41677 },
+ { 0x9160, 41528 },
+ { 0x9161, 42035 },
+ { 0x9162, 42119 },
+ { 0x9163, 42111 },
+ { 0x9164, 41274 },
+ { 0x9165, 41896 },
+ { 0x9166, 41975 },
+ { 0x9167, 41958 },
+ { 0x9168, 41962 },
+ { 0x9169, 41966 },
+ { 0x916A, 41703 },
+ { 0x916B, 41707 },
+ { 0x916C, 41711 },
+ { 0x916D, 41970 },
+ { 0x916E, 41917 },
+ { 0x916F, 41921 },
+ { 0x9170, 41925 },
+ { 0x9171, 41929 },
+ { 0x9172, 41933 },
+ { 0x9173, 41383 },
+ { 0x9174, 41262 },
+ { 0x9175, 41379 },
+ { 0x9176, 41258 },
+ { 0x9177, 41387 },
+ { 0x9178, 41266 },
+ { 0x9179, 41391 },
+ { 0x917A, 41270 },
+ { 0x917B, 41908 },
+ { 0x917C, 41954 },
+ { 0x917D, 41937 },
+ { 0x917E, 41980 },
+ { 0x917F, 41946 },
+ { 0x9180, 41988 },
+ { 0x9181, 41984 },
+ { 0x9182, 41900 },
+ { 0x9183, 42043 },
+ { 0x9184, 42047 },
+ { 0x9185, 41878 },
+ { 0x9186, 41870 },
+ { 0x9187, 41887 },
+ { 0x9188, 41904 },
+ { 0x9189, 41874 },
+ { 0x918A, 41912 },
+ { 0x918B, 41941 },
+ { 0x918C, 42100 },
+ { 0x918D, 41580 },
+ { 0x918E, 41235 },
+ { 0x918F, 41451 },
+ { 0x9190, 41435 },
+ { 0x9191, 41408 },
+ { 0x9192, 41992 },
+ { 0x9193, 42083 },
+ { 0x9194, 41417 },
+ { 0x9195, 41411 },
+ { 0x9196, 41242 },
+ { 0x9197, 41360 },
+ { 0x9198, 41715 },
+ { 0x9199, 41367 },
+ { 0x919A, 41363 },
+ { 0x919B, 41732 },
+ { 0x919C, 41736 },
+ { 0x919D, 41740 },
+ { 0x919E, 41744 },
+ { 0x919F, 41748 },
+ { 0x91A0, 41752 },
+ { 0x91A1, 41756 },
+ { 0x91A2, 41760 },
+ { 0x91A3, 41764 },
+ { 0x91A4, 41768 },
+ { 0x91A5, 41772 },
+ { 0x91A6, 42090 },
+ { 0x91A7, 42093 },
+ { 0x91A8, 41253 },
+ { 0x91A9, 41512 },
+ { 0x91AA, 41882 },
+ { 0x91AB, 41865 },
+ { 0x91AC, 41950 },
+ { 0x91AD, 41891 },
+ { 0x91AE, 41447 },
+ { 0x91AF, 41442 },
+ { 0x91B0, 41332 },
+ { 0x91B1, 42003 },
+ { 0x91B2, 42007 },
+ { 0x91B3, 41375 },
+ { 0x91B4, 41293 },
+ { 0x91B5, 41296 },
+ { 0x91B6, 41536 },
+ { 0x91B7, 41422 },
+ { 0x91B8, 41489 },
+ { 0x91B9, 42059 },
+ { 0x91BA, 42055 },
+ { 0x91BB, 41539 },
+ { 0x91BC, 41546 },
+ { 0x91BD, 42071 },
+ { 0x91BE, 42067 },
+ { 0x91BF, 41320 },
+ { 0x91C0, 41316 },
+ { 0x91C1, 41425 },
+ { 0x91C2, 41430 },
+ { 0x91C3, 41492 },
+ { 0x91C4, 42051 },
+ { 0x91C5, 41542 },
+ { 0x91C6, 42063 },
+ { 0x91C7, 41583 },
+ { 0x91C8, 41598 },
+ { 0x91C9, 41590 },
+ { 0x91CA, 41605 },
+ { 0x91CB, 41612 },
+ { 0x91CC, 41619 },
+ { 0x91CD, 41627 },
+ { 0x91CE, 41635 },
+ { 0x91CF, 41401 },
+ { 0x91D0, 42011 },
+ { 0x91D1, 42016 },
+ { 0x91D2, 41566 },
+ { 0x91D3, 41474 },
+ { 0x91D4, 41674 },
+ { 0x91D5, 41501 },
+ { 0x91D6, 42028 },
+ { 0x91D7, 41700 },
+ { 0x91D8, 41792 },
+ { 0x91D9, 42021 },
+ { 0x91DA, 42024 },
+ { 0x91DB, 42031 },
+ { 0x91DC, 41795 },
+ { 0x91DD, 41286 },
+ { 0x9200, 11902 },
+ { 0x9201, 11906 },
+ { 0x9202, 11910 },
+ { 0x9203, 11914 },
+ { 0x9204, 11918 },
+ { 0x9205, 11922 },
+ { 0x9206, 11926 },
+ { 0x9207, 11930 },
+ { 0x9208, 11934 },
+ { 0x9209, 11938 },
+ { 0x920A, 11942 },
+ { 0x920B, 11946 },
+ { 0x920C, 11950 },
+ { 0x920D, 11954 },
+ { 0x920E, 11958 },
+ { 0x920F, 11962 },
+ { 0x9210, 11966 },
+ { 0x9211, 11970 },
+ { 0x9212, 11974 },
+ { 0x9213, 11978 },
+ { 0x9214, 11982 },
+ { 0x9215, 11986 },
+ { 0x9216, 11990 },
+ { 0x9217, 11994 },
+ { 0x9218, 11998 },
+ { 0x9219, 12002 },
+ { 0x921A, 12006 },
+ { 0x921B, 12010 },
+ { 0x921C, 12014 },
+ { 0x921D, 13374 },
+ { 0x921E, 13378 },
+ { 0x921F, 13382 },
+ { 0x9220, 13386 },
+ { 0x9221, 13390 },
+ { 0x9222, 13394 },
+ { 0x9223, 13398 },
+ { 0x9224, 13402 },
+ { 0x9225, 13406 },
+ { 0x9226, 13410 },
+ { 0x9227, 13414 },
+ { 0x9228, 13418 },
+ { 0x9229, 13422 },
+ { 0x922A, 13426 },
+ { 0x922B, 13430 },
+ { 0x922C, 13434 },
+ { 0x922D, 13438 },
+ { 0x922E, 13442 },
+ { 0x922F, 13446 },
+ { 0x9230, 13450 },
+ { 0x9231, 13454 },
+ { 0x9232, 13458 },
+ { 0x9233, 13462 },
+ { 0x9234, 13466 },
+ { 0x9235, 13470 },
+ { 0x9236, 13474 },
+ { 0x9237, 13478 },
+ { 0x9238, 13482 },
+ { 0x9239, 13486 },
+ { 0x923A, 13490 },
+ { 0x923B, 13494 },
+ { 0x923C, 13498 },
+ { 0x923D, 13502 },
+ { 0x923E, 13506 },
+ { 0x923F, 13510 },
+ { 0x9240, 13514 },
+ { 0x9241, 13518 },
+ { 0x9242, 57564 },
+ { 0x9243, 57572 },
+ { 0x9244, 57568 },
+ { 0x9245, 13031 },
+ { 0x9300, 54871 },
+ { 0x9301, 31216 },
+ { 0x9302, 31188 },
+ { 0x9303, 31204 },
+ { 0x9304, 31200 },
+ { 0x9305, 31185 },
+ { 0x9306, 66100 },
+ { 0x9307, 66067 },
+ { 0x9308, 66082 },
+ { 0x9309, 66128 },
+ { 0x930A, 66147 },
+ { 0x930B, 66272 },
+ { 0x930C, 66097 },
+ { 0x930D, 66263 },
+ { 0x930E, 66201 },
+ { 0x930F, 66299 },
+ { 0x9310, 66254 },
+ { 0x9311, 66296 },
+ { 0x9312, 66184 },
+ { 0x9313, 66281 },
+ { 0x9314, 66085 },
+ { 0x9315, 66134 },
+ { 0x9316, 66143 },
+ { 0x9317, 66172 },
+ { 0x9318, 66220 },
+ { 0x9319, 66125 },
+ { 0x931A, 66166 },
+ { 0x931B, 66266 },
+ { 0x931C, 66064 },
+ { 0x931D, 66052 },
+ { 0x931E, 66251 },
+ { 0x931F, 66217 },
+ { 0x9320, 66110 },
+ { 0x9321, 66103 },
+ { 0x9322, 66287 },
+ { 0x9323, 66060 },
+ { 0x9324, 66160 },
+ { 0x9325, 66116 },
+ { 0x9326, 66205 },
+ { 0x9327, 66151 },
+ { 0x9328, 66226 },
+ { 0x9329, 66193 },
+ { 0x932A, 66119 },
+ { 0x932B, 66178 },
+ { 0x932C, 66239 },
+ { 0x932D, 66055 },
+ { 0x932E, 66187 },
+ { 0x932F, 66074 },
+ { 0x9330, 66257 },
+ { 0x9331, 66088 },
+ { 0x9332, 66233 },
+ { 0x9333, 66275 },
+ { 0x9334, 66163 },
+ { 0x9335, 66122 },
+ { 0x9336, 66113 },
+ { 0x9337, 66196 },
+ { 0x9338, 66208 },
+ { 0x9339, 66157 },
+ { 0x933A, 66175 },
+ { 0x933B, 66091 },
+ { 0x933C, 66293 },
+ { 0x933D, 66106 },
+ { 0x933E, 66278 },
+ { 0x933F, 66229 },
+ { 0x9340, 66154 },
+ { 0x9341, 66284 },
+ { 0x9342, 66304 },
+ { 0x9343, 66071 },
+ { 0x9344, 66094 },
+ { 0x9345, 66169 },
+ { 0x9346, 66079 },
+ { 0x9347, 66214 },
+ { 0x9348, 66211 },
+ { 0x9349, 66137 },
+ { 0x934A, 66260 },
+ { 0x934B, 66242 },
+ { 0x934C, 66190 },
+ { 0x934D, 66181 },
+ { 0x934E, 66245 },
+ { 0x934F, 66131 },
+ { 0x9350, 66140 },
+ { 0x9351, 66269 },
+ { 0x9352, 66248 },
+ { 0x9353, 66047 },
+ { 0x9354, 66290 },
+ { 0x9355, 66236 },
+ { 0x9356, 66223 },
+ { 0x9360, 48474 },
+ { 0x9361, 48484 },
+ { 0x9362, 48514 },
+ { 0x9363, 48494 },
+ { 0x9364, 48489 },
+ { 0x9365, 48479 },
+ { 0x9366, 48509 },
+ { 0x9367, 48504 },
+ { 0x9368, 48499 },
+ { 0x9369, 48429 },
+ { 0x936A, 48439 },
+ { 0x936B, 48469 },
+ { 0x936C, 48449 },
+ { 0x936D, 48444 },
+ { 0x936E, 48434 },
+ { 0x936F, 48464 },
+ { 0x9370, 48459 },
+ { 0x9371, 48454 },
+ { 0x9400, 70678 },
+ { 0x9401, 70682 },
+ { 0x9402, 70686 },
+ { 0x9403, 70690 },
+ { 0x9404, 70694 },
+ { 0x9405, 70698 },
+ { 0x9406, 70702 },
+ { 0x9407, 70706 },
+ { 0x9408, 70710 },
+ { 0x9409, 70714 },
+ { 0x940A, 70718 },
+ { 0x940B, 70722 },
+ { 0x940C, 70726 },
+ { 0x940D, 70730 },
+ { 0x940E, 70734 },
+ { 0x940F, 70738 },
+ { 0x9410, 70742 },
+ { 0x9411, 70746 },
+ { 0x9412, 70750 },
+ { 0x9413, 70754 },
+ { 0x9414, 70758 },
+ { 0x9415, 70762 },
+ { 0x9416, 70766 },
+ { 0x9417, 70770 },
+ { 0x9418, 70774 },
+ { 0x9419, 70778 },
+ { 0x941A, 69654 },
+ { 0x941B, 69658 },
+ { 0x941C, 69662 },
+ { 0x941D, 69666 },
+ { 0x941E, 69670 },
+ { 0x941F, 69674 },
+ { 0x9420, 69678 },
+ { 0x9421, 69682 },
+ { 0x9422, 69686 },
+ { 0x9423, 69690 },
+ { 0x9424, 69694 },
+ { 0x9425, 69698 },
+ { 0x9426, 69702 },
+ { 0x9427, 69706 },
+ { 0x9428, 69710 },
+ { 0x9429, 69714 },
+ { 0x942A, 69718 },
+ { 0x942B, 69722 },
+ { 0x942C, 69726 },
+ { 0x942D, 69730 },
+ { 0x942E, 69734 },
+ { 0x942F, 69738 },
+ { 0x9430, 69742 },
+ { 0x9431, 69746 },
+ { 0x9432, 69750 },
+ { 0x9433, 69754 },
+ { 0x9434, 71437 },
+ { 0x9435, 71441 },
+ { 0x9436, 71445 },
+ { 0x9437, 71449 },
+ { 0x9438, 71453 },
+ { 0x9439, 71457 },
+ { 0x943A, 71461 },
+ { 0x943B, 71465 },
+ { 0x943C, 71469 },
+ { 0x943D, 71473 },
+ { 0x943E, 71477 },
+ { 0x943F, 71481 },
+ { 0x9440, 71485 },
+ { 0x9441, 71489 },
+ { 0x9442, 71493 },
+ { 0x9443, 71497 },
+ { 0x9444, 71501 },
+ { 0x9445, 71505 },
+ { 0x9446, 71509 },
+ { 0x9447, 71513 },
+ { 0x9448, 71517 },
+ { 0x9449, 71521 },
+ { 0x944A, 71525 },
+ { 0x944B, 71529 },
+ { 0x944C, 71533 },
+ { 0x944D, 71537 },
+ { 0x944E, 71222 },
+ { 0x944F, 71226 },
+ { 0x9450, 71230 },
+ { 0x9451, 71234 },
+ { 0x9452, 71238 },
+ { 0x9453, 71242 },
+ { 0x9454, 71246 },
+ { 0x9456, 71250 },
+ { 0x9457, 71254 },
+ { 0x9458, 71258 },
+ { 0x9459, 71262 },
+ { 0x945A, 71266 },
+ { 0x945B, 71270 },
+ { 0x945C, 71274 },
+ { 0x945D, 71278 },
+ { 0x945E, 71282 },
+ { 0x945F, 71286 },
+ { 0x9460, 71290 },
+ { 0x9461, 71294 },
+ { 0x9462, 71298 },
+ { 0x9463, 71302 },
+ { 0x9464, 71306 },
+ { 0x9465, 71310 },
+ { 0x9466, 71314 },
+ { 0x9467, 71318 },
+ { 0x9468, 70152 },
+ { 0x9469, 70157 },
+ { 0x946A, 70162 },
+ { 0x946B, 70167 },
+ { 0x946C, 70172 },
+ { 0x946D, 70177 },
+ { 0x946E, 70182 },
+ { 0x946F, 70187 },
+ { 0x9470, 70192 },
+ { 0x9471, 70197 },
+ { 0x9472, 70202 },
+ { 0x9473, 70207 },
+ { 0x9474, 70212 },
+ { 0x9475, 70217 },
+ { 0x9476, 70222 },
+ { 0x9477, 70227 },
+ { 0x9478, 70232 },
+ { 0x9479, 70237 },
+ { 0x947A, 70242 },
+ { 0x947B, 70247 },
+ { 0x947C, 70252 },
+ { 0x947D, 70257 },
+ { 0x947E, 70262 },
+ { 0x947F, 70267 },
+ { 0x9480, 70272 },
+ { 0x9481, 70277 },
+ { 0x9482, 69891 },
+ { 0x9483, 69896 },
+ { 0x9484, 69901 },
+ { 0x9485, 69906 },
+ { 0x9486, 69911 },
+ { 0x9487, 69916 },
+ { 0x9488, 69921 },
+ { 0x9489, 69926 },
+ { 0x948A, 69931 },
+ { 0x948B, 69936 },
+ { 0x948C, 69941 },
+ { 0x948D, 69946 },
+ { 0x948E, 69951 },
+ { 0x948F, 69956 },
+ { 0x9490, 69961 },
+ { 0x9491, 69966 },
+ { 0x9492, 69971 },
+ { 0x9493, 69976 },
+ { 0x9494, 69981 },
+ { 0x9495, 69986 },
+ { 0x9496, 69991 },
+ { 0x9497, 69996 },
+ { 0x9498, 70001 },
+ { 0x9499, 70006 },
+ { 0x949A, 70011 },
+ { 0x949B, 70016 },
+ { 0x949C, 71742 },
+ { 0x949E, 71746 },
+ { 0x949F, 71750 },
+ { 0x94A2, 71754 },
+ { 0x94A5, 71758 },
+ { 0x94A6, 71762 },
+ { 0x94A9, 71766 },
+ { 0x94AA, 71770 },
+ { 0x94AB, 71774 },
+ { 0x94AC, 71778 },
+ { 0x94AE, 71782 },
+ { 0x94AF, 71786 },
+ { 0x94B0, 71790 },
+ { 0x94B1, 71794 },
+ { 0x94B2, 71798 },
+ { 0x94B3, 71802 },
+ { 0x94B4, 71806 },
+ { 0x94B5, 71810 },
+ { 0x94B6, 71650 },
+ { 0x94B7, 71654 },
+ { 0x94B8, 71658 },
+ { 0x94B9, 71662 },
+ { 0x94BB, 71666 },
+ { 0x94BD, 71670 },
+ { 0x94BE, 71674 },
+ { 0x94BF, 71678 },
+ { 0x94C0, 71682 },
+ { 0x94C1, 71686 },
+ { 0x94C2, 71690 },
+ { 0x94C3, 71694 },
+ { 0x94C5, 71698 },
+ { 0x94C6, 71702 },
+ { 0x94C7, 71706 },
+ { 0x94C8, 71710 },
+ { 0x94C9, 71714 },
+ { 0x94CA, 71718 },
+ { 0x94CB, 71722 },
+ { 0x94CC, 71726 },
+ { 0x94CD, 71730 },
+ { 0x94CE, 71734 },
+ { 0x94CF, 71738 },
+ { 0x94D0, 70548 },
+ { 0x94D1, 70553 },
+ { 0x94D2, 70558 },
+ { 0x94D3, 70563 },
+ { 0x94D4, 70568 },
+ { 0x94D5, 70573 },
+ { 0x94D6, 70578 },
+ { 0x94D7, 70583 },
+ { 0x94D8, 70588 },
+ { 0x94D9, 70593 },
+ { 0x94DA, 70598 },
+ { 0x94DB, 70603 },
+ { 0x94DC, 70608 },
+ { 0x94DD, 70613 },
+ { 0x94DE, 70618 },
+ { 0x94DF, 70623 },
+ { 0x94E0, 70628 },
+ { 0x94E1, 70633 },
+ { 0x94E2, 70638 },
+ { 0x94E3, 70643 },
+ { 0x94E4, 70648 },
+ { 0x94E5, 70653 },
+ { 0x94E6, 70658 },
+ { 0x94E7, 70663 },
+ { 0x94E8, 70668 },
+ { 0x94E9, 70673 },
+ { 0x94EA, 70418 },
+ { 0x94EB, 70423 },
+ { 0x94EC, 70428 },
+ { 0x94ED, 70433 },
+ { 0x94EE, 70438 },
+ { 0x94EF, 70443 },
+ { 0x94F0, 70448 },
+ { 0x94F1, 70453 },
+ { 0x94F2, 70458 },
+ { 0x94F3, 70463 },
+ { 0x94F4, 70468 },
+ { 0x94F5, 70473 },
+ { 0x94F6, 70478 },
+ { 0x94F7, 70483 },
+ { 0x94F8, 70488 },
+ { 0x94F9, 70493 },
+ { 0x94FA, 70498 },
+ { 0x94FB, 70503 },
+ { 0x94FC, 70508 },
+ { 0x94FD, 70513 },
+ { 0x94FE, 70518 },
+ { 0x94FF, 70523 },
+ { 0x9500, 70528 },
+ { 0x9501, 70533 },
+ { 0x9502, 70538 },
+ { 0x9503, 70543 },
+ { 0x9504, 71918 },
+ { 0x9505, 71922 },
+ { 0x9507, 71926 },
+ { 0x9508, 71930 },
+ { 0x9509, 71934 },
+ { 0x950A, 71938 },
+ { 0x950D, 71942 },
+ { 0x950E, 71946 },
+ { 0x950F, 71950 },
+ { 0x9510, 71954 },
+ { 0x9511, 71958 },
+ { 0x9512, 71962 },
+ { 0x9513, 71966 },
+ { 0x9514, 71970 },
+ { 0x9516, 71974 },
+ { 0x9517, 71978 },
+ { 0x9518, 71982 },
+ { 0x9519, 71986 },
+ { 0x951A, 71990 },
+ { 0x951B, 71994 },
+ { 0x951C, 71998 },
+ { 0x951E, 71814 },
+ { 0x951F, 71818 },
+ { 0x9520, 71822 },
+ { 0x9521, 71826 },
+ { 0x9522, 71830 },
+ { 0x9523, 71834 },
+ { 0x9524, 71838 },
+ { 0x9525, 71842 },
+ { 0x9526, 71846 },
+ { 0x9527, 71850 },
+ { 0x9528, 71854 },
+ { 0x9529, 71858 },
+ { 0x952A, 71862 },
+ { 0x952B, 71866 },
+ { 0x952C, 71870 },
+ { 0x952D, 71874 },
+ { 0x952E, 71878 },
+ { 0x952F, 71882 },
+ { 0x9530, 71886 },
+ { 0x9531, 71890 },
+ { 0x9532, 71894 },
+ { 0x9533, 71898 },
+ { 0x9534, 71902 },
+ { 0x9535, 71906 },
+ { 0x9536, 71910 },
+ { 0x9537, 71914 },
+ { 0x9538, 74164 },
+ { 0x9539, 74168 },
+ { 0x953B, 74172 },
+ { 0x953C, 74176 },
+ { 0x953D, 74180 },
+ { 0x953E, 74184 },
+ { 0x9540, 74188 },
+ { 0x9541, 74192 },
+ { 0x9542, 74196 },
+ { 0x9543, 74200 },
+ { 0x9544, 74204 },
+ { 0x9546, 74208 },
+ { 0x954A, 74212 },
+ { 0x954B, 74216 },
+ { 0x954C, 74220 },
+ { 0x954D, 74224 },
+ { 0x954E, 74228 },
+ { 0x954F, 74232 },
+ { 0x9550, 74236 },
+ { 0x9552, 74060 },
+ { 0x9553, 74064 },
+ { 0x9554, 74068 },
+ { 0x9555, 74072 },
+ { 0x9556, 74076 },
+ { 0x9557, 74080 },
+ { 0x9558, 74084 },
+ { 0x9559, 74088 },
+ { 0x955A, 74092 },
+ { 0x955B, 74096 },
+ { 0x955C, 74100 },
+ { 0x955D, 74104 },
+ { 0x955E, 74108 },
+ { 0x955F, 74112 },
+ { 0x9560, 74116 },
+ { 0x9561, 74120 },
+ { 0x9562, 74124 },
+ { 0x9563, 74128 },
+ { 0x9564, 74132 },
+ { 0x9565, 74136 },
+ { 0x9566, 74140 },
+ { 0x9567, 74144 },
+ { 0x9568, 74148 },
+ { 0x9569, 74152 },
+ { 0x956A, 74156 },
+ { 0x956B, 74160 },
+ { 0x956C, 71021 },
+ { 0x956D, 71026 },
+ { 0x956E, 71031 },
+ { 0x956F, 71036 },
+ { 0x9570, 71041 },
+ { 0x9571, 71046 },
+ { 0x9572, 71051 },
+ { 0x9573, 71056 },
+ { 0x9574, 71061 },
+ { 0x9575, 71066 },
+ { 0x9576, 71071 },
+ { 0x9577, 71076 },
+ { 0x9578, 71081 },
+ { 0x9579, 71086 },
+ { 0x957A, 71091 },
+ { 0x957B, 71096 },
+ { 0x957C, 71101 },
+ { 0x957D, 71106 },
+ { 0x957E, 71111 },
+ { 0x957F, 71116 },
+ { 0x9580, 71121 },
+ { 0x9581, 71126 },
+ { 0x9582, 71131 },
+ { 0x9583, 71136 },
+ { 0x9584, 71141 },
+ { 0x9585, 71146 },
+ { 0x9586, 70891 },
+ { 0x9587, 70896 },
+ { 0x9588, 70901 },
+ { 0x9589, 70906 },
+ { 0x958A, 70911 },
+ { 0x958B, 70916 },
+ { 0x958C, 70921 },
+ { 0x958D, 70926 },
+ { 0x958E, 70931 },
+ { 0x958F, 70936 },
+ { 0x9590, 70941 },
+ { 0x9591, 70946 },
+ { 0x9592, 70951 },
+ { 0x9593, 70956 },
+ { 0x9594, 70961 },
+ { 0x9595, 70966 },
+ { 0x9596, 70971 },
+ { 0x9597, 70976 },
+ { 0x9598, 70981 },
+ { 0x9599, 70986 },
+ { 0x959A, 70991 },
+ { 0x959B, 70996 },
+ { 0x959C, 71001 },
+ { 0x959D, 71006 },
+ { 0x959E, 71011 },
+ { 0x959F, 71016 },
+ { 0x95A0, 73916 },
+ { 0x95A1, 73920 },
+ { 0x95A2, 73924 },
+ { 0x95A3, 73928 },
+ { 0x95A4, 73932 },
+ { 0x95A5, 73936 },
+ { 0x95A6, 73940 },
+ { 0x95A7, 73944 },
+ { 0x95A8, 73948 },
+ { 0x95A9, 73952 },
+ { 0x95AA, 73956 },
+ { 0x95AB, 73960 },
+ { 0x95AC, 73964 },
+ { 0x95AD, 73968 },
+ { 0x95AE, 73972 },
+ { 0x95AF, 73976 },
+ { 0x95B0, 73980 },
+ { 0x95B1, 73984 },
+ { 0x95B2, 73988 },
+ { 0x95B3, 73992 },
+ { 0x95B4, 73996 },
+ { 0x95B5, 74000 },
+ { 0x95B6, 74004 },
+ { 0x95B7, 74008 },
+ { 0x95B8, 74012 },
+ { 0x95B9, 74016 },
+ { 0x95BA, 73552 },
+ { 0x95BB, 73556 },
+ { 0x95BC, 73560 },
+ { 0x95BD, 73564 },
+ { 0x95BE, 73568 },
+ { 0x95BF, 73572 },
+ { 0x95C0, 73576 },
+ { 0x95C1, 73580 },
+ { 0x95C2, 73584 },
+ { 0x95C3, 73588 },
+ { 0x95C4, 73592 },
+ { 0x95C5, 73596 },
+ { 0x95C6, 73600 },
+ { 0x95C7, 73604 },
+ { 0x95C8, 73608 },
+ { 0x95C9, 73612 },
+ { 0x95CA, 73616 },
+ { 0x95CB, 73620 },
+ { 0x95CC, 73624 },
+ { 0x95CD, 73628 },
+ { 0x95CE, 73632 },
+ { 0x95CF, 73636 },
+ { 0x95D0, 73640 },
+ { 0x95D1, 73644 },
+ { 0x95D2, 73648 },
+ { 0x95D3, 73652 },
+ { 0x95D4, 73246 },
+ { 0x95D5, 73251 },
+ { 0x95D6, 73256 },
+ { 0x95D7, 73261 },
+ { 0x95D8, 73266 },
+ { 0x95D9, 73271 },
+ { 0x95DA, 73276 },
+ { 0x95DB, 73281 },
+ { 0x95DC, 73286 },
+ { 0x95DD, 73291 },
+ { 0x95DE, 73296 },
+ { 0x95DF, 73301 },
+ { 0x95E0, 73306 },
+ { 0x95E1, 73311 },
+ { 0x95E2, 73316 },
+ { 0x95E3, 73321 },
+ { 0x95E4, 73326 },
+ { 0x95E5, 73331 },
+ { 0x95E6, 73336 },
+ { 0x95E7, 73341 },
+ { 0x95E8, 73346 },
+ { 0x95E9, 73351 },
+ { 0x95EA, 73356 },
+ { 0x95EB, 73361 },
+ { 0x95EC, 73366 },
+ { 0x95ED, 73371 },
+ { 0x95EE, 72324 },
+ { 0x95EF, 72329 },
+ { 0x95F0, 72334 },
+ { 0x95F1, 72339 },
+ { 0x95F2, 72344 },
+ { 0x95F3, 72349 },
+ { 0x95F4, 72354 },
+ { 0x95F5, 72359 },
+ { 0x95F6, 72364 },
+ { 0x95F7, 72369 },
+ { 0x95F8, 72374 },
+ { 0x95F9, 72379 },
+ { 0x95FA, 72384 },
+ { 0x95FB, 72389 },
+ { 0x95FC, 72394 },
+ { 0x95FD, 72399 },
+ { 0x95FE, 72404 },
+ { 0x95FF, 72409 },
+ { 0x9600, 72414 },
+ { 0x9601, 72419 },
+ { 0x9602, 72424 },
+ { 0x9603, 72429 },
+ { 0x9604, 72434 },
+ { 0x9605, 72439 },
+ { 0x9606, 72444 },
+ { 0x9607, 72449 },
+ { 0x9608, 73786 },
+ { 0x9609, 73791 },
+ { 0x960A, 73796 },
+ { 0x960B, 73801 },
+ { 0x960C, 73806 },
+ { 0x960D, 73811 },
+ { 0x960E, 73816 },
+ { 0x960F, 73821 },
+ { 0x9610, 73826 },
+ { 0x9611, 73831 },
+ { 0x9612, 73836 },
+ { 0x9613, 73841 },
+ { 0x9614, 73846 },
+ { 0x9615, 73851 },
+ { 0x9616, 73856 },
+ { 0x9617, 73861 },
+ { 0x9618, 73866 },
+ { 0x9619, 73871 },
+ { 0x961A, 73876 },
+ { 0x961B, 73881 },
+ { 0x961C, 73886 },
+ { 0x961D, 73891 },
+ { 0x961E, 73896 },
+ { 0x961F, 73901 },
+ { 0x9620, 73906 },
+ { 0x9621, 73911 },
+ { 0x9622, 73656 },
+ { 0x9623, 73661 },
+ { 0x9624, 73666 },
+ { 0x9625, 73671 },
+ { 0x9626, 73676 },
+ { 0x9627, 73681 },
+ { 0x9628, 73686 },
+ { 0x9629, 73691 },
+ { 0x962A, 73696 },
+ { 0x962B, 73701 },
+ { 0x962C, 73706 },
+ { 0x962D, 73711 },
+ { 0x962E, 73716 },
+ { 0x962F, 73721 },
+ { 0x9630, 73726 },
+ { 0x9631, 73731 },
+ { 0x9632, 73736 },
+ { 0x9633, 73741 },
+ { 0x9634, 73746 },
+ { 0x9635, 73751 },
+ { 0x9636, 73756 },
+ { 0x9637, 73761 },
+ { 0x9638, 73766 },
+ { 0x9639, 73771 },
+ { 0x963A, 73776 },
+ { 0x963B, 73781 },
+ { 0x963C, 72927 },
+ { 0x963D, 72933 },
+ { 0x963E, 72939 },
+ { 0x963F, 72945 },
+ { 0x9640, 72951 },
+ { 0x9641, 72957 },
+ { 0x9642, 72963 },
+ { 0x9643, 72969 },
+ { 0x9644, 72975 },
+ { 0x9645, 72981 },
+ { 0x9646, 72987 },
+ { 0x9647, 72993 },
+ { 0x9648, 72999 },
+ { 0x9649, 73005 },
+ { 0x964A, 73011 },
+ { 0x964B, 73017 },
+ { 0x964C, 73023 },
+ { 0x964D, 73029 },
+ { 0x964E, 73035 },
+ { 0x964F, 73041 },
+ { 0x9650, 73047 },
+ { 0x9651, 73053 },
+ { 0x9652, 73059 },
+ { 0x9653, 73065 },
+ { 0x9654, 73071 },
+ { 0x9655, 73077 },
+ { 0x9656, 72614 },
+ { 0x9657, 72620 },
+ { 0x9658, 72626 },
+ { 0x9659, 72632 },
+ { 0x965A, 72638 },
+ { 0x965B, 72644 },
+ { 0x965C, 72650 },
+ { 0x965D, 72656 },
+ { 0x965E, 72662 },
+ { 0x965F, 72668 },
+ { 0x9660, 72674 },
+ { 0x9661, 72680 },
+ { 0x9662, 72686 },
+ { 0x9663, 72692 },
+ { 0x9664, 72698 },
+ { 0x9665, 72704 },
+ { 0x9666, 72710 },
+ { 0x9667, 72716 },
+ { 0x9668, 72722 },
+ { 0x9669, 72728 },
+ { 0x966A, 72734 },
+ { 0x966B, 72740 },
+ { 0x966C, 72746 },
+ { 0x966D, 72752 },
+ { 0x966E, 72758 },
+ { 0x966F, 72764 },
+ { 0x9670, 72146 },
+ { 0x9671, 72150 },
+ { 0x9672, 72154 },
+ { 0x9673, 72158 },
+ { 0x9674, 72162 },
+ { 0x9675, 72166 },
+ { 0x9676, 72170 },
+ { 0x9677, 72174 },
+ { 0x9678, 72178 },
+ { 0x9679, 72182 },
+ { 0x967A, 72186 },
+ { 0x967B, 72190 },
+ { 0x967C, 72194 },
+ { 0x967D, 72198 },
+ { 0x967E, 72202 },
+ { 0x967F, 72206 },
+ { 0x9680, 72210 },
+ { 0x9681, 72214 },
+ { 0x9682, 72218 },
+ { 0x9683, 72222 },
+ { 0x9684, 72226 },
+ { 0x9685, 72230 },
+ { 0x9686, 72234 },
+ { 0x9687, 72238 },
+ { 0x9688, 72242 },
+ { 0x9689, 72246 },
+ { 0x968A, 72042 },
+ { 0x968B, 72046 },
+ { 0x968C, 72050 },
+ { 0x968D, 72054 },
+ { 0x968E, 72058 },
+ { 0x968F, 72062 },
+ { 0x9690, 72066 },
+ { 0x9691, 72070 },
+ { 0x9692, 72074 },
+ { 0x9693, 72078 },
+ { 0x9694, 72082 },
+ { 0x9695, 72086 },
+ { 0x9696, 72090 },
+ { 0x9697, 72094 },
+ { 0x9698, 72098 },
+ { 0x9699, 72102 },
+ { 0x969A, 72106 },
+ { 0x969B, 72110 },
+ { 0x969C, 72114 },
+ { 0x969D, 72118 },
+ { 0x969E, 72122 },
+ { 0x969F, 72126 },
+ { 0x96A0, 72130 },
+ { 0x96A1, 72134 },
+ { 0x96A2, 72138 },
+ { 0x96A3, 72142 },
+ { 0x96A4, 71411 },
+ { 0x96A5, 71416 },
+ { 0x96A8, 70834 },
+ { 0x96A9, 70822 },
+ { 0x96AA, 70842 },
+ { 0x96AB, 70838 },
+ { 0x96AC, 70875 },
+ { 0x96AD, 70830 },
+ { 0x96AE, 70802 },
+ { 0x96AF, 70862 },
+ { 0x96B0, 70826 },
+ { 0x96B1, 70846 },
+ { 0x96B2, 70850 },
+ { 0x96B3, 70782 },
+ { 0x96B4, 70786 },
+ { 0x96B5, 70794 },
+ { 0x96B6, 70879 },
+ { 0x96B7, 70790 },
+ { 0x96B8, 70814 },
+ { 0x96B9, 70866 },
+ { 0x96BA, 70858 },
+ { 0x96BB, 70818 },
+ { 0x96BC, 70883 },
+ { 0x96BD, 70806 },
+ { 0x96BE, 70798 },
+ { 0x96BF, 70810 },
+ { 0x96C0, 70854 },
+ { 0x96C1, 69651 },
+ { 0x96C2, 69810 },
+ { 0x96C3, 69798 },
+ { 0x96C4, 69823 },
+ { 0x96C5, 69814 },
+ { 0x96C6, 69851 },
+ { 0x96C7, 69806 },
+ { 0x96C8, 69778 },
+ { 0x96C9, 69843 },
+ { 0x96CA, 69802 },
+ { 0x96CB, 69827 },
+ { 0x96CC, 69831 },
+ { 0x96CD, 69758 },
+ { 0x96CE, 69762 },
+ { 0x96CF, 69770 },
+ { 0x96D0, 69855 },
+ { 0x96D1, 69766 },
+ { 0x96D2, 69790 },
+ { 0x96D3, 69818 },
+ { 0x96D4, 69839 },
+ { 0x96D5, 69794 },
+ { 0x96D6, 69859 },
+ { 0x96D7, 69782 },
+ { 0x96D8, 69774 },
+ { 0x96D9, 69786 },
+ { 0x96DA, 69835 },
+ { 0x96DB, 71151 },
+ { 0x96DC, 70887 },
+ { 0x96DD, 69863 },
+ { 0x96DE, 69647 },
+ { 0x96DF, 69599 },
+ { 0x96E0, 69603 },
+ { 0x96E1, 69595 },
+ { 0x96E2, 71593 },
+ { 0x96E3, 71581 },
+ { 0x96E4, 71601 },
+ { 0x96E5, 71597 },
+ { 0x96E6, 71630 },
+ { 0x96E7, 71589 },
+ { 0x96E8, 71561 },
+ { 0x96E9, 71621 },
+ { 0x96EA, 71585 },
+ { 0x96EB, 71605 },
+ { 0x96EC, 71609 },
+ { 0x96ED, 71541 },
+ { 0x96EE, 71545 },
+ { 0x96EF, 71553 },
+ { 0x96F0, 71634 },
+ { 0x96F1, 71549 },
+ { 0x96F2, 71573 },
+ { 0x96F3, 71625 },
+ { 0x96F4, 71617 },
+ { 0x96F5, 71577 },
+ { 0x96F6, 71638 },
+ { 0x96F7, 71565 },
+ { 0x96F8, 71557 },
+ { 0x96F9, 71569 },
+ { 0x96FA, 71613 },
+ { 0x96FB, 71219 },
+ { 0x96FC, 71374 },
+ { 0x96FD, 71362 },
+ { 0x96FE, 71387 },
+ { 0x96FF, 71378 },
+ { 0x9700, 71421 },
+ { 0x9701, 71370 },
+ { 0x9702, 71342 },
+ { 0x9703, 71407 },
+ { 0x9704, 71366 },
+ { 0x9705, 71391 },
+ { 0x9706, 71395 },
+ { 0x9707, 71322 },
+ { 0x9708, 71326 },
+ { 0x9709, 71334 },
+ { 0x970A, 71425 },
+ { 0x970B, 71330 },
+ { 0x970C, 71354 },
+ { 0x970D, 71382 },
+ { 0x970E, 71403 },
+ { 0x970F, 71358 },
+ { 0x9710, 71429 },
+ { 0x9711, 71346 },
+ { 0x9712, 71338 },
+ { 0x9713, 71350 },
+ { 0x9714, 71399 },
+ { 0x9715, 71646 },
+ { 0x9716, 71642 },
+ { 0x9717, 71433 },
+ { 0x9718, 71215 },
+ { 0x9719, 71207 },
+ { 0x971A, 71211 },
+ { 0x971B, 71203 },
+ { 0x971C, 70347 },
+ { 0x971D, 70332 },
+ { 0x971E, 70357 },
+ { 0x971F, 70352 },
+ { 0x9720, 70393 },
+ { 0x9721, 70342 },
+ { 0x9722, 70307 },
+ { 0x9723, 70382 },
+ { 0x9724, 70337 },
+ { 0x9725, 70362 },
+ { 0x9726, 70367 },
+ { 0x9727, 70282 },
+ { 0x9728, 70287 },
+ { 0x9729, 70297 },
+ { 0x972A, 70398 },
+ { 0x972B, 70292 },
+ { 0x972C, 70322 },
+ { 0x972D, 70387 },
+ { 0x972E, 70377 },
+ { 0x972F, 70327 },
+ { 0x9730, 70403 },
+ { 0x9731, 70312 },
+ { 0x9732, 70302 },
+ { 0x9733, 70317 },
+ { 0x9734, 70372 },
+ { 0x9735, 69887 },
+ { 0x9736, 70086 },
+ { 0x9737, 70071 },
+ { 0x9738, 70102 },
+ { 0x9739, 70091 },
+ { 0x973A, 70132 },
+ { 0x973B, 70081 },
+ { 0x973C, 70046 },
+ { 0x973D, 70127 },
+ { 0x973E, 70076 },
+ { 0x973F, 70107 },
+ { 0x9740, 70112 },
+ { 0x9741, 70021 },
+ { 0x9742, 70026 },
+ { 0x9743, 70036 },
+ { 0x9744, 70137 },
+ { 0x9745, 70031 },
+ { 0x9746, 70061 },
+ { 0x9747, 70096 },
+ { 0x9748, 70122 },
+ { 0x9749, 70066 },
+ { 0x974A, 70142 },
+ { 0x974B, 70051 },
+ { 0x974C, 70041 },
+ { 0x974D, 70056 },
+ { 0x974E, 70117 },
+ { 0x974F, 70413 },
+ { 0x9750, 70408 },
+ { 0x9751, 70147 },
+ { 0x9752, 69882 },
+ { 0x9753, 69872 },
+ { 0x9754, 69877 },
+ { 0x9755, 69867 },
+ { 0x9756, 73441 },
+ { 0x9757, 73426 },
+ { 0x9758, 73451 },
+ { 0x9759, 73446 },
+ { 0x975A, 73487 },
+ { 0x975B, 73436 },
+ { 0x975C, 73401 },
+ { 0x975D, 73476 },
+ { 0x975E, 73431 },
+ { 0x975F, 73456 },
+ { 0x9760, 73461 },
+ { 0x9761, 73376 },
+ { 0x9762, 73381 },
+ { 0x9763, 73391 },
+ { 0x9764, 73492 },
+ { 0x9765, 73386 },
+ { 0x9766, 73416 },
+ { 0x9767, 73481 },
+ { 0x9768, 73471 },
+ { 0x9769, 73421 },
+ { 0x976A, 73497 },
+ { 0x976B, 73406 },
+ { 0x976C, 73396 },
+ { 0x976D, 73411 },
+ { 0x976E, 73466 },
+ { 0x976F, 72320 },
+ { 0x9770, 72519 },
+ { 0x9771, 72504 },
+ { 0x9772, 72535 },
+ { 0x9773, 72524 },
+ { 0x9774, 72565 },
+ { 0x9775, 72514 },
+ { 0x9776, 72479 },
+ { 0x9777, 72560 },
+ { 0x9778, 72509 },
+ { 0x9779, 72540 },
+ { 0x977A, 72545 },
+ { 0x977B, 72454 },
+ { 0x977C, 72459 },
+ { 0x977D, 72469 },
+ { 0x977E, 72570 },
+ { 0x977F, 72464 },
+ { 0x9780, 72494 },
+ { 0x9781, 72529 },
+ { 0x9782, 72555 },
+ { 0x9783, 72499 },
+ { 0x9784, 72575 },
+ { 0x9785, 72484 },
+ { 0x9786, 72474 },
+ { 0x9787, 72489 },
+ { 0x9788, 72550 },
+ { 0x9789, 73507 },
+ { 0x978A, 73502 },
+ { 0x978B, 72580 },
+ { 0x978C, 72315 },
+ { 0x978D, 72255 },
+ { 0x978E, 72260 },
+ { 0x978F, 72250 },
+ { 0x9790, 73161 },
+ { 0x9791, 73143 },
+ { 0x9792, 73173 },
+ { 0x9793, 73167 },
+ { 0x9794, 73216 },
+ { 0x9795, 73155 },
+ { 0x9796, 73113 },
+ { 0x9797, 73203 },
+ { 0x9798, 73149 },
+ { 0x9799, 73179 },
+ { 0x979A, 73185 },
+ { 0x979B, 73083 },
+ { 0x979C, 73089 },
+ { 0x979D, 73101 },
+ { 0x979E, 73222 },
+ { 0x979F, 73095 },
+ { 0x97A0, 73131 },
+ { 0x97A1, 73209 },
+ { 0x97A2, 73197 },
+ { 0x97A3, 73137 },
+ { 0x97A4, 73228 },
+ { 0x97A5, 73119 },
+ { 0x97A6, 73107 },
+ { 0x97A7, 73125 },
+ { 0x97A8, 73191 },
+ { 0x97A9, 72609 },
+ { 0x97AA, 72848 },
+ { 0x97AB, 72830 },
+ { 0x97AC, 72867 },
+ { 0x97AD, 72854 },
+ { 0x97AE, 72903 },
+ { 0x97AF, 72842 },
+ { 0x97B0, 72800 },
+ { 0x97B1, 72897 },
+ { 0x97B2, 72836 },
+ { 0x97B3, 72873 },
+ { 0x97B4, 72879 },
+ { 0x97B5, 72770 },
+ { 0x97B6, 72776 },
+ { 0x97B7, 72788 },
+ { 0x97B8, 72909 },
+ { 0x97B9, 72782 },
+ { 0x97BA, 72818 },
+ { 0x97BB, 72860 },
+ { 0x97BC, 72891 },
+ { 0x97BD, 72824 },
+ { 0x97BE, 72915 },
+ { 0x97BF, 72806 },
+ { 0x97C0, 72794 },
+ { 0x97C1, 72812 },
+ { 0x97C2, 72885 },
+ { 0x97C3, 73240 },
+ { 0x97C4, 73234 },
+ { 0x97C5, 72921 },
+ { 0x97C6, 72603 },
+ { 0x97C7, 72591 },
+ { 0x97C8, 72597 },
+ { 0x97C9, 72585 },
+ { 0x97CA, 70871 },
+ { 0x97CB, 69847 },
+ { 0x97CE, 69631 },
+ { 0x97CF, 69607 },
+ { 0x97D0, 69615 },
+ { 0x97D1, 69643 },
+ { 0x97D2, 69623 },
+ { 0x97D3, 69619 },
+ { 0x97D4, 69611 },
+ { 0x97D5, 69639 },
+ { 0x97D6, 69635 },
+ { 0x97D7, 69627 },
+ { 0x97D8, 74044 },
+ { 0x97D9, 74020 },
+ { 0x97DA, 74028 },
+ { 0x97DB, 74056 },
+ { 0x97DC, 74036 },
+ { 0x97DD, 74032 },
+ { 0x97DE, 74024 },
+ { 0x97DF, 74052 },
+ { 0x97E0, 74048 },
+ { 0x97E1, 74040 },
+ { 0x97E2, 73536 },
+ { 0x97E3, 73512 },
+ { 0x97E4, 73520 },
+ { 0x97E5, 73548 },
+ { 0x97E6, 73528 },
+ { 0x97E7, 73524 },
+ { 0x97E8, 73516 },
+ { 0x97E9, 73544 },
+ { 0x97EA, 73540 },
+ { 0x97EB, 73532 },
+ { 0x97EC, 72295 },
+ { 0x97ED, 72265 },
+ { 0x97EE, 72275 },
+ { 0x97EF, 72310 },
+ { 0x97F0, 72285 },
+ { 0x97F1, 72280 },
+ { 0x97F2, 72270 },
+ { 0x97F3, 72305 },
+ { 0x97F4, 72300 },
+ { 0x97F5, 72290 },
+ { 0x97F6, 72026 },
+ { 0x97F7, 72002 },
+ { 0x97F8, 72010 },
+ { 0x97F9, 72038 },
+ { 0x97FA, 72018 },
+ { 0x97FB, 72014 },
+ { 0x97FC, 72006 },
+ { 0x97FD, 72034 },
+ { 0x97FE, 72030 },
+ { 0x97FF, 72022 },
+ { 0xA000, 41048 },
+ { 0xA001, 41145 },
+ { 0xA002, 41100 },
+ { 0xA003, 41126 },
+ { 0xA004, 41011 },
+ { 0xA005, 41119 },
+ { 0xA006, 41164 },
+ { 0xA007, 41006 },
+ { 0xA008, 41040 },
+ { 0xA009, 41159 },
+ { 0xA00A, 41077 },
+ { 0xA00B, 41062 },
+ { 0xA00C, 41025 },
+ { 0xA00D, 41140 },
+ { 0xA00E, 41114 },
+ { 0xA00F, 41092 },
+ { 0xA010, 40996 },
+ { 0xA011, 41030 },
+ { 0xA012, 41149 },
+ { 0xA013, 41067 },
+ { 0xA014, 41052 },
+ { 0xA015, 41015 },
+ { 0xA016, 41130 },
+ { 0xA017, 41104 },
+ { 0xA018, 41082 },
+ { 0xA019, 41001 },
+ { 0xA01A, 41035 },
+ { 0xA01B, 41154 },
+ { 0xA01C, 41072 },
+ { 0xA01D, 41057 },
+ { 0xA01E, 41020 },
+ { 0xA01F, 41135 },
+ { 0xA020, 41109 },
+ { 0xA021, 41087 },
+ { 0xA022, 41097 },
+ { 0xA023, 41174 },
+ { 0xA024, 41171 },
+ { 0xA025, 41186 },
+ { 0xA026, 41177 },
+ { 0xA027, 41180 },
+ { 0xA028, 41168 },
+ { 0xA029, 41183 },
+ { 0xA02A, 41123 },
+ { 0xA02B, 41045 },
+ { 0xA030, 31231 },
+ { 0xA031, 31382 },
+ { 0xA032, 31385 },
+ { 0xA033, 31388 },
+ { 0xA034, 31391 },
+ { 0xA035, 31394 },
+ { 0xA036, 31397 },
+ { 0xA037, 31400 },
+ { 0xA038, 31403 },
+ { 0xA039, 31406 },
+ { 0xA03A, 31409 },
+ { 0xA03B, 31412 },
+ { 0xA03C, 31415 },
+ { 0xA03D, 31418 },
+ { 0xA03E, 31421 },
+ { 0xA03F, 31424 },
+ { 0xA040, 31427 },
+ { 0xA041, 31430 },
+ { 0xA042, 31433 },
+ { 0xA043, 31436 },
+ { 0xA044, 31439 },
+ { 0xA045, 31442 },
+ { 0xA046, 31445 },
+ { 0xA047, 31448 },
+ { 0xA048, 31451 },
+ { 0xA049, 31454 },
+ { 0xA04A, 31457 },
+ { 0xA04B, 31460 },
+ { 0xA04C, 31463 },
+ { 0xA04D, 31466 },
+ { 0xA04E, 31469 },
+ { 0xA04F, 31472 },
+ { 0xA050, 31475 },
+ { 0xA051, 31478 },
+ { 0xA052, 31481 },
+ { 0xA053, 31484 },
+ { 0xA054, 31487 },
+ { 0xA055, 31490 },
+ { 0xA056, 31493 },
+ { 0xA057, 31496 },
+ { 0xA058, 31499 },
+ { 0xA059, 31502 },
+ { 0xA05A, 31505 },
+ { 0xA05B, 31508 },
+ { 0xA05C, 31511 },
+ { 0xA05D, 31514 },
+ { 0xA05E, 31517 },
+ { 0xA05F, 31520 },
+ { 0xA060, 31523 },
+ { 0xA061, 31526 },
+ { 0xA062, 31227 },
+ { 0xA063, 31235 },
+ { 0xA064, 31238 },
+ { 0xA065, 31241 },
+ { 0xA066, 31244 },
+ { 0xA067, 31247 },
+ { 0xA068, 31250 },
+ { 0xA069, 31253 },
+ { 0xA06A, 31256 },
+ { 0xA06B, 31259 },
+ { 0xA06C, 31262 },
+ { 0xA06D, 31265 },
+ { 0xA06E, 31268 },
+ { 0xA06F, 31271 },
+ { 0xA070, 31274 },
+ { 0xA071, 31277 },
+ { 0xA072, 31280 },
+ { 0xA073, 31283 },
+ { 0xA074, 31286 },
+ { 0xA075, 31289 },
+ { 0xA076, 31292 },
+ { 0xA077, 31295 },
+ { 0xA078, 31298 },
+ { 0xA079, 31301 },
+ { 0xA07A, 31304 },
+ { 0xA07B, 31307 },
+ { 0xA07C, 31310 },
+ { 0xA07D, 31313 },
+ { 0xA07E, 31316 },
+ { 0xA07F, 31319 },
+ { 0xA080, 31322 },
+ { 0xA081, 31325 },
+ { 0xA082, 31328 },
+ { 0xA083, 31331 },
+ { 0xA084, 31334 },
+ { 0xA085, 31337 },
+ { 0xA086, 31340 },
+ { 0xA087, 31343 },
+ { 0xA088, 31346 },
+ { 0xA089, 31349 },
+ { 0xA08A, 31352 },
+ { 0xA08B, 31355 },
+ { 0xA08C, 31358 },
+ { 0xA08D, 31361 },
+ { 0xA08E, 31364 },
+ { 0xA08F, 31367 },
+ { 0xA090, 31370 },
+ { 0xA091, 31373 },
+ { 0xA092, 31376 },
+ { 0xA093, 31379 },
+ { 0xC001, 53726 },
+ { 0xC020, 7517 },
+ { 0xC021, 7564 },
+ { 0xC022, 7551 },
+ { 0xC023, 7527 },
+ { 0xC024, 7521 },
+ { 0xC025, 7530 },
+ { 0xC026, 7546 },
+ { 0xC027, 7556 },
+ { 0xC028, 7203 },
+ { 0xC029, 7514 },
+ { 0xC02A, 7538 },
+ { 0xC02B, 7206 },
+ { 0xC02C, 7211 },
+ { 0xC02D, 7570 },
+ { 0xC02E, 7192 },
+ { 0xC02F, 7536 },
+ { 0xC030, 7231 },
+ { 0xC031, 7213 },
+ { 0xC032, 7219 },
+ { 0xC033, 7240 },
+ { 0xC034, 7225 },
+ { 0xC035, 7222 },
+ { 0xC036, 7216 },
+ { 0xC037, 7237 },
+ { 0xC038, 7234 },
+ { 0xC039, 7228 },
+ { 0xC03A, 7209 },
+ { 0xC03B, 7554 },
+ { 0xC03C, 7548 },
+ { 0xC03D, 7524 },
+ { 0xC03E, 7567 },
+ { 0xC03F, 7540 },
+ { 0xC040, 7561 },
+ { 0xC041, 7376 },
+ { 0xC042, 7381 },
+ { 0xC043, 7386 },
+ { 0xC044, 7391 },
+ { 0xC045, 7396 },
+ { 0xC046, 7401 },
+ { 0xC047, 7406 },
+ { 0xC048, 7411 },
+ { 0xC049, 7416 },
+ { 0xC04A, 7421 },
+ { 0xC04B, 7426 },
+ { 0xC04C, 7431 },
+ { 0xC04D, 7436 },
+ { 0xC04E, 7441 },
+ { 0xC04F, 7446 },
+ { 0xC050, 7451 },
+ { 0xC051, 7456 },
+ { 0xC052, 7461 },
+ { 0xC053, 7466 },
+ { 0xC054, 7471 },
+ { 0xC055, 7476 },
+ { 0xC056, 7481 },
+ { 0xC057, 7486 },
+ { 0xC058, 7491 },
+ { 0xC059, 7496 },
+ { 0xC05A, 7501 },
+ { 0xC05B, 7199 },
+ { 0xC05C, 7533 },
+ { 0xC05D, 7510 },
+ { 0xC05E, 7558 },
+ { 0xC05F, 7189 },
+ { 0xC060, 7243 },
+ { 0xC061, 7246 },
+ { 0xC062, 7251 },
+ { 0xC063, 7256 },
+ { 0xC064, 7261 },
+ { 0xC065, 7266 },
+ { 0xC066, 7271 },
+ { 0xC067, 7276 },
+ { 0xC068, 7281 },
+ { 0xC069, 7286 },
+ { 0xC06A, 7291 },
+ { 0xC06B, 7296 },
+ { 0xC06C, 7301 },
+ { 0xC06D, 7306 },
+ { 0xC06E, 7311 },
+ { 0xC06F, 7316 },
+ { 0xC070, 7321 },
+ { 0xC071, 7326 },
+ { 0xC072, 7331 },
+ { 0xC073, 7336 },
+ { 0xC074, 7341 },
+ { 0xC075, 7346 },
+ { 0xC076, 7351 },
+ { 0xC077, 7356 },
+ { 0xC078, 7361 },
+ { 0xC079, 7366 },
+ { 0xC07A, 7371 },
+ { 0xC07B, 7195 },
+ { 0xC07C, 7543 },
+ { 0xC07D, 7506 },
+ { 0xC07E, 7519 },
+ { 0xC07F, 30315 },
+ { 0xC100, 66346 },
+ { 0xC101, 66348 },
+ { 0xC102, 66350 },
+ { 0xC103, 66352 },
+ { 0xC104, 66354 },
+ { 0xC105, 66356 },
+ { 0xC106, 66358 },
+ { 0xC107, 66360 },
+ { 0xC108, 66362 },
+ { 0xC109, 66364 },
+ { 0xC10A, 66366 },
+ { 0xC10B, 66368 },
+ { 0xC10C, 66370 },
+ { 0xC10D, 66372 },
+ { 0xC10E, 66374 },
+ { 0xC10F, 66376 },
+ { 0xC110, 66378 },
+ { 0xC111, 66380 },
+ { 0xC112, 66382 },
+ { 0xC113, 66384 },
+ { 0xC114, 66386 },
+ { 0xC115, 66388 },
+ { 0xC116, 66390 },
+ { 0xC117, 66392 },
+ { 0xC118, 66394 },
+ { 0xC119, 66396 },
+ { 0xC11A, 66398 },
+ { 0xC11B, 66400 },
+ { 0xC11C, 66402 },
+ { 0xC11D, 66404 },
+ { 0xC11E, 66406 },
+ { 0xC11F, 66408 },
+ { 0xC120, 66410 },
+ { 0xC121, 66412 },
+ { 0xC122, 66414 },
+ { 0xC123, 66416 },
+ { 0xC124, 66418 },
+ { 0xC125, 66420 },
+ { 0xC126, 66422 },
+ { 0xC127, 66424 },
+ { 0xC128, 66426 },
+ { 0xC129, 66428 },
+ { 0xC12A, 66430 },
+ { 0xC12B, 66432 },
+ { 0xC12C, 66434 },
+ { 0xC12D, 66436 },
+ { 0xC12E, 66438 },
+ { 0xC12F, 66440 },
+ { 0xC130, 66442 },
+ { 0xC131, 66444 },
+ { 0xC132, 66446 },
+ { 0xC133, 66448 },
+ { 0xC134, 66450 },
+ { 0xC135, 66452 },
+ { 0xC136, 66454 },
+ { 0xC137, 66456 },
+ { 0xC138, 66458 },
+ { 0xC139, 66460 },
+ { 0xC13A, 66462 },
+ { 0xC13B, 66464 },
+ { 0xC13C, 66466 },
+ { 0xC13D, 66468 },
+ { 0xC13E, 66470 },
+ { 0xC13F, 66472 },
+ { 0xC140, 66474 },
+ { 0xC141, 66476 },
+ { 0xC142, 66478 },
+ { 0xC143, 66480 },
+ { 0xC144, 66482 },
+ { 0xC145, 66484 },
+ { 0xC146, 66486 },
+ { 0xC147, 66488 },
+ { 0xC148, 66490 },
+ { 0xC149, 66492 },
+ { 0xC14A, 66494 },
+ { 0xC14B, 66496 },
+ { 0xC14C, 66498 },
+ { 0xC14D, 66500 },
+ { 0xC14E, 66502 },
+ { 0xC14F, 66504 },
+ { 0xC150, 66506 },
+ { 0xC151, 66508 },
+ { 0xC152, 66510 },
+ { 0xC153, 66512 },
+ { 0xC154, 66514 },
+ { 0xC155, 66516 },
+ { 0xC156, 66518 },
+ { 0xC157, 66520 },
+ { 0xC158, 66522 },
+ { 0xC159, 66524 },
+ { 0xC15A, 66526 },
+ { 0xC15B, 66528 },
+ { 0xC15C, 66530 },
+ { 0xC15D, 66532 },
+ { 0xC15E, 66534 },
+ { 0xC15F, 66536 },
+ { 0xC160, 66538 },
+ { 0xC161, 66540 },
+ { 0xC162, 66542 },
+ { 0xC163, 66544 },
+ { 0xC164, 66546 },
+ { 0xC165, 66548 },
+ { 0xC166, 66550 },
+ { 0xC167, 66552 },
+ { 0xC168, 66554 },
+ { 0xC169, 66556 },
+ { 0xC16A, 66558 },
+ { 0xC16B, 66560 },
+ { 0xC16C, 66562 },
+ { 0xC16D, 66564 },
+ { 0xC16E, 66566 },
+ { 0xC16F, 66568 },
+ { 0xC170, 66570 },
+ { 0xC171, 66572 },
+ { 0xC172, 66574 },
+ { 0xC173, 66576 },
+ { 0xC174, 66578 },
+ { 0xC175, 66580 },
+ { 0xC176, 66582 },
+ { 0xC177, 66584 },
+ { 0xC178, 66586 },
+ { 0xC179, 66588 },
+ { 0xC17A, 66590 },
+ { 0xC17B, 66592 },
+ { 0xC17C, 66594 },
+ { 0xC17D, 66596 },
+ { 0xC17E, 66598 },
+ { 0xC17F, 66600 },
+ { 0xC180, 66602 },
+ { 0xC181, 66604 },
+ { 0xC182, 66606 },
+ { 0xC183, 66608 },
+ { 0xC184, 66610 },
+ { 0xC185, 66612 },
+ { 0xC186, 66614 },
+ { 0xC187, 66616 },
+ { 0xC188, 66618 },
+ { 0xC189, 66620 },
+ { 0xC18A, 66622 },
+ { 0xC18B, 66624 },
+ { 0xC18C, 66626 },
+ { 0xC18D, 66628 },
+ { 0xC18E, 66630 },
+ { 0xC18F, 66632 },
+ { 0xC190, 66634 },
+ { 0xC191, 66636 },
+ { 0xC192, 66638 },
+ { 0xC193, 66640 },
+ { 0xC194, 66642 },
+ { 0xC195, 66644 },
+ { 0xC196, 66646 },
+ { 0xC197, 66648 },
+ { 0xC198, 66650 },
+ { 0xC199, 66652 },
+ { 0xC19A, 66654 },
+ { 0xC19B, 66656 },
+ { 0xC19C, 66658 },
+ { 0xC19D, 66660 },
+ { 0xC19E, 66662 },
+ { 0xC19F, 66664 },
+ { 0xC1A0, 66666 },
+ { 0xC1A1, 66668 },
+ { 0xC1A2, 66670 },
+ { 0xC1A3, 66672 },
+ { 0xC1A4, 66674 },
+ { 0xC1A5, 66676 },
+ { 0xC1A6, 66678 },
+ { 0xC1A7, 66680 },
+ { 0xC1A8, 66682 },
+ { 0xC1A9, 66684 },
+ { 0xC1AA, 66686 },
+ { 0xC1AB, 66688 },
+ { 0xC1AC, 66690 },
+ { 0xC1AD, 66692 },
+ { 0xC1AE, 66694 },
+ { 0xC1AF, 66696 },
+ { 0xC1B0, 66698 },
+ { 0xC1B1, 66700 },
+ { 0xC1B2, 66702 },
+ { 0xC1B3, 66704 },
+ { 0xC1B4, 66706 },
+ { 0xC1B5, 66708 },
+ { 0xC1B6, 66710 },
+ { 0xC1B7, 66712 },
+ { 0xC1B8, 66714 },
+ { 0xC1B9, 66716 },
+ { 0xC1BA, 66718 },
+ { 0xC1BB, 66720 },
+ { 0xC1BC, 66722 },
+ { 0xC1BD, 66724 },
+ { 0xC1BE, 66726 },
+ { 0xC1BF, 66728 },
+ { 0xC1C0, 66730 },
+ { 0xC1C1, 66732 },
+ { 0xC1C2, 66734 },
+ { 0xC1C3, 66736 },
+ { 0xC1C4, 66738 },
+ { 0xC1C5, 66740 },
+ { 0xC1C6, 66742 },
+ { 0xC1C7, 66744 },
+ { 0xC1C8, 66746 },
+ { 0xC1C9, 66748 },
+ { 0xC1CA, 66750 },
+ { 0xC1CB, 66752 },
+ { 0xC1CC, 66754 },
+ { 0xC1CD, 66756 },
+ { 0xC1CE, 66758 },
+ { 0xC1CF, 66760 },
+ { 0xC1D0, 66762 },
+ { 0xC1D1, 66764 },
+ { 0xC1D2, 66766 },
+ { 0xC1D3, 66768 },
+ { 0xC1D4, 66770 },
+ { 0xC1D5, 66772 },
+ { 0xC1D6, 66774 },
+ { 0xC1D7, 66776 },
+ { 0xC1D8, 66778 },
+ { 0xC1D9, 66780 },
+ { 0xC1DA, 66782 },
+ { 0xC1DB, 66784 },
+ { 0xC1DC, 66786 },
+ { 0xC1DD, 66788 },
+ { 0xC1DE, 66790 },
+ { 0xC1DF, 66792 },
+ { 0xC1E0, 66794 },
+ { 0xC1E1, 66796 },
+ { 0xC1E2, 66798 },
+ { 0xC1E3, 66800 },
+ { 0xC1E4, 66802 },
+ { 0xC1E5, 66804 },
+ { 0xC1E6, 66806 },
+ { 0xC1E7, 66808 },
+ { 0xC1E8, 66810 },
+ { 0xC1E9, 66812 },
+ { 0xC1EA, 66814 },
+ { 0xC1EB, 66816 },
+ { 0xC1EC, 66818 },
+ { 0xC1ED, 66820 },
+ { 0xC1EE, 66822 },
+ { 0xC1EF, 66824 },
+};
+#define UNICODE_CHARNAME_MAX_LENGTH 83
+#define UNICODE_CHARNAME_MAX_WORDS 13
diff --git a/gnulib/lib/uninorm.in.h b/gnulib/lib/uninorm.in.h
new file mode 100644
index 0000000..a40cc33
--- /dev/null
+++ b/gnulib/lib/uninorm.in.h
@@ -0,0 +1,245 @@
+/* Normalization forms (composition and decomposition) of Unicode strings.
+ Copyright (C) 2001-2002, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNINORM_H
+#define _UNINORM_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+
+enum
+{
+ UC_DECOMP_CANONICAL,/* Canonical decomposition. */
+ UC_DECOMP_FONT, /* <font> A font variant (e.g. a blackletter form). */
+ UC_DECOMP_NOBREAK, /* <noBreak> A no-break version of a space or hyphen. */
+ UC_DECOMP_INITIAL, /* <initial> An initial presentation form (Arabic). */
+ UC_DECOMP_MEDIAL, /* <medial> A medial presentation form (Arabic). */
+ UC_DECOMP_FINAL, /* <final> A final presentation form (Arabic). */
+ UC_DECOMP_ISOLATED,/* <isolated> An isolated presentation form (Arabic). */
+ UC_DECOMP_CIRCLE, /* <circle> An encircled form. */
+ UC_DECOMP_SUPER, /* <super> A superscript form. */
+ UC_DECOMP_SUB, /* <sub> A subscript form. */
+ UC_DECOMP_VERTICAL,/* <vertical> A vertical layout presentation form. */
+ UC_DECOMP_WIDE, /* <wide> A wide (or zenkaku) compatibility character. */
+ UC_DECOMP_NARROW, /* <narrow> A narrow (or hankaku) compatibility character. */
+ UC_DECOMP_SMALL, /* <small> A small variant form (CNS compatibility). */
+ UC_DECOMP_SQUARE, /* <square> A CJK squared font variant. */
+ UC_DECOMP_FRACTION,/* <fraction> A vulgar fraction form. */
+ UC_DECOMP_COMPAT /* <compat> Otherwise unspecified compatibility character. */
+};
+
+/* Maximum size of decomposition of a single Unicode character. */
+#define UC_DECOMPOSITION_MAX_LENGTH 32
+
+/* Return the character decomposition mapping of a Unicode character.
+ DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
+ ucs_t elements.
+ When a decomposition exists, DECOMPOSITION[0..N-1] and *DECOMP_TAG are
+ filled and N is returned. Otherwise -1 is returned. */
+extern int
+ uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition);
+
+/* Return the canonical character decomposition mapping of a Unicode character.
+ DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
+ ucs_t elements.
+ When a decomposition exists, DECOMPOSITION[0..N-1] is filled and N is
+ returned. Otherwise -1 is returned. */
+extern int
+ uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+
+/* Attempt to combine the Unicode characters uc1, uc2.
+ uc1 is known to have canonical combining class 0.
+ Return the combination of uc1 and uc2, if it exists.
+ Return 0 otherwise.
+ Not all decompositions can be recombined using this function. See the
+ Unicode file CompositionExclusions.txt for details. */
+extern ucs4_t
+ uc_composition (ucs4_t uc1, ucs4_t uc2);
+
+
+/* An object of type uninorm_t denotes a Unicode normalization form. */
+struct unicode_normalization_form;
+typedef const struct unicode_normalization_form *uninorm_t;
+
+/* UNINORM_NFD: Normalization form D: canonical decomposition. */
+extern const struct unicode_normalization_form uninorm_nfd;
+#define UNINORM_NFD (&uninorm_nfd)
+
+/* UNINORM_NFC: Normalization form C: canonical decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfc;
+#define UNINORM_NFC (&uninorm_nfc)
+
+/* UNINORM_NFKD: Normalization form KD: compatibility decomposition. */
+extern const struct unicode_normalization_form uninorm_nfkd;
+#define UNINORM_NFKD (&uninorm_nfkd)
+
+/* UNINORM_NFKC: Normalization form KC: compatibility decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfkc;
+#define UNINORM_NFKC (&uninorm_nfkc)
+
+/* Test whether a normalization form does compatibility decomposition. */
+#define uninorm_is_compat_decomposing(nf) \
+ ((* (const unsigned int *) (nf) >> 0) & 1)
+
+/* Test whether a normalization form includes canonical composition. */
+#define uninorm_is_composing(nf) \
+ ((* (const unsigned int *) (nf) >> 1) & 1)
+
+/* Return the decomposing variant of a normalization form.
+ This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD. */
+extern uninorm_t uninorm_decomposing_form (uninorm_t nf);
+
+
+/* Return the specified normalization form of a string. */
+extern uint8_t *
+ u8_normalize (uninorm_t nf, const uint8_t *s, size_t n,
+ uint8_t *resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_normalize (uninorm_t nf, const uint16_t *s, size_t n,
+ uint16_t *resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_normalize (uninorm_t nf, const uint32_t *s, size_t n,
+ uint32_t *resultbuf, size_t *lengthp);
+
+
+/* Compare S1 and S2, ignoring differences in normalization.
+ NF must be either UNINORM_NFD or UNINORM_NFKD.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Converts the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_normxfrm (S1) and uN_normxfrm (S2) with uN_cmp2() is
+ equivalent to comparing S1 and S2 with uN_normcoll().
+ NF must be either UNINORM_NFC or UNINORM_NFKC. */
+extern char *
+ u8_normxfrm (const uint8_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u16_normxfrm (const uint16_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u32_normxfrm (const uint32_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+
+
+/* Compare S1 and S2, ignoring differences in normalization, using the
+ collation rules of the current locale.
+ NF must be either UNINORM_NFC or UNINORM_NFKC.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Normalization of a stream of Unicode characters.
+
+ A "stream of Unicode characters" is essentially a function that accepts an
+ ucs4_t argument repeatedly, optionally combined with a function that
+ "flushes" the stream. */
+
+/* Data type of a stream of Unicode characters that normalizes its input
+ according to a given normalization form and passes the normalized character
+ sequence to the encapsulated stream of Unicode characters. */
+struct uninorm_filter;
+
+/* Create and return a normalization filter for Unicode characters.
+ The pair (stream_func, stream_data) is the encapsulated stream.
+ stream_func (stream_data, uc) receives the Unicode character uc
+ and returns 0 if successful, or -1 with errno set upon failure.
+ Return the new filter, or NULL with errno set upon failure. */
+extern struct uninorm_filter *
+ uninorm_filter_create (uninorm_t nf,
+ int (*stream_func) (void *stream_data, ucs4_t uc),
+ void *stream_data);
+
+/* Stuff a Unicode character into a normalizing filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream.
+ Return 0 if successful, or -1 with errno set upon failure.
+ Note! If after calling this function, additional characters are written
+ into the filter, the resulting character sequence in the encapsulated stream
+ will not necessarily be normalized. */
+extern int
+ uninorm_filter_flush (struct uninorm_filter *filter);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream, then close and free the filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_free (struct uninorm_filter *filter);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNINORM_H */
diff --git a/gnulib/lib/uninorm/canonical-decomposition.c b/gnulib/lib/uninorm/canonical-decomposition.c
new file mode 100644
index 0000000..944a187
--- /dev/null
+++ b/gnulib/lib/uninorm/canonical-decomposition.c
@@ -0,0 +1,108 @@
+/* Canonical decomposition of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <stdlib.h>
+
+#include "decomposition-table.h"
+
+int
+uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition)
+{
+ if (uc >= 0xAC00 && uc < 0xD7A4)
+ {
+ /* Hangul syllable. See Unicode standard, chapter 3, section
+ "Hangul Syllable Decomposition", See also the clarification at
+ <http://www.unicode.org/versions/Unicode5.1.0/>, section
+ "Clarification of Hangul Jamo Handling". */
+ unsigned int t;
+
+ uc -= 0xAC00;
+ t = uc % 28;
+
+ if (t == 0)
+ {
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ return 2;
+ }
+ else
+ {
+#if 1 /* Return the pairwise decomposition, not the full decomposition. */
+ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */
+ decomposition[1] = 0x11A7 + t;
+ return 2;
+#else
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ decomposition[2] = 0x11A7 + t;
+ return 3;
+#endif
+ }
+ }
+ else if (uc < 0x110000)
+ {
+ unsigned short entry = decomp_index (uc);
+ /* An entry of (unsigned short)(-1) denotes an absent entry.
+ Otherwise, bit 15 of the entry tells whether the decomposition
+ is a canonical one. */
+ if (entry < 0x8000)
+ {
+ const unsigned char *p;
+ unsigned int element;
+ unsigned int length;
+
+ p = &gl_uninorm_decomp_chars_table[3 * entry];
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ /* The first element has 5 bits for the decomposition type. */
+ if (((element >> 18) & 0x1f) != UC_DECOMP_CANONICAL)
+ abort ();
+ length = 1;
+ for (;;)
+ {
+ /* Every element has an 18 bits wide Unicode code point. */
+ *decomposition = element & 0x3ffff;
+ /* Bit 23 tells whether there are more elements, */
+ if ((element & (1 << 23)) == 0)
+ break;
+ p += 3;
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ decomposition++;
+ length++;
+ }
+ return length;
+ }
+ }
+ return -1;
+}
+
diff --git a/gnulib/lib/uninorm/compat-decomposition.c b/gnulib/lib/uninorm/compat-decomposition.c
new file mode 100644
index 0000000..e84d3ef
--- /dev/null
+++ b/gnulib/lib/uninorm/compat-decomposition.c
@@ -0,0 +1,31 @@
+/* Compatibility decomposition of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "decompose-internal.h"
+
+#include "uninorm.h"
+
+int
+uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition)
+{
+ int tag;
+
+ return uc_decomposition (uc, &tag, decomposition);
+}
diff --git a/gnulib/lib/uninorm/composition-table.gperf b/gnulib/lib/uninorm/composition-table.gperf
new file mode 100644
index 0000000..fde9b91
--- /dev/null
+++ b/gnulib/lib/uninorm/composition-table.gperf
@@ -0,0 +1,961 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Canonical composition of Unicode characters. */
+/* Generated automatically by gen-uni-tables for Unicode 6.0.0. */
+
+/* Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+struct composition_rule { char codes[6]; };
+%struct-type
+%language=ANSI-C
+%define slot-name codes
+%define hash-function-name gl_uninorm_compose_hash
+%define lookup-function-name gl_uninorm_compose_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%omit-struct-type
+%%
+"\x00\x00\x41\x00\x03\x00", 0x00c0
+"\x00\x00\x41\x00\x03\x01", 0x00c1
+"\x00\x00\x41\x00\x03\x02", 0x00c2
+"\x00\x00\x41\x00\x03\x03", 0x00c3
+"\x00\x00\x41\x00\x03\x08", 0x00c4
+"\x00\x00\x41\x00\x03\x0a", 0x00c5
+"\x00\x00\x43\x00\x03\x27", 0x00c7
+"\x00\x00\x45\x00\x03\x00", 0x00c8
+"\x00\x00\x45\x00\x03\x01", 0x00c9
+"\x00\x00\x45\x00\x03\x02", 0x00ca
+"\x00\x00\x45\x00\x03\x08", 0x00cb
+"\x00\x00\x49\x00\x03\x00", 0x00cc
+"\x00\x00\x49\x00\x03\x01", 0x00cd
+"\x00\x00\x49\x00\x03\x02", 0x00ce
+"\x00\x00\x49\x00\x03\x08", 0x00cf
+"\x00\x00\x4e\x00\x03\x03", 0x00d1
+"\x00\x00\x4f\x00\x03\x00", 0x00d2
+"\x00\x00\x4f\x00\x03\x01", 0x00d3
+"\x00\x00\x4f\x00\x03\x02", 0x00d4
+"\x00\x00\x4f\x00\x03\x03", 0x00d5
+"\x00\x00\x4f\x00\x03\x08", 0x00d6
+"\x00\x00\x55\x00\x03\x00", 0x00d9
+"\x00\x00\x55\x00\x03\x01", 0x00da
+"\x00\x00\x55\x00\x03\x02", 0x00db
+"\x00\x00\x55\x00\x03\x08", 0x00dc
+"\x00\x00\x59\x00\x03\x01", 0x00dd
+"\x00\x00\x61\x00\x03\x00", 0x00e0
+"\x00\x00\x61\x00\x03\x01", 0x00e1
+"\x00\x00\x61\x00\x03\x02", 0x00e2
+"\x00\x00\x61\x00\x03\x03", 0x00e3
+"\x00\x00\x61\x00\x03\x08", 0x00e4
+"\x00\x00\x61\x00\x03\x0a", 0x00e5
+"\x00\x00\x63\x00\x03\x27", 0x00e7
+"\x00\x00\x65\x00\x03\x00", 0x00e8
+"\x00\x00\x65\x00\x03\x01", 0x00e9
+"\x00\x00\x65\x00\x03\x02", 0x00ea
+"\x00\x00\x65\x00\x03\x08", 0x00eb
+"\x00\x00\x69\x00\x03\x00", 0x00ec
+"\x00\x00\x69\x00\x03\x01", 0x00ed
+"\x00\x00\x69\x00\x03\x02", 0x00ee
+"\x00\x00\x69\x00\x03\x08", 0x00ef
+"\x00\x00\x6e\x00\x03\x03", 0x00f1
+"\x00\x00\x6f\x00\x03\x00", 0x00f2
+"\x00\x00\x6f\x00\x03\x01", 0x00f3
+"\x00\x00\x6f\x00\x03\x02", 0x00f4
+"\x00\x00\x6f\x00\x03\x03", 0x00f5
+"\x00\x00\x6f\x00\x03\x08", 0x00f6
+"\x00\x00\x75\x00\x03\x00", 0x00f9
+"\x00\x00\x75\x00\x03\x01", 0x00fa
+"\x00\x00\x75\x00\x03\x02", 0x00fb
+"\x00\x00\x75\x00\x03\x08", 0x00fc
+"\x00\x00\x79\x00\x03\x01", 0x00fd
+"\x00\x00\x79\x00\x03\x08", 0x00ff
+"\x00\x00\x41\x00\x03\x04", 0x0100
+"\x00\x00\x61\x00\x03\x04", 0x0101
+"\x00\x00\x41\x00\x03\x06", 0x0102
+"\x00\x00\x61\x00\x03\x06", 0x0103
+"\x00\x00\x41\x00\x03\x28", 0x0104
+"\x00\x00\x61\x00\x03\x28", 0x0105
+"\x00\x00\x43\x00\x03\x01", 0x0106
+"\x00\x00\x63\x00\x03\x01", 0x0107
+"\x00\x00\x43\x00\x03\x02", 0x0108
+"\x00\x00\x63\x00\x03\x02", 0x0109
+"\x00\x00\x43\x00\x03\x07", 0x010a
+"\x00\x00\x63\x00\x03\x07", 0x010b
+"\x00\x00\x43\x00\x03\x0c", 0x010c
+"\x00\x00\x63\x00\x03\x0c", 0x010d
+"\x00\x00\x44\x00\x03\x0c", 0x010e
+"\x00\x00\x64\x00\x03\x0c", 0x010f
+"\x00\x00\x45\x00\x03\x04", 0x0112
+"\x00\x00\x65\x00\x03\x04", 0x0113
+"\x00\x00\x45\x00\x03\x06", 0x0114
+"\x00\x00\x65\x00\x03\x06", 0x0115
+"\x00\x00\x45\x00\x03\x07", 0x0116
+"\x00\x00\x65\x00\x03\x07", 0x0117
+"\x00\x00\x45\x00\x03\x28", 0x0118
+"\x00\x00\x65\x00\x03\x28", 0x0119
+"\x00\x00\x45\x00\x03\x0c", 0x011a
+"\x00\x00\x65\x00\x03\x0c", 0x011b
+"\x00\x00\x47\x00\x03\x02", 0x011c
+"\x00\x00\x67\x00\x03\x02", 0x011d
+"\x00\x00\x47\x00\x03\x06", 0x011e
+"\x00\x00\x67\x00\x03\x06", 0x011f
+"\x00\x00\x47\x00\x03\x07", 0x0120
+"\x00\x00\x67\x00\x03\x07", 0x0121
+"\x00\x00\x47\x00\x03\x27", 0x0122
+"\x00\x00\x67\x00\x03\x27", 0x0123
+"\x00\x00\x48\x00\x03\x02", 0x0124
+"\x00\x00\x68\x00\x03\x02", 0x0125
+"\x00\x00\x49\x00\x03\x03", 0x0128
+"\x00\x00\x69\x00\x03\x03", 0x0129
+"\x00\x00\x49\x00\x03\x04", 0x012a
+"\x00\x00\x69\x00\x03\x04", 0x012b
+"\x00\x00\x49\x00\x03\x06", 0x012c
+"\x00\x00\x69\x00\x03\x06", 0x012d
+"\x00\x00\x49\x00\x03\x28", 0x012e
+"\x00\x00\x69\x00\x03\x28", 0x012f
+"\x00\x00\x49\x00\x03\x07", 0x0130
+"\x00\x00\x4a\x00\x03\x02", 0x0134
+"\x00\x00\x6a\x00\x03\x02", 0x0135
+"\x00\x00\x4b\x00\x03\x27", 0x0136
+"\x00\x00\x6b\x00\x03\x27", 0x0137
+"\x00\x00\x4c\x00\x03\x01", 0x0139
+"\x00\x00\x6c\x00\x03\x01", 0x013a
+"\x00\x00\x4c\x00\x03\x27", 0x013b
+"\x00\x00\x6c\x00\x03\x27", 0x013c
+"\x00\x00\x4c\x00\x03\x0c", 0x013d
+"\x00\x00\x6c\x00\x03\x0c", 0x013e
+"\x00\x00\x4e\x00\x03\x01", 0x0143
+"\x00\x00\x6e\x00\x03\x01", 0x0144
+"\x00\x00\x4e\x00\x03\x27", 0x0145
+"\x00\x00\x6e\x00\x03\x27", 0x0146
+"\x00\x00\x4e\x00\x03\x0c", 0x0147
+"\x00\x00\x6e\x00\x03\x0c", 0x0148
+"\x00\x00\x4f\x00\x03\x04", 0x014c
+"\x00\x00\x6f\x00\x03\x04", 0x014d
+"\x00\x00\x4f\x00\x03\x06", 0x014e
+"\x00\x00\x6f\x00\x03\x06", 0x014f
+"\x00\x00\x4f\x00\x03\x0b", 0x0150
+"\x00\x00\x6f\x00\x03\x0b", 0x0151
+"\x00\x00\x52\x00\x03\x01", 0x0154
+"\x00\x00\x72\x00\x03\x01", 0x0155
+"\x00\x00\x52\x00\x03\x27", 0x0156
+"\x00\x00\x72\x00\x03\x27", 0x0157
+"\x00\x00\x52\x00\x03\x0c", 0x0158
+"\x00\x00\x72\x00\x03\x0c", 0x0159
+"\x00\x00\x53\x00\x03\x01", 0x015a
+"\x00\x00\x73\x00\x03\x01", 0x015b
+"\x00\x00\x53\x00\x03\x02", 0x015c
+"\x00\x00\x73\x00\x03\x02", 0x015d
+"\x00\x00\x53\x00\x03\x27", 0x015e
+"\x00\x00\x73\x00\x03\x27", 0x015f
+"\x00\x00\x53\x00\x03\x0c", 0x0160
+"\x00\x00\x73\x00\x03\x0c", 0x0161
+"\x00\x00\x54\x00\x03\x27", 0x0162
+"\x00\x00\x74\x00\x03\x27", 0x0163
+"\x00\x00\x54\x00\x03\x0c", 0x0164
+"\x00\x00\x74\x00\x03\x0c", 0x0165
+"\x00\x00\x55\x00\x03\x03", 0x0168
+"\x00\x00\x75\x00\x03\x03", 0x0169
+"\x00\x00\x55\x00\x03\x04", 0x016a
+"\x00\x00\x75\x00\x03\x04", 0x016b
+"\x00\x00\x55\x00\x03\x06", 0x016c
+"\x00\x00\x75\x00\x03\x06", 0x016d
+"\x00\x00\x55\x00\x03\x0a", 0x016e
+"\x00\x00\x75\x00\x03\x0a", 0x016f
+"\x00\x00\x55\x00\x03\x0b", 0x0170
+"\x00\x00\x75\x00\x03\x0b", 0x0171
+"\x00\x00\x55\x00\x03\x28", 0x0172
+"\x00\x00\x75\x00\x03\x28", 0x0173
+"\x00\x00\x57\x00\x03\x02", 0x0174
+"\x00\x00\x77\x00\x03\x02", 0x0175
+"\x00\x00\x59\x00\x03\x02", 0x0176
+"\x00\x00\x79\x00\x03\x02", 0x0177
+"\x00\x00\x59\x00\x03\x08", 0x0178
+"\x00\x00\x5a\x00\x03\x01", 0x0179
+"\x00\x00\x7a\x00\x03\x01", 0x017a
+"\x00\x00\x5a\x00\x03\x07", 0x017b
+"\x00\x00\x7a\x00\x03\x07", 0x017c
+"\x00\x00\x5a\x00\x03\x0c", 0x017d
+"\x00\x00\x7a\x00\x03\x0c", 0x017e
+"\x00\x00\x4f\x00\x03\x1b", 0x01a0
+"\x00\x00\x6f\x00\x03\x1b", 0x01a1
+"\x00\x00\x55\x00\x03\x1b", 0x01af
+"\x00\x00\x75\x00\x03\x1b", 0x01b0
+"\x00\x00\x41\x00\x03\x0c", 0x01cd
+"\x00\x00\x61\x00\x03\x0c", 0x01ce
+"\x00\x00\x49\x00\x03\x0c", 0x01cf
+"\x00\x00\x69\x00\x03\x0c", 0x01d0
+"\x00\x00\x4f\x00\x03\x0c", 0x01d1
+"\x00\x00\x6f\x00\x03\x0c", 0x01d2
+"\x00\x00\x55\x00\x03\x0c", 0x01d3
+"\x00\x00\x75\x00\x03\x0c", 0x01d4
+"\x00\x00\xdc\x00\x03\x04", 0x01d5
+"\x00\x00\xfc\x00\x03\x04", 0x01d6
+"\x00\x00\xdc\x00\x03\x01", 0x01d7
+"\x00\x00\xfc\x00\x03\x01", 0x01d8
+"\x00\x00\xdc\x00\x03\x0c", 0x01d9
+"\x00\x00\xfc\x00\x03\x0c", 0x01da
+"\x00\x00\xdc\x00\x03\x00", 0x01db
+"\x00\x00\xfc\x00\x03\x00", 0x01dc
+"\x00\x00\xc4\x00\x03\x04", 0x01de
+"\x00\x00\xe4\x00\x03\x04", 0x01df
+"\x00\x02\x26\x00\x03\x04", 0x01e0
+"\x00\x02\x27\x00\x03\x04", 0x01e1
+"\x00\x00\xc6\x00\x03\x04", 0x01e2
+"\x00\x00\xe6\x00\x03\x04", 0x01e3
+"\x00\x00\x47\x00\x03\x0c", 0x01e6
+"\x00\x00\x67\x00\x03\x0c", 0x01e7
+"\x00\x00\x4b\x00\x03\x0c", 0x01e8
+"\x00\x00\x6b\x00\x03\x0c", 0x01e9
+"\x00\x00\x4f\x00\x03\x28", 0x01ea
+"\x00\x00\x6f\x00\x03\x28", 0x01eb
+"\x00\x01\xea\x00\x03\x04", 0x01ec
+"\x00\x01\xeb\x00\x03\x04", 0x01ed
+"\x00\x01\xb7\x00\x03\x0c", 0x01ee
+"\x00\x02\x92\x00\x03\x0c", 0x01ef
+"\x00\x00\x6a\x00\x03\x0c", 0x01f0
+"\x00\x00\x47\x00\x03\x01", 0x01f4
+"\x00\x00\x67\x00\x03\x01", 0x01f5
+"\x00\x00\x4e\x00\x03\x00", 0x01f8
+"\x00\x00\x6e\x00\x03\x00", 0x01f9
+"\x00\x00\xc5\x00\x03\x01", 0x01fa
+"\x00\x00\xe5\x00\x03\x01", 0x01fb
+"\x00\x00\xc6\x00\x03\x01", 0x01fc
+"\x00\x00\xe6\x00\x03\x01", 0x01fd
+"\x00\x00\xd8\x00\x03\x01", 0x01fe
+"\x00\x00\xf8\x00\x03\x01", 0x01ff
+"\x00\x00\x41\x00\x03\x0f", 0x0200
+"\x00\x00\x61\x00\x03\x0f", 0x0201
+"\x00\x00\x41\x00\x03\x11", 0x0202
+"\x00\x00\x61\x00\x03\x11", 0x0203
+"\x00\x00\x45\x00\x03\x0f", 0x0204
+"\x00\x00\x65\x00\x03\x0f", 0x0205
+"\x00\x00\x45\x00\x03\x11", 0x0206
+"\x00\x00\x65\x00\x03\x11", 0x0207
+"\x00\x00\x49\x00\x03\x0f", 0x0208
+"\x00\x00\x69\x00\x03\x0f", 0x0209
+"\x00\x00\x49\x00\x03\x11", 0x020a
+"\x00\x00\x69\x00\x03\x11", 0x020b
+"\x00\x00\x4f\x00\x03\x0f", 0x020c
+"\x00\x00\x6f\x00\x03\x0f", 0x020d
+"\x00\x00\x4f\x00\x03\x11", 0x020e
+"\x00\x00\x6f\x00\x03\x11", 0x020f
+"\x00\x00\x52\x00\x03\x0f", 0x0210
+"\x00\x00\x72\x00\x03\x0f", 0x0211
+"\x00\x00\x52\x00\x03\x11", 0x0212
+"\x00\x00\x72\x00\x03\x11", 0x0213
+"\x00\x00\x55\x00\x03\x0f", 0x0214
+"\x00\x00\x75\x00\x03\x0f", 0x0215
+"\x00\x00\x55\x00\x03\x11", 0x0216
+"\x00\x00\x75\x00\x03\x11", 0x0217
+"\x00\x00\x53\x00\x03\x26", 0x0218
+"\x00\x00\x73\x00\x03\x26", 0x0219
+"\x00\x00\x54\x00\x03\x26", 0x021a
+"\x00\x00\x74\x00\x03\x26", 0x021b
+"\x00\x00\x48\x00\x03\x0c", 0x021e
+"\x00\x00\x68\x00\x03\x0c", 0x021f
+"\x00\x00\x41\x00\x03\x07", 0x0226
+"\x00\x00\x61\x00\x03\x07", 0x0227
+"\x00\x00\x45\x00\x03\x27", 0x0228
+"\x00\x00\x65\x00\x03\x27", 0x0229
+"\x00\x00\xd6\x00\x03\x04", 0x022a
+"\x00\x00\xf6\x00\x03\x04", 0x022b
+"\x00\x00\xd5\x00\x03\x04", 0x022c
+"\x00\x00\xf5\x00\x03\x04", 0x022d
+"\x00\x00\x4f\x00\x03\x07", 0x022e
+"\x00\x00\x6f\x00\x03\x07", 0x022f
+"\x00\x02\x2e\x00\x03\x04", 0x0230
+"\x00\x02\x2f\x00\x03\x04", 0x0231
+"\x00\x00\x59\x00\x03\x04", 0x0232
+"\x00\x00\x79\x00\x03\x04", 0x0233
+"\x00\x00\xa8\x00\x03\x01", 0x0385
+"\x00\x03\x91\x00\x03\x01", 0x0386
+"\x00\x03\x95\x00\x03\x01", 0x0388
+"\x00\x03\x97\x00\x03\x01", 0x0389
+"\x00\x03\x99\x00\x03\x01", 0x038a
+"\x00\x03\x9f\x00\x03\x01", 0x038c
+"\x00\x03\xa5\x00\x03\x01", 0x038e
+"\x00\x03\xa9\x00\x03\x01", 0x038f
+"\x00\x03\xca\x00\x03\x01", 0x0390
+"\x00\x03\x99\x00\x03\x08", 0x03aa
+"\x00\x03\xa5\x00\x03\x08", 0x03ab
+"\x00\x03\xb1\x00\x03\x01", 0x03ac
+"\x00\x03\xb5\x00\x03\x01", 0x03ad
+"\x00\x03\xb7\x00\x03\x01", 0x03ae
+"\x00\x03\xb9\x00\x03\x01", 0x03af
+"\x00\x03\xcb\x00\x03\x01", 0x03b0
+"\x00\x03\xb9\x00\x03\x08", 0x03ca
+"\x00\x03\xc5\x00\x03\x08", 0x03cb
+"\x00\x03\xbf\x00\x03\x01", 0x03cc
+"\x00\x03\xc5\x00\x03\x01", 0x03cd
+"\x00\x03\xc9\x00\x03\x01", 0x03ce
+"\x00\x03\xd2\x00\x03\x01", 0x03d3
+"\x00\x03\xd2\x00\x03\x08", 0x03d4
+"\x00\x04\x15\x00\x03\x00", 0x0400
+"\x00\x04\x15\x00\x03\x08", 0x0401
+"\x00\x04\x13\x00\x03\x01", 0x0403
+"\x00\x04\x06\x00\x03\x08", 0x0407
+"\x00\x04\x1a\x00\x03\x01", 0x040c
+"\x00\x04\x18\x00\x03\x00", 0x040d
+"\x00\x04\x23\x00\x03\x06", 0x040e
+"\x00\x04\x18\x00\x03\x06", 0x0419
+"\x00\x04\x38\x00\x03\x06", 0x0439
+"\x00\x04\x35\x00\x03\x00", 0x0450
+"\x00\x04\x35\x00\x03\x08", 0x0451
+"\x00\x04\x33\x00\x03\x01", 0x0453
+"\x00\x04\x56\x00\x03\x08", 0x0457
+"\x00\x04\x3a\x00\x03\x01", 0x045c
+"\x00\x04\x38\x00\x03\x00", 0x045d
+"\x00\x04\x43\x00\x03\x06", 0x045e
+"\x00\x04\x74\x00\x03\x0f", 0x0476
+"\x00\x04\x75\x00\x03\x0f", 0x0477
+"\x00\x04\x16\x00\x03\x06", 0x04c1
+"\x00\x04\x36\x00\x03\x06", 0x04c2
+"\x00\x04\x10\x00\x03\x06", 0x04d0
+"\x00\x04\x30\x00\x03\x06", 0x04d1
+"\x00\x04\x10\x00\x03\x08", 0x04d2
+"\x00\x04\x30\x00\x03\x08", 0x04d3
+"\x00\x04\x15\x00\x03\x06", 0x04d6
+"\x00\x04\x35\x00\x03\x06", 0x04d7
+"\x00\x04\xd8\x00\x03\x08", 0x04da
+"\x00\x04\xd9\x00\x03\x08", 0x04db
+"\x00\x04\x16\x00\x03\x08", 0x04dc
+"\x00\x04\x36\x00\x03\x08", 0x04dd
+"\x00\x04\x17\x00\x03\x08", 0x04de
+"\x00\x04\x37\x00\x03\x08", 0x04df
+"\x00\x04\x18\x00\x03\x04", 0x04e2
+"\x00\x04\x38\x00\x03\x04", 0x04e3
+"\x00\x04\x18\x00\x03\x08", 0x04e4
+"\x00\x04\x38\x00\x03\x08", 0x04e5
+"\x00\x04\x1e\x00\x03\x08", 0x04e6
+"\x00\x04\x3e\x00\x03\x08", 0x04e7
+"\x00\x04\xe8\x00\x03\x08", 0x04ea
+"\x00\x04\xe9\x00\x03\x08", 0x04eb
+"\x00\x04\x2d\x00\x03\x08", 0x04ec
+"\x00\x04\x4d\x00\x03\x08", 0x04ed
+"\x00\x04\x23\x00\x03\x04", 0x04ee
+"\x00\x04\x43\x00\x03\x04", 0x04ef
+"\x00\x04\x23\x00\x03\x08", 0x04f0
+"\x00\x04\x43\x00\x03\x08", 0x04f1
+"\x00\x04\x23\x00\x03\x0b", 0x04f2
+"\x00\x04\x43\x00\x03\x0b", 0x04f3
+"\x00\x04\x27\x00\x03\x08", 0x04f4
+"\x00\x04\x47\x00\x03\x08", 0x04f5
+"\x00\x04\x2b\x00\x03\x08", 0x04f8
+"\x00\x04\x4b\x00\x03\x08", 0x04f9
+"\x00\x06\x27\x00\x06\x53", 0x0622
+"\x00\x06\x27\x00\x06\x54", 0x0623
+"\x00\x06\x48\x00\x06\x54", 0x0624
+"\x00\x06\x27\x00\x06\x55", 0x0625
+"\x00\x06\x4a\x00\x06\x54", 0x0626
+"\x00\x06\xd5\x00\x06\x54", 0x06c0
+"\x00\x06\xc1\x00\x06\x54", 0x06c2
+"\x00\x06\xd2\x00\x06\x54", 0x06d3
+"\x00\x09\x28\x00\x09\x3c", 0x0929
+"\x00\x09\x30\x00\x09\x3c", 0x0931
+"\x00\x09\x33\x00\x09\x3c", 0x0934
+"\x00\x09\xc7\x00\x09\xbe", 0x09cb
+"\x00\x09\xc7\x00\x09\xd7", 0x09cc
+"\x00\x0b\x47\x00\x0b\x56", 0x0b48
+"\x00\x0b\x47\x00\x0b\x3e", 0x0b4b
+"\x00\x0b\x47\x00\x0b\x57", 0x0b4c
+"\x00\x0b\x92\x00\x0b\xd7", 0x0b94
+"\x00\x0b\xc6\x00\x0b\xbe", 0x0bca
+"\x00\x0b\xc7\x00\x0b\xbe", 0x0bcb
+"\x00\x0b\xc6\x00\x0b\xd7", 0x0bcc
+"\x00\x0c\x46\x00\x0c\x56", 0x0c48
+"\x00\x0c\xbf\x00\x0c\xd5", 0x0cc0
+"\x00\x0c\xc6\x00\x0c\xd5", 0x0cc7
+"\x00\x0c\xc6\x00\x0c\xd6", 0x0cc8
+"\x00\x0c\xc6\x00\x0c\xc2", 0x0cca
+"\x00\x0c\xca\x00\x0c\xd5", 0x0ccb
+"\x00\x0d\x46\x00\x0d\x3e", 0x0d4a
+"\x00\x0d\x47\x00\x0d\x3e", 0x0d4b
+"\x00\x0d\x46\x00\x0d\x57", 0x0d4c
+"\x00\x0d\xd9\x00\x0d\xca", 0x0dda
+"\x00\x0d\xd9\x00\x0d\xcf", 0x0ddc
+"\x00\x0d\xdc\x00\x0d\xca", 0x0ddd
+"\x00\x0d\xd9\x00\x0d\xdf", 0x0dde
+"\x00\x10\x25\x00\x10\x2e", 0x1026
+"\x00\x1b\x05\x00\x1b\x35", 0x1b06
+"\x00\x1b\x07\x00\x1b\x35", 0x1b08
+"\x00\x1b\x09\x00\x1b\x35", 0x1b0a
+"\x00\x1b\x0b\x00\x1b\x35", 0x1b0c
+"\x00\x1b\x0d\x00\x1b\x35", 0x1b0e
+"\x00\x1b\x11\x00\x1b\x35", 0x1b12
+"\x00\x1b\x3a\x00\x1b\x35", 0x1b3b
+"\x00\x1b\x3c\x00\x1b\x35", 0x1b3d
+"\x00\x1b\x3e\x00\x1b\x35", 0x1b40
+"\x00\x1b\x3f\x00\x1b\x35", 0x1b41
+"\x00\x1b\x42\x00\x1b\x35", 0x1b43
+"\x00\x00\x41\x00\x03\x25", 0x1e00
+"\x00\x00\x61\x00\x03\x25", 0x1e01
+"\x00\x00\x42\x00\x03\x07", 0x1e02
+"\x00\x00\x62\x00\x03\x07", 0x1e03
+"\x00\x00\x42\x00\x03\x23", 0x1e04
+"\x00\x00\x62\x00\x03\x23", 0x1e05
+"\x00\x00\x42\x00\x03\x31", 0x1e06
+"\x00\x00\x62\x00\x03\x31", 0x1e07
+"\x00\x00\xc7\x00\x03\x01", 0x1e08
+"\x00\x00\xe7\x00\x03\x01", 0x1e09
+"\x00\x00\x44\x00\x03\x07", 0x1e0a
+"\x00\x00\x64\x00\x03\x07", 0x1e0b
+"\x00\x00\x44\x00\x03\x23", 0x1e0c
+"\x00\x00\x64\x00\x03\x23", 0x1e0d
+"\x00\x00\x44\x00\x03\x31", 0x1e0e
+"\x00\x00\x64\x00\x03\x31", 0x1e0f
+"\x00\x00\x44\x00\x03\x27", 0x1e10
+"\x00\x00\x64\x00\x03\x27", 0x1e11
+"\x00\x00\x44\x00\x03\x2d", 0x1e12
+"\x00\x00\x64\x00\x03\x2d", 0x1e13
+"\x00\x01\x12\x00\x03\x00", 0x1e14
+"\x00\x01\x13\x00\x03\x00", 0x1e15
+"\x00\x01\x12\x00\x03\x01", 0x1e16
+"\x00\x01\x13\x00\x03\x01", 0x1e17
+"\x00\x00\x45\x00\x03\x2d", 0x1e18
+"\x00\x00\x65\x00\x03\x2d", 0x1e19
+"\x00\x00\x45\x00\x03\x30", 0x1e1a
+"\x00\x00\x65\x00\x03\x30", 0x1e1b
+"\x00\x02\x28\x00\x03\x06", 0x1e1c
+"\x00\x02\x29\x00\x03\x06", 0x1e1d
+"\x00\x00\x46\x00\x03\x07", 0x1e1e
+"\x00\x00\x66\x00\x03\x07", 0x1e1f
+"\x00\x00\x47\x00\x03\x04", 0x1e20
+"\x00\x00\x67\x00\x03\x04", 0x1e21
+"\x00\x00\x48\x00\x03\x07", 0x1e22
+"\x00\x00\x68\x00\x03\x07", 0x1e23
+"\x00\x00\x48\x00\x03\x23", 0x1e24
+"\x00\x00\x68\x00\x03\x23", 0x1e25
+"\x00\x00\x48\x00\x03\x08", 0x1e26
+"\x00\x00\x68\x00\x03\x08", 0x1e27
+"\x00\x00\x48\x00\x03\x27", 0x1e28
+"\x00\x00\x68\x00\x03\x27", 0x1e29
+"\x00\x00\x48\x00\x03\x2e", 0x1e2a
+"\x00\x00\x68\x00\x03\x2e", 0x1e2b
+"\x00\x00\x49\x00\x03\x30", 0x1e2c
+"\x00\x00\x69\x00\x03\x30", 0x1e2d
+"\x00\x00\xcf\x00\x03\x01", 0x1e2e
+"\x00\x00\xef\x00\x03\x01", 0x1e2f
+"\x00\x00\x4b\x00\x03\x01", 0x1e30
+"\x00\x00\x6b\x00\x03\x01", 0x1e31
+"\x00\x00\x4b\x00\x03\x23", 0x1e32
+"\x00\x00\x6b\x00\x03\x23", 0x1e33
+"\x00\x00\x4b\x00\x03\x31", 0x1e34
+"\x00\x00\x6b\x00\x03\x31", 0x1e35
+"\x00\x00\x4c\x00\x03\x23", 0x1e36
+"\x00\x00\x6c\x00\x03\x23", 0x1e37
+"\x00\x1e\x36\x00\x03\x04", 0x1e38
+"\x00\x1e\x37\x00\x03\x04", 0x1e39
+"\x00\x00\x4c\x00\x03\x31", 0x1e3a
+"\x00\x00\x6c\x00\x03\x31", 0x1e3b
+"\x00\x00\x4c\x00\x03\x2d", 0x1e3c
+"\x00\x00\x6c\x00\x03\x2d", 0x1e3d
+"\x00\x00\x4d\x00\x03\x01", 0x1e3e
+"\x00\x00\x6d\x00\x03\x01", 0x1e3f
+"\x00\x00\x4d\x00\x03\x07", 0x1e40
+"\x00\x00\x6d\x00\x03\x07", 0x1e41
+"\x00\x00\x4d\x00\x03\x23", 0x1e42
+"\x00\x00\x6d\x00\x03\x23", 0x1e43
+"\x00\x00\x4e\x00\x03\x07", 0x1e44
+"\x00\x00\x6e\x00\x03\x07", 0x1e45
+"\x00\x00\x4e\x00\x03\x23", 0x1e46
+"\x00\x00\x6e\x00\x03\x23", 0x1e47
+"\x00\x00\x4e\x00\x03\x31", 0x1e48
+"\x00\x00\x6e\x00\x03\x31", 0x1e49
+"\x00\x00\x4e\x00\x03\x2d", 0x1e4a
+"\x00\x00\x6e\x00\x03\x2d", 0x1e4b
+"\x00\x00\xd5\x00\x03\x01", 0x1e4c
+"\x00\x00\xf5\x00\x03\x01", 0x1e4d
+"\x00\x00\xd5\x00\x03\x08", 0x1e4e
+"\x00\x00\xf5\x00\x03\x08", 0x1e4f
+"\x00\x01\x4c\x00\x03\x00", 0x1e50
+"\x00\x01\x4d\x00\x03\x00", 0x1e51
+"\x00\x01\x4c\x00\x03\x01", 0x1e52
+"\x00\x01\x4d\x00\x03\x01", 0x1e53
+"\x00\x00\x50\x00\x03\x01", 0x1e54
+"\x00\x00\x70\x00\x03\x01", 0x1e55
+"\x00\x00\x50\x00\x03\x07", 0x1e56
+"\x00\x00\x70\x00\x03\x07", 0x1e57
+"\x00\x00\x52\x00\x03\x07", 0x1e58
+"\x00\x00\x72\x00\x03\x07", 0x1e59
+"\x00\x00\x52\x00\x03\x23", 0x1e5a
+"\x00\x00\x72\x00\x03\x23", 0x1e5b
+"\x00\x1e\x5a\x00\x03\x04", 0x1e5c
+"\x00\x1e\x5b\x00\x03\x04", 0x1e5d
+"\x00\x00\x52\x00\x03\x31", 0x1e5e
+"\x00\x00\x72\x00\x03\x31", 0x1e5f
+"\x00\x00\x53\x00\x03\x07", 0x1e60
+"\x00\x00\x73\x00\x03\x07", 0x1e61
+"\x00\x00\x53\x00\x03\x23", 0x1e62
+"\x00\x00\x73\x00\x03\x23", 0x1e63
+"\x00\x01\x5a\x00\x03\x07", 0x1e64
+"\x00\x01\x5b\x00\x03\x07", 0x1e65
+"\x00\x01\x60\x00\x03\x07", 0x1e66
+"\x00\x01\x61\x00\x03\x07", 0x1e67
+"\x00\x1e\x62\x00\x03\x07", 0x1e68
+"\x00\x1e\x63\x00\x03\x07", 0x1e69
+"\x00\x00\x54\x00\x03\x07", 0x1e6a
+"\x00\x00\x74\x00\x03\x07", 0x1e6b
+"\x00\x00\x54\x00\x03\x23", 0x1e6c
+"\x00\x00\x74\x00\x03\x23", 0x1e6d
+"\x00\x00\x54\x00\x03\x31", 0x1e6e
+"\x00\x00\x74\x00\x03\x31", 0x1e6f
+"\x00\x00\x54\x00\x03\x2d", 0x1e70
+"\x00\x00\x74\x00\x03\x2d", 0x1e71
+"\x00\x00\x55\x00\x03\x24", 0x1e72
+"\x00\x00\x75\x00\x03\x24", 0x1e73
+"\x00\x00\x55\x00\x03\x30", 0x1e74
+"\x00\x00\x75\x00\x03\x30", 0x1e75
+"\x00\x00\x55\x00\x03\x2d", 0x1e76
+"\x00\x00\x75\x00\x03\x2d", 0x1e77
+"\x00\x01\x68\x00\x03\x01", 0x1e78
+"\x00\x01\x69\x00\x03\x01", 0x1e79
+"\x00\x01\x6a\x00\x03\x08", 0x1e7a
+"\x00\x01\x6b\x00\x03\x08", 0x1e7b
+"\x00\x00\x56\x00\x03\x03", 0x1e7c
+"\x00\x00\x76\x00\x03\x03", 0x1e7d
+"\x00\x00\x56\x00\x03\x23", 0x1e7e
+"\x00\x00\x76\x00\x03\x23", 0x1e7f
+"\x00\x00\x57\x00\x03\x00", 0x1e80
+"\x00\x00\x77\x00\x03\x00", 0x1e81
+"\x00\x00\x57\x00\x03\x01", 0x1e82
+"\x00\x00\x77\x00\x03\x01", 0x1e83
+"\x00\x00\x57\x00\x03\x08", 0x1e84
+"\x00\x00\x77\x00\x03\x08", 0x1e85
+"\x00\x00\x57\x00\x03\x07", 0x1e86
+"\x00\x00\x77\x00\x03\x07", 0x1e87
+"\x00\x00\x57\x00\x03\x23", 0x1e88
+"\x00\x00\x77\x00\x03\x23", 0x1e89
+"\x00\x00\x58\x00\x03\x07", 0x1e8a
+"\x00\x00\x78\x00\x03\x07", 0x1e8b
+"\x00\x00\x58\x00\x03\x08", 0x1e8c
+"\x00\x00\x78\x00\x03\x08", 0x1e8d
+"\x00\x00\x59\x00\x03\x07", 0x1e8e
+"\x00\x00\x79\x00\x03\x07", 0x1e8f
+"\x00\x00\x5a\x00\x03\x02", 0x1e90
+"\x00\x00\x7a\x00\x03\x02", 0x1e91
+"\x00\x00\x5a\x00\x03\x23", 0x1e92
+"\x00\x00\x7a\x00\x03\x23", 0x1e93
+"\x00\x00\x5a\x00\x03\x31", 0x1e94
+"\x00\x00\x7a\x00\x03\x31", 0x1e95
+"\x00\x00\x68\x00\x03\x31", 0x1e96
+"\x00\x00\x74\x00\x03\x08", 0x1e97
+"\x00\x00\x77\x00\x03\x0a", 0x1e98
+"\x00\x00\x79\x00\x03\x0a", 0x1e99
+"\x00\x01\x7f\x00\x03\x07", 0x1e9b
+"\x00\x00\x41\x00\x03\x23", 0x1ea0
+"\x00\x00\x61\x00\x03\x23", 0x1ea1
+"\x00\x00\x41\x00\x03\x09", 0x1ea2
+"\x00\x00\x61\x00\x03\x09", 0x1ea3
+"\x00\x00\xc2\x00\x03\x01", 0x1ea4
+"\x00\x00\xe2\x00\x03\x01", 0x1ea5
+"\x00\x00\xc2\x00\x03\x00", 0x1ea6
+"\x00\x00\xe2\x00\x03\x00", 0x1ea7
+"\x00\x00\xc2\x00\x03\x09", 0x1ea8
+"\x00\x00\xe2\x00\x03\x09", 0x1ea9
+"\x00\x00\xc2\x00\x03\x03", 0x1eaa
+"\x00\x00\xe2\x00\x03\x03", 0x1eab
+"\x00\x1e\xa0\x00\x03\x02", 0x1eac
+"\x00\x1e\xa1\x00\x03\x02", 0x1ead
+"\x00\x01\x02\x00\x03\x01", 0x1eae
+"\x00\x01\x03\x00\x03\x01", 0x1eaf
+"\x00\x01\x02\x00\x03\x00", 0x1eb0
+"\x00\x01\x03\x00\x03\x00", 0x1eb1
+"\x00\x01\x02\x00\x03\x09", 0x1eb2
+"\x00\x01\x03\x00\x03\x09", 0x1eb3
+"\x00\x01\x02\x00\x03\x03", 0x1eb4
+"\x00\x01\x03\x00\x03\x03", 0x1eb5
+"\x00\x1e\xa0\x00\x03\x06", 0x1eb6
+"\x00\x1e\xa1\x00\x03\x06", 0x1eb7
+"\x00\x00\x45\x00\x03\x23", 0x1eb8
+"\x00\x00\x65\x00\x03\x23", 0x1eb9
+"\x00\x00\x45\x00\x03\x09", 0x1eba
+"\x00\x00\x65\x00\x03\x09", 0x1ebb
+"\x00\x00\x45\x00\x03\x03", 0x1ebc
+"\x00\x00\x65\x00\x03\x03", 0x1ebd
+"\x00\x00\xca\x00\x03\x01", 0x1ebe
+"\x00\x00\xea\x00\x03\x01", 0x1ebf
+"\x00\x00\xca\x00\x03\x00", 0x1ec0
+"\x00\x00\xea\x00\x03\x00", 0x1ec1
+"\x00\x00\xca\x00\x03\x09", 0x1ec2
+"\x00\x00\xea\x00\x03\x09", 0x1ec3
+"\x00\x00\xca\x00\x03\x03", 0x1ec4
+"\x00\x00\xea\x00\x03\x03", 0x1ec5
+"\x00\x1e\xb8\x00\x03\x02", 0x1ec6
+"\x00\x1e\xb9\x00\x03\x02", 0x1ec7
+"\x00\x00\x49\x00\x03\x09", 0x1ec8
+"\x00\x00\x69\x00\x03\x09", 0x1ec9
+"\x00\x00\x49\x00\x03\x23", 0x1eca
+"\x00\x00\x69\x00\x03\x23", 0x1ecb
+"\x00\x00\x4f\x00\x03\x23", 0x1ecc
+"\x00\x00\x6f\x00\x03\x23", 0x1ecd
+"\x00\x00\x4f\x00\x03\x09", 0x1ece
+"\x00\x00\x6f\x00\x03\x09", 0x1ecf
+"\x00\x00\xd4\x00\x03\x01", 0x1ed0
+"\x00\x00\xf4\x00\x03\x01", 0x1ed1
+"\x00\x00\xd4\x00\x03\x00", 0x1ed2
+"\x00\x00\xf4\x00\x03\x00", 0x1ed3
+"\x00\x00\xd4\x00\x03\x09", 0x1ed4
+"\x00\x00\xf4\x00\x03\x09", 0x1ed5
+"\x00\x00\xd4\x00\x03\x03", 0x1ed6
+"\x00\x00\xf4\x00\x03\x03", 0x1ed7
+"\x00\x1e\xcc\x00\x03\x02", 0x1ed8
+"\x00\x1e\xcd\x00\x03\x02", 0x1ed9
+"\x00\x01\xa0\x00\x03\x01", 0x1eda
+"\x00\x01\xa1\x00\x03\x01", 0x1edb
+"\x00\x01\xa0\x00\x03\x00", 0x1edc
+"\x00\x01\xa1\x00\x03\x00", 0x1edd
+"\x00\x01\xa0\x00\x03\x09", 0x1ede
+"\x00\x01\xa1\x00\x03\x09", 0x1edf
+"\x00\x01\xa0\x00\x03\x03", 0x1ee0
+"\x00\x01\xa1\x00\x03\x03", 0x1ee1
+"\x00\x01\xa0\x00\x03\x23", 0x1ee2
+"\x00\x01\xa1\x00\x03\x23", 0x1ee3
+"\x00\x00\x55\x00\x03\x23", 0x1ee4
+"\x00\x00\x75\x00\x03\x23", 0x1ee5
+"\x00\x00\x55\x00\x03\x09", 0x1ee6
+"\x00\x00\x75\x00\x03\x09", 0x1ee7
+"\x00\x01\xaf\x00\x03\x01", 0x1ee8
+"\x00\x01\xb0\x00\x03\x01", 0x1ee9
+"\x00\x01\xaf\x00\x03\x00", 0x1eea
+"\x00\x01\xb0\x00\x03\x00", 0x1eeb
+"\x00\x01\xaf\x00\x03\x09", 0x1eec
+"\x00\x01\xb0\x00\x03\x09", 0x1eed
+"\x00\x01\xaf\x00\x03\x03", 0x1eee
+"\x00\x01\xb0\x00\x03\x03", 0x1eef
+"\x00\x01\xaf\x00\x03\x23", 0x1ef0
+"\x00\x01\xb0\x00\x03\x23", 0x1ef1
+"\x00\x00\x59\x00\x03\x00", 0x1ef2
+"\x00\x00\x79\x00\x03\x00", 0x1ef3
+"\x00\x00\x59\x00\x03\x23", 0x1ef4
+"\x00\x00\x79\x00\x03\x23", 0x1ef5
+"\x00\x00\x59\x00\x03\x09", 0x1ef6
+"\x00\x00\x79\x00\x03\x09", 0x1ef7
+"\x00\x00\x59\x00\x03\x03", 0x1ef8
+"\x00\x00\x79\x00\x03\x03", 0x1ef9
+"\x00\x03\xb1\x00\x03\x13", 0x1f00
+"\x00\x03\xb1\x00\x03\x14", 0x1f01
+"\x00\x1f\x00\x00\x03\x00", 0x1f02
+"\x00\x1f\x01\x00\x03\x00", 0x1f03
+"\x00\x1f\x00\x00\x03\x01", 0x1f04
+"\x00\x1f\x01\x00\x03\x01", 0x1f05
+"\x00\x1f\x00\x00\x03\x42", 0x1f06
+"\x00\x1f\x01\x00\x03\x42", 0x1f07
+"\x00\x03\x91\x00\x03\x13", 0x1f08
+"\x00\x03\x91\x00\x03\x14", 0x1f09
+"\x00\x1f\x08\x00\x03\x00", 0x1f0a
+"\x00\x1f\x09\x00\x03\x00", 0x1f0b
+"\x00\x1f\x08\x00\x03\x01", 0x1f0c
+"\x00\x1f\x09\x00\x03\x01", 0x1f0d
+"\x00\x1f\x08\x00\x03\x42", 0x1f0e
+"\x00\x1f\x09\x00\x03\x42", 0x1f0f
+"\x00\x03\xb5\x00\x03\x13", 0x1f10
+"\x00\x03\xb5\x00\x03\x14", 0x1f11
+"\x00\x1f\x10\x00\x03\x00", 0x1f12
+"\x00\x1f\x11\x00\x03\x00", 0x1f13
+"\x00\x1f\x10\x00\x03\x01", 0x1f14
+"\x00\x1f\x11\x00\x03\x01", 0x1f15
+"\x00\x03\x95\x00\x03\x13", 0x1f18
+"\x00\x03\x95\x00\x03\x14", 0x1f19
+"\x00\x1f\x18\x00\x03\x00", 0x1f1a
+"\x00\x1f\x19\x00\x03\x00", 0x1f1b
+"\x00\x1f\x18\x00\x03\x01", 0x1f1c
+"\x00\x1f\x19\x00\x03\x01", 0x1f1d
+"\x00\x03\xb7\x00\x03\x13", 0x1f20
+"\x00\x03\xb7\x00\x03\x14", 0x1f21
+"\x00\x1f\x20\x00\x03\x00", 0x1f22
+"\x00\x1f\x21\x00\x03\x00", 0x1f23
+"\x00\x1f\x20\x00\x03\x01", 0x1f24
+"\x00\x1f\x21\x00\x03\x01", 0x1f25
+"\x00\x1f\x20\x00\x03\x42", 0x1f26
+"\x00\x1f\x21\x00\x03\x42", 0x1f27
+"\x00\x03\x97\x00\x03\x13", 0x1f28
+"\x00\x03\x97\x00\x03\x14", 0x1f29
+"\x00\x1f\x28\x00\x03\x00", 0x1f2a
+"\x00\x1f\x29\x00\x03\x00", 0x1f2b
+"\x00\x1f\x28\x00\x03\x01", 0x1f2c
+"\x00\x1f\x29\x00\x03\x01", 0x1f2d
+"\x00\x1f\x28\x00\x03\x42", 0x1f2e
+"\x00\x1f\x29\x00\x03\x42", 0x1f2f
+"\x00\x03\xb9\x00\x03\x13", 0x1f30
+"\x00\x03\xb9\x00\x03\x14", 0x1f31
+"\x00\x1f\x30\x00\x03\x00", 0x1f32
+"\x00\x1f\x31\x00\x03\x00", 0x1f33
+"\x00\x1f\x30\x00\x03\x01", 0x1f34
+"\x00\x1f\x31\x00\x03\x01", 0x1f35
+"\x00\x1f\x30\x00\x03\x42", 0x1f36
+"\x00\x1f\x31\x00\x03\x42", 0x1f37
+"\x00\x03\x99\x00\x03\x13", 0x1f38
+"\x00\x03\x99\x00\x03\x14", 0x1f39
+"\x00\x1f\x38\x00\x03\x00", 0x1f3a
+"\x00\x1f\x39\x00\x03\x00", 0x1f3b
+"\x00\x1f\x38\x00\x03\x01", 0x1f3c
+"\x00\x1f\x39\x00\x03\x01", 0x1f3d
+"\x00\x1f\x38\x00\x03\x42", 0x1f3e
+"\x00\x1f\x39\x00\x03\x42", 0x1f3f
+"\x00\x03\xbf\x00\x03\x13", 0x1f40
+"\x00\x03\xbf\x00\x03\x14", 0x1f41
+"\x00\x1f\x40\x00\x03\x00", 0x1f42
+"\x00\x1f\x41\x00\x03\x00", 0x1f43
+"\x00\x1f\x40\x00\x03\x01", 0x1f44
+"\x00\x1f\x41\x00\x03\x01", 0x1f45
+"\x00\x03\x9f\x00\x03\x13", 0x1f48
+"\x00\x03\x9f\x00\x03\x14", 0x1f49
+"\x00\x1f\x48\x00\x03\x00", 0x1f4a
+"\x00\x1f\x49\x00\x03\x00", 0x1f4b
+"\x00\x1f\x48\x00\x03\x01", 0x1f4c
+"\x00\x1f\x49\x00\x03\x01", 0x1f4d
+"\x00\x03\xc5\x00\x03\x13", 0x1f50
+"\x00\x03\xc5\x00\x03\x14", 0x1f51
+"\x00\x1f\x50\x00\x03\x00", 0x1f52
+"\x00\x1f\x51\x00\x03\x00", 0x1f53
+"\x00\x1f\x50\x00\x03\x01", 0x1f54
+"\x00\x1f\x51\x00\x03\x01", 0x1f55
+"\x00\x1f\x50\x00\x03\x42", 0x1f56
+"\x00\x1f\x51\x00\x03\x42", 0x1f57
+"\x00\x03\xa5\x00\x03\x14", 0x1f59
+"\x00\x1f\x59\x00\x03\x00", 0x1f5b
+"\x00\x1f\x59\x00\x03\x01", 0x1f5d
+"\x00\x1f\x59\x00\x03\x42", 0x1f5f
+"\x00\x03\xc9\x00\x03\x13", 0x1f60
+"\x00\x03\xc9\x00\x03\x14", 0x1f61
+"\x00\x1f\x60\x00\x03\x00", 0x1f62
+"\x00\x1f\x61\x00\x03\x00", 0x1f63
+"\x00\x1f\x60\x00\x03\x01", 0x1f64
+"\x00\x1f\x61\x00\x03\x01", 0x1f65
+"\x00\x1f\x60\x00\x03\x42", 0x1f66
+"\x00\x1f\x61\x00\x03\x42", 0x1f67
+"\x00\x03\xa9\x00\x03\x13", 0x1f68
+"\x00\x03\xa9\x00\x03\x14", 0x1f69
+"\x00\x1f\x68\x00\x03\x00", 0x1f6a
+"\x00\x1f\x69\x00\x03\x00", 0x1f6b
+"\x00\x1f\x68\x00\x03\x01", 0x1f6c
+"\x00\x1f\x69\x00\x03\x01", 0x1f6d
+"\x00\x1f\x68\x00\x03\x42", 0x1f6e
+"\x00\x1f\x69\x00\x03\x42", 0x1f6f
+"\x00\x03\xb1\x00\x03\x00", 0x1f70
+"\x00\x03\xb5\x00\x03\x00", 0x1f72
+"\x00\x03\xb7\x00\x03\x00", 0x1f74
+"\x00\x03\xb9\x00\x03\x00", 0x1f76
+"\x00\x03\xbf\x00\x03\x00", 0x1f78
+"\x00\x03\xc5\x00\x03\x00", 0x1f7a
+"\x00\x03\xc9\x00\x03\x00", 0x1f7c
+"\x00\x1f\x00\x00\x03\x45", 0x1f80
+"\x00\x1f\x01\x00\x03\x45", 0x1f81
+"\x00\x1f\x02\x00\x03\x45", 0x1f82
+"\x00\x1f\x03\x00\x03\x45", 0x1f83
+"\x00\x1f\x04\x00\x03\x45", 0x1f84
+"\x00\x1f\x05\x00\x03\x45", 0x1f85
+"\x00\x1f\x06\x00\x03\x45", 0x1f86
+"\x00\x1f\x07\x00\x03\x45", 0x1f87
+"\x00\x1f\x08\x00\x03\x45", 0x1f88
+"\x00\x1f\x09\x00\x03\x45", 0x1f89
+"\x00\x1f\x0a\x00\x03\x45", 0x1f8a
+"\x00\x1f\x0b\x00\x03\x45", 0x1f8b
+"\x00\x1f\x0c\x00\x03\x45", 0x1f8c
+"\x00\x1f\x0d\x00\x03\x45", 0x1f8d
+"\x00\x1f\x0e\x00\x03\x45", 0x1f8e
+"\x00\x1f\x0f\x00\x03\x45", 0x1f8f
+"\x00\x1f\x20\x00\x03\x45", 0x1f90
+"\x00\x1f\x21\x00\x03\x45", 0x1f91
+"\x00\x1f\x22\x00\x03\x45", 0x1f92
+"\x00\x1f\x23\x00\x03\x45", 0x1f93
+"\x00\x1f\x24\x00\x03\x45", 0x1f94
+"\x00\x1f\x25\x00\x03\x45", 0x1f95
+"\x00\x1f\x26\x00\x03\x45", 0x1f96
+"\x00\x1f\x27\x00\x03\x45", 0x1f97
+"\x00\x1f\x28\x00\x03\x45", 0x1f98
+"\x00\x1f\x29\x00\x03\x45", 0x1f99
+"\x00\x1f\x2a\x00\x03\x45", 0x1f9a
+"\x00\x1f\x2b\x00\x03\x45", 0x1f9b
+"\x00\x1f\x2c\x00\x03\x45", 0x1f9c
+"\x00\x1f\x2d\x00\x03\x45", 0x1f9d
+"\x00\x1f\x2e\x00\x03\x45", 0x1f9e
+"\x00\x1f\x2f\x00\x03\x45", 0x1f9f
+"\x00\x1f\x60\x00\x03\x45", 0x1fa0
+"\x00\x1f\x61\x00\x03\x45", 0x1fa1
+"\x00\x1f\x62\x00\x03\x45", 0x1fa2
+"\x00\x1f\x63\x00\x03\x45", 0x1fa3
+"\x00\x1f\x64\x00\x03\x45", 0x1fa4
+"\x00\x1f\x65\x00\x03\x45", 0x1fa5
+"\x00\x1f\x66\x00\x03\x45", 0x1fa6
+"\x00\x1f\x67\x00\x03\x45", 0x1fa7
+"\x00\x1f\x68\x00\x03\x45", 0x1fa8
+"\x00\x1f\x69\x00\x03\x45", 0x1fa9
+"\x00\x1f\x6a\x00\x03\x45", 0x1faa
+"\x00\x1f\x6b\x00\x03\x45", 0x1fab
+"\x00\x1f\x6c\x00\x03\x45", 0x1fac
+"\x00\x1f\x6d\x00\x03\x45", 0x1fad
+"\x00\x1f\x6e\x00\x03\x45", 0x1fae
+"\x00\x1f\x6f\x00\x03\x45", 0x1faf
+"\x00\x03\xb1\x00\x03\x06", 0x1fb0
+"\x00\x03\xb1\x00\x03\x04", 0x1fb1
+"\x00\x1f\x70\x00\x03\x45", 0x1fb2
+"\x00\x03\xb1\x00\x03\x45", 0x1fb3
+"\x00\x03\xac\x00\x03\x45", 0x1fb4
+"\x00\x03\xb1\x00\x03\x42", 0x1fb6
+"\x00\x1f\xb6\x00\x03\x45", 0x1fb7
+"\x00\x03\x91\x00\x03\x06", 0x1fb8
+"\x00\x03\x91\x00\x03\x04", 0x1fb9
+"\x00\x03\x91\x00\x03\x00", 0x1fba
+"\x00\x03\x91\x00\x03\x45", 0x1fbc
+"\x00\x00\xa8\x00\x03\x42", 0x1fc1
+"\x00\x1f\x74\x00\x03\x45", 0x1fc2
+"\x00\x03\xb7\x00\x03\x45", 0x1fc3
+"\x00\x03\xae\x00\x03\x45", 0x1fc4
+"\x00\x03\xb7\x00\x03\x42", 0x1fc6
+"\x00\x1f\xc6\x00\x03\x45", 0x1fc7
+"\x00\x03\x95\x00\x03\x00", 0x1fc8
+"\x00\x03\x97\x00\x03\x00", 0x1fca
+"\x00\x03\x97\x00\x03\x45", 0x1fcc
+"\x00\x1f\xbf\x00\x03\x00", 0x1fcd
+"\x00\x1f\xbf\x00\x03\x01", 0x1fce
+"\x00\x1f\xbf\x00\x03\x42", 0x1fcf
+"\x00\x03\xb9\x00\x03\x06", 0x1fd0
+"\x00\x03\xb9\x00\x03\x04", 0x1fd1
+"\x00\x03\xca\x00\x03\x00", 0x1fd2
+"\x00\x03\xb9\x00\x03\x42", 0x1fd6
+"\x00\x03\xca\x00\x03\x42", 0x1fd7
+"\x00\x03\x99\x00\x03\x06", 0x1fd8
+"\x00\x03\x99\x00\x03\x04", 0x1fd9
+"\x00\x03\x99\x00\x03\x00", 0x1fda
+"\x00\x1f\xfe\x00\x03\x00", 0x1fdd
+"\x00\x1f\xfe\x00\x03\x01", 0x1fde
+"\x00\x1f\xfe\x00\x03\x42", 0x1fdf
+"\x00\x03\xc5\x00\x03\x06", 0x1fe0
+"\x00\x03\xc5\x00\x03\x04", 0x1fe1
+"\x00\x03\xcb\x00\x03\x00", 0x1fe2
+"\x00\x03\xc1\x00\x03\x13", 0x1fe4
+"\x00\x03\xc1\x00\x03\x14", 0x1fe5
+"\x00\x03\xc5\x00\x03\x42", 0x1fe6
+"\x00\x03\xcb\x00\x03\x42", 0x1fe7
+"\x00\x03\xa5\x00\x03\x06", 0x1fe8
+"\x00\x03\xa5\x00\x03\x04", 0x1fe9
+"\x00\x03\xa5\x00\x03\x00", 0x1fea
+"\x00\x03\xa1\x00\x03\x14", 0x1fec
+"\x00\x00\xa8\x00\x03\x00", 0x1fed
+"\x00\x1f\x7c\x00\x03\x45", 0x1ff2
+"\x00\x03\xc9\x00\x03\x45", 0x1ff3
+"\x00\x03\xce\x00\x03\x45", 0x1ff4
+"\x00\x03\xc9\x00\x03\x42", 0x1ff6
+"\x00\x1f\xf6\x00\x03\x45", 0x1ff7
+"\x00\x03\x9f\x00\x03\x00", 0x1ff8
+"\x00\x03\xa9\x00\x03\x00", 0x1ffa
+"\x00\x03\xa9\x00\x03\x45", 0x1ffc
+"\x00\x21\x90\x00\x03\x38", 0x219a
+"\x00\x21\x92\x00\x03\x38", 0x219b
+"\x00\x21\x94\x00\x03\x38", 0x21ae
+"\x00\x21\xd0\x00\x03\x38", 0x21cd
+"\x00\x21\xd4\x00\x03\x38", 0x21ce
+"\x00\x21\xd2\x00\x03\x38", 0x21cf
+"\x00\x22\x03\x00\x03\x38", 0x2204
+"\x00\x22\x08\x00\x03\x38", 0x2209
+"\x00\x22\x0b\x00\x03\x38", 0x220c
+"\x00\x22\x23\x00\x03\x38", 0x2224
+"\x00\x22\x25\x00\x03\x38", 0x2226
+"\x00\x22\x3c\x00\x03\x38", 0x2241
+"\x00\x22\x43\x00\x03\x38", 0x2244
+"\x00\x22\x45\x00\x03\x38", 0x2247
+"\x00\x22\x48\x00\x03\x38", 0x2249
+"\x00\x00\x3d\x00\x03\x38", 0x2260
+"\x00\x22\x61\x00\x03\x38", 0x2262
+"\x00\x22\x4d\x00\x03\x38", 0x226d
+"\x00\x00\x3c\x00\x03\x38", 0x226e
+"\x00\x00\x3e\x00\x03\x38", 0x226f
+"\x00\x22\x64\x00\x03\x38", 0x2270
+"\x00\x22\x65\x00\x03\x38", 0x2271
+"\x00\x22\x72\x00\x03\x38", 0x2274
+"\x00\x22\x73\x00\x03\x38", 0x2275
+"\x00\x22\x76\x00\x03\x38", 0x2278
+"\x00\x22\x77\x00\x03\x38", 0x2279
+"\x00\x22\x7a\x00\x03\x38", 0x2280
+"\x00\x22\x7b\x00\x03\x38", 0x2281
+"\x00\x22\x82\x00\x03\x38", 0x2284
+"\x00\x22\x83\x00\x03\x38", 0x2285
+"\x00\x22\x86\x00\x03\x38", 0x2288
+"\x00\x22\x87\x00\x03\x38", 0x2289
+"\x00\x22\xa2\x00\x03\x38", 0x22ac
+"\x00\x22\xa8\x00\x03\x38", 0x22ad
+"\x00\x22\xa9\x00\x03\x38", 0x22ae
+"\x00\x22\xab\x00\x03\x38", 0x22af
+"\x00\x22\x7c\x00\x03\x38", 0x22e0
+"\x00\x22\x7d\x00\x03\x38", 0x22e1
+"\x00\x22\x91\x00\x03\x38", 0x22e2
+"\x00\x22\x92\x00\x03\x38", 0x22e3
+"\x00\x22\xb2\x00\x03\x38", 0x22ea
+"\x00\x22\xb3\x00\x03\x38", 0x22eb
+"\x00\x22\xb4\x00\x03\x38", 0x22ec
+"\x00\x22\xb5\x00\x03\x38", 0x22ed
+"\x00\x30\x4b\x00\x30\x99", 0x304c
+"\x00\x30\x4d\x00\x30\x99", 0x304e
+"\x00\x30\x4f\x00\x30\x99", 0x3050
+"\x00\x30\x51\x00\x30\x99", 0x3052
+"\x00\x30\x53\x00\x30\x99", 0x3054
+"\x00\x30\x55\x00\x30\x99", 0x3056
+"\x00\x30\x57\x00\x30\x99", 0x3058
+"\x00\x30\x59\x00\x30\x99", 0x305a
+"\x00\x30\x5b\x00\x30\x99", 0x305c
+"\x00\x30\x5d\x00\x30\x99", 0x305e
+"\x00\x30\x5f\x00\x30\x99", 0x3060
+"\x00\x30\x61\x00\x30\x99", 0x3062
+"\x00\x30\x64\x00\x30\x99", 0x3065
+"\x00\x30\x66\x00\x30\x99", 0x3067
+"\x00\x30\x68\x00\x30\x99", 0x3069
+"\x00\x30\x6f\x00\x30\x99", 0x3070
+"\x00\x30\x6f\x00\x30\x9a", 0x3071
+"\x00\x30\x72\x00\x30\x99", 0x3073
+"\x00\x30\x72\x00\x30\x9a", 0x3074
+"\x00\x30\x75\x00\x30\x99", 0x3076
+"\x00\x30\x75\x00\x30\x9a", 0x3077
+"\x00\x30\x78\x00\x30\x99", 0x3079
+"\x00\x30\x78\x00\x30\x9a", 0x307a
+"\x00\x30\x7b\x00\x30\x99", 0x307c
+"\x00\x30\x7b\x00\x30\x9a", 0x307d
+"\x00\x30\x46\x00\x30\x99", 0x3094
+"\x00\x30\x9d\x00\x30\x99", 0x309e
+"\x00\x30\xab\x00\x30\x99", 0x30ac
+"\x00\x30\xad\x00\x30\x99", 0x30ae
+"\x00\x30\xaf\x00\x30\x99", 0x30b0
+"\x00\x30\xb1\x00\x30\x99", 0x30b2
+"\x00\x30\xb3\x00\x30\x99", 0x30b4
+"\x00\x30\xb5\x00\x30\x99", 0x30b6
+"\x00\x30\xb7\x00\x30\x99", 0x30b8
+"\x00\x30\xb9\x00\x30\x99", 0x30ba
+"\x00\x30\xbb\x00\x30\x99", 0x30bc
+"\x00\x30\xbd\x00\x30\x99", 0x30be
+"\x00\x30\xbf\x00\x30\x99", 0x30c0
+"\x00\x30\xc1\x00\x30\x99", 0x30c2
+"\x00\x30\xc4\x00\x30\x99", 0x30c5
+"\x00\x30\xc6\x00\x30\x99", 0x30c7
+"\x00\x30\xc8\x00\x30\x99", 0x30c9
+"\x00\x30\xcf\x00\x30\x99", 0x30d0
+"\x00\x30\xcf\x00\x30\x9a", 0x30d1
+"\x00\x30\xd2\x00\x30\x99", 0x30d3
+"\x00\x30\xd2\x00\x30\x9a", 0x30d4
+"\x00\x30\xd5\x00\x30\x99", 0x30d6
+"\x00\x30\xd5\x00\x30\x9a", 0x30d7
+"\x00\x30\xd8\x00\x30\x99", 0x30d9
+"\x00\x30\xd8\x00\x30\x9a", 0x30da
+"\x00\x30\xdb\x00\x30\x99", 0x30dc
+"\x00\x30\xdb\x00\x30\x9a", 0x30dd
+"\x00\x30\xa6\x00\x30\x99", 0x30f4
+"\x00\x30\xef\x00\x30\x99", 0x30f7
+"\x00\x30\xf0\x00\x30\x99", 0x30f8
+"\x00\x30\xf1\x00\x30\x99", 0x30f9
+"\x00\x30\xf2\x00\x30\x99", 0x30fa
+"\x00\x30\xfd\x00\x30\x99", 0x30fe
+"\x01\x10\x99\x01\x10\xba", 0x1109a
+"\x01\x10\x9b\x01\x10\xba", 0x1109c
+"\x01\x10\xa5\x01\x10\xba", 0x110ab
diff --git a/gnulib/lib/uninorm/composition.c b/gnulib/lib/uninorm/composition.c
new file mode 100644
index 0000000..23868ba
--- /dev/null
+++ b/gnulib/lib/uninorm/composition.c
@@ -0,0 +1,87 @@
+/* Canonical composition of Unicode characters.
+ Copyright (C) 2002, 2006, 2009, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <string.h>
+
+struct composition_rule { char codes[6]; unsigned int combined; };
+
+#include "composition-table.h"
+
+ucs4_t
+uc_composition (ucs4_t uc1, ucs4_t uc2)
+{
+ if (uc1 < 0x12000 && uc2 < 0x12000)
+ {
+ if (uc2 >= 0x1161 && uc2 < 0x1161 + 21
+ && uc1 >= 0x1100 && uc1 < 0x1100 + 19)
+ {
+ /* Hangul: Combine single letter L and single letter V to form
+ two-letter syllable LV. */
+ return 0xAC00 + ((uc1 - 0x1100) * 21 + (uc2 - 0x1161)) * 28;
+ }
+ else if (uc2 > 0x11A7 && uc2 < 0x11A7 + 28
+ && uc1 >= 0xAC00 && uc1 < 0xD7A4 && ((uc1 - 0xAC00) % 28) == 0)
+ {
+ /* Hangul: Combine two-letter syllable LV with single-letter T
+ to form three-letter syllable LVT. */
+ return uc1 + (uc2 - 0x11A7);
+ }
+ else
+ {
+#if 0
+ unsigned int uc = MUL1 * uc1 * MUL2 * uc2;
+ unsigned int index1 = uc >> composition_header_0;
+ if (index1 < composition_header_1)
+ {
+ int lookup1 = u_composition.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> composition_header_2) & composition_header_3;
+ int lookup2 = u_composition.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & composition_header_4);
+ unsigned int lookup3 = u_composition.level3[lookup2 + index3];
+ if ((lookup3 >> 16) == uc2)
+ return lookup3 & ((1U << 16) - 1);
+ }
+ }
+ }
+#else
+ char codes[6];
+ const struct composition_rule *rule;
+
+ codes[0] = (uc1 >> 16) & 0xff;
+ codes[1] = (uc1 >> 8) & 0xff;
+ codes[2] = uc1 & 0xff;
+ codes[3] = (uc2 >> 16) & 0xff;
+ codes[4] = (uc2 >> 8) & 0xff;
+ codes[5] = uc2 & 0xff;
+
+ rule = gl_uninorm_compose_lookup (codes, 6);
+ if (rule != NULL)
+ return rule->combined;
+#endif
+ }
+ }
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/decompose-internal.c b/gnulib/lib/uninorm/decompose-internal.c
new file mode 100644
index 0000000..6e85094
--- /dev/null
+++ b/gnulib/lib/uninorm/decompose-internal.c
@@ -0,0 +1,28 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "decompose-internal.h"
+
+#define ELEMENT struct ucs4_with_ccc
+#define COMPARE(a,b) ((a)->ccc - (b)->ccc)
+#define STATIC
+#define merge_sort_fromto gl_uninorm_decompose_merge_sort_fromto
+#define merge_sort_inplace gl_uninorm_decompose_merge_sort_inplace
+#include "array-mergesort.h"
diff --git a/gnulib/lib/uninorm/decompose-internal.h b/gnulib/lib/uninorm/decompose-internal.h
new file mode 100644
index 0000000..1cf9bb2
--- /dev/null
+++ b/gnulib/lib/uninorm/decompose-internal.h
@@ -0,0 +1,36 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Variant of uc_decomposition that does not produce the 'tag'. */
+extern int
+ uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+/* A Unicode character together with its canonical combining class. */
+struct ucs4_with_ccc
+{
+ ucs4_t code;
+ int ccc; /* range 0..255 */
+};
+
+/* Stable-sort an array of 'struct ucs4_with_ccc'. */
+extern void
+ gl_uninorm_decompose_merge_sort_inplace (struct ucs4_with_ccc *src, size_t n,
+ struct ucs4_with_ccc *tmp);
diff --git a/gnulib/lib/uninorm/decomposing-form.c b/gnulib/lib/uninorm/decomposing-form.c
new file mode 100644
index 0000000..62987a6
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposing-form.c
@@ -0,0 +1,29 @@
+/* Decomposing variant of a normalization form.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+uninorm_t
+uninorm_decomposing_form (uninorm_t nf)
+{
+ return nf->decomposing_variant;
+}
diff --git a/gnulib/lib/uninorm/decomposition-table.c b/gnulib/lib/uninorm/decomposition-table.c
new file mode 100644
index 0000000..2eed8d2
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table.c
@@ -0,0 +1,23 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm/decomposition-table.h"
+
+#include "uninorm/decomposition-table2.h"
diff --git a/gnulib/lib/uninorm/decomposition-table.h b/gnulib/lib/uninorm/decomposition-table.h
new file mode 100644
index 0000000..e363905
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table.h
@@ -0,0 +1,48 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2001-2003, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include "unitypes.h"
+
+/* The decomposition table is made of two parts:
+ - A table containing the actual arrays of decomposed equivalents.
+ (This table is separate because the maximum length of a decomposition
+ is 18, much larger than than the average length 1.497 of a decomposition).
+ - A 3-level table of indices into this array. */
+
+#include "decomposition-table1.h"
+
+static inline unsigned short
+decomp_index (ucs4_t uc)
+{
+ unsigned int index1 = uc >> decomp_header_0;
+ if (index1 < decomp_header_1)
+ {
+ int lookup1 = gl_uninorm_decomp_index_table.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> decomp_header_2) & decomp_header_3;
+ int lookup2 = gl_uninorm_decomp_index_table.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & decomp_header_4;
+ return gl_uninorm_decomp_index_table.level3[lookup2 + index3];
+ }
+ }
+ }
+ return (unsigned short)(-1);
+}
diff --git a/gnulib/lib/uninorm/decomposition-table1.h b/gnulib/lib/uninorm/decomposition-table1.h
new file mode 100644
index 0000000..ccf1bec
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table1.h
@@ -0,0 +1,20 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decomposition of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+
+extern const unsigned char gl_uninorm_decomp_chars_table[];
+
+#define decomp_header_0 10
+#define decomp_header_1 191
+#define decomp_header_2 5
+#define decomp_header_3 31
+#define decomp_header_4 31
+
+typedef struct
+ {
+ int level1[191];
+ int level2[20 << 5];
+ unsigned short level3[263 << 5];
+ }
+decomp_index_table_t;
+extern const decomp_index_table_t gl_uninorm_decomp_index_table;
diff --git a/gnulib/lib/uninorm/decomposition-table2.h b/gnulib/lib/uninorm/decomposition-table2.h
new file mode 100644
index 0000000..7cab0c8
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition-table2.h
@@ -0,0 +1,3261 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Decomposition of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 6.0.0. */
+
+const unsigned char gl_uninorm_decomp_chars_table[] =
+{
+ 0x08, 0x00, 0x20, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x08, 0x20, 0x00, 0x61,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x04, 0x20, 0x00, 0x32, 0x20, 0x00, 0x33,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01, 0x40, 0x03, 0xBC, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x27, 0x20, 0x00, 0x31, 0x20, 0x00, 0x6F, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x34, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x32, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x34,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x00, 0x80, 0x00, 0x41, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x02, 0x80, 0x00, 0x41, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x41, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x43, 0x00, 0x03, 0x27, 0x80, 0x00, 0x45, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x45, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x45, 0x00, 0x03, 0x08, 0x80, 0x00, 0x49, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x49, 0x00, 0x03, 0x01, 0x80, 0x00, 0x49, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x49, 0x00, 0x03, 0x08, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x4F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x55, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x55, 0x00, 0x03, 0x01, 0x80, 0x00, 0x55, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x55, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x00, 0x80, 0x00, 0x61, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x02, 0x80, 0x00, 0x61, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x08, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x01, 0x80, 0x00, 0x65, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x08, 0x80, 0x00, 0x69, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x01, 0x80, 0x00, 0x69, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x08, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x00, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x08, 0x80, 0x00, 0x75, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x01, 0x80, 0x00, 0x75, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x08, 0x80, 0x00, 0x79, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x08, 0x80, 0x00, 0x41, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x04, 0x80, 0x00, 0x41, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x06, 0x80, 0x00, 0x41, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x28, 0x80, 0x00, 0x43, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x01, 0x80, 0x00, 0x43, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x02, 0x80, 0x00, 0x43, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x43, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x63, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x44, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x45, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x04, 0x80, 0x00, 0x45, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x28, 0x80, 0x00, 0x45, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x47, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x02, 0x80, 0x00, 0x47, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x06, 0x80, 0x00, 0x47, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x03, 0x80, 0x00, 0x49, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x04, 0x80, 0x00, 0x49, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x06, 0x80, 0x00, 0x49, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x28, 0x80, 0x00, 0x49, 0x00, 0x03, 0x07,
+ 0xC0, 0x00, 0x49, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x6A,
+ 0x80, 0x00, 0x4A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x6A, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x4B, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4C, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6C, 0x00, 0x03, 0x0C,
+ 0xC0, 0x00, 0x4C, 0x00, 0x00, 0xB7, 0xC0, 0x00, 0x6C, 0x00, 0x00, 0xB7,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x01, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x27, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x4E, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x0C,
+ 0xC0, 0x02, 0xBC, 0x00, 0x00, 0x6E, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x06, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x0B,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x52, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x01, 0x80, 0x00, 0x52, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x27, 0x80, 0x00, 0x52, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x53, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x01, 0x80, 0x00, 0x53, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x02, 0x80, 0x00, 0x53, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x27, 0x80, 0x00, 0x53, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x54, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x27, 0x80, 0x00, 0x54, 0x00, 0x03, 0x0C,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x03, 0x80, 0x00, 0x55, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x04, 0x80, 0x00, 0x55, 0x00, 0x03, 0x06,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x06, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x0A, 0x80, 0x00, 0x55, 0x00, 0x03, 0x0B,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x0B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x28,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x28, 0x80, 0x00, 0x57, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x02, 0x80, 0x00, 0x59, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x01, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x07, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x5A, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x7A, 0x00, 0x03, 0x0C,
+ 0x40, 0x00, 0x73, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x6F,
+ 0x00, 0x03, 0x1B, 0x80, 0x00, 0x55, 0x00, 0x03, 0x1B, 0x80, 0x00, 0x75,
+ 0x00, 0x03, 0x1B, 0xC0, 0x00, 0x44, 0x00, 0x01, 0x7D, 0xC0, 0x00, 0x44,
+ 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x64, 0x00, 0x01, 0x7E, 0xC0, 0x00, 0x4C,
+ 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4C, 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6C,
+ 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x4E, 0x00, 0x00, 0x4A, 0xC0, 0x00, 0x4E,
+ 0x00, 0x00, 0x6A, 0xC0, 0x00, 0x6E, 0x00, 0x00, 0x6A, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x04, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x01, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x0C, 0x80, 0x00, 0xDC,
+ 0x00, 0x03, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC4,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xE4, 0x00, 0x03, 0x04, 0x80, 0x02, 0x26,
+ 0x00, 0x03, 0x04, 0x80, 0x02, 0x27, 0x00, 0x03, 0x04, 0x80, 0x00, 0xC6,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x04, 0x80, 0x00, 0x47,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x67, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4B,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6B, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x28, 0x80, 0x01, 0xEA,
+ 0x00, 0x03, 0x04, 0x80, 0x01, 0xEB, 0x00, 0x03, 0x04, 0x80, 0x01, 0xB7,
+ 0x00, 0x03, 0x0C, 0x80, 0x02, 0x92, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x6A,
+ 0x00, 0x03, 0x0C, 0xC0, 0x00, 0x44, 0x00, 0x00, 0x5A, 0xC0, 0x00, 0x44,
+ 0x00, 0x00, 0x7A, 0xC0, 0x00, 0x64, 0x00, 0x00, 0x7A, 0x80, 0x00, 0x47,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0x67, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4E,
+ 0x00, 0x03, 0x00, 0x80, 0x00, 0x6E, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC5,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xE5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC6,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xE6, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD8,
+ 0x00, 0x03, 0x01, 0x80, 0x00, 0xF8, 0x00, 0x03, 0x01, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x61, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x61, 0x00, 0x03, 0x11, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x65, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x65, 0x00, 0x03, 0x11, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x69, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x49,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x69, 0x00, 0x03, 0x11, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x11, 0x80, 0x00, 0x52,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x72, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x52,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x72, 0x00, 0x03, 0x11, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x0F, 0x80, 0x00, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x00, 0x55,
+ 0x00, 0x03, 0x11, 0x80, 0x00, 0x75, 0x00, 0x03, 0x11, 0x80, 0x00, 0x53,
+ 0x00, 0x03, 0x26, 0x80, 0x00, 0x73, 0x00, 0x03, 0x26, 0x80, 0x00, 0x54,
+ 0x00, 0x03, 0x26, 0x80, 0x00, 0x74, 0x00, 0x03, 0x26, 0x80, 0x00, 0x48,
+ 0x00, 0x03, 0x0C, 0x80, 0x00, 0x68, 0x00, 0x03, 0x0C, 0x80, 0x00, 0x41,
+ 0x00, 0x03, 0x07, 0x80, 0x00, 0x61, 0x00, 0x03, 0x07, 0x80, 0x00, 0x45,
+ 0x00, 0x03, 0x27, 0x80, 0x00, 0x65, 0x00, 0x03, 0x27, 0x80, 0x00, 0xD6,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xF6, 0x00, 0x03, 0x04, 0x80, 0x00, 0xD5,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0xF5, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4F,
+ 0x00, 0x03, 0x07, 0x80, 0x00, 0x6F, 0x00, 0x03, 0x07, 0x80, 0x02, 0x2E,
+ 0x00, 0x03, 0x04, 0x80, 0x02, 0x2F, 0x00, 0x03, 0x04, 0x80, 0x00, 0x59,
+ 0x00, 0x03, 0x04, 0x80, 0x00, 0x79, 0x00, 0x03, 0x04, 0x20, 0x00, 0x68,
+ 0x20, 0x02, 0x66, 0x20, 0x00, 0x6A, 0x20, 0x00, 0x72, 0x20, 0x02, 0x79,
+ 0x20, 0x02, 0x7B, 0x20, 0x02, 0x81, 0x20, 0x00, 0x77, 0x20, 0x00, 0x79,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x06, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x07,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x28,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x03, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x0B,
+ 0x20, 0x02, 0x63, 0x20, 0x00, 0x6C, 0x20, 0x00, 0x73, 0x20, 0x00, 0x78,
+ 0x20, 0x02, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x08, 0x00, 0x03, 0x01, 0x00, 0x02, 0xB9, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x45, 0x00, 0x00, 0x3B, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xA8, 0x00, 0x03, 0x01, 0x80, 0x03, 0x91, 0x00, 0x03, 0x01,
+ 0x00, 0x00, 0xB7, 0x80, 0x03, 0x95, 0x00, 0x03, 0x01, 0x80, 0x03, 0x97,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0x99, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xA9,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xCA, 0x00, 0x03, 0x01, 0x80, 0x03, 0x99,
+ 0x00, 0x03, 0x08, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x08, 0x80, 0x03, 0xB1,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x01, 0x80, 0x03, 0xCB,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x08, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x08, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x01, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x01, 0x40, 0x03, 0xB2,
+ 0x40, 0x03, 0xB8, 0x40, 0x03, 0xA5, 0x80, 0x03, 0xD2, 0x00, 0x03, 0x01,
+ 0x80, 0x03, 0xD2, 0x00, 0x03, 0x08, 0x40, 0x03, 0xC6, 0x40, 0x03, 0xC0,
+ 0x40, 0x03, 0xBA, 0x40, 0x03, 0xC1, 0x40, 0x03, 0xC2, 0x40, 0x03, 0x98,
+ 0x40, 0x03, 0xB5, 0x40, 0x03, 0xA3, 0x80, 0x04, 0x15, 0x00, 0x03, 0x00,
+ 0x80, 0x04, 0x15, 0x00, 0x03, 0x08, 0x80, 0x04, 0x13, 0x00, 0x03, 0x01,
+ 0x80, 0x04, 0x06, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1A, 0x00, 0x03, 0x01,
+ 0x80, 0x04, 0x18, 0x00, 0x03, 0x00, 0x80, 0x04, 0x23, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x18, 0x00, 0x03, 0x06, 0x80, 0x04, 0x38, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x35, 0x00, 0x03, 0x00, 0x80, 0x04, 0x35, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x33, 0x00, 0x03, 0x01, 0x80, 0x04, 0x56, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x3A, 0x00, 0x03, 0x01, 0x80, 0x04, 0x38, 0x00, 0x03, 0x00,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x06, 0x80, 0x04, 0x74, 0x00, 0x03, 0x0F,
+ 0x80, 0x04, 0x75, 0x00, 0x03, 0x0F, 0x80, 0x04, 0x16, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x36, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x30, 0x00, 0x03, 0x06, 0x80, 0x04, 0x10, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x30, 0x00, 0x03, 0x08, 0x80, 0x04, 0x15, 0x00, 0x03, 0x06,
+ 0x80, 0x04, 0x35, 0x00, 0x03, 0x06, 0x80, 0x04, 0xD8, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0xD9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x16, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x36, 0x00, 0x03, 0x08, 0x80, 0x04, 0x17, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x37, 0x00, 0x03, 0x08, 0x80, 0x04, 0x18, 0x00, 0x03, 0x04,
+ 0x80, 0x04, 0x38, 0x00, 0x03, 0x04, 0x80, 0x04, 0x18, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x38, 0x00, 0x03, 0x08, 0x80, 0x04, 0x1E, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x3E, 0x00, 0x03, 0x08, 0x80, 0x04, 0xE8, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0xE9, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2D, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x4D, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x04,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x04, 0x80, 0x04, 0x23, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x08, 0x80, 0x04, 0x23, 0x00, 0x03, 0x0B,
+ 0x80, 0x04, 0x43, 0x00, 0x03, 0x0B, 0x80, 0x04, 0x27, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x47, 0x00, 0x03, 0x08, 0x80, 0x04, 0x2B, 0x00, 0x03, 0x08,
+ 0x80, 0x04, 0x4B, 0x00, 0x03, 0x08, 0xC0, 0x05, 0x65, 0x00, 0x05, 0x82,
+ 0x80, 0x06, 0x27, 0x00, 0x06, 0x53, 0x80, 0x06, 0x27, 0x00, 0x06, 0x54,
+ 0x80, 0x06, 0x48, 0x00, 0x06, 0x54, 0x80, 0x06, 0x27, 0x00, 0x06, 0x55,
+ 0x80, 0x06, 0x4A, 0x00, 0x06, 0x54, 0xC0, 0x06, 0x27, 0x00, 0x06, 0x74,
+ 0xC0, 0x06, 0x48, 0x00, 0x06, 0x74, 0xC0, 0x06, 0xC7, 0x00, 0x06, 0x74,
+ 0xC0, 0x06, 0x4A, 0x00, 0x06, 0x74, 0x80, 0x06, 0xD5, 0x00, 0x06, 0x54,
+ 0x80, 0x06, 0xC1, 0x00, 0x06, 0x54, 0x80, 0x06, 0xD2, 0x00, 0x06, 0x54,
+ 0x80, 0x09, 0x28, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x30, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x33, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x15, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x16, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x17, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x1C, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x21, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x22, 0x00, 0x09, 0x3C, 0x80, 0x09, 0x2B, 0x00, 0x09, 0x3C,
+ 0x80, 0x09, 0x2F, 0x00, 0x09, 0x3C, 0x80, 0x09, 0xC7, 0x00, 0x09, 0xBE,
+ 0x80, 0x09, 0xC7, 0x00, 0x09, 0xD7, 0x80, 0x09, 0xA1, 0x00, 0x09, 0xBC,
+ 0x80, 0x09, 0xA2, 0x00, 0x09, 0xBC, 0x80, 0x09, 0xAF, 0x00, 0x09, 0xBC,
+ 0x80, 0x0A, 0x32, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x38, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0A, 0x16, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x17, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0A, 0x1C, 0x00, 0x0A, 0x3C, 0x80, 0x0A, 0x2B, 0x00, 0x0A, 0x3C,
+ 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x56, 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x3E,
+ 0x80, 0x0B, 0x47, 0x00, 0x0B, 0x57, 0x80, 0x0B, 0x21, 0x00, 0x0B, 0x3C,
+ 0x80, 0x0B, 0x22, 0x00, 0x0B, 0x3C, 0x80, 0x0B, 0x92, 0x00, 0x0B, 0xD7,
+ 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xBE, 0x80, 0x0B, 0xC7, 0x00, 0x0B, 0xBE,
+ 0x80, 0x0B, 0xC6, 0x00, 0x0B, 0xD7, 0x80, 0x0C, 0x46, 0x00, 0x0C, 0x56,
+ 0x80, 0x0C, 0xBF, 0x00, 0x0C, 0xD5, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD5,
+ 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xD6, 0x80, 0x0C, 0xC6, 0x00, 0x0C, 0xC2,
+ 0x80, 0x0C, 0xCA, 0x00, 0x0C, 0xD5, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x3E,
+ 0x80, 0x0D, 0x47, 0x00, 0x0D, 0x3E, 0x80, 0x0D, 0x46, 0x00, 0x0D, 0x57,
+ 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xCF,
+ 0x80, 0x0D, 0xDC, 0x00, 0x0D, 0xCA, 0x80, 0x0D, 0xD9, 0x00, 0x0D, 0xDF,
+ 0xC0, 0x0E, 0x4D, 0x00, 0x0E, 0x32, 0xC0, 0x0E, 0xCD, 0x00, 0x0E, 0xB2,
+ 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0x99, 0xC0, 0x0E, 0xAB, 0x00, 0x0E, 0xA1,
+ 0x08, 0x0F, 0x0B, 0x80, 0x0F, 0x42, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x4C,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x51, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x56,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x5B, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x40,
+ 0x00, 0x0F, 0xB5, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x72, 0x80, 0x0F, 0x71,
+ 0x00, 0x0F, 0x74, 0x80, 0x0F, 0xB2, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB2,
+ 0x00, 0x0F, 0x81, 0x80, 0x0F, 0xB3, 0x00, 0x0F, 0x80, 0xC0, 0x0F, 0xB3,
+ 0x00, 0x0F, 0x81, 0x80, 0x0F, 0x71, 0x00, 0x0F, 0x80, 0x80, 0x0F, 0x92,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x9C, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA1,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xA6, 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0xAB,
+ 0x00, 0x0F, 0xB7, 0x80, 0x0F, 0x90, 0x00, 0x0F, 0xB5, 0x80, 0x10, 0x25,
+ 0x00, 0x10, 0x2E, 0x20, 0x10, 0xDC, 0x80, 0x1B, 0x05, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x07, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x09, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x0B, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x0D, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x11, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3A, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x3C, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x3E, 0x00, 0x1B, 0x35,
+ 0x80, 0x1B, 0x3F, 0x00, 0x1B, 0x35, 0x80, 0x1B, 0x42, 0x00, 0x1B, 0x35,
+ 0x20, 0x00, 0x41, 0x20, 0x00, 0xC6, 0x20, 0x00, 0x42, 0x20, 0x00, 0x44,
+ 0x20, 0x00, 0x45, 0x20, 0x01, 0x8E, 0x20, 0x00, 0x47, 0x20, 0x00, 0x48,
+ 0x20, 0x00, 0x49, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x4B, 0x20, 0x00, 0x4C,
+ 0x20, 0x00, 0x4D, 0x20, 0x00, 0x4E, 0x20, 0x00, 0x4F, 0x20, 0x02, 0x22,
+ 0x20, 0x00, 0x50, 0x20, 0x00, 0x52, 0x20, 0x00, 0x54, 0x20, 0x00, 0x55,
+ 0x20, 0x00, 0x57, 0x20, 0x00, 0x61, 0x20, 0x02, 0x50, 0x20, 0x02, 0x51,
+ 0x20, 0x1D, 0x02, 0x20, 0x00, 0x62, 0x20, 0x00, 0x64, 0x20, 0x00, 0x65,
+ 0x20, 0x02, 0x59, 0x20, 0x02, 0x5B, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x67,
+ 0x20, 0x00, 0x6B, 0x20, 0x00, 0x6D, 0x20, 0x01, 0x4B, 0x20, 0x00, 0x6F,
+ 0x20, 0x02, 0x54, 0x20, 0x1D, 0x16, 0x20, 0x1D, 0x17, 0x20, 0x00, 0x70,
+ 0x20, 0x00, 0x74, 0x20, 0x00, 0x75, 0x20, 0x1D, 0x1D, 0x20, 0x02, 0x6F,
+ 0x20, 0x00, 0x76, 0x20, 0x1D, 0x25, 0x20, 0x03, 0xB2, 0x20, 0x03, 0xB3,
+ 0x20, 0x03, 0xB4, 0x20, 0x03, 0xC6, 0x20, 0x03, 0xC7, 0x24, 0x00, 0x69,
+ 0x24, 0x00, 0x72, 0x24, 0x00, 0x75, 0x24, 0x00, 0x76, 0x24, 0x03, 0xB2,
+ 0x24, 0x03, 0xB3, 0x24, 0x03, 0xC1, 0x24, 0x03, 0xC6, 0x24, 0x03, 0xC7,
+ 0x20, 0x04, 0x3D, 0x20, 0x02, 0x52, 0x20, 0x00, 0x63, 0x20, 0x02, 0x55,
+ 0x20, 0x00, 0xF0, 0x20, 0x02, 0x5C, 0x20, 0x00, 0x66, 0x20, 0x02, 0x5F,
+ 0x20, 0x02, 0x61, 0x20, 0x02, 0x65, 0x20, 0x02, 0x68, 0x20, 0x02, 0x69,
+ 0x20, 0x02, 0x6A, 0x20, 0x1D, 0x7B, 0x20, 0x02, 0x9D, 0x20, 0x02, 0x6D,
+ 0x20, 0x1D, 0x85, 0x20, 0x02, 0x9F, 0x20, 0x02, 0x71, 0x20, 0x02, 0x70,
+ 0x20, 0x02, 0x72, 0x20, 0x02, 0x73, 0x20, 0x02, 0x74, 0x20, 0x02, 0x75,
+ 0x20, 0x02, 0x78, 0x20, 0x02, 0x82, 0x20, 0x02, 0x83, 0x20, 0x01, 0xAB,
+ 0x20, 0x02, 0x89, 0x20, 0x02, 0x8A, 0x20, 0x1D, 0x1C, 0x20, 0x02, 0x8B,
+ 0x20, 0x02, 0x8C, 0x20, 0x00, 0x7A, 0x20, 0x02, 0x90, 0x20, 0x02, 0x91,
+ 0x20, 0x02, 0x92, 0x20, 0x03, 0xB8, 0x80, 0x00, 0x41, 0x00, 0x03, 0x25,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x25, 0x80, 0x00, 0x42, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x07, 0x80, 0x00, 0x42, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x23, 0x80, 0x00, 0x42, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x62, 0x00, 0x03, 0x31, 0x80, 0x00, 0xC7, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xE7, 0x00, 0x03, 0x01, 0x80, 0x00, 0x44, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x07, 0x80, 0x00, 0x44, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x23, 0x80, 0x00, 0x44, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x31, 0x80, 0x00, 0x44, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x27, 0x80, 0x00, 0x44, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x64, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x12, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x13, 0x00, 0x03, 0x00, 0x80, 0x01, 0x12, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x13, 0x00, 0x03, 0x01, 0x80, 0x00, 0x45, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x45, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x30, 0x80, 0x02, 0x28, 0x00, 0x03, 0x06,
+ 0x80, 0x02, 0x29, 0x00, 0x03, 0x06, 0x80, 0x00, 0x46, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x66, 0x00, 0x03, 0x07, 0x80, 0x00, 0x47, 0x00, 0x03, 0x04,
+ 0x80, 0x00, 0x67, 0x00, 0x03, 0x04, 0x80, 0x00, 0x48, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x07, 0x80, 0x00, 0x48, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x23, 0x80, 0x00, 0x48, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x08, 0x80, 0x00, 0x48, 0x00, 0x03, 0x27,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x27, 0x80, 0x00, 0x48, 0x00, 0x03, 0x2E,
+ 0x80, 0x00, 0x68, 0x00, 0x03, 0x2E, 0x80, 0x00, 0x49, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x30, 0x80, 0x00, 0xCF, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xEF, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4B, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6B, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x36, 0x00, 0x03, 0x04,
+ 0x80, 0x1E, 0x37, 0x00, 0x03, 0x04, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4C, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x6C, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4D, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6D, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x07, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x31, 0x80, 0x00, 0x4E, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x6E, 0x00, 0x03, 0x2D, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xF5, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD5, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0xF5, 0x00, 0x03, 0x08, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x4D, 0x00, 0x03, 0x00, 0x80, 0x01, 0x4C, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x4D, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x70, 0x00, 0x03, 0x01, 0x80, 0x00, 0x50, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x70, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x07, 0x80, 0x00, 0x52, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x23, 0x80, 0x1E, 0x5A, 0x00, 0x03, 0x04,
+ 0x80, 0x1E, 0x5B, 0x00, 0x03, 0x04, 0x80, 0x00, 0x52, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x72, 0x00, 0x03, 0x31, 0x80, 0x00, 0x53, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x07, 0x80, 0x00, 0x53, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x73, 0x00, 0x03, 0x23, 0x80, 0x01, 0x5A, 0x00, 0x03, 0x07,
+ 0x80, 0x01, 0x5B, 0x00, 0x03, 0x07, 0x80, 0x01, 0x60, 0x00, 0x03, 0x07,
+ 0x80, 0x01, 0x61, 0x00, 0x03, 0x07, 0x80, 0x1E, 0x62, 0x00, 0x03, 0x07,
+ 0x80, 0x1E, 0x63, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x07, 0x80, 0x00, 0x54, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x23, 0x80, 0x00, 0x54, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x31, 0x80, 0x00, 0x54, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x55, 0x00, 0x03, 0x24,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x24, 0x80, 0x00, 0x55, 0x00, 0x03, 0x30,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x30, 0x80, 0x00, 0x55, 0x00, 0x03, 0x2D,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x2D, 0x80, 0x01, 0x68, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x69, 0x00, 0x03, 0x01, 0x80, 0x01, 0x6A, 0x00, 0x03, 0x08,
+ 0x80, 0x01, 0x6B, 0x00, 0x03, 0x08, 0x80, 0x00, 0x56, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x76, 0x00, 0x03, 0x03, 0x80, 0x00, 0x56, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x76, 0x00, 0x03, 0x23, 0x80, 0x00, 0x57, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x00, 0x80, 0x00, 0x57, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x01, 0x80, 0x00, 0x57, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x08, 0x80, 0x00, 0x57, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x07, 0x80, 0x00, 0x57, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x77, 0x00, 0x03, 0x23, 0x80, 0x00, 0x58, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x78, 0x00, 0x03, 0x07, 0x80, 0x00, 0x58, 0x00, 0x03, 0x08,
+ 0x80, 0x00, 0x78, 0x00, 0x03, 0x08, 0x80, 0x00, 0x59, 0x00, 0x03, 0x07,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x07, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x02,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x02, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x23, 0x80, 0x00, 0x5A, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x7A, 0x00, 0x03, 0x31, 0x80, 0x00, 0x68, 0x00, 0x03, 0x31,
+ 0x80, 0x00, 0x74, 0x00, 0x03, 0x08, 0x80, 0x00, 0x77, 0x00, 0x03, 0x0A,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x0A, 0xC0, 0x00, 0x61, 0x00, 0x02, 0xBE,
+ 0x80, 0x01, 0x7F, 0x00, 0x03, 0x07, 0x80, 0x00, 0x41, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x23, 0x80, 0x00, 0x41, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x61, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x01, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x00, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x09, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xE2, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x02, 0x80, 0x01, 0x02, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x01, 0x80, 0x01, 0x02, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x00, 0x80, 0x01, 0x02, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x09, 0x80, 0x01, 0x02, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0x03, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xA0, 0x00, 0x03, 0x06,
+ 0x80, 0x1E, 0xA1, 0x00, 0x03, 0x06, 0x80, 0x00, 0x45, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x23, 0x80, 0x00, 0x45, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x09, 0x80, 0x00, 0x45, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x65, 0x00, 0x03, 0x03, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x01, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x00, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x09, 0x80, 0x00, 0xCA, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xEA, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xB8, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xB9, 0x00, 0x03, 0x02, 0x80, 0x00, 0x49, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x09, 0x80, 0x00, 0x49, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x69, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x23, 0x80, 0x00, 0x4F, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x6F, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x01,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x01, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x00, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x09, 0x80, 0x00, 0xD4, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0xF4, 0x00, 0x03, 0x03, 0x80, 0x1E, 0xCC, 0x00, 0x03, 0x02,
+ 0x80, 0x1E, 0xCD, 0x00, 0x03, 0x02, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x01, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x00, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x09, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x03, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x23,
+ 0x80, 0x01, 0xA1, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x23, 0x80, 0x00, 0x55, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x75, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x01,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x01, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x00,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x00, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x09,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x09, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x03,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x03, 0x80, 0x01, 0xAF, 0x00, 0x03, 0x23,
+ 0x80, 0x01, 0xB0, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x00,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x00, 0x80, 0x00, 0x59, 0x00, 0x03, 0x23,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x23, 0x80, 0x00, 0x59, 0x00, 0x03, 0x09,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x09, 0x80, 0x00, 0x59, 0x00, 0x03, 0x03,
+ 0x80, 0x00, 0x79, 0x00, 0x03, 0x03, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB1, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x00, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x01, 0x00, 0x03, 0x42, 0x80, 0x03, 0x91, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x91, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x08, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x09, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x11, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x10, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x11, 0x00, 0x03, 0x01, 0x80, 0x03, 0x95, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x95, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x19, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x18, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x19, 0x00, 0x03, 0x01, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB7, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x20, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x21, 0x00, 0x03, 0x42, 0x80, 0x03, 0x97, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x97, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x28, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x29, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xB9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x30, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x31, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x99, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x38, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x39, 0x00, 0x03, 0x42, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xBF, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x41, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x40, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x41, 0x00, 0x03, 0x01, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0x9F, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x49, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x48, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x49, 0x00, 0x03, 0x01, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC5, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x50, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x51, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x14,
+ 0x80, 0x1F, 0x59, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x59, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x59, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x60, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x61, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA9, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xA9, 0x00, 0x03, 0x14, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x00,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x00, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x01,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x01, 0x80, 0x1F, 0x68, 0x00, 0x03, 0x42,
+ 0x80, 0x1F, 0x69, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0xAC, 0x80, 0x03, 0xB5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAD,
+ 0x80, 0x03, 0xB7, 0x00, 0x03, 0x00, 0x00, 0x03, 0xAE, 0x80, 0x03, 0xB9,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0xAF, 0x80, 0x03, 0xBF, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0xCC, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCD,
+ 0x80, 0x03, 0xC9, 0x00, 0x03, 0x00, 0x00, 0x03, 0xCE, 0x80, 0x1F, 0x00,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x01, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x02,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x03, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x04,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x05, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x06,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x07, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x08,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x09, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x0F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x20,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x21, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x22,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x23, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x24,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x25, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x26,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x27, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x28,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x29, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x2F, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x60,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x61, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x62,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x63, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x64,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x65, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x66,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x67, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x68,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x69, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6A,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6B, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6C,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6D, 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6E,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0x6F, 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x04, 0x80, 0x1F, 0x70,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAC,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB1, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xB6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x91, 0x00, 0x03, 0x06, 0x80, 0x03, 0x91,
+ 0x00, 0x03, 0x04, 0x80, 0x03, 0x91, 0x00, 0x03, 0x00, 0x00, 0x03, 0x86,
+ 0x80, 0x03, 0x91, 0x00, 0x03, 0x45, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13,
+ 0x00, 0x03, 0xB9, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x13, 0xC0, 0x00, 0x20,
+ 0x00, 0x03, 0x42, 0x80, 0x00, 0xA8, 0x00, 0x03, 0x42, 0x80, 0x1F, 0x74,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x45, 0x80, 0x03, 0xAE,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xB7, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xC6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x95, 0x00, 0x03, 0x00, 0x00, 0x03, 0x88,
+ 0x80, 0x03, 0x97, 0x00, 0x03, 0x00, 0x00, 0x03, 0x89, 0x80, 0x03, 0x97,
+ 0x00, 0x03, 0x45, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xBF,
+ 0x00, 0x03, 0x01, 0x80, 0x1F, 0xBF, 0x00, 0x03, 0x42, 0x80, 0x03, 0xB9,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCA,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0x90, 0x80, 0x03, 0xB9, 0x00, 0x03, 0x42,
+ 0x80, 0x03, 0xCA, 0x00, 0x03, 0x42, 0x80, 0x03, 0x99, 0x00, 0x03, 0x06,
+ 0x80, 0x03, 0x99, 0x00, 0x03, 0x04, 0x80, 0x03, 0x99, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0x8A, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x00, 0x80, 0x1F, 0xFE,
+ 0x00, 0x03, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x03, 0x42, 0x80, 0x03, 0xC5,
+ 0x00, 0x03, 0x06, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xCB,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0xB0, 0x80, 0x03, 0xC1, 0x00, 0x03, 0x13,
+ 0x80, 0x03, 0xC1, 0x00, 0x03, 0x14, 0x80, 0x03, 0xC5, 0x00, 0x03, 0x42,
+ 0x80, 0x03, 0xCB, 0x00, 0x03, 0x42, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x06,
+ 0x80, 0x03, 0xA5, 0x00, 0x03, 0x04, 0x80, 0x03, 0xA5, 0x00, 0x03, 0x00,
+ 0x00, 0x03, 0x8E, 0x80, 0x03, 0xA1, 0x00, 0x03, 0x14, 0x80, 0x00, 0xA8,
+ 0x00, 0x03, 0x00, 0x00, 0x03, 0x85, 0x00, 0x00, 0x60, 0x80, 0x1F, 0x7C,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x45, 0x80, 0x03, 0xCE,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0xC9, 0x00, 0x03, 0x42, 0x80, 0x1F, 0xF6,
+ 0x00, 0x03, 0x45, 0x80, 0x03, 0x9F, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8C,
+ 0x80, 0x03, 0xA9, 0x00, 0x03, 0x00, 0x00, 0x03, 0x8F, 0x80, 0x03, 0xA9,
+ 0x00, 0x03, 0x45, 0x00, 0x00, 0xB4, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x14,
+ 0x00, 0x20, 0x02, 0x00, 0x20, 0x03, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20,
+ 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x00, 0x20,
+ 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x08, 0x20, 0x10,
+ 0xC0, 0x00, 0x20, 0x00, 0x03, 0x33, 0x40, 0x00, 0x2E, 0xC0, 0x00, 0x2E,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x2E, 0x80, 0x00, 0x2E, 0x00, 0x00, 0x2E,
+ 0x08, 0x00, 0x20, 0xC0, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x32,
+ 0x80, 0x20, 0x32, 0x00, 0x20, 0x32, 0xC0, 0x20, 0x35, 0x00, 0x20, 0x35,
+ 0xC0, 0x20, 0x35, 0x80, 0x20, 0x35, 0x00, 0x20, 0x35, 0xC0, 0x00, 0x21,
+ 0x00, 0x00, 0x21, 0xC0, 0x00, 0x20, 0x00, 0x03, 0x05, 0xC0, 0x00, 0x3F,
+ 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x21,
+ 0x00, 0x00, 0x3F, 0xC0, 0x20, 0x32, 0x80, 0x20, 0x32, 0x80, 0x20, 0x32,
+ 0x00, 0x20, 0x32, 0x40, 0x00, 0x20, 0x20, 0x00, 0x30, 0x20, 0x00, 0x69,
+ 0x20, 0x00, 0x34, 0x20, 0x00, 0x35, 0x20, 0x00, 0x36, 0x20, 0x00, 0x37,
+ 0x20, 0x00, 0x38, 0x20, 0x00, 0x39, 0x20, 0x00, 0x2B, 0x20, 0x22, 0x12,
+ 0x20, 0x00, 0x3D, 0x20, 0x00, 0x28, 0x20, 0x00, 0x29, 0x20, 0x00, 0x6E,
+ 0x24, 0x00, 0x30, 0x24, 0x00, 0x31, 0x24, 0x00, 0x32, 0x24, 0x00, 0x33,
+ 0x24, 0x00, 0x34, 0x24, 0x00, 0x35, 0x24, 0x00, 0x36, 0x24, 0x00, 0x37,
+ 0x24, 0x00, 0x38, 0x24, 0x00, 0x39, 0x24, 0x00, 0x2B, 0x24, 0x22, 0x12,
+ 0x24, 0x00, 0x3D, 0x24, 0x00, 0x28, 0x24, 0x00, 0x29, 0x24, 0x00, 0x61,
+ 0x24, 0x00, 0x65, 0x24, 0x00, 0x6F, 0x24, 0x00, 0x78, 0x24, 0x02, 0x59,
+ 0x24, 0x00, 0x68, 0x24, 0x00, 0x6B, 0x24, 0x00, 0x6C, 0x24, 0x00, 0x6D,
+ 0x24, 0x00, 0x6E, 0x24, 0x00, 0x70, 0x24, 0x00, 0x73, 0x24, 0x00, 0x74,
+ 0xC0, 0x00, 0x52, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F,
+ 0x00, 0x00, 0x63, 0xC0, 0x00, 0x61, 0x80, 0x00, 0x2F, 0x00, 0x00, 0x73,
+ 0x04, 0x00, 0x43, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x63,
+ 0x80, 0x00, 0x2F, 0x00, 0x00, 0x6F, 0xC0, 0x00, 0x63, 0x80, 0x00, 0x2F,
+ 0x00, 0x00, 0x75, 0x40, 0x01, 0x90, 0xC0, 0x00, 0xB0, 0x00, 0x00, 0x46,
+ 0x04, 0x00, 0x67, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48,
+ 0x04, 0x00, 0x68, 0x04, 0x01, 0x27, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49,
+ 0x04, 0x00, 0x4C, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x4E, 0xC0, 0x00, 0x4E,
+ 0x00, 0x00, 0x6F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x52, 0x04, 0x00, 0x52, 0xA0, 0x00, 0x53, 0x00, 0x00, 0x4D,
+ 0xC0, 0x00, 0x54, 0x80, 0x00, 0x45, 0x00, 0x00, 0x4C, 0xA0, 0x00, 0x54,
+ 0x00, 0x00, 0x4D, 0x04, 0x00, 0x5A, 0x00, 0x03, 0xA9, 0x04, 0x00, 0x5A,
+ 0x00, 0x00, 0x4B, 0x00, 0x00, 0xC5, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x4D,
+ 0x04, 0x00, 0x6F, 0x40, 0x05, 0xD0, 0x40, 0x05, 0xD1, 0x40, 0x05, 0xD2,
+ 0x40, 0x05, 0xD3, 0x04, 0x00, 0x69, 0xC0, 0x00, 0x46, 0x80, 0x00, 0x41,
+ 0x00, 0x00, 0x58, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xB3, 0x04, 0x03, 0x93,
+ 0x04, 0x03, 0xA0, 0x04, 0x22, 0x11, 0x04, 0x00, 0x44, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x37, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x39, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x80, 0x00, 0x31,
+ 0x00, 0x00, 0x30, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x33,
+ 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x32, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x35, 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35,
+ 0xBC, 0x00, 0x34, 0x80, 0x20, 0x44, 0x00, 0x00, 0x35, 0xBC, 0x00, 0x31,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x35, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x36, 0xBC, 0x00, 0x31, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38,
+ 0xBC, 0x00, 0x33, 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x35,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x38, 0xBC, 0x00, 0x37, 0x80, 0x20, 0x44,
+ 0x00, 0x00, 0x38, 0xBC, 0x00, 0x31, 0x00, 0x20, 0x44, 0x40, 0x00, 0x49,
+ 0xC0, 0x00, 0x49, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x80, 0x00, 0x49,
+ 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x56, 0x40, 0x00, 0x56,
+ 0xC0, 0x00, 0x56, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x56, 0x80, 0x00, 0x49,
+ 0x00, 0x00, 0x49, 0xC0, 0x00, 0x56, 0x80, 0x00, 0x49, 0x80, 0x00, 0x49,
+ 0x00, 0x00, 0x49, 0xC0, 0x00, 0x49, 0x00, 0x00, 0x58, 0x40, 0x00, 0x58,
+ 0xC0, 0x00, 0x58, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x58, 0x80, 0x00, 0x49,
+ 0x00, 0x00, 0x49, 0x40, 0x00, 0x4C, 0x40, 0x00, 0x43, 0x40, 0x00, 0x44,
+ 0x40, 0x00, 0x4D, 0x40, 0x00, 0x69, 0xC0, 0x00, 0x69, 0x00, 0x00, 0x69,
+ 0xC0, 0x00, 0x69, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69,
+ 0x00, 0x00, 0x76, 0x40, 0x00, 0x76, 0xC0, 0x00, 0x76, 0x00, 0x00, 0x69,
+ 0xC0, 0x00, 0x76, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x76,
+ 0x80, 0x00, 0x69, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x69,
+ 0x00, 0x00, 0x78, 0x40, 0x00, 0x78, 0xC0, 0x00, 0x78, 0x00, 0x00, 0x69,
+ 0xC0, 0x00, 0x78, 0x80, 0x00, 0x69, 0x00, 0x00, 0x69, 0x40, 0x00, 0x6C,
+ 0x40, 0x00, 0x63, 0x40, 0x00, 0x64, 0x40, 0x00, 0x6D, 0xBC, 0x00, 0x30,
+ 0x80, 0x20, 0x44, 0x00, 0x00, 0x33, 0x80, 0x21, 0x90, 0x00, 0x03, 0x38,
+ 0x80, 0x21, 0x92, 0x00, 0x03, 0x38, 0x80, 0x21, 0x94, 0x00, 0x03, 0x38,
+ 0x80, 0x21, 0xD0, 0x00, 0x03, 0x38, 0x80, 0x21, 0xD4, 0x00, 0x03, 0x38,
+ 0x80, 0x21, 0xD2, 0x00, 0x03, 0x38, 0x80, 0x22, 0x03, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x08, 0x00, 0x03, 0x38, 0x80, 0x22, 0x0B, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x23, 0x00, 0x03, 0x38, 0x80, 0x22, 0x25, 0x00, 0x03, 0x38,
+ 0xC0, 0x22, 0x2B, 0x00, 0x22, 0x2B, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B,
+ 0x00, 0x22, 0x2B, 0xC0, 0x22, 0x2E, 0x00, 0x22, 0x2E, 0xC0, 0x22, 0x2E,
+ 0x80, 0x22, 0x2E, 0x00, 0x22, 0x2E, 0x80, 0x22, 0x3C, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x43, 0x00, 0x03, 0x38, 0x80, 0x22, 0x45, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x48, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3D, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x61, 0x00, 0x03, 0x38, 0x80, 0x22, 0x4D, 0x00, 0x03, 0x38,
+ 0x80, 0x00, 0x3C, 0x00, 0x03, 0x38, 0x80, 0x00, 0x3E, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x64, 0x00, 0x03, 0x38, 0x80, 0x22, 0x65, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x72, 0x00, 0x03, 0x38, 0x80, 0x22, 0x73, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x76, 0x00, 0x03, 0x38, 0x80, 0x22, 0x77, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x7A, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7B, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x82, 0x00, 0x03, 0x38, 0x80, 0x22, 0x83, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x86, 0x00, 0x03, 0x38, 0x80, 0x22, 0x87, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0xA2, 0x00, 0x03, 0x38, 0x80, 0x22, 0xA8, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0xA9, 0x00, 0x03, 0x38, 0x80, 0x22, 0xAB, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x7C, 0x00, 0x03, 0x38, 0x80, 0x22, 0x7D, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0x91, 0x00, 0x03, 0x38, 0x80, 0x22, 0x92, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0xB2, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB3, 0x00, 0x03, 0x38,
+ 0x80, 0x22, 0xB4, 0x00, 0x03, 0x38, 0x80, 0x22, 0xB5, 0x00, 0x03, 0x38,
+ 0x00, 0x30, 0x08, 0x00, 0x30, 0x09, 0x1C, 0x00, 0x31, 0x1C, 0x00, 0x32,
+ 0x1C, 0x00, 0x33, 0x1C, 0x00, 0x34, 0x1C, 0x00, 0x35, 0x1C, 0x00, 0x36,
+ 0x1C, 0x00, 0x37, 0x1C, 0x00, 0x38, 0x1C, 0x00, 0x39, 0x9C, 0x00, 0x31,
+ 0x00, 0x00, 0x30, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x31,
+ 0x00, 0x00, 0x32, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x31,
+ 0x00, 0x00, 0x34, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x31,
+ 0x00, 0x00, 0x36, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x31,
+ 0x00, 0x00, 0x38, 0x9C, 0x00, 0x31, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x32,
+ 0x00, 0x00, 0x30, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x32, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x33, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x34,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x36, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x37, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x38,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x33, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x37, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x31, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x33, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x35, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x37, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x39, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x33, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x37, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38,
+ 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x00, 0x2E, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x62,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x63, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x64, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x65, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x66,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x67, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x68, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x69, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6A,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6E,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x70, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x71, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x72,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x73, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x74, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x75, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x76,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x77, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x78, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x79, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x7A,
+ 0x00, 0x00, 0x29, 0x1C, 0x00, 0x41, 0x1C, 0x00, 0x42, 0x1C, 0x00, 0x43,
+ 0x1C, 0x00, 0x44, 0x1C, 0x00, 0x45, 0x1C, 0x00, 0x46, 0x1C, 0x00, 0x47,
+ 0x1C, 0x00, 0x48, 0x1C, 0x00, 0x49, 0x1C, 0x00, 0x4A, 0x1C, 0x00, 0x4B,
+ 0x1C, 0x00, 0x4C, 0x1C, 0x00, 0x4D, 0x1C, 0x00, 0x4E, 0x1C, 0x00, 0x4F,
+ 0x1C, 0x00, 0x50, 0x1C, 0x00, 0x51, 0x1C, 0x00, 0x52, 0x1C, 0x00, 0x53,
+ 0x1C, 0x00, 0x54, 0x1C, 0x00, 0x55, 0x1C, 0x00, 0x56, 0x1C, 0x00, 0x57,
+ 0x1C, 0x00, 0x58, 0x1C, 0x00, 0x59, 0x1C, 0x00, 0x5A, 0x1C, 0x00, 0x61,
+ 0x1C, 0x00, 0x62, 0x1C, 0x00, 0x63, 0x1C, 0x00, 0x64, 0x1C, 0x00, 0x65,
+ 0x1C, 0x00, 0x66, 0x1C, 0x00, 0x67, 0x1C, 0x00, 0x68, 0x1C, 0x00, 0x69,
+ 0x1C, 0x00, 0x6A, 0x1C, 0x00, 0x6B, 0x1C, 0x00, 0x6C, 0x1C, 0x00, 0x6D,
+ 0x1C, 0x00, 0x6E, 0x1C, 0x00, 0x6F, 0x1C, 0x00, 0x70, 0x1C, 0x00, 0x71,
+ 0x1C, 0x00, 0x72, 0x1C, 0x00, 0x73, 0x1C, 0x00, 0x74, 0x1C, 0x00, 0x75,
+ 0x1C, 0x00, 0x76, 0x1C, 0x00, 0x77, 0x1C, 0x00, 0x78, 0x1C, 0x00, 0x79,
+ 0x1C, 0x00, 0x7A, 0x1C, 0x00, 0x30, 0xC0, 0x22, 0x2B, 0x80, 0x22, 0x2B,
+ 0x80, 0x22, 0x2B, 0x00, 0x22, 0x2B, 0xC0, 0x00, 0x3A, 0x80, 0x00, 0x3A,
+ 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x3D, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x3D,
+ 0x80, 0x00, 0x3D, 0x00, 0x00, 0x3D, 0x80, 0x2A, 0xDD, 0x00, 0x03, 0x38,
+ 0x24, 0x00, 0x6A, 0x20, 0x00, 0x56, 0x20, 0x2D, 0x61, 0x40, 0x6B, 0xCD,
+ 0x40, 0x9F, 0x9F, 0x40, 0x4E, 0x00, 0x40, 0x4E, 0x28, 0x40, 0x4E, 0x36,
+ 0x40, 0x4E, 0x3F, 0x40, 0x4E, 0x59, 0x40, 0x4E, 0x85, 0x40, 0x4E, 0x8C,
+ 0x40, 0x4E, 0xA0, 0x40, 0x4E, 0xBA, 0x40, 0x51, 0x3F, 0x40, 0x51, 0x65,
+ 0x40, 0x51, 0x6B, 0x40, 0x51, 0x82, 0x40, 0x51, 0x96, 0x40, 0x51, 0xAB,
+ 0x40, 0x51, 0xE0, 0x40, 0x51, 0xF5, 0x40, 0x52, 0x00, 0x40, 0x52, 0x9B,
+ 0x40, 0x52, 0xF9, 0x40, 0x53, 0x15, 0x40, 0x53, 0x1A, 0x40, 0x53, 0x38,
+ 0x40, 0x53, 0x41, 0x40, 0x53, 0x5C, 0x40, 0x53, 0x69, 0x40, 0x53, 0x82,
+ 0x40, 0x53, 0xB6, 0x40, 0x53, 0xC8, 0x40, 0x53, 0xE3, 0x40, 0x56, 0xD7,
+ 0x40, 0x57, 0x1F, 0x40, 0x58, 0xEB, 0x40, 0x59, 0x02, 0x40, 0x59, 0x0A,
+ 0x40, 0x59, 0x15, 0x40, 0x59, 0x27, 0x40, 0x59, 0x73, 0x40, 0x5B, 0x50,
+ 0x40, 0x5B, 0x80, 0x40, 0x5B, 0xF8, 0x40, 0x5C, 0x0F, 0x40, 0x5C, 0x22,
+ 0x40, 0x5C, 0x38, 0x40, 0x5C, 0x6E, 0x40, 0x5C, 0x71, 0x40, 0x5D, 0xDB,
+ 0x40, 0x5D, 0xE5, 0x40, 0x5D, 0xF1, 0x40, 0x5D, 0xFE, 0x40, 0x5E, 0x72,
+ 0x40, 0x5E, 0x7A, 0x40, 0x5E, 0x7F, 0x40, 0x5E, 0xF4, 0x40, 0x5E, 0xFE,
+ 0x40, 0x5F, 0x0B, 0x40, 0x5F, 0x13, 0x40, 0x5F, 0x50, 0x40, 0x5F, 0x61,
+ 0x40, 0x5F, 0x73, 0x40, 0x5F, 0xC3, 0x40, 0x62, 0x08, 0x40, 0x62, 0x36,
+ 0x40, 0x62, 0x4B, 0x40, 0x65, 0x2F, 0x40, 0x65, 0x34, 0x40, 0x65, 0x87,
+ 0x40, 0x65, 0x97, 0x40, 0x65, 0xA4, 0x40, 0x65, 0xB9, 0x40, 0x65, 0xE0,
+ 0x40, 0x65, 0xE5, 0x40, 0x66, 0xF0, 0x40, 0x67, 0x08, 0x40, 0x67, 0x28,
+ 0x40, 0x6B, 0x20, 0x40, 0x6B, 0x62, 0x40, 0x6B, 0x79, 0x40, 0x6B, 0xB3,
+ 0x40, 0x6B, 0xCB, 0x40, 0x6B, 0xD4, 0x40, 0x6B, 0xDB, 0x40, 0x6C, 0x0F,
+ 0x40, 0x6C, 0x14, 0x40, 0x6C, 0x34, 0x40, 0x70, 0x6B, 0x40, 0x72, 0x2A,
+ 0x40, 0x72, 0x36, 0x40, 0x72, 0x3B, 0x40, 0x72, 0x3F, 0x40, 0x72, 0x47,
+ 0x40, 0x72, 0x59, 0x40, 0x72, 0x5B, 0x40, 0x72, 0xAC, 0x40, 0x73, 0x84,
+ 0x40, 0x73, 0x89, 0x40, 0x74, 0xDC, 0x40, 0x74, 0xE6, 0x40, 0x75, 0x18,
+ 0x40, 0x75, 0x1F, 0x40, 0x75, 0x28, 0x40, 0x75, 0x30, 0x40, 0x75, 0x8B,
+ 0x40, 0x75, 0x92, 0x40, 0x76, 0x76, 0x40, 0x76, 0x7D, 0x40, 0x76, 0xAE,
+ 0x40, 0x76, 0xBF, 0x40, 0x76, 0xEE, 0x40, 0x77, 0xDB, 0x40, 0x77, 0xE2,
+ 0x40, 0x77, 0xF3, 0x40, 0x79, 0x3A, 0x40, 0x79, 0xB8, 0x40, 0x79, 0xBE,
+ 0x40, 0x7A, 0x74, 0x40, 0x7A, 0xCB, 0x40, 0x7A, 0xF9, 0x40, 0x7C, 0x73,
+ 0x40, 0x7C, 0xF8, 0x40, 0x7F, 0x36, 0x40, 0x7F, 0x51, 0x40, 0x7F, 0x8A,
+ 0x40, 0x7F, 0xBD, 0x40, 0x80, 0x01, 0x40, 0x80, 0x0C, 0x40, 0x80, 0x12,
+ 0x40, 0x80, 0x33, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x89, 0x40, 0x81, 0xE3,
+ 0x40, 0x81, 0xEA, 0x40, 0x81, 0xF3, 0x40, 0x81, 0xFC, 0x40, 0x82, 0x0C,
+ 0x40, 0x82, 0x1B, 0x40, 0x82, 0x1F, 0x40, 0x82, 0x6E, 0x40, 0x82, 0x72,
+ 0x40, 0x82, 0x78, 0x40, 0x86, 0x4D, 0x40, 0x86, 0x6B, 0x40, 0x88, 0x40,
+ 0x40, 0x88, 0x4C, 0x40, 0x88, 0x63, 0x40, 0x89, 0x7E, 0x40, 0x89, 0x8B,
+ 0x40, 0x89, 0xD2, 0x40, 0x8A, 0x00, 0x40, 0x8C, 0x37, 0x40, 0x8C, 0x46,
+ 0x40, 0x8C, 0x55, 0x40, 0x8C, 0x78, 0x40, 0x8C, 0x9D, 0x40, 0x8D, 0x64,
+ 0x40, 0x8D, 0x70, 0x40, 0x8D, 0xB3, 0x40, 0x8E, 0xAB, 0x40, 0x8E, 0xCA,
+ 0x40, 0x8F, 0x9B, 0x40, 0x8F, 0xB0, 0x40, 0x8F, 0xB5, 0x40, 0x90, 0x91,
+ 0x40, 0x91, 0x49, 0x40, 0x91, 0xC6, 0x40, 0x91, 0xCC, 0x40, 0x91, 0xD1,
+ 0x40, 0x95, 0x77, 0x40, 0x95, 0x80, 0x40, 0x96, 0x1C, 0x40, 0x96, 0xB6,
+ 0x40, 0x96, 0xB9, 0x40, 0x96, 0xE8, 0x40, 0x97, 0x51, 0x40, 0x97, 0x5E,
+ 0x40, 0x97, 0x62, 0x40, 0x97, 0x69, 0x40, 0x97, 0xCB, 0x40, 0x97, 0xED,
+ 0x40, 0x97, 0xF3, 0x40, 0x98, 0x01, 0x40, 0x98, 0xA8, 0x40, 0x98, 0xDB,
+ 0x40, 0x98, 0xDF, 0x40, 0x99, 0x96, 0x40, 0x99, 0x99, 0x40, 0x99, 0xAC,
+ 0x40, 0x9A, 0xA8, 0x40, 0x9A, 0xD8, 0x40, 0x9A, 0xDF, 0x40, 0x9B, 0x25,
+ 0x40, 0x9B, 0x2F, 0x40, 0x9B, 0x32, 0x40, 0x9B, 0x3C, 0x40, 0x9B, 0x5A,
+ 0x40, 0x9C, 0xE5, 0x40, 0x9E, 0x75, 0x40, 0x9E, 0x7F, 0x40, 0x9E, 0xA5,
+ 0x40, 0x9E, 0xBB, 0x40, 0x9E, 0xC3, 0x40, 0x9E, 0xCD, 0x40, 0x9E, 0xD1,
+ 0x40, 0x9E, 0xF9, 0x40, 0x9E, 0xFD, 0x40, 0x9F, 0x0E, 0x40, 0x9F, 0x13,
+ 0x40, 0x9F, 0x20, 0x40, 0x9F, 0x3B, 0x40, 0x9F, 0x4A, 0x40, 0x9F, 0x52,
+ 0x40, 0x9F, 0x8D, 0x40, 0x9F, 0x9C, 0x40, 0x9F, 0xA0, 0x2C, 0x00, 0x20,
+ 0x40, 0x30, 0x12, 0x40, 0x53, 0x41, 0x40, 0x53, 0x44, 0x40, 0x53, 0x45,
+ 0x80, 0x30, 0x4B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x4D, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x4F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x51, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x53, 0x00, 0x30, 0x99, 0x80, 0x30, 0x55, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x57, 0x00, 0x30, 0x99, 0x80, 0x30, 0x59, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x5B, 0x00, 0x30, 0x99, 0x80, 0x30, 0x5D, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x5F, 0x00, 0x30, 0x99, 0x80, 0x30, 0x61, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x64, 0x00, 0x30, 0x99, 0x80, 0x30, 0x66, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x68, 0x00, 0x30, 0x99, 0x80, 0x30, 0x6F, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x6F, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x72, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x72, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x75, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x75, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x78, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x78, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x7B, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0x7B, 0x00, 0x30, 0x9A, 0x80, 0x30, 0x46, 0x00, 0x30, 0x99,
+ 0xC0, 0x00, 0x20, 0x00, 0x30, 0x99, 0xC0, 0x00, 0x20, 0x00, 0x30, 0x9A,
+ 0x80, 0x30, 0x9D, 0x00, 0x30, 0x99, 0xA8, 0x30, 0x88, 0x00, 0x30, 0x8A,
+ 0x80, 0x30, 0xAB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xAD, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xAF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB1, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xB3, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB5, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xB7, 0x00, 0x30, 0x99, 0x80, 0x30, 0xB9, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xBB, 0x00, 0x30, 0x99, 0x80, 0x30, 0xBD, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xBF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC1, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xC4, 0x00, 0x30, 0x99, 0x80, 0x30, 0xC6, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0x99, 0x80, 0x30, 0xCF, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xCF, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD2, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xD2, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD5, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xD5, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xD8, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xD8, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xDB, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xDB, 0x00, 0x30, 0x9A, 0x80, 0x30, 0xA6, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xEF, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF0, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xF1, 0x00, 0x30, 0x99, 0x80, 0x30, 0xF2, 0x00, 0x30, 0x99,
+ 0x80, 0x30, 0xFD, 0x00, 0x30, 0x99, 0xA8, 0x30, 0xB3, 0x00, 0x30, 0xC8,
+ 0x40, 0x11, 0x00, 0x40, 0x11, 0x01, 0x40, 0x11, 0xAA, 0x40, 0x11, 0x02,
+ 0x40, 0x11, 0xAC, 0x40, 0x11, 0xAD, 0x40, 0x11, 0x03, 0x40, 0x11, 0x04,
+ 0x40, 0x11, 0x05, 0x40, 0x11, 0xB0, 0x40, 0x11, 0xB1, 0x40, 0x11, 0xB2,
+ 0x40, 0x11, 0xB3, 0x40, 0x11, 0xB4, 0x40, 0x11, 0xB5, 0x40, 0x11, 0x1A,
+ 0x40, 0x11, 0x06, 0x40, 0x11, 0x07, 0x40, 0x11, 0x08, 0x40, 0x11, 0x21,
+ 0x40, 0x11, 0x09, 0x40, 0x11, 0x0A, 0x40, 0x11, 0x0B, 0x40, 0x11, 0x0C,
+ 0x40, 0x11, 0x0D, 0x40, 0x11, 0x0E, 0x40, 0x11, 0x0F, 0x40, 0x11, 0x10,
+ 0x40, 0x11, 0x11, 0x40, 0x11, 0x12, 0x40, 0x11, 0x61, 0x40, 0x11, 0x62,
+ 0x40, 0x11, 0x63, 0x40, 0x11, 0x64, 0x40, 0x11, 0x65, 0x40, 0x11, 0x66,
+ 0x40, 0x11, 0x67, 0x40, 0x11, 0x68, 0x40, 0x11, 0x69, 0x40, 0x11, 0x6A,
+ 0x40, 0x11, 0x6B, 0x40, 0x11, 0x6C, 0x40, 0x11, 0x6D, 0x40, 0x11, 0x6E,
+ 0x40, 0x11, 0x6F, 0x40, 0x11, 0x70, 0x40, 0x11, 0x71, 0x40, 0x11, 0x72,
+ 0x40, 0x11, 0x73, 0x40, 0x11, 0x74, 0x40, 0x11, 0x75, 0x40, 0x11, 0x60,
+ 0x40, 0x11, 0x14, 0x40, 0x11, 0x15, 0x40, 0x11, 0xC7, 0x40, 0x11, 0xC8,
+ 0x40, 0x11, 0xCC, 0x40, 0x11, 0xCE, 0x40, 0x11, 0xD3, 0x40, 0x11, 0xD7,
+ 0x40, 0x11, 0xD9, 0x40, 0x11, 0x1C, 0x40, 0x11, 0xDD, 0x40, 0x11, 0xDF,
+ 0x40, 0x11, 0x1D, 0x40, 0x11, 0x1E, 0x40, 0x11, 0x20, 0x40, 0x11, 0x22,
+ 0x40, 0x11, 0x23, 0x40, 0x11, 0x27, 0x40, 0x11, 0x29, 0x40, 0x11, 0x2B,
+ 0x40, 0x11, 0x2C, 0x40, 0x11, 0x2D, 0x40, 0x11, 0x2E, 0x40, 0x11, 0x2F,
+ 0x40, 0x11, 0x32, 0x40, 0x11, 0x36, 0x40, 0x11, 0x40, 0x40, 0x11, 0x47,
+ 0x40, 0x11, 0x4C, 0x40, 0x11, 0xF1, 0x40, 0x11, 0xF2, 0x40, 0x11, 0x57,
+ 0x40, 0x11, 0x58, 0x40, 0x11, 0x59, 0x40, 0x11, 0x84, 0x40, 0x11, 0x85,
+ 0x40, 0x11, 0x88, 0x40, 0x11, 0x91, 0x40, 0x11, 0x92, 0x40, 0x11, 0x94,
+ 0x40, 0x11, 0x9E, 0x40, 0x11, 0xA1, 0x20, 0x4E, 0x00, 0x20, 0x4E, 0x8C,
+ 0x20, 0x4E, 0x09, 0x20, 0x56, 0xDB, 0x20, 0x4E, 0x0A, 0x20, 0x4E, 0x2D,
+ 0x20, 0x4E, 0x0B, 0x20, 0x75, 0x32, 0x20, 0x4E, 0x59, 0x20, 0x4E, 0x19,
+ 0x20, 0x4E, 0x01, 0x20, 0x59, 0x29, 0x20, 0x57, 0x30, 0x20, 0x4E, 0xBA,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x00, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x02, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x06, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x07, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x0E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x11, 0x11, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x11, 0x12, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x00,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x02,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x03,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x05,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x06,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x07,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x09,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0E,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0F,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x10,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x11,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x12,
+ 0x80, 0x11, 0x61, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0C,
+ 0x80, 0x11, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B,
+ 0x80, 0x11, 0x69, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x65, 0x80, 0x11, 0xAB,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x69,
+ 0x80, 0x11, 0x12, 0x80, 0x11, 0x6E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x4E, 0x00, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x8C,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x09, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x56, 0xDB, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x4E, 0x94, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x51, 0x6D,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0x03, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x51, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x4E, 0x5D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x53, 0x41,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x08, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x70, 0x6B, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x6C, 0x34, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x28,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x91, 0xD1, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x57, 0x1F, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x65, 0xE5, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x68, 0x2A,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x67, 0x09, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x79, 0x3E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x54, 0x0D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x72, 0x79,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xA1, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x79, 0x5D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x52, 0xB4, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4E, 0xE3,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x54, 0x7C, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x5B, 0x66, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x76, 0xE3, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x01,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x8C, 0xC7, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x53, 0x54, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x79, 0x6D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x4F, 0x11,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x81, 0xEA, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x81, 0xF3, 0x00, 0x00, 0x29, 0x1C, 0x55, 0x4F,
+ 0x1C, 0x5E, 0x7C, 0x1C, 0x65, 0x87, 0x1C, 0x7B, 0x8F, 0xB8, 0x00, 0x50,
+ 0x80, 0x00, 0x54, 0x00, 0x00, 0x45, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x31,
+ 0x9C, 0x00, 0x32, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x33,
+ 0x9C, 0x00, 0x32, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x35,
+ 0x9C, 0x00, 0x32, 0x00, 0x00, 0x36, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x37,
+ 0x9C, 0x00, 0x32, 0x00, 0x00, 0x38, 0x9C, 0x00, 0x32, 0x00, 0x00, 0x39,
+ 0x9C, 0x00, 0x33, 0x00, 0x00, 0x30, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x31,
+ 0x9C, 0x00, 0x33, 0x00, 0x00, 0x32, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x33,
+ 0x9C, 0x00, 0x33, 0x00, 0x00, 0x34, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x35,
+ 0x1C, 0x11, 0x00, 0x1C, 0x11, 0x02, 0x1C, 0x11, 0x03, 0x1C, 0x11, 0x05,
+ 0x1C, 0x11, 0x06, 0x1C, 0x11, 0x07, 0x1C, 0x11, 0x09, 0x1C, 0x11, 0x0B,
+ 0x1C, 0x11, 0x0C, 0x1C, 0x11, 0x0E, 0x1C, 0x11, 0x0F, 0x1C, 0x11, 0x10,
+ 0x1C, 0x11, 0x11, 0x1C, 0x11, 0x12, 0x9C, 0x11, 0x00, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x02, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x03, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x05, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x06, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x07, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x09, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x0B, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0C, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x0E, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0F, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x10, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x11, 0x00, 0x11, 0x61,
+ 0x9C, 0x11, 0x12, 0x00, 0x11, 0x61, 0x9C, 0x11, 0x0E, 0x80, 0x11, 0x61,
+ 0x80, 0x11, 0xB7, 0x80, 0x11, 0x00, 0x00, 0x11, 0x69, 0x9C, 0x11, 0x0C,
+ 0x80, 0x11, 0x6E, 0x80, 0x11, 0x0B, 0x00, 0x11, 0x74, 0x9C, 0x11, 0x0B,
+ 0x00, 0x11, 0x6E, 0x1C, 0x4E, 0x00, 0x1C, 0x4E, 0x8C, 0x1C, 0x4E, 0x09,
+ 0x1C, 0x56, 0xDB, 0x1C, 0x4E, 0x94, 0x1C, 0x51, 0x6D, 0x1C, 0x4E, 0x03,
+ 0x1C, 0x51, 0x6B, 0x1C, 0x4E, 0x5D, 0x1C, 0x53, 0x41, 0x1C, 0x67, 0x08,
+ 0x1C, 0x70, 0x6B, 0x1C, 0x6C, 0x34, 0x1C, 0x67, 0x28, 0x1C, 0x91, 0xD1,
+ 0x1C, 0x57, 0x1F, 0x1C, 0x65, 0xE5, 0x1C, 0x68, 0x2A, 0x1C, 0x67, 0x09,
+ 0x1C, 0x79, 0x3E, 0x1C, 0x54, 0x0D, 0x1C, 0x72, 0x79, 0x1C, 0x8C, 0xA1,
+ 0x1C, 0x79, 0x5D, 0x1C, 0x52, 0xB4, 0x1C, 0x79, 0xD8, 0x1C, 0x75, 0x37,
+ 0x1C, 0x59, 0x73, 0x1C, 0x90, 0x69, 0x1C, 0x51, 0x2A, 0x1C, 0x53, 0x70,
+ 0x1C, 0x6C, 0xE8, 0x1C, 0x98, 0x05, 0x1C, 0x4F, 0x11, 0x1C, 0x51, 0x99,
+ 0x1C, 0x6B, 0x63, 0x1C, 0x4E, 0x0A, 0x1C, 0x4E, 0x2D, 0x1C, 0x4E, 0x0B,
+ 0x1C, 0x5D, 0xE6, 0x1C, 0x53, 0xF3, 0x1C, 0x53, 0x3B, 0x1C, 0x5B, 0x97,
+ 0x1C, 0x5B, 0x66, 0x1C, 0x76, 0xE3, 0x1C, 0x4F, 0x01, 0x1C, 0x8C, 0xC7,
+ 0x1C, 0x53, 0x54, 0x1C, 0x59, 0x1C, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x36,
+ 0x9C, 0x00, 0x33, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x33, 0x00, 0x00, 0x38,
+ 0x9C, 0x00, 0x33, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x30,
+ 0x9C, 0x00, 0x34, 0x00, 0x00, 0x31, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x32,
+ 0x9C, 0x00, 0x34, 0x00, 0x00, 0x33, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x34,
+ 0x9C, 0x00, 0x34, 0x00, 0x00, 0x35, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x36,
+ 0x9C, 0x00, 0x34, 0x00, 0x00, 0x37, 0x9C, 0x00, 0x34, 0x00, 0x00, 0x38,
+ 0x9C, 0x00, 0x34, 0x00, 0x00, 0x39, 0x9C, 0x00, 0x35, 0x00, 0x00, 0x30,
+ 0xC0, 0x00, 0x31, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x32, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x33, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x34, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x35, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x36, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x37, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x38, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x39, 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30,
+ 0x00, 0x67, 0x08, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x67, 0x08,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x67, 0x08, 0xB8, 0x00, 0x48,
+ 0x00, 0x00, 0x67, 0xB8, 0x00, 0x65, 0x80, 0x00, 0x72, 0x00, 0x00, 0x67,
+ 0xB8, 0x00, 0x65, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4C, 0x80, 0x00, 0x54,
+ 0x00, 0x00, 0x44, 0x1C, 0x30, 0xA2, 0x1C, 0x30, 0xA4, 0x1C, 0x30, 0xA6,
+ 0x1C, 0x30, 0xA8, 0x1C, 0x30, 0xAA, 0x1C, 0x30, 0xAB, 0x1C, 0x30, 0xAD,
+ 0x1C, 0x30, 0xAF, 0x1C, 0x30, 0xB1, 0x1C, 0x30, 0xB3, 0x1C, 0x30, 0xB5,
+ 0x1C, 0x30, 0xB7, 0x1C, 0x30, 0xB9, 0x1C, 0x30, 0xBB, 0x1C, 0x30, 0xBD,
+ 0x1C, 0x30, 0xBF, 0x1C, 0x30, 0xC1, 0x1C, 0x30, 0xC4, 0x1C, 0x30, 0xC6,
+ 0x1C, 0x30, 0xC8, 0x1C, 0x30, 0xCA, 0x1C, 0x30, 0xCB, 0x1C, 0x30, 0xCC,
+ 0x1C, 0x30, 0xCD, 0x1C, 0x30, 0xCE, 0x1C, 0x30, 0xCF, 0x1C, 0x30, 0xD2,
+ 0x1C, 0x30, 0xD5, 0x1C, 0x30, 0xD8, 0x1C, 0x30, 0xDB, 0x1C, 0x30, 0xDE,
+ 0x1C, 0x30, 0xDF, 0x1C, 0x30, 0xE0, 0x1C, 0x30, 0xE1, 0x1C, 0x30, 0xE2,
+ 0x1C, 0x30, 0xE4, 0x1C, 0x30, 0xE6, 0x1C, 0x30, 0xE8, 0x1C, 0x30, 0xE9,
+ 0x1C, 0x30, 0xEA, 0x1C, 0x30, 0xEB, 0x1C, 0x30, 0xEC, 0x1C, 0x30, 0xED,
+ 0x1C, 0x30, 0xEF, 0x1C, 0x30, 0xF0, 0x1C, 0x30, 0xF1, 0x1C, 0x30, 0xF2,
+ 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xD1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8,
+ 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xD5, 0x00, 0x30, 0xA1,
+ 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xDA, 0x00, 0x30, 0xA2,
+ 0xB8, 0x30, 0xA2, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xA4,
+ 0x80, 0x30, 0xCB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xA4,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xA6, 0x80, 0x30, 0xA9,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xB9, 0x80, 0x30, 0xAF,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xA8, 0x80, 0x30, 0xFC,
+ 0x80, 0x30, 0xAB, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xAA, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0,
+ 0xB8, 0x30, 0xAB, 0x80, 0x30, 0xA4, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xAB,
+ 0x80, 0x30, 0xE9, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xAB,
+ 0x80, 0x30, 0xED, 0x80, 0x30, 0xEA, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAC,
+ 0x80, 0x30, 0xED, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xAC, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xDE, 0xB8, 0x30, 0xAE, 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xAE,
+ 0x80, 0x30, 0xCB, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xE5,
+ 0x80, 0x30, 0xEA, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAE, 0x80, 0x30, 0xEB,
+ 0x80, 0x30, 0xC0, 0x00, 0x30, 0xFC, 0xB8, 0x30, 0xAD, 0x00, 0x30, 0xED,
+ 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xB0, 0x80, 0x30, 0xE9,
+ 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xAD, 0x80, 0x30, 0xED, 0x80, 0x30, 0xE1,
+ 0x80, 0x30, 0xFC, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xAD,
+ 0x80, 0x30, 0xED, 0x80, 0x30, 0xEF, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8,
+ 0xB8, 0x30, 0xB0, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB0,
+ 0x80, 0x30, 0xE9, 0x80, 0x30, 0xE0, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xF3,
+ 0xB8, 0x30, 0xAF, 0x80, 0x30, 0xEB, 0x80, 0x30, 0xBC, 0x80, 0x30, 0xA4,
+ 0x00, 0x30, 0xED, 0xB8, 0x30, 0xAF, 0x80, 0x30, 0xED, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xCD, 0xB8, 0x30, 0xB1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9,
+ 0xB8, 0x30, 0xB3, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xCA, 0xB8, 0x30, 0xB3,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xDD, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xA4,
+ 0x80, 0x30, 0xAF, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xB5, 0x80, 0x30, 0xF3,
+ 0x80, 0x30, 0xC1, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xB7,
+ 0x80, 0x30, 0xEA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB0, 0xB8, 0x30, 0xBB,
+ 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC1, 0xB8, 0x30, 0xBB, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xC0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB9,
+ 0xB8, 0x30, 0xC7, 0x00, 0x30, 0xB7, 0xB8, 0x30, 0xC9, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xCA, 0x00, 0x30, 0xCE,
+ 0xB8, 0x30, 0xCE, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xCF,
+ 0x80, 0x30, 0xA4, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD1, 0x80, 0x30, 0xFC,
+ 0x80, 0x30, 0xBB, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD1,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC4, 0xB8, 0x30, 0xD0, 0x80, 0x30, 0xFC,
+ 0x80, 0x30, 0xEC, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x80, 0x30, 0xA2,
+ 0x80, 0x30, 0xB9, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4,
+ 0x80, 0x30, 0xAF, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD4, 0x00, 0x30, 0xB3,
+ 0xB8, 0x30, 0xD3, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xA1,
+ 0x80, 0x30, 0xE9, 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xD5,
+ 0x80, 0x30, 0xA3, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xD6,
+ 0x80, 0x30, 0xC3, 0x80, 0x30, 0xB7, 0x80, 0x30, 0xA7, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xD5, 0x80, 0x30, 0xE9, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xD8,
+ 0x80, 0x30, 0xAF, 0x80, 0x30, 0xBF, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xDA, 0x00, 0x30, 0xBD, 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xCB,
+ 0x00, 0x30, 0xD2, 0xB8, 0x30, 0xD8, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC4,
+ 0xB8, 0x30, 0xDA, 0x80, 0x30, 0xF3, 0x00, 0x30, 0xB9, 0xB8, 0x30, 0xDA,
+ 0x80, 0x30, 0xFC, 0x00, 0x30, 0xB8, 0xB8, 0x30, 0xD9, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xBF, 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xA4, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xC8, 0xB8, 0x30, 0xDC, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xC8,
+ 0xB8, 0x30, 0xDB, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDD, 0x80, 0x30, 0xF3,
+ 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xDB, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xDB, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDE,
+ 0x80, 0x30, 0xA4, 0x80, 0x30, 0xAF, 0x00, 0x30, 0xED, 0xB8, 0x30, 0xDE,
+ 0x80, 0x30, 0xA4, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xC3,
+ 0x00, 0x30, 0xCF, 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xEB, 0x00, 0x30, 0xAF,
+ 0xB8, 0x30, 0xDE, 0x80, 0x30, 0xF3, 0x80, 0x30, 0xB7, 0x80, 0x30, 0xE7,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDF, 0x80, 0x30, 0xAF, 0x80, 0x30, 0xED,
+ 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xDF, 0x00, 0x30, 0xEA, 0xB8, 0x30, 0xDF,
+ 0x80, 0x30, 0xEA, 0x80, 0x30, 0xD0, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xE1, 0x00, 0x30, 0xAC, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xAC,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xE1, 0x80, 0x30, 0xFC,
+ 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC,
+ 0x00, 0x30, 0xC9, 0xB8, 0x30, 0xE4, 0x80, 0x30, 0xFC, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xE6, 0x80, 0x30, 0xA2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEA,
+ 0x80, 0x30, 0xC3, 0x80, 0x30, 0xC8, 0x00, 0x30, 0xEB, 0xB8, 0x30, 0xEA,
+ 0x00, 0x30, 0xE9, 0xB8, 0x30, 0xEB, 0x80, 0x30, 0xD4, 0x00, 0x30, 0xFC,
+ 0xB8, 0x30, 0xEB, 0x80, 0x30, 0xFC, 0x80, 0x30, 0xD6, 0x00, 0x30, 0xEB,
+ 0xB8, 0x30, 0xEC, 0x00, 0x30, 0xE0, 0xB8, 0x30, 0xEC, 0x80, 0x30, 0xF3,
+ 0x80, 0x30, 0xC8, 0x80, 0x30, 0xB2, 0x00, 0x30, 0xF3, 0xB8, 0x30, 0xEF,
+ 0x80, 0x30, 0xC3, 0x00, 0x30, 0xC8, 0xC0, 0x00, 0x30, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x34, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x35, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x36, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x37, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x38, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x39, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x32, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x33, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x36, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x37, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x30, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x31, 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32,
+ 0x00, 0x70, 0xB9, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x33, 0x00, 0x70, 0xB9,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x34, 0x00, 0x70, 0xB9, 0xB8, 0x00, 0x68,
+ 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x61,
+ 0xB8, 0x00, 0x41, 0x00, 0x00, 0x55, 0xB8, 0x00, 0x62, 0x80, 0x00, 0x61,
+ 0x00, 0x00, 0x72, 0xB8, 0x00, 0x6F, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70,
+ 0x00, 0x00, 0x63, 0xB8, 0x00, 0x64, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x64,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x64, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x49, 0x00, 0x00, 0x55, 0xB8, 0x5E, 0x73,
+ 0x00, 0x62, 0x10, 0xB8, 0x66, 0x2D, 0x00, 0x54, 0x8C, 0xB8, 0x59, 0x27,
+ 0x00, 0x6B, 0x63, 0xB8, 0x66, 0x0E, 0x00, 0x6C, 0xBB, 0xB8, 0x68, 0x2A,
+ 0x80, 0x5F, 0x0F, 0x80, 0x4F, 0x1A, 0x00, 0x79, 0x3E, 0xB8, 0x00, 0x70,
+ 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x41, 0xB8, 0x03, 0xBC,
+ 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x41, 0xB8, 0x00, 0x6B,
+ 0x00, 0x00, 0x41, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x4D,
+ 0x00, 0x00, 0x42, 0xB8, 0x00, 0x47, 0x00, 0x00, 0x42, 0xB8, 0x00, 0x63,
+ 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x63,
+ 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x46,
+ 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x46, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x46,
+ 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x67,
+ 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x7A,
+ 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x4D,
+ 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x47, 0x80, 0x00, 0x48,
+ 0x00, 0x00, 0x7A, 0xB8, 0x00, 0x54, 0x80, 0x00, 0x48, 0x00, 0x00, 0x7A,
+ 0xB8, 0x03, 0xBC, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6D, 0x00, 0x21, 0x13,
+ 0xB8, 0x00, 0x64, 0x00, 0x21, 0x13, 0xB8, 0x00, 0x6B, 0x00, 0x21, 0x13,
+ 0xB8, 0x00, 0x66, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x6D,
+ 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x6D,
+ 0xB8, 0x00, 0x63, 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x6D,
+ 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x63,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB2,
+ 0xB8, 0x00, 0x6B, 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x6D,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x63, 0x80, 0x00, 0x6D,
+ 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6B,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0xB3, 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15,
+ 0x00, 0x00, 0x73, 0xB8, 0x00, 0x6D, 0x80, 0x22, 0x15, 0x80, 0x00, 0x73,
+ 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x6B,
+ 0x80, 0x00, 0x50, 0x00, 0x00, 0x61, 0xB8, 0x00, 0x4D, 0x80, 0x00, 0x50,
+ 0x00, 0x00, 0x61, 0xB8, 0x00, 0x47, 0x80, 0x00, 0x50, 0x00, 0x00, 0x61,
+ 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x72,
+ 0x80, 0x00, 0x61, 0x80, 0x00, 0x64, 0x80, 0x22, 0x15, 0x00, 0x00, 0x73,
+ 0xB8, 0x00, 0x72, 0x80, 0x00, 0x61, 0x80, 0x00, 0x64, 0x80, 0x22, 0x15,
+ 0x80, 0x00, 0x73, 0x00, 0x00, 0xB2, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x73,
+ 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x73, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x73,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x73, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x56,
+ 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x56, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x56,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x56,
+ 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x70, 0x00, 0x00, 0x57,
+ 0xB8, 0x00, 0x6E, 0x00, 0x00, 0x57, 0xB8, 0x03, 0xBC, 0x00, 0x00, 0x57,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x57,
+ 0xB8, 0x00, 0x4D, 0x00, 0x00, 0x57, 0xB8, 0x00, 0x6B, 0x00, 0x03, 0xA9,
+ 0xB8, 0x00, 0x4D, 0x00, 0x03, 0xA9, 0xB8, 0x00, 0x61, 0x80, 0x00, 0x2E,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x42, 0x00, 0x00, 0x71,
+ 0xB8, 0x00, 0x63, 0x00, 0x00, 0x63, 0xB8, 0x00, 0x63, 0x00, 0x00, 0x64,
+ 0xB8, 0x00, 0x43, 0x80, 0x22, 0x15, 0x80, 0x00, 0x6B, 0x00, 0x00, 0x67,
+ 0xB8, 0x00, 0x43, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x64,
+ 0x00, 0x00, 0x42, 0xB8, 0x00, 0x47, 0x00, 0x00, 0x79, 0xB8, 0x00, 0x68,
+ 0x00, 0x00, 0x61, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x50, 0xB8, 0x00, 0x69,
+ 0x00, 0x00, 0x6E, 0xB8, 0x00, 0x4B, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0x4B,
+ 0x00, 0x00, 0x4D, 0xB8, 0x00, 0x6B, 0x00, 0x00, 0x74, 0xB8, 0x00, 0x6C,
+ 0x00, 0x00, 0x6D, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x6E, 0xB8, 0x00, 0x6C,
+ 0x80, 0x00, 0x6F, 0x00, 0x00, 0x67, 0xB8, 0x00, 0x6C, 0x00, 0x00, 0x78,
+ 0xB8, 0x00, 0x6D, 0x00, 0x00, 0x62, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x69,
+ 0x00, 0x00, 0x6C, 0xB8, 0x00, 0x6D, 0x80, 0x00, 0x6F, 0x00, 0x00, 0x6C,
+ 0xB8, 0x00, 0x50, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x70, 0x80, 0x00, 0x2E,
+ 0x80, 0x00, 0x6D, 0x00, 0x00, 0x2E, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50,
+ 0x00, 0x00, 0x4D, 0xB8, 0x00, 0x50, 0x00, 0x00, 0x52, 0xB8, 0x00, 0x73,
+ 0x00, 0x00, 0x72, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x76, 0xB8, 0x00, 0x57,
+ 0x00, 0x00, 0x62, 0xB8, 0x00, 0x56, 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D,
+ 0xB8, 0x00, 0x41, 0x80, 0x22, 0x15, 0x00, 0x00, 0x6D, 0xC0, 0x00, 0x31,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x35,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x37,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x39,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x32, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x33,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x34, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x35, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31,
+ 0x80, 0x00, 0x36, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x37,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x38, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x31, 0x80, 0x00, 0x39, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x31,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x32, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x33, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x34, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x35,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x36, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x32, 0x80, 0x00, 0x37, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32,
+ 0x80, 0x00, 0x38, 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x32, 0x80, 0x00, 0x39,
+ 0x00, 0x65, 0xE5, 0xC0, 0x00, 0x33, 0x80, 0x00, 0x30, 0x00, 0x65, 0xE5,
+ 0xC0, 0x00, 0x33, 0x80, 0x00, 0x31, 0x00, 0x65, 0xE5, 0xB8, 0x00, 0x67,
+ 0x80, 0x00, 0x61, 0x00, 0x00, 0x6C, 0x20, 0xA7, 0x6F, 0x00, 0x8C, 0x48,
+ 0x00, 0x66, 0xF4, 0x00, 0x8E, 0xCA, 0x00, 0x8C, 0xC8, 0x00, 0x6E, 0xD1,
+ 0x00, 0x4E, 0x32, 0x00, 0x53, 0xE5, 0x00, 0x9F, 0x9C, 0x00, 0x9F, 0x9C,
+ 0x00, 0x59, 0x51, 0x00, 0x91, 0xD1, 0x00, 0x55, 0x87, 0x00, 0x59, 0x48,
+ 0x00, 0x61, 0xF6, 0x00, 0x76, 0x69, 0x00, 0x7F, 0x85, 0x00, 0x86, 0x3F,
+ 0x00, 0x87, 0xBA, 0x00, 0x88, 0xF8, 0x00, 0x90, 0x8F, 0x00, 0x6A, 0x02,
+ 0x00, 0x6D, 0x1B, 0x00, 0x70, 0xD9, 0x00, 0x73, 0xDE, 0x00, 0x84, 0x3D,
+ 0x00, 0x91, 0x6A, 0x00, 0x99, 0xF1, 0x00, 0x4E, 0x82, 0x00, 0x53, 0x75,
+ 0x00, 0x6B, 0x04, 0x00, 0x72, 0x1B, 0x00, 0x86, 0x2D, 0x00, 0x9E, 0x1E,
+ 0x00, 0x5D, 0x50, 0x00, 0x6F, 0xEB, 0x00, 0x85, 0xCD, 0x00, 0x89, 0x64,
+ 0x00, 0x62, 0xC9, 0x00, 0x81, 0xD8, 0x00, 0x88, 0x1F, 0x00, 0x5E, 0xCA,
+ 0x00, 0x67, 0x17, 0x00, 0x6D, 0x6A, 0x00, 0x72, 0xFC, 0x00, 0x90, 0xCE,
+ 0x00, 0x4F, 0x86, 0x00, 0x51, 0xB7, 0x00, 0x52, 0xDE, 0x00, 0x64, 0xC4,
+ 0x00, 0x6A, 0xD3, 0x00, 0x72, 0x10, 0x00, 0x76, 0xE7, 0x00, 0x80, 0x01,
+ 0x00, 0x86, 0x06, 0x00, 0x86, 0x5C, 0x00, 0x8D, 0xEF, 0x00, 0x97, 0x32,
+ 0x00, 0x9B, 0x6F, 0x00, 0x9D, 0xFA, 0x00, 0x78, 0x8C, 0x00, 0x79, 0x7F,
+ 0x00, 0x7D, 0xA0, 0x00, 0x83, 0xC9, 0x00, 0x93, 0x04, 0x00, 0x9E, 0x7F,
+ 0x00, 0x8A, 0xD6, 0x00, 0x58, 0xDF, 0x00, 0x5F, 0x04, 0x00, 0x7C, 0x60,
+ 0x00, 0x80, 0x7E, 0x00, 0x72, 0x62, 0x00, 0x78, 0xCA, 0x00, 0x8C, 0xC2,
+ 0x00, 0x96, 0xF7, 0x00, 0x58, 0xD8, 0x00, 0x5C, 0x62, 0x00, 0x6A, 0x13,
+ 0x00, 0x6D, 0xDA, 0x00, 0x6F, 0x0F, 0x00, 0x7D, 0x2F, 0x00, 0x7E, 0x37,
+ 0x00, 0x96, 0x4B, 0x00, 0x52, 0xD2, 0x00, 0x80, 0x8B, 0x00, 0x51, 0xDC,
+ 0x00, 0x51, 0xCC, 0x00, 0x7A, 0x1C, 0x00, 0x7D, 0xBE, 0x00, 0x83, 0xF1,
+ 0x00, 0x96, 0x75, 0x00, 0x8B, 0x80, 0x00, 0x62, 0xCF, 0x00, 0x6A, 0x02,
+ 0x00, 0x8A, 0xFE, 0x00, 0x4E, 0x39, 0x00, 0x5B, 0xE7, 0x00, 0x60, 0x12,
+ 0x00, 0x73, 0x87, 0x00, 0x75, 0x70, 0x00, 0x53, 0x17, 0x00, 0x78, 0xFB,
+ 0x00, 0x4F, 0xBF, 0x00, 0x5F, 0xA9, 0x00, 0x4E, 0x0D, 0x00, 0x6C, 0xCC,
+ 0x00, 0x65, 0x78, 0x00, 0x7D, 0x22, 0x00, 0x53, 0xC3, 0x00, 0x58, 0x5E,
+ 0x00, 0x77, 0x01, 0x00, 0x84, 0x49, 0x00, 0x8A, 0xAA, 0x00, 0x6B, 0xBA,
+ 0x00, 0x8F, 0xB0, 0x00, 0x6C, 0x88, 0x00, 0x62, 0xFE, 0x00, 0x82, 0xE5,
+ 0x00, 0x63, 0xA0, 0x00, 0x75, 0x65, 0x00, 0x4E, 0xAE, 0x00, 0x51, 0x69,
+ 0x00, 0x51, 0xC9, 0x00, 0x68, 0x81, 0x00, 0x7C, 0xE7, 0x00, 0x82, 0x6F,
+ 0x00, 0x8A, 0xD2, 0x00, 0x91, 0xCF, 0x00, 0x52, 0xF5, 0x00, 0x54, 0x42,
+ 0x00, 0x59, 0x73, 0x00, 0x5E, 0xEC, 0x00, 0x65, 0xC5, 0x00, 0x6F, 0xFE,
+ 0x00, 0x79, 0x2A, 0x00, 0x95, 0xAD, 0x00, 0x9A, 0x6A, 0x00, 0x9E, 0x97,
+ 0x00, 0x9E, 0xCE, 0x00, 0x52, 0x9B, 0x00, 0x66, 0xC6, 0x00, 0x6B, 0x77,
+ 0x00, 0x8F, 0x62, 0x00, 0x5E, 0x74, 0x00, 0x61, 0x90, 0x00, 0x62, 0x00,
+ 0x00, 0x64, 0x9A, 0x00, 0x6F, 0x23, 0x00, 0x71, 0x49, 0x00, 0x74, 0x89,
+ 0x00, 0x79, 0xCA, 0x00, 0x7D, 0xF4, 0x00, 0x80, 0x6F, 0x00, 0x8F, 0x26,
+ 0x00, 0x84, 0xEE, 0x00, 0x90, 0x23, 0x00, 0x93, 0x4A, 0x00, 0x52, 0x17,
+ 0x00, 0x52, 0xA3, 0x00, 0x54, 0xBD, 0x00, 0x70, 0xC8, 0x00, 0x88, 0xC2,
+ 0x00, 0x8A, 0xAA, 0x00, 0x5E, 0xC9, 0x00, 0x5F, 0xF5, 0x00, 0x63, 0x7B,
+ 0x00, 0x6B, 0xAE, 0x00, 0x7C, 0x3E, 0x00, 0x73, 0x75, 0x00, 0x4E, 0xE4,
+ 0x00, 0x56, 0xF9, 0x00, 0x5B, 0xE7, 0x00, 0x5D, 0xBA, 0x00, 0x60, 0x1C,
+ 0x00, 0x73, 0xB2, 0x00, 0x74, 0x69, 0x00, 0x7F, 0x9A, 0x00, 0x80, 0x46,
+ 0x00, 0x92, 0x34, 0x00, 0x96, 0xF6, 0x00, 0x97, 0x48, 0x00, 0x98, 0x18,
+ 0x00, 0x4F, 0x8B, 0x00, 0x79, 0xAE, 0x00, 0x91, 0xB4, 0x00, 0x96, 0xB8,
+ 0x00, 0x60, 0xE1, 0x00, 0x4E, 0x86, 0x00, 0x50, 0xDA, 0x00, 0x5B, 0xEE,
+ 0x00, 0x5C, 0x3F, 0x00, 0x65, 0x99, 0x00, 0x6A, 0x02, 0x00, 0x71, 0xCE,
+ 0x00, 0x76, 0x42, 0x00, 0x84, 0xFC, 0x00, 0x90, 0x7C, 0x00, 0x9F, 0x8D,
+ 0x00, 0x66, 0x88, 0x00, 0x96, 0x2E, 0x00, 0x52, 0x89, 0x00, 0x67, 0x7B,
+ 0x00, 0x67, 0xF3, 0x00, 0x6D, 0x41, 0x00, 0x6E, 0x9C, 0x00, 0x74, 0x09,
+ 0x00, 0x75, 0x59, 0x00, 0x78, 0x6B, 0x00, 0x7D, 0x10, 0x00, 0x98, 0x5E,
+ 0x00, 0x51, 0x6D, 0x00, 0x62, 0x2E, 0x00, 0x96, 0x78, 0x00, 0x50, 0x2B,
+ 0x00, 0x5D, 0x19, 0x00, 0x6D, 0xEA, 0x00, 0x8F, 0x2A, 0x00, 0x5F, 0x8B,
+ 0x00, 0x61, 0x44, 0x00, 0x68, 0x17, 0x00, 0x73, 0x87, 0x00, 0x96, 0x86,
+ 0x00, 0x52, 0x29, 0x00, 0x54, 0x0F, 0x00, 0x5C, 0x65, 0x00, 0x66, 0x13,
+ 0x00, 0x67, 0x4E, 0x00, 0x68, 0xA8, 0x00, 0x6C, 0xE5, 0x00, 0x74, 0x06,
+ 0x00, 0x75, 0xE2, 0x00, 0x7F, 0x79, 0x00, 0x88, 0xCF, 0x00, 0x88, 0xE1,
+ 0x00, 0x91, 0xCC, 0x00, 0x96, 0xE2, 0x00, 0x53, 0x3F, 0x00, 0x6E, 0xBA,
+ 0x00, 0x54, 0x1D, 0x00, 0x71, 0xD0, 0x00, 0x74, 0x98, 0x00, 0x85, 0xFA,
+ 0x00, 0x96, 0xA3, 0x00, 0x9C, 0x57, 0x00, 0x9E, 0x9F, 0x00, 0x67, 0x97,
+ 0x00, 0x6D, 0xCB, 0x00, 0x81, 0xE8, 0x00, 0x7A, 0xCB, 0x00, 0x7B, 0x20,
+ 0x00, 0x7C, 0x92, 0x00, 0x72, 0xC0, 0x00, 0x70, 0x99, 0x00, 0x8B, 0x58,
+ 0x00, 0x4E, 0xC0, 0x00, 0x83, 0x36, 0x00, 0x52, 0x3A, 0x00, 0x52, 0x07,
+ 0x00, 0x5E, 0xA6, 0x00, 0x62, 0xD3, 0x00, 0x7C, 0xD6, 0x00, 0x5B, 0x85,
+ 0x00, 0x6D, 0x1E, 0x00, 0x66, 0xB4, 0x00, 0x8F, 0x3B, 0x00, 0x88, 0x4C,
+ 0x00, 0x96, 0x4D, 0x00, 0x89, 0x8B, 0x00, 0x5E, 0xD3, 0x00, 0x51, 0x40,
+ 0x00, 0x55, 0xC0, 0x00, 0x58, 0x5A, 0x00, 0x66, 0x74, 0x00, 0x51, 0xDE,
+ 0x00, 0x73, 0x2A, 0x00, 0x76, 0xCA, 0x00, 0x79, 0x3C, 0x00, 0x79, 0x5E,
+ 0x00, 0x79, 0x65, 0x00, 0x79, 0x8F, 0x00, 0x97, 0x56, 0x00, 0x7C, 0xBE,
+ 0x00, 0x7F, 0xBD, 0x00, 0x86, 0x12, 0x00, 0x8A, 0xF8, 0x00, 0x90, 0x38,
+ 0x00, 0x90, 0xFD, 0x00, 0x98, 0xEF, 0x00, 0x98, 0xFC, 0x00, 0x99, 0x28,
+ 0x00, 0x9D, 0xB4, 0x00, 0x4F, 0xAE, 0x00, 0x50, 0xE7, 0x00, 0x51, 0x4D,
+ 0x00, 0x52, 0xC9, 0x00, 0x52, 0xE4, 0x00, 0x53, 0x51, 0x00, 0x55, 0x9D,
+ 0x00, 0x56, 0x06, 0x00, 0x56, 0x68, 0x00, 0x58, 0x40, 0x00, 0x58, 0xA8,
+ 0x00, 0x5C, 0x64, 0x00, 0x5C, 0x6E, 0x00, 0x60, 0x94, 0x00, 0x61, 0x68,
+ 0x00, 0x61, 0x8E, 0x00, 0x61, 0xF2, 0x00, 0x65, 0x4F, 0x00, 0x65, 0xE2,
+ 0x00, 0x66, 0x91, 0x00, 0x68, 0x85, 0x00, 0x6D, 0x77, 0x00, 0x6E, 0x1A,
+ 0x00, 0x6F, 0x22, 0x00, 0x71, 0x6E, 0x00, 0x72, 0x2B, 0x00, 0x74, 0x22,
+ 0x00, 0x78, 0x91, 0x00, 0x79, 0x3E, 0x00, 0x79, 0x49, 0x00, 0x79, 0x48,
+ 0x00, 0x79, 0x50, 0x00, 0x79, 0x56, 0x00, 0x79, 0x5D, 0x00, 0x79, 0x8D,
+ 0x00, 0x79, 0x8E, 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x81, 0x00, 0x7B, 0xC0,
+ 0x00, 0x7D, 0xF4, 0x00, 0x7E, 0x09, 0x00, 0x7E, 0x41, 0x00, 0x7F, 0x72,
+ 0x00, 0x80, 0x05, 0x00, 0x81, 0xED, 0x00, 0x82, 0x79, 0x00, 0x82, 0x79,
+ 0x00, 0x84, 0x57, 0x00, 0x89, 0x10, 0x00, 0x89, 0x96, 0x00, 0x8B, 0x01,
+ 0x00, 0x8B, 0x39, 0x00, 0x8C, 0xD3, 0x00, 0x8D, 0x08, 0x00, 0x8F, 0xB6,
+ 0x00, 0x90, 0x38, 0x00, 0x96, 0xE3, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x3B,
+ 0x00, 0x60, 0x75, 0x02, 0x42, 0xEE, 0x00, 0x82, 0x18, 0x00, 0x4E, 0x26,
+ 0x00, 0x51, 0xB5, 0x00, 0x51, 0x68, 0x00, 0x4F, 0x80, 0x00, 0x51, 0x45,
+ 0x00, 0x51, 0x80, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xFA, 0x00, 0x55, 0x9D,
+ 0x00, 0x55, 0x55, 0x00, 0x55, 0x99, 0x00, 0x55, 0xE2, 0x00, 0x58, 0x5A,
+ 0x00, 0x58, 0xB3, 0x00, 0x59, 0x44, 0x00, 0x59, 0x54, 0x00, 0x5A, 0x62,
+ 0x00, 0x5B, 0x28, 0x00, 0x5E, 0xD2, 0x00, 0x5E, 0xD9, 0x00, 0x5F, 0x69,
+ 0x00, 0x5F, 0xAD, 0x00, 0x60, 0xD8, 0x00, 0x61, 0x4E, 0x00, 0x61, 0x08,
+ 0x00, 0x61, 0x8E, 0x00, 0x61, 0x60, 0x00, 0x61, 0xF2, 0x00, 0x62, 0x34,
+ 0x00, 0x63, 0xC4, 0x00, 0x64, 0x1C, 0x00, 0x64, 0x52, 0x00, 0x65, 0x56,
+ 0x00, 0x66, 0x74, 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x56,
+ 0x00, 0x6B, 0x79, 0x00, 0x6B, 0xBA, 0x00, 0x6D, 0x41, 0x00, 0x6E, 0xDB,
+ 0x00, 0x6E, 0xCB, 0x00, 0x6F, 0x22, 0x00, 0x70, 0x1E, 0x00, 0x71, 0x6E,
+ 0x00, 0x77, 0xA7, 0x00, 0x72, 0x35, 0x00, 0x72, 0xAF, 0x00, 0x73, 0x2A,
+ 0x00, 0x74, 0x71, 0x00, 0x75, 0x06, 0x00, 0x75, 0x3B, 0x00, 0x76, 0x1D,
+ 0x00, 0x76, 0x1F, 0x00, 0x76, 0xCA, 0x00, 0x76, 0xDB, 0x00, 0x76, 0xF4,
+ 0x00, 0x77, 0x4A, 0x00, 0x77, 0x40, 0x00, 0x78, 0xCC, 0x00, 0x7A, 0xB1,
+ 0x00, 0x7B, 0xC0, 0x00, 0x7C, 0x7B, 0x00, 0x7D, 0x5B, 0x00, 0x7D, 0xF4,
+ 0x00, 0x7F, 0x3E, 0x00, 0x80, 0x05, 0x00, 0x83, 0x52, 0x00, 0x83, 0xEF,
+ 0x00, 0x87, 0x79, 0x00, 0x89, 0x41, 0x00, 0x89, 0x86, 0x00, 0x89, 0x96,
+ 0x00, 0x8A, 0xBF, 0x00, 0x8A, 0xF8, 0x00, 0x8A, 0xCB, 0x00, 0x8B, 0x01,
+ 0x00, 0x8A, 0xFE, 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x39, 0x00, 0x8B, 0x8A,
+ 0x00, 0x8D, 0x08, 0x00, 0x8F, 0x38, 0x00, 0x90, 0x72, 0x00, 0x91, 0x99,
+ 0x00, 0x92, 0x76, 0x00, 0x96, 0x7C, 0x00, 0x96, 0xE3, 0x00, 0x97, 0x56,
+ 0x00, 0x97, 0xDB, 0x00, 0x97, 0xFF, 0x00, 0x98, 0x0B, 0x00, 0x98, 0x3B,
+ 0x00, 0x9B, 0x12, 0x00, 0x9F, 0x9C, 0x02, 0x28, 0x4A, 0x02, 0x28, 0x44,
+ 0x02, 0x33, 0xD5, 0x00, 0x3B, 0x9D, 0x00, 0x40, 0x18, 0x00, 0x40, 0x39,
+ 0x02, 0x52, 0x49, 0x02, 0x5C, 0xD0, 0x02, 0x7E, 0xD3, 0x00, 0x9F, 0x43,
+ 0x00, 0x9F, 0x8E, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x66, 0xC0, 0x00, 0x66,
+ 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x00, 0x00, 0x6C, 0xC0, 0x00, 0x66,
+ 0x80, 0x00, 0x66, 0x00, 0x00, 0x69, 0xC0, 0x00, 0x66, 0x80, 0x00, 0x66,
+ 0x00, 0x00, 0x6C, 0xC0, 0x01, 0x7F, 0x00, 0x00, 0x74, 0xC0, 0x00, 0x73,
+ 0x00, 0x00, 0x74, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74,
+ 0x00, 0x05, 0x65, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6B, 0xC0, 0x05, 0x7E,
+ 0x00, 0x05, 0x76, 0xC0, 0x05, 0x74, 0x00, 0x05, 0x6D, 0x80, 0x05, 0xD9,
+ 0x00, 0x05, 0xB4, 0x80, 0x05, 0xF2, 0x00, 0x05, 0xB7, 0x04, 0x05, 0xE2,
+ 0x04, 0x05, 0xD0, 0x04, 0x05, 0xD3, 0x04, 0x05, 0xD4, 0x04, 0x05, 0xDB,
+ 0x04, 0x05, 0xDC, 0x04, 0x05, 0xDD, 0x04, 0x05, 0xE8, 0x04, 0x05, 0xEA,
+ 0x04, 0x00, 0x2B, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xC1, 0x80, 0x05, 0xE9,
+ 0x00, 0x05, 0xC2, 0x80, 0xFB, 0x49, 0x00, 0x05, 0xC1, 0x80, 0xFB, 0x49,
+ 0x00, 0x05, 0xC2, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xB7, 0x80, 0x05, 0xD0,
+ 0x00, 0x05, 0xB8, 0x80, 0x05, 0xD0, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD1,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD2, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD3,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD6, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD8,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDA,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDC,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xDE, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE0,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE1, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE3,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE4, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE6,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE7, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE8,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xE9, 0x00, 0x05, 0xBC, 0x80, 0x05, 0xEA,
+ 0x00, 0x05, 0xBC, 0x80, 0x05, 0xD5, 0x00, 0x05, 0xB9, 0x80, 0x05, 0xD1,
+ 0x00, 0x05, 0xBF, 0x80, 0x05, 0xDB, 0x00, 0x05, 0xBF, 0x80, 0x05, 0xE4,
+ 0x00, 0x05, 0xBF, 0xC0, 0x05, 0xD0, 0x00, 0x05, 0xDC, 0x18, 0x06, 0x71,
+ 0x14, 0x06, 0x71, 0x18, 0x06, 0x7B, 0x14, 0x06, 0x7B, 0x0C, 0x06, 0x7B,
+ 0x10, 0x06, 0x7B, 0x18, 0x06, 0x7E, 0x14, 0x06, 0x7E, 0x0C, 0x06, 0x7E,
+ 0x10, 0x06, 0x7E, 0x18, 0x06, 0x80, 0x14, 0x06, 0x80, 0x0C, 0x06, 0x80,
+ 0x10, 0x06, 0x80, 0x18, 0x06, 0x7A, 0x14, 0x06, 0x7A, 0x0C, 0x06, 0x7A,
+ 0x10, 0x06, 0x7A, 0x18, 0x06, 0x7F, 0x14, 0x06, 0x7F, 0x0C, 0x06, 0x7F,
+ 0x10, 0x06, 0x7F, 0x18, 0x06, 0x79, 0x14, 0x06, 0x79, 0x0C, 0x06, 0x79,
+ 0x10, 0x06, 0x79, 0x18, 0x06, 0xA4, 0x14, 0x06, 0xA4, 0x0C, 0x06, 0xA4,
+ 0x10, 0x06, 0xA4, 0x18, 0x06, 0xA6, 0x14, 0x06, 0xA6, 0x0C, 0x06, 0xA6,
+ 0x10, 0x06, 0xA6, 0x18, 0x06, 0x84, 0x14, 0x06, 0x84, 0x0C, 0x06, 0x84,
+ 0x10, 0x06, 0x84, 0x18, 0x06, 0x83, 0x14, 0x06, 0x83, 0x0C, 0x06, 0x83,
+ 0x10, 0x06, 0x83, 0x18, 0x06, 0x86, 0x14, 0x06, 0x86, 0x0C, 0x06, 0x86,
+ 0x10, 0x06, 0x86, 0x18, 0x06, 0x87, 0x14, 0x06, 0x87, 0x0C, 0x06, 0x87,
+ 0x10, 0x06, 0x87, 0x18, 0x06, 0x8D, 0x14, 0x06, 0x8D, 0x18, 0x06, 0x8C,
+ 0x14, 0x06, 0x8C, 0x18, 0x06, 0x8E, 0x14, 0x06, 0x8E, 0x18, 0x06, 0x88,
+ 0x14, 0x06, 0x88, 0x18, 0x06, 0x98, 0x14, 0x06, 0x98, 0x18, 0x06, 0x91,
+ 0x14, 0x06, 0x91, 0x18, 0x06, 0xA9, 0x14, 0x06, 0xA9, 0x0C, 0x06, 0xA9,
+ 0x10, 0x06, 0xA9, 0x18, 0x06, 0xAF, 0x14, 0x06, 0xAF, 0x0C, 0x06, 0xAF,
+ 0x10, 0x06, 0xAF, 0x18, 0x06, 0xB3, 0x14, 0x06, 0xB3, 0x0C, 0x06, 0xB3,
+ 0x10, 0x06, 0xB3, 0x18, 0x06, 0xB1, 0x14, 0x06, 0xB1, 0x0C, 0x06, 0xB1,
+ 0x10, 0x06, 0xB1, 0x18, 0x06, 0xBA, 0x14, 0x06, 0xBA, 0x18, 0x06, 0xBB,
+ 0x14, 0x06, 0xBB, 0x0C, 0x06, 0xBB, 0x10, 0x06, 0xBB, 0x18, 0x06, 0xC0,
+ 0x14, 0x06, 0xC0, 0x18, 0x06, 0xC1, 0x14, 0x06, 0xC1, 0x0C, 0x06, 0xC1,
+ 0x10, 0x06, 0xC1, 0x18, 0x06, 0xBE, 0x14, 0x06, 0xBE, 0x0C, 0x06, 0xBE,
+ 0x10, 0x06, 0xBE, 0x18, 0x06, 0xD2, 0x14, 0x06, 0xD2, 0x18, 0x06, 0xD3,
+ 0x14, 0x06, 0xD3, 0x18, 0x06, 0xAD, 0x14, 0x06, 0xAD, 0x0C, 0x06, 0xAD,
+ 0x10, 0x06, 0xAD, 0x18, 0x06, 0xC7, 0x14, 0x06, 0xC7, 0x18, 0x06, 0xC6,
+ 0x14, 0x06, 0xC6, 0x18, 0x06, 0xC8, 0x14, 0x06, 0xC8, 0x18, 0x06, 0x77,
+ 0x18, 0x06, 0xCB, 0x14, 0x06, 0xCB, 0x18, 0x06, 0xC5, 0x14, 0x06, 0xC5,
+ 0x18, 0x06, 0xC9, 0x14, 0x06, 0xC9, 0x18, 0x06, 0xD0, 0x14, 0x06, 0xD0,
+ 0x0C, 0x06, 0xD0, 0x10, 0x06, 0xD0, 0x0C, 0x06, 0x49, 0x10, 0x06, 0x49,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x27, 0x94, 0x06, 0x26, 0x00, 0x06, 0x27,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xD5, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD5,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x48, 0x94, 0x06, 0x26, 0x00, 0x06, 0x48,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC7, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC7,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC6, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC6,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xC8, 0x94, 0x06, 0x26, 0x00, 0x06, 0xC8,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x94, 0x06, 0x26, 0x00, 0x06, 0xD0,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0xD0, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x18, 0x06, 0xCC, 0x14, 0x06, 0xCC, 0x0C, 0x06, 0xCC, 0x10, 0x06, 0xCC,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x26, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x45, 0x98, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x28, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x45, 0x98, 0x06, 0x28, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2A, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2B, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x2E, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x33, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x33, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x35, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x36, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x36, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x36, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x36, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x37, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x37, 0x00, 0x06, 0x45,
+ 0x98, 0x06, 0x38, 0x00, 0x06, 0x45, 0x98, 0x06, 0x39, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x39, 0x00, 0x06, 0x45, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x41, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x45, 0x98, 0x06, 0x41, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x42, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x42, 0x00, 0x06, 0x45, 0x98, 0x06, 0x42, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x43, 0x00, 0x06, 0x27,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x2C, 0x98, 0x06, 0x43, 0x00, 0x06, 0x2D,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x2E, 0x98, 0x06, 0x43, 0x00, 0x06, 0x44,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x45, 0x98, 0x06, 0x43, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x43, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x44, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x45, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x45, 0x98, 0x06, 0x45, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x46, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x45, 0x98, 0x06, 0x46, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x47, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x47, 0x00, 0x06, 0x45, 0x98, 0x06, 0x47, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x47, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2C,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x2E,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x98, 0x06, 0x4A, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x4A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x30, 0x00, 0x06, 0x70,
+ 0x98, 0x06, 0x31, 0x00, 0x06, 0x70, 0x98, 0x06, 0x49, 0x00, 0x06, 0x70,
+ 0x98, 0x00, 0x20, 0x80, 0x06, 0x4C, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20,
+ 0x80, 0x06, 0x4D, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4E,
+ 0x00, 0x06, 0x51, 0x98, 0x00, 0x20, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51,
+ 0x98, 0x00, 0x20, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x00, 0x20,
+ 0x80, 0x06, 0x51, 0x00, 0x06, 0x70, 0x94, 0x06, 0x26, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x32, 0x94, 0x06, 0x26, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x46, 0x94, 0x06, 0x26, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x26, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x32, 0x94, 0x06, 0x28, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x46, 0x94, 0x06, 0x28, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x28, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2A, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x32, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x46, 0x94, 0x06, 0x2B, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2B, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x41, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x42, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x43, 0x00, 0x06, 0x27,
+ 0x94, 0x06, 0x43, 0x00, 0x06, 0x44, 0x94, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x43, 0x00, 0x06, 0x49, 0x94, 0x06, 0x43, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x44, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x44, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x00, 0x06, 0x27,
+ 0x94, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x00, 0x06, 0x31,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x32, 0x94, 0x06, 0x46, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x46, 0x94, 0x06, 0x46, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x46, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x49, 0x00, 0x06, 0x70,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x31, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x32,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x46,
+ 0x94, 0x06, 0x4A, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A, 0x00, 0x06, 0x4A,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x26, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x26, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x28, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x28, 0x00, 0x06, 0x47,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2A, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x2B, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x33, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x35, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x35, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x36, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x36, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x37, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x38, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x39, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x3A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x41, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x41, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x42, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x42, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x43, 0x00, 0x06, 0x44, 0x8C, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x44, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x44, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x45, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x46, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x00, 0x06, 0x47,
+ 0x8C, 0x06, 0x47, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x47, 0x00, 0x06, 0x70, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x26, 0x00, 0x06, 0x45, 0x90, 0x06, 0x26, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x28, 0x00, 0x06, 0x45, 0x90, 0x06, 0x28, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x2A, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2A, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x2B, 0x00, 0x06, 0x45, 0x90, 0x06, 0x2B, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x33, 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x34, 0x00, 0x06, 0x45, 0x90, 0x06, 0x34, 0x00, 0x06, 0x47,
+ 0x90, 0x06, 0x43, 0x00, 0x06, 0x44, 0x90, 0x06, 0x43, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x44, 0x00, 0x06, 0x45, 0x90, 0x06, 0x46, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x46, 0x00, 0x06, 0x47, 0x90, 0x06, 0x4A, 0x00, 0x06, 0x45,
+ 0x90, 0x06, 0x4A, 0x00, 0x06, 0x47, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4E,
+ 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x80, 0x06, 0x4F, 0x00, 0x06, 0x51,
+ 0x90, 0x06, 0x40, 0x80, 0x06, 0x50, 0x00, 0x06, 0x51, 0x98, 0x06, 0x37,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x39,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x3A,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x33,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2D,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x2E,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x36,
+ 0x00, 0x06, 0x49, 0x98, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x98, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x98, 0x06, 0x34, 0x00, 0x06, 0x45, 0x98, 0x06, 0x34,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x33, 0x00, 0x06, 0x31, 0x98, 0x06, 0x35,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x36, 0x00, 0x06, 0x31, 0x94, 0x06, 0x37,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x37, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x39,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x39, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x3A, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x33,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x34, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2E,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x2E, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x35,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x36,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x94, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34,
+ 0x00, 0x06, 0x31, 0x94, 0x06, 0x33, 0x00, 0x06, 0x31, 0x94, 0x06, 0x35,
+ 0x00, 0x06, 0x31, 0x94, 0x06, 0x36, 0x00, 0x06, 0x31, 0x8C, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33,
+ 0x00, 0x06, 0x47, 0x8C, 0x06, 0x34, 0x00, 0x06, 0x47, 0x8C, 0x06, 0x37,
+ 0x00, 0x06, 0x45, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2C, 0x90, 0x06, 0x33,
+ 0x00, 0x06, 0x2D, 0x90, 0x06, 0x33, 0x00, 0x06, 0x2E, 0x90, 0x06, 0x34,
+ 0x00, 0x06, 0x2C, 0x90, 0x06, 0x34, 0x00, 0x06, 0x2D, 0x90, 0x06, 0x34,
+ 0x00, 0x06, 0x2E, 0x90, 0x06, 0x37, 0x00, 0x06, 0x45, 0x90, 0x06, 0x38,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x27, 0x00, 0x06, 0x4B, 0x98, 0x06, 0x27,
+ 0x00, 0x06, 0x4B, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x2A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x2A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2D,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2D, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x49, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C,
+ 0x8C, 0x06, 0x33, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x33, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x35, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x35,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x34, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2E, 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2E, 0x94, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x34, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x36,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x94, 0x06, 0x36, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x36, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x37, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x37, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x39, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x39,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x3A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x3A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45,
+ 0x8C, 0x06, 0x41, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x42,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x44, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x2C, 0x94, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2C,
+ 0x94, 0x06, 0x44, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x44,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45,
+ 0x80, 0x06, 0x2D, 0x00, 0x06, 0x45, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D,
+ 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x45, 0x8C, 0x06, 0x45, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2E,
+ 0x8C, 0x06, 0x47, 0x80, 0x06, 0x45, 0x00, 0x06, 0x2C, 0x8C, 0x06, 0x47,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x46,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x49, 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x4A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x4A, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2A, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x49,
+ 0x94, 0x06, 0x2C, 0x80, 0x06, 0x45, 0x00, 0x06, 0x49, 0x94, 0x06, 0x33,
+ 0x80, 0x06, 0x2E, 0x00, 0x06, 0x49, 0x94, 0x06, 0x35, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x34, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x36, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x44, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x4A, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x4A,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x42, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x42,
+ 0x80, 0x06, 0x45, 0x00, 0x06, 0x2D, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2D,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x39, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x46,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x2D, 0x94, 0x06, 0x45, 0x80, 0x06, 0x2E,
+ 0x00, 0x06, 0x4A, 0x8C, 0x06, 0x44, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45,
+ 0x94, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x94, 0x06, 0x44,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C,
+ 0x00, 0x06, 0x2D, 0x94, 0x06, 0x2C, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x2D, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x45,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x94, 0x06, 0x41, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x4A, 0x94, 0x06, 0x28, 0x80, 0x06, 0x2D, 0x00, 0x06, 0x4A,
+ 0x8C, 0x06, 0x43, 0x80, 0x06, 0x45, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x39,
+ 0x80, 0x06, 0x2C, 0x00, 0x06, 0x45, 0x8C, 0x06, 0x35, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x45, 0x94, 0x06, 0x33, 0x80, 0x06, 0x2E, 0x00, 0x06, 0x4A,
+ 0x94, 0x06, 0x46, 0x80, 0x06, 0x2C, 0x00, 0x06, 0x4A, 0x98, 0x06, 0x35,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0xD2, 0x98, 0x06, 0x42, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0xD2, 0x98, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0x47, 0x98, 0x06, 0x27, 0x80, 0x06, 0x43, 0x80, 0x06, 0x28,
+ 0x00, 0x06, 0x31, 0x98, 0x06, 0x45, 0x80, 0x06, 0x2D, 0x80, 0x06, 0x45,
+ 0x00, 0x06, 0x2F, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x39,
+ 0x00, 0x06, 0x45, 0x98, 0x06, 0x31, 0x80, 0x06, 0x33, 0x80, 0x06, 0x48,
+ 0x00, 0x06, 0x44, 0x98, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A,
+ 0x00, 0x06, 0x47, 0x98, 0x06, 0x48, 0x80, 0x06, 0x33, 0x80, 0x06, 0x44,
+ 0x00, 0x06, 0x45, 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x00, 0x06, 0x49,
+ 0x98, 0x06, 0x35, 0x80, 0x06, 0x44, 0x80, 0x06, 0x49, 0x80, 0x00, 0x20,
+ 0x80, 0x06, 0x27, 0x80, 0x06, 0x44, 0x80, 0x06, 0x44, 0x80, 0x06, 0x47,
+ 0x80, 0x00, 0x20, 0x80, 0x06, 0x39, 0x80, 0x06, 0x44, 0x80, 0x06, 0x4A,
+ 0x80, 0x06, 0x47, 0x80, 0x00, 0x20, 0x80, 0x06, 0x48, 0x80, 0x06, 0x33,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0x45, 0x98, 0x06, 0x2C, 0x80, 0x06, 0x44,
+ 0x80, 0x00, 0x20, 0x80, 0x06, 0x2C, 0x80, 0x06, 0x44, 0x80, 0x06, 0x27,
+ 0x80, 0x06, 0x44, 0x00, 0x06, 0x47, 0x98, 0x06, 0x31, 0x80, 0x06, 0xCC,
+ 0x80, 0x06, 0x27, 0x00, 0x06, 0x44, 0x28, 0x00, 0x2C, 0x28, 0x30, 0x01,
+ 0x28, 0x30, 0x02, 0x28, 0x00, 0x3A, 0x28, 0x00, 0x3B, 0x28, 0x00, 0x21,
+ 0x28, 0x00, 0x3F, 0x28, 0x30, 0x16, 0x28, 0x30, 0x17, 0x28, 0x20, 0x26,
+ 0x28, 0x20, 0x25, 0x28, 0x20, 0x14, 0x28, 0x20, 0x13, 0x28, 0x00, 0x5F,
+ 0x28, 0x00, 0x5F, 0x28, 0x00, 0x28, 0x28, 0x00, 0x29, 0x28, 0x00, 0x7B,
+ 0x28, 0x00, 0x7D, 0x28, 0x30, 0x14, 0x28, 0x30, 0x15, 0x28, 0x30, 0x10,
+ 0x28, 0x30, 0x11, 0x28, 0x30, 0x0A, 0x28, 0x30, 0x0B, 0x28, 0x30, 0x08,
+ 0x28, 0x30, 0x09, 0x28, 0x30, 0x0C, 0x28, 0x30, 0x0D, 0x28, 0x30, 0x0E,
+ 0x28, 0x30, 0x0F, 0x28, 0x00, 0x5B, 0x28, 0x00, 0x5D, 0x40, 0x20, 0x3E,
+ 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x20, 0x3E, 0x40, 0x00, 0x5F,
+ 0x40, 0x00, 0x5F, 0x40, 0x00, 0x5F, 0x34, 0x00, 0x2C, 0x34, 0x30, 0x01,
+ 0x34, 0x00, 0x2E, 0x34, 0x00, 0x3B, 0x34, 0x00, 0x3A, 0x34, 0x00, 0x3F,
+ 0x34, 0x00, 0x21, 0x34, 0x20, 0x14, 0x34, 0x00, 0x28, 0x34, 0x00, 0x29,
+ 0x34, 0x00, 0x7B, 0x34, 0x00, 0x7D, 0x34, 0x30, 0x14, 0x34, 0x30, 0x15,
+ 0x34, 0x00, 0x23, 0x34, 0x00, 0x26, 0x34, 0x00, 0x2A, 0x34, 0x00, 0x2B,
+ 0x34, 0x00, 0x2D, 0x34, 0x00, 0x3C, 0x34, 0x00, 0x3E, 0x34, 0x00, 0x3D,
+ 0x34, 0x00, 0x5C, 0x34, 0x00, 0x24, 0x34, 0x00, 0x25, 0x34, 0x00, 0x40,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4B, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4B,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4C, 0x98, 0x00, 0x20, 0x00, 0x06, 0x4D,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4E, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4E,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x4F, 0x90, 0x06, 0x40, 0x00, 0x06, 0x4F,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x50, 0x90, 0x06, 0x40, 0x00, 0x06, 0x50,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x51, 0x90, 0x06, 0x40, 0x00, 0x06, 0x51,
+ 0x98, 0x00, 0x20, 0x00, 0x06, 0x52, 0x90, 0x06, 0x40, 0x00, 0x06, 0x52,
+ 0x18, 0x06, 0x21, 0x18, 0x06, 0x22, 0x14, 0x06, 0x22, 0x18, 0x06, 0x23,
+ 0x14, 0x06, 0x23, 0x18, 0x06, 0x24, 0x14, 0x06, 0x24, 0x18, 0x06, 0x25,
+ 0x14, 0x06, 0x25, 0x18, 0x06, 0x26, 0x14, 0x06, 0x26, 0x0C, 0x06, 0x26,
+ 0x10, 0x06, 0x26, 0x18, 0x06, 0x27, 0x14, 0x06, 0x27, 0x18, 0x06, 0x28,
+ 0x14, 0x06, 0x28, 0x0C, 0x06, 0x28, 0x10, 0x06, 0x28, 0x18, 0x06, 0x29,
+ 0x14, 0x06, 0x29, 0x18, 0x06, 0x2A, 0x14, 0x06, 0x2A, 0x0C, 0x06, 0x2A,
+ 0x10, 0x06, 0x2A, 0x18, 0x06, 0x2B, 0x14, 0x06, 0x2B, 0x0C, 0x06, 0x2B,
+ 0x10, 0x06, 0x2B, 0x18, 0x06, 0x2C, 0x14, 0x06, 0x2C, 0x0C, 0x06, 0x2C,
+ 0x10, 0x06, 0x2C, 0x18, 0x06, 0x2D, 0x14, 0x06, 0x2D, 0x0C, 0x06, 0x2D,
+ 0x10, 0x06, 0x2D, 0x18, 0x06, 0x2E, 0x14, 0x06, 0x2E, 0x0C, 0x06, 0x2E,
+ 0x10, 0x06, 0x2E, 0x18, 0x06, 0x2F, 0x14, 0x06, 0x2F, 0x18, 0x06, 0x30,
+ 0x14, 0x06, 0x30, 0x18, 0x06, 0x31, 0x14, 0x06, 0x31, 0x18, 0x06, 0x32,
+ 0x14, 0x06, 0x32, 0x18, 0x06, 0x33, 0x14, 0x06, 0x33, 0x0C, 0x06, 0x33,
+ 0x10, 0x06, 0x33, 0x18, 0x06, 0x34, 0x14, 0x06, 0x34, 0x0C, 0x06, 0x34,
+ 0x10, 0x06, 0x34, 0x18, 0x06, 0x35, 0x14, 0x06, 0x35, 0x0C, 0x06, 0x35,
+ 0x10, 0x06, 0x35, 0x18, 0x06, 0x36, 0x14, 0x06, 0x36, 0x0C, 0x06, 0x36,
+ 0x10, 0x06, 0x36, 0x18, 0x06, 0x37, 0x14, 0x06, 0x37, 0x0C, 0x06, 0x37,
+ 0x10, 0x06, 0x37, 0x18, 0x06, 0x38, 0x14, 0x06, 0x38, 0x0C, 0x06, 0x38,
+ 0x10, 0x06, 0x38, 0x18, 0x06, 0x39, 0x14, 0x06, 0x39, 0x0C, 0x06, 0x39,
+ 0x10, 0x06, 0x39, 0x18, 0x06, 0x3A, 0x14, 0x06, 0x3A, 0x0C, 0x06, 0x3A,
+ 0x10, 0x06, 0x3A, 0x18, 0x06, 0x41, 0x14, 0x06, 0x41, 0x0C, 0x06, 0x41,
+ 0x10, 0x06, 0x41, 0x18, 0x06, 0x42, 0x14, 0x06, 0x42, 0x0C, 0x06, 0x42,
+ 0x10, 0x06, 0x42, 0x18, 0x06, 0x43, 0x14, 0x06, 0x43, 0x0C, 0x06, 0x43,
+ 0x10, 0x06, 0x43, 0x18, 0x06, 0x44, 0x14, 0x06, 0x44, 0x0C, 0x06, 0x44,
+ 0x10, 0x06, 0x44, 0x18, 0x06, 0x45, 0x14, 0x06, 0x45, 0x0C, 0x06, 0x45,
+ 0x10, 0x06, 0x45, 0x18, 0x06, 0x46, 0x14, 0x06, 0x46, 0x0C, 0x06, 0x46,
+ 0x10, 0x06, 0x46, 0x18, 0x06, 0x47, 0x14, 0x06, 0x47, 0x0C, 0x06, 0x47,
+ 0x10, 0x06, 0x47, 0x18, 0x06, 0x48, 0x14, 0x06, 0x48, 0x18, 0x06, 0x49,
+ 0x14, 0x06, 0x49, 0x18, 0x06, 0x4A, 0x14, 0x06, 0x4A, 0x0C, 0x06, 0x4A,
+ 0x10, 0x06, 0x4A, 0x98, 0x06, 0x44, 0x00, 0x06, 0x22, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x22, 0x98, 0x06, 0x44, 0x00, 0x06, 0x23, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x23, 0x98, 0x06, 0x44, 0x00, 0x06, 0x25, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x25, 0x98, 0x06, 0x44, 0x00, 0x06, 0x27, 0x94, 0x06, 0x44,
+ 0x00, 0x06, 0x27, 0x2C, 0x00, 0x21, 0x2C, 0x00, 0x22, 0x2C, 0x00, 0x23,
+ 0x2C, 0x00, 0x24, 0x2C, 0x00, 0x25, 0x2C, 0x00, 0x26, 0x2C, 0x00, 0x27,
+ 0x2C, 0x00, 0x28, 0x2C, 0x00, 0x29, 0x2C, 0x00, 0x2A, 0x2C, 0x00, 0x2B,
+ 0x2C, 0x00, 0x2C, 0x2C, 0x00, 0x2D, 0x2C, 0x00, 0x2E, 0x2C, 0x00, 0x2F,
+ 0x2C, 0x00, 0x30, 0x2C, 0x00, 0x31, 0x2C, 0x00, 0x32, 0x2C, 0x00, 0x33,
+ 0x2C, 0x00, 0x34, 0x2C, 0x00, 0x35, 0x2C, 0x00, 0x36, 0x2C, 0x00, 0x37,
+ 0x2C, 0x00, 0x38, 0x2C, 0x00, 0x39, 0x2C, 0x00, 0x3A, 0x2C, 0x00, 0x3B,
+ 0x2C, 0x00, 0x3C, 0x2C, 0x00, 0x3D, 0x2C, 0x00, 0x3E, 0x2C, 0x00, 0x3F,
+ 0x2C, 0x00, 0x40, 0x2C, 0x00, 0x41, 0x2C, 0x00, 0x42, 0x2C, 0x00, 0x43,
+ 0x2C, 0x00, 0x44, 0x2C, 0x00, 0x45, 0x2C, 0x00, 0x46, 0x2C, 0x00, 0x47,
+ 0x2C, 0x00, 0x48, 0x2C, 0x00, 0x49, 0x2C, 0x00, 0x4A, 0x2C, 0x00, 0x4B,
+ 0x2C, 0x00, 0x4C, 0x2C, 0x00, 0x4D, 0x2C, 0x00, 0x4E, 0x2C, 0x00, 0x4F,
+ 0x2C, 0x00, 0x50, 0x2C, 0x00, 0x51, 0x2C, 0x00, 0x52, 0x2C, 0x00, 0x53,
+ 0x2C, 0x00, 0x54, 0x2C, 0x00, 0x55, 0x2C, 0x00, 0x56, 0x2C, 0x00, 0x57,
+ 0x2C, 0x00, 0x58, 0x2C, 0x00, 0x59, 0x2C, 0x00, 0x5A, 0x2C, 0x00, 0x5B,
+ 0x2C, 0x00, 0x5C, 0x2C, 0x00, 0x5D, 0x2C, 0x00, 0x5E, 0x2C, 0x00, 0x5F,
+ 0x2C, 0x00, 0x60, 0x2C, 0x00, 0x61, 0x2C, 0x00, 0x62, 0x2C, 0x00, 0x63,
+ 0x2C, 0x00, 0x64, 0x2C, 0x00, 0x65, 0x2C, 0x00, 0x66, 0x2C, 0x00, 0x67,
+ 0x2C, 0x00, 0x68, 0x2C, 0x00, 0x69, 0x2C, 0x00, 0x6A, 0x2C, 0x00, 0x6B,
+ 0x2C, 0x00, 0x6C, 0x2C, 0x00, 0x6D, 0x2C, 0x00, 0x6E, 0x2C, 0x00, 0x6F,
+ 0x2C, 0x00, 0x70, 0x2C, 0x00, 0x71, 0x2C, 0x00, 0x72, 0x2C, 0x00, 0x73,
+ 0x2C, 0x00, 0x74, 0x2C, 0x00, 0x75, 0x2C, 0x00, 0x76, 0x2C, 0x00, 0x77,
+ 0x2C, 0x00, 0x78, 0x2C, 0x00, 0x79, 0x2C, 0x00, 0x7A, 0x2C, 0x00, 0x7B,
+ 0x2C, 0x00, 0x7C, 0x2C, 0x00, 0x7D, 0x2C, 0x00, 0x7E, 0x2C, 0x29, 0x85,
+ 0x2C, 0x29, 0x86, 0x30, 0x30, 0x02, 0x30, 0x30, 0x0C, 0x30, 0x30, 0x0D,
+ 0x30, 0x30, 0x01, 0x30, 0x30, 0xFB, 0x30, 0x30, 0xF2, 0x30, 0x30, 0xA1,
+ 0x30, 0x30, 0xA3, 0x30, 0x30, 0xA5, 0x30, 0x30, 0xA7, 0x30, 0x30, 0xA9,
+ 0x30, 0x30, 0xE3, 0x30, 0x30, 0xE5, 0x30, 0x30, 0xE7, 0x30, 0x30, 0xC3,
+ 0x30, 0x30, 0xFC, 0x30, 0x30, 0xA2, 0x30, 0x30, 0xA4, 0x30, 0x30, 0xA6,
+ 0x30, 0x30, 0xA8, 0x30, 0x30, 0xAA, 0x30, 0x30, 0xAB, 0x30, 0x30, 0xAD,
+ 0x30, 0x30, 0xAF, 0x30, 0x30, 0xB1, 0x30, 0x30, 0xB3, 0x30, 0x30, 0xB5,
+ 0x30, 0x30, 0xB7, 0x30, 0x30, 0xB9, 0x30, 0x30, 0xBB, 0x30, 0x30, 0xBD,
+ 0x30, 0x30, 0xBF, 0x30, 0x30, 0xC1, 0x30, 0x30, 0xC4, 0x30, 0x30, 0xC6,
+ 0x30, 0x30, 0xC8, 0x30, 0x30, 0xCA, 0x30, 0x30, 0xCB, 0x30, 0x30, 0xCC,
+ 0x30, 0x30, 0xCD, 0x30, 0x30, 0xCE, 0x30, 0x30, 0xCF, 0x30, 0x30, 0xD2,
+ 0x30, 0x30, 0xD5, 0x30, 0x30, 0xD8, 0x30, 0x30, 0xDB, 0x30, 0x30, 0xDE,
+ 0x30, 0x30, 0xDF, 0x30, 0x30, 0xE0, 0x30, 0x30, 0xE1, 0x30, 0x30, 0xE2,
+ 0x30, 0x30, 0xE4, 0x30, 0x30, 0xE6, 0x30, 0x30, 0xE8, 0x30, 0x30, 0xE9,
+ 0x30, 0x30, 0xEA, 0x30, 0x30, 0xEB, 0x30, 0x30, 0xEC, 0x30, 0x30, 0xED,
+ 0x30, 0x30, 0xEF, 0x30, 0x30, 0xF3, 0x30, 0x30, 0x99, 0x30, 0x30, 0x9A,
+ 0x30, 0x31, 0x64, 0x30, 0x31, 0x31, 0x30, 0x31, 0x32, 0x30, 0x31, 0x33,
+ 0x30, 0x31, 0x34, 0x30, 0x31, 0x35, 0x30, 0x31, 0x36, 0x30, 0x31, 0x37,
+ 0x30, 0x31, 0x38, 0x30, 0x31, 0x39, 0x30, 0x31, 0x3A, 0x30, 0x31, 0x3B,
+ 0x30, 0x31, 0x3C, 0x30, 0x31, 0x3D, 0x30, 0x31, 0x3E, 0x30, 0x31, 0x3F,
+ 0x30, 0x31, 0x40, 0x30, 0x31, 0x41, 0x30, 0x31, 0x42, 0x30, 0x31, 0x43,
+ 0x30, 0x31, 0x44, 0x30, 0x31, 0x45, 0x30, 0x31, 0x46, 0x30, 0x31, 0x47,
+ 0x30, 0x31, 0x48, 0x30, 0x31, 0x49, 0x30, 0x31, 0x4A, 0x30, 0x31, 0x4B,
+ 0x30, 0x31, 0x4C, 0x30, 0x31, 0x4D, 0x30, 0x31, 0x4E, 0x30, 0x31, 0x4F,
+ 0x30, 0x31, 0x50, 0x30, 0x31, 0x51, 0x30, 0x31, 0x52, 0x30, 0x31, 0x53,
+ 0x30, 0x31, 0x54, 0x30, 0x31, 0x55, 0x30, 0x31, 0x56, 0x30, 0x31, 0x57,
+ 0x30, 0x31, 0x58, 0x30, 0x31, 0x59, 0x30, 0x31, 0x5A, 0x30, 0x31, 0x5B,
+ 0x30, 0x31, 0x5C, 0x30, 0x31, 0x5D, 0x30, 0x31, 0x5E, 0x30, 0x31, 0x5F,
+ 0x30, 0x31, 0x60, 0x30, 0x31, 0x61, 0x30, 0x31, 0x62, 0x30, 0x31, 0x63,
+ 0x2C, 0x00, 0xA2, 0x2C, 0x00, 0xA3, 0x2C, 0x00, 0xAC, 0x2C, 0x00, 0xAF,
+ 0x2C, 0x00, 0xA6, 0x2C, 0x00, 0xA5, 0x2C, 0x20, 0xA9, 0x30, 0x25, 0x02,
+ 0x30, 0x21, 0x90, 0x30, 0x21, 0x91, 0x30, 0x21, 0x92, 0x30, 0x21, 0x93,
+ 0x30, 0x25, 0xA0, 0x30, 0x25, 0xCB, 0x81, 0x10, 0x99, 0x01, 0x10, 0xBA,
+ 0x81, 0x10, 0x9B, 0x01, 0x10, 0xBA, 0x81, 0x10, 0xA5, 0x01, 0x10, 0xBA,
+ 0x81, 0xD1, 0x57, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0x58, 0x01, 0xD1, 0x65,
+ 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x6F,
+ 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x70, 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x71,
+ 0x81, 0xD1, 0x5F, 0x01, 0xD1, 0x72, 0x81, 0xD1, 0xB9, 0x01, 0xD1, 0x65,
+ 0x81, 0xD1, 0xBA, 0x01, 0xD1, 0x65, 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6E,
+ 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6E, 0x81, 0xD1, 0xBB, 0x01, 0xD1, 0x6F,
+ 0x81, 0xD1, 0xBC, 0x01, 0xD1, 0x6F, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x69,
+ 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D,
+ 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71,
+ 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75,
+ 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79,
+ 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x43,
+ 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47,
+ 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B,
+ 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F,
+ 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53,
+ 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57,
+ 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61,
+ 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65,
+ 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69,
+ 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D,
+ 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71,
+ 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75,
+ 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79,
+ 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x43, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x53,
+ 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56, 0x04, 0x00, 0x57,
+ 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A, 0x04, 0x00, 0x61,
+ 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x66,
+ 0x04, 0x00, 0x68, 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B,
+ 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47,
+ 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D,
+ 0x04, 0x00, 0x4E, 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x61,
+ 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64, 0x04, 0x00, 0x65,
+ 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68, 0x04, 0x00, 0x69,
+ 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x6D,
+ 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70, 0x04, 0x00, 0x71,
+ 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74, 0x04, 0x00, 0x75,
+ 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78, 0x04, 0x00, 0x79,
+ 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42, 0x04, 0x00, 0x44,
+ 0x04, 0x00, 0x45, 0x04, 0x00, 0x46, 0x04, 0x00, 0x47, 0x04, 0x00, 0x49,
+ 0x04, 0x00, 0x4A, 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55,
+ 0x04, 0x00, 0x56, 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x00, 0x41, 0x04, 0x00, 0x42,
+ 0x04, 0x00, 0x43, 0x04, 0x00, 0x44, 0x04, 0x00, 0x45, 0x04, 0x00, 0x46,
+ 0x04, 0x00, 0x47, 0x04, 0x00, 0x48, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A,
+ 0x04, 0x00, 0x4B, 0x04, 0x00, 0x4C, 0x04, 0x00, 0x4D, 0x04, 0x00, 0x4E,
+ 0x04, 0x00, 0x4F, 0x04, 0x00, 0x50, 0x04, 0x00, 0x51, 0x04, 0x00, 0x52,
+ 0x04, 0x00, 0x53, 0x04, 0x00, 0x54, 0x04, 0x00, 0x55, 0x04, 0x00, 0x56,
+ 0x04, 0x00, 0x57, 0x04, 0x00, 0x58, 0x04, 0x00, 0x59, 0x04, 0x00, 0x5A,
+ 0x04, 0x00, 0x61, 0x04, 0x00, 0x62, 0x04, 0x00, 0x63, 0x04, 0x00, 0x64,
+ 0x04, 0x00, 0x65, 0x04, 0x00, 0x66, 0x04, 0x00, 0x67, 0x04, 0x00, 0x68,
+ 0x04, 0x00, 0x69, 0x04, 0x00, 0x6A, 0x04, 0x00, 0x6B, 0x04, 0x00, 0x6C,
+ 0x04, 0x00, 0x6D, 0x04, 0x00, 0x6E, 0x04, 0x00, 0x6F, 0x04, 0x00, 0x70,
+ 0x04, 0x00, 0x71, 0x04, 0x00, 0x72, 0x04, 0x00, 0x73, 0x04, 0x00, 0x74,
+ 0x04, 0x00, 0x75, 0x04, 0x00, 0x76, 0x04, 0x00, 0x77, 0x04, 0x00, 0x78,
+ 0x04, 0x00, 0x79, 0x04, 0x00, 0x7A, 0x04, 0x01, 0x31, 0x04, 0x02, 0x37,
+ 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94,
+ 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98,
+ 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C,
+ 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0,
+ 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4,
+ 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8,
+ 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2,
+ 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6,
+ 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA,
+ 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE,
+ 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2,
+ 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6,
+ 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02,
+ 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5,
+ 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92,
+ 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96,
+ 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A,
+ 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E,
+ 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4,
+ 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6,
+ 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07,
+ 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4,
+ 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8,
+ 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC,
+ 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0,
+ 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4,
+ 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8,
+ 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1,
+ 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6,
+ 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94,
+ 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98,
+ 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C,
+ 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0,
+ 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4,
+ 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8,
+ 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2,
+ 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6,
+ 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA,
+ 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE,
+ 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2,
+ 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6,
+ 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02,
+ 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5,
+ 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0x91, 0x04, 0x03, 0x92,
+ 0x04, 0x03, 0x93, 0x04, 0x03, 0x94, 0x04, 0x03, 0x95, 0x04, 0x03, 0x96,
+ 0x04, 0x03, 0x97, 0x04, 0x03, 0x98, 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A,
+ 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C, 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E,
+ 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0, 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4,
+ 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4, 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6,
+ 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8, 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07,
+ 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2, 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4,
+ 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6, 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8,
+ 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA, 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC,
+ 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE, 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0,
+ 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2, 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4,
+ 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6, 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8,
+ 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02, 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1,
+ 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5, 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6,
+ 0x04, 0x03, 0x91, 0x04, 0x03, 0x92, 0x04, 0x03, 0x93, 0x04, 0x03, 0x94,
+ 0x04, 0x03, 0x95, 0x04, 0x03, 0x96, 0x04, 0x03, 0x97, 0x04, 0x03, 0x98,
+ 0x04, 0x03, 0x99, 0x04, 0x03, 0x9A, 0x04, 0x03, 0x9B, 0x04, 0x03, 0x9C,
+ 0x04, 0x03, 0x9D, 0x04, 0x03, 0x9E, 0x04, 0x03, 0x9F, 0x04, 0x03, 0xA0,
+ 0x04, 0x03, 0xA1, 0x04, 0x03, 0xF4, 0x04, 0x03, 0xA3, 0x04, 0x03, 0xA4,
+ 0x04, 0x03, 0xA5, 0x04, 0x03, 0xA6, 0x04, 0x03, 0xA7, 0x04, 0x03, 0xA8,
+ 0x04, 0x03, 0xA9, 0x04, 0x22, 0x07, 0x04, 0x03, 0xB1, 0x04, 0x03, 0xB2,
+ 0x04, 0x03, 0xB3, 0x04, 0x03, 0xB4, 0x04, 0x03, 0xB5, 0x04, 0x03, 0xB6,
+ 0x04, 0x03, 0xB7, 0x04, 0x03, 0xB8, 0x04, 0x03, 0xB9, 0x04, 0x03, 0xBA,
+ 0x04, 0x03, 0xBB, 0x04, 0x03, 0xBC, 0x04, 0x03, 0xBD, 0x04, 0x03, 0xBE,
+ 0x04, 0x03, 0xBF, 0x04, 0x03, 0xC0, 0x04, 0x03, 0xC1, 0x04, 0x03, 0xC2,
+ 0x04, 0x03, 0xC3, 0x04, 0x03, 0xC4, 0x04, 0x03, 0xC5, 0x04, 0x03, 0xC6,
+ 0x04, 0x03, 0xC7, 0x04, 0x03, 0xC8, 0x04, 0x03, 0xC9, 0x04, 0x22, 0x02,
+ 0x04, 0x03, 0xF5, 0x04, 0x03, 0xD1, 0x04, 0x03, 0xF0, 0x04, 0x03, 0xD5,
+ 0x04, 0x03, 0xF1, 0x04, 0x03, 0xD6, 0x04, 0x03, 0xDC, 0x04, 0x03, 0xDD,
+ 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33,
+ 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37,
+ 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31,
+ 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35,
+ 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39,
+ 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33,
+ 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37,
+ 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0x04, 0x00, 0x30, 0x04, 0x00, 0x31,
+ 0x04, 0x00, 0x32, 0x04, 0x00, 0x33, 0x04, 0x00, 0x34, 0x04, 0x00, 0x35,
+ 0x04, 0x00, 0x36, 0x04, 0x00, 0x37, 0x04, 0x00, 0x38, 0x04, 0x00, 0x39,
+ 0x04, 0x00, 0x30, 0x04, 0x00, 0x31, 0x04, 0x00, 0x32, 0x04, 0x00, 0x33,
+ 0x04, 0x00, 0x34, 0x04, 0x00, 0x35, 0x04, 0x00, 0x36, 0x04, 0x00, 0x37,
+ 0x04, 0x00, 0x38, 0x04, 0x00, 0x39, 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2E,
+ 0xC0, 0x00, 0x30, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x31, 0x00, 0x00, 0x2C,
+ 0xC0, 0x00, 0x32, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x33, 0x00, 0x00, 0x2C,
+ 0xC0, 0x00, 0x34, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x35, 0x00, 0x00, 0x2C,
+ 0xC0, 0x00, 0x36, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x37, 0x00, 0x00, 0x2C,
+ 0xC0, 0x00, 0x38, 0x00, 0x00, 0x2C, 0xC0, 0x00, 0x39, 0x00, 0x00, 0x2C,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x41, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x42, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x43,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x44, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x45, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x46, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x47,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x48, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x49, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x4A, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4B,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4C, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4D, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x4E, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x4F,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x50, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x51, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x52, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x53,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x54, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x55, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x56, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x57,
+ 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28, 0x80, 0x00, 0x58, 0x00, 0x00, 0x29,
+ 0xC0, 0x00, 0x28, 0x80, 0x00, 0x59, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x28,
+ 0x80, 0x00, 0x5A, 0x00, 0x00, 0x29, 0xC0, 0x30, 0x14, 0x80, 0x00, 0x53,
+ 0x00, 0x30, 0x15, 0x1C, 0x00, 0x43, 0x1C, 0x00, 0x52, 0x9C, 0x00, 0x43,
+ 0x00, 0x00, 0x44, 0x9C, 0x00, 0x57, 0x00, 0x00, 0x5A, 0x38, 0x00, 0x41,
+ 0x38, 0x00, 0x42, 0x38, 0x00, 0x43, 0x38, 0x00, 0x44, 0x38, 0x00, 0x45,
+ 0x38, 0x00, 0x46, 0x38, 0x00, 0x47, 0x38, 0x00, 0x48, 0x38, 0x00, 0x49,
+ 0x38, 0x00, 0x4A, 0x38, 0x00, 0x4B, 0x38, 0x00, 0x4C, 0x38, 0x00, 0x4D,
+ 0x38, 0x00, 0x4E, 0x38, 0x00, 0x4F, 0x38, 0x00, 0x50, 0x38, 0x00, 0x51,
+ 0x38, 0x00, 0x52, 0x38, 0x00, 0x53, 0x38, 0x00, 0x54, 0x38, 0x00, 0x55,
+ 0x38, 0x00, 0x56, 0x38, 0x00, 0x57, 0x38, 0x00, 0x58, 0x38, 0x00, 0x59,
+ 0x38, 0x00, 0x5A, 0xB8, 0x00, 0x48, 0x00, 0x00, 0x56, 0xB8, 0x00, 0x4D,
+ 0x00, 0x00, 0x56, 0xB8, 0x00, 0x53, 0x00, 0x00, 0x44, 0xB8, 0x00, 0x53,
+ 0x00, 0x00, 0x53, 0xB8, 0x00, 0x50, 0x80, 0x00, 0x50, 0x00, 0x00, 0x56,
+ 0xB8, 0x00, 0x57, 0x00, 0x00, 0x43, 0xB8, 0x00, 0x44, 0x00, 0x00, 0x4A,
+ 0xB8, 0x30, 0x7B, 0x00, 0x30, 0x4B, 0xB8, 0x30, 0xB3, 0x00, 0x30, 0xB3,
+ 0x38, 0x30, 0xB5, 0x38, 0x62, 0x4B, 0x38, 0x5B, 0x57, 0x38, 0x53, 0xCC,
+ 0x38, 0x30, 0xC7, 0x38, 0x4E, 0x8C, 0x38, 0x59, 0x1A, 0x38, 0x89, 0xE3,
+ 0x38, 0x59, 0x29, 0x38, 0x4E, 0xA4, 0x38, 0x66, 0x20, 0x38, 0x71, 0x21,
+ 0x38, 0x65, 0x99, 0x38, 0x52, 0x4D, 0x38, 0x5F, 0x8C, 0x38, 0x51, 0x8D,
+ 0x38, 0x65, 0xB0, 0x38, 0x52, 0x1D, 0x38, 0x7D, 0x42, 0x38, 0x75, 0x1F,
+ 0x38, 0x8C, 0xA9, 0x38, 0x58, 0xF0, 0x38, 0x54, 0x39, 0x38, 0x6F, 0x14,
+ 0x38, 0x62, 0x95, 0x38, 0x63, 0x55, 0x38, 0x4E, 0x00, 0x38, 0x4E, 0x09,
+ 0x38, 0x90, 0x4A, 0x38, 0x5D, 0xE6, 0x38, 0x4E, 0x2D, 0x38, 0x53, 0xF3,
+ 0x38, 0x63, 0x07, 0x38, 0x8D, 0x70, 0x38, 0x62, 0x53, 0x38, 0x79, 0x81,
+ 0x38, 0x7A, 0x7A, 0x38, 0x54, 0x08, 0x38, 0x6E, 0x80, 0x38, 0x67, 0x09,
+ 0x38, 0x67, 0x08, 0x38, 0x75, 0x33, 0x38, 0x52, 0x72, 0x38, 0x55, 0xB6,
+ 0xC0, 0x30, 0x14, 0x80, 0x67, 0x2C, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14,
+ 0x80, 0x4E, 0x09, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x4E, 0x8C,
+ 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x5B, 0x89, 0x00, 0x30, 0x15,
+ 0xC0, 0x30, 0x14, 0x80, 0x70, 0xB9, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14,
+ 0x80, 0x62, 0x53, 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x76, 0xD7,
+ 0x00, 0x30, 0x15, 0xC0, 0x30, 0x14, 0x80, 0x52, 0xDD, 0x00, 0x30, 0x15,
+ 0xC0, 0x30, 0x14, 0x80, 0x65, 0x57, 0x00, 0x30, 0x15, 0x1C, 0x5F, 0x97,
+ 0x1C, 0x53, 0xEF, 0x00, 0x4E, 0x3D, 0x00, 0x4E, 0x38, 0x00, 0x4E, 0x41,
+ 0x02, 0x01, 0x22, 0x00, 0x4F, 0x60, 0x00, 0x4F, 0xAE, 0x00, 0x4F, 0xBB,
+ 0x00, 0x50, 0x02, 0x00, 0x50, 0x7A, 0x00, 0x50, 0x99, 0x00, 0x50, 0xE7,
+ 0x00, 0x50, 0xCF, 0x00, 0x34, 0x9E, 0x02, 0x06, 0x3A, 0x00, 0x51, 0x4D,
+ 0x00, 0x51, 0x54, 0x00, 0x51, 0x64, 0x00, 0x51, 0x77, 0x02, 0x05, 0x1C,
+ 0x00, 0x34, 0xB9, 0x00, 0x51, 0x67, 0x00, 0x51, 0x8D, 0x02, 0x05, 0x4B,
+ 0x00, 0x51, 0x97, 0x00, 0x51, 0xA4, 0x00, 0x4E, 0xCC, 0x00, 0x51, 0xAC,
+ 0x00, 0x51, 0xB5, 0x02, 0x91, 0xDF, 0x00, 0x51, 0xF5, 0x00, 0x52, 0x03,
+ 0x00, 0x34, 0xDF, 0x00, 0x52, 0x3B, 0x00, 0x52, 0x46, 0x00, 0x52, 0x72,
+ 0x00, 0x52, 0x77, 0x00, 0x35, 0x15, 0x00, 0x52, 0xC7, 0x00, 0x52, 0xC9,
+ 0x00, 0x52, 0xE4, 0x00, 0x52, 0xFA, 0x00, 0x53, 0x05, 0x00, 0x53, 0x06,
+ 0x00, 0x53, 0x17, 0x00, 0x53, 0x49, 0x00, 0x53, 0x51, 0x00, 0x53, 0x5A,
+ 0x00, 0x53, 0x73, 0x00, 0x53, 0x7D, 0x00, 0x53, 0x7F, 0x00, 0x53, 0x7F,
+ 0x00, 0x53, 0x7F, 0x02, 0x0A, 0x2C, 0x00, 0x70, 0x70, 0x00, 0x53, 0xCA,
+ 0x00, 0x53, 0xDF, 0x02, 0x0B, 0x63, 0x00, 0x53, 0xEB, 0x00, 0x53, 0xF1,
+ 0x00, 0x54, 0x06, 0x00, 0x54, 0x9E, 0x00, 0x54, 0x38, 0x00, 0x54, 0x48,
+ 0x00, 0x54, 0x68, 0x00, 0x54, 0xA2, 0x00, 0x54, 0xF6, 0x00, 0x55, 0x10,
+ 0x00, 0x55, 0x53, 0x00, 0x55, 0x63, 0x00, 0x55, 0x84, 0x00, 0x55, 0x84,
+ 0x00, 0x55, 0x99, 0x00, 0x55, 0xAB, 0x00, 0x55, 0xB3, 0x00, 0x55, 0xC2,
+ 0x00, 0x57, 0x16, 0x00, 0x56, 0x06, 0x00, 0x57, 0x17, 0x00, 0x56, 0x51,
+ 0x00, 0x56, 0x74, 0x00, 0x52, 0x07, 0x00, 0x58, 0xEE, 0x00, 0x57, 0xCE,
+ 0x00, 0x57, 0xF4, 0x00, 0x58, 0x0D, 0x00, 0x57, 0x8B, 0x00, 0x58, 0x32,
+ 0x00, 0x58, 0x31, 0x00, 0x58, 0xAC, 0x02, 0x14, 0xE4, 0x00, 0x58, 0xF2,
+ 0x00, 0x58, 0xF7, 0x00, 0x59, 0x06, 0x00, 0x59, 0x1A, 0x00, 0x59, 0x22,
+ 0x00, 0x59, 0x62, 0x02, 0x16, 0xA8, 0x02, 0x16, 0xEA, 0x00, 0x59, 0xEC,
+ 0x00, 0x5A, 0x1B, 0x00, 0x5A, 0x27, 0x00, 0x59, 0xD8, 0x00, 0x5A, 0x66,
+ 0x00, 0x36, 0xEE, 0x00, 0x36, 0xFC, 0x00, 0x5B, 0x08, 0x00, 0x5B, 0x3E,
+ 0x00, 0x5B, 0x3E, 0x02, 0x19, 0xC8, 0x00, 0x5B, 0xC3, 0x00, 0x5B, 0xD8,
+ 0x00, 0x5B, 0xE7, 0x00, 0x5B, 0xF3, 0x02, 0x1B, 0x18, 0x00, 0x5B, 0xFF,
+ 0x00, 0x5C, 0x06, 0x00, 0x5F, 0x53, 0x00, 0x5C, 0x22, 0x00, 0x37, 0x81,
+ 0x00, 0x5C, 0x60, 0x00, 0x5C, 0x6E, 0x00, 0x5C, 0xC0, 0x00, 0x5C, 0x8D,
+ 0x02, 0x1D, 0xE4, 0x00, 0x5D, 0x43, 0x02, 0x1D, 0xE6, 0x00, 0x5D, 0x6E,
+ 0x00, 0x5D, 0x6B, 0x00, 0x5D, 0x7C, 0x00, 0x5D, 0xE1, 0x00, 0x5D, 0xE2,
+ 0x00, 0x38, 0x2F, 0x00, 0x5D, 0xFD, 0x00, 0x5E, 0x28, 0x00, 0x5E, 0x3D,
+ 0x00, 0x5E, 0x69, 0x00, 0x38, 0x62, 0x02, 0x21, 0x83, 0x00, 0x38, 0x7C,
+ 0x00, 0x5E, 0xB0, 0x00, 0x5E, 0xB3, 0x00, 0x5E, 0xB6, 0x00, 0x5E, 0xCA,
+ 0x02, 0xA3, 0x92, 0x00, 0x5E, 0xFE, 0x02, 0x23, 0x31, 0x02, 0x23, 0x31,
+ 0x00, 0x82, 0x01, 0x00, 0x5F, 0x22, 0x00, 0x5F, 0x22, 0x00, 0x38, 0xC7,
+ 0x02, 0x32, 0xB8, 0x02, 0x61, 0xDA, 0x00, 0x5F, 0x62, 0x00, 0x5F, 0x6B,
+ 0x00, 0x38, 0xE3, 0x00, 0x5F, 0x9A, 0x00, 0x5F, 0xCD, 0x00, 0x5F, 0xD7,
+ 0x00, 0x5F, 0xF9, 0x00, 0x60, 0x81, 0x00, 0x39, 0x3A, 0x00, 0x39, 0x1C,
+ 0x00, 0x60, 0x94, 0x02, 0x26, 0xD4, 0x00, 0x60, 0xC7, 0x00, 0x61, 0x48,
+ 0x00, 0x61, 0x4C, 0x00, 0x61, 0x4E, 0x00, 0x61, 0x4C, 0x00, 0x61, 0x7A,
+ 0x00, 0x61, 0x8E, 0x00, 0x61, 0xB2, 0x00, 0x61, 0xA4, 0x00, 0x61, 0xAF,
+ 0x00, 0x61, 0xDE, 0x00, 0x61, 0xF2, 0x00, 0x61, 0xF6, 0x00, 0x62, 0x10,
+ 0x00, 0x62, 0x1B, 0x00, 0x62, 0x5D, 0x00, 0x62, 0xB1, 0x00, 0x62, 0xD4,
+ 0x00, 0x63, 0x50, 0x02, 0x2B, 0x0C, 0x00, 0x63, 0x3D, 0x00, 0x62, 0xFC,
+ 0x00, 0x63, 0x68, 0x00, 0x63, 0x83, 0x00, 0x63, 0xE4, 0x02, 0x2B, 0xF1,
+ 0x00, 0x64, 0x22, 0x00, 0x63, 0xC5, 0x00, 0x63, 0xA9, 0x00, 0x3A, 0x2E,
+ 0x00, 0x64, 0x69, 0x00, 0x64, 0x7E, 0x00, 0x64, 0x9D, 0x00, 0x64, 0x77,
+ 0x00, 0x3A, 0x6C, 0x00, 0x65, 0x4F, 0x00, 0x65, 0x6C, 0x02, 0x30, 0x0A,
+ 0x00, 0x65, 0xE3, 0x00, 0x66, 0xF8, 0x00, 0x66, 0x49, 0x00, 0x3B, 0x19,
+ 0x00, 0x66, 0x91, 0x00, 0x3B, 0x08, 0x00, 0x3A, 0xE4, 0x00, 0x51, 0x92,
+ 0x00, 0x51, 0x95, 0x00, 0x67, 0x00, 0x00, 0x66, 0x9C, 0x00, 0x80, 0xAD,
+ 0x00, 0x43, 0xD9, 0x00, 0x67, 0x17, 0x00, 0x67, 0x1B, 0x00, 0x67, 0x21,
+ 0x00, 0x67, 0x5E, 0x00, 0x67, 0x53, 0x02, 0x33, 0xC3, 0x00, 0x3B, 0x49,
+ 0x00, 0x67, 0xFA, 0x00, 0x67, 0x85, 0x00, 0x68, 0x52, 0x00, 0x68, 0x85,
+ 0x02, 0x34, 0x6D, 0x00, 0x68, 0x8E, 0x00, 0x68, 0x1F, 0x00, 0x69, 0x14,
+ 0x00, 0x3B, 0x9D, 0x00, 0x69, 0x42, 0x00, 0x69, 0xA3, 0x00, 0x69, 0xEA,
+ 0x00, 0x6A, 0xA8, 0x02, 0x36, 0xA3, 0x00, 0x6A, 0xDB, 0x00, 0x3C, 0x18,
+ 0x00, 0x6B, 0x21, 0x02, 0x38, 0xA7, 0x00, 0x6B, 0x54, 0x00, 0x3C, 0x4E,
+ 0x00, 0x6B, 0x72, 0x00, 0x6B, 0x9F, 0x00, 0x6B, 0xBA, 0x00, 0x6B, 0xBB,
+ 0x02, 0x3A, 0x8D, 0x02, 0x1D, 0x0B, 0x02, 0x3A, 0xFA, 0x00, 0x6C, 0x4E,
+ 0x02, 0x3C, 0xBC, 0x00, 0x6C, 0xBF, 0x00, 0x6C, 0xCD, 0x00, 0x6C, 0x67,
+ 0x00, 0x6D, 0x16, 0x00, 0x6D, 0x3E, 0x00, 0x6D, 0x77, 0x00, 0x6D, 0x41,
+ 0x00, 0x6D, 0x69, 0x00, 0x6D, 0x78, 0x00, 0x6D, 0x85, 0x02, 0x3D, 0x1E,
+ 0x00, 0x6D, 0x34, 0x00, 0x6E, 0x2F, 0x00, 0x6E, 0x6E, 0x00, 0x3D, 0x33,
+ 0x00, 0x6E, 0xCB, 0x00, 0x6E, 0xC7, 0x02, 0x3E, 0xD1, 0x00, 0x6D, 0xF9,
+ 0x00, 0x6F, 0x6E, 0x02, 0x3F, 0x5E, 0x02, 0x3F, 0x8E, 0x00, 0x6F, 0xC6,
+ 0x00, 0x70, 0x39, 0x00, 0x70, 0x1E, 0x00, 0x70, 0x1B, 0x00, 0x3D, 0x96,
+ 0x00, 0x70, 0x4A, 0x00, 0x70, 0x7D, 0x00, 0x70, 0x77, 0x00, 0x70, 0xAD,
+ 0x02, 0x05, 0x25, 0x00, 0x71, 0x45, 0x02, 0x42, 0x63, 0x00, 0x71, 0x9C,
+ 0x02, 0x43, 0xAB, 0x00, 0x72, 0x28, 0x00, 0x72, 0x35, 0x00, 0x72, 0x50,
+ 0x02, 0x46, 0x08, 0x00, 0x72, 0x80, 0x00, 0x72, 0x95, 0x02, 0x47, 0x35,
+ 0x02, 0x48, 0x14, 0x00, 0x73, 0x7A, 0x00, 0x73, 0x8B, 0x00, 0x3E, 0xAC,
+ 0x00, 0x73, 0xA5, 0x00, 0x3E, 0xB8, 0x00, 0x3E, 0xB8, 0x00, 0x74, 0x47,
+ 0x00, 0x74, 0x5C, 0x00, 0x74, 0x71, 0x00, 0x74, 0x85, 0x00, 0x74, 0xCA,
+ 0x00, 0x3F, 0x1B, 0x00, 0x75, 0x24, 0x02, 0x4C, 0x36, 0x00, 0x75, 0x3E,
+ 0x02, 0x4C, 0x92, 0x00, 0x75, 0x70, 0x02, 0x21, 0x9F, 0x00, 0x76, 0x10,
+ 0x02, 0x4F, 0xA1, 0x02, 0x4F, 0xB8, 0x02, 0x50, 0x44, 0x00, 0x3F, 0xFC,
+ 0x00, 0x40, 0x08, 0x00, 0x76, 0xF4, 0x02, 0x50, 0xF3, 0x02, 0x50, 0xF2,
+ 0x02, 0x51, 0x19, 0x02, 0x51, 0x33, 0x00, 0x77, 0x1E, 0x00, 0x77, 0x1F,
+ 0x00, 0x77, 0x1F, 0x00, 0x77, 0x4A, 0x00, 0x40, 0x39, 0x00, 0x77, 0x8B,
+ 0x00, 0x40, 0x46, 0x00, 0x40, 0x96, 0x02, 0x54, 0x1D, 0x00, 0x78, 0x4E,
+ 0x00, 0x78, 0x8C, 0x00, 0x78, 0xCC, 0x00, 0x40, 0xE3, 0x02, 0x56, 0x26,
+ 0x00, 0x79, 0x56, 0x02, 0x56, 0x9A, 0x02, 0x56, 0xC5, 0x00, 0x79, 0x8F,
+ 0x00, 0x79, 0xEB, 0x00, 0x41, 0x2F, 0x00, 0x7A, 0x40, 0x00, 0x7A, 0x4A,
+ 0x00, 0x7A, 0x4F, 0x02, 0x59, 0x7C, 0x02, 0x5A, 0xA7, 0x02, 0x5A, 0xA7,
+ 0x00, 0x7A, 0xEE, 0x00, 0x42, 0x02, 0x02, 0x5B, 0xAB, 0x00, 0x7B, 0xC6,
+ 0x00, 0x7B, 0xC9, 0x00, 0x42, 0x27, 0x02, 0x5C, 0x80, 0x00, 0x7C, 0xD2,
+ 0x00, 0x42, 0xA0, 0x00, 0x7C, 0xE8, 0x00, 0x7C, 0xE3, 0x00, 0x7D, 0x00,
+ 0x02, 0x5F, 0x86, 0x00, 0x7D, 0x63, 0x00, 0x43, 0x01, 0x00, 0x7D, 0xC7,
+ 0x00, 0x7E, 0x02, 0x00, 0x7E, 0x45, 0x00, 0x43, 0x34, 0x02, 0x62, 0x28,
+ 0x02, 0x62, 0x47, 0x00, 0x43, 0x59, 0x02, 0x62, 0xD9, 0x00, 0x7F, 0x7A,
+ 0x02, 0x63, 0x3E, 0x00, 0x7F, 0x95, 0x00, 0x7F, 0xFA, 0x00, 0x80, 0x05,
+ 0x02, 0x64, 0xDA, 0x02, 0x65, 0x23, 0x00, 0x80, 0x60, 0x02, 0x65, 0xA8,
+ 0x00, 0x80, 0x70, 0x02, 0x33, 0x5F, 0x00, 0x43, 0xD5, 0x00, 0x80, 0xB2,
+ 0x00, 0x81, 0x03, 0x00, 0x44, 0x0B, 0x00, 0x81, 0x3E, 0x00, 0x5A, 0xB5,
+ 0x02, 0x67, 0xA7, 0x02, 0x67, 0xB5, 0x02, 0x33, 0x93, 0x02, 0x33, 0x9C,
+ 0x00, 0x82, 0x01, 0x00, 0x82, 0x04, 0x00, 0x8F, 0x9E, 0x00, 0x44, 0x6B,
+ 0x00, 0x82, 0x91, 0x00, 0x82, 0x8B, 0x00, 0x82, 0x9D, 0x00, 0x52, 0xB3,
+ 0x00, 0x82, 0xB1, 0x00, 0x82, 0xB3, 0x00, 0x82, 0xBD, 0x00, 0x82, 0xE6,
+ 0x02, 0x6B, 0x3C, 0x00, 0x82, 0xE5, 0x00, 0x83, 0x1D, 0x00, 0x83, 0x63,
+ 0x00, 0x83, 0xAD, 0x00, 0x83, 0x23, 0x00, 0x83, 0xBD, 0x00, 0x83, 0xE7,
+ 0x00, 0x84, 0x57, 0x00, 0x83, 0x53, 0x00, 0x83, 0xCA, 0x00, 0x83, 0xCC,
+ 0x00, 0x83, 0xDC, 0x02, 0x6C, 0x36, 0x02, 0x6D, 0x6B, 0x02, 0x6C, 0xD5,
+ 0x00, 0x45, 0x2B, 0x00, 0x84, 0xF1, 0x00, 0x84, 0xF3, 0x00, 0x85, 0x16,
+ 0x02, 0x73, 0xCA, 0x00, 0x85, 0x64, 0x02, 0x6F, 0x2C, 0x00, 0x45, 0x5D,
+ 0x00, 0x45, 0x61, 0x02, 0x6F, 0xB1, 0x02, 0x70, 0xD2, 0x00, 0x45, 0x6B,
+ 0x00, 0x86, 0x50, 0x00, 0x86, 0x5C, 0x00, 0x86, 0x67, 0x00, 0x86, 0x69,
+ 0x00, 0x86, 0xA9, 0x00, 0x86, 0x88, 0x00, 0x87, 0x0E, 0x00, 0x86, 0xE2,
+ 0x00, 0x87, 0x79, 0x00, 0x87, 0x28, 0x00, 0x87, 0x6B, 0x00, 0x87, 0x86,
+ 0x00, 0x45, 0xD7, 0x00, 0x87, 0xE1, 0x00, 0x88, 0x01, 0x00, 0x45, 0xF9,
+ 0x00, 0x88, 0x60, 0x00, 0x88, 0x63, 0x02, 0x76, 0x67, 0x00, 0x88, 0xD7,
+ 0x00, 0x88, 0xDE, 0x00, 0x46, 0x35, 0x00, 0x88, 0xFA, 0x00, 0x34, 0xBB,
+ 0x02, 0x78, 0xAE, 0x02, 0x79, 0x66, 0x00, 0x46, 0xBE, 0x00, 0x46, 0xC7,
+ 0x00, 0x8A, 0xA0, 0x00, 0x8A, 0xED, 0x00, 0x8B, 0x8A, 0x00, 0x8C, 0x55,
+ 0x02, 0x7C, 0xA8, 0x00, 0x8C, 0xAB, 0x00, 0x8C, 0xC1, 0x00, 0x8D, 0x1B,
+ 0x00, 0x8D, 0x77, 0x02, 0x7F, 0x2F, 0x02, 0x08, 0x04, 0x00, 0x8D, 0xCB,
+ 0x00, 0x8D, 0xBC, 0x00, 0x8D, 0xF0, 0x02, 0x08, 0xDE, 0x00, 0x8E, 0xD4,
+ 0x00, 0x8F, 0x38, 0x02, 0x85, 0xD2, 0x02, 0x85, 0xED, 0x00, 0x90, 0x94,
+ 0x00, 0x90, 0xF1, 0x00, 0x91, 0x11, 0x02, 0x87, 0x2E, 0x00, 0x91, 0x1B,
+ 0x00, 0x92, 0x38, 0x00, 0x92, 0xD7, 0x00, 0x92, 0xD8, 0x00, 0x92, 0x7C,
+ 0x00, 0x93, 0xF9, 0x00, 0x94, 0x15, 0x02, 0x8B, 0xFA, 0x00, 0x95, 0x8B,
+ 0x00, 0x49, 0x95, 0x00, 0x95, 0xB7, 0x02, 0x8D, 0x77, 0x00, 0x49, 0xE6,
+ 0x00, 0x96, 0xC3, 0x00, 0x5D, 0xB2, 0x00, 0x97, 0x23, 0x02, 0x91, 0x45,
+ 0x02, 0x92, 0x1A, 0x00, 0x4A, 0x6E, 0x00, 0x4A, 0x76, 0x00, 0x97, 0xE0,
+ 0x02, 0x94, 0x0A, 0x00, 0x4A, 0xB2, 0x02, 0x94, 0x96, 0x00, 0x98, 0x0B,
+ 0x00, 0x98, 0x0B, 0x00, 0x98, 0x29, 0x02, 0x95, 0xB6, 0x00, 0x98, 0xE2,
+ 0x00, 0x4B, 0x33, 0x00, 0x99, 0x29, 0x00, 0x99, 0xA7, 0x00, 0x99, 0xC2,
+ 0x00, 0x99, 0xFE, 0x00, 0x4B, 0xCE, 0x02, 0x9B, 0x30, 0x00, 0x9B, 0x12,
+ 0x00, 0x9C, 0x40, 0x00, 0x9C, 0xFD, 0x00, 0x4C, 0xCE, 0x00, 0x4C, 0xED,
+ 0x00, 0x9D, 0x67, 0x02, 0xA0, 0xCE, 0x00, 0x4C, 0xF8, 0x02, 0xA1, 0x05,
+ 0x02, 0xA2, 0x0E, 0x02, 0xA2, 0x91, 0x00, 0x9E, 0xBB, 0x00, 0x4D, 0x56,
+ 0x00, 0x9E, 0xF9, 0x00, 0x9E, 0xFE, 0x00, 0x9F, 0x05, 0x00, 0x9F, 0x0F,
+ 0x00, 0x9F, 0x16, 0x00, 0x9F, 0x3B, 0x02, 0xA6, 0x00
+};
+
+const decomp_index_table_t gl_uninorm_decomp_index_table =
+{
+ {
+ 0, 32, 64, 96, 128, -1, 160, 192,
+ 224, 256, 288, 320, 352, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 384, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 416, 448,
+ -1, -1, -1, -1, 480, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 512, 544, -1, -1,
+ -1, -1, -1, -1, 576, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 608
+ },
+ {
+ -1, -1, -1, -1, -1, 0, 32, 64,
+ 96, 128, 160, 192, -1, 224, 256, 288,
+ 320, 352, -1, -1, -1, 384, 416, 448,
+ -1, -1, 480, 512, 544, 576, 608, 640,
+ 672, 704, 736, 768, -1, -1, 800, 832,
+ -1, -1, -1, -1, 864, -1, -1, -1,
+ -1, 896, -1, 928, -1, -1, 960, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 992, 1024, -1, -1, -1, 1056, -1,
+ -1, 1088, 1120, -1, -1, -1, -1, -1,
+ -1, -1, 1152, -1, 1184, -1, 1216, -1,
+ -1, -1, 1248, -1, -1, -1, 1280, -1,
+ -1, -1, 1312, -1, -1, -1, 1344, -1,
+ -1, 1376, -1, -1, -1, 1408, 1440, -1,
+ 1472, -1, 1504, 1536, 1568, 1600, -1, -1,
+ -1, 1632, -1, -1, -1, -1, -1, 1664,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 1696, 1728, 1760, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1792, 1824, 1856, 1888, 1920, -1, -1,
+ 1952, 1984, 2016, 2048, 2080, 2112, 2144, 2176,
+ 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432,
+ 2464, 2496, 2528, 2560, 2592, 2624, -1, -1,
+ 2656, 2688, 2720, 2752, 2784, 2816, 2848, -1,
+ 2880, 2912, 2944, 2976, 3008, 3040, -1, 3072,
+ -1, 3104, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3136, 3168, 3200, 3232, 3264,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3296, -1, -1, 3328, -1, -1, 3360, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3392, -1, -1, -1, -1,
+ -1, -1, -1, 3424, -1, -1, -1, -1,
+ -1, -1, -1, -1, 3456, -1, -1, 3488,
+ 3520, 3552, 3584, 3616, 3648, 3680, 3712, -1,
+ 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968,
+ -1, 4000, 4032, 4064, 4096, -1, -1, -1,
+ 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352,
+ 4384, 4416, 4448, 4480, 4512, 4544, 4576, 4608,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 4640, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4672, 4704, 4736, 4768, 4800, 4832, 4864, 4896,
+ 4928, 4960, 4992, 5024, 5056, 5088, 5120, -1,
+ 5152, 5184, 5216, 5248, 5280, 5312, 5344, 5376,
+ 5408, 5440, 5472, 5504, 5536, 5568, 5600, 5632,
+ 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888,
+ 5920, 5952, 5984, 6016, 6048, 6080, 6112, 6144,
+ 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400,
+ -1, -1, -1, -1, 6432, 6464, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 6496, 6528, -1, 6560, 6592, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 6624, 6656, 6688, 6720, 6752, 6784, 6816, 6848,
+ 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104,
+ 7136, 7168, 7200, 7232, 7264, 7296, 7328, 7360,
+ 7392, 7424, 7456, 7488, 7520, 7552, 7584, 7616,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7648, 7680, 7712, -1, 7744, -1, -1, -1,
+ 7776, 7808, 7840, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7872, 7904, 7936, 7968, 8000, 8032, 8064, 8096,
+ 8128, 8160, 8192, 8224, 8256, 8288, 8320, 8352,
+ 8384, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 32768, -1, -1, -1, -1, -1, -1, -1,
+ 32769, -1, 32771, -1, -1, -1, -1, 32772,
+ -1, -1, 32774, 32775, 32776, 32778, -1, -1,
+ 32779, 32781, 32782, -1, 32783, 32786, 32789, -1,
+ 24, 26, 28, 30, 32, 34, -1, 36,
+ 38, 40, 42, 44, 46, 48, 50, 52,
+ -1, 54, 56, 58, 60, 62, 64, -1,
+ -1, 66, 68, 70, 72, 74, -1, -1,
+ 76, 78, 80, 82, 84, 86, -1, 88,
+ 90, 92, 94, 96, 98, 100, 102, 104,
+ -1, 106, 108, 110, 112, 114, 116, -1,
+ -1, 118, 120, 122, 124, 126, -1, 128,
+ 130, 132, 134, 136, 138, 140, 142, 144,
+ 146, 148, 150, 152, 154, 156, 158, 160,
+ -1, -1, 162, 164, 166, 168, 170, 172,
+ 174, 176, 178, 180, 182, 184, 186, 188,
+ 190, 192, 194, 196, 198, 200, -1, -1,
+ 202, 204, 206, 208, 210, 212, 214, 216,
+ 218, -1, 32988, 32990, 224, 226, 228, 230,
+ -1, 232, 234, 236, 238, 240, 242, 33012,
+ 33014, -1, -1, 248, 250, 252, 254, 256,
+ 258, 33028, -1, -1, 262, 264, 266, 268,
+ 270, 272, -1, -1, 274, 276, 278, 280,
+ 282, 284, 286, 288, 290, 292, 294, 296,
+ 298, 300, 302, 304, 306, 308, -1, -1,
+ 310, 312, 314, 316, 318, 320, 322, 324,
+ 326, 328, 330, 332, 334, 336, 338, 340,
+ 342, 344, 346, 348, 350, 352, 354, 33124,
+ 357, 359, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 361,
+ 363, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33133, 33135, 33137, 33139,
+ 33141, 33143, 33145, 33147, 33149, 383, 385, 387,
+ 389, 391, 393, 395, 397, 399, 401, 403,
+ 405, 407, 409, 411, 413, -1, 415, 417,
+ 419, 421, 423, 425, -1, -1, 427, 429,
+ 431, 433, 435, 437, 439, 441, 443, 445,
+ 447, 33217, 33219, 33221, 455, 457, -1, -1,
+ 459, 461, 463, 465, 467, 469, 471, 473,
+ 475, 477, 479, 481, 483, 485, 487, 489,
+ 491, 493, 495, 497, 499, 501, 503, 505,
+ 507, 509, 511, 513, 515, 517, 519, 521,
+ 523, 525, 527, 529, -1, -1, 531, 533,
+ -1, -1, -1, -1, -1, -1, 535, 537,
+ 539, 541, 543, 545, 547, 549, 551, 553,
+ 555, 557, 559, 561, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33331, 33332, 33333, 33334, 33335, 33336, 33337, 33338,
+ 33339, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33340, 33342, 33344, 33346, 33348, 33350, -1, -1,
+ 33352, 33353, 33354, 33355, 33356, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 589, 590, -1, 591, 592, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 594, -1, -1, -1,
+ -1, -1, 33363, -1, -1, -1, 597, -1,
+ -1, -1, -1, -1, 33366, 600, 602, 604,
+ 605, 607, 609, -1, 611, -1, 613, 615,
+ 617, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 619, 621, 623, 625, 627, 629,
+ 631, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 633, 635, 637, 639, 641, -1,
+ 33411, 33412, 33413, 646, 648, 33418, 33419, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33420, 33421, 33422, -1, 33423, 33424, -1, -1,
+ -1, 33425, -1, -1, -1, -1, -1, -1,
+ 658, 660, -1, 662, -1, -1, -1, 664,
+ -1, -1, -1, -1, 666, 668, 670, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 672, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 674, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 676, 678, -1, 680, -1, -1, -1, 682,
+ -1, -1, -1, -1, 684, 686, 688, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 690, 692,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 694, 696, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 698, 700, 702, 704, -1, -1, 706, 708,
+ -1, -1, 710, 712, 714, 716, 718, 720,
+ -1, -1, 722, 724, 726, 728, 730, 732,
+ -1, -1, 734, 736, 738, 740, 742, 744,
+ 746, 748, 750, 752, 754, 756, -1, -1,
+ 758, 760, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 33530,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 764, 766, 768, 770, 772, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 33542, 33544, 33546,
+ 33548, -1, -1, -1, -1, -1, -1, -1,
+ 782, -1, 784, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 786, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 788, -1, -1, -1, -1, -1, -1,
+ -1, 790, -1, -1, 792, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 794, 796, 798, 800, 802, 804, 806, 808,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 810, 812, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 814, 816, -1, 818,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 820, -1, -1, 822, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 824, 826, 828, -1, -1, 830, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 832, -1, -1, 834, 836, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 838, 840, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 842, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 844, 846, 848, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 850, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 852, -1, -1, -1, -1, -1, -1, 854,
+ 856, -1, 858, 860, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 862, 864, 866, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 868, -1, 870, 872, 874, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33644, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33646, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33648, 33650, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33652, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 885, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 887, -1, -1,
+ -1, -1, 889, -1, -1, -1, -1, 891,
+ -1, -1, -1, -1, 893, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 895, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 897, -1, 899, 901, 33671,
+ 905, 33675, -1, -1, -1, -1, -1, -1,
+ -1, 909, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 911, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 913, -1, -1,
+ -1, -1, 915, -1, -1, -1, -1, 917,
+ -1, -1, -1, -1, 919, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 921, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 923, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33693, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 926, -1,
+ 928, -1, 930, -1, 932, -1, 934, -1,
+ -1, -1, 936, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 938, -1, 940, -1, -1,
+ 942, 944, -1, 946, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 33716, 33717, 33718, -1,
+ 33719, 33720, 33721, 33722, 33723, 33724, 33725, 33726,
+ 33727, 33728, 33729, -1, 33730, 33731, 33732, 33733,
+ 33734, 33735, 33736, 33737, 33738, 33739, 33740, 33741,
+ 33742, 33743, 33744, 33745, 33746, 33747, -1, 33748,
+ 33749, 33750, 33751, 33752, 33753, 33754, 33755, 33756,
+ 33757, 33758, 33759, 33760, 33761, 33762, 33763, 33764,
+ 33765, 33766, 33767, 33768, 33769, 33770, 33771, 33772,
+ 33773, 33774, 33775, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 33776, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 33777, 33778, 33779, 33780, 33781,
+ 33782, 33783, 33784, 33785, 33786, 33787, 33788, 33789,
+ 33790, 33791, 33792, 33793, 33794, 33795, 33796, 33797,
+ 33798, 33799, 33800, 33801, 33802, 33803, 33804, 33805,
+ 33806, 33807, 33808, 33809, 33810, 33811, 33812, 33813,
+ 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060,
+ 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076,
+ 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1092,
+ 1094, 1096, 1098, 1100, 1102, 1104, 1106, 1108,
+ 1110, 1112, 1114, 1116, 1118, 1120, 1122, 1124,
+ 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140,
+ 1142, 1144, 1146, 1148, 1150, 1152, 1154, 1156,
+ 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1172,
+ 1174, 1176, 1178, 1180, 1182, 1184, 1186, 1188,
+ 1190, 1192, 1194, 1196, 1198, 1200, 1202, 1204,
+ 1206, 1208, 1210, 1212, 1214, 1216, 1218, 1220,
+ 1222, 1224, 1226, 1228, 1230, 1232, 1234, 1236,
+ 1238, 1240, 1242, 1244, 1246, 1248, 1250, 1252,
+ 1254, 1256, 1258, 1260, 1262, 1264, 1266, 1268,
+ 1270, 1272, 1274, 1276, 1278, 1280, 1282, 1284,
+ 1286, 1288, 1290, 1292, 1294, 1296, 1298, 1300,
+ 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1316,
+ 1318, 1320, 1322, 1324, 1326, 1328, 1330, 1332,
+ 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348,
+ 1350, 1352, 34122, 1356, -1, -1, -1, -1,
+ 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372,
+ 1374, 1376, 1378, 1380, 1382, 1384, 1386, 1388,
+ 1390, 1392, 1394, 1396, 1398, 1400, 1402, 1404,
+ 1406, 1408, 1410, 1412, 1414, 1416, 1418, 1420,
+ 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436,
+ 1438, 1440, 1442, 1444, 1446, 1448, 1450, 1452,
+ 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468,
+ 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484,
+ 1486, 1488, 1490, 1492, 1494, 1496, 1498, 1500,
+ 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516,
+ 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532,
+ 1534, 1536, -1, -1, -1, -1, -1, -1,
+ 1538, 1540, 1542, 1544, 1546, 1548, 1550, 1552,
+ 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568,
+ 1570, 1572, 1574, 1576, 1578, 1580, -1, -1,
+ 1582, 1584, 1586, 1588, 1590, 1592, -1, -1,
+ 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608,
+ 1610, 1612, 1614, 1616, 1618, 1620, 1622, 1624,
+ 1626, 1628, 1630, 1632, 1634, 1636, 1638, 1640,
+ 1642, 1644, 1646, 1648, 1650, 1652, 1654, 1656,
+ 1658, 1660, 1662, 1664, 1666, 1668, -1, -1,
+ 1670, 1672, 1674, 1676, 1678, 1680, -1, -1,
+ 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696,
+ -1, 1698, -1, 1700, -1, 1702, -1, 1704,
+ 1706, 1708, 1710, 1712, 1714, 1716, 1718, 1720,
+ 1722, 1724, 1726, 1728, 1730, 1732, 1734, 1736,
+ 1738, 1740, 1741, 1743, 1744, 1746, 1747, 1749,
+ 1750, 1752, 1753, 1755, 1756, 1758, -1, -1,
+ 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773,
+ 1775, 1777, 1779, 1781, 1783, 1785, 1787, 1789,
+ 1791, 1793, 1795, 1797, 1799, 1801, 1803, 1805,
+ 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821,
+ 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837,
+ 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853,
+ 1855, 1857, 1859, 1861, 1863, -1, 1865, 1867,
+ 1869, 1871, 1873, 1875, 1876, 34646, 1880, 34649,
+ 34651, 1885, 1887, 1889, 1891, -1, 1893, 1895,
+ 1897, 1899, 1900, 1902, 1903, 1905, 1907, 1909,
+ 1911, 1913, 1915, 1917, -1, -1, 1918, 1920,
+ 1922, 1924, 1926, 1928, -1, 1929, 1931, 1933,
+ 1935, 1937, 1939, 1941, 1942, 1944, 1946, 1948,
+ 1950, 1952, 1954, 1956, 1957, 1959, 1961, 1962,
+ -1, -1, 1963, 1965, 1967, -1, 1969, 1971,
+ 1973, 1975, 1976, 1978, 1979, 1981, 34750, -1,
+ 1984, 1985, 34754, 34755, 34756, 34757, 34758, 34759,
+ 34760, 34761, 34762, -1, -1, -1, -1, -1,
+ -1, 34763, -1, -1, -1, -1, -1, 34764,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 34766, 34767, 34769, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34772,
+ -1, -1, -1, 34773, 34775, -1, 34778, 34780,
+ -1, -1, -1, -1, 34783, -1, 34785, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34787,
+ 34789, 34791, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34793,
+ -1, -1, -1, -1, -1, -1, -1, 34797,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34798, 34799, -1, -1, 34800, 34801, 34802, 34803,
+ 34804, 34805, 34806, 34807, 34808, 34809, 34810, 34811,
+ 34812, 34813, 34814, 34815, 34816, 34817, 34818, 34819,
+ 34820, 34821, 34822, 34823, 34824, 34825, 34826, -1,
+ 34827, 34828, 34829, 34830, 34831, 34832, 34833, 34834,
+ 34835, 34836, 34837, 34838, 34839, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34840, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 34842, 34845, 34848, 34849, -1, 34851, 34854, 34857,
+ -1, 34858, 34860, 34861, 34862, 34863, 34864, 34865,
+ 34866, 34867, 34868, 34869, -1, 34870, 34871, -1,
+ -1, 34873, 34874, 34875, 34876, 34877, -1, -1,
+ 34878, 34880, 34883, -1, 34885, -1, 2118, -1,
+ 34887, -1, 2120, 2121, 34890, 34891, -1, 34892,
+ 34893, 34894, -1, 34895, 34896, 34897, 34898, 34899,
+ 34900, 34901, -1, 34902, 34905, 34906, 34907, 34908,
+ 34909, -1, -1, -1, -1, 34910, 34911, 34912,
+ 34913, 34914, -1, -1, -1, -1, -1, -1,
+ 34915, 34918, 34921, 34925, 34928, 34931, 34934, 34937,
+ 34940, 34943, 34946, 34949, 34952, 34955, 34958, 34961,
+ 34963, 34964, 34966, 34969, 34971, 34972, 34974, 34977,
+ 34981, 34983, 34984, 34986, 34989, 34990, 34991, 34992,
+ 34993, 34994, 34996, 34999, 35001, 35002, 35004, 35007,
+ 35011, 35013, 35014, 35016, 35019, 35020, 35021, 35022,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 35023, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 2258, 2260, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 2262, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2264, 2266, 2268,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2270, -1, -1, -1,
+ -1, 2272, -1, -1, 2274, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2276, -1, 2278, -1,
+ -1, -1, -1, -1, 35048, 35050, -1, 35053,
+ 35055, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2290, -1, -1, 2292, -1, -1, 2294,
+ -1, 2296, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2298, -1, 2300, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 2302, 2304, 2306,
+ 2308, 2310, -1, -1, 2312, 2314, -1, -1,
+ 2316, 2318, -1, -1, -1, -1, -1, -1,
+ 2320, 2322, -1, -1, 2324, 2326, -1, -1,
+ 2328, 2330, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2332, 2334, 2336, 2338,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2340, 2342, 2344, 2346, -1, -1, -1, -1,
+ -1, -1, 2348, 2350, 2352, 2354, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 2356, 2357, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35126, 35127, 35128, 35129, 35130, 35131, 35132, 35133,
+ 35134, 35135, 35137, 35139, 35141, 35143, 35145, 35147,
+ 35149, 35151, 35153, 35155, 35157, 35160, 35163, 35166,
+ 35169, 35172, 35175, 35178, 35181, 35184, 35188, 35192,
+ 35196, 35200, 35204, 35208, 35212, 35216, 35220, 35224,
+ 35228, 35230, 35232, 35234, 35236, 35238, 35240, 35242,
+ 35244, 35246, 35249, 35252, 35255, 35258, 35261, 35264,
+ 35267, 35270, 35273, 35276, 35279, 35282, 35285, 35288,
+ 35291, 35294, 35297, 35300, 35303, 35306, 35309, 35312,
+ 35315, 35318, 35321, 35324, 35327, 35330, 35333, 35336,
+ 35339, 35342, 35345, 35348, 35351, 35354, 35357, 35358,
+ 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366,
+ 35367, 35368, 35369, 35370, 35371, 35372, 35373, 35374,
+ 35375, 35376, 35377, 35378, 35379, 35380, 35381, 35382,
+ 35383, 35384, 35385, 35386, 35387, 35388, 35389, 35390,
+ 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398,
+ 35399, 35400, 35401, 35402, 35403, 35404, 35405, 35406,
+ 35407, 35408, 35409, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35410, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35414, 35417, 35419, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2654, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 35424, 35425, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 35426,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 35427,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 35428, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35429, 35430, 35431, 35432, 35433, 35434, 35435, 35436,
+ 35437, 35438, 35439, 35440, 35441, 35442, 35443, 35444,
+ 35445, 35446, 35447, 35448, 35449, 35450, 35451, 35452,
+ 35453, 35454, 35455, 35456, 35457, 35458, 35459, 35460,
+ 35461, 35462, 35463, 35464, 35465, 35466, 35467, 35468,
+ 35469, 35470, 35471, 35472, 35473, 35474, 35475, 35476,
+ 35477, 35478, 35479, 35480, 35481, 35482, 35483, 35484,
+ 35485, 35486, 35487, 35488, 35489, 35490, 35491, 35492,
+ 35493, 35494, 35495, 35496, 35497, 35498, 35499, 35500,
+ 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508,
+ 35509, 35510, 35511, 35512, 35513, 35514, 35515, 35516,
+ 35517, 35518, 35519, 35520, 35521, 35522, 35523, 35524,
+ 35525, 35526, 35527, 35528, 35529, 35530, 35531, 35532,
+ 35533, 35534, 35535, 35536, 35537, 35538, 35539, 35540,
+ 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548,
+ 35549, 35550, 35551, 35552, 35553, 35554, 35555, 35556,
+ 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564,
+ 35565, 35566, 35567, 35568, 35569, 35570, 35571, 35572,
+ 35573, 35574, 35575, 35576, 35577, 35578, 35579, 35580,
+ 35581, 35582, 35583, 35584, 35585, 35586, 35587, 35588,
+ 35589, 35590, 35591, 35592, 35593, 35594, 35595, 35596,
+ 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604,
+ 35605, 35606, 35607, 35608, 35609, 35610, 35611, 35612,
+ 35613, 35614, 35615, 35616, 35617, 35618, 35619, 35620,
+ 35621, 35622, 35623, 35624, 35625, 35626, 35627, 35628,
+ 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636,
+ 35637, 35638, 35639, 35640, 35641, 35642, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 35643, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 35644, -1,
+ 35645, 35646, 35647, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2880, -1, 2882, -1,
+ 2884, -1, 2886, -1, 2888, -1, 2890, -1,
+ 2892, -1, 2894, -1, 2896, -1, 2898, -1,
+ 2900, -1, 2902, -1, -1, 2904, -1, 2906,
+ -1, 2908, -1, -1, -1, -1, -1, -1,
+ 2910, 2912, -1, 2914, 2916, -1, 2918, 2920,
+ -1, 2922, 2924, -1, 2926, 2928, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2930, -1, -1, -1,
+ -1, -1, -1, 35700, 35702, -1, 2936, 35706,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2940, -1, 2942, -1,
+ 2944, -1, 2946, -1, 2948, -1, 2950, -1,
+ 2952, -1, 2954, -1, 2956, -1, 2958, -1,
+ 2960, -1, 2962, -1, -1, 2964, -1, 2966,
+ -1, 2968, -1, -1, -1, -1, -1, -1,
+ 2970, 2972, -1, 2974, 2976, -1, 2978, 2980,
+ -1, 2982, 2984, -1, 2986, 2988, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2990, -1, -1, 2992,
+ 2994, 2996, 2998, -1, -1, -1, 3000, 35770,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 35772, 35773, 35774, 35775, 35776, 35777, 35778,
+ 35779, 35780, 35781, 35782, 35783, 35784, 35785, 35786,
+ 35787, 35788, 35789, 35790, 35791, 35792, 35793, 35794,
+ 35795, 35796, 35797, 35798, 35799, 35800, 35801, 35802,
+ 35803, 35804, 35805, 35806, 35807, 35808, 35809, 35810,
+ 35811, 35812, 35813, 35814, 35815, 35816, 35817, 35818,
+ 35819, 35820, 35821, 35822, 35823, 35824, 35825, 35826,
+ 35827, 35828, 35829, 35830, 35831, 35832, 35833, 35834,
+ 35835, 35836, 35837, 35838, 35839, 35840, 35841, 35842,
+ 35843, 35844, 35845, 35846, 35847, 35848, 35849, 35850,
+ 35851, 35852, 35853, 35854, 35855, 35856, 35857, 35858,
+ 35859, 35860, 35861, 35862, 35863, 35864, 35865, -1,
+ -1, -1, 35866, 35867, 35868, 35869, 35870, 35871,
+ 35872, 35873, 35874, 35875, 35876, 35877, 35878, 35879,
+ 35880, 35883, 35886, 35889, 35892, 35895, 35898, 35901,
+ 35904, 35907, 35910, 35913, 35916, 35919, 35922, 35926,
+ 35930, 35934, 35938, 35942, 35946, 35950, 35954, 35958,
+ 35962, 35966, 35970, 35974, 35978, 35982, 35989, -1,
+ 35995, 35998, 36001, 36004, 36007, 36010, 36013, 36016,
+ 36019, 36022, 36025, 36028, 36031, 36034, 36037, 36040,
+ 36043, 36046, 36049, 36052, 36055, 36058, 36061, 36064,
+ 36067, 36070, 36073, 36076, 36079, 36082, 36085, 36088,
+ 36091, 36094, 36097, 36100, 36103, 36104, 36105, 36106,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 36107, 36110, 36112, 36114, 36116, 36118, 36120, 36122,
+ 36124, 36126, 36128, 36130, 36132, 36134, 36136, 36138,
+ 36140, 36141, 36142, 36143, 36144, 36145, 36146, 36147,
+ 36148, 36149, 36150, 36151, 36152, 36153, 36154, 36156,
+ 36158, 36160, 36162, 36164, 36166, 36168, 36170, 36172,
+ 36174, 36176, 36178, 36180, 36182, 36187, 36191, -1,
+ 36193, 36194, 36195, 36196, 36197, 36198, 36199, 36200,
+ 36201, 36202, 36203, 36204, 36205, 36206, 36207, 36208,
+ 36209, 36210, 36211, 36212, 36213, 36214, 36215, 36216,
+ 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224,
+ 36225, 36226, 36227, 36228, 36229, 36230, 36231, 36232,
+ 36233, 36234, 36235, 36236, 36237, 36238, 36239, 36240,
+ 36241, 36242, 36244, 36246, 36248, 36250, 36252, 36254,
+ 36256, 36258, 36260, 36262, 36264, 36266, 36268, 36270,
+ 36272, 36274, 36276, 36278, 36280, 36282, 36284, 36286,
+ 36288, 36290, 36293, 36296, 36299, 36301, 36304, 36306,
+ 36309, 36310, 36311, 36312, 36313, 36314, 36315, 36316,
+ 36317, 36318, 36319, 36320, 36321, 36322, 36323, 36324,
+ 36325, 36326, 36327, 36328, 36329, 36330, 36331, 36332,
+ 36333, 36334, 36335, 36336, 36337, 36338, 36339, 36340,
+ 36341, 36342, 36343, 36344, 36345, 36346, 36347, 36348,
+ 36349, 36350, 36351, 36352, 36353, 36354, 36355, -1,
+ 36356, 36360, 36364, 36368, 36371, 36375, 36378, 36381,
+ 36386, 36390, 36393, 36396, 36399, 36403, 36407, 36410,
+ 36413, 36415, 36418, 36422, 36426, 36428, 36433, 36439,
+ 36444, 36447, 36452, 36457, 36461, 36464, 36467, 36470,
+ 36474, 36479, 36483, 36486, 36489, 36492, 36494, 36496,
+ 36498, 36500, 36503, 36506, 36511, 36514, 36518, 36523,
+ 36526, 36528, 36530, 36535, 36539, 36544, 36547, 36552,
+ 36554, 36557, 36560, 36563, 36566, 36569, 36573, 36576,
+ 36578, 36581, 36584, 36587, 36591, 36594, 36597, 36600,
+ 36605, 36609, 36611, 36616, 36618, 36622, 36626, 36629,
+ 36632, 36635, 36639, 36641, 36644, 36648, 36650, 36655,
+ 36658, 36660, 36662, 36664, 36666, 36668, 36670, 36672,
+ 36674, 36676, 36678, 36681, 36684, 36687, 36690, 36693,
+ 36696, 36699, 36702, 36705, 36708, 36711, 36714, 36717,
+ 36720, 36723, 36726, 36728, 36730, 36733, 36735, 36737,
+ 36739, 36742, 36745, 36747, 36749, 36751, 36753, 36755,
+ 36759, 36761, 36763, 36765, 36767, 36769, 36771, 36773,
+ 36775, 36778, 36782, 36784, 36786, 36788, 36790, 36792,
+ 36794, 36796, 36799, 36802, 36805, 36808, 36810, 36812,
+ 36814, 36816, 36818, 36820, 36822, 36824, 36826, 36828,
+ 36831, 36834, 36836, 36839, 36842, 36845, 36847, 36850,
+ 36853, 36857, 36859, 36862, 36865, 36868, 36871, 36876,
+ 36882, 36884, 36886, 36888, 36890, 36892, 36894, 36896,
+ 36898, 36900, 36902, 36904, 36906, 36908, 36910, 36912,
+ 36914, 36916, 36918, 36922, 36924, 36926, 36928, 36932,
+ 36935, 36937, 36939, 36941, 36943, 36945, 36947, 36949,
+ 36951, 36953, 36955, 36958, 36960, 36962, 36965, 36968,
+ 36970, 36974, 36977, 36979, 36981, 36983, 36985, 36988,
+ 36991, 36993, 36995, 36997, 36999, 37001, 37003, 37005,
+ 37007, 37009, 37012, 37015, 37018, 37021, 37024, 37027,
+ 37030, 37033, 37036, 37039, 37042, 37045, 37048, 37051,
+ 37054, 37057, 37060, 37063, 37066, 37069, 37072, 37075,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 37078, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318,
+ 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326,
+ 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334,
+ 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342,
+ 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350,
+ 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358,
+ 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366,
+ 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374,
+ 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382,
+ 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390,
+ 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398,
+ 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406,
+ 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414,
+ 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422,
+ 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430,
+ 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438,
+ 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446,
+ 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454,
+ 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462,
+ 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470,
+ 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478,
+ 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486,
+ 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494,
+ 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502,
+ 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510,
+ 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518,
+ 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526,
+ 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534,
+ 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542,
+ 4543, 4544, 4545, 4546, 4547, 4548, 4549, 4550,
+ 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558,
+ 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566,
+ 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574,
+ 4575, 4576, 4577, 4578, 4579, 4580, -1, -1,
+ 4581, -1, 4582, -1, -1, 4583, 4584, 4585,
+ 4586, 4587, 4588, 4589, 4590, 4591, 4592, -1,
+ 4593, -1, 4594, -1, -1, 4595, 4596, -1,
+ -1, -1, 4597, 4598, 4599, 4600, -1, -1,
+ 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608,
+ 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616,
+ 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624,
+ 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632,
+ 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640,
+ 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648,
+ 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656,
+ 4657, 4658, 4659, 4660, 4661, 4662, -1, -1,
+ 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670,
+ 4671, 4672, 4673, 4674, 4675, 4676, 4677, 4678,
+ 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686,
+ 4687, 4688, 4689, 4690, 4691, 4692, 4693, 4694,
+ 4695, 4696, 4697, 4698, 4699, 4700, 4701, 4702,
+ 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710,
+ 4711, 4712, 4713, 4714, 4715, 4716, 4717, 4718,
+ 4719, 4720, 4721, 4722, 4723, 4724, 4725, 4726,
+ 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734,
+ 4735, 4736, 4737, 4738, 4739, 4740, 4741, 4742,
+ 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750,
+ 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758,
+ 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766,
+ 4767, 4768, -1, -1, -1, -1, -1, -1,
+ 37537, 37539, 37541, 37543, 37546, 37549, 37551, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 37553, 37555, 37557, 37559, 37561,
+ -1, -1, -1, -1, -1, 4795, -1, 4797,
+ 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574,
+ 37575, 37576, 4809, 4811, 4813, 4815, 4817, 4819,
+ 4821, 4823, 4825, 4827, 4829, 4831, 4833, -1,
+ 4835, 4837, 4839, 4841, 4843, -1, 4845, -1,
+ 4847, 4849, -1, 4851, 4853, -1, 4855, 4857,
+ 4859, 4861, 4863, 4865, 4867, 4869, 4871, 37641,
+ 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650,
+ 37651, 37652, 37653, 37654, 37655, 37656, 37657, 37658,
+ 37659, 37660, 37661, 37662, 37663, 37664, 37665, 37666,
+ 37667, 37668, 37669, 37670, 37671, 37672, 37673, 37674,
+ 37675, 37676, 37677, 37678, 37679, 37680, 37681, 37682,
+ 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690,
+ 37691, 37692, 37693, 37694, 37695, 37696, 37697, 37698,
+ 37699, 37700, 37701, 37702, 37703, 37704, 37705, 37706,
+ 37707, 37708, 37709, 37710, 37711, 37712, 37713, 37714,
+ 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722,
+ 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730,
+ 37731, 37732, 37733, 37734, 37735, 37736, 37737, 37738,
+ 37739, 37740, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 37741, 37742, 37743, 37744, 37745,
+ 37746, 37747, 37748, 37749, 37750, 37751, 37752, 37753,
+ 37754, 37755, 37756, 37757, 37758, 37759, 37760, 37761,
+ 37762, 37763, 37764, 37766, 37768, 37770, 37772, 37774,
+ 37776, 37778, 37780, 37782, 37784, 37786, 37788, 37790,
+ 37792, 37794, 37796, 37798, 37800, 37801, 37802, 37803,
+ 37804, 37806, 37808, 37810, 37812, 37814, 37816, 37818,
+ 37820, 37822, 37824, 37826, 37828, 37830, 37832, 37834,
+ 37836, 37838, 37840, 37842, 37844, 37846, 37848, 37850,
+ 37852, 37854, 37856, 37858, 37860, 37862, 37864, 37866,
+ 37868, 37870, 37872, 37874, 37876, 37878, 37880, 37882,
+ 37884, 37886, 37888, 37890, 37892, 37894, 37896, 37898,
+ 37900, 37902, 37904, 37906, 37908, 37910, 37912, 37914,
+ 37916, 37918, 37920, 37922, 37924, 37926, 37928, 37930,
+ 37932, 37934, 37936, 37938, 37940, 37942, 37944, 37946,
+ 37948, 37950, 37952, 37954, 37956, 37958, 37960, 37962,
+ 37964, 37966, 37968, 37970, 37972, 37974, 37976, 37978,
+ 37980, 37982, 37984, 37986, 37988, 37990, 37992, 37995,
+ 37998, 38001, 38004, 38007, 38010, 38012, 38014, 38016,
+ 38018, 38020, 38022, 38024, 38026, 38028, 38030, 38032,
+ 38034, 38036, 38038, 38040, 38042, 38044, 38046, 38048,
+ 38050, 38052, 38054, 38056, 38058, 38060, 38062, 38064,
+ 38066, 38068, 38070, 38072, 38074, 38076, 38078, 38080,
+ 38082, 38084, 38086, 38088, 38090, 38092, 38094, 38096,
+ 38098, 38100, 38102, 38104, 38106, 38108, 38110, 38112,
+ 38114, 38116, 38118, 38120, 38122, 38124, 38126, 38128,
+ 38130, 38132, 38134, 38136, 38138, 38140, 38142, 38144,
+ 38146, 38148, 38150, 38152, 38154, 38156, 38158, 38160,
+ 38162, 38164, 38166, 38168, 38170, 38172, 38174, 38176,
+ 38178, 38180, 38182, 38184, 38186, 38188, 38190, 38192,
+ 38194, 38196, 38198, 38200, 38202, 38204, 38206, 38208,
+ 38210, 38212, 38214, 38216, 38218, 38220, 38222, 38224,
+ 38226, 38228, 38230, 38232, 38234, 38236, 38238, 38240,
+ 38242, 38244, 38246, 38248, 38250, 38252, 38254, 38256,
+ 38258, 38260, 38262, 38264, 38266, 38268, 38270, 38272,
+ 38274, 38276, 38278, 38280, 38282, 38284, 38286, 38288,
+ 38290, 38292, 38294, 38297, 38300, 38303, 38305, 38307,
+ 38309, 38311, 38313, 38315, 38317, 38319, 38321, 38323,
+ 38325, 38327, 38329, 38331, 38333, 38335, 38337, 38339,
+ 38341, 38343, 38345, 38347, 38349, 38351, 38353, 38355,
+ 38357, 38359, 38361, 38363, 38365, 38367, 38369, 38371,
+ 38373, 38375, 38377, 38379, 38381, 38383, 38385, 38387,
+ 38389, 38391, 38393, 38395, 38397, 38399, 38401, 38403,
+ 38405, 38407, 38409, 38411, 38413, 38415, 38417, 38419,
+ 38421, 38423, 38425, 38427, 38429, 38431, 38433, 38435,
+ 38437, 38439, 38441, 38443, 38445, 38447, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38449, 38452, 38455, 38458, 38461, 38464, 38467, 38470,
+ 38473, 38476, 38479, 38482, 38485, 38488, 38491, 38494,
+ 38497, 38500, 38503, 38506, 38509, 38512, 38515, 38518,
+ 38521, 38524, 38527, 38530, 38533, 38536, 38539, 38542,
+ 38545, 38548, 38551, 38554, 38557, 38560, 38563, 38566,
+ 38569, 38572, 38575, 38578, 38581, 38584, 38587, 38590,
+ 38593, 38596, 38599, 38602, 38605, 38608, 38611, 38614,
+ 38617, 38620, 38623, 38626, 38629, 38632, 38635, 38638,
+ -1, -1, 38641, 38644, 38647, 38650, 38653, 38656,
+ 38659, 38662, 38665, 38668, 38671, 38674, 38677, 38680,
+ 38683, 38686, 38689, 38692, 38695, 38698, 38701, 38704,
+ 38707, 38710, 38713, 38716, 38719, 38722, 38725, 38728,
+ 38731, 38734, 38737, 38740, 38743, 38746, 38749, 38752,
+ 38755, 38758, 38761, 38764, 38767, 38770, 38773, 38776,
+ 38779, 38782, 38785, 38788, 38791, 38794, 38797, 38800,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38803, 38806, 38809, 38813, 38817, 38821, 38825, 38829,
+ 38833, 38837, 38840, 38858, 38866, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38870, 38871, 38872, 38873, 38874, 38875, 38876, 38877,
+ 38878, 38879, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 38880, 38881, 38882, 38883, 38884, 38885, 38886, 38887,
+ 38888, 38889, 38890, 38891, 38892, 38893, 38894, 38895,
+ 38896, 38897, 38898, 38899, 38900, -1, -1, 38901,
+ 38902, 38903, 38904, 38905, 38906, 38907, 38908, 38909,
+ 38910, 38911, 38912, -1, 38913, 38914, 38915, 38916,
+ 38917, 38918, 38919, 38920, 38921, 38922, 38923, 38924,
+ 38925, 38926, 38927, 38928, 38929, 38930, 38931, -1,
+ 38932, 38933, 38934, 38935, -1, -1, -1, -1,
+ 38936, 38938, 38940, -1, 38942, -1, 38944, 38946,
+ 38948, 38950, 38952, 38954, 38956, 38958, 38960, 38962,
+ 38964, 38965, 38966, 38967, 38968, 38969, 38970, 38971,
+ 38972, 38973, 38974, 38975, 38976, 38977, 38978, 38979,
+ 38980, 38981, 38982, 38983, 38984, 38985, 38986, 38987,
+ 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995,
+ 38996, 38997, 38998, 38999, 39000, 39001, 39002, 39003,
+ 39004, 39005, 39006, 39007, 39008, 39009, 39010, 39011,
+ 39012, 39013, 39014, 39015, 39016, 39017, 39018, 39019,
+ 39020, 39021, 39022, 39023, 39024, 39025, 39026, 39027,
+ 39028, 39029, 39030, 39031, 39032, 39033, 39034, 39035,
+ 39036, 39037, 39038, 39039, 39040, 39041, 39042, 39043,
+ 39044, 39045, 39046, 39047, 39048, 39049, 39050, 39051,
+ 39052, 39053, 39054, 39055, 39056, 39057, 39058, 39059,
+ 39060, 39061, 39062, 39063, 39064, 39065, 39066, 39067,
+ 39068, 39069, 39070, 39071, 39072, 39073, 39074, 39075,
+ 39076, 39077, 39078, 39079, 39080, 39081, 39083, 39085,
+ 39087, 39089, 39091, 39093, 39095, -1, -1, -1,
+ -1, 39097, 39098, 39099, 39100, 39101, 39102, 39103,
+ 39104, 39105, 39106, 39107, 39108, 39109, 39110, 39111,
+ 39112, 39113, 39114, 39115, 39116, 39117, 39118, 39119,
+ 39120, 39121, 39122, 39123, 39124, 39125, 39126, 39127,
+ 39128, 39129, 39130, 39131, 39132, 39133, 39134, 39135,
+ 39136, 39137, 39138, 39139, 39140, 39141, 39142, 39143,
+ 39144, 39145, 39146, 39147, 39148, 39149, 39150, 39151,
+ 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159,
+ 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167,
+ 39168, 39169, 39170, 39171, 39172, 39173, 39174, 39175,
+ 39176, 39177, 39178, 39179, 39180, 39181, 39182, 39183,
+ 39184, 39185, 39186, 39187, 39188, 39189, 39190, 39191,
+ 39192, 39193, 39194, 39195, 39196, 39197, 39198, 39199,
+ 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207,
+ 39208, 39209, 39210, 39211, 39212, 39213, 39214, 39215,
+ 39216, 39217, 39218, 39219, 39220, 39221, 39222, 39223,
+ 39224, 39225, 39226, 39227, 39228, 39229, 39230, 39231,
+ 39232, 39233, 39234, 39235, 39236, 39237, 39238, 39239,
+ 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247,
+ 39248, 39249, 39250, 39251, 39252, 39253, 39254, 39255,
+ 39256, 39257, 39258, 39259, 39260, 39261, 39262, 39263,
+ 39264, 39265, 39266, 39267, 39268, 39269, 39270, 39271,
+ 39272, 39273, 39274, 39275, 39276, 39277, 39278, 39279,
+ 39280, 39281, 39282, 39283, 39284, 39285, 39286, -1,
+ -1, -1, 39287, 39288, 39289, 39290, 39291, 39292,
+ -1, -1, 39293, 39294, 39295, 39296, 39297, 39298,
+ -1, -1, 39299, 39300, 39301, 39302, 39303, 39304,
+ -1, -1, 39305, 39306, 39307, -1, -1, -1,
+ 39308, 39309, 39310, 39311, 39312, 39313, 39314, -1,
+ 39315, 39316, 39317, 39318, 39319, 39320, 39321, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 6554, -1, 6556, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6558, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 6560, 6562,
+ 6564, 6566, 6568, 6570, 6572, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 6574, 6576, 6578, 6580, 6582,
+ 6584, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361,
+ 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369,
+ 39370, 39371, 39372, 39373, 39374, 39375, 39376, 39377,
+ 39378, 39379, 39380, 39381, 39382, 39383, 39384, 39385,
+ 39386, 39387, 39388, 39389, 39390, 39391, 39392, 39393,
+ 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401,
+ 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409,
+ 39410, 39411, 39412, 39413, 39414, 39415, 39416, 39417,
+ 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425,
+ 39426, 39427, 39428, 39429, 39430, 39431, 39432, 39433,
+ 39434, 39435, 39436, 39437, 39438, -1, 39439, 39440,
+ 39441, 39442, 39443, 39444, 39445, 39446, 39447, 39448,
+ 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456,
+ 39457, 39458, 39459, 39460, 39461, 39462, 39463, 39464,
+ 39465, 39466, 39467, 39468, 39469, 39470, 39471, 39472,
+ 39473, 39474, 39475, 39476, 39477, 39478, 39479, 39480,
+ 39481, 39482, 39483, 39484, 39485, 39486, 39487, 39488,
+ 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496,
+ 39497, 39498, 39499, 39500, 39501, 39502, 39503, 39504,
+ 39505, 39506, 39507, 39508, 39509, -1, 39510, 39511,
+ -1, -1, 39512, -1, -1, 39513, 39514, -1,
+ -1, 39515, 39516, 39517, 39518, -1, 39519, 39520,
+ 39521, 39522, 39523, 39524, 39525, 39526, 39527, 39528,
+ 39529, 39530, -1, 39531, -1, 39532, 39533, 39534,
+ 39535, 39536, 39537, 39538, -1, 39539, 39540, 39541,
+ 39542, 39543, 39544, 39545, 39546, 39547, 39548, 39549,
+ 39550, 39551, 39552, 39553, 39554, 39555, 39556, 39557,
+ 39558, 39559, 39560, 39561, 39562, 39563, 39564, 39565,
+ 39566, 39567, 39568, 39569, 39570, 39571, 39572, 39573,
+ 39574, 39575, 39576, 39577, 39578, 39579, 39580, 39581,
+ 39582, 39583, 39584, 39585, 39586, 39587, 39588, 39589,
+ 39590, 39591, 39592, 39593, 39594, 39595, 39596, 39597,
+ 39598, 39599, 39600, 39601, 39602, 39603, -1, 39604,
+ 39605, 39606, 39607, -1, -1, 39608, 39609, 39610,
+ 39611, 39612, 39613, 39614, 39615, -1, 39616, 39617,
+ 39618, 39619, 39620, 39621, 39622, -1, 39623, 39624,
+ 39625, 39626, 39627, 39628, 39629, 39630, 39631, 39632,
+ 39633, 39634, 39635, 39636, 39637, 39638, 39639, 39640,
+ 39641, 39642, 39643, 39644, 39645, 39646, 39647, 39648,
+ 39649, 39650, -1, 39651, 39652, 39653, 39654, -1,
+ 39655, 39656, 39657, 39658, 39659, -1, 39660, -1,
+ -1, -1, 39661, 39662, 39663, 39664, 39665, 39666,
+ 39667, -1, 39668, 39669, 39670, 39671, 39672, 39673,
+ 39674, 39675, 39676, 39677, 39678, 39679, 39680, 39681,
+ 39682, 39683, 39684, 39685, 39686, 39687, 39688, 39689,
+ 39690, 39691, 39692, 39693, 39694, 39695, 39696, 39697,
+ 39698, 39699, 39700, 39701, 39702, 39703, 39704, 39705,
+ 39706, 39707, 39708, 39709, 39710, 39711, 39712, 39713,
+ 39714, 39715, 39716, 39717, 39718, 39719, 39720, 39721,
+ 39722, 39723, 39724, 39725, 39726, 39727, 39728, 39729,
+ 39730, 39731, 39732, 39733, 39734, 39735, 39736, 39737,
+ 39738, 39739, 39740, 39741, 39742, 39743, 39744, 39745,
+ 39746, 39747, 39748, 39749, 39750, 39751, 39752, 39753,
+ 39754, 39755, 39756, 39757, 39758, 39759, 39760, 39761,
+ 39762, 39763, 39764, 39765, 39766, 39767, 39768, 39769,
+ 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777,
+ 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785,
+ 39786, 39787, 39788, 39789, 39790, 39791, 39792, 39793,
+ 39794, 39795, 39796, 39797, 39798, 39799, 39800, 39801,
+ 39802, 39803, 39804, 39805, 39806, 39807, 39808, 39809,
+ 39810, 39811, 39812, 39813, 39814, 39815, 39816, 39817,
+ 39818, 39819, 39820, 39821, 39822, 39823, 39824, 39825,
+ 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833,
+ 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841,
+ 39842, 39843, 39844, 39845, 39846, 39847, 39848, 39849,
+ 39850, 39851, 39852, 39853, 39854, 39855, 39856, 39857,
+ 39858, 39859, 39860, 39861, 39862, 39863, 39864, 39865,
+ 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873,
+ 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881,
+ 39882, 39883, 39884, 39885, 39886, 39887, 39888, 39889,
+ 39890, 39891, 39892, 39893, 39894, 39895, 39896, 39897,
+ 39898, 39899, 39900, 39901, 39902, 39903, 39904, 39905,
+ 39906, 39907, 39908, 39909, 39910, 39911, 39912, 39913,
+ 39914, 39915, 39916, 39917, 39918, 39919, 39920, 39921,
+ 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929,
+ 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937,
+ 39938, 39939, 39940, 39941, 39942, 39943, 39944, 39945,
+ 39946, 39947, 39948, 39949, 39950, 39951, 39952, 39953,
+ 39954, 39955, 39956, 39957, 39958, 39959, 39960, 39961,
+ 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969,
+ 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977,
+ 39978, 39979, 39980, 39981, 39982, 39983, 39984, 39985,
+ 39986, 39987, 39988, 39989, 39990, 39991, 39992, 39993,
+ 39994, 39995, 39996, 39997, 39998, 39999, 40000, 40001,
+ 40002, 40003, 40004, 40005, 40006, 40007, -1, -1,
+ 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015,
+ 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023,
+ 40024, 40025, 40026, 40027, 40028, 40029, 40030, 40031,
+ 40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039,
+ 40040, 40041, 40042, 40043, 40044, 40045, 40046, 40047,
+ 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055,
+ 40056, 40057, 40058, 40059, 40060, 40061, 40062, 40063,
+ 40064, 40065, 40066, 40067, 40068, 40069, 40070, 40071,
+ 40072, 40073, 40074, 40075, 40076, 40077, 40078, 40079,
+ 40080, 40081, 40082, 40083, 40084, 40085, 40086, 40087,
+ 40088, 40089, 40090, 40091, 40092, 40093, 40094, 40095,
+ 40096, 40097, 40098, 40099, 40100, 40101, 40102, 40103,
+ 40104, 40105, 40106, 40107, 40108, 40109, 40110, 40111,
+ 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119,
+ 40120, 40121, 40122, 40123, 40124, 40125, 40126, 40127,
+ 40128, 40129, 40130, 40131, 40132, 40133, 40134, 40135,
+ 40136, 40137, 40138, 40139, 40140, 40141, 40142, 40143,
+ 40144, 40145, 40146, 40147, 40148, 40149, 40150, 40151,
+ 40152, 40153, 40154, 40155, 40156, 40157, 40158, 40159,
+ 40160, 40161, 40162, 40163, 40164, 40165, 40166, 40167,
+ 40168, 40169, 40170, 40171, 40172, 40173, 40174, 40175,
+ 40176, 40177, 40178, 40179, 40180, 40181, 40182, 40183,
+ 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191,
+ 40192, 40193, 40194, 40195, 40196, 40197, 40198, 40199,
+ 40200, 40201, 40202, 40203, 40204, 40205, 40206, 40207,
+ 40208, 40209, 40210, 40211, 40212, 40213, 40214, 40215,
+ 40216, 40217, 40218, 40219, 40220, 40221, 40222, 40223,
+ 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231,
+ 40232, 40233, 40234, 40235, 40236, 40237, 40238, 40239,
+ 40240, 40241, 40242, 40243, 40244, 40245, 40246, 40247,
+ 40248, 40249, 40250, 40251, 40252, 40253, 40254, 40255,
+ 40256, 40257, 40258, 40259, 40260, 40261, 40262, 40263,
+ 40264, 40265, 40266, 40267, 40268, 40269, 40270, 40271,
+ 40272, 40273, 40274, 40275, 40276, 40277, 40278, 40279,
+ 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287,
+ 40288, 40289, 40290, 40291, 40292, 40293, 40294, 40295,
+ 40296, 40297, 40298, 40299, -1, -1, 40300, 40301,
+ 40302, 40303, 40304, 40305, 40306, 40307, 40308, 40309,
+ 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317,
+ 40318, 40319, 40320, 40321, 40322, 40323, 40324, 40325,
+ 40326, 40327, 40328, 40329, 40330, 40331, 40332, 40333,
+ 40334, 40335, 40336, 40337, 40338, 40339, 40340, 40341,
+ 40342, 40343, 40344, 40345, 40346, 40347, 40348, 40349,
+ 40350, 40352, 40354, 40356, 40358, 40360, 40362, 40364,
+ 40366, 40368, 40370, -1, -1, -1, -1, -1,
+ 40372, 40375, 40378, 40381, 40384, 40387, 40390, 40393,
+ 40396, 40399, 40402, 40405, 40408, 40411, 40414, 40417,
+ 40420, 40423, 40426, 40429, 40432, 40435, 40438, 40441,
+ 40444, 40447, 40450, 40453, 40454, 40455, 40457, -1,
+ 40459, 40460, 40461, 40462, 40463, 40464, 40465, 40466,
+ 40467, 40468, 40469, 40470, 40471, 40472, 40473, 40474,
+ 40475, 40476, 40477, 40478, 40479, 40480, 40481, 40482,
+ 40483, 40484, 40485, 40487, 40489, 40491, 40493, 40496,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 40498, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 40500, 40502, 40504, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 40505, 40506, 40507, 40508, 40509, 40510, 40511, 40512,
+ 40513, 40514, 40515, 40516, 40517, 40518, 40519, 40520,
+ 40521, 40522, 40523, 40524, 40525, 40526, 40527, 40528,
+ 40529, 40530, 40531, 40532, 40533, 40534, 40535, 40536,
+ 40537, 40538, 40539, 40540, 40541, 40542, 40543, 40544,
+ 40545, 40546, 40547, -1, -1, -1, -1, -1,
+ 40548, 40551, 40554, 40557, 40560, 40563, 40566, 40569,
+ 40572, -1, -1, -1, -1, -1, -1, -1,
+ 40575, 40576, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7809, 7810, 7811, 7812, 7813, 7814, 7815, 7816,
+ 7817, 7818, 7819, 7820, 7821, 7822, 7823, 7824,
+ 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832,
+ 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7840,
+ 7841, 7842, 7843, 7844, 7845, 7846, 7847, 7848,
+ 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856,
+ 7857, 7858, 7859, 7860, 7861, 7862, 7863, 7864,
+ 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872,
+ 7873, 7874, 7875, 7876, 7877, 7878, 7879, 7880,
+ 7881, 7882, 7883, 7884, 7885, 7886, 7887, 7888,
+ 7889, 7890, 7891, 7892, 7893, 7894, 7895, 7896,
+ 7897, 7898, 7899, 7900, 7901, 7902, 7903, 7904,
+ 7905, 7906, 7907, 7908, 7909, 7910, 7911, 7912,
+ 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920,
+ 7921, 7922, 7923, 7924, 7925, 7926, 7927, 7928,
+ 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936,
+ 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944,
+ 7945, 7946, 7947, 7948, 7949, 7950, 7951, 7952,
+ 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960,
+ 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968,
+ 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976,
+ 7977, 7978, 7979, 7980, 7981, 7982, 7983, 7984,
+ 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992,
+ 7993, 7994, 7995, 7996, 7997, 7998, 7999, 8000,
+ 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008,
+ 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016,
+ 8017, 8018, 8019, 8020, 8021, 8022, 8023, 8024,
+ 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032,
+ 8033, 8034, 8035, 8036, 8037, 8038, 8039, 8040,
+ 8041, 8042, 8043, 8044, 8045, 8046, 8047, 8048,
+ 8049, 8050, 8051, 8052, 8053, 8054, 8055, 8056,
+ 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8064,
+ 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072,
+ 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080,
+ 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088,
+ 8089, 8090, 8091, 8092, 8093, 8094, 8095, 8096,
+ 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104,
+ 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112,
+ 8113, 8114, 8115, 8116, 8117, 8118, 8119, 8120,
+ 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128,
+ 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136,
+ 8137, 8138, 8139, 8140, 8141, 8142, 8143, 8144,
+ 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152,
+ 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160,
+ 8161, 8162, 8163, 8164, 8165, 8166, 8167, 8168,
+ 8169, 8170, 8171, 8172, 8173, 8174, 8175, 8176,
+ 8177, 8178, 8179, 8180, 8181, 8182, 8183, 8184,
+ 8185, 8186, 8187, 8188, 8189, 8190, 8191, 8192,
+ 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200,
+ 8201, 8202, 8203, 8204, 8205, 8206, 8207, 8208,
+ 8209, 8210, 8211, 8212, 8213, 8214, 8215, 8216,
+ 8217, 8218, 8219, 8220, 8221, 8222, 8223, 8224,
+ 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232,
+ 8233, 8234, 8235, 8236, 8237, 8238, 8239, 8240,
+ 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248,
+ 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256,
+ 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264,
+ 8265, 8266, 8267, 8268, 8269, 8270, 8271, 8272,
+ 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280,
+ 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8288,
+ 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296,
+ 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304,
+ 8305, 8306, 8307, 8308, 8309, 8310, 8311, 8312,
+ 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320,
+ 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328,
+ 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336,
+ 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344,
+ 8345, 8346, 8347, 8348, 8349, 8350, -1, -1
+ }
+};
diff --git a/gnulib/lib/uninorm/decomposition.c b/gnulib/lib/uninorm/decomposition.c
new file mode 100644
index 0000000..af7b049
--- /dev/null
+++ b/gnulib/lib/uninorm/decomposition.c
@@ -0,0 +1,102 @@
+/* Decomposition of Unicode characters.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "decomposition-table.h"
+
+int
+uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition)
+{
+ if (uc >= 0xAC00 && uc < 0xD7A4)
+ {
+ /* Hangul syllable. See Unicode standard, chapter 3, section
+ "Hangul Syllable Decomposition", See also the clarification at
+ <http://www.unicode.org/versions/Unicode5.1.0/>, section
+ "Clarification of Hangul Jamo Handling". */
+ unsigned int t;
+
+ uc -= 0xAC00;
+ t = uc % 28;
+
+ *decomp_tag = UC_DECOMP_CANONICAL;
+ if (t == 0)
+ {
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ return 2;
+ }
+ else
+ {
+#if 1 /* Return the pairwise decomposition, not the full decomposition. */
+ decomposition[0] = 0xAC00 + uc - t; /* = 0xAC00 + (l * 21 + v) * 28; */
+ decomposition[1] = 0x11A7 + t;
+ return 2;
+#else
+ unsigned int v, l;
+
+ uc = uc / 28;
+ v = uc % 21;
+ l = uc / 21;
+
+ decomposition[0] = 0x1100 + l;
+ decomposition[1] = 0x1161 + v;
+ decomposition[2] = 0x11A7 + t;
+ return 3;
+#endif
+ }
+ }
+ else if (uc < 0x110000)
+ {
+ unsigned short entry = decomp_index (uc);
+ if (entry != (unsigned short)(-1))
+ {
+ const unsigned char *p;
+ unsigned int element;
+ unsigned int length;
+
+ p = &gl_uninorm_decomp_chars_table[3 * (entry & 0x7FFF)];
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ /* The first element has 5 bits for the decomposition type. */
+ *decomp_tag = (element >> 18) & 0x1f;
+ length = 1;
+ for (;;)
+ {
+ /* Every element has an 18 bits wide Unicode code point. */
+ *decomposition = element & 0x3ffff;
+ /* Bit 23 tells whether there are more elements, */
+ if ((element & (1 << 23)) == 0)
+ break;
+ p += 3;
+ element = (p[0] << 16) | (p[1] << 8) | p[2];
+ decomposition++;
+ length++;
+ }
+ return length;
+ }
+ }
+ return -1;
+}
diff --git a/gnulib/lib/uninorm/nfc.c b/gnulib/lib/uninorm/nfc.c
new file mode 100644
index 0000000..cd9590b
--- /dev/null
+++ b/gnulib/lib/uninorm/nfc.c
@@ -0,0 +1,31 @@
+/* Unicode Normalization Form C.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+const struct unicode_normalization_form uninorm_nfc =
+ {
+ NF_IS_COMPOSING,
+ uc_canonical_decomposition,
+ uc_composition,
+ &uninorm_nfd
+ };
diff --git a/gnulib/lib/uninorm/nfd.c b/gnulib/lib/uninorm/nfd.c
new file mode 100644
index 0000000..875883e
--- /dev/null
+++ b/gnulib/lib/uninorm/nfd.c
@@ -0,0 +1,31 @@
+/* Unicode Normalization Form D.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+
+const struct unicode_normalization_form uninorm_nfd =
+ {
+ 0,
+ uc_canonical_decomposition,
+ NULL,
+ &uninorm_nfd
+ };
diff --git a/gnulib/lib/uninorm/nfkc.c b/gnulib/lib/uninorm/nfkc.c
new file mode 100644
index 0000000..738b6be
--- /dev/null
+++ b/gnulib/lib/uninorm/nfkc.c
@@ -0,0 +1,32 @@
+/* Unicode Normalization Form KC.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+const struct unicode_normalization_form uninorm_nfkc =
+ {
+ NF_IS_COMPAT_DECOMPOSING | NF_IS_COMPOSING,
+ uc_compat_decomposition,
+ uc_composition,
+ &uninorm_nfkd
+ };
diff --git a/gnulib/lib/uninorm/nfkd.c b/gnulib/lib/uninorm/nfkd.c
new file mode 100644
index 0000000..c28bb13
--- /dev/null
+++ b/gnulib/lib/uninorm/nfkd.c
@@ -0,0 +1,32 @@
+/* Unicode Normalization Form KD.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+const struct unicode_normalization_form uninorm_nfkd =
+ {
+ NF_IS_COMPAT_DECOMPOSING,
+ uc_compat_decomposition,
+ NULL,
+ &uninorm_nfkd
+ };
diff --git a/gnulib/lib/uninorm/normalize-internal.h b/gnulib/lib/uninorm/normalize-internal.h
new file mode 100644
index 0000000..9b209c5
--- /dev/null
+++ b/gnulib/lib/uninorm/normalize-internal.h
@@ -0,0 +1,35 @@
+/* Normalization of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "unitypes.h"
+
+/* Complete definition of normalization form descriptor. */
+struct unicode_normalization_form
+{
+ /* Bit mask containing meta-information.
+ This must be the first field. */
+ unsigned int description;
+ #define NF_IS_COMPAT_DECOMPOSING (1 << 0)
+ #define NF_IS_COMPOSING (1 << 1)
+ /* Function that decomposes a Unicode character. */
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition);
+ /* Function that combines two Unicode characters, a starter and another
+ character. */
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2);
+ /* Decomposing variant. */
+ const struct unicode_normalization_form *decomposing_variant;
+};
diff --git a/gnulib/lib/uninorm/u-normalize-internal.h b/gnulib/lib/uninorm/u-normalize-internal.h
new file mode 100644
index 0000000..3b135c7
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normalize-internal.h
@@ -0,0 +1,375 @@
+/* Decomposition and composition of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (uninorm_t nf, const UNIT *s, size_t n,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition) = nf->decomposer;
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2) = nf->composer;
+
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+ /* The buffer for sorting. */
+ #define SORTBUF_PREALLOCATED 64
+ struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED];
+ struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */
+ size_t sortbuf_allocated;
+ size_t sortbuf_count;
+
+ /* Initialize the accumulator. */
+ if (resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ /* Initialize the buffer for sorting. */
+ sortbuf = sortbuf_preallocated;
+ sortbuf_allocated = SORTBUF_PREALLOCATED;
+ sortbuf_count = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ for (;;)
+ {
+ int count;
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int decomposed_count;
+ int i;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character. */
+ count = U_MBTOUC_UNSAFE (&decomposed[0], s, s_end - s);
+ decomposed_count = 1;
+
+ /* Decompose it, recursively.
+ It would be possible to precompute the recursive decomposition
+ and store it in a table. But this would significantly increase
+ the size of the decomposition tables, because for example for
+ U+1FC1 the recursive canonical decomposition and the recursive
+ compatibility decomposition are different. */
+ {
+ int curr;
+
+ for (curr = 0; curr < decomposed_count; )
+ {
+ /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e.
+ all elements are atomic. */
+ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int curr_decomposed_count;
+
+ curr_decomposed_count = decomposer (decomposed[curr], curr_decomposed);
+ if (curr_decomposed_count >= 0)
+ {
+ /* Move curr_decomposed[0..curr_decomposed_count-1] over
+ decomposed[curr], making room. It's not worth using
+ memcpy() here, since the counts are so small. */
+ int shift = curr_decomposed_count - 1;
+
+ if (shift < 0)
+ abort ();
+ if (shift > 0)
+ {
+ int j;
+
+ decomposed_count += shift;
+ if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH)
+ abort ();
+ for (j = decomposed_count - 1 - shift; j > curr; j--)
+ decomposed[j + shift] = decomposed[j];
+ }
+ for (; shift >= 0; shift--)
+ decomposed[curr + shift] = curr_decomposed[shift];
+ }
+ else
+ {
+ /* decomposed[curr] is atomic. */
+ curr++;
+ }
+ }
+ }
+ }
+ else
+ {
+ count = 0;
+ decomposed_count = 0;
+ }
+
+ i = 0;
+ for (;;)
+ {
+ ucs4_t uc;
+ int ccc;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character from the decomposition. */
+ if (i == decomposed_count)
+ break;
+ uc = decomposed[i];
+ ccc = uc_combining_class (uc);
+ }
+ else
+ {
+ /* End of string reached. */
+ uc = 0;
+ ccc = 0;
+ }
+
+ if (ccc == 0)
+ {
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ if (s < s_end && sortbuf_count == 1)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, uc);
+ if (combined)
+ {
+ uc = combined;
+ ccc = 0;
+ /* uc could be further combined with subsequent
+ characters. So don't put it into sortbuf[0] in
+ this round, only in the next round. */
+ sortbuf_count = 0;
+ }
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+
+ /* sortbuf is now empty. */
+ sortbuf_count = 0;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ /* Append (uc, ccc) to sortbuf. */
+ if (sortbuf_count == sortbuf_allocated)
+ {
+ struct ucs4_with_ccc *new_sortbuf;
+
+ sortbuf_allocated = 2 * sortbuf_allocated;
+ if (sortbuf_allocated < sortbuf_count) /* integer overflow? */
+ abort ();
+ new_sortbuf =
+ (struct ucs4_with_ccc *) malloc (2 * sortbuf_allocated * sizeof (struct ucs4_with_ccc));
+ memcpy (new_sortbuf, sortbuf,
+ sortbuf_count * sizeof (struct ucs4_with_ccc));
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ sortbuf = new_sortbuf;
+ }
+ sortbuf[sortbuf_count].code = uc;
+ sortbuf[sortbuf_count].ccc = ccc;
+ sortbuf_count++;
+
+ i++;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ s += count;
+ }
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (sortbuf_count > 0)
+ abort ();
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ if (result != resultbuf)
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/uninorm/u-normcmp.h b/gnulib/lib/uninorm/u-normcmp.h
new file mode 100644
index 0000000..62f48ca
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normcmp.h
@@ -0,0 +1,64 @@
+/* Normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ uninorm_t nf, int *resultp)
+{
+ UNIT buf1[2048 / sizeof (UNIT)];
+ UNIT buf2[2048 / sizeof (UNIT)];
+ UNIT *norms1;
+ size_t norms1_length;
+ UNIT *norms2;
+ size_t norms2_length;
+ int cmp;
+
+ /* Normalize S1. */
+ norms1_length = sizeof (buf1) / sizeof (UNIT);
+ norms1 = U_NORMALIZE (nf, s1, n1, buf1, &norms1_length);
+ if (norms1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize S2. */
+ norms2_length = sizeof (buf2) / sizeof (UNIT);
+ norms2 = U_NORMALIZE (nf, s2, n2, buf2, &norms2_length);
+ if (norms2 == NULL)
+ {
+ if (norms1 != buf1)
+ {
+ int saved_errno = errno;
+ free (norms1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the normalized strings. */
+ cmp = U_CMP2 (norms1, norms1_length, norms2, norms2_length);
+ if (cmp > 0)
+ cmp = 1;
+ else if (cmp < 0)
+ cmp = -1;
+
+ if (norms2 != buf2)
+ free (norms2);
+ if (norms1 != buf1)
+ free (norms1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/u-normcoll.h b/gnulib/lib/uninorm/u-normcoll.h
new file mode 100644
index 0000000..fa21549
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normcoll.h
@@ -0,0 +1,65 @@
+/* Locale dependent, normalization insensitive comparison of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2,
+ uninorm_t nf, int *resultp)
+{
+ char buf1[2048];
+ char buf2[2048];
+ char *transformed1;
+ size_t transformed1_length;
+ char *transformed2;
+ size_t transformed2_length;
+ int cmp;
+
+ /* Normalize and transform S1. */
+ transformed1_length = sizeof (buf1);
+ transformed1 = U_NORMXFRM (s1, n1, nf, buf1, &transformed1_length);
+ if (transformed1 == NULL)
+ /* errno is set here. */
+ return -1;
+
+ /* Normalize and transform S2. */
+ transformed2_length = sizeof (buf2);
+ transformed2 = U_NORMXFRM (s2, n2, nf, buf2, &transformed2_length);
+ if (transformed2 == NULL)
+ {
+ if (transformed1 != buf1)
+ {
+ int saved_errno = errno;
+ free (transformed1);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ /* Compare the transformed strings. */
+ cmp = memcmp2 (transformed1, transformed1_length,
+ transformed2, transformed2_length);
+ if (cmp < 0)
+ cmp = -1;
+ else if (cmp > 0)
+ cmp = 1;
+
+ if (transformed2 != buf2)
+ free (transformed2);
+ if (transformed1 != buf1)
+ free (transformed1);
+ *resultp = cmp;
+ return 0;
+}
diff --git a/gnulib/lib/uninorm/u-normxfrm.h b/gnulib/lib/uninorm/u-normxfrm.h
new file mode 100644
index 0000000..eb6920a
--- /dev/null
+++ b/gnulib/lib/uninorm/u-normxfrm.h
@@ -0,0 +1,87 @@
+/* Locale dependent transformation for comparison of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+char *
+FUNC (const UNIT *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp)
+{
+ UNIT normsbuf[2048 / sizeof (UNIT)];
+ UNIT *norms;
+ size_t norms_length;
+ char convsbuf[2048];
+ char *convs;
+ size_t convs_length;
+ char *result;
+
+ /* Normalize the Unicode string. */
+ norms_length = sizeof (normsbuf) / sizeof (UNIT);
+ norms = U_NORMALIZE (nf, s, n, normsbuf, &norms_length);
+ if (norms == NULL)
+ /* errno is set here. */
+ return NULL;
+
+ /* Convert it to locale encoding. */
+ convs_length = sizeof (convsbuf) - 1;
+ convs = U_CONV_TO_ENCODING (locale_charset (),
+ iconveh_error,
+ norms, norms_length,
+ NULL,
+ convsbuf, &convs_length);
+ if (convs == NULL)
+ {
+ if (norms != normsbuf)
+ {
+ int saved_errno = errno;
+ free (norms);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (norms != normsbuf)
+ free (norms);
+
+ /* Ensure one more byte is available. */
+ if (convs != convsbuf)
+ {
+ char *memory = (char *) realloc (convs, convs_length + 1);
+ if (memory == NULL)
+ {
+ free (convs);
+ errno = ENOMEM;
+ return NULL;
+ }
+ convs = memory;
+ }
+
+ /* Apply locale dependent transformations for comparison. */
+ result = amemxfrm (convs, convs_length, resultbuf, lengthp);
+ if (result == NULL)
+ {
+ if (convs != convsbuf)
+ {
+ int saved_errno = errno;
+ free (convs);
+ errno = saved_errno;
+ }
+ return NULL;
+ }
+
+ if (convs != convsbuf)
+ free (convs);
+ return result;
+}
diff --git a/gnulib/lib/uninorm/u16-normalize.c b/gnulib/lib/uninorm/u16-normalize.c
new file mode 100644
index 0000000..db2ed8b
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u16_normalize
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#define U_UCTOMB u16_uctomb
+#define U_CPY u16_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u16-normcmp.c b/gnulib/lib/uninorm/u16-normcmp.c
new file mode 100644
index 0000000..8ce3666
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u16_normcmp
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CMP2 u16_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u16-normcoll.c b/gnulib/lib/uninorm/u16-normcoll.c
new file mode 100644
index 0000000..fc806c7
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u16_normcoll
+#define UNIT uint16_t
+#define U_NORMXFRM u16_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u16-normxfrm.c b/gnulib/lib/uninorm/u16-normxfrm.c
new file mode 100644
index 0000000..3d22cf6
--- /dev/null
+++ b/gnulib/lib/uninorm/u16-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u16_normxfrm
+#define UNIT uint16_t
+#define U_NORMALIZE u16_normalize
+#define U_CONV_TO_ENCODING u16_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/u32-normalize.c b/gnulib/lib/uninorm/u32-normalize.c
new file mode 100644
index 0000000..4745fb9
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u32_normalize
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#define U_UCTOMB u32_uctomb
+#define U_CPY u32_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u32-normcmp.c b/gnulib/lib/uninorm/u32-normcmp.c
new file mode 100644
index 0000000..3a751ee
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u32_normcmp
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CMP2 u32_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u32-normcoll.c b/gnulib/lib/uninorm/u32-normcoll.c
new file mode 100644
index 0000000..7d8719e
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u32_normcoll
+#define UNIT uint32_t
+#define U_NORMXFRM u32_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u32-normxfrm.c b/gnulib/lib/uninorm/u32-normxfrm.c
new file mode 100644
index 0000000..0f29116
--- /dev/null
+++ b/gnulib/lib/uninorm/u32-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u32_normxfrm
+#define UNIT uint32_t
+#define U_NORMALIZE u32_normalize
+#define U_CONV_TO_ENCODING u32_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/u8-normalize.c b/gnulib/lib/uninorm/u8-normalize.c
new file mode 100644
index 0000000..9bb52c8
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+#define FUNC u8_normalize
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#include "u-normalize-internal.h"
diff --git a/gnulib/lib/uninorm/u8-normcmp.c b/gnulib/lib/uninorm/u8-normcmp.c
new file mode 100644
index 0000000..6ae77a2
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normcmp.c
@@ -0,0 +1,33 @@
+/* Normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "minmax.h"
+#include "unistr.h"
+
+#define FUNC u8_normcmp
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CMP2 u8_cmp2
+#include "u-normcmp.h"
diff --git a/gnulib/lib/uninorm/u8-normcoll.c b/gnulib/lib/uninorm/u8-normcoll.c
new file mode 100644
index 0000000..8184b21
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normcoll.c
@@ -0,0 +1,31 @@
+/* Locale dependent, normalization insensitive comparison of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "memcmp2.h"
+
+#define FUNC u8_normcoll
+#define UNIT uint8_t
+#define U_NORMXFRM u8_normxfrm
+#include "u-normcoll.h"
diff --git a/gnulib/lib/uninorm/u8-normxfrm.c b/gnulib/lib/uninorm/u8-normxfrm.c
new file mode 100644
index 0000000..3236444
--- /dev/null
+++ b/gnulib/lib/uninorm/u8-normxfrm.c
@@ -0,0 +1,34 @@
+/* Locale dependent transformation for comparison of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "localcharset.h"
+#include "uniconv.h"
+#include "amemxfrm.h"
+
+#define FUNC u8_normxfrm
+#define UNIT uint8_t
+#define U_NORMALIZE u8_normalize
+#define U_CONV_TO_ENCODING u8_conv_to_encoding
+#include "u-normxfrm.h"
diff --git a/gnulib/lib/uninorm/uninorm-filter.c b/gnulib/lib/uninorm/uninorm-filter.c
new file mode 100644
index 0000000..6d7e86f
--- /dev/null
+++ b/gnulib/lib/uninorm/uninorm-filter.c
@@ -0,0 +1,367 @@
+/* Stream-based normalization of Unicode strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "decompose-internal.h"
+
+
+struct uninorm_filter
+{
+ /* Characteristics of the normalization form. */
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition);
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2);
+
+ /* The encapsulated stream. */
+ int (*stream_func) (void *stream_data, ucs4_t uc);
+ void *stream_data;
+
+ /* The buffer for sorting. */
+ #define SORTBUF_PREALLOCATED 64
+ struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED];
+ struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */
+ size_t sortbuf_allocated;
+ size_t sortbuf_count;
+};
+
+struct uninorm_filter *
+uninorm_filter_create (uninorm_t nf,
+ int (*stream_func) (void *stream_data, ucs4_t uc),
+ void *stream_data)
+{
+ struct uninorm_filter *filter =
+ (struct uninorm_filter *) malloc (sizeof (struct uninorm_filter));
+
+ if (filter == NULL)
+ /* errno is ENOMEM. */
+ return NULL;
+
+ filter->decomposer = nf->decomposer;
+ filter->composer = nf->composer;
+ filter->stream_func = stream_func;
+ filter->stream_data = stream_data;
+ filter->sortbuf = filter->sortbuf_preallocated;
+ filter->sortbuf_allocated = SORTBUF_PREALLOCATED;
+ filter->sortbuf_count = 0;
+
+ return filter;
+}
+
+int
+uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc_arg)
+{
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int decomposed_count;
+
+ /* Accept the next character. */
+ decomposed[0] = uc_arg;
+ decomposed_count = 1;
+
+ /* Decompose it, recursively.
+ It would be possible to precompute the recursive decomposition
+ and store it in a table. But this would significantly increase
+ the size of the decomposition tables, because for example for
+ U+1FC1 the recursive canonical decomposition and the recursive
+ compatibility decomposition are different. */
+ {
+ int curr;
+
+ for (curr = 0; curr < decomposed_count; )
+ {
+ /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e.
+ all elements are atomic. */
+ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int curr_decomposed_count;
+
+ curr_decomposed_count =
+ filter->decomposer (decomposed[curr], curr_decomposed);
+ if (curr_decomposed_count >= 0)
+ {
+ /* Move curr_decomposed[0..curr_decomposed_count-1] over
+ decomposed[curr], making room. It's not worth using
+ memcpy() here, since the counts are so small. */
+ int shift = curr_decomposed_count - 1;
+
+ if (shift < 0)
+ abort ();
+ if (shift > 0)
+ {
+ int j;
+
+ decomposed_count += shift;
+ if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH)
+ abort ();
+ for (j = decomposed_count - 1 - shift; j > curr; j--)
+ decomposed[j + shift] = decomposed[j];
+ }
+ for (; shift >= 0; shift--)
+ decomposed[curr + shift] = curr_decomposed[shift];
+ }
+ else
+ {
+ /* decomposed[curr] is atomic. */
+ curr++;
+ }
+ }
+ }
+
+ {
+ /* Cache sortbuf and sortbuf_count in local register variables. */
+ struct ucs4_with_ccc * const sortbuf = filter->sortbuf;
+ size_t sortbuf_count = filter->sortbuf_count;
+ int i;
+
+ for (i = 0; i < decomposed_count; i++)
+ {
+ /* Fetch the next character from the decomposition. */
+ ucs4_t uc = decomposed[i];
+ int ccc = uc_combining_class (uc);
+
+ if (ccc == 0)
+ {
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (filter->composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ if (sortbuf_count == 1)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, uc);
+ if (combined)
+ {
+ uc = combined;
+ ccc = 0;
+ /* uc could be further combined with subsequent
+ characters. So don't put it into sortbuf[0] in
+ this round, only in the next round. */
+ sortbuf_count = 0;
+ }
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Output muc to the encapsulated stream. */
+ int ret = filter->stream_func (filter->stream_data, muc);
+ if (ret < 0)
+ {
+ /* errno is set here. */
+ filter->sortbuf_count = 0;
+ return -1;
+ }
+ }
+
+ /* sortbuf is now empty. */
+ sortbuf_count = 0;
+ }
+
+ /* Append (uc, ccc) to sortbuf. */
+ if (sortbuf_count == filter->sortbuf_allocated)
+ {
+ struct ucs4_with_ccc *new_sortbuf;
+
+ filter->sortbuf_allocated = 2 * filter->sortbuf_allocated;
+ if (filter->sortbuf_allocated < sortbuf_count) /* integer overflow? */
+ abort ();
+ new_sortbuf =
+ (struct ucs4_with_ccc *)
+ malloc (2 * filter->sortbuf_allocated * sizeof (struct ucs4_with_ccc));
+ memcpy (new_sortbuf, filter->sortbuf,
+ sortbuf_count * sizeof (struct ucs4_with_ccc));
+ if (filter->sortbuf != filter->sortbuf_preallocated)
+ free (filter->sortbuf);
+ filter->sortbuf = new_sortbuf;
+ }
+ filter->sortbuf[sortbuf_count].code = uc;
+ filter->sortbuf[sortbuf_count].ccc = ccc;
+ sortbuf_count++;
+ }
+
+ filter->sortbuf_count = sortbuf_count;
+ }
+
+ return 0;
+}
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream.
+ Return 0 if successful, or -1 with errno set upon failure.
+ Note! If after calling this function, additional characters are written
+ into the filter, the resulting character sequence in the encapsulated stream
+ will not necessarily be normalized. */
+int
+uninorm_filter_flush (struct uninorm_filter *filter)
+{
+ /* Cache sortbuf and sortbuf_count in local register variables. */
+ struct ucs4_with_ccc * const sortbuf = filter->sortbuf;
+ size_t sortbuf_count = filter->sortbuf_count;
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (filter->composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ filter->composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Output muc to the encapsulated stream. */
+ int ret = filter->stream_func (filter->stream_data, muc);
+ if (ret < 0)
+ {
+ /* errno is set here. */
+ filter->sortbuf_count = 0;
+ return -1;
+ }
+ }
+
+ /* sortbuf is now empty. */
+ filter->sortbuf_count = 0;
+
+ return 0;
+}
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream, then close and free the filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+int
+uninorm_filter_free (struct uninorm_filter *filter)
+{
+ int ret = uninorm_filter_flush (filter);
+
+ if (ret < 0)
+ /* errno is set here. */
+ return -1;
+
+ if (filter->sortbuf_count > 0)
+ abort ();
+ if (filter->sortbuf != filter->sortbuf_preallocated)
+ free (filter->sortbuf);
+ free (filter);
+
+ return 0;
+}
diff --git a/gnulib/lib/unistd--.h b/gnulib/lib/unistd--.h
new file mode 100644
index 0000000..27307c8
--- /dev/null
+++ b/gnulib/lib/unistd--.h
@@ -0,0 +1,32 @@
+/* Like unistd.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#undef dup
+#define dup dup_safer
+
+#undef pipe
+#define pipe pipe_safer
+
+#if GNULIB_PIPE2_SAFER
+# undef pipe2
+# define pipe2 pipe2_safer
+#endif
diff --git a/gnulib/lib/unistd-safer.h b/gnulib/lib/unistd-safer.h
new file mode 100644
index 0000000..14f537f
--- /dev/null
+++ b/gnulib/lib/unistd-safer.h
@@ -0,0 +1,31 @@
+/* Invoke unistd-like functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+int dup_safer (int);
+int fd_safer (int);
+int pipe_safer (int[2]);
+
+#if GNULIB_FD_SAFER_FLAG
+int dup_safer_flag (int, int);
+int fd_safer_flag (int, int);
+#endif
+
+#if GNULIB_PIPE2_SAFER
+int pipe2_safer (int[2], int);
+#endif
diff --git a/gnulib/lib/unistd.in.h b/gnulib/lib/unistd.in.h
new file mode 100644
index 0000000..617eb79
--- /dev/null
+++ b/gnulib/lib/unistd.in.h
@@ -0,0 +1,1498 @@
+/* Substitute for and wrapper around <unistd.h>.
+ Copyright (C) 2003-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Special invocation convention:
+ - On mingw, several headers, including <winsock2.h>, include <unistd.h>,
+ but we need to ensure that both the system <unistd.h> and <winsock2.h>
+ are completely included before we replace gethostname. */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+ && !defined _GL_WINSOCK2_H_WITNESS && defined _WINSOCK2_H
+/* <unistd.h> is being indirectly included for the first time from
+ <winsock2.h>; avoid declaring any overrides. */
+# if @HAVE_UNISTD_H@
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+# else
+# error unexpected; report this to bug-gnulib@gnu.org
+# endif
+# define _GL_WINSOCK2_H_WITNESS
+
+/* Normal invocation. */
+#elif !defined _@GUARD_PREFIX@_UNISTD_H
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UNISTD_H@
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+#endif
+
+/* Get all possible declarations of gethostname(). */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+ && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
+#define _@GUARD_PREFIX@_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
+#include <stddef.h>
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+ || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
+ && defined __CYGWIN__)) \
+ && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 declares unlinkat in <fcntl.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) && defined __CYGWIN__ \
+ && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>. */
+/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
+ <unistd.h>. */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdlib.h>
+#endif
+
+/* Native Windows platforms declare chdir, getcwd, rmdir in
+ <io.h> and/or <direct.h>, not in <unistd.h>. */
+#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \
+ || defined GNULIB_POSIXCHECK) \
+ && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# include <io.h> /* mingw32, mingw64 */
+# include <direct.h> /* mingw64, MSVC 9 */
+#endif
+
+/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
+ NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
+ || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
+ && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+/* MSVC defines off_t in <sys/types.h>. */
+#if !@HAVE_UNISTD_H@
+/* Get off_t. */
+# include <sys/types.h>
+#endif
+
+#if (@GNULIB_READ@ || @GNULIB_WRITE@ \
+ || @GNULIB_READLINK@ || @GNULIB_READLINKAT@ \
+ || @GNULIB_PREAD@ || @GNULIB_PWRITE@ || defined GNULIB_POSIXCHECK)
+/* Get ssize_t. */
+# include <sys/types.h>
+#endif
+
+/* Get getopt(), optarg, optind, opterr, optopt.
+ But avoid namespace pollution on glibc systems. */
+#if @GNULIB_UNISTD_H_GETOPT@ && !defined __GLIBC__ && !defined _GL_SYSTEM_GETOPT
+# include <getopt.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+
+/* OS/2 EMX lacks these macros. */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist. */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions. */
+
+
+#if defined GNULIB_POSIXCHECK
+/* The access() function is a security risk. */
+_GL_WARN_ON_USE (access, "the access function is a security risk - "
+ "use the gnulib module faccessat instead");
+#endif
+
+
+#if @GNULIB_CHDIR@
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIASWARN (chdir);
+#elif defined GNULIB_POSIXCHECK
+# undef chdir
+# if HAVE_RAW_DECL_CHDIR
+_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
+ "use gnulib module chdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html. */
+# if @REPLACE_CHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chown
+# define chown rpl_chown
+# endif
+_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
+# else
+# if !@HAVE_CHOWN@
+_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
+# endif
+_GL_CXXALIASWARN (chown);
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+ "doesn't treat a uid or gid of -1 on some systems - "
+ "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close rpl_close
+# endif
+_GL_FUNCDECL_RPL (close, int, (int fd));
+_GL_CXXALIAS_RPL (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared. */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+ "use gnulib module close for portability");
+#endif
+
+
+#if @GNULIB_DUP@
+# if @REPLACE_DUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup rpl_dup
+# endif
+_GL_FUNCDECL_RPL (dup, int, (int oldfd));
+_GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#elif defined GNULIB_POSIXCHECK
+# undef dup
+# if HAVE_RAW_DECL_DUP
+_GL_WARN_ON_USE (dup, "dup is unportable - "
+ "use gnulib module dup for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
+ NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>. */
+# if @REPLACE_DUP2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup2 rpl_dup2
+# endif
+_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
+_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
+# else
+# if !@HAVE_DUP2@
+_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+ "use gnulib module dup2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+ specified flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
+# if @HAVE_DUP3@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup3 rpl_dup3
+# endif
+_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
+# else
+_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+_GL_CXXALIASWARN (dup3);
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+ "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values. An array of strings of the form
+ "VARIABLE=VALUE", terminated with a NULL. */
+# if defined __APPLE__ && defined __MACH__
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron ())
+# else
+# ifdef __cplusplus
+extern "C" {
+# endif
+extern char **environ;
+# ifdef __cplusplus
+}
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+static inline char ***
+rpl_environ (void)
+{
+ return &environ;
+}
+_GL_WARN_ON_USE (rpl_environ, "environ is unportable - "
+ "use gnulib module environ for portability");
+# undef environ
+# define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+ the current process. */
+# if !@HAVE_EUIDACCESS@
+_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
+_GL_CXXALIASWARN (euidaccess);
+# if defined GNULIB_POSIXCHECK
+/* Like access(), this function is a security risk. */
+_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
+ "use the gnulib module faccessat instead");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+ "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if !@HAVE_FACCESSAT@
+_GL_FUNCDECL_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag));
+_GL_CXXALIASWARN (faccessat);
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+ "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+/* Change the process' current working directory to the directory on which
+ the given file descriptor is open.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>. */
+# if ! @HAVE_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata. */
+_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
+ _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_fd (int fd);
+_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
+_GL_EXTERN_C const char *_gl_directory_name (int fd);
+
+# else
+# if !@HAVE_DECL_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+# endif
+# endif
+_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
+_GL_CXXALIASWARN (fchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+ "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fchownat
+# define fchownat rpl_fchownat
+# endif
+_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# else
+# if !@HAVE_FCHOWNAT@
+_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# endif
+_GL_CXXALIASWARN (fchownat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FDATASYNC@
+/* Synchronize changes to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>. */
+# if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@
+_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
+_GL_CXXALIASWARN (fdatasync);
+#elif defined GNULIB_POSIXCHECK
+# undef fdatasync
+# if HAVE_RAW_DECL_FDATASYNC
+_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
+ "use gnulib module fdatasync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes, including metadata, to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>. */
+# if !@HAVE_FSYNC@
+_GL_FUNCDECL_SYS (fsync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fsync, int, (int fd));
+_GL_CXXALIASWARN (fsync);
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+ "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>. */
+# if !@HAVE_FTRUNCATE@
+_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
+_GL_CXXALIASWARN (ftruncate);
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+ "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+ of BUF.
+ Return BUF if successful, or NULL if the directory couldn't be determined
+ or SIZE was too small.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
+ Additionally, the gnulib module 'getcwd' guarantees the following GNU
+ extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+ is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+# if @REPLACE_GETCWD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getcwd rpl_getcwd
+# endif
+_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
+_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# else
+/* Need to cast, because on mingw, the second parameter is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+ "use gnulib module getcwd for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @REPLACE_GETDOMAINNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdomainname
+# define getdomainname rpl_getdomainname
+# endif
+_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
+# else
+# if !@HAVE_DECL_GETDOMAINNAME@
+_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (getdomainname);
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+ "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+ In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
+# if !@HAVE_GETDTABLESIZE@
+_GL_FUNCDECL_SYS (getdtablesize, int, (void));
+# endif
+_GL_CXXALIAS_SYS (getdtablesize, int, (void));
+_GL_CXXALIASWARN (getdtablesize);
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+ "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+ It is unspecified whether the effective group id is in the list.
+ If N is 0, return the group count; otherwise, N describes how many
+ entries are available in GROUPS. Return -1 and set errno if N is
+ not 0 and not large enough. Fails with ENOSYS on some systems. */
+# if @REPLACE_GETGROUPS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getgroups
+# define getgroups rpl_getgroups
+# endif
+_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
+_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
+# else
+# if !@HAVE_GETGROUPS@
+_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIASWARN (getgroups);
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+ "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+ WARNING! The host name may or may not be fully qualified.
+
+ Put up to LEN bytes of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the host name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname rpl_gethostname
+# endif
+_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
+# else
+# if !@HAVE_GETHOSTNAME@
+_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
+ parameter is
+ int len. */
+_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (gethostname);
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+ "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found. Upon error,
+ returns NULL with errno set.
+
+ See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if !@HAVE_GETLOGIN@
+_GL_FUNCDECL_SYS (getlogin, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getlogin, char *, (void));
+_GL_CXXALIASWARN (getlogin);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+ "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+ The array pointed to by NAME has room for SIZE bytes.
+
+ Returns 0 if successful. Upon error, an error number is returned, or -1 in
+ the case that the login name cannot be found but no specific error is
+ provided (this case is hopefully rare but is left open by the POSIX spec).
+
+ See <http://www.opengroup.org/susv3xsh/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if @REPLACE_GETLOGIN_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getlogin_r rpl_getlogin_r
+# endif
+_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
+# else
+# if !@HAVE_DECL_GETLOGIN_R@
+_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 systems, the second argument is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
+# endif
+_GL_CXXALIASWARN (getlogin_r);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+ "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize rpl_getpagesize
+# endif
+_GL_FUNCDECL_RPL (getpagesize, int, (void));
+_GL_CXXALIAS_RPL (getpagesize, int, (void));
+# else
+# if !@HAVE_GETPAGESIZE@
+# if !defined getpagesize
+/* This is for POSIX systems. */
+# if !defined _gl_getpagesize && defined _SC_PAGESIZE
+# if ! (defined __VMS && __VMS_VER < 70000000)
+# define _gl_getpagesize() sysconf (_SC_PAGESIZE)
+# endif
+# endif
+/* This is for older VMS. */
+# if !defined _gl_getpagesize && defined __VMS
+# ifdef __ALPHA
+# define _gl_getpagesize() 8192
+# else
+# define _gl_getpagesize() 512
+# endif
+# endif
+/* This is for BeOS. */
+# if !defined _gl_getpagesize && @HAVE_OS_H@
+# include <OS.h>
+# if defined B_PAGE_SIZE
+# define _gl_getpagesize() B_PAGE_SIZE
+# endif
+# endif
+/* This is for AmigaOS4.0. */
+# if !defined _gl_getpagesize && defined __amigaos4__
+# define _gl_getpagesize() 2048
+# endif
+/* This is for older Unix systems. */
+# if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define _gl_getpagesize() EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif
+# define _gl_getpagesize() (NBPG * CLSIZE)
+# else
+# ifdef NBPC
+# define _gl_getpagesize() NBPC
+# endif
+# endif
+# endif
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize() _gl_getpagesize ()
+# else
+# if !GNULIB_defined_getpagesize_function
+static inline int
+getpagesize ()
+{
+ return _gl_getpagesize ();
+}
+# define GNULIB_defined_getpagesize_function 1
+# endif
+# endif
+# endif
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */
+_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
+# endif
+# if @HAVE_DECL_GETPAGESIZE@
+_GL_CXXALIASWARN (getpagesize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+ "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+ the list has been reached. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (getusershell, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getusershell, char *, (void));
+_GL_CXXALIASWARN (getusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Rewind to pointer that is advanced at each getusershell() call. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (setusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (setusershell, void, (void));
+_GL_CXXALIASWARN (setusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Free the pointer that is advanced at each getusershell() call and
+ associated resources. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (endusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (endusershell, void, (void));
+_GL_CXXALIASWARN (endusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GROUP_MEMBER@
+/* Determine whether group id is in calling user's group list. */
+# if !@HAVE_GROUP_MEMBER@
+_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
+# endif
+_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
+_GL_CXXALIASWARN (group_member);
+#elif defined GNULIB_POSIXCHECK
+# undef group_member
+# if HAVE_RAW_DECL_GROUP_MEMBER
+_GL_WARN_ON_USE (group_member, "group_member is unportable - "
+ "use gnulib module group-member for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Do not follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>. */
+# if @REPLACE_LCHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lchown
+# define lchown rpl_lchown
+# endif
+_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
+# else
+# if !@HAVE_LCHOWN@
+_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
+# endif
+_GL_CXXALIASWARN (lchown);
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+ "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+/* Create a new hard link for an existing file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>. */
+# if @REPLACE_LINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define link rpl_link
+# endif
+_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
+# else
+# if !@HAVE_LINK@
+_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
+# endif
+_GL_CXXALIASWARN (link);
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+ "use gnulib module link for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINKAT@
+/* Create a new hard link for an existing file, relative to two
+ directories. FLAG controls whether symlinks are followed.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if @REPLACE_LINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef linkat
+# define linkat rpl_linkat
+# endif
+_GL_FUNCDECL_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# else
+# if !@HAVE_LINKAT@
+_GL_FUNCDECL_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# endif
+_GL_CXXALIASWARN (linkat);
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+ "use gnulib module linkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+ Return the new offset if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>. */
+# if @REPLACE_LSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lseek rpl_lseek
+# endif
+_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+ "systems - use gnulib module lseek for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE@
+/* Create a pipe, defaulting to O_BINARY mode.
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure. */
+# if !@HAVE_PIPE@
+_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
+_GL_CXXALIASWARN (pipe);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe
+# if HAVE_RAW_DECL_PIPE
+_GL_WARN_ON_USE (pipe, "pipe is unportable - "
+ "use gnulib module pipe-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+ pipe and the write-end of the pipe.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure.
+ See also the Linux man page at
+ <http://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
+# if @HAVE_PIPE2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define pipe2 rpl_pipe2
+# endif
+_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
+# else
+_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
+# endif
+_GL_CXXALIASWARN (pipe2);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+ "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+ Return the number of bytes placed into BUF if successful, otherwise
+ set errno and return -1. 0 indicates EOF.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>. */
+# if @REPLACE_PREAD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pread
+# define pread rpl_pread
+# endif
+_GL_FUNCDECL_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PREAD@
+_GL_FUNCDECL_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pread);
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+ "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PWRITE@
+/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
+ Return the number of bytes written if successful, otherwise
+ set errno and return -1. 0 indicates nothing written. See the
+ POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>. */
+# if @REPLACE_PWRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pwrite
+# define pwrite rpl_pwrite
+# endif
+_GL_FUNCDECL_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PWRITE@
+_GL_FUNCDECL_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pwrite);
+#elif defined GNULIB_POSIXCHECK
+# undef pwrite
+# if HAVE_RAW_DECL_PWRITE
+_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
+ "use gnulib module pwrite for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READ@
+/* Read up to COUNT bytes from file descriptor FD into the buffer starting
+ at BUF. See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>. */
+# if @REPLACE_READ@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read rpl_read
+# endif
+_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+ unsigned int count
+ and the return type is 'int'. */
+_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#endif
+
+
+#if @GNULIB_READLINK@
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+ bytes of it into BUF. Return the number of bytes placed into BUF if
+ successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
+# if @REPLACE_READLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define readlink rpl_readlink
+# endif
+_GL_FUNCDECL_RPL (readlink, ssize_t,
+ (const char *file, char *buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (readlink, ssize_t,
+ (const char *file, char *buf, size_t bufsize));
+# else
+# if !@HAVE_READLINK@
+_GL_FUNCDECL_SYS (readlink, ssize_t,
+ (const char *file, char *buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (readlink, ssize_t,
+ (const char *file, char *buf, size_t bufsize));
+# endif
+_GL_CXXALIASWARN (readlink);
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+ "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if !@HAVE_READLINKAT@
+_GL_FUNCDECL_SYS (readlinkat, ssize_t,
+ (int fd, char const *file, char *buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (readlinkat, ssize_t,
+ (int fd, char const *file, char *buf, size_t len));
+_GL_CXXALIASWARN (readlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+ "use gnulib module readlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+/* Remove the directory DIR. */
+# if @REPLACE_RMDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define rmdir rpl_rmdir
+# endif
+_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+ "use gnulib module rmdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SETHOSTNAME@
+/* Set the host name of the machine.
+ The host name may or may not be fully qualified.
+
+ Put LEN bytes of NAME into the host name.
+ Return 0 if successful, otherwise, set errno and return -1.
+
+ Platforms with no ability to set the hostname return -1 and set
+ errno = ENOSYS. */
+# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
+_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 11 2011-10, MacOS X 10.5, IRIX 6.5
+ and FreeBSD 6.4 the second parameter is int. On Solaris 11
+ 2011-10, the first parameter is not const. */
+_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
+_GL_CXXALIASWARN (sethostname);
+#elif defined GNULIB_POSIXCHECK
+# undef sethostname
+# if HAVE_RAW_DECL_SETHOSTNAME
+_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
+ "use gnulib module sethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+/* Pause the execution of the current thread for N seconds.
+ Returns the number of seconds left to sleep.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>. */
+# if @REPLACE_SLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sleep
+# define sleep rpl_sleep
+# endif
+_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
+_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
+# else
+# if !@HAVE_SLEEP@
+_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIASWARN (sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+ "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef symlink
+# define symlink rpl_symlink
+# endif
+_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
+# else
+# if !@HAVE_SYMLINK@
+_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
+# endif
+_GL_CXXALIASWARN (symlink);
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+ "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if !@HAVE_SYMLINKAT@
+_GL_FUNCDECL_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file));
+_GL_CXXALIASWARN (symlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+ "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TTYNAME_R@
+/* Store at most BUFLEN characters of the pathname of the terminal FD is
+ open on in BUF. Return 0 on success, otherwise an error number. */
+# if @REPLACE_TTYNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ttyname_r
+# define ttyname_r rpl_ttyname_r
+# endif
+_GL_FUNCDECL_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_TTYNAME_R@
+_GL_FUNCDECL_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# endif
+_GL_CXXALIASWARN (ttyname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ttyname_r
+# if HAVE_RAW_DECL_TTYNAME_R
+_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
+ "use gnulib module ttyname_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink rpl_unlink
+# endif
+_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+ "use gnulib module unlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlinkat
+# define unlinkat rpl_unlinkat
+# endif
+_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
+# else
+# if !@HAVE_UNLINKAT@
+_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
+# endif
+_GL_CXXALIASWARN (unlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+ Returns 0 on completion, or -1 on range error.
+ See the POSIX:2001 specification
+ <http://www.opengroup.org/susv3xsh/usleep.html>. */
+# if @REPLACE_USLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef usleep
+# define usleep rpl_usleep
+# endif
+_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
+_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
+# else
+# if !@HAVE_USLEEP@
+_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIAS_SYS (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIASWARN (usleep);
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+ "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+ See the POSIX:2008 specification
+ <http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>. */
+# if @REPLACE_WRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write rpl_write
+# endif
+_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+ unsigned int count
+ and the return type is 'int'. */
+_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/gnulib/lib/unistdio.in.h b/gnulib/lib/unistdio.in.h
new file mode 100644
index 0000000..8d9cc6f
--- /dev/null
+++ b/gnulib/lib/unistdio.in.h
@@ -0,0 +1,256 @@
+/* Elementary Unicode string functions.
+ Copyright (C) 2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNISTDIO_H
+#define _UNISTDIO_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get FILE. */
+#include <stdio.h>
+
+/* Get va_list. */
+#include <stdarg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* These work like the printf function family.
+ In the format string:
+ The format directive 'U' takes an UTF-8 string (const uint8_t *).
+ The format directive 'lU' takes an UTF-16 string (const uint16_t *).
+ The format directive 'llU' takes an UTF-32 string (const uint32_t *).
+
+ The prefix (ulc_, u8_, u16_, u16_) indicates the type of the resulting
+ string. The prefix 'ulc' stands for "locale encoded".
+
+ An infix 'v' indicates that a va_list is passed instead of multiple
+ arguments.
+
+ The functions *sprintf have a 'buf' argument that is assumed to be large
+ enough. (DANGEROUS! Overflowing the buffer will crash the program.)
+ The functions *snprintf have a 'buf' argument that is assumed to be 'size'
+ units large. (DANGEROUS! The resulting string might be truncated in the
+ middle of a multibyte character.)
+ The functions *asprintf have a 'resultp' argument. The result will be
+ freshly allocated and stored in *resultp.
+ The functions *asnprintf have a (resultbuf, lengthp) argument pair. If
+ resultbuf is not NULL and the result fits into *lengthp units, it is put
+ in resultbuf, and resultbuf is returned. Otherwise, a freshly allocated
+ string is returned. In both cases, *lengthp is set to the length (number
+ of units) of the returned string. In case of error, NULL is returned and
+ errno is set.
+ */
+
+/* ASCII format string, result in locale dependent encoded 'char *'. */
+extern int
+ ulc_sprintf (char *buf,
+ const char *format, ...);
+extern int
+ ulc_snprintf (char *buf, size_t size,
+ const char *format, ...);
+extern int
+ ulc_asprintf (char **resultp,
+ const char *format, ...);
+extern char *
+ ulc_asnprintf (char *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ ulc_vsprintf (char *buf,
+ const char *format, va_list ap);
+extern int
+ ulc_vsnprintf (char *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ ulc_vasprintf (char **resultp,
+ const char *format, va_list ap);
+extern char *
+ ulc_vasnprintf (char *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* ASCII format string, result in UTF-8 format. */
+extern int
+ u8_sprintf (uint8_t *buf,
+ const char *format, ...);
+extern int
+ u8_snprintf (uint8_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u8_asprintf (uint8_t **resultp,
+ const char *format, ...);
+extern uint8_t *
+ u8_asnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u8_vsprintf (uint8_t *buf,
+ const char *format, va_list ap);
+extern int
+ u8_vsnprintf (uint8_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u8_vasprintf (uint8_t **resultp,
+ const char *format, va_list ap);
+extern uint8_t *
+ u8_vasnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-8 format string, result in UTF-8 format. */
+extern int
+ u8_u8_sprintf (uint8_t *buf,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_snprintf (uint8_t *buf, size_t size,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_asprintf (uint8_t **resultp,
+ const uint8_t *format, ...);
+extern uint8_t *
+ u8_u8_asnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const uint8_t *format, ...);
+extern int
+ u8_u8_vsprintf (uint8_t *buf,
+ const uint8_t *format, va_list ap);
+extern int
+ u8_u8_vsnprintf (uint8_t *buf, size_t size,
+ const uint8_t *format, va_list ap);
+extern int
+ u8_u8_vasprintf (uint8_t **resultp,
+ const uint8_t *format, va_list ap);
+extern uint8_t *
+ u8_u8_vasnprintf (uint8_t *resultbuf, size_t *lengthp,
+ const uint8_t *format, va_list ap);
+
+/* ASCII format string, result in UTF-16 format. */
+extern int
+ u16_sprintf (uint16_t *buf,
+ const char *format, ...);
+extern int
+ u16_snprintf (uint16_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u16_asprintf (uint16_t **resultp,
+ const char *format, ...);
+extern uint16_t *
+ u16_asnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u16_vsprintf (uint16_t *buf,
+ const char *format, va_list ap);
+extern int
+ u16_vsnprintf (uint16_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u16_vasprintf (uint16_t **resultp,
+ const char *format, va_list ap);
+extern uint16_t *
+ u16_vasnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-16 format string, result in UTF-16 format. */
+extern int
+ u16_u16_sprintf (uint16_t *buf,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_snprintf (uint16_t *buf, size_t size,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_asprintf (uint16_t **resultp,
+ const uint16_t *format, ...);
+extern uint16_t *
+ u16_u16_asnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const uint16_t *format, ...);
+extern int
+ u16_u16_vsprintf (uint16_t *buf,
+ const uint16_t *format, va_list ap);
+extern int
+ u16_u16_vsnprintf (uint16_t *buf, size_t size,
+ const uint16_t *format, va_list ap);
+extern int
+ u16_u16_vasprintf (uint16_t **resultp,
+ const uint16_t *format, va_list ap);
+extern uint16_t *
+ u16_u16_vasnprintf (uint16_t *resultbuf, size_t *lengthp,
+ const uint16_t *format, va_list ap);
+
+/* ASCII format string, result in UTF-32 format. */
+extern int
+ u32_sprintf (uint32_t *buf,
+ const char *format, ...);
+extern int
+ u32_snprintf (uint32_t *buf, size_t size,
+ const char *format, ...);
+extern int
+ u32_asprintf (uint32_t **resultp,
+ const char *format, ...);
+extern uint32_t *
+ u32_asnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const char *format, ...);
+extern int
+ u32_vsprintf (uint32_t *buf,
+ const char *format, va_list ap);
+extern int
+ u32_vsnprintf (uint32_t *buf, size_t size,
+ const char *format, va_list ap);
+extern int
+ u32_vasprintf (uint32_t **resultp,
+ const char *format, va_list ap);
+extern uint32_t *
+ u32_vasnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const char *format, va_list ap);
+
+/* UTF-32 format string, result in UTF-32 format. */
+extern int
+ u32_u32_sprintf (uint32_t *buf,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_snprintf (uint32_t *buf, size_t size,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_asprintf (uint32_t **resultp,
+ const uint32_t *format, ...);
+extern uint32_t *
+ u32_u32_asnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const uint32_t *format, ...);
+extern int
+ u32_u32_vsprintf (uint32_t *buf,
+ const uint32_t *format, va_list ap);
+extern int
+ u32_u32_vsnprintf (uint32_t *buf, size_t size,
+ const uint32_t *format, va_list ap);
+extern int
+ u32_u32_vasprintf (uint32_t **resultp,
+ const uint32_t *format, va_list ap);
+extern uint32_t *
+ u32_u32_vasnprintf (uint32_t *resultbuf, size_t *lengthp,
+ const uint32_t *format, va_list ap);
+
+/* ASCII format string, output to FILE in locale dependent encoding. */
+extern int
+ ulc_fprintf (FILE *stream,
+ const char *format, ...);
+extern int
+ ulc_vfprintf (FILE *stream,
+ const char *format, va_list ap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTDIO_H */
diff --git a/gnulib/lib/unistdio/u-asnprintf.h b/gnulib/lib/unistdio/u-asnprintf.h
new file mode 100644
index 0000000..7efc4e4
--- /dev/null
+++ b/gnulib/lib/unistdio/u-asnprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+DCHAR_T *
+ASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, const FCHAR_T *format, ...)
+{
+ va_list args;
+ DCHAR_T *result;
+
+ va_start (args, format);
+ result = VASNPRINTF (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-asprintf.h b/gnulib/lib/unistdio/u-asprintf.h
new file mode 100644
index 0000000..38d9829
--- /dev/null
+++ b/gnulib/lib/unistdio/u-asprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+ASPRINTF (DCHAR_T **resultp, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VASPRINTF (resultp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-printf-args.c b/gnulib/lib/unistdio/u-printf-args.c
new file mode 100644
index 0000000..a32991d
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-args.c
@@ -0,0 +1,23 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-args.h"
+
+#include "printf-args.c"
diff --git a/gnulib/lib/unistdio/u-printf-args.h b/gnulib/lib/unistdio/u-printf-args.h
new file mode 100644
index 0000000..feb3f56
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-args.h
@@ -0,0 +1,28 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _U_PRINTF_ARGS_H
+#define _U_PRINTF_ARGS_H
+
+#include "unitypes.h"
+
+/* Parametrization of printf-args.h. */
+#define ENABLE_UNISTDIO 1
+#define PRINTF_FETCHARGS u_printf_fetchargs
+#include "printf-args.h"
+
+#endif /* _U_PRINTF_ARGS_H */
diff --git a/gnulib/lib/unistdio/u-printf-parse.h b/gnulib/lib/unistdio/u-printf-parse.h
new file mode 100644
index 0000000..651c7fe
--- /dev/null
+++ b/gnulib/lib/unistdio/u-printf-parse.h
@@ -0,0 +1,28 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002, 2005, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _U_PRINTF_PARSE_H
+#define _U_PRINTF_PARSE_H
+
+#include "unistdio/u-printf-args.h"
+
+/* Parametrization of printf-parse.h. */
+#undef ENABLE_UNISTDIO
+#define ENABLE_UNISTDIO 1
+#include "printf-parse.h"
+
+#endif /* _U_PRINTF_PARSE_H */
diff --git a/gnulib/lib/unistdio/u-snprintf.h b/gnulib/lib/unistdio/u-snprintf.h
new file mode 100644
index 0000000..8094f49
--- /dev/null
+++ b/gnulib/lib/unistdio/u-snprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+SNPRINTF (DCHAR_T *buf, size_t size, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VSNPRINTF (buf, size, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-sprintf.h b/gnulib/lib/unistdio/u-sprintf.h
new file mode 100644
index 0000000..eb3119d
--- /dev/null
+++ b/gnulib/lib/unistdio/u-sprintf.h
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+SPRINTF (DCHAR_T *buf, const FCHAR_T *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = VSPRINTF (buf, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/gnulib/lib/unistdio/u-vasprintf.h b/gnulib/lib/unistdio/u-vasprintf.h
new file mode 100644
index 0000000..68bc9b5
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vasprintf.h
@@ -0,0 +1,35 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+VASPRINTF (DCHAR_T **resultp, const FCHAR_T *format, va_list args)
+{
+ size_t length;
+ DCHAR_T *result = VASNPRINTF (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (length > INT_MAX)
+ {
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *resultp = result;
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u-vsnprintf.h b/gnulib/lib/unistdio/u-vsnprintf.h
new file mode 100644
index 0000000..977a123
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vsnprintf.h
@@ -0,0 +1,52 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+VSNPRINTF (DCHAR_T *buf, size_t size, const FCHAR_T *format, va_list args)
+{
+ size_t length;
+ DCHAR_T *result;
+
+ if (size == 0)
+ buf = NULL;
+ else
+ length = size;
+ result = VASNPRINTF (buf, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (result != buf)
+ {
+ if (size != 0)
+ {
+ /* The result did not fit into the buffer. Copy the initial segment
+ into the buffer, truncating it if necessary. */
+ size_t n = (length < size ? length : size - 1);
+ DCHAR_CPY (buf, result, n);
+ buf[n] = '\0';
+ }
+ free (result);
+ }
+
+ if (length > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u-vsprintf.h b/gnulib/lib/unistdio/u-vsprintf.h
new file mode 100644
index 0000000..28a0c9b
--- /dev/null
+++ b/gnulib/lib/unistdio/u-vsprintf.h
@@ -0,0 +1,58 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+int
+VSPRINTF (DCHAR_T *buf, const FCHAR_T *format, va_list args)
+{
+ /* Pass an infinite length. But note that *vasnprintf may fail if the buffer
+ argument is larger than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that buf + length wraps around, i.e.
+ (uintptr_t) (buf + length) < (uintptr_t) buf. */
+ size_t length;
+ DCHAR_T *result;
+
+ /* Set length = min (SIZE_MAX, INT_MAX, - (uintptr_t) buf - 1). */
+ length = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (length > (~ (uintptr_t) buf) / sizeof (DCHAR_T))
+ length = (~ (uintptr_t) buf) / sizeof (DCHAR_T);
+
+ result = VASNPRINTF (buf, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ /* The infinite buffer size guarantees that the result is not malloc()ed. */
+ if (result != buf)
+ {
+ /* length is near SIZE_MAX. */
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (length > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ /* Return the number of resulting units, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/unistdio/u16-asnprintf.c b/gnulib/lib/unistdio/u16-asnprintf.c
new file mode 100644
index 0000000..a589f25
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u16_asnprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-asprintf.c b/gnulib/lib/unistdio/u16-asprintf.c
new file mode 100644
index 0000000..d26f5cb
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u16_asprintf
+#define VASPRINTF u16_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u16-printf-parse.c b/gnulib/lib/unistdio/u16-printf-parse.c
new file mode 100644
index 0000000..815e2e2
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u16_printf_parse
+#define CHAR_T uint16_t
+#define DIRECTIVE u16_directive
+#define DIRECTIVES u16_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u16-snprintf.c b/gnulib/lib/unistdio/u16-snprintf.c
new file mode 100644
index 0000000..0ef7c6d
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u16_snprintf
+#define VSNPRINTF u16_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u16-sprintf.c b/gnulib/lib/unistdio/u16-sprintf.c
new file mode 100644
index 0000000..fbacdd4
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u16_sprintf
+#define VSPRINTF u16_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-asnprintf.c b/gnulib/lib/unistdio/u16-u16-asnprintf.c
new file mode 100644
index 0000000..56a86cc
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u16_u16_asnprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-asprintf.c b/gnulib/lib/unistdio/u16-u16-asprintf.c
new file mode 100644
index 0000000..4efeefd
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u16_u16_asprintf
+#define VASPRINTF u16_u16_vasprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-snprintf.c b/gnulib/lib/unistdio/u16-u16-snprintf.c
new file mode 100644
index 0000000..bf74511
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u16_u16_snprintf
+#define VSNPRINTF u16_u16_vsnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-sprintf.c b/gnulib/lib/unistdio/u16-u16-sprintf.c
new file mode 100644
index 0000000..3876b0e
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u16_u16_sprintf
+#define VSPRINTF u16_u16_vsprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vasnprintf.c b/gnulib/lib/unistdio/u16-u16-vasnprintf.c
new file mode 100644
index 0000000..146e55c
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DIRECTIVE u16_directive
+#define DIRECTIVES u16_directives
+#define PRINTF_PARSE u16_printf_parse
+#define DCHAR_T uint16_t
+#define DCHAR_T_IS_UINT16_T 1
+#define DCHAR_CPY u16_cpy
+#define DCHAR_SET u16_set
+#define DCHAR_MBSNLEN u16_mbsnlen
+#define DCHAR_IS_UINT16_T 1
+#define U8_TO_DCHAR u8_to_u16
+#define U32_TO_DCHAR u32_to_u16
+#define DCHAR_CONV_FROM_ENCODING u16_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u16-u16-vasprintf.c b/gnulib/lib/unistdio/u16-u16-vasprintf.c
new file mode 100644
index 0000000..8fd47bc
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u16_u16_vasprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vsnprintf.c b/gnulib/lib/unistdio/u16-u16-vsnprintf.c
new file mode 100644
index 0000000..7b5443b
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u16_u16_vsnprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#define DCHAR_CPY u16_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-u16-vsprintf.c b/gnulib/lib/unistdio/u16-u16-vsprintf.c
new file mode 100644
index 0000000..c6b69a9
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-u16-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u16_u16_vsprintf
+#define VASNPRINTF u16_u16_vasnprintf
+#define FCHAR_T uint16_t
+#define DCHAR_T uint16_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vasnprintf.c b/gnulib/lib/unistdio/u16-vasnprintf.c
new file mode 100644
index 0000000..3c20d6e
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint16_t
+#define DCHAR_T_IS_UINT16_T 1
+#define DCHAR_CPY u16_cpy
+#define DCHAR_SET u16_set
+#define DCHAR_MBSNLEN u16_mbsnlen
+#define DCHAR_IS_UINT16_T 1
+#define U8_TO_DCHAR u8_to_u16
+#define U32_TO_DCHAR u32_to_u16
+#define DCHAR_CONV_FROM_ENCODING u16_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u16-vasprintf.c b/gnulib/lib/unistdio/u16-vasprintf.c
new file mode 100644
index 0000000..5bb1bdb
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u16_vasprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vsnprintf.c b/gnulib/lib/unistdio/u16-vsnprintf.c
new file mode 100644
index 0000000..0add114
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u16_vsnprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#define DCHAR_CPY u16_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u16-vsprintf.c b/gnulib/lib/unistdio/u16-vsprintf.c
new file mode 100644
index 0000000..eee0be7
--- /dev/null
+++ b/gnulib/lib/unistdio/u16-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u16_vsprintf
+#define VASNPRINTF u16_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint16_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u32-asnprintf.c b/gnulib/lib/unistdio/u32-asnprintf.c
new file mode 100644
index 0000000..588b9d8
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u32_asnprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-asprintf.c b/gnulib/lib/unistdio/u32-asprintf.c
new file mode 100644
index 0000000..fffd751
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u32_asprintf
+#define VASPRINTF u32_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u32-printf-parse.c b/gnulib/lib/unistdio/u32-printf-parse.c
new file mode 100644
index 0000000..972f273
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u32_printf_parse
+#define CHAR_T uint32_t
+#define DIRECTIVE u32_directive
+#define DIRECTIVES u32_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u32-snprintf.c b/gnulib/lib/unistdio/u32-snprintf.c
new file mode 100644
index 0000000..bcd4485
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u32_snprintf
+#define VSNPRINTF u32_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u32-sprintf.c b/gnulib/lib/unistdio/u32-sprintf.c
new file mode 100644
index 0000000..a45c0bb
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u32_sprintf
+#define VSPRINTF u32_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-asnprintf.c b/gnulib/lib/unistdio/u32-u32-asnprintf.c
new file mode 100644
index 0000000..b389424
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u32_u32_asnprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-asprintf.c b/gnulib/lib/unistdio/u32-u32-asprintf.c
new file mode 100644
index 0000000..a9869e3
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u32_u32_asprintf
+#define VASPRINTF u32_u32_vasprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-snprintf.c b/gnulib/lib/unistdio/u32-u32-snprintf.c
new file mode 100644
index 0000000..7991ad6
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u32_u32_snprintf
+#define VSNPRINTF u32_u32_vsnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-sprintf.c b/gnulib/lib/unistdio/u32-u32-sprintf.c
new file mode 100644
index 0000000..769aa88
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u32_u32_sprintf
+#define VSPRINTF u32_u32_vsprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vasnprintf.c b/gnulib/lib/unistdio/u32-u32-vasnprintf.c
new file mode 100644
index 0000000..084549e
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DIRECTIVE u32_directive
+#define DIRECTIVES u32_directives
+#define PRINTF_PARSE u32_printf_parse
+#define DCHAR_T uint32_t
+#define DCHAR_T_IS_UINT32_T 1
+#define DCHAR_CPY u32_cpy
+#define DCHAR_SET u32_set
+#define DCHAR_MBSNLEN u32_mbsnlen
+#define DCHAR_IS_UINT32_T 1
+#define U8_TO_DCHAR u8_to_u32
+#define U16_TO_DCHAR u16_to_u32
+#define DCHAR_CONV_FROM_ENCODING u32_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u32-u32-vasprintf.c b/gnulib/lib/unistdio/u32-u32-vasprintf.c
new file mode 100644
index 0000000..3c11874
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u32_u32_vasprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vsnprintf.c b/gnulib/lib/unistdio/u32-u32-vsnprintf.c
new file mode 100644
index 0000000..21ba48d
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u32_u32_vsnprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#define DCHAR_CPY u32_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-u32-vsprintf.c b/gnulib/lib/unistdio/u32-u32-vsprintf.c
new file mode 100644
index 0000000..4f0b4a7
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-u32-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u32_u32_vsprintf
+#define VASNPRINTF u32_u32_vasnprintf
+#define FCHAR_T uint32_t
+#define DCHAR_T uint32_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vasnprintf.c b/gnulib/lib/unistdio/u32-vasnprintf.c
new file mode 100644
index 0000000..7705cdc
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint32_t
+#define DCHAR_T_IS_UINT32_T 1
+#define DCHAR_CPY u32_cpy
+#define DCHAR_SET u32_set
+#define DCHAR_MBSNLEN u32_mbsnlen
+#define DCHAR_IS_UINT32_T 1
+#define U8_TO_DCHAR u8_to_u32
+#define U16_TO_DCHAR u16_to_u32
+#define DCHAR_CONV_FROM_ENCODING u32_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u32-vasprintf.c b/gnulib/lib/unistdio/u32-vasprintf.c
new file mode 100644
index 0000000..32b3979
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u32_vasprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vsnprintf.c b/gnulib/lib/unistdio/u32-vsnprintf.c
new file mode 100644
index 0000000..5d5b159
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u32_vsnprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#define DCHAR_CPY u32_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u32-vsprintf.c b/gnulib/lib/unistdio/u32-vsprintf.c
new file mode 100644
index 0000000..fd0eff9
--- /dev/null
+++ b/gnulib/lib/unistdio/u32-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u32_vsprintf
+#define VASNPRINTF u32_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint32_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u8-asnprintf.c b/gnulib/lib/unistdio/u8-asnprintf.c
new file mode 100644
index 0000000..a51fb44
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u8_asnprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-asprintf.c b/gnulib/lib/unistdio/u8-asprintf.c
new file mode 100644
index 0000000..8f20526
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u8_asprintf
+#define VASPRINTF u8_vasprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u8-printf-parse.c b/gnulib/lib/unistdio/u8-printf-parse.c
new file mode 100644
index 0000000..deaf1bf
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-printf-parse.c
@@ -0,0 +1,27 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE u8_printf_parse
+#define CHAR_T uint8_t
+#define DIRECTIVE u8_directive
+#define DIRECTIVES u8_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/u8-snprintf.c b/gnulib/lib/unistdio/u8-snprintf.c
new file mode 100644
index 0000000..dd7257e
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u8_snprintf
+#define VSNPRINTF u8_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u8-sprintf.c b/gnulib/lib/unistdio/u8-sprintf.c
new file mode 100644
index 0000000..670c047
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u8_sprintf
+#define VSPRINTF u8_vsprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-asnprintf.c b/gnulib/lib/unistdio/u8-u8-asnprintf.c
new file mode 100644
index 0000000..264edd1
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF u8_u8_asnprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-asprintf.c b/gnulib/lib/unistdio/u8-u8-asprintf.c
new file mode 100644
index 0000000..a80fd1c
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF u8_u8_asprintf
+#define VASPRINTF u8_u8_vasprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-snprintf.c b/gnulib/lib/unistdio/u8-u8-snprintf.c
new file mode 100644
index 0000000..bbe7d8b
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF u8_u8_snprintf
+#define VSNPRINTF u8_u8_vsnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-sprintf.c b/gnulib/lib/unistdio/u8-u8-sprintf.c
new file mode 100644
index 0000000..fa3c5c9
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF u8_u8_sprintf
+#define VSPRINTF u8_u8_vsprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vasnprintf.c b/gnulib/lib/unistdio/u8-u8-vasnprintf.c
new file mode 100644
index 0000000..4e0af81
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vasnprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DIRECTIVE u8_directive
+#define DIRECTIVES u8_directives
+#define PRINTF_PARSE u8_printf_parse
+#define DCHAR_T uint8_t
+#define DCHAR_T_IS_UINT8_T 1
+#define DCHAR_CPY u8_cpy
+#define DCHAR_SET u8_set
+#define DCHAR_MBSNLEN u8_mbsnlen
+#define DCHAR_IS_UINT8_T 1
+#define U16_TO_DCHAR u16_to_u8
+#define U32_TO_DCHAR u32_to_u8
+#define DCHAR_CONV_FROM_ENCODING u8_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u8-u8-vasprintf.c b/gnulib/lib/unistdio/u8-u8-vasprintf.c
new file mode 100644
index 0000000..2fa8d60
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u8_u8_vasprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vsnprintf.c b/gnulib/lib/unistdio/u8-u8-vsnprintf.c
new file mode 100644
index 0000000..c5195f6
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u8_u8_vsnprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#define DCHAR_CPY u8_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-u8-vsprintf.c b/gnulib/lib/unistdio/u8-u8-vsprintf.c
new file mode 100644
index 0000000..8964dea
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-u8-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u8_u8_vsprintf
+#define VASNPRINTF u8_u8_vasnprintf
+#define FCHAR_T uint8_t
+#define DCHAR_T uint8_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vasnprintf.c b/gnulib/lib/unistdio/u8-vasnprintf.c
new file mode 100644
index 0000000..0076cd3
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vasnprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define ASCII_ONLY 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T uint8_t
+#define DCHAR_T_IS_UINT8_T 1
+#define DCHAR_CPY u8_cpy
+#define DCHAR_SET u8_set
+#define DCHAR_MBSNLEN u8_mbsnlen
+#define DCHAR_IS_UINT8_T 1
+#define U16_TO_DCHAR u16_to_u8
+#define U32_TO_DCHAR u32_to_u8
+#define DCHAR_CONV_FROM_ENCODING u8_conv_from_encoding
+#define TCHAR_T char
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/u8-vasprintf.c b/gnulib/lib/unistdio/u8-vasprintf.c
new file mode 100644
index 0000000..27b35bb
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF u8_vasprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vsnprintf.c b/gnulib/lib/unistdio/u8-vsnprintf.c
new file mode 100644
index 0000000..625d9d4
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "unistr.h"
+
+#define VSNPRINTF u8_vsnprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#define DCHAR_CPY u8_cpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/u8-vsprintf.c b/gnulib/lib/unistdio/u8-vsprintf.c
new file mode 100644
index 0000000..184703d
--- /dev/null
+++ b/gnulib/lib/unistdio/u8-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF u8_vsprintf
+#define VASNPRINTF u8_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T uint8_t
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-asnprintf.c b/gnulib/lib/unistdio/ulc-asnprintf.c
new file mode 100644
index 0000000..73c0175
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-asnprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASNPRINTF ulc_asnprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-asnprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-asprintf.c b/gnulib/lib/unistdio/ulc-asprintf.c
new file mode 100644
index 0000000..64e21d7
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-asprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define ASPRINTF ulc_asprintf
+#define VASPRINTF ulc_vasprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-asprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-fprintf.c b/gnulib/lib/unistdio/ulc-fprintf.c
new file mode 100644
index 0000000..b6d5192
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-fprintf.c
@@ -0,0 +1,74 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+ulc_fprintf (FILE *fp, const char *format, ...)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+ va_list args;
+
+ va_start (args, format);
+ output = ulc_vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/unistdio/ulc-printf-parse.c b/gnulib/lib/unistdio/ulc-printf-parse.c
new file mode 100644
index 0000000..b690198
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-printf-parse.c
@@ -0,0 +1,28 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio/u-printf-parse.h"
+
+#define PRINTF_PARSE ulc_printf_parse
+#define CHAR_T char
+#define CHAR_T_ONLY_ASCII 1
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#include "printf-parse.c"
diff --git a/gnulib/lib/unistdio/ulc-snprintf.c b/gnulib/lib/unistdio/ulc-snprintf.c
new file mode 100644
index 0000000..573ca89
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-snprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SNPRINTF ulc_snprintf
+#define VSNPRINTF ulc_vsnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-snprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-sprintf.c b/gnulib/lib/unistdio/ulc-sprintf.c
new file mode 100644
index 0000000..e3cf9fa
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-sprintf.c
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2005-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <stdarg.h>
+
+#define SPRINTF ulc_sprintf
+#define VSPRINTF ulc_vsprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-sprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vasnprintf.c b/gnulib/lib/unistdio/ulc-vasnprintf.c
new file mode 100644
index 0000000..2520acb
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vasnprintf.c
@@ -0,0 +1,47 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+#include <alloca.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include "uniconv.h"
+#include "unistr.h"
+#include "unistdio/u-printf-parse.h"
+
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DIRECTIVE char_directive
+#define DIRECTIVES char_directives
+#define FCHAR_T_ONLY_ASCII 1
+#define PRINTF_PARSE ulc_printf_parse
+#define DCHAR_T char
+#define DCHAR_CPY memcpy
+#define DCHAR_SET memset
+#define DCHAR_MBSNLEN mbsnlen
+#define TCHAR_T char
+#define DCHAR_IS_TCHAR 1
+#include "vasnprintf.c"
diff --git a/gnulib/lib/unistdio/ulc-vasprintf.c b/gnulib/lib/unistdio/ulc-vasprintf.c
new file mode 100644
index 0000000..eeaf507
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vasprintf.c
@@ -0,0 +1,31 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#define VASPRINTF ulc_vasprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-vasprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vfprintf.c b/gnulib/lib/unistdio/ulc-vfprintf.c
new file mode 100644
index 0000000..2ce0835
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vfprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+ulc_vfprintf (FILE *fp, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = ulc_vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/unistdio/ulc-vsnprintf.c b/gnulib/lib/unistdio/ulc-vsnprintf.c
new file mode 100644
index 0000000..e2a4b15
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vsnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define VSNPRINTF ulc_vsnprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#define DCHAR_CPY memcpy
+#include "u-vsnprintf.h"
diff --git a/gnulib/lib/unistdio/ulc-vsprintf.c b/gnulib/lib/unistdio/ulc-vsprintf.c
new file mode 100644
index 0000000..1aacb26
--- /dev/null
+++ b/gnulib/lib/unistdio/ulc-vsprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistdio.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define VSPRINTF ulc_vsprintf
+#define VASNPRINTF ulc_vasnprintf
+#define FCHAR_T char
+#define DCHAR_T char
+#include "u-vsprintf.h"
diff --git a/gnulib/lib/unistr.in.h b/gnulib/lib/unistr.in.h
new file mode 100644
index 0000000..c665aa8
--- /dev/null
+++ b/gnulib/lib/unistr.in.h
@@ -0,0 +1,692 @@
+/* Elementary Unicode string functions.
+ Copyright (C) 2001-2002, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get common macros for C. */
+#include "unused-parameter.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ All arguments starting with "str" and the arguments of functions starting
+ with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+ which terminates at the first NUL unit. This termination unit is
+ considered part of the string for all memory allocation purposes, but
+ is not considered part of the string for all other logical purposes.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+
+/* Elementary string checks. */
+
+/* Check whether an UTF-8 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint8_t *
+ u8_check (const uint8_t *s, size_t n);
+
+/* Check whether an UTF-16 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint16_t *
+ u16_check (const uint16_t *s, size_t n);
+
+/* Check whether an UCS-4 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint32_t *
+ u32_check (const uint32_t *s, size_t n);
+
+
+/* Elementary string conversions. */
+
+/* Convert an UTF-8 string to an UTF-16 string. */
+extern uint16_t *
+ u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string. */
+extern uint32_t *
+ u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string. */
+extern uint8_t *
+ u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string. */
+extern uint32_t *
+ u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string. */
+extern uint8_t *
+ u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string. */
+extern uint16_t *
+ u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+
+/* Elementary string functions. */
+
+/* Return the length (number of units) of the first character in S, which is
+ no longer than N. Return 0 if it is the NUL character. Return -1 upon
+ failure. */
+/* Similar to mblen(), except that s must not be NULL. */
+extern int
+ u8_mblen (const uint8_t *s, size_t n);
+extern int
+ u16_mblen (const uint16_t *s, size_t n);
+extern int
+ u32_mblen (const uint32_t *s, size_t n);
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
+ and an appropriate number of units is returned.
+ The number of available units, N, must be > 0. */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+ and the NUL character is not treated specially. */
+/* The variants with _safe suffix are safe, even if the library is compiled
+ without --enable-safety. */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+ const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+# if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+# endif
+ *puc = c;
+# if CONFIG_UNICODE_SAFETY
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+# endif
+ return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
+ and -1 is returned for an invalid sequence of units, -2 is returned for an
+ incomplete sequence of units.
+ The number of available units, N, must be > 0. */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+ about the failure, similar to mbrtowc(). */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+ length. Return -1 upon failure, -2 if the number of available units, N,
+ is too small. The latter case cannot occur if N >= 6/2/1, respectively. */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+ must be specified. */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */
+extern int
+ u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n);
+# if !HAVE_INLINE
+extern int
+ u8_uctomb (uint8_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0x80 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */
+extern int
+ u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n);
+# if !HAVE_INLINE
+extern int
+ u16_uctomb (uint16_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_uctomb (uint32_t *s, ucs4_t uc, int n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+ {
+ if (n > 0)
+ {
+ *s = uc;
+ return 1;
+ }
+ else
+ return -2;
+ }
+ else
+ return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST. */
+/* Similar to memcpy(). */
+extern uint8_t *
+ u8_cpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_cpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_cpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+/* Similar to memmove(). */
+extern uint8_t *
+ u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC. UC should be a character that
+ occupies only 1 unit. */
+/* Similar to memset(). */
+extern uint8_t *
+ u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+ u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+ u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N. */
+/* Similar to memcmp(). */
+extern int
+ u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n);
+extern int
+ u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n);
+extern int
+ u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n);
+
+/* Compare S1 and S2. */
+/* Similar to the gnulib function memcmp2(). */
+extern int
+ u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2);
+extern int
+ u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2);
+extern int
+ u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2);
+
+/* Search the string at S for UC. */
+/* Similar to memchr(). */
+extern uint8_t *
+ u8_chr (const uint8_t *s, size_t n, ucs4_t uc);
+extern uint16_t *
+ u16_chr (const uint16_t *s, size_t n, ucs4_t uc);
+extern uint32_t *
+ u32_chr (const uint32_t *s, size_t n, ucs4_t uc);
+
+/* Count the number of Unicode characters in the N units from S. */
+/* Similar to mbsnlen(). */
+extern size_t
+ u8_mbsnlen (const uint8_t *s, size_t n);
+extern size_t
+ u16_mbsnlen (const uint16_t *s, size_t n);
+extern size_t
+ u32_mbsnlen (const uint32_t *s, size_t n);
+
+/* Elementary string functions with memory allocation. */
+
+/* Make a freshly allocated copy of S, of length N. */
+extern uint8_t *
+ u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+ u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+ u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings. */
+
+/* Return the length (number of units) of the first character in S.
+ Return 0 if it is the NUL character. Return -1 upon failure. */
+extern int
+ u8_strmblen (const uint8_t *s);
+extern int
+ u16_strmblen (const uint16_t *s);
+extern int
+ u32_strmblen (const uint32_t *s);
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL
+ character. Return -1 upon failure. */
+extern int
+ u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+ u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+ u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step. Advances the pointer past the next character,
+ or returns NULL if the end of the string has been reached. Puts the
+ character's 'ucs4_t' representation in *PUC. */
+extern const uint8_t *
+ u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+ u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+ u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step. Advances the pointer to point to the previous
+ character, or returns NULL if the beginning of the string had been reached.
+ Puts the character's 'ucs4_t' representation in *PUC. */
+extern const uint8_t *
+ u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+ u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+ u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S. */
+/* Similar to strlen(), wcslen(). */
+extern size_t
+ u8_strlen (const uint8_t *s);
+extern size_t
+ u16_strlen (const uint16_t *s);
+extern size_t
+ u32_strlen (const uint32_t *s);
+
+/* Return the number of units in S, but at most MAXLEN. */
+/* Similar to strnlen(), wcsnlen(). */
+extern size_t
+ u8_strnlen (const uint8_t *s, size_t maxlen);
+extern size_t
+ u16_strnlen (const uint16_t *s, size_t maxlen);
+extern size_t
+ u32_strnlen (const uint32_t *s, size_t maxlen);
+
+/* Copy SRC to DEST. */
+/* Similar to strcpy(), wcscpy(). */
+extern uint8_t *
+ u8_strcpy (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcpy (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcpy (uint32_t *dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */
+/* Similar to stpcpy(). */
+extern uint8_t *
+ u8_stpcpy (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_stpcpy (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_stpcpy (uint32_t *dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST. */
+/* Similar to strncpy(), wcsncpy(). */
+extern uint8_t *
+ u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST. Return a pointer past the last
+ non-NUL unit written into DEST. */
+/* Similar to stpncpy(). */
+extern uint8_t *
+ u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_stpncpy (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_stpncpy (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST. */
+/* Similar to strcat(), wcscat(). */
+extern uint8_t *
+ u8_strcat (uint8_t *dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcat (uint16_t *dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcat (uint32_t *dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST. */
+/* Similar to strncat(), wcsncat(). */
+extern uint8_t *
+ u8_strncat (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncat (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncat (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2. */
+/* Similar to strcmp(), wcscmp(). */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */
+extern int
+ u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2);
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+ u8_strcmp (const uint8_t *s1, const uint8_t *s2);
+#endif
+extern int
+ u16_strcmp (const uint16_t *s1, const uint16_t *s2);
+extern int
+ u32_strcmp (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+ Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+ Upon failure, set errno and return any value. */
+/* Similar to strcoll(), wcscoll(). */
+extern int
+ u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+ u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+ u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2. */
+/* Similar to strncmp(), wcsncmp(). */
+extern int
+ u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n);
+extern int
+ u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n);
+extern int
+ u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n);
+
+/* Duplicate S, returning an identical malloc'd string. */
+/* Similar to strdup(), wcsdup(). */
+extern uint8_t *
+ u8_strdup (const uint8_t *s);
+extern uint16_t *
+ u16_strdup (const uint16_t *s);
+extern uint32_t *
+ u32_strdup (const uint32_t *s);
+
+/* Find the first occurrence of UC in STR. */
+/* Similar to strchr(), wcschr(). */
+extern uint8_t *
+ u8_strchr (const uint8_t *str, ucs4_t uc);
+extern uint16_t *
+ u16_strchr (const uint16_t *str, ucs4_t uc);
+extern uint32_t *
+ u32_strchr (const uint32_t *str, ucs4_t uc);
+
+/* Find the last occurrence of UC in STR. */
+/* Similar to strrchr(), wcsrchr(). */
+extern uint8_t *
+ u8_strrchr (const uint8_t *str, ucs4_t uc);
+extern uint16_t *
+ u16_strrchr (const uint16_t *str, ucs4_t uc);
+extern uint32_t *
+ u32_strrchr (const uint32_t *str, ucs4_t uc);
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters not in REJECT. */
+/* Similar to strcspn(), wcscspn(). */
+extern size_t
+ u8_strcspn (const uint8_t *str, const uint8_t *reject);
+extern size_t
+ u16_strcspn (const uint16_t *str, const uint16_t *reject);
+extern size_t
+ u32_strcspn (const uint32_t *str, const uint32_t *reject);
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters in ACCEPT. */
+/* Similar to strspn(), wcsspn(). */
+extern size_t
+ u8_strspn (const uint8_t *str, const uint8_t *accept);
+extern size_t
+ u16_strspn (const uint16_t *str, const uint16_t *accept);
+extern size_t
+ u32_strspn (const uint32_t *str, const uint32_t *accept);
+
+/* Find the first occurrence in STR of any character in ACCEPT. */
+/* Similar to strpbrk(), wcspbrk(). */
+extern uint8_t *
+ u8_strpbrk (const uint8_t *str, const uint8_t *accept);
+extern uint16_t *
+ u16_strpbrk (const uint16_t *str, const uint16_t *accept);
+extern uint32_t *
+ u32_strpbrk (const uint32_t *str, const uint32_t *accept);
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+/* Similar to strstr(), wcsstr(). */
+extern uint8_t *
+ u8_strstr (const uint8_t *haystack, const uint8_t *needle);
+extern uint16_t *
+ u16_strstr (const uint16_t *haystack, const uint16_t *needle);
+extern uint32_t *
+ u32_strstr (const uint32_t *haystack, const uint32_t *needle);
+
+/* Test whether STR starts with PREFIX. */
+extern bool
+ u8_startswith (const uint8_t *str, const uint8_t *prefix);
+extern bool
+ u16_startswith (const uint16_t *str, const uint16_t *prefix);
+extern bool
+ u32_startswith (const uint32_t *str, const uint32_t *prefix);
+
+/* Test whether STR ends with SUFFIX. */
+extern bool
+ u8_endswith (const uint8_t *str, const uint8_t *suffix);
+extern bool
+ u16_endswith (const uint16_t *str, const uint16_t *suffix);
+extern bool
+ u32_endswith (const uint32_t *str, const uint32_t *suffix);
+
+/* Divide STR into tokens separated by characters in DELIM.
+ This interface is actually more similar to wcstok than to strtok. */
+/* Similar to strtok_r(), wcstok(). */
+extern uint8_t *
+ u8_strtok (uint8_t *str, const uint8_t *delim, uint8_t **ptr);
+extern uint16_t *
+ u16_strtok (uint16_t *str, const uint16_t *delim, uint16_t **ptr);
+extern uint32_t *
+ u32_strtok (uint32_t *str, const uint32_t *delim, uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/gnulib/lib/unistr/u-cmp2.h b/gnulib/lib/unistr/u-cmp2.h
new file mode 100644
index 0000000..27ace69
--- /dev/null
+++ b/gnulib/lib/unistr/u-cmp2.h
@@ -0,0 +1,32 @@
+/* Compare pieces of UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, size_t n1, const UNIT *s2, size_t n2)
+{
+ int cmp = U_CMP (s1, s2, MIN (n1, n2));
+
+ if (cmp == 0)
+ {
+ if (n1 < n2)
+ cmp = -1;
+ else if (n1 > n2)
+ cmp = 1;
+ }
+
+ return cmp;
+}
diff --git a/gnulib/lib/unistr/u-cpy-alloc.h b/gnulib/lib/unistr/u-cpy-alloc.h
new file mode 100644
index 0000000..07b74ff
--- /dev/null
+++ b/gnulib/lib/unistr/u-cpy-alloc.h
@@ -0,0 +1,40 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <string.h>
+
+UNIT *
+FUNC (const UNIT *s, size_t n)
+{
+ UNIT *dest;
+
+ dest = (UNIT *) malloc (n > 0 ? n * sizeof (UNIT) : 1);
+ if (dest != NULL)
+ {
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *s++;
+#else
+ memcpy ((char *) dest, (const char *) s, n * sizeof (UNIT));
+#endif
+ }
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-cpy.h b/gnulib/lib/unistr/u-cpy.h
new file mode 100644
index 0000000..0c2bb10
--- /dev/null
+++ b/gnulib/lib/unistr/u-cpy.h
@@ -0,0 +1,32 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *src++;
+#else
+ memcpy ((char *) dest, (const char *) src, n * sizeof (UNIT));
+#endif
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-endswith.h b/gnulib/lib/unistr/u-endswith.h
new file mode 100644
index 0000000..5a6d53f
--- /dev/null
+++ b/gnulib/lib/unistr/u-endswith.h
@@ -0,0 +1,28 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+bool
+FUNC (const UNIT *str, const UNIT *suffix)
+{
+ size_t len = U_STRLEN (str);
+ size_t suffixlen = U_STRLEN (suffix);
+
+ if (len >= suffixlen)
+ return (U_CMP (str + (len - suffixlen), suffix, suffixlen) == 0);
+ else
+ return false;
+}
diff --git a/gnulib/lib/unistr/u-move.h b/gnulib/lib/unistr/u-move.h
new file mode 100644
index 0000000..ff0eee6
--- /dev/null
+++ b/gnulib/lib/unistr/u-move.h
@@ -0,0 +1,44 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+#if 0
+ if (dest < src)
+ {
+ UNIT *destptr = dest;
+ const UNIT *srcptr = src;
+
+ for (; n > 0; n--)
+ *destptr++ = *srcptr++;
+ }
+ else if (dest > src)
+ {
+ UNIT *destptr = dest + n - 1;
+ const UNIT *srcptr = src + n - 1;
+
+ for (; n > 0; n--)
+ *destptr-- = *srcptr--;
+ }
+#else
+ memmove ((char *) dest, (const char *) src, n * sizeof (UNIT));
+#endif
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-set.h b/gnulib/lib/unistr/u-set.h
new file mode 100644
index 0000000..42cf01d
--- /dev/null
+++ b/gnulib/lib/unistr/u-set.h
@@ -0,0 +1,39 @@
+/* Fill UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+
+UNIT *
+FUNC (UNIT *s, ucs4_t uc, size_t n)
+{
+ if (n > 0)
+ {
+ if (IS_SINGLE_UNIT (uc))
+ {
+ UNIT *ptr = s;
+
+ for (; n > 0; n--)
+ *ptr++ = uc;
+ }
+ else
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+ }
+ return s;
+}
diff --git a/gnulib/lib/unistr/u-startswith.h b/gnulib/lib/unistr/u-startswith.h
new file mode 100644
index 0000000..6f77a04
--- /dev/null
+++ b/gnulib/lib/unistr/u-startswith.h
@@ -0,0 +1,30 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+bool
+FUNC (const UNIT *str, const UNIT *prefix)
+{
+ for (;;)
+ {
+ UNIT uc1 = *str++;
+ UNIT uc2 = *prefix++;
+ if (uc2 == 0)
+ return true;
+ if (uc1 != uc2)
+ return false;
+ }
+}
diff --git a/gnulib/lib/unistr/u-stpcpy.h b/gnulib/lib/unistr/u-stpcpy.h
new file mode 100644
index 0000000..1755f4c
--- /dev/null
+++ b/gnulib/lib/unistr/u-stpcpy.h
@@ -0,0 +1,24 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ for (; (*dest = *src) != 0; src++, dest++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-stpncpy.h b/gnulib/lib/unistr/u-stpncpy.h
new file mode 100644
index 0000000..408a5dc
--- /dev/null
+++ b/gnulib/lib/unistr/u-stpncpy.h
@@ -0,0 +1,34 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ for (; n > 0 && (*dest = *src) != 0; src++, dest++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is here for consistency with
+ strncpy and wcsncpy. */
+ {
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = 0;
+ }
+
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcat.h b/gnulib/lib/unistr/u-strcat.h
new file mode 100644
index 0000000..a993110
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcat.h
@@ -0,0 +1,26 @@
+/* Concatenate UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ UNIT *destptr = dest + U_STRLEN (dest);
+
+ for (; (*destptr = *src) != 0; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcoll.h b/gnulib/lib/unistr/u-strcoll.h
new file mode 100644
index 0000000..2a1b553
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcoll.h
@@ -0,0 +1,92 @@
+/* Compare UTF-8/UTF-16/UTF-32 strings using the collation rules of the current
+ locale.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+FUNC (const UNIT *s1, const UNIT *s2)
+{
+ /* When this function succeeds, it sets errno back to its original value.
+ When it fails, it sets errno, but also returns a meaningful return value,
+ for the sake of callers which ignore errno. */
+ int final_errno = errno;
+ const char *encoding = locale_charset ();
+ char *sl1;
+ char *sl2;
+ int result;
+
+ /* Pass iconveh_error here, not iconveh_question_mark. Otherwise the
+ conversion to locale encoding can do transliteration or map some
+ characters to question marks, leading to results that depend on the
+ iconv() implementation and are not obvious. */
+ sl1 = U_STRCONV_TO_ENCODING (s1, encoding, iconveh_error);
+ if (sl1 != NULL)
+ {
+ sl2 = U_STRCONV_TO_ENCODING (s2, encoding, iconveh_error);
+ if (sl2 != NULL)
+ {
+ /* Compare sl1 and sl2. */
+ errno = 0;
+ result = strcoll (sl1, sl2);
+ if (errno == 0)
+ {
+ /* strcoll succeeded. */
+ free (sl1);
+ free (sl2);
+ /* The conversion to locale encoding can drop Unicode TAG
+ characters. Therefore sl1 and sl2 may be equal when s1
+ and s2 were in fact different. Return a nonzero result
+ in this case. */
+ if (result == 0)
+ result = U_STRCMP (s1, s2);
+ }
+ else
+ {
+ /* strcoll failed. */
+ final_errno = errno;
+ free (sl1);
+ free (sl2);
+ result = U_STRCMP (s1, s2);
+ }
+ }
+ else
+ {
+ /* s1 could be converted to locale encoding, s2 not. */
+ final_errno = errno;
+ free (sl1);
+ result = -1;
+ }
+ }
+ else
+ {
+ final_errno = errno;
+ sl2 = U_STRCONV_TO_ENCODING (s2, encoding, iconveh_error);
+ if (sl2 != NULL)
+ {
+ /* s2 could be converted to locale encoding, s1 not. */
+ free (sl2);
+ result = 1;
+ }
+ else
+ {
+ /* Neither s1 nor s2 could be converted to locale encoding. */
+ result = U_STRCMP (s1, s2);
+ }
+ }
+
+ errno = final_errno;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u-strcpy.h b/gnulib/lib/unistr/u-strcpy.h
new file mode 100644
index 0000000..493fcdb
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcpy.h
@@ -0,0 +1,26 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src)
+{
+ UNIT *destptr = dest;
+
+ for (; (*destptr = *src) != 0; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strcspn.h b/gnulib/lib/unistr/u-strcspn.h
new file mode 100644
index 0000000..d55294a
--- /dev/null
+++ b/gnulib/lib/unistr/u-strcspn.h
@@ -0,0 +1,54 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *str, const UNIT *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == 0)
+ return U_STRLEN (str);
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, reject);
+ if (count >= 0 && reject[count] == 0)
+ {
+ const UNIT *found = U_STRCHR (str, uc);
+ if (found != NULL)
+ return found - str;
+ else
+ return U_STRLEN (str);
+ }
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count == 0)
+ return ptr - str;
+ if (count < 0)
+ break;
+ if (U_STRCHR (reject, uc))
+ return ptr - str;
+ ptr += count;
+ }
+ return U_STRLEN (str);
+ }
+}
diff --git a/gnulib/lib/unistr/u-strdup.h b/gnulib/lib/unistr/u-strdup.h
new file mode 100644
index 0000000..ecfcc7b
--- /dev/null
+++ b/gnulib/lib/unistr/u-strdup.h
@@ -0,0 +1,41 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <string.h>
+
+UNIT *
+FUNC (const UNIT *s)
+{
+ size_t n = U_STRLEN (s) + 1;
+ UNIT *dest;
+
+ dest = (UNIT *) malloc (n * sizeof (UNIT));
+ if (dest != NULL)
+ {
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *s++;
+#else
+ memcpy ((char *) dest, (const char *) s, n * sizeof (UNIT));
+#endif
+ }
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strlen.h b/gnulib/lib/unistr/u-strlen.h
new file mode 100644
index 0000000..69ed336
--- /dev/null
+++ b/gnulib/lib/unistr/u-strlen.h
@@ -0,0 +1,26 @@
+/* Determine length of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *s)
+{
+ const UNIT *ptr;
+
+ for (ptr = s; *ptr != 0; ptr++)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/unistr/u-strncat.h b/gnulib/lib/unistr/u-strncat.h
new file mode 100644
index 0000000..2b876db
--- /dev/null
+++ b/gnulib/lib/unistr/u-strncat.h
@@ -0,0 +1,28 @@
+/* Concatenate UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ UNIT *destptr = dest + U_STRLEN (dest);
+
+ for (; n > 0 && (*destptr = *src) != 0; src++, destptr++, n--)
+ ;
+ if (n == 0)
+ *destptr = 0;
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strncpy.h b/gnulib/lib/unistr/u-strncpy.h
new file mode 100644
index 0000000..8e49f04
--- /dev/null
+++ b/gnulib/lib/unistr/u-strncpy.h
@@ -0,0 +1,32 @@
+/* Copy UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+ UNIT *destptr = dest;
+
+ for (; n > 0 && (*destptr = *src) != 0; src++, destptr++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is here for consistency with
+ strncpy and wcsncpy. */
+ for (; n > 0; n--)
+ *destptr++ = 0;
+
+ return dest;
+}
diff --git a/gnulib/lib/unistr/u-strnlen.h b/gnulib/lib/unistr/u-strnlen.h
new file mode 100644
index 0000000..c042750
--- /dev/null
+++ b/gnulib/lib/unistr/u-strnlen.h
@@ -0,0 +1,26 @@
+/* Determine bounded length of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *s, size_t maxlen)
+{
+ const UNIT *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/unistr/u-strpbrk.h b/gnulib/lib/unistr/u-strpbrk.h
new file mode 100644
index 0000000..5582b3a
--- /dev/null
+++ b/gnulib/lib/unistr/u-strpbrk.h
@@ -0,0 +1,46 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return NULL;
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, accept);
+ if (count >= 0 && accept[count] == 0)
+ return U_STRCHR (str, uc);
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count <= 0)
+ break;
+ if (U_STRCHR (accept, uc))
+ return (UNIT *) ptr;
+ ptr += count;
+ }
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u-strspn.h b/gnulib/lib/unistr/u-strspn.h
new file mode 100644
index 0000000..c414576
--- /dev/null
+++ b/gnulib/lib/unistr/u-strspn.h
@@ -0,0 +1,54 @@
+/* Search for some characters in UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return 0;
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, accept);
+ if (count >= 0 && accept[count] == 0)
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr += count)
+ if (U_CMP (ptr, accept, count) != 0)
+ break;
+ return ptr - str;
+ }
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+
+ for (;;)
+ {
+ ucs4_t uc;
+ int count = U_STRMBTOUC (&uc, ptr);
+ if (count == 0)
+ return ptr - str;
+ if (count < 0)
+ break;
+ if (!U_STRCHR (accept, uc))
+ return ptr - str;
+ ptr += count;
+ }
+ return U_STRLEN (str);
+ }
+}
diff --git a/gnulib/lib/unistr/u-strstr.h b/gnulib/lib/unistr/u-strstr.h
new file mode 100644
index 0000000..336ce8b
--- /dev/null
+++ b/gnulib/lib/unistr/u-strstr.h
@@ -0,0 +1,131 @@
+/* Substring test for UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002, 2005.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (const UNIT *haystack, const UNIT *needle)
+{
+ UNIT first = needle[0];
+
+ /* Is needle empty? */
+ if (first == 0)
+ return (UNIT *) haystack;
+
+ /* Is needle nearly empty (only one unit)? */
+ if (needle[1] == 0)
+ return U_STRCHR (haystack, first);
+
+#ifdef U_STRMBTOUC
+ /* Is needle nearly empty (only one character)? */
+ {
+ ucs4_t first_uc;
+ int count = U_STRMBTOUC (&first_uc, needle);
+ if (count > 0 && needle[count] == 0)
+ return U_STRCHR (haystack, first_uc);
+ }
+#endif
+
+#if UNIT_IS_UINT8_T
+ return (uint8_t *) strstr ((const char *) haystack, (const char *) needle);
+#else
+ {
+ /* Minimizing the worst-case complexity:
+ Let n = U_STRLEN(haystack), m = U_STRLEN(needle).
+ The naïve algorithm is O(n*m) worst-case.
+ The Knuth-Morris-Pratt algorithm is O(n) worst-case but it needs a
+ memory allocation.
+ To achieve linear complexity and yet amortize the cost of the
+ memory allocation, we activate the Knuth-Morris-Pratt algorithm
+ only once the naïve algorithm has already run for some time; more
+ precisely, when
+ - the outer loop count is >= 10,
+ - the average number of comparisons per outer loop is >= 5,
+ - the total number of comparisons is >= m.
+ But we try it only once. If the memory allocation attempt failed,
+ we don't retry it. */
+ bool try_kmp = true;
+ size_t outer_loop_count = 0;
+ size_t comparison_count = 0;
+ size_t last_ccount = 0; /* last comparison count */
+ const UNIT *needle_last_ccount = needle; /* = needle + last_ccount */
+
+ /* Speed up the following searches of needle by caching its first
+ character. */
+ UNIT b = *needle++;
+
+ for (;; haystack++)
+ {
+ if (*haystack == 0)
+ /* No match. */
+ return NULL;
+
+ /* See whether it's advisable to use an asymptotically faster
+ algorithm. */
+ if (try_kmp
+ && outer_loop_count >= 10
+ && comparison_count >= 5 * outer_loop_count)
+ {
+ /* See if needle + comparison_count now reaches the end of
+ needle. */
+ if (needle_last_ccount != NULL)
+ {
+ needle_last_ccount +=
+ U_STRNLEN (needle_last_ccount,
+ comparison_count - last_ccount);
+ if (*needle_last_ccount == 0)
+ needle_last_ccount = NULL;
+ last_ccount = comparison_count;
+ }
+ if (needle_last_ccount == NULL)
+ {
+ /* Try the Knuth-Morris-Pratt algorithm. */
+ const UNIT *result;
+ bool success =
+ knuth_morris_pratt (haystack,
+ needle - 1, U_STRLEN (needle - 1),
+ &result);
+ if (success)
+ return (UNIT *) result;
+ try_kmp = false;
+ }
+ }
+
+ outer_loop_count++;
+ comparison_count++;
+ if (*haystack == b)
+ /* The first character matches. */
+ {
+ const UNIT *rhaystack = haystack + 1;
+ const UNIT *rneedle = needle;
+
+ for (;; rhaystack++, rneedle++)
+ {
+ if (*rneedle == 0)
+ /* Found a match. */
+ return (UNIT *) haystack;
+ if (*rhaystack == 0)
+ /* No match. */
+ return NULL;
+ comparison_count++;
+ if (*rhaystack != *rneedle)
+ /* Nothing in this round. */
+ break;
+ }
+ }
+ }
+ }
+#endif
+}
diff --git a/gnulib/lib/unistr/u-strtok.h b/gnulib/lib/unistr/u-strtok.h
new file mode 100644
index 0000000..763dcca
--- /dev/null
+++ b/gnulib/lib/unistr/u-strtok.h
@@ -0,0 +1,52 @@
+/* Tokenize UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+UNIT *
+FUNC (UNIT *str, const UNIT *delim, UNIT **ptr)
+{
+ if (str == NULL)
+ {
+ str = *ptr;
+ if (str == NULL)
+ return NULL; /* reminder that end of token sequence has been reached */
+ }
+
+ /* Skip leading delimiters. */
+ str += U_STRSPN (str, delim);
+
+ /* Found a token? */
+ if (*str == 0)
+ {
+ *ptr = NULL;
+ return NULL;
+ }
+
+ /* Move past the token. */
+ {
+ UNIT *token_end = U_STRPBRK (str, delim);
+ if (token_end)
+ {
+ /* NUL-terminate the token. */
+ *token_end = 0;
+ *ptr = token_end + 1;
+ }
+ else
+ *ptr = NULL;
+ }
+
+ return str;
+}
diff --git a/gnulib/lib/unistr/u16-check.c b/gnulib/lib/unistr/u16-check.c
new file mode 100644
index 0000000..79c9c49
--- /dev/null
+++ b/gnulib/lib/unistr/u16-check.c
@@ -0,0 +1,51 @@
+/* Check UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_check (const uint16_t *s, size_t n)
+{
+ const uint16_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ s++;
+ continue;
+ }
+ if (c < 0xdc00)
+ {
+ if (s + 2 <= s_end
+ && s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ s += 2;
+ continue;
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-chr.c b/gnulib/lib/unistr/u16-chr.c
new file mode 100644
index 0000000..dab4ce3
--- /dev/null
+++ b/gnulib/lib/unistr/u16-chr.c
@@ -0,0 +1,57 @@
+/* Search character in piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+{
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (; n > 0; s++, n--)
+ {
+ if (*s == c0)
+ return (uint16_t *) s;
+ }
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (n > 1)
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ for (n--; n > 0; s++, n--)
+ {
+ if (*s == c0 && s[1] == c1)
+ return (uint16_t *) s;
+ }
+ }
+ break;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-cmp.c b/gnulib/lib/unistr/u16-cmp.c
new file mode 100644
index 0000000..4e3e136
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cmp.c
@@ -0,0 +1,54 @@
+/* Compare pieces of UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (; n > 0;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u16-cmp2.c b/gnulib/lib/unistr/u16-cmp2.c
new file mode 100644
index 0000000..f990c5c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u16_cmp2
+#define UNIT uint16_t
+#define U_CMP u16_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u16-cpy-alloc.c b/gnulib/lib/unistr/u16-cpy-alloc.c
new file mode 100644
index 0000000..930fffc
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_cpy_alloc
+#define UNIT uint16_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u16-cpy.c b/gnulib/lib/unistr/u16-cpy.c
new file mode 100644
index 0000000..dff750e
--- /dev/null
+++ b/gnulib/lib/unistr/u16-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_cpy
+#define UNIT uint16_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u16-endswith.c b/gnulib/lib/unistr/u16-endswith.c
new file mode 100644
index 0000000..9e0c019
--- /dev/null
+++ b/gnulib/lib/unistr/u16-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_endswith
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_CMP u16_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u16-mblen.c b/gnulib/lib/unistr/u16-mblen.c
new file mode 100644
index 0000000..60f7a69
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mblen.c
@@ -0,0 +1,50 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_mblen (const uint16_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+ {
+ if (n >= 2
+ && s[1] >= 0xdc00 && s[1] < 0xe000)
+ return 2;
+ }
+#else
+ {
+ if (n >= 2)
+ return 2;
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-mbsnlen.c b/gnulib/lib/unistr/u16-mbsnlen.c
new file mode 100644
index 0000000..fb0df36
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbsnlen.c
@@ -0,0 +1,42 @@
+/* Count characters in UTF-16 string.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u16_mbsnlen (const uint16_t *s, size_t n)
+{
+ size_t characters;
+
+ characters = 0;
+ while (n > 0)
+ {
+ ucs4_t uc;
+ int count = u16_mbtoucr (&uc, s, n);
+ characters++;
+ if (count == -2)
+ break;
+ if (count <= 0)
+ count = 1;
+ s += count;
+ n -= count;
+ }
+ return characters;
+}
diff --git a/gnulib/lib/unistr/u16-mbtouc-aux.c b/gnulib/lib/unistr/u16-mbtouc-aux.c
new file mode 100644
index 0000000..e8e9c92
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-aux.c
@@ -0,0 +1,51 @@
+/* Conversion UTF-16 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c b/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c
new file mode 100644
index 0000000..b0abe51
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-unsafe-aux.c
@@ -0,0 +1,55 @@
+/* Conversion UTF-16 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc-unsafe.c b/gnulib/lib/unistr/u16-mbtouc-unsafe.c
new file mode 100644
index 0000000..b393397
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc-unsafe.c
@@ -0,0 +1,66 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtouc.c b/gnulib/lib/unistr/u16-mbtouc.c
new file mode 100644
index 0000000..9941e9b
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtouc.c
@@ -0,0 +1,61 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u16-mbtoucr.c b/gnulib/lib/unistr/u16-mbtoucr.c
new file mode 100644
index 0000000..53014a3
--- /dev/null
+++ b/gnulib/lib/unistr/u16-mbtoucr.c
@@ -0,0 +1,54 @@
+/* Look at first character in UTF-16 string, returning an error code.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ if (c < 0xdc00)
+ {
+ if (n >= 2)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-move.c b/gnulib/lib/unistr/u16-move.c
new file mode 100644
index 0000000..03c6486
--- /dev/null
+++ b/gnulib/lib/unistr/u16-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_move
+#define UNIT uint16_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u16-next.c b/gnulib/lib/unistr/u16-next.c
new file mode 100644
index 0000000..c948710
--- /dev/null
+++ b/gnulib/lib/unistr/u16-next.c
@@ -0,0 +1,37 @@
+/* Iterate over next character in UTF-16 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_next (ucs4_t *puc, const uint16_t *s)
+{
+ int count;
+
+ count = u16_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+ if (count < 0)
+ *puc = 0xfffd;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u16-prev.c b/gnulib/lib/unistr/u16-prev.c
new file mode 100644
index 0000000..40304d9
--- /dev/null
+++ b/gnulib/lib/unistr/u16-prev.c
@@ -0,0 +1,53 @@
+/* Iterate over previous character in UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint16_t *
+u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ if (s != start)
+ {
+ uint16_t c_1 = s[-1];
+
+ if (c_1 < 0xd800 || c_1 >= 0xe000)
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c_1 >= 0xdc00)
+#endif
+ if (s - 1 != start)
+ {
+ uint16_t c_2 = s[-2];
+
+#if CONFIG_UNICODE_SAFETY
+ if (c_2 >= 0xd800 && c_2 < 0xdc00)
+#endif
+ {
+ *puc = 0x10000 + ((c_2 - 0xd800) << 10) + (c_1 - 0xdc00);
+ return s - 2;
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-set.c b/gnulib/lib/unistr/u16-set.c
new file mode 100644
index 0000000..22b9370
--- /dev/null
+++ b/gnulib/lib/unistr/u16-set.c
@@ -0,0 +1,26 @@
+/* Fill UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_set
+#define UNIT uint16_t
+#define IS_SINGLE_UNIT(uc) (uc < 0xd800 || (uc < 0x10000 && uc >= 0xe000))
+#include "u-set.h"
diff --git a/gnulib/lib/unistr/u16-startswith.c b/gnulib/lib/unistr/u16-startswith.c
new file mode 100644
index 0000000..a7eff4f
--- /dev/null
+++ b/gnulib/lib/unistr/u16-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_startswith
+#define UNIT uint16_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u16-stpcpy.c b/gnulib/lib/unistr/u16-stpcpy.c
new file mode 100644
index 0000000..8085a43
--- /dev/null
+++ b/gnulib/lib/unistr/u16-stpcpy.c
@@ -0,0 +1,26 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_stpcpy
+#define UNIT uint16_t
+#include "u-stpcpy.h"
diff --git a/gnulib/lib/unistr/u16-stpncpy.c b/gnulib/lib/unistr/u16-stpncpy.c
new file mode 100644
index 0000000..825326d
--- /dev/null
+++ b/gnulib/lib/unistr/u16-stpncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_stpncpy
+#define UNIT uint16_t
+#include "u-stpncpy.h"
diff --git a/gnulib/lib/unistr/u16-strcat.c b/gnulib/lib/unistr/u16-strcat.c
new file mode 100644
index 0000000..c7819bb
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcat
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strcat.h"
diff --git a/gnulib/lib/unistr/u16-strchr.c b/gnulib/lib/unistr/u16-strchr.c
new file mode 100644
index 0000000..028a94d
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strchr.c
@@ -0,0 +1,64 @@
+/* Search character in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_strchr (const uint16_t *s, ucs4_t uc)
+{
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ break;
+ if (*s == 0)
+ goto notfound;
+ }
+ return (uint16_t *) s;
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (*s == 0)
+ goto notfound;
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ goto notfound;
+ if (*s == c0 && s[1] == c1)
+ break;
+ }
+ return (uint16_t *) s;
+ }
+ }
+notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u16-strcmp.c b/gnulib/lib/unistr/u16-strcmp.c
new file mode 100644
index 0000000..df27535
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcmp.c
@@ -0,0 +1,50 @@
+/* Compare UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (;;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 != 0 && c1 == c2)
+ continue;
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2. */
+ }
+}
diff --git a/gnulib/lib/unistr/u16-strcoll.c b/gnulib/lib/unistr/u16-strcoll.c
new file mode 100644
index 0000000..1867e88
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-16 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u16_strcoll
+#define UNIT uint16_t
+#define U_STRCMP u16_strcmp
+#define U_STRCONV_TO_ENCODING u16_strconv_to_encoding
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u16-strcpy.c b/gnulib/lib/unistr/u16-strcpy.c
new file mode 100644
index 0000000..bc0fb9c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcpy
+#define UNIT uint16_t
+#include "u-strcpy.h"
diff --git a/gnulib/lib/unistr/u16-strcspn.c b/gnulib/lib/unistr/u16-strcspn.c
new file mode 100644
index 0000000..7a29f21
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strcspn.c
@@ -0,0 +1,28 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strcspn
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_STRMBTOUC u16_strmbtouc
+#define U_STRCHR u16_strchr
+#include "u-strcspn.h"
diff --git a/gnulib/lib/unistr/u16-strdup.c b/gnulib/lib/unistr/u16-strdup.c
new file mode 100644
index 0000000..22c4c18
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strdup.c
@@ -0,0 +1,26 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strdup
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strdup.h"
diff --git a/gnulib/lib/unistr/u16-strlen.c b/gnulib/lib/unistr/u16-strlen.c
new file mode 100644
index 0000000..6e4f52c
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strlen.c
@@ -0,0 +1,25 @@
+/* Determine length of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strlen
+#define UNIT uint16_t
+#include "u-strlen.h"
diff --git a/gnulib/lib/unistr/u16-strmblen.c b/gnulib/lib/unistr/u16-strmblen.c
new file mode 100644
index 0000000..4e997b5
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strmblen.c
@@ -0,0 +1,44 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strmblen (const uint16_t *s)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+ {
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+ return 2;
+ }
+#else
+ if (s[1] != 0)
+ return 2;
+#endif
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-strmbtouc.c b/gnulib/lib/unistr/u16-strmbtouc.c
new file mode 100644
index 0000000..f4eeb49
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strmbtouc.c
@@ -0,0 +1,51 @@
+/* Look at first character in UTF-16 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strmbtouc (ucs4_t *puc, const uint16_t *s)
+{
+ /* Keep in sync with unistr.h and utf16-ucs4.c. */
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xdc00)
+#endif
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (s[1] >= 0xdc00 && s[1] < 0xe000)
+#else
+ if (s[1] != 0)
+#endif
+ {
+ *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
+ return 2;
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u16-strncat.c b/gnulib/lib/unistr/u16-strncat.c
new file mode 100644
index 0000000..601cd8d
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strncat
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#include "u-strncat.h"
diff --git a/gnulib/lib/unistr/u16-strncmp.c b/gnulib/lib/unistr/u16-strncmp.c
new file mode 100644
index 0000000..55863b1
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncmp.c
@@ -0,0 +1,54 @@
+/* Compare UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+{
+ /* Note that the UTF-16 encoding does NOT preserve lexicographic order.
+ Namely, if uc1 is a 16-bit character and [uc2a,uc2b] is a surrogate pair,
+ we must enforce uc1 < [uc2a,uc2b], even if uc1 > uc2a. */
+ for (; n > 0;)
+ {
+ uint16_t c1 = *s1++;
+ uint16_t c2 = *s2++;
+ if (c1 != 0 && c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ if (c1 < 0xd800 || c1 >= 0xe000)
+ {
+ if (!(c2 < 0xd800 || c2 >= 0xe000))
+ /* c2 is a surrogate, but c1 is not. */
+ return -1;
+ }
+ else
+ {
+ if (c2 < 0xd800 || c2 >= 0xe000)
+ /* c1 is a surrogate, but c2 is not. */
+ return 1;
+ }
+ return (int)c1 - (int)c2;
+ /* > 0 if c1 > c2, < 0 if c1 < c2, = 0 if c1 and c2 are both 0. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u16-strncpy.c b/gnulib/lib/unistr/u16-strncpy.c
new file mode 100644
index 0000000..6f0d638
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strncpy
+#define UNIT uint16_t
+#include "u-strncpy.h"
diff --git a/gnulib/lib/unistr/u16-strnlen.c b/gnulib/lib/unistr/u16-strnlen.c
new file mode 100644
index 0000000..8c2a80e
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strnlen.c
@@ -0,0 +1,25 @@
+/* Determine bounded length of UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strnlen
+#define UNIT uint16_t
+#include "u-strnlen.h"
diff --git a/gnulib/lib/unistr/u16-strpbrk.c b/gnulib/lib/unistr/u16-strpbrk.c
new file mode 100644
index 0000000..150ceea
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strpbrk.c
@@ -0,0 +1,27 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strpbrk
+#define UNIT uint16_t
+#define U_STRMBTOUC u16_strmbtouc
+#define U_STRCHR u16_strchr
+#include "u-strpbrk.h"
diff --git a/gnulib/lib/unistr/u16-strrchr.c b/gnulib/lib/unistr/u16-strrchr.c
new file mode 100644
index 0000000..1ee2d7f
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strrchr.c
@@ -0,0 +1,65 @@
+/* Search character in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint16_t *
+u16_strrchr (const uint16_t *s, ucs4_t uc)
+{
+ /* Calling u16_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint16_t *result = NULL;
+ uint16_t c[2];
+
+ if (uc < 0x10000)
+ {
+ uint16_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ result = (uint16_t *) s;
+ if (*s == 0)
+ break;
+ }
+ }
+ else
+ switch (u16_uctomb_aux (c, uc, 2))
+ {
+ case 2:
+ if (*s)
+ {
+ uint16_t c0 = c[0];
+ uint16_t c1 = c[1];
+
+ /* FIXME: Maybe walking the string via u16_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ break;
+ if (*s == c0 && s[1] == c1)
+ result = (uint16_t *) s;
+ }
+ }
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-strspn.c b/gnulib/lib/unistr/u16-strspn.c
new file mode 100644
index 0000000..c39bb71
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strspn.c
@@ -0,0 +1,29 @@
+/* Search for some characters in UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strspn
+#define UNIT uint16_t
+#define U_STRLEN u16_strlen
+#define U_STRMBTOUC u16_strmbtouc
+#define U_CMP u16_cmp
+#define U_STRCHR u16_strchr
+#include "u-strspn.h"
diff --git a/gnulib/lib/unistr/u16-strstr.c b/gnulib/lib/unistr/u16-strstr.c
new file mode 100644
index 0000000..934a4fc
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strstr.c
@@ -0,0 +1,37 @@
+/* Substring test for UTF-16 strings.
+ Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "malloca.h"
+
+/* FIXME: Maybe walking the string via u16_mblen is a win? */
+
+#define UNIT uint16_t
+
+#define CANON_ELEMENT(c) c
+#include "str-kmp.h"
+
+#define FUNC u16_strstr
+#define U_STRCHR u16_strchr
+#define U_STRMBTOUC u16_strmbtouc
+#define U_STRLEN u16_strlen
+#define U_STRNLEN u16_strnlen
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u16-strtok.c b/gnulib/lib/unistr/u16-strtok.c
new file mode 100644
index 0000000..50f30a3
--- /dev/null
+++ b/gnulib/lib/unistr/u16-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-16 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_strtok
+#define UNIT uint16_t
+#define U_STRSPN u16_strspn
+#define U_STRPBRK u16_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u16-to-u32.c b/gnulib/lib/unistr/u16-to-u32.c
new file mode 100644
index 0000000..bcf2e63
--- /dev/null
+++ b/gnulib/lib/unistr/u16-to-u32.c
@@ -0,0 +1,125 @@
+/* Convert UTF-16 string to UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_to_u32
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint32_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ if (length + 1 > allocated)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 1 > allocated)
+ allocated = length + 1;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ }
+ result[length++] = uc;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-to-u8.c b/gnulib/lib/unistr/u16-to-u8.c
new file mode 100644
index 0000000..02eee97
--- /dev/null
+++ b/gnulib/lib/unistr/u16-to-u8.c
@@ -0,0 +1,136 @@
+/* Convert UTF-16 string to UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u16_to_u8
+#define SRC_UNIT uint16_t
+#define DST_UNIT uint8_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u16_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u16-uctomb-aux.c b/gnulib/lib/unistr/u16-uctomb-aux.c
new file mode 100644
index 0000000..9ec1e7b
--- /dev/null
+++ b/gnulib/lib/unistr/u16-uctomb-aux.c
@@ -0,0 +1,58 @@
+/* Conversion UCS-4 to UTF-16.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800)
+ {
+ /* The case n >= 1 is already handled by the caller. */
+ }
+ else if (uc < 0x10000)
+ {
+ if (uc >= 0xe000)
+ {
+ if (n >= 1)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ }
+ else
+ return -1;
+ }
+ else
+ {
+ if (uc < 0x110000)
+ {
+ if (n >= 2)
+ {
+ s[0] = 0xd800 + ((uc - 0x10000) >> 10);
+ s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ return 2;
+ }
+ }
+ else
+ return -1;
+ }
+ return -2;
+}
diff --git a/gnulib/lib/unistr/u16-uctomb.c b/gnulib/lib/unistr/u16-uctomb.c
new file mode 100644
index 0000000..1bc66fd
--- /dev/null
+++ b/gnulib/lib/unistr/u16-uctomb.c
@@ -0,0 +1,72 @@
+/* Store a character in UTF-16 string.
+ Copyright (C) 2002, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u16_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u16_uctomb (uint16_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800)
+ {
+ if (n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ /* else return -2, below. */
+ }
+ else if (uc < 0x10000)
+ {
+ if (uc >= 0xe000)
+ {
+ if (n >= 1)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ }
+ else
+ return -1;
+ }
+ else
+ {
+ if (uc < 0x110000)
+ {
+ if (n >= 2)
+ {
+ s[0] = 0xd800 + ((uc - 0x10000) >> 10);
+ s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ return 2;
+ }
+ }
+ else
+ return -1;
+ }
+ return -2;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-check.c b/gnulib/lib/unistr/u32-check.c
new file mode 100644
index 0000000..9476a1c
--- /dev/null
+++ b/gnulib/lib/unistr/u32-check.c
@@ -0,0 +1,39 @@
+/* Check UTF-32 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_check (const uint32_t *s, size_t n)
+{
+ const uint32_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ s++;
+ else
+ /* invalid Unicode character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-chr.c b/gnulib/lib/unistr/u32-chr.c
new file mode 100644
index 0000000..5dba257
--- /dev/null
+++ b/gnulib/lib/unistr/u32-chr.c
@@ -0,0 +1,32 @@
+/* Search character in piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+{
+ for (; n > 0; s++, n--)
+ {
+ if (*s == uc)
+ return (uint32_t *) s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-cmp.c b/gnulib/lib/unistr/u32-cmp.c
new file mode 100644
index 0000000..73c6dc9
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cmp.c
@@ -0,0 +1,40 @@
+/* Compare pieces of UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 == uc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u32-cmp2.c b/gnulib/lib/unistr/u32-cmp2.c
new file mode 100644
index 0000000..cfe00a6
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u32_cmp2
+#define UNIT uint32_t
+#define U_CMP u32_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u32-cpy-alloc.c b/gnulib/lib/unistr/u32-cpy-alloc.c
new file mode 100644
index 0000000..892d235
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_cpy_alloc
+#define UNIT uint32_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u32-cpy.c b/gnulib/lib/unistr/u32-cpy.c
new file mode 100644
index 0000000..5d8b01a
--- /dev/null
+++ b/gnulib/lib/unistr/u32-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_cpy
+#define UNIT uint32_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u32-endswith.c b/gnulib/lib/unistr/u32-endswith.c
new file mode 100644
index 0000000..bb7a2ce
--- /dev/null
+++ b/gnulib/lib/unistr/u32-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_endswith
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#define U_CMP u32_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u32-mblen.c b/gnulib/lib/unistr/u32-mblen.c
new file mode 100644
index 0000000..b4ae146
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mblen.c
@@ -0,0 +1,37 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_mblen (const uint32_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ return (c != 0 ? 1 : 0);
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u32-mbsnlen.c b/gnulib/lib/unistr/u32-mbsnlen.c
new file mode 100644
index 0000000..d9ca6ea
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbsnlen.c
@@ -0,0 +1,27 @@
+/* Count characters in UTF-32 string.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u32_mbsnlen (const uint32_t *s, size_t n)
+{
+ return n;
+}
diff --git a/gnulib/lib/unistr/u32-mbtouc-unsafe.c b/gnulib/lib/unistr/u32-mbtouc-unsafe.c
new file mode 100644
index 0000000..6130fce
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtouc-unsafe.c
@@ -0,0 +1,48 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ *puc = c;
+#if CONFIG_UNICODE_SAFETY
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+#endif
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-mbtouc.c b/gnulib/lib/unistr/u32-mbtouc.c
new file mode 100644
index 0000000..2146b47
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtouc.c
@@ -0,0 +1,43 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u32-mbtoucr.c b/gnulib/lib/unistr/u32-mbtoucr.c
new file mode 100644
index 0000000..80f5194
--- /dev/null
+++ b/gnulib/lib/unistr/u32-mbtoucr.c
@@ -0,0 +1,39 @@
+/* Look at first character in UTF-32 string, returning an error code.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ {
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-move.c b/gnulib/lib/unistr/u32-move.c
new file mode 100644
index 0000000..c3f1161
--- /dev/null
+++ b/gnulib/lib/unistr/u32-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_move
+#define UNIT uint32_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u32-next.c b/gnulib/lib/unistr/u32-next.c
new file mode 100644
index 0000000..d087630
--- /dev/null
+++ b/gnulib/lib/unistr/u32-next.c
@@ -0,0 +1,39 @@
+/* Iterate over next character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_next (ucs4_t *puc, const uint32_t *s)
+{
+ int count;
+
+ count = u32_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+#if CONFIG_UNICODE_SAFETY
+ if (count < 0)
+ *puc = 0xfffd;
+#endif
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-prev.c b/gnulib/lib/unistr/u32-prev.c
new file mode 100644
index 0000000..c77f50c
--- /dev/null
+++ b/gnulib/lib/unistr/u32-prev.c
@@ -0,0 +1,39 @@
+/* Iterate over previous character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint32_t *
+u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start)
+{
+ if (s != start)
+ {
+ uint32_t c_1 = s[-1];
+
+#if CONFIG_UNICODE_SAFETY
+ if (c_1 < 0xd800 || (c_1 >= 0xe000 && c_1 < 0x110000))
+#endif
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-set.c b/gnulib/lib/unistr/u32-set.c
new file mode 100644
index 0000000..21cda1a
--- /dev/null
+++ b/gnulib/lib/unistr/u32-set.c
@@ -0,0 +1,26 @@
+/* Fill UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_set
+#define UNIT uint32_t
+#define IS_SINGLE_UNIT(uc) (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+#include "u-set.h"
diff --git a/gnulib/lib/unistr/u32-startswith.c b/gnulib/lib/unistr/u32-startswith.c
new file mode 100644
index 0000000..b884ff6
--- /dev/null
+++ b/gnulib/lib/unistr/u32-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_startswith
+#define UNIT uint32_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u32-stpcpy.c b/gnulib/lib/unistr/u32-stpcpy.c
new file mode 100644
index 0000000..134a574
--- /dev/null
+++ b/gnulib/lib/unistr/u32-stpcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_stpcpy
+#define UNIT uint32_t
+#include "u-stpcpy.h"
diff --git a/gnulib/lib/unistr/u32-stpncpy.c b/gnulib/lib/unistr/u32-stpncpy.c
new file mode 100644
index 0000000..8b3fe52
--- /dev/null
+++ b/gnulib/lib/unistr/u32-stpncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_stpncpy
+#define UNIT uint32_t
+#include "u-stpncpy.h"
diff --git a/gnulib/lib/unistr/u32-strcat.c b/gnulib/lib/unistr/u32-strcat.c
new file mode 100644
index 0000000..8ca8feb
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcat
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strcat.h"
diff --git a/gnulib/lib/unistr/u32-strchr.c b/gnulib/lib/unistr/u32-strchr.c
new file mode 100644
index 0000000..baa661a
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strchr.c
@@ -0,0 +1,36 @@
+/* Search character in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_strchr (const uint32_t *s, ucs4_t uc)
+{
+ for (;; s++)
+ {
+ if (*s == uc)
+ break;
+ if (*s == 0)
+ goto notfound;
+ }
+ return (uint32_t *) s;
+notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u32-strcmp.c b/gnulib/lib/unistr/u32-strcmp.c
new file mode 100644
index 0000000..70bfc1a
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcmp.c
@@ -0,0 +1,36 @@
+/* Compare UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+{
+ for (;;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 != 0 && uc1 == uc2)
+ continue;
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2. */
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strcoll.c b/gnulib/lib/unistr/u32-strcoll.c
new file mode 100644
index 0000000..52cee48
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-32 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u32_strcoll
+#define UNIT uint32_t
+#define U_STRCMP u32_strcmp
+#define U_STRCONV_TO_ENCODING u32_strconv_to_encoding
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u32-strcpy.c b/gnulib/lib/unistr/u32-strcpy.c
new file mode 100644
index 0000000..c2801ec
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcpy
+#define UNIT uint32_t
+#include "u-strcpy.h"
diff --git a/gnulib/lib/unistr/u32-strcspn.c b/gnulib/lib/unistr/u32-strcspn.c
new file mode 100644
index 0000000..b53a417
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strcspn.c
@@ -0,0 +1,51 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strcspn
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#define U_STRCHR u32_strchr
+
+size_t
+FUNC (const UNIT *str, const UNIT *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == 0)
+ return U_STRLEN (str);
+ if (reject[1] == 0)
+ {
+ ucs4_t uc = reject[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr == uc)
+ break;
+ return ptr - str;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (U_STRCHR (reject, *ptr))
+ break;
+ return ptr - str;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strdup.c b/gnulib/lib/unistr/u32-strdup.c
new file mode 100644
index 0000000..e8853d9
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strdup.c
@@ -0,0 +1,26 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strdup
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strdup.h"
diff --git a/gnulib/lib/unistr/u32-strlen.c b/gnulib/lib/unistr/u32-strlen.c
new file mode 100644
index 0000000..e173a1b
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strlen.c
@@ -0,0 +1,25 @@
+/* Determine length of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strlen
+#define UNIT uint32_t
+#include "u-strlen.h"
diff --git a/gnulib/lib/unistr/u32-strmblen.c b/gnulib/lib/unistr/u32-strmblen.c
new file mode 100644
index 0000000..722c434
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strmblen.c
@@ -0,0 +1,36 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strmblen (const uint32_t *s)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ return (c != 0 ? 1 : 0);
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/unistr/u32-strmbtouc.c b/gnulib/lib/unistr/u32-strmbtouc.c
new file mode 100644
index 0000000..7f02599
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strmbtouc.c
@@ -0,0 +1,39 @@
+/* Look at first character in UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strmbtouc (ucs4_t *puc, const uint32_t *s)
+{
+ uint32_t c = *s;
+
+#if CONFIG_UNICODE_SAFETY
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+#endif
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ return -1;
+#endif
+}
diff --git a/gnulib/lib/unistr/u32-strncat.c b/gnulib/lib/unistr/u32-strncat.c
new file mode 100644
index 0000000..7f1f277
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncat.c
@@ -0,0 +1,26 @@
+/* Concatenate UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strncat
+#define UNIT uint32_t
+#define U_STRLEN u32_strlen
+#include "u-strncat.h"
diff --git a/gnulib/lib/unistr/u32-strncmp.c b/gnulib/lib/unistr/u32-strncmp.c
new file mode 100644
index 0000000..27a1113
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncmp.c
@@ -0,0 +1,40 @@
+/* Compare UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ uint32_t uc1 = *s1++;
+ uint32_t uc2 = *s2++;
+ if (uc1 != 0 && uc1 == uc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that uc1 and uc2 each have at most 31 bits. */
+ return (int)uc1 - (int)uc2;
+ /* > 0 if uc1 > uc2, < 0 if uc1 < uc2, = 0 if uc1 and uc2 are both 0. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/unistr/u32-strncpy.c b/gnulib/lib/unistr/u32-strncpy.c
new file mode 100644
index 0000000..aa43115
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strncpy.c
@@ -0,0 +1,25 @@
+/* Copy UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strncpy
+#define UNIT uint32_t
+#include "u-strncpy.h"
diff --git a/gnulib/lib/unistr/u32-strnlen.c b/gnulib/lib/unistr/u32-strnlen.c
new file mode 100644
index 0000000..c2da0ed
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strnlen.c
@@ -0,0 +1,25 @@
+/* Determine bounded length of UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strnlen
+#define UNIT uint32_t
+#include "u-strnlen.h"
diff --git a/gnulib/lib/unistr/u32-strpbrk.c b/gnulib/lib/unistr/u32-strpbrk.c
new file mode 100644
index 0000000..df7571d
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strpbrk.c
@@ -0,0 +1,50 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strpbrk
+#define UNIT uint32_t
+#define U_STRCHR u32_strchr
+
+UNIT *
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return NULL;
+ if (accept[1] == 0)
+ {
+ ucs4_t uc = accept[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr == uc)
+ return (UNIT *) ptr;
+ return NULL;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (U_STRCHR (accept, *ptr))
+ return (UNIT *) ptr;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strrchr.c b/gnulib/lib/unistr/u32-strrchr.c
new file mode 100644
index 0000000..436e351
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strrchr.c
@@ -0,0 +1,38 @@
+/* Search character in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint32_t *
+u32_strrchr (const uint32_t *s, ucs4_t uc)
+{
+ /* Calling u32_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint32_t *result = NULL;
+
+ for (;; s++)
+ {
+ if (*s == uc)
+ result = (uint32_t *) s;
+ if (*s == 0)
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-strspn.c b/gnulib/lib/unistr/u32-strspn.c
new file mode 100644
index 0000000..56f5456
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strspn.c
@@ -0,0 +1,50 @@
+/* Search for some characters in UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strspn
+#define UNIT uint32_t
+#define U_STRCHR u32_strchr
+
+size_t
+FUNC (const UNIT *str, const UNIT *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == 0)
+ return 0;
+ if (accept[1] == 0)
+ {
+ ucs4_t uc = accept[0];
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (*ptr != uc)
+ break;
+ return ptr - str;
+ }
+ /* General case. */
+ {
+ const UNIT *ptr = str;
+ for (; *ptr != 0; ptr++)
+ if (!U_STRCHR (accept, *ptr))
+ break;
+ return ptr - str;
+ }
+}
diff --git a/gnulib/lib/unistr/u32-strstr.c b/gnulib/lib/unistr/u32-strstr.c
new file mode 100644
index 0000000..00a7f3e
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strstr.c
@@ -0,0 +1,34 @@
+/* Substring test for UTF-32 strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "malloca.h"
+
+#define UNIT uint32_t
+
+#define CANON_ELEMENT(c) c
+#include "str-kmp.h"
+
+#define FUNC u32_strstr
+#define U_STRCHR u32_strchr
+#define U_STRLEN u32_strlen
+#define U_STRNLEN u32_strnlen
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u32-strtok.c b/gnulib/lib/unistr/u32-strtok.c
new file mode 100644
index 0000000..54c9fed
--- /dev/null
+++ b/gnulib/lib/unistr/u32-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_strtok
+#define UNIT uint32_t
+#define U_STRSPN u32_strspn
+#define U_STRPBRK u32_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u32-to-u16.c b/gnulib/lib/unistr/u32-to-u16.c
new file mode 100644
index 0000000..131807b
--- /dev/null
+++ b/gnulib/lib/unistr/u32-to-u16.c
@@ -0,0 +1,130 @@
+/* Convert UTF-32 string to UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_to_u16
+#define SRC_UNIT uint32_t
+#define DST_UNIT uint16_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ uc = *s++;
+ /* No need to call the safe variant u32_mbtouc, because
+ u16_uctomb will verify uc anyway. */
+
+ /* Store it in the output string. */
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 2 > allocated)
+ allocated = length + 2;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-to-u8.c b/gnulib/lib/unistr/u32-to-u8.c
new file mode 100644
index 0000000..3b2e1d2
--- /dev/null
+++ b/gnulib/lib/unistr/u32-to-u8.c
@@ -0,0 +1,130 @@
+/* Convert UTF-32 string to UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u32_to_u8
+#define SRC_UNIT uint32_t
+#define DST_UNIT uint8_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ uc = *s++;
+ /* No need to call the safe variant u32_mbtouc, because
+ u8_uctomb will verify uc anyway. */
+
+ /* Store it in the output string. */
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 6 > allocated)
+ allocated = length + 6;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u8_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u32-uctomb.c b/gnulib/lib/unistr/u32-uctomb.c
new file mode 100644
index 0000000..9342806
--- /dev/null
+++ b/gnulib/lib/unistr/u32-uctomb.c
@@ -0,0 +1,47 @@
+/* Store a character in UTF-32 string.
+ Copyright (C) 2002, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u32_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u32_uctomb (uint32_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+ {
+ if (n > 0)
+ {
+ *s = uc;
+ return 1;
+ }
+ else
+ return -2;
+ }
+ else
+ return -1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-check.c b/gnulib/lib/unistr/u8-check.c
new file mode 100644
index 0000000..29dc463
--- /dev/null
+++ b/gnulib/lib/unistr/u8-check.c
@@ -0,0 +1,105 @@
+/* Check UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_check (const uint8_t *s, size_t n)
+{
+ const uint8_t *s_end = s + n;
+
+ while (s < s_end)
+ {
+ /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ s++;
+ continue;
+ }
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (s + 2 <= s_end
+ && (s[1] ^ 0x80) < 0x40)
+ {
+ s += 2;
+ continue;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (s + 3 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ s += 3;
+ continue;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (s + 4 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ s += 4;
+ continue;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (s + 5 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ s += 5;
+ continue;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (s + 6 <= s_end
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ s += 6;
+ continue;
+ }
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-chr.c b/gnulib/lib/unistr/u8-chr.c
new file mode 100644
index 0000000..0776d91
--- /dev/null
+++ b/gnulib/lib/unistr/u8-chr.c
@@ -0,0 +1,201 @@
+/* Search character in piece of UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+{
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ return (uint8_t *) memchr ((const char *) s, c0, n);
+ }
+
+ {
+ uint8_t c[6];
+ size_t uc_size;
+ uc_size = u8_uctomb_aux (c, uc, 6);
+
+ if (n < uc_size)
+ return NULL;
+
+ /* For multibyte character matching we use a Boyer-Moore like
+ algorithm that searches for the last byte, skipping multi-byte
+ jumps, and matches back from there.
+
+ Instead of using a table as is usual for Boyer-Moore, we compare
+ the candidate last byte s[UC_SIZE-1] with each of the possible
+ bytes in the UTF-8 representation of UC. If the final byte does
+ not match, we will perform up to UC_SIZE comparisons per memory
+ load---but each comparison lets us skip one byte in the input!
+
+ If the final byte matches, the "real" Boyer-Moore algorithm
+ is approximated. Instead, u8_chr just looks for other cN that
+ are equal to the final byte and uses those to try realigning to
+ another possible match. For example, when searching for 0xF0
+ 0xAA 0xBB 0xAA it will always skip forward by two bytes, even if
+ the character in the string was for example 0xF1 0xAA 0xBB 0xAA.
+ The advantage of this scheme is that the skip count after a failed
+ match can be computed outside the loop, and that it keeps the
+ complexity low for a pretty rare case. In particular, since c[0]
+ is never between 0x80 and 0xBF, c[0] is never equal to c[UC_SIZE-1]
+ and this is optimal for two-byte UTF-8 characters. */
+ switch (uc_size)
+ {
+ case 2:
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ const uint8_t *end = s + n - 1;
+
+ do
+ {
+ /* Here s < end.
+ Test whether s[0..1] == { c0, c1 }. */
+ uint8_t s1 = s[1];
+ if (s1 == c1)
+ {
+ if (*s == c0)
+ return (uint8_t *) s;
+ else
+ /* Skip the search at s + 1, because s[1] = c1 < c0. */
+ s += 2;
+ }
+ else
+ {
+ if (s1 == c0)
+ s++;
+ else
+ /* Skip the search at s + 1, because s[1] != c0. */
+ s += 2;
+ }
+ }
+ while (s < end);
+ break;
+ }
+
+ case 3:
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ const uint8_t *end = s + n - 2;
+ size_t skip;
+
+ if (c2 == c1)
+ skip = 1;
+ else
+ skip = 3;
+
+ do
+ {
+ /* Here s < end.
+ Test whether s[0..2] == { c0, c1, c2 }. */
+ uint8_t s2 = s[2];
+ if (s2 == c2)
+ {
+ if (s[1] == c1 && *s == c0)
+ return (uint8_t *) s;
+ else
+ /* If c2 != c1:
+ Skip the search at s + 1, because s[2] == c2 != c1.
+ Skip the search at s + 2, because s[2] == c2 < c0. */
+ s += skip;
+ }
+ else
+ {
+ if (s2 == c1)
+ s++;
+ else if (s2 == c0)
+ /* Skip the search at s + 1, because s[2] != c1. */
+ s += 2;
+ else
+ /* Skip the search at s + 1, because s[2] != c1.
+ Skip the search at s + 2, because s[2] != c0. */
+ s += 3;
+ }
+ }
+ while (s < end);
+ break;
+ }
+
+ case 4:
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+ const uint8_t *end = s + n - 3;
+ size_t skip;
+
+ if (c3 == c2)
+ skip = 1;
+ else if (c3 == c1)
+ skip = 2;
+ else
+ skip = 4;
+
+ do
+ {
+ /* Here s < end.
+ Test whether s[0..3] == { c0, c1, c2, c3 }. */
+ uint8_t s3 = s[3];
+ if (s3 == c3)
+ {
+ if (s[2] == c2 && s[1] == c1 && *s == c0)
+ return (uint8_t *) s;
+ else
+ /* If c3 != c2:
+ Skip the search at s + 1, because s[3] == c3 != c2.
+ If c3 != c1:
+ Skip the search at s + 2, because s[3] == c3 != c1.
+ Skip the search at s + 3, because s[3] == c3 < c0. */
+ s += skip;
+ }
+ else
+ {
+ if (s3 == c2)
+ s++;
+ else if (s3 == c1)
+ /* Skip the search at s + 1, because s[3] != c2. */
+ s += 2;
+ else if (s3 == c0)
+ /* Skip the search at s + 1, because s[3] != c2.
+ Skip the search at s + 2, because s[3] != c1. */
+ s += 3;
+ else
+ /* Skip the search at s + 1, because s[3] != c2.
+ Skip the search at s + 2, because s[3] != c1.
+ Skip the search at s + 3, because s[3] != c0. */
+ s += 4;
+ }
+ }
+ while (s < end);
+ break;
+ }
+ }
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u8-cmp.c b/gnulib/lib/unistr/u8-cmp.c
new file mode 100644
index 0000000..364e2c1
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cmp.c
@@ -0,0 +1,30 @@
+/* Compare pieces of UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return memcmp ((const char *) s1, (const char *) s2, n);
+}
diff --git a/gnulib/lib/unistr/u8-cmp2.c b/gnulib/lib/unistr/u8-cmp2.c
new file mode 100644
index 0000000..0b640f4
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cmp2.c
@@ -0,0 +1,28 @@
+/* Compare pieces of UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "minmax.h"
+
+#define FUNC u8_cmp2
+#define UNIT uint8_t
+#define U_CMP u8_cmp
+#include "u-cmp2.h"
diff --git a/gnulib/lib/unistr/u8-cpy-alloc.c b/gnulib/lib/unistr/u8-cpy-alloc.c
new file mode 100644
index 0000000..2b67fdb
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cpy-alloc.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_cpy_alloc
+#define UNIT uint8_t
+#include "u-cpy-alloc.h"
diff --git a/gnulib/lib/unistr/u8-cpy.c b/gnulib/lib/unistr/u8-cpy.c
new file mode 100644
index 0000000..ba56565
--- /dev/null
+++ b/gnulib/lib/unistr/u8-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_cpy
+#define UNIT uint8_t
+#include "u-cpy.h"
diff --git a/gnulib/lib/unistr/u8-endswith.c b/gnulib/lib/unistr/u8-endswith.c
new file mode 100644
index 0000000..eca82e2
--- /dev/null
+++ b/gnulib/lib/unistr/u8-endswith.c
@@ -0,0 +1,27 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_endswith
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_CMP u8_cmp
+#include "u-endswith.h"
diff --git a/gnulib/lib/unistr/u8-mblen.c b/gnulib/lib/unistr/u8-mblen.c
new file mode 100644
index 0000000..0652b41
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mblen.c
@@ -0,0 +1,99 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_mblen (const uint8_t *s, size_t n)
+{
+ if (n > 0)
+ {
+ /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ return (c != 0 ? 1 : 0);
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40
+#endif
+ )
+ return 2;
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0)
+#endif
+ )
+ return 3;
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+#endif
+ )
+ return 4;
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88)
+#endif
+ )
+ return 5;
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6
+#if CONFIG_UNICODE_SAFETY
+ && (s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84)
+#endif
+ )
+ return 6;
+ }
+#endif
+ }
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-mbsnlen.c b/gnulib/lib/unistr/u8-mbsnlen.c
new file mode 100644
index 0000000..4d086a4
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbsnlen.c
@@ -0,0 +1,44 @@
+/* Count characters in UTF-8 string.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+size_t
+u8_mbsnlen (const uint8_t *s, size_t n)
+{
+ size_t characters;
+
+ characters = 0;
+ while (n > 0)
+ {
+ ucs4_t uc;
+ int count = u8_mbtoucr (&uc, s, n);
+ characters++;
+ if (count == -2)
+ break;
+ if (count < 0)
+ count = u8_mbtouc (&uc, s, n);
+ else if (count == 0)
+ count = 1;
+ s += count;
+ n -= count;
+ }
+ return characters;
+}
diff --git a/gnulib/lib/unistr/u8-mbtouc-aux.c b/gnulib/lib/unistr/u8-mbtouc-aux.c
new file mode 100644
index 0000000..1ac2957
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-aux.c
@@ -0,0 +1,240 @@
+/* Conversion UTF-8 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xf9 || s[1] >= 0x88)
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xfd || s[1] >= 0x84)
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c b/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c
new file mode 100644
index 0000000..deea151
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-unsafe-aux.c
@@ -0,0 +1,260 @@
+/* Conversion UTF-8 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xf9 || s[1] >= 0x88)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xfd || s[1] >= 0x84)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc-unsafe.c b/gnulib/lib/unistr/u8-mbtouc-unsafe.c
new file mode 100644
index 0000000..b298925
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc-unsafe.c
@@ -0,0 +1,271 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xf9 || s[1] >= 0x88)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xfd || s[1] >= 0x84)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+#if CONFIG_UNICODE_SAFETY
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+#endif
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtouc.c b/gnulib/lib/unistr/u8-mbtouc.c
new file mode 100644
index 0000000..a62539e
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtouc.c
@@ -0,0 +1,250 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_mbtouc as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 5)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xf9 || s[1] >= 0x88)
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 6)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ if (c >= 0xfd || s[1] >= 0x84)
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 6;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 5;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return n;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/gnulib/lib/unistr/u8-mbtoucr.c b/gnulib/lib/unistr/u8-mbtoucr.c
new file mode 100644
index 0000000..ffcc134
--- /dev/null
+++ b/gnulib/lib/unistr/u8-mbtoucr.c
@@ -0,0 +1,285 @@
+/* Look at first character in UTF-8 string, returning an error code.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if (n >= 5)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ else if (c < 0xfe)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+ {
+ if (n >= 3)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if (n >= 4)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if (n >= 5)
+ {
+ if ((s[4] ^ 0x80) < 0x40)
+ {
+ if (n >= 6)
+ {
+ if ((s[5] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return -2;
+ }
+ }
+#endif
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-move.c b/gnulib/lib/unistr/u8-move.c
new file mode 100644
index 0000000..cdf5f59
--- /dev/null
+++ b/gnulib/lib/unistr/u8-move.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_move
+#define UNIT uint8_t
+#include "u-move.h"
diff --git a/gnulib/lib/unistr/u8-next.c b/gnulib/lib/unistr/u8-next.c
new file mode 100644
index 0000000..f6911f9
--- /dev/null
+++ b/gnulib/lib/unistr/u8-next.c
@@ -0,0 +1,37 @@
+/* Iterate over next character in UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_next (ucs4_t *puc, const uint8_t *s)
+{
+ int count;
+
+ count = u8_strmbtouc (puc, s);
+ if (count > 0)
+ return s + count;
+ else
+ {
+ if (count < 0)
+ *puc = 0xfffd;
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/unistr/u8-prev.c b/gnulib/lib/unistr/u8-prev.c
new file mode 100644
index 0000000..29118d6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-prev.c
@@ -0,0 +1,93 @@
+/* Iterate over previous character in UTF-8 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+const uint8_t *
+u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start)
+{
+ /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
+ if (s != start)
+ {
+ uint8_t c_1 = s[-1];
+
+ if (c_1 < 0x80)
+ {
+ *puc = c_1;
+ return s - 1;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_1 ^ 0x80) < 0x40)
+#endif
+ if (s - 1 != start)
+ {
+ uint8_t c_2 = s[-2];
+
+ if (c_2 >= 0xc2 && c_2 < 0xe0)
+ {
+ *puc = ((unsigned int) (c_2 & 0x1f) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 2;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_2 ^ 0x80) < 0x40)
+#endif
+ if (s - 2 != start)
+ {
+ uint8_t c_3 = s[-3];
+
+ if (c_3 >= 0xe0 && c_3 < 0xf0
+#if CONFIG_UNICODE_SAFETY
+ && (c_3 >= 0xe1 || c_2 >= 0xa0)
+ && (c_3 != 0xed || c_2 < 0xa0)
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c_3 & 0x0f) << 12)
+ | ((unsigned int) (c_2 ^ 0x80) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 3;
+ }
+#if CONFIG_UNICODE_SAFETY
+ if ((c_3 ^ 0x80) < 0x40)
+#endif
+ if (s - 3 != start)
+ {
+ uint8_t c_4 = s[-4];
+
+ if (c_4 >= 0xf0 && c_4 < 0xf8
+#if CONFIG_UNICODE_SAFETY
+ && (c_4 >= 0xf1 || c_3 >= 0x90)
+ && (c_4 < 0xf4 || (c_4 == 0xf4 && c_3 < 0x90))
+#endif
+ )
+ {
+ *puc = ((unsigned int) (c_4 & 0x07) << 18)
+ | ((unsigned int) (c_3 ^ 0x80) << 12)
+ | ((unsigned int) (c_2 ^ 0x80) << 6)
+ | (unsigned int) (c_1 ^ 0x80);
+ return s - 4;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-set.c b/gnulib/lib/unistr/u8-set.c
new file mode 100644
index 0000000..2b7cbb5
--- /dev/null
+++ b/gnulib/lib/unistr/u8-set.c
@@ -0,0 +1,44 @@
+/* Fill UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_set
+#define UNIT uint8_t
+#define IS_SINGLE_UNIT(uc) (uc < 0x80)
+
+#include <errno.h>
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *s, ucs4_t uc, size_t n)
+{
+ if (n > 0)
+ {
+ if (IS_SINGLE_UNIT (uc))
+ memset ((char *) s, uc, n);
+ else
+ {
+ errno = EILSEQ;
+ return NULL;
+ }
+ }
+ return s;
+}
diff --git a/gnulib/lib/unistr/u8-startswith.c b/gnulib/lib/unistr/u8-startswith.c
new file mode 100644
index 0000000..2190cb1
--- /dev/null
+++ b/gnulib/lib/unistr/u8-startswith.c
@@ -0,0 +1,25 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_startswith
+#define UNIT uint8_t
+#include "u-startswith.h"
diff --git a/gnulib/lib/unistr/u8-stpcpy.c b/gnulib/lib/unistr/u8-stpcpy.c
new file mode 100644
index 0000000..97386e8
--- /dev/null
+++ b/gnulib/lib/unistr/u8-stpcpy.c
@@ -0,0 +1,44 @@
+/* Copy UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure stpcpy() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if HAVE_STPCPY
+
+# include <string.h>
+
+uint8_t *
+u8_stpcpy (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) stpcpy ((char *) dest, (const char *) src);
+}
+
+#else
+
+# define FUNC u8_stpcpy
+# define UNIT uint8_t
+# include "u-stpcpy.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-stpncpy.c b/gnulib/lib/unistr/u8-stpncpy.c
new file mode 100644
index 0000000..21698b1
--- /dev/null
+++ b/gnulib/lib/unistr/u8-stpncpy.c
@@ -0,0 +1,44 @@
+/* Copy UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure stpncpy() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+
+# include <string.h>
+
+uint8_t *
+u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) stpncpy ((char *) dest, (const char *) src, n);
+}
+
+#else
+
+# define FUNC u8_stpncpy
+# define UNIT uint8_t
+# include "u-stpncpy.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strcat.c b/gnulib/lib/unistr/u8-strcat.c
new file mode 100644
index 0000000..f569426
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcat.c
@@ -0,0 +1,29 @@
+/* Concatenate UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strcat (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) strcat ((char *) dest, (const char *) src);
+}
diff --git a/gnulib/lib/unistr/u8-strchr.c b/gnulib/lib/unistr/u8-strchr.c
new file mode 100644
index 0000000..0bfbc10
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strchr.c
@@ -0,0 +1,240 @@
+/* Search character in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strchr (const uint8_t *s, ucs4_t uc)
+{
+ uint8_t c[6];
+
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ if (false)
+ {
+ /* Unoptimized code. */
+ for (;;)
+ {
+ uint8_t s0 = *s;
+ if (s0 == c0)
+ return (uint8_t *) s;
+ s++;
+ if (s0 == 0)
+ break;
+ }
+ }
+ else
+ {
+ /* Optimized code.
+ strchr() is often so well optimized, that it's worth the
+ added function call. */
+ return (uint8_t *) strchr ((const char *) s, c0);
+ }
+ }
+ else
+ /* Loops equivalent to strstr, optimized for a specific length (2, 3, 4)
+ of the needle. We use an algorithm similar to Boyer-Moore which
+ is documented in lib/unistr/u8-chr.c. There is additional
+ complication because we need to check after every byte for
+ a NUL byte, but the idea is the same. */
+ switch (u8_uctomb_aux (c, uc, 6))
+ {
+ case 2:
+ if (*s == 0 || s[1] == 0)
+ break;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ /* Search for { c0, c1 }. */
+ uint8_t s1 = s[1];
+
+ for (;;)
+ {
+ /* Here s[0] != 0, s[1] != 0.
+ Test whether s[0..1] == { c0, c1 }. */
+ if (s1 == c1)
+ {
+ if (*s == c0)
+ return (uint8_t *) s;
+ else
+ /* Skip the search at s + 1, because s[1] = c1 < c0. */
+ goto case2_skip2;
+ }
+ else
+ {
+ if (s1 == c0)
+ goto case2_skip1;
+ else
+ /* Skip the search at s + 1, because s[1] != c0. */
+ goto case2_skip2;
+ }
+ case2_skip2:
+ s++;
+ s1 = s[1];
+ if (s[1] == 0)
+ break;
+ case2_skip1:
+ s++;
+ s1 = s[1];
+ if (s[1] == 0)
+ break;
+ }
+ }
+ break;
+
+ case 3:
+ if (*s == 0 || s[1] == 0 || s[2] == 0)
+ break;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ /* Search for { c0, c1, c2 }. */
+ uint8_t s2 = s[2];
+
+ for (;;)
+ {
+ /* Here s[0] != 0, s[1] != 0, s[2] != 0.
+ Test whether s[0..2] == { c0, c1, c2 }. */
+ if (s2 == c2)
+ {
+ if (s[1] == c1 && *s == c0)
+ return (uint8_t *) s;
+ else
+ /* If c2 != c1:
+ Skip the search at s + 1, because s[2] == c2 != c1.
+ Skip the search at s + 2, because s[2] == c2 < c0. */
+ if (c2 == c1)
+ goto case3_skip1;
+ else
+ goto case3_skip3;
+ }
+ else
+ {
+ if (s2 == c1)
+ goto case3_skip1;
+ else if (s2 == c0)
+ /* Skip the search at s + 1, because s[2] != c1. */
+ goto case3_skip2;
+ else
+ /* Skip the search at s + 1, because s[2] != c1.
+ Skip the search at s + 2, because s[2] != c0. */
+ goto case3_skip3;
+ }
+ case3_skip3:
+ s++;
+ s2 = s[2];
+ if (s[2] == 0)
+ break;
+ case3_skip2:
+ s++;
+ s2 = s[2];
+ if (s[2] == 0)
+ break;
+ case3_skip1:
+ s++;
+ s2 = s[2];
+ if (s[2] == 0)
+ break;
+ }
+ }
+ break;
+
+ case 4:
+ if (*s == 0 || s[1] == 0 || s[2] == 0 || s[3] == 0)
+ break;
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+ /* Search for { c0, c1, c2, c3 }. */
+ uint8_t s3 = s[3];
+
+ for (;;)
+ {
+ /* Here s[0] != 0, s[1] != 0, s[2] != 0, s[3] != 0.
+ Test whether s[0..3] == { c0, c1, c2, c3 }. */
+ if (s3 == c3)
+ {
+ if (s[2] == c2 && s[1] == c1 && *s == c0)
+ return (uint8_t *) s;
+ else
+ /* If c3 != c2:
+ Skip the search at s + 1, because s[3] == c3 != c2.
+ If c3 != c1:
+ Skip the search at s + 2, because s[3] == c3 != c1.
+ Skip the search at s + 3, because s[3] == c3 < c0. */
+ if (c3 == c2)
+ goto case4_skip1;
+ else if (c3 == c1)
+ goto case4_skip2;
+ else
+ goto case4_skip4;
+ }
+ else
+ {
+ if (s3 == c2)
+ goto case4_skip1;
+ else if (s3 == c1)
+ /* Skip the search at s + 1, because s[3] != c2. */
+ goto case4_skip2;
+ else if (s3 == c0)
+ /* Skip the search at s + 1, because s[3] != c2.
+ Skip the search at s + 2, because s[3] != c1. */
+ goto case4_skip3;
+ else
+ /* Skip the search at s + 1, because s[3] != c2.
+ Skip the search at s + 2, because s[3] != c1.
+ Skip the search at s + 3, because s[3] != c0. */
+ goto case4_skip4;
+ }
+ case4_skip4:
+ s++;
+ s3 = s[3];
+ if (s[3] == 0)
+ break;
+ case4_skip3:
+ s++;
+ s3 = s[3];
+ if (s[3] == 0)
+ break;
+ case4_skip2:
+ s++;
+ s3 = s[3];
+ if (s[3] == 0)
+ break;
+ case4_skip1:
+ s++;
+ s3 = s[3];
+ if (s[3] == 0)
+ break;
+ }
+ }
+ break;
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/unistr/u8-strcmp.c b/gnulib/lib/unistr/u8-strcmp.c
new file mode 100644
index 0000000..c4968b7
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcmp.c
@@ -0,0 +1,30 @@
+/* Compare UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return strcmp ((const char *) s1, (const char *) s2);
+}
diff --git a/gnulib/lib/unistr/u8-strcoll.c b/gnulib/lib/unistr/u8-strcoll.c
new file mode 100644
index 0000000..6918aa6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcoll.c
@@ -0,0 +1,33 @@
+/* Compare UTF-8 strings using the collation rules of the current locale.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uniconv.h"
+
+#define FUNC u8_strcoll
+#define UNIT uint8_t
+#define U_STRCMP u8_strcmp
+#define U_STRCONV_TO_ENCODING u8_strconv_to_encoding
+#include "u-strcoll.h"
diff --git a/gnulib/lib/unistr/u8-strcpy.c b/gnulib/lib/unistr/u8-strcpy.c
new file mode 100644
index 0000000..39fcb99
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcpy.c
@@ -0,0 +1,29 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strcpy (uint8_t *dest, const uint8_t *src)
+{
+ return (uint8_t *) strcpy ((char *) dest, (const char *) src);
+}
diff --git a/gnulib/lib/unistr/u8-strcspn.c b/gnulib/lib/unistr/u8-strcspn.c
new file mode 100644
index 0000000..96d18e7
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strcspn.c
@@ -0,0 +1,28 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strcspn
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_STRMBTOUC u8_strmbtouc
+#define U_STRCHR u8_strchr
+#include "u-strcspn.h"
diff --git a/gnulib/lib/unistr/u8-strdup.c b/gnulib/lib/unistr/u8-strdup.c
new file mode 100644
index 0000000..7db00ba
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strdup.c
@@ -0,0 +1,40 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if HAVE_STRDUP
+
+# include <string.h>
+
+uint8_t *
+u8_strdup (const uint8_t *s)
+{
+ return (uint8_t *) strdup ((const char *) s);
+}
+
+#else
+
+# define FUNC u8_strdup
+# define UNIT uint8_t
+# define U_STRLEN u8_strlen
+# include "u-strdup.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strlen.c b/gnulib/lib/unistr/u8-strlen.c
new file mode 100644
index 0000000..158213f
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strlen.c
@@ -0,0 +1,29 @@
+/* Determine length of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+size_t
+u8_strlen (const uint8_t *s)
+{
+ return strlen ((const char *) s);
+}
diff --git a/gnulib/lib/unistr/u8-strmblen.c b/gnulib/lib/unistr/u8-strmblen.c
new file mode 100644
index 0000000..ecf5d96
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strmblen.c
@@ -0,0 +1,97 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_strmblen (const uint8_t *s)
+{
+ /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ return (c != 0 ? 1 : 0);
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#else
+ if (s[1] != 0)
+#endif
+ return 2;
+ }
+ else if (c < 0xf0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#else
+ if (s[1] != 0 && s[2] != 0)
+#endif
+ return 3;
+ }
+ else if (c < 0xf8)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0)
+#endif
+ return 4;
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0)
+#endif
+ return 5;
+ }
+ else if (c < 0xfe)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0 && s[5] != 0)
+#endif
+ return 6;
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-strmbtouc.c b/gnulib/lib/unistr/u8-strmbtouc.c
new file mode 100644
index 0000000..e15a7a1
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strmbtouc.c
@@ -0,0 +1,130 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2000, 2002, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_strmbtouc (ucs4_t *puc, const uint8_t *s)
+{
+ /* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return (c != 0 ? 1 : 0);
+ }
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40)
+#else
+ if (s[1] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ }
+ else if (c < 0xf0)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+#else
+ if (s[1] != 0 && s[2] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ }
+ else if (c < 0xf8)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40
+ && (c >= 0xf1 || s[1] >= 0x90)
+#if 1
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+#endif
+ )
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ }
+#if 0
+ else if (c < 0xfc)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (c >= 0xf9 || s[1] >= 0x88))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x03) << 24)
+ | ((unsigned int) (s[1] ^ 0x80) << 18)
+ | ((unsigned int) (s[2] ^ 0x80) << 12)
+ | ((unsigned int) (s[3] ^ 0x80) << 6)
+ | (unsigned int) (s[4] ^ 0x80);
+ return 5;
+ }
+ }
+ else if (c < 0xfe)
+ {
+#if CONFIG_UNICODE_SAFETY
+ if ((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+ && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+ && (s[5] ^ 0x80) < 0x40
+ && (c >= 0xfd || s[1] >= 0x84))
+#else
+ if (s[1] != 0 && s[2] != 0 && s[3] != 0 && s[4] != 0 && s[5] != 0)
+#endif
+ {
+ *puc = ((unsigned int) (c & 0x01) << 30)
+ | ((unsigned int) (s[1] ^ 0x80) << 24)
+ | ((unsigned int) (s[2] ^ 0x80) << 18)
+ | ((unsigned int) (s[3] ^ 0x80) << 12)
+ | ((unsigned int) (s[4] ^ 0x80) << 6)
+ | (unsigned int) (s[5] ^ 0x80);
+ return 6;
+ }
+ }
+#endif
+ }
+ /* invalid or incomplete multibyte character */
+ return -1;
+}
diff --git a/gnulib/lib/unistr/u8-strncat.c b/gnulib/lib/unistr/u8-strncat.c
new file mode 100644
index 0000000..90ac4e0
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncat.c
@@ -0,0 +1,29 @@
+/* Concatenate UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strncat (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) strncat ((char *) dest, (const char *) src, n);
+}
diff --git a/gnulib/lib/unistr/u8-strncmp.c b/gnulib/lib/unistr/u8-strncmp.c
new file mode 100644
index 0000000..036d899
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncmp.c
@@ -0,0 +1,30 @@
+/* Compare UTF-8 strings.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+int
+u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+{
+ /* Use the fact that the UTF-8 encoding preserves lexicographic order. */
+ return strncmp ((const char *) s1, (const char *) s2, n);
+}
diff --git a/gnulib/lib/unistr/u8-strncpy.c b/gnulib/lib/unistr/u8-strncpy.c
new file mode 100644
index 0000000..040d3a0
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strncpy.c
@@ -0,0 +1,29 @@
+/* Copy UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+uint8_t *
+u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n)
+{
+ return (uint8_t *) strncpy ((char *) dest, (const char *) src, n);
+}
diff --git a/gnulib/lib/unistr/u8-strnlen.c b/gnulib/lib/unistr/u8-strnlen.c
new file mode 100644
index 0000000..b82af62
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strnlen.c
@@ -0,0 +1,44 @@
+/* Determine bounded length of UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Ensure strnlen() gets declared. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if __GLIBC__ >= 2 || defined __UCLIBC__
+
+# include <string.h>
+
+size_t
+u8_strnlen (const uint8_t *s, size_t maxlen)
+{
+ return strnlen ((const char *) s, maxlen);
+}
+
+#else
+
+# define FUNC u8_strnlen
+# define UNIT uint8_t
+# include "u-strnlen.h"
+
+#endif
diff --git a/gnulib/lib/unistr/u8-strpbrk.c b/gnulib/lib/unistr/u8-strpbrk.c
new file mode 100644
index 0000000..b7d38f7
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strpbrk.c
@@ -0,0 +1,27 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strpbrk
+#define UNIT uint8_t
+#define U_STRMBTOUC u8_strmbtouc
+#define U_STRCHR u8_strchr
+#include "u-strpbrk.h"
diff --git a/gnulib/lib/unistr/u8-strrchr.c b/gnulib/lib/unistr/u8-strrchr.c
new file mode 100644
index 0000000..38beebe
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strrchr.c
@@ -0,0 +1,102 @@
+/* Search character in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2011 Free Software Foundation,
+ Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+uint8_t *
+u8_strrchr (const uint8_t *s, ucs4_t uc)
+{
+ /* Calling u8_strlen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ uint8_t *result = NULL;
+ uint8_t c[6];
+
+ if (uc < 0x80)
+ {
+ uint8_t c0 = uc;
+
+ for (;; s++)
+ {
+ if (*s == c0)
+ result = (uint8_t *) s;
+ if (*s == 0)
+ break;
+ }
+ }
+ else
+ switch (u8_uctomb_aux (c, uc, 6))
+ {
+ case 2:
+ if (*s)
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[1] == 0)
+ break;
+ if (*s == c0 && s[1] == c1)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 3:
+ if (*s && s[1])
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[2] == 0)
+ break;
+ if (*s == c0 && s[1] == c1 && s[2] == c2)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+
+ case 4:
+ if (*s && s[1] && s[2])
+ {
+ uint8_t c0 = c[0];
+ uint8_t c1 = c[1];
+ uint8_t c2 = c[2];
+ uint8_t c3 = c[3];
+
+ /* FIXME: Maybe walking the string via u8_mblen is a win? */
+ for (;; s++)
+ {
+ if (s[3] == 0)
+ break;
+ if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3)
+ result = (uint8_t *) s;
+ }
+ }
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-strspn.c b/gnulib/lib/unistr/u8-strspn.c
new file mode 100644
index 0000000..8842557
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strspn.c
@@ -0,0 +1,29 @@
+/* Search for some characters in UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strspn
+#define UNIT uint8_t
+#define U_STRLEN u8_strlen
+#define U_STRMBTOUC u8_strmbtouc
+#define U_CMP u8_cmp
+#define U_STRCHR u8_strchr
+#include "u-strspn.h"
diff --git a/gnulib/lib/unistr/u8-strstr.c b/gnulib/lib/unistr/u8-strstr.c
new file mode 100644
index 0000000..3f725cb
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strstr.c
@@ -0,0 +1,32 @@
+/* Substring test for UTF-8 strings.
+ Copyright (C) 1999, 2002, 2006, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+/* FIXME: Maybe walking the string via u8_mblen is a win? */
+
+#define FUNC u8_strstr
+#define UNIT uint8_t
+#define U_STRCHR u8_strchr
+#define U_STRMBTOUC u8_strmbtouc
+#define UNIT_IS_UINT8_T 1
+#include "u-strstr.h"
diff --git a/gnulib/lib/unistr/u8-strtok.c b/gnulib/lib/unistr/u8-strtok.c
new file mode 100644
index 0000000..7f6c1ec
--- /dev/null
+++ b/gnulib/lib/unistr/u8-strtok.c
@@ -0,0 +1,27 @@
+/* Tokenize UTF-8 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_strtok
+#define UNIT uint8_t
+#define U_STRSPN u8_strspn
+#define U_STRPBRK u8_strpbrk
+#include "u-strtok.h"
diff --git a/gnulib/lib/unistr/u8-to-u16.c b/gnulib/lib/unistr/u8-to-u16.c
new file mode 100644
index 0000000..00426e6
--- /dev/null
+++ b/gnulib/lib/unistr/u8-to-u16.c
@@ -0,0 +1,136 @@
+/* Convert UTF-8 string to UTF-16 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_to_u16
+#define SRC_UNIT uint8_t
+#define DST_UNIT uint16_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u8_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count == -1)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (count == -2)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 2 > allocated)
+ allocated = length + 2;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ count = u16_uctomb (result + length, uc, allocated - length);
+ if (count < 0)
+ abort ();
+ }
+ length += count;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-to-u32.c b/gnulib/lib/unistr/u8-to-u32.c
new file mode 100644
index 0000000..f208975
--- /dev/null
+++ b/gnulib/lib/unistr/u8-to-u32.c
@@ -0,0 +1,125 @@
+/* Convert UTF-8 string to UTF-32 string.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_to_u32
+#define SRC_UNIT uint8_t
+#define DST_UNIT uint32_t
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+DST_UNIT *
+FUNC (const SRC_UNIT *s, size_t n, DST_UNIT *resultbuf, size_t *lengthp)
+{
+ const SRC_UNIT *s_end = s + n;
+ /* Output string accumulator. */
+ DST_UNIT *result;
+ size_t allocated;
+ size_t length;
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count;
+
+ /* Fetch a Unicode character from the input string. */
+ count = u8_mbtoucr (&uc, s, s_end - s);
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = EILSEQ;
+ return NULL;
+ }
+ s += count;
+
+ /* Store it in the output string. */
+ if (length + 1 > allocated)
+ {
+ DST_UNIT *memory;
+
+ allocated = (allocated > 0 ? 2 * allocated : 12);
+ if (length + 1 > allocated)
+ allocated = length + 1;
+ if (result == resultbuf || result == NULL)
+ memory = (DST_UNIT *) malloc (allocated * sizeof (DST_UNIT));
+ else
+ memory =
+ (DST_UNIT *) realloc (result, allocated * sizeof (DST_UNIT));
+
+ if (memory == NULL)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (result == resultbuf && length > 0)
+ memcpy ((char *) memory, (char *) result,
+ length * sizeof (DST_UNIT));
+ result = memory;
+ }
+ result[length++] = uc;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (DST_UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DST_UNIT *memory;
+
+ memory = (DST_UNIT *) realloc (result, length * sizeof (DST_UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+}
diff --git a/gnulib/lib/unistr/u8-uctomb-aux.c b/gnulib/lib/unistr/u8-uctomb-aux.c
new file mode 100644
index 0000000..2014c8c
--- /dev/null
+++ b/gnulib/lib/unistr/u8-uctomb-aux.c
@@ -0,0 +1,69 @@
+/* Conversion UCS-4 to UTF-8.
+ Copyright (C) 2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+int
+u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
+{
+ int count;
+
+ if (uc < 0x80)
+ /* The case n >= 1 is already handled by the caller. */
+ return -2;
+ else if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+#if 0
+ else if (uc < 0x200000)
+ count = 4;
+ else if (uc < 0x4000000)
+ count = 5;
+ else if (uc <= 0x7fffffff)
+ count = 6;
+#else
+ else if (uc < 0x110000)
+ count = 4;
+#endif
+ else
+ return -1;
+
+ if (n < count)
+ return -2;
+
+ switch (count) /* note: code falls through cases! */
+ {
+#if 0
+ case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000;
+ case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000;
+#endif
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+}
diff --git a/gnulib/lib/unistr/u8-uctomb.c b/gnulib/lib/unistr/u8-uctomb.c
new file mode 100644
index 0000000..65a4053
--- /dev/null
+++ b/gnulib/lib/unistr/u8-uctomb.c
@@ -0,0 +1,88 @@
+/* Store a character in UTF-8 string.
+ Copyright (C) 2002, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_uctomb (uint8_t *s, ucs4_t uc, int n)
+{
+ if (uc < 0x80)
+ {
+ if (n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ /* else return -2, below. */
+ }
+ else
+ {
+ int count;
+
+ if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+#if 0
+ else if (uc < 0x200000)
+ count = 4;
+ else if (uc < 0x4000000)
+ count = 5;
+ else if (uc <= 0x7fffffff)
+ count = 6;
+#else
+ else if (uc < 0x110000)
+ count = 4;
+#endif
+ else
+ return -1;
+
+ if (n >= count)
+ {
+ switch (count) /* note: code falls through cases! */
+ {
+#if 0
+ case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000;
+ case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000;
+#endif
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+ }
+ }
+ return -2;
+}
+
+#endif
diff --git a/gnulib/lib/unitypes.in.h b/gnulib/lib/unitypes.in.h
new file mode 100644
index 0000000..e78c97d
--- /dev/null
+++ b/gnulib/lib/unitypes.in.h
@@ -0,0 +1,26 @@
+/* Elementary types for the GNU UniString library.
+ Copyright (C) 2002, 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNITYPES_H
+#define _UNITYPES_H
+
+/* Get uint8_t, uint16_t, uint32_t. */
+#include <stdint.h>
+
+/* Type representing a Unicode character. */
+typedef uint32_t ucs4_t;
+
+#endif /* _UNITYPES_H */
diff --git a/gnulib/lib/uniwbrk.in.h b/gnulib/lib/uniwbrk.in.h
new file mode 100644
index 0000000..19cdb13
--- /dev/null
+++ b/gnulib/lib/uniwbrk.in.h
@@ -0,0 +1,83 @@
+/* Word breaks in Unicode strings.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNIWBRK_H
+#define _UNIWBRK_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Property defined in Unicode Standard Annex #29, section "Word Boundaries"
+ <http://www.unicode.org/reports/tr29/#Word_Boundaries> */
+
+/* Possible values of the Word_Break property.
+ This enumeration may be extended in the future. */
+enum
+{
+ WBP_OTHER = 0,
+ WBP_CR = 11,
+ WBP_LF = 12,
+ WBP_NEWLINE = 10,
+ WBP_EXTEND = 8,
+ WBP_FORMAT = 9,
+ WBP_KATAKANA = 1,
+ WBP_ALETTER = 2,
+ WBP_MIDNUMLET = 3,
+ WBP_MIDLETTER = 4,
+ WBP_MIDNUM = 5,
+ WBP_NUMERIC = 6,
+ WBP_EXTENDNUMLET = 7
+};
+
+/* Return the Word_Break property of a Unicode character. */
+extern int
+ uc_wordbreak_property (ucs4_t uc);
+
+/* ========================================================================= */
+
+/* Word breaks. */
+
+/* Determine the word break points in S, and store the result at p[0..n-1].
+ p[i] = 1 means that there is a word boundary between s[i-1] and s[i].
+ p[i] = 0 means that s[i-1] and s[i] must not be separated.
+ */
+extern void
+ u8_wordbreaks (const uint8_t *s, size_t n, char *p);
+extern void
+ u16_wordbreaks (const uint16_t *s, size_t n, char *p);
+extern void
+ u32_wordbreaks (const uint32_t *s, size_t n, char *p);
+extern void
+ ulc_wordbreaks (const char *s, size_t n, char *p);
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNIWBRK_H */
diff --git a/gnulib/lib/uniwbrk/u-wordbreaks.h b/gnulib/lib/uniwbrk/u-wordbreaks.h
new file mode 100644
index 0000000..ae0cddd
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u-wordbreaks.h
@@ -0,0 +1,127 @@
+/* Word breaks in UTF-8/UTF-16/UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+void
+FUNC (const UNIT *s, size_t n, char *p)
+{
+ if (n > 0)
+ {
+ const UNIT *s_end = s + n;
+
+ /* Word break property of the last character.
+ -1 at the very beginning of the string. */
+ int last_char_prop = -1;
+
+ /* Format and Extend characters are ignored; this means, the mostly used
+ unit is the complex character (= character with subsequent ignored
+ characters).
+ Word break property of the last complex character.
+ -1 at the very beginning of the string. */
+ int last_compchar_prop = -1;
+ char *last_compchar_ptr = NULL;
+
+ /* For recognizing rules involving 3 complex characters:
+ Word break property of the second-to-last complex character.
+ -1 at the very beginning of the string. */
+ int secondlast_compchar_prop = -1;
+
+ /* Don't break inside multibyte characters. */
+ memset (p, 0, n);
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+ int prop = uc_wordbreak_property (uc);
+
+ /* No break at the start of the string. */
+ if (last_char_prop >= 0)
+ {
+ /* No break between CR and LF. */
+ if (last_char_prop == WBP_CR && prop == WBP_LF)
+ /* *p = 0 */;
+ /* Break before and after newlines. */
+ else if (last_char_prop >= WBP_NEWLINE
+ /* same as:
+ last_char_prop == WBP_CR
+ || last_char_prop == WBP_LF
+ || last_char_prop == WBP_NEWLINE */
+ || prop >= WBP_NEWLINE
+ /* same as:
+ prop == WBP_CR
+ || prop == WBP_LF
+ || prop == WBP_NEWLINE */)
+ *p = 1;
+ /* Ignore Format and Extend characters. */
+ else if (!(prop == WBP_EXTEND || prop == WBP_FORMAT))
+ {
+ /* No break in these situations (see UAX #29):
+
+ secondlast last current
+
+ ALetter (MidLetter | MidNumLet) × ALetter (WB7)
+ ALetter × (MidLetter | MidNumLet) ALetter (WB6)
+ Numeric (MidNum | MidNumLet) × Numeric (WB11)
+ Numeric × (MidNum | MidNumLet) Numeric (WB12)
+ ALetter × ALetter (WB5)
+ ALetter × Numeric (WB9)
+ Numeric × ALetter (WB10)
+ Numeric × Numeric (WB8)
+ Katakana × Katakana (WB13)
+ (ALetter | Numeric | Katakana) × ExtendNumLet (WB13a)
+ ExtendNumLet × ExtendNumLet (WB13a)
+ ExtendNumLet × (ALetter | Numeric | Katakana) (WB13b)
+ */
+ /* No break across certain punctuation. Also, disable word
+ breaks that were recognized earlier (due to lookahead of
+ only one complex character). */
+ if ((prop == WBP_ALETTER
+ && (last_compchar_prop == WBP_MIDLETTER
+ || last_compchar_prop == WBP_MIDNUMLET)
+ && secondlast_compchar_prop == WBP_ALETTER)
+ || (prop == WBP_NUMERIC
+ && (last_compchar_prop == WBP_MIDNUM
+ || last_compchar_prop == WBP_MIDNUMLET)
+ && secondlast_compchar_prop == WBP_NUMERIC))
+ {
+ *last_compchar_ptr = 0;
+ /* *p = 0; */
+ }
+ else
+ {
+ /* Perform a single table lookup. */
+ if (uniwbrk_table[last_compchar_prop][prop])
+ *p = 1;
+ /* else *p = 0; */
+ }
+ }
+ }
+
+ last_char_prop = prop;
+ /* Ignore Format and Extend characters, except at the start of the string. */
+ if (last_compchar_prop < 0 || !(prop == WBP_EXTEND || prop == WBP_FORMAT))
+ {
+ secondlast_compchar_prop = last_compchar_prop;
+ last_compchar_prop = prop;
+ last_compchar_ptr = p;
+ }
+
+ s += count;
+ p += count;
+ }
+ }
+}
diff --git a/gnulib/lib/uniwbrk/u16-wordbreaks.c b/gnulib/lib/uniwbrk/u16-wordbreaks.c
new file mode 100644
index 0000000..e01bb64
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u16-wordbreaks.c
@@ -0,0 +1,31 @@
+/* Word breaks in UTF-16 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u16_wordbreaks
+#define UNIT uint16_t
+#define U_MBTOUC_UNSAFE u16_mbtouc_unsafe
+#include "u-wordbreaks.h"
diff --git a/gnulib/lib/uniwbrk/u32-wordbreaks.c b/gnulib/lib/uniwbrk/u32-wordbreaks.c
new file mode 100644
index 0000000..bdbb7ab
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u32-wordbreaks.c
@@ -0,0 +1,31 @@
+/* Word breaks in UTF-32 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u32_wordbreaks
+#define UNIT uint32_t
+#define U_MBTOUC_UNSAFE u32_mbtouc_unsafe
+#include "u-wordbreaks.h"
diff --git a/gnulib/lib/uniwbrk/u8-wordbreaks.c b/gnulib/lib/uniwbrk/u8-wordbreaks.c
new file mode 100644
index 0000000..85efc3f
--- /dev/null
+++ b/gnulib/lib/uniwbrk/u8-wordbreaks.c
@@ -0,0 +1,124 @@
+/* Word breaks in UTF-8 strings.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <string.h>
+
+#include "unistr.h"
+#include "uniwbrk/wbrktable.h"
+
+#define FUNC u8_wordbreaks
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#include "u-wordbreaks.h"
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ if (argc == 1)
+ {
+ /* Display all the word breaks in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ u8_wordbreaks ((uint8_t *) input, length, breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case 1:
+ /* U+2027 in UTF-8 encoding */
+ putc (0xe2, stdout); putc (0x80, stdout); putc (0xa7, stdout);
+ break;
+ case 0:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniwbrk/ulc-wordbreaks.c b/gnulib/lib/uniwbrk/ulc-wordbreaks.c
new file mode 100644
index 0000000..21a79b0
--- /dev/null
+++ b/gnulib/lib/uniwbrk/ulc-wordbreaks.c
@@ -0,0 +1,201 @@
+/* Word breaks in strings.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "localcharset.h"
+#include "uniconv.h"
+#include "unilbrk/ulc-common.h"
+
+/* Word breaks of a string in an arbitrary encoding.
+
+ We convert the input string to Unicode.
+
+ The standardized Unicode encodings are UTF-8, UCS-2, UCS-4, UTF-16,
+ UTF-16BE, UTF-16LE, UTF-7. UCS-2 supports only characters up to
+ \U0000FFFF. UTF-16 and variants support only characters up to
+ \U0010FFFF. UTF-7 is way too complex and not supported by glibc-2.1.
+ UCS-4 specification leaves doubts about endianness and byte order mark.
+ glibc currently interprets it as big endian without byte order mark,
+ but this is not backed by an RFC. So we use UTF-8. It supports
+ characters up to \U7FFFFFFF and is unambiguously defined. */
+
+void
+ulc_wordbreaks (const char *s, size_t n, char *p)
+{
+ if (n > 0)
+ {
+ const char *encoding = locale_charset ();
+
+ if (is_utf8_encoding (encoding))
+ u8_wordbreaks ((const uint8_t *) s, n, p);
+ else
+ {
+ /* Convert the string to UTF-8 and build a translation table
+ from offsets into s to offsets into the translated string. */
+ size_t *offsets = (size_t *) malloc (n * sizeof (size_t));
+
+ if (offsets != NULL)
+ {
+ uint8_t *t;
+ size_t m;
+
+ t = u8_conv_from_encoding (encoding, iconveh_question_mark,
+ s, n, offsets, NULL, &m);
+ if (t != NULL)
+ {
+ char *q = (char *) (m > 0 ? malloc (m) : NULL);
+
+ if (m == 0 || q != NULL)
+ {
+ size_t i;
+
+ /* Determine the word breaks of the UTF-8 string. */
+ u8_wordbreaks (t, m, q);
+
+ /* Translate the result back to the original string. */
+ memset (p, 0, n);
+ for (i = 0; i < n; i++)
+ if (offsets[i] != (size_t)(-1))
+ p[i] = q[offsets[i]];
+
+ free (q);
+ free (t);
+ free (offsets);
+ return;
+ }
+ free (t);
+ }
+ free (offsets);
+ }
+
+ /* Impossible to convert. */
+#if C_CTYPE_ASCII
+ if (is_all_ascii (s, n))
+ {
+ /* ASCII is a subset of UTF-8. */
+ u8_wordbreaks ((const uint8_t *) s, n, p);
+ return;
+ }
+#endif
+ /* We have a non-ASCII string and cannot convert it.
+ Don't produce any word breaks. */
+ memset (p, 0, n);
+ }
+ }
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_CTYPE, "");
+ if (argc == 1)
+ {
+ /* Display all the word breaks in the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ char *breaks = malloc (length);
+ int i;
+
+ ulc_wordbreaks (input, length, breaks);
+
+ for (i = 0; i < length; i++)
+ {
+ switch (breaks[i])
+ {
+ case 1:
+ putc ('|', stdout);
+ break;
+ case 0:
+ break;
+ default:
+ abort ();
+ }
+ putc (input[i], stdout);
+ }
+
+ free (breaks);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/uniwbrk/wbrkprop.h b/gnulib/lib/uniwbrk/wbrkprop.h
new file mode 100644
index 0000000..6e411fc
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrkprop.h
@@ -0,0 +1,4139 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Line breaking properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables for Unicode 6.0.0. */
+
+/* Copyright (C) 2000-2002, 2004, 2007-2009 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#define wbrkprop_header_0 16
+#define wbrkprop_header_1 15
+#define wbrkprop_header_2 7
+#define wbrkprop_header_3 511
+#define wbrkprop_header_4 127
+
+typedef struct
+ {
+ int level1[15];
+ int level2[3 << 9];
+ unsigned char level3[122 << 7];
+ }
+wbrkprop_t;
+static const wbrkprop_t uniwbrkprop =
+{
+ {
+ 0, 512, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 1024
+ },
+ {
+ 0, 128, 256, 256, 256, 384, 512, 640,
+ 256, 768, 896, 1024, 1152, 1280, 1408, 1536,
+ 1664, -1, 1792, 1920, 2048, 2176, 2304, 2432,
+ 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456,
+ 3584, 3712, 256, 256, 3840, 3968, 4096, 4224,
+ 4352, 256, 256, 256, 4480, 4608, 4736, 4864,
+ 4992, 5120, 5248, 5376, 5504, 5632, 5760, 5888,
+ 6016, 6144, 256, 6272, 256, 256, 6400, 6528,
+ 6656, 6784, 6912, 7040, -1, -1, -1, -1,
+ -1, 7168, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 7296, 7424, 7552, 7680, 7808, -1, -1, -1,
+ 7936, 8064, 8192, 8320, -1, 8448, 8576, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 8704, 256, 256, 8832, 8960, 9088, 9216,
+ 9344, 9472, 9600, 9728, 9856, 9984, 10112, 10240,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 10368,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 10496, 10624,
+ 256, 256, 10752, 10880, 11008, 11136, 11264, 11392,
+ 11520, 11648, 11776, 11904, -1, 12032, 12160, 12288,
+ 256, 12416, -1, -1, -1, -1, -1, -1,
+ 12544, -1, 12672, -1, 12800, -1, 12928, -1,
+ 13056, -1, -1, -1, -1, -1, -1, -1,
+ 13184, 13312, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 13440, -1,
+ 13568, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 13696, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 256, 256, 256, 256, 13824, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 13952, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 14080, 14208, 14336, -1, -1, -1,
+ 14464, 14592, 14720, 256, 256, 14848, 14976, 15104,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 15232, -1, 15360, 15488, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_LF, WBP_NEWLINE,
+ WBP_NEWLINE, WBP_CR, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_MIDLETTER, WBP_MIDNUM,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_NEWLINE, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_MIDNUM, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_MIDLETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_MIDNUM, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_MIDLETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_MIDNUM, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_NUMERIC,
+ WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_FORMAT, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_FORMAT,
+ WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_EXTEND,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUMLET, WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUMLET, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_NEWLINE, WBP_NEWLINE, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_OTHER,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_MIDLETTER,
+ WBP_MIDNUM, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_EXTENDNUMLET, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET, WBP_EXTENDNUMLET,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_MIDNUM, WBP_MIDLETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_MIDNUMLET,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_MIDNUM, WBP_OTHER, WBP_MIDNUMLET, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_MIDLETTER, WBP_MIDNUM,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTENDNUMLET,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA, WBP_KATAKANA,
+ WBP_KATAKANA, WBP_KATAKANA, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_KATAKANA, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_OTHER,
+ WBP_OTHER, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_OTHER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_OTHER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_OTHER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_ALETTER, WBP_ALETTER, WBP_ALETTER, WBP_ALETTER,
+ WBP_OTHER, WBP_OTHER, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC, WBP_NUMERIC,
+ WBP_OTHER, WBP_FORMAT, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_FORMAT, WBP_FORMAT, WBP_FORMAT, WBP_FORMAT,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_EXTEND, WBP_EXTEND, WBP_EXTEND, WBP_EXTEND,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER,
+ WBP_OTHER, WBP_OTHER, WBP_OTHER, WBP_OTHER
+ }
+};
diff --git a/gnulib/lib/uniwbrk/wbrktable.c b/gnulib/lib/uniwbrk/wbrktable.c
new file mode 100644
index 0000000..6c75c1b
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrktable.c
@@ -0,0 +1,52 @@
+/* Word break auxiliary table.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "wbrktable.h"
+
+/* This table contains the following rules (see UAX #29):
+
+ last current
+
+ ALetter × ALetter (WB5)
+ ALetter × Numeric (WB9)
+ Numeric × ALetter (WB10)
+ Numeric × Numeric (WB8)
+ Katakana × Katakana (WB13)
+ (ALetter | Numeric | Katakana) × ExtendNumLet (WB13a)
+ ExtendNumLet × ExtendNumLet (WB13a)
+ ExtendNumLet × (ALetter | Numeric | Katakana) (WB13b)
+ */
+
+const unsigned char uniwbrk_table[10][8] =
+{ /* current: OTHER MIDNUMLET NUMERIC */
+ /* KATAKANA MIDLETTER EXTENDNUMLET */
+ /* ALETTER MIDNUM */
+ /* last */
+ /* WBP_OTHER */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_KATAKANA */ { 1, 0, 1, 1, 1, 1, 1, 0 },
+ /* WBP_ALETTER */ { 1, 1, 0, 1, 1, 1, 0, 0 },
+ /* WBP_MIDNUMLET */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_MIDLETTER */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_MIDNUM */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_NUMERIC */ { 1, 1, 0, 1, 1, 1, 0, 0 },
+ /* WBP_EXTENDNUMLET */ { 1, 0, 0, 1, 1, 1, 0, 0 },
+ /* WBP_EXTEND */ { 1, 1, 1, 1, 1, 1, 1, 1 },
+ /* WBP_FORMAT */ { 1, 1, 1, 1, 1, 1, 1, 1 }
+};
diff --git a/gnulib/lib/uniwbrk/wbrktable.h b/gnulib/lib/uniwbrk/wbrktable.h
new file mode 100644
index 0000000..72e5a85
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wbrktable.h
@@ -0,0 +1,18 @@
+/* Word break auxiliary table.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern const unsigned char uniwbrk_table[10][8];
diff --git a/gnulib/lib/uniwbrk/wordbreak-property.c b/gnulib/lib/uniwbrk/wordbreak-property.c
new file mode 100644
index 0000000..cbc82be
--- /dev/null
+++ b/gnulib/lib/uniwbrk/wordbreak-property.c
@@ -0,0 +1,44 @@
+/* Word break property.
+ Copyright (C) 2001-2003, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwbrk.h"
+
+#include "wbrkprop.h"
+
+int
+uc_wordbreak_property (ucs4_t uc)
+{
+ unsigned int index1 = uc >> wbrkprop_header_0;
+ if (index1 < wbrkprop_header_1)
+ {
+ int lookup1 = uniwbrkprop.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> wbrkprop_header_2) & wbrkprop_header_3;
+ int lookup2 = uniwbrkprop.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = uc & wbrkprop_header_4;
+ return uniwbrkprop.level3[lookup2 + index3];
+ }
+ }
+ }
+ return WBP_OTHER;
+}
diff --git a/gnulib/lib/uniwidth.in.h b/gnulib/lib/uniwidth.in.h
new file mode 100644
index 0000000..e806744
--- /dev/null
+++ b/gnulib/lib/uniwidth.in.h
@@ -0,0 +1,69 @@
+/* Display width functions.
+ Copyright (C) 2001-2002, 2005, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _UNIWIDTH_H
+#define _UNIWIDTH_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Display width. */
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+/* Determine number of column positions required for UC. */
+extern int
+ uc_width (ucs4_t uc, const char *encoding)
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+ __attribute__ ((__pure__))
+#endif
+ ;
+
+/* Determine number of column positions required for first N units
+ (or fewer if S ends before this) in S. */
+extern int
+ u8_width (const uint8_t *s, size_t n, const char *encoding);
+extern int
+ u16_width (const uint16_t *s, size_t n, const char *encoding);
+extern int
+ u32_width (const uint32_t *s, size_t n, const char *encoding);
+
+/* Determine number of column positions required for S. */
+extern int
+ u8_strwidth (const uint8_t *s, const char *encoding);
+extern int
+ u16_strwidth (const uint16_t *s, const char *encoding);
+extern int
+ u32_strwidth (const uint32_t *s, const char *encoding);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNIWIDTH_H */
diff --git a/gnulib/lib/uniwidth/cjk.h b/gnulib/lib/uniwidth/cjk.h
new file mode 100644
index 0000000..a8d9c19
--- /dev/null
+++ b/gnulib/lib/uniwidth/cjk.h
@@ -0,0 +1,37 @@
+/* Test for CJK encoding.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "streq.h"
+
+static int
+is_cjk_encoding (const char *encoding)
+{
+ if (0
+ /* Legacy Japanese encodings */
+ || STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)
+ /* Legacy Chinese encodings */
+ || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0)
+ || STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)
+ || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)
+ /* Legacy Korean encodings */
+ || STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0)
+ || STREQ (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
diff --git a/gnulib/lib/uniwidth/u16-strwidth.c b/gnulib/lib/uniwidth/u16-strwidth.c
new file mode 100644
index 0000000..0216b5f
--- /dev/null
+++ b/gnulib/lib/uniwidth/u16-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-16 string.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u16_strwidth (const uint16_t *s, const char *encoding)
+{
+ return u16_width (s, u16_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u16-width.c b/gnulib/lib/uniwidth/u16-width.c
new file mode 100644
index 0000000..f8008f2
--- /dev/null
+++ b/gnulib/lib/uniwidth/u16-width.c
@@ -0,0 +1,47 @@
+/* Determine display width of UTF-16 string.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u16_width (const uint16_t *s, size_t n, const char *encoding)
+{
+ const uint16_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int w;
+
+ s += u16_mbtouc_unsafe (&uc, s, s_end - s);
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/u32-strwidth.c b/gnulib/lib/uniwidth/u32-strwidth.c
new file mode 100644
index 0000000..7674691
--- /dev/null
+++ b/gnulib/lib/uniwidth/u32-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-32 string.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u32_strwidth (const uint32_t *s, const char *encoding)
+{
+ return u32_width (s, u32_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u32-width.c b/gnulib/lib/uniwidth/u32-width.c
new file mode 100644
index 0000000..60b5a35
--- /dev/null
+++ b/gnulib/lib/uniwidth/u32-width.c
@@ -0,0 +1,43 @@
+/* Determine display width of UTF-32 string.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+int
+u32_width (const uint32_t *s, size_t n, const char *encoding)
+{
+ const uint32_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc = *s++;
+ int w;
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/u8-strwidth.c b/gnulib/lib/uniwidth/u8-strwidth.c
new file mode 100644
index 0000000..6c10951
--- /dev/null
+++ b/gnulib/lib/uniwidth/u8-strwidth.c
@@ -0,0 +1,29 @@
+/* Determine display width of UTF-8 string.
+ Copyright (C) 2001-2002, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u8_strwidth (const uint8_t *s, const char *encoding)
+{
+ return u8_width (s, u8_strlen (s), encoding);
+}
diff --git a/gnulib/lib/uniwidth/u8-width.c b/gnulib/lib/uniwidth/u8-width.c
new file mode 100644
index 0000000..96e5ea4
--- /dev/null
+++ b/gnulib/lib/uniwidth/u8-width.c
@@ -0,0 +1,47 @@
+/* Determine display width of UTF-8 string.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "unistr.h"
+
+int
+u8_width (const uint8_t *s, size_t n, const char *encoding)
+{
+ const uint8_t *s_end = s + n;
+ int width = 0;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int w;
+
+ s += u8_mbtouc_unsafe (&uc, s, s_end - s);
+
+ if (uc == 0)
+ break; /* end of string reached */
+
+ w = uc_width (uc, encoding);
+ if (w >= 0) /* ignore control characters in the string */
+ width += w;
+ }
+
+ return width;
+}
diff --git a/gnulib/lib/uniwidth/width.c b/gnulib/lib/uniwidth/width.c
new file mode 100644
index 0000000..a314e71
--- /dev/null
+++ b/gnulib/lib/uniwidth/width.c
@@ -0,0 +1,368 @@
+/* Determine display width of Unicode character.
+ Copyright (C) 2001-2002, 2006-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "cjk.h"
+
+/*
+ * Non-spacing attribute table.
+ * Consists of:
+ * - Non-spacing characters; generated from PropList.txt or
+ * "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
+ * - Format control characters; generated from
+ * "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
+ * - Zero width characters; generated from
+ * "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
+ */
+static const unsigned char nonspacing_table_data[27*64] = {
+ /* 0x0000-0x01ff */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, /* 0x0080-0x00bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */
+ /* 0x0200-0x03ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */
+ /* 0x0400-0x05ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */
+ 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */
+ 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */
+ 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */
+ /* 0x0600-0x07ff */
+ 0x0f, 0x00, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */
+ 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */
+ 0x00, 0x00, 0xc0, 0xbf, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */
+ 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x07c0-0x07ff */
+ /* 0x0800-0x09ff */
+ 0x00, 0x00, 0xc0, 0xfb, 0xef, 0x3e, 0x00, 0x00, /* 0x0800-0x083f */
+ 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08c0-0x08ff */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, /* 0x0900-0x093f */
+ 0xfe, 0x21, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x09c0-0x09ff */
+ /* 0x0a00-0x0bff */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */
+ 0x86, 0x39, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, /* 0x0a40-0x0a7f */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */
+ 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0ac0-0x0aff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */
+ 0x1e, 0x20, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */
+ 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */
+ /* 0x0c00-0x0dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x0c00-0x0c3f */
+ 0xc1, 0x3d, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */
+ 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d00-0x0d3f */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */
+ 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */
+ /* 0x0e00-0x0fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */
+ 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1b, /* 0x0e80-0x0ebf */
+ 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */
+ 0xdf, 0xe0, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */
+ /* 0x1000-0x11ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x66, /* 0x1000-0x103f */
+ 0x00, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x1e, 0x00, /* 0x1040-0x107f */
+ 0x64, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1140-0x117f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1180-0x11bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c0-0x11ff */
+ /* 0x1200-0x13ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */
+ 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */
+ /* 0x1600-0x17ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */
+ 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, /* 0x1700-0x173f */
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */
+ 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */
+ /* 0x1800-0x19ff */
+ 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */
+ 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x04, 0x0e, /* 0x1900-0x193f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */
+ /* 0x1a00-0x1bff */
+ 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */
+ 0x00, 0x00, 0x40, 0x7f, 0xe5, 0x1f, 0xf8, 0x9f, /* 0x1a40-0x1a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1a80-0x1abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */
+ 0x03, 0x00, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, /* 0x1b80-0x1bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa3, 0x03, 0x00, /* 0x1bc0-0x1bff */
+ /* 0x1c00-0x1dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcf, 0x00, /* 0x1c00-0x1c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */
+ 0x00, 0x00, 0xf7, 0xff, 0xfd, 0x21, 0x00, 0x00, /* 0x1cc0-0x1cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xf0, /* 0x1dc0-0x1dff */
+ /* 0x2000-0x21ff */
+ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, /* 0x2040-0x207f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, /* 0x20c0-0x20ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */
+ /* 0x2c00-0x2dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c00-0x2c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c40-0x2c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c80-0x2cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, /* 0x2cc0-0x2cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x2d40-0x2d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d80-0x2dbf */
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x2dc0-0x2dff */
+ /* 0x3000-0x31ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, /* 0x3000-0x303f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */
+ /* 0xa600-0xa7ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa600-0xa63f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x30, /* 0xa640-0xa67f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa680-0xa6bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, /* 0xa6c0-0xa6ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa700-0xa73f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa740-0xa77f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa780-0xa7bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa7c0-0xa7ff */
+ /* 0xa800-0xa9ff */
+ 0x44, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0xa800-0xa83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */
+ 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, /* 0xa8c0-0xa8ff */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */
+ 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x13, /* 0xa980-0xa9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */
+ /* 0xaa00-0xabff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, /* 0xaa00-0xaa3f */
+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xaa40-0xaa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xc1, /* 0xaa80-0xaabf */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xaac0-0xaaff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab00-0xab3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab40-0xab7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab80-0xabbf */
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, /* 0xabc0-0xabff */
+ /* 0xfa00-0xfbff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */
+ /* 0xfe00-0xffff */
+ 0xff, 0xff, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, /* 0xfe00-0xfe3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */
+ /* 0x10000-0x101ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10000-0x1003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10040-0x1007f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10080-0x100bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x100c0-0x100ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10100-0x1013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10140-0x1017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10180-0x101bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /* 0x101c0-0x101ff */
+ /* 0x10a00-0x10bff */
+ 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */
+ /* 0x11000-0x111ff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11000-0x1103f */
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11040-0x1107f */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x26, /* 0x11080-0x110bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x110c0-0x110ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11100-0x1113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11140-0x1117f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11180-0x111bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x111c0-0x111ff */
+ /* 0x1d000-0x1d1ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0xf8, 0xff, /* 0x1d140-0x1d17f */
+ 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */
+ /* 0x1d200-0x1d3ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */
+ 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1d3c0-0x1d3ff */
+};
+static const signed char nonspacing_table_ind[240] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */
+ 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */
+ 14, -1, -1, -1, -1, -1, 15, -1, /* 0x2000-0x2fff */
+ 16, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */
+ -1, -1, -1, 17, 18, 19, -1, -1, /* 0xa000-0xafff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd000-0xdfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */
+ -1, -1, -1, -1, -1, 20, -1, 21, /* 0xf000-0xffff */
+ 22, -1, -1, -1, -1, 23, -1, -1, /* 0x10000-0x10fff */
+ 24, -1, -1, -1, -1, -1, -1, -1, /* 0x11000-0x11fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x16000-0x16fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1b000-0x1bfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1c000-0x1cfff */
+ 25, 26, -1, -1, -1, -1, -1, -1 /* 0x1d000-0x1dfff */
+};
+
+/* Determine number of column positions required for UC. */
+int
+uc_width (ucs4_t uc, const char *encoding)
+{
+ /* Test for non-spacing or control character. */
+ if ((uc >> 9) < 240)
+ {
+ int ind = nonspacing_table_ind[uc >> 9];
+ if (ind >= 0)
+ if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1)
+ {
+ if (uc > 0 && uc < 0xa0)
+ return -1;
+ else
+ return 0;
+ }
+ }
+ else if ((uc >> 9) == (0xe0000 >> 9))
+ {
+ if (uc >= 0xe0100)
+ {
+ if (uc <= 0xe01ef)
+ return 0;
+ }
+ else
+ {
+ if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001)
+ return 0;
+ }
+ }
+ /* Test for double-width character.
+ * Generated from "grep '^[^;]\{4,5\};[WF]' EastAsianWidth.txt"
+ * and "grep '^[^;]\{4,5\};[^WF]' EastAsianWidth.txt"
+ */
+ if (uc >= 0x1100
+ && ((uc < 0x1160) /* Hangul Jamo */
+ || (uc >= 0x2329 && uc < 0x232b) /* Angle Brackets */
+ || (uc >= 0x2e80 && uc < 0xa4d0 /* CJK ... Yi */
+ && !(uc == 0x303f) && !(uc >= 0x4dc0 && uc < 0x4e00))
+ || (uc >= 0xac00 && uc < 0xd7a4) /* Hangul Syllables */
+ || (uc >= 0xf900 && uc < 0xfb00) /* CJK Compatibility Ideographs */
+ || (uc >= 0xfe10 && uc < 0xfe20) /* Presentation Forms for Vertical */
+ || (uc >= 0xfe30 && uc < 0xfe70) /* CJK Compatibility Forms */
+ || (uc >= 0xff00 && uc < 0xff61) /* Fullwidth Forms */
+ || (uc >= 0xffe0 && uc < 0xffe7) /* Fullwidth Signs */
+ || (uc >= 0x20000 && uc <= 0x2ffff) /* Supplementary Ideographic Plane */
+ || (uc >= 0x30000 && uc <= 0x3ffff) /* Tertiary Ideographic Plane */
+ ) )
+ return 2;
+ /* In ancient CJK encodings, Cyrillic and most other characters are
+ double-width as well. */
+ if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9
+ && is_cjk_encoding (encoding))
+ return 2;
+ return 1;
+}
diff --git a/gnulib/lib/unlink.c b/gnulib/lib/unlink.c
new file mode 100644
index 0000000..677d584
--- /dev/null
+++ b/gnulib/lib/unlink.c
@@ -0,0 +1,97 @@
+/* Work around unlink bugs.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "dosname.h"
+
+#undef unlink
+
+/* Remove file NAME.
+ Return 0 if successful, -1 if not. */
+
+int
+rpl_unlink (char const *name)
+{
+ /* Work around Solaris 9 bug where unlink("file/") succeeds. */
+ size_t len = strlen (name);
+ int result = 0;
+ if (len && ISSLASH (name[len - 1]))
+ {
+ /* We can't unlink(2) something if it doesn't exist. If it does
+ exist, then it resolved to a directory, due to the trailing
+ slash, and POSIX requires that the unlink attempt to remove
+ that directory (which would leave the symlink dangling).
+ Unfortunately, Solaris 9 is one of the platforms where the
+ root user can unlink directories, and we don't want to
+ cripple this behavior on real directories, even if it is
+ seldom needed (at any rate, it's nicer to let coreutils'
+ unlink(1) give the correct errno for non-root users). But we
+ don't know whether name was an actual directory, or a symlink
+ to a directory; and due to the bug of ignoring trailing
+ slash, Solaris 9 would end up successfully unlinking the
+ symlink instead of the directory. Technically, we could use
+ realpath to find the canonical directory name to attempt
+ deletion on. But that is a lot of work for a corner case; so
+ we instead just use an lstat on the shortened name, and
+ reject symlinks with trailing slashes. The root user of
+ unlink(1) will just have to live with the rule that they
+ can't delete a directory via a symlink. */
+ struct stat st;
+ result = lstat (name, &st);
+ if (result == 0)
+ {
+ /* Trailing NUL will overwrite the trailing slash. */
+ char *short_name = malloc (len);
+ if (!short_name)
+ {
+ errno = EPERM;
+ return -1;
+ }
+ memcpy (short_name, name, len);
+ while (len && ISSLASH (short_name[len - 1]))
+ short_name[--len] = '\0';
+ if (len && (lstat (short_name, &st) || S_ISLNK (st.st_mode)))
+ {
+ free (short_name);
+ errno = EPERM;
+ return -1;
+ }
+ free (short_name);
+ }
+ }
+ if (!result)
+ {
+#if UNLINK_PARENT_BUG
+ if (len >= 2 && name[len - 1] == '.' && name[len - 2] == '.'
+ && (len == 2 || ISSLASH (name[len - 3])))
+ {
+ errno = EISDIR; /* could also use EPERM */
+ return -1;
+ }
+#endif
+ result = unlink (name);
+ }
+ return result;
+}
diff --git a/gnulib/lib/unlinkat.c b/gnulib/lib/unlinkat.c
new file mode 100644
index 0000000..bae6642
--- /dev/null
+++ b/gnulib/lib/unlinkat.c
@@ -0,0 +1,109 @@
+/* Work around unlinkat bugs on Solaris 9 and Hurd.
+
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <stdlib.h>
+
+#include "dosname.h"
+#include "openat.h"
+
+#if HAVE_UNLINKAT
+
+# undef unlinkat
+
+/* unlinkat without AT_REMOVEDIR does not honor trailing / on Solaris
+ 9. Solve it in a similar manner to unlink. Hurd has the same
+ issue. */
+
+int
+rpl_unlinkat (int fd, char const *name, int flag)
+{
+ size_t len;
+ int result = 0;
+ /* rmdir behavior has no problems with trailing slash. */
+ if (flag & AT_REMOVEDIR)
+ return unlinkat (fd, name, flag);
+
+ len = strlen (name);
+ if (len && ISSLASH (name[len - 1]))
+ {
+ /* See the lengthy comment in unlink.c why we disobey the POSIX
+ rule of letting unlink("link-to-dir/") attempt to unlink a
+ directory. */
+ struct stat st;
+ result = lstatat (fd, name, &st);
+ if (result == 0)
+ {
+ /* Trailing NUL will overwrite the trailing slash. */
+ char *short_name = malloc (len);
+ if (!short_name)
+ {
+ errno = EPERM;
+ return -1;
+ }
+ memcpy (short_name, name, len);
+ while (len && ISSLASH (short_name[len - 1]))
+ short_name[--len] = '\0';
+ if (len && (lstatat (fd, short_name, &st) || S_ISLNK (st.st_mode)))
+ {
+ free (short_name);
+ errno = EPERM;
+ return -1;
+ }
+ free (short_name);
+ }
+ }
+ if (!result)
+ result = unlinkat (fd, name, flag);
+ return result;
+}
+
+#else /* !HAVE_UNLINKAT */
+
+/* Replacement for Solaris' function by the same name.
+ <http://www.google.com/search?q=unlinkat+site:docs.sun.com>
+ First, try to simulate it via (unlink|rmdir) ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(unlink|rmdir)/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' unlinkat. */
+
+# define AT_FUNC_NAME unlinkat
+# define AT_FUNC_F1 rmdir
+# define AT_FUNC_F2 unlink
+# define AT_FUNC_USE_F1_COND AT_REMOVEDIR
+# define AT_FUNC_POST_FILE_PARAM_DECLS , int flag
+# define AT_FUNC_POST_FILE_ARGS /* empty */
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_UNLINKAT */
diff --git a/gnulib/lib/unlinkdir.c b/gnulib/lib/unlinkdir.c
new file mode 100644
index 0000000..b3f6285
--- /dev/null
+++ b/gnulib/lib/unlinkdir.c
@@ -0,0 +1,54 @@
+/* unlinkdir.c - determine whether we can unlink directories
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, Jim Meyering, and David Bartley. */
+
+#include <config.h>
+
+#include "unlinkdir.h"
+#include "priv-set.h"
+#include <unistd.h>
+
+#if ! UNLINK_CANNOT_UNLINK_DIR
+
+/* Return true if we cannot unlink directories, false if we might be
+ able to unlink directories. */
+
+bool
+cannot_unlink_dir (void)
+{
+ static bool initialized;
+ static bool cannot;
+
+ if (! initialized)
+ {
+# if defined PRIV_SYS_LINKDIR
+ /* We might be able to unlink directories if we cannot
+ determine our privileges, or if we have the
+ PRIV_SYS_LINKDIR privilege. */
+ cannot = (priv_set_ismember (PRIV_SYS_LINKDIR) == 0);
+# else
+ /* In traditional Unix, only root can unlink directories. */
+ cannot = (geteuid () != 0);
+# endif
+ initialized = true;
+ }
+
+ return cannot;
+}
+
+#endif
diff --git a/gnulib/lib/unlinkdir.h b/gnulib/lib/unlinkdir.h
new file mode 100644
index 0000000..0df9140
--- /dev/null
+++ b/gnulib/lib/unlinkdir.h
@@ -0,0 +1,26 @@
+/* unlinkdir.h - determine (and maybe change) whether we can unlink directories
+
+ Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include <stdbool.h>
+
+#if UNLINK_CANNOT_UNLINK_DIR
+# define cannot_unlink_dir() true
+#else
+bool cannot_unlink_dir (void);
+#endif
diff --git a/gnulib/lib/unlocked-io.h b/gnulib/lib/unlocked-io.h
new file mode 100644
index 0000000..901cbdd
--- /dev/null
+++ b/gnulib/lib/unlocked-io.h
@@ -0,0 +1,136 @@
+/* Prefer faster, non-thread-safe stdio functions if available.
+
+ Copyright (C) 2001-2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef UNLOCKED_IO_H
+# define UNLOCKED_IO_H 1
+
+/* These are wrappers for functions/macros from the GNU C library, and
+ from other C libraries supporting POSIX's optional thread-safe functions.
+
+ The standard I/O functions are thread-safe. These *_unlocked ones are
+ more efficient but not thread-safe. That they're not thread-safe is
+ fine since all of the applications in this package are single threaded.
+
+ Also, some code that is shared with the GNU C library may invoke
+ the *_unlocked functions directly. On hosts that lack those
+ functions, invoke the non-thread-safe versions instead. */
+
+# include <stdio.h>
+
+# if HAVE_DECL_CLEARERR_UNLOCKED
+# undef clearerr
+# define clearerr(x) clearerr_unlocked (x)
+# else
+# define clearerr_unlocked(x) clearerr (x)
+# endif
+
+# if HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(x) feof_unlocked (x)
+# else
+# define feof_unlocked(x) feof (x)
+# endif
+
+# if HAVE_DECL_FERROR_UNLOCKED
+# undef ferror
+# define ferror(x) ferror_unlocked (x)
+# else
+# define ferror_unlocked(x) ferror (x)
+# endif
+
+# if HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush
+# define fflush(x) fflush_unlocked (x)
+# else
+# define fflush_unlocked(x) fflush (x)
+# endif
+
+# if HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(x,y,z) fgets_unlocked (x,y,z)
+# else
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+# endif
+
+# if HAVE_DECL_FPUTC_UNLOCKED
+# undef fputc
+# define fputc(x,y) fputc_unlocked (x,y)
+# else
+# define fputc_unlocked(x,y) fputc (x,y)
+# endif
+
+# if HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs
+# define fputs(x,y) fputs_unlocked (x,y)
+# else
+# define fputs_unlocked(x,y) fputs (x,y)
+# endif
+
+# if HAVE_DECL_FREAD_UNLOCKED
+# undef fread
+# define fread(w,x,y,z) fread_unlocked (w,x,y,z)
+# else
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+# endif
+
+# if HAVE_DECL_FWRITE_UNLOCKED
+# undef fwrite
+# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
+# else
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+# endif
+
+# if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc(x) getc_unlocked (x)
+# else
+# define getc_unlocked(x) getc (x)
+# endif
+
+# if HAVE_DECL_GETCHAR_UNLOCKED
+# undef getchar
+# define getchar() getchar_unlocked ()
+# else
+# define getchar_unlocked() getchar ()
+# endif
+
+# if HAVE_DECL_PUTC_UNLOCKED
+# undef putc
+# define putc(x,y) putc_unlocked (x,y)
+# else
+# define putc_unlocked(x,y) putc (x,y)
+# endif
+
+# if HAVE_DECL_PUTCHAR_UNLOCKED
+# undef putchar
+# define putchar(x) putchar_unlocked (x)
+# else
+# define putchar_unlocked(x) putchar (x)
+# endif
+
+# undef flockfile
+# define flockfile(x) ((void) 0)
+
+# undef ftrylockfile
+# define ftrylockfile(x) 0
+
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+
+#endif /* UNLOCKED_IO_H */
diff --git a/gnulib/lib/unlockpt.c b/gnulib/lib/unlockpt.c
new file mode 100644
index 0000000..6785487
--- /dev/null
+++ b/gnulib/lib/unlockpt.c
@@ -0,0 +1,44 @@
+/* Unlock the slave side of a pseudo-terminal from its master side.
+ Copyright (C) 1998, 2010-2011 Free Software Foundation, Inc.
+ Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+unlockpt (int fd)
+{
+ /* Platforms which have the TIOCSPTLCK ioctl (Linux) already have the
+ unlockpt function. */
+#if HAVE_REVOKE
+ /* MacOS X 10.3, OpenBSD 3.8 do not have the unlockpt function, but they
+ have revoke(). */
+ char *name = ptsname (fd);
+ if (name == NULL)
+ return -1;
+ return revoke (name);
+#else
+ /* Assume that the slave side of a pseudo-terminal is already unlocked
+ by default. */
+ if (fcntl (fd, F_GETFD) < 0)
+ return -1;
+ return 0;
+#endif
+}
diff --git a/gnulib/lib/unsetenv.c b/gnulib/lib/unsetenv.c
new file mode 100644
index 0000000..16b50d1
--- /dev/null
+++ b/gnulib/lib/unsetenv.c
@@ -0,0 +1,127 @@
+/* Copyright (C) 1992, 1995-2002, 2005-2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the name == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+/* Specification. */
+#include <stdlib.h>
+
+#include <errno.h>
+#if !_LIBC
+# define __set_errno(ev) ((errno) = (ev))
+#endif
+
+#include <string.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __environ environ
+#endif
+
+#if _LIBC
+/* This lock protects against simultaneous modifications of `environ'. */
+# include <bits/libc-lock.h>
+__libc_lock_define_initialized (static, envlock)
+# define LOCK __libc_lock_lock (envlock)
+# define UNLOCK __libc_lock_unlock (envlock)
+#else
+# define LOCK
+# define UNLOCK
+#endif
+
+/* In the GNU C library we must keep the namespace clean. */
+#ifdef _LIBC
+# define unsetenv __unsetenv
+#endif
+
+#if _LIBC || !HAVE_UNSETENV
+
+int
+unsetenv (const char *name)
+{
+ size_t len;
+ char **ep;
+
+ if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ len = strlen (name);
+
+ LOCK;
+
+ ep = __environ;
+ while (*ep != NULL)
+ if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
+ {
+ /* Found it. Remove this pointer by moving later ones back. */
+ char **dp = ep;
+
+ do
+ dp[0] = dp[1];
+ while (*dp++);
+ /* Continue the loop in case NAME appears again. */
+ }
+ else
+ ++ep;
+
+ UNLOCK;
+
+ return 0;
+}
+
+#ifdef _LIBC
+# undef unsetenv
+weak_alias (__unsetenv, unsetenv)
+#endif
+
+#else /* HAVE_UNSETENV */
+
+# undef unsetenv
+# if !HAVE_DECL_UNSETENV
+# if VOID_UNSETENV
+extern void unsetenv (const char *);
+# else
+extern int unsetenv (const char *);
+# endif
+# endif
+
+/* Call the underlying unsetenv, in case there is hidden bookkeeping
+ that needs updating beyond just modifying environ. */
+int
+rpl_unsetenv (const char *name)
+{
+ int result = 0;
+ if (!name || !*name || strchr (name, '='))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ while (getenv (name))
+# if !VOID_UNSETENV
+ result =
+# endif
+ unsetenv (name);
+ return result;
+}
+
+#endif /* HAVE_UNSETENV */
diff --git a/gnulib/lib/userspec.c b/gnulib/lib/userspec.c
new file mode 100644
index 0000000..a96b63a
--- /dev/null
+++ b/gnulib/lib/userspec.c
@@ -0,0 +1,309 @@
+/* userspec.c -- Parse a user and group string.
+ Copyright (C) 1989-1992, 1997-1998, 2000, 2002-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "userspec.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+
+#if HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+
+#include "intprops.h"
+#include "inttostr.h"
+#include "xalloc.h"
+#include "xstrtol.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#ifndef HAVE_ENDGRENT
+# define endgrent() ((void) 0)
+#endif
+
+#ifndef HAVE_ENDPWENT
+# define endpwent() ((void) 0)
+#endif
+
+#ifndef UID_T_MAX
+# define UID_T_MAX TYPE_MAXIMUM (uid_t)
+#endif
+
+#ifndef GID_T_MAX
+# define GID_T_MAX TYPE_MAXIMUM (gid_t)
+#endif
+
+/* MAXUID may come from limits.h or sys/params.h. */
+#ifndef MAXUID
+# define MAXUID UID_T_MAX
+#endif
+#ifndef MAXGID
+# define MAXGID GID_T_MAX
+#endif
+
+#ifdef __DJGPP__
+
+/* ISDIGIT differs from isdigit, as follows:
+ - Its arg may be any int or unsigned int; it need not be an unsigned char
+ or EOF.
+ - It's typically faster.
+ POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
+ isdigit unless it's important to use the locale's definition
+ of `digit' even when the host does not conform to POSIX. */
+# define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
+
+/* Return true if STR represents an unsigned decimal integer. */
+
+static bool
+is_number (const char *str)
+{
+ do
+ {
+ if (!ISDIGIT (*str))
+ return false;
+ }
+ while (*++str);
+
+ return true;
+}
+#endif
+
+static char const *
+parse_with_separator (char const *spec, char const *separator,
+ uid_t *uid, gid_t *gid,
+ char **username, char **groupname)
+{
+ static const char *E_invalid_user = N_("invalid user");
+ static const char *E_invalid_group = N_("invalid group");
+ static const char *E_bad_spec = N_("invalid spec");
+
+ const char *error_msg;
+ struct passwd *pwd;
+ struct group *grp;
+ char *u;
+ char const *g;
+ char *gname = NULL;
+ uid_t unum = *uid;
+ gid_t gnum = *gid;
+
+ error_msg = NULL;
+ *username = *groupname = NULL;
+
+ /* Set U and G to nonzero length strings corresponding to user and
+ group specifiers or to NULL. If U is not NULL, it is a newly
+ allocated string. */
+
+ u = NULL;
+ if (separator == NULL)
+ {
+ if (*spec)
+ u = xstrdup (spec);
+ }
+ else
+ {
+ size_t ulen = separator - spec;
+ if (ulen != 0)
+ {
+ u = xmemdup (spec, ulen + 1);
+ u[ulen] = '\0';
+ }
+ }
+
+ g = (separator == NULL || *(separator + 1) == '\0'
+ ? NULL
+ : separator + 1);
+
+#ifdef __DJGPP__
+ /* Pretend that we are the user U whose group is G. This makes
+ pwd and grp functions ``know'' about the UID and GID of these. */
+ if (u && !is_number (u))
+ setenv ("USER", u, 1);
+ if (g && !is_number (g))
+ setenv ("GROUP", g, 1);
+#endif
+
+ if (u != NULL)
+ {
+ /* If it starts with "+", skip the look-up. */
+ pwd = (*u == '+' ? NULL : getpwnam (u));
+ if (pwd == NULL)
+ {
+ bool use_login_group = (separator != NULL && g == NULL);
+ if (use_login_group)
+ {
+ /* If there is no group,
+ then there may not be a trailing ":", either. */
+ error_msg = E_bad_spec;
+ }
+ else
+ {
+ unsigned long int tmp;
+ if (xstrtoul (u, NULL, 10, &tmp, "") == LONGINT_OK
+ && tmp <= MAXUID && (uid_t) tmp != (uid_t) -1)
+ unum = tmp;
+ else
+ error_msg = E_invalid_user;
+ }
+ }
+ else
+ {
+ unum = pwd->pw_uid;
+ if (g == NULL && separator != NULL)
+ {
+ /* A separator was given, but a group was not specified,
+ so get the login group. */
+ char buf[INT_BUFSIZE_BOUND (uintmax_t)];
+ gnum = pwd->pw_gid;
+ grp = getgrgid (gnum);
+ gname = xstrdup (grp ? grp->gr_name : umaxtostr (gnum, buf));
+ endgrent ();
+ }
+ }
+ endpwent ();
+ }
+
+ if (g != NULL && error_msg == NULL)
+ {
+ /* Explicit group. */
+ /* If it starts with "+", skip the look-up. */
+ grp = (*g == '+' ? NULL : getgrnam (g));
+ if (grp == NULL)
+ {
+ unsigned long int tmp;
+ if (xstrtoul (g, NULL, 10, &tmp, "") == LONGINT_OK
+ && tmp <= MAXGID && (gid_t) tmp != (gid_t) -1)
+ gnum = tmp;
+ else
+ error_msg = E_invalid_group;
+ }
+ else
+ gnum = grp->gr_gid;
+ endgrent (); /* Save a file descriptor. */
+ gname = xstrdup (g);
+ }
+
+ if (error_msg == NULL)
+ {
+ *uid = unum;
+ *gid = gnum;
+ *username = u;
+ *groupname = gname;
+ u = NULL;
+ }
+ else
+ free (gname);
+
+ free (u);
+ return _(error_msg);
+}
+
+/* Extract from SPEC, which has the form "[user][:.][group]",
+ a USERNAME, UID U, GROUPNAME, and GID G.
+ Either user or group, or both, must be present.
+ If the group is omitted but the separator is given,
+ use the given user's login group.
+ If SPEC contains a `:', then use that as the separator, ignoring
+ any `.'s. If there is no `:', but there is a `.', then first look
+ up the entire SPEC as a login name. If that look-up fails, then
+ try again interpreting the `.' as a separator.
+
+ USERNAME and GROUPNAME will be in newly malloc'd memory.
+ Either one might be NULL instead, indicating that it was not
+ given and the corresponding numeric ID was left unchanged.
+
+ Return NULL if successful, a static error message string if not. */
+
+char const *
+parse_user_spec (char const *spec, uid_t *uid, gid_t *gid,
+ char **username, char **groupname)
+{
+ char const *colon = strchr (spec, ':');
+ char const *error_msg =
+ parse_with_separator (spec, colon, uid, gid, username, groupname);
+
+ if (!colon && error_msg)
+ {
+ /* If there's no colon but there is a dot, and if looking up the
+ whole spec failed (i.e., the spec is not an owner name that
+ includes a dot), then try again, but interpret the dot as a
+ separator. This is a compatible extension to POSIX, since
+ the POSIX-required behavior is always tried first. */
+
+ char const *dot = strchr (spec, '.');
+ if (dot
+ && ! parse_with_separator (spec, dot, uid, gid, username, groupname))
+ error_msg = NULL;
+ }
+
+ return error_msg;
+}
+
+#ifdef TEST
+
+# define NULL_CHECK(s) ((s) == NULL ? "(null)" : (s))
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ for (i = 1; i < argc; i++)
+ {
+ const char *e;
+ char *username, *groupname;
+ uid_t uid;
+ gid_t gid;
+ char *tmp;
+
+ tmp = strdup (argv[i]);
+ e = parse_user_spec (tmp, &uid, &gid, &username, &groupname);
+ free (tmp);
+ printf ("%s: %lu %lu %s %s %s\n",
+ argv[i],
+ (unsigned long int) uid,
+ (unsigned long int) gid,
+ NULL_CHECK (username),
+ NULL_CHECK (groupname),
+ NULL_CHECK (e));
+ }
+
+ exit (0);
+}
+
+#endif
+
+/*
+Local Variables:
+indent-tabs-mode: nil
+End:
+*/
diff --git a/gnulib/lib/userspec.h b/gnulib/lib/userspec.h
new file mode 100644
index 0000000..67af845
--- /dev/null
+++ b/gnulib/lib/userspec.h
@@ -0,0 +1,10 @@
+#ifndef USERSPEC_H
+# define USERSPEC_H 1
+
+# include <sys/types.h>
+
+const char *
+parse_user_spec (const char *spec_arg, uid_t *uid, gid_t *gid,
+ char **username_arg, char **groupname_arg);
+
+#endif
diff --git a/gnulib/lib/usleep.c b/gnulib/lib/usleep.c
new file mode 100644
index 0000000..4ebefe0
--- /dev/null
+++ b/gnulib/lib/usleep.c
@@ -0,0 +1,58 @@
+/* Pausing execution of the current thread.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Eric Blake <ebb9@byu.net>, 2009.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This file is _intentionally_ light-weight. Rather than using
+ select or nanosleep, both of which drag in external libraries on
+ some platforms, this merely rounds up to the nearest second if
+ usleep() does not exist. If sub-second resolution is important,
+ then use a more powerful interface to begin with. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#ifndef HAVE_USLEEP
+# define HAVE_USLEEP 0
+#endif
+
+/* Sleep for MICRO microseconds, which can be greater than 1 second.
+ Return -1 and set errno to EINVAL on range error (about 4295
+ seconds), or 0 on success. Interaction with SIGALARM is
+ unspecified. */
+
+int
+usleep (useconds_t micro)
+{
+ unsigned int seconds = micro / 1000000;
+ if (sizeof seconds < sizeof micro && micro / 1000000 != seconds)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ if (!HAVE_USLEEP && micro % 1000000)
+ seconds++;
+ while ((seconds = sleep (seconds)) != 0);
+
+#undef usleep
+#if !HAVE_USLEEP
+# define usleep(x) 0
+#endif
+ return usleep (micro % 1000000);
+}
diff --git a/gnulib/lib/utimecmp.c b/gnulib/lib/utimecmp.c
new file mode 100644
index 0000000..c0f6713
--- /dev/null
+++ b/gnulib/lib/utimecmp.c
@@ -0,0 +1,380 @@
+/* utimecmp.c -- compare file time stamps
+
+ Copyright (C) 2004-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "utimecmp.h"
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "hash.h"
+#include "intprops.h"
+#include "stat-time.h"
+#include "utimens.h"
+#include "verify.h"
+
+#ifndef MAX
+# define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+#define BILLION (1000 * 1000 * 1000)
+
+/* Best possible resolution that utimens can set and stat can return,
+ due to system-call limitations. It must be a power of 10 that is
+ no greater than 1 billion. */
+#if HAVE_UTIMENSAT
+enum { SYSCALL_RESOLUTION = 1 };
+#elif ((HAVE_FUTIMESAT || HAVE_WORKING_UTIMES) \
+ && (defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIMENSEC \
+ || defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_SPARE1))
+enum { SYSCALL_RESOLUTION = 1000 };
+#else
+enum { SYSCALL_RESOLUTION = BILLION };
+#endif
+
+/* Describe a file system and its time stamp resolution in nanoseconds. */
+struct fs_res
+{
+ /* Device number of file system. */
+ dev_t dev;
+
+ /* An upper bound on the time stamp resolution of this file system,
+ ignoring any resolution that cannot be set via utimens. It is
+ represented by an integer count of nanoseconds. It must be
+ either 2 billion, or a power of 10 that is no greater than a
+ billion and is no less than SYSCALL_RESOLUTION. */
+ int resolution;
+
+ /* True if RESOLUTION is known to be exact, and is not merely an
+ upper bound on the true resolution. */
+ bool exact;
+};
+
+/* Hash some device info. */
+static size_t
+dev_info_hash (void const *x, size_t table_size)
+{
+ struct fs_res const *p = x;
+
+ /* Beware signed arithmetic gotchas. */
+ if (TYPE_SIGNED (dev_t) && SIZE_MAX < MAX (INT_MAX, TYPE_MAXIMUM (dev_t)))
+ {
+ uintmax_t dev = p->dev;
+ return dev % table_size;
+ }
+
+ return p->dev % table_size;
+}
+
+/* Compare two dev_info structs. */
+static bool
+dev_info_compare (void const *x, void const *y)
+{
+ struct fs_res const *a = x;
+ struct fs_res const *b = y;
+ return a->dev == b->dev;
+}
+
+/* Return -1, 0, 1 based on whether the destination file (with name
+ DST_NAME and status DST_STAT) is older than SRC_STAT, the same age
+ as SRC_STAT, or newer than SRC_STAT, respectively.
+
+ DST_NAME may be NULL if OPTIONS is 0.
+
+ If OPTIONS & UTIMECMP_TRUNCATE_SOURCE, do the comparison after SRC is
+ converted to the destination's timestamp resolution as filtered through
+ utimens. In this case, return -2 if the exact answer cannot be
+ determined; this can happen only if the time stamps are very close and
+ there is some trouble accessing the file system (e.g., the user does not
+ have permission to futz with the destination's time stamps). */
+
+int
+utimecmp (char const *dst_name,
+ struct stat const *dst_stat,
+ struct stat const *src_stat,
+ int options)
+{
+ /* Things to watch out for:
+
+ The code uses a static hash table internally and is not safe in the
+ presence of signals, multiple threads, etc. However, memory pressure
+ that prevents use of the hash table is not fatal - we just fall back
+ to redoing the computations on every call in that case.
+
+ int and long int might be 32 bits. Many of the calculations store
+ numbers up to 2 billion, and multiply by 10; they have to avoid
+ multiplying 2 billion by 10, as this exceeds 32-bit capabilities.
+
+ time_t might be unsigned. */
+
+ verify (TYPE_IS_INTEGER (time_t));
+ verify (TYPE_TWOS_COMPLEMENT (int));
+
+ /* Destination and source time stamps. */
+ time_t dst_s = dst_stat->st_mtime;
+ time_t src_s = src_stat->st_mtime;
+ int dst_ns = get_stat_mtime_ns (dst_stat);
+ int src_ns = get_stat_mtime_ns (src_stat);
+
+ if (options & UTIMECMP_TRUNCATE_SOURCE)
+ {
+ /* Look up the time stamp resolution for the destination device. */
+
+ /* Hash table for caching information learned about devices. */
+ static Hash_table *ht;
+
+ /* Information about the destination file system. */
+ static struct fs_res *new_dst_res;
+ struct fs_res *dst_res = NULL;
+ struct fs_res tmp_dst_res;
+
+ /* Time stamp resolution in nanoseconds. */
+ int res;
+
+ /* Quick exit, if possible. Since the worst resolution is 2
+ seconds, anything that differs by more than that does not
+ needs source truncation. */
+ if (dst_s == src_s && dst_ns == src_ns)
+ return 0;
+ if (dst_s <= src_s - 2)
+ return -1;
+ if (src_s <= dst_s - 2)
+ return 1;
+
+ /* Try to do a hash lookup, but fall back to stack variables and
+ recomputation on low memory situations. */
+ if (! ht)
+ ht = hash_initialize (16, NULL, dev_info_hash, dev_info_compare, free);
+ if (ht)
+ {
+ if (! new_dst_res)
+ {
+ new_dst_res = malloc (sizeof *new_dst_res);
+ if (!new_dst_res)
+ goto low_memory;
+ new_dst_res->resolution = 2 * BILLION;
+ new_dst_res->exact = false;
+ }
+ new_dst_res->dev = dst_stat->st_dev;
+ dst_res = hash_insert (ht, new_dst_res);
+ if (! dst_res)
+ goto low_memory;
+
+ if (dst_res == new_dst_res)
+ {
+ /* NEW_DST_RES is now in use in the hash table, so allocate a
+ new entry next time. */
+ new_dst_res = NULL;
+ }
+ }
+ else
+ {
+ low_memory:
+ if (ht)
+ {
+ tmp_dst_res.dev = dst_stat->st_dev;
+ dst_res = hash_lookup (ht, &tmp_dst_res);
+ }
+ if (!dst_res)
+ {
+ dst_res = &tmp_dst_res;
+ dst_res->resolution = 2 * BILLION;
+ dst_res->exact = false;
+ }
+ }
+
+ res = dst_res->resolution;
+
+#ifdef _PC_TIMESTAMP_RESOLUTION
+ /* If the system will tell us the resolution, we're set! */
+ if (! dst_res->exact)
+ {
+ res = pathconf (dst_name, _PC_TIMESTAMP_RESOLUTION);
+ if (0 < res)
+ {
+ dst_res->resolution = res;
+ dst_res->exact = true;
+ }
+ }
+#endif
+
+ if (! dst_res->exact)
+ {
+ /* This file system's resolution is not known exactly.
+ Deduce it, and store the result in the hash table. */
+
+ time_t dst_a_s = dst_stat->st_atime;
+ time_t dst_c_s = dst_stat->st_ctime;
+ time_t dst_m_s = dst_s;
+ int dst_a_ns = get_stat_atime_ns (dst_stat);
+ int dst_c_ns = get_stat_ctime_ns (dst_stat);
+ int dst_m_ns = dst_ns;
+
+ /* Set RES to an upper bound on the file system resolution
+ (after truncation due to SYSCALL_RESOLUTION) by inspecting
+ the atime, ctime and mtime of the existing destination.
+ We don't know of any file system that stores atime or
+ ctime with a higher precision than mtime, so it's valid to
+ look at them too. */
+ {
+ bool odd_second = (dst_a_s | dst_c_s | dst_m_s) & 1;
+
+ if (SYSCALL_RESOLUTION == BILLION)
+ {
+ if (odd_second | dst_a_ns | dst_c_ns | dst_m_ns)
+ res = BILLION;
+ }
+ else
+ {
+ int a = dst_a_ns;
+ int c = dst_c_ns;
+ int m = dst_m_ns;
+
+ /* Write it this way to avoid mistaken GCC warning
+ about integer overflow in constant expression. */
+ int SR10 = SYSCALL_RESOLUTION; SR10 *= 10;
+
+ if ((a % SR10 | c % SR10 | m % SR10) != 0)
+ res = SYSCALL_RESOLUTION;
+ else
+ for (res = SR10, a /= SR10, c /= SR10, m /= SR10;
+ (res < dst_res->resolution
+ && (a % 10 | c % 10 | m % 10) == 0);
+ res *= 10, a /= 10, c /= 10, m /= 10)
+ if (res == BILLION)
+ {
+ if (! odd_second)
+ res *= 2;
+ break;
+ }
+ }
+
+ dst_res->resolution = res;
+ }
+
+ if (SYSCALL_RESOLUTION < res)
+ {
+ struct timespec timespec[2];
+ struct stat dst_status;
+
+ /* Ignore source time stamp information that must necessarily
+ be lost when filtered through utimens. */
+ src_ns -= src_ns % SYSCALL_RESOLUTION;
+
+ /* If the time stamps disagree widely enough, there's no need
+ to interrogate the file system to deduce the exact time
+ stamp resolution; return the answer directly. */
+ {
+ time_t s = src_s & ~ (res == 2 * BILLION);
+ if (src_s < dst_s || (src_s == dst_s && src_ns <= dst_ns))
+ return 1;
+ if (dst_s < s
+ || (dst_s == s && dst_ns < src_ns - src_ns % res))
+ return -1;
+ }
+
+ /* Determine the actual time stamp resolution for the
+ destination file system (after truncation due to
+ SYSCALL_RESOLUTION) by setting the access time stamp of the
+ destination to the existing access time, except with
+ trailing nonzero digits. */
+
+ timespec[0].tv_sec = dst_a_s;
+ timespec[0].tv_nsec = dst_a_ns;
+ timespec[1].tv_sec = dst_m_s | (res == 2 * BILLION);
+ timespec[1].tv_nsec = dst_m_ns + res / 9;
+
+ /* Set the modification time. But don't try to set the
+ modification time of symbolic links; on many hosts this sets
+ the time of the pointed-to file. */
+ if ((S_ISLNK (dst_stat->st_mode)
+ ? lutimens (dst_name, timespec)
+ : utimens (dst_name, timespec)) != 0)
+ return -2;
+
+ /* Read the modification time that was set. */
+ {
+ int stat_result = (S_ISLNK (dst_stat->st_mode)
+ ? lstat (dst_name, &dst_status)
+ : stat (dst_name, &dst_status));
+
+ if (stat_result
+ | (dst_status.st_mtime ^ dst_m_s)
+ | (get_stat_mtime_ns (&dst_status) ^ dst_m_ns))
+ {
+ /* The modification time changed, or we can't tell whether
+ it changed. Change it back as best we can. */
+ timespec[1].tv_sec = dst_m_s;
+ timespec[1].tv_nsec = dst_m_ns;
+ if (S_ISLNK (dst_stat->st_mode))
+ lutimens (dst_name, timespec);
+ else
+ utimens (dst_name, timespec);
+ }
+
+ if (stat_result != 0)
+ return -2;
+ }
+
+ /* Determine the exact resolution from the modification time
+ that was read back. */
+ {
+ int old_res = res;
+ int a = (BILLION * (dst_status.st_mtime & 1)
+ + get_stat_mtime_ns (&dst_status));
+
+ res = SYSCALL_RESOLUTION;
+
+ for (a /= res; a % 10 == 0; a /= 10)
+ {
+ if (res == BILLION)
+ {
+ res *= 2;
+ break;
+ }
+ res *= 10;
+ if (res == old_res)
+ break;
+ }
+ }
+ }
+
+ dst_res->resolution = res;
+ dst_res->exact = true;
+ }
+
+ /* Truncate the source's time stamp according to the resolution. */
+ src_s &= ~ (res == 2 * BILLION);
+ src_ns -= src_ns % res;
+ }
+
+ /* Compare the time stamps and return -1, 0, 1 accordingly. */
+ return (dst_s < src_s ? -1
+ : dst_s > src_s ? 1
+ : dst_ns < src_ns ? -1
+ : dst_ns > src_ns);
+}
diff --git a/gnulib/lib/utimecmp.h b/gnulib/lib/utimecmp.h
new file mode 100644
index 0000000..684d10f
--- /dev/null
+++ b/gnulib/lib/utimecmp.h
@@ -0,0 +1,37 @@
+/* utimecmp.h -- compare file time stamps
+
+ Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef UTIMECMP_H
+#define UTIMECMP_H 1
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* Options for utimecmp. */
+enum
+{
+ /* Before comparing, truncate the source time stamp to the
+ resolution of the destination file system and to the resolution
+ of utimens. */
+ UTIMECMP_TRUNCATE_SOURCE = 1
+};
+
+int utimecmp (char const *, struct stat const *, struct stat const *, int);
+
+#endif
diff --git a/gnulib/lib/utimens.c b/gnulib/lib/utimens.c
new file mode 100644
index 0000000..f7cb8de
--- /dev/null
+++ b/gnulib/lib/utimens.c
@@ -0,0 +1,533 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2003-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+
+#include "utimens.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+
+#if HAVE_UTIME_H
+# include <utime.h>
+#endif
+
+/* Some systems (even some that do have <utime.h>) don't declare this
+ structure anywhere. */
+#ifndef HAVE_STRUCT_UTIMBUF
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+#endif
+
+/* Avoid recursion with rpl_futimens or rpl_utimensat. */
+#undef futimens
+#undef utimensat
+
+/* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. Force the use of rpl_stat for a fix. */
+#ifndef REPLACE_FUNC_STAT_FILE
+# define REPLACE_FUNC_STAT_FILE 0
+#endif
+
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+/* Cache variables for whether the utimensat syscall works; used to
+ avoid calling the syscall if we know it will just fail with ENOSYS,
+ and to avoid unnecessary work in massaging timestamps if the
+ syscall will work. Multiple variables are needed, to distinguish
+ between the following scenarios on Linux:
+ utimensat doesn't exist, or is in glibc but kernel 2.6.18 fails with ENOSYS
+ kernel 2.6.22 and earlier rejects AT_SYMLINK_NOFOLLOW
+ kernel 2.6.25 and earlier reject UTIME_NOW/UTIME_OMIT with non-zero tv_sec
+ kernel 2.6.32 used with xfs or ntfs-3g fail to honor UTIME_OMIT
+ utimensat completely works
+ For each cache variable: 0 = unknown, 1 = yes, -1 = no. */
+static int utimensat_works_really;
+static int lutimensat_works_really;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+/* Validate the requested timestamps. Return 0 if the resulting
+ timespec can be used for utimensat (after possibly modifying it to
+ work around bugs in utimensat). Return a positive value if the
+ timespec needs further adjustment based on stat results: 1 if any
+ adjustment is needed for utimes, and 2 if any adjustment is needed
+ for Linux utimensat. Return -1, with errno set to EINVAL, if
+ timespec is out of range. */
+static int
+validate_timespec (struct timespec timespec[2])
+{
+ int result = 0;
+ int utime_omit_count = 0;
+ assert (timespec);
+ if ((timespec[0].tv_nsec != UTIME_NOW
+ && timespec[0].tv_nsec != UTIME_OMIT
+ && (timespec[0].tv_nsec < 0 || 1000000000 <= timespec[0].tv_nsec))
+ || (timespec[1].tv_nsec != UTIME_NOW
+ && timespec[1].tv_nsec != UTIME_OMIT
+ && (timespec[1].tv_nsec < 0 || 1000000000 <= timespec[1].tv_nsec)))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ /* Work around Linux kernel 2.6.25 bug, where utimensat fails with
+ EINVAL if tv_sec is not 0 when using the flag values of tv_nsec.
+ Flag a Linux kernel 2.6.32 bug, where an mtime of UTIME_OMIT
+ fails to bump ctime. */
+ if (timespec[0].tv_nsec == UTIME_NOW
+ || timespec[0].tv_nsec == UTIME_OMIT)
+ {
+ timespec[0].tv_sec = 0;
+ result = 1;
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ if (timespec[1].tv_nsec == UTIME_NOW
+ || timespec[1].tv_nsec == UTIME_OMIT)
+ {
+ timespec[1].tv_sec = 0;
+ result = 1;
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ return result + (utime_omit_count == 1);
+}
+
+/* Normalize any UTIME_NOW or UTIME_OMIT values in *TS, using stat
+ buffer STATBUF to obtain the current timestamps of the file. If
+ both times are UTIME_NOW, set *TS to NULL (as this can avoid some
+ permissions issues). If both times are UTIME_OMIT, return true
+ (nothing further beyond the prior collection of STATBUF is
+ necessary); otherwise return false. */
+static bool
+update_timespec (struct stat const *statbuf, struct timespec *ts[2])
+{
+ struct timespec *timespec = *ts;
+ if (timespec[0].tv_nsec == UTIME_OMIT
+ && timespec[1].tv_nsec == UTIME_OMIT)
+ return true;
+ if (timespec[0].tv_nsec == UTIME_NOW
+ && timespec[1].tv_nsec == UTIME_NOW)
+ {
+ *ts = NULL;
+ return false;
+ }
+
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ timespec[0] = get_stat_atime (statbuf);
+ else if (timespec[0].tv_nsec == UTIME_NOW)
+ gettime (&timespec[0]);
+
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ timespec[1] = get_stat_mtime (statbuf);
+ else if (timespec[1].tv_nsec == UTIME_NOW)
+ gettime (&timespec[1]);
+
+ return false;
+}
+
+/* Set the access and modification time stamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the time stamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+fdutimens (int fd, char const *file, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* Require that at least one of FD or FILE are potentially valid, to avoid
+ a Linux bug where futimens (AT_FDCWD, NULL) changes "." rather
+ than failing. */
+ if (fd < 0 && !file)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ /* Some Linux-based NFS clients are buggy, and mishandle time stamps
+ of files in NFS file systems in some cases. We have no
+ configure-time test for this, but please see
+ <http://bugs.gentoo.org/show_bug.cgi?id=132673> for references to
+ some of the problems with Linux 2.6.16. If this affects you,
+ compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to
+ help in some cases, albeit at a cost in performance. But you
+ really should upgrade your kernel to a fixed version, since the
+ problem affects many applications. */
+
+#if HAVE_BUGGY_NFS_TIME_STAMPS
+ if (fd < 0)
+ sync ();
+ else
+ fsync (fd);
+#endif
+
+ /* POSIX 2008 added two interfaces to set file timestamps with
+ nanosecond resolution; newer Linux implements both functions via
+ a single syscall. We provide a fallback for ENOSYS (for example,
+ compiling against Linux 2.6.25 kernel headers and glibc 2.7, but
+ running on Linux 2.6.18 kernel). */
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+ if (0 <= utimensat_works_really)
+ {
+ int result;
+# if __linux__
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory [f]stat prior
+ to calling futimens/utimensat; fortunately, there is not much
+ timing impact due to the extra syscall even on file systems
+ where UTIME_OMIT would have worked. FIXME: Simplify this in
+ 2012, when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (fd < 0 ? stat (file, &st) : fstat (fd, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif /* __linux__ */
+# if HAVE_UTIMENSAT
+ if (fd < 0)
+ {
+ result = utimensat (AT_FDCWD, file, ts, 0);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ http://bugzilla.redhat.com/442352
+ http://bugzilla.redhat.com/449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_UTIMENSAT */
+# if HAVE_FUTIMENS
+ if (0 <= fd)
+ {
+ result = futimens (fd, ts);
+# ifdef __linux__
+ /* Work around the same bug as above. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_FUTIMENS */
+ }
+ utimensat_works_really = -1;
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || (REPLACE_FUNC_STAT_FILE && fd < 0))
+ {
+ if (adjustment_needed != 3
+ && (fd < 0 ? stat (file, &st) : fstat (fd, &st)))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ {
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
+ struct timeval timeval[2];
+ struct timeval *t;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ if (fd < 0)
+ {
+# if HAVE_FUTIMESAT
+ return futimesat (AT_FDCWD, file, t);
+# endif
+ }
+ else
+ {
+ /* If futimesat or futimes fails here, don't try to speed things
+ up by returning right away. glibc can incorrectly fail with
+ errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0
+ in high security mode doesn't allow ordinary users to read
+ /proc/self, so glibc incorrectly fails with errno == EACCES.
+ If errno == EIO, EPERM, or EROFS, it's probably safe to fail
+ right away, but these cases are rare enough that they're not
+ worth optimizing, and who knows what other messed-up systems
+ are out there? So play it safe and fall back on the code
+ below. */
+
+# if (HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) || HAVE_FUTIMES
+# if HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG
+# undef futimes
+# define futimes(fd, t) futimesat (fd, NULL, t)
+# endif
+ if (futimes (fd, t) == 0)
+ {
+# if __linux__ && __GLIBC__
+ /* Work around a longstanding glibc bug, still present as
+ of 2010-12-27. On older Linux kernels that lack both
+ utimensat and utimes, glibc's futimes rounds instead of
+ truncating when falling back on utime. The same bug
+ occurs in futimesat with a null 2nd arg. */
+ if (t)
+ {
+ bool abig = 500000 <= t[0].tv_usec;
+ bool mbig = 500000 <= t[1].tv_usec;
+ if ((abig | mbig) && fstat (fd, &st) == 0)
+ {
+ /* If these two subtractions overflow, they'll
+ track the overflows inside the buggy glibc. */
+ time_t adiff = st.st_atime - t[0].tv_sec;
+ time_t mdiff = st.st_mtime - t[1].tv_sec;
+
+ struct timeval *tt = NULL;
+ struct timeval truncated_timeval[2];
+ truncated_timeval[0] = t[0];
+ truncated_timeval[1] = t[1];
+ if (abig && adiff == 1 && get_stat_atime_ns (&st) == 0)
+ {
+ tt = truncated_timeval;
+ tt[0].tv_usec = 0;
+ }
+ if (mbig && mdiff == 1 && get_stat_mtime_ns (&st) == 0)
+ {
+ tt = truncated_timeval;
+ tt[1].tv_usec = 0;
+ }
+ if (tt)
+ futimes (fd, tt);
+ }
+ }
+# endif
+
+ return 0;
+ }
+# endif
+ }
+#endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
+
+ if (!file)
+ {
+#if ! ((HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) \
+ || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
+ errno = ENOSYS;
+#endif
+ return -1;
+ }
+
+#if HAVE_WORKING_UTIMES
+ return utimes (file, t);
+#else
+ {
+ struct utimbuf utimbuf;
+ struct utimbuf *ut;
+ if (ts)
+ {
+ utimbuf.actime = ts[0].tv_sec;
+ utimbuf.modtime = ts[1].tv_sec;
+ ut = &utimbuf;
+ }
+ else
+ ut = NULL;
+
+ return utime (file, ut);
+ }
+#endif /* !HAVE_WORKING_UTIMES */
+ }
+}
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively. */
+int
+utimens (char const *file, struct timespec const timespec[2])
+{
+ return fdutimens (-1, file, timespec);
+}
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively, without dereferencing
+ symlinks. Fail with ENOSYS if the platform does not support
+ changing symlink timestamps, but FILE was a symlink. */
+int
+lutimens (char const *file, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* The Linux kernel did not support symlink timestamps until
+ utimensat, in version 2.6.22, so we don't need to mimic
+ fdutimens' worry about buggy NFS clients. But we do have to
+ worry about bogus return values. */
+
+#if HAVE_UTIMENSAT
+ if (0 <= lutimensat_works_really)
+ {
+ int result;
+# if __linux__
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory lstat prior to
+ calling utimensat; fortunately, there is not much timing
+ impact due to the extra syscall even on file systems where
+ UTIME_OMIT would have worked. FIXME: Simplify this in 2012,
+ when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (lstat (file, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif /* __linux__ */
+ result = utimensat (AT_FDCWD, file, ts, AT_SYMLINK_NOFOLLOW);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ http://bugzilla.redhat.com/442352
+ http://bugzilla.redhat.com/449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ lutimensat_works_really = 1;
+ return result;
+ }
+ }
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT */
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || REPLACE_FUNC_STAT_FILE)
+ {
+ if (adjustment_needed != 3 && lstat (file, &st))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ /* On Linux, lutimes is a thin wrapper around utimensat, so there is
+ no point trying lutimes if utimensat failed with ENOSYS. */
+#if HAVE_LUTIMES && !HAVE_UTIMENSAT
+ {
+ struct timeval timeval[2];
+ struct timeval *t;
+ int result;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ result = lutimes (file, t);
+ if (result == 0 || errno != ENOSYS)
+ return result;
+ }
+#endif /* HAVE_LUTIMES && !HAVE_UTIMENSAT */
+
+ /* Out of luck for symlinks, but we still handle regular files. */
+ if (!(adjustment_needed || REPLACE_FUNC_STAT_FILE) && lstat (file, &st))
+ return -1;
+ if (!S_ISLNK (st.st_mode))
+ return fdutimens (-1, file, ts);
+ errno = ENOSYS;
+ return -1;
+}
diff --git a/gnulib/lib/utimens.h b/gnulib/lib/utimens.h
new file mode 100644
index 0000000..8c47cf9
--- /dev/null
+++ b/gnulib/lib/utimens.h
@@ -0,0 +1,19 @@
+#include <time.h>
+int fdutimens (int, char const *, struct timespec const [2]);
+int utimens (char const *, struct timespec const [2]);
+int lutimens (char const *, struct timespec const [2]);
+
+#if GNULIB_FDUTIMENSAT
+# include <fcntl.h>
+# include <sys/stat.h>
+
+int fdutimensat (int fd, int dir, char const *name, struct timespec const [2],
+ int atflag);
+
+/* Using this function makes application code slightly more readable. */
+static inline int
+lutimensat (int dir, char const *file, struct timespec const times[2])
+{
+ return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW);
+}
+#endif
diff --git a/gnulib/lib/utimensat.c b/gnulib/lib/utimensat.c
new file mode 100644
index 0000000..37f0ea8
--- /dev/null
+++ b/gnulib/lib/utimensat.c
@@ -0,0 +1,154 @@
+/* Set the access and modification time of a file relative to directory fd.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+#include "utimens.h"
+
+#if HAVE_UTIMENSAT
+
+# undef utimensat
+
+/* If we have a native utimensat, but are compiling this file, then
+ utimensat was defined to rpl_utimensat by our replacement
+ sys/stat.h. We assume the native version might fail with ENOSYS,
+ or succeed without properly affecting ctime (as is the case when
+ using newer glibc but older Linux kernel). In this scenario,
+ rpl_utimensat checks whether the native version is usable, and
+ local_utimensat provides the fallback manipulation. */
+
+static int local_utimensat (int, char const *, struct timespec const[2], int);
+# define AT_FUNC_NAME local_utimensat
+
+/* Like utimensat, but work around native bugs. */
+
+int
+rpl_utimensat (int fd, char const *file, struct timespec const times[2],
+ int flag)
+{
+# ifdef __linux__
+ struct timespec ts[2];
+# endif
+
+ /* See comments in utimens.c for details. */
+ static int utimensat_works_really; /* 0 = unknown, 1 = yes, -1 = no. */
+ if (0 <= utimensat_works_really)
+ {
+ int result;
+# ifdef __linux__
+ struct stat st;
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory [l]stat prior
+ to calling utimensat; fortunately, there is not much timing
+ impact due to the extra syscall even on file systems where
+ UTIME_OMIT would have worked. FIXME: Simplify this in 2012,
+ when file system bugs are no longer common. */
+ if (times && (times[0].tv_nsec == UTIME_OMIT
+ || times[1].tv_nsec == UTIME_OMIT))
+ {
+ if (fstatat (fd, file, &st, flag))
+ return -1;
+ if (times[0].tv_nsec == UTIME_OMIT && times[1].tv_nsec == UTIME_OMIT)
+ return 0;
+ if (times[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else
+ ts[0] = times[0];
+ if (times[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ else
+ ts[1] = times[1];
+ times = ts;
+ }
+# ifdef __hppa__
+ /* Linux kernel 2.6.22.19 on hppa does not reject invalid tv_nsec
+ values. */
+ else if (times
+ && ((times[0].tv_nsec != UTIME_NOW
+ && (times[0].tv_nsec < 0
+ || times[0].tv_nsec >= 1000000000))
+ || (times[1].tv_nsec != UTIME_NOW
+ && (times[1].tv_nsec < 0
+ || times[1].tv_nsec >= 1000000000))))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+# endif
+# endif /* __linux__ */
+ result = utimensat (fd, file, times, flag);
+ /* Linux kernel 2.6.25 has a bug where it returns EINVAL for
+ UTIME_NOW or UTIME_OMIT with non-zero tv_sec, which
+ local_utimensat works around. Meanwhile, EINVAL for a bad
+ flag is indeterminate whether the native utimensat works, but
+ local_utimensat will also reject it. */
+ if (result == -1 && errno == EINVAL && (flag & ~AT_SYMLINK_NOFOLLOW))
+ return result;
+ if (result == 0 || (errno != ENOSYS && errno != EINVAL))
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+ /* No point in trying openat/futimens, since on Linux, futimens is
+ implemented with the same syscall as utimensat. Only avoid the
+ native utimensat due to an ENOSYS failure; an EINVAL error was
+ data-dependent, and the next caller may pass valid data. */
+ if (0 <= utimensat_works_really && errno == ENOSYS)
+ utimensat_works_really = -1;
+ return local_utimensat (fd, file, times, flag);
+}
+
+#else /* !HAVE_UTIMENSAT */
+
+# define AT_FUNC_NAME utimensat
+
+#endif /* !HAVE_UTIMENSAT */
+
+/* Set the access and modification time stamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively; relative to directory
+ FD. If flag is AT_SYMLINK_NOFOLLOW, change the times of a symlink,
+ or fail with ENOSYS if not possible. If TIMESPEC is null, set the
+ time stamps to the current time. If possible, do it without
+ changing the working directory. Otherwise, resort to using
+ save_cwd/fchdir, then utimens/restore_cwd. If either the save_cwd
+ or the restore_cwd fails, then give a diagnostic and exit nonzero.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+/* AT_FUNC_NAME is now utimensat or local_utimensat. */
+#define AT_FUNC_F1 lutimens
+#define AT_FUNC_F2 utimens
+#define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+#define AT_FUNC_POST_FILE_PARAM_DECLS , struct timespec const ts[2], int flag
+#define AT_FUNC_POST_FILE_ARGS , ts
+#include "at-func.c"
+#undef AT_FUNC_NAME
+#undef AT_FUNC_F1
+#undef AT_FUNC_F2
+#undef AT_FUNC_USE_F1_COND
+#undef AT_FUNC_POST_FILE_PARAM_DECLS
+#undef AT_FUNC_POST_FILE_ARGS
diff --git a/gnulib/lib/vasnprintf.c b/gnulib/lib/vasnprintf.c
new file mode 100644
index 0000000..40789f9
--- /dev/null
+++ b/gnulib/lib/vasnprintf.c
@@ -0,0 +1,5607 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ VASNPRINTF The name of the function being defined.
+ FCHAR_T The element type of the format string.
+ DCHAR_T The element type of the destination (result) string.
+ FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII. MUST be set if
+ FCHAR_T and DCHAR_T are not the same type.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on FCHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on FCHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on FCHAR_T.
+ DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
+ DCHAR_SET memset like function for DCHAR_T[] arrays.
+ DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
+ SNPRINTF The system's snprintf (or similar) function.
+ This may be either snprintf or swprintf.
+ TCHAR_T The element type of the argument and result string
+ of the said SNPRINTF function. This may be either
+ char or wchar_t. The code exploits that
+ sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T).
+ DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
+ DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+ DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
+ DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
+ DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifndef VASNPRINTF
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+# else
+# include "vasnprintf.h"
+# endif
+#endif
+
+#include <locale.h> /* localeconv() */
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+# else
+# include "printf-parse.h"
+# endif
+#endif
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#include "verify.h"
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "float+.h"
+#endif
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+# include "printf-frexp.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "printf-frexpl.h"
+# include "fpucw.h"
+#endif
+
+/* Default parameters. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define FCHAR_T wchar_t
+# define DCHAR_T wchar_t
+# define TCHAR_T wchar_t
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define DCHAR_CPY wmemcpy
+# define DCHAR_SET wmemset
+# else
+# define VASNPRINTF vasnprintf
+# define FCHAR_T char
+# define DCHAR_T char
+# define TCHAR_T char
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define DCHAR_CPY memcpy
+# define DCHAR_SET memset
+# endif
+#endif
+#if WIDE_CHAR_VERSION
+ /* TCHAR_T is wchar_t. */
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the function _snwprintf() or - on mingw - snwprintf()
+ instead. The mingw function snwprintf() has fewer bugs than the
+ MSVCRT function _snwprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snwprintf
+# else
+# define SNPRINTF _snwprintf
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+ /* TCHAR_T is char. */
+ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+ But don't use it on BeOS, since BeOS snprintf produces no output if the
+ size argument is >= 0x3000000.
+ Also don't use it on Linux libc5, since there snprintf with size = 1
+ writes any output without bounds, like sprintf. */
+# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1)
+# define USE_SNPRINTF 1
+# else
+# define USE_SNPRINTF 0
+# endif
+# if HAVE_DECL__SNPRINTF
+ /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT
+ function _snprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# else
+# define SNPRINTF _snprintf
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# endif
+#endif
+/* Here we need to call the native sprintf, not rpl_sprintf. */
+#undef sprintf
+
+/* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized"
+ warnings in this file. Use -Dlint to suppress them. */
+#ifdef lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() and remainder() functions. */
+#undef exp
+#define exp expo
+#undef remainder
+#define remainder rem
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && !WIDE_CHAR_VERSION
+# if (HAVE_STRNLEN && !defined _AIX)
+# define local_strnlen strnlen
+# else
+# ifndef local_strnlen_defined
+# define local_strnlen_defined 1
+static size_t
+local_strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+# endif
+# endif
+#endif
+
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T
+# if HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99) && HAVE_WCHAR_T && WIDE_CHAR_VERSION
+# if HAVE_WCSNLEN
+# define local_wcsnlen wcsnlen
+# else
+# ifndef local_wcsnlen_defined
+# define local_wcsnlen_defined 1
+static size_t
+local_wcsnlen (const wchar_t *s, size_t maxlen)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+/* Determine the decimal-point character according to the current locale. */
+# ifndef decimal_point_char_defined
+# define decimal_point_char_defined 1
+static char
+decimal_point_char (void)
+{
+ const char *point;
+ /* Determine it in a multithread-safe way. We know nl_langinfo is
+ multithread-safe on glibc systems and MacOS X systems, but is not required
+ to be multithread-safe by POSIX. sprintf(), however, is multithread-safe.
+ localeconv() is rarely multithread-safe. */
+# if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__))
+ point = nl_langinfo (RADIXCHAR);
+# elif 1
+ char pointbuf[5];
+ sprintf (pointbuf, "%#.0f", 1.0);
+ point = &pointbuf[1];
+# else
+ point = localeconv () -> decimal_point;
+# endif
+ /* The decimal point is always a single byte: either '.' or ','. */
+ return (point[0] != '\0' ? point[0] : '.');
+}
+# endif
+#endif
+
+#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zero (double x)
+{
+ return isnand (x) || x + x == x;
+}
+
+#endif
+
+#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zerol (long double x)
+{
+ return isnanl (x) || x + x == x;
+}
+
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+
+/* Converting 'long double' to decimal without rare rounding bugs requires
+ real bignums. We use the naming conventions of GNU gmp, but vastly simpler
+ (and slower) algorithms. */
+
+typedef unsigned int mp_limb_t;
+# define GMP_LIMB_BITS 32
+verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS);
+
+typedef unsigned long long mp_twolimb_t;
+# define GMP_TWOLIMB_BITS 64
+verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS);
+
+/* Representation of a bignum >= 0. */
+typedef struct
+{
+ size_t nlimbs;
+ mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
+} mpn_t;
+
+/* Compute the product of two bignums >= 0.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+{
+ const mp_limb_t *p1;
+ const mp_limb_t *p2;
+ size_t len1;
+ size_t len2;
+
+ if (src1.nlimbs <= src2.nlimbs)
+ {
+ len1 = src1.nlimbs;
+ p1 = src1.limbs;
+ len2 = src2.nlimbs;
+ p2 = src2.limbs;
+ }
+ else
+ {
+ len1 = src2.nlimbs;
+ p1 = src2.limbs;
+ len2 = src1.nlimbs;
+ p2 = src1.limbs;
+ }
+ /* Now 0 <= len1 <= len2. */
+ if (len1 == 0)
+ {
+ /* src1 or src2 is zero. */
+ dest->nlimbs = 0;
+ dest->limbs = (mp_limb_t *) malloc (1);
+ }
+ else
+ {
+ /* Here 1 <= len1 <= len2. */
+ size_t dlen;
+ mp_limb_t *dp;
+ size_t k, i, j;
+
+ dlen = len1 + len2;
+ dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+ if (dp == NULL)
+ return NULL;
+ for (k = len2; k > 0; )
+ dp[--k] = 0;
+ for (i = 0; i < len1; i++)
+ {
+ mp_limb_t digit1 = p1[i];
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < len2; j++)
+ {
+ mp_limb_t digit2 = p2[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ carry += dp[i + j];
+ dp[i + j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ dp[i + len2] = (mp_limb_t) carry;
+ }
+ /* Normalise. */
+ while (dlen > 0 && dp[dlen - 1] == 0)
+ dlen--;
+ dest->nlimbs = dlen;
+ dest->limbs = dp;
+ }
+ return dest->limbs;
+}
+
+/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+ a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
+ the remainder.
+ Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+ q is incremented.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+divide (mpn_t a, mpn_t b, mpn_t *q)
+{
+ /* Algorithm:
+ First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+ with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+ If m<n, then q:=0 and r:=a.
+ If m>=n=1, perform a single-precision division:
+ r:=0, j:=m,
+ while j>0 do
+ {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+ = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+ j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+ Normalise [q[m-1],...,q[0]], yields q.
+ If m>=n>1, perform a multiple-precision division:
+ We have a/b < beta^(m-n+1).
+ s:=intDsize-1-(highest bit in b[n-1]), 0<=s<intDsize.
+ Shift a and b left by s bits, copying them. r:=a.
+ r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+ For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+ Compute q* :
+ q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+ In case of overflow (q* >= beta) set q* := beta-1.
+ Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+ and c3 := b[n-2] * q*.
+ {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+ occurred. Furthermore 0 <= c3 < beta^2.
+ If there was overflow and
+ r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+ the next test can be skipped.}
+ While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+ Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+ If q* > 0:
+ Put r := r - b * q* * beta^j. In detail:
+ [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+ hence: u:=0, for i:=0 to n-1 do
+ u := u + q* * b[i],
+ r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+ u:=u div beta (+ 1, if carry in subtraction)
+ r[n+j]:=r[n+j]-u.
+ {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+ < q* + 1 <= beta,
+ the carry u does not overflow.}
+ If a negative carry occurs, put q* := q* - 1
+ and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+ Set q[j] := q*.
+ Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+ Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+ rest r.
+ The room for q[j] can be allocated at the memory location of r[n+j].
+ Finally, round-to-even:
+ Shift r left by 1 bit.
+ If r > b or if r = b and q[0] is odd, q := q+1.
+ */
+ const mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ const mp_limb_t *b_ptr = b.limbs;
+ size_t b_len = b.nlimbs;
+ mp_limb_t *roomptr;
+ mp_limb_t *tmp_roomptr = NULL;
+ mp_limb_t *q_ptr;
+ size_t q_len;
+ mp_limb_t *r_ptr;
+ size_t r_len;
+
+ /* Allocate room for a_len+2 digits.
+ (Need a_len+1 digits for the real division and 1 more digit for the
+ final rounding of q.) */
+ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+ if (roomptr == NULL)
+ return NULL;
+
+ /* Normalise a. */
+ while (a_len > 0 && a_ptr[a_len - 1] == 0)
+ a_len--;
+
+ /* Normalise b. */
+ for (;;)
+ {
+ if (b_len == 0)
+ /* Division by zero. */
+ abort ();
+ if (b_ptr[b_len - 1] == 0)
+ b_len--;
+ else
+ break;
+ }
+
+ /* Here m = a_len >= 0 and n = b_len > 0. */
+
+ if (a_len < b_len)
+ {
+ /* m<n: trivial case. q=0, r := copy of a. */
+ r_ptr = roomptr;
+ r_len = a_len;
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ q_ptr = roomptr + a_len;
+ q_len = 0;
+ }
+ else if (b_len == 1)
+ {
+ /* n=1: single precision division.
+ beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
+ r_ptr = roomptr;
+ q_ptr = roomptr + 1;
+ {
+ mp_limb_t den = b_ptr[0];
+ mp_limb_t remainder = 0;
+ const mp_limb_t *sourceptr = a_ptr + a_len;
+ mp_limb_t *destptr = q_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+ *--destptr = num / den;
+ remainder = num % den;
+ }
+ /* Normalise and store r. */
+ if (remainder > 0)
+ {
+ r_ptr[0] = remainder;
+ r_len = 1;
+ }
+ else
+ r_len = 0;
+ /* Normalise q. */
+ q_len = a_len;
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+ }
+ }
+ else
+ {
+ /* n>1: multiple precision division.
+ beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
+ beta^(m-n-1) <= a/b < beta^(m-n+1). */
+ /* Determine s. */
+ size_t s;
+ {
+ mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+ /* Determine s = GMP_LIMB_BITS - integer_length (msd).
+ Code copied from gnulib's integer_length.c. */
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ s = __builtin_clz (msd);
+# else
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ if (GMP_LIMB_BITS <= DBL_MANT_BIT)
+ {
+ /* Use 'double' operations.
+ Assumes an IEEE 754 'double' implementation. */
+# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+
+ /* Use a single integer to floating-point conversion. */
+ m.value = msd;
+
+ s = GMP_LIMB_BITS
+ - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK)
+ - DBL_EXP_BIAS);
+ }
+ else
+# undef NWORDS
+# endif
+ {
+ s = 31;
+ if (msd >= 0x10000)
+ {
+ msd = msd >> 16;
+ s -= 16;
+ }
+ if (msd >= 0x100)
+ {
+ msd = msd >> 8;
+ s -= 8;
+ }
+ if (msd >= 0x10)
+ {
+ msd = msd >> 4;
+ s -= 4;
+ }
+ if (msd >= 0x4)
+ {
+ msd = msd >> 2;
+ s -= 2;
+ }
+ if (msd >= 0x2)
+ {
+ msd = msd >> 1;
+ s -= 1;
+ }
+ }
+# endif
+ }
+ /* 0 <= s < GMP_LIMB_BITS.
+ Copy b, shifting it left by s bits. */
+ if (s > 0)
+ {
+ tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+ if (tmp_roomptr == NULL)
+ {
+ free (roomptr);
+ return NULL;
+ }
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = tmp_roomptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ /* accu must be zero, since that was how s was determined. */
+ if (accu != 0)
+ abort ();
+ }
+ b_ptr = tmp_roomptr;
+ }
+ /* Copy a, shifting it left by s bits, yields r.
+ Memory layout:
+ At the beginning: r = roomptr[0..a_len],
+ at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
+ r_ptr = roomptr;
+ if (s == 0)
+ {
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ r_ptr[a_len] = 0;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = a_ptr;
+ mp_limb_t *destptr = r_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ *destptr++ = (mp_limb_t) accu;
+ }
+ q_ptr = roomptr + b_len;
+ q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+ {
+ size_t j = a_len - b_len; /* m-n */
+ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+ /* Division loop, traversed m-n+1 times.
+ j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
+ for (;;)
+ {
+ mp_limb_t q_star;
+ mp_limb_t c1;
+ if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+ {
+ /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
+ mp_twolimb_t num =
+ ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+ | r_ptr[j + b_len - 1];
+ q_star = num / b_msd;
+ c1 = num % b_msd;
+ }
+ else
+ {
+ /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
+ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+ <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+ <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+ {<= beta !}.
+ If yes, jump directly to the subtraction loop.
+ (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+ <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+ if (r_ptr[j + b_len] > b_msd
+ || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+ /* r[j+n] >= b[n-1]+1 or
+ r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+ carry. */
+ goto subtract;
+ }
+ /* q_star = q*,
+ c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
+ {
+ mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+ ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+ mp_twolimb_t c3 = /* b[n-2] * q* */
+ (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+ /* While c2 < c3, increase c2 and decrease c3.
+ Consider c3-c2. While it is > 0, decrease it by
+ b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
+ this can happen only twice. */
+ if (c3 > c2)
+ {
+ q_star = q_star - 1; /* q* := q* - 1 */
+ if (c3 - c2 > b_msdd)
+ q_star = q_star - 1; /* q* := q* - 1 */
+ }
+ }
+ if (q_star > 0)
+ subtract:
+ {
+ /* Subtract r := r - b * q* * beta^j. */
+ mp_limb_t cr;
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_twolimb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ /* Here 0 <= carry <= q*. */
+ carry =
+ carry
+ + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+ + (mp_limb_t) ~(*destptr);
+ /* Here 0 <= carry <= beta*q* + beta-1. */
+ *destptr++ = ~(mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS; /* <= q* */
+ }
+ cr = (mp_limb_t) carry;
+ }
+ /* Subtract cr from r_ptr[j + b_len], then forget about
+ r_ptr[j + b_len]. */
+ if (cr > r_ptr[j + b_len])
+ {
+ /* Subtraction gave a carry. */
+ q_star = q_star - 1; /* q* := q* - 1 */
+ /* Add b back. */
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_limb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ mp_limb_t source1 = *sourceptr++;
+ mp_limb_t source2 = *destptr;
+ *destptr++ = source1 + source2 + carry;
+ carry =
+ (carry
+ ? source1 >= (mp_limb_t) ~source2
+ : source1 > (mp_limb_t) ~source2);
+ }
+ }
+ /* Forget about the carry and about r[j+n]. */
+ }
+ }
+ /* q* is determined. Store it as q[j]. */
+ q_ptr[j] = q_star;
+ if (j == 0)
+ break;
+ j--;
+ }
+ }
+ r_len = b_len;
+ /* Normalise q. */
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+ b is shifted left by s bits. */
+ /* Shift r right by s bits. */
+ if (s > 0)
+ {
+ mp_limb_t ptr = r_ptr + r_len;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = r_len; count > 0; count--)
+ {
+ accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+ accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+ *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+ }
+ }
+# endif
+ /* Normalise r. */
+ while (r_len > 0 && r_ptr[r_len - 1] == 0)
+ r_len--;
+ }
+ /* Compare r << 1 with b. */
+ if (r_len > b_len)
+ goto increment_q;
+ {
+ size_t i;
+ for (i = b_len;;)
+ {
+ mp_limb_t r_i =
+ (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+ | (i < r_len ? r_ptr[i] << 1 : 0);
+ mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+ if (r_i > b_i)
+ goto increment_q;
+ if (r_i < b_i)
+ goto keep_q;
+ if (i == 0)
+ break;
+ i--;
+ }
+ }
+ if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+ /* q is odd. */
+ increment_q:
+ {
+ size_t i;
+ for (i = 0; i < q_len; i++)
+ if (++(q_ptr[i]) != 0)
+ goto keep_q;
+ q_ptr[q_len++] = 1;
+ }
+ keep_q:
+ if (tmp_roomptr != NULL)
+ free (tmp_roomptr);
+ q->limbs = q_ptr;
+ q->nlimbs = q_len;
+ return roomptr;
+}
+
+/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+ representation.
+ Destroys the contents of a.
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+convert_to_decimal (mpn_t a, size_t extra_zeroes)
+{
+ mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
+ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+ char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
+ if (c_ptr != NULL)
+ {
+ char *d_ptr = c_ptr;
+ for (; extra_zeroes > 0; extra_zeroes--)
+ *d_ptr++ = '0';
+ while (a_len > 0)
+ {
+ /* Divide a by 10^9, in-place. */
+ mp_limb_t remainder = 0;
+ mp_limb_t *ptr = a_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+ *ptr = num / 1000000000;
+ remainder = num % 1000000000;
+ }
+ /* Store the remainder as 9 decimal digits. */
+ for (count = 9; count > 0; count--)
+ {
+ *d_ptr++ = '0' + (remainder % 10);
+ remainder = remainder / 10;
+ }
+ /* Normalize a. */
+ if (a_ptr[a_len - 1] == 0)
+ a_len--;
+ }
+ /* Remove leading zeroes. */
+ while (d_ptr > c_ptr && d_ptr[-1] == '0')
+ d_ptr--;
+ /* But keep at least one zero. */
+ if (d_ptr == c_ptr)
+ *d_ptr++ = '0';
+ /* Terminate the string. */
+ *d_ptr = '\0';
+ }
+ return c_ptr;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_long_double (long double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ long double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'long double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess
+ precision. */
+ if (!(y == 0.0L))
+ abort ();
+# endif
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - LDBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_double (double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+ if (!(y == 0.0))
+ abort ();
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - DBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+{
+ int s;
+ size_t extra_zeroes;
+ unsigned int abs_n;
+ unsigned int abs_s;
+ mp_limb_t *pow5_ptr;
+ size_t pow5_len;
+ unsigned int s_limbs;
+ unsigned int s_bits;
+ mpn_t pow5;
+ mpn_t z;
+ void *z_memory;
+ char *digits;
+
+ if (memory == NULL)
+ return NULL;
+ /* x = 2^e * m, hence
+ y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+ = round (2^s * 5^n * m). */
+ s = e + n;
+ extra_zeroes = 0;
+ /* Factor out a common power of 10 if possible. */
+ if (s > 0 && n > 0)
+ {
+ extra_zeroes = (s < n ? s : n);
+ s -= extra_zeroes;
+ n -= extra_zeroes;
+ }
+ /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+ Before converting to decimal, we need to compute
+ z = round (2^s * 5^n * m). */
+ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+ sign. 2.322 is slightly larger than log(5)/log(2). */
+ abs_n = (n >= 0 ? n : -n);
+ abs_s = (s >= 0 ? s : -s);
+ pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+ + abs_s / GMP_LIMB_BITS + 1)
+ * sizeof (mp_limb_t));
+ if (pow5_ptr == NULL)
+ {
+ free (memory);
+ return NULL;
+ }
+ /* Initialize with 1. */
+ pow5_ptr[0] = 1;
+ pow5_len = 1;
+ /* Multiply with 5^|n|. */
+ if (abs_n > 0)
+ {
+ static mp_limb_t const small_pow5[13 + 1] =
+ {
+ 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+ 48828125, 244140625, 1220703125
+ };
+ unsigned int n13;
+ for (n13 = 0; n13 <= abs_n; n13 += 13)
+ {
+ mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+ size_t j;
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < pow5_len; j++)
+ {
+ mp_limb_t digit2 = pow5_ptr[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ pow5_ptr[j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ if (carry > 0)
+ pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+ }
+ }
+ s_limbs = abs_s / GMP_LIMB_BITS;
+ s_bits = abs_s % GMP_LIMB_BITS;
+ if (n >= 0 ? s >= 0 : s <= 0)
+ {
+ /* Multiply with 2^|s|. */
+ if (s_bits > 0)
+ {
+ mp_limb_t *ptr = pow5_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = pow5_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *ptr << s_bits;
+ *ptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ {
+ *ptr = (mp_limb_t) accu;
+ pow5_len++;
+ }
+ }
+ if (s_limbs > 0)
+ {
+ size_t count;
+ for (count = pow5_len; count > 0;)
+ {
+ count--;
+ pow5_ptr[s_limbs + count] = pow5_ptr[count];
+ }
+ for (count = s_limbs; count > 0;)
+ {
+ count--;
+ pow5_ptr[count] = 0;
+ }
+ pow5_len += s_limbs;
+ }
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* Multiply m with pow5. No division needed. */
+ z_memory = multiply (m, pow5, &z);
+ }
+ else
+ {
+ /* Divide m by pow5 and round. */
+ z_memory = divide (m, pow5, &z);
+ }
+ }
+ else
+ {
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* n >= 0, s < 0.
+ Multiply m with pow5, then divide by 2^|s|. */
+ mpn_t numerator;
+ mpn_t denominator;
+ void *tmp_memory;
+ tmp_memory = multiply (m, pow5, &numerator);
+ if (tmp_memory == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ /* Construct 2^|s|. */
+ {
+ mp_limb_t *ptr = pow5_ptr + pow5_len;
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ ptr[i] = 0;
+ ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+ denominator.limbs = ptr;
+ denominator.nlimbs = s_limbs + 1;
+ }
+ z_memory = divide (numerator, denominator, &z);
+ free (tmp_memory);
+ }
+ else
+ {
+ /* n < 0, s > 0.
+ Multiply m with 2^s, then divide by pow5. */
+ mpn_t numerator;
+ mp_limb_t *num_ptr;
+ num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+ * sizeof (mp_limb_t));
+ if (num_ptr == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ {
+ mp_limb_t *destptr = num_ptr;
+ {
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ *destptr++ = 0;
+ }
+ if (s_bits > 0)
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ *destptr++ = (mp_limb_t) accu;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ *destptr++ = *sourceptr++;
+ }
+ numerator.limbs = num_ptr;
+ numerator.nlimbs = destptr - num_ptr;
+ }
+ z_memory = divide (numerator, pow5, &z);
+ free (num_ptr);
+ }
+ }
+ free (pow5_ptr);
+ free (memory);
+
+ /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
+
+ if (z_memory == NULL)
+ return NULL;
+ digits = convert_to_decimal (z, extra_zeroes);
+ free (z_memory);
+ return digits;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_long_double (long double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_long_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_double (double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10l (long double x)
+{
+ int exp;
+ long double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ if (y == 0.0L)
+ return INT_MIN;
+ if (y < 0.5L)
+ {
+ while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0L / (1 << 16)))
+ {
+ y *= 1.0L * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0L / (1 << 8)))
+ {
+ y *= 1.0L * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0L / (1 << 4)))
+ {
+ y *= 1.0L * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0L / (1 << 2)))
+ {
+ y *= 1.0L * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0L / (1 << 1)))
+ {
+ y *= 1.0L * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5L && y < 1.0L))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10 (double x)
+{
+ int exp;
+ double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ if (y == 0.0)
+ return INT_MIN;
+ if (y < 0.5)
+ {
+ while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0 / (1 << 16)))
+ {
+ y *= 1.0 * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0 / (1 << 8)))
+ {
+ y *= 1.0 * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0 / (1 << 4)))
+ {
+ y *= 1.0 * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0 / (1 << 2)))
+ {
+ y *= 1.0 * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0 / (1 << 1)))
+ {
+ y *= 1.0 * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5 && y < 1.0))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+/* Tests whether a string of digits consists of exactly PRECISION zeroes and
+ a single '1' digit. */
+static int
+is_borderline (const char *digits, size_t precision)
+{
+ for (; precision > 0; precision--, digits++)
+ if (*digits != '0')
+ return 0;
+ if (*digits != '1')
+ return 0;
+ digits++;
+ return *digits == '\0';
+}
+
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99
+
+/* Use a different function name, to make it possible that the 'wchar_t'
+ parametrization and the 'char' parametrization get compiled in the same
+ translation unit. */
+# if WIDE_CHAR_VERSION
+# define MAX_ROOM_NEEDED wmax_room_needed
+# else
+# define MAX_ROOM_NEEDED max_room_needed
+# endif
+
+/* Returns the number of TCHAR_T units needed as temporary space for the result
+ of sprintf or SNPRINTF of a single conversion directive. */
+static inline size_t
+MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion,
+ arg_type type, int flags, size_t width, int has_precision,
+ size_t precision, int pad_ourselves)
+{
+ size_t tmp_length;
+
+ switch (conversion)
+ {
+ case 'd': case 'i': case 'u':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Multiply by 2, as an estimate for FLAG_GROUP. */
+ tmp_length = xsum (tmp_length, tmp_length);
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'o':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'x': case 'X':
+# if HAVE_LONG_LONG_INT
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+# endif
+ if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 2, to account for a leading sign or alternate form. */
+ tmp_length = xsum (tmp_length, 2);
+ break;
+
+ case 'f': case 'F':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'a': case 'A':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (DBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+ break;
+
+ case 'c':
+# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ tmp_length = MB_CUR_MAX;
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# if HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %ls in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the array, the array shall contain a null wide character."
+ So if there is a precision, we must not use wcslen. */
+ const wchar_t *arg = ap->arg[arg_index].a.a_wide_string;
+
+ if (has_precision)
+ tmp_length = local_wcsnlen (arg, precision);
+ else
+ tmp_length = local_wcslen (arg);
+# else
+ /* ISO C says about %ls in fprintf:
+ "If a precision is specified, no more than that many bytes are
+ written (including shift sequences, if any), and the array
+ shall contain a null wide character if, to equal the multibyte
+ character sequence length given by the precision, the function
+ would need to access a wide character one past the end of the
+ array."
+ So if there is a precision, we must not use wcslen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# endif
+ }
+ else
+# endif
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %s in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the converted array, the converted array shall contain a
+ null wide character."
+ So if there is a precision, we must not use strlen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# else
+ /* ISO C says about %s in fprintf:
+ "If the precision is not specified or greater than the size of
+ the array, the array shall contain a null character."
+ So if there is a precision, we must not use strlen. */
+ const char *arg = ap->arg[arg_index].a.a_string;
+
+ if (has_precision)
+ tmp_length = local_strnlen (arg, precision);
+ else
+ tmp_length = strlen (arg);
+# endif
+ }
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (!pad_ourselves)
+ {
+# if ENABLE_UNISTDIO
+ /* Padding considers the number of characters, therefore the number of
+ elements after padding may be
+ > max (tmp_length, width)
+ but is certainly
+ <= tmp_length + width. */
+ tmp_length = xsum (tmp_length, width);
+# else
+ /* Padding considers the number of elements, says POSIX. */
+ if (tmp_length < width)
+ tmp_length = width;
+# endif
+ }
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ return tmp_length;
+}
+
+#endif
+
+DCHAR_T *
+VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+ const FCHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ /* errno is already set. */
+ return NULL;
+
+#define CLEANUP() \
+ if (d.dir != d.direct_alloc_dir) \
+ free (d.dir); \
+ if (a.arg != a.direct_alloc_arg) \
+ free (a.arg);
+
+ if (PRINTF_FETCHARGS (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ size_t buf_neededlength;
+ TCHAR_T *buf;
+ TCHAR_T *buf_malloced;
+ const FCHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ DCHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength =
+ xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+ {
+ buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+ if (size_overflow_p (buf_memsize))
+ goto out_of_memory_1;
+ buf = (TCHAR_T *) malloc (buf_memsize);
+ if (buf == NULL)
+ goto out_of_memory_1;
+ buf_malloced = buf;
+ }
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ /* Ensures that allocated >= needed. Aborts through a jump to
+ out_of_memory if needed is SIZE_MAX or otherwise too big. */
+#define ENSURE_ALLOCATION(needed) \
+ if ((needed) > allocated) \
+ { \
+ size_t memory_size; \
+ DCHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
+ if (size_overflow_p (memory_size)) \
+ goto out_of_memory; \
+ if (result == resultbuf || result == NULL) \
+ memory = (DCHAR_T *) malloc (memory_size); \
+ else \
+ memory = (DCHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ goto out_of_memory; \
+ if (result == resultbuf && length > 0) \
+ DCHAR_CPY (memory, result, length); \
+ result = memory; \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+ size_t augmented_length = xsum (length, n);
+
+ ENSURE_ALLOCATION (augmented_length);
+ /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
+ need that the format string contains only ASCII characters
+ if FCHAR_T and DCHAR_T are not the same type. */
+ if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+ {
+ DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+ length = augmented_length;
+ }
+ else
+ {
+ do
+ result[length++] = (unsigned char) *cp++;
+ while (--n > 0);
+ }
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ size_t augmented_length;
+
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ augmented_length = xsum (length, 1);
+ ENSURE_ALLOCATION (augmented_length);
+ result[length] = '%';
+ length = augmented_length;
+ }
+ else
+ {
+ if (!(dp->arg_index != ARG_NONE))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+#endif
+ default:
+ abort ();
+ }
+ }
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ else if (dp->conversion == 'U')
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_U8_STRING:
+ {
+ const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+ const uint8_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u8_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT8_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-8 to locale encoding. */
+ converted =
+ u8_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-8 to UTF-16/UTF-32. */
+ converted =
+ U8_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U16_STRING:
+ {
+ const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+ const uint16_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u16_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT16_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-16 to locale encoding. */
+ converted =
+ u16_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-16 to UTF-8/UTF-32. */
+ converted =
+ U16_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U32_STRING:
+ {
+ const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+ const uint32_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u32_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT32_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-32 to locale encoding. */
+ converted =
+ u32_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-32 to UTF-8/UTF-16. */
+ converted =
+ U32_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+#endif
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && HAVE_WCHAR_T
+ else if (dp->conversion == 's'
+# if WIDE_CHAR_VERSION
+ && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
+# else
+ && a.arg[dp->arg_index].type == TYPE_WIDE_STRING
+# endif
+ )
+ {
+ /* The normal handling of the 's' directive below requires
+ allocating a temporary buffer. The determination of its
+ length (tmp_length), in the case when a precision is
+ specified, below requires a conversion between a char[]
+ string and a wchar_t[] wide string. It could be done, but
+ we have no guarantee that the implementation of sprintf will
+ use the exactly same algorithm. Without this guarantee, it
+ is possible to have buffer overrun bugs. In order to avoid
+ such bugs, we implement the entire processing of the 's'
+ directive ourselves. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+# if WIDE_CHAR_VERSION
+ /* %s in vasnwprintf. See the specification of fwprintf. */
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ const char *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only as many bytes as needed to produce PRECISION
+ wide characters, from the left. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of wide
+ characters. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (has_width && width > characters
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+ if (has_precision || has_width)
+ {
+ /* We know the number of wide characters in advance. */
+ size_t remaining;
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; remaining--)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ result[length++] = wc;
+ arg += count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length++] = wc;
+ arg += count;
+ }
+ }
+
+ if (has_width && width > characters
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# else
+ /* %ls in vasnprintf. See the specification of fprintf. */
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ const wchar_t *arg_end;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ verify (sizeof (TCHAR_T) == 1);
+ TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+ if (has_precision)
+ {
+ /* Use only as many wide characters as needed to produce
+ at most PRECISION bytes, from the left. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ while (precision > 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg_end, &state);
+# else
+ count = wctomb (cbuf, *arg_end);
+# endif
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (precision < count)
+ break;
+ arg_end++;
+ characters += count;
+ precision -= count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else if (has_width)
+# else
+ else
+# endif
+ {
+ /* Use the entire string, and count the number of
+ bytes. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg_end, &state);
+# else
+ count = wctomb (cbuf, *arg_end);
+# endif
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end++;
+ characters += count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + local_wcslen (arg);
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T));
+ if (tmpsrc == NULL)
+ goto out_of_memory;
+ {
+ TCHAR_T *tmpptr = tmpsrc;
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpptr, cbuf, count);
+ tmpptr += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ free (tmpsrc);
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ free (tmpsrc);
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferrable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (has_width && width > w
+ && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_precision || has_width)
+ {
+ /* We know the number of bytes in advance. */
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ count = wcrtomb (cbuf, *arg, &state);
+# else
+ count = wctomb (cbuf, *arg);
+# endif
+ if (count <= 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ }
+ }
+# else
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (has_width && width > w
+ && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# endif
+ }
+#endif
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'a' || dp->conversion == 'A')
+# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# endif
+ )
+# endif
+ )
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* Allocate a temporary buffer of sufficient size. */
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) ((LDBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) ((DBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+ if (type == TYPE_LONGDOUBLE)
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ long double mantissa;
+
+ if (arg > 0.0L)
+ mantissa = printf_frexpl (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0L;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ long double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0L;
+ }
+ if (tail != 0.0L)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625L;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0L || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0L)
+ {
+ mantissa *= 16.0L;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+# else
+ abort ();
+# endif
+ }
+ else
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ double mantissa;
+
+ if (arg > 0.0)
+ mantissa = printf_frexp (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0;
+ }
+ if (tail != 0.0)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0 || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0)
+ {
+ mantissa *= 16.0;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ }
+# else
+ abort ();
+# endif
+ }
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ if (has_width && p - tmp < width)
+ {
+ size_t pad = width - (p - tmp);
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ {
+ size_t count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+ }
+#endif
+#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'f' || dp->conversion == 'F'
+ || dp->conversion == 'e' || dp->conversion == 'E'
+ || dp->conversion == 'g' || dp->conversion == 'G'
+ || dp->conversion == 'a' || dp->conversion == 'A')
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# elif NEED_PRINTF_INFINITE_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+ /* The systems (mingw) which produce wrong output
+ for Inf, -Inf, and NaN also do so for -0.0.
+ Therefore we treat this case here as well. */
+ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+ /* Some systems produce wrong output for Inf,
+ -Inf, and NaN. Some systems in this category
+ (IRIX 5.3) also do so for -0.0. Therefore we
+ treat this case here as well. */
+ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble))
+# endif
+ ))
+ {
+# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+ arg_type type = a.arg[dp->arg_index].type;
+# endif
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* POSIX specifies the default precision to be 6 for %f, %F,
+ %e, %E, but not for %g, %G. Implementations appear to use
+ the same default precision also for %g, %G. But for %a, %A,
+ the default precision is 0. */
+ if (!has_precision)
+ if (!(dp->conversion == 'a' || dp->conversion == 'A'))
+ precision = 6;
+
+ /* Allocate a temporary buffer of sufficient size. */
+# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+# elif NEED_PRINTF_LONG_DOUBLE
+ tmp_length = LDBL_DIG + 1;
+# elif NEED_PRINTF_DOUBLE
+ tmp_length = DBL_DIG + 1;
+# else
+ tmp_length = 0;
+# endif
+ if (tmp_length < precision)
+ tmp_length = precision;
+# if NEED_PRINTF_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ if (!(isnanl (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10l (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+# if NEED_PRINTF_DOUBLE
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+ if (type == TYPE_DOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ if (!(isnand (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10 (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_LONG_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_long_double (arg, precision);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0L)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0L)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t count = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; count > 0; count--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t count = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; count > 0; count--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0L))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'a' || dp->conversion == 'A')
+ {
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+ *p++ = '+';
+ *p++ = '0';
+ }
+ else
+ abort ();
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+ }
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ else
+# endif
+# endif
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_double (arg, precision);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t count = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; count > 0; count--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t count = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; count > 0; count--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ /* Produce the same number of exponent digits as
+ the native printf implementation. */
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ *p++ = '0';
+# endif
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else
+ abort ();
+# endif
+ }
+ }
+ }
+# endif
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ if (has_width && p - tmp < width)
+ {
+ size_t pad = width - (p - tmp);
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ {
+ size_t count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+ }
+#endif
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_width;
+ size_t width;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_precision;
+ size_t precision;
+#endif
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ int prec_ourselves;
+#else
+# define prec_ourselves 0
+#endif
+#if NEED_PRINTF_FLAG_LEFTADJUST
+# define pad_ourselves 1
+#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int pad_ourselves;
+#else
+# define pad_ourselves 0
+#endif
+ TCHAR_T *fbp;
+ unsigned int prefix_count;
+ int prefixes[2] IF_LINT (= { 0 });
+ int orig_errno;
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ TCHAR_T tmpbuf[700];
+ TCHAR_T *tmp;
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = (unsigned int) (-arg);
+ }
+ else
+ width = arg;
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+#endif
+
+ /* Decide whether to handle the precision ourselves. */
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ switch (dp->conversion)
+ {
+ case 'd': case 'i': case 'u':
+ case 'o':
+ case 'x': case 'X': case 'p':
+ prec_ourselves = has_precision && (precision > 0);
+ break;
+ default:
+ prec_ourselves = 0;
+ break;
+ }
+#endif
+
+ /* Decide whether to perform the padding ourselves. */
+#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION)
+ switch (dp->conversion)
+ {
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+ to perform the padding after this conversion. Functions
+ with unistdio extensions perform the padding based on
+ character count rather than element count. */
+ case 'c': case 's':
+# endif
+# if NEED_PRINTF_FLAG_ZERO
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+# endif
+ pad_ourselves = 1;
+ break;
+ default:
+ pad_ourselves = prec_ourselves;
+ break;
+ }
+#endif
+
+#if !USE_SNPRINTF
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type,
+ flags, width, has_precision, precision,
+ pad_ourselves);
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (TCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ fbp = buf;
+ *fbp++ = '%';
+#if NEED_PRINTF_FLAG_GROUPING
+ /* The underlying implementation doesn't support the ' flag.
+ Produce no grouping characters in this case; this is
+ acceptable because the grouping is locale dependent. */
+#else
+ if (flags & FLAG_GROUP)
+ *fbp++ = '\'';
+#endif
+ if (flags & FLAG_LEFT)
+ *fbp++ = '-';
+ if (flags & FLAG_SHOWSIGN)
+ *fbp++ = '+';
+ if (flags & FLAG_SPACE)
+ *fbp++ = ' ';
+ if (flags & FLAG_ALT)
+ *fbp++ = '#';
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ if (flags & FLAG_LOCALIZED)
+ *fbp++ = 'I';
+#endif
+ if (!pad_ourselves)
+ {
+ if (flags & FLAG_ZERO)
+ *fbp++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ /* The width specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->width_start;
+ do
+ *fbp++ = (unsigned char) *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+ if (!prec_ourselves)
+ {
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ /* The precision specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->precision_start;
+ do
+ *fbp++ = (unsigned char) *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+
+ switch (type)
+ {
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+ *fbp++ = 'I';
+ *fbp++ = '6';
+ *fbp++ = '4';
+ break;
+# else
+ *fbp++ = 'l';
+ /*FALLTHROUGH*/
+# endif
+#endif
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *fbp++ = 'l';
+ break;
+ case TYPE_LONGDOUBLE:
+ *fbp++ = 'L';
+ break;
+ default:
+ break;
+ }
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ *fbp = 'f';
+ else
+#endif
+ *fbp = dp->conversion;
+#if USE_SNPRINTF
+# if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+ fbp[1] = '%';
+ fbp[2] = 'n';
+ fbp[3] = '\0';
+# else
+ /* On glibc2 systems from glibc >= 2.3 - probably also older
+ ones - we know that snprintf's return value conforms to
+ ISO C 99: the tests gl_SNPRINTF_RETVAL_C99 and
+ gl_SNPRINTF_TRUNCATION_C99 pass.
+ Therefore we can avoid using %n in this situation.
+ On glibc2 systems from 2004-10-18 or newer, the use of %n
+ in format strings in writable memory may crash the program
+ (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
+ in this situation. */
+ /* On native Win32 systems (such as mingw), we can avoid using
+ %n because:
+ - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
+ snprintf does not write more than the specified number
+ of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes
+ '4', '5', '6' into buf, not '4', '5', '\0'.)
+ - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf
+ allows us to recognize the case of an insufficient
+ buffer size: it returns -1 in this case.
+ On native Win32 systems (such as mingw) where the OS is
+ Windows Vista, the use of %n in format strings by default
+ crashes the program. See
+ <http://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and
+ <http://msdn2.microsoft.com/en-us/library/ms175782(VS.80).aspx>
+ So we should avoid %n in this situation. */
+ fbp[1] = '\0';
+# endif
+#else
+ fbp[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* The SNPRINTF result is appended after result[0..length].
+ The latter is an array of DCHAR_T; SNPRINTF appends an
+ array of TCHAR_T to it. This is possible because
+ sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T). */
+# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+ /* Ensure that maxlen below will be >= 2. Needed on BeOS,
+ where an snprintf() with maxlen==1 acts like sprintf(). */
+ ENSURE_ALLOCATION (xsum (length,
+ (2 + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR));
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ *(TCHAR_T *) (result + length) = '\0';
+#endif
+
+ orig_errno = errno;
+
+ for (;;)
+ {
+ int count = -1;
+
+#if USE_SNPRINTF
+ int retcount = 0;
+ size_t maxlen = allocated - length;
+ /* SNPRINTF can fail if its second argument is
+ > INT_MAX. */
+ if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+ maxlen = INT_MAX / TCHARS_PER_DCHAR;
+ maxlen = maxlen * TCHARS_PER_DCHAR;
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ errno = 0;
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_LONG_LONG_INT
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if (count < maxlen
+ && ((TCHAR_T *) (result + length)) [count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (fbp[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ fbp[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+# if !HAVE_SNPRINTF_RETVAL_C99
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small.
+ But a failure at this point can also come
+ from other reasons than a too small buffer,
+ such as an invalid wide string argument to
+ the %ls directive, or possibly an invalid
+ floating-point argument. */
+ size_t tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index,
+ dp->conversion, type, flags,
+ width, has_precision,
+ precision, pad_ourselves);
+
+ if (maxlen < tmp_length)
+ {
+ /* Make more room. But try to do through
+ this reallocation only once. */
+ size_t bigger_need =
+ xsum (length,
+ xsum (tmp_length,
+ TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ /* And always grow proportionally.
+ (There may be several arguments, each
+ needing a little more room than the
+ previous one.) */
+ size_t bigger_need2 =
+ xsum (xtimes (allocated, 2), 12);
+ if (bigger_need < bigger_need2)
+ bigger_need = bigger_need2;
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+# endif
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ /* SNPRINTF or sprintf failed. Save and use the errno
+ that it has set, if any. */
+ int saved_errno = errno;
+
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno =
+ (saved_errno != 0
+ ? saved_errno
+ : (dp->conversion == 'c' || dp->conversion == 's'
+ ? EILSEQ
+ : EINVAL));
+ return NULL;
+ }
+
+#if USE_SNPRINTF
+ /* Handle overflow of the allocated buffer.
+ If such an overflow occurs, a C99 compliant snprintf()
+ returns a count >= maxlen. However, a non-compliant
+ snprintf() function returns only count = maxlen - 1. To
+ cover both cases, test whether count >= maxlen - 1. */
+ if ((unsigned int) count + 1 >= maxlen)
+ {
+ /* If maxlen already has attained its allowed maximum,
+ allocating more memory will not increase maxlen.
+ Instead of looping, bail out. */
+ if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+ goto overflow;
+ else
+ {
+ /* Need at least (count + 1) * sizeof (TCHAR_T)
+ bytes. (The +1 is for the trailing NUL.)
+ But ask for (count + 2) * sizeof (TCHAR_T)
+ bytes, so that in the next round, we likely get
+ maxlen > (unsigned int) count + 1
+ and so we don't get here again.
+ And allocate proportionally, to avoid looping
+ eternally if snprintf() reports a too small
+ count. */
+ size_t n =
+ xmax (xsum (length,
+ ((unsigned int) count + 2
+ + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR),
+ xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ continue;
+ }
+ }
+#endif
+
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ if (prec_ourselves)
+ {
+ /* Handle the precision. */
+ TCHAR_T *prec_ptr =
+# if USE_SNPRINTF
+ (TCHAR_T *) (result + length);
+# else
+ tmp;
+# endif
+ size_t prefix_count;
+ size_t move;
+
+ prefix_count = 0;
+ /* Put the additional zeroes after the sign. */
+ if (count >= 1
+ && (*prec_ptr == '-' || *prec_ptr == '+'
+ || *prec_ptr == ' '))
+ prefix_count = 1;
+ /* Put the additional zeroes after the 0x prefix if
+ (flags & FLAG_ALT) || (dp->conversion == 'p'). */
+ else if (count >= 2
+ && prec_ptr[0] == '0'
+ && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+ prefix_count = 2;
+
+ move = count - prefix_count;
+ if (precision > move)
+ {
+ /* Insert zeroes. */
+ size_t insert = precision - move;
+ TCHAR_T *prec_end;
+
+# if USE_SNPRINTF
+ size_t n =
+ xsum (length,
+ (count + insert + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ ENSURE_ALLOCATION (n);
+ length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ prec_ptr = (TCHAR_T *) (result + length);
+# endif
+
+ prec_end = prec_ptr + count;
+ prec_ptr += prefix_count;
+
+ while (prec_end > prec_ptr)
+ {
+ prec_end--;
+ prec_end[insert] = prec_end[0];
+ }
+
+ prec_end += insert;
+ do
+ *--prec_end = '0';
+ while (prec_end > prec_ptr);
+
+ count += insert;
+ }
+ }
+#endif
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+#if !DCHAR_IS_TCHAR
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ {
+ /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+ TYPE_WIDE_STRING.
+ The result string is not certainly ASCII. */
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+ /* This code assumes that TCHAR_T is 'char'. */
+ verify (sizeof (TCHAR_T) == 1);
+# if USE_SNPRINTF
+ tmpsrc = (TCHAR_T *) (result + length);
+# else
+ tmpsrc = tmp;
+# endif
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, count,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ count = tmpdst_len;
+ }
+ else
+ {
+ /* The result string is ASCII.
+ Simple 1:1 conversion. */
+# if USE_SNPRINTF
+ /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+ no-op conversion, in-place on the array starting
+ at (result + length). */
+ if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+# endif
+ {
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t n;
+
+# if USE_SNPRINTF
+ if (result == resultbuf)
+ {
+ tmpsrc = (TCHAR_T *) (result + length);
+ /* ENSURE_ALLOCATION will not move tmpsrc
+ (because it's part of resultbuf). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ }
+ else
+ {
+ /* ENSURE_ALLOCATION will move the array
+ (because it uses realloc(). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ tmpsrc = (TCHAR_T *) (result + length);
+ }
+# else
+ tmpsrc = tmp;
+ ENSURE_ALLOCATION (xsum (length, count));
+# endif
+ tmpdst = result + length;
+ /* Copy backwards, because of overlapping. */
+ tmpsrc += count;
+ tmpdst += count;
+ for (n = count; n > 0; n--)
+ *--tmpdst = (unsigned char) *--tmpsrc;
+ }
+ }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+ /* Make room for the result. */
+ if (count > allocated - length)
+ {
+ /* Need at least count elements. But allocate
+ proportionally. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ }
+#endif
+
+ /* Here count <= allocated - length. */
+
+ /* Perform padding. */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ if (pad_ourselves && has_width)
+ {
+ size_t w;
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferrable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, count);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = count;
+# endif
+ if (w < width)
+ {
+ size_t pad = width - w;
+
+ /* Make room for the result. */
+ if (xsum (count, pad) > allocated - length)
+ {
+ /* Need at least count + pad elements. But
+ allocate proportionally. */
+ size_t n =
+ xmax (xsum3 (length, count, pad),
+ xtimes (allocated, 2));
+
+# if USE_SNPRINTF
+ length += count;
+ ENSURE_ALLOCATION (n);
+ length -= count;
+# else
+ ENSURE_ALLOCATION (n);
+# endif
+ }
+ /* Here count + pad <= allocated - length. */
+
+ {
+# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ DCHAR_T * const rp = result + length;
+# else
+ DCHAR_T * const rp = tmp;
+# endif
+ DCHAR_T *p = rp + count;
+ DCHAR_T *end = p + pad;
+ DCHAR_T *pad_ptr;
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ if (dp->conversion == 'c'
+ || dp->conversion == 's')
+ /* No zero-padding for string directives. */
+ pad_ptr = NULL;
+ else
+# endif
+ {
+ pad_ptr = (*rp == '-' ? rp + 1 : rp);
+ /* No zero-padding of "inf" and "nan". */
+ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+ || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+ pad_ptr = NULL;
+ }
+ /* The generated string now extends from rp to p,
+ with the zero padding insertion point being at
+ pad_ptr. */
+
+ count = count + pad; /* = end - rp */
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > rp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ }
+ }
+ }
+#endif
+
+ /* Here still count <= allocated - length. */
+
+#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+#endif
+#if !USE_SNPRINTF
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ {
+ /* Convert the %f result to upper case for %F. */
+ DCHAR_T *rp = result + length;
+ size_t rc;
+ for (rc = count; rc > 0; rc--, rp++)
+ if (*rp >= 'a' && *rp <= 'z')
+ *rp = *rp - 'a' + 'A';
+ }
+#endif
+
+ length += count;
+ break;
+ }
+ errno = orig_errno;
+#undef pad_ourselves
+#undef prec_ourselves
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DCHAR_T *memory;
+
+ memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ /* Note that we can produce a big string of a length > INT_MAX. POSIX
+ says that snprintf() fails with errno = EOVERFLOW in this case, but
+ that's only because snprintf() returns an 'int'. This function does
+ not have this limitation. */
+ return result;
+
+#if USE_SNPRINTF
+ overflow:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EOVERFLOW;
+ return NULL;
+#endif
+
+ out_of_memory:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ out_of_memory_1:
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+}
+
+#undef MAX_ROOM_NEEDED
+#undef TCHARS_PER_DCHAR
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef DCHAR_SET
+#undef DCHAR_CPY
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef DCHAR_IS_TCHAR
+#undef TCHAR_T
+#undef DCHAR_T
+#undef FCHAR_T
+#undef VASNPRINTF
diff --git a/gnulib/lib/vasnprintf.h b/gnulib/lib/vasnprintf.h
new file mode 100644
index 0000000..0ab7d19
--- /dev/null
+++ b/gnulib/lib/vasnprintf.h
@@ -0,0 +1,80 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2004, 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL.
+
+ When dynamic memory allocation occurs, the preallocated buffer is left
+ alone (with possibly modified contents). This makes it possible to use
+ a statically allocated or stack-allocated buffer, like this:
+
+ char buf[100];
+ size_t len = sizeof (buf);
+ char *output = vasnprintf (buf, &len, format, args);
+ if (output == NULL)
+ ... error handling ...;
+ else
+ {
+ ... use the output string ...;
+ if (output != buf)
+ free (output);
+ }
+ */
+#if REPLACE_VASNPRINTF
+# define asnprintf rpl_asnprintf
+# define vasnprintf rpl_vasnprintf
+#endif
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/gnulib/lib/vasprintf.c b/gnulib/lib/vasprintf.c
new file mode 100644
index 0000000..c45e7c6
--- /dev/null
+++ b/gnulib/lib/vasprintf.c
@@ -0,0 +1,51 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+int
+vasprintf (char **resultp, const char *format, va_list args)
+{
+ size_t length;
+ char *result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (length > INT_MAX)
+ {
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *resultp = result;
+ /* Return the number of resulting bytes, excluding the trailing NUL. */
+ return length;
+}
diff --git a/gnulib/lib/vdprintf.c b/gnulib/lib/vdprintf.c
new file mode 100644
index 0000000..c408e9a
--- /dev/null
+++ b/gnulib/lib/vdprintf.c
@@ -0,0 +1,67 @@
+/* Formatted output to a file descriptor.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "full-write.h"
+#include "vasnprintf.h"
+
+int
+vdprintf (int fd, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (full_write (fd, output, len) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/verify.h b/gnulib/lib/verify.h
new file mode 100644
index 0000000..9a8caad
--- /dev/null
+++ b/gnulib/lib/verify.h
@@ -0,0 +1,243 @@
+/* Compile-time assert-like macros.
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef _GL_VERIFY_H
+# define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert works as per the
+ C1X draft N1548 section 6.7.10. This is supported by GCC 4.6.0 and
+ later, in C mode, and its use here generates easier-to-read diagnostics
+ when verify (R) fails.
+
+ Define _GL_HAVE_STATIC_ASSERT to 1 if static_assert works as per the
+ C++0X draft N3242 section 7.(4).
+ This will likely be supported by future GCC versions, in C++ mode.
+
+ Use this only with GCC. If we were willing to slow 'configure'
+ down we could also use it with other compilers, but since this
+ affects only the quality of diagnostics, why bother? */
+# if (4 < __GNUC__ || (__GNUC__ == 4 && 6 <= __GNUC_MINOR__)) && !defined __cplusplus
+# define _GL_HAVE__STATIC_ASSERT 1
+# endif
+/* The condition (99 < __GNUC__) is temporary, until we know about the
+ first G++ release that supports static_assert. */
+# if (99 < __GNUC__) && defined __cplusplus
+# define _GL_HAVE_STATIC_ASSERT 1
+# endif
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ If _Static_assert works, verify (R) uses it directly. Similarly,
+ _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+ that is an operand of sizeof.
+
+ The code below uses several ideas for C++ compilers, and for C
+ compilers that do not support _Static_assert:
+
+ * The first step is ((R) ? 1 : -1). Given an expression R, of
+ integral or boolean or floating-point type, this yields an
+ expression of integral type, whose value is later verified to be
+ constant and nonnegative.
+
+ * Next this expression W is wrapped in a type
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: W;
+ }.
+ If W is negative, this yields a compile-time error. No compiler can
+ deal with a bit-field of negative size.
+
+ One might think that an array size check would have the same
+ effect, that is, that the type struct { unsigned int dummy[W]; }
+ would work as well. However, inside a function, some compilers
+ (such as C++ compilers and GNU C) allow local parameters and
+ variables inside array size expressions. With these compilers,
+ an array size check would not properly diagnose this misuse of
+ the verify macro:
+
+ void function (int n) { verify (n < 0); }
+
+ * For the verify macro, the struct _gl_verify_type will need to
+ somehow be embedded into a declaration. To be portable, this
+ declaration must declare an object, a constant, a function, or a
+ typedef name. If the declared entity uses the type directly,
+ such as in
+
+ struct dummy {...};
+ typedef struct {...} dummy;
+ extern struct {...} *dummy;
+ extern void dummy (struct {...} *);
+ extern struct {...} *dummy (void);
+
+ two uses of the verify macro would yield colliding declarations
+ if the entity names are not disambiguated. A workaround is to
+ attach the current line number to the entity name:
+
+ #define _GL_CONCAT0(x, y) x##y
+ #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+ extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+ But this has the problem that two invocations of verify from
+ within the same macro would collide, since the __LINE__ value
+ would be the same for both invocations. (The GCC __COUNTER__
+ macro solves this problem, but is not portable.)
+
+ A solution is to use the sizeof operator. It yields a number,
+ getting rid of the identity of the type. Declarations like
+
+ extern int dummy [sizeof (struct {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ can be repeated.
+
+ * Should the implementation use a named struct or an unnamed struct?
+ Which of the following alternatives can be used?
+
+ extern int dummy [sizeof (struct {...})];
+ extern int dummy [sizeof (struct _gl_verify_type {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+ extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+ In the second and sixth case, the struct type is exported to the
+ outer scope; two such declarations therefore collide. GCC warns
+ about the first, third, and fourth cases. So the only remaining
+ possibility is the fifth case:
+
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ * GCC warns about duplicate declarations of the dummy function if
+ -Wredundant_decls is used. GCC 4.3 and later have a builtin
+ __COUNTER__ macro that can let us generate unique identifiers for
+ each dummy function, to suppress this warning.
+
+ * This implementation exploits the fact that older versions of GCC,
+ which do not support _Static_assert, also do not warn about the
+ last declaration mentioned above.
+
+ * In C++, any struct definition inside sizeof is invalid.
+ Use a template type to work around the problem. */
+
+/* Concatenate two preprocessor tokens. */
+# define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+# define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+ use it. Use __COUNTER__ if it works, falling back on __LINE__
+ otherwise. __LINE__ isn't perfect, but it's better than a
+ constant. */
+# if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+# else
+# define _GL_COUNTER __LINE__
+# endif
+
+/* Generate a symbol with the given prefix, making it unique if
+ possible. */
+# define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+ that returns 1. If R is false, fail at compile-time, preferably
+ with a diagnostic that includes the string-literal DIAGNOSTIC. */
+
+# define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
+ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
+
+# ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: w;
+ };
+# define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ _gl_verify_type<(R) ? 1 : -1>
+# elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { \
+ _Static_assert (R, DIAGNOSTIC); \
+ int _gl_dummy; \
+ }
+# else
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+# endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. If R is false, fail at compile-time, preferably
+ with a diagnostic that includes the string-literal DIAGNOSTIC.
+
+ Unfortunately, unlike C1X, this implementation must appear as an
+ ordinary declaration, and cannot appear inside struct { ... }. */
+
+# ifdef _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY _Static_assert
+# else
+# define _GL_VERIFY(R, DIAGNOSTIC) \
+ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \
+ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
+# endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */
+# ifdef _GL_STATIC_ASSERT_H
+# if !defined _GL_HAVE__STATIC_ASSERT && !defined _Static_assert
+# define _Static_assert(R, DIAGNOSTIC) _GL_VERIFY (R, DIAGNOSTIC)
+# endif
+# if !defined _GL_HAVE_STATIC_ASSERT && !defined static_assert
+# define static_assert _Static_assert /* Draft C1X requires this #define. */
+# endif
+# endif
+
+/* @assert.h omit start@ */
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ There are two macros, since no single macro can be used in all
+ contexts in C. verify_true (R) is for scalar contexts, including
+ integer constant expression contexts. verify (R) is for declaration
+ contexts, e.g., the top level. */
+
+/* Verify requirement R at compile-time, as an integer constant expression.
+ Return 1. This is equivalent to verify_expr (R, 1).
+
+ verify_true is obsolescent; please use verify_expr instead. */
+
+# define verify_true(R) _GL_VERIFY_TRUE (R, "verify_true (" #R ")")
+
+/* Verify requirement R at compile-time. Return the value of the
+ expression E. */
+
+# define verify_expr(R, E) \
+ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. */
+
+# define verify(R) _GL_VERIFY (R, "verify (" #R ")")
+
+/* @assert.h omit end@ */
+
+#endif
diff --git a/gnulib/lib/verror.c b/gnulib/lib/verror.c
new file mode 100644
index 0000000..bc90ef3
--- /dev/null
+++ b/gnulib/lib/verror.c
@@ -0,0 +1,77 @@
+/* va_list error handler for noninteractive utilities
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+#include "verror.h"
+#include "xvasprintf.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#if ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ Use the globals error_print_progname and error_message_count similarly
+ to error(). */
+void
+verror (int status, int errnum, const char *format, va_list args)
+{
+ verror_at_line (status, errnum, NULL, 0, format, args);
+}
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ If FNAME is not NULL, prepend the message with `FNAME:LINENO:'.
+ Use the globals error_print_progname, error_message_count, and
+ error_one_per_line similarly to error_at_line(). */
+void
+verror_at_line (int status, int errnum, const char *file,
+ unsigned int line_number, const char *format, va_list args)
+{
+ char *message = xvasprintf (format, args);
+ if (message)
+ {
+ /* Until http://sourceware.org/bugzilla/show_bug.cgi?id=2997 is fixed,
+ glibc violates GNU Coding Standards when the file argument to
+ error_at_line is NULL. */
+ if (file)
+ error_at_line (status, errnum, file, line_number, "%s", message);
+ else
+ error (status, errnum, "%s", message);
+ }
+ else
+ {
+ /* EOVERFLOW, EINVAL, and EILSEQ from xvasprintf are signs of
+ serious programmer errors. */
+ error (0, errno, _("unable to display error message"));
+ abort ();
+ }
+ free (message);
+}
diff --git a/gnulib/lib/verror.h b/gnulib/lib/verror.h
new file mode 100644
index 0000000..ec4ff1d
--- /dev/null
+++ b/gnulib/lib/verror.h
@@ -0,0 +1,54 @@
+/* Declaration for va_list error-reporting function
+ Copyright (C) 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _VERROR_H
+#define _VERROR_H 1
+
+#include <stdarg.h>
+
+#include "error.h" /* for _GL_ATTRIBUTE_FORMAT */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ Use the globals error_print_progname and error_message_count similarly
+ to error(). */
+
+extern void verror (int __status, int __errnum, const char *__format,
+ va_list __args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
+
+/* Print a message with `vfprintf (stderr, FORMAT, ARGS)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with `exit (STATUS)'.
+ If FNAME is not NULL, prepend the message with `FNAME:LINENO:'.
+ Use the globals error_print_progname, error_message_count, and
+ error_one_per_line similarly to error_at_line(). */
+
+extern void verror_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format,
+ va_list __args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 5, 0));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* verror.h */
diff --git a/gnulib/lib/version-etc-fsf.c b/gnulib/lib/version-etc-fsf.c
new file mode 100644
index 0000000..c821583
--- /dev/null
+++ b/gnulib/lib/version-etc-fsf.c
@@ -0,0 +1,30 @@
+/* Variable with FSF copyright information, for version-etc.
+ Copyright (C) 1999-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+/* Default copyright goes to the FSF. */
+
+const char version_etc_copyright[] =
+ /* Do *not* mark this string for translation. %s is a copyright
+ symbol suitable for this locale, and %d is the copyright
+ year. */
+ "Copyright %s %d Free Software Foundation, Inc.";
diff --git a/gnulib/lib/version-etc.c b/gnulib/lib/version-etc.c
new file mode 100644
index 0000000..b8d4724
--- /dev/null
+++ b/gnulib/lib/version-etc.c
@@ -0,0 +1,258 @@
+/* Print --version and bug-reporting information in a consistent format.
+ Copyright (C) 1999-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "version-etc.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+/* If you use AM_INIT_AUTOMAKE's no-define option,
+ PACKAGE is not defined. Use PACKAGE_TARNAME instead. */
+#if ! defined PACKAGE && defined PACKAGE_TARNAME
+# define PACKAGE PACKAGE_TARNAME
+#endif
+
+enum { COPYRIGHT_YEAR = 2011 };
+
+/* The three functions below display the --version information the
+ standard way.
+
+ If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The functions differ in the way they are passed author names. */
+
+/* Display the --version information the standard way.
+
+ Author names are given in the array AUTHORS. N_AUTHORS is the
+ number of elements in the array. */
+void
+version_etc_arn (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ const char * const * authors, size_t n_authors)
+{
+ if (command_name)
+ fprintf (stream, "%s (%s) %s\n", command_name, package, version);
+ else
+ fprintf (stream, "%s %s\n", package, version);
+
+#ifdef PACKAGE_PACKAGER
+# ifdef PACKAGE_PACKAGER_VERSION
+ fprintf (stream, _("Packaged by %s (%s)\n"), PACKAGE_PACKAGER,
+ PACKAGE_PACKAGER_VERSION);
+# else
+ fprintf (stream, _("Packaged by %s\n"), PACKAGE_PACKAGER);
+# endif
+#endif
+
+ /* TRANSLATORS: Translate "(C)" to the copyright symbol
+ (C-in-a-circle), if this symbol is available in the user's
+ locale. Otherwise, do not translate "(C)"; leave it as-is. */
+ fprintf (stream, version_etc_copyright, _("(C)"), COPYRIGHT_YEAR);
+
+ fputs (_("\
+\n\
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n\
+\n\
+"),
+ stream);
+
+ switch (n_authors)
+ {
+ case 0:
+ /* The caller must provide at least one author name. */
+ abort ();
+ case 1:
+ /* TRANSLATORS: %s denotes an author name. */
+ fprintf (stream, _("Written by %s.\n"), authors[0]);
+ break;
+ case 2:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ fprintf (stream, _("Written by %s and %s.\n"), authors[0], authors[1]);
+ break;
+ case 3:
+ /* TRANSLATORS: Each %s denotes an author name. */
+ fprintf (stream, _("Written by %s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2]);
+ break;
+ case 4:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"),
+ authors[0], authors[1], authors[2], authors[3]);
+ break;
+ case 5:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4]);
+ break;
+ case 6:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5]);
+ break;
+ case 7:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6]);
+ break;
+ case 8:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7]);
+ break;
+ case 9:
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7], authors[8]);
+ break;
+ default:
+ /* 10 or more authors. Use an abbreviation, since the human reader
+ will probably not want to read the entire list anyway. */
+ /* TRANSLATORS: Each %s denotes an author name.
+ You can use line breaks, estimating that each author name occupies
+ ca. 16 screen columns and that a screen line has ca. 80 columns. */
+ fprintf (stream, _("\
+Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"),
+ authors[0], authors[1], authors[2], authors[3], authors[4],
+ authors[5], authors[6], authors[7], authors[8]);
+ break;
+ }
+}
+
+/* Display the --version information the standard way. See the initial
+ comment to this module, for more information.
+
+ Author names are given in the NULL-terminated array AUTHORS. */
+void
+version_etc_ar (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, const char * const * authors)
+{
+ size_t n_authors;
+
+ for (n_authors = 0; authors[n_authors]; n_authors++)
+ ;
+ version_etc_arn (stream, command_name, package, version, authors, n_authors);
+}
+
+/* Display the --version information the standard way. See the initial
+ comment to this module, for more information.
+
+ Author names are given in the NULL-terminated va_list AUTHORS. */
+void
+version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors)
+{
+ size_t n_authors;
+ const char *authtab[10];
+
+ for (n_authors = 0;
+ n_authors < 10
+ && (authtab[n_authors] = va_arg (authors, const char *)) != NULL;
+ n_authors++)
+ ;
+ version_etc_arn (stream, command_name, package, version,
+ authtab, n_authors);
+}
+
+
+/* Display the --version information the standard way.
+
+ If COMMAND_NAME is NULL, the PACKAGE is assumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The authors names are passed as separate arguments, with an additional
+ NULL argument at the end. */
+void
+version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, /* const char *author1, ...*/ ...)
+{
+ va_list authors;
+
+ va_start (authors, version);
+ version_etc_va (stream, command_name, package, version, authors);
+ va_end (authors);
+}
+
+void
+emit_bug_reporting_address (void)
+{
+ /* TRANSLATORS: The placeholder indicates the bug-reporting address
+ for this package. Please add _another line_ saying
+ "Report translation bugs to <...>\n" with the address for translation
+ bugs (typically your translation team's web or email address). */
+ printf (_("\nReport bugs to: %s\n"), PACKAGE_BUGREPORT);
+#ifdef PACKAGE_PACKAGER_BUG_REPORTS
+ printf (_("Report %s bugs to: %s\n"), PACKAGE_PACKAGER,
+ PACKAGE_PACKAGER_BUG_REPORTS);
+#endif
+#ifdef PACKAGE_URL
+ printf (_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+#else
+ printf (_("%s home page: <http://www.gnu.org/software/%s/>\n"),
+ PACKAGE_NAME, PACKAGE);
+#endif
+ fputs (_("General help using GNU software: <http://www.gnu.org/gethelp/>\n"),
+ stdout);
+}
diff --git a/gnulib/lib/version-etc.h b/gnulib/lib/version-etc.h
new file mode 100644
index 0000000..a9b313d
--- /dev/null
+++ b/gnulib/lib/version-etc.h
@@ -0,0 +1,78 @@
+/* Print --version and bug-reporting information in a consistent format.
+ Copyright (C) 1999, 2003, 2005, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef VERSION_ETC_H
+# define VERSION_ETC_H 1
+
+# include <stdarg.h>
+# include <stdio.h>
+
+/* The `sentinel' attribute was added in gcc 4.0. */
+#ifndef _GL_ATTRIBUTE_SENTINEL
+# if 4 <= __GNUC__
+# define _GL_ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__))
+# else
+# define _GL_ATTRIBUTE_SENTINEL /* empty */
+# endif
+#endif
+
+extern const char version_etc_copyright[];
+
+/* The three functions below display the --version information in the
+ standard way: command and package names, package version, followed
+ by a short GPLv3+ notice and a list of up to 10 author names.
+
+ If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of
+ the program. The formats are therefore:
+
+ PACKAGE VERSION
+
+ or
+
+ COMMAND_NAME (PACKAGE) VERSION.
+
+ The functions differ in the way they are passed author names: */
+
+/* N_AUTHORS names are supplied in array AUTHORS. */
+extern void version_etc_arn (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ const char * const * authors, size_t n_authors);
+
+/* Names are passed in the NULL-terminated array AUTHORS. */
+extern void version_etc_ar (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, const char * const * authors);
+
+/* Names are passed in the NULL-terminated va_list. */
+extern void version_etc_va (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version, va_list authors);
+
+/* Names are passed as separate arguments, with an additional
+ NULL argument at the end. */
+extern void version_etc (FILE *stream,
+ const char *command_name, const char *package,
+ const char *version,
+ /* const char *author1, ..., NULL */ ...)
+ _GL_ATTRIBUTE_SENTINEL;
+
+/* Display the usual `Report bugs to' stanza */
+extern void emit_bug_reporting_address (void);
+
+#endif /* VERSION_ETC_H */
diff --git a/gnulib/lib/vfprintf.c b/gnulib/lib/vfprintf.c
new file mode 100644
index 0000000..55486d6
--- /dev/null
+++ b/gnulib/lib/vfprintf.c
@@ -0,0 +1,74 @@
+/* Formatted output to a stream.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "fseterr.h"
+#include "vasnprintf.h"
+
+/* Print formatted output to the stream FP.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vfprintf (FILE *fp, const char *format, va_list args)
+{
+ char buf[2000];
+ char *output;
+ size_t len;
+ size_t lenbuf = sizeof (buf);
+
+ output = vasnprintf (buf, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ {
+ fseterr (fp);
+ return -1;
+ }
+
+ if (fwrite (output, 1, len, fp) < len)
+ {
+ if (output != buf)
+ {
+ int saved_errno = errno;
+ free (output);
+ errno = saved_errno;
+ }
+ return -1;
+ }
+
+ if (output != buf)
+ free (output);
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ fseterr (fp);
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/vma-iter.c b/gnulib/lib/vma-iter.c
new file mode 100644
index 0000000..1de69d8
--- /dev/null
+++ b/gnulib/lib/vma-iter.c
@@ -0,0 +1,625 @@
+/* Iteration over virtual memory areas.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "vma-iter.h"
+
+#include <errno.h> /* errno */
+#include <stdlib.h> /* size_t */
+#include <fcntl.h> /* open, O_RDONLY */
+#include <unistd.h> /* getpagesize, read, close */
+
+#if defined __sgi || defined __osf__ /* IRIX, OSF/1 */
+# include <string.h> /* memcpy */
+# include <sys/types.h>
+# include <sys/mman.h> /* mmap, munmap */
+# include <sys/procfs.h> /* PIOC*, prmap_t */
+#endif
+
+#if defined __APPLE__ && defined __MACH__ /* MacOS X */
+# include <mach/mach.h>
+#endif
+
+#if (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ /* Windows */
+# include <windows.h>
+#endif
+
+#if defined __BEOS__ || defined __HAIKU__ /* BeOS, Haiku */
+# include <OS.h>
+#endif
+
+#if HAVE_MQUERY /* OpenBSD */
+# include <sys/types.h>
+# include <sys/mman.h> /* mquery */
+#endif
+
+
+/* Support for reading text files in the /proc file system. */
+
+#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ /* || defined __CYGWIN__ */
+
+/* Buffered read-only streams.
+ We cannot use <stdio.h> here, because fopen() calls malloc(), and a malloc()
+ call may call mmap() and thus pre-allocate available memory. */
+
+struct rofile
+ {
+ int fd;
+ size_t position;
+ size_t filled;
+ int eof_seen;
+ char buffer[1024];
+ };
+
+/* Open a read-only file stream. */
+static int
+rof_open (struct rofile *rof, const char *filename)
+{
+ int fd = open (filename, O_RDONLY);
+ if (fd < 0)
+ return -1;
+ rof->fd = fd;
+ rof->position = 0;
+ rof->filled = 0;
+ rof->eof_seen = 0;
+ return 0;
+}
+
+/* Return the next byte from a read-only file stream without consuming it,
+ or -1 at EOF. */
+static int
+rof_peekchar (struct rofile *rof)
+{
+ if (rof->position == rof->filled)
+ {
+ if (rof->eof_seen)
+ return -1;
+ else
+ for (;;)
+ {
+ int n = read (rof->fd, rof->buffer, sizeof (rof->buffer));
+# ifdef EINTR
+ if (n < 0 && errno == EINTR)
+ continue;
+# endif
+ if (n <= 0)
+ {
+ rof->eof_seen = 1;
+ return -1;
+ }
+ rof->filled = n;
+ rof->position = 0;
+ break;
+ }
+ }
+ return (unsigned char) rof->buffer[rof->position];
+}
+
+/* Return the next byte from a read-only file stream, or -1 at EOF. */
+static int
+rof_getchar (struct rofile *rof)
+{
+ int c = rof_peekchar (rof);
+ if (c >= 0)
+ rof->position++;
+ return c;
+}
+
+/* Parse an unsigned hexadecimal number from a read-only file stream. */
+static int
+rof_scanf_lx (struct rofile *rof, unsigned long *valuep)
+{
+ unsigned long value = 0;
+ unsigned int numdigits = 0;
+ for (;;)
+ {
+ int c = rof_peekchar (rof);
+ if (c >= '0' && c <= '9')
+ value = (value << 4) + (c - '0');
+ else if (c >= 'A' && c <= 'F')
+ value = (value << 4) + (c - 'A' + 10);
+ else if (c >= 'a' && c <= 'f')
+ value = (value << 4) + (c - 'a' + 10);
+ else
+ break;
+ rof_getchar (rof);
+ numdigits++;
+ }
+ if (numdigits == 0)
+ return -1;
+ *valuep = value;
+ return 0;
+}
+
+/* Close a read-only file stream. */
+static void
+rof_close (struct rofile *rof)
+{
+ close (rof->fd);
+}
+
+#endif
+
+
+void
+vma_iterate (vma_iterate_callback_fn callback, void *data)
+{
+#if defined __linux__ /* || defined __CYGWIN__ */
+
+ struct rofile rof;
+ int c;
+
+ /* Open the current process' maps file. It describes one VMA per line. */
+ if (rof_open (&rof, "/proc/self/maps") < 0)
+ return;
+
+ for (;;)
+ {
+ unsigned long start, end;
+ unsigned int flags;
+
+ /* Parse one line. First start and end. */
+ if (!(rof_scanf_lx (&rof, &start) >= 0
+ && rof_getchar (&rof) == '-'
+ && rof_scanf_lx (&rof, &end) >= 0))
+ break;
+ /* Then the flags. */
+ do
+ c = rof_getchar (&rof);
+ while (c == ' ');
+ flags = 0;
+ if (c == 'r')
+ flags |= VMA_PROT_READ;
+ c = rof_getchar (&rof);
+ if (c == 'w')
+ flags |= VMA_PROT_WRITE;
+ c = rof_getchar (&rof);
+ if (c == 'x')
+ flags |= VMA_PROT_EXECUTE;
+ while (c = rof_getchar (&rof), c != -1 && c != '\n')
+ ;
+
+ if (callback (data, start, end, flags))
+ break;
+ }
+ rof_close (&rof);
+
+#elif defined __FreeBSD__ || defined __NetBSD__
+
+ struct rofile rof;
+ int c;
+
+ /* Open the current process' maps file. It describes one VMA per line. */
+ if (rof_open (&rof, "/proc/curproc/map") < 0)
+ return;
+
+ for (;;)
+ {
+ unsigned long start, end;
+ unsigned int flags;
+
+ /* Parse one line. First start. */
+ if (!(rof_getchar (&rof) == '0'
+ && rof_getchar (&rof) == 'x'
+ && rof_scanf_lx (&rof, &start) >= 0))
+ break;
+ while (c = rof_peekchar (&rof), c == ' ' || c == '\t')
+ rof_getchar (&rof);
+ /* Then end. */
+ if (!(rof_getchar (&rof) == '0'
+ && rof_getchar (&rof) == 'x'
+ && rof_scanf_lx (&rof, &end) >= 0))
+ break;
+ /* Then the flags. */
+ do
+ c = rof_getchar (&rof);
+ while (c == ' ');
+ flags = 0;
+ if (c == 'r')
+ flags |= VMA_PROT_READ;
+ c = rof_getchar (&rof);
+ if (c == 'w')
+ flags |= VMA_PROT_WRITE;
+ c = rof_getchar (&rof);
+ if (c == 'x')
+ flags |= VMA_PROT_EXECUTE;
+ while (c = rof_getchar (&rof), c != -1 && c != '\n')
+ ;
+
+ if (callback (data, start, end, flags))
+ break;
+ }
+ rof_close (&rof);
+
+#elif defined __sgi || defined __osf__ /* IRIX, OSF/1 */
+
+ size_t pagesize;
+ char fnamebuf[6+10+1];
+ char *fname;
+ int fd;
+ int nmaps;
+ size_t memneed;
+# if HAVE_MAP_ANONYMOUS
+# define zero_fd -1
+# define map_flags MAP_ANONYMOUS
+# else
+ int zero_fd;
+# define map_flags 0
+# endif
+ void *auxmap;
+ unsigned long auxmap_start;
+ unsigned long auxmap_end;
+ prmap_t* maps;
+ prmap_t* mp;
+
+ pagesize = getpagesize ();
+
+ /* Construct fname = sprintf (fnamebuf+i, "/proc/%u", getpid ()). */
+ fname = fnamebuf + sizeof (fnamebuf) - 1;
+ *fname = '\0';
+ {
+ unsigned int value = getpid ();
+ do
+ *--fname = (value % 10) + '0';
+ while ((value = value / 10) > 0);
+ }
+ fname -= 6;
+ memcpy (fname, "/proc/", 6);
+
+ fd = open (fname, O_RDONLY);
+ if (fd < 0)
+ return;
+
+ if (ioctl (fd, PIOCNMAP, &nmaps) < 0)
+ goto fail2;
+
+ memneed = (nmaps + 10) * sizeof (prmap_t);
+ /* Allocate memneed bytes of memory.
+ We cannot use alloca here, because not much stack space is guaranteed.
+ We also cannot use malloc here, because a malloc() call may call mmap()
+ and thus pre-allocate available memory.
+ So use mmap(), and ignore the resulting VMA. */
+ memneed = ((memneed - 1) / pagesize + 1) * pagesize;
+# if !HAVE_MAP_ANONYMOUS
+ zero_fd = open ("/dev/zero", O_RDONLY, 0644);
+ if (zero_fd < 0)
+ goto fail2;
+# endif
+ auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE,
+ map_flags | MAP_PRIVATE, zero_fd, 0);
+# if !HAVE_MAP_ANONYMOUS
+ close (zero_fd);
+# endif
+ if (auxmap == (void *) -1)
+ goto fail2;
+ auxmap_start = (unsigned long) auxmap;
+ auxmap_end = auxmap_start + memneed;
+ maps = (prmap_t *) auxmap;
+
+ if (ioctl (fd, PIOCMAP, maps) < 0)
+ goto fail1;
+
+ for (mp = maps;;)
+ {
+ unsigned long start, end;
+ unsigned int flags;
+
+ start = (unsigned long) mp->pr_vaddr;
+ end = start + mp->pr_size;
+ if (start == 0 && end == 0)
+ break;
+ flags = 0;
+ if (mp->pr_mflags & MA_READ)
+ flags |= VMA_PROT_READ;
+ if (mp->pr_mflags & MA_WRITE)
+ flags |= VMA_PROT_WRITE;
+ if (mp->pr_mflags & MA_EXEC)
+ flags |= VMA_PROT_EXECUTE;
+ mp++;
+ if (start <= auxmap_start && auxmap_end - 1 <= end - 1)
+ {
+ /* Consider [start,end-1] \ [auxmap_start,auxmap_end-1]
+ = [start,auxmap_start-1] u [auxmap_end,end-1]. */
+ if (start < auxmap_start)
+ if (callback (data, start, auxmap_start, flags))
+ break;
+ if (auxmap_end - 1 < end - 1)
+ if (callback (data, auxmap_end, end, flags))
+ break;
+ }
+ else
+ {
+ if (callback (data, start, end, flags))
+ break;
+ }
+ }
+ munmap (auxmap, memneed);
+ close (fd);
+ return;
+
+ fail1:
+ munmap (auxmap, memneed);
+ fail2:
+ close (fd);
+ return;
+
+#elif defined __APPLE__ && defined __MACH__ /* MacOS X */
+
+ task_t task = mach_task_self ();
+ vm_address_t address;
+ vm_size_t size;
+
+ for (address = VM_MIN_ADDRESS;; address += size)
+ {
+ int more;
+ mach_port_t object_name;
+ unsigned int flags;
+ /* In MacOS X 10.5, the types vm_address_t, vm_offset_t, vm_size_t have
+ 32 bits in 32-bit processes and 64 bits in 64-bit processes. Whereas
+ mach_vm_address_t and mach_vm_size_t are always 64 bits large.
+ MacOS X 10.5 has three vm_region like methods:
+ - vm_region. It has arguments that depend on whether the current
+ process is 32-bit or 64-bit. When linking dynamically, this
+ function exists only in 32-bit processes. Therefore we use it only
+ in 32-bit processes.
+ - vm_region_64. It has arguments that depend on whether the current
+ process is 32-bit or 64-bit. It interprets a flavor
+ VM_REGION_BASIC_INFO as VM_REGION_BASIC_INFO_64, which is
+ dangerous since 'struct vm_region_basic_info_64' is larger than
+ 'struct vm_region_basic_info'; therefore let's write
+ VM_REGION_BASIC_INFO_64 explicitly.
+ - mach_vm_region. It has arguments that are 64-bit always. This
+ function is useful when you want to access the VM of a process
+ other than the current process.
+ In 64-bit processes, we could use vm_region_64 or mach_vm_region.
+ I choose vm_region_64 because it uses the same types as vm_region,
+ resulting in less conditional code. */
+# if defined __ppc64__ || defined __x86_64__
+ struct vm_region_basic_info_64 info;
+ mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT_64;
+
+ more = (vm_region_64 (task, &address, &size, VM_REGION_BASIC_INFO_64,
+ (vm_region_info_t)&info, &info_count, &object_name)
+ == KERN_SUCCESS);
+# else
+ struct vm_region_basic_info info;
+ mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT;
+
+ more = (vm_region (task, &address, &size, VM_REGION_BASIC_INFO,
+ (vm_region_info_t)&info, &info_count, &object_name)
+ == KERN_SUCCESS);
+# endif
+ if (object_name != MACH_PORT_NULL)
+ mach_port_deallocate (mach_task_self (), object_name);
+ if (!more)
+ break;
+ flags = 0;
+ if (info.protection & VM_PROT_READ)
+ flags |= VMA_PROT_READ;
+ if (info.protection & VM_PROT_WRITE)
+ flags |= VMA_PROT_WRITE;
+ if (info.protection & VM_PROT_EXECUTE)
+ flags |= VMA_PROT_EXECUTE;
+ if (callback (data, address, address + size, flags))
+ break;
+ }
+
+#elif (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__
+ /* Windows platform. Use the native Windows API. */
+
+ MEMORY_BASIC_INFORMATION info;
+ unsigned long address = 0;
+
+ while (VirtualQuery ((void*)address, &info, sizeof(info)) == sizeof(info))
+ {
+ if (info.State != MEM_FREE)
+ /* Ignore areas where info.State has the value MEM_RESERVE or,
+ equivalently, info.Protect has the undocumented value 0.
+ This is needed, so that on Cygwin, areas used by malloc() are
+ distinguished from areas reserved for future malloc(). */
+ if (info.State != MEM_RESERVE)
+ {
+ unsigned long start, end;
+ unsigned int flags;
+
+ start = (unsigned long)info.BaseAddress;
+ end = start + info.RegionSize;
+ switch (info.Protect & ~(PAGE_GUARD|PAGE_NOCACHE))
+ {
+ case PAGE_READONLY:
+ flags = VMA_PROT_READ;
+ break;
+ case PAGE_READWRITE:
+ case PAGE_WRITECOPY:
+ flags = VMA_PROT_READ | VMA_PROT_WRITE;
+ break;
+ case PAGE_EXECUTE:
+ flags = VMA_PROT_EXECUTE;
+ break;
+ case PAGE_EXECUTE_READ:
+ flags = VMA_PROT_READ | VMA_PROT_EXECUTE;
+ break;
+ case PAGE_EXECUTE_READWRITE:
+ case PAGE_EXECUTE_WRITECOPY:
+ flags = VMA_PROT_READ | VMA_PROT_WRITE | VMA_PROT_EXECUTE;
+ break;
+ case PAGE_NOACCESS:
+ default:
+ flags = 0;
+ break;
+ }
+
+ if (callback (data, start, end, flags))
+ break;
+ }
+ address = (unsigned long)info.BaseAddress + info.RegionSize;
+ }
+
+#elif defined __BEOS__ || defined __HAIKU__
+ /* Use the BeOS specific API. */
+
+ area_info info;
+ int32 cookie;
+
+ cookie = 0;
+ while (get_next_area_info (0, &cookie, &info) == B_OK)
+ {
+ unsigned long start, end;
+ unsigned int flags;
+
+ start = (unsigned long) info.address;
+ end = start + info.size;
+ flags = 0;
+ if (info.protection & B_READ_AREA)
+ flags |= VMA_PROT_READ | VMA_PROT_EXECUTE;
+ if (info.protection & B_WRITE_AREA)
+ flags |= VMA_PROT_WRITE;
+
+ if (callback (data, start, end, flags))
+ break;
+ }
+
+#elif HAVE_MQUERY /* OpenBSD */
+
+ uintptr_t pagesize;
+ uintptr_t address;
+ int /*bool*/ address_known_mapped;
+
+ pagesize = getpagesize ();
+ /* Avoid calling mquery with a NULL first argument, because this argument
+ value has a specific meaning. We know the NULL page is unmapped. */
+ address = pagesize;
+ address_known_mapped = 0;
+ for (;;)
+ {
+ /* Test whether the page at address is mapped. */
+ if (address_known_mapped
+ || mquery ((void *) address, pagesize, 0, MAP_FIXED, -1, 0)
+ == (void *) -1)
+ {
+ /* The page at address is mapped.
+ This is the start of an interval. */
+ uintptr_t start = address;
+ uintptr_t end;
+
+ /* Find the end of the interval. */
+ end = (uintptr_t) mquery ((void *) address, pagesize, 0, 0, -1, 0);
+ if (end == (uintptr_t) (void *) -1)
+ end = 0; /* wrap around */
+ address = end;
+
+ /* It's too complicated to find out about the flags. Just pass 0. */
+ if (callback (data, start, end, 0))
+ break;
+
+ if (address < pagesize) /* wrap around? */
+ break;
+ }
+ /* Here we know that the page at address is unmapped. */
+ {
+ uintptr_t query_size = pagesize;
+
+ address += pagesize;
+
+ /* Query larger and larger blocks, to get through the unmapped address
+ range with few mquery() calls. */
+ for (;;)
+ {
+ if (2 * query_size > query_size)
+ query_size = 2 * query_size;
+ if (address + query_size - 1 < query_size) /* wrap around? */
+ {
+ address_known_mapped = 0;
+ break;
+ }
+ if (mquery ((void *) address, query_size, 0, MAP_FIXED, -1, 0)
+ == (void *) -1)
+ {
+ /* Not all the interval [address .. address + query_size - 1]
+ is unmapped. */
+ address_known_mapped = (query_size == pagesize);
+ break;
+ }
+ /* The interval [address .. address + query_size - 1] is
+ unmapped. */
+ address += query_size;
+ }
+ /* Reduce the query size again, to determine the precise size of the
+ unmapped interval that starts at address. */
+ while (query_size > pagesize)
+ {
+ query_size = query_size / 2;
+ if (address + query_size - 1 >= query_size)
+ {
+ if (mquery ((void *) address, query_size, 0, MAP_FIXED, -1, 0)
+ != (void *) -1)
+ {
+ /* The interval [address .. address + query_size - 1] is
+ unmapped. */
+ address += query_size;
+ address_known_mapped = 0;
+ }
+ else
+ address_known_mapped = (query_size == pagesize);
+ }
+ }
+ /* Here again query_size = pagesize, and
+ either address + pagesize - 1 < pagesize, or
+ mquery ((void *) address, pagesize, 0, MAP_FIXED, -1, 0) fails.
+ So, the unmapped area ends at address. */
+ }
+ if (address + pagesize - 1 < pagesize) /* wrap around? */
+ break;
+ }
+
+#endif
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+
+/* Output the VMAs of the current process in a format similar to the Linux
+ /proc/$pid/maps file. */
+
+static int
+vma_iterate_callback (void *data, uintptr_t start, uintptr_t end,
+ unsigned int flags)
+{
+ printf ("%08lx-%08lx %c%c%c\n",
+ (unsigned long) start, (unsigned long) end,
+ flags & VMA_PROT_READ ? 'r' : '-',
+ flags & VMA_PROT_WRITE ? 'w' : '-',
+ flags & VMA_PROT_EXECUTE ? 'x' : '-');
+ return 0;
+}
+
+int
+main ()
+{
+ vma_iterate (vma_iterate_callback, NULL);
+
+ /* Let the user interactively look at the /proc file system. */
+ sleep (10);
+
+ return 0;
+}
+
+#endif /* TEST */
diff --git a/gnulib/lib/vma-iter.h b/gnulib/lib/vma-iter.h
new file mode 100644
index 0000000..e24de65
--- /dev/null
+++ b/gnulib/lib/vma-iter.h
@@ -0,0 +1,63 @@
+/* Iteration over virtual memory areas.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _VMA_ITER_H
+#define _VMA_ITER_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Bit mask for the FLAGS parameter of a vma_iterate callback function. */
+#define VMA_PROT_READ (1<<0)
+#define VMA_PROT_WRITE (1<<1)
+#define VMA_PROT_EXECUTE (1<<2)
+
+typedef int (*vma_iterate_callback_fn) (void *data,
+ uintptr_t start, uintptr_t end,
+ unsigned int flags);
+
+/* Iterate over the virtual memory areas of the current process.
+ If such iteration is supported, the callback is called once for every
+ virtual memory area, in ascending order, with the following arguments:
+ - DATA is the same argument as passed to vma_iterate.
+ - START is the address of the first byte in the area, page-aligned.
+ - END is the address of the last byte in the area plus 1, page-aligned.
+ Note that it may be 0 for the last area in the address space.
+ - FLAGS is a combination of the VMA_* bits.
+ If the callback returns 0, the iteration continues. If it returns 1,
+ the iteration terminates prematurely.
+ This function may open file descriptors, but does not call malloc(). */
+extern void vma_iterate (vma_iterate_callback_fn callback, void *data);
+
+/* The macro VMA_ITERATE_SUPPORTED indicates that vma_iterate is supported on
+ this platform.
+ Note that even when this macro is defined, vma_iterate() may still fail to
+ find any virtual memory area, for example if /proc is not mounted. */
+#if defined __linux__ || defined __FreeBSD__ || defined __NetBSD__ || defined __sgi || defined __osf__ || (defined __APPLE__ && defined __MACH__) || (defined _WIN32 || defined __WIN32__) || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || HAVE_MQUERY
+# define VMA_ITERATE_SUPPORTED 1
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VMA_ITER_H */
diff --git a/gnulib/lib/vprintf.c b/gnulib/lib/vprintf.c
new file mode 100644
index 0000000..0388713
--- /dev/null
+++ b/gnulib/lib/vprintf.c
@@ -0,0 +1,33 @@
+/* Formatted output to a stream.
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <stdarg.h>
+
+/* Print formatted output to standard output.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
diff --git a/gnulib/lib/vsnprintf.c b/gnulib/lib/vsnprintf.c
new file mode 100644
index 0000000..ff5a807
--- /dev/null
+++ b/gnulib/lib/vsnprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to vsprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+vsnprintf (char *str, size_t size, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/vsprintf.c b/gnulib/lib/vsprintf.c
new file mode 100644
index 0000000..3cbfa26
--- /dev/null
+++ b/gnulib/lib/vsprintf.c
@@ -0,0 +1,77 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+/* Print formatted output to string STR.
+ Return string length of formatted string. On error, return a negative
+ value. */
+int
+vsprintf (char *str, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf;
+
+ /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger
+ than INT_MAX (if that fits into a 'size_t' at all).
+ Also note that glibc's iconv fails with E2BIG when we pass a length that
+ is so large that str + lenbuf wraps around, i.e.
+ (uintptr_t) (str + lenbuf) < (uintptr_t) str.
+ Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1). */
+ lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
+ if (lenbuf > ~ (uintptr_t) str)
+ lenbuf = ~ (uintptr_t) str;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ /* len is near SIZE_MAX. */
+ free (output);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/gnulib/lib/w32sock.h b/gnulib/lib/w32sock.h
new file mode 100644
index 0000000..0b8334e
--- /dev/null
+++ b/gnulib/lib/w32sock.h
@@ -0,0 +1,136 @@
+/* w32sock.h --- internal auxilliary functions for Windows socket functions
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <errno.h>
+
+/* Get O_RDWR and O_BINARY. */
+#include <fcntl.h>
+
+/* Get _open_osfhandle(). */
+#include <io.h>
+
+/* Get _get_osfhandle(). */
+#include "msvc-nothrow.h"
+
+#define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd)))
+#define SOCKET_TO_FD(fh) (_open_osfhandle ((long) (fh), O_RDWR | O_BINARY))
+
+static inline void
+set_winsock_errno (void)
+{
+ int err = WSAGetLastError ();
+
+ /* Map some WSAE* errors to the runtime library's error codes. */
+ switch (err)
+ {
+ case WSA_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ case WSA_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+ case WSA_INVALID_PARAMETER:
+ errno = EINVAL;
+ break;
+ case WSAENAMETOOLONG:
+ errno = ENAMETOOLONG;
+ break;
+ case WSAENOTEMPTY:
+ errno = ENOTEMPTY;
+ break;
+ case WSAEWOULDBLOCK:
+ errno = EWOULDBLOCK;
+ break;
+ case WSAEINPROGRESS:
+ errno = EINPROGRESS;
+ break;
+ case WSAEALREADY:
+ errno = EALREADY;
+ break;
+ case WSAENOTSOCK:
+ errno = ENOTSOCK;
+ break;
+ case WSAEDESTADDRREQ:
+ errno = EDESTADDRREQ;
+ break;
+ case WSAEMSGSIZE:
+ errno = EMSGSIZE;
+ break;
+ case WSAEPROTOTYPE:
+ errno = EPROTOTYPE;
+ break;
+ case WSAENOPROTOOPT:
+ errno = ENOPROTOOPT;
+ break;
+ case WSAEPROTONOSUPPORT:
+ errno = EPROTONOSUPPORT;
+ break;
+ case WSAEOPNOTSUPP:
+ errno = EOPNOTSUPP;
+ break;
+ case WSAEAFNOSUPPORT:
+ errno = EAFNOSUPPORT;
+ break;
+ case WSAEADDRINUSE:
+ errno = EADDRINUSE;
+ break;
+ case WSAEADDRNOTAVAIL:
+ errno = EADDRNOTAVAIL;
+ break;
+ case WSAENETDOWN:
+ errno = ENETDOWN;
+ break;
+ case WSAENETUNREACH:
+ errno = ENETUNREACH;
+ break;
+ case WSAENETRESET:
+ errno = ENETRESET;
+ break;
+ case WSAECONNABORTED:
+ errno = ECONNABORTED;
+ break;
+ case WSAECONNRESET:
+ errno = ECONNRESET;
+ break;
+ case WSAENOBUFS:
+ errno = ENOBUFS;
+ break;
+ case WSAEISCONN:
+ errno = EISCONN;
+ break;
+ case WSAENOTCONN:
+ errno = ENOTCONN;
+ break;
+ case WSAETIMEDOUT:
+ errno = ETIMEDOUT;
+ break;
+ case WSAECONNREFUSED:
+ errno = ECONNREFUSED;
+ break;
+ case WSAELOOP:
+ errno = ELOOP;
+ break;
+ case WSAEHOSTUNREACH:
+ errno = EHOSTUNREACH;
+ break;
+ default:
+ errno = (err > 10000 && err < 10025) ? err - 10000 : err;
+ break;
+ }
+}
diff --git a/gnulib/lib/w32spawn.h b/gnulib/lib/w32spawn.h
new file mode 100644
index 0000000..1667370
--- /dev/null
+++ b/gnulib/lib/w32spawn.h
@@ -0,0 +1,215 @@
+/* Auxiliary functions for the creation of subprocesses. Native Woe32 API.
+ Copyright (C) 2001, 2003-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Get declarations of the Win32 API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* Get _open_osfhandle(). */
+#include <io.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Get _get_osfhandle(). */
+#include "msvc-nothrow.h"
+
+#include "cloexec.h"
+#include "xalloc.h"
+
+/* Duplicates a file handle, making the copy uninheritable.
+ Returns -1 for a file handle that is equivalent to closed. */
+static int
+dup_noinherit (int fd)
+{
+ fd = dup_cloexec (fd);
+ if (fd < 0 && errno == EMFILE)
+ error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
+
+ return fd;
+}
+
+/* Returns a file descriptor equivalent to FD, except that the resulting file
+ descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ FD must be open and non-inheritable. The result will be non-inheritable as
+ well.
+ If FD < 0, FD itself is returned. */
+static int
+fd_safer_noinherit (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ /* The recursion depth is at most 3. */
+ int nfd = fd_safer_noinherit (dup_noinherit (fd));
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return nfd;
+ }
+ return fd;
+}
+
+/* Duplicates a file handle, making the copy uninheritable and ensuring the
+ result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ Returns -1 for a file handle that is equivalent to closed. */
+static int
+dup_safer_noinherit (int fd)
+{
+ return fd_safer_noinherit (dup_noinherit (fd));
+}
+
+/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD); */
+static void
+undup_safer_noinherit (int tempfd, int origfd)
+{
+ if (tempfd >= 0)
+ {
+ if (dup2 (tempfd, origfd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
+ origfd);
+ close (tempfd);
+ }
+ else
+ {
+ /* origfd was closed or open to no handle at all. Set it to a closed
+ state. This is (nearly) equivalent to the original state. */
+ close (origfd);
+ }
+}
+
+/* Prepares an argument vector before calling spawn().
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Win32 CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+static char **
+prepare_spawn (char **argv)
+{
+ size_t argc;
+ char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = XNMALLOC (1 + argc + 1, char *);
+
+ /* Add an element upfront that can be used when argv[0] turns out to be a
+ script, not a program.
+ On Unix, this would be "/bin/sh". On native Windows, "sh" is actually
+ "sh.exe". We have to omit the directory part and rely on the search in
+ PATH, because the mingw "mount points" are not visible inside Win32
+ CreateProcess(). */
+ *new_argv++ = "sh.exe";
+
+ /* Put quoted arguments into the new argument vector. */
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ if (string[0] == '\0')
+ new_argv[i] = xstrdup ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+ char *quoted_string;
+ char *p;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ quoted_string = (char *) xmalloc (length + 1);
+
+ p = quoted_string;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p = '\0';
+
+ new_argv[i] = quoted_string;
+ }
+ else
+ new_argv[i] = (char *) string;
+ }
+ new_argv[argc] = NULL;
+
+ return new_argv;
+}
diff --git a/gnulib/lib/wait-process.c b/gnulib/lib/wait-process.c
new file mode 100644
index 0000000..37ca7b9
--- /dev/null
+++ b/gnulib/lib/wait-process.c
@@ -0,0 +1,361 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "wait-process.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+#if defined _MSC_VER || defined __MINGW32__
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* The return value of spawnvp() is really a process handle as returned
+ by CreateProcess(). Therefore we can kill it using TerminateProcess. */
+#define kill(pid,sig) TerminateProcess ((HANDLE) (pid), sig)
+
+#endif
+
+
+/* Type of an entry in the slaves array.
+ The 'used' bit determines whether this entry is currently in use.
+ (If pid_t was an atomic type like sig_atomic_t, we could just set the
+ 'child' field to 0 when unregistering a slave process, and wouldn't need
+ the 'used' field.)
+ The 'used' and 'child' fields are accessed from within the cleanup_slaves()
+ action, therefore we mark them as 'volatile'. */
+typedef struct
+{
+ volatile sig_atomic_t used;
+ volatile pid_t child;
+}
+slaves_entry_t;
+
+/* The registered slave subprocesses. */
+static slaves_entry_t static_slaves[32];
+static slaves_entry_t * volatile slaves = static_slaves;
+static sig_atomic_t volatile slaves_count = 0;
+static size_t slaves_allocated = SIZEOF (static_slaves);
+
+/* The termination signal for slave subprocesses.
+ 2003-10-07: Terminator becomes Governator. */
+#ifdef SIGHUP
+# define TERMINATOR SIGHUP
+#else
+# define TERMINATOR SIGTERM
+#endif
+
+/* The cleanup action. It gets called asynchronously. */
+static void
+cleanup_slaves (void)
+{
+ for (;;)
+ {
+ /* Get the last registered slave. */
+ size_t n = slaves_count;
+ if (n == 0)
+ break;
+ n--;
+ slaves_count = n;
+ /* Skip unused entries in the slaves array. */
+ if (slaves[n].used)
+ {
+ pid_t slave = slaves[n].child;
+
+ /* Kill the slave. */
+ kill (slave, TERMINATOR);
+ }
+ }
+}
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+void
+register_slave_subprocess (pid_t child)
+{
+ static bool cleanup_slaves_registered = false;
+ if (!cleanup_slaves_registered)
+ {
+ atexit (cleanup_slaves);
+ at_fatal_signal (cleanup_slaves);
+ cleanup_slaves_registered = true;
+ }
+
+ /* Try to store the new slave in an unused entry of the slaves array. */
+ {
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (!s->used)
+ {
+ /* The two uses of 'volatile' in the slaves_entry_t type above
+ (and ISO C 99 section 5.1.2.3.(5)) ensure that we mark the
+ entry as used only after the child pid has been written to the
+ memory location s->child. */
+ s->child = child;
+ s->used = 1;
+ return;
+ }
+ }
+
+ if (slaves_count == slaves_allocated)
+ {
+ /* Extend the slaves array. Note that we cannot use xrealloc(),
+ because then the cleanup_slaves() function could access an already
+ deallocated array. */
+ slaves_entry_t *old_slaves = slaves;
+ size_t new_slaves_allocated = 2 * slaves_allocated;
+ slaves_entry_t *new_slaves =
+ (slaves_entry_t *)
+ malloc (new_slaves_allocated * sizeof (slaves_entry_t));
+ if (new_slaves == NULL)
+ {
+ /* xalloc_die() will call exit() which will invoke cleanup_slaves().
+ Additionally we need to kill child, because it's not yet among
+ the slaves list. */
+ kill (child, TERMINATOR);
+ xalloc_die ();
+ }
+ memcpy (new_slaves, old_slaves,
+ slaves_allocated * sizeof (slaves_entry_t));
+ slaves = new_slaves;
+ slaves_allocated = new_slaves_allocated;
+ /* Now we can free the old slaves array. */
+ if (old_slaves != static_slaves)
+ free (old_slaves);
+ }
+ /* The three uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the slaves_count only after the
+ new slave and its 'used' bit have been written to the memory locations
+ that make up slaves[slaves_count]. */
+ slaves[slaves_count].child = child;
+ slaves[slaves_count].used = 1;
+ slaves_count++;
+}
+
+/* Unregister a child from the list of slave subprocesses. */
+static inline void
+unregister_slave_subprocess (pid_t child)
+{
+ /* The easiest way to remove an entry from a list that can be used by
+ an asynchronous signal handler is just to mark it as unused. For this,
+ we rely on sig_atomic_t. */
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (s->used && s->child == child)
+ s->used = 0;
+}
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127. */
+int
+wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp)
+{
+#if HAVE_WAITID && defined WNOWAIT && 0
+ /* Commented out because waitid() without WEXITED and with WNOWAIT doesn't
+ work: On Solaris 7 and OSF/1 4.0, it returns -1 and sets errno = ECHILD,
+ and on HP-UX 10.20 it just hangs. */
+ /* Use of waitid() with WNOWAIT avoids a race condition: If slave_process is
+ true, and this process sleeps a very long time between the return from
+ waitpid() and the execution of unregister_slave_subprocess(), and
+ meanwhile another process acquires the same PID as child, and then - still
+ before unregister_slave_subprocess() - this process gets a fatal signal,
+ it would kill the other totally unrelated process. */
+ siginfo_t info;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED | (slave_process ? WNOWAIT : 0))
+ < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* info.si_code is set to one of CLD_EXITED, CLD_KILLED, CLD_DUMPED,
+ CLD_TRAPPED, CLD_STOPPED, CLD_CONTINUED. Loop until the program
+ terminates. */
+ if (info.si_code == CLD_EXITED
+ || info.si_code == CLD_KILLED || info.si_code == CLD_DUMPED)
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ {
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ /* Now remove the zombie from the process list. */
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED) < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+ break;
+ }
+ }
+
+ switch (info.si_code)
+ {
+ case CLD_KILLED:
+ case CLD_DUMPED:
+ if (termsigp != NULL)
+ *termsigp = info.si_status; /* TODO: or info.si_signo? */
+# ifdef SIGPIPE
+ if (info.si_status == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, info.si_status);
+ return 127;
+ case CLD_EXITED:
+ if (info.si_status == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return info.si_status;
+ default:
+ abort ();
+ }
+#else
+ /* waitpid() is just as portable as wait() nowadays. */
+ int status;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ status = 0;
+ for (;;)
+ {
+ int result = waitpid (child, &status, 0);
+
+ if (result != child)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+# if 0 /* defined ECHILD */
+ if (errno == ECHILD)
+ {
+ /* Child process nonexistent?! Assume it terminated
+ successfully. */
+ status = 0;
+ break;
+ }
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* One of WIFSIGNALED (status), WIFEXITED (status), WIFSTOPPED (status)
+ must always be true, since we did not specify WCONTINUED in the
+ waitpid() call. Loop until the program terminates. */
+ if (!WIFSTOPPED (status))
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ if (WIFSIGNALED (status))
+ {
+ if (termsigp != NULL)
+ *termsigp = WTERMSIG (status);
+# ifdef SIGPIPE
+ if (WTERMSIG (status) == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, (int) WTERMSIG (status));
+ return 127;
+ }
+ if (!WIFEXITED (status))
+ abort ();
+ if (WEXITSTATUS (status) == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return WEXITSTATUS (status);
+#endif
+}
diff --git a/gnulib/lib/wait-process.h b/gnulib/lib/wait-process.h
new file mode 100644
index 0000000..3c178c1
--- /dev/null
+++ b/gnulib/lib/wait-process.h
@@ -0,0 +1,74 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2006, 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _WAIT_PROCESS_H
+#define _WAIT_PROCESS_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ Arguments:
+ - child is the pid of the subprocess.
+ - progname is the name of the program executed by the subprocess, used for
+ error messages.
+ - If ignore_sigpipe is true, consider a subprocess termination due to
+ SIGPIPE as equivalent to a success. This is suitable for processes whose
+ only purpose is to write to standard output. This flag can be safely set
+ to false when the process' standard output is known to go to DEV_NULL.
+ - If null_stderr is true, the usual error message to stderr will be omitted.
+ This is suitable when the subprocess does not fulfill an important task.
+ - slave_process should be set to true if the process has been launched as a
+ slave process.
+ - If exit_on_error is true, any error will cause the main process to exit
+ with an error status.
+ - If termsigp is not NULL: *termsig will be set to the signal that
+ terminated the subprocess (if supported by the platform: not on native
+ Windows platforms), otherwise 0, and the error message about the signal
+ that terminated the subprocess will be omitted.
+ Prerequisites: The signal handler for SIGCHLD should not be set to SIG_IGN,
+ otherwise this function will not work. */
+extern int wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp);
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+extern void register_slave_subprocess (pid_t child);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _WAIT_PROCESS_H */
diff --git a/gnulib/lib/waitpid.c b/gnulib/lib/waitpid.c
new file mode 100644
index 0000000..fe5dee8
--- /dev/null
+++ b/gnulib/lib/waitpid.c
@@ -0,0 +1,31 @@
+/* Wait for process state change.
+ Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/wait.h>
+
+/* Implementation for native Win32 systems. */
+
+#include <process.h> /* for _cwait, WAIT_CHILD */
+
+pid_t
+waitpid (pid_t pid, int *statusp, int options)
+{
+ return _cwait (statusp, pid, WAIT_CHILD);
+}
diff --git a/gnulib/lib/wchar.in.h b/gnulib/lib/wchar.in.h
new file mode 100644
index 0000000..8534acb
--- /dev/null
+++ b/gnulib/lib/wchar.in.h
@@ -0,0 +1,1006 @@
+/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Eric Blake. */
+
+/*
+ * ISO C 99 <wchar.h> for platforms that have issues.
+ * <http://www.opengroup.org/susv3xbd/wchar.h.html>
+ *
+ * For now, this just ensures proper prerequisite inclusion order and
+ * the declaration of wcwidth().
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_mbstate_t || defined __need_wint_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H
+/* Special invocation convention:
+ - Inside glibc and uClibc header files.
+ - On HP-UX 11.00 we have a sequence of nested includes
+ <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>,
+ once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h>
+ and once directly. In both situations 'wint_t' is not yet defined,
+ therefore we cannot provide the function overrides; instead include only
+ the system's <wchar.h>.
+ - On IRIX 6.5, similarly, we have an include <wchar.h> -> <wctype.h>, and
+ the latter includes <wchar.h>. But here, we have no way to detect whether
+ <wctype.h> is completely included or is still being included. */
+
+#@INCLUDE_NEXT@ @NEXT_WCHAR_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+
+#define _GL_ALREADY_INCLUDING_WCHAR_H
+
+#if @HAVE_FEATURES_H@
+# include <features.h> /* for __GLIBC__ */
+#endif
+
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>.
+ In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+ by <stddef.h>.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+#endif
+#ifndef __GLIBC__
+# include <stdio.h>
+# include <time.h>
+#endif
+
+/* Include the original <wchar.h> if it exists.
+ Some builds of uClibc lack it. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCHAR_H@
+# @INCLUDE_NEXT@ @NEXT_WCHAR_H@
+#endif
+
+#undef _GL_ALREADY_INCLUDING_WCHAR_H
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+#define _@GUARD_PREFIX@_WCHAR_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Define wint_t and WEOF. (Also done in wctype.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* MSVC defines wint_t as 'unsigned short' in <crtdefs.h>.
+ This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
+ "unchanged by default argument promotions". Override it. */
+# if defined _MSC_VER
+# if !GNULIB_defined_wint_t
+# include <crtdefs.h>
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+/* Override mbstate_t if it is too small.
+ On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
+ implementing mbrtowc for encodings like UTF-8. */
+#if !(@HAVE_MBSINIT@ && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
+# if !GNULIB_defined_mbstate_t
+typedef int rpl_mbstate_t;
+# undef mbstate_t
+# define mbstate_t rpl_mbstate_t
+# define GNULIB_defined_mbstate_t 1
+# endif
+#endif
+
+
+/* Convert a single-byte character to a wide character. */
+#if @GNULIB_BTOWC@
+# if @REPLACE_BTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef btowc
+# define btowc rpl_btowc
+# endif
+_GL_FUNCDECL_RPL (btowc, wint_t, (int c));
+_GL_CXXALIAS_RPL (btowc, wint_t, (int c));
+# else
+# if !@HAVE_BTOWC@
+_GL_FUNCDECL_SYS (btowc, wint_t, (int c));
+# endif
+_GL_CXXALIAS_SYS (btowc, wint_t, (int c));
+# endif
+_GL_CXXALIASWARN (btowc);
+#elif defined GNULIB_POSIXCHECK
+# undef btowc
+# if HAVE_RAW_DECL_BTOWC
+_GL_WARN_ON_USE (btowc, "btowc is unportable - "
+ "use gnulib module btowc for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a single-byte character. */
+#if @GNULIB_WCTOB@
+# if @REPLACE_WCTOB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctob
+# define wctob rpl_wctob
+# endif
+_GL_FUNCDECL_RPL (wctob, int, (wint_t wc));
+_GL_CXXALIAS_RPL (wctob, int, (wint_t wc));
+# else
+# if !defined wctob && !@HAVE_DECL_WCTOB@
+/* wctob is provided by gnulib, or wctob exists but is not declared. */
+_GL_FUNCDECL_SYS (wctob, int, (wint_t wc));
+# endif
+_GL_CXXALIAS_SYS (wctob, int, (wint_t wc));
+# endif
+_GL_CXXALIASWARN (wctob);
+#elif defined GNULIB_POSIXCHECK
+# undef wctob
+# if HAVE_RAW_DECL_WCTOB
+_GL_WARN_ON_USE (wctob, "wctob is unportable - "
+ "use gnulib module wctob for portability");
+# endif
+#endif
+
+
+/* Test whether *PS is in the initial state. */
+#if @GNULIB_MBSINIT@
+# if @REPLACE_MBSINIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsinit
+# define mbsinit rpl_mbsinit
+# endif
+_GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps));
+_GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps));
+# else
+# if !@HAVE_MBSINIT@
+_GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (mbsinit);
+#elif defined GNULIB_POSIXCHECK
+# undef mbsinit
+# if HAVE_RAW_DECL_MBSINIT
+_GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
+ "use gnulib module mbsinit for portability");
+# endif
+#endif
+
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBRTOWC@
+# if @REPLACE_MBRTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrtowc
+# define mbrtowc rpl_mbrtowc
+# endif
+_GL_FUNCDECL_RPL (mbrtowc, size_t,
+ (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_RPL (mbrtowc, size_t,
+ (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+# else
+# if !@HAVE_MBRTOWC@
+_GL_FUNCDECL_SYS (mbrtowc, size_t,
+ (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (mbrtowc, size_t,
+ (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (mbrtowc);
+#elif defined GNULIB_POSIXCHECK
+# undef mbrtowc
+# if HAVE_RAW_DECL_MBRTOWC
+_GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - "
+ "use gnulib module mbrtowc for portability");
+# endif
+#endif
+
+
+/* Recognize a multibyte character. */
+#if @GNULIB_MBRLEN@
+# if @REPLACE_MBRLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrlen
+# define mbrlen rpl_mbrlen
+# endif
+_GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+# else
+# if !@HAVE_MBRLEN@
+_GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (mbrlen);
+#elif defined GNULIB_POSIXCHECK
+# undef mbrlen
+# if HAVE_RAW_DECL_MBRLEN
+_GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - "
+ "use gnulib module mbrlen for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSRTOWCS@
+# if @REPLACE_MBSRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsrtowcs
+# define mbsrtowcs rpl_mbsrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t len,
+ mbstate_t *ps));
+# else
+# if !@HAVE_MBSRTOWCS@
+_GL_FUNCDECL_SYS (mbsrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t len,
+ mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (mbsrtowcs);
+#elif defined GNULIB_POSIXCHECK
+# undef mbsrtowcs
+# if HAVE_RAW_DECL_MBSRTOWCS
+_GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - "
+ "use gnulib module mbsrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSNRTOWCS@
+# if @REPLACE_MBSNRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsnrtowcs
+# define mbsnrtowcs rpl_mbsnrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
+ mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
+ mbstate_t *ps));
+# else
+# if !@HAVE_MBSNRTOWCS@
+_GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
+ mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
+ (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
+ mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (mbsnrtowcs);
+#elif defined GNULIB_POSIXCHECK
+# undef mbsnrtowcs
+# if HAVE_RAW_DECL_MBSNRTOWCS
+_GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - "
+ "use gnulib module mbsnrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCRTOMB@
+# if @REPLACE_WCRTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcrtomb
+# define wcrtomb rpl_wcrtomb
+# endif
+_GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+# else
+# if !@HAVE_WCRTOMB@
+_GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (wcrtomb);
+#elif defined GNULIB_POSIXCHECK
+# undef wcrtomb
+# if HAVE_RAW_DECL_WCRTOMB
+_GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - "
+ "use gnulib module wcrtomb for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSRTOMBS@
+# if @REPLACE_WCSRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsrtombs
+# define wcsrtombs rpl_wcsrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t len,
+ mbstate_t *ps));
+# else
+# if !@HAVE_WCSRTOMBS@
+_GL_FUNCDECL_SYS (wcsrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t len,
+ mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (wcsrtombs);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrtombs
+# if HAVE_RAW_DECL_WCSRTOMBS
+_GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - "
+ "use gnulib module wcsrtombs for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSNRTOMBS@
+# if @REPLACE_WCSNRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsnrtombs
+# define wcsnrtombs rpl_wcsnrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsnrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
+ mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsnrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
+ mbstate_t *ps));
+# else
+# if !@HAVE_WCSNRTOMBS@
+_GL_FUNCDECL_SYS (wcsnrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
+ mbstate_t *ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsnrtombs, size_t,
+ (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
+ mbstate_t *ps));
+# endif
+_GL_CXXALIASWARN (wcsnrtombs);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnrtombs
+# if HAVE_RAW_DECL_WCSNRTOMBS
+_GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - "
+ "use gnulib module wcsnrtombs for portability");
+# endif
+#endif
+
+
+/* Return the number of screen columns needed for WC. */
+#if @GNULIB_WCWIDTH@
+# if @REPLACE_WCWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcwidth
+# define wcwidth rpl_wcwidth
+# endif
+_GL_FUNCDECL_RPL (wcwidth, int, (wchar_t));
+_GL_CXXALIAS_RPL (wcwidth, int, (wchar_t));
+# else
+# if !@HAVE_DECL_WCWIDTH@
+/* wcwidth exists but is not declared. */
+_GL_FUNCDECL_SYS (wcwidth, int, (wchar_t));
+# endif
+_GL_CXXALIAS_SYS (wcwidth, int, (wchar_t));
+# endif
+_GL_CXXALIASWARN (wcwidth);
+#elif defined GNULIB_POSIXCHECK
+# undef wcwidth
+# if HAVE_RAW_DECL_WCWIDTH
+_GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - "
+ "use gnulib module wcwidth for portability");
+# endif
+#endif
+
+
+/* Search N wide characters of S for C. */
+#if @GNULIB_WMEMCHR@
+# if !@HAVE_WMEMCHR@
+_GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t);
+ wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wmemchr,
+ wchar_t *, (const wchar_t *, wchar_t, size_t),
+ const wchar_t *, (const wchar_t *, wchar_t, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+_GL_CXXALIASWARN1 (wmemchr, const wchar_t *,
+ (const wchar_t *s, wchar_t c, size_t n));
+# else
+_GL_CXXALIASWARN (wmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemchr
+# if HAVE_RAW_DECL_WMEMCHR
+_GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - "
+ "use gnulib module wmemchr for portability");
+# endif
+#endif
+
+
+/* Compare N wide characters of S1 and S2. */
+#if @GNULIB_WMEMCMP@
+# if !@HAVE_WMEMCMP@
+_GL_FUNCDECL_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wmemcmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcmp
+# if HAVE_RAW_DECL_WMEMCMP
+_GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - "
+ "use gnulib module wmemcmp for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST. */
+#if @GNULIB_WMEMCPY@
+# if !@HAVE_WMEMCPY@
+_GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+_GL_CXXALIASWARN (wmemcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcpy
+# if HAVE_RAW_DECL_WMEMCPY
+_GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - "
+ "use gnulib module wmemcpy for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+#if @GNULIB_WMEMMOVE@
+# if !@HAVE_WMEMMOVE@
+_GL_FUNCDECL_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+_GL_CXXALIASWARN (wmemmove);
+#elif defined GNULIB_POSIXCHECK
+# undef wmemmove
+# if HAVE_RAW_DECL_WMEMMOVE
+_GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - "
+ "use gnulib module wmemmove for portability");
+# endif
+#endif
+
+
+/* Set N wide characters of S to C. */
+#if @GNULIB_WMEMSET@
+# if !@HAVE_WMEMSET@
+_GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+_GL_CXXALIASWARN (wmemset);
+#elif defined GNULIB_POSIXCHECK
+# undef wmemset
+# if HAVE_RAW_DECL_WMEMSET
+_GL_WARN_ON_USE (wmemset, "wmemset is unportable - "
+ "use gnulib module wmemset for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S. */
+#if @GNULIB_WCSLEN@
+# if !@HAVE_WCSLEN@
+_GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s));
+# endif
+_GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s));
+_GL_CXXALIASWARN (wcslen);
+#elif defined GNULIB_POSIXCHECK
+# undef wcslen
+# if HAVE_RAW_DECL_WCSLEN
+_GL_WARN_ON_USE (wcslen, "wcslen is unportable - "
+ "use gnulib module wcslen for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S, but at most MAXLEN. */
+#if @GNULIB_WCSNLEN@
+# if !@HAVE_WCSNLEN@
+_GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen));
+# endif
+_GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen));
+_GL_CXXALIASWARN (wcsnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnlen
+# if HAVE_RAW_DECL_WCSNLEN
+_GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - "
+ "use gnulib module wcsnlen for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST. */
+#if @GNULIB_WCSCPY@
+# if !@HAVE_WCSCPY@
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+# endif
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIASWARN (wcscpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscpy
+# if HAVE_RAW_DECL_WCSCPY
+_GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - "
+ "use gnulib module wcscpy for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */
+#if @GNULIB_WCPCPY@
+# if !@HAVE_WCPCPY@
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+# endif
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIASWARN (wcpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpcpy
+# if HAVE_RAW_DECL_WCPCPY
+_GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - "
+ "use gnulib module wcpcpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N wide characters of SRC to DEST. */
+#if @GNULIB_WCSNCPY@
+# if !@HAVE_WCSNCPY@
+_GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+_GL_CXXALIASWARN (wcsncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncpy
+# if HAVE_RAW_DECL_WCSNCPY
+_GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - "
+ "use gnulib module wcsncpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N characters of SRC to DEST, returning the address of
+ the last character written into DEST. */
+#if @GNULIB_WCPNCPY@
+# if !@HAVE_WCPNCPY@
+_GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+_GL_CXXALIASWARN (wcpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpncpy
+# if HAVE_RAW_DECL_WCPNCPY
+_GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - "
+ "use gnulib module wcpncpy for portability");
+# endif
+#endif
+
+
+/* Append SRC onto DEST. */
+#if @GNULIB_WCSCAT@
+# if !@HAVE_WCSCAT@
+_GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+# endif
+_GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
+_GL_CXXALIASWARN (wcscat);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscat
+# if HAVE_RAW_DECL_WCSCAT
+_GL_WARN_ON_USE (wcscat, "wcscat is unportable - "
+ "use gnulib module wcscat for portability");
+# endif
+#endif
+
+
+/* Append no more than N wide characters of SRC onto DEST. */
+#if @GNULIB_WCSNCAT@
+# if !@HAVE_WCSNCAT@
+_GL_FUNCDECL_SYS (wcsncat, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncat, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+_GL_CXXALIASWARN (wcsncat);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncat
+# if HAVE_RAW_DECL_WCSNCAT
+_GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - "
+ "use gnulib module wcsncat for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2. */
+#if @GNULIB_WCSCMP@
+# if !@HAVE_WCSCMP@
+_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
+# endif
+_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
+_GL_CXXALIASWARN (wcscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscmp
+# if HAVE_RAW_DECL_WCSCMP
+_GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - "
+ "use gnulib module wcscmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N wide characters of S1 and S2. */
+#if @GNULIB_WCSNCMP@
+# if !@HAVE_WCSNCMP@
+_GL_FUNCDECL_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wcsncmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncmp
+# if HAVE_RAW_DECL_WCSNCMP
+_GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - "
+ "use gnulib module wcsncmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, ignoring case. */
+#if @GNULIB_WCSCASECMP@
+# if !@HAVE_WCSCASECMP@
+_GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2));
+# endif
+_GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2));
+_GL_CXXALIASWARN (wcscasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscasecmp
+# if HAVE_RAW_DECL_WCSCASECMP
+_GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - "
+ "use gnulib module wcscasecmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N chars of S1 and S2, ignoring case. */
+#if @GNULIB_WCSNCASECMP@
+# if !@HAVE_WCSNCASECMP@
+_GL_FUNCDECL_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wcsncasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncasecmp
+# if HAVE_RAW_DECL_WCSNCASECMP
+_GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - "
+ "use gnulib module wcsncasecmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE
+ category of the current locale. */
+#if @GNULIB_WCSCOLL@
+# if !@HAVE_WCSCOLL@
+_GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+# endif
+_GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+_GL_CXXALIASWARN (wcscoll);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscoll
+# if HAVE_RAW_DECL_WCSCOLL
+_GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - "
+ "use gnulib module wcscoll for portability");
+# endif
+#endif
+
+
+/* Transform S2 into array pointed to by S1 such that if wcscmp is applied
+ to two transformed strings the result is the as applying 'wcscoll' to the
+ original strings. */
+#if @GNULIB_WCSXFRM@
+# if !@HAVE_WCSXFRM@
+_GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wcsxfrm);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsxfrm
+# if HAVE_RAW_DECL_WCSXFRM
+_GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - "
+ "use gnulib module wcsxfrm for portability");
+# endif
+#endif
+
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_WCSDUP@
+# if !@HAVE_WCSDUP@
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+_GL_CXXALIASWARN (wcsdup);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsdup
+# if HAVE_RAW_DECL_WCSDUP
+_GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
+ "use gnulib module wcsdup for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence of WC in WCS. */
+#if @GNULIB_WCSCHR@
+# if !@HAVE_WCSCHR@
+_GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcschr (const wchar_t *, wchar_t);
+ wchar_t * std::wcschr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcschr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# else
+_GL_CXXALIASWARN (wcschr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcschr
+# if HAVE_RAW_DECL_WCSCHR
+_GL_WARN_ON_USE (wcschr, "wcschr is unportable - "
+ "use gnulib module wcschr for portability");
+# endif
+#endif
+
+
+/* Find the last occurrence of WC in WCS. */
+#if @GNULIB_WCSRCHR@
+# if !@HAVE_WCSRCHR@
+_GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsrchr (const wchar_t *, wchar_t);
+ wchar_t * std::wcsrchr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsrchr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# else
+_GL_CXXALIASWARN (wcsrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrchr
+# if HAVE_RAW_DECL_WCSRCHR
+_GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - "
+ "use gnulib module wcsrchr for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters not in REJECT. */
+#if @GNULIB_WCSCSPN@
+# if !@HAVE_WCSCSPN@
+_GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject));
+# endif
+_GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject));
+_GL_CXXALIASWARN (wcscspn);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscspn
+# if HAVE_RAW_DECL_WCSCSPN
+_GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - "
+ "use gnulib module wcscspn for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters in ACCEPT. */
+#if @GNULIB_WCSSPN@
+# if !@HAVE_WCSSPN@
+_GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept));
+# endif
+_GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept));
+_GL_CXXALIASWARN (wcsspn);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsspn
+# if HAVE_RAW_DECL_WCSSPN
+_GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - "
+ "use gnulib module wcsspn for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence in WCS of any character in ACCEPT. */
+#if @GNULIB_WCSPBRK@
+# if !@HAVE_WCSPBRK@
+_GL_FUNCDECL_SYS (wcspbrk, wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcspbrk (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcspbrk,
+ wchar_t *, (const wchar_t *, const wchar_t *),
+ const wchar_t *, (const wchar_t *, const wchar_t *));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcspbrk, wchar_t *,
+ (wchar_t *wcs, const wchar_t *accept));
+_GL_CXXALIASWARN1 (wcspbrk, const wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept));
+# else
+_GL_CXXALIASWARN (wcspbrk);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcspbrk
+# if HAVE_RAW_DECL_WCSPBRK
+_GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - "
+ "use gnulib module wcspbrk for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_WCSSTR@
+# if !@HAVE_WCSSTR@
+_GL_FUNCDECL_SYS (wcsstr, wchar_t *,
+ (const wchar_t *haystack, const wchar_t *needle));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsstr,
+ wchar_t *, (const wchar_t *, const wchar_t *),
+ const wchar_t *, (const wchar_t *, const wchar_t *));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsstr, wchar_t *,
+ (wchar_t *haystack, const wchar_t *needle));
+_GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
+ (const wchar_t *haystack, const wchar_t *needle));
+# else
+_GL_CXXALIASWARN (wcsstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsstr
+# if HAVE_RAW_DECL_WCSSTR
+_GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - "
+ "use gnulib module wcsstr for portability");
+# endif
+#endif
+
+
+/* Divide WCS into tokens separated by characters in DELIM. */
+#if @GNULIB_WCSTOK@
+# if !@HAVE_WCSTOK@
+_GL_FUNCDECL_SYS (wcstok, wchar_t *,
+ (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+# endif
+_GL_CXXALIAS_SYS (wcstok, wchar_t *,
+ (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
+_GL_CXXALIASWARN (wcstok);
+#elif defined GNULIB_POSIXCHECK
+# undef wcstok
+# if HAVE_RAW_DECL_WCSTOK
+_GL_WARN_ON_USE (wcstok, "wcstok is unportable - "
+ "use gnulib module wcstok for portability");
+# endif
+#endif
+
+
+/* Determine number of column positions required for first N wide
+ characters (or fewer if S ends before this) in S. */
+#if @GNULIB_WCSWIDTH@
+# if @REPLACE_WCSWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcswidth
+# define wcswidth rpl_wcswidth
+# endif
+_GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n));
+_GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n));
+# else
+# if !@HAVE_WCSWIDTH@
+_GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n));
+# endif
+_GL_CXXALIASWARN (wcswidth);
+#elif defined GNULIB_POSIXCHECK
+# undef wcswidth
+# if HAVE_RAW_DECL_WCSWIDTH
+_GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - "
+ "use gnulib module wcswidth for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif
diff --git a/gnulib/lib/wcpcpy-impl.h b/gnulib/lib/wcpcpy-impl.h
new file mode 100644
index 0000000..f7f0f7d
--- /dev/null
+++ b/gnulib/lib/wcpcpy-impl.h
@@ -0,0 +1,24 @@
+/* Copy a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcpcpy (wchar_t *dest, const wchar_t *src)
+{
+ for (; (*dest = *src) != (wchar_t)'\0'; src++, dest++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/wcpcpy.c b/gnulib/lib/wcpcpy.c
new file mode 100644
index 0000000..fdc29fc
--- /dev/null
+++ b/gnulib/lib/wcpcpy.c
@@ -0,0 +1,23 @@
+/* Copy a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcpcpy-impl.h"
diff --git a/gnulib/lib/wcpncpy-impl.h b/gnulib/lib/wcpncpy-impl.h
new file mode 100644
index 0000000..bdb290f
--- /dev/null
+++ b/gnulib/lib/wcpncpy-impl.h
@@ -0,0 +1,30 @@
+/* Copy a size-bounded wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcpncpy (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ for (; n > 0 && (*dest = *src) != (wchar_t)'\0'; src++, dest++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is here for consistency with
+ wcsncpy. */
+ for (; n > 0; n--)
+ *dest++ = (wchar_t)'\0';
+
+ return dest-1;
+}
diff --git a/gnulib/lib/wcpncpy.c b/gnulib/lib/wcpncpy.c
new file mode 100644
index 0000000..287eec7
--- /dev/null
+++ b/gnulib/lib/wcpncpy.c
@@ -0,0 +1,23 @@
+/* Copy a size-bounded wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcpncpy-impl.h"
diff --git a/gnulib/lib/wcrtomb.c b/gnulib/lib/wcrtomb.c
new file mode 100644
index 0000000..6632589
--- /dev/null
+++ b/gnulib/lib/wcrtomb.c
@@ -0,0 +1,53 @@
+/* Convert wide character to multibyte character.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+
+
+size_t
+wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+{
+ /* This implementation of wcrtomb on top of wctomb() supports only
+ stateless encodings. ps must be in the initial state. */
+ if (ps != NULL && !mbsinit (ps))
+ {
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+ if (s == NULL)
+ /* We know the NUL wide character corresponds to the NUL character. */
+ return 1;
+ else
+ {
+ int ret = wctomb (s, wc);
+
+ if (ret >= 0)
+ return ret;
+ else
+ {
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+ }
+}
diff --git a/gnulib/lib/wcscasecmp-impl.h b/gnulib/lib/wcscasecmp-impl.h
new file mode 100644
index 0000000..8c716fa
--- /dev/null
+++ b/gnulib/lib/wcscasecmp-impl.h
@@ -0,0 +1,32 @@
+/* Compare two wide strings ignoring case.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcscasecmp (const wchar_t *s1, const wchar_t *s2)
+{
+ for (;;)
+ {
+ wchar_t wc1 = towlower (*s1++);
+ wchar_t wc2 = towlower (*s2++);
+ if (wc1 != (wchar_t)'\0' && wc1 == wc2)
+ continue;
+ /* Note that wc1 and wc2 each have at most 31 bits. */
+ return (int)wc1 - (int)wc2;
+ /* > 0 if wc1 > wc2, < 0 if wc1 < wc2,
+ = 0 if wc1 and wc2 are both '\0'. */
+ }
+}
diff --git a/gnulib/lib/wcscasecmp.c b/gnulib/lib/wcscasecmp.c
new file mode 100644
index 0000000..f3796e0
--- /dev/null
+++ b/gnulib/lib/wcscasecmp.c
@@ -0,0 +1,25 @@
+/* Compare two wide strings ignoring case.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <wctype.h>
+
+#include "wcscasecmp-impl.h"
diff --git a/gnulib/lib/wcscat-impl.h b/gnulib/lib/wcscat-impl.h
new file mode 100644
index 0000000..7f92c56
--- /dev/null
+++ b/gnulib/lib/wcscat-impl.h
@@ -0,0 +1,26 @@
+/* Concatenate two wide strings.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcscat (wchar_t *dest, const wchar_t *src)
+{
+ wchar_t *destptr = dest + wcslen (dest);
+
+ for (; (*destptr = *src) != (wchar_t)'\0'; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/wcscat.c b/gnulib/lib/wcscat.c
new file mode 100644
index 0000000..f0894f7
--- /dev/null
+++ b/gnulib/lib/wcscat.c
@@ -0,0 +1,23 @@
+/* Concatenate two wide strings.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcscat-impl.h"
diff --git a/gnulib/lib/wcschr-impl.h b/gnulib/lib/wcschr-impl.h
new file mode 100644
index 0000000..2d146d3
--- /dev/null
+++ b/gnulib/lib/wcschr-impl.h
@@ -0,0 +1,32 @@
+/* Search wide string for a wide character.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcschr (const wchar_t *wcs, wchar_t wc)
+{
+ for (;; wcs++)
+ {
+ if (*wcs == wc)
+ break;
+ if (*wcs == (wchar_t)'\0')
+ goto notfound;
+ }
+ return (wchar_t *) wcs;
+
+ notfound:
+ return NULL;
+}
diff --git a/gnulib/lib/wcschr.c b/gnulib/lib/wcschr.c
new file mode 100644
index 0000000..988b897
--- /dev/null
+++ b/gnulib/lib/wcschr.c
@@ -0,0 +1,23 @@
+/* Search wide string for a wide character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcschr-impl.h"
diff --git a/gnulib/lib/wcscmp-impl.h b/gnulib/lib/wcscmp-impl.h
new file mode 100644
index 0000000..1c384c6
--- /dev/null
+++ b/gnulib/lib/wcscmp-impl.h
@@ -0,0 +1,32 @@
+/* Compare two wide strings.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcscmp (const wchar_t *s1, const wchar_t *s2)
+{
+ for (;;)
+ {
+ wchar_t wc1 = *s1++;
+ wchar_t wc2 = *s2++;
+ if (wc1 != (wchar_t)'\0' && wc1 == wc2)
+ continue;
+ /* Note that wc1 and wc2 each have at most 31 bits. */
+ return (int)wc1 - (int)wc2;
+ /* > 0 if wc1 > wc2, < 0 if wc1 < wc2,
+ = 0 if wc1 and wc2 are both '\0'. */
+ }
+}
diff --git a/gnulib/lib/wcscmp.c b/gnulib/lib/wcscmp.c
new file mode 100644
index 0000000..9a73a25
--- /dev/null
+++ b/gnulib/lib/wcscmp.c
@@ -0,0 +1,23 @@
+/* Compare two wide strings.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcscmp-impl.h"
diff --git a/gnulib/lib/wcscoll-impl.h b/gnulib/lib/wcscoll-impl.h
new file mode 100644
index 0000000..01adcc3
--- /dev/null
+++ b/gnulib/lib/wcscoll-impl.h
@@ -0,0 +1,111 @@
+/* Compare two wide strings using the current locale.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcscoll (const wchar_t *s1, const wchar_t *s2)
+{
+ char mbbuf1[1024];
+ char mbbuf2[1024];
+ char *mbs1;
+ char *mbs2;
+
+ {
+ int saved_errno = errno;
+
+ /* Convert s1 to a multibyte string, trying to avoid malloc(). */
+ {
+ size_t ret;
+
+ ret = wcstombs (mbbuf1, s1, sizeof (mbbuf1));
+ if (ret == (size_t)-1)
+ goto failed1;
+ if (ret < sizeof (mbbuf1))
+ mbs1 = mbbuf1;
+ else
+ {
+ size_t need = wcstombs (NULL, s1, 0);
+ if (need == (size_t)-1)
+ goto failed1;
+ mbs1 = (char *) malloc (need + 1);
+ if (mbs1 == NULL)
+ goto out_of_memory1;
+ ret = wcstombs (mbs1, s1, need + 1);
+ if (ret != need)
+ abort ();
+ }
+ }
+
+ /* Convert s2 to a multibyte string, trying to avoid malloc(). */
+ {
+ size_t ret;
+
+ ret = wcstombs (mbbuf2, s2, sizeof (mbbuf2));
+ if (ret == (size_t)-1)
+ goto failed2;
+ if (ret < sizeof (mbbuf2))
+ mbs2 = mbbuf2;
+ else
+ {
+ size_t need = wcstombs (NULL, s2, 0);
+ if (need == (size_t)-1)
+ goto failed2;
+ mbs2 = (char *) malloc (need + 1);
+ if (mbs2 == NULL)
+ goto out_of_memory2;
+ ret = wcstombs (mbs2, s2, need + 1);
+ if (ret != need)
+ abort ();
+ }
+ }
+
+ /* No error so far. */
+ errno = saved_errno;
+ }
+
+ /* Compare the two multibyte strings. */
+ {
+ int result = strcoll (mbs1, mbs2);
+
+ if (mbs1 != mbbuf1)
+ {
+ int saved_errno = errno;
+ free (mbs1);
+ errno = saved_errno;
+ }
+ if (mbs2 != mbbuf2)
+ {
+ int saved_errno = errno;
+ free (mbs2);
+ errno = saved_errno;
+ }
+ return result;
+ }
+
+ out_of_memory2:
+ if (mbs1 != mbbuf1)
+ free (mbs1);
+ out_of_memory1:
+ errno = ENOMEM;
+ return 0;
+
+ failed2:
+ if (mbs1 != mbbuf1)
+ free (mbs1);
+ failed1:
+ errno = EILSEQ;
+ return 0;
+}
diff --git a/gnulib/lib/wcscoll.c b/gnulib/lib/wcscoll.c
new file mode 100644
index 0000000..4605c5b
--- /dev/null
+++ b/gnulib/lib/wcscoll.c
@@ -0,0 +1,27 @@
+/* Compare two wide strings using the current locale.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "wcscoll-impl.h"
diff --git a/gnulib/lib/wcscpy-impl.h b/gnulib/lib/wcscpy-impl.h
new file mode 100644
index 0000000..cdc4bcc
--- /dev/null
+++ b/gnulib/lib/wcscpy-impl.h
@@ -0,0 +1,26 @@
+/* Copy a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcscpy (wchar_t *dest, const wchar_t *src)
+{
+ wchar_t *destptr = dest;
+
+ for (; (*destptr = *src) != (wchar_t)'\0'; src++, destptr++)
+ ;
+ return dest;
+}
diff --git a/gnulib/lib/wcscpy.c b/gnulib/lib/wcscpy.c
new file mode 100644
index 0000000..136a493
--- /dev/null
+++ b/gnulib/lib/wcscpy.c
@@ -0,0 +1,23 @@
+/* Copy a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcscpy-impl.h"
diff --git a/gnulib/lib/wcscspn-impl.h b/gnulib/lib/wcscspn-impl.h
new file mode 100644
index 0000000..0c6452f
--- /dev/null
+++ b/gnulib/lib/wcscspn-impl.h
@@ -0,0 +1,47 @@
+/* Search a wide string for any of a set of wide characters.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcscspn (const wchar_t *wcs, const wchar_t *reject)
+{
+ /* Optimize two cases. */
+ if (reject[0] == (wchar_t)'\0')
+ return wcslen (wcs);
+
+ if (reject[1] == (wchar_t)'\0')
+ {
+ wchar_t wc = reject[0];
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (*ptr == wc)
+ break;
+ }
+ return ptr - wcs;
+ }
+
+ /* General case. */
+ {
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (wcschr (reject, *ptr))
+ break;
+ }
+ return ptr - wcs;
+ }
+}
diff --git a/gnulib/lib/wcscspn.c b/gnulib/lib/wcscspn.c
new file mode 100644
index 0000000..3a2f33a
--- /dev/null
+++ b/gnulib/lib/wcscspn.c
@@ -0,0 +1,23 @@
+/* Search a wide string for any of a set of wide characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcscspn-impl.h"
diff --git a/gnulib/lib/wcsdup-impl.h b/gnulib/lib/wcsdup-impl.h
new file mode 100644
index 0000000..f721ca1
--- /dev/null
+++ b/gnulib/lib/wcsdup-impl.h
@@ -0,0 +1,29 @@
+/* Duplicate a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcsdup (const wchar_t *s)
+{
+ size_t n = wcslen (s) + 1;
+ wchar_t *copy = (wchar_t *) malloc (n * sizeof (wchar_t));
+ if (copy != NULL)
+ return wmemcpy (copy, s, n);
+ else
+ /* The glibc documentation does not say that errno should be set to ENOMEM
+ here. */
+ return NULL;
+}
diff --git a/gnulib/lib/wcsdup.c b/gnulib/lib/wcsdup.c
new file mode 100644
index 0000000..b55e630
--- /dev/null
+++ b/gnulib/lib/wcsdup.c
@@ -0,0 +1,25 @@
+/* Duplicate a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdlib.h>
+
+#include "wcsdup-impl.h"
diff --git a/gnulib/lib/wcslen-impl.h b/gnulib/lib/wcslen-impl.h
new file mode 100644
index 0000000..6dbe927
--- /dev/null
+++ b/gnulib/lib/wcslen-impl.h
@@ -0,0 +1,26 @@
+/* Determine the length of a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t)'\0'; ptr++)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/wcslen.c b/gnulib/lib/wcslen.c
new file mode 100644
index 0000000..23132dd
--- /dev/null
+++ b/gnulib/lib/wcslen.c
@@ -0,0 +1,23 @@
+/* Determine the length of a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcslen-impl.h"
diff --git a/gnulib/lib/wcsncasecmp-impl.h b/gnulib/lib/wcsncasecmp-impl.h
new file mode 100644
index 0000000..234f27a
--- /dev/null
+++ b/gnulib/lib/wcsncasecmp-impl.h
@@ -0,0 +1,36 @@
+/* Compare two wide strings ignoring case.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcsncasecmp (const wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ wchar_t wc1 = towlower (*s1++);
+ wchar_t wc2 = towlower (*s2++);
+ if (wc1 != (wchar_t)'\0' && wc1 == wc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that wc1 and wc2 each have at most 31 bits. */
+ return (int)wc1 - (int)wc2;
+ /* > 0 if wc1 > wc2, < 0 if wc1 < wc2,
+ = 0 if wc1 and wc2 are both '\0'. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/wcsncasecmp.c b/gnulib/lib/wcsncasecmp.c
new file mode 100644
index 0000000..d2fafdd
--- /dev/null
+++ b/gnulib/lib/wcsncasecmp.c
@@ -0,0 +1,25 @@
+/* Compare two wide strings ignoring case.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <wctype.h>
+
+#include "wcsncasecmp-impl.h"
diff --git a/gnulib/lib/wcsncat-impl.h b/gnulib/lib/wcsncat-impl.h
new file mode 100644
index 0000000..23b7c83
--- /dev/null
+++ b/gnulib/lib/wcsncat-impl.h
@@ -0,0 +1,28 @@
+/* Append part of a wide string to a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcsncat (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ wchar_t *destptr = dest + wcslen (dest);
+
+ for (; n > 0 && (*destptr = *src) != (wchar_t)'\0'; src++, destptr++, n--)
+ ;
+ if (n == 0)
+ *destptr = (wchar_t)'\0';
+ return dest;
+}
diff --git a/gnulib/lib/wcsncat.c b/gnulib/lib/wcsncat.c
new file mode 100644
index 0000000..855fbee
--- /dev/null
+++ b/gnulib/lib/wcsncat.c
@@ -0,0 +1,23 @@
+/* Append part of a wide string to a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsncat-impl.h"
diff --git a/gnulib/lib/wcsncmp-impl.h b/gnulib/lib/wcsncmp-impl.h
new file mode 100644
index 0000000..72f8c63
--- /dev/null
+++ b/gnulib/lib/wcsncmp-impl.h
@@ -0,0 +1,36 @@
+/* Compare two wide strings.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcsncmp (const wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ wchar_t wc1 = *s1++;
+ wchar_t wc2 = *s2++;
+ if (wc1 != (wchar_t)'\0' && wc1 == wc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that wc1 and wc2 each have at most 31 bits. */
+ return (int)wc1 - (int)wc2;
+ /* > 0 if wc1 > wc2, < 0 if wc1 < wc2,
+ = 0 if wc1 and wc2 are both '\0'. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/wcsncmp.c b/gnulib/lib/wcsncmp.c
new file mode 100644
index 0000000..b2bfa8e
--- /dev/null
+++ b/gnulib/lib/wcsncmp.c
@@ -0,0 +1,23 @@
+/* Compare two wide strings.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsncmp-impl.h"
diff --git a/gnulib/lib/wcsncpy-impl.h b/gnulib/lib/wcsncpy-impl.h
new file mode 100644
index 0000000..63925bb
--- /dev/null
+++ b/gnulib/lib/wcsncpy-impl.h
@@ -0,0 +1,32 @@
+/* Copy a size-bounded wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcsncpy (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ wchar_t *destptr = dest;
+
+ for (; n > 0 && (*destptr = *src) != (wchar_t)'\0'; src++, destptr++, n--)
+ ;
+
+ /* This behavior is rarely useful, but it is specified by the ISO C
+ standard. */
+ for (; n > 0; n--)
+ *destptr++ = (wchar_t)'\0';
+
+ return dest;
+}
diff --git a/gnulib/lib/wcsncpy.c b/gnulib/lib/wcsncpy.c
new file mode 100644
index 0000000..e97e40b
--- /dev/null
+++ b/gnulib/lib/wcsncpy.c
@@ -0,0 +1,23 @@
+/* Copy a size-bounded wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsncpy-impl.h"
diff --git a/gnulib/lib/wcsnlen-impl.h b/gnulib/lib/wcsnlen-impl.h
new file mode 100644
index 0000000..6cf4d07
--- /dev/null
+++ b/gnulib/lib/wcsnlen-impl.h
@@ -0,0 +1,26 @@
+/* Determine the length of a size-bounded wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcsnlen (const wchar_t *s, size_t maxlen)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != (wchar_t)'\0'; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
diff --git a/gnulib/lib/wcsnlen.c b/gnulib/lib/wcsnlen.c
new file mode 100644
index 0000000..1232c1f
--- /dev/null
+++ b/gnulib/lib/wcsnlen.c
@@ -0,0 +1,23 @@
+/* Determine the length of a size-bounded wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsnlen-impl.h"
diff --git a/gnulib/lib/wcsnrtombs-impl.h b/gnulib/lib/wcsnrtombs-impl.h
new file mode 100644
index 0000000..5ba63cc
--- /dev/null
+++ b/gnulib/lib/wcsnrtombs-impl.h
@@ -0,0 +1,90 @@
+/* Convert wide string to string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcsnrtombs (char *dest, const wchar_t **srcp, size_t srclen, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+ {
+ const wchar_t *src = *srcp;
+ size_t cur_max = MB_CUR_MAX;
+ char buf[64];
+
+ if (!(cur_max <= sizeof (buf)))
+ abort ();
+
+ if (dest != NULL)
+ {
+ char *destptr = dest;
+
+ for (; srclen > 0 && len > 0; src++, srclen--)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (len >= cur_max ? destptr : buf, wc, ps);
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (!(ret <= cur_max))
+ abort ();
+ if (len < ret)
+ break;
+ if (len < cur_max)
+ memcpy (destptr, buf, ret);
+ if (wc == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ destptr += ret;
+ len -= ret;
+ }
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (; srclen > 0; src++, srclen--)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (buf, wc, &state);
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (wc == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ totalcount += ret;
+ }
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/wcsnrtombs.c b/gnulib/lib/wcsnrtombs.c
new file mode 100644
index 0000000..a92207c
--- /dev/null
+++ b/gnulib/lib/wcsnrtombs.c
@@ -0,0 +1,30 @@
+/* Convert wide string to string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+extern mbstate_t _gl_wcsrtombs_state;
+
+#include "wcsnrtombs-impl.h"
diff --git a/gnulib/lib/wcspbrk-impl.h b/gnulib/lib/wcspbrk-impl.h
new file mode 100644
index 0000000..3862e7a
--- /dev/null
+++ b/gnulib/lib/wcspbrk-impl.h
@@ -0,0 +1,47 @@
+/* Search a wide string for any of a set of wide characters.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcspbrk (const wchar_t *wcs, const wchar_t *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == (wchar_t)'\0')
+ return NULL;
+
+ if (accept[1] == (wchar_t)'\0')
+ {
+ wchar_t wc = accept[0];
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (*ptr == wc)
+ return (wchar_t *) ptr;
+ }
+ return NULL;
+ }
+
+ /* General case. */
+ {
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (wcschr (accept, *ptr))
+ return (wchar_t *) ptr;
+ }
+ return NULL;
+ }
+}
diff --git a/gnulib/lib/wcspbrk.c b/gnulib/lib/wcspbrk.c
new file mode 100644
index 0000000..2ed7602
--- /dev/null
+++ b/gnulib/lib/wcspbrk.c
@@ -0,0 +1,23 @@
+/* Search a wide string for any of a set of wide characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcspbrk-impl.h"
diff --git a/gnulib/lib/wcsrchr-impl.h b/gnulib/lib/wcsrchr-impl.h
new file mode 100644
index 0000000..db3ba06
--- /dev/null
+++ b/gnulib/lib/wcsrchr-impl.h
@@ -0,0 +1,33 @@
+/* Search wide string for a wide character.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcsrchr (const wchar_t *wcs, wchar_t wc)
+{
+ /* Calling wcslen and then searching from the other end would cause more
+ memory accesses. Avoid that, at the cost of a few more comparisons. */
+ wchar_t *result = NULL;
+
+ for (;; wcs++)
+ {
+ if (*wcs == wc)
+ result = (wchar_t *) wcs;
+ if (*wcs == (wchar_t)'\0')
+ break;
+ }
+ return result;
+}
diff --git a/gnulib/lib/wcsrchr.c b/gnulib/lib/wcsrchr.c
new file mode 100644
index 0000000..a717801
--- /dev/null
+++ b/gnulib/lib/wcsrchr.c
@@ -0,0 +1,23 @@
+/* Search wide string for a wide character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsrchr-impl.h"
diff --git a/gnulib/lib/wcsrtombs-impl.h b/gnulib/lib/wcsrtombs-impl.h
new file mode 100644
index 0000000..a0a522e
--- /dev/null
+++ b/gnulib/lib/wcsrtombs-impl.h
@@ -0,0 +1,90 @@
+/* Convert wide string to string.
+ Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+ {
+ const wchar_t *src = *srcp;
+ size_t cur_max = MB_CUR_MAX;
+ char buf[64];
+
+ if (!(cur_max <= sizeof (buf)))
+ abort ();
+
+ if (dest != NULL)
+ {
+ char *destptr = dest;
+
+ for (; len > 0; src++)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (len >= cur_max ? destptr : buf, wc, ps);
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (!(ret <= cur_max))
+ abort ();
+ if (len < ret)
+ break;
+ if (len < cur_max)
+ memcpy (destptr, buf, ret);
+ if (wc == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ destptr += ret;
+ len -= ret;
+ }
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (;; src++)
+ {
+ wchar_t wc = *src;
+ size_t ret = wcrtomb (buf, wc, &state);
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (wc == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ totalcount += ret;
+ }
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/gnulib/lib/wcsrtombs-state.c b/gnulib/lib/wcsrtombs-state.c
new file mode 100644
index 0000000..e0e3e85
--- /dev/null
+++ b/gnulib/lib/wcsrtombs-state.c
@@ -0,0 +1,37 @@
+/* Convert wide string to string.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+/* Internal state used by the functions wcsrtombs() and wcsnrtombs(). */
+mbstate_t _gl_wcsrtombs_state
+/* The state must initially be in the "initial state"; so, zero-initialize it.
+ On most systems, putting it into BSS is sufficient. Not so on MacOS X 10.3,
+ see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
+ When it needs an initializer, use 0 or {0} as initializer? 0 only works
+ when mbstate_t is a scalar type (such as when gnulib defines it, or on
+ AIX, IRIX, mingw). {0} works as an initializer in all cases: for a struct
+ or union type, but also for a scalar type (ISO C 99, 6.7.8.(11)). */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ /* Use braces, to be on the safe side. */
+ = { 0 }
+#endif
+ ;
diff --git a/gnulib/lib/wcsrtombs.c b/gnulib/lib/wcsrtombs.c
new file mode 100644
index 0000000..ebbca78
--- /dev/null
+++ b/gnulib/lib/wcsrtombs.c
@@ -0,0 +1,56 @@
+/* Convert wide string to string.
+ Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+extern mbstate_t _gl_wcsrtombs_state;
+
+#if HAVE_WCSRTOMBS && !WCSRTOMBS_TERMINATION_BUG && !defined GNULIB_defined_mbstate_t
+/* Override the system's wcsrtombs() function. */
+
+# undef wcsrtombs
+
+size_t
+rpl_wcsrtombs (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &_gl_wcsrtombs_state;
+# if WCSRTOMBS_NULL_ARG_BUG
+ if (dest == NULL)
+ {
+ const wchar_t *temp_src = *srcp;
+
+ return wcsrtombs (NULL, &temp_src, (size_t)-1, ps);
+ }
+ else
+# endif
+ return wcsrtombs (dest, srcp, len, ps);
+}
+
+#else
+/* Implement wcsrtombs on top of wcrtomb(). */
+
+# include <errno.h>
+# include <stdlib.h>
+# include <string.h>
+
+# include "wcsrtombs-impl.h"
+
+#endif
diff --git a/gnulib/lib/wcsspn-impl.h b/gnulib/lib/wcsspn-impl.h
new file mode 100644
index 0000000..5d13b92
--- /dev/null
+++ b/gnulib/lib/wcsspn-impl.h
@@ -0,0 +1,47 @@
+/* Advance in a wide string, skipping any of a set of wide characters.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcsspn (const wchar_t *wcs, const wchar_t *accept)
+{
+ /* Optimize two cases. */
+ if (accept[0] == (wchar_t)'\0')
+ return 0;
+
+ if (accept[1] == (wchar_t)'\0')
+ {
+ wchar_t wc = accept[0];
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (*ptr != wc)
+ break;
+ }
+ return ptr - wcs;
+ }
+
+ /* General case. */
+ {
+ const wchar_t *ptr = wcs;
+ for (; *ptr != (wchar_t)'\0'; ptr++)
+ {
+ if (!wcschr (accept, *ptr))
+ break;
+ }
+ return ptr - wcs;
+ }
+}
diff --git a/gnulib/lib/wcsspn.c b/gnulib/lib/wcsspn.c
new file mode 100644
index 0000000..1cabf8d
--- /dev/null
+++ b/gnulib/lib/wcsspn.c
@@ -0,0 +1,23 @@
+/* Advance in a wide string, skipping any of a set of wide characters.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsspn-impl.h"
diff --git a/gnulib/lib/wcsstr-impl.h b/gnulib/lib/wcsstr-impl.h
new file mode 100644
index 0000000..f3fb3fb
--- /dev/null
+++ b/gnulib/lib/wcsstr-impl.h
@@ -0,0 +1,51 @@
+/* Locate a substring in a wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcsstr (const wchar_t *haystack, const wchar_t *needle)
+{
+ wchar_t n = needle[0];
+
+ /* Is needle empty? */
+ if (n == (wchar_t)'\0')
+ return (wchar_t *) haystack;
+
+ /* Is needle nearly empty? */
+ if (needle[1] == (wchar_t)'\0')
+ return wcschr (haystack, n);
+
+ /* Search for needle's first character. */
+ for (; *haystack != (wchar_t)'\0'; haystack++)
+ {
+ if (*haystack == n)
+ {
+ /* Compare with needle's remaining characters. */
+ const wchar_t *hptr = haystack + 1;
+ const wchar_t *nptr = needle + 1;
+ for (;;)
+ {
+ if (*hptr != *nptr)
+ break;
+ hptr++; nptr++;
+ if (*nptr == (wchar_t)'\0')
+ return (wchar_t *) haystack;
+ }
+ }
+ }
+
+ return NULL;
+}
diff --git a/gnulib/lib/wcsstr.c b/gnulib/lib/wcsstr.c
new file mode 100644
index 0000000..3a63447
--- /dev/null
+++ b/gnulib/lib/wcsstr.c
@@ -0,0 +1,23 @@
+/* Locate a substring in a wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcsstr-impl.h"
diff --git a/gnulib/lib/wcstok-impl.h b/gnulib/lib/wcstok-impl.h
new file mode 100644
index 0000000..afb9046
--- /dev/null
+++ b/gnulib/lib/wcstok-impl.h
@@ -0,0 +1,50 @@
+/* Split a wide string into tokens.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wcstok (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr)
+{
+ if (wcs == NULL)
+ {
+ wcs = *ptr;
+ if (wcs == NULL)
+ return NULL; /* reminder that end of token sequence has been reached */
+ }
+
+ /* Skip leading delimiters. */
+ wcs += wcsspn (wcs, delim);
+
+ /* Found a token? */
+ if (*wcs == (wchar_t)'\0')
+ {
+ *ptr = NULL;
+ return NULL;
+ }
+ /* Move past the token. */
+ {
+ wchar_t *token_end = wcspbrk (wcs, delim);
+ if (token_end)
+ {
+ /* NUL-terminate the token. */
+ *token_end = (wchar_t)'\0';
+ *ptr = token_end + 1;
+ }
+ else
+ *ptr = NULL;
+ }
+ return wcs;
+}
diff --git a/gnulib/lib/wcstok.c b/gnulib/lib/wcstok.c
new file mode 100644
index 0000000..e61a3ff
--- /dev/null
+++ b/gnulib/lib/wcstok.c
@@ -0,0 +1,23 @@
+/* Split a wide string into tokens.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wcstok-impl.h"
diff --git a/gnulib/lib/wcswidth-impl.h b/gnulib/lib/wcswidth-impl.h
new file mode 100644
index 0000000..865390c
--- /dev/null
+++ b/gnulib/lib/wcswidth-impl.h
@@ -0,0 +1,43 @@
+/* Determine number of screen columns needed for a size-bounded wide string.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wcswidth (const wchar_t *s, size_t n)
+{
+ int count = 0;
+ for (; n > 0; s++, n--)
+ {
+ wchar_t c = *s;
+ if (c == (wchar_t)'\0')
+ break;
+ {
+ int width = wcwidth (c);
+ if (width < 0)
+ goto found_nonprinting;
+ if (width > INT_MAX - count)
+ goto overflow;
+ count += width;
+ }
+ }
+ return count;
+
+ found_nonprinting:
+ return -1;
+
+ overflow:
+ return INT_MAX;
+}
diff --git a/gnulib/lib/wcswidth.c b/gnulib/lib/wcswidth.c
new file mode 100644
index 0000000..cdedf73
--- /dev/null
+++ b/gnulib/lib/wcswidth.c
@@ -0,0 +1,25 @@
+/* Determine number of screen columns needed for a size-bounded wide string.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <limits.h>
+
+#include "wcswidth-impl.h"
diff --git a/gnulib/lib/wcsxfrm-impl.h b/gnulib/lib/wcsxfrm-impl.h
new file mode 100644
index 0000000..ba91402
--- /dev/null
+++ b/gnulib/lib/wcsxfrm-impl.h
@@ -0,0 +1,96 @@
+/* Transform wide string for comparison using the current locale.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+size_t
+wcsxfrm (wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ char mbbuf2[1024];
+ char *mbs2;
+
+ {
+ int saved_errno = errno;
+ size_t result;
+
+ /* Convert s2 to a multibyte string, trying to avoid malloc(). */
+ {
+ size_t ret;
+
+ ret = wcstombs (mbbuf2, s2, sizeof (mbbuf2));
+ if (ret == (size_t)-1)
+ goto failed;
+ if (ret < sizeof (mbbuf2))
+ mbs2 = mbbuf2;
+ else
+ {
+ size_t need = wcstombs (NULL, s2, 0);
+ if (need == (size_t)-1)
+ goto failed;
+ mbs2 = (char *) malloc (need + 1);
+ if (mbs2 == NULL)
+ goto out_of_memory;
+ ret = wcstombs (mbs2, s2, need + 1);
+ if (ret != need)
+ abort ();
+ }
+ }
+
+ /* Transform the multibyte string. */
+ errno = 0;
+ result = strxfrm ((char *)s1, mbs2, n);
+ if (errno != 0)
+ {
+ /* An error occurred. */
+ if (mbs2 != mbbuf2)
+ {
+ saved_errno = errno;
+ free (mbs2);
+ errno = saved_errno;
+ }
+ return 0;
+ }
+
+ if (result < n)
+ {
+ /* Convert the result by mapping char[] -> wchar_t[].
+ Since strcmp() compares the elements as 'unsigned char' values,
+ whereas wcscmp() compares the elements as 'wchar_t' values, we need
+ to map 1 'unsigned char' to 1 'wchar_t'. (We could also map 2
+ consecutive 'unsigned char' values to 1 'wchar_t' value, but this is
+ not needed. */
+ wchar_t *wcp = s1 + n;
+ char *cp = (char *)s1 + n;
+
+ while (wcp > s1)
+ *--wcp = (wchar_t) (unsigned char) *--cp;
+ }
+
+ if (mbs2 != mbbuf2)
+ free (mbs2);
+
+ /* No error. */
+ errno = saved_errno;
+ return result;
+ }
+
+ out_of_memory:
+ errno = ENOMEM;
+ return 0;
+
+ failed:
+ errno = EILSEQ;
+ return 0;
+}
diff --git a/gnulib/lib/wcsxfrm.c b/gnulib/lib/wcsxfrm.c
new file mode 100644
index 0000000..7815a0f
--- /dev/null
+++ b/gnulib/lib/wcsxfrm.c
@@ -0,0 +1,27 @@
+/* Transform wide string for comparison using the current locale.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "wcsxfrm-impl.h"
diff --git a/gnulib/lib/wctob.c b/gnulib/lib/wctob.c
new file mode 100644
index 0000000..cc26afc
--- /dev/null
+++ b/gnulib/lib/wctob.c
@@ -0,0 +1,38 @@
+/* Convert wide character to unibyte character.
+ Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+wctob (wint_t wc)
+{
+ char buf[64];
+
+ if (!(MB_CUR_MAX <= sizeof (buf)))
+ abort ();
+ /* Handle the case where WEOF is a value that does not fit in a wchar_t. */
+ if (wc == (wchar_t)wc)
+ if (wctomb (buf, (wchar_t)wc) == 1)
+ return (unsigned char) buf[0];
+ return EOF;
+}
diff --git a/gnulib/lib/wctomb-impl.h b/gnulib/lib/wctomb-impl.h
new file mode 100644
index 0000000..4e95de6
--- /dev/null
+++ b/gnulib/lib/wctomb-impl.h
@@ -0,0 +1,34 @@
+/* Convert wide character to multibyte character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wctomb (char *s, wchar_t wc)
+{
+ if (s == NULL)
+ return 0;
+ else
+ {
+ mbstate_t state;
+ size_t result;
+
+ memset (&state, 0, sizeof (mbstate_t));
+ result = wcrtomb (s, wc, &state);
+ if (result == (size_t)-1)
+ return -1;
+ return result;
+ }
+}
diff --git a/gnulib/lib/wctomb.c b/gnulib/lib/wctomb.c
new file mode 100644
index 0000000..889a3c6
--- /dev/null
+++ b/gnulib/lib/wctomb.c
@@ -0,0 +1,25 @@
+/* Convert wide character to multibyte character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <string.h>
+#include <wchar.h>
+
+#include "wctomb-impl.h"
diff --git a/gnulib/lib/wctrans-impl.h b/gnulib/lib/wctrans-impl.h
new file mode 100644
index 0000000..d099f8b
--- /dev/null
+++ b/gnulib/lib/wctrans-impl.h
@@ -0,0 +1,37 @@
+/* Get descriptor for a wide character case conversion.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wctrans_t
+wctrans (const char *name)
+{
+ if (name[0] == 't'
+ && name[1] == 'o')
+ switch (name[2])
+ {
+ case 'l':
+ if (strcmp (name + 3, "ower") == 0)
+ return (wctrans_t) towlower;
+ break;
+ case 'u':
+ if (strcmp (name + 3, "pper") == 0)
+ return (wctrans_t) towupper;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/wctrans.c b/gnulib/lib/wctrans.c
new file mode 100644
index 0000000..1ce6d6f
--- /dev/null
+++ b/gnulib/lib/wctrans.c
@@ -0,0 +1,25 @@
+/* Get descriptor for a wide character case conversion.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+#include <string.h>
+
+#include "wctrans-impl.h"
diff --git a/gnulib/lib/wctype-impl.h b/gnulib/lib/wctype-impl.h
new file mode 100644
index 0000000..e2c3222
--- /dev/null
+++ b/gnulib/lib/wctype-impl.h
@@ -0,0 +1,96 @@
+/* Get descriptor for a wide character property.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wctype_t
+wctype (const char* name)
+{
+ switch (name[0])
+ {
+ case 'a':
+ switch (name[1])
+ {
+ case 'l':
+ switch (name[2])
+ {
+ case 'n':
+ if (strcmp (name + 3, "um") == 0)
+ return (wctype_t) iswalnum;
+ break;
+ case 'p':
+ if (strcmp (name + 3, "ha") == 0)
+ return (wctype_t) iswalpha;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 'b':
+ if (strcmp (name + 1, "lank") == 0)
+ return (wctype_t) iswblank;
+ break;
+ case 'c':
+ if (strcmp (name + 1, "ntrl") == 0)
+ return (wctype_t) iswcntrl;
+ break;
+ case 'd':
+ if (strcmp (name + 1, "igit") == 0)
+ return (wctype_t) iswdigit;
+ break;
+ case 'g':
+ if (strcmp (name + 1, "raph") == 0)
+ return (wctype_t) iswgraph;
+ break;
+ case 'l':
+ if (strcmp (name + 1, "ower") == 0)
+ return (wctype_t) iswlower;
+ break;
+ case 'p':
+ switch (name[1])
+ {
+ case 'r':
+ if (strcmp (name + 2, "int") == 0)
+ return (wctype_t) iswprint;
+ break;
+ case 'u':
+ if (strcmp (name + 2, "nct") == 0)
+ return (wctype_t) iswpunct;
+ break;
+ default:
+ break;
+ }
+ break;
+ case 's':
+ if (strcmp (name + 1, "pace") == 0)
+ return (wctype_t) iswspace;
+ break;
+ case 'u':
+ if (strcmp (name + 1, "pper") == 0)
+ return (wctype_t) iswupper;
+ break;
+ case 'x':
+ if (strcmp (name + 1, "digit") == 0)
+ return (wctype_t) iswxdigit;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/wctype.c b/gnulib/lib/wctype.c
new file mode 100644
index 0000000..968b36f
--- /dev/null
+++ b/gnulib/lib/wctype.c
@@ -0,0 +1,25 @@
+/* Get descriptor for a wide character property.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+#include <string.h>
+
+#include "wctype-impl.h"
diff --git a/gnulib/lib/wctype.in.h b/gnulib/lib/wctype.in.h
new file mode 100644
index 0000000..641e991
--- /dev/null
+++ b/gnulib/lib/wctype.in.h
@@ -0,0 +1,499 @@
+/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
+
+ Copyright (C) 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Bruno Haible and Paul Eggert. */
+
+/*
+ * ISO C 99 <wctype.h> for platforms that lack it.
+ * <http://www.opengroup.org/susv3xbd/wctype.h.html>
+ *
+ * iswctype, towctrans, towlower, towupper, wctrans, wctype,
+ * wctrans_t, and wctype_t are not yet implemented.
+ */
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_WINT_T@
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
+ Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+ included before <wchar.h>. */
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+# include <wchar.h>
+#endif
+
+/* Include the original <wctype.h> if it exists.
+ BeOS 5 has the functions but no <wctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCTYPE_H@
+# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+#define _@GUARD_PREFIX@_WCTYPE_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
+ #defines a number of identifiers in the application namespace. Revert
+ these #defines. */
+#ifdef __sun
+# undef multibyte
+# undef eucw1
+# undef eucw2
+# undef eucw3
+# undef scrw1
+# undef scrw2
+# undef scrw3
+#endif
+
+/* Define wint_t and WEOF. (Also done in wchar.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* MSVC defines wint_t as 'unsigned short' in <crtdefs.h>.
+ This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
+ "unchanged by default argument promotions". Override it. */
+# if defined _MSC_VER
+# if !GNULIB_defined_wint_t
+# include <crtdefs.h>
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+#if !GNULIB_defined_wctype_functions
+
+/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
+ Linux libc5 has <wctype.h> and the functions but they are broken.
+ Assume all 11 functions (all isw* except iswblank) are implemented the
+ same way, or not at all. */
+# if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
+
+/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
+ undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
+ refer to system functions like _iswctype that are not in the
+ standard C library. Rather than try to get ancient buggy
+ implementations like this to work, just disable them. */
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+
+/* Linux libc5 has <wctype.h> and the functions but they are broken. */
+# if @REPLACE_ISWCNTRL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# endif
+# endif
+# if @REPLACE_TOWLOWER@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+# endif
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalnum
+# else
+iswalnum
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalpha
+# else
+iswalpha
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswblank
+# else
+iswblank
+# endif
+ (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswcntrl
+# else
+iswcntrl
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x1f) == 0 || wc == 0x7f;
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswdigit
+# else
+iswdigit
+# endif
+ (wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswgraph
+# else
+iswgraph
+# endif
+ (wint_t wc)
+{
+ return wc >= '!' && wc <= '~';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswlower
+# else
+iswlower
+# endif
+ (wint_t wc)
+{
+ return wc >= 'a' && wc <= 'z';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswprint
+# else
+iswprint
+# endif
+ (wint_t wc)
+{
+ return wc >= ' ' && wc <= '~';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswpunct
+# else
+iswpunct
+# endif
+ (wint_t wc)
+{
+ return (wc >= '!' && wc <= '~'
+ && !((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswspace
+# else
+iswspace
+# endif
+ (wint_t wc)
+{
+ return (wc == ' ' || wc == '\t'
+ || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswupper
+# else
+iswupper
+# endif
+ (wint_t wc)
+{
+ return wc >= 'A' && wc <= 'Z';
+}
+
+static inline int
+# if @REPLACE_ISWCNTRL@
+rpl_iswxdigit
+# else
+iswxdigit
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
+}
+
+static inline wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towlower
+# else
+towlower
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
+}
+
+static inline wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towupper
+# else
+towupper
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
+}
+
+# elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
+/* Only the iswblank function is missing. */
+
+# if @REPLACE_ISWBLANK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswblank rpl_iswblank
+# endif
+_GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+# endif
+
+# endif
+
+# if defined __MINGW32__
+
+/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
+ The functions towlower and towupper are implemented in the MSVCRT library
+ to take a wchar_t argument and return a wchar_t result. mingw declares
+ these functions to take a wint_t argument and return a wint_t result.
+ This means that:
+ 1. When the user passes an argument outside the range 0x0000..0xFFFF, the
+ function will look only at the lower 16 bits. This is allowed according
+ to POSIX.
+ 2. The return value is returned in the lower 16 bits of the result register.
+ The upper 16 bits are random: whatever happened to be in that part of the
+ result register. We need to fix this by adding a zero-extend from
+ wchar_t to wint_t after the call. */
+
+static inline wint_t
+rpl_towlower (wint_t wc)
+{
+ return (wint_t) (wchar_t) towlower (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# endif
+
+static inline wint_t
+rpl_towupper (wint_t wc)
+{
+ return (wint_t) (wchar_t) towupper (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towupper rpl_towupper
+# endif
+
+# endif /* __MINGW32__ */
+
+# define GNULIB_defined_wctype_functions 1
+#endif
+
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+#endif
+_GL_CXXALIASWARN (iswalnum);
+_GL_CXXALIASWARN (iswalpha);
+_GL_CXXALIASWARN (iswcntrl);
+_GL_CXXALIASWARN (iswdigit);
+_GL_CXXALIASWARN (iswgraph);
+_GL_CXXALIASWARN (iswlower);
+_GL_CXXALIASWARN (iswprint);
+_GL_CXXALIASWARN (iswpunct);
+_GL_CXXALIASWARN (iswspace);
+_GL_CXXALIASWARN (iswupper);
+_GL_CXXALIASWARN (iswxdigit);
+
+#if @GNULIB_ISWBLANK@
+# if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
+_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
+# endif
+_GL_CXXALIASWARN (iswblank);
+#endif
+
+#if !@HAVE_WCTYPE_T@
+# if !GNULIB_defined_wctype_t
+typedef void * wctype_t;
+# define GNULIB_defined_wctype_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character property. */
+#if @GNULIB_WCTYPE@
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
+_GL_CXXALIASWARN (wctype);
+#elif defined GNULIB_POSIXCHECK
+# undef wctype
+# if HAVE_RAW_DECL_WCTYPE
+_GL_WARN_ON_USE (wctype, "wctype is unportable - "
+ "use gnulib module wctype for portability");
+# endif
+#endif
+
+/* Test whether a wide character has a given property.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctype() function. */
+#if @GNULIB_ISWCTYPE@
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+# endif
+_GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+_GL_CXXALIASWARN (iswctype);
+#elif defined GNULIB_POSIXCHECK
+# undef iswctype
+# if HAVE_RAW_DECL_ISWCTYPE
+_GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
+ "use gnulib module iswctype for portability");
+# endif
+#endif
+
+#if @REPLACE_TOWLOWER@ || defined __MINGW32__
+_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
+#endif
+_GL_CXXALIASWARN (towlower);
+_GL_CXXALIASWARN (towupper);
+
+#if !@HAVE_WCTRANS_T@
+# if !GNULIB_defined_wctrans_t
+typedef void * wctrans_t;
+# define GNULIB_defined_wctrans_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character case conversion. */
+#if @GNULIB_WCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
+_GL_CXXALIASWARN (wctrans);
+#elif defined GNULIB_POSIXCHECK
+# undef wctrans
+# if HAVE_RAW_DECL_WCTRANS
+_GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
+ "use gnulib module wctrans for portability");
+# endif
+#endif
+
+/* Perform a given case conversion on a wide character.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctrans() function. */
+#if @GNULIB_TOWCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+# endif
+_GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+_GL_CXXALIASWARN (towctrans);
+#elif defined GNULIB_POSIXCHECK
+# undef towctrans
+# if HAVE_RAW_DECL_TOWCTRANS
+_GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
+ "use gnulib module towctrans for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
diff --git a/gnulib/lib/wcwidth.c b/gnulib/lib/wcwidth.c
new file mode 100644
index 0000000..a006ca7
--- /dev/null
+++ b/gnulib/lib/wcwidth.c
@@ -0,0 +1,50 @@
+/* Determine the number of screen columns needed for a character.
+ Copyright (C) 2006-2007, 2010-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+/* Get iswprint. */
+#include <wctype.h>
+
+#include "localcharset.h"
+#include "streq.h"
+#include "uniwidth.h"
+
+int
+wcwidth (wchar_t wc)
+#undef wcwidth
+{
+ /* In UTF-8 locales, use a Unicode aware width function. */
+ const char *encoding = locale_charset ();
+ if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0))
+ {
+ /* We assume that in a UTF-8 locale, a wide character is the same as a
+ Unicode character. */
+ return uc_width (wc, encoding);
+ }
+ else
+ {
+ /* Otherwise, fall back to the system's wcwidth function. */
+#if HAVE_WCWIDTH
+ return wcwidth (wc);
+#else
+ return wc == 0 ? 0 : iswprint (wc) ? 1 : -1;
+#endif
+ }
+}
diff --git a/gnulib/lib/wmemchr-impl.h b/gnulib/lib/wmemchr-impl.h
new file mode 100644
index 0000000..92fd7fd
--- /dev/null
+++ b/gnulib/lib/wmemchr-impl.h
@@ -0,0 +1,27 @@
+/* Search wide character array for a wide character.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wmemchr (const wchar_t *s, wchar_t c, size_t n)
+{
+ for (; n > 0; s++, n--)
+ {
+ if (*s == c)
+ return (wchar_t *) s;
+ }
+ return NULL;
+}
diff --git a/gnulib/lib/wmemchr.c b/gnulib/lib/wmemchr.c
new file mode 100644
index 0000000..53c891c
--- /dev/null
+++ b/gnulib/lib/wmemchr.c
@@ -0,0 +1,23 @@
+/* Search wide character array for a wide character.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemchr-impl.h"
diff --git a/gnulib/lib/wmemcmp-impl.h b/gnulib/lib/wmemcmp-impl.h
new file mode 100644
index 0000000..b677771
--- /dev/null
+++ b/gnulib/lib/wmemcmp-impl.h
@@ -0,0 +1,35 @@
+/* Compare wide character arrays.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+int
+wmemcmp (const wchar_t *s1, const wchar_t *s2, size_t n)
+{
+ for (; n > 0;)
+ {
+ wchar_t wc1 = *s1++;
+ wchar_t wc2 = *s2++;
+ if (wc1 == wc2)
+ {
+ n--;
+ continue;
+ }
+ /* Note that wc1 and wc2 each have at most 31 bits. */
+ return (int)wc1 - (int)wc2;
+ /* > 0 if wc1 > wc2, < 0 if wc1 < wc2. */
+ }
+ return 0;
+}
diff --git a/gnulib/lib/wmemcmp.c b/gnulib/lib/wmemcmp.c
new file mode 100644
index 0000000..f5a30af
--- /dev/null
+++ b/gnulib/lib/wmemcmp.c
@@ -0,0 +1,23 @@
+/* Compare wide character arrays.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemcmp-impl.h"
diff --git a/gnulib/lib/wmemcpy-impl.h b/gnulib/lib/wmemcpy-impl.h
new file mode 100644
index 0000000..6802e76
--- /dev/null
+++ b/gnulib/lib/wmemcpy-impl.h
@@ -0,0 +1,26 @@
+/* Copy wide character array.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wmemcpy (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ wchar_t *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *src++;
+ return dest;
+}
diff --git a/gnulib/lib/wmemcpy.c b/gnulib/lib/wmemcpy.c
new file mode 100644
index 0000000..0142497
--- /dev/null
+++ b/gnulib/lib/wmemcpy.c
@@ -0,0 +1,23 @@
+/* Copy wide character array.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemcpy-impl.h"
diff --git a/gnulib/lib/wmemmove-impl.h b/gnulib/lib/wmemmove-impl.h
new file mode 100644
index 0000000..4ecdcbe
--- /dev/null
+++ b/gnulib/lib/wmemmove-impl.h
@@ -0,0 +1,36 @@
+/* Copy wide character array.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wmemmove (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ if (dest < src)
+ {
+ wchar_t *destptr = dest;
+ const wchar_t *srcptr = src;
+ for (; n > 0; n--)
+ *destptr++ = *srcptr++;
+ }
+ else if (dest > src)
+ {
+ wchar_t *destptr = dest + n - 1;
+ const wchar_t *srcptr = src + n - 1;
+ for (; n > 0; n--)
+ *destptr-- = *srcptr--;
+ }
+ return dest;
+}
diff --git a/gnulib/lib/wmemmove.c b/gnulib/lib/wmemmove.c
new file mode 100644
index 0000000..3edaa0c
--- /dev/null
+++ b/gnulib/lib/wmemmove.c
@@ -0,0 +1,23 @@
+/* Copy wide character array.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemmove-impl.h"
diff --git a/gnulib/lib/wmemset-impl.h b/gnulib/lib/wmemset-impl.h
new file mode 100644
index 0000000..30b586a
--- /dev/null
+++ b/gnulib/lib/wmemset-impl.h
@@ -0,0 +1,26 @@
+/* Fill wide character array.
+ Copyright (C) 1999, 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+wchar_t *
+wmemset (wchar_t *s, wchar_t c, size_t n)
+{
+ wchar_t *ptr = s;
+
+ for (; n > 0; n--)
+ *ptr++ = c;
+ return s;
+}
diff --git a/gnulib/lib/wmemset.c b/gnulib/lib/wmemset.c
new file mode 100644
index 0000000..15450f5
--- /dev/null
+++ b/gnulib/lib/wmemset.c
@@ -0,0 +1,23 @@
+/* Fill wide character array.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemset-impl.h"
diff --git a/gnulib/lib/write-any-file.c b/gnulib/lib/write-any-file.c
new file mode 100644
index 0000000..74884e8
--- /dev/null
+++ b/gnulib/lib/write-any-file.c
@@ -0,0 +1,50 @@
+/* Determine whether we can write any file.
+
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "write-any-file.h"
+#include "priv-set.h"
+
+#include <unistd.h>
+
+/* Return true if we know that we can write any file, including
+ writing directories. */
+
+bool
+can_write_any_file (void)
+{
+ static bool initialized;
+ static bool can_write;
+
+ if (! initialized)
+ {
+ bool can = false;
+#if defined PRIV_FILE_DAC_WRITE
+ can = (priv_set_ismember (PRIV_FILE_DAC_WRITE) == 1);
+#else
+ /* In traditional Unix, only root can unlink directories. */
+ can = (geteuid () == 0);
+#endif
+ can_write = can;
+ initialized = true;
+ }
+
+ return can_write;
+}
diff --git a/gnulib/lib/write-any-file.h b/gnulib/lib/write-any-file.h
new file mode 100644
index 0000000..3930d4d
--- /dev/null
+++ b/gnulib/lib/write-any-file.h
@@ -0,0 +1,2 @@
+#include <stdbool.h>
+bool can_write_any_file (void);
diff --git a/gnulib/lib/write.c b/gnulib/lib/write.c
new file mode 100644
index 0000000..c3537d5
--- /dev/null
+++ b/gnulib/lib/write.c
@@ -0,0 +1,145 @@
+/* POSIX compatible write() function.
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. */
+
+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "msvc-inval.h"
+# include "msvc-nothrow.h"
+
+# undef write
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static inline ssize_t
+write_nothrow (int fd, const void *buf, size_t count)
+{
+ ssize_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = write (fd, buf, count);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define write_nothrow write
+# endif
+
+ssize_t
+rpl_write (int fd, const void *buf, size_t count)
+{
+ for (;;)
+ {
+ ssize_t ret = write_nothrow (fd, buf, count);
+
+ if (ret < 0)
+ {
+# if GNULIB_NONBLOCKING
+ if (errno == ENOSPC)
+ {
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (GetFileType (h) == FILE_TYPE_PIPE)
+ {
+ /* h is a pipe or socket. */
+ DWORD state;
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL,
+ NULL, 0)
+ && (state & PIPE_NOWAIT) != 0)
+ {
+ /* h is a pipe in non-blocking mode.
+ We can get here in four situations:
+ 1. When the pipe buffer is full.
+ 2. When count <= pipe_buf_size and the number of
+ free bytes in the pipe buffer is < count.
+ 3. When count > pipe_buf_size and the number of free
+ bytes in the pipe buffer is > 0, < pipe_buf_size.
+ 4. When count > pipe_buf_size and the pipe buffer is
+ entirely empty.
+ The cases 1 and 2 are POSIX compliant. In cases 3 and
+ 4 POSIX specifies that write() must split the request
+ and succeed with a partial write. We fix case 4.
+ We don't fix case 3 because it is not essential for
+ programs. */
+ DWORD out_size; /* size of the buffer for outgoing data */
+ DWORD in_size; /* size of the buffer for incoming data */
+ if (GetNamedPipeInfo (h, NULL, &out_size, &in_size, NULL))
+ {
+ size_t reduced_count = count;
+ /* In theory we need only one of out_size, in_size.
+ But I don't know which of the two. The description
+ is ambiguous. */
+ if (out_size != 0 && out_size < reduced_count)
+ reduced_count = out_size;
+ if (in_size != 0 && in_size < reduced_count)
+ reduced_count = in_size;
+ if (reduced_count < count)
+ {
+ /* Attempt to write only the first part. */
+ count = reduced_count;
+ continue;
+ }
+ }
+ /* Change errno from ENOSPC to EAGAIN. */
+ errno = EAGAIN;
+ }
+ }
+ }
+ else
+# endif
+ {
+# if GNULIB_SIGPIPE
+ if (GetLastError () == ERROR_NO_DATA
+ && GetFileType ((HANDLE) _get_osfhandle (fd))
+ == FILE_TYPE_PIPE)
+ {
+ /* Try to raise signal SIGPIPE. */
+ raise (SIGPIPE);
+ /* If it is currently blocked or ignored, change errno from
+ EINVAL to EPIPE. */
+ errno = EPIPE;
+ }
+# endif
+ }
+ }
+ return ret;
+ }
+}
+
+#endif
diff --git a/gnulib/lib/xalloc-die.c b/gnulib/lib/xalloc-die.c
new file mode 100644
index 0000000..80b4194
--- /dev/null
+++ b/gnulib/lib/xalloc-die.c
@@ -0,0 +1,41 @@
+/* Report a memory allocation failure and exit.
+
+ Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xalloc_die (void)
+{
+ error (exit_failure, 0, "%s", _("memory exhausted"));
+
+ /* _Noreturn cannot be given to error, since it may return if
+ its first argument is 0. To help compilers understand the
+ xalloc_die does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
diff --git a/gnulib/lib/xalloc-oversized.h b/gnulib/lib/xalloc-oversized.h
new file mode 100644
index 0000000..ab19bcf
--- /dev/null
+++ b/gnulib/lib/xalloc-oversized.h
@@ -0,0 +1,38 @@
+/* xalloc-oversized.h -- memory allocation size checking
+
+ Copyright (C) 1990-2000, 2003-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef XALLOC_OVERSIZED_H_
+# define XALLOC_OVERSIZED_H_
+
+# include <stddef.h>
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+ to size arithmetic overflow. S must be positive and N must be
+ nonnegative. This is a macro, not an inline function, so that it
+ works correctly even when SIZE_MAX < N.
+
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative dividend to use here is
+ SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+ However, malloc (SIZE_MAX) fails on all known hosts where
+ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+ exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+ branch when S is known to be 1. */
+# define xalloc_oversized(n, s) \
+ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/gnulib/lib/xalloc.h b/gnulib/lib/xalloc.h
new file mode 100644
index 0000000..987791b
--- /dev/null
+++ b/gnulib/lib/xalloc.h
@@ -0,0 +1,271 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+ Copyright (C) 1990-2000, 2003-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef XALLOC_H_
+# define XALLOC_H_
+
+# include <stddef.h>
+
+# include "xalloc-oversized.h"
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+# if __GNUC__ >= 3
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+# define _GL_ATTRIBUTE_MALLOC
+# endif
+
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+# else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+# endif
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+extern _Noreturn void xalloc_die (void);
+
+void *xmalloc (size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xzalloc (size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xcalloc (size_t n, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+void *xrealloc (void *p, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+char *xstrdup (char const *str)
+ _GL_ATTRIBUTE_MALLOC;
+
+/* In the following macros, T must be an elementary or structure/union or
+ typedef'ed type, or a pointer to such a type. To apply one of the
+ following macros to a function pointer or array type, you need to typedef
+ it first and use the typedef name. */
+
+/* Allocate an object of type T dynamically, with error checking. */
+/* extern t *XMALLOC (typename t); */
+# define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking. */
+/* extern t *XNMALLOC (size_t n, typename t); */
+# define XNMALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+
+/* Allocate an object of type T dynamically, with error checking,
+ and zero it. */
+/* extern t *XZALLOC (typename t); */
+# define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking,
+ and zero it. */
+/* extern t *XCALLOC (size_t n, typename t); */
+# define XCALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+
+
+# if HAVE_INLINE
+# define static_inline static inline
+# else
+void *xnmalloc (size_t n, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+void *xnrealloc (void *p, size_t n, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+void *x2nrealloc (void *p, size_t *pn, size_t s);
+char *xcharalloc (size_t n)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+# endif
+
+# ifdef static_inline
+
+/* Allocate an array of N objects, each with S bytes of memory,
+ dynamically, with error checking. S must be nonzero. */
+
+static_inline void *xnmalloc (size_t n, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+static_inline void *
+xnmalloc (size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xmalloc (n * s);
+}
+
+/* Change the size of an allocated block of memory P to an array of N
+ objects each of S bytes, with error checking. S must be nonzero. */
+
+static_inline void *xnrealloc (void *p, size_t n, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+static_inline void *
+xnrealloc (void *p, size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xrealloc (p, n * s);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+ otherwise, reallocate P so that it contains more than *PN objects
+ each of S bytes. *PN must be nonzero unless P is null, and S must
+ be nonzero. Set *PN to the new number of objects, and return the
+ pointer to the new block. *PN is never set to zero, and the
+ returned pointer is never null.
+
+ Repeated reallocations are guaranteed to make progress, either by
+ allocating an initial block with a nonzero size, or by allocating a
+ larger block.
+
+ In the following implementation, nonzero sizes are increased by a
+ factor of approximately 1.5 so that repeated reallocations have
+ O(N) overall cost rather than O(N**2) cost, but the
+ specification for this function does not guarantee that rate.
+
+ Here is an example of use:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ p = x2nrealloc (p, &allocated, sizeof *p);
+ p[used++] = value;
+ }
+
+ This causes x2nrealloc to allocate a block of some nonzero size the
+ first time it is called.
+
+ To have finer-grained control over the initial size, set *PN to a
+ nonzero value before calling this function with P == NULL. For
+ example:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+ size_t allocated1 = 1000;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ {
+ p = x2nrealloc (p, &allocated1, sizeof *p);
+ allocated = allocated1;
+ }
+ p[used++] = value;
+ }
+
+ */
+
+static_inline void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+ size_t n = *pn;
+
+ if (! p)
+ {
+ if (! n)
+ {
+ /* The approximate size to use for initial small allocation
+ requests, when the invoking code specifies an old size of
+ zero. This is the largest "small" request for the GNU C
+ library malloc. */
+ enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+ n = DEFAULT_MXFAST / s;
+ n += !n;
+ }
+ }
+ else
+ {
+ /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+ Check for overflow, so that N * S stays in size_t range.
+ The check is slightly conservative, but an exact check isn't
+ worth the trouble. */
+ if ((size_t) -1 / 3 * 2 / s <= n)
+ xalloc_die ();
+ n += (n + 1) / 2;
+ }
+
+ *pn = n;
+ return xrealloc (p, n * s);
+}
+
+/* Return a pointer to a new buffer of N bytes. This is like xmalloc,
+ except it returns char *. */
+
+static_inline char *xcharalloc (size_t n)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+static_inline char *
+xcharalloc (size_t n)
+{
+ return XNMALLOC (n, char);
+}
+
+# endif
+
+# ifdef __cplusplus
+}
+
+/* C++ does not allow conversions from void * to other pointer types
+ without a cast. Use templates to work around the problem when
+ possible. */
+
+template <typename T> inline T *
+xrealloc (T *p, size_t s)
+{
+ return (T *) xrealloc ((void *) p, s);
+}
+
+template <typename T> inline T *
+xnrealloc (T *p, size_t n, size_t s)
+{
+ return (T *) xnrealloc ((void *) p, n, s);
+}
+
+template <typename T> inline T *
+x2realloc (T *p, size_t *pn)
+{
+ return (T *) x2realloc ((void *) p, pn);
+}
+
+template <typename T> inline T *
+x2nrealloc (T *p, size_t *pn, size_t s)
+{
+ return (T *) x2nrealloc ((void *) p, pn, s);
+}
+
+template <typename T> inline T *
+xmemdup (T const *p, size_t s)
+{
+ return (T *) xmemdup ((void const *) p, s);
+}
+
+# endif
+
+
+#endif /* !XALLOC_H_ */
diff --git a/gnulib/lib/xasprintf.c b/gnulib/lib/xasprintf.c
new file mode 100644
index 0000000..05e6e7e
--- /dev/null
+++ b/gnulib/lib/xasprintf.c
@@ -0,0 +1,34 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 1999, 2002-2004, 2006, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xvasprintf.h"
+
+char *
+xasprintf (const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = xvasprintf (format, args);
+ va_end (args);
+
+ return result;
+}
diff --git a/gnulib/lib/xconcat-filename.c b/gnulib/lib/xconcat-filename.c
new file mode 100644
index 0000000..1a42c2c
--- /dev/null
+++ b/gnulib/lib/xconcat-filename.c
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "concat-filename.h"
+
+#include "xalloc.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. The directory may end with the directory separator. The second
+ argument may not start with the directory separator (it is relative).
+ Return a freshly allocated filename. */
+char *
+xconcatenated_filename (const char *directory, const char *filename,
+ const char *suffix)
+{
+ char *result;
+
+ result = concatenated_filename (directory, filename, suffix);
+ if (result == NULL)
+ xalloc_die ();
+
+ return result;
+}
diff --git a/gnulib/lib/xfreopen.c b/gnulib/lib/xfreopen.c
new file mode 100644
index 0000000..33a2b57
--- /dev/null
+++ b/gnulib/lib/xfreopen.c
@@ -0,0 +1,42 @@
+/* a wrapper for frepoen
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include "xfreopen.h"
+
+#include <errno.h>
+#include "error.h"
+#include "exitfail.h"
+#include "quote.h"
+#include "stdio--.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xfreopen (char const *filename, char const *mode, FILE *fp)
+{
+ if (!freopen (filename, mode, fp))
+ {
+ char const *f = (filename ? filename
+ : (fp == stdin ? _("stdin")
+ : (fp == stdout ? _("stdout")
+ : (fp == stderr ? _("stderr")
+ : _("unknown stream")))));
+ error (exit_failure, errno, _("failed to reopen %s with mode %s"),
+ quote_n (0, f), quote_n (1, mode));
+ }
+}
diff --git a/gnulib/lib/xfreopen.h b/gnulib/lib/xfreopen.h
new file mode 100644
index 0000000..2ce49b5
--- /dev/null
+++ b/gnulib/lib/xfreopen.h
@@ -0,0 +1,2 @@
+#include <stdio.h>
+void xfreopen (char const *filename, char const *mode, FILE *fp);
diff --git a/gnulib/lib/xgetcwd.c b/gnulib/lib/xgetcwd.c
new file mode 100644
index 0000000..1cf8cf0
--- /dev/null
+++ b/gnulib/lib/xgetcwd.c
@@ -0,0 +1,41 @@
+/* xgetcwd.c -- return current directory with unlimited length
+
+ Copyright (C) 2001, 2003-2004, 2006-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "xgetcwd.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "xalloc.h"
+
+/* Return the current directory, newly allocated.
+ Upon an out-of-memory error, call xalloc_die.
+ Upon any other type of error, return NULL. */
+
+char *
+xgetcwd (void)
+{
+ char *cwd = getcwd (NULL, 0);
+ if (! cwd && errno == ENOMEM)
+ xalloc_die ();
+ return cwd;
+}
diff --git a/gnulib/lib/xgetcwd.h b/gnulib/lib/xgetcwd.h
new file mode 100644
index 0000000..18685f6
--- /dev/null
+++ b/gnulib/lib/xgetcwd.h
@@ -0,0 +1,17 @@
+/* prototype for xgetcwd
+ Copyright (C) 1995, 2001, 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+extern char *xgetcwd (void);
diff --git a/gnulib/lib/xgetdomainname.c b/gnulib/lib/xgetdomainname.c
new file mode 100644
index 0000000..54e4ddd
--- /dev/null
+++ b/gnulib/lib/xgetdomainname.c
@@ -0,0 +1,77 @@
+/* xgetdomainname.c -- Return the NIS domain name, without size limitations.
+ Copyright (C) 1992, 1996, 2000-2001, 2003-2004, 2006, 2008-2011 Free
+ Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Based on xgethostname.c, written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xgetdomainname.h"
+
+/* Get getdomainname. */
+#include <unistd.h>
+
+/* Get errno. */
+#include <errno.h>
+
+/* Get free. */
+#include <stdlib.h>
+
+#include "xalloc.h"
+
+#ifndef INITIAL_DOMAINNAME_LENGTH
+# define INITIAL_DOMAINNAME_LENGTH 34
+#endif
+
+/* Return the NIS domain name of the machine, in malloc'd storage.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+ If malloc fails, exit.
+ Upon any other failure, set errno and return NULL. */
+char *
+xgetdomainname (void)
+{
+ char *domainname;
+ size_t size;
+
+ size = INITIAL_DOMAINNAME_LENGTH;
+ domainname = xmalloc (size);
+ while (1)
+ {
+ int k = size - 1;
+ int err;
+
+ errno = 0;
+ domainname[k] = '\0';
+ err = getdomainname (domainname, size);
+ if (err >= 0 && domainname[k] == '\0')
+ break;
+ else if (err < 0 && errno != EINVAL)
+ {
+ int saved_errno = errno;
+ free (domainname);
+ errno = saved_errno;
+ return NULL;
+ }
+ size *= 2;
+ domainname = xrealloc (domainname, size);
+ }
+
+ return domainname;
+}
diff --git a/gnulib/lib/xgetdomainname.h b/gnulib/lib/xgetdomainname.h
new file mode 100644
index 0000000..afa90f9
--- /dev/null
+++ b/gnulib/lib/xgetdomainname.h
@@ -0,0 +1,30 @@
+/* xgetdomainname.h -- Return the NIS domain name, without size limitations.
+ Copyright (C) 1992, 1996, 2000-2001, 2003, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XGETDOMAINNAME_H
+#define _XGETDOMAINNAME_H
+
+/* Return the NIS domain name of the machine, in malloc'd storage.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+ If malloc fails, exit.
+ Upon any other failure, set errno and return NULL. */
+extern char *xgetdomainname (void);
+
+#endif /* _XGETDOMAINNAME_H */
diff --git a/gnulib/lib/xgetgroups.c b/gnulib/lib/xgetgroups.c
new file mode 100644
index 0000000..41886c9
--- /dev/null
+++ b/gnulib/lib/xgetgroups.c
@@ -0,0 +1,37 @@
+/* xgetgroups.c -- return a list of the groups a user or current process is in
+
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Extracted from coreutils' src/id.c. */
+
+#include <config.h>
+
+#include "mgetgroups.h"
+
+#include <errno.h>
+
+#include "xalloc.h"
+
+/* Like mgetgroups, but call xalloc_die on allocation failure. */
+
+int
+xgetgroups (char const *username, gid_t gid, gid_t **groups)
+{
+ int result = mgetgroups (username, gid, groups);
+ if (result == -1 && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xgethostname.c b/gnulib/lib/xgethostname.c
new file mode 100644
index 0000000..18b9873
--- /dev/null
+++ b/gnulib/lib/xgethostname.c
@@ -0,0 +1,74 @@
+/* xgethostname.c -- return current hostname with unlimited length
+
+ Copyright (C) 1992, 1996, 2000-2001, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include "xgethostname.h"
+
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include "xalloc.h"
+
+#ifndef INITIAL_HOSTNAME_LENGTH
+# define INITIAL_HOSTNAME_LENGTH 34
+#endif
+
+/* Return the current hostname in malloc'd storage.
+ If malloc fails, exit.
+ Upon any other failure, return NULL and set errno. */
+char *
+xgethostname (void)
+{
+ char *hostname = NULL;
+ size_t size = INITIAL_HOSTNAME_LENGTH;
+
+ while (1)
+ {
+ /* Use SIZE_1 here rather than SIZE to work around the bug in
+ SunOS 5.5's gethostname whereby it NUL-terminates HOSTNAME
+ even when the name is as long as the supplied buffer. */
+ size_t size_1;
+
+ hostname = x2realloc (hostname, &size);
+ size_1 = size - 1;
+ hostname[size_1 - 1] = '\0';
+ errno = 0;
+
+ if (gethostname (hostname, size_1) == 0)
+ {
+ if (! hostname[size_1 - 1])
+ break;
+ }
+ else if (errno != 0 && errno != ENAMETOOLONG && errno != EINVAL
+ /* OSX/Darwin does this when the buffer is not large enough */
+ && errno != ENOMEM)
+ {
+ int saved_errno = errno;
+ free (hostname);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+
+ return hostname;
+}
diff --git a/gnulib/lib/xgethostname.h b/gnulib/lib/xgethostname.h
new file mode 100644
index 0000000..0177a40
--- /dev/null
+++ b/gnulib/lib/xgethostname.h
@@ -0,0 +1 @@
+char *xgethostname (void);
diff --git a/gnulib/lib/xmalloc.c b/gnulib/lib/xmalloc.c
new file mode 100644
index 0000000..08c30fb
--- /dev/null
+++ b/gnulib/lib/xmalloc.c
@@ -0,0 +1,124 @@
+/* xmalloc.c -- malloc with out of memory checking
+
+ Copyright (C) 1990-2000, 2002-2006, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#if ! HAVE_INLINE
+# define static_inline
+#endif
+#include "xalloc.h"
+#undef static_inline
+
+#include <stdlib.h>
+#include <string.h>
+
+/* 1 if calloc is known to be compatible with GNU calloc. This
+ matters if we are not also using the calloc module, which defines
+ HAVE_CALLOC_GNU and supports the GNU API even on non-GNU platforms. */
+#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
+enum { HAVE_GNU_CALLOC = 1 };
+#else
+enum { HAVE_GNU_CALLOC = 0 };
+#endif
+
+/* Allocate N bytes of memory dynamically, with error checking. */
+
+void *
+xmalloc (size_t n)
+{
+ void *p = malloc (n);
+ if (!p && n != 0)
+ xalloc_die ();
+ return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. */
+
+void *
+xrealloc (void *p, size_t n)
+{
+ if (!n && p)
+ {
+ /* The GNU and C99 realloc behaviors disagree here. Act like
+ GNU, even if the underlying realloc is C99. */
+ free (p);
+ return NULL;
+ }
+
+ p = realloc (p, n);
+ if (!p && n)
+ xalloc_die ();
+ return p;
+}
+
+/* If P is null, allocate a block of at least *PN bytes; otherwise,
+ reallocate P so that it contains more than *PN bytes. *PN must be
+ nonzero unless P is null. Set *PN to the new block's size, and
+ return the pointer to the new block. *PN is never set to zero, and
+ the returned pointer is never null. */
+
+void *
+x2realloc (void *p, size_t *pn)
+{
+ return x2nrealloc (p, pn, 1);
+}
+
+/* Allocate S bytes of zeroed memory dynamically, with error checking.
+ There's no need for xnzalloc (N, S), since it would be equivalent
+ to xcalloc (N, S). */
+
+void *
+xzalloc (size_t s)
+{
+ return memset (xmalloc (s), 0, s);
+}
+
+/* Allocate zeroed memory for N elements of S bytes, with error
+ checking. S must be nonzero. */
+
+void *
+xcalloc (size_t n, size_t s)
+{
+ void *p;
+ /* Test for overflow, since some calloc implementations don't have
+ proper overflow checks. But omit overflow and size-zero tests if
+ HAVE_GNU_CALLOC, since GNU calloc catches overflow and never
+ returns NULL if successful. */
+ if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s))
+ || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
+ xalloc_die ();
+ return p;
+}
+
+/* Clone an object P of size S, with error checking. There's no need
+ for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
+ need for an arithmetic overflow check. */
+
+void *
+xmemdup (void const *p, size_t s)
+{
+ return memcpy (xmalloc (s), p, s);
+}
+
+/* Clone STRING. */
+
+char *
+xstrdup (char const *string)
+{
+ return xmemdup (string, strlen (string) + 1);
+}
diff --git a/gnulib/lib/xmalloca.c b/gnulib/lib/xmalloca.c
new file mode 100644
index 0000000..aec8459
--- /dev/null
+++ b/gnulib/lib/xmalloca.c
@@ -0,0 +1,38 @@
+/* Safe automatic memory allocation with out of memory checking.
+ Copyright (C) 2003, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xmalloca.h"
+
+#include "xalloc.h"
+
+#if HAVE_ALLOCA
+
+void *
+xmmalloca (size_t n)
+{
+ void *p;
+
+ p = mmalloca (n);
+ if (p == NULL)
+ xalloc_die ();
+ return p;
+}
+
+#endif
diff --git a/gnulib/lib/xmalloca.h b/gnulib/lib/xmalloca.h
new file mode 100644
index 0000000..12f7e3d
--- /dev/null
+++ b/gnulib/lib/xmalloca.h
@@ -0,0 +1,64 @@
+/* Safe automatic memory allocation with out of memory checking.
+ Copyright (C) 2003, 2005, 2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XMALLOCA_H
+#define _XMALLOCA_H
+
+#include "malloca.h"
+#include "xalloc.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* xmalloca(N) is a checking safe variant of alloca(N). It allocates N bytes
+ of memory allocated on the stack, that must be freed using freea() before
+ the function returns. Upon failure, it exits with an error message. */
+#if HAVE_ALLOCA
+# define xmalloca(N) \
+ ((N) < 4032 - sa_increment \
+ ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \
+ : xmmalloca (N))
+extern void * xmmalloca (size_t n);
+#else
+# define xmalloca(N) \
+ xmalloc (N)
+#endif
+
+/* xnmalloca(N,S) is an overflow-safe variant of xmalloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns.
+ Upon failure, it exits with an error message. */
+#if HAVE_ALLOCA
+/* Rely on xmalloca (SIZE_MAX) calling xalloc_die (). */
+# define xnmalloca(n, s) \
+ xmalloca (xalloc_oversized ((n), (s)) ? (size_t) (-1) : (n) * (s))
+#else
+# define xnmalloca(n, s) \
+ xnmalloc ((n), (s))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XMALLOCA_H */
diff --git a/gnulib/lib/xmemcoll.c b/gnulib/lib/xmemcoll.c
new file mode 100644
index 0000000..56f1871
--- /dev/null
+++ b/gnulib/lib/xmemcoll.c
@@ -0,0 +1,76 @@
+/* Locale-specific memory comparison.
+
+ Copyright (C) 2002-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Contributed by Paul Eggert <eggert@twinsun.com>. */
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "exitfail.h"
+#include "memcoll.h"
+#include "quotearg.h"
+#include "xmemcoll.h"
+
+static void
+collate_error (int collation_errno,
+ char const *s1, size_t s1len,
+ char const *s2, size_t s2len)
+{
+ error (0, collation_errno, _("string comparison failed"));
+ error (0, 0, _("Set LC_ALL='C' to work around the problem."));
+ error (exit_failure, 0,
+ _("The strings compared were %s and %s."),
+ quotearg_n_style_mem (0, locale_quoting_style, s1, s1len),
+ quotearg_n_style_mem (1, locale_quoting_style, s2, s2len));
+}
+
+/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according
+ to the LC_COLLATE locale. S1 and S2 do not overlap, and are not
+ adjacent. Temporarily modify the bytes after S1 and S2, but
+ restore their original contents before returning. Report an error
+ and exit if there is an error. */
+
+int
+xmemcoll (char *s1, size_t s1len, char *s2, size_t s2len)
+{
+ int diff = memcoll (s1, s1len, s2, s2len);
+ int collation_errno = errno;
+ if (collation_errno)
+ collate_error (collation_errno, s1, s1len, s2, s2len);
+ return diff;
+}
+
+/* Compare S1 (a memory block of size S1SIZE, with a NUL as last byte)
+ and S2 (a memory block of size S2SIZE, with a NUL as last byte)
+ according to the LC_COLLATE locale. S1SIZE and S2SIZE must be > 0.
+ Report an error and exit if there is an error. */
+
+int
+xmemcoll0 (char const *s1, size_t s1size, char const *s2, size_t s2size)
+{
+ int diff = memcoll0 (s1, s1size, s2, s2size);
+ int collation_errno = errno;
+ if (collation_errno)
+ collate_error (collation_errno, s1, s1size - 1, s2, s2size - 1);
+ return diff;
+}
diff --git a/gnulib/lib/xmemcoll.h b/gnulib/lib/xmemcoll.h
new file mode 100644
index 0000000..4170b9b
--- /dev/null
+++ b/gnulib/lib/xmemcoll.h
@@ -0,0 +1,3 @@
+#include <stddef.h>
+int xmemcoll (char *, size_t, char *, size_t);
+int xmemcoll0 (char const *, size_t, char const *, size_t);
diff --git a/gnulib/lib/xmemdup0.c b/gnulib/lib/xmemdup0.c
new file mode 100644
index 0000000..32ac0f8
--- /dev/null
+++ b/gnulib/lib/xmemdup0.c
@@ -0,0 +1,44 @@
+/* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "xmemdup0.h"
+#include "xalloc.h"
+
+#include <string.h>
+
+/* Clone an arbitrary block of bytes P of size S, with error checking,
+ and include a terminating NUL byte. P is of type `void const *',
+ to make it easier to use this with other mem* functions that return
+ `void *', but since appending a NUL byte only makes sense on bytes,
+ the return type is `char *'.
+
+ The terminating NUL makes it safe to use strlen or rawmemchr to
+ check for embedded NUL; it also speeds up algorithms such as escape
+ sequence processing on arbitrary memory, by making it always safe
+ to read the byte after the escape character rather than having to
+ check if each escape character is the last byte in the object. */
+
+char *
+xmemdup0 (void const *p, size_t s)
+{
+ char *result = xcharalloc (s + 1);
+ memcpy (result, p, s);
+ result[s] = 0;
+ return result;
+}
diff --git a/gnulib/lib/xmemdup0.h b/gnulib/lib/xmemdup0.h
new file mode 100644
index 0000000..fa1b2f0
--- /dev/null
+++ b/gnulib/lib/xmemdup0.h
@@ -0,0 +1,41 @@
+/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef XMEMDUP_H_
+# define XMEMDUP_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+extern _Noreturn void xalloc_die (void);
+
+char *xmemdup0 (void const *p, size_t s);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* !XMEMDUP0_H_ */
diff --git a/gnulib/lib/xnanosleep.c b/gnulib/lib/xnanosleep.c
new file mode 100644
index 0000000..442ddf5
--- /dev/null
+++ b/gnulib/lib/xnanosleep.c
@@ -0,0 +1,58 @@
+/* xnanosleep.c -- a more convenient interface to nanosleep
+
+ Copyright (C) 2002-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Mostly written (for sleep.c) by Paul Eggert.
+ Factored out (creating this file) by Jim Meyering. */
+
+#include <config.h>
+
+#include "xnanosleep.h"
+
+#include <timespec.h>
+
+#include <errno.h>
+#include <time.h>
+
+/* Sleep until the time (call it WAKE_UP_TIME) specified as
+ SECONDS seconds after the time this function is called.
+ SECONDS must be non-negative. If SECONDS is so large that
+ it is not representable as a `struct timespec', then use
+ the maximum value for that interval. Return -1 on failure
+ (setting errno), 0 on success. */
+
+int
+xnanosleep (double seconds)
+{
+ struct timespec ts_sleep = dtotimespec (seconds);
+
+ for (;;)
+ {
+ /* Linux-2.6.8.1's nanosleep returns -1, but doesn't set errno
+ when resumed after being suspended. Earlier versions would
+ set errno to EINTR. nanosleep from linux-2.6.10, as well as
+ implementations by (all?) other vendors, doesn't return -1
+ in that case; either it continues sleeping (if time remains)
+ or it returns zero (if the wake-up time has passed). */
+ errno = 0;
+ if (nanosleep (&ts_sleep, NULL) == 0)
+ break;
+ if (errno != EINTR && errno != 0)
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/gnulib/lib/xnanosleep.h b/gnulib/lib/xnanosleep.h
new file mode 100644
index 0000000..56232d5
--- /dev/null
+++ b/gnulib/lib/xnanosleep.h
@@ -0,0 +1 @@
+int xnanosleep (double);
diff --git a/gnulib/lib/xprintf.c b/gnulib/lib/xprintf.c
new file mode 100644
index 0000000..edb97eb
--- /dev/null
+++ b/gnulib/lib/xprintf.c
@@ -0,0 +1,79 @@
+/* printf wrappers that fail immediately for non-file-related errors
+ Copyright (C) 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "xprintf.h"
+
+#include <errno.h>
+
+#include "error.h"
+#include "exitfail.h"
+#include "gettext.h"
+
+/* written by Jim Meyering */
+
+/* Just like printf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xprintf (char const *restrict format, ...)
+{
+ va_list args;
+ int retval;
+ va_start (args, format);
+ retval = xvprintf (format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/* Just like vprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xvprintf (char const *restrict format, va_list args)
+{
+ int retval = vprintf (format, args);
+ if (retval < 0 && ! ferror (stdout))
+ error (exit_failure, errno, gettext ("cannot perform formatted output"));
+
+ return retval;
+}
+
+/* Just like fprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xfprintf (FILE *restrict stream, char const *restrict format, ...)
+{
+ va_list args;
+ int retval;
+ va_start (args, format);
+ retval = xvfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+
+/* Just like vfprintf, but call error if it fails without setting the
+ stream's error indicator. */
+int
+xvfprintf (FILE *restrict stream, char const *restrict format, va_list args)
+{
+ int retval = vfprintf (stream, format, args);
+ if (retval < 0 && ! ferror (stream))
+ error (exit_failure, errno, gettext ("cannot perform formatted output"));
+
+ return retval;
+}
diff --git a/gnulib/lib/xprintf.h b/gnulib/lib/xprintf.h
new file mode 100644
index 0000000..ca48ce7
--- /dev/null
+++ b/gnulib/lib/xprintf.h
@@ -0,0 +1,45 @@
+/* printf wrappers that fail immediately for non-file-related errors
+ Copyright (C) 2007-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XPRINTF_H
+#define _XPRINTF_H
+
+#include <stdarg.h>
+#include <stdio.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+extern int xprintf (char const *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2));
+extern int xvprintf (char const *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0));
+extern int xfprintf (FILE *restrict stream, char const *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
+extern int xvfprintf (FILE *restrict stream, char const *restrict format,
+ va_list args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 2, 0));
+
+#endif
diff --git a/gnulib/lib/xreadlink.c b/gnulib/lib/xreadlink.c
new file mode 100644
index 0000000..cbb9ea2
--- /dev/null
+++ b/gnulib/lib/xreadlink.c
@@ -0,0 +1,44 @@
+/* xreadlink.c -- readlink wrapper to return the link name in malloc'd storage
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>
+ and Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xreadlink.h"
+
+#include <errno.h>
+
+#include "areadlink.h"
+#include "xalloc.h"
+
+/* Call readlink to get the symbolic link value of FILENAME.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlink fails, return NULL and set errno.
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ give a diagnostic and exit. */
+
+char *
+xreadlink (char const *filename)
+{
+ char *result = areadlink (filename);
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xreadlink.h b/gnulib/lib/xreadlink.h
new file mode 100644
index 0000000..fe608a4
--- /dev/null
+++ b/gnulib/lib/xreadlink.h
@@ -0,0 +1,25 @@
+/* Reading symbolic links without size limitation.
+
+ Copyright (C) 2001, 2003-2004, 2007, 2009-2011 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net> */
+
+extern char *xreadlink (char const *filename);
+
+#if GNULIB_XREADLINKAT
+extern char *xreadlinkat (int fd, char const *filename);
+#endif
diff --git a/gnulib/lib/xreadlinkat.c b/gnulib/lib/xreadlinkat.c
new file mode 100644
index 0000000..ca42634
--- /dev/null
+++ b/gnulib/lib/xreadlinkat.c
@@ -0,0 +1,46 @@
+/* xreadlinkat.c -- readlink wrapper to return the link name in malloc'd storage
+
+ Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering <jim@meyering.net>,
+ and Bruno Haible <bruno@clisp.org>,
+ and Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xreadlink.h"
+
+#include <errno.h>
+
+#include "areadlink.h"
+#include "xalloc.h"
+
+/* Call readlinkat to get the symbolic link value of FILENAME relative to FD.
+ Return a pointer to that NUL-terminated string in malloc'd storage.
+ If readlinkat fails, return NULL and set errno (although failure to
+ change directory will issue a diagnostic and exit).
+ If realloc fails, or if the link value is longer than SIZE_MAX :-),
+ give a diagnostic and exit. */
+
+char *
+xreadlinkat (int fd, char const *filename)
+{
+ char *result = areadlinkat (fd, filename);
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xsetenv.c b/gnulib/lib/xsetenv.c
new file mode 100644
index 0000000..48c9be5
--- /dev/null
+++ b/gnulib/lib/xsetenv.c
@@ -0,0 +1,38 @@
+/* Setting environment variables, with out-of-memory checking.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xsetenv.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value.
+ With error checking. */
+void
+xsetenv (const char *name, const char *value, int replace)
+{
+ if (setenv (name, value, replace) < 0)
+ error (EXIT_FAILURE, 0, _("memory exhausted"));
+}
diff --git a/gnulib/lib/xsetenv.h b/gnulib/lib/xsetenv.h
new file mode 100644
index 0000000..75f3264
--- /dev/null
+++ b/gnulib/lib/xsetenv.h
@@ -0,0 +1,31 @@
+/* Setting environment variables, with out-of-memory checking.
+ Copyright (C) 2001-2002, 2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Get unsetenv(). It can be used without error checking. */
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value.
+ With error checking. */
+extern void xsetenv (const char *name, const char *value, int replace);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/gnulib/lib/xsize.h b/gnulib/lib/xsize.h
new file mode 100644
index 0000000..f75655a
--- /dev/null
+++ b/gnulib/lib/xsize.h
@@ -0,0 +1,108 @@
+/* xsize.h -- Checked size_t computations.
+
+ Copyright (C) 2003, 2008-2011 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get SIZE_MAX. */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* The size of memory objects is often computed through expressions of
+ type size_t. Example:
+ void* p = malloc (header_size + n * element_size).
+ These computations can lead to overflow. When this happens, malloc()
+ returns a piece of memory that is way too small, and the program then
+ crashes while attempting to fill the memory.
+ To avoid this, the functions and macros in this file check for overflow.
+ The convention is that SIZE_MAX represents overflow.
+ malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+ implementation that uses mmap --, it's recommended to use size_overflow_p()
+ or size_in_bounds_p() before invoking malloc().
+ The example thus becomes:
+ size_t size = xsum (header_size, xtimes (n, element_size));
+ void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t. */
+#define xcast_size_t(N) \
+ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum (size_t size1, size_t size2)
+{
+ size_t sum = size1 + size2;
+ return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+ return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+ return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check. */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+ /* No explicit check is needed here, because for any n:
+ max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+ return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+ The count must be >= 0 and the element size must be > 0.
+ This is a macro, not an inline function, so that it works correctly even
+ when N is of a wider type and N > SIZE_MAX. */
+#define xtimes(N, ELSIZE) \
+ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow. */
+#define size_overflow_p(SIZE) \
+ ((SIZE) == SIZE_MAX)
+/* Check against overflow. */
+#define size_in_bounds_p(SIZE) \
+ ((SIZE) != SIZE_MAX)
+
+#endif /* _XSIZE_H */
diff --git a/gnulib/lib/xstriconv.c b/gnulib/lib/xstriconv.c
new file mode 100644
index 0000000..9e4498f
--- /dev/null
+++ b/gnulib/lib/xstriconv.c
@@ -0,0 +1,62 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2004, 2006, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstriconv.h"
+
+#include <errno.h>
+
+#include "striconv.h"
+#include "xalloc.h"
+
+
+#if HAVE_ICONV
+
+int
+xmem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp)
+{
+ int retval = mem_cd_iconv (src, srclen, cd, resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_cd_iconv (const char *src, iconv_t cd)
+{
+ char *result = str_cd_iconv (src, cd);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+char *
+xstr_iconv (const char *src, const char *from_codeset, const char *to_codeset)
+{
+ char *result = str_iconv (src, from_codeset, to_codeset);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xstriconv.h b/gnulib/lib/xstriconv.h
new file mode 100644
index 0000000..eba6b16
--- /dev/null
+++ b/gnulib/lib/xstriconv.h
@@ -0,0 +1,78 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2004, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XSTRICONV_H
+#define _XSTRICONV_H
+
+#include <stddef.h>
+#if HAVE_ICONV
+#include <iconv.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ The conversion descriptor is passed as CD.
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int xmem_cd_iconv (const char *src, size_t srclen, iconv_t cd,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ The conversion descriptor is passed as CD. Both the "from" and the "to"
+ encoding must use a single NUL byte at the end of the string (i.e. not
+ UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * xstr_cd_iconv (const char *src, iconv_t cd);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char * xstr_iconv (const char *src,
+ const char *from_codeset, const char *to_codeset);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XSTRICONV_H */
diff --git a/gnulib/lib/xstriconveh.c b/gnulib/lib/xstriconveh.c
new file mode 100644
index 0000000..b13be06
--- /dev/null
+++ b/gnulib/lib/xstriconveh.c
@@ -0,0 +1,86 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstriconveh.h"
+
+#include <errno.h>
+
+#include "striconveh.h"
+#include "xalloc.h"
+
+
+#if HAVE_ICONV
+
+int
+xmem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval =
+ mem_cd_iconveh (src, srclen, cd, handler, offsets, resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_cd_iconveh (src, cd, handler);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
+
+#endif
+
+int
+xmem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp)
+{
+ int retval =
+ mem_iconveh (src, srclen, from_codeset, to_codeset, handler, offsets,
+ resultp, lengthp);
+
+ if (retval < 0 && errno == ENOMEM)
+ xalloc_die ();
+ return retval;
+}
+
+char *
+xstr_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler)
+{
+ char *result = str_iconveh (src, from_codeset, to_codeset, handler);
+
+ if (result == NULL && errno == ENOMEM)
+ xalloc_die ();
+ return result;
+}
diff --git a/gnulib/lib/xstriconveh.h b/gnulib/lib/xstriconveh.h
new file mode 100644
index 0000000..65781c4
--- /dev/null
+++ b/gnulib/lib/xstriconveh.h
@@ -0,0 +1,115 @@
+/* Charset conversion with out-of-memory checking.
+ Copyright (C) 2001-2007, 2009-2011 Free Software Foundation, Inc.
+ Written by Bruno Haible and Simon Josefsson.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XSTRICONVEH_H
+#define _XSTRICONVEH_H
+
+#include <stddef.h>
+
+/* Get the 'enum iconv_ilseq_handler' and iconveh_t types, and the
+ iconveh_open, iconveh_close declarations. */
+#include "striconveh.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if HAVE_ICONV
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ xmem_cd_iconveh (const char *src, size_t srclen,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ CD points to the conversion descriptor from FROMCODE to TOCODE, created by
+ the function iconveh_open().
+ Both the "from" and the "to" encoding must use a single NUL byte at the end
+ of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ xstr_cd_iconveh (const char *src,
+ const iconveh_t *cd,
+ enum iconv_ilseq_handler handler);
+
+#endif
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is at [SRC,...,SRC+SRCLEN-1].
+ If OFFSETS is not NULL, it should point to an array of SRCLEN integers; this
+ array is filled with offsets into the result, i.e. the character starting
+ at SRC[i] corresponds to the character starting at (*RESULTP)[OFFSETS[i]],
+ and other offsets are set to (size_t)(-1).
+ *RESULTP and *LENGTH should initially be a scratch buffer and its size,
+ or *RESULTP can initially be NULL.
+ May erase the contents of the memory at *RESULTP.
+ Upon memory allocation failure, report the error and exit.
+ Return value: 0 if successful, otherwise -1 and errno set.
+ If successful: The resulting string is stored in *RESULTP and its length
+ in *LENGTHP. *RESULTP is set to a freshly allocated memory block, or is
+ unchanged if no dynamic memory allocation was necessary. */
+extern int
+ xmem_iconveh (const char *src, size_t srclen,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler,
+ size_t *offsets,
+ char **resultp, size_t *lengthp);
+
+/* Convert an entire string from one encoding to another, using iconv.
+ The original string is the NUL-terminated string starting at SRC.
+ Both the "from" and the "to" encoding must use a single NUL byte at the
+ end of the string (i.e. not UCS-2, UCS-4, UTF-16, UTF-32).
+ Allocate a malloced memory block for the result.
+ Upon memory allocation failure, report the error and exit.
+ Return value: the freshly allocated resulting NUL-terminated string if
+ successful, otherwise NULL and errno set. */
+extern char *
+ xstr_iconveh (const char *src,
+ const char *from_codeset, const char *to_codeset,
+ enum iconv_ilseq_handler handler);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _XSTRICONVEH_H */
diff --git a/gnulib/lib/xstrndup.c b/gnulib/lib/xstrndup.c
new file mode 100644
index 0000000..d58302a
--- /dev/null
+++ b/gnulib/lib/xstrndup.c
@@ -0,0 +1,36 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2006-2007, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstrndup.h"
+
+#include <string.h>
+#include "xalloc.h"
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+char *
+xstrndup (const char *string, size_t n)
+{
+ char *s = strndup (string, n);
+ if (! s)
+ xalloc_die ();
+ return s;
+}
diff --git a/gnulib/lib/xstrndup.h b/gnulib/lib/xstrndup.h
new file mode 100644
index 0000000..f96a538
--- /dev/null
+++ b/gnulib/lib/xstrndup.h
@@ -0,0 +1,23 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stddef.h>
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+extern char *xstrndup (const char *string, size_t n);
diff --git a/gnulib/lib/xstrtod.c b/gnulib/lib/xstrtod.c
new file mode 100644
index 0000000..1ecb638
--- /dev/null
+++ b/gnulib/lib/xstrtod.c
@@ -0,0 +1,71 @@
+/* error-checking interface to strtod-like functions
+
+ Copyright (C) 1996, 1999-2000, 2003-2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "xstrtod.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+
+#if LONG
+# define XSTRTOD xstrtold
+# define DOUBLE long double
+#else
+# define XSTRTOD xstrtod
+# define DOUBLE double
+#endif
+
+/* An interface to a string-to-floating-point conversion function that
+ encapsulates all the error checking one should usually perform.
+ Like strtod/strtold, but upon successful
+ conversion put the result in *RESULT and return true. Return
+ false and don't modify *RESULT upon any failure. CONVERT
+ specifies the conversion function, e.g., strtod itself. */
+
+bool
+XSTRTOD (char const *str, char const **ptr, DOUBLE *result,
+ DOUBLE (*convert) (char const *, char **))
+{
+ DOUBLE val;
+ char *terminator;
+ bool ok = true;
+
+ errno = 0;
+ val = convert (str, &terminator);
+
+ /* Having a non-zero terminator is an error only when PTR is NULL. */
+ if (terminator == str || (ptr == NULL && *terminator != '\0'))
+ ok = false;
+ else
+ {
+ /* Allow underflow (in which case CONVERT returns zero),
+ but flag overflow as an error. */
+ if (val != 0 && errno == ERANGE)
+ ok = false;
+ }
+
+ if (ptr != NULL)
+ *ptr = terminator;
+
+ *result = val;
+ return ok;
+}
diff --git a/gnulib/lib/xstrtod.h b/gnulib/lib/xstrtod.h
new file mode 100644
index 0000000..6865776
--- /dev/null
+++ b/gnulib/lib/xstrtod.h
@@ -0,0 +1,31 @@
+/* Error-checking interface to strtod-like functions.
+
+ Copyright (C) 1996, 1998, 2003-2004, 2006, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef XSTRTOD_H
+# define XSTRTOD_H 1
+
+# include <stdbool.h>
+
+bool xstrtod (const char *str, const char **ptr, double *result,
+ double (*convert) (char const *, char **));
+bool xstrtold (const char *str, const char **ptr, long double *result,
+ long double (*convert) (char const *, char **));
+
+#endif /* not XSTRTOD_H */
diff --git a/gnulib/lib/xstrtoimax.c b/gnulib/lib/xstrtoimax.c
new file mode 100644
index 0000000..b4baf5b
--- /dev/null
+++ b/gnulib/lib/xstrtoimax.c
@@ -0,0 +1,6 @@
+#define __strtol strtoimax
+#define __strtol_t intmax_t
+#define __xstrtol xstrtoimax
+#define STRTOL_T_MINIMUM INTMAX_MIN
+#define STRTOL_T_MAXIMUM INTMAX_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtol-error.c b/gnulib/lib/xstrtol-error.c
new file mode 100644
index 0000000..52e712c
--- /dev/null
+++ b/gnulib/lib/xstrtol-error.c
@@ -0,0 +1,98 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-1999, 2001-2004, 2006-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include "xstrtol.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+#include "gettext.h"
+
+#define N_(msgid) msgid
+
+/* Report an error for an invalid integer in an option argument.
+
+ ERR is the error code returned by one of the xstrto* functions.
+
+ Use OPT_IDX to decide whether to print the short option string "C"
+ or "-C" or a long option string derived from LONG_OPTION. OPT_IDX
+ is -2 if the short option "C" was used, without any leading "-"; it
+ is -1 if the short option "-C" was used; otherwise it is an index
+ into LONG_OPTIONS, which should have a name preceded by two '-'
+ characters.
+
+ ARG is the option-argument containing the integer.
+
+ After reporting an error, exit with status EXIT_STATUS if it is
+ nonzero. */
+
+static void
+xstrtol_error (enum strtol_error err,
+ int opt_idx, char c, struct option const *long_options,
+ char const *arg,
+ int exit_status)
+{
+ char const *hyphens = "--";
+ char const *msgid;
+ char const *option;
+ char option_buffer[2];
+
+ switch (err)
+ {
+ default:
+ abort ();
+
+ case LONGINT_INVALID:
+ msgid = N_("invalid %s%s argument `%s'");
+ break;
+
+ case LONGINT_INVALID_SUFFIX_CHAR:
+ case LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW:
+ msgid = N_("invalid suffix in %s%s argument `%s'");
+ break;
+
+ case LONGINT_OVERFLOW:
+ msgid = N_("%s%s argument `%s' too large");
+ break;
+ }
+
+ if (opt_idx < 0)
+ {
+ hyphens -= opt_idx;
+ option_buffer[0] = c;
+ option_buffer[1] = '\0';
+ option = option_buffer;
+ }
+ else
+ option = long_options[opt_idx].name;
+
+ error (exit_status, 0, gettext (msgid), hyphens, option, arg);
+}
+
+/* Like xstrtol_error, except exit with a failure status. */
+
+void
+xstrtol_fatal (enum strtol_error err,
+ int opt_idx, char c, struct option const *long_options,
+ char const *arg)
+{
+ xstrtol_error (err, opt_idx, c, long_options, arg, exit_failure);
+ abort ();
+}
diff --git a/gnulib/lib/xstrtol.c b/gnulib/lib/xstrtol.c
new file mode 100644
index 0000000..b1fdd49
--- /dev/null
+++ b/gnulib/lib/xstrtol.c
@@ -0,0 +1,241 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-2001, 2003-2007, 2009-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef __strtol
+# define __strtol strtol
+# define __strtol_t long int
+# define __xstrtol xstrtol
+# define STRTOL_T_MINIMUM LONG_MIN
+# define STRTOL_T_MAXIMUM LONG_MAX
+#endif
+
+#include <config.h>
+
+#include "xstrtol.h"
+
+/* Some pre-ANSI implementations (e.g. SunOS 4)
+ need stderr defined if assertion checking is enabled. */
+#include <stdio.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+
+/* xstrtoll.c and xstrtoull.c, which include this file, require that
+ ULLONG_MAX, LLONG_MAX, LLONG_MIN are defined, but <limits.h> does not
+ define them on all platforms. */
+#ifndef ULLONG_MAX
+# define ULLONG_MAX TYPE_MAXIMUM (unsigned long long)
+#endif
+#ifndef LLONG_MAX
+# define LLONG_MAX TYPE_MAXIMUM (long long int)
+#endif
+#ifndef LLONG_MIN
+# define LLONG_MIN TYPE_MINIMUM (long long int)
+#endif
+
+static strtol_error
+bkm_scale (__strtol_t *x, int scale_factor)
+{
+ if (TYPE_SIGNED (__strtol_t) && *x < STRTOL_T_MINIMUM / scale_factor)
+ {
+ *x = STRTOL_T_MINIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ if (STRTOL_T_MAXIMUM / scale_factor < *x)
+ {
+ *x = STRTOL_T_MAXIMUM;
+ return LONGINT_OVERFLOW;
+ }
+ *x *= scale_factor;
+ return LONGINT_OK;
+}
+
+static strtol_error
+bkm_scale_by_power (__strtol_t *x, int base, int power)
+{
+ strtol_error err = LONGINT_OK;
+ while (power--)
+ err |= bkm_scale (x, base);
+ return err;
+}
+
+/* FIXME: comment. */
+
+strtol_error
+__xstrtol (const char *s, char **ptr, int strtol_base,
+ __strtol_t *val, const char *valid_suffixes)
+{
+ char *t_ptr;
+ char **p;
+ __strtol_t tmp;
+ strtol_error err = LONGINT_OK;
+
+ assert (0 <= strtol_base && strtol_base <= 36);
+
+ p = (ptr ? ptr : &t_ptr);
+
+ if (! TYPE_SIGNED (__strtol_t))
+ {
+ const char *q = s;
+ unsigned char ch = *q;
+ while (isspace (ch))
+ ch = *++q;
+ if (ch == '-')
+ return LONGINT_INVALID;
+ }
+
+ errno = 0;
+ tmp = __strtol (s, p, strtol_base);
+
+ if (*p == s)
+ {
+ /* If there is no number but there is a valid suffix, assume the
+ number is 1. The string is invalid otherwise. */
+ if (valid_suffixes && **p && strchr (valid_suffixes, **p))
+ tmp = 1;
+ else
+ return LONGINT_INVALID;
+ }
+ else if (errno != 0)
+ {
+ if (errno != ERANGE)
+ return LONGINT_INVALID;
+ err = LONGINT_OVERFLOW;
+ }
+
+ /* Let valid_suffixes == NULL mean `allow any suffix'. */
+ /* FIXME: update all callers except the ones that allow suffixes
+ after the number, changing last parameter NULL to `""'. */
+ if (!valid_suffixes)
+ {
+ *val = tmp;
+ return err;
+ }
+
+ if (**p != '\0')
+ {
+ int base = 1024;
+ int suffixes = 1;
+ strtol_error overflow;
+
+ if (!strchr (valid_suffixes, **p))
+ {
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ if (strchr (valid_suffixes, '0'))
+ {
+ /* The ``valid suffix'' '0' is a special flag meaning that
+ an optional second suffix is allowed, which can change
+ the base. A suffix "B" (e.g. "100MB") stands for a power
+ of 1000, whereas a suffix "iB" (e.g. "100MiB") stands for
+ a power of 1024. If no suffix (e.g. "100M"), assume
+ power-of-1024. */
+
+ switch (p[0][1])
+ {
+ case 'i':
+ if (p[0][2] == 'B')
+ suffixes += 2;
+ break;
+
+ case 'B':
+ case 'D': /* 'D' is obsolescent */
+ base = 1000;
+ suffixes++;
+ break;
+ }
+ }
+
+ switch (**p)
+ {
+ case 'b':
+ overflow = bkm_scale (&tmp, 512);
+ break;
+
+ case 'B':
+ overflow = bkm_scale (&tmp, 1024);
+ break;
+
+ case 'c':
+ overflow = 0;
+ break;
+
+ case 'E': /* exa or exbi */
+ overflow = bkm_scale_by_power (&tmp, base, 6);
+ break;
+
+ case 'G': /* giga or gibi */
+ case 'g': /* 'g' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 3);
+ break;
+
+ case 'k': /* kilo */
+ case 'K': /* kibi */
+ overflow = bkm_scale_by_power (&tmp, base, 1);
+ break;
+
+ case 'M': /* mega or mebi */
+ case 'm': /* 'm' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 2);
+ break;
+
+ case 'P': /* peta or pebi */
+ overflow = bkm_scale_by_power (&tmp, base, 5);
+ break;
+
+ case 'T': /* tera or tebi */
+ case 't': /* 't' is undocumented; for compatibility only */
+ overflow = bkm_scale_by_power (&tmp, base, 4);
+ break;
+
+ case 'w':
+ overflow = bkm_scale (&tmp, 2);
+ break;
+
+ case 'Y': /* yotta or 2**80 */
+ overflow = bkm_scale_by_power (&tmp, base, 8);
+ break;
+
+ case 'Z': /* zetta or 2**70 */
+ overflow = bkm_scale_by_power (&tmp, base, 7);
+ break;
+
+ default:
+ *val = tmp;
+ return err | LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ err |= overflow;
+ *p += suffixes;
+ if (**p)
+ err |= LONGINT_INVALID_SUFFIX_CHAR;
+ }
+
+ *val = tmp;
+ return err;
+}
diff --git a/gnulib/lib/xstrtol.h b/gnulib/lib/xstrtol.h
new file mode 100644
index 0000000..ad134ab
--- /dev/null
+++ b/gnulib/lib/xstrtol.h
@@ -0,0 +1,73 @@
+/* A more useful interface to strtol.
+
+ Copyright (C) 1995-1996, 1998-1999, 2001-2004, 2006-2011 Free Software
+ Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef XSTRTOL_H_
+# define XSTRTOL_H_ 1
+
+# include <getopt.h>
+# include <inttypes.h>
+
+# ifndef _STRTOL_ERROR
+enum strtol_error
+ {
+ LONGINT_OK = 0,
+
+ /* These two values can be ORed together, to indicate that both
+ errors occurred. */
+ LONGINT_OVERFLOW = 1,
+ LONGINT_INVALID_SUFFIX_CHAR = 2,
+
+ LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
+ | LONGINT_OVERFLOW),
+ LONGINT_INVALID = 4
+ };
+typedef enum strtol_error strtol_error;
+# endif
+
+# define _DECLARE_XSTRTOL(name, type) \
+ strtol_error name (const char *, char **, int, type *, const char *);
+_DECLARE_XSTRTOL (xstrtol, long int)
+_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
+_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
+_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
+
+#if HAVE_LONG_LONG_INT
+_DECLARE_XSTRTOL (xstrtoll, long long int)
+_DECLARE_XSTRTOL (xstrtoull, unsigned long long int)
+#endif
+
+/* Report an error for an invalid integer in an option argument.
+
+ ERR is the error code returned by one of the xstrto* functions.
+
+ Use OPT_IDX to decide whether to print the short option string "C"
+ or "-C" or a long option string derived from LONG_OPTION. OPT_IDX
+ is -2 if the short option "C" was used, without any leading "-"; it
+ is -1 if the short option "-C" was used; otherwise it is an index
+ into LONG_OPTIONS, which should have a name preceded by two '-'
+ characters.
+
+ ARG is the option-argument containing the integer.
+
+ After reporting an error, exit with a failure status. */
+
+void _Noreturn xstrtol_fatal (enum strtol_error,
+ int, char, struct option const *,
+ char const *);
+
+#endif /* not XSTRTOL_H_ */
diff --git a/gnulib/lib/xstrtold.c b/gnulib/lib/xstrtold.c
new file mode 100644
index 0000000..50dc6a4
--- /dev/null
+++ b/gnulib/lib/xstrtold.c
@@ -0,0 +1,2 @@
+#define LONG 1
+#include "xstrtod.c"
diff --git a/gnulib/lib/xstrtoll.c b/gnulib/lib/xstrtoll.c
new file mode 100644
index 0000000..db26e87
--- /dev/null
+++ b/gnulib/lib/xstrtoll.c
@@ -0,0 +1,6 @@
+#define __strtol strtoll
+#define __strtol_t long long int
+#define __xstrtol xstrtoll
+#define STRTOL_T_MINIMUM LLONG_MIN
+#define STRTOL_T_MAXIMUM LLONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoul.c b/gnulib/lib/xstrtoul.c
new file mode 100644
index 0000000..285f7b9
--- /dev/null
+++ b/gnulib/lib/xstrtoul.c
@@ -0,0 +1,6 @@
+#define __strtol strtoul
+#define __strtol_t unsigned long int
+#define __xstrtol xstrtoul
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM ULONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoull.c b/gnulib/lib/xstrtoull.c
new file mode 100644
index 0000000..10dda50
--- /dev/null
+++ b/gnulib/lib/xstrtoull.c
@@ -0,0 +1,6 @@
+#define __strtol strtoull
+#define __strtol_t unsigned long long int
+#define __xstrtol xstrtoull
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM ULLONG_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xstrtoumax.c b/gnulib/lib/xstrtoumax.c
new file mode 100644
index 0000000..9a2349f
--- /dev/null
+++ b/gnulib/lib/xstrtoumax.c
@@ -0,0 +1,6 @@
+#define __strtol strtoumax
+#define __strtol_t uintmax_t
+#define __xstrtol xstrtoumax
+#define STRTOL_T_MINIMUM 0
+#define STRTOL_T_MAXIMUM UINTMAX_MAX
+#include "xstrtol.c"
diff --git a/gnulib/lib/xtime.h b/gnulib/lib/xtime.h
new file mode 100644
index 0000000..5ca0156
--- /dev/null
+++ b/gnulib/lib/xtime.h
@@ -0,0 +1,86 @@
+/* xtime -- extended-resolution integer time stamps
+
+ Copyright (C) 2005-2006, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef XTIME_H_
+# define XTIME_H_ 1
+
+/* xtime_t is a signed type used for time stamps. It is an integer
+ type that is a count of nanoseconds -- except for obsolescent hosts
+ without sufficiently-wide integers, where it is a count of
+ seconds. */
+# if HAVE_LONG_LONG_INT
+typedef long long int xtime_t;
+# define XTIME_PRECISION 1000000000
+# else
+# include <limits.h>
+typedef long int xtime_t;
+# if LONG_MAX >> 31 >> 31 == 0
+# define XTIME_PRECISION 1
+# else
+# define XTIME_PRECISION 1000000000
+# endif
+# endif
+
+/* Return an extended time value that contains S seconds and NS
+ nanoseconds, without any overflow checking. */
+static inline xtime_t
+xtime_make (xtime_t s, long int ns)
+{
+ if (XTIME_PRECISION == 1)
+ return s;
+ else
+ return XTIME_PRECISION * s + ns;
+}
+
+/* Return the number of seconds in T, which must be nonnegative. */
+static inline xtime_t
+xtime_nonnegative_sec (xtime_t t)
+{
+ return t / XTIME_PRECISION;
+}
+
+/* Return the number of seconds in T. */
+static inline xtime_t
+xtime_sec (xtime_t t)
+{
+ return (XTIME_PRECISION == 1
+ ? t
+ : t < 0
+ ? (t + XTIME_PRECISION - 1) / XTIME_PRECISION - 1
+ : xtime_nonnegative_sec (t));
+}
+
+/* Return the number of nanoseconds in T, which must be nonnegative. */
+static inline long int
+xtime_nonnegative_nsec (xtime_t t)
+{
+ return t % XTIME_PRECISION;
+}
+
+/* Return the number of nanoseconds in T. */
+static inline long int
+xtime_nsec (xtime_t t)
+{
+ long int ns = t % XTIME_PRECISION;
+ if (ns < 0)
+ ns += XTIME_PRECISION;
+ return ns;
+}
+
+#endif
diff --git a/gnulib/lib/xvasprintf.c b/gnulib/lib/xvasprintf.c
new file mode 100644
index 0000000..4a089ae
--- /dev/null
+++ b/gnulib/lib/xvasprintf.c
@@ -0,0 +1,110 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 1999, 2002-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xvasprintf.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "xalloc.h"
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+static inline char *
+xstrcat (size_t argcount, va_list args)
+{
+ char *result;
+ va_list ap;
+ size_t totalsize;
+ size_t i;
+ char *p;
+
+ /* Determine the total size. */
+ totalsize = 0;
+ va_copy (ap, args);
+ for (i = argcount; i > 0; i--)
+ {
+ const char *next = va_arg (ap, const char *);
+ totalsize = xsum (totalsize, strlen (next));
+ }
+ va_end (ap);
+
+ /* Test for overflow in the summing pass above or in (totalsize + 1) below.
+ Also, don't return a string longer than INT_MAX, for consistency with
+ vasprintf(). */
+ if (totalsize == SIZE_MAX || totalsize > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return NULL;
+ }
+
+ /* Allocate and fill the result string. */
+ result = XNMALLOC (totalsize + 1, char);
+ p = result;
+ for (i = argcount; i > 0; i--)
+ {
+ const char *next = va_arg (args, const char *);
+ size_t len = strlen (next);
+ memcpy (p, next, len);
+ p += len;
+ }
+ *p = '\0';
+
+ return result;
+}
+
+char *
+xvasprintf (const char *format, va_list args)
+{
+ char *result;
+
+ /* Recognize the special case format = "%s...%s". It is a frequently used
+ idiom for string concatenation and needs to be fast. We don't want to
+ have a separate function xstrcat() for this purpose. */
+ {
+ size_t argcount = 0;
+ const char *f;
+
+ for (f = format;;)
+ {
+ if (*f == '\0')
+ /* Recognized the special case of string concatenation. */
+ return xstrcat (argcount, args);
+ if (*f != '%')
+ break;
+ f++;
+ if (*f != 's')
+ break;
+ f++;
+ argcount++;
+ }
+ }
+
+ if (vasprintf (&result, format, args) < 0)
+ {
+ if (errno == ENOMEM)
+ xalloc_die ();
+ return NULL;
+ }
+
+ return result;
+}
diff --git a/gnulib/lib/xvasprintf.h b/gnulib/lib/xvasprintf.h
new file mode 100644
index 0000000..197c9ea
--- /dev/null
+++ b/gnulib/lib/xvasprintf.h
@@ -0,0 +1,55 @@
+/* vasprintf and asprintf with out-of-memory checking.
+ Copyright (C) 2002-2004, 2006-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _XVASPRINTF_H
+#define _XVASPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc(),
+ and return it. Upon [ENOMEM] memory allocation error, call xalloc_die.
+ On some other error
+ - [EOVERFLOW] resulting string length is > INT_MAX,
+ - [EINVAL] invalid format string,
+ - [EILSEQ] error during conversion between wide and multibyte characters,
+ return NULL. */
+extern char *xasprintf (const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2));
+extern char *xvasprintf (const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _XVASPRINTF_H */
diff --git a/gnulib/lib/yesno.c b/gnulib/lib/yesno.c
new file mode 100644
index 0000000..6502538
--- /dev/null
+++ b/gnulib/lib/yesno.c
@@ -0,0 +1,60 @@
+/* yesno.c -- read a yes/no response from stdin
+
+ Copyright (C) 1990, 1998, 2001, 2003-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "yesno.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* Return true if we read an affirmative line from standard input.
+
+ Since this function uses stdin, it is suggested that the caller not
+ use STDIN_FILENO directly, and also that the line
+ atexit(close_stdin) be added to main(). */
+
+bool
+yesno (void)
+{
+ bool yes;
+
+#if ENABLE_NLS
+ char *response = NULL;
+ size_t response_size = 0;
+ ssize_t response_len = getline (&response, &response_size, stdin);
+
+ if (response_len <= 0)
+ yes = false;
+ else
+ {
+ response[response_len - 1] = '\0';
+ yes = (0 < rpmatch (response));
+ }
+
+ free (response);
+#else
+ /* Test against "^[yY]", hardcoded to avoid requiring getline,
+ regex, and rpmatch. */
+ int c = getchar ();
+ yes = (c == 'y' || c == 'Y');
+ while (c != '\n' && c != EOF)
+ c = getchar ();
+#endif
+
+ return yes;
+}
diff --git a/gnulib/lib/yesno.h b/gnulib/lib/yesno.h
new file mode 100644
index 0000000..36e624f
--- /dev/null
+++ b/gnulib/lib/yesno.h
@@ -0,0 +1,24 @@
+/* declare yesno
+ Copyright (C) 2004, 2009-2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef YESNO_H_
+# define YESNO_H_
+
+# include <stdbool.h>
+
+bool yesno (void);
+
+#endif